aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/Chat.cpp1
-rw-r--r--src/game/Chat.h1
-rw-r--r--src/game/Language.h3
-rw-r--r--src/game/Level3.cpp23
-rw-r--r--src/game/Opcodes.cpp4
-rw-r--r--src/game/World.cpp2
-rw-r--r--src/game/World.h8
-rw-r--r--src/game/WorldSocket.cpp10
8 files changed, 50 insertions, 2 deletions
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp
index 83b383fb7b1..390cab6150a 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -488,6 +488,7 @@ ChatCommand * ChatHandler::getCommandTable()
{ "difftime", SEC_CONSOLE, true, &ChatHandler::HandleServerSetDiffTimeCommand, "", NULL },
{ "loglevel", SEC_CONSOLE, true, &ChatHandler::HandleServerSetLogLevelCommand, "", NULL },
{ "motd", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerSetMotdCommand, "", NULL },
+ { "closed", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerSetClosedCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
diff --git a/src/game/Chat.h b/src/game/Chat.h
index 5d8dd5e646c..7d799849b8e 100644
--- a/src/game/Chat.h
+++ b/src/game/Chat.h
@@ -314,6 +314,7 @@ class ChatHandler
bool HandleServerSetDiffTimeCommand(const char* args);
bool HandleServerShutDownCommand(const char* args);
bool HandleServerShutDownCancelCommand(const char* args);
+ bool HandleServerSetClosedCommand(const char* args);
bool HandleHonorAddCommand(const char* args);
bool HandleHonorAddKillCommand(const char* args);
diff --git a/src/game/Language.h b/src/game/Language.h
index 035fef4cfe3..3ebf52ce5d3 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -843,6 +843,9 @@ enum TrinityStrings
LANG_GM_NOTIFY = 6614,
LANG_GM_ANNOUNCE_COLOR = 6615,
+ LANG_WORLD_CLOSED = 7523,
+ LANG_WORLD_OPENED = 7524,
+
// Use for not-in-offcial-sources patches
// 10000-10999
// opvp hp
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index 46e5c880b16..bd2fadcb0ee 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -6821,6 +6821,29 @@ bool ChatHandler::HandleServerSetMotdCommand(const char* args)
return true;
}
+/// Set whether we accept new clients
+bool ChatHandler::HandleServerSetClosedCommand(const char* args)
+{
+ std::string arg = args;
+
+ if(args == "on")
+ {
+ SendSysMessage(LANG_WORLD_CLOSED);
+ sWorld.SetClosed(true);
+ return true;
+ }
+ if(args == "off")
+ {
+ SendSysMessage(LANG_WORLD_OPENED);
+ sWorld.SetClosed(false);
+ return true;
+ }
+
+ SendSysMessage(LANG_USE_BOL);
+ SetSentErrorMessage(true);
+ return false;
+}
+
/// Set/Unset the expansion level for an account
bool ChatHandler::HandleAccountSetAddonCommand(const char* args)
{
diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp
index bba5c81ae9e..638d54236d1 100644
--- a/src/game/Opcodes.cpp
+++ b/src/game/Opcodes.cpp
@@ -547,7 +547,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x204*/ { "CMSG_DECHARGE", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x205*/ { "CMSG_GMTICKET_CREATE", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketCreateOpcode },
/*0x206*/ { "SMSG_GMTICKET_CREATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x207*/ { "CMSG_GMTICKET_UPDATETEXT", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketUpdateOpcode },
+ /*0x207*/ { "CMSG_GMTICKET_UPDATETEXT", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketUpdateOpcode },
/*0x208*/ { "SMSG_GMTICKET_UPDATETEXT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x209*/ { "SMSG_ACCOUNT_DATA_TIMES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x20A*/ { "CMSG_REQUEST_ACCOUNT_DATA", STATUS_LOGGEDIN, &WorldSession::HandleRequestAccountData },
@@ -1067,7 +1067,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x40C*/ { "CMSG_SET_GRANTABLE_LEVELS", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x40D*/ { "CMSG_GRANT_LEVEL", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x40E*/ { "CMSG_REFER_A_FRIEND", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x40F*/ { "CMSG_DECLINE_CHANNEL_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleChannelDeclineInvite },
+ /*0x40F*/ { "CMSG_DECLINE_CHANNEL_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleChannelDeclineInvite },
/*0x410*/ { "CMSG_DECLINE_CHANNEL_INVITE", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x411*/ { "CMSG_GROUPACTION_THROTTLED", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x412*/ { "SMSG_OVERRIDE_LIGHT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
diff --git a/src/game/World.cpp b/src/game/World.cpp
index bbfa47edd6c..947500c09dc 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -120,6 +120,8 @@ World::World()
m_updateTimeSum = 0;
m_updateTimeCount = 0;
+
+ m_isClosed = false;
}
/// World destructor
diff --git a/src/game/World.h b/src/game/World.h
index de5934ec40e..7e9af69a7da 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -392,6 +392,12 @@ class World
Weather* AddWeather(uint32 zone_id);
void RemoveWeather(uint32 zone_id);
+ /// Deny clients?
+ bool IsClosed() { return m_isClosed; }
+
+ /// Close world
+ void SetClosed(bool val) { m_isClosed = val; }
+
/// Get the active session server limit (or security level limitations)
uint32 GetPlayerAmountLimit() const { return m_playerLimit >= 0 ? m_playerLimit : 0; }
AccountTypes GetPlayerSecurityLimit() const { return m_playerLimit <= 0 ? AccountTypes(-m_playerLimit) : SEC_PLAYER; }
@@ -550,6 +556,8 @@ class World
uint32 m_ShutdownTimer;
uint32 m_ShutdownMask;
+ bool m_isClosed;
+
time_t m_startTime;
time_t m_gameTime;
IntervalTimer m_timers[WUPDATE_COUNT];
diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp
index 0f975cf776f..dd2d2d93f1f 100644
--- a/src/game/WorldSocket.cpp
+++ b/src/game/WorldSocket.cpp
@@ -764,6 +764,16 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
return -1;
}
+ if(sWorld.IsClosed())
+ {
+ packet.Initialize(SMSG_AUTH_RESPONSE, 1);
+ packet << uint8(AUTH_REJECT);
+ SendPacket (packet);
+
+ sLog.outError ("WorldSocket::HandleAuthSession: World closed, denying client (%s).", m_Session->GetRemoteAddress());
+ return -1;
+ }
+
// Read the content of the packet
recvPacket >> BuiltNumberClient; // for now no use
recvPacket >> unk2;