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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user