Fix LuaCs net messages received during connection initialization to be read incorrectly, happened because we would reset the BitPosition in our harmony patch which would cause the message to be read incorrectly later
This commit is contained in:
@@ -32,11 +32,11 @@ partial class NetworkingService : INetworkingService, IEventServerConnected, IEv
|
||||
}
|
||||
}
|
||||
|
||||
public void OnReceivedServerNetMessage(IReadMessage netMessage, ServerPacketHeader serverPacketHeader)
|
||||
public bool? OnReceivedServerNetMessage(IReadMessage netMessage, ServerPacketHeader serverPacketHeader)
|
||||
{
|
||||
if (serverPacketHeader != ServerHeader)
|
||||
{
|
||||
return;
|
||||
return null;
|
||||
}
|
||||
|
||||
ServerToClient luaCsHeader = (ServerToClient)netMessage.ReadByte();
|
||||
@@ -55,6 +55,8 @@ partial class NetworkingService : INetworkingService, IEventServerConnected, IEv
|
||||
ReadIds(netMessage);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void SendSyncMessage()
|
||||
|
||||
@@ -35,11 +35,11 @@ partial class NetworkingService : INetworkingService, IEventClientRawNetMessageR
|
||||
return message;
|
||||
}
|
||||
|
||||
public void OnReceivedClientNetMessage(IReadMessage netMessage, ClientPacketHeader clientPacketHeader, NetworkConnection sender)
|
||||
public bool? OnReceivedClientNetMessage(IReadMessage netMessage, ClientPacketHeader clientPacketHeader, NetworkConnection sender)
|
||||
{
|
||||
if (clientPacketHeader != ClientHeader)
|
||||
{
|
||||
return;
|
||||
return null;
|
||||
}
|
||||
|
||||
Client client = GameMain.Server.ConnectedClients.First(c => c.Connection == sender);
|
||||
@@ -64,6 +64,8 @@ partial class NetworkingService : INetworkingService, IEventClientRawNetMessageR
|
||||
RequestIdSingle(netMessage, client);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void HandleNetMessageId(IReadMessage netMessage, Client client = null)
|
||||
@@ -159,15 +161,11 @@ partial class NetworkingService : INetworkingService, IEventClientRawNetMessageR
|
||||
|
||||
SendToClient(message, client.Connection, DeliveryMethod.Reliable);
|
||||
|
||||
// delay by 1s to allow above id sync to reach the client.
|
||||
CoroutineManager.Invoke(() =>
|
||||
// TODO: when we move to using GUIDs for everything, this should combined into a single message
|
||||
foreach (INetworkSyncVar netVar in netVars.Keys)
|
||||
{
|
||||
// TODO: when we move to using GUIDs for everything, this should combined into a single message
|
||||
foreach (INetworkSyncVar netVar in netVars.Keys)
|
||||
{
|
||||
SendNetVar(netVar, client.Connection);
|
||||
}
|
||||
},1f);
|
||||
SendNetVar(netVar, client.Connection);
|
||||
}
|
||||
}
|
||||
|
||||
public void SendToClient(IWriteMessage netMessage, NetworkConnection connection = null, DeliveryMethod deliveryMethod = DeliveryMethod.Reliable)
|
||||
|
||||
@@ -959,7 +959,7 @@ interface IEventInventoryItemSwap : IEvent<IEventInventoryItemSwap>
|
||||
#if SERVER
|
||||
public interface IEventClientRawNetMessageReceived : IEvent<IEventClientRawNetMessageReceived>
|
||||
{
|
||||
void OnReceivedClientNetMessage(IReadMessage netMessage, ClientPacketHeader clientPacketHeader, NetworkConnection sender);
|
||||
bool? OnReceivedClientNetMessage(IReadMessage netMessage, ClientPacketHeader clientPacketHeader, NetworkConnection sender);
|
||||
|
||||
static IEventClientRawNetMessageReceived IEvent<IEventClientRawNetMessageReceived>.GetLuaRunner(IDictionary<string, LuaCsFunc> luaFunc)
|
||||
=> new LuaWrapper(luaFunc);
|
||||
@@ -970,15 +970,22 @@ public interface IEventClientRawNetMessageReceived : IEvent<IEventClientRawNetMe
|
||||
{
|
||||
}
|
||||
|
||||
public void OnReceivedClientNetMessage(IReadMessage netMessage, ClientPacketHeader clientPacketHeader, NetworkConnection sender)
|
||||
public bool? OnReceivedClientNetMessage(IReadMessage netMessage, ClientPacketHeader clientPacketHeader, NetworkConnection sender)
|
||||
{
|
||||
if (GameMain.Server == null) { return; }
|
||||
if (GameMain.Server == null) { return null; }
|
||||
|
||||
Client client = GameMain.Server.ConnectedClients.FirstOrDefault(c => c.Connection == sender);
|
||||
|
||||
if (client == null) { return; }
|
||||
if (client == null) { return null; }
|
||||
|
||||
LuaFuncs[nameof(OnReceivedClientNetMessage)](netMessage, clientPacketHeader, client);
|
||||
var result = LuaFuncs[nameof(OnReceivedClientNetMessage)](netMessage, clientPacketHeader, client);
|
||||
|
||||
if (result is DynValue dynValue && dynValue.Type == DataType.Boolean)
|
||||
{
|
||||
return dynValue.Boolean;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1069,7 +1076,7 @@ interface IEventJobsAssigned : IEvent<IEventJobsAssigned>
|
||||
|
||||
public interface IEventServerRawNetMessageReceived : IEvent<IEventServerRawNetMessageReceived>
|
||||
{
|
||||
void OnReceivedServerNetMessage(IReadMessage netMessage, ServerPacketHeader serverPacketHeader);
|
||||
bool? OnReceivedServerNetMessage(IReadMessage netMessage, ServerPacketHeader serverPacketHeader);
|
||||
|
||||
static IEventServerRawNetMessageReceived IEvent<IEventServerRawNetMessageReceived>.GetLuaRunner(IDictionary<string, LuaCsFunc> luaFunc)
|
||||
=> new LuaWrapper(luaFunc);
|
||||
@@ -1080,9 +1087,15 @@ public interface IEventServerRawNetMessageReceived : IEvent<IEventServerRawNetMe
|
||||
{
|
||||
}
|
||||
|
||||
public void OnReceivedServerNetMessage(IReadMessage netMessage, ServerPacketHeader serverPacketHeader)
|
||||
public bool? OnReceivedServerNetMessage(IReadMessage netMessage, ServerPacketHeader serverPacketHeader)
|
||||
{
|
||||
LuaFuncs[nameof(OnReceivedServerNetMessage)](netMessage, serverPacketHeader);
|
||||
var result = LuaFuncs[nameof(OnReceivedServerNetMessage)](netMessage, serverPacketHeader);
|
||||
if (result is DynValue dynValue && dynValue.Type == DataType.Boolean)
|
||||
{
|
||||
return dynValue.Boolean;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,12 +140,20 @@ internal class HarmonyEventPatchesService : ISystem
|
||||
|
||||
#if CLIENT
|
||||
[HarmonyPatch(typeof(GameClient), "ReadDataMessage"), HarmonyPrefix]
|
||||
public static void GameClient_ReadDataMessage_Pre(IReadMessage inc)
|
||||
public static bool GameClient_ReadDataMessage_Pre(IReadMessage inc)
|
||||
{
|
||||
int prevBitPosition = inc.BitPosition;
|
||||
ServerPacketHeader header = (ServerPacketHeader)inc.ReadByte();
|
||||
_eventService.PublishEvent<IEventServerRawNetMessageReceived>(x => x.OnReceivedServerNetMessage(inc, header));
|
||||
bool? skip = null;
|
||||
_eventService.PublishEvent<IEventServerRawNetMessageReceived>(x => skip = x.OnReceivedServerNetMessage(inc, header) ?? skip);
|
||||
|
||||
if (skip == true)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
inc.BitPosition = prevBitPosition; // rewind so the game can read the message
|
||||
return true;
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(SubEditorScreen), nameof(SubEditorScreen.Select), new Type[] { }), HarmonyPostfix]
|
||||
@@ -177,12 +185,21 @@ internal class HarmonyEventPatchesService : ISystem
|
||||
|
||||
#elif SERVER
|
||||
[HarmonyPatch(typeof(GameServer), "ReadDataMessage"), HarmonyPrefix]
|
||||
public static void GameServer_ReadDataMessage_Pre(NetworkConnection sender, IReadMessage inc)
|
||||
public static bool GameServer_ReadDataMessage_Pre(NetworkConnection sender, IReadMessage inc)
|
||||
{
|
||||
int prevBitPosition = inc.BitPosition;
|
||||
ClientPacketHeader header = (ClientPacketHeader)inc.ReadByte();
|
||||
_eventService.PublishEvent<IEventClientRawNetMessageReceived>(x => x.OnReceivedClientNetMessage(inc, header, sender));
|
||||
|
||||
bool? skip = null;
|
||||
_eventService.PublishEvent<IEventClientRawNetMessageReceived>(x => skip = x.OnReceivedClientNetMessage(inc, header, sender) ?? skip);
|
||||
|
||||
if (skip == true)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
inc.BitPosition = prevBitPosition; // rewind so the game can read the message
|
||||
return true;
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(GameServer), "OnInitializationComplete"), HarmonyPostfix]
|
||||
|
||||
Reference in New Issue
Block a user