diff options
35 files changed, 517 insertions, 444 deletions
diff --git a/src/scripts/eastern_kingdoms/blackrock_depths/boss_moira_bronzebeard.cpp b/src/scripts/eastern_kingdoms/blackrock_depths/boss_moira_bronzebeard.cpp index 570fdb086a7..a24d7a4d25d 100644 --- a/src/scripts/eastern_kingdoms/blackrock_depths/boss_moira_bronzebeard.cpp +++ b/src/scripts/eastern_kingdoms/blackrock_depths/boss_moira_bronzebeard.cpp @@ -41,13 +41,9 @@ struct boss_moira_bronzebeardAI : public ScriptedAI uint32 MindBlast_Timer; uint32 ShadowWordPain_Timer; uint32 Smite_Timer; - Unit* PlayerHolder; - Unit* Target; - bool Heal; void Reset() { - Target = NULL; Heal_Timer = 12000; //These times are probably wrong MindBlast_Timer = 16000; ShadowWordPain_Timer = 2000; diff --git a/src/scripts/eastern_kingdoms/blackrock_depths/boss_tomb_of_seven.cpp b/src/scripts/eastern_kingdoms/blackrock_depths/boss_tomb_of_seven.cpp index 44417bf1579..9914d0a282b 100644 --- a/src/scripts/eastern_kingdoms/blackrock_depths/boss_tomb_of_seven.cpp +++ b/src/scripts/eastern_kingdoms/blackrock_depths/boss_tomb_of_seven.cpp @@ -107,10 +107,6 @@ struct boss_doomrelAI : public ScriptedAI uint32 CurseOfWeakness_Timer; uint32 DemonArmor_Timer; bool Voidwalkers; - int Rand; - int RandX; - int RandY; - Creature* Summoned; void Reset() { diff --git a/src/scripts/eastern_kingdoms/blackrock_spire/boss_gyth.cpp b/src/scripts/eastern_kingdoms/blackrock_spire/boss_gyth.cpp index 60885cc4de4..2f3858626b5 100644 --- a/src/scripts/eastern_kingdoms/blackrock_spire/boss_gyth.cpp +++ b/src/scripts/eastern_kingdoms/blackrock_spire/boss_gyth.cpp @@ -46,7 +46,6 @@ struct boss_gythAI : public ScriptedAI bool SummonedRend; bool bAggro; bool RootSelf; - Creature *SummonedCreature; void Reset() { diff --git a/src/scripts/eastern_kingdoms/blackrock_spire/boss_overlord_wyrmthalak.cpp b/src/scripts/eastern_kingdoms/blackrock_spire/boss_overlord_wyrmthalak.cpp index 1032dc06c78..548df0e314c 100644 --- a/src/scripts/eastern_kingdoms/blackrock_spire/boss_overlord_wyrmthalak.cpp +++ b/src/scripts/eastern_kingdoms/blackrock_spire/boss_overlord_wyrmthalak.cpp @@ -47,7 +47,6 @@ struct boss_overlordwyrmthalakAI : public ScriptedAI uint32 Cleave_Timer; uint32 Knockaway_Timer; bool Summoned; - Creature *SummonedCreature; void Reset() { @@ -101,9 +100,9 @@ struct boss_overlordwyrmthalakAI : public ScriptedAI { Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM,0, 100, true); - if (SummonedCreature = m_creature->SummonCreature(9216,ADD_1X,ADD_1Y,ADD_1Z,ADD_1O,TEMPSUMMON_TIMED_DESPAWN,300000)) + if (Creature *SummonedCreature = m_creature->SummonCreature(9216,ADD_1X,ADD_1Y,ADD_1Z,ADD_1O,TEMPSUMMON_TIMED_DESPAWN,300000)) SummonedCreature->AI()->AttackStart(pTarget); - if (SummonedCreature = m_creature->SummonCreature(9268,ADD_2X,ADD_2Y,ADD_2Z,ADD_2O,TEMPSUMMON_TIMED_DESPAWN,300000)) + if (Creature *SummonedCreature = m_creature->SummonCreature(9268,ADD_2X,ADD_2Y,ADD_2Z,ADD_2O,TEMPSUMMON_TIMED_DESPAWN,300000)) SummonedCreature->AI()->AttackStart(pTarget); Summoned = true; } diff --git a/src/scripts/eastern_kingdoms/deadmines/instance_deadmines.cpp b/src/scripts/eastern_kingdoms/deadmines/instance_deadmines.cpp index 1da65ed611a..84b79a1dd41 100644 --- a/src/scripts/eastern_kingdoms/deadmines/instance_deadmines.cpp +++ b/src/scripts/eastern_kingdoms/deadmines/instance_deadmines.cpp @@ -45,12 +45,13 @@ struct instance_deadmines : public ScriptedInstance { instance_deadmines(Map* pMap) : ScriptedInstance(pMap) { Initialize(); }; - GameObject* IronCladDoor; - GameObject* DefiasCannon; - GameObject* DoorLever; - Creature* DefiasPirate1; - Creature* DefiasPirate2; - Creature* DefiasCompanion; + uint64 IronCladDoorGUID; + uint64 DefiasCannonGUID; + uint64 DoorLeverGUID; + uint64 DefiasPirate1GUID; + uint64 DefiasPirate2GUID; + uint64 DefiasCompanionGUID; + uint32 State; uint32 CannonBlast_Timer; uint32 PiratesDelay_Timer; @@ -58,16 +59,24 @@ struct instance_deadmines : public ScriptedInstance void Initialize() { - IronCladDoor = NULL; - DefiasCannon = NULL; - DoorLever = NULL; + IronCladDoorGUID = 0; + DefiasCannonGUID = 0; + DoorLeverGUID = 0; + DefiasPirate1GUID = 0; + DefiasPirate2GUID = 0; + DefiasCompanionGUID = 0; + State = CANNON_NOT_USED; uiSmiteChestGUID = 0; } virtual void Update(uint32 diff) { - if (!IronCladDoor || !DefiasCannon || !DoorLever) + if (!IronCladDoorGUID || !DefiasCannonGUID || !DoorLeverGUID) + return; + + GameObject *pIronCladDoor = instance->GetGameObject(IronCladDoorGUID); + if (!pIronCladDoor) return; switch (State) @@ -75,9 +84,9 @@ struct instance_deadmines : public ScriptedInstance case CANNON_GUNPOWDER_USED: CannonBlast_Timer = DATA_CANNON_BLAST_TIMER; // it's a hack - Mr. Smite should do that but his too far away - IronCladDoor->SetName("Mr. Smite"); - IronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, 0); - DoPlaySound(IronCladDoor, SOUND_MR_SMITE_ALARM1); + pIronCladDoor->SetName("Mr. Smite"); + pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, 0); + DoPlaySound(pIronCladDoor, SOUND_MR_SMITE_ALARM1); State = CANNON_BLAST_INITIATED; break; case CANNON_BLAST_INITIATED: @@ -88,8 +97,8 @@ struct instance_deadmines : public ScriptedInstance ShootCannon(); BlastOutDoor(); LeverStucked(); - IronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, 0); - DoPlaySound(IronCladDoor, SOUND_MR_SMITE_ALARM2); + pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, 0); + DoPlaySound(pIronCladDoor, SOUND_MR_SMITE_ALARM2); State = PIRATES_ATTACK; } else CannonBlast_Timer -= diff; break; @@ -105,19 +114,32 @@ struct instance_deadmines : public ScriptedInstance void SummonCreatures() { - DefiasPirate1 = IronCladDoor->SummonCreature(657,IronCladDoor->GetPositionX() - 2,IronCladDoor->GetPositionY()-7,IronCladDoor->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); - DefiasPirate2 = IronCladDoor->SummonCreature(657,IronCladDoor->GetPositionX() + 3,IronCladDoor->GetPositionY()-6,IronCladDoor->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); - DefiasCompanion = IronCladDoor->SummonCreature(3450,IronCladDoor->GetPositionX() + 2,IronCladDoor->GetPositionY()-6,IronCladDoor->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); + if (GameObject *pIronCladDoor = instance->GetGameObject(IronCladDoorGUID)) + { + Creature *DefiasPirate1 = pIronCladDoor->SummonCreature(657,pIronCladDoor->GetPositionX() - 2,pIronCladDoor->GetPositionY()-7,pIronCladDoor->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); + Creature *DefiasPirate2 = pIronCladDoor->SummonCreature(657,pIronCladDoor->GetPositionX() + 3,pIronCladDoor->GetPositionY()-6,pIronCladDoor->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); + Creature *DefiasCompanion = pIronCladDoor->SummonCreature(3450,pIronCladDoor->GetPositionX() + 2,pIronCladDoor->GetPositionY()-6,pIronCladDoor->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); + + DefiasPirate1GUID = DefiasPirate1->GetGUID(); + DefiasPirate2GUID = DefiasPirate2->GetGUID(); + DefiasCompanionGUID = DefiasCompanion->GetGUID(); + } } void MoveCreaturesInside() { - if (!DefiasPirate1 || !DefiasPirate2 || !DefiasCompanion) + if (!DefiasPirate1GUID || !DefiasPirate2GUID || !DefiasCompanionGUID) + return; + + Creature *pDefiasPirate1 = instance->GetCreature(DefiasPirate1GUID); + Creature *pDefiasPirate2 = instance->GetCreature(DefiasPirate2GUID); + Creature *pDefiasCompanion = instance->GetCreature(DefiasCompanionGUID); + if (!pDefiasPirate1 || !pDefiasPirate2 || !pDefiasCompanion) return; - MoveCreatureInside(DefiasPirate1); - MoveCreatureInside(DefiasPirate2); - MoveCreatureInside(DefiasCompanion); + MoveCreatureInside(pDefiasPirate1); + MoveCreatureInside(pDefiasPirate2); + MoveCreatureInside(pDefiasCompanion); } void MoveCreatureInside(Creature* pCreature) @@ -128,37 +150,36 @@ struct instance_deadmines : public ScriptedInstance void ShootCannon() { - DefiasCannon->SetGoState(GO_STATE_ACTIVE); - DoPlaySound(DefiasCannon, SOUND_CANNONFIRE); + if (GameObject *pDefiasCannon = instance->GetGameObject(DefiasCannonGUID)) + { + pDefiasCannon->SetGoState(GO_STATE_ACTIVE); + DoPlaySound(pDefiasCannon, SOUND_CANNONFIRE); + } } void BlastOutDoor() { - IronCladDoor->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - DoPlaySound(IronCladDoor, SOUND_DESTROYDOOR); + if (GameObject *pIronCladDoor = instance->GetGameObject(IronCladDoorGUID)) + { + pIronCladDoor->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + DoPlaySound(pIronCladDoor, SOUND_DESTROYDOOR); + } } void LeverStucked() { - DoorLever->SetUInt32Value(GAMEOBJECT_FLAGS, 4); + if (GameObject *pDoorLever = instance->GetGameObject(DoorLeverGUID)) + pDoorLever->SetUInt32Value(GAMEOBJECT_FLAGS, 4); } void OnGameObjectCreate(GameObject* pGo, bool add) { switch(pGo->GetEntry()) { - case GO_IRONCLAD_DOOR: - IronCladDoor = pGo; - break; - case GO_DEFIAS_CANNON: - DefiasCannon = pGo; - break; - case GO_DOOR_LEVER: - DoorLever = pGo; - break; - case GO_MR_SMITE_CHEST: - uiSmiteChestGUID = pGo->GetGUID(); - break; + case GO_IRONCLAD_DOOR: IronCladDoorGUID = pGo->GetGUID(); break; + case GO_DEFIAS_CANNON: DefiasCannonGUID = pGo->GetGUID(); break; + case GO_DOOR_LEVER: DoorLeverGUID = pGo->GetGUID(); break; + case GO_MR_SMITE_CHEST: uiSmiteChestGUID = pGo->GetGUID(); break; } } @@ -166,7 +187,7 @@ struct instance_deadmines : public ScriptedInstance { if (type == EVENT_STATE) { - if (DefiasCannon && IronCladDoor) + if (DefiasCannonGUID && IronCladDoorGUID) State=data; } } diff --git a/src/scripts/eastern_kingdoms/molten_core/boss_ragnaros.cpp b/src/scripts/eastern_kingdoms/molten_core/boss_ragnaros.cpp index 3195ad82591..ba2673290b5 100644 --- a/src/scripts/eastern_kingdoms/molten_core/boss_ragnaros.cpp +++ b/src/scripts/eastern_kingdoms/molten_core/boss_ragnaros.cpp @@ -98,7 +98,7 @@ struct boss_ragnarosAI : public ScriptedAI uint32 Erruption_Timer; uint32 Submerge_Timer; uint32 Attack_Timer; - Creature *Summoned; + bool HasYelledMagmaBurst; bool HasSubmergedOnce; bool WasBanished; diff --git a/src/scripts/eastern_kingdoms/scarlet_enclave/chapter1.cpp b/src/scripts/eastern_kingdoms/scarlet_enclave/chapter1.cpp index 4cd94ab8578..9ae7d602ffc 100644 --- a/src/scripts/eastern_kingdoms/scarlet_enclave/chapter1.cpp +++ b/src/scripts/eastern_kingdoms/scarlet_enclave/chapter1.cpp @@ -499,19 +499,19 @@ struct npc_dark_rider_of_acherusAI : public ScriptedAI uint32 PhaseTimer; uint32 Phase; bool Intro; - Unit *Target; + uint64 TargetGUID; void Reset() { PhaseTimer = 4000; Phase = 0; Intro = false; - Target = NULL; + TargetGUID = 0; } void UpdateAI(const uint32 diff) { - if (!Intro) + if (!Intro || !TargetGUID) return; if (PhaseTimer <= diff) @@ -524,7 +524,8 @@ struct npc_dark_rider_of_acherusAI : public ScriptedAI Phase = 1; break; case 1: - DoCast(Target, DESPAWN_HORSE, true); + if (Unit *pTarget = Unit::GetUnit(*m_creature, TargetGUID)) + DoCast(pTarget, DESPAWN_HORSE, true); PhaseTimer = 3000; Phase = 2; break; @@ -548,11 +549,11 @@ struct npc_dark_rider_of_acherusAI : public ScriptedAI if (!who) return; - Target = who; + TargetGUID = who->GetGUID(); m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); m_creature->SetSpeed(MOVE_RUN, 0.4f); - m_creature->GetMotionMaster()->MoveChase(Target); - m_creature->SetUInt64Value(UNIT_FIELD_TARGET, Target->GetGUID()); + m_creature->GetMotionMaster()->MoveChase(who); + m_creature->SetUInt64Value(UNIT_FIELD_TARGET, TargetGUID); Intro = true; } diff --git a/src/scripts/eastern_kingdoms/scholomance/boss_darkmaster_gandling.cpp b/src/scripts/eastern_kingdoms/scholomance/boss_darkmaster_gandling.cpp index a1543413ef5..11578a07a83 100644 --- a/src/scripts/eastern_kingdoms/scholomance/boss_darkmaster_gandling.cpp +++ b/src/scripts/eastern_kingdoms/scholomance/boss_darkmaster_gandling.cpp @@ -62,8 +62,6 @@ struct boss_darkmaster_gandlingAI : public ScriptedAI uint32 Curse_Timer; uint32 Teleport_Timer; - Creature *Summoned; - void Reset() { ArcaneMissiles_Timer = 4500; @@ -121,6 +119,7 @@ struct boss_darkmaster_gandlingAI : public ScriptedAI if (DoGetThreat(pTarget)) DoModifyThreatPercent(pTarget, -100); + Creature *Summoned = NULL; switch(rand()%6) { case 0: diff --git a/src/scripts/eastern_kingdoms/stratholme/boss_baron_rivendare.cpp b/src/scripts/eastern_kingdoms/stratholme/boss_baron_rivendare.cpp index 4fd3e6c9b9e..dd83e3cbc5f 100644 --- a/src/scripts/eastern_kingdoms/stratholme/boss_baron_rivendare.cpp +++ b/src/scripts/eastern_kingdoms/stratholme/boss_baron_rivendare.cpp @@ -89,7 +89,6 @@ struct boss_baron_rivendareAI : public ScriptedAI uint32 MortalStrike_Timer; // uint32 RaiseDead_Timer; uint32 SummonSkeletons_Timer; - Creature *Summoned; void Reset() { @@ -112,7 +111,7 @@ struct boss_baron_rivendareAI : public ScriptedAI void JustSummoned(Creature* summoned) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) - summoned->AI()->AttackStart(pTarget); + summoned->AI()->AttackStart(pTarget); } void JustDied(Unit* Killer) diff --git a/src/scripts/eastern_kingdoms/sunken_temple/instance_sunken_temple.cpp b/src/scripts/eastern_kingdoms/sunken_temple/instance_sunken_temple.cpp index be4c5901ebc..6d040ed4885 100644 --- a/src/scripts/eastern_kingdoms/sunken_temple/instance_sunken_temple.cpp +++ b/src/scripts/eastern_kingdoms/sunken_temple/instance_sunken_temple.cpp @@ -44,14 +44,6 @@ struct instance_sunken_temple : public ScriptedInstance Initialize(); }; - GameObject* AtalaiStatue1; - GameObject* AtalaiStatue2; - GameObject* AtalaiStatue3; - GameObject* AtalaiStatue4; - GameObject* AtalaiStatue5; - GameObject* AtalaiStatue6; - GameObject* AtalaiIdol; - uint64 GOAtalaiStatue1; uint64 GOAtalaiStatue2; uint64 GOAtalaiStatue3; @@ -59,6 +51,7 @@ struct instance_sunken_temple : public ScriptedInstance uint64 GOAtalaiStatue5; uint64 GOAtalaiStatue6; uint64 GOAtalaiIdol; + uint32 State; bool s1; @@ -77,14 +70,9 @@ struct instance_sunken_temple : public ScriptedInstance GOAtalaiStatue5 = 0; GOAtalaiStatue6 = 0; GOAtalaiIdol = 0; + State = 0; - AtalaiStatue1 = NULL; - AtalaiStatue2 = NULL; - AtalaiStatue3 = NULL; - AtalaiStatue4 = NULL; - AtalaiStatue5 = NULL; - AtalaiStatue6 = NULL; - AtalaiIdol = NULL; + s1 = false; s2 = false; s3 = false; @@ -94,39 +82,18 @@ struct instance_sunken_temple : public ScriptedInstance } void OnGameObjectCreate(GameObject* pGo, bool add) - { - switch(pGo->GetEntry()) - { - case GO_ATALAI_STATUE1: - AtalaiStatue1 = pGo; - GOAtalaiStatue1 = pGo->GetGUID(); - break; - case GO_ATALAI_STATUE2: - AtalaiStatue2 = pGo; - GOAtalaiStatue2 = pGo->GetGUID(); - break; - case GO_ATALAI_STATUE3: - AtalaiStatue3 = pGo; - GOAtalaiStatue3 = pGo->GetGUID(); - break; - case GO_ATALAI_STATUE4: - AtalaiStatue4 = pGo; - GOAtalaiStatue4 = pGo->GetGUID(); - break; - case GO_ATALAI_STATUE5: - AtalaiStatue5 = pGo; - GOAtalaiStatue5 = pGo->GetGUID(); - break; - case GO_ATALAI_STATUE6: - AtalaiStatue6 = pGo; - GOAtalaiStatue6 = pGo->GetGUID(); - break; - case GO_ATALAI_IDOL: - AtalaiIdol = pGo; - GOAtalaiIdol = pGo->GetGUID(); - break; - } - }; + { + switch(pGo->GetEntry()) + { + case GO_ATALAI_STATUE1: GOAtalaiStatue1 = pGo->GetGUID(); break; + case GO_ATALAI_STATUE2: GOAtalaiStatue2 = pGo->GetGUID(); break; + case GO_ATALAI_STATUE3: GOAtalaiStatue3 = pGo->GetGUID(); break; + case GO_ATALAI_STATUE4: GOAtalaiStatue4 = pGo->GetGUID(); break; + case GO_ATALAI_STATUE5: GOAtalaiStatue5 = pGo->GetGUID(); break; + case GO_ATALAI_STATUE6: GOAtalaiStatue6 = pGo->GetGUID(); break; + case GO_ATALAI_IDOL: GOAtalaiIdol = pGo->GetGUID(); break; + } + } virtual void Update(uint32 diff) // correct order goes form 1-6 { @@ -135,7 +102,8 @@ struct instance_sunken_temple : public ScriptedInstance case GO_ATALAI_STATUE1: if(!s1 && !s2 && !s3 && !s4 && !s5 && !s6) { - UseStatue(AtalaiStatue1); + if (GameObject *pAtalaiStatue1 = instance->GetGameObject(GOAtalaiStatue1)) + UseStatue(pAtalaiStatue1); s1 = true; State = 0; }; @@ -143,7 +111,8 @@ struct instance_sunken_temple : public ScriptedInstance case GO_ATALAI_STATUE2: if(s1 && !s2 && !s3 && !s4 && !s5 && !s6) { - UseStatue(AtalaiStatue2); + if (GameObject *pAtalaiStatue2 = instance->GetGameObject(GOAtalaiStatue2)) + UseStatue(pAtalaiStatue2); s2 = true; State = 0; }; @@ -151,7 +120,8 @@ struct instance_sunken_temple : public ScriptedInstance case GO_ATALAI_STATUE3: if(s1 && s2 && !s3 && !s4 && !s5 && !s6) { - UseStatue(AtalaiStatue3); + if (GameObject *pAtalaiStatue3 = instance->GetGameObject(GOAtalaiStatue3)) + UseStatue(pAtalaiStatue3); s3 = true; State = 0; }; @@ -159,7 +129,8 @@ struct instance_sunken_temple : public ScriptedInstance case GO_ATALAI_STATUE4: if(s1 && s2 && s3 && !s4 && !s5 && !s6) { - UseStatue(AtalaiStatue4); + if (GameObject *pAtalaiStatue4 = instance->GetGameObject(GOAtalaiStatue4)) + UseStatue(pAtalaiStatue4); s4 = true; State = 0; } @@ -167,7 +138,8 @@ struct instance_sunken_temple : public ScriptedInstance case GO_ATALAI_STATUE5: if(s1 && s2 && s3 && s4 && !s5 && !s6) { - UseStatue(AtalaiStatue5); + if (GameObject *pAtalaiStatue5 = instance->GetGameObject(GOAtalaiStatue5)) + UseStatue(pAtalaiStatue5); s5 = true; State = 0; } @@ -175,7 +147,8 @@ struct instance_sunken_temple : public ScriptedInstance case GO_ATALAI_STATUE6: if(s1 && s2 && s3 && s4 && s5 && !s6) { - UseLastStatue(AtalaiStatue6); + if (GameObject *pAtalaiStatue6 = instance->GetGameObject(GOAtalaiStatue6)) + UseStatue(pAtalaiStatue6); s6 = true; State = 0; } @@ -183,11 +156,13 @@ struct instance_sunken_temple : public ScriptedInstance } }; - void UseStatue(GameObject* pGo) - { - pGo->SummonGameObject(GO_ATALAI_LIGHT1,pGo->GetPositionX(),pGo->GetPositionY(),pGo->GetPositionZ(),0,0,0,0,0,0); - pGo->SetUInt32Value(GAMEOBJECT_FLAGS, 4); - } + void UseStatue(GameObject* pGo) + { + pGo->SummonGameObject(GO_ATALAI_LIGHT1,pGo->GetPositionX(),pGo->GetPositionY(),pGo->GetPositionZ(),0,0,0,0,0,0); + pGo->SetUInt32Value(GAMEOBJECT_FLAGS, 4); + } + + /* void UseLastStatue(GameObject* pGo) { AtalaiStatue1->SummonGameObject(GO_ATALAI_LIGHT2,AtalaiStatue1->GetPositionX(),AtalaiStatue1->GetPositionY(),AtalaiStatue1->GetPositionZ(),0,0,0,0,0,100000); @@ -198,6 +173,7 @@ struct instance_sunken_temple : public ScriptedInstance AtalaiStatue6->SummonGameObject(GO_ATALAI_LIGHT2,AtalaiStatue6->GetPositionX(),AtalaiStatue6->GetPositionY(),AtalaiStatue6->GetPositionZ(),0,0,0,0,0,100000); pGo->SummonGameObject(148838,-488.997,96.61,-189.019,-1.52,0,0,0,0,100000); } + */ void SetData(uint32 type, uint32 data) { diff --git a/src/scripts/eastern_kingdoms/sunwell_plateau/boss_brutallus.cpp b/src/scripts/eastern_kingdoms/sunwell_plateau/boss_brutallus.cpp index 1f0b1e3a57e..b434ef5c3b4 100644 --- a/src/scripts/eastern_kingdoms/sunwell_plateau/boss_brutallus.cpp +++ b/src/scripts/eastern_kingdoms/sunwell_plateau/boss_brutallus.cpp @@ -73,7 +73,6 @@ struct boss_brutallusAI : public ScriptedAI } ScriptedInstance* pInstance; - Unit* Madrigosa; uint32 SlashTimer; uint32 BurnTimer; @@ -102,8 +101,6 @@ struct boss_brutallusAI : public ScriptedAI IsIntro = false; Enraged = false; - - DoCast(m_creature, SPELL_DUAL_WIELD, true); if (pInstance) @@ -142,17 +139,15 @@ struct boss_brutallusAI : public ScriptedAI ScriptedAI::EnterEvadeMode(); } - - void StartIntro() { if (!Intro || IsIntro) return; error_log("Start Intro"); - Madrigosa = Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_MADRIGOSA)); + Creature *Madrigosa = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_MADRIGOSA) : 0); if (Madrigosa) { - ((Creature*)Madrigosa)->Respawn(); + Madrigosa->Respawn(); Madrigosa->setActive(true); IsIntro = true; Madrigosa->SetMaxHealth(m_creature->GetMaxHealth()); @@ -166,7 +161,6 @@ struct boss_brutallusAI : public ScriptedAI error_log("Madrigosa was not found"); EndIntro(); } - } void EndIntro() @@ -186,6 +180,7 @@ struct boss_brutallusAI : public ScriptedAI void DoIntro() { + Creature *Madrigosa = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_MADRIGOSA) : 0); if (!Madrigosa) return; @@ -286,13 +281,15 @@ struct boss_brutallusAI : public ScriptedAI { if (IntroFrostBoltTimer <= diff) { - if (Madrigosa) + if (Creature *Madrigosa = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_MADRIGOSA) : 0)) { Madrigosa->CastSpell(m_creature, SPELL_INTRO_FROSTBOLT, true); IntroFrostBoltTimer = 2000; } } else IntroFrostBoltTimer -= diff; } + if (!UpdateVictim()) + return; DoMeleeAttackIfReady(); } diff --git a/src/scripts/eastern_kingdoms/sunwell_plateau/boss_kiljaeden.cpp b/src/scripts/eastern_kingdoms/sunwell_plateau/boss_kiljaeden.cpp index 87291ae807a..1b8d51be960 100644 --- a/src/scripts/eastern_kingdoms/sunwell_plateau/boss_kiljaeden.cpp +++ b/src/scripts/eastern_kingdoms/sunwell_plateau/boss_kiljaeden.cpp @@ -307,7 +307,7 @@ struct boss_kalecgos_kjAI : public ScriptedAI pInstance = c->GetInstanceData(); } - GameObject* Orb[4]; + uint64 OrbGUID[4]; ScriptedInstance* pInstance; uint8 OrbsEmpowered; uint8 EmpowerCount; @@ -316,7 +316,7 @@ struct boss_kalecgos_kjAI : public ScriptedAI void InitializeAI(){ for (uint8 i = 0; i < 4; ++i) - Orb[i] = NULL; + OrbGUID[i] = 0; FindOrbs(); OrbsEmpowered = 0; EmpowerCount = 0; @@ -347,8 +347,8 @@ struct boss_kalecgos_kjAI : public ScriptedAI return; uint8 i = 0; - for (std::list<GameObject*>::iterator itr = orbList.begin(); itr != orbList.end(); ++itr, ++i){ - Orb[i] = pInstance ? pInstance->instance->GetGameObject(pInstance->GetData64((*itr)->GetGUID())) : NULL; + for (std::list<GameObject*>::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr, ++i){ + OrbGUID[i] = pInstance ? (*itr)->GetGUID() : 0; } } @@ -356,24 +356,29 @@ struct boss_kalecgos_kjAI : public ScriptedAI { m_creature->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES); for (uint8 i = 0; i < 4; ++i) - if (Orb[i]) Orb[i]->SetUInt32Value(GAMEOBJECT_FACTION, 0); + if (GameObject *pOrb = m_creature->GetMap()->GetGameObject(OrbGUID[i])) + pOrb->SetUInt32Value(GAMEOBJECT_FACTION, 0); } void EmpowerOrb(bool all) { - if (!Orb[OrbsEmpowered]) + if (!OrbGUID[OrbsEmpowered]) return; + uint8 random = urand(0,3); if (all) { m_creature->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES); for (uint8 i = 0; i < 4; ++i) { - if (!Orb[i]) return; - Orb[i]->CastSpell(m_creature, SPELL_RING_OF_BLUE_FLAMES); - Orb[i]->SetUInt32Value(GAMEOBJECT_FACTION, 35); - Orb[i]->setActive(true); - Orb[i]->Refresh(); + GameObject *pOrb = m_creature->GetMap()->GetGameObject(OrbGUID[i]); + if (!pOrb) + return; + + pOrb->CastSpell(m_creature, SPELL_RING_OF_BLUE_FLAMES); + pOrb->SetUInt32Value(GAMEOBJECT_FACTION, 35); + pOrb->setActive(true); + pOrb->Refresh(); } } else @@ -392,12 +397,15 @@ struct boss_kalecgos_kjAI : public ScriptedAI } } }*/ - if(Orb[random]) + if(OrbGUID[random]) { - Orb[random]->CastSpell(m_creature, SPELL_RING_OF_BLUE_FLAMES); - Orb[random]->SetUInt32Value(GAMEOBJECT_FACTION, 35); - Orb[random]->setActive(true); - Orb[random]->Refresh(); + if (GameObject* pOrb = m_creature->GetMap()->GetGameObject(OrbGUID[random])) + { + pOrb->CastSpell(m_creature, SPELL_RING_OF_BLUE_FLAMES); + pOrb->SetUInt32Value(GAMEOBJECT_FACTION, 35); + pOrb->setActive(true); + pOrb->Refresh(); + } } ++OrbsEmpowered; } @@ -440,8 +448,6 @@ struct boss_kiljaedenAI : public Scripted_NoMovementAI ScriptedInstance* pInstance; SummonList Summons; - Creature* Kalec; - Unit* randomPlayer; uint8 Phase; uint8 ActiveTimers; @@ -486,8 +492,6 @@ struct boss_kiljaedenAI : public Scripted_NoMovementAI IsWaiting = false; OrbActivated = false; - if(pInstance) - Kalec = CAST_CRE(Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_KALECGOS_KJ))); ChangeTimers(false, 0); } @@ -595,9 +599,9 @@ struct boss_kiljaedenAI : public Scripted_NoMovementAI switch(t) { case TIMER_KALEC_JOIN: - if (Kalec) + if (Creature *pKalec = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_KALECGOS_KJ) : 0)) { - DoScriptText(SAY_KALECGOS_JOIN, Kalec); + DoScriptText(SAY_KALECGOS_JOIN, pKalec); IsKalecJoined = true; TimerIsDeactiveted[TIMER_KALEC_JOIN] = true; } @@ -613,14 +617,15 @@ struct boss_kiljaedenAI : public Scripted_NoMovementAI case TIMER_LEGION_LIGHTNING: if (!m_creature->IsNonMeleeSpellCasted(false)) { + Unit *RandomPlayer; m_creature->RemoveAurasDueToSpell(SPELL_SOUL_FLAY); for (uint8 z = 0; z < 6; ++z) { - randomPlayer = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (!randomPlayer->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break; + RandomPlayer = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); + if (RandomPlayer && !RandomPlayer->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break; } - if (randomPlayer) - DoCast(randomPlayer, SPELL_LEGION_LIGHTNING, false); + if (RandomPlayer) + DoCast(RandomPlayer, SPELL_LEGION_LIGHTNING, false); else error_log("try to cast SPELL_LEGION_LIGHTNING on invalid target"); Timer[TIMER_LEGION_LIGHTNING] = (Phase == PHASE_SACRIFICE) ? 18000 : 30000; // 18 seconds in PHASE_SACRIFICE @@ -686,15 +691,15 @@ struct boss_kiljaedenAI : public Scripted_NoMovementAI } break; case TIMER_ORBS_EMPOWER: //Phase 3 - if (Kalec) + if (Creature *pKalec = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_KALECGOS_KJ) : 0)) { switch (Phase) { case PHASE_SACRIFICE: - CAST_AI(boss_kalecgos_kjAI, Kalec->AI())->EmpowerOrb(true); + CAST_AI(boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(true); break; default: - CAST_AI(boss_kalecgos_kjAI, Kalec->AI())->EmpowerOrb(false); + CAST_AI(boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(false); break; } } @@ -707,7 +712,7 @@ struct boss_kiljaedenAI : public Scripted_NoMovementAI for (uint8 z = 0; z < 6; ++z) { pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (!pTarget->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break; + if (pTarget && !pTarget->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break; } if (pTarget) { @@ -788,7 +793,6 @@ struct mob_kiljaeden_controllerAI : public Scripted_NoMovementAI } ScriptedInstance* pInstance; - Creature* KalecKJ; SummonList Summons; bool SummonedDeceivers; @@ -800,8 +804,6 @@ struct mob_kiljaeden_controllerAI : public Scripted_NoMovementAI void InitializeAI() { - if(pInstance) - KalecKJ = Unit::GetCreature((*m_creature), pInstance->GetData64(DATA_KALECGOS_KJ)); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->addUnitState(UNIT_STAT_STUNNED); @@ -812,8 +814,8 @@ struct mob_kiljaeden_controllerAI : public Scripted_NoMovementAI void Reset() { Phase = PHASE_DECEIVERS; - if (KalecKJ) - CAST_AI(boss_kalecgos_kjAI, KalecKJ->AI())->ResetOrbs(); + if (Creature *pKalecKJ = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_KALECGOS_KJ) : 0)) + CAST_AI(boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs(); DeceiverDeathCount = 0; SummonedDeceivers = false; KiljaedenDeath = false; diff --git a/src/scripts/eastern_kingdoms/sunwell_plateau/boss_muru.cpp b/src/scripts/eastern_kingdoms/sunwell_plateau/boss_muru.cpp index c1b672af831..d7d70fa6919 100644 --- a/src/scripts/eastern_kingdoms/sunwell_plateau/boss_muru.cpp +++ b/src/scripts/eastern_kingdoms/sunwell_plateau/boss_muru.cpp @@ -374,7 +374,6 @@ struct npc_muru_portalAI : public Scripted_NoMovementAI ScriptedInstance* pInstance; SummonList Summons; - Creature* Muru; bool SummonSentinel; bool InAction; diff --git a/src/scripts/eastern_kingdoms/zulaman/boss_hexlord.cpp b/src/scripts/eastern_kingdoms/zulaman/boss_hexlord.cpp index dee092536a9..94eb393f7cc 100644 --- a/src/scripts/eastern_kingdoms/zulaman/boss_hexlord.cpp +++ b/src/scripts/eastern_kingdoms/zulaman/boss_hexlord.cpp @@ -224,8 +224,6 @@ struct boss_hex_lord_malacrassAI : public ScriptedAI uint32 PlayerClass; - Unit* SoulDrainTarget; - void Reset() { if (pInstance) diff --git a/src/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp b/src/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp index 27130cf8350..87946d0cac2 100644 --- a/src/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp +++ b/src/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp @@ -77,6 +77,7 @@ struct boss_arlokkAI : public ScriptedAI uint32 m_uiSummonCount; Unit* m_pMarkedTarget; + uint64 MarkedTargetGUID; bool m_bIsPhaseTwo; bool m_bIsVanished; @@ -96,7 +97,7 @@ struct boss_arlokkAI : public ScriptedAI m_bIsPhaseTwo = false; m_bIsVanished = false; - m_pMarkedTarget = NULL; + MarkedTargetGUID = 0; m_creature->SetDisplayId(MODEL_ID_NORMAL); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -129,8 +130,8 @@ struct boss_arlokkAI : public ScriptedAI void DoSummonPhanters() { - if (m_pMarkedTarget) - DoScriptText(SAY_FEAST_PANTHER, m_creature, m_pMarkedTarget); + if (Unit *pMarkedTarget = Unit::GetUnit(*m_creature, MarkedTargetGUID)) + DoScriptText(SAY_FEAST_PANTHER, m_creature, pMarkedTarget); m_creature->SummonCreature(NPC_ZULIAN_PROWLER, -11532.7998, -1649.6734, 41.4800, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); m_creature->SummonCreature(NPC_ZULIAN_PROWLER, -11532.9970, -1606.4840, 41.2979, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); @@ -138,8 +139,8 @@ struct boss_arlokkAI : public ScriptedAI void JustSummoned(Creature* pSummoned) { - if (m_pMarkedTarget) - pSummoned->AI()->AttackStart(m_pMarkedTarget); + if (Unit *pMarkedTarget = Unit::GetUnit(*m_creature, MarkedTargetGUID)) + pSummoned->AI()->AttackStart(pMarkedTarget); ++m_uiSummonCount; } @@ -161,12 +162,15 @@ struct boss_arlokkAI : public ScriptedAI if (m_uiMark_Timer <= uiDiff) { - m_pMarkedTarget = SelectUnit(SELECT_TARGET_RANDOM,0); + Unit *pMarkedTarget = SelectUnit(SELECT_TARGET_RANDOM,0); - if (m_pMarkedTarget) - DoCast(m_pMarkedTarget, SPELL_MARK); + if (pMarkedTarget) + { + DoCast(pMarkedTarget, SPELL_MARK); + MarkedTargetGUID = pMarkedTarget->GetGUID(); + } else - error_log("TSCR: boss_arlokk could not accuire m_pMarkedTarget."); + error_log("TSCR: boss_arlokk could not accuire pMarkedTarget."); m_uiMark_Timer = 15000; } diff --git a/src/scripts/eastern_kingdoms/zulgurub/boss_hazzarah.cpp b/src/scripts/eastern_kingdoms/zulgurub/boss_hazzarah.cpp index 820bd875b3c..e1e0c0788a1 100644 --- a/src/scripts/eastern_kingdoms/zulgurub/boss_hazzarah.cpp +++ b/src/scripts/eastern_kingdoms/zulgurub/boss_hazzarah.cpp @@ -34,7 +34,6 @@ struct boss_hazzarahAI : public ScriptedAI uint32 ManaBurn_Timer; uint32 Sleep_Timer; uint32 Illusions_Timer; - Creature* Illusion; void Reset() { @@ -78,7 +77,7 @@ struct boss_hazzarahAI : public ScriptedAI if (!pTarget) return; - Illusion = m_creature->SummonCreature(15163,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,30000); + Creature *Illusion = m_creature->SummonCreature(15163,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,30000); if (Illusion) Illusion->AI()->AttackStart(pTarget); } diff --git a/src/scripts/eastern_kingdoms/zulgurub/boss_marli.cpp b/src/scripts/eastern_kingdoms/zulgurub/boss_marli.cpp index ff57c3c8b1d..7be13a76c45 100644 --- a/src/scripts/eastern_kingdoms/zulgurub/boss_marli.cpp +++ b/src/scripts/eastern_kingdoms/zulgurub/boss_marli.cpp @@ -55,7 +55,6 @@ struct boss_marliAI : public ScriptedAI uint32 Transform_Timer; uint32 TransformBack_Timer; - Creature *Spider; bool Spawned; bool PhaseTwo; @@ -112,6 +111,8 @@ struct boss_marliAI : public ScriptedAI if (!pTarget) return; + Creature *Spider = NULL; + Spider = m_creature->SummonCreature(15041,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Spider) Spider->AI()->AttackStart(pTarget); @@ -134,7 +135,7 @@ struct boss_marliAI : public ScriptedAI if (!pTarget) return; - Spider = m_creature->SummonCreature(15041,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); + Creature *Spider = m_creature->SummonCreature(15041,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Spider) Spider->AI()->AttackStart(pTarget); SpawnSpider_Timer = 12000 + rand()%5000; diff --git a/src/scripts/kalimdor/ruins_of_ahnqiraj/boss_ayamiss.cpp b/src/scripts/kalimdor/ruins_of_ahnqiraj/boss_ayamiss.cpp index f0ce0d41472..9dc3b4f0e0c 100644 --- a/src/scripts/kalimdor/ruins_of_ahnqiraj/boss_ayamiss.cpp +++ b/src/scripts/kalimdor/ruins_of_ahnqiraj/boss_ayamiss.cpp @@ -44,7 +44,6 @@ struct boss_ayamissAI : public ScriptedAI pInstance = c->GetInstanceData(); } - Unit *pTarget; uint32 STINGERSPRAY_Timer; uint32 POISONSTINGER_Timer; uint32 SUMMONSWARMER_Timer; @@ -54,7 +53,6 @@ struct boss_ayamissAI : public ScriptedAI void Reset() { - pTarget = NULL; STINGERSPRAY_Timer = 30000; POISONSTINGER_Timer = 30000; SUMMONSWARMER_Timer = 60000; @@ -66,8 +64,6 @@ struct boss_ayamissAI : public ScriptedAI void EnterCombat(Unit *who) { - pTarget = who; - if (pInstance) pInstance->SetData(DATA_AYAMISS_EVENT, IN_PROGRESS); } diff --git a/src/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp b/src/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp index 11980a94b68..c772cfd0a33 100644 --- a/src/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp +++ b/src/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp @@ -62,8 +62,6 @@ struct boss_skeramAI : public ScriptedAI uint32 Blink_Timer; uint32 Invisible_Timer; - Creature *Image1, *Image2; - bool Images75; bool Images50; bool Images25; @@ -260,7 +258,7 @@ struct boss_skeramAI : public ScriptedAI Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0); - Image1 = m_creature->SummonCreature(15263, i1->x, i1->y, i1->z, i1->r, TEMPSUMMON_CORPSE_DESPAWN, 30000); + Creature *Image1 = m_creature->SummonCreature(15263, i1->x, i1->y, i1->z, i1->r, TEMPSUMMON_CORPSE_DESPAWN, 30000); if (Image1) { Image1->SetMaxHealth(m_creature->GetMaxHealth() / 5); @@ -270,7 +268,7 @@ struct boss_skeramAI : public ScriptedAI CAST_AI(boss_skeramAI, Image1->AI())->IsImage = true; } - Image2 = m_creature->SummonCreature(15263,i2->x, i2->y, i2->z, i2->r, TEMPSUMMON_CORPSE_DESPAWN, 30000); + Creature *Image2 = m_creature->SummonCreature(15263,i2->x, i2->y, i2->z, i2->r, TEMPSUMMON_CORPSE_DESPAWN, 30000); if (Image2) { Image2->SetMaxHealth(m_creature->GetMaxHealth() / 5); diff --git a/src/scripts/kalimdor/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp b/src/scripts/kalimdor/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp index 7cdb76a82e1..24e9c68d435 100644 --- a/src/scripts/kalimdor/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp +++ b/src/scripts/kalimdor/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp @@ -80,24 +80,25 @@ struct aqsentinelAI : public ScriptedAI abselected = 0; // just initialization of variable } - Creature *nearby[3]; + uint64 NearbyGUID[3]; void ClearBuddyList() { - nearby[0] = nearby[1] = nearby[2] = NULL; + NearbyGUID[0] = NearbyGUID[1] = NearbyGUID[2] = 0; } - void AddBuddyToList(Creature *c) + void AddBuddyToList(uint64 CreatureGUID) { - if (c==m_creature) + if (CreatureGUID == m_creature->GetGUID()) return; + for (int i=0; i<3; ++i) { - if (nearby[i] == c) + if (NearbyGUID[i] == CreatureGUID) return; - if (!nearby[i]) + if (!NearbyGUID[i]) { - nearby[i] = c; + NearbyGUID[i] = CreatureGUID; return; } } @@ -107,23 +108,23 @@ struct aqsentinelAI : public ScriptedAI { aqsentinelAI *cai = CAST_AI(aqsentinelAI, (c)->AI()); for (int i=0; i<3; ++i) - if (nearby[i] && nearby[i]!=c) - cai->AddBuddyToList(nearby[i]); - cai->AddBuddyToList(m_creature); + if (NearbyGUID[i] && NearbyGUID[i] != c->GetGUID()) + cai->AddBuddyToList(NearbyGUID[i]); + cai->AddBuddyToList(m_creature->GetGUID()); } void SendMyListToBuddies() { for (int i=0; i<3; ++i) - if (nearby[i]) - GiveBuddyMyList(nearby[i]); + if (Creature *pNearby = Unit::GetCreature(*m_creature, NearbyGUID[i])) + GiveBuddyMyList(pNearby); } void CallBuddiesToAttack(Unit *who) { for (int i=0; i<3; ++i) { - Creature *c = nearby[i]; + Creature *c = Unit::GetCreature(*m_creature, NearbyGUID[i]); if (c) { if (!c->isInCombat()) @@ -145,7 +146,7 @@ struct aqsentinelAI : public ScriptedAI return; for (std::list<Creature*>::iterator iter = assistList.begin(); iter != assistList.end(); ++iter) - AddBuddyToList((*iter)); + AddBuddyToList((*iter)->GetGUID()); } int pickAbilityRandom(bool *chosenAbilities) @@ -175,11 +176,16 @@ struct aqsentinelAI : public ScriptedAI int bli; for (bli = 0; bli < 3; ++bli) { - if (!nearby[bli]) + if (!NearbyGUID[bli]) + break; + + Creature *pNearby = Unit::GetCreature(*m_creature, NearbyGUID[bli]); + if(!pNearby) break; - AddSentinelsNear(nearby[bli]); - CAST_AI(aqsentinelAI, nearby[bli]->AI())->gatherOthersWhenAggro = false; - CAST_AI(aqsentinelAI, nearby[bli]->AI())->selectAbility(pickAbilityRandom(chosenAbilities)); + + AddSentinelsNear(pNearby); + CAST_AI(aqsentinelAI, pNearby->AI())->gatherOthersWhenAggro = false; + CAST_AI(aqsentinelAI, pNearby->AI())->selectAbility(pickAbilityRandom(chosenAbilities)); } /*if (bli < 3) DoYell("I dont have enough buddies.", LANG_NEUTRAL, 0);*/ @@ -197,10 +203,13 @@ struct aqsentinelAI : public ScriptedAI { for (int i=0; i<3; ++i) { - if (!nearby[i]) + if (!NearbyGUID[i]) continue; - if (nearby[i]->isDead()) - nearby[i]->Respawn(); + if (Creature *pNearby = Unit::GetCreature(*m_creature, NearbyGUID[i])) + { + if (pNearby->isDead()) + pNearby->Respawn(); + } } } ClearBuddyList(); @@ -225,7 +234,7 @@ struct aqsentinelAI : public ScriptedAI { for (int ni=0; ni<3; ++ni) { - Creature *sent = nearby[ni]; + Creature *sent = Unit::GetCreature(*m_creature, NearbyGUID[ni]); if (!sent) continue; if (sent->isDead()) diff --git a/src/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_argent_challenge.cpp b/src/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_argent_challenge.cpp index 5d2f8323b45..2adf1cb53a7 100644 --- a/src/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_argent_challenge.cpp +++ b/src/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_argent_challenge.cpp @@ -162,7 +162,7 @@ struct boss_paletressAI : public ScriptedAI { pInstance = pCreature->GetInstanceData(); - pMemory = NULL; + MemoryGUID = 0; pCreature->SetReactState(REACT_PASSIVE); pCreature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE); pCreature->RestoreFaction(); @@ -171,6 +171,7 @@ struct boss_paletressAI : public ScriptedAI ScriptedInstance* pInstance; Creature* pMemory; + uint64 MemoryGUID; bool bHealth; bool bDone; @@ -193,8 +194,9 @@ struct boss_paletressAI : public ScriptedAI bHealth = false; bDone = false; - if (pMemory && pMemory->isAlive()) - pMemory->RemoveFromWorld(); + if (Creature *pMemory = Unit::GetCreature(*m_creature, MemoryGUID)) + if (pMemory->isAlive()) + pMemory->RemoveFromWorld(); } void SetData(uint32 uiId, uint32 uiValue) @@ -273,8 +275,9 @@ struct boss_paletressAI : public ScriptedAI DoCast(m_creature,DUNGEON_MODE(SPELL_RENEW,SPELL_RENEW_H)); break; case 1: - if (pMemory && pMemory->isAlive()) - DoCast(pMemory,DUNGEON_MODE(SPELL_RENEW,SPELL_RENEW_H)); + if (Creature *pMemory = Unit::GetCreature(*m_creature, MemoryGUID)) + if (pMemory->isAlive()) + DoCast(pMemory, DUNGEON_MODE(SPELL_RENEW,SPELL_RENEW_H)); break; } uiRenewTimer = urand(15000,17000); @@ -297,7 +300,7 @@ struct boss_paletressAI : public ScriptedAI void JustSummoned(Creature* pSummon) { - pMemory = pSummon; + MemoryGUID = pSummon->GetGUID(); } }; diff --git a/src/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_grand_champions.cpp b/src/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_grand_champions.cpp index fa0402e2d70..f337eac0c81 100644 --- a/src/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_grand_champions.cpp +++ b/src/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_grand_champions.cpp @@ -143,7 +143,7 @@ bool GrandChampionsOutVehicle(Creature* m_creature) struct generic_vehicleAI_toc5AI : public npc_escortAI { - generic_vehicleAI_toc5AI(Creature* pCreature) : npc_escortAI(pCreature), pVehicle(pCreature->GetVehicleKit()) + generic_vehicleAI_toc5AI(Creature* pCreature) : npc_escortAI(pCreature) { SetDespawnAtEnd(false); uiWaypointPath = 0; @@ -151,8 +151,6 @@ struct generic_vehicleAI_toc5AI : public npc_escortAI pInstance = pCreature->GetInstanceData(); } - Vehicle* pVehicle; - ScriptedInstance* pInstance; uint32 uiChargeTimer; @@ -261,11 +259,9 @@ struct generic_vehicleAI_toc5AI : public npc_escortAI //dosen't work at all if (uiShieldBreakerTimer <= uiDiff) { + Vehicle *pVehicle = m_creature->GetVehicleKit(); if (!pVehicle) - { - pVehicle = m_creature->GetVehicleKit(); return; - } if (Unit* pPassenger = pVehicle->GetPassenger(SEAT_ID_0)) { diff --git a/src/scripts/northrend/gundrak/boss_drakkari_colossus.cpp b/src/scripts/northrend/gundrak/boss_drakkari_colossus.cpp index 1f63bb3ef60..796c11ee898 100644 --- a/src/scripts/northrend/gundrak/boss_drakkari_colossus.cpp +++ b/src/scripts/northrend/gundrak/boss_drakkari_colossus.cpp @@ -141,15 +141,8 @@ struct boss_drakkari_elementalAI : public ScriptedAI boss_drakkari_elementalAI(Creature* pCreature) : ScriptedAI(pCreature) { pInstance = pCreature->GetInstanceData(); - if(pInstance) - { - if (pCreature->GetMap()->IsDungeon()) - pColossus = CAST_CRE(pCreature->GetUnit(*pCreature, pInstance->GetData64(DATA_DRAKKARI_COLOSSUS))); - } } - Creature* pColossus; - ScriptedInstance* pInstance; uint32 uiSurgeTimer; @@ -158,7 +151,7 @@ struct boss_drakkari_elementalAI : public ScriptedAI void Reset() { - if (pColossus) + if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0)) CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(m_creature, true); uiSurgeTimer = 7*IN_MILISECONDS; bGoToColossus = false; @@ -173,8 +166,11 @@ struct boss_drakkari_elementalAI : public ScriptedAI { if (uiType != POINT_MOTION_TYPE) return; - CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(pColossus, true); - CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->bHealth1 = false; + if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0)) + { + CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(pColossus, true); + CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->bHealth1 = false; + } m_creature->RemoveFromWorld(); } @@ -184,12 +180,17 @@ struct boss_drakkari_elementalAI : public ScriptedAI if(!UpdateVictim()) return; - if(!bGoToColossus && HealthBelowPct(50) && !CAST_AI(boss_drakkari_colossusAI,pColossus->AI())->HealthBelowPct(6)) + if(!bGoToColossus && HealthBelowPct(50)) { - m_creature->InterruptNonMeleeSpells(true); - if (pColossus) - DoCast(pColossus, SPELL_MERGE); - bGoToColossus = true; + if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0)) + { + if (!CAST_AI(boss_drakkari_colossusAI,pColossus->AI())->HealthBelowPct(6)) + { + m_creature->InterruptNonMeleeSpells(true); + DoCast(pColossus, SPELL_MERGE); + bGoToColossus = true; + } + } } if (uiSurgeTimer <= diff) @@ -203,9 +204,8 @@ struct boss_drakkari_elementalAI : public ScriptedAI void JustDied(Unit* killer) { - if (!pColossus) - return; - pColossus->Kill(pColossus); + if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0)) + pColossus->Kill(pColossus); } }; @@ -216,8 +216,6 @@ struct npc_living_mojoAI : public ScriptedAI pInstance = pCreature->GetInstanceData(); } - Creature* pColossus; - ScriptedInstance* pInstance; uint32 uiMojoWaveTimer; @@ -231,28 +229,32 @@ struct npc_living_mojoAI : public ScriptedAI void EnterCombat(Unit* who) { - if (pInstance) - pColossus = m_creature->GetCreature(*m_creature, pInstance->GetData64(DATA_DRAKKARI_COLOSSUS)); //Check if the npc is near of Drakkari Colossus. - if (pColossus && pColossus->isAlive() && m_creature->IsInRange3d(pColossus->GetHomePosition().GetPositionX(),pColossus->GetHomePosition().GetPositionY(),pColossus->GetHomePosition().GetPositionZ(),0.0f,17.0f)) - m_creature->SetReactState(REACT_PASSIVE); - else - m_creature->SetReactState(REACT_AGGRESSIVE); + if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0)) + { + if (pColossus->isAlive() && m_creature->IsInRange3d(pColossus->GetHomePosition().GetPositionX(),pColossus->GetHomePosition().GetPositionY(),pColossus->GetHomePosition().GetPositionZ(),0.0f,17.0f)) + m_creature->SetReactState(REACT_PASSIVE); + else + m_creature->SetReactState(REACT_AGGRESSIVE); + } } void DamageTaken(Unit* pDone_by, uint32& uiDamage) { if (m_creature->HasReactState(REACT_PASSIVE)) { - if (pColossus && pColossus->isAlive() && !pColossus->isInCombat()) + if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0)) { - pColossus->RemoveAura(SPELL_FREEZE_ANIM); - pColossus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - pColossus->SetReactState(REACT_AGGRESSIVE); - if (pDone_by && pDone_by->isAlive()) - pColossus->AI()->AttackStart(pDone_by); - EnterEvadeMode(); + if (pColossus->isAlive() && !pColossus->isInCombat()) + { + pColossus->RemoveAura(SPELL_FREEZE_ANIM); + pColossus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); + pColossus->SetReactState(REACT_AGGRESSIVE); + if (pDone_by && pDone_by->isAlive()) + pColossus->AI()->AttackStart(pDone_by); + EnterEvadeMode(); + } } } } diff --git a/src/scripts/northrend/naxxramas/boss_gothik.cpp b/src/scripts/northrend/naxxramas/boss_gothik.cpp index 67a1ea47b59..19a1a088e73 100644 --- a/src/scripts/northrend/naxxramas/boss_gothik.cpp +++ b/src/scripts/northrend/naxxramas/boss_gothik.cpp @@ -153,10 +153,14 @@ struct boss_gothikAI : public BossAI bool phaseTwo; bool thirtyPercentReached; + std::vector<uint64> LiveTriggerGUID; + std::vector<uint64> DeadTriggerGUID; + void Reset() { - liveTrigger.clear(); - deadTrigger.clear(); + LiveTriggerGUID.clear(); + DeadTriggerGUID.clear(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE); me->SetReactState(REACT_PASSIVE); if (instance) @@ -171,12 +175,12 @@ struct boss_gothikAI : public BossAI { for (uint32 i = 0; i < POS_LIVE; ++i) if (Creature *trigger = DoSummon(WORLD_TRIGGER, PosSummonLive[i])) - liveTrigger.push_back(trigger); + LiveTriggerGUID.push_back(trigger->GetGUID()); for (uint32 i = 0; i < POS_DEAD; ++i) if (Creature *trigger = DoSummon(WORLD_TRIGGER, PosSummonDead[i])) - deadTrigger.push_back(trigger); + DeadTriggerGUID.push_back(trigger->GetGUID()); - if (liveTrigger.size() < POS_LIVE || deadTrigger.size() < POS_DEAD) + if (LiveTriggerGUID.size() < POS_LIVE || DeadTriggerGUID.size() < POS_DEAD) { error_log("Script Gothik: cannot summon triggers!"); EnterEvadeMode(); @@ -223,8 +227,8 @@ struct boss_gothikAI : public BossAI void JustDied(Unit* Killer) { - liveTrigger.clear(); - deadTrigger.clear(); + LiveTriggerGUID.clear(); + DeadTriggerGUID.clear(); _JustDied(); DoScriptText(SAY_DEATH, me); if (instance) @@ -238,17 +242,29 @@ struct boss_gothikAI : public BossAI switch(entry) { case MOB_LIVE_TRAINEE: - DoSummon(MOB_LIVE_TRAINEE, liveTrigger[0], 1); - DoSummon(MOB_LIVE_TRAINEE, liveTrigger[1], 1); - DoSummon(MOB_LIVE_TRAINEE, liveTrigger[2], 1); + { + if (Creature *LiveTrigger0 = Unit::GetCreature(*m_creature, LiveTriggerGUID[0])) + DoSummon(MOB_LIVE_TRAINEE, LiveTrigger0, 1); + if (Creature *LiveTrigger1 = Unit::GetCreature(*m_creature, LiveTriggerGUID[1])) + DoSummon(MOB_LIVE_TRAINEE, LiveTrigger1, 1); + if (Creature *LiveTrigger2 = Unit::GetCreature(*m_creature, LiveTriggerGUID[2])) + DoSummon(MOB_LIVE_TRAINEE, LiveTrigger2, 1); break; + } case MOB_LIVE_KNIGHT: - DoSummon(MOB_LIVE_KNIGHT, liveTrigger[3], 1); - DoSummon(MOB_LIVE_KNIGHT, liveTrigger[5], 1); + { + if (Creature *LiveTrigger3 = Unit::GetCreature(*m_creature, LiveTriggerGUID[3])) + DoSummon(MOB_LIVE_KNIGHT, LiveTrigger3, 1); + if (Creature *LiveTrigger5 = Unit::GetCreature(*m_creature, LiveTriggerGUID[5])) + DoSummon(MOB_LIVE_KNIGHT, LiveTrigger5, 1); break; + } case MOB_LIVE_RIDER: - DoSummon(MOB_LIVE_RIDER, liveTrigger[4], 1); + { + if (Creature *LiveTrigger4 = Unit::GetCreature(*m_creature, LiveTriggerGUID[4])) + DoSummon(MOB_LIVE_RIDER, LiveTrigger4, 1); break; + } } } else @@ -256,15 +272,25 @@ struct boss_gothikAI : public BossAI switch(entry) { case MOB_LIVE_TRAINEE: - DoSummon(MOB_LIVE_TRAINEE, liveTrigger[0], 1); - DoSummon(MOB_LIVE_TRAINEE, liveTrigger[1], 1); + { + if (Creature *LiveTrigger0 = Unit::GetCreature(*m_creature, LiveTriggerGUID[4])) + DoSummon(MOB_LIVE_TRAINEE, LiveTrigger0, 1); + if (Creature *LiveTrigger1 = Unit::GetCreature(*m_creature, LiveTriggerGUID[4])) + DoSummon(MOB_LIVE_TRAINEE, LiveTrigger1, 1); break; + } case MOB_LIVE_KNIGHT: - DoSummon(MOB_LIVE_KNIGHT, liveTrigger[5], 1); + { + if (Creature *LiveTrigger5 = Unit::GetCreature(*m_creature, LiveTriggerGUID[4])) + DoSummon(MOB_LIVE_KNIGHT, LiveTrigger5, 1); break; + } case MOB_LIVE_RIDER: - DoSummon(MOB_LIVE_RIDER, liveTrigger[4], 1); + { + if (Creature *LiveTrigger4 = Unit::GetCreature(*m_creature, LiveTriggerGUID[4])) + DoSummon(MOB_LIVE_RIDER, LiveTrigger4, 1); break; + } } } } @@ -320,7 +346,8 @@ struct boss_gothikAI : public BossAI if (spellId && me->isInCombat()) { me->HandleEmoteCommand(EMOTE_ONESHOT_SPELLCAST); - me->CastSpell(deadTrigger[rand()%POS_DEAD], spellId, true); + if (Creature *pRandomDeadTrigger = Unit::GetCreature(*m_creature, DeadTriggerGUID[rand() % POS_DEAD])) + me->CastSpell(pRandomDeadTrigger, spellId, true); } } diff --git a/src/scripts/northrend/naxxramas/boss_kelthuzad.cpp b/src/scripts/northrend/naxxramas/boss_kelthuzad.cpp index ce275fe952e..7aad876e56c 100644 --- a/src/scripts/northrend/naxxramas/boss_kelthuzad.cpp +++ b/src/scripts/northrend/naxxramas/boss_kelthuzad.cpp @@ -267,14 +267,18 @@ struct boss_kelthuzadAI : public BossAI std::map<uint64, float> chained; - GameObject* pPortals[4]; - GameObject* pKTTrigger; + uint64 PortalsGUID[4]; + uint64 KTTriggerGUID; + SummonList spawns; // adds spawn by the trigger. kept in separated list (i.e. not in summons) void Reset() { _Reset(); + PortalsGUID[0] = PortalsGUID[1] = PortalsGUID[2] = PortalsGUID[3] = 0; + KTTriggerGUID = 0; + me->setFaction(35); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE); std::map<uint64, float>::iterator itr; @@ -289,7 +293,7 @@ struct boss_kelthuzadAI : public BossAI FindGameObjects(); - if (pKTTrigger) + if (GameObject *pKTTrigger = m_creature->GetMap()->GetGameObject(KTTriggerGUID)) { pKTTrigger->ResetDoorOrButton(); pKTTrigger->SetPhaseMask(1, true); @@ -297,10 +301,10 @@ struct boss_kelthuzadAI : public BossAI for (uint8 i = 0; i <= 3; ++i) { - if (pPortals[i]) + if (GameObject *pPortal = m_creature->GetMap()->GetGameObject(PortalsGUID[i])) { - if (!((pPortals[i]->getLootState() == GO_READY) || (pPortals[i]->getLootState() == GO_NOT_READY))) - pPortals[i]->ResetDoorOrButton(); + if (!((pPortal->getLootState() == GO_READY) || (pPortal->getLootState() == GO_NOT_READY))) + pPortal->ResetDoorOrButton(); } } @@ -339,8 +343,8 @@ struct boss_kelthuzadAI : public BossAI FindGameObjects(); for (uint8 i = 0; i <= 3; ++i) { - if (pPortals[i]) - pPortals[i]->ResetDoorOrButton(); + if (GameObject *pPortal = m_creature->GetMap()->GetGameObject(PortalsGUID[i])) + pPortal->ResetDoorOrButton(); } DoCast(me, SPELL_KELTHUZAD_CHANNEL, false); DoScriptText(SAY_SUMMON_MINIONS, me); @@ -357,11 +361,11 @@ struct boss_kelthuzadAI : public BossAI void FindGameObjects() { - pPortals[0] = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_PORTAL01)) : NULL; - pPortals[1] = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_PORTAL02)) : NULL; - pPortals[2] = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_PORTAL03)) : NULL; - pPortals[3] = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_PORTAL04)) : NULL; - pKTTrigger = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_TRIGGER)) : NULL; + PortalsGUID[0] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL01) : 0; + PortalsGUID[1] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL02) : 0; + PortalsGUID[2] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL03) : 0; + PortalsGUID[3] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL04) : 0; + KTTriggerGUID = instance ? instance->GetData64(DATA_KELTHUZAD_TRIGGER) : 0; } void UpdateAI(const uint32 diff) @@ -402,7 +406,7 @@ struct boss_kelthuzadAI : public BossAI events.PopEvent(); break; case EVENT_TRIGGER: - if (pKTTrigger) + if (GameObject *pKTTrigger = m_creature->GetMap()->GetGameObject(KTTriggerGUID)) pKTTrigger->SetPhaseMask(2, true); events.PopEvent(); break; @@ -444,8 +448,11 @@ struct boss_kelthuzadAI : public BossAI for (uint8 i = 0; i <= 3; ++i) { - if (pPortals[i] && (pPortals[i]->getLootState() == GO_READY)) - pPortals[i]->UseDoorOrButton(); + if (GameObject *pPortal = m_creature->GetMap()->GetGameObject(PortalsGUID[i])) + { + if (pPortal->getLootState() == GO_READY) + pPortal->UseDoorOrButton(); + } } } } diff --git a/src/scripts/northrend/naxxramas/instance_naxxramas.cpp b/src/scripts/northrend/naxxramas/instance_naxxramas.cpp index f9c28a479aa..0b21a12e05c 100644 --- a/src/scripts/northrend/naxxramas/instance_naxxramas.cpp +++ b/src/scripts/northrend/naxxramas/instance_naxxramas.cpp @@ -104,16 +104,16 @@ inline uint32 GetEruptionSection(float x, float y) struct instance_naxxramas : public InstanceData { instance_naxxramas(Map* pMap) : InstanceData(pMap) - , Sapphiron(NULL), pGothikGate(NULL), HorsemenChest(NULL) { SetBossNumber(MAX_BOSS_NUMBER); LoadDoorData(doorData); LoadMinionData(minionData); } - std::set<GameObject*> HeiganEruption[4]; - GameObject* pGothikGate, *HorsemenChest; - Creature* Sapphiron; + std::set<uint64> HeiganEruptionGUID[4]; + uint64 GothikGateGUID; + uint64 HorsemenChestGUID; + uint64 SapphironGUID; uint64 uiFaerlina; uint64 uiThane; uint64 uiLady; @@ -135,7 +135,7 @@ struct instance_naxxramas : public InstanceData { switch(pCreature->GetEntry()) { - case 15989: Sapphiron = add ? pCreature : NULL; return; + case 15989: SapphironGUID = add ? pCreature->GetGUID() : 0; return; case 15953: uiFaerlina = pCreature->GetGUID(); return; case 16064: uiThane = pCreature->GetGUID(); return; case 16065: uiLady = pCreature->GetGUID(); return; @@ -156,18 +156,24 @@ struct instance_naxxramas : public InstanceData { uint32 section = GetEruptionSection(pGo->GetPositionX(), pGo->GetPositionY()); if (add) - HeiganEruption[section].insert(pGo); + HeiganEruptionGUID[section].insert(pGo->GetGUID()); else - HeiganEruption[section].erase(pGo); + HeiganEruptionGUID[section].erase(pGo->GetGUID()); return; } switch(pGo->GetEntry()) { - case GO_BIRTH: if (!add && Sapphiron) Sapphiron->AI()->DoAction(DATA_SAPPHIRON_BIRTH); return; - case GO_GOTHIK_GATE: pGothikGate = add ? pGo : NULL; break; - case GO_HORSEMEN_CHEST: HorsemenChest = add ? pGo : NULL; break; - case GO_HORSEMEN_CHEST_HERO: HorsemenChest = add ? pGo : NULL; break; + case GO_BIRTH: + if (!add && SapphironGUID) + { + if (Creature *pSapphiron = instance->GetCreature(SapphironGUID)) + pSapphiron->AI()->DoAction(DATA_SAPPHIRON_BIRTH); + return; + } + case GO_GOTHIK_GATE: GothikGateGUID = add ? pGo->GetGUID() : 0; break; + case GO_HORSEMEN_CHEST: HorsemenChestGUID = add ? pGo->GetGUID() : 0; break; + case GO_HORSEMEN_CHEST_HERO: HorsemenChestGUID = add ? pGo->GetGUID() : 0; break; case GO_KELTHUZAD_PORTAL01: uiPortals[0] = pGo->GetGUID(); break; case GO_KELTHUZAD_PORTAL02: uiPortals[1] = pGo->GetGUID(); break; case GO_KELTHUZAD_PORTAL03: uiPortals[2] = pGo->GetGUID(); break; @@ -186,7 +192,7 @@ struct instance_naxxramas : public InstanceData HeiganErupt(value); break; case DATA_GOTHIK_GATE: - if (pGothikGate) + if (GameObject *pGothikGate = instance->GetGameObject(GothikGateGUID)) pGothikGate->SetGoState(GOState(value)); break; @@ -253,8 +259,11 @@ struct instance_naxxramas : public InstanceData if (!InstanceData::SetBossState(id, state)) return false; - if (id == BOSS_HORSEMEN && state == DONE && HorsemenChest) - HorsemenChest->SetRespawnTime(HorsemenChest->GetRespawnDelay()); + if (id == BOSS_HORSEMEN && state == DONE) + { + if (GameObject *pHorsemenChest = instance->GetGameObject(HorsemenChestGUID)) + pHorsemenChest->SetRespawnTime(pHorsemenChest->GetRespawnDelay()); + } return true; } @@ -266,10 +275,13 @@ struct instance_naxxramas : public InstanceData if (i == section) continue; - for (std::set<GameObject*>::iterator itr = HeiganEruption[i].begin(); itr != HeiganEruption[i].end(); ++itr) + for (std::set<uint64>::const_iterator itr = HeiganEruptionGUID[i].begin(); itr != HeiganEruptionGUID[i].end(); ++itr) { - (*itr)->SendCustomAnim(); - (*itr)->CastSpell(NULL, SPELL_ERUPTION); + if (GameObject *pHeiganEruption = instance->GetGameObject(*itr)) + { + pHeiganEruption->SendCustomAnim(); + pHeiganEruption->CastSpell(NULL, SPELL_ERUPTION); + } } } } diff --git a/src/scripts/northrend/ulduar/halls_of_stone/halls_of_stone.cpp b/src/scripts/northrend/ulduar/halls_of_stone/halls_of_stone.cpp index fa266db4db6..9a8b711363a 100644 --- a/src/scripts/northrend/ulduar/halls_of_stone/halls_of_stone.cpp +++ b/src/scripts/northrend/ulduar/halls_of_stone/halls_of_stone.cpp @@ -133,7 +133,7 @@ struct mob_tribuna_controllerAI : public ScriptedAI bool bMarnakActivated; bool bAbedneumActivated; - std::list<Creature*> lKaddrakGUIDList; + std::list<uint64> KaddrakGUIDList; void Reset() { @@ -153,7 +153,7 @@ struct mob_tribuna_controllerAI : public ScriptedAI pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_SKY_FLOOR),false); } - lKaddrakGUIDList.clear(); + KaddrakGUIDList.clear(); } void UpdateFacesList() @@ -189,10 +189,15 @@ struct mob_tribuna_controllerAI : public ScriptedAI if (uiKaddrakEncounterTimer <= diff) { if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - if (!lKaddrakGUIDList.empty()) - for (std::list<Creature*>::iterator itr = lKaddrakGUIDList.begin(); itr != lKaddrakGUIDList.end(); ++itr) - if ((*itr)->isAlive()) - (*itr)->CastSpell(pTarget, DUNGEON_MODE(SPELL_GLARE_OF_THE_TRIBUNAL, H_SPELL_GLARE_OF_THE_TRIBUNAL), true); + if (!KaddrakGUIDList.empty()) + for (std::list<uint64>::const_iterator itr = KaddrakGUIDList.begin(); itr != KaddrakGUIDList.end(); ++itr) + { + if (Creature *pKaddrak = Unit::GetCreature(*m_creature, *itr)) + { + if (pKaddrak->isAlive()) + pKaddrak->CastSpell(pTarget, DUNGEON_MODE(SPELL_GLARE_OF_THE_TRIBUNAL, H_SPELL_GLARE_OF_THE_TRIBUNAL), true); + } + } uiKaddrakEncounterTimer = 1500; } else uiKaddrakEncounterTimer -= diff; } diff --git a/src/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp b/src/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp index a718ecce044..1dfa43d171a 100644 --- a/src/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp +++ b/src/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp @@ -89,6 +89,7 @@ struct boss_svalaAI : public ScriptedAI IntroPhase Phase; TempSummon* pArthas; + uint64 ArthasGUID; ScriptedInstance* pInstance; @@ -97,7 +98,7 @@ struct boss_svalaAI : public ScriptedAI Phase = IDLE; uiIntroTimer = 1000; uiIntroPhase = 0; - pArthas = NULL; + ArthasGUID = 0; if (pInstance) pInstance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, NOT_STARTED); @@ -113,10 +114,11 @@ struct boss_svalaAI : public ScriptedAI Phase = INTRO; m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (pArthas = m_creature->SummonCreature(CREATURE_ARTHAS, 295.81, -366.16, 92.57, 1.58, TEMPSUMMON_MANUAL_DESPAWN)) + if (Creature *pArthas = m_creature->SummonCreature(CREATURE_ARTHAS, 295.81, -366.16, 92.57, 1.58, TEMPSUMMON_MANUAL_DESPAWN)) { pArthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); pArthas->SetFloatValue(OBJECT_FIELD_SCALE_X, 5); + ArthasGUID = pArthas->GetGUID(); } } } @@ -130,6 +132,7 @@ struct boss_svalaAI : public ScriptedAI if (uiIntroTimer <= diff) { + Creature *pArthas = Unit::GetCreature(*m_creature, ArthasGUID); if (!pArthas) return; @@ -171,8 +174,8 @@ struct boss_svalaAI : public ScriptedAI { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); m_creature->SetDisplayId(DATA_SVALA_DISPLAY_ID); - pArthas->UnSummon(); - pArthas = NULL; + ((TempSummon*)pArthas)->UnSummon(); // TODO: should need a ToTempSummon() + ArthasGUID = 0; Phase = FINISHED; } else diff --git a/src/scripts/northrend/vault_of_archavon/boss_emalon.cpp b/src/scripts/northrend/vault_of_archavon/boss_emalon.cpp index 82210352801..427d33a74c4 100644 --- a/src/scripts/northrend/vault_of_archavon/boss_emalon.cpp +++ b/src/scripts/northrend/vault_of_archavon/boss_emalon.cpp @@ -158,17 +158,12 @@ struct mob_tempest_minionAI : public ScriptedAI mob_tempest_minionAI(Creature *c) : ScriptedAI(c) { pInstance = c->GetInstanceData(); - uiEmalonGUID = pInstance ? pInstance->GetData64(DATA_EMALON) : 0; - pEmalon = Unit::GetCreature(*m_creature, uiEmalonGUID); } ScriptedInstance* pInstance; EventMap events; - uint64 uiEmalonGUID; - Creature* pEmalon; - uint32 uiOverchargedTimer; void Reset() @@ -180,10 +175,13 @@ struct mob_tempest_minionAI : public ScriptedAI void JustDied(Unit* Killer) { - if (pEmalon && pEmalon->isAlive()) + if(Creature *pEmalon = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EMALON) : 0)) { - pEmalon->SummonCreature(MOB_TEMPEST_MINION, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); - DoScriptText(EMOTE_MINION_RESPAWN, m_creature); + if (pEmalon->isAlive()) + { + pEmalon->SummonCreature(MOB_TEMPEST_MINION, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); + DoScriptText(EMOTE_MINION_RESPAWN, m_creature); + } } } @@ -192,8 +190,11 @@ struct mob_tempest_minionAI : public ScriptedAI DoZoneInCombat(); events.ScheduleEvent(EVENT_SHOCK, 20000); - if (pEmalon && !pEmalon->getVictim() && pEmalon->AI()) - pEmalon->AI()->AttackStart(who); + if(Creature *pEmalon = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EMALON) : 0)) + { + if (!pEmalon->getVictim() && pEmalon->AI()) + pEmalon->AI()->AttackStart(who); + } } void UpdateAI(const uint32 diff) diff --git a/src/scripts/northrend/violet_hold/boss_erekem.cpp b/src/scripts/northrend/violet_hold/boss_erekem.cpp index 8a27bc3b412..3b1454714cc 100644 --- a/src/scripts/northrend/violet_hold/boss_erekem.cpp +++ b/src/scripts/northrend/violet_hold/boss_erekem.cpp @@ -50,9 +50,6 @@ struct boss_erekemAI : public ScriptedAI uint32 uiLightningBoltTimer; uint32 uiEarthShieldTimer; - Creature* pGuard1; - Creature* pGuard2; - ScriptedInstance* pInstance; void Reset() @@ -70,13 +67,16 @@ struct boss_erekemAI : public ScriptedAI pInstance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); } - pGuard1 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_1)); - if (pGuard1 && !pGuard1->isAlive()) - pGuard1->Respawn(); - - pGuard2 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_2)); - if (pGuard2 && !pGuard2->isAlive()) - pGuard2->Respawn(); + if (Creature *pGuard1 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_1) : 0)) + { + if (!pGuard1->isAlive()) + pGuard1->Respawn(); + } + if (Creature *pGuard2 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_2) : 0)) + { + if (!pGuard2->isAlive()) + pGuard2->Respawn(); + } } void AttackStart(Unit* pWho) @@ -91,21 +91,17 @@ struct boss_erekemAI : public ScriptedAI pWho->SetInCombatWith(m_creature); DoStartMovement(pWho); - if (pInstance) + if (Creature *pGuard1 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_1) : 0)) { - if (pGuard1) - { - pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_NON_ATTACKABLE); - if (!pGuard1->getVictim() && pGuard1->AI()) - pGuard1->AI()->AttackStart(pWho); - } - - if (pGuard2) - { - pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_NON_ATTACKABLE); - if (!pGuard2->getVictim() && pGuard2->AI()) - pGuard2->AI()->AttackStart(pWho); - } + pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_NON_ATTACKABLE); + if (!pGuard1->getVictim() && pGuard1->AI()) + pGuard1->AI()->AttackStart(pWho); + } + if (Creature *pGuard2 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_2) : 0)) + { + pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_NON_ATTACKABLE); + if (!pGuard2->getVictim() && pGuard2->AI()) + pGuard2->AI()->AttackStart(pWho); } } } @@ -123,8 +119,6 @@ struct boss_erekemAI : public ScriptedAI EnterEvadeMode(); return; } - pGuard1 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_1)); - pGuard2 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_2)); if (pInstance->GetData(DATA_WAVE_COUNT) == 6) pInstance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); @@ -144,9 +138,13 @@ struct boss_erekemAI : public ScriptedAI //spam stormstrike in hc mode if spawns are dead if (IsHeroic()) { - if (pGuard1 && !pGuard1->isAlive() && pGuard2 && !pGuard2->isAlive()) + if (Creature *pGuard1 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_1) : 0)) { - DoCast(m_creature->getVictim(), SPELL_STORMSTRIKE); + if (Creature *pGuard2 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_2) : 0)) + { + if (!pGuard1->isAlive() && !pGuard2->isAlive()) + DoCast(m_creature->getVictim(), SPELL_STORMSTRIKE); + } } } @@ -158,10 +156,14 @@ struct boss_erekemAI : public ScriptedAI if (uiChainHealTimer <= diff) { - if (Creature *pTarget = GetChainHealTarget()) + if (uint64 TargetGUID = GetChainHealTargetGUID()) { - DoCast(pTarget, DUNGEON_MODE(SPELL_CHAIN_HEAL, H_SPELL_CHAIN_HEAL)); + if(Creature *pTarget = Unit::GetCreature(*m_creature, TargetGUID)) + DoCast(pTarget, DUNGEON_MODE(SPELL_CHAIN_HEAL, H_SPELL_CHAIN_HEAL)); + //If one of the adds is dead spawn heals faster + Creature *pGuard1 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_1) : 0); + Creature *pGuard2 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_2) : 0); uiChainHealTimer = ((pGuard1 && !pGuard1->isAlive()) || (pGuard2 && !pGuard2->isAlive()) ? 3000 : 8000) + rand()%3000; } } else uiChainHealTimer -= diff; @@ -214,15 +216,20 @@ struct boss_erekemAI : public ScriptedAI DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), m_creature); } - Creature* GetChainHealTarget() + uint64 GetChainHealTargetGUID() { if (HealthBelowPct(85)) - return m_creature; + return m_creature->GetGUID(); + + Creature *pGuard1 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_1) : 0); if (pGuard1 && pGuard1->isAlive() && (pGuard1->GetHealth()*100 <= pGuard1->GetMaxHealth() * 75)) - return pGuard1; + return pGuard1->GetGUID(); + + Creature *pGuard2 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_2) : 0); if (pGuard2 && pGuard2->isAlive() && (pGuard2->GetHealth()*100 <= pGuard2->GetMaxHealth() * 75)) - return pGuard2; - return NULL; + return pGuard2->GetGUID(); + + return 0; } }; diff --git a/src/scripts/northrend/violet_hold/violet_hold.cpp b/src/scripts/northrend/violet_hold/violet_hold.cpp index f55d8c76c11..50bc441f688 100644 --- a/src/scripts/northrend/violet_hold/violet_hold.cpp +++ b/src/scripts/northrend/violet_hold/violet_hold.cpp @@ -44,8 +44,6 @@ struct npc_sinclariAI : public ScriptedAI uint8 uiPhase; uint32 uiTimer; - std::list<Creature*> GuardList; - void Reset() { uiPhase = 0; @@ -54,9 +52,11 @@ struct npc_sinclariAI : public ScriptedAI m_creature->SetVisibility(VISIBILITY_ON); m_creature->SetReactState(REACT_AGGRESSIVE); + std::list<Creature*> GuardList; m_creature->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); if (!GuardList.empty()) - for (std::list<Creature*>::iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) + { + for (std::list<Creature*>::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) { if (Creature* pGuard = *itr) { @@ -66,6 +66,7 @@ struct npc_sinclariAI : public ScriptedAI pGuard->SetReactState(REACT_AGGRESSIVE); } } + } } void MovementInform(uint32 uiType, uint32 uiId) @@ -100,6 +101,8 @@ struct npc_sinclariAI : public ScriptedAI uiPhase = 2; break; case 2: + { + std::list<Creature*> GuardList; m_creature->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); if (!GuardList.empty()) for (std::list<Creature*>::iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) @@ -113,7 +116,10 @@ struct npc_sinclariAI : public ScriptedAI uiTimer = 6000; uiPhase = 3; break; + } case 3: + { + std::list<Creature*> GuardList; m_creature->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); if (!GuardList.empty()) for (std::list<Creature*>::iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) @@ -127,6 +133,7 @@ struct npc_sinclariAI : public ScriptedAI uiTimer = 2000; uiPhase = 4; break; + } case 4: m_creature->GetMotionMaster()->MovePoint(0, MovePosition); uiTimer = 0; diff --git a/src/scripts/outland/auchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp b/src/scripts/outland/auchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp index fe8e00cea87..29808075fce 100644 --- a/src/scripts/outland/auchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp +++ b/src/scripts/outland/auchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp @@ -49,7 +49,7 @@ struct boss_shirrak_the_dead_watcherAI : public ScriptedAI uint32 Carnivorousbite_Timer; uint32 FocusFire_Timer; - Unit *focusedTarget; + uint64 FocusedTargetGUID; void Reset() { @@ -57,7 +57,7 @@ struct boss_shirrak_the_dead_watcherAI : public ScriptedAI Attractmagic_Timer = 28000; Carnivorousbite_Timer = 10000; FocusFire_Timer = 17000; - focusedTarget = NULL; + FocusedTargetGUID = 0; } void EnterCombat(Unit *who) @@ -72,8 +72,8 @@ struct boss_shirrak_the_dead_watcherAI : public ScriptedAI summoned->SetLevel(m_creature->getLevel()); summoned->addUnitState(UNIT_STAT_ROOT); - if (focusedTarget) - summoned->AI()->AttackStart(focusedTarget); + if (Unit *pFocusedTarget = Unit::GetUnit(*m_creature, FocusedTargetGUID)) + summoned->AI()->AttackStart(pFocusedTarget); } } @@ -127,7 +127,7 @@ struct boss_shirrak_the_dead_watcherAI : public ScriptedAI Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,1); if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER && pTarget->isAlive()) { - focusedTarget = pTarget; + FocusedTargetGUID = pTarget->GetGUID(); m_creature->SummonCreature(ENTRY_FOCUS_FIRE,pTarget->GetPositionX(),pTarget->GetPositionY(),pTarget->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN,5500); // TODO: Find better way to handle emote diff --git a/src/scripts/outland/auchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp b/src/scripts/outland/auchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp index f8f015634b6..346970b86b6 100644 --- a/src/scripts/outland/auchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp +++ b/src/scripts/outland/auchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp @@ -66,13 +66,13 @@ struct mob_voidtravelerAI : public ScriptedAI { } - Unit *Vorpil; + uint64 VorpilGUID; uint32 move; bool sacrificed; void Reset() { - Vorpil = NULL; + VorpilGUID = 0; move = 0; sacrificed = false; } @@ -81,13 +81,20 @@ struct mob_voidtravelerAI : public ScriptedAI void UpdateAI(const uint32 diff) { - if (!Vorpil) + if (!VorpilGUID) { m_creature->Kill(m_creature); return; } if (move <= diff) { + Creature *Vorpil = Unit::GetCreature(*m_creature, VorpilGUID); + if(!Vorpil) + { + VorpilGUID = 0; + return; + } + if (sacrificed) { m_creature->AddAura(DUNGEON_MODE(SPELL_EMPOWERING_SHADOWS, H_SPELL_EMPOWERING_SHADOWS), Vorpil); @@ -197,7 +204,7 @@ struct boss_grandmaster_vorpilAI : public ScriptedAI void JustSummoned(Creature *summoned) { if (summoned && summoned->GetEntry() == MOB_VOID_TRAVELER) - CAST_AI(mob_voidtravelerAI, summoned->AI())->Vorpil = m_creature; + CAST_AI(mob_voidtravelerAI, summoned->AI())->VorpilGUID = m_creature->GetGUID(); } void KilledUnit(Unit *victim) diff --git a/src/scripts/outland/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp b/src/scripts/outland/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp index d16f9a9e57f..c3d50b78fda 100644 --- a/src/scripts/outland/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp +++ b/src/scripts/outland/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp @@ -574,7 +574,8 @@ struct mob_enchanted_elementalAI : public ScriptedAI uint32 move; uint32 phase; float x, y, z; - Creature *Vashj; + + uint64 VashjGUID; void Reset() { @@ -582,7 +583,8 @@ struct mob_enchanted_elementalAI : public ScriptedAI m_creature->SetSpeed(MOVE_RUN,0.6);//run move = 0; phase = 1; - Vashj = NULL; + + VashjGUID = 0; for (int i = 0; i<8; ++i)//search for nearest waypoint (up on stairs) { @@ -603,7 +605,7 @@ struct mob_enchanted_elementalAI : public ScriptedAI } } if (pInstance) - Vashj = Unit::GetCreature((*m_creature), pInstance->GetData64(DATA_LADYVASHJ)); + VashjGUID = pInstance->GetData64(DATA_LADYVASHJ); } void EnterCombat(Unit *who) { return; } @@ -615,10 +617,8 @@ struct mob_enchanted_elementalAI : public ScriptedAI if (!pInstance) return; - if (!Vashj) - { + if (!VashjGUID) return; - } if (move <= diff) { @@ -638,10 +638,13 @@ struct mob_enchanted_elementalAI : public ScriptedAI if (m_creature->IsWithinDist3d(MIDDLE_X, MIDDLE_Y, MIDDLE_Z, 3)) DoCast(m_creature, SPELL_SURGE); } - if (!Vashj->isInCombat() || CAST_AI(boss_lady_vashjAI, Vashj->AI())->Phase != 2 || Vashj->isDead()) + if (Creature *Vashj = Unit::GetCreature(*m_creature, VashjGUID)) { - //call Unsummon() - m_creature->Kill(m_creature); + if (!Vashj->isInCombat() || CAST_AI(boss_lady_vashjAI, Vashj->AI())->Phase != 2 || Vashj->isDead()) + { + //call Unsummon() + m_creature->Kill(m_creature); + } } move = 1000; } else move -= diff; diff --git a/src/scripts/outland/tempest_keep/arcatraz/instance_arcatraz.cpp b/src/scripts/outland/tempest_keep/arcatraz/instance_arcatraz.cpp index 039ee4a913d..0a903f6b84f 100644 --- a/src/scripts/outland/tempest_keep/arcatraz/instance_arcatraz.cpp +++ b/src/scripts/outland/tempest_keep/arcatraz/instance_arcatraz.cpp @@ -51,15 +51,14 @@ struct instance_arcatraz : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; - GameObject *Containment_Core_Security_Field_Alpha; - GameObject *Containment_Core_Security_Field_Beta; - GameObject *Pod_Alpha; - GameObject *Pod_Gamma; - GameObject *Pod_Beta; - GameObject *Pod_Delta; - GameObject *Pod_Omega; - GameObject *Wardens_Shield; - + uint64 Containment_Core_Security_Field_AlphaGUID; + uint64 Containment_Core_Security_Field_BetaGUID; + uint64 Pod_AlphaGUID; + uint64 Pod_GammaGUID; + uint64 Pod_BetaGUID; + uint64 Pod_DeltaGUID; + uint64 Pod_OmegaGUID; + uint64 Wardens_ShieldGUID; uint64 GoSphereGUID; uint64 MellicharGUID; @@ -67,15 +66,14 @@ struct instance_arcatraz : public ScriptedInstance { memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - Containment_Core_Security_Field_Alpha = NULL; - Containment_Core_Security_Field_Beta = NULL; - Pod_Alpha = NULL; - Pod_Beta = NULL; - Pod_Delta = NULL; - Pod_Gamma = NULL; - Pod_Omega = NULL; - Wardens_Shield = NULL; - + Containment_Core_Security_Field_AlphaGUID = 0; + Containment_Core_Security_Field_BetaGUID = 0; + Pod_AlphaGUID = 0; + Pod_GammaGUID = 0; + Pod_BetaGUID = 0; + Pod_DeltaGUID = 0; + Pod_OmegaGUID = 0; + Wardens_ShieldGUID = 0; GoSphereGUID = 0; MellicharGUID = 0; } @@ -92,15 +90,15 @@ struct instance_arcatraz : public ScriptedInstance { switch(pGo->GetEntry()) { - case CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: Containment_Core_Security_Field_Alpha = pGo; break; - case CONTAINMENT_CORE_SECURITY_FIELD_BETA: Containment_Core_Security_Field_Beta = pGo; break; - case SEAL_SPHERE: GoSphereGUID = pGo->GetGUID(); break; - case POD_ALPHA: Pod_Alpha = pGo; break; - case POD_BETA: Pod_Beta = pGo; break; - case POD_DELTA: Pod_Delta = pGo; break; - case POD_GAMMA: Pod_Gamma = pGo; break; - case POD_OMEGA: Pod_Omega = pGo; break; - //case WARDENS_SHIELD: Wardens_Shield = pGo; break; + case CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: Containment_Core_Security_Field_AlphaGUID = pGo->GetGUID(); break; + case CONTAINMENT_CORE_SECURITY_FIELD_BETA: Containment_Core_Security_Field_BetaGUID = pGo->GetGUID(); break; + case POD_ALPHA: Pod_AlphaGUID = pGo->GetGUID(); break; + case POD_GAMMA: Pod_GammaGUID = pGo->GetGUID(); break; + case POD_BETA: Pod_BetaGUID = pGo->GetGUID(); break; + case POD_DELTA: Pod_DeltaGUID = pGo->GetGUID(); break; + case POD_OMEGA: Pod_OmegaGUID = pGo->GetGUID(); break; + case SEAL_SPHERE: GoSphereGUID = pGo->GetGUID(); break; + //case WARDENS_SHIELD: Wardens_ShieldGUID = pGo->GetGUID(); break; } } @@ -120,15 +118,19 @@ struct instance_arcatraz : public ScriptedInstance case TYPE_DALLIAH: if (data == DONE) - if (Containment_Core_Security_Field_Beta) - Containment_Core_Security_Field_Beta->UseDoorOrButton(); + { + if (GameObject *pGo = instance->GetGameObject(Containment_Core_Security_Field_BetaGUID)) + pGo->UseDoorOrButton(); + } m_auiEncounter[1] = data; break; case TYPE_SOCCOTHRATES: if (data == DONE) - if (Containment_Core_Security_Field_Alpha) - Containment_Core_Security_Field_Alpha->UseDoorOrButton(); + { + if (GameObject *pGo = instance->GetGameObject(Containment_Core_Security_Field_AlphaGUID)) + pGo->UseDoorOrButton(); + } m_auiEncounter[2] = data; break; @@ -146,43 +148,53 @@ struct instance_arcatraz : public ScriptedInstance case TYPE_WARDEN_1: if (data == IN_PROGRESS) - if (Pod_Alpha) - Pod_Alpha->UseDoorOrButton(); + if (GameObject *pGo = instance->GetGameObject(Pod_AlphaGUID)) + pGo->UseDoorOrButton(); m_auiEncounter[4] = data; break; case TYPE_WARDEN_2: if (data == IN_PROGRESS) - if (Pod_Beta) - Pod_Beta->UseDoorOrButton(); + { + if (GameObject *pGo = instance->GetGameObject(Pod_BetaGUID)) + pGo->UseDoorOrButton(); + } m_auiEncounter[5] = data; break; case TYPE_WARDEN_3: if (data == IN_PROGRESS) - if (Pod_Delta) - Pod_Delta->UseDoorOrButton(); + { + if (GameObject *pGo = instance->GetGameObject(Pod_DeltaGUID)) + pGo->UseDoorOrButton(); + } m_auiEncounter[6] = data; break; case TYPE_WARDEN_4: if (data == IN_PROGRESS) - if (Pod_Gamma) - Pod_Gamma->UseDoorOrButton(); + { + if (GameObject *pGo = instance->GetGameObject(Pod_GammaGUID)) + pGo->UseDoorOrButton(); + } m_auiEncounter[7] = data; break; case TYPE_WARDEN_5: if (data == IN_PROGRESS) - if (Pod_Omega) - Pod_Omega->UseDoorOrButton(); + { + if (GameObject *pGo = instance->GetGameObject(Pod_OmegaGUID)) + pGo->UseDoorOrButton(); + } m_auiEncounter[8] = data; break; case TYPE_SHIELD_OPEN: if (data == IN_PROGRESS) - if (Wardens_Shield) - Wardens_Shield->UseDoorOrButton(); + { + if (GameObject *pGo = instance->GetGameObject(Wardens_ShieldGUID)) + pGo->UseDoorOrButton(); + } break; } } @@ -191,18 +203,12 @@ struct instance_arcatraz : public ScriptedInstance { switch(type) { - case TYPE_HARBINGERSKYRISS: - return m_auiEncounter[3]; - case TYPE_WARDEN_1: - return m_auiEncounter[4]; - case TYPE_WARDEN_2: - return m_auiEncounter[5]; - case TYPE_WARDEN_3: - return m_auiEncounter[6]; - case TYPE_WARDEN_4: - return m_auiEncounter[7]; - case TYPE_WARDEN_5: - return m_auiEncounter[8]; + case TYPE_HARBINGERSKYRISS: return m_auiEncounter[3]; + case TYPE_WARDEN_1: return m_auiEncounter[4]; + case TYPE_WARDEN_2: return m_auiEncounter[5]; + case TYPE_WARDEN_3: return m_auiEncounter[6]; + case TYPE_WARDEN_4: return m_auiEncounter[7]; + case TYPE_WARDEN_5: return m_auiEncounter[8]; } return 0; } @@ -211,10 +217,8 @@ struct instance_arcatraz : public ScriptedInstance { switch(data) { - case DATA_MELLICHAR: - return MellicharGUID; - case DATA_SPHERE_SHIELD: - return GoSphereGUID; + case DATA_MELLICHAR: return MellicharGUID; + case DATA_SPHERE_SHIELD: return GoSphereGUID; } return 0; } |