From e075d87c0e68636f88e0239f1d835e82a87bbdf3 Mon Sep 17 00:00:00 2001 From: Eddy Vega <61223313+Si1ker@users.noreply.github.com> Date: Thu, 30 Jun 2022 15:12:26 -0600 Subject: [PATCH 1/8] fix(scripts/Ragnaros): Move root handling from DB to Core (#12245) --- data/sql/updates/pending_db_world/rev_1656606538908234900.sql | 3 +++ .../BlackrockMountain/MoltenCore/boss_ragnaros.cpp | 1 + 2 files changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1656606538908234900.sql diff --git a/data/sql/updates/pending_db_world/rev_1656606538908234900.sql b/data/sql/updates/pending_db_world/rev_1656606538908234900.sql new file mode 100644 index 000000000..c359b958a --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1656606538908234900.sql @@ -0,0 +1,3 @@ +-- +DELETE FROM `creature_template_movement` WHERE `CreatureId`=11502; + diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp index 1dba8396c..889cb3cd1 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp @@ -148,6 +148,7 @@ public: _hasSubmergedOnce = false; _isKnockbackEmoteAllowed = true; me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + me->SetControlled(true, UNIT_STATE_ROOT); _lavaBurstGUIDS.clear(); } From 0ef7f999db7284c2a7776b70c9ecf008d8551f16 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Thu, 30 Jun 2022 21:14:41 +0000 Subject: [PATCH 2/8] chore(DB): import pending files Referenced commit(s): e075d87c0e68636f88e0239f1d835e82a87bbdf3 --- .../rev_1656606538908234900.sql => db_world/2022_06_30_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1656606538908234900.sql => db_world/2022_06_30_00.sql} (61%) diff --git a/data/sql/updates/pending_db_world/rev_1656606538908234900.sql b/data/sql/updates/db_world/2022_06_30_00.sql similarity index 61% rename from data/sql/updates/pending_db_world/rev_1656606538908234900.sql rename to data/sql/updates/db_world/2022_06_30_00.sql index c359b958a..2133ba556 100644 --- a/data/sql/updates/pending_db_world/rev_1656606538908234900.sql +++ b/data/sql/updates/db_world/2022_06_30_00.sql @@ -1,3 +1,4 @@ +-- DB update 2022_06_29_05 -> 2022_06_30_00 -- DELETE FROM `creature_template_movement` WHERE `CreatureId`=11502; From 6bff66a9f6179db50bc2aeb72789adec41cd7718 Mon Sep 17 00:00:00 2001 From: Kempec Halk <80704304+Gozzim@users.noreply.github.com> Date: Fri, 1 Jul 2022 17:30:00 +0200 Subject: [PATCH 3/8] feat(Core/Command): Deserter Command send feedback (#11958) * feat(Core/Command): Deserter feedback Part 1 * docs(Core/Command): Deserter RemoveAll Documentation * feat(Core/Command): Deserter feedback Part 2 * fix(Core/Command): Deserter remove all count * feat(Core/Commands): Deserter merge optimizations --- src/server/scripts/Commands/cs_deserter.cpp | 189 +++++++++++++++----- 1 file changed, 143 insertions(+), 46 deletions(-) diff --git a/src/server/scripts/Commands/cs_deserter.cpp b/src/server/scripts/Commands/cs_deserter.cpp index 6be0b58e3..f20c1c15b 100644 --- a/src/server/scripts/Commands/cs_deserter.cpp +++ b/src/server/scripts/Commands/cs_deserter.cpp @@ -88,9 +88,11 @@ public: * * Example Usage: * @code - * .deserter instance add 1h30m + * .deserter instance add 1h30m (using player target or self) * -or- - * .deserter bg add 1h30m + * .deserter bg add 1h30m (using player target or self) + * -or- + * .deserter bg add Tester 1h30m (using player of name 'Tester') * @endcode */ static bool HandleDeserterAdd(ChatHandler* handler, Optional playerName, Optional time, bool isInstance) @@ -156,16 +158,18 @@ public: return false; } + uint32 deserterSpell = isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER; + if (target) { - Aura* aura = target->GetAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + Aura* aura = target->GetAura(deserterSpell); if (aura && aura->GetDuration() >= duration * IN_MILLISECONDS) { handler->PSendSysMessage("Player %s already has a longer %s Deserter active.", handler->playerLink(*playerName), isInstance ? "Instance" : "Battleground"); return true; } - aura = target->AddAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER, target); + aura = target->AddAura(deserterSpell, target); if (!aura) { handler->SendSysMessage(LANG_BAD_VALUE); @@ -173,44 +177,45 @@ public: return false; } aura->SetDuration(duration * IN_MILLISECONDS); - - return true; } - - int32 remainTime = 0; - if (QueryResult result = CharacterDatabase.Query("SELECT remainTime FROM character_aura WHERE guid = {} AND spell = {}", guid.GetCounter(), isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER)) + else { - Field* fields = result->Fetch(); - remainTime = fields[0].Get(); - - if (remainTime < 0 || remainTime >= duration * IN_MILLISECONDS) + int32 remainTime = 0; + if (QueryResult result = CharacterDatabase.Query("SELECT remainTime FROM character_aura WHERE guid = {} AND spell = {}", guid.GetCounter(), deserterSpell)) { - handler->PSendSysMessage("Player %s already has a longer %s Deserter active.", handler->playerLink(*playerName), isInstance ? "Instance" : "Battleground"); - return true; + Field* fields = result->Fetch(); + remainTime = fields[0].Get(); + + if (remainTime < 0 || remainTime >= duration * IN_MILLISECONDS) + { + handler->PSendSysMessage("Player %s already has a longer %s Deserter active.", handler->playerLink(*playerName), isInstance ? "Instance" : "Battleground"); + return true; + } + CharacterDatabase.Query("DELETE FROM character_aura WHERE guid = {} AND spell = {}", guid.GetCounter(), deserterSpell); } - CharacterDatabase.Query("DELETE FROM character_aura WHERE guid = {} AND spell = {}", guid.GetCounter(), isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + + uint8 index = 0; + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AURA); + stmt->SetData(index++, guid.GetCounter()); + stmt->SetData(index++, guid.GetCounter()); + stmt->SetData(index++, 0); + stmt->SetData(index++, deserterSpell); + stmt->SetData(index++, 1); + stmt->SetData(index++, 1); + stmt->SetData(index++, 1); + stmt->SetData(index++, 0); + stmt->SetData(index++, 0); + stmt->SetData(index++, 0); + stmt->SetData(index++, 0); + stmt->SetData(index++, 0); + stmt->SetData(index++, 0); + stmt->SetData(index++, isInstance ? 1800000 : 900000); + stmt->SetData(index++, duration * IN_MILLISECONDS); + stmt->SetData(index, 0); + CharacterDatabase.Execute(stmt); } - uint8 index = 0; - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AURA); - stmt->SetData(index++, guid.GetCounter()); - stmt->SetData(index++, guid.GetCounter()); - stmt->SetData(index++, 0); - stmt->SetData(index++, isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); - stmt->SetData(index++, 1); - stmt->SetData(index++, 1); - stmt->SetData(index++, 1); - stmt->SetData(index++, 0); - stmt->SetData(index++, 0); - stmt->SetData(index++, 0); - stmt->SetData(index++, 0); - stmt->SetData(index++, 0); - stmt->SetData(index++, 0); - stmt->SetData(index++, isInstance ? 1800000 : 900000); - stmt->SetData(index++, duration * 1000); - stmt->SetData(index, 0); - CharacterDatabase.Execute(stmt); - + handler->PSendSysMessage("%s of %s Deserter has been added to player %s.", secsToTimeString(duration), isInstance ? "Instance" : "Battleground", handler->playerLink(*playerName)); return true; } @@ -221,6 +226,7 @@ public: * selected player. * * @param handler The ChatHandler, passed by the system. + * @param player The target player, either by name, the target or self * @param isInstance provided by the relaying functions, so we don't have * to write that much code :) * @@ -228,9 +234,11 @@ public: * * Example Usage: * @code - * .deserter instance remove + * .deserter instance remove (using player target or self) * -or- - * .deserter bg remove + * .deserter bg remove (using player target or self) + * -or- + * .deserter bg remove Tester (using player of name 'Tester') * @endcode */ static bool HandleDeserterRemove(ChatHandler* handler, Optional player, bool isInstance) @@ -248,21 +256,75 @@ public: } Player* target = player->GetConnectedPlayer(); + uint32 deserterSpell = isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER; + int32 duration = 0; if (target) { - target->RemoveAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + if (Aura* aura = target->GetAura(deserterSpell)) + { + duration = aura->GetDuration(); + target->RemoveAura(deserterSpell); + } + } + else + { + if (QueryResult result = CharacterDatabase.Query("SELECT remainTime FROM character_aura WHERE guid = {} AND spell = {}", player->GetGUID().GetCounter(), deserterSpell)) + { + Field* fields = result->Fetch(); + duration = fields[0].Get(); + CharacterDatabase.Execute("DELETE FROM character_aura WHERE guid = {} AND spell = {}", player->GetGUID().GetCounter(), deserterSpell); + } + } + + if (duration == 0) + { + handler->PSendSysMessage("Player %s does not have %s Deserter.", handler->playerLink(player->GetName()), isInstance ? "Instance" : "Battleground"); + handler->SetSentErrorMessage(true); return true; } - CharacterDatabase.Query("DELETE FROM character_aura WHERE guid = {} AND spell = {}", player->GetGUID().GetCounter(), isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + if (duration < 0) + { + handler->PSendSysMessage("Permanent %s Deserter has been removed from player %s (GUID %u).", isInstance ? "Instance" : "Battleground", handler->playerLink(player->GetName()), player->GetGUID().GetCounter()); + handler->SetSentErrorMessage(true); + return true; + } + handler->PSendSysMessage("%s of %s Deserter has been removed from player %s (GUID %u).", secsToTimeString(duration / IN_MILLISECONDS), isInstance ? "Instance" : "Battleground", handler->playerLink(player->GetName()), player->GetGUID().GetCounter()); return true; } + /** + * @brief Removes the Deserter Debuff from all players + * + * This function removes a Deserter Debuff of the given type (Instance or BG) from + * all players, online or offline. + * + * @param handler The ChatHandler, passed by the system. + * @param isInstance provided by the relaying functions, so we don't have + * to write that much code :) + * @param maxTime Optional: The maximum remaining time of the Debuff on players to be removed. + * Any Player with a Deserter Debuff of this time or less will get their Debuff removed. Use -1 for any. + * Default: 15m for BG, 30m for Instance. + * + * @return true if everything was correct, false if an error occured. + * + * Example Usage: + * @code + * .deserter bg remove all + * -or- + * .deserter bg remove all 30m + * -or- + * .deserter bg remove all -1 + * @endcode + */ static bool HandleDeserterRemoveAll(ChatHandler* handler, bool isInstance, Optional maxTime) { + uint32 deserterSpell = isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER; int32 remainTime = isInstance ? 1800 : 900; + uint64 deserterCount = 0; + bool countOnline = true; if (maxTime) { @@ -273,6 +335,7 @@ public: } } + // Optimization. Do not execute any further functions or Queries if remainTime is 0. if (remainTime == 0) { handler->SendSysMessage(LANG_BAD_VALUE); @@ -280,13 +343,33 @@ public: return false; } - if (remainTime < 0) + QueryResult result; + if (remainTime > 0) { - CharacterDatabase.Execute("DELETE FROM character_aura WHERE spell = {}", isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + result = CharacterDatabase.Query("SELECT COUNT(guid) FROM character_aura WHERE spell = {} AND remainTime <= {}", deserterSpell, remainTime * IN_MILLISECONDS); } else { - CharacterDatabase.Execute("DELETE FROM character_aura WHERE spell = {} AND remainTime <= {}", isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER, remainTime * IN_MILLISECONDS); + result = CharacterDatabase.Query("SELECT COUNT(guid) FROM character_aura WHERE spell = {}", deserterSpell); + } + + if (result) + { + deserterCount = (*result)[0].Get(); + } + + // Optimization. Only execute these if there even is a result. + if (deserterCount > 0) + { + countOnline = false; + if (remainTime > 0) + { + CharacterDatabase.Execute("DELETE FROM character_aura WHERE spell = {} AND remainTime <= {}", deserterSpell, remainTime * IN_MILLISECONDS); + } + else + { + CharacterDatabase.Execute("DELETE FROM character_aura WHERE spell = {}", deserterSpell); + } } std::shared_lock lock(*HashMapHolder::GetLock()); @@ -294,14 +377,28 @@ public: for (HashMapHolder::MapType::const_iterator itr = onlinePlayerList.begin(); itr != onlinePlayerList.end(); ++itr) { Player* player = itr->second; - Aura* aura = player->GetAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + Aura* aura = player->GetAura(deserterSpell); if (aura && (remainTime < 0 || aura->GetDuration() <= remainTime * IN_MILLISECONDS)) { - player->RemoveAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + if (countOnline) + deserterCount++; + player->RemoveAura(deserterSpell); } } - handler->PSendSysMessage("%s Deserter has been removed from all players", isInstance ? "Instance" : "Battleground"); + std::string remainTimeStr = secsToTimeString(remainTime); + if (remainTime < 0) + { + remainTimeStr = "infinity"; + } + + if (deserterCount == 0) + { + handler->PSendSysMessage("No player on this realm has %s Deserter with a duration of %s or less.", isInstance ? "Instance" : "Battleground", remainTimeStr); + return true; + } + + handler->PSendSysMessage("%s Deserter has been removed from %u player(s) with a duration of %s or less.", isInstance ? "Instance" : "Battleground", deserterCount, remainTimeStr); return true; } From 5e509344ac12ecffdf8581c000a374ddf45e5e5a Mon Sep 17 00:00:00 2001 From: r0m1ntik <40755539+r0m1ntik@users.noreply.github.com> Date: Fri, 1 Jul 2022 17:32:30 +0200 Subject: [PATCH 4/8] Fix command .skirmish (#12149) fix-issue-11966 Co-authored-by: Badanin Roman --- src/server/scripts/Commands/cs_misc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 33ed6b6d1..d281236e9 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -143,9 +143,9 @@ public: return commandTable; } - static bool HandleSkirmishCommand(ChatHandler* handler, std::string_view args) + static bool HandleSkirmishCommand(ChatHandler* handler, std::vector args) { - auto tokens = Acore::Tokenize(args, ' ', true); + auto tokens = args; if (args.empty() || !tokens.size()) { From ae0ab2007780166e0e96e787ff4bbbd053f641c0 Mon Sep 17 00:00:00 2001 From: Nefertumm Date: Fri, 1 Jul 2022 12:35:15 -0300 Subject: [PATCH 5/8] fix(DB/ZulGurub): Remove taunt immunity from Mar'li (#12234) * fix(DB/ZulGurub): Remove taunt immunity from Mar'li and Gri'lek * Update rev_1656482750700107200.sql --- data/sql/updates/pending_db_world/rev_1656482750700107200.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1656482750700107200.sql diff --git a/data/sql/updates/pending_db_world/rev_1656482750700107200.sql b/data/sql/updates/pending_db_world/rev_1656482750700107200.sql new file mode 100644 index 000000000..20fb2f140 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1656482750700107200.sql @@ -0,0 +1,3 @@ +-- +-- Mar'li - Gri'lek +UPDATE `creature_template` SET `flags_extra`=`flags_extra`&~256 WHERE `entry` = 14510; From 39d751d2f35b626370095e292f0fb72ded389777 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Fri, 1 Jul 2022 15:37:26 +0000 Subject: [PATCH 6/8] chore(DB): import pending files Referenced commit(s): ae0ab2007780166e0e96e787ff4bbbd053f641c0 --- .../rev_1656482750700107200.sql => db_world/2022_07_01_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1656482750700107200.sql => db_world/2022_07_01_00.sql} (71%) diff --git a/data/sql/updates/pending_db_world/rev_1656482750700107200.sql b/data/sql/updates/db_world/2022_07_01_00.sql similarity index 71% rename from data/sql/updates/pending_db_world/rev_1656482750700107200.sql rename to data/sql/updates/db_world/2022_07_01_00.sql index 20fb2f140..bd4778791 100644 --- a/data/sql/updates/pending_db_world/rev_1656482750700107200.sql +++ b/data/sql/updates/db_world/2022_07_01_00.sql @@ -1,3 +1,4 @@ +-- DB update 2022_06_30_00 -> 2022_07_01_00 -- -- Mar'li - Gri'lek UPDATE `creature_template` SET `flags_extra`=`flags_extra`&~256 WHERE `entry` = 14510; From 5ce632754d6cc9cb2535b08746403108251c2c54 Mon Sep 17 00:00:00 2001 From: ZhengPeiRu21 <98835050+ZhengPeiRu21@users.noreply.github.com> Date: Fri, 1 Jul 2022 09:38:30 -0600 Subject: [PATCH 7/8] fix(DB/Scripts): Greater Windstone Bosses (#12247) --- data/sql/updates/pending_db_world/rev_1656632586022126700.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1656632586022126700.sql diff --git a/data/sql/updates/pending_db_world/rev_1656632586022126700.sql b/data/sql/updates/pending_db_world/rev_1656632586022126700.sql new file mode 100644 index 000000000..a46023fc4 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1656632586022126700.sql @@ -0,0 +1,2 @@ +-- +UPDATE `smart_scripts` SET `event_param1` = 5000, `event_param2` = 5000 WHERE `entryorguid` IN (15203, 15204, 15205, 15305) AND `event_type` = 1; From b866c470d63644ad09f5b7d469f52dd9eb78303a Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Fri, 1 Jul 2022 15:40:53 +0000 Subject: [PATCH 8/8] chore(DB): import pending files Referenced commit(s): 5ce632754d6cc9cb2535b08746403108251c2c54 --- .../rev_1656632586022126700.sql => db_world/2022_07_01_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1656632586022126700.sql => db_world/2022_07_01_01.sql} (77%) diff --git a/data/sql/updates/pending_db_world/rev_1656632586022126700.sql b/data/sql/updates/db_world/2022_07_01_01.sql similarity index 77% rename from data/sql/updates/pending_db_world/rev_1656632586022126700.sql rename to data/sql/updates/db_world/2022_07_01_01.sql index a46023fc4..a0933a730 100644 --- a/data/sql/updates/pending_db_world/rev_1656632586022126700.sql +++ b/data/sql/updates/db_world/2022_07_01_01.sql @@ -1,2 +1,3 @@ +-- DB update 2022_07_01_00 -> 2022_07_01_01 -- UPDATE `smart_scripts` SET `event_param1` = 5000, `event_param2` = 5000 WHERE `entryorguid` IN (15203, 15204, 15205, 15305) AND `event_type` = 1;