Game admin timeout in lobby (test version).

This commit is contained in:
lotodore
2008-03-06 20:44:37 +00:00
parent 882b47358e
commit e85eb879bb
4 changed files with 76 additions and 5 deletions
+51 -2
View File
@@ -62,6 +62,9 @@ using namespace std;
#define SERVER_COMPUTER_ACTION_DELAY_SEC 2
#endif
#define SERVER_GAME_ADMIN_WARNING_REMAINING_SEC 60
#define SERVER_GAME_ADMIN_TIMEOUT_SEC 70 // MUST be > SERVER_GAME_ADMIN_WARNING_REMAINING_SEC
// Helper functions
// TODO: these are hacks.
@@ -177,8 +180,6 @@ AbstractServerGameStateReceiving::Process(ServerGameThread &server)
// Delegate to Lobby.
server.GetLobbyThread().HandleGameRetrieveAvatar(session, *packet->ToNetPacketRetrieveAvatar());
}
else if (packet->ToNetPacketResetTimeout())
{}
else if (packet->ToNetPacketLeaveCurrentGame())
{
server.MoveSessionToLobby(session, NTF_NET_REMOVED_ON_REQUEST);
@@ -234,6 +235,7 @@ AbstractServerGameStateTimer::Init(ServerGameThread & server)
// Reset timer.
server.GetStateTimer().reset();
server.GetStateTimer().start();
server.SetStateTimerFlag(0);
}
//-----------------------------------------------------------------------------
@@ -254,6 +256,13 @@ ServerGameStateInit::~ServerGameStateInit()
{
}
void
ServerGameStateInit::NotifyGameAdminChanged(ServerGameThread &server)
{
// Reset admin timer.
AbstractServerGameStateTimer::Init(server);
}
void
ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper session)
{
@@ -305,6 +314,38 @@ ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper s
}
}
int
ServerGameStateInit::Process(ServerGameThread &server)
{
if (server.GetStateTimer().elapsed().total_seconds() >= SERVER_GAME_ADMIN_TIMEOUT_SEC - SERVER_GAME_ADMIN_WARNING_REMAINING_SEC
&& !server.GetStateTimerFlag())
{
// Admin timeout - notify game admin.
server.SetStateTimerFlag(1); // Only once.
// Find game admin.
SessionWrapper session = server.GetSessionManager().GetSessionByUniquePlayerId(server.GetAdminPlayerId());
if (session.sessionData.get())
{
boost::shared_ptr<NetPacket> warning(new NetPacketTimeoutWarning);
NetPacketTimeoutWarning::Data warningData;
warningData.timeoutReason = NETWORK_TIMEOUT_GAME_ADMIN_IDLE;
warningData.remainingSeconds = SERVER_GAME_ADMIN_WARNING_REMAINING_SEC;
static_cast<NetPacketTimeoutWarning *>(warning.get())->SetData(warningData);
server.GetSender().Send(session.sessionData, warning);
}
}
else if (server.GetStateTimer().elapsed().total_seconds() >= SERVER_GAME_ADMIN_TIMEOUT_SEC)
{
// Find game admin.
SessionWrapper session = server.GetSessionManager().GetSessionByUniquePlayerId(server.GetAdminPlayerId());
if (session.sessionData.get())
{
server.RemovePlayer(session.playerData->GetUniqueId(), ERR_NET_PLAYER_KICKED); // TODO use proper error code.
}
}
return AbstractServerGameStateReceiving::Process(server);
}
int
ServerGameStateInit::InternalProcess(ServerGameThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
{
@@ -347,6 +388,14 @@ ServerGameStateInit::InternalProcess(ServerGameThread &server, SessionWrapper se
server.SetState(ServerGameStateWaitAck::Instance());
}
}
else if (packet->ToNetPacketResetTimeout())
{
if (session.playerData->GetRights() == PLAYER_RIGHTS_ADMIN)
{
// Reset admin timer.
AbstractServerGameStateTimer::Init(server);
}
}
else
{
server.SessionError(session, ERR_SOCK_INVALID_PACKET);