Game admin timeout in lobby (test version).
This commit is contained in:
@@ -62,6 +62,9 @@ using namespace std;
|
|||||||
#define SERVER_COMPUTER_ACTION_DELAY_SEC 2
|
#define SERVER_COMPUTER_ACTION_DELAY_SEC 2
|
||||||
#endif
|
#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
|
// Helper functions
|
||||||
// TODO: these are hacks.
|
// TODO: these are hacks.
|
||||||
|
|
||||||
@@ -177,8 +180,6 @@ AbstractServerGameStateReceiving::Process(ServerGameThread &server)
|
|||||||
// Delegate to Lobby.
|
// Delegate to Lobby.
|
||||||
server.GetLobbyThread().HandleGameRetrieveAvatar(session, *packet->ToNetPacketRetrieveAvatar());
|
server.GetLobbyThread().HandleGameRetrieveAvatar(session, *packet->ToNetPacketRetrieveAvatar());
|
||||||
}
|
}
|
||||||
else if (packet->ToNetPacketResetTimeout())
|
|
||||||
{}
|
|
||||||
else if (packet->ToNetPacketLeaveCurrentGame())
|
else if (packet->ToNetPacketLeaveCurrentGame())
|
||||||
{
|
{
|
||||||
server.MoveSessionToLobby(session, NTF_NET_REMOVED_ON_REQUEST);
|
server.MoveSessionToLobby(session, NTF_NET_REMOVED_ON_REQUEST);
|
||||||
@@ -234,6 +235,7 @@ AbstractServerGameStateTimer::Init(ServerGameThread & server)
|
|||||||
// Reset timer.
|
// Reset timer.
|
||||||
server.GetStateTimer().reset();
|
server.GetStateTimer().reset();
|
||||||
server.GetStateTimer().start();
|
server.GetStateTimer().start();
|
||||||
|
server.SetStateTimerFlag(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -254,6 +256,13 @@ ServerGameStateInit::~ServerGameStateInit()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ServerGameStateInit::NotifyGameAdminChanged(ServerGameThread &server)
|
||||||
|
{
|
||||||
|
// Reset admin timer.
|
||||||
|
AbstractServerGameStateTimer::Init(server);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper session)
|
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
|
int
|
||||||
ServerGameStateInit::InternalProcess(ServerGameThread &server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
|
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());
|
server.SetState(ServerGameStateWaitAck::Instance());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (packet->ToNetPacketResetTimeout())
|
||||||
|
{
|
||||||
|
if (session.playerData->GetRights() == PLAYER_RIGHTS_ADMIN)
|
||||||
|
{
|
||||||
|
// Reset admin timer.
|
||||||
|
AbstractServerGameStateTimer::Init(server);
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
server.SessionError(session, ERR_SOCK_INVALID_PACKET);
|
server.SessionError(session, ERR_SOCK_INVALID_PACKET);
|
||||||
|
|||||||
@@ -38,7 +38,8 @@ ServerGameThread::ServerGameThread(ServerLobbyThread &lobbyThread, u_int32_t id,
|
|||||||
: m_adminPlayerId(adminPlayerId), m_lobbyThread(lobbyThread), m_gui(gui),
|
: 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_gameData(gameData), m_id(id), m_name(name), m_password(pwd), m_playerConfig(playerConfig),
|
||||||
m_curState(NULL), m_gameNum(1),
|
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);
|
m_receiver.reset(new ReceiverHelper);
|
||||||
}
|
}
|
||||||
@@ -350,6 +351,8 @@ ServerGameThread::RemovePlayerData(boost::shared_ptr<PlayerData> player)
|
|||||||
boost::shared_ptr<PlayerData> newAdmin = playerList.front();
|
boost::shared_ptr<PlayerData> newAdmin = playerList.front();
|
||||||
SetAdminPlayerId(newAdmin->GetUniqueId());
|
SetAdminPlayerId(newAdmin->GetUniqueId());
|
||||||
newAdmin->SetRights(PLAYER_RIGHTS_ADMIN);
|
newAdmin->SetRights(PLAYER_RIGHTS_ADMIN);
|
||||||
|
// Notify game state on admin change
|
||||||
|
GetState().NotifyGameAdminChanged(*this);
|
||||||
// Send "Game Admin Changed" to clients.
|
// Send "Game Admin Changed" to clients.
|
||||||
boost::shared_ptr<NetPacket> adminChanged(new NetPacketGameAdminChanged);
|
boost::shared_ptr<NetPacket> adminChanged(new NetPacketGameAdminChanged);
|
||||||
NetPacketGameAdminChanged::Data adminChangedData;
|
NetPacketGameAdminChanged::Data adminChangedData;
|
||||||
@@ -491,6 +494,17 @@ ServerGameThread::GetStateTimer()
|
|||||||
return m_stateTimer;
|
return m_stateTimer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned
|
||||||
|
ServerGameThread::GetStateTimerFlag() const
|
||||||
|
{
|
||||||
|
return m_stateTimerFlag;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
ServerGameThread::SetStateTimerFlag(unsigned flag)
|
||||||
|
{
|
||||||
|
m_stateTimerFlag = flag;
|
||||||
|
}
|
||||||
|
|
||||||
SenderThread &
|
SenderThread &
|
||||||
ServerGameThread::GetSender()
|
ServerGameThread::GetSender()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ public:
|
|||||||
|
|
||||||
// Initialize after switching to this state.
|
// Initialize after switching to this state.
|
||||||
virtual void Init(ServerGameThread &server) = 0;
|
virtual void Init(ServerGameThread &server) = 0;
|
||||||
|
virtual void NotifyGameAdminChanged(ServerGameThread &server) = 0;
|
||||||
|
|
||||||
// Handling of a new session.
|
// Handling of a new session.
|
||||||
virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session) = 0;
|
virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session) = 0;
|
||||||
@@ -76,6 +77,8 @@ class AbstractServerGameStateRunning : virtual public ServerGameState
|
|||||||
public:
|
public:
|
||||||
virtual ~AbstractServerGameStateRunning();
|
virtual ~AbstractServerGameStateRunning();
|
||||||
|
|
||||||
|
virtual void NotifyGameAdminChanged(ServerGameThread &/*server*/) {}
|
||||||
|
|
||||||
// Reject new connections.
|
// Reject new connections.
|
||||||
virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session);
|
virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session);
|
||||||
|
|
||||||
@@ -94,7 +97,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// State: Initialization.
|
// State: Initialization.
|
||||||
class ServerGameStateInit : public AbstractServerGameStateReceiving
|
class ServerGameStateInit : public AbstractServerGameStateReceiving, public AbstractServerGameStateTimer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Access the state singleton.
|
// Access the state singleton.
|
||||||
@@ -102,8 +105,10 @@ public:
|
|||||||
|
|
||||||
virtual ~ServerGameStateInit();
|
virtual ~ServerGameStateInit();
|
||||||
|
|
||||||
virtual void Init(ServerGameThread & /*server*/) {}
|
virtual void NotifyGameAdminChanged(ServerGameThread &server);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
virtual int Process(ServerGameThread &server);
|
||||||
virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session);
|
virtual void HandleNewSession(ServerGameThread &server, SessionWrapper session);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -109,6 +109,8 @@ protected:
|
|||||||
|
|
||||||
const boost::timers::portable::microsec_timer &GetStateTimer() const;
|
const boost::timers::portable::microsec_timer &GetStateTimer() const;
|
||||||
boost::timers::portable::microsec_timer &GetStateTimer();
|
boost::timers::portable::microsec_timer &GetStateTimer();
|
||||||
|
unsigned GetStateTimerFlag() const;
|
||||||
|
void SetStateTimerFlag(unsigned flag);
|
||||||
|
|
||||||
SenderThread &GetSender();
|
SenderThread &GetSender();
|
||||||
ReceiverHelper &GetReceiver();
|
ReceiverHelper &GetReceiver();
|
||||||
@@ -153,6 +155,7 @@ private:
|
|||||||
unsigned m_gameNum;
|
unsigned m_gameNum;
|
||||||
|
|
||||||
boost::timers::portable::microsec_timer m_stateTimer;
|
boost::timers::portable::microsec_timer m_stateTimer;
|
||||||
|
unsigned m_stateTimerFlag;
|
||||||
|
|
||||||
friend class AbstractServerGameStateReceiving;
|
friend class AbstractServerGameStateReceiving;
|
||||||
friend class AbstractServerGameStateRunning;
|
friend class AbstractServerGameStateRunning;
|
||||||
|
|||||||
Reference in New Issue
Block a user