Improve Lua Networking

This commit is contained in:
Evil Factory
2022-03-03 19:34:52 -03:00
parent dd42269f31
commit a8fdc0f9c5
6 changed files with 104 additions and 38 deletions
@@ -736,6 +736,8 @@ namespace Barotrauma.Networking
MultiPlayerCampaign campaign = GameMain.NetLobbyScreen.SelectedMode == GameMain.GameSession?.GameMode.Preset ? MultiPlayerCampaign campaign = GameMain.NetLobbyScreen.SelectedMode == GameMain.GameSession?.GameMode.Preset ?
GameMain.GameSession?.GameMode as MultiPlayerCampaign : null; GameMain.GameSession?.GameMode as MultiPlayerCampaign : null;
GameMain.Lua.networking.NetMessageReceived(inc, header);
switch (header) switch (header)
{ {
case ServerPacketHeader.PING_REQUEST: case ServerPacketHeader.PING_REQUEST:
@@ -972,9 +974,6 @@ namespace Barotrauma.Networking
case ServerPacketHeader.EVENTACTION: case ServerPacketHeader.EVENTACTION:
GameMain.GameSession?.EventManager.ClientRead(inc); GameMain.GameSession?.EventManager.ClientRead(inc);
break; break;
case ServerPacketHeader.LUA_NET_MESSAGE:
GameMain.Lua.networking.NetMessageReceived(inc);
break;
} }
} }
@@ -710,6 +710,9 @@ namespace Barotrauma.Networking
var connectedClient = connectedClients.Find(c => c.Connection == sender); var connectedClient = connectedClients.Find(c => c.Connection == sender);
ClientPacketHeader header = (ClientPacketHeader)inc.ReadByte(); ClientPacketHeader header = (ClientPacketHeader)inc.ReadByte();
GameMain.Lua.networking.NetMessageReceived(inc, header, connectedClient);
switch (header) switch (header)
{ {
case ClientPacketHeader.PING_RESPONSE: case ClientPacketHeader.PING_RESPONSE:
@@ -848,9 +851,6 @@ namespace Barotrauma.Networking
case ClientPacketHeader.ERROR: case ClientPacketHeader.ERROR:
HandleClientError(inc, connectedClient); HandleClientError(inc, connectedClient);
break; break;
case ClientPacketHeader.LUA_NET_MESSAGE:
GameMain.Lua.networking.NetMessageReceived(inc, connectedClient);
break;
} }
} }
@@ -4,7 +4,6 @@ using System.Text;
using MoonSharp.Interpreter; using MoonSharp.Interpreter;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Barotrauma.Networking; using Barotrauma.Networking;
using System.Threading.Tasks;
using Barotrauma.Items.Components; using Barotrauma.Items.Components;
using System.IO; using System.IO;
using System.Net; using System.Net;
@@ -15,9 +14,6 @@ using System.Reflection;
using HarmonyLib; using HarmonyLib;
using MoonSharp.Interpreter.Interop; using MoonSharp.Interpreter.Interop;
using System.Diagnostics; using System.Diagnostics;
using System.Reflection.Emit;
using Barotrauma.Extensions;
using System.Threading;
namespace Barotrauma namespace Barotrauma
{ {
@@ -702,22 +698,46 @@ namespace Barotrauma
env = e; env = e;
} }
public Dictionary<string, object> NetReceives = new Dictionary<string, object>(); public Dictionary<string, object> LuaNetReceives = new Dictionary<string, object>();
#if SERVER
[MoonSharpHidden] [MoonSharpHidden]
public void NetMessageReceived(IReadMessage netMessage, Client client = null) public void NetMessageReceived(IReadMessage netMessage, ClientPacketHeader header, Client client = null)
{ {
string netMessageName = netMessage.ReadString(); if (header == ClientPacketHeader.LUA_NET_MESSAGE)
if (NetReceives[netMessageName] is Closure) {
env.lua.Call(NetReceives[netMessageName], new object[] { netMessage, client }); 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) public void Receive(string netMessageName, object callback)
{ {
NetReceives[netMessageName] = callback; LuaNetReceives[netMessageName] = callback;
} }
public IWriteMessage Start(string netMessageName) public IWriteMessage Start(string netMessageName)
{ {
var message = new WriteOnlyMessage(); var message = new WriteOnlyMessage();
@@ -65,11 +65,10 @@ namespace Barotrauma
return new Pair<JobPrefab, int>((JobPrefab)v.Table.Get(1).ToObject(), (int)v.Table.Get(2).CastToNumber()); return new Pair<JobPrefab, int>((JobPrefab)v.Table.Get(1).ToObject(), (int)v.Table.Get(2).CastToNumber());
}); });
Script.GlobalOptions.CustomConverters.SetClrToScriptCustomConversion<UInt64>( Script.GlobalOptions.CustomConverters.SetClrToScriptCustomConversion<UInt64>((Script script, UInt64 v) =>
(Script script, UInt64 v) => {
{ return DynValue.NewString(v.ToString());
return DynValue.NewString(v.ToString()); });
});
} }
public static void RegisterAction<T>() public static void RegisterAction<T>()
@@ -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;
}
}
}
@@ -5,22 +5,10 @@ using System.IO;
using Barotrauma.Networking; using Barotrauma.Networking;
using MoonSharp.Interpreter; using MoonSharp.Interpreter;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using System.Threading.Tasks;
using Barotrauma.Items.Components;
using System.Diagnostics;
using System.Linq;
using MoonSharp.Interpreter.Interop; using MoonSharp.Interpreter.Interop;
using System.Reflection;
using FarseerPhysics.Dynamics;
using System.IO.Compression; using System.IO.Compression;
using HarmonyLib; using HarmonyLib;
#if CLIENT
using Microsoft.Xna.Framework.Graphics;
using EventInput;
using Microsoft.Xna.Framework.Input;
#endif
namespace Barotrauma namespace Barotrauma
{ {
partial class LuaSetup partial class LuaSetup
@@ -356,7 +344,7 @@ namespace Barotrauma
UserData.RegisterType<LuaUserData>(); UserData.RegisterType<LuaUserData>();
UserData.RegisterType<IUserDataDescriptor>(); UserData.RegisterType<IUserDataDescriptor>();
UserData.RegisterProxyType<LuaWriteOnlyMessage, WriteOnlyMessage>(r => new LuaWriteOnlyMessage(r));
#if SERVER #if SERVER