calling lua function inside an async function causes lots of issues (probably caused by the fact that it runs on a separate thread?), solved by creating a queue of functions to be called on the main thread

This commit is contained in:
Evil Factory
2021-11-08 14:29:07 -03:00
parent 07b6bcc32b
commit 50427390f2
4 changed files with 34 additions and 7 deletions

View File

@@ -1017,6 +1017,7 @@ namespace Barotrauma
SoundManager?.Update();
GameMain.Lua.Update();
GameMain.Lua.hook.Call("think", new object[] { });
Timing.Accumulator -= Timing.Step;

View File

@@ -394,6 +394,7 @@ namespace Barotrauma
TaskPool.Update();
CoroutineManager.Update((float)Timing.Step, (float)Timing.Step);
GameMain.Lua.Update();
GameMain.Lua.hook.Call("think", new object[] { });
performanceMeasurement.Stop();
LuaSetup.LuaTimer.LastUpdateTime = performanceMeasurement.ElapsedMilliseconds;

View File

@@ -427,6 +427,11 @@ namespace Barotrauma
}
}
public void Wait(object function, int millisecondDelay)
{
Task.Delay(millisecondDelay).ContinueWith(t => env.hook.EnqueueFunction(function));
}
public static double GetTime()
{
return Timing.TotalTime;
@@ -661,16 +666,16 @@ namespace Barotrauma
{
var httpResponse = httpWebRequest.EndGetResponse(result);
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
env.CallFunction(callback, new object[] { streamReader.ReadToEnd() });
env.hook.EnqueueFunction(callback, streamReader.ReadToEnd() );
}catch(Exception e)
{
env.CallFunction(callback, new object[] { e.ToString() });
env.hook.EnqueueFunction(callback, e.ToString());
}
}), null);
}catch(Exception e)
{
env.CallFunction(callback, new object[] { e.ToString() });
env.hook.EnqueueFunction(callback, e.ToString());
}
}
@@ -686,16 +691,16 @@ namespace Barotrauma
{
var httpResponse = httpWebRequest.EndGetResponse(result);
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
env.CallFunction(callback, new object[] { streamReader.ReadToEnd() });
env.hook.EnqueueFunction(callback, streamReader.ReadToEnd());
}catch (Exception e)
{
env.CallFunction(callback, new object[] { e.ToString() });
env.hook.EnqueueFunction(callback, e.ToString());
}
}), null);
}), null);
}
catch(Exception e)
{
env.CallFunction(callback, new object[] { e.ToString() });
env.hook.EnqueueFunction(callback, e.ToString());
}
}
}
@@ -728,6 +733,8 @@ namespace Barotrauma
private static Dictionary<string, string> methodNameToHookName;
private Queue<Tuple<object, object[]>> queuedFunctionCalls = new Queue<Tuple<object, object[]>>();
public enum HookMethodType
{
Before, After
@@ -818,6 +825,11 @@ namespace Barotrauma
methodNameToHookName.Add(methodName, hookName);
}
public void EnqueueFunction(object function, params object[] args)
{
queuedFunctionCalls.AddItem(new Tuple<object, object[]>(function, args));
}
public void Add(string name, string hookName, object function)
{
if (name == null && hookName == null && function == null) return;
@@ -839,6 +851,14 @@ namespace Barotrauma
hookFunctions[name].Remove(hookName);
}
public void Update()
{
if (queuedFunctionCalls.TryDequeue(out Tuple<object, object[]> result))
{
env.CallFunction(result.Item1, result.Item2);
}
}
public object Call(string name, params object[] args)
{
if (env == null) return null;

View File

@@ -36,6 +36,11 @@ namespace Barotrauma
public LuaScriptLoader luaScriptLoader;
public void Update()
{
hook?.Update();
}
public void HandleLuaException(Exception ex, string extra = "")
{
if (!string.IsNullOrWhiteSpace(extra))