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);
+15 -1
View File
@@ -38,7 +38,8 @@ ServerGameThread::ServerGameThread(ServerLobbyThread &lobbyThread, u_int32_t id,
: m_adminPlayerId(adminPlayerId), m_lobbyThread(lobbyThread), m_gui(gui),
m_gameData(gameData), m_id(id), m_name(name), m_password(pwd), m_playerConfig(playerConfig),
m_curState(NULL), m_gameNum(1),
m_stateTimer(boost::posix_time::time_duration(0, 0, 0), boost::timers::portable::microsec_timer::manual_start)
m_stateTimer(boost::posix_time::time_duration(0, 0, 0), boost::timers::portable::microsec_timer::manual_start),
m_stateTimerFlag(0)
{
m_receiver.reset(new ReceiverHelper);
}
@@ -350,6 +351,8 @@ ServerGameThread::RemovePlayerData(boost::shared_ptr<PlayerData> player)
boost::shared_ptr<PlayerData> newAdmin = playerList.front();
SetAdminPlayerId(newAdmin->GetUniqueId());
newAdmin->SetRights(PLAYER_RIGHTS_ADMIN);
// Notify game state on admin change
GetState().NotifyGameAdminChanged(*this);
// Send "Game Admin Changed" to clients.
boost::shared_ptr<NetPacket> adminChanged(new NetPacketGameAdminChanged);
NetPacketGameAdminChanged::Data adminChangedData;
@@ -491,6 +494,17 @@ ServerGameThread::GetStateTimer()
return m_stateTimer;
}
unsigned
ServerGameThread::GetStateTimerFlag() const
{
return m_stateTimerFlag;
}
void
ServerGameThread::SetStateTimerFlag(unsigned flag)
{
m_stateTimerFlag = flag;
}
SenderThread &
ServerGameThread::GetSender()
{
+7 -2
View File
@@ -45,6 +45,7 @@ public:
// Initialize after switching to this state.
virtual void Init(ServerGameThread &server) = 0;
virtual void NotifyGameAdminChanged(ServerGameThread &server) = 0;
// Handling of a new session.
virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session) = 0;
@@ -76,6 +77,8 @@ class AbstractServerGameStateRunning : virtual public ServerGameState
public:
virtual ~AbstractServerGameStateRunning();
virtual void NotifyGameAdminChanged(ServerGameThread &/*server*/) {}
// Reject new connections.
virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session);
@@ -94,7 +97,7 @@ public:
};
// State: Initialization.
class ServerGameStateInit : public AbstractServerGameStateReceiving
class ServerGameStateInit : public AbstractServerGameStateReceiving, public AbstractServerGameStateTimer
{
public:
// Access the state singleton.
@@ -102,8 +105,10 @@ public:
virtual ~ServerGameStateInit();
virtual void Init(ServerGameThread & /*server*/) {}
virtual void NotifyGameAdminChanged(ServerGameThread &server);
//
virtual int Process(ServerGameThread &server);
virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session);
protected:
+3
View File
@@ -109,6 +109,8 @@ protected:
const boost::timers::portable::microsec_timer &GetStateTimer() const;
boost::timers::portable::microsec_timer &GetStateTimer();
unsigned GetStateTimerFlag() const;
void SetStateTimerFlag(unsigned flag);
SenderThread &GetSender();
ReceiverHelper &GetReceiver();
@@ -153,6 +155,7 @@ private:
unsigned m_gameNum;
boost::timers::portable::microsec_timer m_stateTimer;
unsigned m_stateTimerFlag;
friend class AbstractServerGameStateReceiving;
friend class AbstractServerGameStateRunning;