From 128c4f436e12eec2de21dadf714331f5d7022064 Mon Sep 17 00:00:00 2001 From: js6pak Date: Sun, 23 Oct 2022 15:08:31 +0200 Subject: [PATCH] Make KickWithReason effective only when sent from host --- .../ReactorGameDataFlag.cs | 2 +- .../Networking/Extensions/ClientExtensions.cs | 6 +++-- Reactor/Networking/Patches/ClientPatches.cs | 23 ++++++++++++++++--- .../Networking/Patches/ReactorConnection.cs | 2 ++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Reactor.Networking.Shared/ReactorGameDataFlag.cs b/Reactor.Networking.Shared/ReactorGameDataFlag.cs index 50d1d2d..86cf8f1 100644 --- a/Reactor.Networking.Shared/ReactorGameDataFlag.cs +++ b/Reactor.Networking.Shared/ReactorGameDataFlag.cs @@ -8,5 +8,5 @@ public enum ReactorGameDataFlag : byte /// /// KickWithReason GameData message. /// - KickWithReason, + SetKickReason, } diff --git a/Reactor/Networking/Extensions/ClientExtensions.cs b/Reactor/Networking/Extensions/ClientExtensions.cs index 42e025d..c112344 100644 --- a/Reactor/Networking/Extensions/ClientExtensions.cs +++ b/Reactor/Networking/Extensions/ClientExtensions.cs @@ -14,7 +14,7 @@ public static class ClientExtensions /// The to send the message from. /// The target client's id. /// The kick reason. - public static void KickWithReason(this InnerNetClient innerNetClient, int targetClientId, string reason) + internal static void KickWithReason(this InnerNetClient innerNetClient, int targetClientId, string reason) { var writer = MessageWriter.Get(SendOption.Reliable); writer.StartMessage(Tags.GameDataTo); @@ -22,13 +22,15 @@ public static class ClientExtensions writer.WritePacked(targetClientId); { writer.StartMessage(byte.MaxValue); - writer.Write((byte) ReactorGameDataFlag.KickWithReason); + writer.Write((byte) ReactorGameDataFlag.SetKickReason); writer.Write(reason); writer.EndMessage(); } writer.EndMessage(); innerNetClient.SendOrDisconnect(writer); writer.Recycle(); + + innerNetClient.KickPlayer(targetClientId, false); } /// diff --git a/Reactor/Networking/Patches/ClientPatches.cs b/Reactor/Networking/Patches/ClientPatches.cs index 0c320d2..94c3e1f 100644 --- a/Reactor/Networking/Patches/ClientPatches.cs +++ b/Reactor/Networking/Patches/ClientPatches.cs @@ -12,6 +12,19 @@ namespace Reactor.Networking.Patches; internal static class ClientPatches { + [HarmonyPatch(typeof(InnerNetClient), nameof(InnerNetClient.DisconnectInternal))] + public static class DisconnectInternalPatch + { + public static void Prefix(InnerNetClient __instance, ref DisconnectReasons reason) + { + if (reason == DisconnectReasons.Kicked && ReactorConnection.Instance?.LastKickReason is { } lastKickReason) + { + reason = DisconnectReasons.Custom; + __instance.LastCustomDisconnect = lastKickReason; + } + } + } + [HarmonyPatch(typeof(InnerNetClient._HandleGameDataInner_d__39), nameof(InnerNetClient._HandleGameDataInner_d__39.MoveNext))] public static class HandleGameDataInnerPatch { @@ -27,11 +40,15 @@ internal static class ClientPatches var flag = (ReactorGameDataFlag) reader.ReadByte(); switch (flag) { - case ReactorGameDataFlag.KickWithReason: + case ReactorGameDataFlag.SetKickReason: { var reason = reader.ReadString(); - Debug("Received KickWithReason: " + reason); - innerNetClient.DisconnectWithReason(reason); + Debug("Received SetKickReason: " + reason); + if (ReactorConnection.Instance != null) + { + ReactorConnection.Instance.LastKickReason = reason; + } + break; } } diff --git a/Reactor/Networking/Patches/ReactorConnection.cs b/Reactor/Networking/Patches/ReactorConnection.cs index b0155e7..c5e4af0 100644 --- a/Reactor/Networking/Patches/ReactorConnection.cs +++ b/Reactor/Networking/Patches/ReactorConnection.cs @@ -13,6 +13,8 @@ public class ReactorConnection /// public Syncer? Syncer { get; internal set; } + internal string? LastKickReason { get; set; } + /// /// Gets the current instance of . ///