diff --git a/Barotrauma/BarotraumaClient/ClientSource/Networking/GameClient.cs b/Barotrauma/BarotraumaClient/ClientSource/Networking/GameClient.cs index f0db0650e..46bd3de8e 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Networking/GameClient.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Networking/GameClient.cs @@ -958,6 +958,9 @@ 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 fbeb2c6cf..e5446a2cc 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/Networking/GameServer.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/Networking/GameServer.cs @@ -849,6 +849,9 @@ 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/Lua/MoonsharpSetup.lua b/Barotrauma/BarotraumaShared/Lua/MoonsharpSetup.lua index f438a80c7..327974002 100644 --- a/Barotrauma/BarotraumaShared/Lua/MoonsharpSetup.lua +++ b/Barotrauma/BarotraumaShared/Lua/MoonsharpSetup.lua @@ -1,6 +1,6 @@ local runDisabledMods = false -if Game.IsDedicated then +if SERVER and Game.IsDedicated then runDisabledMods = true print("LUA LOADER: Dedicated server detected, loading mods regardless being disabled.") diff --git a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaClasses.cs b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaClasses.cs index 82a020002..4853bd332 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaClasses.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaClasses.cs @@ -397,7 +397,7 @@ namespace Barotrauma } } - private partial class LuaNetworking + public partial class LuaNetworking { public LuaSetup env; @@ -406,6 +406,61 @@ namespace Barotrauma env = e; } + public Dictionary NetReceives = new Dictionary(); + + [MoonSharpHidden] + public void NetMessageReceived(IReadMessage netMessage, Client client = null) + { + string netMessageName = netMessage.ReadString(); + if (NetReceives[netMessageName] is Closure) + env.lua.Call(NetReceives[netMessageName], new object[] { netMessage, client }); + } + + public void Receive(string netMessageName, object callback) + { + NetReceives[netMessageName] = callback; + } + + + public IWriteMessage Start(string netMessageName) + { + var message = new WriteOnlyMessage(); +#if SERVER + message.Write((byte)ServerPacketHeader.LUA_NET_MESSAGE); +#else + message.Write((byte)ClientPacketHeader.LUA_NET_MESSAGE); +#endif + message.Write(netMessageName); + return ((IWriteMessage)message); + } + + public IWriteMessage Start() + { + return new WriteOnlyMessage(); + } + +#if SERVER + public void Send(IWriteMessage netMessage, NetworkConnection connection = null, DeliveryMethod deliveryMethod = DeliveryMethod.Reliable) + { + if (connection == null) + { + foreach (NetworkConnection conn in Client.ClientList.Select(c => c.Connection)) + { + GameMain.Server.ServerPeer.Send(netMessage, conn, deliveryMethod); + } + } + else + { + GameMain.Server.ServerPeer.Send(netMessage, connection, deliveryMethod); + } + } +#else + public void Send(IWriteMessage netMessage, DeliveryMethod deliveryMethod = DeliveryMethod.Reliable) + { + GameMain.Client.ClientPeer.Send(netMessage, deliveryMethod); + } +#endif + public string RequestPostHTTP(string url, string data, string contentType = "application/json") { try diff --git a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaSetup.cs index 0d30d8ddc..276487f54 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Lua/LuaSetup.cs @@ -20,6 +20,7 @@ namespace Barotrauma public LuaHook hook; public LuaGame game; + public LuaNetworking networking; public LuaScriptLoader luaScriptLoader; @@ -281,6 +282,11 @@ namespace Barotrauma UserData.RegisterType(); UserData.RegisterType(); UserData.RegisterType(); + UserData.RegisterType(); + UserData.RegisterType(); + UserData.RegisterType(); + UserData.RegisterType(); + UserData.RegisterType(); lua = new Script(CoreModules.Preset_SoftSandbox); @@ -290,6 +296,7 @@ namespace Barotrauma hook = new LuaHook(this); game = new LuaGame(this); + networking = new LuaNetworking(this); lua.Globals["TestFunction"] = (Func)TestFunction; @@ -310,7 +317,7 @@ namespace Barotrauma lua.Globals["Random"] = new LuaRandom(); lua.Globals["Timer"] = new LuaTimer(this); lua.Globals["File"] = UserData.CreateStatic(); - lua.Globals["Networking"] = new LuaNetworking(this); + lua.Globals["Networking"] = networking; lua.Globals["WayPoint"] = UserData.CreateStatic(); lua.Globals["SpawnType"] = UserData.CreateStatic(); lua.Globals["ChatMessageType"] = UserData.CreateStatic(); @@ -341,6 +348,9 @@ namespace Barotrauma lua.Globals["ContentPackage"] = UserData.CreateStatic(); lua.Globals["ClientPermissions"] = UserData.CreateStatic(); lua.Globals["Signal"] = UserData.CreateStatic(); + lua.Globals["DeliveryMethod"] = UserData.CreateStatic(); + lua.Globals["ClientPacketHeader"] = UserData.CreateStatic(); + lua.Globals["ServerPacketHeader"] = UserData.CreateStatic(); bool isServer = true; @@ -352,11 +362,7 @@ namespace Barotrauma lua.Globals["SERVER"] = isServer; lua.Globals["CLIENT"] = !isServer; - -#if CLIENT - return; -#endif - + if (File.Exists("Lua/MoonsharpSetup.lua")) // try the default loader DoFile("Lua/MoonsharpSetup.lua"); else if (File.Exists("Mods/LuaForBarotrauma/Lua/MoonsharpSetup.lua")) // in case its the workshop version diff --git a/Barotrauma/BarotraumaShared/SharedSource/Networking/NetworkMember.cs b/Barotrauma/BarotraumaShared/SharedSource/Networking/NetworkMember.cs index 4894b2a32..cfd0e8039 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Networking/NetworkMember.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Networking/NetworkMember.cs @@ -31,8 +31,8 @@ namespace Barotrauma.Networking ERROR, //tell the server that an error occurred CREW, READY_CHECK, - READY_TO_SPAWN - + READY_TO_SPAWN, + LUA_NET_MESSAGE } enum ClientNetObject { @@ -80,7 +80,8 @@ namespace Barotrauma.Networking MISSION, EVENTACTION, CREW, //anything related to managing bots in multiplayer - READY_CHECK //start, end and update a ready check + READY_CHECK, //start, end and update a ready check + LUA_NET_MESSAGE } enum ServerNetObject {