diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index 0ccada449..10a5fe8b2 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -65,6 +65,8 @@ public: virtual void EventInform(uint32 /*eventId*/) {} virtual void SpellHit(Unit* /*unit*/, const SpellInfo* /*spellInfo*/) {} virtual bool CanBeSeen(Player const* /*seer*/) { return true; } + + virtual void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) { } }; class NullGameObjectAI : public GameObjectAI diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index f9326793d..eaf177f6e 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -794,6 +794,11 @@ void SmartAI::JustSummoned(Creature* creature) GetScript()->ProcessEventsFor(SMART_EVENT_SUMMONED_UNIT, creature); } +void SmartAI::SummonedCreatureDies(Creature* summon, Unit* /*killer*/) +{ + GetScript()->ProcessEventsFor(SMART_EVENT_SUMMONED_UNIT_DIES, summon); +} + void SmartAI::AttackStart(Unit* who) { // xinef: dont allow charmed npcs to act on their own @@ -1084,6 +1089,11 @@ void SmartAI::OnSpellClick(Unit* clicker, bool& /*result*/) GetScript()->ProcessEventsFor(SMART_EVENT_ON_SPELLCLICK, clicker); } +void SmartGameObjectAI::SummonedCreatureDies(Creature* summon, Unit* /*killer*/) +{ + GetScript()->ProcessEventsFor(SMART_EVENT_SUMMONED_UNIT_DIES, summon); +} + int SmartGameObjectAI::Permissible(const GameObject* g) { if (g->GetAIName() == "SmartGameObjectAI") diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index ea2d8fbe6..b192a68fe 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -91,6 +91,9 @@ public: // Called when the creature summon successfully other creature void JustSummoned(Creature* creature) override; + // Called when a summoned unit dies + void SummonedCreatureDies(Creature* summon, Unit* killer) override; + // Tell creature to attack and follow the victim void AttackStart(Unit* who) override; @@ -270,6 +273,9 @@ public: void EventInform(uint32 eventId) override; void SpellHit(Unit* unit, const SpellInfo* spellInfo) override; + // Called when a summoned unit dies + void SummonedCreatureDies(Creature* summon, Unit* killer) override; + protected: SmartScript mScript; }; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index d974a465c..5e48ba0b7 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -4194,6 +4194,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui break; } case SMART_EVENT_SUMMONED_UNIT: + case SMART_EVENT_SUMMONED_UNIT_DIES: { if (!IsCreature(unit)) return; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index d0f3e9686..a896fb496 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -362,6 +362,7 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) case SMART_TARGET_RANDOM_POINT: case SMART_TARGET_ROLE_SELECTION: case SMART_TARGET_LOOT_RECIPIENTS: + case SMART_EVENT_SUMMONED_UNIT_DIES: break; default: LOG_ERROR("sql.sql", "SmartAIMgr: Not handled target_type(%u), Entry %d SourceType %u Event %u Action %u, skipped.", e.GetTargetType(), e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); @@ -553,6 +554,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) break; case SMART_EVENT_SUMMON_DESPAWNED: case SMART_EVENT_SUMMONED_UNIT: + case SMART_EVENT_SUMMONED_UNIT_DIES: if (e.event.summoned.creature && !IsCreatureValid(e, e.event.summoned.creature)) return false; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 3bf320fed..aad26b480 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -183,6 +183,8 @@ enum SMART_EVENT SMART_EVENT_TC_END = 78, + SMART_EVENT_SUMMONED_UNIT_DIES = 82, // CreatureId(0 all), CooldownMin, CooldownMax + /* AC Custom Events */ SMART_EVENT_AC_START = 100, @@ -1658,7 +1660,7 @@ const uint32 SmartAIEventMask[SMART_EVENT_AC_END][2] = { 0, 0 }, // 79 { 0, 0 }, // 80 { 0, 0 }, // 81 - { 0, 0 }, // 82 + {SMART_EVENT_SUMMONED_UNIT_DIES, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, { 0, 0 }, // 83 { 0, 0 }, // 84 { 0, 0 }, // 85