diff --git a/docs/net_protocol.txt b/docs/net_protocol.txt index 5e9067f8..bb0fc65b 100644 --- a/docs/net_protocol.txt +++ b/docs/net_protocol.txt @@ -148,6 +148,17 @@ Server/Client Reply: Avatar End +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +Server/Client Reply: Unknown 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 = 7 | Message Length = 8 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Request ID | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Basic Structure: Game Info Block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -286,6 +297,17 @@ Player Flags: 0x02 set: Player has avatar +Server Reply: Unknown Player Id + + 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 = 34 | Message Length = 8 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Player ID | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Client Request: Create Game 0 1 2 3 diff --git a/src/net/common/netpacket.cpp b/src/net/common/netpacket.cpp index 71ae06ae..8b333b80 100644 --- a/src/net/common/netpacket.cpp +++ b/src/net/common/netpacket.cpp @@ -33,12 +33,14 @@ using namespace std; #define NET_TYPE_AVATAR_HEADER 0x0004 #define NET_TYPE_AVATAR_FILE 0x0005 #define NET_TYPE_AVATAR_END 0x0006 +#define NET_TYPE_UNKNOWN_AVATAR 0x0007 #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_UNKNOWN_PLAYER_ID 0x0022 #define NET_TYPE_CREATE_GAME 0x0030 #define NET_TYPE_JOIN_GAME 0x0031 #define NET_TYPE_JOIN_GAME_ACK 0x0032 @@ -168,6 +170,12 @@ struct GCC_PACKED NetPacketAvatarEndData u_int32_t requestId; }; +struct GCC_PACKED NetPacketUnknownAvatarData +{ + NetPacketHeader head; + u_int32_t requestId; +}; + struct GCC_PACKED GameInfoData { u_int16_t maxNumberOfPlayers; @@ -230,6 +238,12 @@ struct GCC_PACKED NetPacketPlayerInfoData u_int16_t playerNameLength; }; +struct GCC_PACKED NetPacketUnknownPlayerIdData +{ + NetPacketHeader head; + u_int32_t playerId; +}; + struct GCC_PACKED NetPacketCreateGameData { NetPacketHeader head; @@ -607,6 +621,9 @@ NetPacket::Create(char *data, unsigned &dataSize) case NET_TYPE_AVATAR_END: tmpPacket = boost::shared_ptr(new NetPacketAvatarEnd); break; + case NET_TYPE_UNKNOWN_AVATAR: + tmpPacket = boost::shared_ptr(new NetPacketUnknownAvatar); + break; case NET_TYPE_GAME_LIST_NEW: tmpPacket = boost::shared_ptr(new NetPacketGameListNew); break; @@ -625,6 +642,9 @@ NetPacket::Create(char *data, unsigned &dataSize) case NET_TYPE_PLAYER_INFO: tmpPacket = boost::shared_ptr(new NetPacketPlayerInfo); break; + case NET_TYPE_UNKNOWN_PLAYER_ID: + tmpPacket = boost::shared_ptr(new NetPacketUnknownPlayerId); + break; case NET_TYPE_CREATE_GAME: tmpPacket = boost::shared_ptr(new NetPacketCreateGame); break; @@ -829,6 +849,12 @@ NetPacket::ToNetPacketAvatarEnd() const return NULL; } +const NetPacketUnknownAvatar * +NetPacket::ToNetPacketUnknownAvatar() const +{ + return NULL; +} + const NetPacketGameListNew * NetPacket::ToNetPacketGameListNew() const { @@ -865,6 +891,12 @@ NetPacket::ToNetPacketPlayerInfo() const return NULL; } +const NetPacketUnknownPlayerId * +NetPacket::ToNetPacketUnknownPlayerId() const +{ + return NULL; +} + const NetPacketCreateGame * NetPacket::ToNetPacketCreateGame() const { @@ -1523,6 +1555,62 @@ NetPacketAvatarEnd::InternalCheck(const NetPacketHeader*) const //----------------------------------------------------------------------------- +NetPacketUnknownAvatar::NetPacketUnknownAvatar() +: NetPacket(NET_TYPE_UNKNOWN_AVATAR, sizeof(NetPacketUnknownAvatarData), sizeof(NetPacketUnknownAvatarData)) +{ +} + +NetPacketUnknownAvatar::~NetPacketUnknownAvatar() +{ +} + +boost::shared_ptr +NetPacketUnknownAvatar::Clone() const +{ + boost::shared_ptr newPacket(new NetPacketUnknownAvatar); + try + { + newPacket->SetRawData(GetRawData()); + } catch (const NetException &) + { + // Need to return the new packet anyway. + } + return newPacket; +} + +void +NetPacketUnknownAvatar::SetData(const NetPacketUnknownAvatar::Data &inData) +{ + NetPacketUnknownAvatarData *tmpData = (NetPacketUnknownAvatarData *)GetRawData(); + + tmpData->requestId = htonl(inData.requestId); + + // Check the packet - just in case. + Check(GetRawData()); +} + +void +NetPacketUnknownAvatar::GetData(NetPacketUnknownAvatar::Data &outData) const +{ + NetPacketUnknownAvatarData *tmpData = (NetPacketUnknownAvatarData *)GetRawData(); + + outData.requestId = ntohl(tmpData->requestId); +} + +const NetPacketUnknownAvatar * +NetPacketUnknownAvatar::ToNetPacketUnknownAvatar() const +{ + return this; +} + +void +NetPacketUnknownAvatar::InternalCheck(const NetPacketHeader*) const +{ + // Nothing to do. +} + +//----------------------------------------------------------------------------- + NetPacketGameListNew::NetPacketGameListNew() : NetPacket(NET_TYPE_GAME_LIST_NEW, sizeof(NetPacketGameListNewData), MAX_PACKET_SIZE) { @@ -2025,6 +2113,63 @@ NetPacketPlayerInfo::InternalCheck(const NetPacketHeader* data) const //----------------------------------------------------------------------------- +NetPacketUnknownPlayerId::NetPacketUnknownPlayerId() +: NetPacket(NET_TYPE_UNKNOWN_PLAYER_ID, sizeof(NetPacketUnknownPlayerIdData), sizeof(NetPacketUnknownPlayerIdData)) +{ +} + +NetPacketUnknownPlayerId::~NetPacketUnknownPlayerId() +{ +} + +boost::shared_ptr +NetPacketUnknownPlayerId::Clone() const +{ + boost::shared_ptr newPacket(new NetPacketUnknownPlayerId); + try + { + newPacket->SetRawData(GetRawData()); + } catch (const NetException &) + { + // Need to return the new packet anyway. + } + return newPacket; +} + +void +NetPacketUnknownPlayerId::SetData(const NetPacketUnknownPlayerId::Data &inData) +{ + NetPacketUnknownPlayerIdData *tmpData = (NetPacketUnknownPlayerIdData *)GetRawData(); + + // Set the data. + tmpData->playerId = htonl(inData.playerId); + + // Check the packet - just in case. + Check(GetRawData()); +} + +void +NetPacketUnknownPlayerId::GetData(NetPacketUnknownPlayerId::Data &outData) const +{ + // We assume that the data is valid. Validity has already been checked. + NetPacketUnknownPlayerIdData *tmpData = (NetPacketUnknownPlayerIdData *)GetRawData(); + + outData.playerId = ntohl(tmpData->playerId); +} + +const NetPacketUnknownPlayerId * +NetPacketUnknownPlayerId::ToNetPacketUnknownPlayerId() const +{ + return this; +} + +void +NetPacketUnknownPlayerId::InternalCheck(const NetPacketHeader*) const +{ + // Nothing to do. +} +//----------------------------------------------------------------------------- + NetPacketCreateGame::NetPacketCreateGame() : NetPacket(NET_TYPE_CREATE_GAME, sizeof(NetPacketCreateGameData), MAX_PACKET_SIZE) { diff --git a/src/net/netpacket.h b/src/net/netpacket.h index 4ce1b6f4..0953a6fb 100644 --- a/src/net/netpacket.h +++ b/src/net/netpacket.h @@ -52,12 +52,14 @@ class NetPacketRetrieveAvatar; class NetPacketAvatarHeader; class NetPacketAvatarFile; class NetPacketAvatarEnd; +class NetPacketUnknownAvatar; class NetPacketGameListNew; class NetPacketGameListUpdate; class NetPacketGameListPlayerJoined; class NetPacketGameListPlayerLeft; class NetPacketRetrievePlayerInfo; class NetPacketPlayerInfo; +class NetPacketUnknownPlayerId; class NetPacketCreateGame; class NetPacketJoinGame; class NetPacketJoinGameAck; @@ -110,12 +112,14 @@ public: virtual const NetPacketAvatarHeader *ToNetPacketAvatarHeader() const; virtual const NetPacketAvatarFile *ToNetPacketAvatarFile() const; virtual const NetPacketAvatarEnd *ToNetPacketAvatarEnd() const; + virtual const NetPacketUnknownAvatar *ToNetPacketUnknownAvatar() const; virtual const NetPacketGameListNew *ToNetPacketGameListNew() const; virtual const NetPacketGameListUpdate *ToNetPacketGameListUpdate() const; virtual const NetPacketGameListPlayerJoined *ToNetPacketGameListPlayerJoined() const; virtual const NetPacketGameListPlayerLeft *ToNetPacketGameListPlayerLeft() const; virtual const NetPacketRetrievePlayerInfo *ToNetPacketRetrievePlayerInfo() const; virtual const NetPacketPlayerInfo *ToNetPacketPlayerInfo() const; + virtual const NetPacketUnknownPlayerId *ToNetPacketUnknownPlayerId() const; virtual const NetPacketCreateGame *ToNetPacketCreateGame() const; virtual const NetPacketJoinGame *ToNetPacketJoinGame() const; virtual const NetPacketJoinGameAck *ToNetPacketJoinGameAck() const; @@ -311,6 +315,29 @@ protected: virtual void InternalCheck(const NetPacketHeader* data) const; }; +class NetPacketUnknownAvatar : public NetPacket +{ +public: + struct Data + { + u_int32_t requestId; + }; + + NetPacketUnknownAvatar(); + virtual ~NetPacketUnknownAvatar(); + + virtual boost::shared_ptr Clone() const; + + void SetData(const Data &inData); + void GetData(Data &outData) const; + + virtual const NetPacketUnknownAvatar *ToNetPacketUnknownAvatar() const; + +protected: + + virtual void InternalCheck(const NetPacketHeader* data) const; +}; + class NetPacketGameListNew : public NetPacket { public: @@ -454,6 +481,29 @@ protected: virtual void InternalCheck(const NetPacketHeader* data) const; }; +class NetPacketUnknownPlayerId : public NetPacket +{ +public: + struct Data + { + u_int32_t playerId; + }; + + NetPacketUnknownPlayerId(); + virtual ~NetPacketUnknownPlayerId(); + + virtual boost::shared_ptr Clone() const; + + void SetData(const Data &inData); + void GetData(Data &outData) const; + + virtual const NetPacketUnknownPlayerId *ToNetPacketUnknownPlayerId() const; + +protected: + + virtual void InternalCheck(const NetPacketHeader* data) const; +}; + class NetPacketCreateGame : public NetPacket { public: