*Configurable option time for reconnect without queue - by Iskander

--HG--
branch : trunk
This commit is contained in:
Blaymoira
2009-02-21 18:31:26 +01:00
parent 1fb63e8bfd
commit c5204ca3a0
3 changed files with 33 additions and 2 deletions
+24 -2
View File
@@ -244,7 +244,7 @@ World::AddSession_ (WorldSession* s)
if(decrease_session) if(decrease_session)
--Sessions; --Sessions;
if (pLimit > 0 && Sessions >= pLimit && s->GetSecurity () == SEC_PLAYER ) if (pLimit > 0 && Sessions >= pLimit && s->GetSecurity () == SEC_PLAYER && !HasRecentlyDisconnected(s) )
{ {
AddQueuedPlayer (s); AddQueuedPlayer (s);
UpdateMaxSessionCounters (); UpdateMaxSessionCounters ();
@@ -273,6 +273,26 @@ World::AddSession_ (WorldSession* s)
} }
} }
bool World::HasRecentlyDisconnected(WorldSession* session)
{
if(!session) return false;
if(uint32 tolerance = getConfig(CONFIG_INTERVAL_DISCONNECT_TOLERANCE))
{
for(DisconnectMap::iterator i = m_disconnects.begin(); i != m_disconnects.end(); ++i)
{
if(difftime(i->second, time(NULL)) < tolerance)
{
if(i->first == session->GetAccountId())
return true;
}
else
m_disconnects.erase(i);
}
}
return false;
}
int32 World::GetQueuePos(WorldSession* sess) int32 World::GetQueuePos(WorldSession* sess)
{ {
uint32 position = 1; uint32 position = 1;
@@ -536,6 +556,7 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_ADDON_CHANNEL] = sConfig.GetBoolDefault("AddonChannel", true); m_configs[CONFIG_ADDON_CHANNEL] = sConfig.GetBoolDefault("AddonChannel", true);
m_configs[CONFIG_GRID_UNLOAD] = sConfig.GetBoolDefault("GridUnload", true); m_configs[CONFIG_GRID_UNLOAD] = sConfig.GetBoolDefault("GridUnload", true);
m_configs[CONFIG_INTERVAL_SAVE] = sConfig.GetIntDefault("PlayerSaveInterval", 900000); m_configs[CONFIG_INTERVAL_SAVE] = sConfig.GetIntDefault("PlayerSaveInterval", 900000);
m_configs[CONFIG_INTERVAL_DISCONNECT_TOLERANCE] = sConfig.GetIntDefault("DisconnectToleranceInterval", 0);
m_configs[CONFIG_INTERVAL_GRIDCLEAN] = sConfig.GetIntDefault("GridCleanUpDelay", 300000); m_configs[CONFIG_INTERVAL_GRIDCLEAN] = sConfig.GetIntDefault("GridCleanUpDelay", 300000);
if(m_configs[CONFIG_INTERVAL_GRIDCLEAN] < MIN_GRID_DELAY) if(m_configs[CONFIG_INTERVAL_GRIDCLEAN] < MIN_GRID_DELAY)
@@ -2871,7 +2892,8 @@ void World::UpdateSessions( time_t diff )
///- and remove not active sessions from the list ///- and remove not active sessions from the list
if(!itr->second->Update(diff)) // As interval = 0 if(!itr->second->Update(diff)) // As interval = 0
{ {
RemoveQueuedPlayer (itr->second); if(!RemoveQueuedPlayer(itr->second) && itr->second && getConfig(CONFIG_INTERVAL_DISCONNECT_TOLERANCE))
m_disconnects[itr->second->GetAccountId()] = time(NULL);
delete itr->second; delete itr->second;
m_sessions.erase(itr); m_sessions.erase(itr);
} }
+4
View File
@@ -80,6 +80,7 @@ enum WorldConfigs
CONFIG_INTERVAL_GRIDCLEAN, CONFIG_INTERVAL_GRIDCLEAN,
CONFIG_INTERVAL_MAPUPDATE, CONFIG_INTERVAL_MAPUPDATE,
CONFIG_INTERVAL_CHANGEWEATHER, CONFIG_INTERVAL_CHANGEWEATHER,
CONFIG_INTERVAL_DISCONNECT_TOLERANCE,
CONFIG_PORT_WORLD, CONFIG_PORT_WORLD,
CONFIG_SOCKET_SELECTTIME, CONFIG_SOCKET_SELECTTIME,
CONFIG_GROUP_XP_DISTANCE, CONFIG_GROUP_XP_DISTANCE,
@@ -389,6 +390,7 @@ class World
void AddQueuedPlayer(WorldSession*); void AddQueuedPlayer(WorldSession*);
bool RemoveQueuedPlayer(WorldSession* session); bool RemoveQueuedPlayer(WorldSession* session);
int32 GetQueuePos(WorldSession*); int32 GetQueuePos(WorldSession*);
bool HasRecentlyDisconnected(WorldSession*);
uint32 GetQueueSize() const { return m_QueuedPlayer.size(); } uint32 GetQueueSize() const { return m_QueuedPlayer.size(); }
/// \todo Actions on m_allowMovement still to be implemented /// \todo Actions on m_allowMovement still to be implemented
@@ -547,6 +549,8 @@ class World
WeatherMap m_weathers; WeatherMap m_weathers;
typedef UNORDERED_MAP<uint32, WorldSession*> SessionMap; typedef UNORDERED_MAP<uint32, WorldSession*> SessionMap;
SessionMap m_sessions; SessionMap m_sessions;
typedef UNORDERED_MAP<uint32, time_t> DisconnectMap;
DisconnectMap m_disconnects;
uint32 m_maxActiveSessionCount; uint32 m_maxActiveSessionCount;
uint32 m_maxQueuedSessionCount; uint32 m_maxQueuedSessionCount;
+5
View File
@@ -127,6 +127,10 @@ EAIErrorLevel = 2
# Player save interval (in milliseconds) # Player save interval (in milliseconds)
# Default: 900000 (15 min) # Default: 900000 (15 min)
# #
# DisconnectToleranceInterval
# Tolerance for disconnected players before putting in the queue. (in seconds)
# Default: 0 (disabled)
#
# vmap.enableLOS # vmap.enableLOS
# vmap.enableHeight # vmap.enableHeight
# Enable/Disable VMmap support for line of sight and height calculation # Enable/Disable VMmap support for line of sight and height calculation
@@ -184,6 +188,7 @@ GridCleanUpDelay = 300000
MapUpdateInterval = 100 MapUpdateInterval = 100
ChangeWeatherInterval = 600000 ChangeWeatherInterval = 600000
PlayerSaveInterval = 900000 PlayerSaveInterval = 900000
DisconnectToleranceInterval = 0
vmap.enableLOS = 0 vmap.enableLOS = 0
vmap.enableHeight = 0 vmap.enableHeight = 0
vmap.ignoreMapIds = "369" vmap.ignoreMapIds = "369"