aboutsummaryrefslogtreecommitdiff
path: root/src/scripts/northrend/gundrak
diff options
context:
space:
mode:
authorAnubisss <none@none>2010-03-27 13:54:38 +0100
committerAnubisss <none@none>2010-03-27 13:54:38 +0100
commitbe739e99009c2796d0153e7b3dabcf819e915541 (patch)
tree22017cf657485b228e93b0dc496d25a5246bd83d /src/scripts/northrend/gundrak
parent099ef2a9b6e2e1c4986878c15ce5758edba5a71c (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/northrend/gundrak')
-rw-r--r--src/scripts/northrend/gundrak/boss_drakkari_colossus.cpp68
1 files changed, 35 insertions, 33 deletions
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();
+ }
}
}
}