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

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<string, object> NetReceives = new Dictionary<string, object>();
public Dictionary<string, object> LuaNetReceives = new Dictionary<string, object>();
#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);

View File

@@ -65,11 +65,10 @@ namespace Barotrauma
return new Pair<JobPrefab, int>((JobPrefab)v.Table.Get(1).ToObject(), (int)v.Table.Get(2).CastToNumber());
});
Script.GlobalOptions.CustomConverters.SetClrToScriptCustomConversion<UInt64>(
(Script script, UInt64 v) =>
{
return DynValue.NewString(v.ToString());
});
Script.GlobalOptions.CustomConverters.SetClrToScriptCustomConversion<UInt64>((Script script, UInt64 v) =>
{
return DynValue.NewString(v.ToString());
});
}
public static void RegisterAction<T>()

View File

@@ -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;
}
}
}

View File

@@ -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<LuaNetworking>();
UserData.RegisterType<LuaUserData>();
UserData.RegisterType<IUserDataDescriptor>();
UserData.RegisterProxyType<LuaWriteOnlyMessage, WriteOnlyMessage>(r => new LuaWriteOnlyMessage(r));
#if SERVER
@@ -384,7 +372,7 @@ namespace Barotrauma
lua.Globals["Timer"] = new LuaTimer(this);
lua.Globals["File"] = UserData.CreateStatic<LuaFile>();
lua.Globals["Networking"] = networking;
#if SERVER
#elif CLIENT