Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Source/Client/Desyncs/SyncCoordinator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Multiplayer.Client.Desyncs;
using Multiplayer.Client.Util;
using Multiplayer.Common;
using Multiplayer.Common.Networking.Packet;
using RimWorld;
using Verse;

Expand Down Expand Up @@ -125,7 +126,7 @@ private void HandleDesync(ClientSyncOpinion oldOpinion, ClientSyncOpinion newOpi
var remote = !oldOpinion.isLocalClientsOpinion ? oldOpinion : newOpinion;

var diffAt = FindTraceHashesDiffTick(local, remote, out var found);
Multiplayer.Client.Send(Packets.Client_Desynced, local.startTick, diffAt);
Multiplayer.Client.Send(new ClientDesyncedPacket(local.startTick, diffAt));
Multiplayer.session.desyncTracesFromHost = null;

MpUI.ClearWindowStack();
Expand Down
2 changes: 1 addition & 1 deletion Source/Client/Networking/NetworkingSteam.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public class SteamServerConn(CSteamID remoteId, ushort clientChannel) : SteamBas
{
private readonly Stopwatch keepAliveTimer = new();

public override void Send(Packets id, byte[] message, bool reliable = true)
protected override void Send(Packets id, byte[] message, bool reliable = true)
{
if (id == Packets.Server_KeepAlive) keepAliveTimer.Restart();
base.Send(id, message, reliable);
Expand Down
66 changes: 25 additions & 41 deletions Source/Client/Networking/State/ClientPlayingState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,25 +113,20 @@ public void HandleCursor(ServerCursorPacket packet)
player.dragStart = data.HasDrag ? new Vector3(data.dragX, 0, data.dragZ) : PlayerInfo.Invalid;
}

[PacketHandler(Packets.Server_Selected)]
public void HandleSelected(ByteReader data)
[TypedPacketHandler]
public void HandleSelected(ServerSelectedPacket packet)
{
int playerId = data.ReadInt32();
var player = Multiplayer.session.GetPlayerInfo(playerId);
var player = Multiplayer.session.GetPlayerInfo(packet.playerId);
if (player == null) return;

bool reset = data.ReadBool();

if (reset)
player.selectedThings.Clear();
var data = packet.data;
if (data.reset) player.selectedThings.Clear();

int[] add = data.ReadPrefixedInts();
for (int i = 0; i < add.Length; i++)
player.selectedThings[add[i]] = Time.realtimeSinceStartup;
foreach (var id in data.newlySelectedIds)
player.selectedThings[id] = Time.realtimeSinceStartup;

int[] remove = data.ReadPrefixedInts();
for (int i = 0; i < remove.Length; i++)
player.selectedThings.Remove(remove[i]);
foreach (var id in data.unselectedIds)
player.selectedThings.Remove(id);
}

[TypedPacketHandler]
Expand All @@ -156,15 +151,13 @@ public void HandleMapResponse(ByteReader data)
// todo Multiplayer.client.Send(Packets.CLIENT_MAP_LOADED);
}

[PacketHandler(Packets.Server_Notification)]
public void HandleNotification(ByteReader data)
[TypedPacketHandler]
public void HandleNotification(ServerNotificationPacket packet)
{
string key = data.ReadString();
string[] args = data.ReadPrefixedStrings();

var msg = key.Translate(Array.ConvertAll(args, s => (NamedArgument)s));
var namedArgs = Array.ConvertAll(packet.args, s => (NamedArgument)s);
var msg = packet.key.Translate(namedArgs);
Messages.Message(msg, MessageTypeDefOf.SilentInput, false);
ServerLog.Log($"Notification: {msg} ({key}, {args.Join(", ")})");
ServerLog.Log($"Notification: {msg} ({packet.key}, {packet.args.Join(", ")})");
}

[TypedPacketHandler]
Expand All @@ -178,34 +171,25 @@ public void HandleFreeze(ServerFreezePacket packet)
TickPatch.frozenAt = packet.gameTimer;
}

