From 9250118b05f602959f4433576546456babf18f37 Mon Sep 17 00:00:00 2001 From: Emagi Date: Sun, 9 Feb 2025 15:25:16 -0500 Subject: [PATCH] More work for /reload spells when multiple zones / players are on --- source/WorldServer/Commands/Commands.cpp | 3 -- source/WorldServer/Entity.cpp | 6 ++-- source/WorldServer/LuaInterface.cpp | 41 ++++++------------------ source/WorldServer/SpellProcess.cpp | 16 ++++----- source/WorldServer/zoneserver.cpp | 11 ++++--- 5 files changed, 28 insertions(+), 49 deletions(-) diff --git a/source/WorldServer/Commands/Commands.cpp b/source/WorldServer/Commands/Commands.cpp index 6c0c08e..b01890c 100644 --- a/source/WorldServer/Commands/Commands.cpp +++ b/source/WorldServer/Commands/Commands.cpp @@ -1954,9 +1954,6 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie else { client->SimpleMessage(CHANNEL_COLOR_YELLOW, "Reloading Spells & NPC Spell Lists (Note: Must Reload Spawns/Repop to reset npc spells)..."); world.SetReloadingSubsystem("Spells"); - if (lua_interface) - lua_interface->DestroySpells(); - zone_list.DeleteSpellProcess(); master_spell_list.Reload(); zone_list.LoadSpellProcess(); diff --git a/source/WorldServer/Entity.cpp b/source/WorldServer/Entity.cpp index b679bcd..5671d3e 100644 --- a/source/WorldServer/Entity.cpp +++ b/source/WorldServer/Entity.cpp @@ -120,7 +120,8 @@ 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(removeClient) + lua_interface->RemoveSpell(GetInfoStruct()->maintained_effects[i].spell, false, removeClient, "", removeClient); if (IsPlayer()) GetInfoStruct()->maintained_effects[i].icon = 0xFFFF; } @@ -135,7 +136,8 @@ 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); + if(removeClient) + lua_interface->RemoveSpell(GetInfoStruct()->spell_effects[i].spell, false, removeClient, "", removeClient); } } GetInfoStruct()->spell_effects[i].spell_id = 0xFFFFFFFF; diff --git a/source/WorldServer/LuaInterface.cpp b/source/WorldServer/LuaInterface.cpp index 44d2ffa..f9e781c 100644 --- a/source/WorldServer/LuaInterface.cpp +++ b/source/WorldServer/LuaInterface.cpp @@ -150,34 +150,15 @@ void LuaInterface::DestroySpells() { for(inner_itr = spell_script_itr->second.begin(); inner_itr != spell_script_itr->second.end(); inner_itr++) { LuaSpell* cur_spell = inner_itr->second; MSpellDelete.lock(); - - ZoneServer* zone = nullptr; - if(cur_spell && cur_spell->zone) { - zone = cur_spell->zone; - cur_spell->MSpellTargets.readlock(__FUNCTION__, __LINE__); - for (int8 i = 0; i < cur_spell->targets.size(); i++) { - Spawn* target = cur_spell->zone->GetSpawnByID(cur_spell->targets.at(i)); - if (!target || !target->IsEntity()) - continue; - - cur_spell->zone->RemoveTargetFromSpell(cur_spell, target); - } - cur_spell->MSpellTargets.releasereadlock(__FUNCTION__, __LINE__); - zone->GetSpellProcess()->CheckRemoveTargetFromSpell(cur_spell, false, true); - } SetLuaUserDataStale(cur_spell); RemoveCurrentSpell(inner_itr->first, inner_itr->second, false, true, false); lua_close(inner_itr->first); safe_delete(cur_spell); MSpellDelete.unlock(); } - - Mutex* mutex = GetSpellScriptMutex(spell_script_itr->first.c_str()); - safe_delete(mutex); } current_spells.clear(); - spell_scripts_mutex.clear(); spell_scripts.clear(); MSpellScripts.releasewritelock(__FUNCTION__, __LINE__); } @@ -919,19 +900,17 @@ void LuaInterface::RemoveSpell(LuaSpell* spell, bool call_remove_function, bool } spell->MSpellTargets.readlock(__FUNCTION__, __LINE__); - if(spell->caster) { - for (int8 i = 0; i < spell->targets.size(); i++) { - if(!spell->caster->GetZone()) - continue; - - Spawn* target = spell->caster->GetZone()->GetSpawnByID(spell->targets.at(i)); - if (!target || !target->IsEntity()) - continue; + for (int8 i = 0; i < spell->targets.size(); i++) { + if(!spell->zone) + break; + + Spawn* target = spell->zone->GetSpawnByID(spell->targets.at(i)); + if (!target || !target->IsEntity()) + continue; - ((Entity*)target)->RemoveProc(0, spell); - ((Entity*)target)->RemoveSpellEffect(spell); - ((Entity*)target)->RemoveSpellBonus(spell); - } + ((Entity*)target)->RemoveProc(0, spell); + ((Entity*)target)->RemoveSpellEffect(spell); + ((Entity*)target)->RemoveSpellBonus(spell); } multimap::iterator entries; diff --git a/source/WorldServer/SpellProcess.cpp b/source/WorldServer/SpellProcess.cpp index b3c3c7c..4b38e19 100644 --- a/source/WorldServer/SpellProcess.cpp +++ b/source/WorldServer/SpellProcess.cpp @@ -40,7 +40,7 @@ SpellProcess::SpellProcess(){ } SpellProcess::~SpellProcess(){ - RemoveAllSpells(); + } void SpellProcess::RemoveCaster(Spawn* caster, bool lock_spell_process){ @@ -2881,7 +2881,12 @@ void SpellProcess::CheckRemoveTargetFromSpell(LuaSpell* spell, bool allow_delete } } + remove_target_list.erase(spell); + if (remove_targets) + remove_targets->clear(); + safe_delete(remove_targets); MRemoveTargetList.releasewritelock(__FUNCTION__, __LINE__); + for(int s=0;sRemoveSpell(spell, true, false, !target->Alive() ? "target_dead" : "target_removed", false, true, target); } } - - MRemoveTargetList.writelock(__FUNCTION__, __LINE__); - - remove_target_list.erase(spell); - if (remove_targets) - remove_targets->clear(); - safe_delete(remove_targets); - MRemoveTargetList.releasewritelock(__FUNCTION__, __LINE__); + if (should_delete) DeleteCasterSpell(spell, "purged"); } diff --git a/source/WorldServer/zoneserver.cpp b/source/WorldServer/zoneserver.cpp index 49757d9..5b965d2 100644 --- a/source/WorldServer/zoneserver.cpp +++ b/source/WorldServer/zoneserver.cpp @@ -215,9 +215,6 @@ ZoneServer::~ZoneServer() { Sleep(10); } - if(spellProcess) - spellProcess->RemoveAllSpells(true); - MChangedSpawns.lock(); changed_spawns.clear(); MChangedSpawns.unlock(); @@ -233,6 +230,9 @@ ZoneServer::~ZoneServer() { DeleteGlobalSpawns(); + if(spellProcess) + spellProcess->RemoveAllSpells(); + DeleteFlightPaths(); MMasterSpawnLock.releasewritelock(__FUNCTION__, __LINE__); @@ -467,6 +467,9 @@ void ZoneServer::InitWeather() } void ZoneServer::DeleteSpellProcess(){ //Just get a lock to make sure we aren't already looping the spawnprocess or clientprocess if this is different than the calling thread + if (lua_interface) + lua_interface->DestroySpells(); + MMasterSpawnLock.writelock(__FUNCTION__, __LINE__); MMasterZoneLock->lock(); reloading_spellprocess = true; @@ -481,7 +484,7 @@ void ZoneServer::DeleteSpellProcess(){ if(spawn->IsEntity()) { ((Entity*)spawn)->RemoveSpellBonus(nullptr, true); - ((Entity*)spawn)->DeleteSpellEffects(true); + ((Entity*)spawn)->DeleteSpellEffects(); } } MSpawnList.releasereadlock(__FUNCTION__, __LINE__);