From 3ef2b09a40ad892be7e2ad0a27655fd0a0b70715 Mon Sep 17 00:00:00 2001 From: Kempec Halk <80704304+Gozzim@users.noreply.github.com> Date: Wed, 22 Jun 2022 22:19:45 +0200 Subject: [PATCH] feat(Core/Command): Deserter rm all time parameter (#11963) * feat(Core/Command): Deserter rm all time variable * feat(Core/Command): deserter remove all TimeString * chore(Core/Commands): Deserter remove all slight improvements --- .../rev_1654369041234881900.sql | 6 +++ src/server/scripts/Commands/cs_deserter.cpp | 39 +++++++++++++++---- 2 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1654369041234881900.sql diff --git a/data/sql/updates/pending_db_world/rev_1654369041234881900.sql b/data/sql/updates/pending_db_world/rev_1654369041234881900.sql new file mode 100644 index 000000000..ed7ae567f --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1654369041234881900.sql @@ -0,0 +1,6 @@ +-- +DELETE FROM `command` WHERE `name` IN ("deserter instance remove all", "deserter bg remove all"); + +INSERT INTO `command` (`name`, `security`, `help`) VALUES +("deserter instance remove all", 3, "Syntax: .deserter instance remove all <$maxDuration>\r\n Removes the instance deserter debuff from all online and offline players.\nOptional $maxDuration sets the maximum duration to be removed. Use a timestring like \"1h45m\". \"-1\" for any duration. Default: 30m"), +("deserter bg remove all", 3, "Syntax: .deserter bg remove all <$maxDuration>\r\n Removes the bg deserter debuff from all online and offline players.\nOptional $maxDuration sets the maximum duration to be removed. Use a timestring like \"1h45m\". \"-1\" for any duration. Default: 15m"); \ No newline at end of file diff --git a/src/server/scripts/Commands/cs_deserter.cpp b/src/server/scripts/Commands/cs_deserter.cpp index 17761aaf6..6be0b58e3 100644 --- a/src/server/scripts/Commands/cs_deserter.cpp +++ b/src/server/scripts/Commands/cs_deserter.cpp @@ -260,9 +260,34 @@ public: return true; } - static bool HandleDeserterRemoveAll(ChatHandler* handler, bool isInstance) + static bool HandleDeserterRemoveAll(ChatHandler* handler, bool isInstance, Optional maxTime) { - CharacterDatabase.Query("DELETE FROM character_aura WHERE spell = {} AND remainTime <= 1800000", isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + int32 remainTime = isInstance ? 1800 : 900; + + if (maxTime) + { + remainTime = TimeStringToSecs(*maxTime); + if (remainTime == 0) + { + remainTime = Acore::StringTo(*maxTime).value_or(0); + } + } + + if (remainTime == 0) + { + handler->SendSysMessage(LANG_BAD_VALUE); + handler->SetSentErrorMessage(true); + return false; + } + + if (remainTime < 0) + { + CharacterDatabase.Execute("DELETE FROM character_aura WHERE spell = {}", isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + } + else + { + CharacterDatabase.Execute("DELETE FROM character_aura WHERE spell = {} AND remainTime <= {}", isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER, remainTime * IN_MILLISECONDS); + } std::shared_lock lock(*HashMapHolder::GetLock()); HashMapHolder::MapType const& onlinePlayerList = ObjectAccessor::GetPlayers(); @@ -270,7 +295,7 @@ public: { Player* player = itr->second; Aura* aura = player->GetAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); - if (aura && aura->GetDuration() <= 1800000) + if (aura && (remainTime < 0 || aura->GetDuration() <= remainTime * IN_MILLISECONDS)) { player->RemoveAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); } @@ -304,14 +329,14 @@ public: return HandleDeserterRemove(handler, player, false); } - static bool HandleDeserterInstanceRemoveAll(ChatHandler* handler) + static bool HandleDeserterInstanceRemoveAll(ChatHandler* handler, Optional maxTime) { - return HandleDeserterRemoveAll(handler, true); + return HandleDeserterRemoveAll(handler, true, maxTime); } - static bool HandleDeserterBGRemoveAll(ChatHandler* handler) + static bool HandleDeserterBGRemoveAll(ChatHandler* handler, Optional maxTime) { - return HandleDeserterRemoveAll(handler, false); + return HandleDeserterRemoveAll(handler, false, maxTime); } };