Added a few checks to resolve dangling pointers involving Mercs. Similar to the AIYellForHelp crash fixed years ago by Rogean.

This commit is contained in:
SecretsOTheP 2013-03-23 10:04:49 -04:00
parent b0b342a020
commit fa18991917
3 changed files with 6 additions and 2 deletions

View File

@ -188,13 +188,14 @@ bool Client::Process() {
if(linkdead_timer.Check()){
Save();
LeaveGroup();
if (GetMerc())
{
GetMerc()->Save();
if(GetMerc()->GetGroup != NULL)
GetMerc()->RemoveMercFromGroup(GetMerc(), GetMerc()->GetGroup());
GetMerc()->Depop();
}
LeaveGroup();
Raid *myraid = entity_list.GetRaidByClient(this);
if (myraid)
{

View File

@ -2760,6 +2760,8 @@ void EntityList::RemoveEntity(uint16 id)
return;
else if(entity_list.RemoveTrap(id))
return;
else if(entity_list.RemoveMerc(id))
return;
#ifdef BOTS
// This block of code is necessary to clean up bot objects

View File

@ -4915,9 +4915,10 @@ void Merc::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_sk
if(entity_list.GetCorpseByID(GetID()))
entity_list.GetCorpseByID(GetID())->Depop();
entity_list.RemoveMerc(GetID());
if(Suspend())
{
//todo: perl event?
}
}