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
This commit is contained in:
天鹿
2024-04-12 21:54:20 +08:00
committed by GitHub
parent 83c4562f3d
commit 8d20a25e96
2 changed files with 141 additions and 216 deletions

View File

@@ -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<UnitScript>::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>([&](UnitScript* script)
{
script->OnHeal(healer, reciever, gain);
});
}
void ScriptMgr::OnDamage(Unit* attacker, Unit* victim, uint32& damage)
{
ExecuteScript<UnitScript>([&](UnitScript* script)
{
script->OnDamage(attacker, victim, damage);
});
}
void ScriptMgr::ModifyPeriodicDamageAurasTick(Unit* target, Unit* attacker, uint32& damage, SpellInfo const* spellInfo)
{
ExecuteScript<UnitScript>([&](UnitScript* script)
{
script->ModifyPeriodicDamageAurasTick(target, attacker, damage, spellInfo);
});
}
void ScriptMgr::ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage)
{
ExecuteScript<UnitScript>([&](UnitScript* script)
{
script->ModifyMeleeDamage(target, attacker, damage);
});
}
void ScriptMgr::ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage, SpellInfo const* spellInfo)
{
ExecuteScript<UnitScript>([&](UnitScript* script)
{
script->ModifySpellDamageTaken(target, attacker, damage, spellInfo);
});
}
void ScriptMgr::ModifyHealReceived(Unit* target, Unit* healer, uint32& heal, SpellInfo const* spellInfo)
{
ExecuteScript<UnitScript>([&](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>([&](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>([&](UnitScript* script)
{
script->OnAuraRemove(unit, aurApp, mode);
});
}
bool ScriptMgr::IfNormalReaction(Unit const* unit, Unit const* target, ReputationRank& repRank)
{
auto ret = IsValidBoolScript<UnitScript>([&](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>([&](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>([&](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>([&](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>([&](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>([&](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>([&](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>([&](UnitScript* script)
{
script->OnPatchValuesUpdate(unit, valuesUpdateBuf, posPointers, target);
});
}
void ScriptMgr::OnUnitUpdate(Unit* unit, uint32 diff)
{
ExecuteScript<UnitScript>([&](UnitScript* script)
{
script->OnUnitUpdate(unit, diff);
});
}
void ScriptMgr::OnDisplayIdChange(Unit* unit, uint32 displayId)
{
ExecuteScript<UnitScript>([&](UnitScript* script)
{
script->OnDisplayIdChange(unit, displayId);
});
}
void ScriptMgr::OnUnitEnterEvadeMode(Unit* unit, uint8 evadeReason)
{
ExecuteScript<UnitScript>([&](UnitScript* script)
{
script->OnUnitEnterEvadeMode(unit, evadeReason);
});
}
void ScriptMgr::OnUnitEnterCombat(Unit* unit, Unit* victim)
{
ExecuteScript<UnitScript>([&](UnitScript* script)
{
script->OnUnitEnterCombat(unit, victim);
});
}
void ScriptMgr::OnUnitDeath(Unit* unit, Unit* killer)
{
ExecuteScript<UnitScript>([&](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>([&](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<uint16> enabledHooks)
: ScriptObject(name, UNITHOOK_END)
{
if (addToScripts)
ScriptRegistry<UnitScript>::AddScript(this);
{
// If empty - enable all available hooks.
if (enabledHooks.empty())
for (uint16 i = 0; i < UNITHOOK_END; ++i)
enabledHooks.emplace_back(i);
ScriptRegistry<UnitScript>::AddScript(this, std::move(enabledHooks));
}
}
template class AC_GAME_API ScriptRegistry<UnitScript>;

View File

@@ -19,6 +19,34 @@
#define SCRIPT_OBJECT_UNIT_SCRIPT_H_
#include "ScriptObject.h"
#include <vector>
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<uint16> enabledHooks = std::vector<uint16>());
public:
// Called when a unit deals healing to another unit