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/northrend/gundrak | |
| 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/northrend/gundrak')
| -rw-r--r-- | src/scripts/northrend/gundrak/boss_drakkari_colossus.cpp | 68 |
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(); + } } } } |
