diff --git a/data/sql/updates/pending_db_world/rev_1668887952245656900.sql b/data/sql/updates/pending_db_world/rev_1668887952245656900.sql new file mode 100644 index 000000000..c84b57d42 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1668887952245656900.sql @@ -0,0 +1,6 @@ +-- +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (18498,18499,18500,18501,18503) AND `source_type`=0 AND `event_type` IN (1, 7); + +DELETE FROM `smart_scripts` WHERE `entryorguid`=18497 AND `source_type`=0 AND `id`=6; +INSERT INTO `smart_scripts` VALUES +(18497,0,6,0,7,0,100,0,0,0,0,0,0,41,0,0,0,0,0,0,204,0,0,0,0,0,0,0,0,'Auchenai Monk - On Evade - Despawn all summons'); diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 8706ebe4c..06c237acd 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -810,6 +810,7 @@ void SmartAI::KilledUnit(Unit* victim) void SmartAI::JustSummoned(Creature* creature) { GetScript()->ProcessEventsFor(SMART_EVENT_SUMMONED_UNIT, creature); + GetScript()->AddCreatureSummon(creature->GetGUID()); } void SmartAI::SummonedCreatureDies(Creature* summon, Unit* /*killer*/) @@ -890,6 +891,7 @@ void SmartAI::DamageDealt(Unit* doneTo, uint32& damage, DamageEffectType /*damag void SmartAI::SummonedCreatureDespawn(Creature* unit) { GetScript()->ProcessEventsFor(SMART_EVENT_SUMMON_DESPAWNED, unit); + GetScript()->RemoveCreatureSummon(unit->GetGUID()); } void SmartAI::CorpseRemoved(uint32& respawnDelay) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index f575ca3f4..edc439a65 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -3334,6 +3334,24 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, } } } + break; + } + case SMART_TARGET_SUMMONED_CREATURES: + { + if (me) + { + for (ObjectGuid const& guid : _summonList) + { + if (!e.target.summonedCreatures.entry || guid.GetEntry() == e.target.summonedCreatures.entry) + { + if (Creature* creature = me->GetMap()->GetCreature(guid)) + { + targets.push_back(creature); + } + } + } + } + break; } case SMART_TARGET_NONE: case SMART_TARGET_POSITION: @@ -4560,3 +4578,13 @@ bool SmartScript::IsInPhase(uint32 p) const return ((1 << (mEventPhase - 1)) & p) != 0; } + +void SmartScript::AddCreatureSummon(ObjectGuid const& guid) +{ + _summonList.insert(guid); +} + +void SmartScript::RemoveCreatureSummon(ObjectGuid const& guid) +{ + _summonList.erase(guid); +} diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index 92142ec35..72007ebc4 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -232,6 +232,9 @@ public: bool AllowPhaseReset() const { return _allowPhaseReset; } void SetPhaseReset(bool allow) { _allowPhaseReset = allow; } + void AddCreatureSummon(ObjectGuid const& guid); + void RemoveCreatureSummon(ObjectGuid const& guid); + private: void IncPhase(uint32 p); void DecPhase(uint32 p); @@ -306,6 +309,8 @@ private: SmartScriptHolder s; return s; } + + GuidUnorderedSet _summonList; }; #endif diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 3da4072b2..bc9237320 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -413,6 +413,14 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) return false; } break; + case SMART_TARGET_SUMMONED_CREATURES: + { + if (e.target.summonedCreatures.entry && !IsCreatureValid(e, e.target.summonedCreatures.entry)) + { + return false; + } + break; + } case SMART_TARGET_HOSTILE_SECOND_AGGRO: case SMART_TARGET_HOSTILE_LAST_AGGRO: case SMART_TARGET_HOSTILE_RANDOM: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 4bd38286b..e1bdfd60c 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -1407,8 +1407,9 @@ enum SMARTAI_TARGETS SMART_TARGET_PLAYER_WITH_AURA = 201, // spellId, negation, MaxDist, MinDist, set target.o to a number to random resize the list SMART_TARGET_RANDOM_POINT = 202, // range, amount (for summoning creature), self als middle (0/1) else use xyz SMART_TARGET_ROLE_SELECTION = 203, // Range Max, TargetMask (Tanks (1), Healer (2) Damage (4)), resize list + SMART_TARGET_SUMMONED_CREATURES = 204, // Entry - SMART_TARGET_AC_END = 204 // placeholder + SMART_TARGET_AC_END = 205 // placeholder }; struct SmartTarget @@ -1564,6 +1565,11 @@ struct SmartTarget uint32 distMin; } playerWithAura; + struct + { + uint32 entry; + } summonedCreatures; + struct { uint32 param1;