[PacketHandler(Packets.Server_Traces, allowFragmented: true)]
public void HandleTraces(ByteReader data)
[TypedPacketHandler]
public void HandleTraces(ServerTracesPacket packet)
{
var type = data.ReadEnum<TracesPacket>();

if (type == TracesPacket.Request)
if (packet.mode == ServerTracesPacket.Mode.Request)
{
var tick = data.ReadInt32();
var diffAt = data.ReadInt32();
var playerId = data.ReadInt32();

var info = Multiplayer.game.sync.knownClientOpinions.FirstOrDefault(b => b.startTick == tick);
var response = info?.GetFormattedStackTracesForRange(diffAt);
var info = Multiplayer.game.sync.knownClientOpinions.FirstOrDefault(b => b.startTick == packet.tick);
var response = info?.GetFormattedStackTracesForRange(packet.diffAt) ?? "Traces not available";

connection.Send(Packets.Client_Traces, TracesPacket.Response, playerId, GZipStream.CompressString(response));
connection.Send(new ClientTracesPacket
{ playerId = packet.playerId, rawTraces = GZipStream.CompressString(response) });
}
else if (type == TracesPacket.Transfer)
else if (packet.mode == ServerTracesPacket.Mode.Transfer)
{
var traces = data.ReadPrefixedBytes();
Multiplayer.session.desyncTracesFromHost = GZipStream.UncompressString(traces);
Multiplayer.session.desyncTracesFromHost = GZipStream.UncompressString(packet.rawTraces);
}
}

[PacketHandler(Packets.Server_Debug)]
public void HandleDebug(ByteReader data)
{
Rejoiner.DoRejoin();
}
[TypedPacketHandler]
public void HandleDebug(ServerDebugPacket _) => Rejoiner.DoRejoin();

[TypedPacketHandler]
public void HandleSetFaction(ServerSetFactionPacket packet)
Expand Down
2 changes: 1 addition & 1 deletion Source/Client/Saving/ReplayConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public class ReplayConnection : ConnectionBase
{
public static Action<ScheduledCommand> replayCmdEvent;

public override void Send(Packets id, byte[] message, bool reliable = true)
protected override void Send(Packets id, byte[] message, bool reliable = true)
{
if (id == Packets.Client_Command)
replayCmdEvent?.Invoke(DeserializeCmd(new ByteReader(message)));
Expand Down
16 changes: 5 additions & 11 deletions Source/Client/UI/PlayerCursors.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using Multiplayer.Common;
using Multiplayer.Common.Networking.Packet;
using RimWorld.Planet;
using UnityEngine;
Expand Down Expand Up @@ -64,8 +63,6 @@ private void SendSelected()
{
if (Current.ProgramState != ProgramState.Playing) return;

var writer = new ByteWriter();

int mapId = Find.CurrentMap?.Index ?? -1;
if (WorldRendererUtility.WorldSelected) mapId = -1;

Expand All @@ -80,17 +77,14 @@ private void SendSelected()

var selected = new HashSet<int>(Find.Selector.selected.OfType<Thing>().Select(t => t.thingIDNumber));

var add = new List<int>(selected.Except(lastSelected));
var remove = new List<int>(lastSelected.Except(selected));

if (!reset && add.Count == 0 && remove.Count == 0) return;
var add = selected.Except(lastSelected).ToArray();
var remove = lastSelected.Except(selected).ToArray();

writer.WriteBool(reset);
writer.WritePrefixedInts(add);
writer.WritePrefixedInts(remove);
if (!reset && add.Length == 0 && remove.Length == 0) return;

lastSelected = selected;

Multiplayer.Client.Send(Packets.Client_Selected, writer.ToArray());
Multiplayer.Client.Send(new ClientSelectedPacket
{ reset = reset, newlySelectedIds = add, unselectedIds = remove });
}
}
28 changes: 7 additions & 21 deletions Source/Common/MultiplayerServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -214,30 +214,18 @@ public void Enqueue(Action action)

public void SendToPlaying<T>(T packet, bool reliable = true, ServerPlayer? excluding = null) where T : IPacket
{
var materialized = packet.Serialize();
SendToPlaying(materialized.id, materialized.data, reliable, excluding);
}

public void SendToPlaying(Packets id, object[] data) => SendToPlaying(id, ByteWriter.GetBytes(data));

public void SendToIngame(Packets id, byte[] data, bool reliable = true, ServerPlayer? excluding = null)
{
foreach (ServerPlayer player in PlayingIngamePlayers)
var serialized = packet.Serialize();
foreach (ServerPlayer player in PlayingPlayers)
if (player != excluding)
player.conn.Send(id, data, reliable);
player.conn.Send(serialized, reliable);
}

public void SendToIngame<T>(T packet, bool reliable = true, ServerPlayer? excluding = null) where T : IPacket
{
var serialized = packet.Serialize();
SendToIngame(serialized.id, serialized.data, reliable, excluding);
}

public void SendToPlaying(Packets id, byte[] data, bool reliable = true, ServerPlayer? excluding = null)
{
foreach (ServerPlayer player in PlayingPlayers)
foreach (ServerPlayer player in PlayingIngamePlayers)
if (player != excluding)
player.conn.Send(id, data, reliable);
player.conn.Send(serialized, reliable);
}

public ServerPlayer? GetPlayer(string username)
Expand All @@ -256,10 +244,8 @@ public void SendChat(string msg)
SendToPlaying(ServerChatPacket.Create(msg));
}

