Core/GameObjects: Unlink loot from gameobject before deleting it

Port From (https://github.com/TrinityCore/TrinityCore/commit/dfd2e6d901d99d3aeaae4be96bbc33b39399db67)
This commit is contained in:
hondacrx
2023-01-04 16:43:56 -05:00
parent c686484ce5
commit f58cd32069
+12 -12
View File
@@ -514,10 +514,7 @@ namespace Game.Entities
// If there is no restock timer, or if the restock timer passed, the chest becomes ready to loot // If there is no restock timer, or if the restock timer passed, the chest becomes ready to loot
m_restockTime = 0; m_restockTime = 0;
m_lootState = LootState.Ready; m_lootState = LootState.Ready;
loot = null; ClearLoot();
m_personalLoot.Clear();
m_unique_users.Clear();
m_usetimes = 0;
UpdateDynamicFlagsForNearbyPlayers(); UpdateDynamicFlagsForNearbyPlayers();
break; break;
default: default:
@@ -745,10 +742,7 @@ namespace Game.Entities
{ {
m_restockTime = 0; m_restockTime = 0;
m_lootState = LootState.Ready; m_lootState = LootState.Ready;
loot = null; ClearLoot();
m_personalLoot.Clear();
m_unique_users.Clear();
m_usetimes = 0;
UpdateDynamicFlagsForNearbyPlayers(); UpdateDynamicFlagsForNearbyPlayers();
} }
break; break;
@@ -833,10 +827,7 @@ namespace Game.Entities
return; return;
} }
loot = null; ClearLoot();
m_personalLoot.Clear();
m_unique_users.Clear();
m_usetimes = 0;
// Do not delete chests or goobers that are not consumed on loot, while still allowing them to despawn when they expire if summoned // Do not delete chests or goobers that are not consumed on loot, while still allowing them to despawn when they expire if summoned
bool isSummonedAndExpired = (GetOwner() != null || GetSpellId() != 0) && m_respawnTime == 0; bool isSummonedAndExpired = (GetOwner() != null || GetSpellId() != 0) && m_respawnTime == 0;
@@ -2936,6 +2927,15 @@ namespace Game.Entities
} }
} }
void ClearLoot()
{
// Unlink loot objects from this GameObject before destroying to avoid accessing freed memory from Loot destructor
loot = null;
m_personalLoot.Clear();
m_unique_users.Clear();
m_usetimes = 0;
}
public bool IsFullyLooted() public bool IsFullyLooted()
{ {
if (loot != null && !loot.IsLooted()) if (loot != null && !loot.IsLooted())