feat(Core/Scripting): Implement OnIsAffectedBySpellModCheck hook (#9903)
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user