From 8e7c4fa226c2757f73df8d2b9af4af0b388ddb6f Mon Sep 17 00:00:00 2001 From: Kempec Halk <80704304+Gozzim@users.noreply.github.com> Date: Mon, 13 Jun 2022 13:58:49 +0200 Subject: [PATCH] fix(Core): Deserter overrides from BG and Command (#11961) * fix(Core/Command): Deserter offline add * feat(Core/Command): Deserter online add restriction * fix(Core/Battleground): Deserter overrides longer debuff --- src/server/game/Entities/Player/Player.cpp | 6 +++++- src/server/scripts/Commands/cs_deserter.cpp | 22 ++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 7cd658988..2dadc9023 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1620,7 +1620,11 @@ void Player::ProcessDelayedOperations() SaveToDB(false, false); if (m_DelayedOperations & DELAYED_SPELL_CAST_DESERTER) - CastSpell(this, 26013, true); // Deserter + { + Aura* aura = GetAura(26013); + if (!aura || aura->GetDuration() <= 900000) + CastSpell(this, 26013, true); + } if (m_DelayedOperations & DELAYED_BG_MOUNT_RESTORE) { diff --git a/src/server/scripts/Commands/cs_deserter.cpp b/src/server/scripts/Commands/cs_deserter.cpp index 0cc93a62b..648464186 100644 --- a/src/server/scripts/Commands/cs_deserter.cpp +++ b/src/server/scripts/Commands/cs_deserter.cpp @@ -117,8 +117,14 @@ public: if (target) { - Aura* aura = target->AddAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER, target); + Aura* aura = target->GetAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + if (aura && aura->GetDuration() >= (int32)time * IN_MILLISECONDS) + { + handler->PSendSysMessage("Player %s already has a longer %s Deserter active.", handler->playerLink(player->GetName()), isInstance ? "Instance" : "Battleground"); + return true; + } + aura = target->AddAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER, target); if (!aura) { handler->SendSysMessage(LANG_BAD_VALUE); @@ -130,6 +136,20 @@ public: return true; } + int32 duration = 0; + if (QueryResult result = CharacterDatabase.Query("SELECT remainTime FROM character_aura WHERE guid = {} AND spell = {}", player->GetGUID().GetCounter(), isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER)) + { + Field* fields = result->Fetch(); + duration = fields[0].Get(); + + if (duration < 0 || duration >= (int32)time * IN_MILLISECONDS) + { + handler->PSendSysMessage("Player %s already has a longer %s Deserter active.", handler->playerLink(player->GetName()), isInstance ? "Instance" : "Battleground"); + return true; + } + CharacterDatabase.Query("DELETE FROM character_aura WHERE guid = {} AND spell = {}", player->GetGUID().GetCounter(), isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + } + uint8 index = 0; CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AURA); stmt->SetData(index++, player->GetGUID().GetCounter());