diff options
| author | Anubisss <none@none> | 2010-03-27 13:54:38 +0100 |
|---|---|---|
| committer | Anubisss <none@none> | 2010-03-27 13:54:38 +0100 |
| commit | be739e99009c2796d0153e7b3dabcf819e915541 (patch) | |
| tree | 22017cf657485b228e93b0dc496d25a5246bd83d /src/scripts/eastern_kingdoms | |
| parent | 099ef2a9b6e2e1c4986878c15ce5758edba5a71c (diff) | |
Use GUIDs instead of "global" pointers in ~all boss/instance scripts.
GUIDs are most safer than pointers and in some cases can avoid segmentation faults.
== - ==
Let me show a simple example:
We have a pointer to a creature: Creature *pCreature;
and try to search a creature and store it in the pointer:
pCreature = SearchCreature(ID);
We can check simply if the creature found or not:
if(pCreature)
- if this give true: creature found and we have a memory address which points to the creature
- if this give false: creature not found and this is a NULL pointer
Suppose that we have a valid pointer, so creature found.
We wanna use that pointer somewhere, for example in script phase 3.
But we delete the creature(from world) in phase 1.
In phase 3:
if(pCreature)
pCreature->DoSomeShit();
The if condition gives true, but pCreature points to an _invalid_ address.
In that address maybe have "nothing" or another creature's object or a player or anything else, dont know that.
~~ - ~~
Let me show the correct way:
Creature's GUID: uint64 CreatureGUID;
search the creature and set the GUID:
Creature *pCreature = SearchCreature(ID);
CreatureGUID = pCreature ? pCreature->GetGUID() : 0; // if pCreature is NULL set the GUID to 0
So we have a GUID and not a pointer.
We can get the creature from that GUID:
Creature *pCreature = GetCreature(CreatureGUID);
and we can simply check it is valid or not(found or not):
if(pCreature)
So we deleted the creature in phase 1 and try to use it in phase 3:
Creature *pCreature = GetCreature(CreatureGUID);
And this gives NULL because GetCreature() can't find the creature which GUID is CreatureGUID.
if(pCreature) // pCreature is NULL
pCreature->DoSomeShit(); // DoSomeShit() not called
== - ==
Remove some not used variables.
Some clean.
TODO: Should search/fix these in zones scripts.
--HG--
branch : trunk
Diffstat (limited to 'src/scripts/eastern_kingdoms')
17 files changed, 169 insertions, 183 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; |