public void SendNotification(string key, params string[] args)
{
SendToPlaying(Packets.Server_Notification, new object[] { key, args });
}
public void SendNotification(string key, params string[] args) =>
SendToPlaying(new ServerNotificationPacket(key) { args = args });

public void RegisterChatCmd(string cmdName, ChatCmdHandler handler) =>
chatCmdManager.AddCommandHandler(cmdName, handler);
Expand Down
8 changes: 2 additions & 6 deletions Source/Common/Networking/ConnectionBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,7 @@ public void ChangeState(ConnectionStateEnum state)
StateObj?.StartState();
}

public void Send(Packets id) => Send(id, Array.Empty<byte>());

public void Send(Packets id, params object[] msg) => Send(id, ByteWriter.GetBytes(msg));
public void Send(Packets id) => Send(id, []);

public void Send(SerializedPacket packet, bool reliable = true) => Send(packet.id, packet.data, reliable);

Expand All @@ -56,7 +54,7 @@ public void Send<T>(T packet, bool reliable = true) where T : struct, IPacket
SendRaw(writer.ToArray(), reliable);
}

public virtual void Send(Packets id, byte[] message, bool reliable = true)
protected virtual void Send(Packets id, byte[] message, bool reliable = true)
{
if (State == ConnectionStateEnum.Disconnected)
return;
Expand Down Expand Up @@ -146,8 +144,6 @@ public void SendFragmented(Packets id, byte[] message)

public void SendFragmented(SerializedPacket packet) => SendFragmented(packet.id, packet.data);

public void SendFragmented(Packets id, params object[] msg) => SendFragmented(id, ByteWriter.GetBytes(msg));

protected abstract void SendRaw(byte[] raw, bool reliable = true);

public virtual void HandleReceiveRaw(ByteReader data, bool reliable)
Expand Down
17 changes: 17 additions & 0 deletions Source/Common/Networking/Packet/DebugPacket.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
namespace Multiplayer.Common.Networking.Packet;

[PacketDefinition(Packets.Server_Debug)]
public record struct ServerDebugPacket : IPacket
{
public void Bind(PacketBuffer buf)
{
}
}

[PacketDefinition(Packets.Client_Debug)]
public record struct ClientDebugPacket : IPacket
{
public void Bind(PacketBuffer buf)
{
}
}
14 changes: 14 additions & 0 deletions Source/Common/Networking/Packet/DesyncedPacket.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace Multiplayer.Common.Networking.Packet;

[PacketDefinition(Packets.Client_Desynced)]
public record struct ClientDesyncedPacket(int tick, int diffAt) : IPacket
{
public int tick = tick;
public int diffAt = diffAt;

public void Bind(PacketBuffer buf)
{
buf.Bind(ref tick);
buf.Bind(ref diffAt);
}
}
3 changes: 3 additions & 0 deletions Source/Common/Networking/Packet/IPacket.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ public static Binder<uint> UInt() =>

public static Binder<T> Enum<T>() where T: Enum =>
(PacketBuffer buf, ref T obj) => buf.BindEnum(ref obj);

public static Binder<string> String() =>
(PacketBuffer buf, ref string obj) => buf.Bind(ref obj);
}

public static class BinderExtensions
Expand Down
15 changes: 15 additions & 0 deletions Source/Common/Networking/Packet/NotificationPacket.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace Multiplayer.Common.Networking.Packet;

[PacketDefinition(Packets.Server_Notification)]
public record struct ServerNotificationPacket(string key) : IPacket
{
public string key = key;
public string[] args = [];

public void Bind(PacketBuffer buf)
{
buf.Bind(ref key);
buf.Bind(ref args, BinderOf.String());
}
}

30 changes: 30 additions & 0 deletions Source/Common/Networking/Packet/SelectedPacket.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
namespace Multiplayer.Common.Networking.Packet;


[PacketDefinition(Packets.Server_Selected)]
public record struct ServerSelectedPacket(int playerId, ClientSelectedPacket data) : IPacket
{
public int playerId = playerId;
public ClientSelectedPacket data = data;

public void Bind(PacketBuffer buf)
{
buf.Bind(ref playerId);
buf.Bind(ref data);
}
}

[PacketDefinition(Packets.Client_Selected)]
public record struct ClientSelectedPacket : IPacket
{
public bool reset;
public int[] newlySelectedIds;
public int[] unselectedIds;

public void Bind(PacketBuffer buf)
{
buf.Bind(ref reset);
buf.Bind(ref newlySelectedIds, BinderOf.Int(), maxLength: 200);
buf.Bind(ref unselectedIds, BinderOf.Int(), maxLength: 200);
}
}
Loading
Loading