feat(Core/Scripting): Implement OnIsAffectedBySpellModCheck hook (#9903)

This commit is contained in:
Skjalf
2021-12-30 17:39:13 -03:00
committed by GitHub
parent 53a6fb7513
commit 24ab99919a
3 changed files with 33 additions and 1 deletions
@@ -17,6 +17,7 @@
#include "ScriptMgr.h" #include "ScriptMgr.h"
#include "ScriptMgrMacros.h" #include "ScriptMgrMacros.h"
#include "Player.h"
void ScriptMgr::OnGlobalItemDelFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid) void ScriptMgr::OnGlobalItemDelFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
{ {
@@ -122,3 +123,18 @@ void ScriptMgr::OnBeforeWorldObjectSetPhaseMask(WorldObject const* worldObject,
script->OnBeforeWorldObjectSetPhaseMask(worldObject, oldPhaseMask, newPhaseMask, useCombinedPhases, update); script->OnBeforeWorldObjectSetPhaseMask(worldObject, oldPhaseMask, newPhaseMask, useCombinedPhases, update);
}); });
} }
bool ScriptMgr::OnIsAffectedBySpellModCheck(SpellInfo const* affectSpell, SpellInfo const* checkSpell, SpellModifier const* mod)
{
auto ret = IsValidBoolScript<GlobalScript>([&](GlobalScript* script)
{
return !script->OnIsAffectedBySpellModCheck(affectSpell, checkSpell, mod);
});
if (ret && *ret)
{
return true;
}
return false;
}
+5
View File
@@ -82,6 +82,7 @@ struct GroupQueueInfo;
struct ItemTemplate; struct ItemTemplate;
struct OutdoorPvPData; struct OutdoorPvPData;
struct TargetInfo; struct TargetInfo;
struct SpellModifier;
namespace Acore::ChatCommands namespace Acore::ChatCommands
{ {
@@ -1517,6 +1518,9 @@ public:
// Called before the phase for a WorldObject is set // Called before the phase for a WorldObject is set
virtual void OnBeforeWorldObjectSetPhaseMask(WorldObject const* /*worldObject*/, uint32& /*oldPhaseMask*/, uint32& /*newPhaseMask*/, bool& /*useCombinedPhases*/, bool& /*update*/) { } virtual void OnBeforeWorldObjectSetPhaseMask(WorldObject const* /*worldObject*/, uint32& /*oldPhaseMask*/, uint32& /*newPhaseMask*/, bool& /*useCombinedPhases*/, bool& /*update*/) { }
// Called when checking if a spell is affected by a mod
virtual bool OnIsAffectedBySpellModCheck(SpellInfo const* /*affectSpell*/, SpellInfo const* /*checkSpell*/, SpellModifier const* /*mod*/) { return true; };
}; };
class BGScript : public ScriptObject class BGScript : public ScriptObject
@@ -2333,6 +2337,7 @@ public: /* GlobalScript */
void OnAfterInitializeLockedDungeons(Player* player); void OnAfterInitializeLockedDungeons(Player* player);
void OnAfterUpdateEncounterState(Map* map, EncounterCreditType type, uint32 creditEntry, Unit* source, Difficulty difficulty_fixed, DungeonEncounterList const* encounters, uint32 dungeonCompleted, bool updated); void OnAfterUpdateEncounterState(Map* map, EncounterCreditType type, uint32 creditEntry, Unit* source, Difficulty difficulty_fixed, DungeonEncounterList const* encounters, uint32 dungeonCompleted, bool updated);
void OnBeforeWorldObjectSetPhaseMask(WorldObject const* worldObject, uint32& oldPhaseMask, uint32& newPhaseMask, bool& useCombinedPhases, bool& update); void OnBeforeWorldObjectSetPhaseMask(WorldObject const* worldObject, uint32& oldPhaseMask, uint32& newPhaseMask, bool& useCombinedPhases, bool& update);
bool OnIsAffectedBySpellModCheck(SpellInfo const* affectSpell, SpellInfo const* checkSpell, SpellModifier const* mod);
public: /* Scheduled scripts */ public: /* Scheduled scripts */
uint32 IncreaseScheduledScriptsCount() { return ++_scheduledScripts; } uint32 IncreaseScheduledScriptsCount() { return ++_scheduledScripts; }
+12 -1
View File
@@ -1280,8 +1280,19 @@ bool SpellInfo::IsAffectedBySpellMod(SpellModifier const* mod) const
return false; return false;
SpellInfo const* affectSpell = sSpellMgr->GetSpellInfo(mod->spellId); SpellInfo const* affectSpell = sSpellMgr->GetSpellInfo(mod->spellId);
if (!affectSpell)
{
return false;
}
if (!sScriptMgr->OnIsAffectedBySpellModCheck(affectSpell, this, mod))
{
return true;
}
// False if affect_spell == nullptr or spellFamily not equal // False if affect_spell == nullptr or spellFamily not equal
if (!affectSpell || affectSpell->SpellFamilyName != SpellFamilyName) if (affectSpell->SpellFamilyName != SpellFamilyName)
return false; return false;
// true // true