From 724ea2d78b7902363f661be7bc62bdfe0eb760ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=9A=E7=BE=8E?= <2370337237@qq.com> Date: Mon, 17 Feb 2025 18:57:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BC=A4=E5=AE=B3=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=92=A9=E5=AD=90(OnCalculateSplittedDamage=20|=20OnA?= =?UTF-8?q?fterUpdateArmor=20|=20OnUpdateResistances=20|=20OnSpellPctDamag?= =?UTF-8?q?eModsDoneAfter)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/Entities/Unit/Unit.cpp | 3 ++ .../Scripting/ScriptDefines/UnitScript.cpp | 32 ++++++++++++ .../game/Scripting/ScriptDefines/UnitScript.h | 52 +++++++++++++++++++ src/server/game/Scripting/ScriptMgr.h | 12 +++++ 4 files changed, 99 insertions(+) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 43b2568dc1..3b34d4618a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2507,6 +2507,9 @@ void Unit::CalcAbsorbResist(DamageInfo& dmgInfo, bool Splited) CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL); Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, splitSchoolMask, splitSpellInfo, false); } + + //@尚美 20240320 当函数 CalcAbsorbResist 处理完伤害、吸收和抵抗后调用,用于减伤功能 + sScriptMgr->OnCalculateSplittedDamage(victim, attacker, dmgInfo); } } diff --git a/src/server/game/Scripting/ScriptDefines/UnitScript.cpp b/src/server/game/Scripting/ScriptDefines/UnitScript.cpp index bbf83e5c6a..e148c2e082 100644 --- a/src/server/game/Scripting/ScriptDefines/UnitScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/UnitScript.cpp @@ -153,6 +153,38 @@ void ScriptMgr::OnUnitSetShapeshiftForm(Unit* unit, uint8 form) CALL_ENABLED_HOOKS(UnitScript, UNITHOOK_ON_UNIT_SET_SHAPESHIFT_FORM, script->OnUnitSetShapeshiftForm(unit, form)); } +//@尚美 20240320 当函数 CalcAbsorbResist 处理完伤害、吸收和抵抗后调用,用于减伤功能 +void ScriptMgr::OnCalculateSplittedDamage(Unit* victim, Unit* attacker, DamageInfo& dmgInfo) +{ + ExecuteScript([&](UnitScript* script) { + script->OnCalculateSplittedDamage(victim, attacker, dmgInfo); + }); +} + +// @尚美 20240313 调用钩子函数以允许自定义逻辑修改护甲值 +void ScriptMgr::OnAfterUpdateArmor(Unit* unit, float& value) +{ + ExecuteScript([&](UnitScript* script) { + script->OnAfterUpdateArmor(unit, value); + }); +} + +// @尚美 20240321 调用钩子函数以允许自定义逻辑修改抗性值 +void ScriptMgr::OnUpdateResistances(Unit* unit, uint32 school, float& value) +{ + ExecuteScript([&](UnitScript* script) { + script->OnUpdateResistances(unit, school, value); + }); +} + +// @尚美 20240321 调用钩子函数以允许自定义逻辑修改抗性值 +void ScriptMgr::OnSpellPctDamageModsDoneAfter(Unit* unit, float& DoneTotalMod) +{ + ExecuteScript([&](UnitScript* script) { + script->OnSpellPctDamageModsDoneAfter(unit, DoneTotalMod); + }); +} + UnitScript::UnitScript(const char* name, bool addToScripts, std::vector enabledHooks) : ScriptObject(name, UNITHOOK_END) { diff --git a/src/server/game/Scripting/ScriptDefines/UnitScript.h b/src/server/game/Scripting/ScriptDefines/UnitScript.h index efee6defe2..210cabd82e 100644 --- a/src/server/game/Scripting/ScriptDefines/UnitScript.h +++ b/src/server/game/Scripting/ScriptDefines/UnitScript.h @@ -117,6 +117,58 @@ public: virtual void OnUnitEnterCombat(Unit* /*unit*/, Unit* /*victim*/) { } virtual void OnUnitDeath(Unit* /*unit*/, Unit* /*killer*/) { } virtual void OnUnitSetShapeshiftForm(Unit* /*unit*/, uint8 /*form*/) { } + + + //@尚美 20240320 当函数 CalcAbsorbResist 处理完伤害、吸收和抵抗后调用,用于减伤功能 + /** + * @Unit* caster: 这个参数指代施放者,即造成伤害的单位。在伤害分割的上下文中,这通常指的是释放导致分割伤害的法术或效果的单位。 + * @Unit* attacker: 这个参数指代攻击者,可能与caster相同,也可能不同。在某些情况下,比如反射伤害或某些特殊的法术效果,attacker和caster可能是不同的单位。 + * @uint32& splitted: 这是一个引用参数,代表经过计算后准备应用到目标上的伤害值。由于这是一个引用,可在钩子函数中修改这个值以改变最终被应用的伤害量。 + * @DamageInfo& dmgInfo: 这个参数提供了一个关于当前伤害事件的详细信息的对象,其中包括伤害量、伤害类型、相关的法术信息等。通过dmgInfo,可获取更多关于伤害事件的上下文信息,也可以修改其中的一些属性以影响伤害处理的结果。 + * @SpellSchoolMask schoolMask: 这代表伤害的魔法类型,例如物理、火焰、冰霜等。这个信息对于处理抗性和吸收特别重要,因为不同类型的伤害可能会受到目标的不同属性或状态的影响。 + */ + virtual void OnCalculateSplittedDamage(Unit* /*victim*/, Unit* /*attacker*/, DamageInfo& /*dmgInfo*/) {} + + /** + * @尚美 20240313 + * + * 自定义新增钩子 在设置新护甲值之前 + * + * @param player Contains information about the Player + */ + virtual void OnAfterUpdateArmor(Unit* /*uint*/, float& /*value*/) {} + + /** + * @尚美 20240313 + * + * 自定义新增钩子 UpdateResistances 在设置新护甲值之前 + * + * @Unit* unit 单位类型(生物或者玩家) + * @uint32 school 抗性类型 + * + 1、奥数抗性 SPELL_SCHOOL_ARCANE + 2、火焰抗性 SPELL_SCHOOL_FIRE + 3、自然抗性 SPELL_SCHOOL_NATURE + 4、冰霜抗性 SPELL_SCHOOL_FROST + 5、暗影抗性 SPELL_SCHOOL_SHADOW + + * float& value 抗性值 + * + * @param player Contains information about the Player + */ + virtual void OnUpdateResistances(Unit* /*unit*/, uint32 /*school*/, float& /*value*/) {} + + /** + * @尚美 20240327 + * + * 自定义新增钩子 在SpellPctDamageModsDone 函数结束前修正法术伤害倍率 + * + * @Unit* unit 单位类型(生物或者玩家) + * @uint32 DoneTotalMod 完成后的总倍率 + * + * @param player Contains information about the Player + */ + virtual void OnSpellPctDamageModsDoneAfter(Unit* /*unit*/, float& /*DoneTotalMod*/) {} }; #endif diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index b05d146f00..f5530abce7 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -562,6 +562,18 @@ public: /* UnitScript */ void OnUnitDeath(Unit* unit, Unit* killer); void OnUnitSetShapeshiftForm(Unit* unit, uint8 form); + //@尚美 20240320 当函数 CalcAbsorbResist 处理完伤害、吸收和抵抗后调用,用于减伤功能 + void OnCalculateSplittedDamage(Unit* victim, Unit* attacker, DamageInfo& dmgInfo); + + //自定义新增钩子 在设置新护甲值之前 + void OnAfterUpdateArmor(Unit* uint, float& value); + + // @尚美 20240321 调用钩子函数以允许自定义逻辑修改抗性值 + void OnUpdateResistances(Unit* unit, uint32 school, float& value); + + // @尚美 20240327 自定义新增钩子 在SpellPctDamageModsDone 函数结束前修正法术伤害倍率 + void OnSpellPctDamageModsDoneAfter(Unit* unit, float& DoneTotalMod); + public: /* MovementHandlerScript */ void OnPlayerMove(Player* player, MovementInfo movementInfo, uint32 opcode);