From f1761a3793f75339b79f0f0998f4179605f3397b Mon Sep 17 00:00:00 2001 From: lotodore Date: Thu, 4 Oct 2007 23:05:50 +0000 Subject: [PATCH] First steps towards transferring avatars. --- docs/net_protocol.txt | 110 +++++++++---- src/net/common/netpacket.cpp | 300 +++++++++++++++++++++++++++++++---- src/net/netpacket.h | 84 +++++++++- src/net/socket_msg.h | 1 + src/playerdata.h | 7 + 5 files changed, 443 insertions(+), 59 deletions(-) diff --git a/docs/net_protocol.txt b/docs/net_protocol.txt index aa3c0f69..6ff01fb0 100644 --- a/docs/net_protocol.txt +++ b/docs/net_protocol.txt @@ -84,6 +84,58 @@ Player ID: Unique Player ID +Server/Client Request: Retrieve Avatar + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Message Type = 3 | Message Length = 24 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Request ID | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + \ Avatar MD5 (16 Bytes) / + | + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +[Sent BEFORE Init ACK if the server does not have the avatar image.] + + +Server/Client Reply: Avatar Header + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Message Type = 4 | Message Length = 16 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Request ID | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Avatar File Size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Avatar File Type | Reserved | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +Avatar File Type: + 0x01: PNG + 0x02: JPG + 0x03: GIF + + +Server/Client Reply: Avatar File + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Message Type = 5 | Message Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Request ID | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + \ Avatar File Data (up to 256 Bytes) / + | + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +[Additional blocks will be sent if data is more than 256 Bytes.] + + Basic Structure: Game Info Block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -110,7 +162,7 @@ Server Notification: Game List New 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 3 | Message Length | + | Message Type = 16 | Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Game Mode | Game Name Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -150,7 +202,7 @@ Server Notification: Game List Update 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 4 | Message Length = 12 | + | Message Type = 17 | Message Length = 12 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Game ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -163,7 +215,7 @@ Server Notification: Game List Player Joined 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 5 | Message Length = 12 | + | Message Type = 18 | Message Length = 12 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Game ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -176,7 +228,7 @@ Server Notification: Game List Player Left 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 6 | Message Length = 12 | + | Message Type = 19 | Message Length = 12 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Game ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -189,7 +241,7 @@ Client Request: Retrieve Player Info 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 7 | Message Length = 8 | + | Message Type = 32 | Message Length = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Player ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -200,7 +252,7 @@ Server Reply: Player Info 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 8 | Message Length | + | Message Type = 33 | Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Player ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -225,7 +277,7 @@ Client Request: Create Game 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 9 | Message Length | + | Message Type = 48 | Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Password Length | Game Name Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -258,7 +310,7 @@ Client Request: Join Game 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 10 | Message Length | + | Message Type = 49 | Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Game ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -276,7 +328,7 @@ Server Reply: Join Game Ack 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 11 | Message Length | + | Message Type = 50 | Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Game ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -293,7 +345,7 @@ Server Reply: Join Game Failed 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 12 | Message Length = 8 | + | Message Type = 51 | Message Length = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Failure Reason | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -309,7 +361,7 @@ Server Notification: Player Joined 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 13 | Message Length = 12 | + | Message Type = 52 | Message Length = 12 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Player ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -324,7 +376,7 @@ Server Notification: Player Left 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 14 | Message Length = 8 | + | Message Type = 53 | Message Length = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Player ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -335,7 +387,7 @@ Server Notification: Game Admin Changed 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 15 | Message Length = 8 | + | Message Type = 54 | Message Length = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | New Admin Player ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -346,7 +398,7 @@ Client Request: Kick Player 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 16 | Message Length = 8 | + | Message Type = 64 | Message Length = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Player ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -357,7 +409,7 @@ Client Request: Leave Current Game 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 17 | Message Length = 8 | + | Message Type = 65 | Message Length = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -369,7 +421,7 @@ Client Request: Start Event 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 18 | Message Length = 8 | + | Message Type = 66 | Message Length = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Start Flags | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -382,7 +434,7 @@ Server Notification: Game Start 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 19 | Message Length | + | Message Type = 80 | Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Start Dealer Player Id | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -413,7 +465,7 @@ Server Notification: Hand Start 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 20 | Message Length = 8 | + | Message Type = 81 | Message Length = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Your 1st Card | Your 2nd Card | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -427,7 +479,7 @@ Server Request/Notification: Player's Turn 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 21 | Message Length = 8 | + | Message Type = 82 | Message Length = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Player ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -446,7 +498,7 @@ Client Reply/Request: Player's Action 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 22 | Message Length = 12 | + | Message Type = 83 | Message Length = 12 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Game State | Player Action | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -471,7 +523,7 @@ Server Notification: Player's Action Done 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 23 | Message Length = 20 | + | Message Type = 84 | Message Length = 20 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Player ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -492,7 +544,7 @@ Server Reply: Player's Action Rejected 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 24 | Message Length = 16 | + | Message Type = 85 | Message Length = 16 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Game State | Player Action | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -520,7 +572,7 @@ Server Notification: Deal Flop Cards 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 25 | Message Length = 12 | + | Message Type = 96 | Message Length = 12 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Flop 1st Card | Flop 2nd Card | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -533,7 +585,7 @@ Server Notification: Deal Turn Card 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 26 | Message Length = 8 | + | Message Type = 97 | Message Length = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Turn Card | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -544,7 +596,7 @@ Server Notification: Deal River Card 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 27 | Message Length = 8 | + | Message Type = 98 | Message Length = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | River Card | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -555,7 +607,7 @@ Server Notification: All In Show Cards 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 28 | Message Length | + | Message Type = 99 | Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Number Of PlayerCards Records | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -577,7 +629,7 @@ Server Notification: End Of Hand Show Cards 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 29 | Message Length | + | Message Type = 100 | Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Number Of PlayerResult Records | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -611,7 +663,7 @@ Server Notification: End Of Hand Hide Cards 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 30 | Message Length = 16 | + | Message Type = 101 | Message Length = 16 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Player ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -626,7 +678,7 @@ Server Notification: End Of Game 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 31 | Message Length = 8 | + | Message Type = 112 | Message Length = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Winner Player Id | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ diff --git a/src/net/common/netpacket.cpp b/src/net/common/netpacket.cpp index 3091c97d..99efec2c 100644 --- a/src/net/common/netpacket.cpp +++ b/src/net/common/netpacket.cpp @@ -29,35 +29,38 @@ using namespace std; #define NET_TYPE_INIT 0x0001 #define NET_TYPE_INIT_ACK 0x0002 -#define NET_TYPE_GAME_LIST_NEW 0x0003 -#define NET_TYPE_GAME_LIST_UPDATE 0x0004 -#define NET_TYPE_GAME_LIST_PLAYER_JOINED 0x0005 -#define NET_TYPE_GAME_LIST_PLAYER_LEFT 0x0006 -#define NET_TYPE_RETRIEVE_PLAYER_INFO 0x0007 -#define NET_TYPE_PLAYER_INFO 0x0008 -#define NET_TYPE_CREATE_GAME 0x0009 -#define NET_TYPE_JOIN_GAME 0x000A -#define NET_TYPE_JOIN_GAME_ACK 0x000B -#define NET_TYPE_JOIN_GAME_FAILED 0x000C -#define NET_TYPE_PLAYER_JOINED 0x000D -#define NET_TYPE_PLAYER_LEFT 0x000E -#define NET_TYPE_GAME_ADMIN_CHANGED 0x000F -#define NET_TYPE_KICK_PLAYER 0x0010 -#define NET_TYPE_LEAVE_CURRENT_GAME 0x0011 -#define NET_TYPE_START_EVENT 0x0012 -#define NET_TYPE_GAME_START 0x0013 -#define NET_TYPE_HAND_START 0x0014 -#define NET_TYPE_PLAYERS_TURN 0x0015 -#define NET_TYPE_PLAYERS_ACTION 0x0016 -#define NET_TYPE_PLAYERS_ACTION_DONE 0x0017 -#define NET_TYPE_PLAYERS_ACTION_REJECTED 0x0018 -#define NET_TYPE_DEAL_FLOP_CARDS 0x0019 -#define NET_TYPE_DEAL_TURN_CARD 0x001A -#define NET_TYPE_DEAL_RIVER_CARD 0x001B -#define NET_TYPE_ALL_IN_SHOW_CARDS 0x001C -#define NET_TYPE_END_OF_HAND_SHOW_CARDS 0x001D -#define NET_TYPE_END_OF_HAND_HIDE_CARDS 0x001E -#define NET_TYPE_END_OF_GAME 0x001F +#define NET_TYPE_RETRIEVE_AVATAR 0x0003 +#define NET_TYPE_AVATAR_HEADER 0x0004 +#define NET_TYPE_AVATAR_FILE 0x0005 +#define NET_TYPE_GAME_LIST_NEW 0x0010 +#define NET_TYPE_GAME_LIST_UPDATE 0x0011 +#define NET_TYPE_GAME_LIST_PLAYER_JOINED 0x0012 +#define NET_TYPE_GAME_LIST_PLAYER_LEFT 0x0013 +#define NET_TYPE_RETRIEVE_PLAYER_INFO 0x0020 +#define NET_TYPE_PLAYER_INFO 0x0021 +#define NET_TYPE_CREATE_GAME 0x0030 +#define NET_TYPE_JOIN_GAME 0x0031 +#define NET_TYPE_JOIN_GAME_ACK 0x0032 +#define NET_TYPE_JOIN_GAME_FAILED 0x0033 +#define NET_TYPE_PLAYER_JOINED 0x0034 +#define NET_TYPE_PLAYER_LEFT 0x0035 +#define NET_TYPE_GAME_ADMIN_CHANGED 0x0036 +#define NET_TYPE_KICK_PLAYER 0x0040 +#define NET_TYPE_LEAVE_CURRENT_GAME 0x0041 +#define NET_TYPE_START_EVENT 0x0042 +#define NET_TYPE_GAME_START 0x0050 +#define NET_TYPE_HAND_START 0x0051 +#define NET_TYPE_PLAYERS_TURN 0x0052 +#define NET_TYPE_PLAYERS_ACTION 0x0053 +#define NET_TYPE_PLAYERS_ACTION_DONE 0x0054 +#define NET_TYPE_PLAYERS_ACTION_REJECTED 0x0055 +#define NET_TYPE_DEAL_FLOP_CARDS 0x0060 +#define NET_TYPE_DEAL_TURN_CARD 0x0061 +#define NET_TYPE_DEAL_RIVER_CARD 0x0062 +#define NET_TYPE_ALL_IN_SHOW_CARDS 0x0063 +#define NET_TYPE_END_OF_HAND_SHOW_CARDS 0x0064 +#define NET_TYPE_END_OF_HAND_HIDE_CARDS 0x0065 +#define NET_TYPE_END_OF_GAME 0x0070 #define NET_TYPE_REMOVED_FROM_GAME 0x0100 @@ -132,6 +135,28 @@ struct GCC_PACKED NetPacketInitAckData u_int32_t playerId; }; +struct GCC_PACKED NetPacketRetrieveAvatarData +{ + NetPacketHeader head; + u_int32_t requestId; + unsigned char avatarMD5[MD5_DATA_SIZE]; +}; + +struct GCC_PACKED NetPacketAvatarHeaderData +{ + NetPacketHeader head; + u_int32_t requestId; + u_int32_t avatarFileSize; + u_int16_t avatarFileType; + u_int16_t reserved; +}; + +struct GCC_PACKED NetPacketAvatarFileData +{ + NetPacketHeader head; + u_int32_t requestId; +}; + struct GCC_PACKED GameInfoData { u_int16_t maxNumberOfPlayers; @@ -553,6 +578,15 @@ NetPacket::Create(char *data, unsigned &dataSize) case NET_TYPE_INIT_ACK: tmpPacket = boost::shared_ptr(new NetPacketInitAck); break; + case NET_TYPE_RETRIEVE_AVATAR: + tmpPacket = boost::shared_ptr(new NetPacketRetrieveAvatar); + break; + case NET_TYPE_AVATAR_HEADER: + tmpPacket = boost::shared_ptr(new NetPacketAvatarHeader); + break; + case NET_TYPE_AVATAR_FILE: + tmpPacket = boost::shared_ptr(new NetPacketAvatarFile); + break; case NET_TYPE_GAME_LIST_NEW: tmpPacket = boost::shared_ptr(new NetPacketGameListNew); break; @@ -748,6 +782,24 @@ NetPacket::ToNetPacketInitAck() const return NULL; } +const NetPacketRetrieveAvatar * +NetPacket::ToNetPacketRetrieveAvatar() const +{ + return NULL; +} + +const NetPacketAvatarHeader * +NetPacket::ToNetPacketAvatarHeader() const +{ + return NULL; +} + +const NetPacketAvatarFile * +NetPacket::ToNetPacketAvatarFile() const +{ + return NULL; +} + const NetPacketGameListNew * NetPacket::ToNetPacketGameListNew() const { @@ -1189,6 +1241,196 @@ NetPacketInitAck::InternalCheck(const NetPacketHeader*) const //----------------------------------------------------------------------------- +NetPacketRetrieveAvatar::NetPacketRetrieveAvatar() +: NetPacket(NET_TYPE_RETRIEVE_AVATAR, sizeof(NetPacketRetrieveAvatarData), sizeof(NetPacketRetrieveAvatarData)) +{ +} + +NetPacketRetrieveAvatar::~NetPacketRetrieveAvatar() +{ +} + +boost::shared_ptr +NetPacketRetrieveAvatar::Clone() const +{ + boost::shared_ptr newPacket(new NetPacketRetrieveAvatar); + try + { + newPacket->SetRawData(GetRawData()); + } catch (const NetException &) + { + // Need to return the new packet anyway. + } + return newPacket; +} + +void +NetPacketRetrieveAvatar::SetData(const NetPacketRetrieveAvatar::Data &inData) +{ + NetPacketRetrieveAvatarData *tmpData = (NetPacketRetrieveAvatarData *)GetRawData(); + + tmpData->requestId = htonl(inData.requestId); + memcpy(tmpData->avatarMD5, inData.avatar.data, MD5_DATA_SIZE); + + // Check the packet - just in case. + Check(GetRawData()); +} + +void +NetPacketRetrieveAvatar::GetData(NetPacketRetrieveAvatar::Data &outData) const +{ + NetPacketRetrieveAvatarData *tmpData = (NetPacketRetrieveAvatarData *)GetRawData(); + + outData.requestId = ntohl(tmpData->requestId); + memcpy(outData.avatar.data, tmpData->avatarMD5, MD5_DATA_SIZE); +} + +const NetPacketRetrieveAvatar * +NetPacketRetrieveAvatar::ToNetPacketRetrieveAvatar() const +{ + return this; +} + +void +NetPacketRetrieveAvatar::InternalCheck(const NetPacketHeader*) const +{ + // Nothing to do. +} + +//----------------------------------------------------------------------------- + +NetPacketAvatarHeader::NetPacketAvatarHeader() +: NetPacket(NET_TYPE_AVATAR_HEADER, sizeof(NetPacketAvatarHeaderData), sizeof(NetPacketAvatarHeaderData)) +{ +} + +NetPacketAvatarHeader::~NetPacketAvatarHeader() +{ +} + +boost::shared_ptr +NetPacketAvatarHeader::Clone() const +{ + boost::shared_ptr newPacket(new NetPacketAvatarHeader); + try + { + newPacket->SetRawData(GetRawData()); + } catch (const NetException &) + { + // Need to return the new packet anyway. + } + return newPacket; +} + +void +NetPacketAvatarHeader::SetData(const NetPacketAvatarHeader::Data &inData) +{ + NetPacketAvatarHeaderData *tmpData = (NetPacketAvatarHeaderData *)GetRawData(); + + tmpData->requestId = htonl(inData.requestId); + tmpData->avatarFileSize = htonl(inData.avatarFileSize); + tmpData->avatarFileType = htons(inData.avatarFileType); + + // Check the packet - just in case. + Check(GetRawData()); +} + +void +NetPacketAvatarHeader::GetData(NetPacketAvatarHeader::Data &outData) const +{ + NetPacketAvatarHeaderData *tmpData = (NetPacketAvatarHeaderData *)GetRawData(); + + outData.requestId = ntohl(tmpData->requestId); + outData.avatarFileSize = ntohl(tmpData->avatarFileSize); + outData.avatarFileType = static_cast(ntohl(tmpData->avatarFileType)); +} + +const NetPacketAvatarHeader * +NetPacketAvatarHeader::ToNetPacketAvatarHeader() const +{ + return this; +} + +void +NetPacketAvatarHeader::InternalCheck(const NetPacketHeader*) const +{ + // Nothing to do. +} + +//----------------------------------------------------------------------------- + +NetPacketAvatarFile::NetPacketAvatarFile() +: NetPacket(NET_TYPE_AVATAR_FILE, sizeof(NetPacketAvatarFileData), MAX_PACKET_SIZE) +{ +} + +NetPacketAvatarFile::~NetPacketAvatarFile() +{ +} + +boost::shared_ptr +NetPacketAvatarFile::Clone() const +{ + boost::shared_ptr newPacket(new NetPacketAvatarFile); + try + { + newPacket->SetRawData(GetRawData()); + } catch (const NetException &) + { + // Need to return the new packet anyway. + } + return newPacket; +} + +void +NetPacketAvatarFile::SetData(const NetPacketAvatarFile::Data &inData) +{ + NetPacketAvatarFileData *tmpData = (NetPacketAvatarFileData *)GetRawData(); + int fileDataSize = static_cast(inData.fileData.size()); + + if (fileDataSize > MAX_FILE_DATA_SIZE) + throw NetException(ERR_NET_BUF_INVALID_SIZE, 0); + + Resize((u_int16_t) + (sizeof(NetPacketAvatarFileData) + + fileDataSize)); + + tmpData->requestId = htonl(inData.requestId); + + char *avatarDataPtr = (char *)tmpData + sizeof(NetPacketAvatarFileData); + memcpy(avatarDataPtr, &inData.fileData[0], fileDataSize); + + // Check the packet - just in case. + Check(GetRawData()); +} + +void +NetPacketAvatarFile::GetData(NetPacketAvatarFile::Data &outData) const +{ + NetPacketAvatarFileData *tmpData = (NetPacketAvatarFileData *)GetRawData(); + + outData.requestId = ntohl(tmpData->requestId); + + int fileDataSize = GetLen() - sizeof(NetPacketAvatarFileData); + char *avatarDataPtr = (char *)tmpData + sizeof(NetPacketAvatarFileData); + outData.fileData.resize(fileDataSize); + memcpy(&outData.fileData[0], avatarDataPtr, fileDataSize); +} + +const NetPacketAvatarFile * +NetPacketAvatarFile::ToNetPacketAvatarFile() const +{ + return this; +} + +void +NetPacketAvatarFile::InternalCheck(const NetPacketHeader*) const +{ + // Nothing to do. +} + +//----------------------------------------------------------------------------- + NetPacketGameListNew::NetPacketGameListNew() : NetPacket(NET_TYPE_GAME_LIST_NEW, sizeof(NetPacketGameListNewData), MAX_PACKET_SIZE) { diff --git a/src/net/netpacket.h b/src/net/netpacket.h index a5c2d8fd..ecdee382 100644 --- a/src/net/netpacket.h +++ b/src/net/netpacket.h @@ -27,15 +27,18 @@ #include #include +#include + #define NET_VERSION_MAJOR 2 #define NET_VERSION_MINOR 0 #define MIN_PACKET_SIZE 4 -#define MAX_PACKET_SIZE 256 +#define MAX_PACKET_SIZE 264 #define MAX_NAME_SIZE 64 #define MAX_PASSWORD_SIZE 64 #define MAX_NUM_MANUAL_BLINDS 30 #define MAX_CHAT_TEXT_SIZE 128 +#define MAX_FILE_DATA_SIZE 256 #define MAX_NUM_PLAYER_RESULTS MAX_NUMBER_OF_PLAYERS #define MAX_NUM_PLAYER_CARDS MAX_NUMBER_OF_PLAYERS @@ -44,6 +47,9 @@ struct NetPacketHeader; class NetPacketInit; class NetPacketInitAck; +class NetPacketRetrieveAvatar; +class NetPacketAvatarHeader; +class NetPacketAvatarFile; class NetPacketGameListNew; class NetPacketGameListUpdate; class NetPacketGameListPlayerJoined; @@ -97,6 +103,9 @@ public: virtual const NetPacketInit *ToNetPacketInit() const; virtual const NetPacketInitAck *ToNetPacketInitAck() const; + virtual const NetPacketRetrieveAvatar *ToNetPacketRetrieveAvatar() const; + virtual const NetPacketAvatarHeader *ToNetPacketAvatarHeader() const; + virtual const NetPacketAvatarFile *ToNetPacketAvatarFile() const; virtual const NetPacketGameListNew *ToNetPacketGameListNew() const; virtual const NetPacketGameListUpdate *ToNetPacketGameListUpdate() const; virtual const NetPacketGameListPlayerJoined *ToNetPacketGameListPlayerJoined() const; @@ -199,6 +208,79 @@ protected: virtual void InternalCheck(const NetPacketHeader* data) const; }; +class NetPacketRetrieveAvatar : public NetPacket +{ +public: + struct Data + { + u_int32_t requestId; + MD5Buf avatar; + }; + + NetPacketRetrieveAvatar(); + virtual ~NetPacketRetrieveAvatar(); + + virtual boost::shared_ptr Clone() const; + + void SetData(const Data &inData); + void GetData(Data &outData) const; + + virtual const NetPacketRetrieveAvatar *ToNetPacketRetrieveAvatar() const; + +protected: + + virtual void InternalCheck(const NetPacketHeader* data) const; +}; + +class NetPacketAvatarHeader : public NetPacket +{ +public: + struct Data + { + u_int32_t requestId; + u_int32_t avatarFileSize; + AvatarFileType avatarFileType; + }; + + NetPacketAvatarHeader(); + virtual ~NetPacketAvatarHeader(); + + virtual boost::shared_ptr Clone() const; + + void SetData(const Data &inData); + void GetData(Data &outData) const; + + virtual const NetPacketAvatarHeader *ToNetPacketAvatarHeader() const; + +protected: + + virtual void InternalCheck(const NetPacketHeader* data) const; +}; + +class NetPacketAvatarFile : public NetPacket +{ +public: + struct Data + { + u_int32_t requestId; + std::vector fileData; + }; + + NetPacketAvatarFile(); + virtual ~NetPacketAvatarFile(); + + virtual boost::shared_ptr Clone() const; + + void SetData(const Data &inData); + void GetData(Data &outData) const; + + virtual const NetPacketAvatarFile *ToNetPacketAvatarFile() const; + +protected: + + virtual void InternalCheck(const NetPacketHeader* data) const; +}; + class NetPacketGameListNew : public NetPacket { public: diff --git a/src/net/socket_msg.h b/src/net/socket_msg.h index 2c6c47b2..239c4bcd 100644 --- a/src/net/socket_msg.h +++ b/src/net/socket_msg.h @@ -58,6 +58,7 @@ #define ERR_NET_PLAYER_KICKED 114 #define ERR_NET_INVALID_PLAYER_COUNT 115 #define ERR_NET_TOO_MANY_MANUAL_BLINDS 116 +#define ERR_NET_BUF_INVALID_SIZE 117 #define ERR_IRC_INTERNAL 151 #define ERR_IRC_CONNECT_FAILED 152 diff --git a/src/playerdata.h b/src/playerdata.h index 08fdc15f..940dabd7 100644 --- a/src/playerdata.h +++ b/src/playerdata.h @@ -42,6 +42,13 @@ enum PlayerRights PLAYER_RIGHTS_ADMIN }; +enum AvatarFileType +{ + AVATAR_TYPE_PNG = 1, + AVATAR_TYPE_JPG, + AVATAR_TYPE_GIF +}; + struct PlayerInfo { PlayerInfo() : ptype(PLAYER_TYPE_HUMAN) {}