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> /// <summary>
/// KickWithReason GameData message. /// KickWithReason GameData message.
/// </summary> /// </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="innerNetClient">The <see cref="InnerNetClient"/> to send the message from.</param>
/// <param name="targetClientId">The target client's id.</param> /// <param name="targetClientId">The target client's id.</param>
/// <param name="reason">The kick reason.</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); var writer = MessageWriter.Get(SendOption.Reliable);
writer.StartMessage(Tags.GameDataTo); writer.StartMessage(Tags.GameDataTo);
@@ -22,13 +22,15 @@ public static class ClientExtensions
writer.WritePacked(targetClientId); writer.WritePacked(targetClientId);
{ {
writer.StartMessage(byte.MaxValue); writer.StartMessage(byte.MaxValue);
writer.Write((byte) ReactorGameDataFlag.KickWithReason); writer.Write((byte) ReactorGameDataFlag.SetKickReason);
writer.Write(reason); writer.Write(reason);
writer.EndMessage(); writer.EndMessage();
} }
writer.EndMessage(); writer.EndMessage();
innerNetClient.SendOrDisconnect(writer); innerNetClient.SendOrDisconnect(writer);
writer.Recycle(); writer.Recycle();
innerNetClient.KickPlayer(targetClientId, false);
} }
/// <summary> /// <summary>
+20 -3
View File
@@ -12,6 +12,19 @@ namespace Reactor.Networking.Patches;
internal static class ClientPatches 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))] [HarmonyPatch(typeof(InnerNetClient._HandleGameDataInner_d__39), nameof(InnerNetClient._HandleGameDataInner_d__39.MoveNext))]
public static class HandleGameDataInnerPatch public static class HandleGameDataInnerPatch
{ {
@@ -27,11 +40,15 @@ internal static class ClientPatches
var flag = (ReactorGameDataFlag) reader.ReadByte(); var flag = (ReactorGameDataFlag) reader.ReadByte();
switch (flag) switch (flag)
{ {
case ReactorGameDataFlag.KickWithReason: case ReactorGameDataFlag.SetKickReason:
{ {
var reason = reader.ReadString(); var reason = reader.ReadString();
Debug("Received KickWithReason: " + reason); Debug("Received SetKickReason: " + reason);
innerNetClient.DisconnectWithReason(reason); if (ReactorConnection.Instance != null)
{
ReactorConnection.Instance.LastKickReason = reason;
}
break; break;
} }
} }
@@ -13,6 +13,8 @@ public class ReactorConnection
/// </summary> /// </summary>
public Syncer? Syncer { get; internal set; } public Syncer? Syncer { get; internal set; }
internal string? LastKickReason { get; set; }
/// <summary> /// <summary>
/// Gets the current instance of <see cref="ReactorConnection"/>. /// Gets the current instance of <see cref="ReactorConnection"/>.
/// </summary> /// </summary>