diff options
Diffstat (limited to 'src')
-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/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp | 13 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp | 15 | ||||
-rw-r--r-- | src/server/shared/SharedDefines.h | 17 |
5 files changed, 52 insertions, 50 deletions
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/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp index 8a9463b514..18a30b7dbc 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp @@ -27,6 +27,7 @@ enum Spells SPELL_MOJO_WAVE = 55626, SPELL_FREEZE_ANIM = 52656, SPELL_MIGHTY_BLOW = 54719, + SPELL_MORTAL_STRIKE = 54715, SPELL_ELEMENTAL_SPAWN_EFFECT = 54888, SPELL_EMERGE = 54850, @@ -54,9 +55,10 @@ enum Misc EMOTE_ALTAR = 1, EVENT_COLOSSUS_MIGHTY_BLOW = 1, - EVENT_COLOSSUS_HEALTH_1 = 2, - EVENT_COLOSSUS_HEALTH_2 = 3, - EVENT_COLOSSUS_START_FIGHT = 4, + EVENT_COLOSSUS_MORTAL_STRIKE = 2, + EVENT_COLOSSUS_HEALTH_1 = 3, + EVENT_COLOSSUS_HEALTH_2 = 4, + EVENT_COLOSSUS_START_FIGHT = 5, EVENT_ELEMENTAL_HEALTH = 10, EVENT_ELEMENTAL_SURGE = 11, @@ -146,6 +148,7 @@ public: { BossAI::JustEngagedWith(who); events.ScheduleEvent(EVENT_COLOSSUS_MIGHTY_BLOW, 10s); + events.ScheduleEvent(EVENT_COLOSSUS_MORTAL_STRIKE, 7s); events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_1, 1s); events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_2, 1s); } @@ -212,6 +215,10 @@ public: me->CastSpell(me->GetVictim(), SPELL_MIGHTY_BLOW, false); events.ScheduleEvent(EVENT_COLOSSUS_MIGHTY_BLOW, 10s); break; + case EVENT_COLOSSUS_MORTAL_STRIKE: + DoCastVictim(SPELL_MORTAL_STRIKE); + events.ScheduleEvent(EVENT_COLOSSUS_MORTAL_STRIKE, 7s); + break; case EVENT_COLOSSUS_HEALTH_1: if (me->HealthBelowPct(51)) { diff --git a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp index 68a22e9640..5bf51b7c91 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp @@ -51,14 +51,7 @@ enum Misc MAX_CONSTRICTOR = 3, MAX_SUMMONS = 5, - EVENT_POISON_NOVA = 1, - EVENT_POWERFULL_BITE = 2, - EVENT_VENOM_BOLT = 3, - EVENT_CHECK_HEALTH1 = 4, - EVENT_CHECK_HEALTH2 = 5, - EVENT_SUMMON1 = 6, - EVENT_SUMMON2 = 7, - EVENT_KILL_TALK = 8 + EVENT_KILL_TALK = 1 }; const Position SpawnLoc[] = @@ -121,17 +114,17 @@ public: Talk(SAY_AGGRO); BossAI::JustEngagedWith(who); - ScheduleTimedEvent(10s, [&]{ + ScheduleTimedEvent(16s, 53s, [&]{ Talk(EMOTE_NOVA); DoCastAOE(SPELL_POISON_NOVA); - }, 15s); + }, 16s, 53s); ScheduleTimedEvent(3s, [&] { DoCastVictim(SPELL_POWERFULL_BITE); }, 10s); ScheduleTimedEvent(15s, [&] { - DoCastVictim(SPELL_VENOM_BOLT); + DoCastRandomTarget(SPELL_VENOM_BOLT, 0, 45.0f, false); }, 10s); } 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 |