aboutsummaryrefslogtreecommitdiff
path: root/src/game/WorldSocket.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/WorldSocket.cpp')
-rw-r--r--src/game/WorldSocket.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp
index af6ddd4f0e5..b0e524718e4 100644
--- a/src/game/WorldSocket.cpp
+++ b/src/game/WorldSocket.cpp
@@ -110,7 +110,8 @@ m_OutBufferSize (65536),
m_OutActive (false),
m_Seed (static_cast<uint32> (rand32 ())),
m_OverSpeedPings (0),
-m_LastPingTime (ACE_Time_Value::zero)
+m_LastPingTime (ACE_Time_Value::zero),
+m_TimeOutTime (0)
{
reference_counting_policy ().value (ACE_Event_Handler::Reference_Counting_Policy::ENABLED);
}
@@ -407,6 +408,10 @@ int WorldSocket::Update (void)
if (closing_)
return -1;
+ if (m_TimeOutTime &&
+ time(NULL) >= m_TimeOutTime)
+ return -1;
+
if (m_OutActive || m_OutBuffer->length () == 0)
return 0;
@@ -656,6 +661,20 @@ int WorldSocket::ProcessIncoming (WorldPacket* new_pct)
{
ACE_GUARD_RETURN (LockType, Guard, m_SessionLock, -1);
+ /* The m_TimeOutTime measure is put in to be able to automatically disconnect connections
+ that are sitting idle on the character select screen. After a period of being AFK in the realm,
+ the client will be automatically sent back to the character selection screen. In order to pick up
+ the idle connections and prevent they are sitting there, taking up slots for the realm, we'll check if the packet
+ that was sent is CMSG_CHAR_ENUM and initiate the timeout timer that will be checked on WorldSocket::Update.
+ */
+ if (opcode == CMSG_CHAR_ENUM)
+ m_TimeOutTime = time(NULL) + sWorld.getConfig(CONFIG_SOCKET_TIMEOUTTIME) / IN_MILISECONDS;
+ /* If the packet is CMSG_PLAYER_LOGIN opcode, it means our connection is not idle, we're logging into the world.
+ Until we receive our next CMSG_CHAR_ENUM packet, we can disregard the timeout timer.
+ */
+ else if (opcode == CMSG_PLAYER_LOGIN)
+ m_TimeOutTime = 0;
+
if (m_Session != NULL)
{
// OK ,give the packet to WorldSession