From 7cfee859a1ff2675611f3abdd7e67cb27b855281 Mon Sep 17 00:00:00 2001 From: Evil Factory <36804725+evilfactory@users.noreply.github.com> Date: Thu, 3 Mar 2022 13:54:46 -0300 Subject: [PATCH] fix massive brain damage in Timer.Wait (why did i choose to use async) --- .../SharedSource/Lua/LuaClasses.cs | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaClasses.cs b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaClasses.cs index a5c20a3bd..1497bc0d6 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaClasses.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaClasses.cs @@ -534,7 +534,7 @@ namespace Barotrauma public void Wait(object function, int millisecondDelay) { - Task.Delay(millisecondDelay).ContinueWith(t => env.hook.EnqueueFunction(function)); + env.hook.EnqueueTimedFunction((float)Timing.TotalTime + (millisecondDelay / 1000f), function); } public static double GetTime() @@ -869,7 +869,7 @@ namespace Barotrauma private static Dictionary> _hookPrefixMethods; private static Dictionary> _hookPostfixMethods; - private Queue> queuedFunctionCalls = new Queue>(); + private Queue> queuedFunctionCalls = new Queue>(); public enum HookMethodType { @@ -1050,7 +1050,12 @@ namespace Barotrauma public void EnqueueFunction(object function, params object[] args) { - queuedFunctionCalls.Enqueue(new Tuple(function, args)); + queuedFunctionCalls.Enqueue(new Tuple(0, function, args)); + } + + public void EnqueueTimedFunction(float time, object function, params object[] args) + { + queuedFunctionCalls.Enqueue(new Tuple(time, function, args)); } public void Add(string name, string hookName, object function) @@ -1082,9 +1087,14 @@ namespace Barotrauma { try { - if (queuedFunctionCalls.TryDequeue(out Tuple result)) + if (queuedFunctionCalls.TryPeek(out Tuple result)) { - env.CallFunction(result.Item1, result.Item2); + if (Timing.TotalTime >= result.Item1) + { + env.CallFunction(result.Item2, result.Item3); + + queuedFunctionCalls.Dequeue(); + } } } catch (Exception ex)