From 469487b35d54d1260bef29d94eaa3aa9954aa806 Mon Sep 17 00:00:00 2001 From: Emagi Date: Sun, 9 Feb 2025 18:53:39 -0500 Subject: [PATCH] avoid changing the maintained or spell effects on the entity without being in write locks --- source/WorldServer/Entity.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/source/WorldServer/Entity.cpp b/source/WorldServer/Entity.cpp index 08b47fb..417899b 100644 --- a/source/WorldServer/Entity.cpp +++ b/source/WorldServer/Entity.cpp @@ -113,6 +113,8 @@ void Entity::DeleteSpellEffects(bool removeClient) { map deletedPtrs; + MMaintainedSpells.writelock(__FUNCTION__, __LINE__); + MSpellEffects.writelock(__FUNCTION__, __LINE__); for(int i=0;i<45;i++){ if(i<30){ if(GetInfoStruct()->maintained_effects[i].spell_id != 0xFFFFFFFF) @@ -120,12 +122,10 @@ void Entity::DeleteSpellEffects(bool removeClient) if(deletedPtrs.find(GetInfoStruct()->maintained_effects[i].spell) == deletedPtrs.end()) { deletedPtrs[GetInfoStruct()->maintained_effects[i].spell] = true; - - lua_interface->RemoveSpell(GetInfoStruct()->maintained_effects[i].spell, false, removeClient, "", removeClient); - if (IsPlayer()) - GetInfoStruct()->maintained_effects[i].icon = 0xFFFF; } + if (IsPlayer()) + GetInfoStruct()->maintained_effects[i].icon = 0xFFFF; GetInfoStruct()->maintained_effects[i].spell_id = 0xFFFFFFFF; GetInfoStruct()->maintained_effects[i].spell = nullptr; } @@ -136,14 +136,19 @@ void Entity::DeleteSpellEffects(bool removeClient) if(GetInfoStruct()->spell_effects[i].spell && GetInfoStruct()->spell_effects[i].spell->spell && GetInfoStruct()->spell_effects[i].spell->spell->GetSpellData()->spell_book_type == SPELL_BOOK_TYPE_NOT_SHOWN) { deletedPtrs[GetInfoStruct()->spell_effects[i].spell] = true; - - lua_interface->RemoveSpell(GetInfoStruct()->spell_effects[i].spell, false, removeClient, "", removeClient); } } GetInfoStruct()->spell_effects[i].spell_id = 0xFFFFFFFF; GetInfoStruct()->spell_effects[i].spell = nullptr; } } + MMaintainedSpells.releasewritelock(__FUNCTION__, __LINE__); + MSpellEffects.releasewritelock(__FUNCTION__, __LINE__); + + map::iterator deletedPtrItrs; + for(deletedPtrItrs = deletedPtrs.begin(); deletedPtrItrs != deletedPtrs.end(); deletedPtrItrs++) { + lua_interface->RemoveSpell(deletedPtrItrs->first, false, removeClient, "", removeClient); + } } void Entity::RemoveSpells(bool unfriendlyOnly)