From d52010f2fc3ed75aa3c1adaa61c515ab4588d5a4 Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Wed, 10 Apr 2024 18:51:21 +0200 Subject: [PATCH 01/45] fix(Scripts/TheEye): make Al'ar not get stuck during dive bomb when no enemies in melee range (#18693) * initial * Update boss_alar.cpp --- src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp index 198abc879..bd41ede87 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp @@ -163,7 +163,7 @@ struct boss_alar : public BossAI if (me->isMoving()) return true; - return me->IsWithinMeleeRange(victim); + return _hasPretendedToDie || me->IsWithinMeleeRange(victim); } void EnterEvadeMode(EvadeReason why) override From 723596c6734ae56f51f1f3ba0e9ce95929f7f15c Mon Sep 17 00:00:00 2001 From: Balleny <12682004+balleny@users.noreply.github.com> Date: Wed, 10 Apr 2024 19:37:01 +0200 Subject: [PATCH 02/45] fix(Scripts/TheEye): Kaelthas: Roar timer (#18677) Roar timer --- src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index a9ba7d96e..04cb7a1d4 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -807,7 +807,7 @@ struct npc_lord_sanguinar : public ScriptedAI { Talk(SAY_SANGUINAR_AGGRO); } - ScheduleTimedEvent(6s, 20s, [&]{ + ScheduleTimedEvent(0s, 2s, [&]{ DoCastSelf(SPELL_BELLOWING_ROAR); }, 30s, 40s); } From fd029f81aa4a84a5b39542524c72e7c00b54a7a9 Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Wed, 10 Apr 2024 21:21:53 +0200 Subject: [PATCH 03/45] fix(Scripts/Karazhan): Fix crash in chess event. (#18695) Fix crash in chess event --- .../Karazhan/boss_chess_event.cpp | 109 +++++++++--------- 1 file changed, 53 insertions(+), 56 deletions(-) diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_chess_event.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_chess_event.cpp index b7a481ace..564c6a75d 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_chess_event.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_chess_event.cpp @@ -395,88 +395,85 @@ struct npc_echo_of_medivh : public ScriptedAI for (uint8 col = 0; col < MAX_COL; ++col) { BoardCell const& cell = _boards[row][col]; - if (cell.pieceGUID == piece->GetGUID()) + if (cell.pieceGUID != piece->GetGUID()) + continue; + + std::vector orientations; + switch (orientation) { - std::vector orientations; - switch (orientation) + case ORI_SE: + orientations = { ORI_NE, ORI_E, ORI_S, ORI_SW }; + break; + case ORI_S: + orientations = { ORI_E, ORI_SE, ORI_SW, ORI_W }; + break; + case ORI_SW: + orientations = { ORI_SE, ORI_S, ORI_W, ORI_NW }; + break; + case ORI_W: + orientations = { ORI_NE, ORI_SW, ORI_NW, ORI_N }; + break; + case ORI_NW: + orientations = { ORI_SW, ORI_W, ORI_N, ORI_NE }; + break; + case ORI_N: + orientations = { ORI_W, ORI_NW, ORI_NE, ORI_E }; + break; + case ORI_NE: + orientations = { ORI_NW, ORI_N, ORI_E, ORI_SE }; + break; + case ORI_E: + orientations = { ORI_N, ORI_NE, ORI_SE, ORI_S }; + break; + default: + break; + } + + for (KarazhanChessOrientationType orient : orientations) + { + uint8 newRow = row; + uint8 newCol = col; + switch (orient) { case ORI_SE: - orientations = { ORI_NE, ORI_E, ORI_S, ORI_SW }; + newRow -= 1; break; case ORI_S: - orientations = { ORI_E, ORI_SE, ORI_SW, ORI_W }; + newRow -= 1; + newCol -= 1; break; case ORI_SW: - orientations = { ORI_SE, ORI_S, ORI_W, ORI_NW }; + newCol -= 1; break; case ORI_W: - orientations = { ORI_NE, ORI_SW, ORI_NW, ORI_N }; + newRow += 1; + newCol -= 1; break; case ORI_NW: - orientations = { ORI_SW, ORI_W, ORI_N, ORI_NE }; + newRow += 1; break; case ORI_N: - orientations = { ORI_W, ORI_NW, ORI_NE, ORI_E }; + newRow += 1; + newCol += 1; break; case ORI_NE: - orientations = { ORI_NW, ORI_N, ORI_E, ORI_SE }; + newCol += 1; break; case ORI_E: - orientations = { ORI_N, ORI_NE, ORI_SE, ORI_S }; + newRow -= 1; + newCol += 1; break; default: break; } - for (KarazhanChessOrientationType orient : orientations) - { - uint8 newRow = row; - uint8 newCol = col; - switch (orient) - { - case ORI_SE: - newRow -= 1; - break; - case ORI_S: - newRow -= 1; - newCol -= 1; - break; - case ORI_SW: - newCol -= 1; - break; - case ORI_W: - newRow += 1; - newCol -= 1; - break; - case ORI_NW: - newRow += 1; - break; - case ORI_N: - newRow += 1; - newCol += 1; - break; - case ORI_NE: - newCol += 1; - break; - case ORI_E: - newRow -= 1; - newCol += 1; - break; - default: - break; - } - + if (newRow < MAX_ROW && newCol < MAX_COL && newRow >= 0 && newCol >= 0) if (Creature* targetPiece = ObjectAccessor::GetCreature(*me, _boards[newRow][newCol].pieceGUID)) - { if (!IsFriendly(piece, targetPiece)) - { return targetPiece; - } - } - } - - return nullptr; } + + return nullptr; } } From f792b0d708a073ebfe863ef961d877376a11c705 Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Thu, 11 Apr 2024 22:08:30 +0200 Subject: [PATCH 04/45] feat(Core/Scripts): Optimize PlayerScripts by calling only overridden/implemented functions. (#18672) * feat(Core/Scripts): Optimize PlayerScripts by calling only overridden/implemented functions. * Fix codestyle. * Fix typo * PLAYERHOOK_END is not a hook * Address code review feedback. Co-authored-by: Winfidonarleyan * Codestyle fixes * Fix typo Co-authored-by: PkllonG --------- Co-authored-by: Winfidonarleyan --- src/server/game/DungeonFinding/LFGScripts.cpp | 12 +- .../Scripting/ScriptDefines/PlayerScript.cpp | 1228 +++-------------- .../Scripting/ScriptDefines/PlayerScript.h | 178 ++- src/server/game/Scripting/ScriptMgr.h | 36 +- src/server/game/Scripting/ScriptMgrMacros.h | 10 + src/server/game/Scripting/ScriptObject.h | 5 +- src/server/scripts/Events/midsummer.cpp | 2 +- src/server/scripts/World/action_ip_logger.cpp | 19 +- src/server/scripts/World/chat_log.cpp | 12 +- src/server/scripts/World/player_scripts.cpp | 2 +- src/server/scripts/World/server_mail.cpp | 2 +- 11 files changed, 452 insertions(+), 1054 deletions(-) diff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp index cabd4543f..8a34a1478 100644 --- a/src/server/game/DungeonFinding/LFGScripts.cpp +++ b/src/server/game/DungeonFinding/LFGScripts.cpp @@ -29,7 +29,17 @@ namespace lfg { - LFGPlayerScript::LFGPlayerScript() : PlayerScript("LFGPlayerScript") { } + LFGPlayerScript::LFGPlayerScript() : + PlayerScript("LFGPlayerScript", + { + PLAYERHOOK_ON_LEVEL_CHANGED, + PLAYERHOOK_ON_LOGOUT, + PLAYERHOOK_ON_LOGIN, + PLAYERHOOK_ON_BIND_TO_INSTANCE, + PLAYERHOOK_ON_MAP_CHANGED + }) + { + } void LFGPlayerScript::OnLevelChanged(Player* player, uint8 /*oldLevel*/) { diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp index 6f8a05ef5..53e79fd39 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp @@ -21,1736 +21,886 @@ void ScriptMgr::OnBeforePlayerDurabilityRepair(Player* player, ObjectGuid npcGUID, ObjectGuid itemGUID, float& discountMod, uint8 guildBank) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeDurabilityRepair(player, npcGUID, itemGUID, discountMod, guildBank); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_DURABILITY_REPAIR, script->OnBeforeDurabilityRepair(player, npcGUID, itemGUID, discountMod, guildBank)); } void ScriptMgr::OnGossipSelect(Player* player, uint32 menu_id, uint32 sender, uint32 action) { - ExecuteScript([&](PlayerScript* script) - { - script->OnGossipSelect(player, menu_id, sender, action); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GOSSIP_SELECT, script->OnGossipSelect(player, menu_id, sender, action)); } void ScriptMgr::OnGossipSelectCode(Player* player, uint32 menu_id, uint32 sender, uint32 action, const char* code) { - ExecuteScript([&](PlayerScript* script) - { - script->OnGossipSelectCode(player, menu_id, sender, action, code); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GOSSIP_SELECT_CODE, script->OnGossipSelectCode(player, menu_id, sender, action, code)); } void ScriptMgr::OnPlayerCompleteQuest(Player* player, Quest const* quest) { - ExecuteScript([&](PlayerScript* script) - { - script->OnPlayerCompleteQuest(player, quest); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_COMPLETE_QUEST, script->OnPlayerCompleteQuest(player, quest)); } void ScriptMgr::OnSendInitialPacketsBeforeAddToMap(Player* player, WorldPacket& data) { - ExecuteScript([&](PlayerScript* script) - { + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_SEND_INITIAL_PACKETS_BEFORE_ADD_TO_MAP, { script->OnSendInitialPacketsBeforeAddToMap(player, data); }); } void ScriptMgr::OnBattlegroundDesertion(Player* player, BattlegroundDesertionType const desertionType) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBattlegroundDesertion(player, desertionType); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BATTLEGROUND_DESERTION, script->OnBattlegroundDesertion(player, desertionType)); } void ScriptMgr::OnPlayerJustDied(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnPlayerJustDied(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_JUST_DIED, script->OnPlayerJustDied(player)); } void ScriptMgr::OnPlayerReleasedGhost(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnPlayerReleasedGhost(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_RELEASED_GHOST, script->OnPlayerReleasedGhost(player)); } bool ScriptMgr::OnCanPlayerFlyInZone(Player* player, uint32 mapId, uint32 zoneId, SpellInfo const* bySpell) { - auto ret = IsValidBoolScript([player, mapId, zoneId, bySpell](PlayerScript* script) - { - return !script->OnCanPlayerFlyInZone(player, mapId, zoneId, bySpell); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_CAN_PLAYER_FLY_IN_ZONE, !script->OnCanPlayerFlyInZone(player, mapId, zoneId, bySpell)); } void ScriptMgr::OnPVPKill(Player* killer, Player* killed) { - ExecuteScript([&](PlayerScript* script) - { - script->OnPVPKill(killer, killed); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PVP_KILL, script->OnPVPKill(killer, killed)); } void ScriptMgr::OnPlayerPVPFlagChange(Player* player, bool state) { - ExecuteScript([&](PlayerScript* script) - { - script->OnPlayerPVPFlagChange(player, state); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_PVP_FLAG_CHANGE,script->OnPlayerPVPFlagChange(player, state)); } void ScriptMgr::OnCreatureKill(Player* killer, Creature* killed) { - ExecuteScript([&](PlayerScript* script) - { - script->OnCreatureKill(killer, killed); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CREATURE_KILL,script->OnCreatureKill(killer, killed)); } void ScriptMgr::OnCreatureKilledByPet(Player* petOwner, Creature* killed) { - ExecuteScript([&](PlayerScript* script) - { - script->OnCreatureKilledByPet(petOwner, killed); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CREATURE_KILLED_BY_PET,script->OnCreatureKilledByPet(petOwner, killed)); } void ScriptMgr::OnPlayerKilledByCreature(Creature* killer, Player* killed) { - ExecuteScript([&](PlayerScript* script) - { - script->OnPlayerKilledByCreature(killer, killed); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_KILLED_BY_CREATURE, script->OnPlayerKilledByCreature(killer, killed)); } void ScriptMgr::OnPlayerLevelChanged(Player* player, uint8 oldLevel) { - ExecuteScript([&](PlayerScript* script) - { - script->OnLevelChanged(player, oldLevel); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_LEVEL_CHANGED, script->OnLevelChanged(player, oldLevel)); } void ScriptMgr::OnPlayerFreeTalentPointsChanged(Player* player, uint32 points) { - ExecuteScript([&](PlayerScript* script) - { - script->OnFreeTalentPointsChanged(player, points); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_FREE_TALENT_POINTS_CHANGED, script->OnFreeTalentPointsChanged(player, points)); } void ScriptMgr::OnPlayerTalentsReset(Player* player, bool noCost) { - ExecuteScript([&](PlayerScript* script) - { - script->OnTalentsReset(player, noCost); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_TALENTS_RESET, script->OnTalentsReset(player, noCost)); } void ScriptMgr::OnAfterSpecSlotChanged(Player* player, uint8 newSlot) { - ExecuteScript([=](PlayerScript* script) - { - script->OnAfterSpecSlotChanged(player, newSlot); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_AFTER_SPEC_SLOT_CHANGED, script->OnAfterSpecSlotChanged(player, newSlot)); } void ScriptMgr::OnPlayerMoneyChanged(Player* player, int32& amount) { - ExecuteScript([&](PlayerScript* script) - { - script->OnMoneyChanged(player, amount); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_MONEY_CHANGED, script->OnMoneyChanged(player, amount)); } void ScriptMgr::OnBeforeLootMoney(Player* player, Loot* loot) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeLootMoney(player, loot); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_LOOT_MONEY, script->OnBeforeLootMoney(player, loot)); } void ScriptMgr::OnGivePlayerXP(Player* player, uint32& amount, Unit* victim, uint8 xpSource) { - ExecuteScript([&](PlayerScript* script) - { - script->OnGiveXP(player, amount, victim, xpSource); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GIVE_EXP, script->OnGiveXP(player, amount, victim, xpSource)); } bool ScriptMgr::OnPlayerReputationChange(Player* player, uint32 factionID, int32& standing, bool incremental) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->OnReputationChange(player, factionID, standing, incremental); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_REPUTATION_CHANGE, !script->OnReputationChange(player, factionID, standing, incremental)); } void ScriptMgr::OnPlayerReputationRankChange(Player* player, uint32 factionID, ReputationRank newRank, ReputationRank oldRank, bool increased) { - ExecuteScript([&](PlayerScript* script) - { - script->OnReputationRankChange(player, factionID, newRank, oldRank, increased); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_REPUTATION_RANK_CHANGE, script->OnReputationRankChange(player, factionID, newRank, oldRank, increased)); } void ScriptMgr::OnPlayerLearnSpell(Player* player, uint32 spellID) { - ExecuteScript([&](PlayerScript* script) - { - script->OnLearnSpell(player, spellID); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_LEARN_TALENTS, script->OnLearnSpell(player, spellID)); } void ScriptMgr::OnPlayerForgotSpell(Player* player, uint32 spellID) { - ExecuteScript([&](PlayerScript* script) - { - script->OnForgotSpell(player, spellID); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_FORGOT_SPELL, script->OnForgotSpell(player, spellID)); } void ScriptMgr::OnPlayerDuelRequest(Player* target, Player* challenger) { - ExecuteScript([&](PlayerScript* script) - { - script->OnDuelRequest(target, challenger); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_DUEL_REQUEST, script->OnDuelRequest(target, challenger)); } void ScriptMgr::OnPlayerDuelStart(Player* player1, Player* player2) { - ExecuteScript([&](PlayerScript* script) - { - script->OnDuelStart(player1, player2); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_DUEL_START, script->OnDuelStart(player1, player2)); } void ScriptMgr::OnPlayerDuelEnd(Player* winner, Player* loser, DuelCompleteType type) { - ExecuteScript([&](PlayerScript* script) - { - script->OnDuelEnd(winner, loser, type); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_DUEL_END, script->OnDuelEnd(winner, loser, type)); } void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg) { - ExecuteScript([&](PlayerScript* script) - { - script->OnChat(player, type, lang, msg); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CHAT, script->OnChat(player, type, lang, msg)); } void ScriptMgr::OnBeforeSendChatMessage(Player* player, uint32& type, uint32& lang, std::string& msg) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeSendChatMessage(player, type, lang, msg); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_SEND_CHAT_MESSAGE, script->OnBeforeSendChatMessage(player, type, lang, msg)); } void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Player* receiver) { - ExecuteScript([&](PlayerScript* script) - { - script->OnChat(player, type, lang, msg, receiver); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CHAT_WITH_RECEIVER, script->OnChat(player, type, lang, msg, receiver)); } void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Group* group) { - ExecuteScript([&](PlayerScript* script) - { - script->OnChat(player, type, lang, msg, group); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CHAT_WITH_GROUP, script->OnChat(player, type, lang, msg, group)); } void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Guild* guild) { - ExecuteScript([&](PlayerScript* script) - { - script->OnChat(player, type, lang, msg, guild); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CHAT_WITH_GUILD, script->OnChat(player, type, lang, msg, guild)); } void ScriptMgr::OnPlayerChat(Player* player, uint32 type, uint32 lang, std::string& msg, Channel* channel) { - ExecuteScript([&](PlayerScript* script) - { - script->OnChat(player, type, lang, msg, channel); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CHAT_WITH_CHANNEL, script->OnChat(player, type, lang, msg, channel)); } void ScriptMgr::OnPlayerEmote(Player* player, uint32 emote) { - ExecuteScript([&](PlayerScript* script) - { - script->OnEmote(player, emote); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_EMOTE, script->OnEmote(player, emote)); } void ScriptMgr::OnPlayerTextEmote(Player* player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid) { - ExecuteScript([&](PlayerScript* script) - { - script->OnTextEmote(player, textEmote, emoteNum, guid); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_TEXT_EMOTE, + ( + script->OnTextEmote(player, textEmote, emoteNum, guid) + ) + ); } void ScriptMgr::OnPlayerSpellCast(Player* player, Spell* spell, bool skipCheck) { - ExecuteScript([&](PlayerScript* script) - { - script->OnSpellCast(player, spell, skipCheck); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_SPELL_CAST, script->OnSpellCast(player, spell, skipCheck)); } void ScriptMgr::OnBeforePlayerUpdate(Player* player, uint32 p_time) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeUpdate(player, p_time); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_UPDATE, script->OnBeforeUpdate(player, p_time)); } void ScriptMgr::OnPlayerUpdate(Player* player, uint32 p_time) { - ExecuteScript([&](PlayerScript* script) - { - script->OnUpdate(player, p_time); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_UPDATE, script->OnUpdate(player, p_time)); } void ScriptMgr::OnPlayerLogin(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnLogin(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_LOGIN, script->OnLogin(player)); } void ScriptMgr::OnPlayerLoadFromDB(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnLoadFromDB(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_LOAD_FROM_DB, script->OnLoadFromDB(player)); } void ScriptMgr::OnBeforePlayerLogout(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeLogout(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_LOGOUT, script->OnBeforeLogout(player)); } void ScriptMgr::OnPlayerLogout(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnLogout(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_LOGOUT, script->OnLogout(player)); } void ScriptMgr::OnPlayerCreate(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnCreate(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CREATE, script->OnCreate(player)); } void ScriptMgr::OnPlayerSave(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnSave(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_SAVE, script->OnSave(player)); } void ScriptMgr::OnPlayerDelete(ObjectGuid guid, uint32 accountId) { - ExecuteScript([&](PlayerScript* script) - { - script->OnDelete(guid, accountId); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_DELETE, script->OnDelete(guid, accountId)); } void ScriptMgr::OnPlayerFailedDelete(ObjectGuid guid, uint32 accountId) { - ExecuteScript([&](PlayerScript* script) - { - script->OnFailedDelete(guid, accountId); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_FAILED_DELETE, script->OnFailedDelete(guid, accountId)); } void ScriptMgr::OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBindToInstance(player, difficulty, mapid, permanent); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BIND_TO_INSTANCE, script->OnBindToInstance(player, difficulty, mapid, permanent)); } void ScriptMgr::OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea) { - ExecuteScript([&](PlayerScript* script) - { - script->OnUpdateZone(player, newZone, newArea); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_UPDATE_ZONE, script->OnUpdateZone(player, newZone, newArea)); } void ScriptMgr::OnPlayerUpdateArea(Player* player, uint32 oldArea, uint32 newArea) { - ExecuteScript([&](PlayerScript* script) - { - script->OnUpdateArea(player, oldArea, newArea); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_UPDATE_AREA, script->OnUpdateArea(player, oldArea, newArea)); } bool ScriptMgr::OnBeforePlayerTeleport(Player* player, uint32 mapid, float x, float y, float z, float orientation, uint32 options, Unit* target) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->OnBeforeTeleport(player, mapid, x, y, z, orientation, options, target); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_TELEPORT, !script->OnBeforeTeleport(player, mapid, x, y, z, orientation, options, target)); } void ScriptMgr::OnPlayerUpdateFaction(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnUpdateFaction(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_UPDATE_FACTION, script->OnUpdateFaction(player)); } void ScriptMgr::OnPlayerAddToBattleground(Player* player, Battleground* bg) { - ExecuteScript([&](PlayerScript* script) - { - script->OnAddToBattleground(player, bg); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_ADD_TO_BATTLEGROUND, script->OnAddToBattleground(player, bg)); } void ScriptMgr::OnPlayerQueueRandomDungeon(Player* player, uint32 & rDungeonId) { - ExecuteScript([&](PlayerScript* script) - { - script->OnQueueRandomDungeon(player, rDungeonId); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_QUEUE_RANDOM_DUNGEON, script->OnQueueRandomDungeon(player, rDungeonId)); } void ScriptMgr::OnPlayerRemoveFromBattleground(Player* player, Battleground* bg) { - ExecuteScript([&](PlayerScript* script) - { - script->OnRemoveFromBattleground(player, bg); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_REMOVE_FROM_BATTLEGROUND, script->OnRemoveFromBattleground(player, bg)); } bool ScriptMgr::OnBeforeAchievementComplete(Player* player, AchievementEntry const* achievement) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->OnBeforeAchiComplete(player, achievement); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_ACHI_COMPLETE, !script->OnBeforeAchiComplete(player, achievement)); } void ScriptMgr::OnAchievementComplete(Player* player, AchievementEntry const* achievement) { - ExecuteScript([&](PlayerScript* script) - { - script->OnAchiComplete(player, achievement); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_ACHI_COMPLETE, script->OnAchiComplete(player, achievement)); } bool ScriptMgr::OnBeforeCriteriaProgress(Player* player, AchievementCriteriaEntry const* criteria) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->OnBeforeCriteriaProgress(player, criteria); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_CRITERIA_PROGRESS, !script->OnBeforeCriteriaProgress(player, criteria)); } void ScriptMgr::OnCriteriaProgress(Player* player, AchievementCriteriaEntry const* criteria) { - ExecuteScript([&](PlayerScript* script) - { - script->OnCriteriaProgress(player, criteria); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CRITERIA_PROGRESS, script->OnCriteriaProgress(player, criteria)); } void ScriptMgr::OnAchievementSave(CharacterDatabaseTransaction trans, Player* player, uint16 achiId, CompletedAchievementData achiData) { - ExecuteScript([&](PlayerScript* script) - { - script->OnAchiSave(trans, player, achiId, achiData); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_ACHI_SAVE, script->OnAchiSave(trans, player, achiId, achiData)); } void ScriptMgr::OnCriteriaSave(CharacterDatabaseTransaction trans, Player* player, uint16 critId, CriteriaProgress criteriaData) { - ExecuteScript([&](PlayerScript* script) - { - script->OnCriteriaSave(trans, player, critId, criteriaData); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CRITERIA_SAVE, script->OnCriteriaSave(trans, player, critId, criteriaData)); } void ScriptMgr::OnPlayerBeingCharmed(Player* player, Unit* charmer, uint32 oldFactionId, uint32 newFactionId) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeingCharmed(player, charmer, oldFactionId, newFactionId); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEING_CHARMED, script->OnBeingCharmed(player, charmer, oldFactionId, newFactionId)); } void ScriptMgr::OnAfterPlayerSetVisibleItemSlot(Player* player, uint8 slot, Item* item) { - ExecuteScript([&](PlayerScript* script) - { - script->OnAfterSetVisibleItemSlot(player, slot, item); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_AFTER_SET_VISIBLE_ITEM_SLOT, script->OnAfterSetVisibleItemSlot(player, slot, item)); } void ScriptMgr::OnAfterPlayerMoveItemFromInventory(Player* player, Item* it, uint8 bag, uint8 slot, bool update) { - ExecuteScript([&](PlayerScript* script) - { - script->OnAfterMoveItemFromInventory(player, it, bag, slot, update); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_AFTER_MOVE_ITEM_FROM_INVENTORY, script->OnAfterMoveItemFromInventory(player, it, bag, slot, update)); } void ScriptMgr::OnEquip(Player* player, Item* it, uint8 bag, uint8 slot, bool update) { - ExecuteScript([&](PlayerScript* script) - { - script->OnEquip(player, it, bag, slot, update); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_EQUIP, script->OnEquip(player, it, bag, slot, update)); } void ScriptMgr::OnPlayerJoinBG(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnPlayerJoinBG(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_JOIN_BG, script->OnPlayerJoinBG(player)); } void ScriptMgr::OnPlayerJoinArena(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnPlayerJoinArena(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_JOIN_ARENA, script->OnPlayerJoinArena(player)); } void ScriptMgr::GetCustomGetArenaTeamId(Player const* player, uint8 slot, uint32& teamID) const { - ExecuteScript([&](PlayerScript* script) - { - script->GetCustomGetArenaTeamId(player, slot, teamID); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_GET_CUSTOM_GET_ARENA_TEAM_ID, script->GetCustomGetArenaTeamId(player, slot, teamID)); } void ScriptMgr::GetCustomArenaPersonalRating(Player const* player, uint8 slot, uint32& rating) const { - ExecuteScript([&](PlayerScript* script) - { - script->GetCustomArenaPersonalRating(player, slot, rating); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_GET_CUSTOM_ARENA_PERSONAL_RATING, script->GetCustomArenaPersonalRating(player, slot, rating)); } void ScriptMgr::OnGetMaxPersonalArenaRatingRequirement(Player const* player, uint32 minSlot, uint32& maxArenaRating) const { - ExecuteScript([&](PlayerScript* script) - { - script->OnGetMaxPersonalArenaRatingRequirement(player, minSlot, maxArenaRating); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GET_MAX_PERSONAL_ARENA_RATING_REQUIREMENT, script->OnGetMaxPersonalArenaRatingRequirement(player, minSlot, maxArenaRating)); } void ScriptMgr::OnLootItem(Player* player, Item* item, uint32 count, ObjectGuid lootguid) { - ExecuteScript([&](PlayerScript* script) - { - script->OnLootItem(player, item, count, lootguid); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_LOOT_ITEM, script->OnLootItem(player, item, count, lootguid)); } void ScriptMgr::OnBeforeFillQuestLootItem(Player* player, LootItem& item) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeFillQuestLootItem(player, item); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_FILL_QUEST_LOOT_ITEM, script->OnBeforeFillQuestLootItem(player, item)); } void ScriptMgr::OnStoreNewItem(Player* player, Item* item, uint32 count) { - ExecuteScript([&](PlayerScript* script) - { - script->OnStoreNewItem(player, item, count); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_STORE_NEW_ITEM, script->OnStoreNewItem(player, item, count)); } void ScriptMgr::OnCreateItem(Player* player, Item* item, uint32 count) { - ExecuteScript([&](PlayerScript* script) - { - script->OnCreateItem(player, item, count); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CREATE_ITEM, script->OnCreateItem(player, item, count)); } void ScriptMgr::OnQuestRewardItem(Player* player, Item* item, uint32 count) { - ExecuteScript([&](PlayerScript* script) - { - script->OnQuestRewardItem(player, item, count); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_QUEST_REWARD_ITEM, script->OnQuestRewardItem(player, item, count)); } bool ScriptMgr::CanPlaceAuctionBid(Player* player, AuctionEntry* auction) { - auto ret = IsValidBoolScript([&](PlayerScript *script) - { - return !script->CanPlaceAuctionBid(player, auction); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_PLACE_AUCTION_BID, !script->CanPlaceAuctionBid(player, auction)); } void ScriptMgr::OnGroupRollRewardItem(Player* player, Item* item, uint32 count, RollVote voteType, Roll* roll) { - ExecuteScript([&](PlayerScript* script) - { - script->OnGroupRollRewardItem(player, item, count, voteType, roll); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GROUP_ROLL_REWARD_ITEM, script->OnGroupRollRewardItem(player, item, count, voteType, roll)); } bool ScriptMgr::OnBeforeOpenItem(Player* player, Item* item) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->OnBeforeOpenItem(player, item); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_OPEN_ITEM, !script->OnBeforeOpenItem(player, item)); } void ScriptMgr::OnFirstLogin(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnFirstLogin(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_FIRST_LOGIN, script->OnFirstLogin(player)); } void ScriptMgr::OnSetMaxLevel(Player* player, uint32& maxPlayerLevel) { - ExecuteScript([&](PlayerScript* script) - { - script->OnSetMaxLevel(player, maxPlayerLevel); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_SET_MAX_LEVEL, script->OnSetMaxLevel(player, maxPlayerLevel)); } bool ScriptMgr::CanJoinInBattlegroundQueue(Player* player, ObjectGuid BattlemasterGuid, BattlegroundTypeId BGTypeID, uint8 joinAsGroup, GroupJoinBattlegroundResult& err) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanJoinInBattlegroundQueue(player, BattlemasterGuid, BGTypeID, joinAsGroup, err); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_JOIN_IN_BATTLEGROUND_QUEUE, !script->CanJoinInBattlegroundQueue(player, BattlemasterGuid, BGTypeID, joinAsGroup, err)); } bool ScriptMgr::ShouldBeRewardedWithMoneyInsteadOfExp(Player* player) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return script->ShouldBeRewardedWithMoneyInsteadOfExp(player); - }); - - if (ret && *ret) - { - return true; - } - - return false; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_SHOULD_BE_REWARDED_WITH_MONEY_INSTEAD_OF_EXP, script->ShouldBeRewardedWithMoneyInsteadOfExp(player)); } void ScriptMgr::OnBeforeTempSummonInitStats(Player* player, TempSummon* tempSummon, uint32& duration) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeTempSummonInitStats(player, tempSummon, duration); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_TEMP_SUMMON_INIT_STATS, script->OnBeforeTempSummonInitStats(player, tempSummon, duration)); } void ScriptMgr::OnBeforeGuardianInitStatsForLevel(Player* player, Guardian* guardian, CreatureTemplate const* cinfo, PetType& petType) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeGuardianInitStatsForLevel(player, guardian, cinfo, petType); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_GUARDIAN_INIT_STATS_FOR_LEVEL, script->OnBeforeGuardianInitStatsForLevel(player, guardian, cinfo, petType)); } void ScriptMgr::OnAfterGuardianInitStatsForLevel(Player* player, Guardian* guardian) { - ExecuteScript([&](PlayerScript* script) - { - script->OnAfterGuardianInitStatsForLevel(player, guardian); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_AFTER_GUARDIAN_INIT_STATS_FOR_LEVEL, script->OnAfterGuardianInitStatsForLevel(player, guardian)); } void ScriptMgr::OnBeforeLoadPetFromDB(Player* player, uint32& petentry, uint32& petnumber, bool& current, bool& forceLoadFromDB) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeLoadPetFromDB(player, petentry, petnumber, current, forceLoadFromDB); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_LOAD_PET_FROM_DB, script->OnBeforeLoadPetFromDB(player, petentry, petnumber, current, forceLoadFromDB)); } void ScriptMgr::OnBeforeBuyItemFromVendor(Player* player, ObjectGuid vendorguid, uint32 vendorslot, uint32& item, uint8 count, uint8 bag, uint8 slot) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeBuyItemFromVendor(player, vendorguid, vendorslot, item, count, bag, slot); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_BUY_ITEM_FROM_VENDOR, script->OnBeforeBuyItemFromVendor(player, vendorguid, vendorslot, item, count, bag, slot)); } void ScriptMgr::OnAfterStoreOrEquipNewItem(Player* player, uint32 vendorslot, Item* item, uint8 count, uint8 bag, uint8 slot, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore) { - ExecuteScript([&](PlayerScript* script) - { - script->OnAfterStoreOrEquipNewItem(player, vendorslot, item, count, bag, slot, pProto, pVendor, crItem, bStore); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_AFTER_STORE_OR_EQUIP_NEW_ITEM, script->OnAfterStoreOrEquipNewItem(player, vendorslot, item, count, bag, slot, pProto, pVendor, crItem, bStore)); } void ScriptMgr::OnAfterUpdateMaxPower(Player* player, Powers& power, float& value) { - ExecuteScript([&](PlayerScript* script) - { - script->OnAfterUpdateMaxPower(player, power, value); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_AFTER_UPDATE_MAX_POWER, script->OnAfterUpdateMaxPower(player, power, value)); } void ScriptMgr::OnAfterUpdateMaxHealth(Player* player, float& value) { - ExecuteScript([&](PlayerScript* script) - { - script->OnAfterUpdateMaxHealth(player, value); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_AFTER_UPDATE_MAX_HEALTH, script->OnAfterUpdateMaxHealth(player, value)); } void ScriptMgr::OnBeforeUpdateAttackPowerAndDamage(Player* player, float& level, float& val2, bool ranged) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeUpdateAttackPowerAndDamage(player, level, val2, ranged); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_UPDATE_ATTACK_POWER_AND_DAMAGE, script->OnBeforeUpdateAttackPowerAndDamage(player, level, val2, ranged)); } void ScriptMgr::OnAfterUpdateAttackPowerAndDamage(Player* player, float& level, float& base_attPower, float& attPowerMod, float& attPowerMultiplier, bool ranged) { - ExecuteScript([&](PlayerScript* script) - { - script->OnAfterUpdateAttackPowerAndDamage(player, level, base_attPower, attPowerMod, attPowerMultiplier, ranged); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_AFTER_UPDATE_ATTACK_POWER_AND_DAMAGE, script->OnAfterUpdateAttackPowerAndDamage(player, level, base_attPower, attPowerMod, attPowerMultiplier, ranged)); } void ScriptMgr::OnBeforeInitTalentForLevel(Player* player, uint8& level, uint32& talentPointsForLevel) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeInitTalentForLevel(player, level, talentPointsForLevel); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_INIT_TALENT_FOR_LEVEL, script->OnBeforeInitTalentForLevel(player, level, talentPointsForLevel)); } + bool ScriptMgr::OnBeforePlayerQuestComplete(Player* player, uint32 quest_id) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->OnBeforeQuestComplete(player, quest_id); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_QUEST_COMPLETE, !script->OnBeforeQuestComplete(player, quest_id)); } + void ScriptMgr::OnQuestComputeXP(Player* player, Quest const* quest, uint32& xpValue) { - ExecuteScript([&](PlayerScript* script) - { - script->OnQuestComputeXP(player, quest, xpValue); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_QUEST_COMPUTE_EXP, script->OnQuestComputeXP(player, quest, xpValue)); } void ScriptMgr::OnBeforeStoreOrEquipNewItem(Player* player, uint32 vendorslot, uint32& item, uint8 count, uint8 bag, uint8 slot, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeStoreOrEquipNewItem(player, vendorslot, item, count, bag, slot, pProto, pVendor, crItem, bStore); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_STORE_OR_EQUIP_NEW_ITEM, script->OnBeforeStoreOrEquipNewItem(player, vendorslot, item, count, bag, slot, pProto, pVendor, crItem, bStore)); } bool ScriptMgr::CanJoinInArenaQueue(Player* player, ObjectGuid BattlemasterGuid, uint8 arenaslot, BattlegroundTypeId BGTypeID, uint8 joinAsGroup, uint8 IsRated, GroupJoinBattlegroundResult& err) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanJoinInArenaQueue(player, BattlemasterGuid, arenaslot, BGTypeID, joinAsGroup, IsRated, err); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_JOIN_IN_ARENA_QUEUE, !script->CanJoinInArenaQueue(player, BattlemasterGuid, arenaslot, BGTypeID, joinAsGroup, IsRated, err)); } bool ScriptMgr::CanBattleFieldPort(Player* player, uint8 arenaType, BattlegroundTypeId BGTypeID, uint8 action) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanBattleFieldPort(player, arenaType, BGTypeID, action); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_BATTLEFIELD_PORT, !script->CanBattleFieldPort(player, arenaType, BGTypeID, action)); } bool ScriptMgr::CanGroupInvite(Player* player, std::string& membername) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanGroupInvite(player, membername); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_GROUP_INVITE, !script->CanGroupInvite(player, membername)); } bool ScriptMgr::CanGroupAccept(Player* player, Group* group) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanGroupAccept(player, group); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_GROUP_ACCEPT, !script->CanGroupAccept(player, group)); } bool ScriptMgr::CanSellItem(Player* player, Item* item, Creature* creature) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanSellItem(player, item, creature); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_SELL_ITEM, !script->CanSellItem(player, item, creature)); } bool ScriptMgr::CanSendMail(Player* player, ObjectGuid receiverGuid, ObjectGuid mailbox, std::string& subject, std::string& body, uint32 money, uint32 COD, Item* item) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanSendMail(player, receiverGuid, mailbox, subject, body, money, COD, item); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_SEND_MAIL, !script->CanSendMail(player, receiverGuid, mailbox, subject, body, money, COD, item)); } bool ScriptMgr::CanSendErrorAlreadyLooted(Player* player) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanSendErrorAlreadyLooted(player); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_SEND_ERROR_ALREADY_LOOTED, !script->CanSendErrorAlreadyLooted(player)); } void ScriptMgr::OnAfterCreatureLoot(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnAfterCreatureLoot(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_AFTER_CREATURE_LOOT, script->OnAfterCreatureLoot(player)); } void ScriptMgr::OnAfterCreatureLootMoney(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnAfterCreatureLootMoney(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_AFTER_CREATURE_LOOT_MONEY, script->OnAfterCreatureLootMoney(player)); } void ScriptMgr::PetitionBuy(Player* player, Creature* creature, uint32& charterid, uint32& cost, uint32& type) { - ExecuteScript([&](PlayerScript* script) - { - script->PetitionBuy(player, creature, charterid, cost, type); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_PETITION_BUY, script->PetitionBuy(player, creature, charterid, cost, type)); } void ScriptMgr::PetitionShowList(Player* player, Creature* creature, uint32& CharterEntry, uint32& CharterDispayID, uint32& CharterCost) { - ExecuteScript([&](PlayerScript* script) - { - script->PetitionShowList(player, creature, CharterEntry, CharterDispayID, CharterCost); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_PETITION_SHOW_LIST, script->PetitionShowList(player, creature, CharterEntry, CharterDispayID, CharterCost)); } void ScriptMgr::OnRewardKillRewarder(Player* player, KillRewarder* rewarder, bool isDungeon, float& rate) { - ExecuteScript([&](PlayerScript* script) - { - script->OnRewardKillRewarder(player, rewarder, isDungeon, rate); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_REWARD_KILL_REWARDER, script->OnRewardKillRewarder(player, rewarder, isDungeon, rate)); } bool ScriptMgr::CanGiveMailRewardAtGiveLevel(Player* player, uint8 level) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanGiveMailRewardAtGiveLevel(player, level); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_GIVE_MAIL_REWARD_AT_GIVE_LEVEL, !script->CanGiveMailRewardAtGiveLevel(player, level)); } void ScriptMgr::OnDeleteFromDB(CharacterDatabaseTransaction trans, uint32 guid) { - ExecuteScript([&](PlayerScript* script) - { - script->OnDeleteFromDB(trans, guid); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_DELETE_FROM_DB, script->OnDeleteFromDB(trans, guid)); } bool ScriptMgr::CanRepopAtGraveyard(Player* player) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanRepopAtGraveyard(player); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_REPOP_AT_GRAVEYARD, !script->CanRepopAtGraveyard(player)); } Optional ScriptMgr::OnPlayerIsClass(Player const* player, Classes unitClass, ClassContext context) { - if (ScriptRegistry::ScriptPointerList.empty()) + if (ScriptRegistry::EnabledHooks[PLAYERHOOK_ON_PLAYER_IS_CLASS].empty()) return {}; - for (auto const& [scriptID, script] : ScriptRegistry::ScriptPointerList) + + for (auto const& script : ScriptRegistry::EnabledHooks[PLAYERHOOK_ON_PLAYER_IS_CLASS]) { Optional scriptResult = script->OnPlayerIsClass(player, unitClass, context); if (scriptResult) return scriptResult; } + return {}; } void ScriptMgr::OnGetMaxSkillValue(Player* player, uint32 skill, int32& result, bool IsPure) { - ExecuteScript([&](PlayerScript* script) - { - script->OnGetMaxSkillValue(player, skill, result, IsPure); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GET_MAX_SKILL_VALUE, script->OnGetMaxSkillValue(player, skill, result, IsPure)); } bool ScriptMgr::OnPlayerHasActivePowerType(Player const* player, Powers power) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return script->OnPlayerHasActivePowerType(player, power); - }); - - if (ret && *ret) - { - return true; - } - - return false; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_HAS_ACTIVE_POWER_TYPE, !script->OnPlayerHasActivePowerType(player, power)); } void ScriptMgr::OnUpdateGatheringSkill(Player *player, uint32 skillId, uint32 currentLevel, uint32 gray, uint32 green, uint32 yellow, uint32 &gain) { - ExecuteScript([&](PlayerScript* script) - { - script->OnUpdateGatheringSkill(player, skillId, currentLevel, gray, green, yellow, gain); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_UPDATE_GATHERING_SKILL, script->OnUpdateGatheringSkill(player, skillId, currentLevel, gray, green, yellow, gain)); } void ScriptMgr::OnUpdateCraftingSkill(Player *player, SkillLineAbilityEntry const* skill, uint32 currentLevel, uint32& gain) { - ExecuteScript([&](PlayerScript* script) - { - script->OnUpdateCraftingSkill(player, skill, currentLevel, gain); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_UPDATE_CRAFTING_SKILL, script->OnUpdateCraftingSkill(player, skill, currentLevel, gain)); } bool ScriptMgr::OnUpdateFishingSkill(Player* player, int32 skill, int32 zone_skill, int32 chance, int32 roll) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->OnUpdateFishingSkill(player, skill, zone_skill, chance, roll); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_UPDATE_FISHING_SKILL, !script->OnUpdateFishingSkill(player, skill, zone_skill, chance, roll)); } bool ScriptMgr::CanAreaExploreAndOutdoor(Player* player) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanAreaExploreAndOutdoor(player); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_AREA_EXPLORE_AND_OUTDOOR, !script->CanAreaExploreAndOutdoor(player)); } void ScriptMgr::OnVictimRewardBefore(Player* player, Player* victim, uint32& killer_title, uint32& victim_title) { - ExecuteScript([&](PlayerScript* script) - { - script->OnVictimRewardBefore(player, victim, killer_title, victim_title); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_VICTIM_REWARD_BEFORE, script->OnVictimRewardBefore(player, victim, killer_title, victim_title)); } void ScriptMgr::OnVictimRewardAfter(Player* player, Player* victim, uint32& killer_title, uint32& victim_rank, float& honor_f) { - ExecuteScript([&](PlayerScript* script) - { - script->OnVictimRewardAfter(player, victim, killer_title, victim_rank, honor_f); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_VICTIM_REWARD_AFTER, script->OnVictimRewardAfter(player, victim, killer_title, victim_rank, honor_f)); } void ScriptMgr::OnCustomScalingStatValueBefore(Player* player, ItemTemplate const* proto, uint8 slot, bool apply, uint32& CustomScalingStatValue) { - ExecuteScript([&](PlayerScript* script) - { - script->OnCustomScalingStatValueBefore(player, proto, slot, apply, CustomScalingStatValue); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CUSTOM_SCALING_STAT_VALUE_BEFORE, script->OnCustomScalingStatValueBefore(player, proto, slot, apply, CustomScalingStatValue)); } void ScriptMgr::OnCustomScalingStatValue(Player* player, ItemTemplate const* proto, uint32& statType, int32& val, uint8 itemProtoStatNumber, uint32 ScalingStatValue, ScalingStatValuesEntry const* ssv) { - ExecuteScript([&](PlayerScript* script) - { - script->OnCustomScalingStatValue(player, proto, statType, val, itemProtoStatNumber, ScalingStatValue, ssv); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CUSTOM_SCALING_STAT_VALUE, script->OnCustomScalingStatValue(player, proto, statType, val, itemProtoStatNumber, ScalingStatValue, ssv)); } bool ScriptMgr::CanArmorDamageModifier(Player* player) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanArmorDamageModifier(player); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_ARMOR_DAMAGE_MODIFIER, !script->CanArmorDamageModifier(player)); } void ScriptMgr::OnGetFeralApBonus(Player* player, int32& feral_bonus, int32 dpsMod, ItemTemplate const* proto, ScalingStatValuesEntry const* ssv) { - ExecuteScript([&](PlayerScript* script) - { - script->OnGetFeralApBonus(player, feral_bonus, dpsMod, proto, ssv); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GET_FERAL_AP_BONUS, script->OnGetFeralApBonus(player, feral_bonus, dpsMod, proto, ssv)); } bool ScriptMgr::CanApplyWeaponDependentAuraDamageMod(Player* player, Item* item, WeaponAttackType attackType, AuraEffect const* aura, bool apply) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanApplyWeaponDependentAuraDamageMod(player, item, attackType, aura, apply); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_APPLY_WEAPON_DEPENDENT_AURA_DAMAGE_MOD, !script->CanApplyWeaponDependentAuraDamageMod(player, item, attackType, aura, apply)); } bool ScriptMgr::CanApplyEquipSpell(Player* player, SpellInfo const* spellInfo, Item* item, bool apply, bool form_change) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanApplyEquipSpell(player, spellInfo, item, apply, form_change); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_APPLY_EQUIP_SPELL, !script->CanApplyEquipSpell(player, spellInfo, item, apply, form_change)); } bool ScriptMgr::CanApplyEquipSpellsItemSet(Player* player, ItemSetEffect* eff) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanApplyEquipSpellsItemSet(player, eff); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_APPLY_EQUIP_SPELLS_ITEM_SET, !script->CanApplyEquipSpellsItemSet(player, eff)); } bool ScriptMgr::CanCastItemCombatSpell(Player* player, Unit* target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item* item, ItemTemplate const* proto) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanCastItemCombatSpell(player, target, attType, procVictim, procEx, item, proto); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_CAST_ITEM_COMBAT_SPELL, !script->CanCastItemCombatSpell(player, target, attType, procVictim, procEx, item, proto)); } bool ScriptMgr::CanCastItemUseSpell(Player* player, Item* item, SpellCastTargets const& targets, uint8 cast_count, uint32 glyphIndex) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanCastItemUseSpell(player, item, targets, cast_count, glyphIndex); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_CAST_ITEM_USE_SPELL, !script->CanCastItemUseSpell(player, item, targets, cast_count, glyphIndex)); } void ScriptMgr::OnApplyAmmoBonuses(Player* player, ItemTemplate const* proto, float& currentAmmoDPS) { - ExecuteScript([&](PlayerScript* script) - { - script->OnApplyAmmoBonuses(player, proto, currentAmmoDPS); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_APPLY_AMMO_BONUSES, script->OnApplyAmmoBonuses(player, proto, currentAmmoDPS)); } bool ScriptMgr::CanEquipItem(Player* player, uint8 slot, uint16& dest, Item* pItem, bool swap, bool not_loading) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanEquipItem(player, slot, dest, pItem, swap, not_loading); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_EQUIP_ITEM, !script->CanEquipItem(player, slot, dest, pItem, swap, not_loading)); } bool ScriptMgr::CanUnequipItem(Player* player, uint16 pos, bool swap) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanUnequipItem(player, pos, swap); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_UNEQUIP_ITEM, !script->CanUnequipItem(player, pos, swap)); } bool ScriptMgr::CanUseItem(Player* player, ItemTemplate const* proto, InventoryResult& result) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanUseItem(player, proto, result); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_USE_ITEM, !script->CanUseItem(player, proto, result)); } bool ScriptMgr::CanSaveEquipNewItem(Player* player, Item* item, uint16 pos, bool update) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanSaveEquipNewItem(player, item, pos, update); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_SAVE_EQUIP_NEW_ITEM, !script->CanSaveEquipNewItem(player, item, pos, update)); } bool ScriptMgr::CanApplyEnchantment(Player* player, Item* item, EnchantmentSlot slot, bool apply, bool apply_dur, bool ignore_condition) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanApplyEnchantment(player, item, slot, apply, apply_dur, ignore_condition); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_APPLY_ENCHANTMENT, !script->CanApplyEnchantment(player, item, slot, apply, apply_dur, ignore_condition)); } void ScriptMgr::OnGetQuestRate(Player* player, float& result) { - ExecuteScript([&](PlayerScript* script) - { - script->OnGetQuestRate(player, result); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GET_QUEST_RATE, script->OnGetQuestRate(player, result)); } bool ScriptMgr::PassedQuestKilledMonsterCredit(Player* player, Quest const* qinfo, uint32 entry, uint32 real_entry, ObjectGuid guid) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->PassedQuestKilledMonsterCredit(player, qinfo, entry, real_entry, guid); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_PASSED_QUEST_KILLED_MONSTER_CREDIT, !script->PassedQuestKilledMonsterCredit(player, qinfo, entry, real_entry, guid)); } bool ScriptMgr::CheckItemInSlotAtLoadInventory(Player* player, Item* item, uint8 slot, uint8& err, uint16& dest) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CheckItemInSlotAtLoadInventory(player, item, slot, err, dest); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CHECK_ITEM_IN_SLOT_AT_LOAD_INVENTORY, !script->CheckItemInSlotAtLoadInventory(player, item, slot, err, dest)); } bool ScriptMgr::NotAvoidSatisfy(Player* player, DungeonProgressionRequirements const* ar, uint32 target_map, bool report) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->NotAvoidSatisfy(player, ar, target_map, report); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_NOT_AVOID_SATISFY, !script->NotAvoidSatisfy(player, ar, target_map, report)); } bool ScriptMgr::NotVisibleGloballyFor(Player* player, Player const* u) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->NotVisibleGloballyFor(player, u); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_NOT_VISIBLE_GLOBALLY_FOR, !script->NotVisibleGloballyFor(player, u)); } void ScriptMgr::OnGetArenaPersonalRating(Player* player, uint8 slot, uint32& result) { - ExecuteScript([&](PlayerScript* script) - { - script->OnGetArenaPersonalRating(player, slot, result); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GET_ARENA_PERSONAL_RATING, script->OnGetArenaPersonalRating(player, slot, result)); } void ScriptMgr::OnGetArenaTeamId(Player* player, uint8 slot, uint32& result) { - ExecuteScript([&](PlayerScript* script) - { - script->OnGetArenaTeamId(player, slot, result); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GET_ARENA_TEAM_ID, script->OnGetArenaTeamId(player, slot, result)); } -//Signifies that IsFfaPvp has been called. void ScriptMgr::OnIsFFAPvP(Player* player, bool& result) { - ExecuteScript([&](PlayerScript* script) - { - script->OnIsFFAPvP(player, result); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_IS_FFA_PVP, script->OnIsFFAPvP(player, result)); } -//Fires whenever the UNIT_BYTE2_FLAG_FFA_PVP bit is Changed + void ScriptMgr::OnFfaPvpStateUpdate(Player* player, bool result) { - ExecuteScript([&](PlayerScript* script) - { - script->OnFfaPvpStateUpdate(player, result); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_FFA_PVP_STATE_UPDATE, script->OnFfaPvpStateUpdate(player, result)); } void ScriptMgr::OnIsPvP(Player* player, bool& result) { - ExecuteScript([&](PlayerScript* script) - { + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_IS_PVP, { script->OnIsPvP(player, result); }); } void ScriptMgr::OnGetMaxSkillValueForLevel(Player* player, uint16& result) { - ExecuteScript([&](PlayerScript* script) - { + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GET_MAX_SKILL_VALUE_FOR_LEVEL, { script->OnGetMaxSkillValueForLevel(player, result); }); } bool ScriptMgr::NotSetArenaTeamInfoField(Player* player, uint8 slot, ArenaTeamInfoType type, uint32 value) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->NotSetArenaTeamInfoField(player, slot, type, value); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_NOT_SET_ARENA_TEAM_INFO_FIELD, !script->NotSetArenaTeamInfoField(player, slot, type, value)); } bool ScriptMgr::CanJoinLfg(Player* player, uint8 roles, lfg::LfgDungeonSet& dungeons, const std::string& comment) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanJoinLfg(player, roles, dungeons, comment); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_JOIN_LFG, !script->CanJoinLfg(player, roles, dungeons, comment)); } bool ScriptMgr::CanEnterMap(Player* player, MapEntry const* entry, InstanceTemplate const* instance, MapDifficulty const* mapDiff, bool loginCheck) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanEnterMap(player, entry, instance, mapDiff, loginCheck); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_ENTER_MAP, !script->CanEnterMap(player, entry, instance, mapDiff, loginCheck)); } bool ScriptMgr::CanInitTrade(Player* player, Player* target) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanInitTrade(player, target); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_INIT_TRADE, !script->CanInitTrade(player, target)); } bool ScriptMgr::CanSetTradeItem(Player* player, Item* tradedItem, uint8 tradeSlot) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanSetTradeItem(player, tradedItem, tradeSlot); - }); - - if (ret && *ret) - return false; - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_SET_TRADE_ITEM, !script->CanSetTradeItem(player, tradedItem, tradeSlot)); } void ScriptMgr::OnSetServerSideVisibility(Player* player, ServerSideVisibilityType& type, AccountTypes& sec) { - ExecuteScript([&](PlayerScript* script) - { - script->OnSetServerSideVisibility(player, type, sec); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_SET_SERVER_SIDE_VISIBILITY, script->OnSetServerSideVisibility(player, type, sec)); } void ScriptMgr::OnSetServerSideVisibilityDetect(Player* player, ServerSideVisibilityType& type, AccountTypes& sec) { - ExecuteScript([&](PlayerScript* script) - { - script->OnSetServerSideVisibilityDetect(player, type, sec); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_SET_SERVER_SIDE_VISIBILITY_DETECT, script->OnSetServerSideVisibilityDetect(player, type, sec)); } -//void ScriptMgr::OnGiveHonorPoints(Player* player, float& honor, Unit* victim) -//{ -// ExecuteScript([&](PlayerScript* script) -// { -// script->OnGiveHonorPoints(player, honor, victim); -// }); -//} -// -//void ScriptMgr::OnAfterResurrect(Player* player, float restore_percent, bool applySickness) -//{ -// ExecuteScript([&](PlayerScript* script) -// { -// script->OnAfterResurrect(player, restore_percent, applySickness); -// }); -//} - void ScriptMgr::OnPlayerResurrect(Player* player, float restore_percent, bool applySickness) { - ExecuteScript([&](PlayerScript* script) - { - script->OnPlayerResurrect(player, restore_percent, applySickness); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_RESURRECT, script->OnPlayerResurrect(player, restore_percent, applySickness)); } void ScriptMgr::OnBeforeChooseGraveyard(Player* player, TeamId teamId, bool nearCorpse, uint32& graveyardOverride) { - ExecuteScript([&](PlayerScript* script) - { - script->OnBeforeChooseGraveyard(player, teamId, nearCorpse, graveyardOverride); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_CHOOSE_GRAVEYARD, script->OnBeforeChooseGraveyard(player, teamId, nearCorpse, graveyardOverride)); } bool ScriptMgr::CanPlayerUseChat(Player* player, uint32 type, uint32 language, std::string& msg) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanPlayerUseChat(player, type, language, msg); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_PLAYER_USE_CHAT, !script->CanPlayerUseChat(player, type, language, msg)); } bool ScriptMgr::CanPlayerUseChat(Player* player, uint32 type, uint32 language, std::string& msg, Player* receiver) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanPlayerUseChat(player, type, language, msg, receiver); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_PLAYER_USE_PRIVATE_CHAT, !script->CanPlayerUseChat(player, type, language, msg, receiver)); } bool ScriptMgr::CanPlayerUseChat(Player* player, uint32 type, uint32 language, std::string& msg, Group* group) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanPlayerUseChat(player, type, language, msg, group); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_PLAYER_USE_GROUP_CHAT, !script->CanPlayerUseChat(player, type, language, msg, group)); } bool ScriptMgr::CanPlayerUseChat(Player* player, uint32 type, uint32 language, std::string& msg, Guild* guild) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanPlayerUseChat(player, type, language, msg, guild); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_PLAYER_USE_GUILD_CHAT, !script->CanPlayerUseChat(player, type, language, msg, guild)); } bool ScriptMgr::CanPlayerUseChat(Player* player, uint32 type, uint32 language, std::string& msg, Channel* channel) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->CanPlayerUseChat(player, type, language, msg, channel); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_PLAYER_USE_CHANNEL_CHAT, !script->CanPlayerUseChat(player, type, language, msg, channel)); } void ScriptMgr::OnPlayerLearnTalents(Player* player, uint32 talentId, uint32 talentRank, uint32 spellid) { - ExecuteScript([&](PlayerScript* script) - { - script->OnPlayerLearnTalents(player, talentId, talentRank, spellid); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_LEARN_TALENTS, script->OnPlayerLearnTalents(player, talentId, talentRank, spellid)); } void ScriptMgr::OnPlayerEnterCombat(Player* player, Unit* enemy) { - ExecuteScript([&](PlayerScript* script) - { - script->OnPlayerEnterCombat(player, enemy); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_ENTER_COMBAT, script->OnPlayerEnterCombat(player, enemy)); } void ScriptMgr::OnPlayerLeaveCombat(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->OnPlayerLeaveCombat(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_LEAVE_COMBAT, script->OnPlayerLeaveCombat(player)); } void ScriptMgr::OnQuestAbandon(Player* player, uint32 questId) { - ExecuteScript([&](PlayerScript* script) - { - script->OnQuestAbandon(player, questId); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_QUEST_ABANDON, script->OnQuestAbandon(player, questId)); } // Player anti cheat void ScriptMgr::AnticheatSetCanFlybyServer(Player* player, bool apply) { - ExecuteScript([&](PlayerScript* script) - { - script->AnticheatSetCanFlybyServer(player, apply); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ANTICHEAT_SET_CAN_FLY_BY_SERVER, script->AnticheatSetCanFlybyServer(player, apply)); } void ScriptMgr::AnticheatSetUnderACKmount(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->AnticheatSetUnderACKmount(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ANTICHEAT_SET_UNDER_ACK_MOUNT, script->AnticheatSetUnderACKmount(player)); } void ScriptMgr::AnticheatSetRootACKUpd(Player* player) { - ExecuteScript([&](PlayerScript* script) - { - script->AnticheatSetRootACKUpd(player); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ANTICHEAT_SET_ROOT_ACK_UPD, script->AnticheatSetRootACKUpd(player)); } void ScriptMgr::AnticheatSetJumpingbyOpcode(Player* player, bool jump) { - ExecuteScript([&](PlayerScript* script) - { - script->AnticheatSetJumpingbyOpcode(player, jump); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ANTICHEAT_SET_JUMPING_BY_OPCODE, script->AnticheatSetJumpingbyOpcode(player, jump)); } void ScriptMgr::AnticheatUpdateMovementInfo(Player* player, MovementInfo const& movementInfo) { - ExecuteScript([&](PlayerScript* script) - { - script->AnticheatUpdateMovementInfo(player, movementInfo); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ANTICHEAT_UPDATE_MOVEMENT_INFO, script->AnticheatUpdateMovementInfo(player, movementInfo)); } - bool ScriptMgr::AnticheatHandleDoubleJump(Player* player, Unit* mover) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->AnticheatHandleDoubleJump(player, mover); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ANTICHEAT_HANDLE_DOUBLE_JUMP, !script->AnticheatHandleDoubleJump(player, mover)); } bool ScriptMgr::AnticheatCheckMovementInfo(Player* player, MovementInfo const& movementInfo, Unit* mover, bool jump) { - auto ret = IsValidBoolScript([&](PlayerScript* script) - { - return !script->AnticheatCheckMovementInfo(player, movementInfo, mover, jump); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ANTICHEAT_CHECK_MOVEMENT_INFO, !script->AnticheatCheckMovementInfo(player, movementInfo, mover, jump)); } -PlayerScript::PlayerScript(const char* name) - : ScriptObject(name) +PlayerScript::PlayerScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, PLAYERHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < PLAYERHOOK_END; i++) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.h b/src/server/game/Scripting/ScriptDefines/PlayerScript.h index eb0e6753e..a834e82a1 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.h +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.h @@ -24,10 +24,186 @@ #include "AchievementMgr.h" #include "KillRewarder.h" +enum PlayerHook { + PLAYERHOOK_ON_PLAYER_JUST_DIED, + PLAYERHOOK_ON_PLAYER_RELEASED_GHOST, + PLAYERHOOK_ON_SEND_INITIAL_PACKETS_BEFORE_ADD_TO_MAP, + PLAYERHOOK_ON_BATTLEGROUND_DESERTION, + PLAYERHOOK_ON_PLAYER_COMPLETE_QUEST, + PLAYERHOOK_ON_PVP_KILL, + PLAYERHOOK_ON_PLAYER_PVP_FLAG_CHANGE, + PLAYERHOOK_ON_CREATURE_KILL, + PLAYERHOOK_ON_CREATURE_KILLED_BY_PET, + PLAYERHOOK_ON_PLAYER_KILLED_BY_CREATURE, + PLAYERHOOK_ON_LEVEL_CHANGED, + PLAYERHOOK_ON_FREE_TALENT_POINTS_CHANGED, + PLAYERHOOK_ON_TALENTS_RESET, + PLAYERHOOK_ON_AFTER_SPEC_SLOT_CHANGED, + PLAYERHOOK_ON_BEFORE_UPDATE, + PLAYERHOOK_ON_UPDATE, + PLAYERHOOK_ON_MONEY_CHANGED, + PLAYERHOOK_ON_BEFORE_LOOT_MONEY, + PLAYERHOOK_ON_GIVE_EXP, + PLAYERHOOK_ON_REPUTATION_CHANGE, + PLAYERHOOK_ON_REPUTATION_RANK_CHANGE, + PLAYERHOOK_ON_LEARN_SPELL, + PLAYERHOOK_ON_FORGOT_SPELL, + PLAYERHOOK_ON_DUEL_REQUEST, + PLAYERHOOK_ON_DUEL_START, + PLAYERHOOK_ON_DUEL_END, + PLAYERHOOK_ON_CHAT, + PLAYERHOOK_ON_BEFORE_SEND_CHAT_MESSAGE, + PLAYERHOOK_ON_CHAT_WITH_RECEIVER, + PLAYERHOOK_ON_CHAT_WITH_GROUP, + PLAYERHOOK_ON_CHAT_WITH_GUILD, + PLAYERHOOK_ON_CHAT_WITH_CHANNEL, + PLAYERHOOK_ON_EMOTE, + PLAYERHOOK_ON_TEXT_EMOTE, + PLAYERHOOK_ON_SPELL_CAST, + PLAYERHOOK_ON_LOAD_FROM_DB, + PLAYERHOOK_ON_LOGIN, + PLAYERHOOK_ON_BEFORE_LOGOUT, + PLAYERHOOK_ON_LOGOUT, + PLAYERHOOK_ON_CREATE, + PLAYERHOOK_ON_DELETE, + PLAYERHOOK_ON_FAILED_DELETE, + PLAYERHOOK_ON_SAVE, + PLAYERHOOK_ON_BIND_TO_INSTANCE, + PLAYERHOOK_ON_UPDATE_ZONE, + PLAYERHOOK_ON_UPDATE_AREA, + PLAYERHOOK_ON_MAP_CHANGED, + PLAYERHOOK_ON_BEFORE_TELEPORT, + PLAYERHOOK_ON_UPDATE_FACTION, + PLAYERHOOK_ON_ADD_TO_BATTLEGROUND, + PLAYERHOOK_ON_QUEUE_RANDOM_DUNGEON, + PLAYERHOOK_ON_REMOVE_FROM_BATTLEGROUND, + PLAYERHOOK_ON_ACHI_COMPLETE, + PLAYERHOOK_ON_BEFORE_ACHI_COMPLETE, + PLAYERHOOK_ON_CRITERIA_PROGRESS, + PLAYERHOOK_ON_BEFORE_CRITERIA_PROGRESS, + PLAYERHOOK_ON_ACHI_SAVE, + PLAYERHOOK_ON_CRITERIA_SAVE, + PLAYERHOOK_ON_GOSSIP_SELECT, + PLAYERHOOK_ON_GOSSIP_SELECT_CODE, + PLAYERHOOK_ON_BEING_CHARMED, + PLAYERHOOK_ON_AFTER_SET_VISIBLE_ITEM_SLOT, + PLAYERHOOK_ON_AFTER_MOVE_ITEM_FROM_INVENTORY, + PLAYERHOOK_ON_EQUIP, + PLAYERHOOK_ON_PLAYER_JOIN_BG, + PLAYERHOOK_ON_PLAYER_JOIN_ARENA, + PLAYERHOOK_GET_CUSTOM_GET_ARENA_TEAM_ID, + PLAYERHOOK_GET_CUSTOM_ARENA_PERSONAL_RATING, + PLAYERHOOK_ON_GET_MAX_PERSONAL_ARENA_RATING_REQUIREMENT, + PLAYERHOOK_ON_LOOT_ITEM, + PLAYERHOOK_ON_BEFORE_FILL_QUEST_LOOT_ITEM, + PLAYERHOOK_ON_STORE_NEW_ITEM, + PLAYERHOOK_ON_CREATE_ITEM, + PLAYERHOOK_ON_QUEST_REWARD_ITEM, + PLAYERHOOK_CAN_PLACE_AUCTION_BID, + PLAYERHOOK_ON_GROUP_ROLL_REWARD_ITEM, + PLAYERHOOK_ON_BEFORE_OPEN_ITEM, + PLAYERHOOK_ON_BEFORE_QUEST_COMPLETE, + PLAYERHOOK_ON_QUEST_COMPUTE_EXP, + PLAYERHOOK_ON_BEFORE_DURABILITY_REPAIR, + PLAYERHOOK_ON_BEFORE_BUY_ITEM_FROM_VENDOR, + PLAYERHOOK_ON_BEFORE_STORE_OR_EQUIP_NEW_ITEM, + PLAYERHOOK_ON_AFTER_STORE_OR_EQUIP_NEW_ITEM, + PLAYERHOOK_ON_AFTER_UPDATE_MAX_POWER, + PLAYERHOOK_ON_AFTER_UPDATE_MAX_HEALTH, + PLAYERHOOK_ON_BEFORE_UPDATE_ATTACK_POWER_AND_DAMAGE, + PLAYERHOOK_ON_AFTER_UPDATE_ATTACK_POWER_AND_DAMAGE, + PLAYERHOOK_ON_BEFORE_INIT_TALENT_FOR_LEVEL, + PLAYERHOOK_ON_FIRST_LOGIN, + PLAYERHOOK_ON_SET_MAX_LEVEL, + PLAYERHOOK_CAN_JOIN_IN_BATTLEGROUND_QUEUE, + PLAYERHOOK_SHOULD_BE_REWARDED_WITH_MONEY_INSTEAD_OF_EXP, + PLAYERHOOK_ON_BEFORE_TEMP_SUMMON_INIT_STATS, + PLAYERHOOK_ON_BEFORE_GUARDIAN_INIT_STATS_FOR_LEVEL, + PLAYERHOOK_ON_AFTER_GUARDIAN_INIT_STATS_FOR_LEVEL, + PLAYERHOOK_ON_BEFORE_LOAD_PET_FROM_DB, + PLAYERHOOK_CAN_JOIN_IN_ARENA_QUEUE, + PLAYERHOOK_CAN_BATTLEFIELD_PORT, + PLAYERHOOK_CAN_GROUP_INVITE, + PLAYERHOOK_CAN_GROUP_ACCEPT, + PLAYERHOOK_CAN_SELL_ITEM, + PLAYERHOOK_CAN_SEND_MAIL, + PLAYERHOOK_PETITION_BUY, + PLAYERHOOK_PETITION_SHOW_LIST, + PLAYERHOOK_ON_REWARD_KILL_REWARDER, + PLAYERHOOK_CAN_GIVE_MAIL_REWARD_AT_GIVE_LEVEL, + PLAYERHOOK_ON_DELETE_FROM_DB, + PLAYERHOOK_CAN_REPOP_AT_GRAVEYARD, + PLAYERHOOK_ON_PLAYER_IS_CLASS, + PLAYERHOOK_ON_GET_MAX_SKILL_VALUE, + PLAYERHOOK_ON_PLAYER_HAS_ACTIVE_POWER_TYPE, + PLAYERHOOK_ON_UPDATE_GATHERING_SKILL, + PLAYERHOOK_ON_UPDATE_CRAFTING_SKILL, + PLAYERHOOK_ON_UPDATE_FISHING_SKILL, + PLAYERHOOK_CAN_AREA_EXPLORE_AND_OUTDOOR, + PLAYERHOOK_ON_VICTIM_REWARD_BEFORE, + PLAYERHOOK_ON_VICTIM_REWARD_AFTER, + PLAYERHOOK_ON_CUSTOM_SCALING_STAT_VALUE_BEFORE, + PLAYERHOOK_ON_CUSTOM_SCALING_STAT_VALUE, + PLAYERHOOK_CAN_ARMOR_DAMAGE_MODIFIER, + PLAYERHOOK_ON_GET_FERAL_AP_BONUS, + PLAYERHOOK_CAN_APPLY_WEAPON_DEPENDENT_AURA_DAMAGE_MOD, + PLAYERHOOK_CAN_APPLY_EQUIP_SPELL, + PLAYERHOOK_CAN_APPLY_EQUIP_SPELLS_ITEM_SET, + PLAYERHOOK_CAN_CAST_ITEM_COMBAT_SPELL, + PLAYERHOOK_CAN_CAST_ITEM_USE_SPELL, + PLAYERHOOK_ON_APPLY_AMMO_BONUSES, + PLAYERHOOK_CAN_EQUIP_ITEM, + PLAYERHOOK_CAN_UNEQUIP_ITEM, + PLAYERHOOK_CAN_USE_ITEM, + PLAYERHOOK_CAN_SAVE_EQUIP_NEW_ITEM, + PLAYERHOOK_CAN_APPLY_ENCHANTMENT, + PLAYERHOOK_PASSED_QUEST_KILLED_MONSTER_CREDIT, + PLAYERHOOK_CHECK_ITEM_IN_SLOT_AT_LOAD_INVENTORY, + PLAYERHOOK_NOT_AVOID_SATISFY, + PLAYERHOOK_NOT_VISIBLE_GLOBALLY_FOR, + PLAYERHOOK_ON_GET_ARENA_PERSONAL_RATING, + PLAYERHOOK_ON_GET_ARENA_TEAM_ID, + PLAYERHOOK_ON_IS_FFA_PVP, + PLAYERHOOK_ON_FFA_PVP_STATE_UPDATE, + PLAYERHOOK_ON_IS_PVP, + PLAYERHOOK_ON_GET_MAX_SKILL_VALUE_FOR_LEVEL, + PLAYERHOOK_NOT_SET_ARENA_TEAM_INFO_FIELD, + PLAYERHOOK_CAN_JOIN_LFG, + PLAYERHOOK_CAN_ENTER_MAP, + PLAYERHOOK_CAN_INIT_TRADE, + PLAYERHOOK_CAN_SET_TRADE_ITEM, + PLAYERHOOK_ON_SET_SERVER_SIDE_VISIBILITY, + PLAYERHOOK_ON_SET_SERVER_SIDE_VISIBILITY_DETECT, + PLAYERHOOK_ON_PLAYER_RESURRECT, + PLAYERHOOK_ON_BEFORE_CHOOSE_GRAVEYARD, + PLAYERHOOK_CAN_PLAYER_USE_CHAT, + PLAYERHOOK_CAN_PLAYER_USE_PRIVATE_CHAT, + PLAYERHOOK_CAN_PLAYER_USE_GROUP_CHAT, + PLAYERHOOK_CAN_PLAYER_USE_GUILD_CHAT, + PLAYERHOOK_CAN_PLAYER_USE_CHANNEL_CHAT, + PLAYERHOOK_ON_PLAYER_LEARN_TALENTS, + PLAYERHOOK_ON_PLAYER_ENTER_COMBAT, + PLAYERHOOK_ON_PLAYER_LEAVE_COMBAT, + PLAYERHOOK_ON_QUEST_ABANDON, + PLAYERHOOK_ON_GET_QUEST_RATE, + PLAYERHOOK_ON_CAN_PLAYER_FLY_IN_ZONE, + PLAYERHOOK_ANTICHEAT_SET_CAN_FLY_BY_SERVER, + PLAYERHOOK_ANTICHEAT_SET_UNDER_ACK_MOUNT, + PLAYERHOOK_ANTICHEAT_SET_ROOT_ACK_UPD, + PLAYERHOOK_ANTICHEAT_SET_JUMPING_BY_OPCODE, + PLAYERHOOK_ANTICHEAT_UPDATE_MOVEMENT_INFO, + PLAYERHOOK_ANTICHEAT_HANDLE_DOUBLE_JUMP, + PLAYERHOOK_ANTICHEAT_CHECK_MOVEMENT_INFO, + PLAYERHOOK_CAN_SEND_ERROR_ALREADY_LOOTED, + PLAYERHOOK_ON_AFTER_CREATURE_LOOT, + PLAYERHOOK_ON_AFTER_CREATURE_LOOT_MONEY, + PLAYERHOOK_END +}; + class PlayerScript : public ScriptObject { protected: - PlayerScript(const char* name); + PlayerScript(const char* name, std::vector enabledHooks = std::vector()); public: // Called when a player dies diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index a2f1cf5f5..f01ccadd5 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -710,30 +710,42 @@ public: typedef std::map ScriptMap; typedef typename ScriptMap::iterator ScriptMapIterator; - typedef std::vector ScriptVector; + typedef std::vector>> ScriptVector; typedef typename ScriptVector::iterator ScriptVectorIterator; + typedef std::vector> EnabledHooksVector; + typedef typename EnabledHooksVector::iterator EnabledHooksVectorIterator; + // The actual list of scripts. This will be accessed concurrently, so it must not be modified // after server startup. static ScriptMap ScriptPointerList; // After database load scripts static ScriptVector ALScripts; + // The list of hook types with the list of enabled scripts for this specific hook. + // With this approach, we wouldn't call all available hooks in case if we override just one hook. + static EnabledHooksVector EnabledHooks; - static void AddScript(TScript* const script) + static void AddScript(TScript* const script, std::vector enabledHooks = {}) { ASSERT(script); if (!_checkMemory(script)) return; + if (EnabledHooks.empty()) + EnabledHooks.resize(script->GetTotalAvailableHooks()); + if (script->isAfterLoadScript()) { - ALScripts.push_back(script); + ALScripts.emplace_back(script, std::move(enabledHooks)); } else { script->checkValidity(); + for (uint16 v : enabledHooks) + EnabledHooks[v].emplace_back(script); + // We're dealing with a code-only script; just add it. ScriptPointerList[_scriptIdCounter++] = script; sScriptMgr->IncreaseScriptCount(); @@ -742,9 +754,9 @@ public: static void AddALScripts() { - for(ScriptVectorIterator it = ALScripts.begin(); it != ALScripts.end(); ++it) + for (ScriptVectorIterator it = ALScripts.begin(); it != ALScripts.end(); ++it) { - TScript* const script = *it; + TScript* const script = (*it).first; script->checkValidity(); @@ -776,6 +788,14 @@ public: // If the script is already assigned -> delete it! if (oldScript) { + for (auto& vIt : EnabledHooks) + for (size_t i = 0; i < vIt.size(); ++i) + if (vIt[i] == oldScript) + { + vIt.erase(vIt.begin() + i); + break; + } + delete oldScript; } @@ -798,6 +818,9 @@ public: } else { + for (uint16 v : (*it).second) + EnabledHooks[v].emplace_back(script); + // We're dealing with a code-only script; just add it. ScriptPointerList[_scriptIdCounter++] = script; sScriptMgr->IncreaseScriptCount(); @@ -842,7 +865,8 @@ private: // Instantiate static members of ScriptRegistry. template std::map ScriptRegistry::ScriptPointerList; -template std::vector ScriptRegistry::ALScripts; +template std::vector>> ScriptRegistry::ALScripts; +template std::vector> ScriptRegistry::EnabledHooks; template uint32 ScriptRegistry::_scriptIdCounter = 0; #endif diff --git a/src/server/game/Scripting/ScriptMgrMacros.h b/src/server/game/Scripting/ScriptMgrMacros.h index a26c6d71b..fc7895e81 100644 --- a/src/server/game/Scripting/ScriptMgrMacros.h +++ b/src/server/game/Scripting/ScriptMgrMacros.h @@ -69,4 +69,14 @@ inline bool ReturnValidBool(Optional ret, bool need = false) return ret && *ret ? need : !need; } +#define CALL_ENABLED_HOOKS(scriptType, hookType, action) \ + if (!ScriptRegistry::EnabledHooks[hookType].empty()) \ + for (auto const& script : ScriptRegistry::EnabledHooks[hookType]) { action; } + +#define CALL_ENABLED_BOOLEAN_HOOKS(scriptType, hookType, action) \ + if (ScriptRegistry::EnabledHooks[hookType].empty()) \ + return true; \ + for (auto const& script : ScriptRegistry::EnabledHooks[hookType]) { if (action) return false; } \ + return true; + #endif // _SCRIPT_MGR_MACRO_H_ diff --git a/src/server/game/Scripting/ScriptObject.h b/src/server/game/Scripting/ScriptObject.h index c5bb042e5..ea8e0b90b 100644 --- a/src/server/game/Scripting/ScriptObject.h +++ b/src/server/game/Scripting/ScriptObject.h @@ -53,8 +53,10 @@ public: [[nodiscard]] const std::string& GetName() const { return _name; } + [[nodiscard]] uint16 GetTotalAvailableHooks() { return _totalAvailableHooks; } + protected: - ScriptObject(const char* name) : _name(std::string(name)) + ScriptObject(const char* name, uint16 totalAvailableHooks = 0) : _name(std::string(name)), _totalAvailableHooks(totalAvailableHooks) { } @@ -62,6 +64,7 @@ protected: private: const std::string _name; + const uint16 _totalAvailableHooks; }; template diff --git a/src/server/scripts/Events/midsummer.cpp b/src/server/scripts/Events/midsummer.cpp index c450e0576..33106da38 100644 --- a/src/server/scripts/Events/midsummer.cpp +++ b/src/server/scripts/Events/midsummer.cpp @@ -153,7 +153,7 @@ uint32 const GoBonfireCity[COUNT_GO_BONFIRE_CITY] = { 181332, 181333, 181334, 18 class MidsummerPlayerScript : public PlayerScript { public: - MidsummerPlayerScript() : PlayerScript("MidsummerPlayerScript") + MidsummerPlayerScript() : PlayerScript("MidsummerPlayerScript", {PLAYERHOOK_ON_UPDATE_ZONE}) { } diff --git a/src/server/scripts/World/action_ip_logger.cpp b/src/server/scripts/World/action_ip_logger.cpp index c99639974..1d219476f 100644 --- a/src/server/scripts/World/action_ip_logger.cpp +++ b/src/server/scripts/World/action_ip_logger.cpp @@ -169,7 +169,15 @@ public: class CharacterActionIpLogger : public PlayerScript { public: - CharacterActionIpLogger() : PlayerScript("CharacterActionIpLogger") { } + CharacterActionIpLogger() : + PlayerScript("CharacterActionIpLogger", + { + PLAYERHOOK_ON_CREATE, + PLAYERHOOK_ON_LOGIN, + PLAYERHOOK_ON_LOGOUT + }) + { + } // CHARACTER_CREATE = 7 void OnCreate(Player* player) override @@ -256,7 +264,14 @@ public: class CharacterDeleteActionIpLogger : public PlayerScript { public: - CharacterDeleteActionIpLogger() : PlayerScript("CharacterDeleteActionIpLogger") { } + CharacterDeleteActionIpLogger() : + PlayerScript("CharacterDeleteActionIpLogger", + { + PLAYERHOOK_ON_DELETE, + PLAYERHOOK_ON_FAILED_DELETE + }) + { + } // CHARACTER_DELETE = 10 void OnDelete(ObjectGuid guid, uint32 accountId) override diff --git a/src/server/scripts/World/chat_log.cpp b/src/server/scripts/World/chat_log.cpp index f2ef910e4..caafbca83 100644 --- a/src/server/scripts/World/chat_log.cpp +++ b/src/server/scripts/World/chat_log.cpp @@ -25,7 +25,17 @@ class ChatLogScript : public PlayerScript { public: - ChatLogScript() : PlayerScript("ChatLogScript") { } + ChatLogScript() : + PlayerScript("ChatLogScript", + { + PLAYERHOOK_ON_CHAT, + PLAYERHOOK_ON_CHAT_WITH_GROUP, + PLAYERHOOK_ON_CHAT_WITH_GUILD, + PLAYERHOOK_ON_CHAT_WITH_CHANNEL, + PLAYERHOOK_ON_CHAT_WITH_RECEIVER + }) + { + } void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg) override { diff --git a/src/server/scripts/World/player_scripts.cpp b/src/server/scripts/World/player_scripts.cpp index 0ec18509b..89e62c023 100644 --- a/src/server/scripts/World/player_scripts.cpp +++ b/src/server/scripts/World/player_scripts.cpp @@ -27,7 +27,7 @@ enum ApprenticeAnglerQuestEnum class QuestApprenticeAnglerPlayerScript : public PlayerScript { public: - QuestApprenticeAnglerPlayerScript() : PlayerScript("QuestApprenticeAnglerPlayerScript") + QuestApprenticeAnglerPlayerScript() : PlayerScript("QuestApprenticeAnglerPlayerScript", {PLAYERHOOK_ON_PLAYER_COMPLETE_QUEST}) { } diff --git a/src/server/scripts/World/server_mail.cpp b/src/server/scripts/World/server_mail.cpp index 12e4b44ac..d8f1a2ac1 100644 --- a/src/server/scripts/World/server_mail.cpp +++ b/src/server/scripts/World/server_mail.cpp @@ -24,7 +24,7 @@ class ServerMailReward : public PlayerScript { public: - ServerMailReward() : PlayerScript("ServerMailReward") { } + ServerMailReward() : PlayerScript("ServerMailReward", {PLAYERHOOK_ON_LOGIN}) { } // CHARACTER_LOGIN = 8 void OnLogin(Player* player) override From 83c4382c70c30a901c28f850d0b53a143ab2250b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 04:09:02 +0800 Subject: [PATCH 05/45] feat(Core/Scripts): Optimize AccountScript need#18672 (#18697) Add files via upload --- .../Scripting/ScriptDefines/AccountScript.cpp | 66 +++++-------------- .../Scripting/ScriptDefines/AccountScript.h | 16 ++++- 2 files changed, 32 insertions(+), 50 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/AccountScript.cpp b/src/server/game/Scripting/ScriptDefines/AccountScript.cpp index 199956b1d..0858d8b4a 100644 --- a/src/server/game/Scripting/ScriptDefines/AccountScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AccountScript.cpp @@ -21,90 +21,58 @@ void ScriptMgr::OnAccountLogin(uint32 accountId) { - ExecuteScript([&](AccountScript* script) - { - script->OnAccountLogin(accountId); - }); + CALL_ENABLED_HOOKS(AccountScript, ACCOUNTHOOK_ON_ACCOUNT_LOGIN, script->OnAccountLogin(accountId)); } void ScriptMgr::OnBeforeAccountDelete(uint32 accountId) { - ExecuteScript([&](AccountScript* script) - { - script->OnBeforeAccountDelete(accountId); - }); + CALL_ENABLED_HOOKS(AccountScript, ACCOUNTHOOK_ON_BEFORE_ACCOUNT_DELETE, script->OnBeforeAccountDelete(accountId)); } -//void ScriptMgr::OnAccountLogout(uint32 accountId) -//{ -// ExecuteScript([&](AccountScript* script) -// { -// script->OnAccountLogout(accountId); -// }); -//} - void ScriptMgr::OnLastIpUpdate(uint32 accountId, std::string ip) { - ExecuteScript([&](AccountScript* script) - { - script->OnLastIpUpdate(accountId, ip); - }); + CALL_ENABLED_HOOKS(AccountScript, ACCOUNTHOOK_ON_LAST_IP_UPDATE, script->OnLastIpUpdate(accountId, ip)); } void ScriptMgr::OnFailedAccountLogin(uint32 accountId) { - ExecuteScript([&](AccountScript* script) - { - script->OnFailedAccountLogin(accountId); - }); + CALL_ENABLED_HOOKS(AccountScript, ACCOUNTHOOK_ON_FAILED_ACCOUNT_LOGIN, script->OnFailedAccountLogin(accountId)); } void ScriptMgr::OnEmailChange(uint32 accountId) { - ExecuteScript([&](AccountScript* script) - { - script->OnEmailChange(accountId); - }); + CALL_ENABLED_HOOKS(AccountScript, ACCOUNTHOOK_ON_EMAIL_CHANGE, script->OnEmailChange(accountId)); } void ScriptMgr::OnFailedEmailChange(uint32 accountId) { - ExecuteScript([&](AccountScript* script) - { - script->OnFailedEmailChange(accountId); - }); + CALL_ENABLED_HOOKS(AccountScript, ACCOUNTHOOK_ON_FAILED_EMAIL_CHANGE, script->OnFailedEmailChange(accountId)); } void ScriptMgr::OnPasswordChange(uint32 accountId) { - ExecuteScript([&](AccountScript* script) - { - script->OnPasswordChange(accountId); - }); + CALL_ENABLED_HOOKS(AccountScript, ACCOUNTHOOK_ON_PASSWORD_CHANGE, script->OnPasswordChange(accountId)); } void ScriptMgr::OnFailedPasswordChange(uint32 accountId) { - ExecuteScript([&](AccountScript* script) - { - script->OnFailedPasswordChange(accountId); - }); + CALL_ENABLED_HOOKS(AccountScript, ACCOUNTHOOK_ON_FAILED_PASSWORD_CHANGE, script->OnFailedPasswordChange(accountId)); } bool ScriptMgr::CanAccountCreateCharacter(uint32 accountId, uint8 charRace, uint8 charClass) { - auto ret = IsValidBoolScript([&](AccountScript* script) - { - return !script->CanAccountCreateCharacter(accountId, charRace, charClass); - }); - - return ReturnValidBool(ret); + CALL_ENABLED_BOOLEAN_HOOKS(AccountScript, ACCOUNTHOOK_CAN_ACCOUNT_CREATE_CHARACTER, !script->CanAccountCreateCharacter(accountId, charRace, charClass)); } -AccountScript::AccountScript(char const* name) : - ScriptObject(name) +AccountScript::AccountScript(char const* name, std::vector enabledHooks) : + ScriptObject(name, ACCOUNTHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < ACCOUNTHOOK_END; i++) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/AccountScript.h b/src/server/game/Scripting/ScriptDefines/AccountScript.h index 76b3db459..705eac676 100644 --- a/src/server/game/Scripting/ScriptDefines/AccountScript.h +++ b/src/server/game/Scripting/ScriptDefines/AccountScript.h @@ -20,10 +20,24 @@ #include "ScriptObject.h" +enum AccountHook +{ + ACCOUNTHOOK_ON_ACCOUNT_LOGIN, + ACCOUNTHOOK_ON_BEFORE_ACCOUNT_DELETE, + ACCOUNTHOOK_ON_LAST_IP_UPDATE, + ACCOUNTHOOK_ON_FAILED_ACCOUNT_LOGIN, + ACCOUNTHOOK_ON_EMAIL_CHANGE, + ACCOUNTHOOK_ON_FAILED_EMAIL_CHANGE, + ACCOUNTHOOK_ON_PASSWORD_CHANGE, + ACCOUNTHOOK_ON_FAILED_PASSWORD_CHANGE, + ACCOUNTHOOK_CAN_ACCOUNT_CREATE_CHARACTER, + ACCOUNTHOOK_END +}; + class AccountScript : public ScriptObject { protected: - AccountScript(const char* name); + AccountScript(const char* name, std::vector enabledHooks = std::vector()); public: // Called when an account logged in successfully From bcf1ffa9f5c87632ee2e650c1de04e91d8fdc7dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 04:09:17 +0800 Subject: [PATCH 06/45] feat(Core/Scripts): Optimize MovementHandlerScript need#18672 (#18701) * Add files via upload * Add files via upload --- .../ScriptDefines/MovementHandlerScript.cpp | 16 +++++++++------- .../ScriptDefines/MovementHandlerScript.h | 8 +++++++- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.cpp b/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.cpp index 2f79dd957..c10f04014 100644 --- a/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.cpp @@ -21,16 +21,18 @@ void ScriptMgr::OnPlayerMove(Player* player, MovementInfo movementInfo, uint32 opcode) { - ExecuteScript([&](MovementHandlerScript* script) - { - script->OnPlayerMove(player, movementInfo, opcode); - }); + CALL_ENABLED_HOOKS(MovementHandlerScript, MOVEMENTHOOK_ON_PLAYER_MOVE, script->OnPlayerMove(player, movementInfo, opcode)); } -MovementHandlerScript::MovementHandlerScript(const char* name) : - ScriptObject(name) +MovementHandlerScript::MovementHandlerScript(const char* name, std::vector enabledHooks) : + ScriptObject(name, MOVEMENTHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < MOVEMENTHOOK_END; i++) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.h b/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.h index cc0fdc7cf..0893cc207 100644 --- a/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.h +++ b/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.h @@ -21,10 +21,16 @@ #include "Object.h" #include "ScriptObject.h" +enum MovementHook +{ + MOVEMENTHOOK_ON_PLAYER_MOVE, + MOVEMENTHOOK_END +}; + class MovementHandlerScript : public ScriptObject { protected: - MovementHandlerScript(const char* name); + MovementHandlerScript(const char* name, std::vector enabledHooks = std::vector()); public: //Called whenever a player moves From e28a432fa2ae4bfa7c0d54cc13f92e12db67420b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 04:09:32 +0800 Subject: [PATCH 07/45] feat(Core/Scripts): Optimize ArenaScript need#18672 (#18700) Add files via upload --- .../Scripting/ScriptDefines/ArenaScript.cpp | 40 +++++-------------- .../Scripting/ScriptDefines/ArenaScript.h | 10 ++++- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp b/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp index 89303ba95..96e0c7a16 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp @@ -21,46 +21,28 @@ bool ScriptMgr::CanAddMember(ArenaTeam* team, ObjectGuid PlayerGuid) { - auto ret = IsValidBoolScript([&](ArenaScript* script) - { - return !script->CanAddMember(team, PlayerGuid); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(ArenaScript, ARENAHOOK_CAN_ADD_MEMBER, !script->CanAddMember(team, PlayerGuid)); } void ScriptMgr::OnGetPoints(ArenaTeam* team, uint32 memberRating, float& points) { - ExecuteScript([&](ArenaScript* script) - { - script->OnGetPoints(team, memberRating, points); - }); + CALL_ENABLED_HOOKS(ArenaScript, ARENAHOOK_ON_GET_POINTS, script->OnGetPoints(team, memberRating, points)); } bool ScriptMgr::CanSaveToDB(ArenaTeam* team) { - auto ret = IsValidBoolScript([&](ArenaScript* script) - { - return !script->CanSaveToDB(team); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(ArenaScript, ARENAHOOK_CAN_SAVE_TO_DB, !script->CanSaveToDB(team)); } -ArenaScript::ArenaScript(const char* name) - : ScriptObject(name) +ArenaScript::ArenaScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, ARENAHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < ARENAHOOK_END; i++) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/ArenaScript.h b/src/server/game/Scripting/ScriptDefines/ArenaScript.h index 0d7cb7e93..ff0121335 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaScript.h +++ b/src/server/game/Scripting/ScriptDefines/ArenaScript.h @@ -21,11 +21,19 @@ #include "ObjectGuid.h" #include "ScriptObject.h" +enum ArenaHook +{ + ARENAHOOK_CAN_ADD_MEMBER, + ARENAHOOK_ON_GET_POINTS, + ARENAHOOK_CAN_SAVE_TO_DB, + ARENAHOOK_END +}; + class ArenaScript : public ScriptObject { protected: - ArenaScript(const char* name); + ArenaScript(const char* name, std::vector enabledHooks = std::vector()); public: From 33592f93cf0010c63eb4896fc95be24397655c19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 04:09:47 +0800 Subject: [PATCH 08/45] feat(Core/Scripts): Optimize ArenaTeamScript need#18672 (#18699) Add files via upload --- .../ScriptDefines/ArenaTeamScript.cpp | 36 +++++++------------ .../Scripting/ScriptDefines/ArenaTeamScript.h | 12 ++++++- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.cpp b/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.cpp index 7ddf58f9f..8abad7dd5 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.cpp @@ -21,48 +21,38 @@ void ScriptMgr::OnGetSlotByType(const uint32 type, uint8& slot) { - ExecuteScript([&](ArenaTeamScript* script) - { - script->OnGetSlotByType(type, slot); - }); + CALL_ENABLED_HOOKS(ArenaTeamScript, ARENATEAMHOOK_ON_GET_SLOT_BY_TYPE, script->OnGetSlotByType(type, slot)); } void ScriptMgr::OnGetArenaPoints(ArenaTeam* at, float& points) { - ExecuteScript([&](ArenaTeamScript* script) - { - script->OnGetArenaPoints(at, points); - }); + CALL_ENABLED_HOOKS(ArenaTeamScript, ARENATEAMHOOK_ON_GET_ARENA_POINTS, script->OnGetArenaPoints(at, points)); } void ScriptMgr::OnArenaTypeIDToQueueID(const BattlegroundTypeId bgTypeId, const uint8 arenaType, uint32& queueTypeID) { - ExecuteScript([&](ArenaTeamScript* script) - { - script->OnTypeIDToQueueID(bgTypeId, arenaType, queueTypeID); - }); + CALL_ENABLED_HOOKS(ArenaTeamScript, ARENATEAMHOOK_ON_TYPEID_TO_QUEUEID, script->OnTypeIDToQueueID(bgTypeId, arenaType, queueTypeID)); } void ScriptMgr::OnArenaQueueIdToArenaType(const BattlegroundQueueTypeId bgQueueTypeId, uint8& ArenaType) { - ExecuteScript([&](ArenaTeamScript* script) - { - script->OnQueueIdToArenaType(bgQueueTypeId, ArenaType); - }); + CALL_ENABLED_HOOKS(ArenaTeamScript, ARENATEAMHOOK_ON_QUEUEID_TO_ARENA_TYPE, script->OnQueueIdToArenaType(bgQueueTypeId, ArenaType)); } void ScriptMgr::OnSetArenaMaxPlayersPerTeam(const uint8 arenaType, uint32& maxPlayerPerTeam) { - ExecuteScript([&](ArenaTeamScript* script) - { - script->OnSetArenaMaxPlayersPerTeam(arenaType, maxPlayerPerTeam); - }); + CALL_ENABLED_HOOKS(ArenaTeamScript, ARENATEAMHOOK_ON_SET_ARENA_MAX_PLAYERS_PER_TEAM, script->OnSetArenaMaxPlayersPerTeam(arenaType, maxPlayerPerTeam)); } -ArenaTeamScript::ArenaTeamScript(const char* name) - : ScriptObject(name) +ArenaTeamScript::ArenaTeamScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, ARENATEAMHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < ARENATEAMHOOK_END; i++) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h b/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h index 256d5c510..319576b40 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h +++ b/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h @@ -21,10 +21,20 @@ #include "Battleground.h" #include "ScriptObject.h" +enum ArenaTeamHook +{ + ARENATEAMHOOK_ON_GET_SLOT_BY_TYPE, + ARENATEAMHOOK_ON_GET_ARENA_POINTS, + ARENATEAMHOOK_ON_TYPEID_TO_QUEUEID, + ARENATEAMHOOK_ON_QUEUEID_TO_ARENA_TYPE, + ARENATEAMHOOK_ON_SET_ARENA_MAX_PLAYERS_PER_TEAM, + ARENATEAMHOOK_END +}; + class ArenaTeamScript : public ScriptObject { protected: - ArenaTeamScript(const char* name); + ArenaTeamScript(const char* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; }; From f05200fcca36a69060384df5e91a7c15aef27b19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 04:10:02 +0800 Subject: [PATCH 09/45] feat(Core/Scripts): Optimize AuctionHouseScript need#18672 (#18698) Add files via upload --- .../ScriptDefines/AuctionHouseScript.cpp | 66 ++++++------------- .../ScriptDefines/AuctionHouseScript.h | 18 ++++- 2 files changed, 36 insertions(+), 48 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.cpp b/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.cpp index 4664d1b95..8247c28fd 100644 --- a/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.cpp @@ -24,10 +24,7 @@ void ScriptMgr::OnAuctionAdd(AuctionHouseObject* ah, AuctionEntry* entry) ASSERT(ah); ASSERT(entry); - ExecuteScript([&](AuctionHouseScript* script) - { - script->OnAuctionAdd(ah, entry); - }); + CALL_ENABLED_HOOKS(AuctionHouseScript, AUCTIONHOUSEHOOK_ON_AUCTION_ADD, script->OnAuctionAdd(ah, entry)); } void ScriptMgr::OnAuctionRemove(AuctionHouseObject* ah, AuctionEntry* entry) @@ -35,10 +32,7 @@ void ScriptMgr::OnAuctionRemove(AuctionHouseObject* ah, AuctionEntry* entry) ASSERT(ah); ASSERT(entry); - ExecuteScript([&](AuctionHouseScript* script) - { - script->OnAuctionRemove(ah, entry); - }); + CALL_ENABLED_HOOKS(AuctionHouseScript, AUCTIONHOUSEHOOK_ON_AUCTION_REMOVE, script->OnAuctionRemove(ah, entry)); } void ScriptMgr::OnAuctionSuccessful(AuctionHouseObject* ah, AuctionEntry* entry) @@ -46,10 +40,7 @@ void ScriptMgr::OnAuctionSuccessful(AuctionHouseObject* ah, AuctionEntry* entry) ASSERT(ah); ASSERT(entry); - ExecuteScript([&](AuctionHouseScript* script) - { - script->OnAuctionSuccessful(ah, entry); - }); + CALL_ENABLED_HOOKS(AuctionHouseScript, AUCTIONHOUSEHOOK_ON_AUCTION_SUCCESSFUL, script->OnAuctionSuccessful(ah, entry)); } void ScriptMgr::OnAuctionExpire(AuctionHouseObject* ah, AuctionEntry* entry) @@ -57,72 +48,53 @@ void ScriptMgr::OnAuctionExpire(AuctionHouseObject* ah, AuctionEntry* entry) ASSERT(ah); ASSERT(entry); - ExecuteScript([&](AuctionHouseScript* script) - { - script->OnAuctionExpire(ah, entry); - }); + CALL_ENABLED_HOOKS(AuctionHouseScript, AUCTIONHOUSEHOOK_ON_AUCTION_EXPIRE, script->OnAuctionExpire(ah, entry)); } void ScriptMgr::OnBeforeAuctionHouseMgrSendAuctionWonMail(AuctionHouseMgr* auctionHouseMgr, AuctionEntry* auction, Player* bidder, uint32& bidder_accId, bool& sendNotification, bool& updateAchievementCriteria, bool& sendMail) { - ExecuteScript([&](AuctionHouseScript* script) - { - script->OnBeforeAuctionHouseMgrSendAuctionWonMail(auctionHouseMgr, auction, bidder, bidder_accId, sendNotification, updateAchievementCriteria, sendMail); - }); + CALL_ENABLED_HOOKS(AuctionHouseScript, AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_SEND_AUCTION_WON_MAIL, script->OnBeforeAuctionHouseMgrSendAuctionWonMail(auctionHouseMgr, auction, bidder, bidder_accId, sendNotification, updateAchievementCriteria, sendMail)); } void ScriptMgr::OnBeforeAuctionHouseMgrSendAuctionSalePendingMail(AuctionHouseMgr* auctionHouseMgr, AuctionEntry* auction, Player* owner, uint32& owner_accId, bool& sendMail) { - ExecuteScript([&](AuctionHouseScript* script) - { - script->OnBeforeAuctionHouseMgrSendAuctionSalePendingMail(auctionHouseMgr, auction, owner, owner_accId, sendMail); - }); + CALL_ENABLED_HOOKS(AuctionHouseScript, AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_SEND_AUCTION_SALE_PENDING_MAIL, script->OnBeforeAuctionHouseMgrSendAuctionSalePendingMail(auctionHouseMgr, auction, owner, owner_accId, sendMail)); } void ScriptMgr::OnBeforeAuctionHouseMgrSendAuctionSuccessfulMail(AuctionHouseMgr* auctionHouseMgr, AuctionEntry* auction, Player* owner, uint32& owner_accId, uint32& profit, bool& sendNotification, bool& updateAchievementCriteria, bool& sendMail) { - ExecuteScript([&](AuctionHouseScript* script) - { - script->OnBeforeAuctionHouseMgrSendAuctionSuccessfulMail(auctionHouseMgr, auction, owner, owner_accId, profit, sendNotification, updateAchievementCriteria, sendMail); - }); + CALL_ENABLED_HOOKS(AuctionHouseScript, AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_SEND_AUCTION_SUCCESSFUL_MAIL, script->OnBeforeAuctionHouseMgrSendAuctionSuccessfulMail(auctionHouseMgr, auction, owner, owner_accId, profit, sendNotification, updateAchievementCriteria, sendMail)); } void ScriptMgr::OnBeforeAuctionHouseMgrSendAuctionExpiredMail(AuctionHouseMgr* auctionHouseMgr, AuctionEntry* auction, Player* owner, uint32& owner_accId, bool& sendNotification, bool& sendMail) { - ExecuteScript([&](AuctionHouseScript* script) - { - script->OnBeforeAuctionHouseMgrSendAuctionExpiredMail(auctionHouseMgr, auction, owner, owner_accId, sendNotification, sendMail); - }); + CALL_ENABLED_HOOKS(AuctionHouseScript, AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_SEND_AUCTION_EXPIRED_MAIL, script->OnBeforeAuctionHouseMgrSendAuctionExpiredMail(auctionHouseMgr, auction, owner, owner_accId, sendNotification, sendMail)); } void ScriptMgr::OnBeforeAuctionHouseMgrSendAuctionOutbiddedMail(AuctionHouseMgr* auctionHouseMgr, AuctionEntry* auction, Player* oldBidder, uint32& oldBidder_accId, Player* newBidder, uint32& newPrice, bool& sendNotification, bool& sendMail) { - ExecuteScript([&](AuctionHouseScript* script) - { - script->OnBeforeAuctionHouseMgrSendAuctionOutbiddedMail(auctionHouseMgr, auction, oldBidder, oldBidder_accId, newBidder, newPrice, sendNotification, sendMail); - }); + CALL_ENABLED_HOOKS(AuctionHouseScript, AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_SEND_AUCTION_OUTBIDDED_MAIL, script->OnBeforeAuctionHouseMgrSendAuctionOutbiddedMail(auctionHouseMgr, auction, oldBidder, oldBidder_accId, newBidder, newPrice, sendNotification, sendMail)); } void ScriptMgr::OnBeforeAuctionHouseMgrSendAuctionCancelledToBidderMail(AuctionHouseMgr* auctionHouseMgr, AuctionEntry* auction, Player* bidder, uint32& bidder_accId, bool& sendMail) { - ExecuteScript([&](AuctionHouseScript* script) - { - script->OnBeforeAuctionHouseMgrSendAuctionCancelledToBidderMail(auctionHouseMgr, auction, bidder, bidder_accId, sendMail); - }); + CALL_ENABLED_HOOKS(AuctionHouseScript, AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_SEND_AUCTION_CANCELLED_TO_BIDDER_MAIL, script->OnBeforeAuctionHouseMgrSendAuctionCancelledToBidderMail(auctionHouseMgr, auction, bidder, bidder_accId, sendMail)); } void ScriptMgr::OnBeforeAuctionHouseMgrUpdate() { - ExecuteScript([&](AuctionHouseScript* script) - { - script->OnBeforeAuctionHouseMgrUpdate(); - }); + CALL_ENABLED_HOOKS(AuctionHouseScript, AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_UPDATE, script->OnBeforeAuctionHouseMgrUpdate()); } -AuctionHouseScript::AuctionHouseScript(const char* name) - : ScriptObject(name) +AuctionHouseScript::AuctionHouseScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, AUCTIONHOUSEHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < AUCTIONHOUSEHOOK_END; i++) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.h b/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.h index 02cacd112..1134e028a 100644 --- a/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.h +++ b/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.h @@ -20,10 +20,26 @@ #include "ScriptObject.h" +enum AuctionHouseHook +{ + AUCTIONHOUSEHOOK_ON_AUCTION_ADD, + AUCTIONHOUSEHOOK_ON_AUCTION_REMOVE, + AUCTIONHOUSEHOOK_ON_AUCTION_SUCCESSFUL, + AUCTIONHOUSEHOOK_ON_AUCTION_EXPIRE, + AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_SEND_AUCTION_WON_MAIL, + AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_SEND_AUCTION_SALE_PENDING_MAIL, + AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_SEND_AUCTION_SUCCESSFUL_MAIL, + AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_SEND_AUCTION_EXPIRED_MAIL, + AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_SEND_AUCTION_OUTBIDDED_MAIL, + AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_SEND_AUCTION_CANCELLED_TO_BIDDER_MAIL, + AUCTIONHOUSEHOOK_ON_BEFORE_AUCTIONHOUSEMGR_UPDATE, + AUCTIONHOUSEHOOK_END +}; + class AuctionHouseScript : public ScriptObject { protected: - AuctionHouseScript(const char* name); + AuctionHouseScript(const char* name, std::vector enabledHooks = std::vector()); public: // Called when an auction is added to an auction house. From 3a6231cb65153f04278bdc785ef979cd9ae766da Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Fri, 12 Apr 2024 12:13:37 +0200 Subject: [PATCH 10/45] fix(Core/Scripts): Fix build and crash when calling uninitialized scripts (#18718) fix(Core/Scripts): Fix build and crash when calling uninitialized scripts. --- src/server/game/Scripting/ScriptDefines/AccountScript.h | 1 + src/server/game/Scripting/ScriptDefines/ArenaScript.h | 1 + src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h | 1 + .../game/Scripting/ScriptDefines/AuctionHouseScript.h | 1 + .../game/Scripting/ScriptDefines/MovementHandlerScript.h | 1 + src/server/game/Scripting/ScriptMgr.cpp | 6 ++++++ src/server/game/Scripting/ScriptMgr.h | 7 ++++++- 7 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/server/game/Scripting/ScriptDefines/AccountScript.h b/src/server/game/Scripting/ScriptDefines/AccountScript.h index 705eac676..3a06a1e98 100644 --- a/src/server/game/Scripting/ScriptDefines/AccountScript.h +++ b/src/server/game/Scripting/ScriptDefines/AccountScript.h @@ -19,6 +19,7 @@ #define SCRIPT_OBJECT_ACCOUNT_SCRIPT_H_ #include "ScriptObject.h" +#include enum AccountHook { diff --git a/src/server/game/Scripting/ScriptDefines/ArenaScript.h b/src/server/game/Scripting/ScriptDefines/ArenaScript.h index ff0121335..bbc18e2b2 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaScript.h +++ b/src/server/game/Scripting/ScriptDefines/ArenaScript.h @@ -20,6 +20,7 @@ #include "ObjectGuid.h" #include "ScriptObject.h" +#include enum ArenaHook { diff --git a/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h b/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h index 319576b40..0e80dee80 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h +++ b/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.h @@ -20,6 +20,7 @@ #include "Battleground.h" #include "ScriptObject.h" +#include enum ArenaTeamHook { diff --git a/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.h b/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.h index 1134e028a..e2d014b97 100644 --- a/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.h +++ b/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.h @@ -19,6 +19,7 @@ #define SCRIPT_OBJECT_AUCTION_HOUSE_SCRIPT_H_ #include "ScriptObject.h" +#include enum AuctionHouseHook { diff --git a/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.h b/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.h index 0893cc207..82f80af6c 100644 --- a/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.h +++ b/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.h @@ -20,6 +20,7 @@ #include "Object.h" #include "ScriptObject.h" +#include enum MovementHook { diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index c42a3ce14..d27ff9849 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -77,6 +77,12 @@ void ScriptMgr::Initialize() _script_loader_callback(); _modules_loader_callback(); + + ScriptRegistry::InitEnabledHooksIfNeeded(PLAYERHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(AUCTIONHOUSEHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ARENATEAMHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ARENAHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(MOVEMENTHOOK_END); } void ScriptMgr::Unload() diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index f01ccadd5..522d127c2 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -725,6 +725,11 @@ public: // With this approach, we wouldn't call all available hooks in case if we override just one hook. static EnabledHooksVector EnabledHooks; + static void InitEnabledHooksIfNeeded(uint16 totalAvailableHooks) + { + EnabledHooks.resize(totalAvailableHooks); + } + static void AddScript(TScript* const script, std::vector enabledHooks = {}) { ASSERT(script); @@ -733,7 +738,7 @@ public: return; if (EnabledHooks.empty()) - EnabledHooks.resize(script->GetTotalAvailableHooks()); + InitEnabledHooksIfNeeded(script->GetTotalAvailableHooks()); if (script->isAfterLoadScript()) { From 97fc546c4bf5d438b4886cae2d261d9ca3d3a996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:50:44 +0800 Subject: [PATCH 11/45] refactor(Core/Scripts): Optimize Script (#18708) * Add files via upload * Update PlayerScript.h --- .../Scripting/ScriptDefines/AccountScript.cpp | 2 +- .../Scripting/ScriptDefines/ArenaScript.cpp | 2 +- .../ScriptDefines/ArenaTeamScript.cpp | 2 +- .../ScriptDefines/AuctionHouseScript.cpp | 2 +- .../ScriptDefines/MovementHandlerScript.cpp | 2 +- .../Scripting/ScriptDefines/PlayerScript.cpp | 33 ++++++++----------- .../Scripting/ScriptDefines/PlayerScript.h | 4 ++- 7 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/AccountScript.cpp b/src/server/game/Scripting/ScriptDefines/AccountScript.cpp index 0858d8b4a..2749cd1a7 100644 --- a/src/server/game/Scripting/ScriptDefines/AccountScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AccountScript.cpp @@ -69,7 +69,7 @@ AccountScript::AccountScript(char const* name, std::vector enabledHooks) { // If empty - enable all available hooks. if (enabledHooks.empty()) - for (uint16 i = 0; i < ACCOUNTHOOK_END; i++) + for (uint16 i = 0; i < ACCOUNTHOOK_END; ++i) enabledHooks.emplace_back(i); ScriptRegistry::AddScript(this, std::move(enabledHooks)); diff --git a/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp b/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp index 96e0c7a16..fd3a8dcdf 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ArenaScript.cpp @@ -39,7 +39,7 @@ ArenaScript::ArenaScript(const char* name, std::vector enabledHooks) { // If empty - enable all available hooks. if (enabledHooks.empty()) - for (uint16 i = 0; i < ARENAHOOK_END; i++) + for (uint16 i = 0; i < ARENAHOOK_END; ++i) enabledHooks.emplace_back(i); ScriptRegistry::AddScript(this, std::move(enabledHooks)); diff --git a/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.cpp b/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.cpp index 8abad7dd5..e232e646a 100644 --- a/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ArenaTeamScript.cpp @@ -49,7 +49,7 @@ ArenaTeamScript::ArenaTeamScript(const char* name, std::vector enabledHo { // If empty - enable all available hooks. if (enabledHooks.empty()) - for (uint16 i = 0; i < ARENATEAMHOOK_END; i++) + for (uint16 i = 0; i < ARENATEAMHOOK_END; ++i) enabledHooks.emplace_back(i); ScriptRegistry::AddScript(this, std::move(enabledHooks)); diff --git a/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.cpp b/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.cpp index 8247c28fd..be3e010cf 100644 --- a/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AuctionHouseScript.cpp @@ -91,7 +91,7 @@ AuctionHouseScript::AuctionHouseScript(const char* name, std::vector ena { // If empty - enable all available hooks. if (enabledHooks.empty()) - for (uint16 i = 0; i < AUCTIONHOUSEHOOK_END; i++) + for (uint16 i = 0; i < AUCTIONHOUSEHOOK_END; ++i) enabledHooks.emplace_back(i); ScriptRegistry::AddScript(this, std::move(enabledHooks)); diff --git a/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.cpp b/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.cpp index c10f04014..a0fa539b9 100644 --- a/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/MovementHandlerScript.cpp @@ -29,7 +29,7 @@ MovementHandlerScript::MovementHandlerScript(const char* name, std::vector::AddScript(this, std::move(enabledHooks)); diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp index 53e79fd39..948a0dc58 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp @@ -41,9 +41,7 @@ void ScriptMgr::OnPlayerCompleteQuest(Player* player, Quest const* quest) void ScriptMgr::OnSendInitialPacketsBeforeAddToMap(Player* player, WorldPacket& data) { - CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_SEND_INITIAL_PACKETS_BEFORE_ADD_TO_MAP, { - script->OnSendInitialPacketsBeforeAddToMap(player, data); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_SEND_INITIAL_PACKETS_BEFORE_ADD_TO_MAP, script->OnSendInitialPacketsBeforeAddToMap(player, data)); } void ScriptMgr::OnBattlegroundDesertion(Player* player, BattlegroundDesertionType const desertionType) @@ -73,17 +71,17 @@ void ScriptMgr::OnPVPKill(Player* killer, Player* killed) void ScriptMgr::OnPlayerPVPFlagChange(Player* player, bool state) { - CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_PVP_FLAG_CHANGE,script->OnPlayerPVPFlagChange(player, state)); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_PVP_FLAG_CHANGE, script->OnPlayerPVPFlagChange(player, state)); } void ScriptMgr::OnCreatureKill(Player* killer, Creature* killed) { - CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CREATURE_KILL,script->OnCreatureKill(killer, killed)); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CREATURE_KILL, script->OnCreatureKill(killer, killed)); } void ScriptMgr::OnCreatureKilledByPet(Player* petOwner, Creature* killed) { - CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CREATURE_KILLED_BY_PET,script->OnCreatureKilledByPet(petOwner, killed)); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CREATURE_KILLED_BY_PET, script->OnCreatureKilledByPet(petOwner, killed)); } void ScriptMgr::OnPlayerKilledByCreature(Creature* killer, Player* killed) @@ -198,11 +196,7 @@ void ScriptMgr::OnPlayerEmote(Player* player, uint32 emote) void ScriptMgr::OnPlayerTextEmote(Player* player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid) { - CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_TEXT_EMOTE, - ( - script->OnTextEmote(player, textEmote, emoteNum, guid) - ) - ); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_TEXT_EMOTE, script->OnTextEmote(player, textEmote, emoteNum, guid)); } void ScriptMgr::OnPlayerSpellCast(Player* player, Spell* spell, bool skipCheck) @@ -605,11 +599,13 @@ bool ScriptMgr::OnPlayerHasActivePowerType(Player const* player, Powers power) CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_HAS_ACTIVE_POWER_TYPE, !script->OnPlayerHasActivePowerType(player, power)); } -void ScriptMgr::OnUpdateGatheringSkill(Player *player, uint32 skillId, uint32 currentLevel, uint32 gray, uint32 green, uint32 yellow, uint32 &gain) { +void ScriptMgr::OnUpdateGatheringSkill(Player *player, uint32 skillId, uint32 currentLevel, uint32 gray, uint32 green, uint32 yellow, uint32 &gain) +{ CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_UPDATE_GATHERING_SKILL, script->OnUpdateGatheringSkill(player, skillId, currentLevel, gray, green, yellow, gain)); } -void ScriptMgr::OnUpdateCraftingSkill(Player *player, SkillLineAbilityEntry const* skill, uint32 currentLevel, uint32& gain) { +void ScriptMgr::OnUpdateCraftingSkill(Player *player, SkillLineAbilityEntry const* skill, uint32 currentLevel, uint32& gain) +{ CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_UPDATE_CRAFTING_SKILL, script->OnUpdateCraftingSkill(player, skill, currentLevel, gain)); } @@ -755,16 +751,12 @@ void ScriptMgr::OnFfaPvpStateUpdate(Player* player, bool result) void ScriptMgr::OnIsPvP(Player* player, bool& result) { - CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_IS_PVP, { - script->OnIsPvP(player, result); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_IS_PVP, script->OnIsPvP(player, result)); } void ScriptMgr::OnGetMaxSkillValueForLevel(Player* player, uint16& result) { - CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GET_MAX_SKILL_VALUE_FOR_LEVEL, { - script->OnGetMaxSkillValueForLevel(player, result); - }); + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GET_MAX_SKILL_VALUE_FOR_LEVEL, script->OnGetMaxSkillValueForLevel(player, result)); } bool ScriptMgr::NotSetArenaTeamInfoField(Player* player, uint8 slot, ArenaTeamInfoType type, uint32 value) @@ -882,6 +874,7 @@ void ScriptMgr::AnticheatUpdateMovementInfo(Player* player, MovementInfo const& { CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ANTICHEAT_UPDATE_MOVEMENT_INFO, script->AnticheatUpdateMovementInfo(player, movementInfo)); } + bool ScriptMgr::AnticheatHandleDoubleJump(Player* player, Unit* mover) { CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ANTICHEAT_HANDLE_DOUBLE_JUMP, !script->AnticheatHandleDoubleJump(player, mover)); @@ -897,7 +890,7 @@ PlayerScript::PlayerScript(const char* name, std::vector enabledHooks) { // If empty - enable all available hooks. if (enabledHooks.empty()) - for (uint16 i = 0; i < PLAYERHOOK_END; i++) + for (uint16 i = 0; i < PLAYERHOOK_END; ++i) enabledHooks.emplace_back(i); ScriptRegistry::AddScript(this, std::move(enabledHooks)); diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.h b/src/server/game/Scripting/ScriptDefines/PlayerScript.h index a834e82a1..4ef3cd4ba 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.h +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.h @@ -19,12 +19,14 @@ #define SCRIPT_OBJECT_PLAYER_SCRIPT_H_ #include "ScriptObject.h" +#include // TODO to remove #include "AchievementMgr.h" #include "KillRewarder.h" -enum PlayerHook { +enum PlayerHook +{ PLAYERHOOK_ON_PLAYER_JUST_DIED, PLAYERHOOK_ON_PLAYER_RELEASED_GHOST, PLAYERHOOK_ON_SEND_INITIAL_PACKETS_BEFORE_ADD_TO_MAP, From bf4f9774c15c224b6aa3632e54f7db2f59cff3c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:52:43 +0800 Subject: [PATCH 12/45] feat(Core/Scripts): Optimize DatabaseScript (#18709) Add files via upload --- .../ScriptDefines/DatabaseScript.cpp | 20 +++++++++---------- .../Scripting/ScriptDefines/DatabaseScript.h | 9 ++++++++- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/DatabaseScript.cpp b/src/server/game/Scripting/ScriptDefines/DatabaseScript.cpp index fcb21f187..550564373 100644 --- a/src/server/game/Scripting/ScriptDefines/DatabaseScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/DatabaseScript.cpp @@ -21,23 +21,23 @@ void ScriptMgr::OnAfterDatabasesLoaded(uint32 updateFlags) { - ExecuteScript([&](DatabaseScript* script) - { - script->OnAfterDatabasesLoaded(updateFlags); - }); + CALL_ENABLED_HOOKS(DatabaseScript, DATABASEHOOK_ON_AFTER_DATABASES_LOADED, script->OnAfterDatabasesLoaded(updateFlags)); } void ScriptMgr::OnAfterDatabaseLoadCreatureTemplates(std::vector creatureTemplates) { - ExecuteScript([&](DatabaseScript* script) - { - script->OnAfterDatabaseLoadCreatureTemplates(creatureTemplates); - }); + CALL_ENABLED_HOOKS(DatabaseScript, DATABASEHOOK_ON_AFTER_DATABASE_LOAD_CREATURETEMPLATES, script->OnAfterDatabaseLoadCreatureTemplates(creatureTemplates)); } -DatabaseScript::DatabaseScript(const char* name) : ScriptObject(name) +DatabaseScript::DatabaseScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, DATABASEHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < DATABASEHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/DatabaseScript.h b/src/server/game/Scripting/ScriptDefines/DatabaseScript.h index c975626d4..3340676fa 100644 --- a/src/server/game/Scripting/ScriptDefines/DatabaseScript.h +++ b/src/server/game/Scripting/ScriptDefines/DatabaseScript.h @@ -21,11 +21,18 @@ #include "ScriptObject.h" #include +enum DatabaseHook +{ + DATABASEHOOK_ON_AFTER_DATABASES_LOADED, + DATABASEHOOK_ON_AFTER_DATABASE_LOAD_CREATURETEMPLATES, + DATABASEHOOK_END +}; + class DatabaseScript : public ScriptObject { protected: - DatabaseScript(const char* name); + DatabaseScript(const char* name, std::vector enabledHooks = std::vector()); public: From f0a21100c54561a38552ae1b60912b9db7848bd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:53:08 +0800 Subject: [PATCH 13/45] feat(Core/Scripts): Optimize FormulaScript (#18710) * Add files via upload * Update FormulaScript.h --- .../Scripting/ScriptDefines/FormulaScript.cpp | 56 ++++++------------- .../Scripting/ScriptDefines/FormulaScript.h | 17 +++++- 2 files changed, 33 insertions(+), 40 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/FormulaScript.cpp b/src/server/game/Scripting/ScriptDefines/FormulaScript.cpp index d9b276f78..7eb79ae0e 100644 --- a/src/server/game/Scripting/ScriptDefines/FormulaScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/FormulaScript.cpp @@ -21,42 +21,27 @@ void ScriptMgr::OnHonorCalculation(float& honor, uint8 level, float multiplier) { - ExecuteScript([&](FormulaScript* script) - { - script->OnHonorCalculation(honor, level, multiplier); - }); + CALL_ENABLED_HOOKS(FormulaScript, FORMULAHOOK_ON_HONOR_CALCULATION, script->OnHonorCalculation(honor, level, multiplier)); } void ScriptMgr::OnGrayLevelCalculation(uint8& grayLevel, uint8 playerLevel) { - ExecuteScript([&](FormulaScript* script) - { - script->OnGrayLevelCalculation(grayLevel, playerLevel); - }); + CALL_ENABLED_HOOKS(FormulaScript, FORMULAHOOK_ON_GRAY_LEVEL_CALCULATION, script->OnGrayLevelCalculation(grayLevel, playerLevel)); } void ScriptMgr::OnColorCodeCalculation(XPColorChar& color, uint8 playerLevel, uint8 mobLevel) { - ExecuteScript([&](FormulaScript* script) - { - script->OnColorCodeCalculation(color, playerLevel, mobLevel); - }); + CALL_ENABLED_HOOKS(FormulaScript, FORMULAHOOK_ON_COLOR_CODE_CALCULATION, script->OnColorCodeCalculation(color, playerLevel, mobLevel)); } void ScriptMgr::OnZeroDifferenceCalculation(uint8& diff, uint8 playerLevel) { - ExecuteScript([&](FormulaScript* script) - { - script->OnZeroDifferenceCalculation(diff, playerLevel); - }); + CALL_ENABLED_HOOKS(FormulaScript, FORMULAHOOK_ON_ZERO_DIFFERENCE_CALCULATION, script->OnZeroDifferenceCalculation(diff, playerLevel)); } void ScriptMgr::OnBaseGainCalculation(uint32& gain, uint8 playerLevel, uint8 mobLevel, ContentLevels content) { - ExecuteScript([&](FormulaScript* script) - { - script->OnBaseGainCalculation(gain, playerLevel, mobLevel, content); - }); + CALL_ENABLED_HOOKS(FormulaScript, FORMULAHOOK_ON_BASE_GAIN_CALCULATION, script->OnBaseGainCalculation(gain, playerLevel, mobLevel, content)); } void ScriptMgr::OnGainCalculation(uint32& gain, Player* player, Unit* unit) @@ -64,40 +49,33 @@ void ScriptMgr::OnGainCalculation(uint32& gain, Player* player, Unit* unit) ASSERT(player); ASSERT(unit); - ExecuteScript([&](FormulaScript* script) - { - script->OnGainCalculation(gain, player, unit); - }); + CALL_ENABLED_HOOKS(FormulaScript, FORMULAHOOK_ON_GAIN_CALCULATION, script->OnGainCalculation(gain, player, unit)); } void ScriptMgr::OnGroupRateCalculation(float& rate, uint32 count, bool isRaid) { - ExecuteScript([&](FormulaScript* script) - { - script->OnGroupRateCalculation(rate, count, isRaid); - }); + CALL_ENABLED_HOOKS(FormulaScript, FORMULAHOOK_ON_GROUP_RATE_CALCULATION, script->OnGroupRateCalculation(rate, count, isRaid)); } void ScriptMgr::OnAfterArenaRatingCalculation(Battleground* const bg, int32& winnerMatchmakerChange, int32& loserMatchmakerChange, int32& winnerChange, int32& loserChange) { - ExecuteScript([&](FormulaScript* script) - { - script->OnAfterArenaRatingCalculation(bg, winnerMatchmakerChange, loserMatchmakerChange, winnerChange, loserChange); - }); + CALL_ENABLED_HOOKS(FormulaScript, FORMULAHOOK_ON_AFTER_ARENA_RATING_CALCULATION, script->OnAfterArenaRatingCalculation(bg, winnerMatchmakerChange, loserMatchmakerChange, winnerChange, loserChange)); } void ScriptMgr::OnBeforeUpdatingPersonalRating(int32& mod, uint32 type) { - ExecuteScript([&](FormulaScript* script) - { - script->OnBeforeUpdatingPersonalRating(mod, type); - }); + CALL_ENABLED_HOOKS(FormulaScript, FORMULAHOOK_ON_BEFORE_UPDATING_PERSONAL_RATING, script->OnBeforeUpdatingPersonalRating(mod, type)); } -FormulaScript::FormulaScript(const char* name) - : ScriptObject(name) +FormulaScript::FormulaScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, FORMULAHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < FORMULAHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/FormulaScript.h b/src/server/game/Scripting/ScriptDefines/FormulaScript.h index 7f664be16..2145e0f0c 100644 --- a/src/server/game/Scripting/ScriptDefines/FormulaScript.h +++ b/src/server/game/Scripting/ScriptDefines/FormulaScript.h @@ -19,13 +19,28 @@ #define SCRIPT_OBJECT_FORMULA_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum FormulaHook +{ + FORMULAHOOK_ON_HONOR_CALCULATION, + FORMULAHOOK_ON_GRAY_LEVEL_CALCULATION, + FORMULAHOOK_ON_COLOR_CODE_CALCULATION, + FORMULAHOOK_ON_ZERO_DIFFERENCE_CALCULATION, + FORMULAHOOK_ON_BASE_GAIN_CALCULATION, + FORMULAHOOK_ON_GAIN_CALCULATION, + FORMULAHOOK_ON_GROUP_RATE_CALCULATION, + FORMULAHOOK_ON_AFTER_ARENA_RATING_CALCULATION, + FORMULAHOOK_ON_BEFORE_UPDATING_PERSONAL_RATING, + FORMULAHOOK_END +}; enum XPColorChar : uint8; class FormulaScript : public ScriptObject { protected: - FormulaScript(const char* name); + FormulaScript(const char* name, std::vector enabledHooks = std::vector()); public: // Called after calculating honor. From 130044fb0139c34380cf9d725747e4866fa9924b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:53:26 +0800 Subject: [PATCH 14/45] feat(Core/Scripts): Optimize GlobalScript (#18712) * Add files via upload * Update GlobalScript.h --- .../Scripting/ScriptDefines/GlobalScript.cpp | 161 ++++-------------- .../Scripting/ScriptDefines/GlobalScript.h | 28 ++- 2 files changed, 59 insertions(+), 130 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp b/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp index 86fe0ae8c..17712d132 100644 --- a/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp @@ -26,180 +26,87 @@ void ScriptMgr::OnGlobalItemDelFromDB(CharacterDatabaseTransaction trans, Object ASSERT(trans); ASSERT(itemGuid); - ExecuteScript([&](GlobalScript* script) - { - script->OnItemDelFromDB(trans, itemGuid); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_ITEM_DEL_FROM_DB, script->OnItemDelFromDB(trans, itemGuid)); } void ScriptMgr::OnGlobalMirrorImageDisplayItem(Item const* item, uint32& display) { - ExecuteScript([&](GlobalScript* script) - { - script->OnMirrorImageDisplayItem(item, display); - }); -} - -void ScriptMgr::OnBeforeUpdateArenaPoints(ArenaTeam* at, std::map& ap) -{ - ExecuteScript([&](GlobalScript* script) - { - script->OnBeforeUpdateArenaPoints(at, ap); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_MIRRORIMAGE_DISPLAY_ITEM, script->OnMirrorImageDisplayItem(item, display)); } void ScriptMgr::OnAfterRefCount(Player const* player, Loot& loot, bool canRate, uint16 lootMode, LootStoreItem* LootStoreItem, uint32& maxcount, LootStore const& store) { - ExecuteScript([&](GlobalScript* script) - { - script->OnAfterRefCount(player, LootStoreItem, loot, canRate, lootMode, maxcount, store); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_AFTER_REF_COUNT, script->OnAfterRefCount(player, LootStoreItem, loot, canRate, lootMode, maxcount, store)); } void ScriptMgr::OnAfterCalculateLootGroupAmount(Player const* player, Loot& loot, uint16 lootMode, uint32& groupAmount, LootStore const& store) { - ExecuteScript([&](GlobalScript* script) - { - script->OnAfterCalculateLootGroupAmount(player, loot, lootMode, groupAmount, store); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_AFTER_CALCULATE_LOOT_GROUP_AMOUNT, script->OnAfterCalculateLootGroupAmount(player, loot, lootMode, groupAmount, store)); } void ScriptMgr::OnBeforeDropAddItem(Player const* player, Loot& loot, bool canRate, uint16 lootMode, LootStoreItem* LootStoreItem, LootStore const& store) { - ExecuteScript([&](GlobalScript* script) - { - script->OnBeforeDropAddItem(player, loot, canRate, lootMode, LootStoreItem, store); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_BEFORE_DROP_ADD_ITEM, script->OnBeforeDropAddItem(player, loot, canRate, lootMode, LootStoreItem, store)); } bool ScriptMgr::OnItemRoll(Player const* player, LootStoreItem const* lootStoreItem, float& chance, Loot& loot, LootStore const& store) { - auto ret = IsValidBoolScript([&](GlobalScript* script) - { - return !script->OnItemRoll(player, lootStoreItem, chance, loot, store); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(GlobalScript, GLOBALHOOK_ON_ITEM_ROLL, !script->OnItemRoll(player, lootStoreItem, chance, loot, store)); } bool ScriptMgr::OnBeforeLootEqualChanced(Player const* player, LootStoreItemList equalChanced, Loot& loot, LootStore const& store) { - auto ret = IsValidBoolScript([&](GlobalScript* script) - { - return !script->OnBeforeLootEqualChanced(player, equalChanced, loot, store); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(GlobalScript, GLOBALHOOK_ON_BEFORE_LOOT_EQUAL_CHANCED, !script->OnBeforeLootEqualChanced(player, equalChanced, loot, store)); } void ScriptMgr::OnInitializeLockedDungeons(Player* player, uint8& level, uint32& lockData, lfg::LFGDungeonData const* dungeon) { - ExecuteScript([&](GlobalScript* script) - { - script->OnInitializeLockedDungeons(player, level, lockData, dungeon); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_INITIALIZE_LOCKED_DUNGEONS, script->OnInitializeLockedDungeons(player, level, lockData, dungeon)); } void ScriptMgr::OnAfterInitializeLockedDungeons(Player* player) { - ExecuteScript([&](GlobalScript* script) - { - script->OnAfterInitializeLockedDungeons(player); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_AFTER_INITIALIZE_LOCKED_DUNGEONS, script->OnAfterInitializeLockedDungeons(player)); +} + +void ScriptMgr::OnBeforeUpdateArenaPoints(ArenaTeam* at, std::map& ap) +{ + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_BEFORE_UPDATE_ARENA_POINTS, script->OnBeforeUpdateArenaPoints(at, ap)); } void ScriptMgr::OnAfterUpdateEncounterState(Map* map, EncounterCreditType type, uint32 creditEntry, Unit* source, Difficulty difficulty_fixed, DungeonEncounterList const* encounters, uint32 dungeonCompleted, bool updated) { - ExecuteScript([&](GlobalScript* script) - { - script->OnAfterUpdateEncounterState(map, type, creditEntry, source, difficulty_fixed, encounters, dungeonCompleted, updated); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_AFTER_UPDATE_ENCOUNTER_STATE, script->OnAfterUpdateEncounterState(map, type, creditEntry, source, difficulty_fixed, encounters, dungeonCompleted, updated)); } void ScriptMgr::OnBeforeWorldObjectSetPhaseMask(WorldObject const* worldObject, uint32& oldPhaseMask, uint32& newPhaseMask, bool& useCombinedPhases, bool& update) { - ExecuteScript([&](GlobalScript* script) - { - script->OnBeforeWorldObjectSetPhaseMask(worldObject, oldPhaseMask, newPhaseMask, useCombinedPhases, update); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_BEFORE_WORLDOBJECT_SET_PHASEMASK, script->OnBeforeWorldObjectSetPhaseMask(worldObject, oldPhaseMask, newPhaseMask, useCombinedPhases, update)); } bool ScriptMgr::OnIsAffectedBySpellModCheck(SpellInfo const* affectSpell, SpellInfo const* checkSpell, SpellModifier const* mod) { - auto ret = IsValidBoolScript([&](GlobalScript* script) - { - return !script->OnIsAffectedBySpellModCheck(affectSpell, checkSpell, mod); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(GlobalScript, GLOBALHOOK_ON_IS_AFFECTED_BY_SPELL_MOD_CHECK, !script->OnIsAffectedBySpellModCheck(affectSpell, checkSpell, mod)); } bool ScriptMgr::OnSpellHealingBonusTakenNegativeModifiers(Unit const* target, Unit const* caster, SpellInfo const* spellInfo, float& val) { - auto ret = IsValidBoolScript([&](GlobalScript* script) - { - return script->OnSpellHealingBonusTakenNegativeModifiers(target, caster, spellInfo, val); - }); - - if (ret && *ret) - { - return true; - } - - return false; + CALL_ENABLED_BOOLEAN_HOOKS(GlobalScript, GLOBALHOOK_ON_SPELL_HEALING_BONUS_TAKEN_NEGATIVE_MODIFIERS, script->OnSpellHealingBonusTakenNegativeModifiers(target, caster, spellInfo, val)); } void ScriptMgr::OnLoadSpellCustomAttr(SpellInfo* spell) { - ExecuteScript([&](GlobalScript* script) - { - script->OnLoadSpellCustomAttr(spell); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_LOAD_SPELL_CUSTOM_ATTR, script->OnLoadSpellCustomAttr(spell)); } bool ScriptMgr::OnAllowedForPlayerLootCheck(Player const* player, ObjectGuid source) { - auto ret = IsValidBoolScript([&](GlobalScript* script) - { - return script->OnAllowedForPlayerLootCheck(player, source); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(GlobalScript, GLOBALHOOK_ON_ALLOWED_FOR_PLAYER_LOOT_CHECK, script->OnAllowedForPlayerLootCheck(player, source)); } bool ScriptMgr::OnAllowedToLootContainerCheck(Player const* player, ObjectGuid source) { - auto ret = IsValidBoolScript([&](GlobalScript* script) - { - return script->OnAllowedToLootContainerCheck(player, source); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(GlobalScript, GLOBALHOOK_ON_ALLOWED_TO_LOOT_CONTAINER_CHECK, script->OnAllowedToLootContainerCheck(player, source)); } /** @@ -209,10 +116,7 @@ bool ScriptMgr::OnAllowedToLootContainerCheck(Player const* player, ObjectGuid s */ void ScriptMgr::OnInstanceIdRemoved(uint32 instanceId) { - ExecuteScript([&](GlobalScript* script) - { - script->OnInstanceIdRemoved(instanceId); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_INSTANCEID_REMOVED, script->OnInstanceIdRemoved(instanceId)); } /** @@ -226,10 +130,7 @@ void ScriptMgr::OnInstanceIdRemoved(uint32 instanceId) */ void ScriptMgr::OnBeforeSetBossState(uint32 id, EncounterState newState, EncounterState oldState, Map* instance) { - ExecuteScript([&](GlobalScript* script) - { - script->OnBeforeSetBossState(id, newState, oldState, instance); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_ON_BEFORE_SET_BOSS_STATE, script->OnBeforeSetBossState(id, newState, oldState, instance)); } /** @@ -240,16 +141,18 @@ void ScriptMgr::OnBeforeSetBossState(uint32 id, EncounterState newState, Encount */ void ScriptMgr::AfterInstanceGameObjectCreate(Map* instance, GameObject* go) { - ExecuteScript([&](GlobalScript* script) - { - script->AfterInstanceGameObjectCreate(instance, go); - }); + CALL_ENABLED_HOOKS(GlobalScript, GLOBALHOOK_AFTER_INSTANCE_GAME_OBJECT_CREATE, script->AfterInstanceGameObjectCreate(instance, go)); } -GlobalScript::GlobalScript(const char* name) - : ScriptObject(name) +GlobalScript::GlobalScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, GLOBALHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < GLOBALHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/GlobalScript.h b/src/server/game/Scripting/ScriptDefines/GlobalScript.h index 849fd3c87..e1d9d58be 100644 --- a/src/server/game/Scripting/ScriptDefines/GlobalScript.h +++ b/src/server/game/Scripting/ScriptDefines/GlobalScript.h @@ -22,12 +22,38 @@ #include "ObjectGuid.h" #include "ScriptObject.h" #include +#include + +enum GlobalHook +{ + GLOBALHOOK_ON_ITEM_DEL_FROM_DB, + GLOBALHOOK_ON_MIRRORIMAGE_DISPLAY_ITEM, + GLOBALHOOK_ON_AFTER_REF_COUNT, + GLOBALHOOK_ON_AFTER_CALCULATE_LOOT_GROUP_AMOUNT, + GLOBALHOOK_ON_BEFORE_DROP_ADD_ITEM, + GLOBALHOOK_ON_ITEM_ROLL, + GLOBALHOOK_ON_BEFORE_LOOT_EQUAL_CHANCED, + GLOBALHOOK_ON_INITIALIZE_LOCKED_DUNGEONS, + GLOBALHOOK_ON_AFTER_INITIALIZE_LOCKED_DUNGEONS, + GLOBALHOOK_ON_BEFORE_UPDATE_ARENA_POINTS, + GLOBALHOOK_ON_AFTER_UPDATE_ENCOUNTER_STATE, + GLOBALHOOK_ON_BEFORE_WORLDOBJECT_SET_PHASEMASK, + GLOBALHOOK_ON_IS_AFFECTED_BY_SPELL_MOD_CHECK, + GLOBALHOOK_ON_SPELL_HEALING_BONUS_TAKEN_NEGATIVE_MODIFIERS, + GLOBALHOOK_ON_LOAD_SPELL_CUSTOM_ATTR, + GLOBALHOOK_ON_ALLOWED_FOR_PLAYER_LOOT_CHECK, + GLOBALHOOK_ON_ALLOWED_TO_LOOT_CONTAINER_CHECK, + GLOBALHOOK_ON_INSTANCEID_REMOVED, + GLOBALHOOK_ON_BEFORE_SET_BOSS_STATE, + GLOBALHOOK_AFTER_INSTANCE_GAME_OBJECT_CREATE, + GLOBALHOOK_END +}; // following hooks can be used anywhere and are not db bounded class GlobalScript : public ScriptObject { protected: - GlobalScript(const char* name); + GlobalScript(const char* name, std::vector enabledHooks = std::vector()); public: // items From d162817d33dcf9159ee72371cb8b41e321e6da1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:53:42 +0800 Subject: [PATCH 15/45] feat(Core/Scripts): Optimize WorldScript (#18724) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update WorldScript.h * Update ScriptMgr.cpp --- .../Scripting/ScriptDefines/WorldScript.cpp | 102 ++++++------------ .../Scripting/ScriptDefines/WorldScript.h | 21 +++- src/server/game/Scripting/ScriptMgr.cpp | 25 ++++- 3 files changed, 76 insertions(+), 72 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/WorldScript.cpp b/src/server/game/Scripting/ScriptDefines/WorldScript.cpp index 0d8748734..ec53f99e3 100644 --- a/src/server/game/Scripting/ScriptDefines/WorldScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/WorldScript.cpp @@ -21,112 +21,78 @@ void ScriptMgr::OnOpenStateChange(bool open) { - ExecuteScript([&](WorldScript* script) - { - script->OnOpenStateChange(open); - }); -} - -void ScriptMgr::OnLoadCustomDatabaseTable() -{ - ExecuteScript([&](WorldScript* script) - { - script->OnLoadCustomDatabaseTable(); - }); -} - -void ScriptMgr::OnBeforeConfigLoad(bool reload) -{ - ExecuteScript([&](WorldScript* script) - { - script->OnBeforeConfigLoad(reload); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_OPEN_STATE_CHANGE, script->OnOpenStateChange(open)); } void ScriptMgr::OnAfterConfigLoad(bool reload) { - ExecuteScript([&](WorldScript* script) - { - script->OnAfterConfigLoad(reload); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_AFTER_CONFIG_LOAD, script->OnAfterConfigLoad(reload)); } -void ScriptMgr::OnBeforeFinalizePlayerWorldSession(uint32& cacheVersion) +void ScriptMgr::OnLoadCustomDatabaseTable() { - ExecuteScript([&](WorldScript* script) - { - script->OnBeforeFinalizePlayerWorldSession(cacheVersion); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_LOAD_CUSTOM_DATABASE_TABLE, script->OnLoadCustomDatabaseTable()); +} + +void ScriptMgr::OnBeforeConfigLoad(bool reload) +{ + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_BEFORE_CONFIG_LOAD, script->OnBeforeConfigLoad(reload)); } void ScriptMgr::OnMotdChange(std::string& newMotd) { - ExecuteScript([&](WorldScript* script) - { - script->OnMotdChange(newMotd); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_MOTD_CHANGE, script->OnMotdChange(newMotd)); } void ScriptMgr::OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask) { - ExecuteScript([&](WorldScript* script) - { - script->OnShutdownInitiate(code, mask); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_SHUTDOWN_INITIATE, script->OnShutdownInitiate(code, mask)); } void ScriptMgr::OnShutdownCancel() { - ExecuteScript([&](WorldScript* script) - { - script->OnShutdownCancel(); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_SHUTDOWN_CANCEL, script->OnShutdownCancel()); } void ScriptMgr::OnWorldUpdate(uint32 diff) { - ExecuteScript([&](WorldScript* script) - { - script->OnUpdate(diff); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_UPDATE, script->OnUpdate(diff)); } void ScriptMgr::OnStartup() { - ExecuteScript([&](WorldScript* script) - { - script->OnStartup(); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_STARTUP, script->OnStartup()); } void ScriptMgr::OnShutdown() { - ExecuteScript([&](WorldScript* script) - { - script->OnShutdown(); - }); -} - -void ScriptMgr::OnBeforeWorldInitialized() -{ - ExecuteScript([&](WorldScript* script) - { - script->OnBeforeWorldInitialized(); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_SHUTDOWN, script->OnShutdown()); } void ScriptMgr::OnAfterUnloadAllMaps() { - ExecuteScript([](WorldScript* script) - { - script->OnAfterUnloadAllMaps(); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_AFTER_UNLOAD_ALL_MAPS, script->OnAfterUnloadAllMaps()); } -WorldScript::WorldScript(const char* name) : - ScriptObject(name) +void ScriptMgr::OnBeforeFinalizePlayerWorldSession(uint32& cacheVersion) { - ScriptRegistry::AddScript(this); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_BEFORE_FINALIZE_PLAYER_WORLD_SESSION, script->OnBeforeFinalizePlayerWorldSession(cacheVersion)); +} + +void ScriptMgr::OnBeforeWorldInitialized() +{ + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_BEFORE_WORLD_INITIALIZED, script->OnBeforeWorldInitialized()); +} + +WorldScript::WorldScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, WORLDHOOK_END) +{ + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < WORLDHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/WorldScript.h b/src/server/game/Scripting/ScriptDefines/WorldScript.h index a9fdbb64a..c7f715a0a 100644 --- a/src/server/game/Scripting/ScriptDefines/WorldScript.h +++ b/src/server/game/Scripting/ScriptDefines/WorldScript.h @@ -19,11 +19,30 @@ #define SCRIPT_OBJECT_WORLD_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum WorldHook +{ + WORLDHOOK_ON_OPEN_STATE_CHANGE, + WORLDHOOK_ON_AFTER_CONFIG_LOAD, + WORLDHOOK_ON_LOAD_CUSTOM_DATABASE_TABLE, + WORLDHOOK_ON_BEFORE_CONFIG_LOAD, + WORLDHOOK_ON_MOTD_CHANGE, + WORLDHOOK_ON_SHUTDOWN_INITIATE, + WORLDHOOK_ON_SHUTDOWN_CANCEL, + WORLDHOOK_ON_UPDATE, + WORLDHOOK_ON_STARTUP, + WORLDHOOK_ON_SHUTDOWN, + WORLDHOOK_ON_AFTER_UNLOAD_ALL_MAPS, + WORLDHOOK_ON_BEFORE_FINALIZE_PLAYER_WORLD_SESSION, + WORLDHOOK_ON_BEFORE_WORLD_INITIALIZED, + WORLDHOOK_END +}; class WorldScript : public ScriptObject { protected: - WorldScript(const char* name); + WorldScript(const char* name, std::vector enabledHooks = std::vector()); public: // Called when the open/closed state of the world changes. diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index d27ff9849..25096ccf9 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -78,11 +78,30 @@ void ScriptMgr::Initialize() _script_loader_callback(); _modules_loader_callback(); - ScriptRegistry::InitEnabledHooksIfNeeded(PLAYERHOOK_END); - ScriptRegistry::InitEnabledHooksIfNeeded(AUCTIONHOUSEHOOK_END); - ScriptRegistry::InitEnabledHooksIfNeeded(ARENATEAMHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ACCOUNTHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ACHIEVEMENTHOOK_END); ScriptRegistry::InitEnabledHooksIfNeeded(ARENAHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ARENATEAMHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(AUCTIONHOUSEHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ALLBATTLEGROUNDHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ALLCOMMANDHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(DATABASEHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(FORMULAHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(GAMEEVENTHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(GLOBALHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(GROUPHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(GUILDHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(LOOTHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(MAILHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(MISCHOOK_END); ScriptRegistry::InitEnabledHooksIfNeeded(MOVEMENTHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(PETHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(PLAYERHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(SERVERHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ALLSPELLHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(UNITHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(WORLDOBJECTHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(WORLDHOOK_END); } void ScriptMgr::Unload() From 83c4562f3d4356f7c6fe279e072331840f06dadb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:53:59 +0800 Subject: [PATCH 16/45] feat(Core/Scripts): Optimize WorldObjectScript (#18723) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update WorldObjectScript.h --- .../ScriptDefines/WorldObjectScript.cpp | 35 +++++++------------ .../ScriptDefines/WorldObjectScript.h | 13 ++++++- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/WorldObjectScript.cpp b/src/server/game/Scripting/ScriptDefines/WorldObjectScript.cpp index f9fa1c781..5a5a8de26 100644 --- a/src/server/game/Scripting/ScriptDefines/WorldObjectScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/WorldObjectScript.cpp @@ -23,55 +23,46 @@ void ScriptMgr::OnWorldObjectDestroy(WorldObject* object) { ASSERT(object); - ExecuteScript([&](WorldObjectScript* script) - { - script->OnWorldObjectDestroy(object); - }); + CALL_ENABLED_HOOKS(WorldObjectScript, WORLDOBJECTHOOK_ON_WORLD_OBJECT_DESTROY, script->OnWorldObjectDestroy(object)); } void ScriptMgr::OnWorldObjectCreate(WorldObject* object) { ASSERT(object); - ExecuteScript([&](WorldObjectScript* script) - { - script->OnWorldObjectCreate(object); - }); + CALL_ENABLED_HOOKS(WorldObjectScript, WORLDOBJECTHOOK_ON_WORLD_OBJECT_CREATE, script->OnWorldObjectCreate(object)); } void ScriptMgr::OnWorldObjectSetMap(WorldObject* object, Map* map) { ASSERT(object); - ExecuteScript([&](WorldObjectScript* script) - { - script->OnWorldObjectSetMap(object, map); - }); + CALL_ENABLED_HOOKS(WorldObjectScript, WORLDOBJECTHOOK_ON_WORLD_OBJECT_SET_MAP, script->OnWorldObjectSetMap(object, map)); } void ScriptMgr::OnWorldObjectResetMap(WorldObject* object) { ASSERT(object); - ExecuteScript([&](WorldObjectScript* script) - { - script->OnWorldObjectResetMap(object); - }); + CALL_ENABLED_HOOKS(WorldObjectScript, WORLDOBJECTHOOK_ON_WORLD_OBJECT_RESET_MAP, script->OnWorldObjectResetMap(object)); } void ScriptMgr::OnWorldObjectUpdate(WorldObject* object, uint32 diff) { ASSERT(object); - ExecuteScript([&](WorldObjectScript* script) - { - script->OnWorldObjectUpdate(object, diff); - }); + CALL_ENABLED_HOOKS(WorldObjectScript, WORLDOBJECTHOOK_ON_WORLD_OBJECT_UPDATE, script->OnWorldObjectUpdate(object, diff)); } -WorldObjectScript::WorldObjectScript(const char* name) : ScriptObject(name) +WorldObjectScript::WorldObjectScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, WORLDOBJECTHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < WORLDOBJECTHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/WorldObjectScript.h b/src/server/game/Scripting/ScriptDefines/WorldObjectScript.h index 6f1a17c4f..84398629e 100644 --- a/src/server/game/Scripting/ScriptDefines/WorldObjectScript.h +++ b/src/server/game/Scripting/ScriptDefines/WorldObjectScript.h @@ -19,11 +19,22 @@ #define SCRIPT_OBJECT_WORLD_OBJECT_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum WorldObjectHook +{ + WORLDOBJECTHOOK_ON_WORLD_OBJECT_DESTROY, + WORLDOBJECTHOOK_ON_WORLD_OBJECT_CREATE, + WORLDOBJECTHOOK_ON_WORLD_OBJECT_SET_MAP, + WORLDOBJECTHOOK_ON_WORLD_OBJECT_RESET_MAP, + WORLDOBJECTHOOK_ON_WORLD_OBJECT_UPDATE, + WORLDOBJECTHOOK_END +}; class WorldObjectScript : public ScriptObject { protected: - WorldObjectScript(const char* name); + WorldObjectScript(const char* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } From 8d20a25e96c9eab5e1ce69e6f248b4bfb9a18fd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:54:20 +0800 Subject: [PATCH 17/45] feat(Core/Scripts): Optimize UnitScript (#18722) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update UnitScript.h --- .../Scripting/ScriptDefines/UnitScript.cpp | 327 ++++++------------ .../game/Scripting/ScriptDefines/UnitScript.h | 30 +- 2 files changed, 141 insertions(+), 216 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/UnitScript.cpp b/src/server/game/Scripting/ScriptDefines/UnitScript.cpp index f493b5166..a2921264d 100644 --- a/src/server/game/Scripting/ScriptDefines/UnitScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/UnitScript.cpp @@ -19,6 +19,36 @@ #include "ScriptMgr.h" #include "ScriptMgrMacros.h" +void ScriptMgr::OnHeal(Unit* healer, Unit* reciever, uint32& gain) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_HEAL, script->OnHeal(healer, reciever, gain)); +} + +void ScriptMgr::OnDamage(Unit* attacker, Unit* victim, uint32& damage) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_DAMAGE, script->OnDamage(attacker, victim, damage)); +} + +void ScriptMgr::ModifyPeriodicDamageAurasTick(Unit* target, Unit* attacker, uint32& damage, SpellInfo const* spellInfo) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_MODIFY_PERIODIC_DAMAGE_AURAS_TICK, script->ModifyPeriodicDamageAurasTick(target, attacker, damage, spellInfo)); +} + +void ScriptMgr::ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_MODIFY_MELEE_DAMAGE, script->ModifyMeleeDamage(target, attacker, damage)); +} + +void ScriptMgr::ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage, SpellInfo const* spellInfo) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_MODIFY_SPELL_DAMAGE_TAKEN, script->ModifySpellDamageTaken(target, attacker, damage, spellInfo)); +} + +void ScriptMgr::ModifyHealReceived(Unit* target, Unit* healer, uint32& heal, SpellInfo const* spellInfo) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_MODIFY_HEAL_RECEIVED, script->ModifyHealReceived(target, healer, heal, spellInfo)); +} + uint32 ScriptMgr::DealDamage(Unit* AttackerUnit, Unit* pVictim, uint32 damage, DamageEffectType damagetype) { if (ScriptRegistry::ScriptPointerList.empty()) @@ -38,231 +68,98 @@ uint32 ScriptMgr::DealDamage(Unit* AttackerUnit, Unit* pVictim, uint32 damage, D return damage; } -void ScriptMgr::OnHeal(Unit* healer, Unit* reciever, uint32& gain) -{ - ExecuteScript([&](UnitScript* script) - { - script->OnHeal(healer, reciever, gain); - }); -} - -void ScriptMgr::OnDamage(Unit* attacker, Unit* victim, uint32& damage) -{ - ExecuteScript([&](UnitScript* script) - { - script->OnDamage(attacker, victim, damage); - }); -} - -void ScriptMgr::ModifyPeriodicDamageAurasTick(Unit* target, Unit* attacker, uint32& damage, SpellInfo const* spellInfo) -{ - ExecuteScript([&](UnitScript* script) - { - script->ModifyPeriodicDamageAurasTick(target, attacker, damage, spellInfo); - }); -} - -void ScriptMgr::ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage) -{ - ExecuteScript([&](UnitScript* script) - { - script->ModifyMeleeDamage(target, attacker, damage); - }); -} - -void ScriptMgr::ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage, SpellInfo const* spellInfo) -{ - ExecuteScript([&](UnitScript* script) - { - script->ModifySpellDamageTaken(target, attacker, damage, spellInfo); - }); -} - -void ScriptMgr::ModifyHealReceived(Unit* target, Unit* healer, uint32& heal, SpellInfo const* spellInfo) -{ - ExecuteScript([&](UnitScript* script) - { - script->ModifyHealReceived(target, healer, heal, spellInfo); - }); -} - void ScriptMgr::OnBeforeRollMeleeOutcomeAgainst(Unit const* attacker, Unit const* victim, WeaponAttackType attType, int32& attackerMaxSkillValueForLevel, int32& victimMaxSkillValueForLevel, int32& attackerWeaponSkill, int32& victimDefenseSkill, int32& crit_chance, int32& miss_chance, int32& dodge_chance, int32& parry_chance, int32& block_chance) { - ExecuteScript([&](UnitScript* script) - { - script->OnBeforeRollMeleeOutcomeAgainst(attacker, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance); - }); -} - -void ScriptMgr::OnAuraRemove(Unit* unit, AuraApplication* aurApp, AuraRemoveMode mode) -{ - ExecuteScript([&](UnitScript* script) - { - script->OnAuraRemove(unit, aurApp, mode); - }); -} - -bool ScriptMgr::IfNormalReaction(Unit const* unit, Unit const* target, ReputationRank& repRank) -{ - auto ret = IsValidBoolScript([&](UnitScript* script) - { - return !script->IfNormalReaction(unit, target, repRank); - }); - - if (ret && *ret) - { - return false; - } - - return true; -} - -bool ScriptMgr::IsNeedModSpellDamagePercent(Unit const* unit, AuraEffect* auraEff, float& doneTotalMod, SpellInfo const* spellProto) -{ - auto ret = IsValidBoolScript([&](UnitScript* script) - { - return !script->IsNeedModSpellDamagePercent(unit, auraEff, doneTotalMod, spellProto); - }); - - if (ret && *ret) - { - return false; - } - - return true; -} - -bool ScriptMgr::IsNeedModMeleeDamagePercent(Unit const* unit, AuraEffect* auraEff, float& doneTotalMod, SpellInfo const* spellProto) -{ - auto ret = IsValidBoolScript([&](UnitScript* script) - { - return !script->IsNeedModMeleeDamagePercent(unit, auraEff, doneTotalMod, spellProto); - }); - - if (ret && *ret) - { - return false; - } - - return true; -} - -bool ScriptMgr::IsNeedModHealPercent(Unit const* unit, AuraEffect* auraEff, float& doneTotalMod, SpellInfo const* spellProto) -{ - auto ret = IsValidBoolScript([&](UnitScript* script) - { - return !script->IsNeedModHealPercent(unit, auraEff, doneTotalMod, spellProto); - }); - - if (ret && *ret) - { - return false; - } - - return true; -} - -bool ScriptMgr::CanSetPhaseMask(Unit const* unit, uint32 newPhaseMask, bool update) -{ - auto ret = IsValidBoolScript([&](UnitScript* script) - { - return !script->CanSetPhaseMask(unit, newPhaseMask, update); - }); - - if (ret && *ret) - { - return false; - } - - return true; -} - -bool ScriptMgr::IsCustomBuildValuesUpdate(Unit const* unit, uint8 updateType, ByteBuffer& fieldBuffer, Player const* target, uint16 index) -{ - auto ret = IsValidBoolScript([&](UnitScript* script) - { - return script->IsCustomBuildValuesUpdate(unit, updateType, fieldBuffer, target, index); - }); - - if (ret && *ret) - { - return true; - } - - return false; -} - -bool ScriptMgr::ShouldTrackValuesUpdatePosByIndex(Unit const* unit, uint8 updateType, uint16 index) -{ - auto ret = IsValidBoolScript([&](UnitScript* script) { return script->ShouldTrackValuesUpdatePosByIndex(unit, updateType, index); }); - - if (ret && *ret) - return true; - - return false; -} - -void ScriptMgr::OnPatchValuesUpdate(Unit const* unit, ByteBuffer& valuesUpdateBuf, BuildValuesCachePosPointers& posPointers, Player* target) -{ - ExecuteScript([&](UnitScript* script) - { - script->OnPatchValuesUpdate(unit, valuesUpdateBuf, posPointers, target); - }); -} - -void ScriptMgr::OnUnitUpdate(Unit* unit, uint32 diff) -{ - ExecuteScript([&](UnitScript* script) - { - script->OnUnitUpdate(unit, diff); - }); -} - -void ScriptMgr::OnDisplayIdChange(Unit* unit, uint32 displayId) -{ - ExecuteScript([&](UnitScript* script) - { - script->OnDisplayIdChange(unit, displayId); - }); -} - -void ScriptMgr::OnUnitEnterEvadeMode(Unit* unit, uint8 evadeReason) -{ - ExecuteScript([&](UnitScript* script) - { - script->OnUnitEnterEvadeMode(unit, evadeReason); - }); -} - -void ScriptMgr::OnUnitEnterCombat(Unit* unit, Unit* victim) -{ - ExecuteScript([&](UnitScript* script) - { - script->OnUnitEnterCombat(unit, victim); - }); -} - -void ScriptMgr::OnUnitDeath(Unit* unit, Unit* killer) -{ - ExecuteScript([&](UnitScript* script) - { - script->OnUnitDeath(unit, killer); - }); + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_BEFORE_ROLL_MELEE_OUTCOME_AGAINST, script->OnBeforeRollMeleeOutcomeAgainst(attacker, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance)); } void ScriptMgr::OnAuraApply(Unit* unit, Aura* aura) { - ExecuteScript([&](UnitScript* script) - { - script->OnAuraApply(unit, aura); - }); + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_AURA_APPLY, script->OnAuraApply(unit, aura)); } -UnitScript::UnitScript(const char* name, bool addToScripts) : - ScriptObject(name) +void ScriptMgr::OnAuraRemove(Unit* unit, AuraApplication* aurApp, AuraRemoveMode mode) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_AURA_REMOVE, script->OnAuraRemove(unit, aurApp, mode)); +} + +bool ScriptMgr::IfNormalReaction(Unit const* unit, Unit const* target, ReputationRank& repRank) +{ + CALL_ENABLED_BOOLEAN_HOOKS(UnitScript, UNITHOOK_IF_NORMAL_REACTION, !script->IfNormalReaction(unit, target, repRank)); +} + +bool ScriptMgr::IsNeedModSpellDamagePercent(Unit const* unit, AuraEffect* auraEff, float& doneTotalMod, SpellInfo const* spellProto) +{ + CALL_ENABLED_BOOLEAN_HOOKS(UnitScript, UNITHOOK_IS_NEEDMOD_SPELL_DAMAGE_PERCENT, !script->IsNeedModSpellDamagePercent(unit, auraEff, doneTotalMod, spellProto)); +} + +bool ScriptMgr::IsNeedModMeleeDamagePercent(Unit const* unit, AuraEffect* auraEff, float& doneTotalMod, SpellInfo const* spellProto) +{ + CALL_ENABLED_BOOLEAN_HOOKS(UnitScript, UNITHOOK_IS_NEEDMOD_MELEE_DAMAGE_PERCENT, !script->IsNeedModMeleeDamagePercent(unit, auraEff, doneTotalMod, spellProto)); +} + +bool ScriptMgr::IsNeedModHealPercent(Unit const* unit, AuraEffect* auraEff, float& doneTotalMod, SpellInfo const* spellProto) +{ + CALL_ENABLED_BOOLEAN_HOOKS(UnitScript, UNITHOOK_IS_NEEDMOD_HEAL_PERCENT, !script->IsNeedModHealPercent(unit, auraEff, doneTotalMod, spellProto)); +} + +bool ScriptMgr::CanSetPhaseMask(Unit const* unit, uint32 newPhaseMask, bool update) +{ + CALL_ENABLED_BOOLEAN_HOOKS(UnitScript, UNITHOOK_CAN_SET_PHASE_MASK, !script->CanSetPhaseMask(unit, newPhaseMask, update)); +} + +bool ScriptMgr::IsCustomBuildValuesUpdate(Unit const* unit, uint8 updateType, ByteBuffer& fieldBuffer, Player const* target, uint16 index) +{ + CALL_ENABLED_BOOLEAN_HOOKS(UnitScript, UNITHOOK_IS_CUSTOM_BUILD_VALUES_UPDATE, script->IsCustomBuildValuesUpdate(unit, updateType, fieldBuffer, target, index)); +} + +bool ScriptMgr::ShouldTrackValuesUpdatePosByIndex(Unit const* unit, uint8 updateType, uint16 index) +{ + CALL_ENABLED_BOOLEAN_HOOKS(UnitScript, UNITHOOK_SHOULD_TRACK_VALUES_UPDATE_POS_BY_INDEX, script->ShouldTrackValuesUpdatePosByIndex(unit, updateType, index)); +} + +void ScriptMgr::OnPatchValuesUpdate(Unit const* unit, ByteBuffer& valuesUpdateBuf, BuildValuesCachePosPointers& posPointers, Player* target) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_PATCH_VALUES_UPDATE, script->OnPatchValuesUpdate(unit, valuesUpdateBuf, posPointers, target)); +} + +void ScriptMgr::OnUnitUpdate(Unit* unit, uint32 diff) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_UNIT_UPDATE, script->OnUnitUpdate(unit, diff)); +} + +void ScriptMgr::OnDisplayIdChange(Unit* unit, uint32 displayId) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_DISPLAYID_CHANGE, script->OnDisplayIdChange(unit, displayId)); +} + +void ScriptMgr::OnUnitEnterEvadeMode(Unit* unit, uint8 evadeReason) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_UNIT_ENTER_EVADE_MODE, script->OnUnitEnterEvadeMode(unit, evadeReason)); +} + +void ScriptMgr::OnUnitEnterCombat(Unit* unit, Unit* victim) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_UNIT_ENTER_COMBAT, script->OnUnitEnterCombat(unit, victim)); +} + +void ScriptMgr::OnUnitDeath(Unit* unit, Unit* killer) +{ + CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_UNIT_DEATH, script->OnUnitDeath(unit, killer)); +} + +UnitScript::UnitScript(const char* name, bool addToScripts, std::vector enabledHooks) + : ScriptObject(name, UNITHOOK_END) { if (addToScripts) - ScriptRegistry::AddScript(this); + { + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < UNITHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); + } } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/UnitScript.h b/src/server/game/Scripting/ScriptDefines/UnitScript.h index f0341909c..27354ec6f 100644 --- a/src/server/game/Scripting/ScriptDefines/UnitScript.h +++ b/src/server/game/Scripting/ScriptDefines/UnitScript.h @@ -19,6 +19,34 @@ #define SCRIPT_OBJECT_UNIT_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum UnitHook +{ + UNITHOOK_ON_HEAL, + UNITHOOK_ON_DAMAGE, + UNITHOOK_MODIFY_PERIODIC_DAMAGE_AURAS_TICK, + UNITHOOK_MODIFY_MELEE_DAMAGE, + UNITHOOK_MODIFY_SPELL_DAMAGE_TAKEN, + UNITHOOK_MODIFY_HEAL_RECEIVED, + UNITHOOK_ON_BEFORE_ROLL_MELEE_OUTCOME_AGAINST, + UNITHOOK_ON_AURA_APPLY, + UNITHOOK_ON_AURA_REMOVE, + UNITHOOK_IF_NORMAL_REACTION, + UNITHOOK_IS_NEEDMOD_SPELL_DAMAGE_PERCENT, + UNITHOOK_IS_NEEDMOD_MELEE_DAMAGE_PERCENT, + UNITHOOK_IS_NEEDMOD_HEAL_PERCENT, + UNITHOOK_CAN_SET_PHASE_MASK, + UNITHOOK_IS_CUSTOM_BUILD_VALUES_UPDATE, + UNITHOOK_SHOULD_TRACK_VALUES_UPDATE_POS_BY_INDEX, + UNITHOOK_ON_PATCH_VALUES_UPDATE, + UNITHOOK_ON_UNIT_UPDATE, + UNITHOOK_ON_DISPLAYID_CHANGE, + UNITHOOK_ON_UNIT_ENTER_EVADE_MODE, + UNITHOOK_ON_UNIT_ENTER_COMBAT, + UNITHOOK_ON_UNIT_DEATH, + UNITHOOK_END +}; enum ReputationRank : uint8; class ByteBuffer; @@ -27,7 +55,7 @@ struct BuildValuesCachePosPointers; class UnitScript : public ScriptObject { protected: - UnitScript(const char* name, bool addToScripts = true); + UnitScript(const char* name, bool addToScripts = true, std::vector enabledHooks = std::vector()); public: // Called when a unit deals healing to another unit From 55233dd17b5ff2287685ebfd977cb01c611dfdad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:54:35 +0800 Subject: [PATCH 18/45] feat(Core/Scripts): Optimize ServerScript (#18721) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update ServerScript.h --- .../Scripting/ScriptDefines/ServerScript.cpp | 73 ++++++------------- .../Scripting/ScriptDefines/ServerScript.h | 14 +++- 2 files changed, 36 insertions(+), 51 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/ServerScript.cpp b/src/server/game/Scripting/ScriptDefines/ServerScript.cpp index ef0e8b721..1384d680b 100644 --- a/src/server/game/Scripting/ScriptDefines/ServerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ServerScript.cpp @@ -21,58 +21,26 @@ void ScriptMgr::OnNetworkStart() { - ExecuteScript([&](ServerScript* script) - { - script->OnNetworkStart(); - }); + CALL_ENABLED_HOOKS(ServerScript, SERVERHOOK_ON_NETWORK_START, script->OnNetworkStart()); } void ScriptMgr::OnNetworkStop() { - ExecuteScript([&](ServerScript* script) - { - script->OnNetworkStop(); - }); + CALL_ENABLED_HOOKS(ServerScript, SERVERHOOK_ON_NETWORK_STOP, script->OnNetworkStop()); } void ScriptMgr::OnSocketOpen(std::shared_ptr socket) { ASSERT(socket); - ExecuteScript([&](ServerScript* script) - { - script->OnSocketOpen(socket); - }); + CALL_ENABLED_HOOKS(ServerScript, SERVERHOOK_ON_SOCKET_OPEN, script->OnSocketOpen(socket)); } void ScriptMgr::OnSocketClose(std::shared_ptr socket) { ASSERT(socket); - ExecuteScript([&](ServerScript* script) - { - script->OnSocketClose(socket); - }); -} - -bool ScriptMgr::CanPacketReceive(WorldSession* session, WorldPacket const& packet) -{ - if (ScriptRegistry::ScriptPointerList.empty()) - return true; - - WorldPacket copy(packet); - - auto ret = IsValidBoolScript([&](ServerScript* script) - { - return !script->CanPacketReceive(session, copy); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_HOOKS(ServerScript, SERVERHOOK_ON_SOCKET_CLOSE, script->OnSocketClose(socket)); } bool ScriptMgr::CanPacketSend(WorldSession* session, WorldPacket const& packet) @@ -84,23 +52,28 @@ bool ScriptMgr::CanPacketSend(WorldSession* session, WorldPacket const& packet) WorldPacket copy(packet); - auto ret = IsValidBoolScript([&](ServerScript* script) - { - return !script->CanPacketSend(session, copy); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(ServerScript, SERVERHOOK_CAN_PACKET_SEND, !script->CanPacketSend(session, copy)); } -ServerScript::ServerScript(const char* name) - : ScriptObject(name) +bool ScriptMgr::CanPacketReceive(WorldSession* session, WorldPacket const& packet) { - ScriptRegistry::AddScript(this); + if (ScriptRegistry::ScriptPointerList.empty()) + return true; + + WorldPacket copy(packet); + + CALL_ENABLED_BOOLEAN_HOOKS(ServerScript, SERVERHOOK_CAN_PACKET_RECEIVE, !script->CanPacketReceive(session, copy)); +} + +ServerScript::ServerScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, SERVERHOOK_END) +{ + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < SERVERHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/ServerScript.h b/src/server/game/Scripting/ScriptDefines/ServerScript.h index b09c07ecb..03c974194 100644 --- a/src/server/game/Scripting/ScriptDefines/ServerScript.h +++ b/src/server/game/Scripting/ScriptDefines/ServerScript.h @@ -19,11 +19,23 @@ #define SCRIPT_OBJECT_SERVER_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum ServerHook +{ + SERVERHOOK_ON_NETWORK_START, + SERVERHOOK_ON_NETWORK_STOP, + SERVERHOOK_ON_SOCKET_OPEN, + SERVERHOOK_ON_SOCKET_CLOSE, + SERVERHOOK_CAN_PACKET_SEND, + SERVERHOOK_CAN_PACKET_RECEIVE, + SERVERHOOK_END +}; class ServerScript : public ScriptObject { protected: - ServerScript(const char* name); + ServerScript(const char* name, std::vector enabledHooks = std::vector()); public: // Called when reactive socket I/O is started (WorldSocketMgr). From 574bdc2869c4abe9768279c45a1582ec4c4455f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:55:04 +0800 Subject: [PATCH 19/45] feat(Core/Scripts): Optimize PetScript (#18720) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update PetScript.h --- .../Scripting/ScriptDefines/PetScript.cpp | 62 +++++-------------- .../game/Scripting/ScriptDefines/PetScript.h | 14 ++++- 2 files changed, 27 insertions(+), 49 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/PetScript.cpp b/src/server/game/Scripting/ScriptDefines/PetScript.cpp index 090a4c5bf..2734e8077 100644 --- a/src/server/game/Scripting/ScriptDefines/PetScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PetScript.cpp @@ -21,79 +21,45 @@ void ScriptMgr::OnInitStatsForLevel(Guardian* guardian, uint8 petlevel) { - ExecuteScript([&](PetScript* script) - { - script->OnInitStatsForLevel(guardian, petlevel); - }); + CALL_ENABLED_HOOKS(PetScript, PETHOOK_ON_INIT_STATS_FOR_LEVEL, script->OnInitStatsForLevel(guardian, petlevel)); } void ScriptMgr::OnCalculateMaxTalentPointsForLevel(Pet* pet, uint8 level, uint8& points) { - ExecuteScript([&](PetScript* script) - { - script->OnCalculateMaxTalentPointsForLevel(pet, level, points); - }); + CALL_ENABLED_HOOKS(PetScript, PETHOOK_ON_CALCULATE_MAX_TALENT_POINTS_FOR_LEVEL, script->OnCalculateMaxTalentPointsForLevel(pet, level, points)); } bool ScriptMgr::CanUnlearnSpellSet(Pet* pet, uint32 level, uint32 spell) { - auto ret = IsValidBoolScript([&](PetScript* script) - { - return !script->CanUnlearnSpellSet(pet, level, spell); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PetScript, PETHOOK_CAN_UNLEARN_SPELL_SET, !script->CanUnlearnSpellSet(pet, level, spell)); } bool ScriptMgr::CanUnlearnSpellDefault(Pet* pet, SpellInfo const* spellInfo) { - auto ret = IsValidBoolScript([&](PetScript* script) - { - return !script->CanUnlearnSpellDefault(pet, spellInfo); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PetScript, PETHOOK_CAN_UNLEARN_SPELL_DEFAULT, !script->CanUnlearnSpellDefault(pet, spellInfo)); } bool ScriptMgr::CanResetTalents(Pet* pet) { - auto ret = IsValidBoolScript([&](PetScript* script) - { - return !script->CanResetTalents(pet); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(PetScript, PETHOOK_CAN_RESET_TALENTS, !script->CanResetTalents(pet)); } void ScriptMgr::OnPetAddToWorld(Pet* pet) { ASSERT(pet); - ExecuteScript([&](PetScript* script) - { - script->OnPetAddToWorld(pet); - }); + CALL_ENABLED_HOOKS(PetScript, PETHOOK_ON_PET_ADD_TO_WORLD, script->OnPetAddToWorld(pet)); } -PetScript::PetScript(const char* name) - : ScriptObject(name) +PetScript::PetScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, PETHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < PETHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/PetScript.h b/src/server/game/Scripting/ScriptDefines/PetScript.h index c1425f099..b7731bf58 100644 --- a/src/server/game/Scripting/ScriptDefines/PetScript.h +++ b/src/server/game/Scripting/ScriptDefines/PetScript.h @@ -19,11 +19,23 @@ #define SCRIPT_OBJECT_PET_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum PetHook +{ + PETHOOK_ON_INIT_STATS_FOR_LEVEL, + PETHOOK_ON_CALCULATE_MAX_TALENT_POINTS_FOR_LEVEL, + PETHOOK_CAN_UNLEARN_SPELL_SET, + PETHOOK_CAN_UNLEARN_SPELL_DEFAULT, + PETHOOK_CAN_RESET_TALENTS, + PETHOOK_ON_PET_ADD_TO_WORLD, + PETHOOK_END +}; class PetScript : public ScriptObject { protected: - PetScript(const char* name); + PetScript(const char* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } From e4cae908faddcd8caf6ed5cd9f30e86f0936518d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:55:18 +0800 Subject: [PATCH 20/45] feat(Core/Scripts): Optimize MiscScript (#18719) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update MiscScript.h --- .../Scripting/ScriptDefines/MiscScript.cpp | 146 +++++------------- .../game/Scripting/ScriptDefines/MiscScript.h | 26 +++- 2 files changed, 63 insertions(+), 109 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/MiscScript.cpp b/src/server/game/Scripting/ScriptDefines/MiscScript.cpp index 6bcba8962..7ec76e4e7 100644 --- a/src/server/game/Scripting/ScriptDefines/MiscScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/MiscScript.cpp @@ -19,175 +19,105 @@ #include "ScriptMgr.h" #include "ScriptMgrMacros.h" -void ScriptMgr::OnItemCreate(Item* item, ItemTemplate const* itemProto, Player const* owner) -{ - ExecuteScript([&](MiscScript* script) - { - script->OnItemCreate(item, itemProto, owner); - }); -} - -bool ScriptMgr::CanApplySoulboundFlag(Item* item, ItemTemplate const* proto) -{ - auto ret = IsValidBoolScript([&](MiscScript* script) - { - return !script->CanApplySoulboundFlag(item, proto); - }); - - if (ret && *ret) - { - return false; - } - - return true; -} - void ScriptMgr::OnConstructObject(Object* origin) { - ExecuteScript([&](MiscScript* script) - { - script->OnConstructObject(origin); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_CONSTRUCT_OBJECT, script->OnConstructObject(origin)); } void ScriptMgr::OnDestructObject(Object* origin) { - ExecuteScript([&](MiscScript* script) - { - script->OnDestructObject(origin); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_DESTRUCT_OBJECT, script->OnDestructObject(origin)); } void ScriptMgr::OnConstructPlayer(Player* origin) { - ExecuteScript([&](MiscScript* script) - { - script->OnConstructPlayer(origin); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_CONSTRUCT_PLAYER, script->OnConstructPlayer(origin)); } void ScriptMgr::OnDestructPlayer(Player* origin) { - ExecuteScript([&](MiscScript* script) - { - script->OnDestructPlayer(origin); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_DESTRUCT_PLAYER, script->OnDestructPlayer(origin)); } void ScriptMgr::OnConstructGroup(Group* origin) { - ExecuteScript([&](MiscScript* script) - { - script->OnConstructGroup(origin); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_CONSTRUCT_GROUP, script->OnConstructGroup(origin)); } void ScriptMgr::OnDestructGroup(Group* origin) { - ExecuteScript([&](MiscScript* script) - { - script->OnDestructGroup(origin); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_DESTRUCT_GROUP, script->OnDestructGroup(origin)); } void ScriptMgr::OnConstructInstanceSave(InstanceSave* origin) { - ExecuteScript([&](MiscScript* script) - { - script->OnConstructInstanceSave(origin); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_CONSTRUCT_INSTANCE_SAVE, script->OnConstructInstanceSave(origin)); } void ScriptMgr::OnDestructInstanceSave(InstanceSave* origin) { - ExecuteScript([&](MiscScript* script) - { - script->OnDestructInstanceSave(origin); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_DESTRUCT_INSTANCE_SAVE, script->OnDestructInstanceSave(origin)); +} + +void ScriptMgr::OnItemCreate(Item* item, ItemTemplate const* itemProto, Player const* owner) +{ + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_ITEM_CREATE, script->OnItemCreate(item, itemProto, owner)); +} + +bool ScriptMgr::CanApplySoulboundFlag(Item* item, ItemTemplate const* proto) +{ + CALL_ENABLED_BOOLEAN_HOOKS(MiscScript, MISCHOOK_CAN_APPLY_SOULBOUND_FLAG, !script->CanApplySoulboundFlag(item, proto)); } bool ScriptMgr::CanItemApplyEquipSpell(Player* player, Item* item) { - auto ret = IsValidBoolScript([&](MiscScript* script) - { - return !script->CanItemApplyEquipSpell(player, item); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(MiscScript, MISCHOOK_CAN_ITEM_APPLY_EQUIP_SPELL, !script->CanItemApplyEquipSpell(player, item)); } bool ScriptMgr::CanSendAuctionHello(WorldSession const* session, ObjectGuid guid, Creature* creature) { - auto ret = IsValidBoolScript([&](MiscScript* script) - { - return !script->CanSendAuctionHello(session, guid, creature); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(MiscScript, MISCHOOK_CAN_SEND_AUCTIONHELLO, !script->CanSendAuctionHello(session, guid, creature)); } void ScriptMgr::ValidateSpellAtCastSpell(Player* player, uint32& oldSpellId, uint32& spellId, uint8& castCount, uint8& castFlags) { - ExecuteScript([&](MiscScript* script) - { - script->ValidateSpellAtCastSpell(player, oldSpellId, spellId, castCount, castFlags); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_VALIDATE_SPELL_AT_CAST_SPELL, script->ValidateSpellAtCastSpell(player, oldSpellId, spellId, castCount, castFlags)); } void ScriptMgr::ValidateSpellAtCastSpellResult(Player* player, Unit* mover, Spell* spell, uint32 oldSpellId, uint32 spellId) { - ExecuteScript([&](MiscScript* script) - { - script->ValidateSpellAtCastSpellResult(player, mover, spell, oldSpellId, spellId); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_VALIDATE_SPELL_AT_CAST_SPELL_RESULT, script->ValidateSpellAtCastSpellResult(player, mover, spell, oldSpellId, spellId)); } void ScriptMgr::OnAfterLootTemplateProcess(Loot* loot, LootTemplate const* tab, LootStore const& store, Player* lootOwner, bool personal, bool noEmptyError, uint16 lootMode) { - ExecuteScript([&](MiscScript* script) - { - script->OnAfterLootTemplateProcess(loot, tab, store, lootOwner, personal, noEmptyError, lootMode); - }); -} - -void ScriptMgr::OnInstanceSave(InstanceSave* instanceSave) -{ - ExecuteScript([&](MiscScript* script) - { - script->OnInstanceSave(instanceSave); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_AFTER_LOOT_TEMPLATE_PROCESS, script->OnAfterLootTemplateProcess(loot, tab, store, lootOwner, personal, noEmptyError, lootMode)); } void ScriptMgr::OnPlayerSetPhase(const AuraEffect* auraEff, AuraApplication const* aurApp, uint8 mode, bool apply, uint32& newPhase) { - ExecuteScript([&](MiscScript* script) - { - script->OnPlayerSetPhase(auraEff, aurApp, mode, apply, newPhase); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_PLAYER_SET_PHASE, script->OnPlayerSetPhase(auraEff, aurApp, mode, apply, newPhase)); +} + +void ScriptMgr::OnInstanceSave(InstanceSave* instanceSave) +{ + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_ON_INSTANCE_SAVE, script->OnInstanceSave(instanceSave)); } void ScriptMgr::GetDialogStatus(Player* player, Object* questgiver) { - ExecuteScript([&](MiscScript* script) - { - script->GetDialogStatus(player, questgiver); - }); + CALL_ENABLED_HOOKS(MiscScript, MISCHOOK_GET_DIALOG_STATUS, script->GetDialogStatus(player, questgiver)); } -MiscScript::MiscScript(const char* name) - : ScriptObject(name) +MiscScript::MiscScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, MISCHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < MISCHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/MiscScript.h b/src/server/game/Scripting/ScriptDefines/MiscScript.h index cb3004003..607c34dce 100644 --- a/src/server/game/Scripting/ScriptDefines/MiscScript.h +++ b/src/server/game/Scripting/ScriptDefines/MiscScript.h @@ -20,11 +20,35 @@ #include "ObjectGuid.h" #include "ScriptObject.h" +#include + +enum MiscHook +{ + MISCHOOK_ON_CONSTRUCT_OBJECT, + MISCHOOK_ON_DESTRUCT_OBJECT, + MISCHOOK_ON_CONSTRUCT_PLAYER, + MISCHOOK_ON_DESTRUCT_PLAYER, + MISCHOOK_ON_CONSTRUCT_GROUP, + MISCHOOK_ON_DESTRUCT_GROUP, + MISCHOOK_ON_CONSTRUCT_INSTANCE_SAVE, + MISCHOOK_ON_DESTRUCT_INSTANCE_SAVE, + MISCHOOK_ON_ITEM_CREATE, + MISCHOOK_CAN_APPLY_SOULBOUND_FLAG, + MISCHOOK_CAN_ITEM_APPLY_EQUIP_SPELL, + MISCHOOK_CAN_SEND_AUCTIONHELLO, + MISCHOOK_VALIDATE_SPELL_AT_CAST_SPELL, + MISCHOOK_VALIDATE_SPELL_AT_CAST_SPELL_RESULT, + MISCHOOK_ON_AFTER_LOOT_TEMPLATE_PROCESS, + MISCHOOK_ON_PLAYER_SET_PHASE, + MISCHOOK_ON_INSTANCE_SAVE, + MISCHOOK_GET_DIALOG_STATUS, + MISCHOOK_END +}; class MiscScript : public ScriptObject { protected: - MiscScript(const char* name); + MiscScript(const char* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } From 9464068625e634024af00fe8b0ce6efb435c84a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:55:35 +0800 Subject: [PATCH 21/45] feat(Core/Scripts): Optimize MailScript (#18716) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update MailScript.h --- .../game/Scripting/ScriptDefines/MailScript.cpp | 16 +++++++++------- .../game/Scripting/ScriptDefines/MailScript.h | 9 ++++++++- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/MailScript.cpp b/src/server/game/Scripting/ScriptDefines/MailScript.cpp index ac1ca35dc..0f867fb08 100644 --- a/src/server/game/Scripting/ScriptDefines/MailScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/MailScript.cpp @@ -21,16 +21,18 @@ void ScriptMgr::OnBeforeMailDraftSendMailTo(MailDraft* mailDraft, MailReceiver const& receiver, MailSender const& sender, MailCheckMask& checked, uint32& deliver_delay, uint32& custom_expiration, bool& deleteMailItemsFromDB, bool& sendMail) { - ExecuteScript([&](MailScript* script) - { - script->OnBeforeMailDraftSendMailTo(mailDraft, receiver, sender, checked, deliver_delay, custom_expiration, deleteMailItemsFromDB, sendMail);\ - }); + CALL_ENABLED_HOOKS(MailScript, MAILHOOK_ON_BEFORE_MAIL_DRAFT_SEND_MAIL_TO, script->OnBeforeMailDraftSendMailTo(mailDraft, receiver, sender, checked, deliver_delay, custom_expiration, deleteMailItemsFromDB, sendMail)); } -MailScript::MailScript(const char* name) - : ScriptObject(name) +MailScript::MailScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, MAILHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < MAILHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/MailScript.h b/src/server/game/Scripting/ScriptDefines/MailScript.h index bd3647e42..4591168a5 100644 --- a/src/server/game/Scripting/ScriptDefines/MailScript.h +++ b/src/server/game/Scripting/ScriptDefines/MailScript.h @@ -19,11 +19,18 @@ #define SCRIPT_OBJECT_MAIL_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum MailHook +{ + MAILHOOK_ON_BEFORE_MAIL_DRAFT_SEND_MAIL_TO, + MAILHOOK_END +}; class MailScript : public ScriptObject { protected: - MailScript(const char* name); + MailScript(const char* name, std::vector enabledHooks = std::vector()); public: // Called before mail is sent From 1ecce50e06ebdde10500c5f72b9a0f5813b1c89b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:55:54 +0800 Subject: [PATCH 22/45] feat(Core/Scripts): Optimize LootScript (#18715) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update LootScript.h --- .../game/Scripting/ScriptDefines/LootScript.cpp | 15 +++++++++------ .../game/Scripting/ScriptDefines/LootScript.h | 9 ++++++++- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/LootScript.cpp b/src/server/game/Scripting/ScriptDefines/LootScript.cpp index 6b49ff5a1..a6231b4a4 100644 --- a/src/server/game/Scripting/ScriptDefines/LootScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/LootScript.cpp @@ -23,13 +23,16 @@ void ScriptMgr::OnLootMoney(Player* player, uint32 gold) { ASSERT(player); - ExecuteScript([&](LootScript* script) - { - script->OnLootMoney(player, gold); - }); + CALL_ENABLED_HOOKS(LootScript, LOOTHOOK_ON_LOOT_MONEY, script->OnLootMoney(player, gold)); } -LootScript::LootScript(const char* name) : ScriptObject(name) +LootScript::LootScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, LOOTHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < LOOTHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } diff --git a/src/server/game/Scripting/ScriptDefines/LootScript.h b/src/server/game/Scripting/ScriptDefines/LootScript.h index d71711383..445abdddc 100644 --- a/src/server/game/Scripting/ScriptDefines/LootScript.h +++ b/src/server/game/Scripting/ScriptDefines/LootScript.h @@ -19,11 +19,18 @@ #define SCRIPT_OBJECT_LOOT_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum LootHook +{ + LOOTHOOK_ON_LOOT_MONEY, + LOOTHOOK_END +}; class LootScript : public ScriptObject { protected: - LootScript(const char* name); + LootScript(const char* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } From e2a07cf9b7cf13350df9c3efaf0199550e038dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:56:12 +0800 Subject: [PATCH 23/45] feat(Core/Scripts): Optimize GuildScript (#18714) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update GuildScript.h --- .../Scripting/ScriptDefines/GuildScript.cpp | 81 +++++-------------- .../Scripting/ScriptDefines/GuildScript.h | 23 +++++- 2 files changed, 41 insertions(+), 63 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/GuildScript.cpp b/src/server/game/Scripting/ScriptDefines/GuildScript.cpp index 1aae39901..480c9968c 100644 --- a/src/server/game/Scripting/ScriptDefines/GuildScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/GuildScript.cpp @@ -21,112 +21,73 @@ void ScriptMgr::OnGuildAddMember(Guild* guild, Player* player, uint8& plRank) { - ExecuteScript([&](GuildScript* script) - { - script->OnAddMember(guild, player, plRank); - }); + CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_ADD_MEMBER, script->OnAddMember(guild, player, plRank)); } void ScriptMgr::OnGuildRemoveMember(Guild* guild, Player* player, bool isDisbanding, bool isKicked) { - ExecuteScript([&](GuildScript* script) - { - script->OnRemoveMember(guild, player, isDisbanding, isKicked); - }); + CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_REMOVE_MEMBER, script->OnRemoveMember(guild, player, isDisbanding, isKicked)); } void ScriptMgr::OnGuildMOTDChanged(Guild* guild, const std::string& newMotd) { - ExecuteScript([&](GuildScript* script) - { - script->OnMOTDChanged(guild, newMotd); - }); + CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_MOTD_CHANGED, script->OnMOTDChanged(guild, newMotd)); } void ScriptMgr::OnGuildInfoChanged(Guild* guild, const std::string& newInfo) { - ExecuteScript([&](GuildScript* script) - { - script->OnInfoChanged(guild, newInfo); - }); + CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_INFO_CHANGED, script->OnInfoChanged(guild, newInfo)); } void ScriptMgr::OnGuildCreate(Guild* guild, Player* leader, const std::string& name) { - ExecuteScript([&](GuildScript* script) - { - script->OnCreate(guild, leader, name); - }); + CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_CREATE, script->OnCreate(guild, leader, name)); } void ScriptMgr::OnGuildDisband(Guild* guild) { - ExecuteScript([&](GuildScript* script) - { - script->OnDisband(guild); - }); + CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_DISBAND, script->OnDisband(guild)); } void ScriptMgr::OnGuildMemberWitdrawMoney(Guild* guild, Player* player, uint32& amount, bool isRepair) { - ExecuteScript([&](GuildScript* script) - { - script->OnMemberWitdrawMoney(guild, player, amount, isRepair); - }); + CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_MEMBER_WITDRAW_MONEY, script->OnMemberWitdrawMoney(guild, player, amount, isRepair)); } void ScriptMgr::OnGuildMemberDepositMoney(Guild* guild, Player* player, uint32& amount) { - ExecuteScript([&](GuildScript* script) - { - script->OnMemberDepositMoney(guild, player, amount); - }); + CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_MEMBER_DEPOSIT_MONEY, script->OnMemberDepositMoney(guild, player, amount)); } -void ScriptMgr::OnGuildItemMove(Guild* guild, Player* player, Item* pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId, - bool isDestBank, uint8 destContainer, uint8 destSlotId) +void ScriptMgr::OnGuildItemMove(Guild* guild, Player* player, Item* pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId, bool isDestBank, uint8 destContainer, uint8 destSlotId) { - ExecuteScript([&](GuildScript* script) - { - script->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId); - }); + CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_ITEM_MOVE, script->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId)); } void ScriptMgr::OnGuildEvent(Guild* guild, uint8 eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank) { - ExecuteScript([&](GuildScript* script) - { - script->OnEvent(guild, eventType, playerGuid1, playerGuid2, newRank); - }); + CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_EVENT, script->OnEvent(guild, eventType, playerGuid1, playerGuid2, newRank)); } void ScriptMgr::OnGuildBankEvent(Guild* guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId) { - ExecuteScript([&](GuildScript* script) - { - script->OnBankEvent(guild, eventType, tabId, playerGuid, itemOrMoney, itemStackCount, destTabId); - }); + CALL_ENABLED_HOOKS(GuildScript, GUILDHOOK_ON_BANK_EVENT, script->OnBankEvent(guild, eventType, tabId, playerGuid, itemOrMoney, itemStackCount, destTabId)); } bool ScriptMgr::CanGuildSendBankList(Guild const* guild, WorldSession* session, uint8 tabId, bool sendAllSlots) { - auto ret = IsValidBoolScript([&](GuildScript* script) - { - return !script->CanGuildSendBankList(guild, session, tabId, sendAllSlots); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(GuildScript, GUILDHOOK_CAN_GUILD_SEND_BANK_LIST, !script->CanGuildSendBankList(guild, session, tabId, sendAllSlots)); } -GuildScript::GuildScript(const char* name) - : ScriptObject(name) +GuildScript::GuildScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, GUILDHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < GUILDHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/GuildScript.h b/src/server/game/Scripting/ScriptDefines/GuildScript.h index 102ad0537..ebdfad81f 100644 --- a/src/server/game/Scripting/ScriptDefines/GuildScript.h +++ b/src/server/game/Scripting/ScriptDefines/GuildScript.h @@ -20,11 +20,29 @@ #include "ObjectGuid.h" #include "ScriptObject.h" +#include + +enum GuildHook +{ + GUILDHOOK_ON_ADD_MEMBER, + GUILDHOOK_ON_REMOVE_MEMBER, + GUILDHOOK_ON_MOTD_CHANGED, + GUILDHOOK_ON_INFO_CHANGED, + GUILDHOOK_ON_CREATE, + GUILDHOOK_ON_DISBAND, + GUILDHOOK_ON_MEMBER_WITDRAW_MONEY, + GUILDHOOK_ON_MEMBER_DEPOSIT_MONEY, + GUILDHOOK_ON_ITEM_MOVE, + GUILDHOOK_ON_EVENT, + GUILDHOOK_ON_BANK_EVENT, + GUILDHOOK_CAN_GUILD_SEND_BANK_LIST, + GUILDHOOK_END +}; class GuildScript : public ScriptObject { protected: - GuildScript(const char* name); + GuildScript(const char* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } @@ -54,8 +72,7 @@ public: virtual void OnMemberDepositMoney(Guild* /*guild*/, Player* /*player*/, uint32& /*amount*/) { } // Called when a guild member moves an item in a guild bank. - virtual void OnItemMove(Guild* /*guild*/, Player* /*player*/, Item* /*pItem*/, bool /*isSrcBank*/, uint8 /*srcContainer*/, uint8 /*srcSlotId*/, - bool /*isDestBank*/, uint8 /*destContainer*/, uint8 /*destSlotId*/) { } + virtual void OnItemMove(Guild* /*guild*/, Player* /*player*/, Item* /*pItem*/, bool /*isSrcBank*/, uint8 /*srcContainer*/, uint8 /*srcSlotId*/, bool /*isDestBank*/, uint8 /*destContainer*/, uint8 /*destSlotId*/) { } virtual void OnEvent(Guild* /*guild*/, uint8 /*eventType*/, ObjectGuid::LowType /*playerGuid1*/, ObjectGuid::LowType /*playerGuid2*/, uint8 /*newRank*/) { } From a2c867fcf2aecad34f23ae617e87df732c2a7a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:56:31 +0800 Subject: [PATCH 24/45] feat(Core/Scripts): Optimize GroupScript (#18713) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update GroupScript.h --- src/server/game/DungeonFinding/LFGScripts.cpp | 10 +++- .../Scripting/ScriptDefines/GroupScript.cpp | 53 ++++++------------- .../Scripting/ScriptDefines/GroupScript.h | 15 +++++- 3 files changed, 38 insertions(+), 40 deletions(-) diff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp index 8a34a1478..36fd9bfb3 100644 --- a/src/server/game/DungeonFinding/LFGScripts.cpp +++ b/src/server/game/DungeonFinding/LFGScripts.cpp @@ -140,7 +140,15 @@ namespace lfg } } - LFGGroupScript::LFGGroupScript() : GroupScript("LFGGroupScript") + LFGGroupScript::LFGGroupScript() : + GroupScript("LFGGroupScript", + { + GROUPHOOK_ON_ADD_MEMBER, + GROUPHOOK_ON_REMOVE_MEMBER, + GROUPHOOK_ON_DISBAND, + GROUPHOOK_ON_CHANGE_LEADER, + GROUPHOOK_ON_INVITE_MEMBER + }) { } diff --git a/src/server/game/Scripting/ScriptDefines/GroupScript.cpp b/src/server/game/Scripting/ScriptDefines/GroupScript.cpp index 8e1cc75e3..aed5e68ff 100644 --- a/src/server/game/Scripting/ScriptDefines/GroupScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/GroupScript.cpp @@ -23,79 +23,56 @@ void ScriptMgr::OnGroupAddMember(Group* group, ObjectGuid guid) { ASSERT(group); - ExecuteScript([&](GroupScript* script) - { - script->OnAddMember(group, guid); - }); + CALL_ENABLED_HOOKS(GroupScript, GROUPHOOK_ON_ADD_MEMBER, script->OnAddMember(group, guid)); } void ScriptMgr::OnGroupInviteMember(Group* group, ObjectGuid guid) { ASSERT(group); - ExecuteScript([&](GroupScript* script) - { - script->OnInviteMember(group, guid); - }); + CALL_ENABLED_HOOKS(GroupScript, GROUPHOOK_ON_INVITE_MEMBER, script->OnInviteMember(group, guid)); } void ScriptMgr::OnGroupRemoveMember(Group* group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, const char* reason) { ASSERT(group); - ExecuteScript([&](GroupScript* script) - { - script->OnRemoveMember(group, guid, method, kicker, reason); - }); + CALL_ENABLED_HOOKS(GroupScript, GROUPHOOK_ON_REMOVE_MEMBER, script->OnRemoveMember(group, guid, method, kicker, reason)); } void ScriptMgr::OnGroupChangeLeader(Group* group, ObjectGuid newLeaderGuid, ObjectGuid oldLeaderGuid) { ASSERT(group); - ExecuteScript([&](GroupScript* script) - { - script->OnChangeLeader(group, newLeaderGuid, oldLeaderGuid); - }); + CALL_ENABLED_HOOKS(GroupScript, GROUPHOOK_ON_CHANGE_LEADER, script->OnChangeLeader(group, newLeaderGuid, oldLeaderGuid)); } void ScriptMgr::OnGroupDisband(Group* group) { ASSERT(group); - ExecuteScript([&](GroupScript* script) - { - script->OnDisband(group); - }); + CALL_ENABLED_HOOKS(GroupScript, GROUPHOOK_ON_DISBAND, script->OnDisband(group)); } bool ScriptMgr::CanGroupJoinBattlegroundQueue(Group const* group, Player* member, Battleground const* bgTemplate, uint32 MinPlayerCount, bool isRated, uint32 arenaSlot) { - auto ret = IsValidBoolScript([&](GroupScript* script) - { - return !script->CanGroupJoinBattlegroundQueue(group, member, bgTemplate, MinPlayerCount, isRated, arenaSlot); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(GroupScript, GROUPHOOK_CAN_GROUP_JOIN_BATTLEGROUND_QUEUE, !script->CanGroupJoinBattlegroundQueue(group, member, bgTemplate, MinPlayerCount, isRated, arenaSlot)); } void ScriptMgr::OnCreate(Group* group, Player* leader) { - ExecuteScript([&](GroupScript* script) - { - script->OnCreate(group, leader); - }); + CALL_ENABLED_HOOKS(GroupScript, GROUPHOOK_ON_CREATE, script->OnCreate(group, leader)); } -GroupScript::GroupScript(const char* name) - : ScriptObject(name) +GroupScript::GroupScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, GROUPHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < GROUPHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/GroupScript.h b/src/server/game/Scripting/ScriptDefines/GroupScript.h index 603deb0a1..96f396418 100644 --- a/src/server/game/Scripting/ScriptDefines/GroupScript.h +++ b/src/server/game/Scripting/ScriptDefines/GroupScript.h @@ -20,13 +20,26 @@ #include "ObjectGuid.h" #include "ScriptObject.h" +#include + +enum GroupHook +{ + GROUPHOOK_ON_ADD_MEMBER, + GROUPHOOK_ON_INVITE_MEMBER, + GROUPHOOK_ON_REMOVE_MEMBER, + GROUPHOOK_ON_CHANGE_LEADER, + GROUPHOOK_ON_DISBAND, + GROUPHOOK_CAN_GROUP_JOIN_BATTLEGROUND_QUEUE, + GROUPHOOK_ON_CREATE, + GROUPHOOK_END +}; enum RemoveMethod : uint8; class GroupScript : public ScriptObject { protected: - GroupScript(const char* name); + GroupScript(const char* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } From 170817e66dc95cc9c0bc3dcc9bc9fb9191b4ff27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:56:46 +0800 Subject: [PATCH 25/45] feat(Core/Scripts): Optimize GameEventScript (#18711) * Add files via upload * Update GameEventScript.h --- .../ScriptDefines/GameEventScript.cpp | 26 ++++++++----------- .../Scripting/ScriptDefines/GameEventScript.h | 11 +++++++- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/GameEventScript.cpp b/src/server/game/Scripting/ScriptDefines/GameEventScript.cpp index 5714bf433..1c47e071e 100644 --- a/src/server/game/Scripting/ScriptDefines/GameEventScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/GameEventScript.cpp @@ -21,32 +21,28 @@ void ScriptMgr::OnGameEventStart(uint16 EventID) { - ExecuteScript([&](GameEventScript* script) - { - script->OnStart(EventID); - }); + CALL_ENABLED_HOOKS(GameEventScript, GAMEEVENTHOOK_ON_START, script->OnStart(EventID)); } void ScriptMgr::OnGameEventStop(uint16 EventID) { - ExecuteScript([&](GameEventScript* script) - { - script->OnStop(EventID); - }); + CALL_ENABLED_HOOKS(GameEventScript, GAMEEVENTHOOK_ON_STOP, script->OnStop(EventID)); } void ScriptMgr::OnGameEventCheck(uint16 EventID) { - ExecuteScript([&](GameEventScript* script) - { - script->OnEventCheck(EventID); - }); + CALL_ENABLED_HOOKS(GameEventScript, GAMEEVENTHOOK_ON_EVENT_CHECK, script->OnEventCheck(EventID)); } -GameEventScript::GameEventScript(const char* name) - : ScriptObject(name) +GameEventScript::GameEventScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, GAMEEVENTHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < GAMEEVENTHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/GameEventScript.h b/src/server/game/Scripting/ScriptDefines/GameEventScript.h index 9fe40a3f3..7902d56af 100644 --- a/src/server/game/Scripting/ScriptDefines/GameEventScript.h +++ b/src/server/game/Scripting/ScriptDefines/GameEventScript.h @@ -19,11 +19,20 @@ #define SCRIPT_OBJECT_GAME_EVENT_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum GameEventHook +{ + GAMEEVENTHOOK_ON_START, + GAMEEVENTHOOK_ON_STOP, + GAMEEVENTHOOK_ON_EVENT_CHECK, + GAMEEVENTHOOK_END +}; class GameEventScript : public ScriptObject { protected: - GameEventScript(const char* name); + GameEventScript(const char* name, std::vector enabledHooks = std::vector()); public: // Runs on start event From d87af546755367df08df088ee7e5611fe8b0c86d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:59:37 +0800 Subject: [PATCH 26/45] feat(Core/Scripts): Optimize AllSpellScript (#18702) * Add files via upload * Update AllSpellScript.h --- .../ScriptDefines/AllSpellScript.cpp | 111 ++++-------------- .../Scripting/ScriptDefines/AllSpellScript.h | 21 +++- 2 files changed, 41 insertions(+), 91 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/AllSpellScript.cpp b/src/server/game/Scripting/ScriptDefines/AllSpellScript.cpp index b0f4948bb..f7e057911 100644 --- a/src/server/game/Scripting/ScriptDefines/AllSpellScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AllSpellScript.cpp @@ -21,147 +21,78 @@ void ScriptMgr::OnCalcMaxDuration(Aura const* aura, int32& maxDuration) { - ExecuteScript([&](AllSpellScript* script) - { - script->OnCalcMaxDuration(aura, maxDuration); - }); + CALL_ENABLED_HOOKS(AllSpellScript, ALLSPELLHOOK_ON_CALC_MAX_DURATION, script->OnCalcMaxDuration(aura, maxDuration)); } bool ScriptMgr::CanModAuraEffectDamageDone(AuraEffect const* auraEff, Unit* target, AuraApplication const* aurApp, uint8 mode, bool apply) { - auto ret = IsValidBoolScript([&](AllSpellScript* script) - { - return !script->CanModAuraEffectDamageDone(auraEff, target, aurApp, mode, apply); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(AllSpellScript, ALLSPELLHOOK_CAN_MOD_AURA_EFFECT_DAMAGE_DONE, !script->CanModAuraEffectDamageDone(auraEff, target, aurApp, mode, apply)); } bool ScriptMgr::CanModAuraEffectModDamagePercentDone(AuraEffect const* auraEff, Unit* target, AuraApplication const* aurApp, uint8 mode, bool apply) { - auto ret = IsValidBoolScript([&](AllSpellScript* script) - { - return !script->CanModAuraEffectModDamagePercentDone(auraEff, target, aurApp, mode, apply); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(AllSpellScript, ALLSPELLHOOK_CAN_MOD_AURA_EFFECT_MOD_DAMAGE_PERCENT_DONE, !script->CanModAuraEffectModDamagePercentDone(auraEff, target, aurApp, mode, apply)); } void ScriptMgr::OnSpellCheckCast(Spell* spell, bool strict, SpellCastResult& res) { - ExecuteScript([&](AllSpellScript* script) - { - script->OnSpellCheckCast(spell, strict, res); - }); + CALL_ENABLED_HOOKS(AllSpellScript, ALLSPELLHOOK_ON_SPELL_CHECK_CAST, script->OnSpellCheckCast(spell, strict, res)); } bool ScriptMgr::CanPrepare(Spell* spell, SpellCastTargets const* targets, AuraEffect const* triggeredByAura) { - auto ret = IsValidBoolScript([&](AllSpellScript* script) - { - return !script->CanPrepare(spell, targets, triggeredByAura); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(AllSpellScript, ALLSPELLHOOK_CAN_PREPARE, !script->CanPrepare(spell, targets, triggeredByAura)); } bool ScriptMgr::CanScalingEverything(Spell* spell) { - auto ret = IsValidBoolScript([&](AllSpellScript* script) - { - return script->CanScalingEverything(spell); - }); - - if (ret && *ret) - { - return true; - } - - return false; + CALL_ENABLED_BOOLEAN_HOOKS(AllSpellScript, ALLSPELLHOOK_CAN_SCALING_EVERYTHING, script->CanScalingEverything(spell)); } bool ScriptMgr::CanSelectSpecTalent(Spell* spell) { - auto ret = IsValidBoolScript([&](AllSpellScript* script) - { - return !script->CanSelectSpecTalent(spell); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(AllSpellScript, ALLSPELLHOOK_CAN_SELECT_SPEC_TALENT, !script->CanSelectSpecTalent(spell)); } void ScriptMgr::OnScaleAuraUnitAdd(Spell* spell, Unit* target, uint32 effectMask, bool checkIfValid, bool implicit, uint8 auraScaleMask, TargetInfo& targetInfo) { - ExecuteScript([&](AllSpellScript* script) - { - script->OnScaleAuraUnitAdd(spell, target, effectMask, checkIfValid, implicit, auraScaleMask, targetInfo); - }); + CALL_ENABLED_HOOKS(AllSpellScript, ALLSPELLHOOK_ON_SCALE_AURA_UNIT_ADD, script->OnScaleAuraUnitAdd(spell, target, effectMask, checkIfValid, implicit, auraScaleMask, targetInfo)); } void ScriptMgr::OnRemoveAuraScaleTargets(Spell* spell, TargetInfo& targetInfo, uint8 auraScaleMask, bool& needErase) { - ExecuteScript([&](AllSpellScript* script) - { - script->OnRemoveAuraScaleTargets(spell, targetInfo, auraScaleMask, needErase); - }); + CALL_ENABLED_HOOKS(AllSpellScript, ALLSPELLHOOK_ON_REMOVE_AURA_SCALE_TARGETS, script->OnRemoveAuraScaleTargets(spell, targetInfo, auraScaleMask, needErase)); } void ScriptMgr::OnBeforeAuraRankForLevel(SpellInfo const* spellInfo, SpellInfo const* latestSpellInfo, uint8 level) { - ExecuteScript([&](AllSpellScript* script) - { - script->OnBeforeAuraRankForLevel(spellInfo, latestSpellInfo, level); - }); + CALL_ENABLED_HOOKS(AllSpellScript, ALLSPELLHOOK_ON_BEFORE_AURA_RANK_FOR_LEVEL, script->OnBeforeAuraRankForLevel(spellInfo, latestSpellInfo, level)); } void ScriptMgr::OnDummyEffect(WorldObject* caster, uint32 spellID, SpellEffIndex effIndex, GameObject* gameObjTarget) { - ExecuteScript([&](AllSpellScript* script) - { - script->OnDummyEffect(caster, spellID, effIndex, gameObjTarget); - }); + CALL_ENABLED_HOOKS(AllSpellScript, ALLSPELLHOOK_ON_DUMMY_EFFECT_GAMEOBJECT, script->OnDummyEffect(caster, spellID, effIndex, gameObjTarget)); } void ScriptMgr::OnDummyEffect(WorldObject* caster, uint32 spellID, SpellEffIndex effIndex, Creature* creatureTarget) { - ExecuteScript([&](AllSpellScript* script) - { - script->OnDummyEffect(caster, spellID, effIndex, creatureTarget); - }); + CALL_ENABLED_HOOKS(AllSpellScript, ALLSPELLHOOK_ON_DUMMY_EFFECT_CREATURE, script->OnDummyEffect(caster, spellID, effIndex, creatureTarget)); } void ScriptMgr::OnDummyEffect(WorldObject* caster, uint32 spellID, SpellEffIndex effIndex, Item* itemTarget) { - ExecuteScript([&](AllSpellScript* script) - { - script->OnDummyEffect(caster, spellID, effIndex, itemTarget); - }); + CALL_ENABLED_HOOKS(AllSpellScript, ALLSPELLHOOK_ON_DUMMY_EFFECT_ITEM, script->OnDummyEffect(caster, spellID, effIndex, itemTarget)); } -AllSpellScript::AllSpellScript(char const* name) - : ScriptObject(name) +AllSpellScript::AllSpellScript(char const* name, std::vector enabledHooks) + : ScriptObject(name, ALLSPELLHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < ALLSPELLHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/AllSpellScript.h b/src/server/game/Scripting/ScriptDefines/AllSpellScript.h index 2e1899403..9f1682f2f 100644 --- a/src/server/game/Scripting/ScriptDefines/AllSpellScript.h +++ b/src/server/game/Scripting/ScriptDefines/AllSpellScript.h @@ -19,6 +19,25 @@ #define SCRIPT_OBJECT_ALL_SPELL_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum AllSpellHook +{ + ALLSPELLHOOK_ON_CALC_MAX_DURATION, + ALLSPELLHOOK_CAN_MOD_AURA_EFFECT_DAMAGE_DONE, + ALLSPELLHOOK_CAN_MOD_AURA_EFFECT_MOD_DAMAGE_PERCENT_DONE, + ALLSPELLHOOK_ON_SPELL_CHECK_CAST, + ALLSPELLHOOK_CAN_PREPARE, + ALLSPELLHOOK_CAN_SCALING_EVERYTHING, + ALLSPELLHOOK_CAN_SELECT_SPEC_TALENT, + ALLSPELLHOOK_ON_SCALE_AURA_UNIT_ADD, + ALLSPELLHOOK_ON_REMOVE_AURA_SCALE_TARGETS, + ALLSPELLHOOK_ON_BEFORE_AURA_RANK_FOR_LEVEL, + ALLSPELLHOOK_ON_DUMMY_EFFECT_GAMEOBJECT, + ALLSPELLHOOK_ON_DUMMY_EFFECT_CREATURE, + ALLSPELLHOOK_ON_DUMMY_EFFECT_ITEM, + ALLSPELLHOOK_END +}; enum SpellCastResult : uint8; enum SpellEffIndex : uint8; @@ -26,7 +45,7 @@ enum SpellEffIndex : uint8; class AllSpellScript : public ScriptObject { protected: - AllSpellScript(const char* name); + AllSpellScript(const char* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } From a4af83b277d47a1e5827e19095ee5089ac075606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:59:56 +0800 Subject: [PATCH 27/45] feat(Core/Scripts): Optimize AllCommandScript (#18703) * Add files via upload * Update AllCommandScript.h --- .../ScriptDefines/AllCommandScript.cpp | 23 ++++++++----------- .../ScriptDefines/AllCommandScript.h | 10 +++++++- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/AllCommandScript.cpp b/src/server/game/Scripting/ScriptDefines/AllCommandScript.cpp index b30b9e601..0ab2f297f 100644 --- a/src/server/game/Scripting/ScriptDefines/AllCommandScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AllCommandScript.cpp @@ -21,24 +21,21 @@ void ScriptMgr::OnHandleDevCommand(Player* player, bool& enable) { - ExecuteScript([&](AllCommandScript* script) - { - script->OnHandleDevCommand(player, enable); - }); + CALL_ENABLED_HOOKS(AllCommandScript, ALLCOMMANDHOOK_ON_HANDLE_DEV_COMMAND, script->OnHandleDevCommand(player, enable)); } bool ScriptMgr::CanExecuteCommand(ChatHandler& handler, std::string_view cmdStr) { - auto ret = IsValidBoolScript([&](AllCommandScript* script) - { - return !script->CanExecuteCommand(handler, cmdStr); - }); - - return ReturnValidBool(ret); + CALL_ENABLED_BOOLEAN_HOOKS(AllCommandScript, ALLCOMMANDHOOK_CAN_EXECUTE_COMMAND, !script->CanExecuteCommand(handler, cmdStr)); } -AllCommandScript::AllCommandScript(const char* name) - : ScriptObject(name) +AllCommandScript::AllCommandScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, ALLCOMMANDHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < ALLCOMMANDHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } diff --git a/src/server/game/Scripting/ScriptDefines/AllCommandScript.h b/src/server/game/Scripting/ScriptDefines/AllCommandScript.h index 68d582490..509822e7a 100644 --- a/src/server/game/Scripting/ScriptDefines/AllCommandScript.h +++ b/src/server/game/Scripting/ScriptDefines/AllCommandScript.h @@ -19,11 +19,19 @@ #define SCRIPT_OBJECT_ALL_COMMAND_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum AllCommandHook +{ + ALLCOMMANDHOOK_ON_HANDLE_DEV_COMMAND, + ALLCOMMANDHOOK_CAN_EXECUTE_COMMAND, + ALLCOMMANDHOOK_END +}; class AllCommandScript : public ScriptObject { protected: - AllCommandScript(const char* name); + AllCommandScript(const char* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } From b3a332f57cf00b0e3bad302e228fdf9826994883 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 22:00:16 +0800 Subject: [PATCH 28/45] feat(Core/Scripts): Optimize AllBattlegroundScript (#18704) * Add files via upload * Update AllBattlegroundScript.h --- .../ScriptDefines/AllBattlegroundScript.cpp | 127 +++++------------- .../ScriptDefines/AllBattlegroundScript.h | 24 +++- 2 files changed, 59 insertions(+), 92 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.cpp b/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.cpp index b5828687a..0c9ecfc20 100644 --- a/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.cpp @@ -21,148 +21,93 @@ void ScriptMgr::OnBattlegroundStart(Battleground* bg) { - ExecuteScript([&](AllBattlegroundScript* script) - { - script->OnBattlegroundStart(bg); - }); + CALL_ENABLED_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_START, script->OnBattlegroundStart(bg)); } void ScriptMgr::OnBattlegroundEndReward(Battleground* bg, Player* player, TeamId winnerTeamId) { - ExecuteScript([&](AllBattlegroundScript* script) - { - script->OnBattlegroundEndReward(bg, player, winnerTeamId); - }); + CALL_ENABLED_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_END_REWARD, script->OnBattlegroundEndReward(bg, player, winnerTeamId)); } void ScriptMgr::OnBattlegroundUpdate(Battleground* bg, uint32 diff) { - ExecuteScript([&](AllBattlegroundScript* script) - { - script->OnBattlegroundUpdate(bg, diff); - }); + CALL_ENABLED_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_UPDATE, script->OnBattlegroundUpdate(bg, diff)); } void ScriptMgr::OnBattlegroundAddPlayer(Battleground* bg, Player* player) { - ExecuteScript([&](AllBattlegroundScript* script) - { - script->OnBattlegroundAddPlayer(bg, player); - }); + CALL_ENABLED_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_ADD_PLAYER, script->OnBattlegroundAddPlayer(bg, player)); } void ScriptMgr::OnBattlegroundBeforeAddPlayer(Battleground* bg, Player* player) { - ExecuteScript([&](AllBattlegroundScript* script) - { - script->OnBattlegroundBeforeAddPlayer(bg, player); - }); + CALL_ENABLED_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_BEFORE_ADD_PLAYER, script->OnBattlegroundBeforeAddPlayer(bg, player)); } void ScriptMgr::OnBattlegroundRemovePlayerAtLeave(Battleground* bg, Player* player) { - ExecuteScript([&](AllBattlegroundScript* script) - { - script->OnBattlegroundRemovePlayerAtLeave(bg, player); - }); -} - -void ScriptMgr::OnAddGroup(BattlegroundQueue* queue, GroupQueueInfo* ginfo, uint32& index, Player* leader, Group* group, BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* bracketEntry, - uint8 arenaType, bool isRated, bool isPremade, uint32 arenaRating, uint32 matchmakerRating, uint32 arenaTeamId, uint32 opponentsArenaTeamId) -{ - ExecuteScript([&](AllBattlegroundScript* script) - { - script->OnAddGroup(queue, ginfo, index, leader, group, bgTypeId, bracketEntry, - arenaType, isRated, isPremade, arenaRating, matchmakerRating, arenaTeamId, opponentsArenaTeamId); - }); -} - -bool ScriptMgr::CanFillPlayersToBG(BattlegroundQueue* queue, Battleground* bg, BattlegroundBracketId bracket_id) -{ - auto ret = IsValidBoolScript([&](AllBattlegroundScript* script) - { - return !script->CanFillPlayersToBG(queue, bg, bracket_id); - }); - - return ReturnValidBool(ret); -} - -bool ScriptMgr::IsCheckNormalMatch(BattlegroundQueue* queue, Battleground* bgTemplate, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers) -{ - auto ret = IsValidBoolScript([&](AllBattlegroundScript* script) - { - return script->IsCheckNormalMatch(queue, bgTemplate, bracket_id, minPlayers, maxPlayers); - }); - - return ReturnValidBool(ret, true); + CALL_ENABLED_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_REMOVE_PLAYER_AT_LEAVE, script->OnBattlegroundRemovePlayerAtLeave(bg, player)); } void ScriptMgr::OnQueueUpdate(BattlegroundQueue* queue, uint32 diff, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id, uint8 arenaType, bool isRated, uint32 arenaRating) { - ExecuteScript([&](AllBattlegroundScript* script) - { - script->OnQueueUpdate(queue, diff, bgTypeId, bracket_id, arenaType, isRated, arenaRating); - }); + CALL_ENABLED_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_QUEUE_UPDATE, script->OnQueueUpdate(queue, diff, bgTypeId, bracket_id, arenaType, isRated, arenaRating)); +} + +void ScriptMgr::OnAddGroup(BattlegroundQueue* queue, GroupQueueInfo* ginfo, uint32& index, Player* leader, Group* group, BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 arenaType, bool isRated, bool isPremade, uint32 arenaRating, uint32 matchmakerRating, uint32 arenaTeamId, uint32 opponentsArenaTeamId) +{ + CALL_ENABLED_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_ADD_GROUP, script->OnAddGroup(queue, ginfo, index, leader, group, bgTypeId, bracketEntry, arenaType, isRated, isPremade, arenaRating, matchmakerRating, arenaTeamId, opponentsArenaTeamId)); +} + +bool ScriptMgr::CanFillPlayersToBG(BattlegroundQueue* queue, Battleground* bg, BattlegroundBracketId bracket_id) +{ + CALL_ENABLED_BOOLEAN_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_CAN_FILL_PLAYERS_TO_BG, !script->CanFillPlayersToBG(queue, bg, bracket_id)); +} + +bool ScriptMgr::IsCheckNormalMatch(BattlegroundQueue* queue, Battleground* bgTemplate, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers) +{ + CALL_ENABLED_BOOLEAN_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_IS_CHECK_NORMAL_MATCH, script->IsCheckNormalMatch(queue, bgTemplate, bracket_id, minPlayers, maxPlayers)); } bool ScriptMgr::CanSendMessageBGQueue(BattlegroundQueue* queue, Player* leader, Battleground* bg, PvPDifficultyEntry const* bracketEntry) { - auto ret = IsValidBoolScript([&](AllBattlegroundScript* script) - { - return !script->CanSendMessageBGQueue(queue, leader, bg, bracketEntry); - }); - - return ReturnValidBool(ret); + CALL_ENABLED_BOOLEAN_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_CAN_SEND_MESSAGE_BG_QUEUE, !script->CanSendMessageBGQueue(queue, leader, bg, bracketEntry)); } bool ScriptMgr::OnBeforeSendJoinMessageArenaQueue(BattlegroundQueue* queue, Player* leader, GroupQueueInfo* ginfo, PvPDifficultyEntry const* bracketEntry, bool isRated) { - auto ret = IsValidBoolScript([&](AllBattlegroundScript* script) - { - return !script->OnBeforeSendJoinMessageArenaQueue(queue, leader, ginfo, bracketEntry, isRated); - }); - - return ReturnValidBool(ret); + CALL_ENABLED_BOOLEAN_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_BEFORE_SEND_JOIN_MESSAGE_ARENA_QUEUE, !script->OnBeforeSendJoinMessageArenaQueue(queue, leader, ginfo, bracketEntry, isRated)); } bool ScriptMgr::OnBeforeSendExitMessageArenaQueue(BattlegroundQueue* queue, GroupQueueInfo* ginfo) { - auto ret = IsValidBoolScript([&](AllBattlegroundScript* script) - { - return !script->OnBeforeSendExitMessageArenaQueue(queue, ginfo); - }); - - return ReturnValidBool(ret); + CALL_ENABLED_BOOLEAN_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_BEFORE_SEND_EXIT_MESSAGE_ARENA_QUEUE, !script->OnBeforeSendExitMessageArenaQueue(queue, ginfo)); } void ScriptMgr::OnBattlegroundEnd(Battleground* bg, TeamId winnerTeam) { - ExecuteScript([&](AllBattlegroundScript* script) - { - script->OnBattlegroundEnd(bg, winnerTeam); - }); + CALL_ENABLED_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_END, script->OnBattlegroundEnd(bg, winnerTeam)); } void ScriptMgr::OnBattlegroundDestroy(Battleground* bg) { - ExecuteScript([&](AllBattlegroundScript* script) - { - script->OnBattlegroundDestroy(bg); - }); + CALL_ENABLED_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_DESTROY, script->OnBattlegroundDestroy(bg)); } void ScriptMgr::OnBattlegroundCreate(Battleground* bg) { - ExecuteScript([&](AllBattlegroundScript* script) - { - script->OnBattlegroundCreate(bg); - }); + CALL_ENABLED_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_CREATE, script->OnBattlegroundCreate(bg)); } -AllBattlegroundScript::AllBattlegroundScript(char const* name) : - ScriptObject(name) +AllBattlegroundScript::AllBattlegroundScript(char const* name, std::vector enabledHooks) : + ScriptObject(name, ALLBATTLEGROUNDHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < ALLBATTLEGROUNDHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.h b/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.h index 379cc4635..880518b5d 100644 --- a/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.h +++ b/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.h @@ -19,6 +19,28 @@ #define SCRIPT_OBJECT_ALL_BATTLEGROUND_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum AllBattlegroundHook +{ + ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_START, + ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_END_REWARD, + ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_UPDATE, + ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_ADD_PLAYER, + ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_BEFORE_ADD_PLAYER, + ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_REMOVE_PLAYER_AT_LEAVE, + ALLBATTLEGROUNDHOOK_ON_QUEUE_UPDATE, + ALLBATTLEGROUNDHOOK_ON_ADD_GROUP, + ALLBATTLEGROUNDHOOK_CAN_FILL_PLAYERS_TO_BG, + ALLBATTLEGROUNDHOOK_IS_CHECK_NORMAL_MATCH, + ALLBATTLEGROUNDHOOK_CAN_SEND_MESSAGE_BG_QUEUE, + ALLBATTLEGROUNDHOOK_ON_BEFORE_SEND_JOIN_MESSAGE_ARENA_QUEUE, + ALLBATTLEGROUNDHOOK_ON_BEFORE_SEND_EXIT_MESSAGE_ARENA_QUEUE, + ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_END, + ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_DESTROY, + ALLBATTLEGROUNDHOOK_ON_BATTLEGROUND_CREATE, + ALLBATTLEGROUNDHOOK_END +}; enum BattlegroundBracketId : uint8; enum BattlegroundTypeId : uint8; @@ -27,7 +49,7 @@ enum TeamId : uint8; class AllBattlegroundScript : public ScriptObject { protected: - AllBattlegroundScript(const char* name); + AllBattlegroundScript(const char* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } From 0e1888ac92e4ceab56128d656d07dc9c3a635fd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 22:00:31 +0800 Subject: [PATCH 29/45] feat(Core/Scripts): Optimize AchievementScript (#18705) * Add files via upload * Update AchievementScript.h --- .../ScriptDefines/AchievementScript.cpp | 57 +++++-------------- .../ScriptDefines/AchievementScript.h | 13 ++++- 2 files changed, 25 insertions(+), 45 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/AchievementScript.cpp b/src/server/game/Scripting/ScriptDefines/AchievementScript.cpp index 4dc58634d..9bc742b73 100644 --- a/src/server/game/Scripting/ScriptDefines/AchievementScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AchievementScript.cpp @@ -21,69 +21,38 @@ void ScriptMgr::SetRealmCompleted(AchievementEntry const* achievement) { - ExecuteScript([&](AchievementScript* script) - { - script->SetRealmCompleted(achievement); - }); + CALL_ENABLED_HOOKS(AchievementScript, ACHIEVEMENTHOOK_SET_REALM_COMPLETED, script->SetRealmCompleted(achievement)); } bool ScriptMgr::IsCompletedCriteria(AchievementMgr* mgr, AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement, CriteriaProgress const* progress) { - auto ret = IsValidBoolScript([&](AchievementScript* script) - { - return !script->IsCompletedCriteria(mgr, achievementCriteria, achievement, progress); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(AchievementScript, ACHIEVEMENTHOOK_IS_COMPLETED_CRITERIA, !script->IsCompletedCriteria(mgr, achievementCriteria, achievement, progress)); } bool ScriptMgr::IsRealmCompleted(AchievementGlobalMgr const* globalmgr, AchievementEntry const* achievement, SystemTimePoint completionTime) { - auto ret = IsValidBoolScript([&](AchievementScript* script) - { - return !script->IsRealmCompleted(globalmgr, achievement, completionTime); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(AchievementScript, ACHIEVEMENTHOOK_IS_REALM_COMPLETED, !script->IsRealmCompleted(globalmgr, achievement, completionTime)); } void ScriptMgr::OnBeforeCheckCriteria(AchievementMgr* mgr, std::list const* achievementCriteriaList) { - ExecuteScript([&](AchievementScript* script) - { - script->OnBeforeCheckCriteria(mgr, achievementCriteriaList); - }); + CALL_ENABLED_HOOKS(AchievementScript, ACHIEVEMENTHOOK_ON_BEFORE_CHECK_CRITERIA, script->OnBeforeCheckCriteria(mgr, achievementCriteriaList)); } bool ScriptMgr::CanCheckCriteria(AchievementMgr* mgr, AchievementCriteriaEntry const* achievementCriteria) { - auto ret = IsValidBoolScript([&](AchievementScript* script) - { - return !script->CanCheckCriteria(mgr, achievementCriteria); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(AchievementScript, ACHIEVEMENTHOOK_CAN_CHECK_CRITERIA, !script->CanCheckCriteria(mgr, achievementCriteria)); } -AchievementScript::AchievementScript(const char* name) - : ScriptObject(name) +AchievementScript::AchievementScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, ACHIEVEMENTHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < ACHIEVEMENTHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/AchievementScript.h b/src/server/game/Scripting/ScriptDefines/AchievementScript.h index d1e8ab076..84aa3746e 100644 --- a/src/server/game/Scripting/ScriptDefines/AchievementScript.h +++ b/src/server/game/Scripting/ScriptDefines/AchievementScript.h @@ -21,11 +21,22 @@ #include "Duration.h" #include "ScriptObject.h" #include +#include + +enum AchievementHook +{ + ACHIEVEMENTHOOK_SET_REALM_COMPLETED, + ACHIEVEMENTHOOK_IS_COMPLETED_CRITERIA, + ACHIEVEMENTHOOK_IS_REALM_COMPLETED, + ACHIEVEMENTHOOK_ON_BEFORE_CHECK_CRITERIA, + ACHIEVEMENTHOOK_CAN_CHECK_CRITERIA, + ACHIEVEMENTHOOK_END +}; class AchievementScript : public ScriptObject { protected: - AchievementScript(const char* name); + AchievementScript(const char* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } From c796d9291eb0c796a3b3cb1c87c2c127182ec251 Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Fri, 12 Apr 2024 17:12:57 +0200 Subject: [PATCH 30/45] fix(Core/PlayerScript): Fix adding XP on quest completion and other overlooks. (#18728) * fix(Core/PlayerScript): Fix adding XP on quest completion. * Fix other overlooks. --- .../game/Scripting/ScriptDefines/AllBattlegroundScript.cpp | 2 +- src/server/game/Scripting/ScriptDefines/AllSpellScript.cpp | 2 +- src/server/game/Scripting/ScriptDefines/GlobalScript.cpp | 2 +- src/server/game/Scripting/ScriptDefines/PlayerScript.cpp | 4 ++-- src/server/game/Scripting/ScriptDefines/UnitScript.cpp | 4 ++-- src/server/game/Scripting/ScriptMgrMacros.h | 6 ++++++ 6 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.cpp b/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.cpp index 0c9ecfc20..9367a748b 100644 --- a/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AllBattlegroundScript.cpp @@ -66,7 +66,7 @@ bool ScriptMgr::CanFillPlayersToBG(BattlegroundQueue* queue, Battleground* bg, B bool ScriptMgr::IsCheckNormalMatch(BattlegroundQueue* queue, Battleground* bgTemplate, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers) { - CALL_ENABLED_BOOLEAN_HOOKS(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_IS_CHECK_NORMAL_MATCH, script->IsCheckNormalMatch(queue, bgTemplate, bracket_id, minPlayers, maxPlayers)); + CALL_ENABLED_BOOLEAN_HOOKS_WITH_DEFAULT_FALSE(AllBattlegroundScript, ALLBATTLEGROUNDHOOK_IS_CHECK_NORMAL_MATCH, script->IsCheckNormalMatch(queue, bgTemplate, bracket_id, minPlayers, maxPlayers)); } bool ScriptMgr::CanSendMessageBGQueue(BattlegroundQueue* queue, Player* leader, Battleground* bg, PvPDifficultyEntry const* bracketEntry) diff --git a/src/server/game/Scripting/ScriptDefines/AllSpellScript.cpp b/src/server/game/Scripting/ScriptDefines/AllSpellScript.cpp index f7e057911..0c3fea4fa 100644 --- a/src/server/game/Scripting/ScriptDefines/AllSpellScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AllSpellScript.cpp @@ -46,7 +46,7 @@ bool ScriptMgr::CanPrepare(Spell* spell, SpellCastTargets const* targets, AuraEf bool ScriptMgr::CanScalingEverything(Spell* spell) { - CALL_ENABLED_BOOLEAN_HOOKS(AllSpellScript, ALLSPELLHOOK_CAN_SCALING_EVERYTHING, script->CanScalingEverything(spell)); + CALL_ENABLED_BOOLEAN_HOOKS_WITH_DEFAULT_FALSE(AllSpellScript, ALLSPELLHOOK_CAN_SCALING_EVERYTHING, script->CanScalingEverything(spell)); } bool ScriptMgr::CanSelectSpecTalent(Spell* spell) diff --git a/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp b/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp index 17712d132..3d2ccc452 100644 --- a/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp @@ -91,7 +91,7 @@ bool ScriptMgr::OnIsAffectedBySpellModCheck(SpellInfo const* affectSpell, SpellI bool ScriptMgr::OnSpellHealingBonusTakenNegativeModifiers(Unit const* target, Unit const* caster, SpellInfo const* spellInfo, float& val) { - CALL_ENABLED_BOOLEAN_HOOKS(GlobalScript, GLOBALHOOK_ON_SPELL_HEALING_BONUS_TAKEN_NEGATIVE_MODIFIERS, script->OnSpellHealingBonusTakenNegativeModifiers(target, caster, spellInfo, val)); + CALL_ENABLED_BOOLEAN_HOOKS_WITH_DEFAULT_FALSE(GlobalScript, GLOBALHOOK_ON_SPELL_HEALING_BONUS_TAKEN_NEGATIVE_MODIFIERS, script->OnSpellHealingBonusTakenNegativeModifiers(target, caster, spellInfo, val)); } void ScriptMgr::OnLoadSpellCustomAttr(SpellInfo* spell) diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp index 948a0dc58..67e9598ed 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp @@ -426,7 +426,7 @@ bool ScriptMgr::CanJoinInBattlegroundQueue(Player* player, ObjectGuid Battlemast bool ScriptMgr::ShouldBeRewardedWithMoneyInsteadOfExp(Player* player) { - CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_SHOULD_BE_REWARDED_WITH_MONEY_INSTEAD_OF_EXP, script->ShouldBeRewardedWithMoneyInsteadOfExp(player)); + CALL_ENABLED_BOOLEAN_HOOKS_WITH_DEFAULT_FALSE(PlayerScript, PLAYERHOOK_SHOULD_BE_REWARDED_WITH_MONEY_INSTEAD_OF_EXP, script->ShouldBeRewardedWithMoneyInsteadOfExp(player)); } void ScriptMgr::OnBeforeTempSummonInitStats(Player* player, TempSummon* tempSummon, uint32& duration) @@ -596,7 +596,7 @@ void ScriptMgr::OnGetMaxSkillValue(Player* player, uint32 skill, int32& result, bool ScriptMgr::OnPlayerHasActivePowerType(Player const* player, Powers power) { - CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_PLAYER_HAS_ACTIVE_POWER_TYPE, !script->OnPlayerHasActivePowerType(player, power)); + CALL_ENABLED_BOOLEAN_HOOKS_WITH_DEFAULT_FALSE(PlayerScript, PLAYERHOOK_ON_PLAYER_HAS_ACTIVE_POWER_TYPE, script->OnPlayerHasActivePowerType(player, power)); } void ScriptMgr::OnUpdateGatheringSkill(Player *player, uint32 skillId, uint32 currentLevel, uint32 gray, uint32 green, uint32 yellow, uint32 &gain) diff --git a/src/server/game/Scripting/ScriptDefines/UnitScript.cpp b/src/server/game/Scripting/ScriptDefines/UnitScript.cpp index a2921264d..5470b3a32 100644 --- a/src/server/game/Scripting/ScriptDefines/UnitScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/UnitScript.cpp @@ -110,12 +110,12 @@ bool ScriptMgr::CanSetPhaseMask(Unit const* unit, uint32 newPhaseMask, bool upda bool ScriptMgr::IsCustomBuildValuesUpdate(Unit const* unit, uint8 updateType, ByteBuffer& fieldBuffer, Player const* target, uint16 index) { - CALL_ENABLED_BOOLEAN_HOOKS(UnitScript, UNITHOOK_IS_CUSTOM_BUILD_VALUES_UPDATE, script->IsCustomBuildValuesUpdate(unit, updateType, fieldBuffer, target, index)); + CALL_ENABLED_BOOLEAN_HOOKS_WITH_DEFAULT_FALSE(UnitScript, UNITHOOK_IS_CUSTOM_BUILD_VALUES_UPDATE, script->IsCustomBuildValuesUpdate(unit, updateType, fieldBuffer, target, index)); } bool ScriptMgr::ShouldTrackValuesUpdatePosByIndex(Unit const* unit, uint8 updateType, uint16 index) { - CALL_ENABLED_BOOLEAN_HOOKS(UnitScript, UNITHOOK_SHOULD_TRACK_VALUES_UPDATE_POS_BY_INDEX, script->ShouldTrackValuesUpdatePosByIndex(unit, updateType, index)); + CALL_ENABLED_BOOLEAN_HOOKS_WITH_DEFAULT_FALSE(UnitScript, UNITHOOK_SHOULD_TRACK_VALUES_UPDATE_POS_BY_INDEX, script->ShouldTrackValuesUpdatePosByIndex(unit, updateType, index)); } void ScriptMgr::OnPatchValuesUpdate(Unit const* unit, ByteBuffer& valuesUpdateBuf, BuildValuesCachePosPointers& posPointers, Player* target) diff --git a/src/server/game/Scripting/ScriptMgrMacros.h b/src/server/game/Scripting/ScriptMgrMacros.h index fc7895e81..5b5dcb190 100644 --- a/src/server/game/Scripting/ScriptMgrMacros.h +++ b/src/server/game/Scripting/ScriptMgrMacros.h @@ -79,4 +79,10 @@ inline bool ReturnValidBool(Optional ret, bool need = false) for (auto const& script : ScriptRegistry::EnabledHooks[hookType]) { if (action) return false; } \ return true; +#define CALL_ENABLED_BOOLEAN_HOOKS_WITH_DEFAULT_FALSE(scriptType, hookType, action) \ + if (ScriptRegistry::EnabledHooks[hookType].empty()) \ + return false; \ + for (auto const& script : ScriptRegistry::EnabledHooks[hookType]) { if (action) return false; } \ + return false; + #endif // _SCRIPT_MGR_MACRO_H_ From ec10eb841cd223c2c2b04a5b55fb9d9b23076687 Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Fri, 12 Apr 2024 18:28:24 +0200 Subject: [PATCH 31/45] fix(Scripts/Hyjal): Archimonde finger of death condition (#18681) * init * yes * Update src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp --- .../BattleForMountHyjal/boss_archimonde.cpp | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp index 60836d4c8..0473218b5 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp @@ -66,6 +66,7 @@ enum Summons CREATURE_DOOMFIRE_SPIRIT = 18104, CREATURE_ANCIENT_WISP = 17946, CREATURE_CHANNEL_TARGET = 22418, + DISPLAY_ID_TRIGGER = 11686 }; enum Events @@ -279,13 +280,6 @@ struct boss_archimonde : public BossAI DoCastVictim(SPELL_RED_SKY_EFFECT); DoCastVictim(SPELL_HAND_OF_DEATH); }, 3s); - ScheduleTimedEvent(2500ms, [&] - { - if (!(me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim()))) - { - DoCastRandomTarget(SPELL_FINGER_OF_DEATH); - } - }, 3500ms); }); } @@ -301,7 +295,7 @@ struct boss_archimonde : public BossAI if (Creature* nordrassil = me->SummonCreature(CREATURE_CHANNEL_TARGET, nordrassilPosition, TEMPSUMMON_TIMED_DESPAWN, 1200000)) { nordrassil->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - nordrassil->SetDisplayId(11686); //TODO: make enum + nordrassil->SetDisplayId(DISPLAY_ID_TRIGGER); DoCast(nordrassil, SPELL_DRAIN_WORLD_TREE); _isChanneling = true; nordrassil->AI()->DoCast(me, SPELL_DRAIN_WORLD_TREE_2, true); @@ -365,6 +359,26 @@ struct boss_archimonde : public BossAI } } }, 5s); + ScheduleTimedEvent(5000ms, [&] + { + bool noPlayersInRange = true; + if (Map* map = me->GetMap()) + { + map->DoForAllPlayers([&noPlayersInRange, this](Player* player) + { + if (me->IsWithinMeleeRange(player)) + { + noPlayersInRange = false; + return false; + } + return true; + }); + } + if (noPlayersInRange) + { + DoCastRandomTarget(SPELL_FINGER_OF_DEATH); + } + }, 3500ms); instance->SetData(DATA_SPAWN_WAVES, 1); } From 11ac6c70db9d721f90878448c752c134daa7f2f7 Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Fri, 12 Apr 2024 21:58:07 +0200 Subject: [PATCH 32/45] fix(Core/Scripts): Fix one more typo after scripts refactoring (#18730) fix(Core/Scripts): Fix one more typo after scripts refactoring. --- src/server/game/Scripting/ScriptMgrMacros.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Scripting/ScriptMgrMacros.h b/src/server/game/Scripting/ScriptMgrMacros.h index 5b5dcb190..10232c589 100644 --- a/src/server/game/Scripting/ScriptMgrMacros.h +++ b/src/server/game/Scripting/ScriptMgrMacros.h @@ -82,7 +82,7 @@ inline bool ReturnValidBool(Optional ret, bool need = false) #define CALL_ENABLED_BOOLEAN_HOOKS_WITH_DEFAULT_FALSE(scriptType, hookType, action) \ if (ScriptRegistry::EnabledHooks[hookType].empty()) \ return false; \ - for (auto const& script : ScriptRegistry::EnabledHooks[hookType]) { if (action) return false; } \ + for (auto const& script : ScriptRegistry::EnabledHooks[hookType]) { if (action) return true; } \ return false; #endif // _SCRIPT_MGR_MACRO_H_ From 22c8469d8ce63b4104778ebed5d7c99bc496cb78 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 13 Apr 2024 12:14:07 -0300 Subject: [PATCH 33/45] fix(Core/Spells): Fix Anetheron sleep only targetting himself (#18735) --- src/server/game/Spells/SpellInfoCorrections.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 560b68ceb..ae0797b8e 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -126,7 +126,6 @@ void SpellMgr::LoadSpellInfoCorrections() ApplySpellFix({ 63665, // Charge (Argent Tournament emote on riders) - 31298, // Sleep (needs target selection script) 2895, // Wrath of Air Totem rank 1 (Aura) 68933, // Wrath of Air Totem rank 2 (Aura) 29200 // Purify Helboar Meat From 2cd8f0bf87f9b15a302ae3f9d7a37e4e2fbd1e60 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 13 Apr 2024 12:14:32 -0300 Subject: [PATCH 34/45] fix(DB/Creature): Towering Infernals should be immune to taunt (#18733) --- data/sql/updates/pending_db_world/rev_1713017015376822300.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1713017015376822300.sql diff --git a/data/sql/updates/pending_db_world/rev_1713017015376822300.sql b/data/sql/updates/pending_db_world/rev_1713017015376822300.sql new file mode 100644 index 000000000..35d48ac23 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1713017015376822300.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `flags_extra` = `flags_extra` |256 WHERE `entry` = 17818; From 6add782f1db9bef1d0e0c85b7f2c41821119a537 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 13 Apr 2024 15:14:57 +0000 Subject: [PATCH 35/45] chore(DB): import pending files Referenced commit(s): 22c8469d8ce63b4104778ebed5d7c99bc496cb78 --- .../rev_1713017015376822300.sql => db_world/2024_04_13_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1713017015376822300.sql => db_world/2024_04_13_00.sql} (67%) diff --git a/data/sql/updates/pending_db_world/rev_1713017015376822300.sql b/data/sql/updates/db_world/2024_04_13_00.sql similarity index 67% rename from data/sql/updates/pending_db_world/rev_1713017015376822300.sql rename to data/sql/updates/db_world/2024_04_13_00.sql index 35d48ac23..fcc9aa2d0 100644 --- a/data/sql/updates/pending_db_world/rev_1713017015376822300.sql +++ b/data/sql/updates/db_world/2024_04_13_00.sql @@ -1,2 +1,3 @@ +-- DB update 2024_04_07_00 -> 2024_04_13_00 -- UPDATE `creature_template` SET `flags_extra` = `flags_extra` |256 WHERE `entry` = 17818; From cdc72216c8b9282906fdd3634364a29c56973fd0 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 13 Apr 2024 12:15:20 -0300 Subject: [PATCH 36/45] =?UTF-8?q?fix(Scripts/Hyjal):=20Fix=20Mark=20of=20K?= =?UTF-8?q?azrogal=20not=20dealing=20damage=20when=20unab=E2=80=A6=20(#187?= =?UTF-8?q?32)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(Scripts/Hyjal): Fix Mark of Kazrogal not dealing damage when unable to drain mana --- .../CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp index 528a68ca7..1a4df42d9 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp @@ -160,7 +160,7 @@ public: { Unit* target = GetTarget(); - if (target->GetPower(POWER_MANA) == 0) + if (target->GetPower(POWER_MANA) < aurEff->GetBaseAmount()) { target->CastSpell(target, SPELL_MARK_DAMAGE, true, nullptr, aurEff); // Remove aura From c8abb8c73e42163cc873f121b43590d4ec3fcdfb Mon Sep 17 00:00:00 2001 From: privatecore Date: Sat, 13 Apr 2024 20:12:02 +0200 Subject: [PATCH 37/45] fix(Docker): Fix docker compose build failed when using USER with UID:GID != 1000 (#18731) --- docker-compose.yml | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b6ad63223..cfdfe1a5c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,6 +36,10 @@ services: context: . target: db-import dockerfile: apps/docker/Dockerfile + args: + USER_ID: ${DOCKER_USER_ID:-1000} + GROUP_ID: ${DOCKER_GROUP_ID:-1000} + DOCKER_USER: ${DOCKER_USER:-acore} environment: AC_DATA_DIR: "/azerothcore/env/dist/data" AC_LOGS_DIR: "/azerothcore/env/dist/logs" @@ -57,6 +61,10 @@ services: context: . target: worldserver dockerfile: apps/docker/Dockerfile + args: + USER_ID: ${DOCKER_USER_ID:-1000} + GROUP_ID: ${DOCKER_GROUP_ID:-1000} + DOCKER_USER: ${DOCKER_USER:-acore} networks: - ac-network stdin_open: true @@ -94,6 +102,10 @@ services: context: . target: authserver dockerfile: apps/docker/Dockerfile + args: + USER_ID: ${DOCKER_USER_ID:-1000} + GROUP_ID: ${DOCKER_GROUP_ID:-1000} + DOCKER_USER: ${DOCKER_USER:-acore} networks: - ac-network tty: true @@ -119,7 +131,6 @@ services: ac-client-data-init: container_name: ac-client-data-init image: acore/ac-wotlk-client-data:${DOCKER_IMAGE_TAG:-master} - user: ${DOCKER_USER:-root} build: context: . target: client-data @@ -136,11 +147,14 @@ services: ac-tools: container_name: ac-tools image: acore/ac-wotlk-tools:${DOCKER_IMAGE_TAG:-master} - user: ${DOCKER_USER:-root} build: context: . target: tools dockerfile: apps/docker/Dockerfile + args: + USER_ID: ${DOCKER_USER_ID:-1000} + GROUP_ID: ${DOCKER_GROUP_ID:-1000} + DOCKER_USER: ${DOCKER_USER:-acore} working_dir: /azerothcore/env/client/ volumes: # this is not the directory of the extracted data! It's the client folder used by the extractors @@ -159,7 +173,6 @@ services: ac-dev-server: tty: true image: acore/ac-wotlk-dev-server:${DOCKER_IMAGE_TAG:-master} - user: ${DOCKER_USER:-root} build: context: . dockerfile: ./apps/docker/Dockerfile.dev-server From 564192f8810b32823925c9c1644a0abfa84d9d03 Mon Sep 17 00:00:00 2001 From: Walter Pagani Date: Sun, 14 Apr 2024 08:00:50 -0300 Subject: [PATCH 38/45] fix. Prevent character deletion if you have an email (#18743) * fix. Prevent character deletion if you have an email * Conditional revert * change message * original message --- src/server/game/Handlers/CharacterHandler.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 1c0080b6e..e08e4f828 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -640,6 +640,13 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData) accountId = playerData->AccountId; name = playerData->Name; level = playerData->Level; + + // check mailbox + if (playerData->MailCount) + { + SendCharDelete(CHAR_DELETE_FAILED); + return; + } } // prevent deleting other players' characters using cheating tools From 4294525084bcb13ff2ef539c8eb9826df76305a0 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 14 Apr 2024 08:30:16 -0300 Subject: [PATCH 39/45] fix(Core/Spells): Dive Bomb should not share damage (#18740) --- src/server/game/Spells/SpellMgr.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 1bd906594..0ca1165c9 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3238,7 +3238,6 @@ void SpellMgr::LoadSpellInfoCustomAttributes() case 57467: // Meteor case 26789: // Shard of the Fallen Star case 31436: // Malevolent Cleave - case 35181: // Dive Bomb case 40810: // Saber Lash case 43267: // Saber Lash case 43268: // Saber Lash From a8471d0f87b487659ace526faaad3262a92efcfe Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 14 Apr 2024 08:30:27 -0300 Subject: [PATCH 40/45] fix(Scripts/Hyjal): Azgalor Doom should not be cast on the MT (#18738) --- src/server/game/AI/CoreAI/UnitAI.cpp | 4 ++-- src/server/game/AI/CoreAI/UnitAI.h | 2 +- .../CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index f57e7a2b2..fc2508ae0 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -253,9 +253,9 @@ SpellCastResult UnitAI::DoCastAOE(uint32 spellId, bool triggered) return me->CastSpell((Unit*)nullptr, spellId, triggered); } -SpellCastResult UnitAI::DoCastRandomTarget(uint32 spellId, uint32 threatTablePosition, float dist, bool playerOnly, bool triggered) +SpellCastResult UnitAI::DoCastRandomTarget(uint32 spellId, uint32 threatTablePosition, float dist, bool playerOnly, bool triggered, bool withTank) { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, threatTablePosition, dist, playerOnly)) + if (Unit* target = SelectTarget(SelectTargetMethod::Random, threatTablePosition, dist, playerOnly, withTank)) { return DoCast(target, spellId, triggered); } diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 48190137c..865415f59 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -380,7 +380,7 @@ public: SpellCastResult DoCastToAllHostilePlayers(uint32 spellid, bool triggered = false); SpellCastResult DoCastVictim(uint32 spellId, bool triggered = false); SpellCastResult DoCastAOE(uint32 spellId, bool triggered = false); - SpellCastResult DoCastRandomTarget(uint32 spellId, uint32 threatTablePosition = 0, float dist = 0.0f, bool playerOnly = true, bool triggered = false); + SpellCastResult DoCastRandomTarget(uint32 spellId, uint32 threatTablePosition = 0, float dist = 0.0f, bool playerOnly = true, bool triggered = false, bool withTank = true); // Cast spell on the top threat target, which may not be the current victim. SpellCastResult DoCastMaxThreat(uint32 spellId, uint32 threatTablePosition = 0, float dist = 0.0f, bool playerOnly = true, bool triggered = false); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp index bb229853c..a4fb98963 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp @@ -68,7 +68,7 @@ public: context.Repeat(18s, 20s); }).Schedule(45s, 55s, [this](TaskContext context) { - DoCastRandomTarget(SPELL_DOOM, 0, 100.f); + DoCastRandomTarget(SPELL_DOOM, 0, 100.f, true, false, false); Talk(SAY_DOOM); context.Repeat(); }).Schedule(10min, [this](TaskContext context) From c090c8aa25a6f3811965cffe17c59141432cf5e5 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 14 Apr 2024 08:30:40 -0300 Subject: [PATCH 41/45] fix(DB/Creature): Al'lar should despawn on evade (#18736) --- data/sql/updates/pending_db_world/rev_1713022406349814900.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1713022406349814900.sql diff --git a/data/sql/updates/pending_db_world/rev_1713022406349814900.sql b/data/sql/updates/pending_db_world/rev_1713022406349814900.sql new file mode 100644 index 000000000..cca962b9e --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1713022406349814900.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `flags_extra` = `flags_extra` |2147483648 WHERE `entry` = 19514; From 0d8fd9211cb34ca127045fef3dd6c02a17c1e5bf Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 14 Apr 2024 08:30:55 -0300 Subject: [PATCH 42/45] =?UTF-8?q?fix(DB/Creature):=20Remove=20Distract=20i?= =?UTF-8?q?mmunity=20from=20Hyjal=20bosses=20except=20A=E2=80=A6=20(#18737?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(DB/Creature): Remove Distract immunity from Hyjal bosses except Archimonde * Update rev_1713024535116935100.sql --------- Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --- data/sql/updates/pending_db_world/rev_1713024535116935100.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1713024535116935100.sql diff --git a/data/sql/updates/pending_db_world/rev_1713024535116935100.sql b/data/sql/updates/pending_db_world/rev_1713024535116935100.sql new file mode 100644 index 000000000..b8bfeb8a0 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1713024535116935100.sql @@ -0,0 +1,3 @@ +-- +UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask` &~ 8 WHERE `entry` IN (17767, 17808, 17888, 17842); +UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask` | 4 WHERE `entry` IN (17767, 17808, 17888, 17842); From 192861a220c30d5bbfb7ca28a31ff003456266b1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 14 Apr 2024 11:31:06 +0000 Subject: [PATCH 43/45] chore(DB): import pending files Referenced commit(s): 4294525084bcb13ff2ef539c8eb9826df76305a0 --- .../rev_1713022406349814900.sql => db_world/2024_04_14_00.sql} | 1 + .../rev_1713024535116935100.sql => db_world/2024_04_14_01.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1713022406349814900.sql => db_world/2024_04_14_00.sql} (69%) rename data/sql/updates/{pending_db_world/rev_1713024535116935100.sql => db_world/2024_04_14_01.sql} (85%) diff --git a/data/sql/updates/pending_db_world/rev_1713022406349814900.sql b/data/sql/updates/db_world/2024_04_14_00.sql similarity index 69% rename from data/sql/updates/pending_db_world/rev_1713022406349814900.sql rename to data/sql/updates/db_world/2024_04_14_00.sql index cca962b9e..744481d04 100644 --- a/data/sql/updates/pending_db_world/rev_1713022406349814900.sql +++ b/data/sql/updates/db_world/2024_04_14_00.sql @@ -1,2 +1,3 @@ +-- DB update 2024_04_13_00 -> 2024_04_14_00 -- UPDATE `creature_template` SET `flags_extra` = `flags_extra` |2147483648 WHERE `entry` = 19514; diff --git a/data/sql/updates/pending_db_world/rev_1713024535116935100.sql b/data/sql/updates/db_world/2024_04_14_01.sql similarity index 85% rename from data/sql/updates/pending_db_world/rev_1713024535116935100.sql rename to data/sql/updates/db_world/2024_04_14_01.sql index b8bfeb8a0..1afb67f39 100644 --- a/data/sql/updates/pending_db_world/rev_1713024535116935100.sql +++ b/data/sql/updates/db_world/2024_04_14_01.sql @@ -1,3 +1,4 @@ +-- DB update 2024_04_14_00 -> 2024_04_14_01 -- UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask` &~ 8 WHERE `entry` IN (17767, 17808, 17888, 17842); UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask` | 4 WHERE `entry` IN (17767, 17808, 17888, 17842); From cf4e7eda9743725a5e515617b348f3f702b2bb51 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sun, 14 Apr 2024 09:36:46 -0300 Subject: [PATCH 44/45] fix(DB/Spells): Add Pet Spells to Shadowy Necromancer (#18745) Create rev_1713097857608850100.sql --- .../updates/pending_db_world/rev_1713097857608850100.sql | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1713097857608850100.sql diff --git a/data/sql/updates/pending_db_world/rev_1713097857608850100.sql b/data/sql/updates/pending_db_world/rev_1713097857608850100.sql new file mode 100644 index 000000000..6edac565f --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1713097857608850100.sql @@ -0,0 +1,9 @@ +-- +DELETE FROM `creature_template_spell` WHERE (`CreatureID` = 17899); +INSERT INTO `creature_template_spell` (`CreatureID`, `Index`, `Spell`, `VerifiedBuild`) VALUES +(17899, 0, 2, 54205), +(17899, 1, 31626, 54205); + +DELETE FROM `spell_cooldown_overrides` WHERE `Id` = 31626; +INSERT INTO `spell_cooldown_overrides` (`Id`, `RecoveryTime`, `CategoryRecoveryTime`, `Comment`) VALUES +(31626, 5000, 5000, 'Shadowy Necromancer - Unholy Frenzy'); From 6d35eafbacd18c8af902fe41f7056cbd77dfdbc8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 14 Apr 2024 12:37:39 +0000 Subject: [PATCH 45/45] chore(DB): import pending files Referenced commit(s): cf4e7eda9743725a5e515617b348f3f702b2bb51 --- .../rev_1713097857608850100.sql => db_world/2024_04_14_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1713097857608850100.sql => db_world/2024_04_14_02.sql} (90%) diff --git a/data/sql/updates/pending_db_world/rev_1713097857608850100.sql b/data/sql/updates/db_world/2024_04_14_02.sql similarity index 90% rename from data/sql/updates/pending_db_world/rev_1713097857608850100.sql rename to data/sql/updates/db_world/2024_04_14_02.sql index 6edac565f..1c7afe1ba 100644 --- a/data/sql/updates/pending_db_world/rev_1713097857608850100.sql +++ b/data/sql/updates/db_world/2024_04_14_02.sql @@ -1,3 +1,4 @@ +-- DB update 2024_04_14_01 -> 2024_04_14_02 -- DELETE FROM `creature_template_spell` WHERE (`CreatureID` = 17899); INSERT INTO `creature_template_spell` (`CreatureID`, `Index`, `Spell`, `VerifiedBuild`) VALUES