From a8fdc0f9c5276b17dc392dde4e53b3fb94ab55e2 Mon Sep 17 00:00:00 2001 From: Evil Factory <36804725+evilfactory@users.noreply.github.com> Date: Thu, 3 Mar 2022 19:34:52 -0300 Subject: [PATCH] Improve Lua Networking --- .../ClientSource/Networking/GameClient.cs | 5 +- .../ServerSource/Networking/GameServer.cs | 6 +- .../SharedSource/Lua/LuaClasses.cs | 46 ++++++++++---- .../SharedSource/Lua/LuaCustomConverters.cs | 9 ++- .../SharedSource/Lua/LuaProxy.cs | 60 +++++++++++++++++++ .../SharedSource/Lua/LuaSetup.cs | 16 +---- 6 files changed, 104 insertions(+), 38 deletions(-) create mode 100644 Barotrauma/BarotraumaShared/SharedSource/Lua/LuaProxy.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/Networking/GameClient.cs b/Barotrauma/BarotraumaClient/ClientSource/Networking/GameClient.cs index 49343fe9b..be2c65bfb 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Networking/GameClient.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Networking/GameClient.cs @@ -736,6 +736,8 @@ namespace Barotrauma.Networking MultiPlayerCampaign campaign = GameMain.NetLobbyScreen.SelectedMode == GameMain.GameSession?.GameMode.Preset ? GameMain.GameSession?.GameMode as MultiPlayerCampaign : null; + GameMain.Lua.networking.NetMessageReceived(inc, header); + switch (header) { case ServerPacketHeader.PING_REQUEST: @@ -972,9 +974,6 @@ namespace Barotrauma.Networking case ServerPacketHeader.EVENTACTION: GameMain.GameSession?.EventManager.ClientRead(inc); break; - case ServerPacketHeader.LUA_NET_MESSAGE: - GameMain.Lua.networking.NetMessageReceived(inc); - break; } } diff --git a/Barotrauma/BarotraumaServer/ServerSource/Networking/GameServer.cs b/Barotrauma/BarotraumaServer/ServerSource/Networking/GameServer.cs index 815393bec..03663138c 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/Networking/GameServer.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/Networking/GameServer.cs @@ -710,6 +710,9 @@ namespace Barotrauma.Networking var connectedClient = connectedClients.Find(c => c.Connection == sender); ClientPacketHeader header = (ClientPacketHeader)inc.ReadByte(); + + GameMain.Lua.networking.NetMessageReceived(inc, header, connectedClient); + switch (header) { case ClientPacketHeader.PING_RESPONSE: @@ -848,9 +851,6 @@ namespace Barotrauma.Networking case ClientPacketHeader.ERROR: HandleClientError(inc, connectedClient); break; - case ClientPacketHeader.LUA_NET_MESSAGE: - GameMain.Lua.networking.NetMessageReceived(inc, connectedClient); - break; } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaClasses.cs b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaClasses.cs index 1497bc0d6..dd9b3a447 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaClasses.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaClasses.cs @@ -4,7 +4,6 @@ using System.Text; using MoonSharp.Interpreter; using Microsoft.Xna.Framework; using Barotrauma.Networking; -using System.Threading.Tasks; using Barotrauma.Items.Components; using System.IO; using System.Net; @@ -15,9 +14,6 @@ using System.Reflection; using HarmonyLib; using MoonSharp.Interpreter.Interop; using System.Diagnostics; -using System.Reflection.Emit; -using Barotrauma.Extensions; -using System.Threading; namespace Barotrauma { @@ -702,22 +698,46 @@ namespace Barotrauma env = e; } - public Dictionary NetReceives = new Dictionary(); - + public Dictionary LuaNetReceives = new Dictionary(); + +#if SERVER [MoonSharpHidden] - public void NetMessageReceived(IReadMessage netMessage, Client client = null) + public void NetMessageReceived(IReadMessage netMessage, ClientPacketHeader header, Client client = null) { - string netMessageName = netMessage.ReadString(); - if (NetReceives[netMessageName] is Closure) - env.lua.Call(NetReceives[netMessageName], new object[] { netMessage, client }); + if (header == ClientPacketHeader.LUA_NET_MESSAGE) + { + string netMessageName = netMessage.ReadString(); + if (LuaNetReceives[netMessageName] is Closure) + env.lua.Call(LuaNetReceives[netMessageName], new object[] { netMessage, client }); + } + else + { + env.hook.Call("netMessageReceived", netMessage, header, client); + } } +#else + [MoonSharpHidden] + public void NetMessageReceived(IReadMessage netMessage, ServerPacketHeader header, Client client = null) + { + if (header == ServerPacketHeader.LUA_NET_MESSAGE) + { + string netMessageName = netMessage.ReadString(); + if (LuaNetReceives[netMessageName] is Closure) + env.lua.Call(LuaNetReceives[netMessageName], new object[] { netMessage, client }); + } + else + { + env.hook.Call("netMessageReceived", netMessage, header, client); + } + } +#endif + public void Receive(string netMessageName, object callback) { - NetReceives[netMessageName] = callback; + LuaNetReceives[netMessageName] = callback; } - public IWriteMessage Start(string netMessageName) { var message = new WriteOnlyMessage(); @@ -819,7 +839,7 @@ namespace Barotrauma GameMain.NetworkMember.CreateEntityEvent(entity, extraData); } -#if SERVER +#if SERVER public void UpdateClientPermissions(Client client) { GameMain.Server.UpdateClientPermissions(client); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaCustomConverters.cs b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaCustomConverters.cs index 000e53220..70d9c9501 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaCustomConverters.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaCustomConverters.cs @@ -65,11 +65,10 @@ namespace Barotrauma return new Pair((JobPrefab)v.Table.Get(1).ToObject(), (int)v.Table.Get(2).CastToNumber()); }); - Script.GlobalOptions.CustomConverters.SetClrToScriptCustomConversion( - (Script script, UInt64 v) => - { - return DynValue.NewString(v.ToString()); - }); + Script.GlobalOptions.CustomConverters.SetClrToScriptCustomConversion((Script script, UInt64 v) => + { + return DynValue.NewString(v.ToString()); + }); } public static void RegisterAction() diff --git a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaProxy.cs b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaProxy.cs new file mode 100644 index 000000000..536769192 --- /dev/null +++ b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaProxy.cs @@ -0,0 +1,60 @@ +using System; +using MoonSharp.Interpreter; +using Barotrauma.Networking; + +namespace Barotrauma +{ + + partial class LuaSetup + { + public class LuaWriteOnlyMessage + { + private WriteOnlyMessage target; + + [MoonSharpHidden] + public LuaWriteOnlyMessage(WriteOnlyMessage p) + { + target = p; + } + + public void WriteByte(byte v) => target.Write(v); + public void WriteUShort(ushort v) => target.Write(v); + + public void Write(bool val) => target.Write(val); + public void WritePadBits() => target.WritePadBits(); + public void Write(byte val) => target.Write(val); + public void Write(Int16 val) => target.Write(val); + public void Write(UInt16 val) => target.Write(val); + public void Write(Int32 val) => target.Write(val); + public void Write(UInt32 val) => target.Write(val); + public void Write(Int64 val) => target.Write(val); + public void Write(UInt64 val) => target.Write(val); + public void Write(Single val) => target.Write(val); + public void Write(Double val) => target.Write(val); + public void WriteColorR8G8B8(Microsoft.Xna.Framework.Color val) => target.WriteColorR8G8B8(val); + public void WriteColorR8G8B8A8(Microsoft.Xna.Framework.Color val) => target.WriteColorR8G8B8A8(val); + public void WriteVariableUInt32(UInt32 val) => target.WriteVariableUInt32(val); + public void Write(string val) => target.Write(val); + public void WriteRangedInteger(int val, int min, int max) => target.WriteRangedInteger(val, min, max); + public void WriteRangedSingle(Single val, Single min, Single max, int bitCount) => target.WriteRangedSingle(val, min, max, bitCount); + public void Write(byte[] val, int startIndex, int length) => target.Write(val, startIndex, length); + + public void PrepareForSending(ref byte[] outBuf, out bool isCompressed, out int outLength) => target.PrepareForSending(ref outBuf, out isCompressed, out outLength); + + public int BitPosition + { + get { return target.BitPosition; } + set { target.BitPosition = value; } + } + public int BytePosition => target.BytePosition; + public byte[] Buffer => target.Buffer; + public int LengthBits + { + get { return target.LengthBits; } + set { target.LengthBits = value; } + } + public int LengthBytes => target.LengthBytes; + } + } + +} \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaSetup.cs index bfcb17741..70bf103a2 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaSetup.cs @@ -5,22 +5,10 @@ using System.IO; using Barotrauma.Networking; using MoonSharp.Interpreter; using Microsoft.Xna.Framework; -using System.Threading.Tasks; -using Barotrauma.Items.Components; -using System.Diagnostics; -using System.Linq; using MoonSharp.Interpreter.Interop; -using System.Reflection; -using FarseerPhysics.Dynamics; using System.IO.Compression; using HarmonyLib; -#if CLIENT -using Microsoft.Xna.Framework.Graphics; -using EventInput; -using Microsoft.Xna.Framework.Input; -#endif - namespace Barotrauma { partial class LuaSetup @@ -355,8 +343,8 @@ namespace Barotrauma UserData.RegisterType(); UserData.RegisterType(); UserData.RegisterType(); - + UserData.RegisterProxyType(r => new LuaWriteOnlyMessage(r)); #if SERVER @@ -384,7 +372,7 @@ namespace Barotrauma lua.Globals["Timer"] = new LuaTimer(this); lua.Globals["File"] = UserData.CreateStatic(); lua.Globals["Networking"] = networking; - + #if SERVER #elif CLIENT