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 .
///