mirror of
https://github.com/NuclearPowered/Reactor.git
synced 2026-10-19 15:51:54 +00:00
Make KickWithReason effective only when sent from host
This commit is contained in:
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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in new issue
Block a user