script protection on spells against reuse of the lua state between proc / other spell processes
This commit is contained in:
parent
dad7873dc5
commit
e9936f1c80
@ -1740,6 +1740,9 @@ bool Entity::CastProc(Proc* proc, int8 type, Spawn* target) {
|
|||||||
if(item_proc) {
|
if(item_proc) {
|
||||||
mutex = lua_interface->GetItemScriptMutex(proc->item->GetItemScript());
|
mutex = lua_interface->GetItemScriptMutex(proc->item->GetItemScript());
|
||||||
}
|
}
|
||||||
|
else if(proc->spell) {
|
||||||
|
proc->spell->MScriptMutex.writelock(__FUNCTION__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
if(mutex)
|
if(mutex)
|
||||||
mutex->readlock(__FUNCTION__, __LINE__);
|
mutex->readlock(__FUNCTION__, __LINE__);
|
||||||
@ -1804,6 +1807,9 @@ bool Entity::CastProc(Proc* proc, int8 type, Spawn* target) {
|
|||||||
mutex->releasereadlock(__FUNCTION__, __LINE__);
|
mutex->releasereadlock(__FUNCTION__, __LINE__);
|
||||||
if(item_proc)
|
if(item_proc)
|
||||||
lua_interface->UseItemScript(proc->item->GetItemScript(), state, false);
|
lua_interface->UseItemScript(proc->item->GetItemScript(), state, false);
|
||||||
|
else if(proc->spell) {
|
||||||
|
proc->spell->MScriptMutex.releasewritelock(__FUNCTION__, __LINE__);
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1815,6 +1821,9 @@ bool Entity::CastProc(Proc* proc, int8 type, Spawn* target) {
|
|||||||
mutex->releasereadlock(__FUNCTION__);
|
mutex->releasereadlock(__FUNCTION__);
|
||||||
if(item_proc)
|
if(item_proc)
|
||||||
lua_interface->UseItemScript(proc->item->GetItemScript(), state, false);
|
lua_interface->UseItemScript(proc->item->GetItemScript(), state, false);
|
||||||
|
else if(proc->spell) {
|
||||||
|
proc->spell->MScriptMutex.releasewritelock(__FUNCTION__, __LINE__);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,6 +100,7 @@ struct LuaSpell{
|
|||||||
bool had_triggers;
|
bool had_triggers;
|
||||||
bool had_dmg_remaining;
|
bool had_dmg_remaining;
|
||||||
Mutex MSpellTargets;
|
Mutex MSpellTargets;
|
||||||
|
Mutex MScriptMutex;
|
||||||
int32 effect_bitmask;
|
int32 effect_bitmask;
|
||||||
bool restored; // restored spell cross zone
|
bool restored; // restored spell cross zone
|
||||||
std::atomic<bool> has_proc;
|
std::atomic<bool> has_proc;
|
||||||
|
@ -551,6 +551,8 @@ bool SpellProcess::DeleteCasterSpell(LuaSpell* spell, string reason, bool removi
|
|||||||
|
|
||||||
bool SpellProcess::ProcessSpell(LuaSpell* spell, bool first_cast, const char* function, SpellScriptTimer* timer, bool all_targets) {
|
bool SpellProcess::ProcessSpell(LuaSpell* spell, bool first_cast, const char* function, SpellScriptTimer* timer, bool all_targets) {
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
|
spell->MScriptMutex.writelock(__FUNCTION__, __LINE__);
|
||||||
if(!spell->state)
|
if(!spell->state)
|
||||||
{
|
{
|
||||||
LogWrite(SPELL__ERROR, 0, "Spell", "Error: State is NULL! SpellProcess::ProcessSpell for Spell '%s'", (spell->spell != nullptr) ? spell->spell->GetName() : "Unknown");
|
LogWrite(SPELL__ERROR, 0, "Spell", "Error: State is NULL! SpellProcess::ProcessSpell for Spell '%s'", (spell->spell != nullptr) ? spell->spell->GetName() : "Unknown");
|
||||||
@ -574,6 +576,7 @@ bool SpellProcess::ProcessSpell(LuaSpell* spell, bool first_cast, const char* fu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
spell->MScriptMutex.releasewritelock(__FUNCTION__, __LINE__);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
std::string functionCall = ApplyLuaFunction(spell, first_cast, function, timer);
|
std::string functionCall = ApplyLuaFunction(spell, first_cast, function, timer);
|
||||||
@ -584,6 +587,7 @@ bool SpellProcess::ProcessSpell(LuaSpell* spell, bool first_cast, const char* fu
|
|||||||
else
|
else
|
||||||
ret = lua_interface->CallSpellProcess(spell, 2 + spell->spell->GetLUAData()->size(), functionCall);
|
ret = lua_interface->CallSpellProcess(spell, 2 + spell->spell->GetLUAData()->size(), functionCall);
|
||||||
}
|
}
|
||||||
|
spell->MScriptMutex.releasewritelock(__FUNCTION__, __LINE__);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user