From 3fc68925718795854295ad8a0a53c2081f51775c Mon Sep 17 00:00:00 2001 From: EvilFactory Date: Sat, 23 Jul 2022 12:23:27 -0300 Subject: [PATCH] fix exceptions not being handled correctly inside Network.Receive and Timer.Wait --- .../SharedSource/LuaCs/LuaCsNetworking.cs | 24 ++++++++++++++++-- .../SharedSource/LuaCs/LuaCsTimer.cs | 25 +++++++++++-------- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsNetworking.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsNetworking.cs index e3af30648..b2978aa63 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsNetworking.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsNetworking.cs @@ -87,7 +87,17 @@ namespace Barotrauma if (header == ClientPacketHeader.LUA_NET_MESSAGE) { string netMessageName = netMessage.ReadString(); - if (LuaCsNetReceives.ContainsKey(netMessageName)) LuaCsNetReceives[netMessageName](netMessage, client); + if (LuaCsNetReceives.ContainsKey(netMessageName)) + { + try + { + LuaCsNetReceives[netMessageName](netMessage, client); + } + catch(Exception e) + { + GameMain.LuaCs.HandleException(e, $"Exception thrown inside NetMessageReceive({netMessageName})", LuaCsSetup.ExceptionType.CSharp); + } + } } else { @@ -102,7 +112,17 @@ namespace Barotrauma if (header == ServerPacketHeader.LUA_NET_MESSAGE) { string netMessageName = netMessage.ReadString(); - if (LuaCsNetReceives.ContainsKey(netMessageName)) LuaCsNetReceives[netMessageName](netMessage, client); + if (LuaCsNetReceives.ContainsKey(netMessageName)) + { + try + { + LuaCsNetReceives[netMessageName](netMessage, client); + } + catch (Exception e) + { + GameMain.LuaCs.HandleException(e, $"Exception thrown inside NetMessageReceive({netMessageName})", LuaCsSetup.ExceptionType.CSharp); + } + } } else { diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs index a3be89afd..4aeb8d772 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs @@ -15,21 +15,19 @@ namespace Barotrauma { if (timedAction1 == null || timedAction2 == null) return 0; - return -Math.Sign(timedAction2.executionTime - timedAction1.executionTime); + return -Math.Sign(timedAction2.ExecutionTime - timedAction1.ExecutionTime); } } private class TimedAction { - public LuaCsAction action + public LuaCsAction Action { get; private set; } - private int delayMs; - - public double executionTime + public double ExecutionTime { get; private set; @@ -37,9 +35,8 @@ namespace Barotrauma public TimedAction(LuaCsAction action, int delayMs) { - this.action = action; - this.delayMs = delayMs; - executionTime = Time + (delayMs / 1000f); + this.Action = action; + ExecutionTime = Time + (delayMs / 1000f); } } @@ -63,9 +60,17 @@ namespace Barotrauma for (int i = 0; i < timedActions.Count; i++) { TimedAction timedAction = timedActions[i]; - if (Time >= timedAction.executionTime) + if (Time >= timedAction.ExecutionTime) { - timedAction.action(); + try + { + timedAction.Action(); + } + catch (Exception e) + { + GameMain.LuaCs.HandleException(e, "", LuaCsSetup.ExceptionType.CSharp); + } + timedActionsToRemove.Add(timedAction); } else