using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Threading;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.IL2CPP;
using BepInEx.IL2CPP.Utils;
using BepInEx.Logging;
using CrabDevKit.Intermediary;
using HarmonyLib;
using Il2CppSystem.Runtime.InteropServices;
using Microsoft.CodeAnalysis;
using PersistentData;
using SteamworksNative;
using TMPro;
using UnhollowerBaseLib;
using UnityEngine;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace AntiCrasher
{
internal static class LobbyTracker
{
internal static HashSet<ulong> currentMembers = new HashSet<ulong>();
internal static HashSet<ulong> blockedMembers = new HashSet<ulong>();
internal static void Init()
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
new Harmony("AntiCrasher.LobbyTracker").PatchAll(typeof(LobbyTracker));
}
[HarmonyPatch(typeof(MonoBehaviourPublicObInUIgaStCSBoStcuCSUnique), "Method_Private_Void_LobbyEnter_t_PDM_1")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static void PreSteamManagerLobbyEnter(LobbyEnter_t param_1)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
currentMembers.Clear();
blockedMembers.Clear();
CSteamID val = default(CSteamID);
((CSteamID)(ref val))..ctor(param_1.m_ulSteamIDLobby);
int numLobbyMembers = SteamMatchmaking.GetNumLobbyMembers(val);
currentMembers.EnsureCapacity(numLobbyMembers);
for (int i = 0; i < numLobbyMembers; i++)
{
currentMembers.Add(SteamMatchmaking.GetLobbyMemberByIndex(val, i).m_SteamID);
}
}
[HarmonyPatch(typeof(MonoBehaviourPublicObInUIgaStCSBoStcuCSUnique), "Method_Private_Void_LobbyChatUpdate_t_PDM_3")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static void PreSteamManagerPlayerJoinOrLeave(LobbyChatUpdate_t param_1)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
if (param_1.m_rgfChatMemberStateChange == 1)
{
currentMembers.Add(param_1.m_ulSteamIDUserChanged);
return;
}
currentMembers.Remove(param_1.m_ulSteamIDUserChanged);
blockedMembers.Remove(param_1.m_ulSteamIDUserChanged);
}
[HarmonyPatch(typeof(SteamMatchmaking), "LeaveLobby")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static void PreSteamMatchmakingLeaveLobby()
{
currentMembers.Clear();
blockedMembers.Clear();
}
}
internal static class PersistentDataCompatibility
{
internal static bool? enabled;
internal static bool Enabled
{
get
{
if (enabled.HasValue)
{
return enabled.Value;
}
bool? flag = (enabled = ((BaseChainloader<BasePlugin>)(object)IL2CPPChainloader.Instance).Plugins.ContainsKey("lammas123.PersistentData"));
return flag.Value;
}
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
internal static bool SetClientData(ulong clientId, string key, string value)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
ClientDataFile clientDataFile = Api.GetClientDataFile(clientId);
bool result = ((ClientDataFile)(ref clientDataFile)).Set(key, value);
((ClientDataFile)(ref clientDataFile)).SaveFile();
return result;
}
}
internal static class PacketLogger
{
internal sealed class PacketLog
{
internal DateTime time;
internal ulong senderId;
internal string senderName;
internal int channel;
internal int packetThisFrame;
internal byte[] bytes;
}
private static readonly ConcurrentQueue<PacketLog> packetQueue = new ConcurrentQueue<PacketLog>();
private static readonly AutoResetEvent signal = new AutoResetEvent(initialState: false);
private static Thread writerThread;
private static volatile bool writerRunning;
internal static void Init()
{
StartWriterThread();
}
private static void StartWriterThread()
{
if (!writerRunning)
{
writerRunning = true;
writerThread = new Thread(PacketWriterLoop)
{
IsBackground = true,
Name = "AntiCrasherPacketWriter"
};
writerThread.Start();
((BasePlugin)AntiCrasher.Instance).Log.LogInfo((object)"Started PacketLogger writer thread");
}
}
private static void PacketWriterLoop()
{
string path = Path.Combine(Paths.BepInExRootPath, "PacketLog.txt");
try
{
using FileStream stream = new FileStream(path, FileMode.Truncate, FileAccess.Write, FileShare.Read, 8192, FileOptions.WriteThrough);
using StreamWriter streamWriter = new StreamWriter(stream, Encoding.UTF8)
{
AutoFlush = false
};
StringBuilder stringBuilder = new StringBuilder(16384);
while (writerRunning)
{
signal.WaitOne(100);
bool flag = false;
PacketLog result;
while (packetQueue.TryDequeue(out result))
{
flag = true;
stringBuilder.Append($"{DateTime.Now,-11:h:mm:ss tt} ").Append(result.senderName).Append(" (@")
.Append(result.senderId)
.Append(") ");
stringBuilder.Append('#').Append(result.packetThisFrame).Append(' ')
.Append((object)(EnumNPublicSealedvaTo3vToUnique)result.channel)
.Append(" Len:")
.Append(result.bytes.Length)
.Append(' ');
stringBuilder.Append(BitConverter.ToString(result.bytes));
stringBuilder.AppendLine();
if (stringBuilder.Length > 65536)
{
streamWriter.Write(stringBuilder.ToString());
stringBuilder.Clear();
streamWriter.Flush();
}
}
if (flag && stringBuilder.Length > 0)
{
streamWriter.Write(stringBuilder.ToString());
stringBuilder.Clear();
streamWriter.Flush();
}
}
if (stringBuilder.Length > 0)
{
streamWriter.Write(stringBuilder.ToString());
streamWriter.Flush();
}
}
catch (Exception ex)
{
writerRunning = false;
try
{
File.AppendAllText(path, "\n[PacketWriterLoop crashed]\n" + ex?.ToString() + "\n");
}
catch
{
}
}
}
internal static void EnqueuePacket(ulong senderId, int channel, int packetThisFrame, byte[] data)
{
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
if (AntiCrasher.Instance.packetLogging && writerRunning && senderId != 0L)
{
packetQueue.Enqueue(new PacketLog
{
time = DateTime.Now,
senderId = senderId,
senderName = SteamFriends.GetFriendPersonaName(new CSteamID(senderId)),
channel = channel,
packetThisFrame = packetThisFrame,
bytes = data
});
signal.Set();
}
}
}
internal static class HandlePacketPatches
{
internal static Coroutine keybindCoro;
private const int MIN_PACKET_SIZE = 8;
private static int _maxHandledPackets;
private static int _totalHandledPackets;
internal static IEnumerator CoroKeybinds()
{
while (true)
{
yield return null;
if ((Input.GetKey((KeyCode)308) || Input.GetKey((KeyCode)307)) && Input.GetKeyDown((KeyCode)116))
{
((BasePlugin)AntiCrasher.Instance).Log.LogInfo((object)"Tested AntiCrasher");
if (Object.op_Implicit((Object)(object)MonoBehaviourPublicRaovTMinTemeColoonCoUnique.Instance))
{
MonoBehaviourPublicRaovTMinTemeColoonCoUnique.Instance.AppendMessage(0uL, "Functional", "AntiCrasher");
}
}
}
}
[HarmonyPatch(typeof(MonoBehaviourPublicObInVoAwVoVoVoVoVoVoUnique), "Awake")]
[HarmonyPostfix]
internal static void PostMainManagerAwake()
{
if (keybindCoro == null)
{
keybindCoro = MonoBehaviourExtensions.StartCoroutine((MonoBehaviour)(object)MonoBehaviourPublicObInVoAwVoVoVoVoVoVoUnique.Instance, CoroKeybinds());
}
}
[HarmonyPatch(typeof(MonoBehaviourPublicInStInpabyDiInpaby2Unique), "Update")]
[HarmonyPostfix]
internal static void PostSteamPacketManagerUpdate()
{
while (_maxHandledPackets == SteamPacketManagerExtensions.deobf_messagesToCheckFor)
{
((BasePlugin)AntiCrasher.Instance).Log.LogInfo((object)"Handled 70 packets! Checking for more...");
_maxHandledPackets = 0;
MonoBehaviourPublicInStInpabyDiInpaby2Unique.CheckForPackets();
}
_totalHandledPackets = 0;
}
[HarmonyPatch(typeof(SteamNetworkingMessages), "ReceiveMessagesOnChannel")]
[HarmonyPostfix]
internal static void PostSteamPacketManagerUpdate(int __result, int nLocalChannel)
{
if ((nLocalChannel == 0 || nLocalChannel == 1) && __result > _maxHandledPackets)
{
_maxHandledPackets = __result;
}
}
[HarmonyPatch(typeof(MonoBehaviourPublicInStInpabyDiInpaby2Unique), "Method_Private_Static_Void_SteamNetworkingMessage_t_Int32_0")]
[HarmonyPrefix]
[HarmonyPriority(int.MinValue)]
internal static bool PreSteamPacketManagerHandlePacket(SteamNetworkingMessage_t param_0, int param_1)
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Expected O, but got Unknown
//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
//IL_010e: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Invalid comparison between Unknown and I4
//IL_0124: Unknown result type (might be due to invalid IL or missing references)
//IL_0128: Invalid comparison between Unknown and I4
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
//IL_0118: Invalid comparison between Unknown and I4
//IL_012a: Unknown result type (might be due to invalid IL or missing references)
//IL_012e: Invalid comparison between Unknown and I4
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: Invalid comparison between Unknown and I4
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_0134: Invalid comparison between Unknown and I4
_totalHandledPackets++;
ulong steamID = param_0.m_identityPeer.GetSteamID64();
if (!SessionVerifier.IsValid(steamID))
{
MonoBehaviourPublicObInUIgaStCSBoStcuCSUnique.Instance.StopP2P(new CSteamID(steamID));
if (AntiCrasher.Instance.packetLogging)
{
PacketLogger.EnqueuePacket(steamID, -1, _totalHandledPackets, Array.Empty<byte>());
}
return false;
}
int cbSize = param_0.m_cbSize;
if (cbSize < 8)
{
AntiCrasher.Instance.Flag(steamID, AntiCrashReason.InvalidPacketLength);
if (AntiCrasher.Instance.packetLogging)
{
PacketLogger.EnqueuePacket(steamID, -2, _totalHandledPackets, Array.Empty<byte>());
}
return false;
}
Il2CppStructArray<byte> val = new Il2CppStructArray<byte>((long)cbSize);
Marshal.Copy(param_0.m_pData, val, 0, cbSize);
ObjectPublicIDisposableLi1ByInByBoUnique val2 = new ObjectPublicIDisposableLi1ByInByBoUnique();
PacketExtensions.SetBytes(val2, Il2CppArrayBase<byte>.op_Implicit((Il2CppArrayBase<byte>)(object)val));
PacketExtensions.ReadInt(val2, true);
int num = PacketExtensions.ReadInt(val2, true);
if (AntiCrasher.Instance.packetLogging)
{
PacketLogger.EnqueuePacket(steamID, param_1, _totalHandledPackets, Il2CppArrayBase<byte>.op_Implicit((Il2CppArrayBase<byte>)(object)val));
}
if (param_1 == 1)
{
if (!Enum.IsDefined(typeof(EnumPublicSealedvahawesepirepiselostUnique), num))
{
AntiCrasher.Instance.Flag(steamID, AntiCrashReason.InvalidClientPacketType);
return false;
}
EnumPublicSealedvahawesepirepiselostUnique val3 = (EnumPublicSealedvahawesepirepiselostUnique)num;
if ((int)val3 <= 7)
{
if ((int)val3 == 3)
{
AntiCrasher.Instance.Flag(steamID, AntiCrashReason.UnusedPingPongPacket);
return false;
}
if ((int)val3 == 7)
{
AntiCrasher.Instance.Flag(steamID, AntiCrashReason.UnusedColorChangeRequestPacket);
return false;
}
}
else
{
if ((int)val3 == 12)
{
AntiCrasher.Instance.Flag(steamID, AntiCrashReason.UnusedRequestGameStartedCooldownPacket);
return false;
}
if ((int)val3 == 23)
{
AntiCrasher.Instance.Flag(steamID, AntiCrashReason.UnusedTryBuyItemPacket);
return false;
}
if ((int)val3 == 26)
{
AntiCrasher.Instance.Flag(steamID, AntiCrashReason.UnusedPlayerReloadPacket);
return false;
}
}
}
else
{
if (!Enum.IsDefined(typeof(EnumPublicSealedvawesepilorelogasespUnique), num))
{
AntiCrasher.Instance.Flag(steamID, AntiCrashReason.InvalidServerPacketType);
return false;
}
if (steamID != SteamMatchmaking.GetLobbyOwner(MonoBehaviourPublicObInUIgaStCSBoStcuCSUnique.Instance.currentLobby).m_SteamID)
{
if (num == 13 || num == 14)
{
AntiCrasher.Instance.Flag(steamID, AntiCrashReason.UnauthorizedServerPacketFromNonHost);
}
return false;
}
if (num == 39)
{
if (cbSize < 16)
{
return false;
}
ulong clientId = PacketExtensions.ReadUlong(val2, true);
AntiCrasher.Instance.Flag(clientId, AntiCrashReason.UnusedPlayerReloadPacketFromHost, banOffender: false);
return false;
}
}
return true;
}
[HarmonyPatch(typeof(MonoBehaviourPublicInStInpabyDiInpaby2Unique), "Method_Private_Static_Void_SteamNetworkingMessage_t_Int32_0")]
[HarmonyFinalizer]
internal static Exception FinalSteamPacketManagerHandlePacket(SteamNetworkingMessage_t param_0, int param_1, Exception __exception)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Expected O, but got Unknown
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
if (__exception != null)
{
ManualLogSource log = ((BasePlugin)AntiCrasher.Instance).Log;
bool flag = default(bool);
BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(51, 4, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("An exception occurred handling a ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<EnumNPublicSealedvaTo3vToUnique>((EnumNPublicSealedvaTo3vToUnique)param_1);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" packet from ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(SteamFriends.GetFriendPersonaName(param_0.m_identityPeer.GetSteamID()));
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" (");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<ulong>(param_0.m_identityPeer.GetSteamID64());
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("):\n");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(__exception);
}
log.LogError(val);
}
return null;
}
}
internal static class InvalidHelpers
{
internal static bool IsInvalid(this float value)
{
if (!float.IsNaN(value) && !float.IsInfinity(value) && value != float.MaxValue)
{
return value == float.MinValue;
}
return true;
}
internal static bool IsInvalid(this Vector3 value)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
if (!value.x.IsInvalid() && !value.y.IsInvalid())
{
return value.z.IsInvalid();
}
return true;
}
}
internal static class ServerHandlePatches
{
[HarmonyPatch(typeof(MonoBehaviourPublicPlVoUI9GaVoUI9UsPlUnique), "PlayerPosition")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static bool PreServerHandlePlayerPosition(ulong param_0, ObjectPublicIDisposableLi1ByInByBoUnique param_1)
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
int num = PacketExtensions[param_1];
if (PacketExtensions.ReadVector3(param_1, true).IsInvalid())
{
AntiCrasher.Instance.Flag(param_0, AntiCrashReason.InvalidPlayerPositionPacket);
PacketExtensions[param_1] = num;
return false;
}
PacketExtensions[param_1] = num;
return true;
}
[HarmonyPatch(typeof(MonoBehaviourPublicPlVoUI9GaVoUI9UsPlUnique), "PlayerRotation")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static bool PreServerHandlePlayerRotation(ulong param_0, ObjectPublicIDisposableLi1ByInByBoUnique param_1)
{
int num = PacketExtensions[param_1];
float value = PacketExtensions.ReadFloat(param_1, true);
if (PacketExtensions.ReadFloat(param_1, true).IsInvalid() || value.IsInvalid())
{
AntiCrasher.Instance.Flag(param_0, AntiCrashReason.InvalidPlayerRotationPacket);
PacketExtensions[param_1] = num;
return false;
}
PacketExtensions[param_1] = num;
return true;
}
[HarmonyPatch(typeof(MonoBehaviourPublicPlVoUI9GaVoUI9UsPlUnique), "PlayerAnimation")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static bool PreServerHandlePlayerAnimation(ulong param_0, ObjectPublicIDisposableLi1ByInByBoUnique param_1)
{
int num = PacketExtensions[param_1];
int num2 = PacketExtensions.ReadInt(param_1, true);
if (!Enum.IsDefined(typeof(EnumNPublicSealedvaCrMe3vUnique), num2))
{
AntiCrasher.Instance.Flag(param_0, AntiCrashReason.InvalidPlayerAnimationPacket);
PacketExtensions[param_1] = num;
return false;
}
PacketExtensions[param_1] = num;
return true;
}
[HarmonyPatch(typeof(MonoBehaviourPublicPlVoUI9GaVoUI9UsPlUnique), "CrabDamage")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static bool PreServerHandleCrabDamage(ulong param_0, ObjectPublicIDisposableLi1ByInByBoUnique param_1)
{
int num = PacketExtensions[param_1];
int num2 = PacketExtensions.ReadInt(param_1, true);
int num3 = PacketExtensions.ReadInt(param_1, true);
ItemData itemById = MonoBehaviourPublicDi2InItidGamoObInUnique.GetItemById(num2);
if ((Object)(object)itemById == (Object)null || itemById.itemName != "Snowball" || !MonoBehaviourPublicDi2InObInObInUnique.Instance.Contains(num3))
{
AntiCrasher.Instance.Flag(param_0, AntiCrashReason.InvalidCrabDamagePacket);
PacketExtensions[param_1] = num;
return false;
}
MonoBehaviourPublicInidBoskUnique sharedObject = MonoBehaviourPublicDi2InObInObInUnique.Instance.GetSharedObject(num3);
if ((Object)(object)sharedObject != (Object)null)
{
MonoBehaviour1PublicAbstractItitBoGapiTrrileTrObUnique component = ((Component)sharedObject).GetComponent<MonoBehaviour1PublicAbstractItitBoGapiTrrileTrObUnique>();
if ((Object)(object)component != (Object)null && component.itemData.itemID != num2)
{
AntiCrasher.Instance.Flag(param_0, AntiCrashReason.InvalidCrabDamagePacket);
PacketExtensions[param_1] = num;
return false;
}
}
PacketExtensions[param_1] = num;
return true;
}
[HarmonyPatch(typeof(MonoBehaviourPublicPlVoUI9GaVoUI9UsPlUnique), "PlayerDamage")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static bool PreServerHandlePlayerDamage(ulong param_0, ObjectPublicIDisposableLi1ByInByBoUnique param_1)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
int num = PacketExtensions[param_1];
PacketExtensions.ReadUlong(param_1, true);
PacketExtensions.ReadInt(param_1, true);
Vector3 val = PacketExtensions.ReadVector3(param_1, true);
if (val.IsInvalid() || (val != Vector3.zero && (((Vector3)(ref val)).magnitude > 1.0001f || ((Vector3)(ref val)).magnitude < 0.9999f)))
{
AntiCrasher.Instance.Flag(param_0, AntiCrashReason.InvalidPlayerDamagePacket);
PacketExtensions[param_1] = num;
return false;
}
PacketExtensions[param_1] = num;
return true;
}
}
internal static class ClientHandlePatches
{
[HarmonyPatch(typeof(MonoBehaviourPublicUIInUIByUIUnique), "PlayerPosition")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static bool PreClientHandlePlayerPosition(ObjectPublicIDisposableLi1ByInByBoUnique param_0)
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
int num = PacketExtensions[param_0];
ulong clientId = PacketExtensions.ReadUlong(param_0, true);
if (PacketExtensions.ReadVector3(param_0, true).IsInvalid())
{
AntiCrasher.Instance.Flag(clientId, AntiCrashReason.InvalidPlayerPositionPacketFromHost, banOffender: false);
PacketExtensions[param_0] = num;
return false;
}
PacketExtensions[param_0] = num;
return true;
}
[HarmonyPatch(typeof(MonoBehaviourPublicUIInUIByUIUnique), "PlayerRotation")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static bool PreClientHandlePlayerRotation(ObjectPublicIDisposableLi1ByInByBoUnique param_0)
{
int num = PacketExtensions[param_0];
ulong clientId = PacketExtensions.ReadUlong(param_0, true);
float value = PacketExtensions.ReadFloat(param_0, true);
if (PacketExtensions.ReadFloat(param_0, true).IsInvalid() || value.IsInvalid())
{
AntiCrasher.Instance.Flag(clientId, AntiCrashReason.InvalidPlayerRotationPacketFromHost, banOffender: false);
PacketExtensions[param_0] = num;
return false;
}
PacketExtensions[param_0] = num;
return true;
}
[HarmonyPatch(typeof(MonoBehaviourPublicUIInUIByUIUnique), "PlayerAnimation")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static bool PreClientHandlePlayerAnimation(ObjectPublicIDisposableLi1ByInByBoUnique param_0)
{
int num = PacketExtensions[param_0];
ulong clientId = PacketExtensions.ReadUlong(param_0, true);
int num2 = PacketExtensions.ReadInt(param_0, true);
if (!Enum.IsDefined(typeof(EnumNPublicSealedvaCrMe3vUnique), num2))
{
AntiCrasher.Instance.Flag(clientId, AntiCrashReason.InvalidPlayerAnimationPacketFromHost, banOffender: false);
PacketExtensions[param_0] = num;
return false;
}
PacketExtensions[param_0] = num;
return true;
}
[HarmonyPatch(typeof(MonoBehaviourPublicUIInUIByUIUnique), "PlayerDamage")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static bool PreClientHandlePlayerDamage(ObjectPublicIDisposableLi1ByInByBoUnique param_0)
{
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
int num = PacketExtensions[param_0];
ulong clientId = PacketExtensions.ReadUlong(param_0, true);
PacketExtensions.ReadUlong(param_0, true);
PacketExtensions.ReadInt(param_0, true);
Vector3 val = PacketExtensions.ReadVector3(param_0, true);
if (val.IsInvalid() || (val != Vector3.zero && (((Vector3)(ref val)).magnitude > 1.0001f || ((Vector3)(ref val)).magnitude < 0.9999f)))
{
AntiCrasher.Instance.Flag(clientId, AntiCrashReason.InvalidPlayerDamagePacketFromHost, banOffender: false);
PacketExtensions[param_0] = num;
return !val.IsInvalid();
}
PacketExtensions[param_0] = num;
return true;
}
}
internal static class ChatboxPatches
{
[HarmonyPatch(typeof(MonoBehaviourPublicRaovTMinTemeColoonCoUnique), "ForceMessage")]
[HarmonyPostfix]
internal static void PostChatboxForceMessage(MonoBehaviourPublicRaovTMinTemeColoonCoUnique __instance)
{
if (((TMP_Text)__instance.messages).text.Length > ChatboxExtensions[__instance])
{
TextMeshProUGUI messages = __instance.messages;
string text = ((TMP_Text)__instance.messages).text;
int num = ChatboxExtensions[__instance];
int length = text.Length;
int num2 = length - num;
((TMP_Text)messages).text = text.Substring(num2, length - num2);
}
}
}
internal static class PlayerChatDropPatches
{
private static bool _shouldNotParse = false;
private static readonly HashSet<ulong> _recentDrops = new HashSet<ulong>();
[HarmonyPatch(typeof(MonoBehaviourPublicStCaSt1ObSthaUIStmaUnique), "PlayerChatDrop")]
[HarmonyPrefix]
internal static void PreDeobf_SteamInventoryPlayerChatDrop()
{
_shouldNotParse = true;
}
[HarmonyPatch(typeof(MonoBehaviourPublicStCaSt1ObSthaUIStmaUnique), "PlayerChatDrop")]
[HarmonyPostfix]
internal static void PostDeobf_SteamInventoryPlayerChatDrop()
{
_shouldNotParse = false;
}
[HarmonyPatch(typeof(SteamFriends), "GetFriendPersonaName")]
[HarmonyPostfix]
internal static void PostSteamFriendsGetFriendPersonaName(ref string __result)
{
if (_shouldNotParse)
{
__result = "<noparse>" + __result.Replace("noparse", "") + "</noparse>";
}
}
[HarmonyPatch(typeof(MonoBehaviourPublicPlVoUI9GaVoUI9UsPlUnique), "PlayerDropSerialized")]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static bool PreServerHandlePlayerDropSerialized(ulong param_0)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
if (_recentDrops.Contains(param_0))
{
return false;
}
_recentDrops.Add(param_0);
MonoBehaviourExtensions.StartCoroutine((MonoBehaviour)(object)MonoBehaviourPublicObInVoAwVoVoVoVoVoVoUnique.Instance, CoroChatDropCooldown(param_0));
string friendPersonaName = SteamFriends.GetFriendPersonaName(new CSteamID(param_0));
int num = friendPersonaName.IndexOf('<');
if (num == -1 || num + 1 >= friendPersonaName.Length)
{
return true;
}
return friendPersonaName.IndexOf(">", num + 1) == -1;
}
private static IEnumerator CoroChatDropCooldown(ulong clientId)
{
yield return (object)new WaitForSeconds(1f);
_recentDrops.Remove(clientId);
}
}
internal static class AntiShadowModPatches
{
[HarmonyPatch(typeof(MonoBehaviourPublicGapaTrconaGaDi2UIObUnique), "UpdateList")]
[HarmonyPostfix]
internal static void PostPlayerListUpdateList(MonoBehaviourPublicGapaTrconaGaDi2UIObUnique __instance)
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
if (!MonoBehaviourPublicObInUIgaStCSBoStcuCSUnique.Instance.IsLobbyOwner())
{
return;
}
foreach (ObjectPublicBoInBoCSItBoInSiBySiUnique item in (Il2CppArrayBase<ObjectPublicBoInBoCSItBoInSiBySiUnique>)(object)MonoBehaviourPublicCSDi2UIInstObUIloDiUnique.Instance.GetClients())
{
if (!(item.field_Public_CSteamID_0 == CSteamID.Nil) && !__instance.field_Private_Dictionary_2_UInt64_MonoBehaviourPublicRabaicRaTeusscTepiObUnique_0.ContainsKey(item.field_Public_CSteamID_0.m_SteamID))
{
MonoBehaviourPublicRabaicRaTeusscTepiObUnique component = Object.Instantiate<GameObject>(__instance.namePrefab, __instance.contentParent).GetComponent<MonoBehaviourPublicRabaicRaTeusscTepiObUnique>();
__instance.field_Private_Dictionary_2_UInt64_MonoBehaviourPublicRabaicRaTeusscTepiObUnique_0.Add(item.field_Public_CSteamID_0.m_SteamID, component);
((TMP_Text)component.username).text = MonoBehaviourPublicRaovTMinTemeColoonCoUnique.RemoveRichText(SteamFriends.GetFriendPersonaName(item.field_Public_CSteamID_0));
if (MonoBehaviourPublicDi2UIObacspDi2UIObUnique.Instance.activePlayers.ContainsKey(item.field_Public_CSteamID_0.m_SteamID))
{
component.SetPlayer(MonoBehaviourPublicDi2UIObacspDi2UIObUnique.Instance.activePlayers[item.field_Public_CSteamID_0.m_SteamID]);
}
else
{
component.SetSpectator(item.field_Public_CSteamID_0.m_SteamID);
}
((Graphic)component.background).color = Color.yellow;
((Graphic)component.icon).color = Color.yellow;
}
}
}
}
[BepInPlugin("lammas123.AntiCrasher", "AntiCrasher", "1.1.1")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public sealed class AntiCrasher : BasePlugin
{
internal static AntiCrasher Instance;
internal bool chatFlags = true;
internal bool persistentDataBan;
internal bool packetLogging;
public override void Load()
{
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: Expected O, but got Unknown
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.CurrentUICulture = CultureInfo.InvariantCulture;
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;
Instance = this;
chatFlags = ((BasePlugin)this).Config.Bind<bool>("AntiCrasher", "ChatFlags", true, "Whether to notify you about the Anti Crasher being flagged in the chatbox or not. You'll still be able to check for flags in the console or LogOutput.txt.").Value;
persistentDataBan = ((BasePlugin)this).Config.Bind<bool>("AntiCrasher", "PersistentDataBans", false, "If flagged crashers should be permanently banned via PersistentData if it's installed.").Value;
packetLogging = ((BasePlugin)this).Config.Bind<bool>("AntiCrasher", "PacketLogging", false, "If all received packets should be logged to PacketLog.txt at the root of your BepInEx directory.").Value;
LobbyTracker.Init();
SessionVerifier.Init();
if (packetLogging)
{
PacketLogger.Init();
}
Harmony val = new Harmony("AntiCrasher");
val.PatchAll(typeof(HandlePacketPatches));
val.PatchAll(typeof(ServerHandlePatches));
val.PatchAll(typeof(ClientHandlePatches));
val.PatchAll(typeof(ChatboxPatches));
val.PatchAll(typeof(PlayerChatDropPatches));
val.PatchAll(typeof(AntiShadowModPatches));
ManualLogSource log = ((BasePlugin)this).Log;
bool flag = default(bool);
BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(15, 2, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Initialized [");
((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>("AntiCrasher");
((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" ");
((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>("1.1.1");
((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("]");
}
log.LogInfo(val2);
}
internal void Flag(ulong clientId, AntiCrashReason reason, bool banOffender = true)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
ManualLogSource log = ((BasePlugin)this).Log;
bool flag = default(bool);
BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(17, 3, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Flagged ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(SteamFriends.GetFriendPersonaName(new CSteamID(clientId)));
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" (");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<ulong>(clientId);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") for: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<AntiCrashReason>(reason);
}
log.LogInfo(val);
if (chatFlags && Object.op_Implicit((Object)(object)MonoBehaviourPublicRaovTMinTemeColoonCoUnique.Instance))
{
MonoBehaviourPublicRaovTMinTemeColoonCoUnique.Instance.AppendMessage(0uL, reason.ToString(), "AntiCrasher Flagged " + SteamFriends.GetFriendPersonaName(new CSteamID(clientId)) + " for");
}
if (!banOffender || !MonoBehaviourPublicObInUIgaStCSBoStcuCSUnique.Instance.IsLobbyOwner() || clientId == SteamUser.GetSteamID().m_SteamID)
{
if (banOffender && clientId != SteamUser.GetSteamID().m_SteamID)
{
if (clientId == MonoBehaviourPublicObInUIgaStCSBoStcuCSUnique.Instance.originalLobbyOwnerId.m_SteamID)
{
MonoBehaviourPublicObInUIgaStCSBoStcuCSUnique.Instance.LeaveLobby();
MonoBehaviourPublicGaprLi1ObGaprInUnique.Instance.NewPrompt("Anti Crasher", $"The host was flagged for {reason}, left lobby.");
}
else
{
LobbyTracker.blockedMembers.Add(clientId);
MonoBehaviourPublicObInUIgaStCSBoStcuCSUnique.Instance.StopP2P(new CSteamID(clientId));
}
}
}
else
{
if (persistentDataBan && PersistentDataCompatibility.Enabled)
{
PersistentDataCompatibility.SetClientData(clientId, "Banned", $"[AntiCrasher] detected: {reason}");
}
LobbyTracker.blockedMembers.Add(clientId);
MonoBehaviourPublicCSDi2UIInstObUIloDiUnique.Instance.BanPlayer(clientId);
}
}
}
internal enum AntiCrashReason
{
InvalidPacketLength,
InvalidClientPacketType,
InvalidServerPacketType,
UnauthorizedServerPacketFromNonHost,
UnusedPingPongPacket,
UnusedColorChangeRequestPacket,
UnusedRequestGameStartedCooldownPacket,
UnusedTryBuyItemPacket,
UnusedPlayerReloadPacket,
UnusedPlayerReloadPacketFromHost,
InvalidPlayerPositionPacket,
InvalidPlayerRotationPacket,
InvalidPlayerAnimationPacket,
InvalidCrabDamagePacket,
InvalidPlayerDamagePacket,
InvalidPlayerPositionPacketFromHost,
InvalidPlayerRotationPacketFromHost,
InvalidPlayerAnimationPacketFromHost,
InvalidPlayerDamagePacketFromHost
}
internal static class SessionVerifier
{
internal static void Init()
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
new Harmony("AntiCrasher.SessionVerifier").PatchAll(typeof(SessionVerifier));
}
internal static bool IsValid(ulong clientId)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
if (clientId != SteamUser.GetSteamID().m_SteamID)
{
if (LobbyTracker.currentMembers.Contains(clientId))
{
return !LobbyTracker.blockedMembers.Contains(clientId);
}
return false;
}
return true;
}
[HarmonyPatch(typeof(MonoBehaviourPublicObInUIgaStCSBoStcuCSUnique), "NewAcceptP2P", new Type[] { typeof(CSteamID) })]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static bool PreSteamManagerNewAcceptP2P(CSteamID param_1)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
if (IsValid(param_1.m_SteamID))
{
return true;
}
if (AntiCrasher.Instance.packetLogging)
{
PacketLogger.EnqueuePacket(param_1.m_SteamID, -1, -1, Array.Empty<byte>());
}
return false;
}
[HarmonyPatch(typeof(MonoBehaviourPublicObInUIgaStCSBoStcuCSUnique), "NewAcceptP2P", new Type[] { typeof(SteamNetworkingIdentity) })]
[HarmonyPrefix]
[HarmonyPriority(int.MaxValue)]
internal static bool PreSteamManagerNewAcceptP2P(SteamNetworkingIdentity param_1)
{
if (IsValid(param_1.GetSteamID64()))
{
return true;
}
if (AntiCrasher.Instance.packetLogging)
{
PacketLogger.EnqueuePacket(param_1.GetSteamID64(), -1, -1, Array.Empty<byte>());
}
return false;
}
}
internal static class TestAntiCrash
{
internal static void Test()
{
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "lammas123.AntiCrasher";
public const string PLUGIN_NAME = "AntiCrasher";
public const string PLUGIN_VERSION = "1.1.1";
}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
internal sealed class IgnoresAccessChecksToAttribute : Attribute
{
public IgnoresAccessChecksToAttribute(string assemblyName)
{
}
}
}