aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/World.cpp26
-rw-r--r--src/game/World.h4
-rw-r--r--src/trinitycore/trinitycore.conf.dist5
3 files changed, 33 insertions, 2 deletions
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 481569a9c7a..7adb9f4d24f 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -244,7 +244,7 @@ World::AddSession_ (WorldSession* s)
if(decrease_session)
--Sessions;
- if (pLimit > 0 && Sessions >= pLimit && s->GetSecurity () == SEC_PLAYER )
+ if (pLimit > 0 && Sessions >= pLimit && s->GetSecurity () == SEC_PLAYER && !HasRecentlyDisconnected(s) )
{
AddQueuedPlayer (s);
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)
{
uint32 position = 1;
@@ -536,6 +556,7 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_ADDON_CHANNEL] = sConfig.GetBoolDefault("AddonChannel", true);
m_configs[CONFIG_GRID_UNLOAD] = sConfig.GetBoolDefault("GridUnload", true);
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);
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
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;
m_sessions.erase(itr);
}
diff --git a/src/game/World.h b/src/game/World.h
index 590ca60b439..4848c87ca5f 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -80,6 +80,7 @@ enum WorldConfigs
CONFIG_INTERVAL_GRIDCLEAN,
CONFIG_INTERVAL_MAPUPDATE,
CONFIG_INTERVAL_CHANGEWEATHER,
+ CONFIG_INTERVAL_DISCONNECT_TOLERANCE,
CONFIG_PORT_WORLD,
CONFIG_SOCKET_SELECTTIME,
CONFIG_GROUP_XP_DISTANCE,
@@ -389,6 +390,7 @@ class World
void AddQueuedPlayer(WorldSession*);
bool RemoveQueuedPlayer(WorldSession* session);
int32 GetQueuePos(WorldSession*);
+ bool HasRecentlyDisconnected(WorldSession*);
uint32 GetQueueSize() const { return m_QueuedPlayer.size(); }
/// \todo Actions on m_allowMovement still to be implemented
@@ -547,6 +549,8 @@ class World
WeatherMap m_weathers;
typedef UNORDERED_MAP<uint32, WorldSession*> SessionMap;
SessionMap m_sessions;
+ typedef UNORDERED_MAP<uint32, time_t> DisconnectMap;
+ DisconnectMap m_disconnects;
uint32 m_maxActiveSessionCount;
uint32 m_maxQueuedSessionCount;
diff --git a/src/trinitycore/trinitycore.conf.dist b/src/trinitycore/trinitycore.conf.dist
index 1ceb1ec37df..552e87f34bf 100644
--- a/src/trinitycore/trinitycore.conf.dist
+++ b/src/trinitycore/trinitycore.conf.dist
@@ -127,6 +127,10 @@ EAIErrorLevel = 2
# Player save interval (in milliseconds)
# Default: 900000 (15 min)
#
+# DisconnectToleranceInterval
+# Tolerance for disconnected players before putting in the queue. (in seconds)
+# Default: 0 (disabled)
+#
# vmap.enableLOS
# vmap.enableHeight
# Enable/Disable VMmap support for line of sight and height calculation
@@ -184,6 +188,7 @@ GridCleanUpDelay = 300000
MapUpdateInterval = 100
ChangeWeatherInterval = 600000
PlayerSaveInterval = 900000
+DisconnectToleranceInterval = 0
vmap.enableLOS = 0
vmap.enableHeight = 0
vmap.ignoreMapIds = "369"