mirror of
https://github.com/NuclearPowered/Reactor.git
synced 2026-10-20 01:46:21 +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>
|
/// <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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in new issue
Block a user