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
This commit is contained in:
Anubisss
2010-03-27 13:54:38 +01:00
parent 099ef2a9b6
commit be739e9900
35 changed files with 517 additions and 444 deletions
@@ -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;
}