diff options
-rw-r--r-- | data/sql/updates/db_world/2025_09_30_01.sql (renamed from data/sql/updates/pending_db_world/rev_1759180852833254842.sql) | 1 | ||||
-rw-r--r-- | data/sql/updates/db_world/2025_09_30_02.sql (renamed from data/sql/updates/pending_db_world/rev_1759192557957949899.sql) | 1 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 56 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 1 | ||||
-rw-r--r-- | src/server/shared/SharedDefines.h | 17 |
5 files changed, 40 insertions, 36 deletions
diff --git a/data/sql/updates/pending_db_world/rev_1759180852833254842.sql b/data/sql/updates/db_world/2025_09_30_01.sql index 9e2a2cb868..1d4899fe1e 100644 --- a/data/sql/updates/pending_db_world/rev_1759180852833254842.sql +++ b/data/sql/updates/db_world/2025_09_30_01.sql @@ -1,3 +1,4 @@ +-- DB update 2025_09_30_00 -> 2025_09_30_01 -- Drakkari Colossus - Mortal Strike spell difficulty DELETE FROM `spelldifficulty_dbc` WHERE `ID` = 54715; INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`, `DifficultySpellID_3`, `DifficultySpellID_4`) VALUES (54715, 54715, 59454, 0, 0); diff --git a/data/sql/updates/pending_db_world/rev_1759192557957949899.sql b/data/sql/updates/db_world/2025_09_30_02.sql index afe7257eb0..15ed01d1af 100644 --- a/data/sql/updates/pending_db_world/rev_1759192557957949899.sql +++ b/data/sql/updates/db_world/2025_09_30_02.sql @@ -1,2 +1,3 @@ +-- DB update 2025_09_30_01 -> 2025_09_30_02 -- UPDATE `creature_template` SET `type` = 8 WHERE `entry` = 8881; diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 259bf34158..1bb8ac6ed2 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -668,51 +668,46 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData) void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData) { - m_playerLoading = true; - ObjectGuid playerGuid; - recvData >> playerGuid; + if (!sWorld->getBoolConfig(CONFIG_REALM_LOGIN_ENABLED)) + { + SendCharLoginFailed(LoginFailureReason::NoWorld); + return; + } - if (PlayerLoading() || GetPlayer() != nullptr || !playerGuid.IsPlayer()) + if (PlayerLoading() || GetPlayer() != nullptr) { - // limit player interaction with the world - if (!sWorld->getBoolConfig(CONFIG_REALM_LOGIN_ENABLED)) - { - WorldPacket data(SMSG_CHARACTER_LOGIN_FAILED, 1); - // see LoginFailureReason enum for more reasons - data << uint8(LoginFailureReason::NoWorld); - SendPacket(&data); - return; - } + LOG_ERROR("network", "Player tried to login again, AccountId = {}", GetAccountId()); + KickPlayer("WorldSession::HandlePlayerLoginOpcode Another client logging in"); + return; } - if (!playerGuid.IsPlayer() || !IsLegitCharacterForAccount(playerGuid)) + ObjectGuid playerGuid; + recvData >> playerGuid; + + if (!IsLegitCharacterForAccount(playerGuid)) { LOG_ERROR("network", "Account ({}) can't login with that character ({}).", GetAccountId(), playerGuid.ToString()); KickPlayer("Account can't login with this character"); return; } - auto SendCharLogin = [&](ResponseCodes result) - { - WorldPacket data(SMSG_CHARACTER_LOGIN_FAILED, 1); - data << uint8(result); - SendPacket(&data); - }; - // pussywizard: if (WorldSession* sess = sWorldSessionMgr->FindOfflineSessionForCharacterGUID(playerGuid.GetCounter())) + { if (sess->GetAccountId() != GetAccountId()) { - SendCharLogin(CHAR_LOGIN_DUPLICATE_CHARACTER); + SendCharLoginFailed(LoginFailureReason::DuplicateCharacter); return; } + } + // pussywizard: if (WorldSession* sess = sWorldSessionMgr->FindOfflineSession(GetAccountId())) { Player* p = sess->GetPlayer(); if (!p || sess->IsKicked()) { - SendCharLogin(CHAR_LOGIN_DUPLICATE_CHARACTER); + SendCharLoginFailed(LoginFailureReason::DuplicateCharacter); return; } @@ -723,7 +718,7 @@ void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData) // pussywizard: players stay ingame no matter what (prevent abuse), but allow to turn it off to stop crashing if (!sWorld->getBoolConfig(CONFIG_ENABLE_LOGIN_AFTER_DC)) { - SendCharLogin(CHAR_LOGIN_DUPLICATE_CHARACTER); + SendCharLoginFailed(LoginFailureReason::DuplicateCharacter); return; } @@ -765,7 +760,7 @@ void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData) } if (!p->FindMap() || !p->IsInWorld() || sess->IsKicked()) { - SendCharLogin(CHAR_LOGIN_DUPLICATE_CHARACTER); + SendCharLoginFailed(LoginFailureReason::DuplicateCharacter); return; } @@ -781,11 +776,9 @@ void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData) std::shared_ptr<LoginQueryHolder> holder = std::make_shared<LoginQueryHolder>(GetAccountId(), playerGuid); if (!holder->Initialize()) - { - m_playerLoading = false; return; - } + m_playerLoading = true; AddQueryHolderCallback(CharacterDatabase.DelayQueryHolder(holder)).AfterComplete([this](SQLQueryHolderBase const& holder) { HandlePlayerLoginFromDB(static_cast<LoginQueryHolder const&>(holder)); @@ -2575,6 +2568,13 @@ void WorldSession::SendCharDelete(ResponseCodes result) SendPacket(&data); } +void WorldSession::SendCharLoginFailed(LoginFailureReason reason) +{ + WorldPacket data(SMSG_CHARACTER_LOGIN_FAILED, 1); + data << uint8(reason); + SendPacket(&data); +}; + void WorldSession::SendCharRename(ResponseCodes result, CharacterRenameInfo const* renameInfo) { WorldPacket data(SMSG_CHAR_RENAME, 1 + 8 + renameInfo->Name.size() + 1); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 15c0a73685..c5fa3c8aee 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -601,6 +601,7 @@ public: // opcodes handlers void SendCharCreate(ResponseCodes result); void SendCharDelete(ResponseCodes result); + void SendCharLoginFailed(LoginFailureReason reason); void SendCharRename(ResponseCodes result, CharacterRenameInfo const* renameInfo); void SendCharCustomize(ResponseCodes result, CharacterCustomizeInfo const* customizeInfo); void SendCharFactionChange(ResponseCodes result, CharacterFactionChangeInfo const* factionChangeInfo); diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index fb95d6cea5..aa278a3d63 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -4010,14 +4010,15 @@ enum ServerProcessTypes // Login Failure Reasons enum class LoginFailureReason : uint8 { - Failed = 0, - NoWorld = 1, - DuplicateCharacter = 2, - NoInstances = 3, - Disabled = 4, - NoCharacter = 5, - LockedForTransfer = 6, - LockedByBilling = 7 + Failed = 0, // Login failed + NoWorld = 1, // World server down + DuplicateCharacter = 2, // A character with that name already exists + NoInstances = 3, // No instance servers are available + Disabled = 4, // Login for that race, class or character is currently disabled. + NoCharacter = 5, // Character not found + LockedForTransfer = 6, // You cannot log in until the character update process you recently initiated is complete. + LockedByBilling = 7, // Character locked. Contact billing for more information + UsingRemote = 8, // You cannot log in while using World of Warcraft Remote. }; namespace Acore::Impl |