Avoid CheckWards->DeleteCasterSpell->RemoveWard(LuaSpell) deadlocking

This commit is contained in:
Emagi 2025-08-17 06:19:12 -04:00
parent 9274bc9ced
commit 879a00676c

View File

@ -2335,11 +2335,13 @@ void Entity::RemoveWard(LuaSpell* spell) {
}
int32 Entity::CheckWards(Entity* attacker, int32 damage, int8 damage_type) {
std::unique_lock lock(MWardList);
map<int32, WardInfo*>::iterator itr;
WardInfo* ward = 0;
LuaSpell* spell = 0;
vector<LuaSpell*> tmp_deletes;
{
std::unique_lock lock(MWardList);
while (m_wardList.size() > 0 && damage > 0) {
// Get the ward with the lowest base damage
for (itr = m_wardList.begin(); itr != m_wardList.end(); itr++) {
@ -2480,7 +2482,7 @@ int32 Entity::CheckWards(Entity* attacker, int32 damage, int8 damage_type) {
if(itr->second->DeleteWard) {
WardInfo* info = itr->second;
itr = m_wardList.erase(itr);
GetZone()->GetSpellProcess()->DeleteCasterSpell(info->Spell, "purged");
tmp_deletes.push_back(info->Spell);
safe_delete(info);
}
else {
@ -2488,7 +2490,11 @@ int32 Entity::CheckWards(Entity* attacker, int32 damage, int8 damage_type) {
itr++;
}
}
}
for (auto it = tmp_deletes.begin(); it != tmp_deletes.end(); ++it) {
GetZone()->GetSpellProcess()->DeleteCasterSpell(*it, "purged");
}
return damage;
}