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
+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);