Make KickWithReason effective only when sent from host

This commit is contained in:
js6pak committed 2022-10-23 15:08:31 +02:00
1 parent 8d67b08481
commit 128c4f436e
4 files changed
+27 -6

No files matched your search

@@ -8,5 +8,5 @@ public enum ReactorGameDataFlag : byte
/// <summary>
/// KickWithReason GameData message.
/// </summary>
KickWithReason,
SetKickReason,
}
@@ -14,7 +14,7 @@ public static class ClientExtensions
/// <param name="innerNetClient">The <see cref="InnerNetClient"/> to send the message from.</param>
/// <param name="targetClientId">The target client's id.</param>
/// <param name="reason">The kick reason.</param>
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);
}
/// <summary>
+20 -3
View File
@@ -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;
}
}
@@ -13,6 +13,8 @@ public class ReactorConnection
/// </summary>
public Syncer? Syncer { get; internal set; }
internal string? LastKickReason { get; set; }
/// <summary>
/// Gets the current instance of <see cref="ReactorConnection"/>.
/// </summary>