More work for /reload spells when multiple zones / players are on
This commit is contained in:
parent
764be385ad
commit
9250118b05
@ -1954,9 +1954,6 @@ void Commands::Process(int32 index, EQ2_16BitString* command_parms, Client* clie
|
|||||||
else {
|
else {
|
||||||
client->SimpleMessage(CHANNEL_COLOR_YELLOW, "Reloading Spells & NPC Spell Lists (Note: Must Reload Spawns/Repop to reset npc spells)...");
|
client->SimpleMessage(CHANNEL_COLOR_YELLOW, "Reloading Spells & NPC Spell Lists (Note: Must Reload Spawns/Repop to reset npc spells)...");
|
||||||
world.SetReloadingSubsystem("Spells");
|
world.SetReloadingSubsystem("Spells");
|
||||||
if (lua_interface)
|
|
||||||
lua_interface->DestroySpells();
|
|
||||||
|
|
||||||
zone_list.DeleteSpellProcess();
|
zone_list.DeleteSpellProcess();
|
||||||
master_spell_list.Reload();
|
master_spell_list.Reload();
|
||||||
zone_list.LoadSpellProcess();
|
zone_list.LoadSpellProcess();
|
||||||
|
@ -120,7 +120,8 @@ void Entity::DeleteSpellEffects(bool removeClient)
|
|||||||
if(deletedPtrs.find(GetInfoStruct()->maintained_effects[i].spell) == deletedPtrs.end())
|
if(deletedPtrs.find(GetInfoStruct()->maintained_effects[i].spell) == deletedPtrs.end())
|
||||||
{
|
{
|
||||||
deletedPtrs[GetInfoStruct()->maintained_effects[i].spell] = true;
|
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())
|
if (IsPlayer())
|
||||||
GetInfoStruct()->maintained_effects[i].icon = 0xFFFF;
|
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 &&
|
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) {
|
GetInfoStruct()->spell_effects[i].spell->spell->GetSpellData()->spell_book_type == SPELL_BOOK_TYPE_NOT_SHOWN) {
|
||||||
deletedPtrs[GetInfoStruct()->spell_effects[i].spell] = true;
|
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;
|
GetInfoStruct()->spell_effects[i].spell_id = 0xFFFFFFFF;
|
||||||
|
@ -150,34 +150,15 @@ void LuaInterface::DestroySpells() {
|
|||||||
for(inner_itr = spell_script_itr->second.begin(); inner_itr != spell_script_itr->second.end(); inner_itr++) {
|
for(inner_itr = spell_script_itr->second.begin(); inner_itr != spell_script_itr->second.end(); inner_itr++) {
|
||||||
LuaSpell* cur_spell = inner_itr->second;
|
LuaSpell* cur_spell = inner_itr->second;
|
||||||
MSpellDelete.lock();
|
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);
|
SetLuaUserDataStale(cur_spell);
|
||||||
RemoveCurrentSpell(inner_itr->first, inner_itr->second, false, true, false);
|
RemoveCurrentSpell(inner_itr->first, inner_itr->second, false, true, false);
|
||||||
lua_close(inner_itr->first);
|
lua_close(inner_itr->first);
|
||||||
safe_delete(cur_spell);
|
safe_delete(cur_spell);
|
||||||
MSpellDelete.unlock();
|
MSpellDelete.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
Mutex* mutex = GetSpellScriptMutex(spell_script_itr->first.c_str());
|
|
||||||
safe_delete(mutex);
|
|
||||||
}
|
}
|
||||||
current_spells.clear();
|
current_spells.clear();
|
||||||
|
|
||||||
spell_scripts_mutex.clear();
|
|
||||||
spell_scripts.clear();
|
spell_scripts.clear();
|
||||||
MSpellScripts.releasewritelock(__FUNCTION__, __LINE__);
|
MSpellScripts.releasewritelock(__FUNCTION__, __LINE__);
|
||||||
}
|
}
|
||||||
@ -919,19 +900,17 @@ void LuaInterface::RemoveSpell(LuaSpell* spell, bool call_remove_function, bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
spell->MSpellTargets.readlock(__FUNCTION__, __LINE__);
|
spell->MSpellTargets.readlock(__FUNCTION__, __LINE__);
|
||||||
if(spell->caster) {
|
for (int8 i = 0; i < spell->targets.size(); i++) {
|
||||||
for (int8 i = 0; i < spell->targets.size(); i++) {
|
if(!spell->zone)
|
||||||
if(!spell->caster->GetZone())
|
break;
|
||||||
continue;
|
|
||||||
|
Spawn* target = spell->zone->GetSpawnByID(spell->targets.at(i));
|
||||||
Spawn* target = spell->caster->GetZone()->GetSpawnByID(spell->targets.at(i));
|
if (!target || !target->IsEntity())
|
||||||
if (!target || !target->IsEntity())
|
continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
((Entity*)target)->RemoveProc(0, spell);
|
((Entity*)target)->RemoveProc(0, spell);
|
||||||
((Entity*)target)->RemoveSpellEffect(spell);
|
((Entity*)target)->RemoveSpellEffect(spell);
|
||||||
((Entity*)target)->RemoveSpellBonus(spell);
|
((Entity*)target)->RemoveSpellBonus(spell);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
multimap<int32,int8>::iterator entries;
|
multimap<int32,int8>::iterator entries;
|
||||||
|
@ -40,7 +40,7 @@ SpellProcess::SpellProcess(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
SpellProcess::~SpellProcess(){
|
SpellProcess::~SpellProcess(){
|
||||||
RemoveAllSpells();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpellProcess::RemoveCaster(Spawn* caster, bool lock_spell_process){
|
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__);
|
MRemoveTargetList.releasewritelock(__FUNCTION__, __LINE__);
|
||||||
|
|
||||||
for(int s=0;s<spawnsToRemove.size();s++) {
|
for(int s=0;s<spawnsToRemove.size();s++) {
|
||||||
Spawn* target = spawnsToRemove.at(s);
|
Spawn* target = spawnsToRemove.at(s);
|
||||||
if(target) {
|
if(target) {
|
||||||
@ -2895,14 +2900,7 @@ void SpellProcess::CheckRemoveTargetFromSpell(LuaSpell* spell, bool allow_delete
|
|||||||
lua_interface->RemoveSpell(spell, true, false, !target->Alive() ? "target_dead" : "target_removed", false, true, target);
|
lua_interface->RemoveSpell(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)
|
if (should_delete)
|
||||||
DeleteCasterSpell(spell, "purged");
|
DeleteCasterSpell(spell, "purged");
|
||||||
}
|
}
|
||||||
|
@ -215,9 +215,6 @@ ZoneServer::~ZoneServer() {
|
|||||||
Sleep(10);
|
Sleep(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(spellProcess)
|
|
||||||
spellProcess->RemoveAllSpells(true);
|
|
||||||
|
|
||||||
MChangedSpawns.lock();
|
MChangedSpawns.lock();
|
||||||
changed_spawns.clear();
|
changed_spawns.clear();
|
||||||
MChangedSpawns.unlock();
|
MChangedSpawns.unlock();
|
||||||
@ -233,6 +230,9 @@ ZoneServer::~ZoneServer() {
|
|||||||
|
|
||||||
DeleteGlobalSpawns();
|
DeleteGlobalSpawns();
|
||||||
|
|
||||||
|
if(spellProcess)
|
||||||
|
spellProcess->RemoveAllSpells();
|
||||||
|
|
||||||
DeleteFlightPaths();
|
DeleteFlightPaths();
|
||||||
|
|
||||||
MMasterSpawnLock.releasewritelock(__FUNCTION__, __LINE__);
|
MMasterSpawnLock.releasewritelock(__FUNCTION__, __LINE__);
|
||||||
@ -467,6 +467,9 @@ void ZoneServer::InitWeather()
|
|||||||
}
|
}
|
||||||
void ZoneServer::DeleteSpellProcess(){
|
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
|
//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__);
|
MMasterSpawnLock.writelock(__FUNCTION__, __LINE__);
|
||||||
MMasterZoneLock->lock();
|
MMasterZoneLock->lock();
|
||||||
reloading_spellprocess = true;
|
reloading_spellprocess = true;
|
||||||
@ -481,7 +484,7 @@ void ZoneServer::DeleteSpellProcess(){
|
|||||||
|
|
||||||
if(spawn->IsEntity()) {
|
if(spawn->IsEntity()) {
|
||||||
((Entity*)spawn)->RemoveSpellBonus(nullptr, true);
|
((Entity*)spawn)->RemoveSpellBonus(nullptr, true);
|
||||||
((Entity*)spawn)->DeleteSpellEffects(true);
|
((Entity*)spawn)->DeleteSpellEffects();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MSpawnList.releasereadlock(__FUNCTION__, __LINE__);
|
MSpawnList.releasereadlock(__FUNCTION__, __LINE__);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user