diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 61ca3c80a..46ce5b842 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -25,6 +25,7 @@ #include "MapReference.h" #include "Player.h" #include "Vehicle.h" +#include "ScriptMgr.h" #include "Language.h" class PhasedRespawn : public BasicEvent @@ -226,6 +227,8 @@ void CreatureAI::EnterEvadeMode(EvadeReason why) me->DespawnOnEvade(); me->m_Events.AddEvent(new PhasedRespawn(*me), me->m_Events.CalculateTime(20000)); } + + sScriptMgr->OnUnitEnterEvadeMode(me, why); } /*void CreatureAI::AttackedBy(Unit* attacker) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 0e3f2dbb7..1823c9be7 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13187,6 +13187,8 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy, uint32 duration) if (creature->GetFormation()) creature->GetFormation()->MemberEngagingTarget(creature, enemy); + + sScriptMgr->OnUnitEnterCombat(creature, enemy); } creature->RefreshSwimmingFlag(); @@ -17498,6 +17500,7 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp if (CreatureAI* ai = creature->AI()) { ai->JustDied(killer); + sScriptMgr->OnUnitDeath(creature, killer); } if (TempSummon* summon = creature->ToTempSummon()) diff --git a/src/server/game/Scripting/ScriptDefines/UnitScript.cpp b/src/server/game/Scripting/ScriptDefines/UnitScript.cpp index 86bcb42c8..538da43e9 100644 --- a/src/server/game/Scripting/ScriptDefines/UnitScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/UnitScript.cpp @@ -218,3 +218,27 @@ void ScriptMgr::OnDisplayIdChange(Unit* unit, uint32 displayId) 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); + }); +} diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 550dadf4c..66d2eeca1 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -461,6 +461,10 @@ public: virtual void OnUnitUpdate(Unit* /*unit*/, uint32 /*diff*/) { } virtual void OnDisplayIdChange(Unit* /*unit*/, uint32 /*displayId*/) { } + + virtual void OnUnitEnterEvadeMode(Unit* /*unit*/, uint8 /*evadeReason*/) { } + virtual void OnUnitEnterCombat(Unit* /*unit*/, Unit* /*victim*/) { } + virtual void OnUnitDeath(Unit* /*unit*/, Unit* /*killer*/) { } }; class MovementHandlerScript : public ScriptObject @@ -2403,6 +2407,9 @@ public: /* UnitScript */ bool OnBuildValuesUpdate(Unit const* unit, uint8 updateType, ByteBuffer& fieldBuffer, Player* target, uint16 index); void OnUnitUpdate(Unit* unit, uint32 diff); void OnDisplayIdChange(Unit* unit, uint32 displayId); + void OnUnitEnterEvadeMode(Unit* unit, uint8 why); + void OnUnitEnterCombat(Unit* unit, Unit* victim); + void OnUnitDeath(Unit* unit, Unit* killer); public: /* MovementHandlerScript */ void OnPlayerMove(Player* player, MovementInfo movementInfo, uint32 opcode);