Avoid CheckWards->DeleteCasterSpell->RemoveWard(LuaSpell) deadlocking
This commit is contained in:
parent
9274bc9ced
commit
879a00676c
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user