Update number of votes on client.

This commit is contained in:
lotodore
2008-12-07 12:22:35 +00:00
parent bd55b69817
commit 80883dd409
7 changed files with 166 additions and 2 deletions
+16 -1
View File
@@ -896,7 +896,7 @@ Deny Reason:
0xFFFF: Other reason.
Server Notification: End Kick Player Petition
Server Notification: Kick Player Petition 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
@@ -907,6 +907,21 @@ Server Notification: End Kick Player Petition
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| # Votes against Kicking | # Votes in favour of Kicking |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| # Votes Needed to kick | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Server Notification: End Kick Player Petition
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 = 120 | Message Length = 16 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Petition ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| # Votes against Kicking | # Votes in favour of Kicking |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Vote Result | End Reason |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Vote Result:
+1
View File
@@ -151,6 +151,7 @@ protected:
void ClearGameInfoMap();
void StartPetition(unsigned petitionId, unsigned proposingPlayerId, unsigned kickPlayerId, int timeoutSec, int numVotesToKick);
void UpdatePetition(unsigned petitionId, int numVotesAgainstKicking, int numVotesInFavourOfKicking, int numVotesToKick);
void EndPetition(unsigned petitionId);
void UpdateStatData(const ServerStats &stats);
+7
View File
@@ -776,6 +776,13 @@ AbstractClientStateReceiving::Process(ClientThread &client)
client.StartPetition(startPetitionData.petitionId, startPetitionData.proposingPlayerId,
startPetitionData.kickPlayerId, startPetitionData.kickTimeoutSec, startPetitionData.numVotesNeededToKick);
}
else if (tmpPacket->ToNetPacketKickPlayerPetitionUpdate())
{
NetPacketKickPlayerPetitionUpdate::Data updatePetitionData;
tmpPacket->ToNetPacketKickPlayerPetitionUpdate()->GetData(updatePetitionData);
client.UpdatePetition(updatePetitionData.petitionId, updatePetitionData.numVotesAgainstKicking,
updatePetitionData.numVotesInFavourOfKicking, updatePetitionData.numVotesNeededToKick);
}
else if (tmpPacket->ToNetPacketEndKickPlayerPetition())
{
NetPacketEndKickPlayerPetition::Data endPetitionData;
+14
View File
@@ -1037,6 +1037,20 @@ ClientThread::StartPetition(unsigned petitionId, unsigned proposingPlayerId, uns
}
}
void
ClientThread::UpdatePetition(unsigned petitionId, int /*numVotesAgainstKicking*/, int numVotesInFavourOfKicking, int numVotesToKick)
{
bool isCurPetition;
{
boost::mutex::scoped_lock lock(m_curPetitionIdMutex);
isCurPetition = m_curPetitionId == petitionId;
}
if (isCurPetition)
{
GetGui().refreshVotesMonitor(numVotesInFavourOfKicking, numVotesToKick);
}
}
void
ClientThread::EndPetition(unsigned petitionId)
{
+90 -1
View File
@@ -76,7 +76,8 @@ using namespace std;
#define NET_TYPE_VOTE_KICK_PLAYER 0x0074
#define NET_TYPE_VOTE_KICK_PLAYER_ACK 0x0075
#define NET_TYPE_VOTE_KICK_PLAYER_DENIED 0x0076
#define NET_TYPE_END_KICK_PLAYER_PETITION 0x0077
#define NET_TYPE_KICK_PLAYER_PETITION_UPDATE 0x0077
#define NET_TYPE_END_KICK_PLAYER_PETITION 0x0078
#define NET_TYPE_STATISTICS_CHANGED 0x0080
@@ -588,6 +589,16 @@ struct GCC_PACKED NetPacketVoteKickPlayerDeniedData
u_int16_t reserved;
};
struct GCC_PACKED NetPacketKickPlayerPetitionUpdateData
{
NetPacketHeader head;
u_int32_t petitionId;
u_int16_t numVotesAgainstKicking;
u_int16_t numVotesInFavourOfKicking;
u_int16_t numVotesNeededToKick;
u_int16_t reserved;
};
struct GCC_PACKED NetPacketEndKickPlayerPetitionData
{
NetPacketHeader head;
@@ -915,6 +926,9 @@ NetPacket::Create(char *data, unsigned &dataSize)
case NET_TYPE_VOTE_KICK_PLAYER_DENIED:
tmpPacket = boost::shared_ptr<NetPacket>(new NetPacketVoteKickPlayerDenied);
break;
case NET_TYPE_KICK_PLAYER_PETITION_UPDATE:
tmpPacket = boost::shared_ptr<NetPacket>(new NetPacketKickPlayerPetitionUpdate);
break;
case NET_TYPE_END_KICK_PLAYER_PETITION:
tmpPacket = boost::shared_ptr<NetPacket>(new NetPacketEndKickPlayerPetition);
break;
@@ -1305,6 +1319,12 @@ NetPacket::ToNetPacketVoteKickPlayerDenied() const
return NULL;
}
const NetPacketKickPlayerPetitionUpdate *
NetPacket::ToNetPacketKickPlayerPetitionUpdate() const
{
return NULL;
}
const NetPacketEndKickPlayerPetition *
NetPacket::ToNetPacketEndKickPlayerPetition() const
{
@@ -4828,6 +4848,75 @@ NetPacketVoteKickPlayerDenied::InternalCheck(const NetPacketHeader*) const
//-----------------------------------------------------------------------------
NetPacketKickPlayerPetitionUpdate::NetPacketKickPlayerPetitionUpdate()
: NetPacket(NET_TYPE_KICK_PLAYER_PETITION_UPDATE, sizeof(NetPacketKickPlayerPetitionUpdateData), sizeof(NetPacketKickPlayerPetitionUpdateData))
{
}
NetPacketKickPlayerPetitionUpdate::~NetPacketKickPlayerPetitionUpdate()
{
}
boost::shared_ptr<NetPacket>
NetPacketKickPlayerPetitionUpdate::Clone() const
{
boost::shared_ptr<NetPacket> newPacket(new NetPacketKickPlayerPetitionUpdate);
try
{
newPacket->SetRawData(GetRawData());
} catch (const NetException &)
{
// Need to return the new packet anyway.
}
return newPacket;
}
void
NetPacketKickPlayerPetitionUpdate::SetData(const NetPacketKickPlayerPetitionUpdate::Data &inData)
{
NetPacketKickPlayerPetitionUpdateData *tmpData = (NetPacketKickPlayerPetitionUpdateData *)GetRawData();
tmpData->petitionId = htonl(inData.petitionId);
tmpData->numVotesAgainstKicking = htons(inData.numVotesAgainstKicking);
tmpData->numVotesInFavourOfKicking = htons(inData.numVotesInFavourOfKicking);
tmpData->numVotesNeededToKick = htons(inData.numVotesNeededToKick);
// Check the packet - just in case.
Check(GetRawData());
}
void
NetPacketKickPlayerPetitionUpdate::GetData(NetPacketKickPlayerPetitionUpdate::Data &outData) const
{
NetPacketKickPlayerPetitionUpdateData *tmpData = (NetPacketKickPlayerPetitionUpdateData *)GetRawData();
outData.petitionId = ntohl(tmpData->petitionId);
outData.numVotesAgainstKicking = ntohs(tmpData->numVotesAgainstKicking);
outData.numVotesInFavourOfKicking = ntohs(tmpData->numVotesInFavourOfKicking);
outData.numVotesNeededToKick = ntohs(tmpData->numVotesNeededToKick);
}
const NetPacketKickPlayerPetitionUpdate *
NetPacketKickPlayerPetitionUpdate::ToNetPacketKickPlayerPetitionUpdate() const
{
return this;
}
void
NetPacketKickPlayerPetitionUpdate::InternalCheck(const NetPacketHeader *data) const
{
NetPacketKickPlayerPetitionUpdateData *tmpData = (NetPacketKickPlayerPetitionUpdateData *)data;
if (ntohs(tmpData->numVotesAgainstKicking) > MAX_NUMBER_OF_PLAYERS)
throw NetException(__FILE__, __LINE__, ERR_SOCK_INVALID_PACKET, 0);
if (ntohs(tmpData->numVotesInFavourOfKicking) > MAX_NUMBER_OF_PLAYERS)
throw NetException(__FILE__, __LINE__, ERR_SOCK_INVALID_PACKET, 0);
if (ntohs(tmpData->numVotesNeededToKick) > MAX_NUMBER_OF_PLAYERS)
throw NetException(__FILE__, __LINE__, ERR_SOCK_INVALID_PACKET, 0);
}
//-----------------------------------------------------------------------------
NetPacketEndKickPlayerPetition::NetPacketEndKickPlayerPetition()
: NetPacket(NET_TYPE_END_KICK_PLAYER_PETITION, sizeof(NetPacketEndKickPlayerPetitionData), sizeof(NetPacketEndKickPlayerPetitionData))
{
+10
View File
@@ -385,6 +385,16 @@ ServerGameThread::InternalVoteKick(SessionWrapper byWhom, unsigned petitionId, K
m_voteKickData->numVotesInFavourOfKicking++;
else
m_voteKickData->numVotesAgainstKicking++;
// Send update notification.
boost::shared_ptr<NetPacket> updatePetition(new NetPacketKickPlayerPetitionUpdate);
NetPacketKickPlayerPetitionUpdate::Data updatePetitionData;
updatePetitionData.petitionId = m_voteKickData->petitionId;
updatePetitionData.numVotesAgainstKicking = m_voteKickData->numVotesAgainstKicking;
updatePetitionData.numVotesInFavourOfKicking = m_voteKickData->numVotesInFavourOfKicking;
updatePetitionData.numVotesNeededToKick = m_voteKickData->numVotesToKick;
static_cast<NetPacketKickPlayerPetitionUpdate *>(updatePetition.get())->SetData(updatePetitionData);
SendToAllPlayers(updatePetition, SessionData::Game);
}
else
InternalDenyVoteKick(byWhom, petitionId, VOTE_DENIED_ALREADY_VOTED);
+28
View File
@@ -93,6 +93,7 @@ class NetPacketStartKickPlayerPetition;
class NetPacketVoteKickPlayer;
class NetPacketVoteKickPlayerAck;
class NetPacketVoteKickPlayerDenied;
class NetPacketKickPlayerPetitionUpdate;
class NetPacketEndKickPlayerPetition;
class NetPacketStatisticsChanged;
class NetPacketRemovedFromGame;
@@ -166,6 +167,7 @@ public:
virtual const NetPacketVoteKickPlayer *ToNetPacketVoteKickPlayer() const;
virtual const NetPacketVoteKickPlayerAck *ToNetPacketVoteKickPlayerAck() const;
virtual const NetPacketVoteKickPlayerDenied *ToNetPacketVoteKickPlayerDenied() const;
virtual const NetPacketKickPlayerPetitionUpdate *ToNetPacketKickPlayerPetitionUpdate() const;
virtual const NetPacketEndKickPlayerPetition *ToNetPacketEndKickPlayerPetition() const;
virtual const NetPacketStatisticsChanged *ToNetPacketStatisticsChanged() const;
virtual const NetPacketRemovedFromGame *ToNetPacketRemovedFromGame() const;
@@ -1332,6 +1334,32 @@ protected:
virtual void InternalCheck(const NetPacketHeader* data) const;
};
class NetPacketKickPlayerPetitionUpdate : public NetPacket
{
public:
struct Data
{
u_int32_t petitionId;
u_int16_t numVotesAgainstKicking;
u_int16_t numVotesInFavourOfKicking;
u_int16_t numVotesNeededToKick;
};
NetPacketKickPlayerPetitionUpdate();
virtual ~NetPacketKickPlayerPetitionUpdate();
virtual boost::shared_ptr<NetPacket> Clone() const;
void SetData(const Data &inData);
void GetData(Data &outData) const;
virtual const NetPacketKickPlayerPetitionUpdate *ToNetPacketKickPlayerPetitionUpdate() const;
protected:
virtual void InternalCheck(const NetPacketHeader* data) const;
};
class NetPacketEndKickPlayerPetition : public NetPacket
{
public: