diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index 3a2731105..979f7ca45 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -25,6 +25,7 @@ #include "QuestDef.h" #include +class Creature; class GameObject; class Unit; class SpellInfo; @@ -66,6 +67,10 @@ public: virtual void SpellHit(Unit* /*unit*/, SpellInfo const* /*spellInfo*/) {} virtual bool CanBeSeen(Player const* /*seer*/) { return true; } + // Called when the gameobject summon successfully other creature + virtual void JustSummoned(Creature* /*summon*/) { } + virtual void SummonedCreatureDespawn(Creature* /*summon*/) { } + virtual void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) { } }; diff --git a/src/server/game/AI/CoreAI/PassiveAI.cpp b/src/server/game/AI/CoreAI/PassiveAI.cpp index 6b9343ce9..b14c39977 100644 --- a/src/server/game/AI/CoreAI/PassiveAI.cpp +++ b/src/server/game/AI/CoreAI/PassiveAI.cpp @@ -103,7 +103,7 @@ int32 CritterAI::Permissible(Creature const* creature) return PERMIT_BASE_NO; } -void TriggerAI::IsSummonedBy(Unit* summoner) +void TriggerAI::IsSummonedBy(WorldObject* summoner) { if (me->m_spells[0]) me->CastSpell(me, me->m_spells[0], false, 0, 0, summoner ? summoner->GetGUID() : ObjectGuid::Empty); diff --git a/src/server/game/AI/CoreAI/PassiveAI.h b/src/server/game/AI/CoreAI/PassiveAI.h index f563e1856..d3a713216 100644 --- a/src/server/game/AI/CoreAI/PassiveAI.h +++ b/src/server/game/AI/CoreAI/PassiveAI.h @@ -80,7 +80,7 @@ class TriggerAI : public NullCreatureAI { public: explicit TriggerAI(Creature* c) : NullCreatureAI(c) {} - void IsSummonedBy(Unit* summoner) override; + void IsSummonedBy(WorldObject* summoner) override; static int32 Permissible(Creature const* creature); }; diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index 6db1fa404..c4343a548 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -126,7 +126,7 @@ public: // Called when the creature summon successfully other creature virtual void JustSummoned(Creature* /*summon*/) {} - virtual void IsSummonedBy(Unit* /*summoner*/) {} + virtual void IsSummonedBy(WorldObject* /*summoner*/) {} virtual void SummonedCreatureDespawn(Creature* /*summon*/) {} virtual void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) {} diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 06c237acd..41a87336a 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -878,9 +878,9 @@ void SmartAI::ReceiveEmote(Player* player, uint32 textEmote) GetScript()->ProcessEventsFor(SMART_EVENT_RECEIVE_EMOTE, player, textEmote); } -void SmartAI::IsSummonedBy(Unit* summoner) +void SmartAI::IsSummonedBy(WorldObject* summoner) { - GetScript()->ProcessEventsFor(SMART_EVENT_JUST_SUMMONED, summoner); + GetScript()->ProcessEventsFor(SMART_EVENT_JUST_SUMMONED, summoner->ToUnit(), 0, 0, false, nullptr, summoner->ToGameObject()); } void SmartAI::DamageDealt(Unit* doneTo, uint32& damage, DamageEffectType /*damagetype*/) diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index 38b07a19b..3225ef477 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -125,7 +125,7 @@ public: void MovementInform(uint32 MovementType, uint32 Data) override; // Called when creature is summoned by another unit - void IsSummonedBy(Unit* summoner) override; + void IsSummonedBy(WorldObject* summoner) override; // Called at any Damage to any victim (before damage apply) void DamageDealt(Unit* doneTo, uint32& damage, DamageEffectType damagetyp) override; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index fd9cca92a..b48d2fb61 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -3207,13 +3207,23 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, // xinef: Get owner of owner if (e.target.owner.useCharmerOrOwner && !targets.empty()) { - if (Unit* owner = targets.front()->ToUnit()) + if (WorldObject* owner = targets.front()) { targets.clear(); - if (Unit* base = ObjectAccessor::GetUnit(*owner, owner->GetCharmerOrOwnerGUID())) + if (owner->ToCreature()) { - targets.push_back(base); + if (Unit* base = ObjectAccessor::GetUnit(*owner, owner->ToCreature()->GetCharmerOrOwnerGUID())) + { + targets.push_back(base); + } + } + else + { + if (Unit* base = ObjectAccessor::GetUnit(*owner, owner->ToGameObject()->GetOwnerGUID())) + { + targets.push_back(base); + } } } } diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index 57957734c..23ee49628 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -17,6 +17,8 @@ #include "TemporarySummon.h" #include "CreatureAI.h" +#include "GameObject.h" +#include "GameObjectAI.h" #include "Log.h" #include "ObjectAccessor.h" #include "Pet.h" @@ -250,11 +252,23 @@ void TempSummon::InitStats(uint32 duration) void TempSummon::InitSummon() { - Unit* owner = GetSummonerUnit(); + WorldObject* owner = GetSummoner(); if (owner) { - if (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()->IsAIEnabled) - owner->ToCreature()->AI()->JustSummoned(this); + if (owner->GetTypeId() == TYPEID_UNIT) + { + if (owner->ToCreature()->IsAIEnabled) + { + owner->ToCreature()->AI()->JustSummoned(this); + } + } + else if (owner->GetTypeId() == TYPEID_GAMEOBJECT) + { + if (owner->ToGameObject()->AI()) + { + owner->ToGameObject()->AI()->JustSummoned(this); + } + } } // Xinef: Allow to call this hook when npc is summoned by gameobject, in this case pass this as summoner to avoid possible null checks @@ -290,9 +304,17 @@ void TempSummon::UnSummon(uint32 msTime) return; } - Unit* owner = GetSummonerUnit(); - if (owner && owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()->IsAIEnabled) - owner->ToCreature()->AI()->SummonedCreatureDespawn(this); + if (WorldObject* owner = GetSummoner()) + { + if (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()->IsAIEnabled) + { + owner->ToCreature()->AI()->SummonedCreatureDespawn(this); + } + else if (owner->GetTypeId() == TYPEID_GAMEOBJECT && owner->ToGameObject()->AI()) + { + owner->ToGameObject()->AI()->SummonedCreatureDespawn(this); + } + } AddObjectToRemoveList(); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 78da2dd7a..da1ba7430 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -34,6 +34,7 @@ #include "DisableMgr.h" #include "DynamicVisibility.h" #include "Formulas.h" +#include "GameObjectAI.h" #include "GameTime.h" #include "GridNotifiersImpl.h" #include "Group.h" @@ -18081,9 +18082,19 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp } if (TempSummon* summon = creature->ToTempSummon()) - if (Unit* summoner = summon->GetSummonerUnit()) - if (summoner->ToCreature() && summoner->IsAIEnabled) + { + if (WorldObject* summoner = summon->GetSummoner()) + { + if (summoner->ToCreature() && summoner->ToCreature()->IsAIEnabled) + { summoner->ToCreature()->AI()->SummonedCreatureDies(creature, killer); + } + else if (summoner->ToGameObject() && summoner->ToGameObject()->AI()) + { + summoner->ToGameObject()->AI()->SummonedCreatureDies(creature, killer); + } + } + } // Dungeon specific stuff, only applies to players killing creatures if (creature->GetInstanceId()) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp index 63a40a20f..5bf964e8e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp @@ -219,10 +219,15 @@ public: { npc_burning_spiritAI(Creature* creature) : ScriptedAI(creature) {} - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { + if (summoner->GetTypeId() != TYPEID_UNIT) + { + return; + } + _flamelasherGUID = summoner->GetGUID(); - me->GetMotionMaster()->MoveFollow(summoner, 0.f, 0.f); + me->GetMotionMaster()->MoveFollow(summoner->ToCreature(), 0.f, 0.f); } void EnterEvadeMode(EvadeReason /*why*/) override diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp index d4b31262c..037c56dd4 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp @@ -86,7 +86,7 @@ public: BossAI::EnterEvadeMode(why); } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { events.ScheduleEvent(EVENT_SUMMONED_1, 1000); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp index 9ad1b3157..c82563d04 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp @@ -69,7 +69,7 @@ public: frenzy15 = false; } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { StartTalking(TALK_SUMMON, 8 * IN_MILLISECONDS); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp index aa5750e9f..0c3c75c32 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp @@ -174,7 +174,7 @@ public: me->DespawnOrUnsummon(); } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { Talk(EMOTE_BLACKHAND_DISMOUNT); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp index 189fcb74a..48fb3862b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp @@ -981,7 +981,7 @@ public: { npc_vaelastrasz_the_redAI(Creature* creature) : CreatureAI(creature) { } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (!summoner) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index c081def1d..bf0fe85c9 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -871,7 +871,7 @@ struct npc_corrupted_totem : public ScriptedAI } } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { me->SetInCombatWithZone(); @@ -942,7 +942,7 @@ struct npc_drakonid_spawner : public ScriptedAI } } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { DoCastSelf(SPELL_SPAWN_DRAKONID_GEN); _scheduler.Schedule(10s, 60s, [this](TaskContext /*context*/) diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp index c32463d66..cf2d6aa66 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp @@ -387,9 +387,14 @@ public: int room; Unit* Gandling; - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { - Gandling = summoner; + if (summoner->GetTypeId() != TYPEID_UNIT) + { + return; + } + + Gandling = summoner->ToCreature(); if (instance) { room = Gandling->GetAI()->GetData(GANDLING_ROOM_TO_USE); // it's set just before my spawn diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index 2e496097f..650c2a524 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -106,7 +106,7 @@ public: me->DespawnOrUnsummon(1); } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { events2.Reset(); events2.ScheduleEvent(INTRO_1, 1000); diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp index 739615880..8641887ae 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp @@ -72,7 +72,7 @@ struct boss_kormok : public ScriptedAI _summons.DespawnAll(); } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { Talk(TALK_SUMMON); diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_jarien_and_sothos.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_jarien_and_sothos.cpp index 8f0856421..efe4d8495 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_jarien_and_sothos.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_jarien_and_sothos.cpp @@ -132,7 +132,7 @@ struct boss_jarien : public BossAI _Reset(); } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { Talk(SAY_JARIEN_ON_SUMMON_0); @@ -257,7 +257,7 @@ struct boss_sothos : public BossAI _Reset(); } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { _scheduler.Schedule(12s, [this](TaskContext /*context*/) { diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp index cc52c0eea..476eb8f42 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp @@ -57,7 +57,7 @@ public: { boss_gahzrankaAI(Creature* creature) : BossAI(creature, DATA_GAHZRANKA) { } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false); } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp index bc85b98fc..332aea3fa 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp @@ -217,7 +217,7 @@ struct npc_shade_of_jindo : public ScriptedAI { npc_shade_of_jindo(Creature* creature) : ScriptedAI(creature) { } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { DoZoneInCombat(); DoCastSelf(SPELL_SHADE_OF_JINDO_PASSIVE, true); diff --git a/src/server/scripts/Events/brewfest.cpp b/src/server/scripts/Events/brewfest.cpp index 1e199af4c..45f37f579 100644 --- a/src/server/scripts/Events/brewfest.cpp +++ b/src/server/scripts/Events/brewfest.cpp @@ -1809,7 +1809,7 @@ struct npc_direbrew_minion : public ScriptedAI DoZoneInCombat(); } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { if (Creature* coren = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_COREN))) { diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp index da901f78b..d72edbde3 100644 --- a/src/server/scripts/Kalimdor/zone_durotar.cpp +++ b/src/server/scripts/Kalimdor/zone_durotar.cpp @@ -161,16 +161,19 @@ public: _events.ScheduleEvent(EVENT_NOSUMMON, 50000); } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { - if (summoner->GetTypeId() != TYPEID_PLAYER || !summoner->GetVehicle()) - return; - - _tigerGuid = summoner->GetVehicle()->GetBase()->GetGUID(); - if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid)) + if (Player* player = summoner->ToPlayer()) { - me->AddThreat(tiger, 500000.0f); - DoCast(me, SPELL_FURIOUS_BITE); + if (Vehicle* vehicle = player->GetVehicle()) + { + _tigerGuid = vehicle->GetBase()->GetGUID(); + if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid)) + { + me->AddThreat(tiger, 500000.0f); + DoCast(me, SPELL_FURIOUS_BITE); + } + } } } diff --git a/src/server/scripts/Kalimdor/zone_moonglade.cpp b/src/server/scripts/Kalimdor/zone_moonglade.cpp index 9601750dc..f79a46864 100644 --- a/src/server/scripts/Kalimdor/zone_moonglade.cpp +++ b/src/server/scripts/Kalimdor/zone_moonglade.cpp @@ -320,7 +320,7 @@ public: } } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { std::list playerOnQuestList; Acore::AnyPlayerInObjectRangeCheck checker(me, 5.0f); diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp index 9b073985e..ecd605097 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp @@ -119,7 +119,7 @@ struct npc_taldaram_flamesphere : public NullCreatureAI } } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { // Replace sphere instantly if sphere is summoned after prince death if (instance->GetBossState(DATA_PRINCE_TALDARAM) != IN_PROGRESS) diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp index d1de208f2..c73c0f7a2 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp @@ -225,7 +225,7 @@ public: // Prevent EvadeMode } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { // Let Zarithrian count as summoner. _instance cant be null since we got GetRubySanctumAI if (Creature* zarithrian = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(NPC_GENERAL_ZARITHRIAN))) diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 2c89dca56..2be575c9e 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -1456,7 +1456,7 @@ public: { npc_living_infernoAI(Creature* creature) : ScriptedAI(creature) { } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { me->SetInCombatWithZone(); me->CastSpell(me, SPELL_BLAZING_AURA, true); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 508653c07..eab6f849c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -1369,7 +1369,7 @@ public: float _groundZ; bool exploded; - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { if (InstanceScript* instance = me->GetInstanceScript()) { diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 46c5015e0..0b1326eb1 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -318,7 +318,7 @@ public: EventMap events; - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { events.ScheduleEvent(1, 450); events.ScheduleEvent(2, 12000); @@ -404,24 +404,29 @@ public: DoAction(-1337); } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (!summoner) return; - if (Vehicle* v = summoner->GetVehicle()) + if (summoner->GetTypeId() != TYPEID_UNIT) + { + return; + } + + if (Vehicle* v = summoner->ToUnit()->GetVehicle()) if (Unit* u = v->GetBase()) if (u->GetEntry() == NPC_BONE_SPIKE && u->GetTypeId() == TYPEID_UNIT) u->ToCreature()->AI()->DoAction(-1337); - ObjectGuid petGUID = summoner->GetPetGUID(); - summoner->SetPetGUID(ObjectGuid::Empty); - me->CastSpell(summoner, SPELL_IMPALED, true); - summoner->CastSpell(me, SPELL_RIDE_VEHICLE, true); + ObjectGuid petGUID = summoner->ToUnit()->GetPetGUID(); + summoner->ToUnit()->SetPetGUID(ObjectGuid::Empty); + me->CastSpell(summoner->ToUnit(), SPELL_IMPALED, true); + summoner->ToUnit()->CastSpell(me, SPELL_RIDE_VEHICLE, true); //summoner->ClearUnitState(UNIT_STATE_ONVEHICLE); - summoner->SetPetGUID(petGUID); - summoner->GetMotionMaster()->Clear(); - summoner->StopMoving(); + summoner->ToUnit()->SetPetGUID(petGUID); + summoner->ToUnit()->GetMotionMaster()->Clear(); + summoner->ToUnit()->StopMoving(); events.ScheduleEvent(1, 8000); hasTrappedUnit = true; } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 52ca27b44..492f2f408 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -756,7 +756,7 @@ public: targetGUID = guid; } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { if (InstanceScript* instance = me->GetInstanceScript()) if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE))) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index 0bfe9055b..ce190eabc 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -358,13 +358,18 @@ public: EventMap events; InstanceScript* instance; - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (!summoner) return; - me->AddThreat(summoner, 500000.0f); - AttackStart(summoner); + if (summoner->GetTypeId() != TYPEID_UNIT) + { + return; + } + + me->AddThreat(summoner->ToUnit(), 500000.0f); + AttackStart(summoner->ToUnit()); } void JustDied(Unit* /*killer*/) override @@ -437,7 +442,7 @@ public: EventMap events; InstanceScript* instance; - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { if (Player* p = me->SelectNearestPlayer(100.0f)) AttackStart(p); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 1da4926b8..57ee449bd 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -2339,7 +2339,7 @@ public: } } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { // player is the spellcaster so register summon manually if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_THE_LICH_KING))) @@ -3121,11 +3121,16 @@ public: EventMap _events; InstanceScript* _instance; - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (!summoner) return; + if (summoner->GetTypeId() != TYPEID_UNIT) + { + return; + } + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_THE_LICH_KING))) { me->SetWalk(false); @@ -3134,13 +3139,13 @@ public: path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), 843.0f)); me->GetMotionMaster()->MoveSplinePath(&path); - ObjectGuid petGUID = summoner->GetPetGUID(); - summoner->SetPetGUID(ObjectGuid::Empty); - summoner->StopMoving(); - me->CastSpell(summoner, SPELL_HARVEST_SOUL_VEHICLE, true); + ObjectGuid petGUID = summoner->ToUnit()->GetPetGUID(); + summoner->ToUnit()->SetPetGUID(ObjectGuid::Empty); + summoner->ToUnit()->StopMoving(); + me->CastSpell(summoner->ToUnit(), SPELL_HARVEST_SOUL_VEHICLE, true); //summoner->ClearUnitState(UNIT_STATE_ONVEHICLE); - summoner->SendMovementFlagUpdate(true); - summoner->SetPetGUID(petGUID); + summoner->ToUnit()->SendMovementFlagUpdate(true); + summoner->ToUnit()->SetPetGUID(petGUID); _events.Reset(); _events.ScheduleEvent(EVENT_MOVE_TO_LICH_KING, 1000); _events.ScheduleEvent(EVENT_TELEPORT, 6250); @@ -3652,7 +3657,7 @@ public: uint16 timer; - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { float destX, destY, destZ; me->GetPosition(destX, destY); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 1484e1aa7..61e582387 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -977,7 +977,7 @@ public: ScriptedAI::AttackStart(who); } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { if (Creature* valithria = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER))) AttackStart(valithria); diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index ca0adf671..878273ba8 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -352,8 +352,13 @@ public: bool JustSummoned; uint16 despawnTimer; - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { + if (summoner->GetTypeId() != TYPEID_UNIT) + { + return; + } + if (m_pInstance->GetBossState(DATA_EREGOS) == IN_PROGRESS) if (Creature* eregos = me->FindNearestCreature(NPC_EREGOS, 450.0f, true)) eregos->DespawnOrUnsummon(); // On retail this kills abusive call of drake during engaged Eregos @@ -363,13 +368,13 @@ public: switch (me->GetEntry()) { case NPC_RUBY_DRAKE: - me->CastSpell(summoner, SPELL_RIDE_RUBY_DRAKE_QUE); + me->CastSpell(summoner->ToUnit(), SPELL_RIDE_RUBY_DRAKE_QUE); break; case NPC_EMERALD_DRAKE: - me->CastSpell(summoner, SPELL_RIDE_EMERALD_DRAKE_QUE); + me->CastSpell(summoner->ToUnit(), SPELL_RIDE_EMERALD_DRAKE_QUE); break; case NPC_AMBER_DRAKE: - me->CastSpell(summoner, SPELL_RIDE_AMBER_DRAKE_QUE); + me->CastSpell(summoner->ToUnit(), SPELL_RIDE_AMBER_DRAKE_QUE); break; default: return; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp index c49a488d8..b91907d82 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp @@ -412,7 +412,7 @@ public: vezax->AI()->DoAction(1); } - void IsSummonedBy(Unit* /*summoner*/) override + void IsSummonedBy(WorldObject* /*summoner*/) override { Talk(SAY_EMOTE_VAPORS); } diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index ed2a5db65..e737e63c8 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -670,7 +670,7 @@ public: me->DespawnOrUnsummon(3s, 0s); } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { me->SetFacingToObject(summoner); Position pos = summoner->GetPosition(); @@ -1677,7 +1677,7 @@ public: return 5; } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (!summoner || summoner->GetTypeId() != TYPEID_PLAYER) return; @@ -1689,7 +1689,7 @@ public: summoner->ToPlayer()->SendDirectMessage(&data); if (id == 1) - if (Aura* aura = summoner->GetAura(47189)) // Transform Aura + if (Aura* aura = summoner->ToUnit()->GetAura(47189)) // Transform Aura aura->SetDuration(aura->GetDuration() - MINUTE * IN_MILLISECONDS); } }; diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index bd7de0b76..846d36e5b 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -1292,19 +1292,24 @@ public: return nullptr; } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (!summoner) return; - summoner->CastSpell(summoner, SPELL_WAITING_FOR_A_BOMBER, true); - summoner->CastSpell(summoner, SPELL_FLIGHT_ORDERS, true); + if (summoner->GetTypeId() != TYPEID_UNIT) + { + return; + } + + summoner->ToUnit()->CastSpell(summoner->ToUnit(), SPELL_WAITING_FOR_A_BOMBER, true); + summoner->ToUnit()->CastSpell(summoner->ToUnit(), SPELL_FLIGHT_ORDERS, true); events.ScheduleEvent(EVENT_START_FLIGHT, 0); events.ScheduleEvent(EVENT_TAKE_PASSENGER, 3000); me->SetCanFly(true); me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); me->SetSpeed(MOVE_FLIGHT, 0.1f); - me->SetFaction(summoner->GetFaction()); + me->SetFaction(summoner->ToUnit()->GetFaction()); } void DamageTaken(Unit* who, uint32&, DamageEffectType, SpellSchoolMask) override @@ -2129,7 +2134,7 @@ public: EventMap events; - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (!summoner) return; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp index e44902333..5dcee04f9 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp @@ -294,7 +294,7 @@ public: me->DespawnOrUnsummon(1); } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (!summoner) return; diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp index 21afa287e..84b495ff8 100644 --- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp +++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp @@ -1108,7 +1108,7 @@ public: timer = 500; } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (summoner && summoner->isType(TYPEMASK_PLAYER)) playerGuid = summoner->GetGUID(); diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp index 6f21b92e8..353386015 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -236,7 +236,7 @@ public: me->GetMotionMaster()->MoveRandom(5.0f); } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (!summoner) return; diff --git a/src/server/scripts/Outland/zone_shattrath_city.cpp b/src/server/scripts/Outland/zone_shattrath_city.cpp index e45cd1820..74baa9f24 100644 --- a/src/server/scripts/Outland/zone_shattrath_city.cpp +++ b/src/server/scripts/Outland/zone_shattrath_city.cpp @@ -407,7 +407,7 @@ public: } } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (!summoner) return; diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp index 123dc6b13..34621293f 100644 --- a/src/server/scripts/Pet/pet_generic.cpp +++ b/src/server/scripts/Pet/pet_generic.cpp @@ -727,7 +727,7 @@ struct npc_pet_gen_fetch_ball : public NullCreatureAI uint32 checkTimer; ObjectGuid targetGUID; - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (!summoner) return; diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp index fb3046986..5792aab9f 100644 --- a/src/server/scripts/World/boss_emerald_dragons.cpp +++ b/src/server/scripts/World/boss_emerald_dragons.cpp @@ -459,13 +459,18 @@ public: { } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (!summoner) return; + if (summoner->GetTypeId() != TYPEID_UNIT) + { + return; + } + _summonerGuid = summoner->GetGUID(); - me->GetMotionMaster()->MoveFollow(summoner, 0.0f, 0.0f); + me->GetMotionMaster()->MoveFollow(summoner->ToUnit(), 0.0f, 0.0f); } void MovementInform(uint32 moveType, uint32 data) override diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index cd88b1eb8..1a4016690 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -2521,7 +2521,7 @@ public: { npc_venomhide_hatchlingAI(Creature* creature) : ScriptedAI(creature) {} - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { if (summoner->GetTypeId() != TYPEID_PLAYER) { @@ -2597,9 +2597,14 @@ public: events.ScheduleEvent(EVENT_FLAME_BREATH, 12s); } - void IsSummonedBy(Unit* summoner) override + void IsSummonedBy(WorldObject* summoner) override { - me->GetMotionMaster()->MoveFollow(summoner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + if (summoner->GetTypeId() != TYPEID_UNIT) + { + return; + } + + me->GetMotionMaster()->MoveFollow(summoner->ToUnit(), PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); } void UpdateAI(uint32 diff) override