diff --git a/zone/entity.cpp b/zone/entity.cpp index 2c8216101..8060312df 100644 --- a/zone/entity.cpp +++ b/zone/entity.cpp @@ -2476,7 +2476,7 @@ void EntityList::RemoveAllGroups() while (group_list.size()) { auto group = group_list.front(); group_list.pop_front(); - delete group; + safe_delete(group); } #if EQDEBUG >= 5 CheckGroupList (__FILE__, __LINE__); @@ -2488,7 +2488,7 @@ void EntityList::RemoveAllRaids() while (raid_list.size()) { auto raid = raid_list.front(); raid_list.pop_front(); - delete raid; + safe_delete(raid); } } @@ -2837,7 +2837,7 @@ bool EntityList::RemoveGroup(uint32 delete_id) } auto group = *it; group_list.erase(it); - delete group; + safe_delete(group); return true; } @@ -2849,7 +2849,7 @@ bool EntityList::RemoveRaid(uint32 delete_id) return false; auto raid = *it; raid_list.erase(it); - delete raid; + safe_delete(raid); return true; } diff --git a/zone/groups.cpp b/zone/groups.cpp index 5734d4672..60a58b99c 100644 --- a/zone/groups.cpp +++ b/zone/groups.cpp @@ -498,6 +498,9 @@ void Group::SendEndurancePacketFrom(Mob* member) //if the group was in the zone already bool Group::UpdatePlayer(Mob* update){ + if (!update) + return false; + bool updateSuccess = false; VerifyGroup(); @@ -1009,6 +1012,7 @@ void Group::DisbandGroup(bool joinraid) { Leader->UpdateLFP(); } + SetLeader(nullptr); safe_delete(outapp); } diff --git a/zone/raids.cpp b/zone/raids.cpp index 2dc892a9a..51c52d8d4 100644 --- a/zone/raids.cpp +++ b/zone/raids.cpp @@ -279,6 +279,8 @@ void Raid::SetRaidLeader(const char *wasLead, const char *name) Client *c = entity_list.GetClientByName(name); if(c) SetLeader(c); + else + SetLeader(nullptr); //sanity check, should never get hit but we want to prefer to NOT crash if we do VerifyRaid and leader never gets set there (raid without a leader?) LearnMembers(); VerifyRaid(); @@ -1549,6 +1551,11 @@ void Raid::VerifyRaid() SetLeader(members[x].member); strn0cpy(leadername, members[x].membername, 64); } + else + { + //should never happen, but maybe it is? + SetLeader(nullptr); + } } } } @@ -1558,6 +1565,11 @@ void Raid::MemberZoned(Client *c) if(!c) return; + if (leader == c) + { + leader = nullptr; + } + // Raid::GetGroup() goes over the members as well, this way we go over once uint32 gid = RAID_GROUPLESS; for(int x = 0; x < MAX_RAID_MEMBERS; x++) diff --git a/zone/zone.cpp b/zone/zone.cpp index 9997f9ac9..b4df46a3c 100755 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -857,12 +857,14 @@ void Zone::Shutdown(bool quiet) while (!zone->npctable.empty()) { itr = zone->npctable.begin(); delete itr->second; + itr->second = nullptr; zone->npctable.erase(itr); } while (!zone->merctable.empty()) { itr = zone->merctable.begin(); delete itr->second; + itr->second = nullptr; zone->merctable.erase(itr); } @@ -872,6 +874,7 @@ void Zone::Shutdown(bool quiet) while (!zone->ldon_trap_list.empty()) { itr4 = zone->ldon_trap_list.begin(); delete itr4->second; + itr4->second = nullptr; zone->ldon_trap_list.erase(itr4); } zone->ldon_trap_entry_list.clear(); @@ -1707,6 +1710,7 @@ bool Zone::Depop(bool StartSpawnTimer) { while(!npctable.empty()) { itr = npctable.begin(); delete itr->second; + itr->second = nullptr; npctable.erase(itr); } @@ -1723,6 +1727,7 @@ void Zone::ClearNPCTypeCache(int id) { auto iter = npctable.begin(); while (iter != npctable.end()) { delete iter->second; + iter->second = nullptr; ++iter; } npctable.clear(); @@ -1732,6 +1737,7 @@ void Zone::ClearNPCTypeCache(int id) { while (iter != npctable.end()) { if (iter->first == (uint32)id) { delete iter->second; + iter->second = nullptr; npctable.erase(iter); return; }