Synchronize on network game start, so that everyone has received all avatars and player names before the game starts. Store all computer players in a separate list on the server for name retrieval.
This commit is contained in:
@@ -49,6 +49,7 @@ using namespace std;
|
||||
#define NET_TYPE_KICK_PLAYER 0x0040
|
||||
#define NET_TYPE_LEAVE_CURRENT_GAME 0x0041
|
||||
#define NET_TYPE_START_EVENT 0x0042
|
||||
#define NET_TYPE_START_EVENT_ACK 0x0043
|
||||
#define NET_TYPE_GAME_START 0x0050
|
||||
#define NET_TYPE_HAND_START 0x0051
|
||||
#define NET_TYPE_PLAYERS_TURN 0x0052
|
||||
@@ -297,6 +298,12 @@ struct GCC_PACKED NetPacketStartEventData
|
||||
u_int16_t reserved;
|
||||
};
|
||||
|
||||
struct GCC_PACKED NetPacketStartEventAckData
|
||||
{
|
||||
NetPacketHeader head;
|
||||
u_int32_t reserved;
|
||||
};
|
||||
|
||||
struct GCC_PACKED NetPacketGameStartData
|
||||
{
|
||||
NetPacketHeader head;
|
||||
@@ -646,6 +653,9 @@ NetPacket::Create(char *data, unsigned &dataSize)
|
||||
case NET_TYPE_START_EVENT:
|
||||
tmpPacket = boost::shared_ptr<NetPacket>(new NetPacketStartEvent);
|
||||
break;
|
||||
case NET_TYPE_START_EVENT_ACK:
|
||||
tmpPacket = boost::shared_ptr<NetPacket>(new NetPacketStartEventAck);
|
||||
break;
|
||||
case NET_TYPE_GAME_START:
|
||||
tmpPacket = boost::shared_ptr<NetPacket>(new NetPacketGameStart);
|
||||
break;
|
||||
@@ -913,6 +923,12 @@ NetPacket::ToNetPacketStartEvent() const
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const NetPacketStartEventAck *
|
||||
NetPacket::ToNetPacketStartEventAck() const
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const NetPacketGameStart *
|
||||
NetPacket::ToNetPacketGameStart() const
|
||||
{
|
||||
@@ -2641,7 +2657,7 @@ NetPacketKickPlayer::InternalCheck(const NetPacketHeader*) const
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
NetPacketLeaveCurrentGame::NetPacketLeaveCurrentGame()
|
||||
: NetPacket(NET_TYPE_LEAVE_CURRENT_GAME, sizeof(NetPacketLeaveCurrentGame), sizeof(NetPacketLeaveCurrentGame))
|
||||
: NetPacket(NET_TYPE_LEAVE_CURRENT_GAME, sizeof(NetPacketLeaveCurrentGameData), sizeof(NetPacketLeaveCurrentGameData))
|
||||
{
|
||||
}
|
||||
|
||||
@@ -2735,6 +2751,43 @@ NetPacketStartEvent::InternalCheck(const NetPacketHeader*) const
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
NetPacketStartEventAck::NetPacketStartEventAck()
|
||||
: NetPacket(NET_TYPE_START_EVENT_ACK, sizeof(NetPacketStartEventAckData), sizeof(NetPacketStartEventAckData))
|
||||
{
|
||||
}
|
||||
|
||||
NetPacketStartEventAck::~NetPacketStartEventAck()
|
||||
{
|
||||
}
|
||||
|
||||
boost::shared_ptr<NetPacket>
|
||||
NetPacketStartEventAck::Clone() const
|
||||
{
|
||||
boost::shared_ptr<NetPacket> newPacket(new NetPacketStartEventAck);
|
||||
try
|
||||
{
|
||||
newPacket->SetRawData(GetRawData());
|
||||
} catch (const NetException &)
|
||||
{
|
||||
// Need to return the new packet anyway.
|
||||
}
|
||||
return newPacket;
|
||||
}
|
||||
|
||||
const NetPacketStartEventAck *
|
||||
NetPacketStartEventAck::ToNetPacketStartEventAck() const
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
void
|
||||
NetPacketStartEventAck::InternalCheck(const NetPacketHeader*) const
|
||||
{
|
||||
// Nothing to do.
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
NetPacketGameStart::NetPacketGameStart()
|
||||
: NetPacket(NET_TYPE_GAME_START, sizeof(NetPacketGameStartData), MAX_PACKET_SIZE)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user