Protection around scenario with repop command overrunning the remove targets from spell and also when zone is not available for cast spell on a target or caster
This commit is contained in:
parent
39ac029ffc
commit
b6aac685a2
1 changed files with 11 additions and 5 deletions
|
@ -660,8 +660,6 @@ bool SpellProcess::CastInstant(Spell* spell, Entity* caster, Entity* target, boo
|
|||
if(!remove)
|
||||
return result;
|
||||
|
||||
printf("%s: RemoveSpell %s\n", caster->GetName(), lua_spell->spell->GetName());
|
||||
|
||||
lua_interface->RemoveSpell(lua_spell, true, SpellScriptTimersHasSpell(lua_spell));
|
||||
return true;
|
||||
}
|
||||
|
@ -1735,9 +1733,14 @@ bool SpellProcess::CastProcessedSpell(LuaSpell* spell, bool passive, bool in_her
|
|||
effect_message.replace(effect_message.find("%C"), 2, spell->caster->GetName());
|
||||
send_to_sender = false;
|
||||
}
|
||||
spell->caster->GetZone()->SimpleMessage(CHANNEL_SPELLS_OTHER, effect_message.c_str(), target, 50, send_to_sender);
|
||||
|
||||
if(spell->caster->GetZone()) {
|
||||
spell->caster->GetZone()->SimpleMessage(CHANNEL_SPELLS_OTHER, effect_message.c_str(), target, 50, send_to_sender);
|
||||
}
|
||||
}
|
||||
if(target->GetZone()) {
|
||||
target->GetZone()->CallSpawnScript(target, SPAWN_SCRIPT_CASTED_ON, spell->caster, spell->spell->GetName());
|
||||
}
|
||||
target->GetZone()->CallSpawnScript(target, SPAWN_SCRIPT_CASTED_ON, spell->caster, spell->spell->GetName());
|
||||
}
|
||||
}
|
||||
else{
|
||||
|
@ -2733,6 +2736,7 @@ void SpellProcess::CheckRemoveTargetFromSpell(LuaSpell* spell, bool allow_delete
|
|||
if (!spell)
|
||||
return;
|
||||
|
||||
MRemoveTargetList.writelock(__FUNCTION__, __LINE__);
|
||||
if (remove_target_list.size() > 0){
|
||||
map<LuaSpell*, vector<int32>*>::iterator remove_itr;
|
||||
vector<int32>::iterator remove_target_itr;
|
||||
|
@ -2742,7 +2746,6 @@ void SpellProcess::CheckRemoveTargetFromSpell(LuaSpell* spell, bool allow_delete
|
|||
Spawn* remove_spawn = 0;
|
||||
bool should_delete = false;
|
||||
|
||||
MRemoveTargetList.writelock(__FUNCTION__, __LINE__);
|
||||
for (remove_itr = remove_target_list.begin(); remove_itr != remove_target_list.end(); remove_itr++){
|
||||
if (remove_itr->first == spell){
|
||||
targets = &spell->targets;
|
||||
|
@ -2807,6 +2810,9 @@ void SpellProcess::CheckRemoveTargetFromSpell(LuaSpell* spell, bool allow_delete
|
|||
if (should_delete)
|
||||
DeleteCasterSpell(spell, "purged");
|
||||
}
|
||||
else {
|
||||
MRemoveTargetList.releasewritelock(__FUNCTION__, __LINE__);
|
||||
}
|
||||
}
|
||||
|
||||
bool SpellProcess::AddHO(Client* client, HeroicOP* ho) {
|
||||
|
|
Loading…
Reference in a new issue