Decompiled source of Miserrablee BASIC Modpack v1.2.4
BepInEx/plugins/2018-LC_API/LC_API.dll
Decompiled 8 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LC_API.BundleAPI; using LC_API.ClientAPI; using LC_API.Comp; using LC_API.Data; using LC_API.Exceptions; using LC_API.Extensions; using LC_API.GameInterfaceAPI; using LC_API.GameInterfaceAPI.Events; using LC_API.GameInterfaceAPI.Events.Cache; using LC_API.GameInterfaceAPI.Events.EventArgs.Player; using LC_API.GameInterfaceAPI.Events.Handlers; using LC_API.GameInterfaceAPI.Features; using LC_API.ManualPatches; using LC_API.Networking; using LC_API.ServerAPI; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Steamworks; using Steamworks.Data; using TMPro; using Unity.Collections; using Unity.Netcode; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("2018")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Utilities for plugin devs")] [assembly: AssemblyFileVersion("3.4.5.0")] [assembly: AssemblyInformationalVersion("3.4.5+ae2de74676f4f0d6440c82067f4c1a22389fe27b")] [assembly: AssemblyProduct("Lethal Company API")] [assembly: AssemblyTitle("LC_API")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("3.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] internal class <Module> { static <Module>() { } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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 LC_API { internal static class CheatDatabase { private const string SIG_REQ_GUID = "LC_API_ReqGUID"; private const string SIG_SEND_MODS = "LC_APISendMods"; private static Dictionary<string, PluginInfo> PluginsLoaded = new Dictionary<string, PluginInfo>(); public static void RunLocalCheatDetector() { PluginsLoaded = Chainloader.PluginInfos; using Dictionary<string, PluginInfo>.ValueCollection.Enumerator enumerator = PluginsLoaded.Values.GetEnumerator(); while (enumerator.MoveNext()) { switch (enumerator.Current.Metadata.GUID) { case "mikes.lethalcompany.mikestweaks": case "mom.llama.enhancer": case "Posiedon.GameMaster": case "LethalCompanyScalingMaster": case "verity.amberalert": ModdedServer.SetServerModdedOnly(); break; } } } public static void OtherPlayerCheatDetector() { Plugin.Log.LogWarning((object)"Asking all other players for their mod list.."); LC_API.GameInterfaceAPI.Features.Player.LocalPlayer.QueueTip("Mod List:", "Asking all other players for installed mods.."); LC_API.GameInterfaceAPI.Features.Player.LocalPlayer.QueueTip("Mod List:", "Check the logs for more detailed results.\n<size=13>(Note that if someone doesnt show up on the list, they may not have LC_API installed)</size>"); Network.Broadcast("LC_API_ReqGUID"); } [NetworkMessage("LC_APISendMods", false)] internal static void ReceivedModListHandler(ulong senderId, List<string> mods) { string text = LC_API.GameInterfaceAPI.Features.Player.Get(senderId).Username + " responded with these mods:\n" + string.Join("\n", mods); LC_API.GameInterfaceAPI.Features.Player.LocalPlayer.QueueTip("Mod List:", text); Plugin.Log.LogWarning((object)text); } [NetworkMessage("LC_API_ReqGUID", false)] internal static void ReceivedModListHandler(ulong senderId) { List<string> list = new List<string>(); foreach (PluginInfo value in PluginsLoaded.Values) { list.Add(value.Metadata.GUID); } Network.Broadcast("LC_APISendMods", list); } } [BepInPlugin("LC_API", "Lethal Company API", "3.4.5")] public sealed class Plugin : BaseUnityPlugin { internal static ManualLogSource Log; private ConfigEntry<bool> configOverrideModServer; private ConfigEntry<bool> configLegacyAssetLoading; private ConfigEntry<bool> configDisableBundleLoader; internal static ConfigEntry<bool> configVanillaSupport; internal static Harmony Harmony; internal static Plugin Instance { get; private set; } public static bool Initialized { get; private set; } private void Awake() { //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Expected O, but got Unknown //IL_027e: Unknown result type (might be due to invalid IL or missing references) //IL_028c: Expected O, but got Unknown //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Expected O, but got Unknown //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_02ba: Expected O, but got Unknown //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_02d2: Expected O, but got Unknown //IL_02dd: Unknown result type (might be due to invalid IL or missing references) //IL_02ea: Expected O, but got Unknown //IL_02f5: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Expected O, but got Unknown //IL_030d: Unknown result type (might be due to invalid IL or missing references) //IL_031a: Expected O, but got Unknown Instance = this; configOverrideModServer = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Force modded server browser", false, "Should the API force you into the modded server browser?"); configLegacyAssetLoading = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Legacy asset bundle loading", false, "Should the BundleLoader use legacy asset loading? Turning this on may help with loading assets from older plugins."); configDisableBundleLoader = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Disable BundleLoader", false, "Should the BundleLoader be turned off? Enable this if you are having problems with mods that load assets using a different method from LC_API's BundleLoader."); configVanillaSupport = ((BaseUnityPlugin)this).Config.Bind<bool>("Compatibility", "Vanilla Compatibility", false, "Allows you to join vanilla servers, but disables many networking-related things and could cause mods to not work properly."); CommandHandler.commandPrefix = ((BaseUnityPlugin)this).Config.Bind<string>("General", "Prefix", "/", "Command prefix"); Log = ((BaseUnityPlugin)this).Logger; ((BaseUnityPlugin)this).Logger.LogWarning((object)"\n.____ _________ _____ __________ .___ \r\n| | \\_ ___ \\ / _ \\ \\______ \\| | \r\n| | / \\ \\/ / /_\\ \\ | ___/| | \r\n| |___\\ \\____ / | \\| | | | \r\n|_______ \\\\______ /______\\____|__ /|____| |___| \r\n \\/ \\//_____/ \\/ \r\n "); ((BaseUnityPlugin)this).Logger.LogInfo((object)"LC_API Starting up.."); if (configOverrideModServer.Value) { ModdedServer.SetServerModdedOnly(); } if (configVanillaSupport.Value) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"LC_API is starting with VANILLA SUPPORT ENABLED."); } Harmony = new Harmony("ModAPI"); MethodInfo methodInfo = AccessTools.Method(typeof(GameNetworkManager), "SteamMatchmaking_OnLobbyCreated", (Type[])null, (Type[])null); AccessTools.Method(typeof(GameNetworkManager), "LobbyDataIsJoinable", (Type[])null, (Type[])null); MethodInfo methodInfo2 = AccessTools.Method(typeof(ServerPatch), "OnLobbyCreate", (Type[])null, (Type[])null); MethodInfo methodInfo3 = AccessTools.Method(typeof(MenuManager), "Awake", (Type[])null, (Type[])null); MethodInfo methodInfo4 = AccessTools.Method(typeof(ServerPatch), "CacheMenuManager", (Type[])null, (Type[])null); AccessTools.Method(typeof(HUDManager), "AddChatMessage", (Type[])null, (Type[])null); MethodInfo methodInfo5 = AccessTools.Method(typeof(HUDManager), "SubmitChat_performed", (Type[])null, (Type[])null); MethodInfo methodInfo6 = AccessTools.Method(typeof(CommandHandler.SubmitChatPatch), "Transpiler", (Type[])null, (Type[])null); MethodInfo methodInfo7 = AccessTools.Method(typeof(GameNetworkManager), "Awake", (Type[])null, (Type[])null); MethodInfo methodInfo8 = AccessTools.Method(typeof(ServerPatch), "GameNetworkManagerAwake", (Type[])null, (Type[])null); MethodInfo methodInfo9 = AccessTools.Method(typeof(NetworkManager), "StartClient", (Type[])null, (Type[])null); MethodInfo methodInfo10 = AccessTools.Method(typeof(NetworkManager), "StartHost", (Type[])null, (Type[])null); MethodInfo methodInfo11 = AccessTools.Method(typeof(NetworkManager), "Shutdown", (Type[])null, (Type[])null); MethodInfo methodInfo12 = AccessTools.Method(typeof(RegisterPatch), "Postfix", (Type[])null, (Type[])null); MethodInfo methodInfo13 = AccessTools.Method(typeof(UnregisterPatch), "Postfix", (Type[])null, (Type[])null); Harmony.Patch((MethodBase)methodInfo3, new HarmonyMethod(methodInfo4), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Harmony.Patch((MethodBase)methodInfo, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Harmony.Patch((MethodBase)methodInfo5, (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(methodInfo6), (HarmonyMethod)null, (HarmonyMethod)null); Harmony.Patch((MethodBase)methodInfo7, new HarmonyMethod(methodInfo8), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Harmony.Patch((MethodBase)methodInfo9, (HarmonyMethod)null, new HarmonyMethod(methodInfo12), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Harmony.Patch((MethodBase)methodInfo10, (HarmonyMethod)null, new HarmonyMethod(methodInfo12), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Harmony.Patch((MethodBase)methodInfo11, (HarmonyMethod)null, new HarmonyMethod(methodInfo13), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Network.Init(); Events.Patch(Harmony); } internal void Start() { Initialize(); } internal void OnDestroy() { Initialize(); } internal void Initialize() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown if (!Initialized) { Initialized = true; if (!configDisableBundleLoader.Value) { BundleLoader.Load(configLegacyAssetLoading.Value); } GameObject val = new GameObject("API"); Object.DontDestroyOnLoad((Object)val); val.AddComponent<LC_APIManager>(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"LC_API Started!"); CheatDatabase.RunLocalCheatDetector(); } } internal static void PatchMethodManual(MethodInfo method, MethodInfo patch, Harmony harmony) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown harmony.Patch((MethodBase)method, new HarmonyMethod(patch), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } public static class Utils { public static string ReplaceWithCase(this string input, string toReplace, string replacement) { Dictionary<string, string> map = new Dictionary<string, string> { { toReplace, replacement } }; return input.ReplaceWithCase(map); } public static string ReplaceWithCase(this string input, Dictionary<string, string> map) { string text = input; foreach (KeyValuePair<string, string> item in map) { string key = item.Key; string value = item.Value; text = Regex.Replace(text, key, delegate(Match match) { string value2 = match.Value; char[] array = value2.ToCharArray(); string[] source = value2.Split(' '); bool flag = char.IsUpper(array[0]); bool flag2 = source.All((string w) => char.IsUpper(w[0]) || !char.IsLetter(w[0])); if (array.All((char c) => char.IsUpper(c) || !char.IsLetter(c))) { return value.ToUpper(); } if (flag2) { return Regex.Replace(value, "\\b\\w", (Match charMatch) => charMatch.Value.ToUpper()); } char[] array2 = value.ToCharArray(); array2[0] = (flag ? char.ToUpper(array2[0]) : char.ToLower(array2[0])); return new string(array2); }, RegexOptions.IgnoreCase); } return text; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "LC_API"; public const string PLUGIN_NAME = "Lethal Company API"; public const string PLUGIN_VERSION = "3.4.5"; } } namespace LC_API.ServerAPI { public static class ModdedServer { private static bool moddedOnly; [Obsolete("Use SetServerModdedOnly() instead. This will be removed/private in a future update.")] public static bool setModdedOnly; public static int GameVersion { get; internal set; } public static bool ModdedOnly => moddedOnly; public static void SetServerModdedOnly() { moddedOnly = true; Plugin.Log.LogMessage((object)"A plugin has set your game to only allow you to play with other people who have mods!"); } public static void OnSceneLoaded() { if (Object.op_Implicit((Object)(object)GameNetworkManager.Instance) && ModdedOnly) { GameNetworkManager instance = GameNetworkManager.Instance; instance.gameVersionNum += 16440; setModdedOnly = true; } } } [Obsolete("ServerAPI.Networking is obsolete and will be removed in future versions. Use LC_API.Networking.Network.")] public static class Networking { private sealed class Data<T> { public readonly string Signature; public readonly T Value; public Data(string signature, T value) { Signature = signature; Value = value; } } private const string StringMessageRegistrationName = "LCAPI_NET_LEGACY_STRING"; private const string ListStringMessageRegistrationName = "LCAPI_NET_LEGACY_LISTSTRING"; private const string IntMessageRegistrationName = "LCAPI_NET_LEGACY_INT"; private const string FloatMessageRegistrationName = "LCAPI_NET_LEGACY_FLOAT"; private const string Vector3MessageRegistrationName = "LCAPI_NET_LEGACY_VECTOR3"; private const string SyncVarMessageRegistrationName = "LCAPI_NET_LEGACY_SYNCVAR_SET"; public static Action<string, string> GetString = delegate { }; public static Action<List<string>, string> GetListString = delegate { }; public static Action<int, string> GetInt = delegate { }; public static Action<float, string> GetFloat = delegate { }; public static Action<Vector3, string> GetVector3 = delegate { }; private static Dictionary<string, string> syncStringVars = new Dictionary<string, string>(); public static void Broadcast(string data, string signature) { if (data.Contains("/")) { Plugin.Log.LogError((object)"Invalid character in broadcasted string event! ( / )"); } else { Network.Broadcast("LCAPI_NET_LEGACY_STRING", new Data<string>(signature, data)); } } public static void Broadcast(List<string> data, string signature) { string text = ""; foreach (string datum in data) { if (datum.Contains("/")) { Plugin.Log.LogError((object)"Invalid character in broadcasted string event! ( / )"); return; } if (datum.Contains("\n")) { Plugin.Log.LogError((object)"Invalid character in broadcasted string event! ( NewLine )"); return; } text = text + datum + "\n"; } Network.Broadcast("LCAPI_NET_LEGACY_LISTSTRING", new Data<string>(signature, text)); } public static void Broadcast(int data, string signature) { Network.Broadcast("LCAPI_NET_LEGACY_INT", new Data<int>(signature, data)); } public static void Broadcast(float data, string signature) { Network.Broadcast("LCAPI_NET_LEGACY_FLOAT", new Data<float>(signature, data)); } public static void Broadcast(Vector3 data, string signature) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) Network.Broadcast("LCAPI_NET_LEGACY_VECTOR3", new Data<Vector3>(signature, data)); } public static void RegisterSyncVariable(string name) { if (!syncStringVars.ContainsKey(name)) { syncStringVars.Add(name, ""); } else { Plugin.Log.LogError((object)("Cannot register Sync Variable! A Sync Variable has already been registered with name " + name)); } } public static void SetSyncVariable(string name, string value) { if (syncStringVars.ContainsKey(name)) { syncStringVars[name] = value; Broadcast(new List<string> { name, value }, "LCAPI_NET_LEGACY_SYNCVAR_SET"); } else { Plugin.Log.LogError((object)("Cannot set the value of Sync Variable " + name + " as it is not registered!")); } } private static void SetSyncVariableB(string name, string value) { if (syncStringVars.ContainsKey(name)) { syncStringVars[name] = value; } else { Plugin.Log.LogError((object)("Cannot set the value of Sync Variable " + name + " as it is not registered!")); } } internal static void LCAPI_NET_SYNCVAR_SET(List<string> list, string arg2) { if (arg2 == "LCAPI_NET_LEGACY_SYNCVAR_SET") { SetSyncVariableB(list[0], list[1]); } } public static string GetSyncVariable(string name) { if (syncStringVars.ContainsKey(name)) { return syncStringVars[name]; } Plugin.Log.LogError((object)("Cannot get the value of Sync Variable " + name + " as it is not registered!")); return ""; } internal static void InitializeLegacyNetworking() { GetListString = (Action<List<string>, string>)Delegate.Combine(GetListString, new Action<List<string>, string>(LCAPI_NET_SYNCVAR_SET)); Network.RegisterMessage("LCAPI_NET_LEGACY_STRING", relayToSelf: false, delegate(ulong senderId, Data<string> data) { GetString(data.Value, data.Signature); }); Network.RegisterMessage("LCAPI_NET_LEGACY_LISTSTRING", relayToSelf: false, delegate(ulong senderId, Data<string> data) { GetListString(data.Value.Split('\n').ToList(), data.Signature); }); Network.RegisterMessage("LCAPI_NET_LEGACY_INT", relayToSelf: false, delegate(ulong senderId, Data<int> data) { GetInt(data.Value, data.Signature); }); Network.RegisterMessage("LCAPI_NET_LEGACY_FLOAT", relayToSelf: false, delegate(ulong senderId, Data<float> data) { GetFloat(data.Value, data.Signature); }); Network.RegisterMessage("LCAPI_NET_LEGACY_VECTOR3", relayToSelf: false, delegate(ulong senderId, Data<Vector3> data) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) GetVector3(data.Value, data.Signature); }); } } } namespace LC_API.Networking { public static class Network { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static HandleNamedMessageDelegate <>9__35_2; public static Events.CustomEventHandler <>9__35_0; public static Events.CustomEventHandler <>9__35_1; internal void <Init>b__35_0() { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown StartedNetworking = true; if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { CustomMessagingManager customMessagingManager = NetworkManager.Singleton.CustomMessagingManager; object obj = <>9__35_2; if (obj == null) { HandleNamedMessageDelegate val = delegate(ulong senderClientId, FastBufferReader reader) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) byte[] bytes = default(byte[]); ((FastBufferReader)(ref reader)).ReadValueSafe<byte>(ref bytes, default(ForPrimitives)); NetworkMessageWrapper networkMessageWrapper = bytes.ToObject<NetworkMessageWrapper>(); networkMessageWrapper.Sender = senderClientId; byte[] array = networkMessageWrapper.ToBytes(); FastBufferWriter val2 = default(FastBufferWriter); ((FastBufferWriter)(ref val2))..ctor(FastBufferWriter.GetWriteSize<byte>(array, -1, 0), (Allocator)2, -1); try { ((FastBufferWriter)(ref val2)).WriteValueSafe<byte>(array, default(ForPrimitives)); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll(networkMessageWrapper.UniqueName, val2, (NetworkDelivery)4); } finally { ((IDisposable)(FastBufferWriter)(ref val2)).Dispose(); } }; <>9__35_2 = val; obj = (object)val; } customMessagingManager.RegisterNamedMessageHandler("LC_API_RELAY_MESSAGE", (HandleNamedMessageDelegate)obj); } RegisterAllMessages(); } internal void <Init>b__35_2(ulong senderClientId, FastBufferReader reader) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) byte[] bytes = default(byte[]); ((FastBufferReader)(ref reader)).ReadValueSafe<byte>(ref bytes, default(ForPrimitives)); NetworkMessageWrapper networkMessageWrapper = bytes.ToObject<NetworkMessageWrapper>(); networkMessageWrapper.Sender = senderClientId; byte[] array = networkMessageWrapper.ToBytes(); FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(FastBufferWriter.GetWriteSize<byte>(array, -1, 0), (Allocator)2, -1); try { ((FastBufferWriter)(ref val)).WriteValueSafe<byte>(array, default(ForPrimitives)); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll(networkMessageWrapper.UniqueName, val, (NetworkDelivery)4); } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } internal void <Init>b__35_1() { StartedNetworking = false; if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { NetworkManager.Singleton.CustomMessagingManager.UnregisterNamedMessageHandler("LC_API_RELAY_MESSAGE"); } UnregisterAllMessages(); } } internal const string MESSAGE_RELAY_UNIQUE_NAME = "LC_API_RELAY_MESSAGE"; private static MethodInfo _registerInfo = null; private static MethodInfo _registerInfoGeneric = null; internal static Dictionary<string, NetworkMessageFinalizerBase> NetworkMessageFinalizers { get; } = new Dictionary<string, NetworkMessageFinalizerBase>(); internal static bool StartedNetworking { get; set; } = false; internal static MethodInfo RegisterInfo { get { if (_registerInfo == null) { MethodInfo[] methods = typeof(Network).GetMethods(); foreach (MethodInfo methodInfo in methods) { if (methodInfo.Name == "RegisterMessage" && !methodInfo.IsGenericMethod) { _registerInfo = methodInfo; break; } } } return _registerInfo; } } internal static MethodInfo RegisterInfoGeneric { get { if (_registerInfoGeneric == null) { MethodInfo[] methods = typeof(Network).GetMethods(); foreach (MethodInfo methodInfo in methods) { if (methodInfo.Name == "RegisterMessage" && methodInfo.IsGenericMethod) { _registerInfoGeneric = methodInfo; break; } } } return _registerInfoGeneric; } } public static event Events.CustomEventHandler RegisterNetworkMessages; internal static event Events.CustomEventHandler UnregisterNetworkMessages; internal static byte[] ToBytes(this object @object) { if (@object == null) { return null; } return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(@object)); } internal static T ToObject<T>(this byte[] bytes) where T : class { return JsonConvert.DeserializeObject<T>(Encoding.UTF8.GetString(bytes)); } internal static void OnRegisterNetworkMessages() { Network.RegisterNetworkMessages.InvokeSafely(); } internal static void OnUnregisterNetworkMessages() { Network.UnregisterNetworkMessages.InvokeSafely(); } internal static void RegisterAllMessages() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown foreach (NetworkMessageFinalizerBase value in NetworkMessageFinalizers.Values) { NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler(value.UniqueName, new HandleNamedMessageDelegate(value.Read)); } } internal static void UnregisterAllMessages() { foreach (string key in NetworkMessageFinalizers.Keys) { UnregisterMessage(key, andRemoveHandler: false); } } public static void RegisterAll() { Type[] typesFromAssembly = AccessTools.GetTypesFromAssembly(new StackTrace().GetFrame(1).GetMethod().ReflectedType.Assembly); for (int i = 0; i < typesFromAssembly.Length; i++) { RegisterAll(typesFromAssembly[i]); } } public static void RegisterAll(Type type) { if (!type.IsClass) { return; } NetworkMessage customAttribute = type.GetCustomAttribute<NetworkMessage>(); if (customAttribute != null) { if (type.BaseType.Name == "NetworkMessageHandler`1") { Type type2 = type.BaseType.GetGenericArguments()[0]; RegisterInfoGeneric.MakeGenericMethod(type2).Invoke(null, new object[3] { customAttribute.UniqueName, customAttribute.RelayToSelf, type.GetMethod("Handler").CreateDelegate(typeof(Action<, >).MakeGenericType(typeof(ulong), type2), Activator.CreateInstance(type)) }); } else if (type.BaseType.Name == "NetworkMessageHandler") { RegisterInfo.Invoke(null, new object[3] { customAttribute.UniqueName, customAttribute.RelayToSelf, type.GetMethod("Handler").CreateDelegate(typeof(Action<>).MakeGenericType(typeof(ulong)), Activator.CreateInstance(type)) }); } return; } MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { customAttribute = methodInfo.GetCustomAttribute<NetworkMessage>(); if (customAttribute != null) { if (!methodInfo.IsStatic) { throw new Exception("Detected NetworkMessage attribute on non-static method. All NetworkMessages on methods must be static."); } if (methodInfo.GetParameters().Length == 1) { RegisterInfo.Invoke(null, new object[3] { customAttribute.UniqueName, customAttribute.RelayToSelf, methodInfo.CreateDelegate(typeof(Action<>).MakeGenericType(typeof(ulong))) }); } else { Type parameterType = methodInfo.GetParameters()[1].ParameterType; RegisterInfoGeneric.MakeGenericMethod(parameterType).Invoke(null, new object[3] { customAttribute.UniqueName, customAttribute.RelayToSelf, methodInfo.CreateDelegate(typeof(Action<, >).MakeGenericType(typeof(ulong), parameterType)) }); } } } } public static void UnregisterAll(bool andRemoveHandler = true) { Type[] typesFromAssembly = AccessTools.GetTypesFromAssembly(new StackTrace().GetFrame(1).GetMethod().ReflectedType.Assembly); for (int i = 0; i < typesFromAssembly.Length; i++) { UnregisterAll(typesFromAssembly[i], andRemoveHandler); } } public static void UnregisterAll(Type type, bool andRemoveHandler = true) { if (!type.IsClass) { return; } NetworkMessage customAttribute = type.GetCustomAttribute<NetworkMessage>(); if (customAttribute != null) { UnregisterMessage(customAttribute.UniqueName, andRemoveHandler); return; } MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); for (int i = 0; i < methods.Length; i++) { customAttribute = methods[i].GetCustomAttribute<NetworkMessage>(); if (customAttribute != null) { UnregisterMessage(customAttribute.UniqueName, andRemoveHandler); } } } public static void RegisterMessage<T>(string uniqueName, bool relayToSelf, Action<ulong, T> onReceived) where T : class { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown if (NetworkMessageFinalizers.ContainsKey(uniqueName)) { throw new Exception(uniqueName + " already registered"); } NetworkMessageFinalizer<T> networkMessageFinalizer = new NetworkMessageFinalizer<T>(uniqueName, relayToSelf, onReceived); NetworkMessageFinalizers.Add(uniqueName, networkMessageFinalizer); if (StartedNetworking) { NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler(uniqueName, new HandleNamedMessageDelegate(networkMessageFinalizer.Read)); } } public static void RegisterMessage(string uniqueName, bool relayToSelf, Action<ulong> onReceived) { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown if (NetworkMessageFinalizers.ContainsKey(uniqueName)) { throw new Exception(uniqueName + " already registered"); } NetworkMessageFinalizer networkMessageFinalizer = new NetworkMessageFinalizer(uniqueName, relayToSelf, onReceived); NetworkMessageFinalizers.Add(uniqueName, networkMessageFinalizer); if (StartedNetworking) { NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler(uniqueName, new HandleNamedMessageDelegate(networkMessageFinalizer.Read)); } } public static void UnregisterMessage(string uniqueName, bool andRemoveHandler = true) { if ((!andRemoveHandler && NetworkMessageFinalizers.ContainsKey(uniqueName)) || (andRemoveHandler && NetworkMessageFinalizers.Remove(uniqueName))) { NetworkManager.Singleton.CustomMessagingManager.UnregisterNamedMessageHandler(uniqueName); } } public static void Broadcast<T>(string uniqueName, T @object) where T : class { if (NetworkMessageFinalizers.TryGetValue(uniqueName, out var value)) { if (!(value is NetworkMessageFinalizer<T> networkMessageFinalizer)) { throw new Exception("Network handler for " + uniqueName + " was not broadcast with the right type!"); } networkMessageFinalizer.Send(@object); } } public static void Broadcast(string uniqueName) { if (NetworkMessageFinalizers.TryGetValue(uniqueName, out var value)) { if (!(value is NetworkMessageFinalizer networkMessageFinalizer)) { throw new Exception("Network handler for " + uniqueName + " was not broadcast with the right type!"); } networkMessageFinalizer.Send(); } } internal static void Init() { RegisterNetworkMessages += delegate { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown StartedNetworking = true; if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { CustomMessagingManager customMessagingManager = NetworkManager.Singleton.CustomMessagingManager; object obj = <>c.<>9__35_2; if (obj == null) { HandleNamedMessageDelegate val = delegate(ulong senderClientId, FastBufferReader reader) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) byte[] bytes = default(byte[]); ((FastBufferReader)(ref reader)).ReadValueSafe<byte>(ref bytes, default(ForPrimitives)); NetworkMessageWrapper networkMessageWrapper = bytes.ToObject<NetworkMessageWrapper>(); networkMessageWrapper.Sender = senderClientId; byte[] array = networkMessageWrapper.ToBytes(); FastBufferWriter val2 = default(FastBufferWriter); ((FastBufferWriter)(ref val2))..ctor(FastBufferWriter.GetWriteSize<byte>(array, -1, 0), (Allocator)2, -1); try { ((FastBufferWriter)(ref val2)).WriteValueSafe<byte>(array, default(ForPrimitives)); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll(networkMessageWrapper.UniqueName, val2, (NetworkDelivery)4); } finally { ((IDisposable)(FastBufferWriter)(ref val2)).Dispose(); } }; <>c.<>9__35_2 = val; obj = (object)val; } customMessagingManager.RegisterNamedMessageHandler("LC_API_RELAY_MESSAGE", (HandleNamedMessageDelegate)obj); } RegisterAllMessages(); }; UnregisterNetworkMessages += delegate { StartedNetworking = false; if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { NetworkManager.Singleton.CustomMessagingManager.UnregisterNamedMessageHandler("LC_API_RELAY_MESSAGE"); } UnregisterAllMessages(); }; SetupNetworking(); RegisterAll(); LC_API.ServerAPI.Networking.InitializeLegacyNetworking(); } internal static void SetupNetworking() { Type[] types = Assembly.GetExecutingAssembly().GetTypes(); for (int i = 0; i < types.Length; i++) { MethodInfo[] methods = types[i].GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { if (methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false).Length != 0) { methodInfo.Invoke(null, null); } } } } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public class NetworkMessage : Attribute { public string UniqueName { get; } public bool RelayToSelf { get; } public NetworkMessage(string uniqueName, bool relayToSelf = false) { UniqueName = uniqueName; RelayToSelf = relayToSelf; } } public abstract class NetworkMessageHandler<T> where T : class { public abstract void Handler(ulong sender, T message); } public abstract class NetworkMessageHandler { public abstract void Handler(ulong sender); } internal abstract class NetworkMessageFinalizerBase { internal abstract string UniqueName { get; } internal abstract bool RelayToSelf { get; } public abstract void Read(ulong sender, FastBufferReader reader); } internal class NetworkMessageFinalizer : NetworkMessageFinalizerBase { internal override string UniqueName { get; } internal override bool RelayToSelf { get; } internal Action<ulong> OnReceived { get; } public NetworkMessageFinalizer(string uniqueName, bool relayToSelf, Action<ulong> onReceived) { UniqueName = uniqueName; RelayToSelf = relayToSelf; OnReceived = onReceived; } public void Send() { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)LC_API.GameInterfaceAPI.Features.Player.LocalPlayer == (Object)null || (Object)(object)LC_API.GameInterfaceAPI.Features.Player.HostPlayer == (Object)null) { ((MonoBehaviour)NetworkManager.Singleton).StartCoroutine(SendLater()); return; } byte[] array = new NetworkMessageWrapper(UniqueName, LC_API.GameInterfaceAPI.Features.Player.LocalPlayer.ClientId).ToBytes(); FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(FastBufferWriter.GetWriteSize<byte>(array, -1, 0), (Allocator)2, -1); try { ((FastBufferWriter)(ref val)).WriteValueSafe<byte>(array, default(ForPrimitives)); if (NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost) { NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll(UniqueName, val, (NetworkDelivery)4); } else { NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("LC_API_RELAY_MESSAGE", LC_API.GameInterfaceAPI.Features.Player.HostPlayer.ClientId, val, (NetworkDelivery)4); } } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } public override void Read(ulong fakeSender, FastBufferReader reader) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)LC_API.GameInterfaceAPI.Features.Player.LocalPlayer == (Object)null || (Object)(object)LC_API.GameInterfaceAPI.Features.Player.HostPlayer == (Object)null) { ((MonoBehaviour)NetworkManager.Singleton).StartCoroutine(ReadLater(fakeSender, reader)); return; } byte[] bytes = default(byte[]); ((FastBufferReader)(ref reader)).ReadValueSafe<byte>(ref bytes, default(ForPrimitives)); NetworkMessageWrapper networkMessageWrapper = bytes.ToObject<NetworkMessageWrapper>(); if (RelayToSelf || LC_API.GameInterfaceAPI.Features.Player.LocalPlayer.ClientId != networkMessageWrapper.Sender) { OnReceived(networkMessageWrapper.Sender); } } private IEnumerator SendLater() { int timesWaited = 0; while ((Object)(object)LC_API.GameInterfaceAPI.Features.Player.LocalPlayer == (Object)null || (Object)(object)LC_API.GameInterfaceAPI.Features.Player.HostPlayer == (Object)null) { yield return (object)new WaitForSeconds(0.1f); timesWaited++; if (timesWaited % 20 == 0) { Plugin.Log.LogWarning((object)$"Waiting to send network message. Waiting on host?: {(Object)(object)LC_API.GameInterfaceAPI.Features.Player.HostPlayer == (Object)null} Waiting on local player?: {(Object)(object)LC_API.GameInterfaceAPI.Features.Player.LocalPlayer == (Object)null}"); } if (timesWaited >= 100) { Plugin.Log.LogError((object)"Dropping network message"); yield return null; } } Send(); } private IEnumerator ReadLater(ulong fakeSender, FastBufferReader reader) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) int timesWaited = 0; while ((Object)(object)LC_API.GameInterfaceAPI.Features.Player.LocalPlayer == (Object)null || (Object)(object)LC_API.GameInterfaceAPI.Features.Player.HostPlayer == (Object)null) { yield return (object)new WaitForSeconds(0.1f); timesWaited++; if (timesWaited % 20 == 0) { Plugin.Log.LogWarning((object)$"Waiting to read network message. Waiting on host?: {(Object)(object)LC_API.GameInterfaceAPI.Features.Player.HostPlayer == (Object)null} Waiting on local player?: {(Object)(object)LC_API.GameInterfaceAPI.Features.Player.LocalPlayer == (Object)null}"); } if (timesWaited >= 100) { Plugin.Log.LogError((object)"Dropping network message"); yield return null; } } Read(fakeSender, reader); } } internal class NetworkMessageFinalizer<T> : NetworkMessageFinalizerBase where T : class { internal override string UniqueName { get; } internal override bool RelayToSelf { get; } internal Action<ulong, T> OnReceived { get; } public NetworkMessageFinalizer(string uniqueName, bool relayToSelf, Action<ulong, T> onReceived) { UniqueName = uniqueName; RelayToSelf = relayToSelf; OnReceived = onReceived; } public void Send(T obj) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006f: 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_00bf: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)LC_API.GameInterfaceAPI.Features.Player.LocalPlayer == (Object)null || (Object)(object)LC_API.GameInterfaceAPI.Features.Player.HostPlayer == (Object)null) { ((MonoBehaviour)NetworkManager.Singleton).StartCoroutine(SendLater(obj)); return; } byte[] array = new NetworkMessageWrapper(UniqueName, LC_API.GameInterfaceAPI.Features.Player.LocalPlayer.ClientId, obj.ToBytes()).ToBytes(); FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(FastBufferWriter.GetWriteSize<byte>(array, -1, 0), (Allocator)2, -1); try { ((FastBufferWriter)(ref val)).WriteValueSafe<byte>(array, default(ForPrimitives)); if (NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost) { NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll(UniqueName, val, (NetworkDelivery)4); } else { NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("LC_API_RELAY_MESSAGE", LC_API.GameInterfaceAPI.Features.Player.HostPlayer.ClientId, val, (NetworkDelivery)4); } } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } public override void Read(ulong fakeSender, FastBufferReader reader) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)LC_API.GameInterfaceAPI.Features.Player.LocalPlayer == (Object)null || (Object)(object)LC_API.GameInterfaceAPI.Features.Player.HostPlayer == (Object)null) { ((MonoBehaviour)NetworkManager.Singleton).StartCoroutine(ReadLater(fakeSender, reader)); return; } byte[] bytes = default(byte[]); ((FastBufferReader)(ref reader)).ReadValueSafe<byte>(ref bytes, default(ForPrimitives)); NetworkMessageWrapper networkMessageWrapper = bytes.ToObject<NetworkMessageWrapper>(); if (RelayToSelf || LC_API.GameInterfaceAPI.Features.Player.LocalPlayer.ClientId != networkMessageWrapper.Sender) { OnReceived(networkMessageWrapper.Sender, networkMessageWrapper.Message.ToObject<T>()); } } private IEnumerator SendLater(T obj) { int timesWaited = 0; while ((Object)(object)LC_API.GameInterfaceAPI.Features.Player.LocalPlayer == (Object)null || (Object)(object)LC_API.GameInterfaceAPI.Features.Player.HostPlayer == (Object)null) { yield return (object)new WaitForSeconds(0.1f); timesWaited++; if (timesWaited % 20 == 0) { Plugin.Log.LogWarning((object)$"Waiting to send network message. Waiting on host?: {(Object)(object)LC_API.GameInterfaceAPI.Features.Player.HostPlayer == (Object)null} Waiting on local player?: {(Object)(object)LC_API.GameInterfaceAPI.Features.Player.LocalPlayer == (Object)null}"); } if (timesWaited >= 100) { Plugin.Log.LogError((object)"Dropping network message"); yield return null; } } Send(obj); } private IEnumerator ReadLater(ulong fakeSender, FastBufferReader reader) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) int timesWaited = 0; while ((Object)(object)LC_API.GameInterfaceAPI.Features.Player.LocalPlayer == (Object)null || (Object)(object)LC_API.GameInterfaceAPI.Features.Player.HostPlayer == (Object)null) { yield return (object)new WaitForSeconds(0.1f); timesWaited++; if (timesWaited % 20 == 0) { Plugin.Log.LogWarning((object)$"Waiting to read network message. Waiting on host?: {(Object)(object)LC_API.GameInterfaceAPI.Features.Player.HostPlayer == (Object)null} Waiting on local player?: {(Object)(object)LC_API.GameInterfaceAPI.Features.Player.LocalPlayer == (Object)null}"); } if (timesWaited >= 100) { Plugin.Log.LogError((object)"Dropping network message"); yield return null; } } Read(fakeSender, reader); } } internal class NetworkMessageWrapper { public string UniqueName { get; set; } public ulong Sender { get; set; } public byte[] Message { get; set; } internal NetworkMessageWrapper(string uniqueName, ulong sender) { UniqueName = uniqueName; Sender = sender; } internal NetworkMessageWrapper(string uniqueName, ulong sender, byte[] message) { UniqueName = uniqueName; Sender = sender; Message = message; } internal NetworkMessageWrapper() { } } internal static class RegisterPatch { internal static void Postfix() { Network.OnRegisterNetworkMessages(); } } internal static class UnregisterPatch { internal static void Postfix() { Network.OnUnregisterNetworkMessages(); } } } namespace LC_API.Networking.Serializers { public struct Vector2S { private Vector2? v2; public float x { get; set; } public float y { get; set; } [JsonIgnore] public Vector2 vector2 { get { //IL_002f: 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 (!v2.HasValue) { v2 = new Vector2(x, y); } return v2.Value; } } public Vector2S(float x, float y) { v2 = null; this.x = x; this.y = y; } public static implicit operator Vector2(Vector2S vector2S) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return vector2S.vector2; } public static implicit operator Vector2S(Vector2 vector2) { //IL_0000: 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) return new Vector2S(vector2.x, vector2.y); } } public struct Vector2IntS { private Vector2Int? v2; public int x { get; set; } public int y { get; set; } [JsonIgnore] public Vector2Int vector2 { get { //IL_002f: 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 (!v2.HasValue) { v2 = new Vector2Int(x, y); } return v2.Value; } } public Vector2IntS(int x, int y) { v2 = null; this.x = x; this.y = y; } public static implicit operator Vector2Int(Vector2IntS vector2S) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return vector2S.vector2; } public static implicit operator Vector2IntS(Vector2Int vector2) { return new Vector2IntS(((Vector2Int)(ref vector2)).x, ((Vector2Int)(ref vector2)).y); } } public struct Vector3S { private Vector3? v3; public float x { get; set; } public float y { get; set; } public float z { get; set; } [JsonIgnore] public Vector3 vector3 { get { //IL_0035: 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) if (!v3.HasValue) { v3 = new Vector3(x, y, z); } return v3.Value; } } public Vector3S(float x, float y, float z) { v3 = null; this.x = x; this.y = y; this.z = z; } public static implicit operator Vector3(Vector3S vector3S) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return vector3S.vector3; } public static implicit operator Vector3S(Vector3 vector3) { //IL_0000: 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) //IL_000c: Unknown result type (might be due to invalid IL or missing references) return new Vector3S(vector3.x, vector3.y, vector3.z); } } public struct Vector3IntS { private Vector3Int? v3; public int x { get; set; } public int y { get; set; } public int z { get; set; } [JsonIgnore] public Vector3Int vector3 { get { //IL_0035: 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) if (!v3.HasValue) { v3 = new Vector3Int(x, y, z); } return v3.Value; } } public Vector3IntS(int x, int y, int z) { v3 = null; this.x = x; this.y = y; this.z = z; } public static implicit operator Vector3Int(Vector3IntS vector3S) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return vector3S.vector3; } public static implicit operator Vector3IntS(Vector3Int vector3) { return new Vector3IntS(((Vector3Int)(ref vector3)).x, ((Vector3Int)(ref vector3)).y, ((Vector3Int)(ref vector3)).z); } } public struct Vector4S { private Vector4? v4; public float x { get; set; } public float y { get; set; } public float z { get; set; } public float w { get; set; } [JsonIgnore] public Vector4 Vector4 { get { //IL_003b: 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) if (!v4.HasValue) { v4 = new Vector4(x, y, z, w); } return v4.Value; } } public Vector4S(float x, float y, float z, float w) { v4 = null; this.x = x; this.y = y; this.z = z; this.w = w; } public static implicit operator Vector4(Vector4S vector4S) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return vector4S.Vector4; } public static implicit operator Vector4S(Vector4 vector4) { //IL_0000: 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) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) return new Vector4S(vector4.x, vector4.y, vector4.z, vector4.w); } } public struct QuaternionS { private Quaternion? q; public float x { get; set; } public float y { get; set; } public float z { get; set; } public float w { get; set; } [JsonIgnore] public Quaternion Quaternion { get { //IL_003b: 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) if (!q.HasValue) { q = new Quaternion(x, y, z, w); } return q.Value; } } public QuaternionS(float x, float y, float z, float w) { q = null; this.x = x; this.y = y; this.z = z; this.w = w; } public static implicit operator Quaternion(QuaternionS quaternionS) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return quaternionS.Quaternion; } public static implicit operator QuaternionS(Quaternion quaternion) { //IL_0000: 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) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) return new QuaternionS(quaternion.x, quaternion.y, quaternion.z, quaternion.w); } } public struct ColorS { private Color? c; public float r { get; set; } public float g { get; set; } public float b { get; set; } public float a { get; set; } [JsonIgnore] public Color Color { get { //IL_003b: 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) if (!c.HasValue) { c = new Color(r, g, b, a); } return c.Value; } } public ColorS(float r, float g, float b, float a) { c = null; this.r = r; this.g = g; this.b = b; this.a = a; } public static implicit operator Color(ColorS colorS) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return colorS.Color; } public static implicit operator ColorS(Color color) { //IL_0000: 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) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) return new ColorS(color.r, color.g, color.b, color.a); } } public struct Color32S { private Color32? c; public byte r { get; set; } public byte g { get; set; } public byte b { get; set; } public byte a { get; set; } [JsonIgnore] public Color32 Color { get { //IL_003b: 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) if (!c.HasValue) { c = new Color32(r, g, b, a); } return c.Value; } } public Color32S(byte r, byte g, byte b, byte a) { c = null; this.r = r; this.g = g; this.b = b; this.a = a; } public static implicit operator Color32(Color32S colorS) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return colorS.Color; } public static implicit operator Color32S(Color32 color) { //IL_0000: 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) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) return new Color32S(color.r, color.g, color.b, color.a); } } public struct RayS { private Ray? r; public Vector3S origin { get; set; } public Vector3S direction { get; set; } [JsonIgnore] public Ray Ray { get { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_0024: Unknown result type (might be due to invalid IL or missing references) if (!r.HasValue) { r = new Ray((Vector3)origin, (Vector3)direction); } return r.Value; } } public RayS(Vector3 origin, Vector3 direction) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) r = null; this.origin = origin; this.direction = direction; } public static implicit operator Ray(RayS rayS) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return rayS.Ray; } public static implicit operator RayS(Ray ray) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) return new RayS(((Ray)(ref ray)).origin, ((Ray)(ref ray)).direction); } } public struct Ray2DS { private Ray2D? r; public Vector2S origin { get; set; } public Vector2S direction { get; set; } [JsonIgnore] public Ray2D Ray { get { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_0024: Unknown result type (might be due to invalid IL or missing references) if (!r.HasValue) { r = new Ray2D((Vector2)origin, (Vector2)direction); } return r.Value; } } public Ray2DS(Vector2 origin, Vector2 direction) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) r = null; this.origin = origin; this.direction = direction; } public static implicit operator Ray2D(Ray2DS ray2DS) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return ray2DS.Ray; } public static implicit operator Ray2DS(Ray2D ray2D) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) return new Ray2DS(((Ray2D)(ref ray2D)).origin, ((Ray2D)(ref ray2D)).direction); } } } namespace LC_API.ManualPatches { internal static class ServerPatch { internal static bool OnLobbyCreate(GameNetworkManager __instance, Result result, Lobby lobby) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0009: Unknown result type (might be due to invalid IL or missing references) if ((int)result != 1) { Debug.LogError((object)$"Lobby could not be created! {result}", (Object)(object)__instance); } __instance.lobbyHostSettings.lobbyName = "[MODDED]" + __instance.lobbyHostSettings.lobbyName.ToString(); Plugin.Log.LogMessage((object)"server pre-setup success"); return true; } internal static bool CacheMenuManager(MenuManager __instance) { LC_APIManager.MenuManager = __instance; return true; } internal static bool ChatCommands(HUDManager __instance, CallbackContext context) { if (__instance.chatTextField.text.ToLower().Contains("/modcheck")) { CheatDatabase.OtherPlayerCheatDetector(); return false; } return true; } internal static void GameNetworkManagerAwake(GameNetworkManager __instance) { if ((Object)(object)GameNetworkManager.Instance == (Object)null) { ModdedServer.GameVersion = __instance.gameVersionNum; } } } } namespace LC_API.GameInterfaceAPI { public static class GameState { private static readonly Action NothingAction = delegate { }; public static int AlivePlayerCount { get; private set; } public static ShipState ShipState { get; private set; } public static event Action PlayerDied; public static event Action LandOnMoon; public static event Action WentIntoOrbit; public static event Action ShipStartedLeaving; internal static void GSUpdate() { if (!((Object)(object)StartOfRound.Instance == (Object)null)) { if (StartOfRound.Instance.shipHasLanded && ShipState != ShipState.OnMoon) { ShipState = ShipState.OnMoon; GameState.LandOnMoon.InvokeActionSafe(); } if (StartOfRound.Instance.inShipPhase && ShipState != 0) { ShipState = ShipState.InOrbit; GameState.WentIntoOrbit.InvokeActionSafe(); } if (StartOfRound.Instance.shipIsLeaving && ShipState != ShipState.LeavingMoon) { ShipState = ShipState.LeavingMoon; GameState.ShipStartedLeaving.InvokeActionSafe(); } if (AlivePlayerCount < StartOfRound.Instance.livingPlayers) { GameState.PlayerDied.InvokeActionSafe(); } AlivePlayerCount = StartOfRound.Instance.livingPlayers; } } static GameState() { GameState.PlayerDied = NothingAction; GameState.LandOnMoon = NothingAction; GameState.WentIntoOrbit = NothingAction; GameState.ShipStartedLeaving = NothingAction; } } [Obsolete("Use Player::QueueTip instead.")] public class GameTips { private static List<string> tipHeaders = new List<string>(); private static List<string> tipBodys = new List<string>(); private static float lastMessageTime; public static void ShowTip(string header, string body) { tipHeaders.Add(header); tipBodys.Add(body); } public static void UpdateInternal() { lastMessageTime -= Time.deltaTime; if ((tipHeaders.Count > 0) & (lastMessageTime < 0f)) { lastMessageTime = 5f; if ((Object)(object)HUDManager.Instance != (Object)null) { HUDManager.Instance.DisplayTip(tipHeaders[0], tipBodys[0], false, false, "LC_Tip1"); } tipHeaders.RemoveAt(0); tipBodys.RemoveAt(0); } } } } namespace LC_API.GameInterfaceAPI.Features { public class Item : NetworkBehaviour { private bool hasNewProps; internal static GameObject ItemNetworkPrefab { get; set; } public static Dictionary<GrabbableObject, Item> Dictionary { get; } = new Dictionary<GrabbableObject, Item>(); public static IReadOnlyCollection<Item> List => Dictionary.Values; public GrabbableObject GrabbableObject { get; private set; } public Item ItemProperties => GrabbableObject.itemProperties; public ScanNodeProperties ScanNodeProperties { get; set; } public bool IsHeld => GrabbableObject.isHeld; public bool IsTwoHanded => ItemProperties.twoHanded; public Player Holder { get { if (!IsHeld) { return null; } if (!Player.Dictionary.TryGetValue(GrabbableObject.playerHeldBy, out var value)) { return null; } return value; } } public string Name { get { return ItemProperties.itemName; } set { if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to set item name on client."); } string oldName = ItemProperties.itemName.ToLower(); CloneProperties(); ItemProperties.itemName = value; OverrideTooltips(oldName, value.ToLower()); ScanNodeProperties.headerText = value; SetGrabbableNameClientRpc(value); } } public Vector3 Position { get { //IL_000b: Unknown result type (might be due to invalid IL or missing references) return ((Component)GrabbableObject).transform.position; } set { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to set item position on client."); } GrabbableObject.startFallingPosition = value; GrabbableObject.targetFloorPosition = value; ((Component)GrabbableObject).transform.position = value; SetItemPositionClientRpc(value); } } public Quaternion Rotation { get { //IL_000b: Unknown result type (might be due to invalid IL or missing references) return ((Component)GrabbableObject).transform.rotation; } set { //IL_000b: Unknown result type (might be due to invalid IL or missing references) ((Component)GrabbableObject).transform.rotation = value; } } public Vector3 Scale { get { //IL_000b: Unknown result type (might be due to invalid IL or missing references) return ((Component)GrabbableObject).transform.localScale; } set { //IL_000b: Unknown result type (might be due to invalid IL or missing references) ((Component)GrabbableObject).transform.localScale = value; } } public bool IsScrap { get { return ItemProperties.isScrap; } set { if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to set item name on client."); } CloneProperties(); ItemProperties.isScrap = value; SetIsScrapClientRpc(value); } } public int ScrapValue { get { return GrabbableObject.scrapValue; } set { if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to set scrap value on client."); } GrabbableObject.SetScrapValue(value); SetScrapValueClientRpc(value); } } [ClientRpc] private void SetGrabbableNameClientRpc(string name) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0088: 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_00ba: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(66243798u, val, (RpcDelivery)0); bool flag = name != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe(name, false); } ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 66243798u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { string oldName = ItemProperties.itemName.ToLower(); CloneProperties(); ItemProperties.itemName = name; OverrideTooltips(oldName, name.ToLower()); ScanNodeProperties.headerText = name; } } private void OverrideTooltips(string oldName, string newName) { for (int i = 0; i < ItemProperties.toolTips.Length; i++) { ItemProperties.toolTips[i] = ItemProperties.toolTips[i].ReplaceWithCase(oldName, newName); } if (IsHeld && (Object)(object)Holder == (Object)(object)Player.LocalPlayer) { GrabbableObject.SetControlTipsForItem(); } } [ClientRpc] private void SetItemPositionClientRpc(Vector3 pos) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(949135576u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref pos); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 949135576u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { GrabbableObject.startFallingPosition = pos; GrabbableObject.targetFloorPosition = pos; ((Component)GrabbableObject).transform.position = pos; } } } public void SetAndSyncRotation(Quaternion rotation) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to sync item rotation from client."); } SetItemRotationClientRpc(rotation); } [ClientRpc] private void SetItemRotationClientRpc(Quaternion rotation) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1528367091u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref rotation); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1528367091u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { Rotation = rotation; } } } public void SetAndSyncScale(Vector3 scale) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to sync item scale from client."); } SetItemScaleClientRpc(scale); } [ClientRpc] private void SetItemScaleClientRpc(Vector3 scale) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2688253945u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref scale); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2688253945u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { Scale = scale; } } } [ClientRpc] private void SetIsScrapClientRpc(bool isScrap) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(4227417717u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref isScrap, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 4227417717u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { CloneProperties(); ItemProperties.isScrap = isScrap; } } } [ClientRpc] private void SetScrapValueClientRpc(int scrapValue) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3866863385u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, scrapValue); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3866863385u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { GrabbableObject.SetScrapValue(scrapValue); } } } public void RemoveFromHolder(Vector3 position = default(Vector3), Quaternion rotation = default(Quaternion)) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to remove item from player on client."); } if (IsHeld) { ((NetworkBehaviour)this).NetworkObject.RemoveOwnership(); Holder.Inventory.RemoveItem(this); RemoveFromHolderClientRpc(); Position = position; Rotation = rotation; } } [ClientRpc] private void RemoveFromHolderClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1050513218u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1050513218u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && IsHeld) { Holder.Inventory.RemoveItem(this); } } } public void EnablePhysics(bool enable) { GrabbableObject.EnablePhysics(enable); } public void EnableMeshes(bool enable) { GrabbableObject.EnableItemMeshes(enable); } public void FallToGround(bool randomizePosition = false) { GrabbableObject.FallToGround(randomizePosition); } public bool PocketItem() { if (!IsHeld || (Object)(object)Holder.HeldItem != (Object)(object)this || IsTwoHanded) { return false; } GrabbableObject.PocketItem(); return true; } public bool GiveTo(Player player, bool switchTo = true) { if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to give item to player on client."); } return player.Inventory.TryAddItem(this, switchTo); } public void InitializeScrap() { if (RoundManager.Instance.AnomalyRandom != null) { InitializeScrap((int)((float)RoundManager.Instance.AnomalyRandom.Next(ItemProperties.minValue, ItemProperties.maxValue) * RoundManager.Instance.scrapValueMultiplier)); } else { InitializeScrap((int)((float)Random.Range(ItemProperties.minValue, ItemProperties.maxValue) * RoundManager.Instance.scrapValueMultiplier)); } } public void InitializeScrap(int scrapValue) { if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to initialize scrap on client."); } ScrapValue = scrapValue; InitializeScrapClientRpc(); } [ClientRpc] private void InitializeScrapClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1334565671u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1334565671u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } MeshFilter val3 = default(MeshFilter); if (((Component)GrabbableObject).gameObject.TryGetComponent<MeshFilter>(ref val3) && ItemProperties.meshVariants != null && ItemProperties.meshVariants.Length != 0) { if (RoundManager.Instance.ScrapValuesRandom != null) { val3.mesh = ItemProperties.meshVariants[RoundManager.Instance.ScrapValuesRandom.Next(ItemProperties.meshVariants.Length)]; } else { val3.mesh = ItemProperties.meshVariants[0]; } } MeshRenderer val4 = default(MeshRenderer); if (((Component)GrabbableObject).gameObject.TryGetComponent<MeshRenderer>(ref val4) && ItemProperties.materialVariants != null && ItemProperties.materialVariants.Length != 0) { if (RoundManager.Instance.ScrapValuesRandom != null) { ((Renderer)val4).sharedMaterial = ItemProperties.materialVariants[RoundManager.Instance.ScrapValuesRandom.Next(ItemProperties.materialVariants.Length)]; } else { ((Renderer)val4).sharedMaterial = ItemProperties.materialVariants[0]; } } } public static Item CreateAndSpawnItem(string itemName, bool andInitialize = true, Vector3 position = default(Vector3), Quaternion rotation = default(Quaternion)) { //IL_006c: 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) if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to create and spawn item on client."); } string name = itemName.ToLower(); GameObject val = ((IEnumerable<Item>)StartOfRound.Instance.allItemsList.itemsList).FirstOrDefault((Func<Item, bool>)((Item i) => i.itemName.ToLower().Contains(name)))?.spawnPrefab; if ((Object)(object)val != (Object)null) { GameObject obj = Object.Instantiate<GameObject>(val, position, rotation); obj.GetComponent<NetworkObject>().Spawn(false); Item component = obj.GetComponent<Item>(); if (component.IsScrap && andInitialize) { component.InitializeScrap(); } return component; } return null; } public static Item CreateAndGiveItem(string itemName, Player player, bool andInitialize = true, bool switchTo = true) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to create and give item on client."); } string name = itemName.ToLower(); GameObject val = ((IEnumerable<Item>)StartOfRound.Instance.allItemsList.itemsList).FirstOrDefault((Func<Item, bool>)((Item i) => i.itemName.ToLower().Contains(name)))?.spawnPrefab; if ((Object)(object)val != (Object)null) { GameObject obj = Object.Instantiate<GameObject>(val, Vector3.zero, default(Quaternion)); obj.GetComponent<NetworkObject>().Spawn(false); Item component = obj.GetComponent<Item>(); if (component.IsScrap && andInitialize) { component.InitializeScrap(); } component.GiveTo(player, switchTo); return component; } return null; } private void Awake() { GrabbableObject = ((Component)this).GetComponent<GrabbableObject>(); ScanNodeProperties = ((Component)GrabbableObject).gameObject.GetComponentInChildren<ScanNodeProperties>(); Dictionary.Add(GrabbableObject, this); } private void CloneProperties() { Item itemProperties = Object.Instantiate<Item>(ItemProperties); if (hasNewProps) { Object.Destroy((Object)(object)ItemProperties); } GrabbableObject.itemProperties = itemProperties; hasNewProps = true; } public override void OnDestroy() { Dictionary.Remove(GrabbableObject); ((NetworkBehaviour)this).OnDestroy(); } public static Item GetOrAdd(GrabbableObject grabbableObject) { if (Dictionary.TryGetValue(grabbableObject, out var value)) { return value; } return ((Component)grabbableObject).gameObject.AddComponent<Item>(); } public static Item Get(GrabbableObject grabbableObject) { if (Dictionary.TryGetValue(grabbableObject, out var value)) { return value; } return null; } public static bool TryGet(GrabbableObject grabbableObject, out Item item) { return Dictionary.TryGetValue(grabbableObject, out item); } public static Item Get(ulong netId) { return List.FirstOrDefault((Item i) => ((NetworkBehaviour)i).NetworkObjectId == netId); } public static bool TryGet(ulong netId, out Item item) { item = Get(netId); return (Object)(object)item != (Object)null; } protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_Item() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(66243798u, new RpcReceiveHandler(__rpc_handler_66243798)); NetworkManager.__rpc_func_table.Add(949135576u, new RpcReceiveHandler(__rpc_handler_949135576)); NetworkManager.__rpc_func_table.Add(1528367091u, new RpcReceiveHandler(__rpc_handler_1528367091)); NetworkManager.__rpc_func_table.Add(2688253945u, new RpcReceiveHandler(__rpc_handler_2688253945)); NetworkManager.__rpc_func_table.Add(4227417717u, new RpcReceiveHandler(__rpc_handler_4227417717)); NetworkManager.__rpc_func_table.Add(3866863385u, new RpcReceiveHandler(__rpc_handler_3866863385)); NetworkManager.__rpc_func_table.Add(1050513218u, new RpcReceiveHandler(__rpc_handler_1050513218)); NetworkManager.__rpc_func_table.Add(1334565671u, new RpcReceiveHandler(__rpc_handler_1334565671)); } private static void __rpc_handler_66243798(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives)); string grabbableNameClientRpc = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe(ref grabbableNameClientRpc, false); } target.__rpc_exec_stage = (__RpcExecStage)2; ((Item)(object)target).SetGrabbableNameClientRpc(grabbableNameClientRpc); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_949135576(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { Vector3 itemPositionClientRpc = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref itemPositionClientRpc); target.__rpc_exec_stage = (__RpcExecStage)2; ((Item)(object)target).SetItemPositionClientRpc(itemPositionClientRpc); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1528367091(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { Quaternion itemRotationClientRpc = default(Quaternion); ((FastBufferReader)(ref reader)).ReadValueSafe(ref itemRotationClientRpc); target.__rpc_exec_stage = (__RpcExecStage)2; ((Item)(object)target).SetItemRotationClientRpc(itemRotationClientRpc); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_2688253945(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { Vector3 itemScaleClientRpc = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref itemScaleClientRpc); target.__rpc_exec_stage = (__RpcExecStage)2; ((Item)(object)target).SetItemScaleClientRpc(itemScaleClientRpc); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_4227417717(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool isScrapClientRpc = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref isScrapClientRpc, default(ForPrimitives)); target.__rpc_exec_stage = (__RpcExecStage)2; ((Item)(object)target).SetIsScrapClientRpc(isScrapClientRpc); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3866863385(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int scrapValueClientRpc = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref scrapValueClientRpc); target.__rpc_exec_stage = (__RpcExecStage)2; ((Item)(object)target).SetScrapValueClientRpc(scrapValueClientRpc); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1050513218(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)2; ((Item)(object)target).RemoveFromHolderClientRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1334565671(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)2; ((Item)(object)target).InitializeScrapClientRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } [MethodImpl(MethodImplOptions.NoInlining)] protected internal override string __getTypeName() { return "Item"; } } public class Player : NetworkBehaviour { public class PlayerInventory : NetworkBehaviour { public Player Player { get; private set; } public Item[] Items => Player.PlayerController.ItemSlots.Select((GrabbableObject i) => (!((Object)(object)i != (Object)null)) ? null : Item.Dictionary[i]).ToArray(); public int CurrentSlot { get { return Player.PlayerController.currentItemSlot; } set { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) if (Player.IsLocalPlayer) { SetSlotServerRpc(value); } else if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { SetSlotClientRpc(value); } } } [ServerRpc(RequireOwnership = false)] private void SetSlotServerRpc(int slot, ServerRpcParams serverRpcParams = default(ServerRpcParams)) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { FastBufferWriter val = ((NetworkBehaviour)this).__beginSendServerRpc(1475903090u, serverRpcParams, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val, slot); ((NetworkBehaviour)this).__endSendServerRpc(ref val, 1475903090u, serverRpcParams, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && serverRpcParams.Receive.SenderClientId == Player.ClientId) { SetSlotClientRpc(slot); } } } [ClientRpc] private void SetSlotClientRpc(int slot) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2977994897u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, slot); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2977994897u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { Player.PlayerController.SwitchToItemSlot(slot, (GrabbableObject)null); } } } public int GetFirstEmptySlot() { return Player.PlayerController.FirstEmptyItemSlot(); } public bool TryGetFirstEmptySlot(out int slot) { slot = Player.PlayerController.FirstEmptyItemSlot(); return slot != -1; } public bool TryAddItem(Item item, bool switchTo = true) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to add item from client."); } if (TryGetFirstEmptySlot(out var slot)) { if (item.IsTwoHanded && !Player.HasFreeHands) { return false; } if (item.IsHeld) { item.RemoveFromHolder(); } ((NetworkBehaviour)item).NetworkObject.ChangeOwnership(Player.ClientId); if (item.IsTwoHanded) { SetSlotAndItemClientRpc(slot, ((NetworkBehaviour)item).NetworkObjectId); } else if (switchTo && Player.HasFreeHands) { SetSlotAndItemClientRpc(slot, ((NetworkBehaviour)item).NetworkObjectId); } else if (Player.PlayerController.currentItemSlot == slot) { SetSlotAndItemClientRpc(slot, ((NetworkBehaviour)item).NetworkObjectId); } else { SetItemInSlotClientRpc(slot, ((NetworkBehaviour)item).NetworkObjectId); } return true; } return false; } public bool TryAddItemToSlot(Item item, int slot, bool switchTo = true) { //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { throw new NoAuthorityException("Tried to add item from client."); } if (slot < Player.PlayerController.ItemSlots.Length && (Object)(object)Player.PlayerController.ItemSlots[slot] == (Object)null) { if (item.IsTwoHanded && !Player.HasFreeHands) { return false; }
BepInEx/plugins/BepInEx-BepInEx_MLLoader/BepInEx.MelonLoader.Loader/AssetRipper.VersionUtilities.dll.old
Decompiled 8 months agousing System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using AssetRipper.VersionUtilities.Extensions; using Microsoft.CodeAnalysis; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: InternalsVisibleTo("VersionUtilities.Tests")] [assembly: AssemblyCompany("AssetRipper")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright (c) 2022 ds5678")] [assembly: AssemblyDescription("Managed library for handling Unity versions")] [assembly: AssemblyFileVersion("1.2.1.0")] [assembly: AssemblyInformationalVersion("1.2.1.0")] [assembly: AssemblyProduct("AssetRipper.VersionUtilities")] [assembly: AssemblyTitle("AssetRipper.VersionUtilities")] [assembly: AssemblyVersion("1.2.1.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace AssetRipper.VersionUtilities { public struct CompactUnityVersion24 : IEquatable<CompactUnityVersion24>, IComparable, IComparable<CompactUnityVersion24> { private const int majorOffset = 3; private const int buildOffset = 9; private const int typeOffset = 6; private const uint bitMask3 = 7u; private const uint bitMask5 = 31u; private const uint bitMask6 = 63u; private const uint bitMask7 = 127u; private readonly byte m_MajorMinorByte; private readonly ushort m_BuildTypeShort; public const ushort MajorMaxValue = 2042; private byte MajorRaw => (byte)((ulong)(m_MajorMinorByte >> 3) & 0x1FuL); public ushort Major => ConvertMajorRawToNormal(MajorRaw); public byte Minor => (byte)(m_MajorMinorByte & 7u); public byte Build => (byte)((ulong)(m_BuildTypeShort >> 9) & 0x7FuL); public UnityVersionType Type => (UnityVersionType)((ulong)(m_BuildTypeShort >> 6) & 7uL); public byte TypeNumber => (byte)(m_BuildTypeShort & 0x3Fu); public static CompactUnityVersion24 MinVersion { get; } = new CompactUnityVersion24((byte)0, (ushort)0); public static CompactUnityVersion24 MaxVersion { get; } = new CompactUnityVersion24(byte.MaxValue, ushort.MaxValue); public CompactUnityVersion24(ushort major) { m_MajorMinorByte = (byte)(ConvertMajorRawToNormal(major) << 3); m_BuildTypeShort = 0; } public CompactUnityVersion24(ushort major, byte minor) { m_MajorMinorByte = (byte)((ConvertMajorRawToNormal(major) << 3) | CastToThreeBits(minor)); m_BuildTypeShort = 0; } public CompactUnityVersion24(ushort major, byte minor, byte build) { m_MajorMinorByte = (byte)((ConvertMajorRawToNormal(major) << 3) | CastToThreeBits(minor)); m_BuildTypeShort = (ushort)(CastToSevenBits(build) << 9); } public CompactUnityVersion24(ushort major, byte minor, byte build, UnityVersionType type) { m_MajorMinorByte = (byte)((ConvertMajorRawToNormal(major) << 3) | CastToThreeBits(minor)); m_BuildTypeShort = (ushort)((CastToSevenBits(build) << 9) | (CastToThreeBits((byte)type) << 6)); } public CompactUnityVersion24(ushort major, byte minor, byte build, UnityVersionType type, byte typeNumber) { m_MajorMinorByte = (byte)((ConvertMajorRawToNormal(major) << 3) | CastToThreeBits(minor)); m_BuildTypeShort = (ushort)((CastToSevenBits(build) << 9) | (CastToThreeBits((byte)type) << 6) | CastToSixBits(typeNumber)); } private CompactUnityVersion24(byte majorMinorByte, ushort buildTypeShort) { m_MajorMinorByte = majorMinorByte; m_BuildTypeShort = buildTypeShort; } public void GetBits(out byte majorMinorByte, out ushort buildTypeShort) { majorMinorByte = m_MajorMinorByte; buildTypeShort = m_BuildTypeShort; } public static CompactUnityVersion24 FromBits(byte majorMinorByte, ushort buildTypeShort) { return new CompactUnityVersion24(majorMinorByte, buildTypeShort); } private static ushort ConvertMajorRawToNormal(byte raw) { if (raw >= 6) { return (ushort)(raw + 2011); } return raw; } private static byte ConvertMajorRawToNormal(ushort major) { if (major < 6) { return (byte)major; } if (major >= 2017 && major <= 2042) { return (byte)(major - 2011); } throw new ArgumentOutOfRangeException("major"); } private static byte CastToThreeBits(byte b) { if ((uint)b > 7u) { throw new ArgumentOutOfRangeException("b"); } return b; } private static byte CastToSixBits(byte b) { if ((uint)b > 63u) { throw new ArgumentOutOfRangeException("b"); } return b; } private static byte CastToSevenBits(byte b) { if ((uint)b > 127u) { throw new ArgumentOutOfRangeException("b"); } return b; } public override string ToString() { return $"{Major}.{Minor}.{Build}{Type.ToCharacter()}{TypeNumber}"; } public int CompareTo(object? obj) { if (!(obj is CompactUnityVersion24 other)) { return 1; } return CompareTo(other); } public int CompareTo(CompactUnityVersion24 other) { if (this > other) { return 1; } if (this < other) { return -1; } return 0; } public override bool Equals(object? obj) { if (obj is CompactUnityVersion24 compactUnityVersion) { return this == compactUnityVersion; } return false; } public bool Equals(CompactUnityVersion24 other) { return this == other; } public override int GetHashCode() { return (m_MajorMinorByte << 16) | m_BuildTypeShort; } public static implicit operator UnityVersion(CompactUnityVersion24 version) { return new UnityVersion(version.Major, version.Minor, version.Build, version.Type, version.TypeNumber); } public static implicit operator CompactUnityVersion32(CompactUnityVersion24 version) { return new CompactUnityVersion32(version.Major, version.Minor, version.Build, version.Type, version.TypeNumber); } public static explicit operator CompactUnityVersion24(UnityVersion version) { return new CompactUnityVersion24(version.Major, (byte)version.Minor, (byte)version.Build, version.Type, version.TypeNumber); } public static explicit operator CompactUnityVersion24(CompactUnityVersion32 version) { return new CompactUnityVersion24(version.Major, version.Minor, version.Build, version.Type, version.TypeNumber); } public static bool operator ==(CompactUnityVersion24 left, CompactUnityVersion24 right) { if (left.m_MajorMinorByte == right.m_MajorMinorByte) { return left.m_BuildTypeShort == right.m_BuildTypeShort; } return false; } public static bool operator !=(CompactUnityVersion24 left, CompactUnityVersion24 right) { if (left.m_MajorMinorByte == right.m_MajorMinorByte) { return left.m_BuildTypeShort != right.m_BuildTypeShort; } return true; } public static bool operator >(CompactUnityVersion24 left, CompactUnityVersion24 right) { if (left.m_MajorMinorByte <= right.m_MajorMinorByte) { if (left.m_MajorMinorByte == right.m_MajorMinorByte) { return left.m_BuildTypeShort > right.m_BuildTypeShort; } return false; } return true; } public static bool operator >=(CompactUnityVersion24 left, CompactUnityVersion24 right) { if (left.m_MajorMinorByte <= right.m_MajorMinorByte) { if (left.m_MajorMinorByte == right.m_MajorMinorByte) { return left.m_BuildTypeShort >= right.m_BuildTypeShort; } return false; } return true; } public static bool operator <(CompactUnityVersion24 left, CompactUnityVersion24 right) { if (left.m_MajorMinorByte >= right.m_MajorMinorByte) { if (left.m_MajorMinorByte == right.m_MajorMinorByte) { return left.m_BuildTypeShort < right.m_BuildTypeShort; } return false; } return true; } public static bool operator <=(CompactUnityVersion24 left, CompactUnityVersion24 right) { if (left.m_MajorMinorByte >= right.m_MajorMinorByte) { if (left.m_MajorMinorByte == right.m_MajorMinorByte) { return left.m_BuildTypeShort <= right.m_BuildTypeShort; } return false; } return true; } } public struct CompactUnityVersion32 : IEquatable<CompactUnityVersion32>, IComparable, IComparable<CompactUnityVersion32> { private const int majorOffset = 24; private const int minorOffset = 20; private const int buildOffset = 12; private const int typeOffset = 8; private const uint byteMask = 255u; private const uint bitMask4 = 15u; private readonly uint m_data; public const ushort MajorMaxValue = 2266; private byte MajorRaw => (byte)((m_data >> 24) & 0xFFu); public ushort Major => ConvertMajorRawToNormal(MajorRaw); public byte Minor => (byte)((m_data >> 20) & 0xFu); public byte Build => (byte)((m_data >> 12) & 0xFFu); public UnityVersionType Type => (UnityVersionType)((m_data >> 8) & 0xFu); public byte TypeNumber => (byte)(m_data & 0xFFu); public static CompactUnityVersion32 MinVersion { get; } = new CompactUnityVersion32(0u); public static CompactUnityVersion32 MaxVersion { get; } = new CompactUnityVersion32(uint.MaxValue); public CompactUnityVersion32(ushort major) { m_data = (uint)(ConvertMajorRawToNormal(major) << 24); } public CompactUnityVersion32(ushort major, byte minor) { m_data = (uint)((ConvertMajorRawToNormal(major) << 24) | (CastToFourBits(minor) << 20)); } public CompactUnityVersion32(ushort major, byte minor, byte build) { m_data = (uint)((ConvertMajorRawToNormal(major) << 24) | (CastToFourBits(minor) << 20) | (build << 12)); } public CompactUnityVersion32(ushort major, byte minor, byte build, UnityVersionType type) { m_data = (uint)((ConvertMajorRawToNormal(major) << 24) | (CastToFourBits(minor) << 20) | (build << 12)) | ((uint)CastToFourBits(type) << 8); } public CompactUnityVersion32(ushort major, byte minor, byte build, UnityVersionType type, byte typeNumber) { m_data = (uint)((ConvertMajorRawToNormal(major) << 24) | (CastToFourBits(minor) << 20) | (build << 12)) | ((uint)CastToFourBits(type) << 8) | typeNumber; } private CompactUnityVersion32(uint data) { m_data = data; } public uint GetBits() { return m_data; } public static CompactUnityVersion32 FromBits(uint bits) { return new CompactUnityVersion32(bits); } private static ushort ConvertMajorRawToNormal(byte raw) { if (raw >= 6) { return (ushort)(raw + 2011); } return raw; } private static byte ConvertMajorRawToNormal(ushort major) { if (major < 6) { return (byte)major; } if (major >= 2017 && major <= 2266) { return (byte)(major - 2011); } throw new ArgumentOutOfRangeException("major"); } private static byte CastToFourBits(byte b) { if ((uint)b > 15u) { throw new ArgumentOutOfRangeException("b"); } return b; } private static UnityVersionType CastToFourBits(UnityVersionType type) { if (type > (UnityVersionType)15) { throw new ArgumentOutOfRangeException("type"); } return type; } public override string ToString() { return $"{Major}.{Minor}.{Build}{Type.ToCharacter()}{TypeNumber}"; } public int CompareTo(object? obj) { if (!(obj is CompactUnityVersion32 other)) { return 1; } return CompareTo(other); } public int CompareTo(CompactUnityVersion32 other) { if (this > other) { return 1; } if (this < other) { return -1; } return 0; } public override bool Equals(object? obj) { if (obj is CompactUnityVersion32 compactUnityVersion) { return this == compactUnityVersion; } return false; } public bool Equals(CompactUnityVersion32 other) { return this == other; } public override int GetHashCode() { uint data = m_data; return data.GetHashCode(); } public static implicit operator UnityVersion(CompactUnityVersion32 version) { return new UnityVersion(version.Major, version.Minor, version.Build, version.Type, version.TypeNumber); } public static explicit operator CompactUnityVersion32(UnityVersion version) { return new CompactUnityVersion32(version.Major, (byte)version.Minor, (byte)version.Build, version.Type, version.TypeNumber); } public static bool operator ==(CompactUnityVersion32 left, CompactUnityVersion32 right) { return left.m_data == right.m_data; } public static bool operator !=(CompactUnityVersion32 left, CompactUnityVersion32 right) { return left.m_data != right.m_data; } public static bool operator >(CompactUnityVersion32 left, CompactUnityVersion32 right) { return left.m_data > right.m_data; } public static bool operator >=(CompactUnityVersion32 left, CompactUnityVersion32 right) { return left.m_data >= right.m_data; } public static bool operator <(CompactUnityVersion32 left, CompactUnityVersion32 right) { return left.m_data < right.m_data; } public static bool operator <=(CompactUnityVersion32 left, CompactUnityVersion32 right) { return left.m_data <= right.m_data; } } public readonly struct UnityVersion : IEquatable<UnityVersion>, IComparable, IComparable<UnityVersion> { private const ulong subMajorMask = 281474976710655uL; private const ulong subMinorMask = 4294967295uL; private const ulong subBuildMask = 65535uL; private const ulong subTypeMask = 255uL; private const int majorOffset = 48; private const int minorOffset = 32; private const int buildOffset = 16; private const int typeOffset = 8; private const ulong byteMask = 255uL; private const ulong ushortMask = 65535uL; private readonly ulong m_data; public ushort Major => (ushort)((m_data >> 48) & 0xFFFF); public ushort Minor => (ushort)((m_data >> 32) & 0xFFFF); public ushort Build => (ushort)((m_data >> 16) & 0xFFFF); public UnityVersionType Type => (UnityVersionType)((m_data >> 8) & 0xFF); public byte TypeNumber => (byte)(m_data & 0xFF); public static UnityVersion MinVersion { get; } = new UnityVersion(0uL); public static UnityVersion MaxVersion { get; } = new UnityVersion(ulong.MaxValue); public bool IsEqual(ushort major) { return this == From(major); } public bool IsEqual(ushort major, ushort minor) { return this == From(major, minor); } public bool IsEqual(ushort major, ushort minor, ushort build) { return this == From(major, minor, build); } public bool IsEqual(ushort major, ushort minor, ushort build, UnityVersionType type) { return this == From(major, minor, build, type); } public bool IsEqual(ushort major, ushort minor, ushort build, UnityVersionType type, byte typeNumber) { return this == new UnityVersion(major, minor, build, type, typeNumber); } public bool IsEqual(string version) { return this == Parse(version); } public bool IsLess(ushort major) { return this < From(major); } public bool IsLess(ushort major, ushort minor) { return this < From(major, minor); } public bool IsLess(ushort major, ushort minor, ushort build) { return this < From(major, minor, build); } public bool IsLess(ushort major, ushort minor, ushort build, UnityVersionType type) { return this < From(major, minor, build, type); } public bool IsLess(ushort major, ushort minor, ushort build, UnityVersionType type, byte typeNumber) { return this < new UnityVersion(major, minor, build, type, typeNumber); } public bool IsLess(string version) { return this < Parse(version); } public bool IsLessEqual(ushort major) { return this <= From(major); } public bool IsLessEqual(ushort major, ushort minor) { return this <= From(major, minor); } public bool IsLessEqual(ushort major, ushort minor, ushort build) { return this <= From(major, minor, build); } public bool IsLessEqual(ushort major, ushort minor, ushort build, UnityVersionType type) { return this <= From(major, minor, build, type); } public bool IsLessEqual(ushort major, ushort minor, ushort build, UnityVersionType type, byte typeNumber) { return this <= new UnityVersion(major, minor, build, type, typeNumber); } public bool IsLessEqual(string version) { return this <= Parse(version); } public bool IsGreater(ushort major) { return this > From(major); } public bool IsGreater(ushort major, ushort minor) { return this > From(major, minor); } public bool IsGreater(ushort major, ushort minor, ushort build) { return this > From(major, minor, build); } public bool IsGreater(ushort major, ushort minor, ushort build, UnityVersionType type) { return this > From(major, minor, build, type); } public bool IsGreater(ushort major, ushort minor, ushort build, UnityVersionType type, byte typeNumber) { return this > new UnityVersion(major, minor, build, type, typeNumber); } public bool IsGreater(string version) { return this > Parse(version); } public bool IsGreaterEqual(ushort major) { return this >= From(major); } public bool IsGreaterEqual(ushort major, ushort minor) { return this >= From(major, minor); } public bool IsGreaterEqual(ushort major, ushort minor, ushort build) { return this >= From(major, minor, build); } public bool IsGreaterEqual(ushort major, ushort minor, ushort build, UnityVersionType type) { return this >= From(major, minor, build, type); } public bool IsGreaterEqual(ushort major, ushort minor, ushort build, UnityVersionType type, byte typeNumber) { return this >= new UnityVersion(major, minor, build, type, typeNumber); } public bool IsGreaterEqual(string version) { return this >= Parse(version); } private UnityVersion From(ushort major) { return new UnityVersion(((ulong)major << 48) | (0xFFFFFFFFFFFFuL & m_data)); } private UnityVersion From(ushort major, ushort minor) { return new UnityVersion(((ulong)major << 48) | ((ulong)minor << 32) | (0xFFFFFFFFu & m_data)); } private UnityVersion From(ushort major, ushort minor, ushort build) { return new UnityVersion(((ulong)major << 48) | ((ulong)minor << 32) | ((ulong)build << 16) | (0xFFFF & m_data)); } private UnityVersion From(ushort major, ushort minor, ushort build, UnityVersionType type) { return new UnityVersion(((ulong)major << 48) | ((ulong)minor << 32) | ((ulong)build << 16) | ((ulong)type << 8) | (0xFF & m_data)); } public UnityVersion(ushort major) { m_data = (ulong)major << 48; } public UnityVersion(ushort major, ushort minor) { m_data = ((ulong)major << 48) | ((ulong)minor << 32); } public UnityVersion(ushort major, ushort minor, ushort build) { m_data = ((ulong)major << 48) | ((ulong)minor << 32) | ((ulong)build << 16); } public UnityVersion(ushort major, ushort minor, ushort build, UnityVersionType type) { m_data = ((ulong)major << 48) | ((ulong)minor << 32) | ((ulong)build << 16) | ((ulong)type << 8); } public UnityVersion(ushort major, ushort minor, ushort build, UnityVersionType type, byte typeNumber) { m_data = ((ulong)major << 48) | ((ulong)minor << 32) | ((ulong)build << 16) | ((ulong)type << 8) | typeNumber; } private UnityVersion(ulong data) { m_data = data; } public ulong GetBits() { return m_data; } public static UnityVersion FromBits(ulong bits) { return new UnityVersion(bits); } public int CompareTo(object? obj) { if (!(obj is UnityVersion other)) { return 1; } return CompareTo(other); } public int CompareTo(UnityVersion other) { if (this > other) { return 1; } if (this < other) { return -1; } return 0; } public override bool Equals(object? obj) { if (obj is UnityVersion unityVersion) { return this == unityVersion; } return false; } public bool Equals(UnityVersion other) { return this == other; } public override int GetHashCode() { ulong data = m_data; return 827 + 911 * data.GetHashCode(); } public static UnityVersion Max(UnityVersion left, UnityVersion right) { if (!(left > right)) { return right; } return left; } public static UnityVersion Min(UnityVersion left, UnityVersion right) { if (!(left < right)) { return right; } return left; } public static ulong Distance(UnityVersion left, UnityVersion right) { if (left.m_data >= right.m_data) { return left.m_data - right.m_data; } return right.m_data - left.m_data; } public UnityVersion GetClosestVersion(UnityVersion[] versions) { if (versions == null) { throw new ArgumentNullException("versions"); } if (versions.Length == 0) { throw new ArgumentException("Length cannot be zero", "versions"); } UnityVersion unityVersion = versions[0]; ulong num = Distance(this, unityVersion); for (int i = 1; i < versions.Length; i++) { ulong num2 = Distance(this, versions[i]); if (num2 < num) { num = num2; unityVersion = versions[i]; } } return unityVersion; } public static bool operator ==(UnityVersion left, UnityVersion right) { return left.m_data == right.m_data; } public static bool operator !=(UnityVersion left, UnityVersion right) { return left.m_data != right.m_data; } public static bool operator >(UnityVersion left, UnityVersion right) { return left.m_data > right.m_data; } public static bool operator >=(UnityVersion left, UnityVersion right) { return left.m_data >= right.m_data; } public static bool operator <(UnityVersion left, UnityVersion right) { return left.m_data < right.m_data; } public static bool operator <=(UnityVersion left, UnityVersion right) { return left.m_data <= right.m_data; } public override string ToString() { return $"{Major}.{Minor}.{Build}{Type.ToCharacter()}{TypeNumber}"; } public string ToString(bool hasUnderscorePrefix, bool useUnderscores, bool hasExtension) { StringBuilder stringBuilder = new StringBuilder(); char value = (useUnderscores ? '_' : '.'); if (hasUnderscorePrefix) { stringBuilder.Append('_'); } stringBuilder.Append(Major); stringBuilder.Append(value); stringBuilder.Append(Minor); stringBuilder.Append(value); stringBuilder.Append(Build); stringBuilder.Append(value); stringBuilder.Append(Type.ToCharacter()); stringBuilder.Append(TypeNumber); if (hasExtension) { stringBuilder.Append(".dll"); } return stringBuilder.ToString(); } public string ToStringWithoutType() { return $"{Major}.{Minor}.{Build}"; } public static UnityVersion ParseFromDllName(string dllName) { if (string.IsNullOrEmpty(dllName)) { throw new ArgumentNullException("dllName"); } if (dllName[0] == '_') { dllName = dllName.Substring(1); } return Parse(dllName.Replace('_', '.').Replace(".dll", "")); } public static UnityVersion Parse(string version) { if (string.IsNullOrEmpty(version)) { throw new ArgumentNullException("version"); } int num = 0; int num2 = 0; int num3 = 0; UnityVersionType type = UnityVersionType.Final; int num4 = 0; using StringReader stringReader = new StringReader(version); while (true) { int num5 = stringReader.Read(); if (num5 == -1) { throw new ArgumentException("Invalid version formatting: " + version, "version"); } char c = (char)num5; if (c == '.') { break; } num = num * 10 + c.ParseDigit(); } while (true) { int num6 = stringReader.Read(); if (num6 == -1) { break; } char c2 = (char)num6; if (c2 == '.') { break; } num2 = num2 * 10 + c2.ParseDigit(); } while (true) { int num7 = stringReader.Read(); if (num7 == -1) { break; } char c3 = (char)num7; if (char.IsDigit(c3)) { num3 = num3 * 10 + c3.ParseDigit(); continue; } type = c3.ToUnityVersionType(); break; } while (true) { int num8 = stringReader.Read(); if (num8 == -1) { break; } char @this = (char)num8; num4 = num4 * 10 + @this.ParseDigit(); } return new UnityVersion((ushort)num, (ushort)num2, (ushort)num3, type, (byte)num4); } } public enum UnityVersionType : byte { Alpha = 0, Beta = 1, China = 2, Final = 3, Patch = 4, Experimental = 5, MinValue = 0, MaxValue = 5 } public static class UnityVersionTypeExtentions { [Obsolete("Changed to ToCharacter", true)] public static char ToLiteral(this UnityVersionType _this) { return _this.ToCharacter(); } public static char ToCharacter(this UnityVersionType type) { return type switch { UnityVersionType.Alpha => 'a', UnityVersionType.Beta => 'b', UnityVersionType.China => 'c', UnityVersionType.Final => 'f', UnityVersionType.Patch => 'p', UnityVersionType.Experimental => 'x', _ => 'u', }; } } } namespace AssetRipper.VersionUtilities.Extensions { public static class BinaryReaderExtensions { public static UnityVersion ReadUnityVersion(this BinaryReader reader) { return UnityVersion.FromBits(reader.ReadUInt64()); } public static CompactUnityVersion32 ReadCompactUnityVersion32(this BinaryReader reader) { return CompactUnityVersion32.FromBits(reader.ReadUInt32()); } public static CompactUnityVersion24 ReadCompactUnityVersion24(this BinaryReader reader) { byte majorMinorByte = reader.ReadByte(); ushort buildTypeShort = reader.ReadUInt16(); return CompactUnityVersion24.FromBits(majorMinorByte, buildTypeShort); } } public static class BinaryWriterExtensions { public static void Write(this BinaryWriter writer, UnityVersion version) { writer.Write(version.GetBits()); } public static void Write(this BinaryWriter writer, CompactUnityVersion32 version) { writer.Write(version.GetBits()); } public static void Write(this BinaryWriter writer, CompactUnityVersion24 version) { version.GetBits(out var majorMinorByte, out var buildTypeShort); writer.Write(majorMinorByte); writer.Write(buildTypeShort); } } public static class CharacterExtensions { internal static int ParseDigit(this char _this) { return _this - 48; } public static UnityVersionType ToUnityVersionType(this char c) { return c switch { 'a' => UnityVersionType.Alpha, 'b' => UnityVersionType.Beta, 'c' => UnityVersionType.China, 'f' => UnityVersionType.Final, 'p' => UnityVersionType.Patch, 'x' => UnityVersionType.Experimental, _ => throw new ArgumentException($"There is no version type {c}", "c"), }; } } }
BepInEx/plugins/BepInEx-BepInEx_MLLoader/BepInEx.MelonLoader.Loader/AssetsTools.NET.dll.old
Decompiled 8 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using AssetsTools.NET.Extra; using AssetsTools.NET.Extra.Decompressors.LZ4; using LZ4ps; using Mono.Cecil; using Mono.Collections.Generic; using SevenZip; using SevenZip.Compression.LZ; using SevenZip.Compression.LZMA; using SevenZip.Compression.RangeCoder; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("AssetTools.NET")] [assembly: AssemblyDescription("A remake and port of DerPopo's AssetTools")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("nesrak1")] [assembly: AssemblyProduct("AssetTools.NET")] [assembly: AssemblyCopyright("Written by nes")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("e09d5ac2-1a2e-4ec1-94ad-3f5e22f17658")] [assembly: AssemblyFileVersion("2.0.0.0")] [assembly: AssemblyVersion("2.0.0.0")] namespace SevenZip { internal class CRC { public static readonly uint[] Table; private uint _value = uint.MaxValue; static CRC() { Table = new uint[256]; for (uint num = 0u; num < 256; num++) { uint num2 = num; for (int i = 0; i < 8; i++) { num2 = (((num2 & 1) == 0) ? (num2 >> 1) : ((num2 >> 1) ^ 0xEDB88320u)); } Table[num] = num2; } } public void Init() { _value = uint.MaxValue; } public void UpdateByte(byte b) { _value = Table[(byte)_value ^ b] ^ (_value >> 8); } public void Update(byte[] data, uint offset, uint size) { for (uint num = 0u; num < size; num++) { _value = Table[(byte)_value ^ data[offset + num]] ^ (_value >> 8); } } public uint GetDigest() { return _value ^ 0xFFFFFFFFu; } private static uint CalculateDigest(byte[] data, uint offset, uint size) { CRC cRC = new CRC(); cRC.Update(data, offset, size); return cRC.GetDigest(); } private static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size) { return CalculateDigest(data, offset, size) == digest; } } internal class DataErrorException : ApplicationException { public DataErrorException() : base("Data Error") { } } internal class InvalidParamException : ApplicationException { public InvalidParamException() : base("Invalid Parameter") { } } public interface ICodeProgress { void SetProgress(long inSize, long outSize); } public interface ICoder { void Code(Stream inStream, Stream outStream, long inSize, long outSize, ICodeProgress progress); } public enum CoderPropID { DefaultProp, DictionarySize, UsedMemorySize, Order, BlockSize, PosStateBits, LitContextBits, LitPosBits, NumFastBytes, MatchFinder, MatchFinderCycles, NumPasses, Algorithm, NumThreads, EndMarker } public interface ISetCoderProperties { void SetCoderProperties(CoderPropID[] propIDs, object[] properties); } public interface IWriteCoderProperties { void WriteCoderProperties(Stream outStream); } public interface ISetDecoderProperties { void SetDecoderProperties(byte[] properties); } } namespace SevenZip.Compression.RangeCoder { internal class Encoder { public const uint kTopValue = 16777216u; private Stream Stream; public ulong Low; public uint Range; private uint _cacheSize; private byte _cache; private long StartPosition; public void SetStream(Stream stream) { Stream = stream; } public void ReleaseStream() { Stream = null; } public void Init() { StartPosition = Stream.Position; Low = 0uL; Range = uint.MaxValue; _cacheSize = 1u; _cache = 0; } public void FlushData() { for (int i = 0; i < 5; i++) { ShiftLow(); } } public void FlushStream() { Stream.Flush(); } public void CloseStream() { Stream.Close(); } public void Encode(uint start, uint size, uint total) { Low += start * (Range /= total); Range *= size; while (Range < 16777216) { Range <<= 8; ShiftLow(); } } public void ShiftLow() { if ((uint)Low < 4278190080u || (int)(Low >> 32) == 1) { byte b = _cache; do { Stream.WriteByte((byte)(b + (Low >> 32))); b = byte.MaxValue; } while (--_cacheSize != 0); _cache = (byte)((uint)Low >> 24); } _cacheSize++; Low = (uint)((int)Low << 8); } public void EncodeDirectBits(uint v, int numTotalBits) { for (int num = numTotalBits - 1; num >= 0; num--) { Range >>= 1; if (((v >> num) & 1) == 1) { Low += Range; } if (Range < 16777216) { Range <<= 8; ShiftLow(); } } } public void EncodeBit(uint size0, int numTotalBits, uint symbol) { uint num = (Range >> numTotalBits) * size0; if (symbol == 0) { Range = num; } else { Low += num; Range -= num; } while (Range < 16777216) { Range <<= 8; ShiftLow(); } } public long GetProcessedSizeAdd() { return _cacheSize + Stream.Position - StartPosition + 4; } } internal class Decoder { public const uint kTopValue = 16777216u; public uint Range; public uint Code; public Stream Stream; public void Init(Stream stream) { Stream = stream; Code = 0u; Range = uint.MaxValue; for (int i = 0; i < 5; i++) { Code = (Code << 8) | (byte)Stream.ReadByte(); } } public void ReleaseStream() { Stream = null; } public void CloseStream() { Stream.Close(); } public void Normalize() { while (Range < 16777216) { Code = (Code << 8) | (byte)Stream.ReadByte(); Range <<= 8; } } public void Normalize2() { if (Range < 16777216) { Code = (Code << 8) | (byte)Stream.ReadByte(); Range <<= 8; } } public uint GetThreshold(uint total) { return Code / (Range /= total); } public void Decode(uint start, uint size, uint total) { Code -= start * Range; Range *= size; Normalize(); } public uint DecodeDirectBits(int numTotalBits) { uint num = Range; uint num2 = Code; uint num3 = 0u; for (int num4 = numTotalBits; num4 > 0; num4--) { num >>= 1; uint num5 = num2 - num >> 31; num2 -= num & (num5 - 1); num3 = (num3 << 1) | (1 - num5); if (num < 16777216) { num2 = (num2 << 8) | (byte)Stream.ReadByte(); num <<= 8; } } Range = num; Code = num2; return num3; } public uint DecodeBit(uint size0, int numTotalBits) { uint num = (Range >> numTotalBits) * size0; uint result; if (Code < num) { result = 0u; Range = num; } else { result = 1u; Code -= num; Range -= num; } Normalize(); return result; } } internal struct BitEncoder { public const int kNumBitModelTotalBits = 11; public const uint kBitModelTotal = 2048u; private const int kNumMoveBits = 5; private const int kNumMoveReducingBits = 2; public const int kNumBitPriceShiftBits = 6; private uint Prob; private static uint[] ProbPrices; public void Init() { Prob = 1024u; } public void UpdateModel(uint symbol) { if (symbol == 0) { Prob += 2048 - Prob >> 5; } else { Prob -= Prob >> 5; } } public void Encode(Encoder encoder, uint symbol) { uint num = (encoder.Range >> 11) * Prob; if (symbol == 0) { encoder.Range = num; Prob += 2048 - Prob >> 5; } else { encoder.Low += num; encoder.Range -= num; Prob -= Prob >> 5; } if (encoder.Range < 16777216) { encoder.Range <<= 8; encoder.ShiftLow(); } } static BitEncoder() { ProbPrices = new uint[512]; for (int num = 8; num >= 0; num--) { int num2 = 1 << 9 - num - 1; uint num3 = (uint)(1 << 9 - num); for (uint num4 = (uint)num2; num4 < num3; num4++) { ProbPrices[num4] = (uint)(num << 6) + (num3 - num4 << 6 >> 9 - num - 1); } } } public uint GetPrice(uint symbol) { return ProbPrices[(((Prob - symbol) ^ (int)(0 - symbol)) & 0x7FF) >> 2]; } public uint GetPrice0() { return ProbPrices[Prob >> 2]; } public uint GetPrice1() { return ProbPrices[2048 - Prob >> 2]; } } internal struct BitDecoder { public const int kNumBitModelTotalBits = 11; public const uint kBitModelTotal = 2048u; private const int kNumMoveBits = 5; private uint Prob; public void UpdateModel(int numMoveBits, uint symbol) { if (symbol == 0) { Prob += 2048 - Prob >> numMoveBits; } else { Prob -= Prob >> numMoveBits; } } public void Init() { Prob = 1024u; } public uint Decode(Decoder rangeDecoder) { uint num = (rangeDecoder.Range >> 11) * Prob; if (rangeDecoder.Code < num) { rangeDecoder.Range = num; Prob += 2048 - Prob >> 5; if (rangeDecoder.Range < 16777216) { rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); rangeDecoder.Range <<= 8; } return 0u; } rangeDecoder.Range -= num; rangeDecoder.Code -= num; Prob -= Prob >> 5; if (rangeDecoder.Range < 16777216) { rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); rangeDecoder.Range <<= 8; } return 1u; } } internal struct BitTreeEncoder { private BitEncoder[] Models; private int NumBitLevels; public BitTreeEncoder(int numBitLevels) { NumBitLevels = numBitLevels; Models = new BitEncoder[1 << numBitLevels]; } public void Init() { for (uint num = 1u; num < 1 << NumBitLevels; num++) { Models[num].Init(); } } public void Encode(Encoder rangeEncoder, uint symbol) { uint num = 1u; int num2 = NumBitLevels; while (num2 > 0) { num2--; uint num3 = (symbol >> num2) & 1u; Models[num].Encode(rangeEncoder, num3); num = (num << 1) | num3; } } public void ReverseEncode(Encoder rangeEncoder, uint symbol) { uint num = 1u; for (uint num2 = 0u; num2 < NumBitLevels; num2++) { uint num3 = symbol & 1u; Models[num].Encode(rangeEncoder, num3); num = (num << 1) | num3; symbol >>= 1; } } public uint GetPrice(uint symbol) { uint num = 0u; uint num2 = 1u; int num3 = NumBitLevels; while (num3 > 0) { num3--; uint num4 = (symbol >> num3) & 1u; num += Models[num2].GetPrice(num4); num2 = (num2 << 1) + num4; } return num; } public uint ReverseGetPrice(uint symbol) { uint num = 0u; uint num2 = 1u; for (int num3 = NumBitLevels; num3 > 0; num3--) { uint num4 = symbol & 1u; symbol >>= 1; num += Models[num2].GetPrice(num4); num2 = (num2 << 1) | num4; } return num; } public static uint ReverseGetPrice(BitEncoder[] Models, uint startIndex, int NumBitLevels, uint symbol) { uint num = 0u; uint num2 = 1u; for (int num3 = NumBitLevels; num3 > 0; num3--) { uint num4 = symbol & 1u; symbol >>= 1; num += Models[startIndex + num2].GetPrice(num4); num2 = (num2 << 1) | num4; } return num; } public static void ReverseEncode(BitEncoder[] Models, uint startIndex, Encoder rangeEncoder, int NumBitLevels, uint symbol) { uint num = 1u; for (int i = 0; i < NumBitLevels; i++) { uint num2 = symbol & 1u; Models[startIndex + num].Encode(rangeEncoder, num2); num = (num << 1) | num2; symbol >>= 1; } } } internal struct BitTreeDecoder { private BitDecoder[] Models; private int NumBitLevels; public BitTreeDecoder(int numBitLevels) { NumBitLevels = numBitLevels; Models = new BitDecoder[1 << numBitLevels]; } public void Init() { for (uint num = 1u; num < 1 << NumBitLevels; num++) { Models[num].Init(); } } public uint Decode(Decoder rangeDecoder) { uint num = 1u; for (int num2 = NumBitLevels; num2 > 0; num2--) { num = (num << 1) + Models[num].Decode(rangeDecoder); } return num - (uint)(1 << NumBitLevels); } public uint ReverseDecode(Decoder rangeDecoder) { uint num = 1u; uint num2 = 0u; for (int i = 0; i < NumBitLevels; i++) { uint num3 = Models[num].Decode(rangeDecoder); num <<= 1; num += num3; num2 |= num3 << i; } return num2; } public static uint ReverseDecode(BitDecoder[] Models, uint startIndex, Decoder rangeDecoder, int NumBitLevels) { uint num = 1u; uint num2 = 0u; for (int i = 0; i < NumBitLevels; i++) { uint num3 = Models[startIndex + num].Decode(rangeDecoder); num <<= 1; num += num3; num2 |= num3 << i; } return num2; } } } namespace SevenZip.Compression.LZ { internal interface IInWindowStream { void SetStream(Stream inStream); void Init(); void ReleaseStream(); byte GetIndexByte(int index); uint GetMatchLen(int index, uint distance, uint limit); uint GetNumAvailableBytes(); } internal interface IMatchFinder : IInWindowStream { void Create(uint historySize, uint keepAddBufferBefore, uint matchMaxLen, uint keepAddBufferAfter); uint GetMatches(uint[] distances); void Skip(uint num); } public class BinTree : InWindow, IMatchFinder, IInWindowStream { private uint _cyclicBufferPos; private uint _cyclicBufferSize; private uint _matchMaxLen; private uint[] _son; private uint[] _hash; private uint _cutValue = 255u; private uint _hashMask; private uint _hashSizeSum; private bool HASH_ARRAY = true; private const uint kHash2Size = 1024u; private const uint kHash3Size = 65536u; private const uint kBT2HashSize = 65536u; private const uint kStartMaxLen = 1u; private const uint kHash3Offset = 1024u; private const uint kEmptyHashValue = 0u; private const uint kMaxValForNormalize = 2147483647u; private uint kNumHashDirectBytes; private uint kMinMatchCheck = 4u; private uint kFixHashSize = 66560u; public void SetType(int numHashBytes) { HASH_ARRAY = numHashBytes > 2; if (HASH_ARRAY) { kNumHashDirectBytes = 0u; kMinMatchCheck = 4u; kFixHashSize = 66560u; } else { kNumHashDirectBytes = 2u; kMinMatchCheck = 3u; kFixHashSize = 0u; } } public new void SetStream(Stream stream) { base.SetStream(stream); } public new void ReleaseStream() { base.ReleaseStream(); } public new void Init() { base.Init(); for (uint num = 0u; num < _hashSizeSum; num++) { _hash[num] = 0u; } _cyclicBufferPos = 0u; ReduceOffsets(-1); } public new void MovePos() { if (++_cyclicBufferPos >= _cyclicBufferSize) { _cyclicBufferPos = 0u; } base.MovePos(); if (_pos == int.MaxValue) { Normalize(); } } public new byte GetIndexByte(int index) { return base.GetIndexByte(index); } public new uint GetMatchLen(int index, uint distance, uint limit) { return base.GetMatchLen(index, distance, limit); } public new uint GetNumAvailableBytes() { return base.GetNumAvailableBytes(); } public void Create(uint historySize, uint keepAddBufferBefore, uint matchMaxLen, uint keepAddBufferAfter) { if (historySize > 2147483391) { throw new Exception(); } _cutValue = 16 + (matchMaxLen >> 1); uint keepSizeReserv = (historySize + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + 256; Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, keepSizeReserv); _matchMaxLen = matchMaxLen; uint num = historySize + 1; if (_cyclicBufferSize != num) { _son = new uint[(_cyclicBufferSize = num) * 2]; } uint num2 = 65536u; if (HASH_ARRAY) { num2 = historySize - 1; num2 |= num2 >> 1; num2 |= num2 >> 2; num2 |= num2 >> 4; num2 |= num2 >> 8; num2 >>= 1; num2 |= 0xFFFFu; if (num2 > 16777216) { num2 >>= 1; } _hashMask = num2; num2++; num2 += kFixHashSize; } if (num2 != _hashSizeSum) { _hash = new uint[_hashSizeSum = num2]; } } public uint GetMatches(uint[] distances) { uint num; if (_pos + _matchMaxLen <= _streamPos) { num = _matchMaxLen; } else { num = _streamPos - _pos; if (num < kMinMatchCheck) { MovePos(); return 0u; } } uint num2 = 0u; uint num3 = ((_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0u); uint num4 = _bufferOffset + _pos; uint num5 = 1u; uint num6 = 0u; uint num7 = 0u; uint num10; if (HASH_ARRAY) { uint num8 = CRC.Table[_bufferBase[num4]] ^ _bufferBase[num4 + 1]; num6 = num8 & 0x3FFu; int num9 = (int)num8 ^ (_bufferBase[num4 + 2] << 8); num7 = (uint)num9 & 0xFFFFu; num10 = ((uint)num9 ^ (CRC.Table[_bufferBase[num4 + 3]] << 5)) & _hashMask; } else { num10 = (uint)(_bufferBase[num4] ^ (_bufferBase[num4 + 1] << 8)); } uint num11 = _hash[kFixHashSize + num10]; if (HASH_ARRAY) { uint num12 = _hash[num6]; uint num13 = _hash[1024 + num7]; _hash[num6] = _pos; _hash[1024 + num7] = _pos; if (num12 > num3 && _bufferBase[_bufferOffset + num12] == _bufferBase[num4]) { num5 = (distances[num2++] = 2u); distances[num2++] = _pos - num12 - 1; } if (num13 > num3 && _bufferBase[_bufferOffset + num13] == _bufferBase[num4]) { if (num13 == num12) { num2 -= 2; } num5 = (distances[num2++] = 3u); distances[num2++] = _pos - num13 - 1; num12 = num13; } if (num2 != 0 && num12 == num11) { num2 -= 2; num5 = 1u; } } _hash[kFixHashSize + num10] = _pos; uint num14 = (_cyclicBufferPos << 1) + 1; uint num15 = _cyclicBufferPos << 1; uint val; uint val2 = (val = kNumHashDirectBytes); if (kNumHashDirectBytes != 0 && num11 > num3 && _bufferBase[_bufferOffset + num11 + kNumHashDirectBytes] != _bufferBase[num4 + kNumHashDirectBytes]) { num5 = (distances[num2++] = kNumHashDirectBytes); distances[num2++] = _pos - num11 - 1; } uint cutValue = _cutValue; while (true) { if (num11 <= num3 || cutValue-- == 0) { _son[num14] = (_son[num15] = 0u); break; } uint num16 = _pos - num11; uint num17 = ((num16 <= _cyclicBufferPos) ? (_cyclicBufferPos - num16) : (_cyclicBufferPos - num16 + _cyclicBufferSize)) << 1; uint num18 = _bufferOffset + num11; uint num19 = Math.Min(val2, val); if (_bufferBase[num18 + num19] == _bufferBase[num4 + num19]) { while (++num19 != num && _bufferBase[num18 + num19] == _bufferBase[num4 + num19]) { } if (num5 < num19) { num5 = (distances[num2++] = num19); distances[num2++] = num16 - 1; if (num19 == num) { _son[num15] = _son[num17]; _son[num14] = _son[num17 + 1]; break; } } } if (_bufferBase[num18 + num19] < _bufferBase[num4 + num19]) { _son[num15] = num11; num15 = num17 + 1; num11 = _son[num15]; val = num19; } else { _son[num14] = num11; num14 = num17; num11 = _son[num14]; val2 = num19; } } MovePos(); return num2; } public void Skip(uint num) { do { uint num2; if (_pos + _matchMaxLen <= _streamPos) { num2 = _matchMaxLen; } else { num2 = _streamPos - _pos; if (num2 < kMinMatchCheck) { MovePos(); continue; } } uint num3 = ((_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0u); uint num4 = _bufferOffset + _pos; uint num9; if (HASH_ARRAY) { uint num5 = CRC.Table[_bufferBase[num4]] ^ _bufferBase[num4 + 1]; uint num6 = num5 & 0x3FFu; _hash[num6] = _pos; int num7 = (int)num5 ^ (_bufferBase[num4 + 2] << 8); uint num8 = (uint)num7 & 0xFFFFu; _hash[1024 + num8] = _pos; num9 = ((uint)num7 ^ (CRC.Table[_bufferBase[num4 + 3]] << 5)) & _hashMask; } else { num9 = (uint)(_bufferBase[num4] ^ (_bufferBase[num4 + 1] << 8)); } uint num10 = _hash[kFixHashSize + num9]; _hash[kFixHashSize + num9] = _pos; uint num11 = (_cyclicBufferPos << 1) + 1; uint num12 = _cyclicBufferPos << 1; uint val; uint val2 = (val = kNumHashDirectBytes); uint cutValue = _cutValue; while (true) { if (num10 <= num3 || cutValue-- == 0) { _son[num11] = (_son[num12] = 0u); break; } uint num13 = _pos - num10; uint num14 = ((num13 <= _cyclicBufferPos) ? (_cyclicBufferPos - num13) : (_cyclicBufferPos - num13 + _cyclicBufferSize)) << 1; uint num15 = _bufferOffset + num10; uint num16 = Math.Min(val2, val); if (_bufferBase[num15 + num16] == _bufferBase[num4 + num16]) { while (++num16 != num2 && _bufferBase[num15 + num16] == _bufferBase[num4 + num16]) { } if (num16 == num2) { _son[num12] = _son[num14]; _son[num11] = _son[num14 + 1]; break; } } if (_bufferBase[num15 + num16] < _bufferBase[num4 + num16]) { _son[num12] = num10; num12 = num14 + 1; num10 = _son[num12]; val = num16; } else { _son[num11] = num10; num11 = num14; num10 = _son[num11]; val2 = num16; } } MovePos(); } while (--num != 0); } private void NormalizeLinks(uint[] items, uint numItems, uint subValue) { for (uint num = 0u; num < numItems; num++) { uint num2 = items[num]; num2 = ((num2 > subValue) ? (num2 - subValue) : 0u); items[num] = num2; } } private void Normalize() { uint subValue = _pos - _cyclicBufferSize; NormalizeLinks(_son, _cyclicBufferSize * 2, subValue); NormalizeLinks(_hash, _hashSizeSum, subValue); ReduceOffsets((int)subValue); } public void SetCutValue(uint cutValue) { _cutValue = cutValue; } } public class InWindow { public byte[] _bufferBase; private Stream _stream; private uint _posLimit; private bool _streamEndWasReached; private uint _pointerToLastSafePosition; public uint _bufferOffset; public uint _blockSize; public uint _pos; private uint _keepSizeBefore; private uint _keepSizeAfter; public uint _streamPos; public void MoveBlock() { uint num = _bufferOffset + _pos - _keepSizeBefore; if (num != 0) { num--; } uint num2 = _bufferOffset + _streamPos - num; for (uint num3 = 0u; num3 < num2; num3++) { _bufferBase[num3] = _bufferBase[num + num3]; } _bufferOffset -= num; } public virtual void ReadBlock() { if (_streamEndWasReached) { return; } while (true) { int num = (int)(0 - _bufferOffset + _blockSize - _streamPos); if (num == 0) { return; } int num2 = _stream.Read(_bufferBase, (int)(_bufferOffset + _streamPos), num); if (num2 == 0) { break; } _streamPos += (uint)num2; if (_streamPos >= _pos + _keepSizeAfter) { _posLimit = _streamPos - _keepSizeAfter; } } _posLimit = _streamPos; if (_bufferOffset + _posLimit > _pointerToLastSafePosition) { _posLimit = _pointerToLastSafePosition - _bufferOffset; } _streamEndWasReached = true; } private void Free() { _bufferBase = null; } public void Create(uint keepSizeBefore, uint keepSizeAfter, uint keepSizeReserv) { _keepSizeBefore = keepSizeBefore; _keepSizeAfter = keepSizeAfter; uint num = keepSizeBefore + keepSizeAfter + keepSizeReserv; if (_bufferBase == null || _blockSize != num) { Free(); _blockSize = num; _bufferBase = new byte[_blockSize]; } _pointerToLastSafePosition = _blockSize - keepSizeAfter; } public void SetStream(Stream stream) { _stream = stream; } public void ReleaseStream() { _stream = null; } public void Init() { _bufferOffset = 0u; _pos = 0u; _streamPos = 0u; _streamEndWasReached = false; ReadBlock(); } public void MovePos() { _pos++; if (_pos > _posLimit) { if (_bufferOffset + _pos > _pointerToLastSafePosition) { MoveBlock(); } ReadBlock(); } } public byte GetIndexByte(int index) { return _bufferBase[_bufferOffset + _pos + index]; } public uint GetMatchLen(int index, uint distance, uint limit) { if (_streamEndWasReached && _pos + index + limit > _streamPos) { limit = _streamPos - (uint)(int)(_pos + index); } distance++; uint num = _bufferOffset + _pos + (uint)index; uint num2; for (num2 = 0u; num2 < limit && _bufferBase[num + num2] == _bufferBase[num + num2 - distance]; num2++) { } return num2; } public uint GetNumAvailableBytes() { return _streamPos - _pos; } public void ReduceOffsets(int subValue) { _bufferOffset += (uint)subValue; _posLimit -= (uint)subValue; _pos -= (uint)subValue; _streamPos -= (uint)subValue; } } public class OutWindow { private byte[] _buffer; private uint _pos; private uint _windowSize; private uint _streamPos; private Stream _stream; public uint TrainSize; public void Create(uint windowSize) { if (_windowSize != windowSize) { _buffer = new byte[windowSize]; } _windowSize = windowSize; _pos = 0u; _streamPos = 0u; } public void Init(Stream stream, bool solid) { ReleaseStream(); _stream = stream; if (!solid) { _streamPos = 0u; _pos = 0u; TrainSize = 0u; } } public bool Train(Stream stream) { long length = stream.Length; uint num = (TrainSize = (uint)((length < _windowSize) ? length : _windowSize)); stream.Position = length - num; _streamPos = (_pos = 0u); while (num != 0) { uint num2 = _windowSize - _pos; if (num < num2) { num2 = num; } int num3 = stream.Read(_buffer, (int)_pos, (int)num2); if (num3 == 0) { return false; } num -= (uint)num3; _pos += (uint)num3; _streamPos += (uint)num3; if (_pos == _windowSize) { _streamPos = (_pos = 0u); } } return true; } public void ReleaseStream() { Flush(); _stream = null; } public void Flush() { uint num = _pos - _streamPos; if (num != 0) { _stream.Write(_buffer, (int)_streamPos, (int)num); if (_pos >= _windowSize) { _pos = 0u; } _streamPos = _pos; } } public void CopyBlock(uint distance, uint len) { uint num = _pos - distance - 1; if (num >= _windowSize) { num += _windowSize; } while (len != 0) { if (num >= _windowSize) { num = 0u; } _buffer[_pos++] = _buffer[num++]; if (_pos >= _windowSize) { Flush(); } len--; } } public void PutByte(byte b) { _buffer[_pos++] = b; if (_pos >= _windowSize) { Flush(); } } public byte GetByte(uint distance) { uint num = _pos - distance - 1; if (num >= _windowSize) { num += _windowSize; } return _buffer[num]; } } } namespace SevenZip.Compression.LZMA { internal abstract class Base { public struct State { public uint Index; public void Init() { Index = 0u; } public void UpdateChar() { if (Index < 4) { Index = 0u; } else if (Index < 10) { Index -= 3u; } else { Index -= 6u; } } public void UpdateMatch() { Index = ((Index < 7) ? 7u : 10u); } public void UpdateRep() { Index = ((Index < 7) ? 8u : 11u); } public void UpdateShortRep() { Index = ((Index < 7) ? 9u : 11u); } public bool IsCharState() { return Index < 7; } } public const uint kNumRepDistances = 4u; public const uint kNumStates = 12u; public const int kNumPosSlotBits = 6; public const int kDicLogSizeMin = 0; public const int kNumLenToPosStatesBits = 2; public const uint kNumLenToPosStates = 4u; public const uint kMatchMinLen = 2u; public const int kNumAlignBits = 4; public const uint kAlignTableSize = 16u; public const uint kAlignMask = 15u; public const uint kStartPosModelIndex = 4u; public const uint kEndPosModelIndex = 14u; public const uint kNumPosModels = 10u; public const uint kNumFullDistances = 128u; public const uint kNumLitPosStatesBitsEncodingMax = 4u; public const uint kNumLitContextBitsMax = 8u; public const int kNumPosStatesBitsMax = 4; public const uint kNumPosStatesMax = 16u; public const int kNumPosStatesBitsEncodingMax = 4; public const uint kNumPosStatesEncodingMax = 16u; public const int kNumLowLenBits = 3; public const int kNumMidLenBits = 3; public const int kNumHighLenBits = 8; public const uint kNumLowLenSymbols = 8u; public const uint kNumMidLenSymbols = 8u; public const uint kNumLenSymbols = 272u; public const uint kMatchMaxLen = 273u; public static uint GetLenToPosState(uint len) { len -= 2; if (len < 4) { return len; } return 3u; } } public class Decoder : ICoder, ISetDecoderProperties { private class LenDecoder { private BitDecoder m_Choice; private BitDecoder m_Choice2; private BitTreeDecoder[] m_LowCoder = new BitTreeDecoder[16]; private BitTreeDecoder[] m_MidCoder = new BitTreeDecoder[16]; private BitTreeDecoder m_HighCoder = new BitTreeDecoder(8); private uint m_NumPosStates; public void Create(uint numPosStates) { for (uint num = m_NumPosStates; num < numPosStates; num++) { m_LowCoder[num] = new BitTreeDecoder(3); m_MidCoder[num] = new BitTreeDecoder(3); } m_NumPosStates = numPosStates; } public void Init() { m_Choice.Init(); for (uint num = 0u; num < m_NumPosStates; num++) { m_LowCoder[num].Init(); m_MidCoder[num].Init(); } m_Choice2.Init(); m_HighCoder.Init(); } public uint Decode(SevenZip.Compression.RangeCoder.Decoder rangeDecoder, uint posState) { if (m_Choice.Decode(rangeDecoder) == 0) { return m_LowCoder[posState].Decode(rangeDecoder); } uint num = 8u; if (m_Choice2.Decode(rangeDecoder) == 0) { return num + m_MidCoder[posState].Decode(rangeDecoder); } num += 8; return num + m_HighCoder.Decode(rangeDecoder); } } private class LiteralDecoder { private struct Decoder2 { private BitDecoder[] m_Decoders; public void Create() { m_Decoders = new BitDecoder[768]; } public void Init() { for (int i = 0; i < 768; i++) { m_Decoders[i].Init(); } } public byte DecodeNormal(SevenZip.Compression.RangeCoder.Decoder rangeDecoder) { uint num = 1u; do { num = (num << 1) | m_Decoders[num].Decode(rangeDecoder); } while (num < 256); return (byte)num; } public byte DecodeWithMatchByte(SevenZip.Compression.RangeCoder.Decoder rangeDecoder, byte matchByte) { uint num = 1u; do { uint num2 = (uint)(matchByte >> 7) & 1u; matchByte <<= 1; uint num3 = m_Decoders[(1 + num2 << 8) + num].Decode(rangeDecoder); num = (num << 1) | num3; if (num2 != num3) { while (num < 256) { num = (num << 1) | m_Decoders[num].Decode(rangeDecoder); } break; } } while (num < 256); return (byte)num; } } private Decoder2[] m_Coders; private int m_NumPrevBits; private int m_NumPosBits; private uint m_PosMask; public void Create(int numPosBits, int numPrevBits) { if (m_Coders == null || m_NumPrevBits != numPrevBits || m_NumPosBits != numPosBits) { m_NumPosBits = numPosBits; m_PosMask = (uint)((1 << numPosBits) - 1); m_NumPrevBits = numPrevBits; uint num = (uint)(1 << m_NumPrevBits + m_NumPosBits); m_Coders = new Decoder2[num]; for (uint num2 = 0u; num2 < num; num2++) { m_Coders[num2].Create(); } } } public void Init() { uint num = (uint)(1 << m_NumPrevBits + m_NumPosBits); for (uint num2 = 0u; num2 < num; num2++) { m_Coders[num2].Init(); } } private uint GetState(uint pos, byte prevByte) { return ((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> 8 - m_NumPrevBits); } public byte DecodeNormal(SevenZip.Compression.RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte) { return m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); } public byte DecodeWithMatchByte(SevenZip.Compression.RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte, byte matchByte) { return m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); } } private OutWindow m_OutWindow = new OutWindow(); private SevenZip.Compression.RangeCoder.Decoder m_RangeDecoder = new SevenZip.Compression.RangeCoder.Decoder(); private BitDecoder[] m_IsMatchDecoders = new BitDecoder[192]; private BitDecoder[] m_IsRepDecoders = new BitDecoder[12]; private BitDecoder[] m_IsRepG0Decoders = new BitDecoder[12]; private BitDecoder[] m_IsRepG1Decoders = new BitDecoder[12]; private BitDecoder[] m_IsRepG2Decoders = new BitDecoder[12]; private BitDecoder[] m_IsRep0LongDecoders = new BitDecoder[192]; private BitTreeDecoder[] m_PosSlotDecoder = new BitTreeDecoder[4]; private BitDecoder[] m_PosDecoders = new BitDecoder[114]; private BitTreeDecoder m_PosAlignDecoder = new BitTreeDecoder(4); private LenDecoder m_LenDecoder = new LenDecoder(); private LenDecoder m_RepLenDecoder = new LenDecoder(); private LiteralDecoder m_LiteralDecoder = new LiteralDecoder(); private uint m_DictionarySize; private uint m_DictionarySizeCheck; private uint m_PosStateMask; private bool _solid; public Decoder() { m_DictionarySize = uint.MaxValue; for (int i = 0; (long)i < 4L; i++) { m_PosSlotDecoder[i] = new BitTreeDecoder(6); } } private void SetDictionarySize(uint dictionarySize) { if (m_DictionarySize != dictionarySize) { m_DictionarySize = dictionarySize; m_DictionarySizeCheck = Math.Max(m_DictionarySize, 1u); uint windowSize = Math.Max(m_DictionarySizeCheck, 4096u); m_OutWindow.Create(windowSize); } } private void SetLiteralProperties(int lp, int lc) { if (lp > 8) { throw new InvalidParamException(); } if (lc > 8) { throw new InvalidParamException(); } m_LiteralDecoder.Create(lp, lc); } private void SetPosBitsProperties(int pb) { if (pb > 4) { throw new InvalidParamException(); } uint num = (uint)(1 << pb); m_LenDecoder.Create(num); m_RepLenDecoder.Create(num); m_PosStateMask = num - 1; } private void Init(Stream inStream, Stream outStream) { m_RangeDecoder.Init(inStream); m_OutWindow.Init(outStream, _solid); for (uint num = 0u; num < 12; num++) { for (uint num2 = 0u; num2 <= m_PosStateMask; num2++) { uint num3 = (num << 4) + num2; m_IsMatchDecoders[num3].Init(); m_IsRep0LongDecoders[num3].Init(); } m_IsRepDecoders[num].Init(); m_IsRepG0Decoders[num].Init(); m_IsRepG1Decoders[num].Init(); m_IsRepG2Decoders[num].Init(); } m_LiteralDecoder.Init(); for (uint num = 0u; num < 4; num++) { m_PosSlotDecoder[num].Init(); } for (uint num = 0u; num < 114; num++) { m_PosDecoders[num].Init(); } m_LenDecoder.Init(); m_RepLenDecoder.Init(); m_PosAlignDecoder.Init(); } public void Code(Stream inStream, Stream outStream, long inSize, long outSize, ICodeProgress progress) { Init(inStream, outStream); Base.State state = default(Base.State); state.Init(); uint num = 0u; uint num2 = 0u; uint num3 = 0u; uint num4 = 0u; ulong num5 = 0uL; if (num5 < (ulong)outSize) { if (m_IsMatchDecoders[state.Index << 4].Decode(m_RangeDecoder) != 0) { throw new DataErrorException(); } state.UpdateChar(); byte b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, 0u, 0); m_OutWindow.PutByte(b); num5++; } while (num5 < (ulong)outSize) { uint num6 = (uint)(int)num5 & m_PosStateMask; if (m_IsMatchDecoders[(state.Index << 4) + num6].Decode(m_RangeDecoder) == 0) { byte @byte = m_OutWindow.GetByte(0u); byte b2 = (state.IsCharState() ? m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)num5, @byte) : m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder, (uint)num5, @byte, m_OutWindow.GetByte(num))); m_OutWindow.PutByte(b2); state.UpdateChar(); num5++; continue; } uint num8; if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1) { if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0) { if (m_IsRep0LongDecoders[(state.Index << 4) + num6].Decode(m_RangeDecoder) == 0) { state.UpdateShortRep(); m_OutWindow.PutByte(m_OutWindow.GetByte(num)); num5++; continue; } } else { uint num7; if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0) { num7 = num2; } else { if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0) { num7 = num3; } else { num7 = num4; num4 = num3; } num3 = num2; } num2 = num; num = num7; } num8 = m_RepLenDecoder.Decode(m_RangeDecoder, num6) + 2; state.UpdateRep(); } else { num4 = num3; num3 = num2; num2 = num; num8 = 2 + m_LenDecoder.Decode(m_RangeDecoder, num6); state.UpdateMatch(); uint num9 = m_PosSlotDecoder[Base.GetLenToPosState(num8)].Decode(m_RangeDecoder); if (num9 >= 4) { int num10 = (int)((num9 >> 1) - 1); num = (2 | (num9 & 1)) << num10; if (num9 < 14) { num += BitTreeDecoder.ReverseDecode(m_PosDecoders, num - num9 - 1, m_RangeDecoder, num10); } else { num += m_RangeDecoder.DecodeDirectBits(num10 - 4) << 4; num += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder); } } else { num = num9; } } if (num >= m_OutWindow.TrainSize + num5 || num >= m_DictionarySizeCheck) { if (num == uint.MaxValue) { break; } throw new DataErrorException(); } m_OutWindow.CopyBlock(num, num8); num5 += num8; } m_OutWindow.Flush(); m_OutWindow.ReleaseStream(); m_RangeDecoder.ReleaseStream(); } public void SetDecoderProperties(byte[] properties) { if (properties.Length < 5) { throw new InvalidParamException(); } int lc = properties[0] % 9; int num = properties[0] / 9; int lp = num % 5; int num2 = num / 5; if (num2 > 4) { throw new InvalidParamException(); } uint num3 = 0u; for (int i = 0; i < 4; i++) { num3 += (uint)(properties[1 + i] << i * 8); } SetDictionarySize(num3); SetLiteralProperties(lp, lc); SetPosBitsProperties(num2); } public bool Train(Stream stream) { _solid = true; return m_OutWindow.Train(stream); } } public class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties { private enum EMatchFinderType { BT2, BT4 } private class LiteralEncoder { public struct Encoder2 { private BitEncoder[] m_Encoders; public void Create() { m_Encoders = new BitEncoder[768]; } public void Init() { for (int i = 0; i < 768; i++) { m_Encoders[i].Init(); } } public void Encode(SevenZip.Compression.RangeCoder.Encoder rangeEncoder, byte symbol) { uint num = 1u; for (int num2 = 7; num2 >= 0; num2--) { uint num3 = (uint)(symbol >> num2) & 1u; m_Encoders[num].Encode(rangeEncoder, num3); num = (num << 1) | num3; } } public void EncodeMatched(SevenZip.Compression.RangeCoder.Encoder rangeEncoder, byte matchByte, byte symbol) { uint num = 1u; bool flag = true; for (int num2 = 7; num2 >= 0; num2--) { uint num3 = (uint)(symbol >> num2) & 1u; uint num4 = num; if (flag) { uint num5 = (uint)(matchByte >> num2) & 1u; num4 += 1 + num5 << 8; flag = num5 == num3; } m_Encoders[num4].Encode(rangeEncoder, num3); num = (num << 1) | num3; } } public uint GetPrice(bool matchMode, byte matchByte, byte symbol) { uint num = 0u; uint num2 = 1u; int num3 = 7; if (matchMode) { while (num3 >= 0) { uint num4 = (uint)(matchByte >> num3) & 1u; uint num5 = (uint)(symbol >> num3) & 1u; num += m_Encoders[(1 + num4 << 8) + num2].GetPrice(num5); num2 = (num2 << 1) | num5; if (num4 != num5) { num3--; break; } num3--; } } while (num3 >= 0) { uint num6 = (uint)(symbol >> num3) & 1u; num += m_Encoders[num2].GetPrice(num6); num2 = (num2 << 1) | num6; num3--; } return num; } } private Encoder2[] m_Coders; private int m_NumPrevBits; private int m_NumPosBits; private uint m_PosMask; public void Create(int numPosBits, int numPrevBits) { if (m_Coders == null || m_NumPrevBits != numPrevBits || m_NumPosBits != numPosBits) { m_NumPosBits = numPosBits; m_PosMask = (uint)((1 << numPosBits) - 1); m_NumPrevBits = numPrevBits; uint num = (uint)(1 << m_NumPrevBits + m_NumPosBits); m_Coders = new Encoder2[num]; for (uint num2 = 0u; num2 < num; num2++) { m_Coders[num2].Create(); } } } public void Init() { uint num = (uint)(1 << m_NumPrevBits + m_NumPosBits); for (uint num2 = 0u; num2 < num; num2++) { m_Coders[num2].Init(); } } public Encoder2 GetSubCoder(uint pos, byte prevByte) { return m_Coders[(int)((pos & m_PosMask) << m_NumPrevBits) + (prevByte >> 8 - m_NumPrevBits)]; } } private class LenEncoder { private BitEncoder _choice; private BitEncoder _choice2; private BitTreeEncoder[] _lowCoder = new BitTreeEncoder[16]; private BitTreeEncoder[] _midCoder = new BitTreeEncoder[16]; private BitTreeEncoder _highCoder = new BitTreeEncoder(8); public LenEncoder() { for (uint num = 0u; num < 16; num++) { _lowCoder[num] = new BitTreeEncoder(3); _midCoder[num] = new BitTreeEncoder(3); } } public void Init(uint numPosStates) { _choice.Init(); _choice2.Init(); for (uint num = 0u; num < numPosStates; num++) { _lowCoder[num].Init(); _midCoder[num].Init(); } _highCoder.Init(); } public void Encode(SevenZip.Compression.RangeCoder.Encoder rangeEncoder, uint symbol, uint posState) { if (symbol < 8) { _choice.Encode(rangeEncoder, 0u); _lowCoder[posState].Encode(rangeEncoder, symbol); return; } symbol -= 8; _choice.Encode(rangeEncoder, 1u); if (symbol < 8) { _choice2.Encode(rangeEncoder, 0u); _midCoder[posState].Encode(rangeEncoder, symbol); } else { _choice2.Encode(rangeEncoder, 1u); _highCoder.Encode(rangeEncoder, symbol - 8); } } public void SetPrices(uint posState, uint numSymbols, uint[] prices, uint st) { uint price = _choice.GetPrice0(); uint price2 = _choice.GetPrice1(); uint num = price2 + _choice2.GetPrice0(); uint num2 = price2 + _choice2.GetPrice1(); uint num3 = 0u; for (num3 = 0u; num3 < 8; num3++) { if (num3 >= numSymbols) { return; } prices[st + num3] = price + _lowCoder[posState].GetPrice(num3); } for (; num3 < 16; num3++) { if (num3 >= numSymbols) { return; } prices[st + num3] = num + _midCoder[posState].GetPrice(num3 - 8); } for (; num3 < numSymbols; num3++) { prices[st + num3] = num2 + _highCoder.GetPrice(num3 - 8 - 8); } } } private class LenPriceTableEncoder : LenEncoder { private uint[] _prices = new uint[4352]; private uint _tableSize; private uint[] _counters = new uint[16]; public void SetTableSize(uint tableSize) { _tableSize = tableSize; } public uint GetPrice(uint symbol, uint posState) { return _prices[posState * 272 + symbol]; } private void UpdateTable(uint posState) { SetPrices(posState, _tableSize, _prices, posState * 272); _counters[posState] = _tableSize; } public void UpdateTables(uint numPosStates) { for (uint num = 0u; num < numPosStates; num++) { UpdateTable(num); } } public new void Encode(SevenZip.Compression.RangeCoder.Encoder rangeEncoder, uint symbol, uint posState) { base.Encode(rangeEncoder, symbol, posState); if (--_counters[posState] == 0) { UpdateTable(posState); } } } private class Optimal { public Base.State State; public bool Prev1IsChar; public bool Prev2; public uint PosPrev2; public uint BackPrev2; public uint Price; public uint PosPrev; public uint BackPrev; public uint Backs0; public uint Backs1; public uint Backs2; public uint Backs3; public void MakeAsChar() { BackPrev = uint.MaxValue; Prev1IsChar = false; } public void MakeAsShortRep() { BackPrev = 0u; Prev1IsChar = false; } public bool IsShortRep() { return BackPrev == 0; } } private const uint kIfinityPrice = 268435455u; private static byte[] g_FastPos; private Base.State _state; private byte _previousByte; private uint[] _repDistances = new uint[4]; private const int kDefaultDictionaryLogSize = 22; private const uint kNumFastBytesDefault = 32u; private const uint kNumLenSpecSymbols = 16u; private const uint kNumOpts = 4096u; private Optimal[] _optimum = new Optimal[4096]; private IMatchFinder _matchFinder; private SevenZip.Compression.RangeCoder.Encoder _rangeEncoder = new SevenZip.Compression.RangeCoder.Encoder(); private BitEncoder[] _isMatch = new BitEncoder[192]; private BitEncoder[] _isRep = new BitEncoder[12]; private BitEncoder[] _isRepG0 = new BitEncoder[12]; private BitEncoder[] _isRepG1 = new BitEncoder[12]; private BitEncoder[] _isRepG2 = new BitEncoder[12]; private BitEncoder[] _isRep0Long = new BitEncoder[192]; private BitTreeEncoder[] _posSlotEncoder = new BitTreeEncoder[4]; private BitEncoder[] _posEncoders = new BitEncoder[114]; private BitTreeEncoder _posAlignEncoder = new BitTreeEncoder(4); private LenPriceTableEncoder _lenEncoder = new LenPriceTableEncoder(); private LenPriceTableEncoder _repMatchLenEncoder = new LenPriceTableEncoder(); private LiteralEncoder _literalEncoder = new LiteralEncoder(); private uint[] _matchDistances = new uint[548]; private uint _numFastBytes = 32u; private uint _longestMatchLength; private uint _numDistancePairs; private uint _additionalOffset; private uint _optimumEndIndex; private uint _optimumCurrentIndex; private bool _longestMatchWasFound; private uint[] _posSlotPrices = new uint[256]; private uint[] _distancesPrices = new uint[512]; private uint[] _alignPrices = new uint[16]; private uint _alignPriceCount; private uint _distTableSize = 44u; private int _posStateBits = 2; private uint _posStateMask = 3u; private int _numLiteralPosStateBits; private int _numLiteralContextBits = 3; private uint _dictionarySize = 4194304u; private uint _dictionarySizePrev = uint.MaxValue; private uint _numFastBytesPrev = uint.MaxValue; private long nowPos64; private bool _finished; private Stream _inStream; private EMatchFinderType _matchFinderType = EMatchFinderType.BT4; private bool _writeEndMark; private bool _needReleaseMFStream; private uint[] reps = new uint[4]; private uint[] repLens = new uint[4]; private const int kPropSize = 5; private byte[] properties = new byte[5]; private uint[] tempPrices = new uint[128]; private uint _matchPriceCount; private static string[] kMatchFinderIDs; private uint _trainSize; static Encoder() { g_FastPos = new byte[2048]; kMatchFinderIDs = new string[2] { "BT2", "BT4" }; int num = 2; g_FastPos[0] = 0; g_FastPos[1] = 1; for (byte b = 2; b < 22; b++) { uint num2 = (uint)(1 << (b >> 1) - 1); uint num3 = 0u; while (num3 < num2) { g_FastPos[num] = b; num3++; num++; } } } private static uint GetPosSlot(uint pos) { if (pos < 2048) { return g_FastPos[pos]; } if (pos < 2097152) { return (uint)(g_FastPos[pos >> 10] + 20); } return (uint)(g_FastPos[pos >> 20] + 40); } private static uint GetPosSlot2(uint pos) { if (pos < 131072) { return (uint)(g_FastPos[pos >> 6] + 12); } if (pos < 134217728) { return (uint)(g_FastPos[pos >> 16] + 32); } return (uint)(g_FastPos[pos >> 26] + 52); } private void BaseInit() { _state.Init(); _previousByte = 0; for (uint num = 0u; num < 4; num++) { _repDistances[num] = 0u; } } private void Create() { if (_matchFinder == null) { BinTree binTree = new BinTree(); int type = 4; if (_matchFinderType == EMatchFinderType.BT2) { type = 2; } binTree.SetType(type); _matchFinder = binTree; } _literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits); if (_dictionarySize != _dictionarySizePrev || _numFastBytesPrev != _numFastBytes) { _matchFinder.Create(_dictionarySize, 4096u, _numFastBytes, 274u); _dictionarySizePrev = _dictionarySize; _numFastBytesPrev = _numFastBytes; } } public Encoder() { for (int i = 0; (long)i < 4096L; i++) { _optimum[i] = new Optimal(); } for (int j = 0; (long)j < 4L; j++) { _posSlotEncoder[j] = new BitTreeEncoder(6); } } private void SetWriteEndMarkerMode(bool writeEndMarker) { _writeEndMark = writeEndMarker; } private void Init() { BaseInit(); _rangeEncoder.Init(); for (uint num = 0u; num < 12; num++) { for (uint num2 = 0u; num2 <= _posStateMask; num2++) { uint num3 = (num << 4) + num2; _isMatch[num3].Init(); _isRep0Long[num3].Init(); } _isRep[num].Init(); _isRepG0[num].Init(); _isRepG1[num].Init(); _isRepG2[num].Init(); } _literalEncoder.Init(); for (uint num = 0u; num < 4; num++) { _posSlotEncoder[num].Init(); } for (uint num = 0u; num < 114; num++) { _posEncoders[num].Init(); } _lenEncoder.Init((uint)(1 << _posStateBits)); _repMatchLenEncoder.Init((uint)(1 << _posStateBits)); _posAlignEncoder.Init(); _longestMatchWasFound = false; _optimumEndIndex = 0u; _optimumCurrentIndex = 0u; _additionalOffset = 0u; } private void ReadMatchDistances(out uint lenRes, out uint numDistancePairs) { lenRes = 0u; numDistancePairs = _matchFinder.GetMatches(_matchDistances); if (numDistancePairs != 0) { lenRes = _matchDistances[numDistancePairs - 2]; if (lenRes == _numFastBytes) { lenRes += _matchFinder.GetMatchLen((int)(lenRes - 1), _matchDistances[numDistancePairs - 1], 273 - lenRes); } } _additionalOffset++; } private void MovePos(uint num) { if (num != 0) { _matchFinder.Skip(num); _additionalOffset += num; } } private uint GetRepLen1Price(Base.State state, uint posState) { return _isRepG0[state.Index].GetPrice0() + _isRep0Long[(state.Index << 4) + posState].GetPrice0(); } private uint GetPureRepPrice(uint repIndex, Base.State state, uint posState) { uint price; if (repIndex == 0) { price = _isRepG0[state.Index].GetPrice0(); return price + _isRep0Long[(state.Index << 4) + posState].GetPrice1(); } price = _isRepG0[state.Index].GetPrice1(); if (repIndex == 1) { return price + _isRepG1[state.Index].GetPrice0(); } price += _isRepG1[state.Index].GetPrice1(); return price + _isRepG2[state.Index].GetPrice(repIndex - 2); } private uint GetRepPrice(uint repIndex, uint len, Base.State state, uint posState) { return _repMatchLenEncoder.GetPrice(len - 2, posState) + GetPureRepPrice(repIndex, state, posState); } private uint GetPosLenPrice(uint pos, uint len, uint posState) { uint lenToPosState = Base.GetLenToPosState(len); uint num = ((pos >= 128) ? (_posSlotPrices[(lenToPosState << 6) + GetPosSlot2(pos)] + _alignPrices[pos & 0xF]) : _distancesPrices[lenToPosState * 128 + pos]); return num + _lenEncoder.GetPrice(len - 2, posState); } private uint Backward(out uint backRes, uint cur) { _optimumEndIndex = cur; uint posPrev = _optimum[cur].PosPrev; uint backPrev = _optimum[cur].BackPrev; do { if (_optimum[cur].Prev1IsChar) { _optimum[posPrev].MakeAsChar(); _optimum[posPrev].PosPrev = posPrev - 1; if (_optimum[cur].Prev2) { _optimum[posPrev - 1].Prev1IsChar = false; _optimum[posPrev - 1].PosPrev = _optimum[cur].PosPrev2; _optimum[posPrev - 1].BackPrev = _optimum[cur].BackPrev2; } } uint num = posPrev; uint backPrev2 = backPrev; backPrev = _optimum[num].BackPrev; posPrev = _optimum[num].PosPrev; _optimum[num].BackPrev = backPrev2; _optimum[num].PosPrev = cur; cur = num; } while (cur != 0); backRes = _optimum[0].BackPrev; _optimumCurrentIndex = _optimum[0].PosPrev; return _optimumCurrentIndex; } private uint GetOptimum(uint position, out uint backRes) { if (_optimumEndIndex != _optimumCurrentIndex) { uint result = _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex; backRes = _optimum[_optimumCurrentIndex].BackPrev; _optimumCurrentIndex = _optimum[_optimumCurrentIndex].PosPrev; return result; } _optimumCurrentIndex = (_optimumEndIndex = 0u); uint lenRes; uint numDistancePairs; if (!_longestMatchWasFound) { ReadMatchDistances(out lenRes, out numDistancePairs); } else { lenRes = _longestMatchLength; numDistancePairs = _numDistancePairs; _longestMatchWasFound = false; } uint num = _matchFinder.GetNumAvailableBytes() + 1; if (num < 2) { backRes = uint.MaxValue; return 1u; } if (num > 273) { num = 273u; } uint num2 = 0u; for (uint num3 = 0u; num3 < 4; num3++) { reps[num3] = _repDistances[num3]; repLens[num3] = _matchFinder.GetMatchLen(-1, reps[num3], 273u); if (repLens[num3] > repLens[num2]) { num2 = num3; } } if (repLens[num2] >= _numFastBytes) { backRes = num2; uint num4 = repLens[num2]; MovePos(num4 - 1); return num4; } if (lenRes >= _numFastBytes) { backRes = _matchDistances[numDistancePairs - 1] + 4; MovePos(lenRes - 1); return lenRes; } byte indexByte = _matchFinder.GetIndexByte(-1); byte indexByte2 = _matchFinder.GetIndexByte((int)(0 - _repDistances[0] - 1 - 1)); if (lenRes < 2 && indexByte != indexByte2 && repLens[num2] < 2) { backRes = uint.MaxValue; return 1u; } _optimum[0].State = _state; uint num5 = position & _posStateMask; _optimum[1].Price = _isMatch[(_state.Index << 4) + num5].GetPrice0() + _literalEncoder.GetSubCoder(position, _previousByte).GetPrice(!_state.IsCharState(), indexByte2, indexByte); _optimum[1].MakeAsChar(); uint price = _isMatch[(_state.Index << 4) + num5].GetPrice1(); uint num6 = price + _isRep[_state.Index].GetPrice1(); if (indexByte2 == indexByte) { uint num7 = num6 + GetRepLen1Price(_state, num5); if (num7 < _optimum[1].Price) { _optimum[1].Price = num7; _optimum[1].MakeAsShortRep(); } } uint num8 = ((lenRes >= repLens[num2]) ? lenRes : repLens[num2]); if (num8 < 2) { backRes = _optimum[1].BackPrev; return 1u; } _optimum[1].PosPrev = 0u; _optimum[0].Backs0 = reps[0]; _optimum[0].Backs1 = reps[1]; _optimum[0].Backs2 = reps[2]; _optimum[0].Backs3 = reps[3]; uint num9 = num8; do { _optimum[num9--].Price = 268435455u; } while (num9 >= 2); for (uint num3 = 0u; num3 < 4; num3++) { uint num10 = repLens[num3]; if (num10 < 2) { continue; } uint num11 = num6 + GetPureRepPrice(num3, _state, num5); do { uint num12 = num11 + _repMatchLenEncoder.GetPrice(num10 - 2, num5); Optimal optimal = _optimum[num10]; if (num12 < optimal.Price) { optimal.Price = num12; optimal.PosPrev = 0u; optimal.BackPrev = num3; optimal.Prev1IsChar = false; } } while (--num10 >= 2); } uint num13 = price + _isRep[_state.Index].GetPrice0(); num9 = ((repLens[0] >= 2) ? (repLens[0] + 1) : 2u); if (num9 <= lenRes) { uint num14; for (num14 = 0u; num9 > _matchDistances[num14]; num14 += 2) { } while (true) { uint num15 = _matchDistances[num14 + 1]; uint num16 = num13 + GetPosLenPrice(num15, num9, num5); Optimal optimal2 = _optimum[num9]; if (num16 < optimal2.Price) { optimal2.Price = num16; optimal2.PosPrev = 0u; optimal2.BackPrev = num15 + 4; optimal2.Prev1IsChar = false; } if (num9 == _matchDistances[num14]) { num14 += 2; if (num14 == numDistancePairs) { break; } } num9++; } } uint num17 = 0u; uint lenRes2; while (true) { num17++; if (num17 == num8) { return Backward(out backRes, num17); } ReadMatchDistances(out lenRes2, out numDistancePairs); if (lenRes2 >= _numFastBytes) { break; } position++; uint num18 = _optimum[num17].PosPrev; Base.State state; if (_optimum[num17].Prev1IsChar) { num18--; if (_optimum[num17].Prev2) { state = _optimum[_optimum[num17].PosPrev2].State; if (_optimum[num17].BackPrev2 < 4) { state.UpdateRep(); } else { state.UpdateMatch(); } } else { state = _optimum[num18].State; } state.UpdateChar(); } else { state = _optimum[num18].State; } if (num18 == num17 - 1) { if (_optimum[num17].IsShortRep()) { state.UpdateShortRep(); } else { state.UpdateChar(); } } else { uint num19; if (_optimum[num17].Prev1IsChar && _optimum[num17].Prev2) { num18 = _optimum[num17].PosPrev2; num19 = _optimum[num17].BackPrev2; state.UpdateRep(); } else { num19 = _optimum[num17].BackPrev; if (num19 < 4) { state.UpdateRep(); } else { state.UpdateMatch(); } } Optimal optimal3 = _optimum[num18]; switch (num19) { case 0u: reps[0] = optimal3.Backs0; reps[1] = optimal3.Backs1; reps[2] = optimal3.Backs2; reps[3] = optimal3.Backs3; break; case 1u: reps[0] = optimal3.Backs1; reps[1] = optimal3.Backs0; reps[2] = optimal3.Backs2; reps[3] = optimal3.Backs3; break; case 2u: reps[0] = optimal3.Backs2; reps[1] = optimal3.Backs0; reps[2] = optimal3.Backs1; reps[3] = optimal3.Backs3; break; case 3u: reps[0] = optimal3.Backs3; reps[1] = optimal3.Backs0; reps[2] = optimal3.Backs1; reps[3] = optimal3.Backs2; break; default: reps[0] = num19 - 4; reps[1] = optimal3.Backs0; reps[2] = optimal3.Backs1; reps[3] = optimal3.Backs2; break; } } _optimum[num17].State = state; _optimum[num17].Backs0 = reps[0]; _optimum[num17].Backs1 = reps[1]; _optimum[num17].Backs2 = reps[2]; _optimum[num17].Backs3 = reps[3]; uint price2 = _optimum[num17].Price; indexByte = _matchFinder.GetIndexByte(-1); indexByte2 = _matchFinder.GetIndexByte((int)(0 - reps[0] - 1 - 1)); num5 = position & _posStateMask; uint num20 = price2 + _isMatch[(state.Index << 4) + num5].GetPrice0() + _literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(-2)).GetPrice(!state.IsCharState(), indexByte2, indexByte); Optimal optimal4 = _optimum[num17 + 1]; bool flag = false; if (num20 < optimal4.Price) { optimal4.Price = num20; optimal4.PosPrev = num17; optimal4.MakeAsChar(); flag = true; } price = price2 + _isMatch[(state.Index << 4) + num5].GetPrice1(); num6 = price + _isRep[state.Index].GetPrice1(); if (indexByte2 == indexByte && (optimal4.PosPrev >= num17 || optimal4.BackPrev != 0)) { uint num21 = num6 + GetRepLen1Price(state, num5); if (num21 <= optimal4.Price) { optimal4.Price = num21; optimal4.PosPrev = num17; optimal4.MakeAsShortRep(); flag = true; } } uint val = _matchFinder.GetNumAvailableBytes() + 1; val = Math.Min(4095 - num17, val); num = val; if (num < 2) { continue; } if (num > _numFastBytes) { num = _numFastBytes; } if (!flag && indexByte2 != indexByte) { uint limit = Math.Min(val - 1, _numFastBytes); uint matchLen = _matchFinder.GetMatchLen(0, reps[0], limit); if (matchLen >= 2) { Base.State state2 = state; state2.UpdateChar(); uint num22 = (position + 1) & _posStateMask; uint num23 = num20 + _isMatch[(state2.Index << 4) + num22].GetPrice1() + _isRep[state2.Index].GetPrice1(); uint num24 = num17 + 1 + matchLen; while (num8 < num24) { _optimum[++num8].Price = 268435455u; } uint num25 = num23 + GetRepPrice(0u, matchLen, state2, num22); Optimal optimal5 = _optimum[num24]; if (num25 < optimal5.Price) { optimal5.Price = num25; optimal5.PosPrev = num17 + 1; optimal5.BackPrev = 0u; optimal5.Prev1IsChar = true; optimal5.Prev2 = false; } } } uint num26 = 2u; for (uint num27 = 0u; num27 < 4; num27++) { uint num28 = _matchFinder.GetMatchLen(-1, reps[num27], num); if (num28 < 2) { continue; } uint num29 = num28; while (true) { if (num8 < num17 + num28) { _optimum[++num8].Price = 268435455u; continue; } uint num30 = num6 + GetRepPrice(num27, num28, state, num5); Optimal optimal6 = _optimum[num17 + num28]; if (num30 < optimal6.Price) { optimal6.Price = num30; optimal6.PosPrev = num17; optimal6.BackPrev = num27; optimal6.Prev1IsChar = false; } if (--num28 < 2) { break; } } num28 = num29; if (num27 == 0) { num26 = num28 + 1; } if (num28 >= val) { continue; } uint limit2 = Math.Min(val - 1 - num28, _numFastBytes); uint matchLen2 = _matchFinder.GetMatchLen((int)num28, reps[num27], limit2); if (matchLen2 >= 2) { Base.State state3 = state; state3.UpdateRep(); uint num31 = (position + num28) & _posStateMask; uint num32 = num6 + GetRepPrice(num27, num28, state, num5) + _isMatch[(state3.Index << 4) + num31].GetPrice0() + _literalEncoder.GetSubCoder(position + num28, _matchFinder.GetIndexByte((int)(num28 - 1 - 1))).GetPrice(matchMode: true, _matchFinder.GetIndexByte((int)(num28 - 1 - (reps[num27] + 1))), _matchFinder.GetIndexByte((int)(num28 - 1))); state3.UpdateChar(); num31 = (position + num28 + 1) & _posStateMask; uint num33 = num32 + _isMatch[(state3.Index << 4) + num31].GetPrice1() + _isRep[state3.Index].GetPrice1(); uint num34 = num28 + 1 + matchLen2; while (num8 < num17 + num34) { _optimum[++num8].Price = 268435455u; } uint num35 = num33 + GetRepPrice(0u, matchLen2, state3, num31); Optimal optimal7 = _optimum[num17 + num34]; if (num35 < optimal7.Price) { optimal7.Price = num35; optimal7.PosPrev = num17 + num28 + 1; optimal7.BackPrev = 0u; optimal7.Prev1IsChar = true; optimal7.Prev2 = true; optimal7.PosPrev2 = num17; optimal7.BackPrev2 = num27; } } } if (lenRes2 > num) { lenRes2 = num; for (numDistancePairs = 0u; lenRes2 > _matchDistances[numDistancePairs]; numDistancePairs += 2) { } _matchDistances[numDistancePairs] = lenRes2; numDistancePairs += 2; } if (lenRes2 < num26) { continue; } num13 = price + _isRep[state.Index].GetPrice0(); while (num8 < num17 + lenRes2) { _optimum[++num8].Price = 268435455u; } uint num36; for (num36 = 0u; num26 > _matchDistances[num36]; num36 += 2) { } uint num37 = num26; while (true) { uint num38 = _matchDistances[num36 + 1]; uint num39 = num13 + GetPosLenPrice(num38, num37, num5); Optimal optimal8 = _optimum[num17 + num37]; if (num39 < optimal8.Price) { optimal8.Price = num39; optimal8.PosPrev = num17; optimal8.BackPrev = num38 + 4; optimal8.Prev1IsChar = false; } if (num37 == _matchDistances[num36]) { if (num37 < val) { uint limit3 = Math.Min(val - 1 - num37, _numFastBytes); uint matchLen3 = _matchFinder.GetMatchLen((int)num37, num38, limit3); if (matchLen3 >= 2) { Base.State state4 = state; state4.UpdateMatch(); uint num40 = (position + num37) & _posStateMask; uint num41 = num39 + _isMatch[(state4.Index << 4) + num40].GetPrice0() + _literalEncoder.GetSubCoder(position + num37, _matchFinder.GetIndexByte((int)(num37 - 1 - 1))).GetPrice(matchMode: true, _matchFinder.GetIndexByte((int)(num37 - (num38 + 1) - 1)), _matchFinder.GetIndexByte((int)(num37 - 1))); state4.UpdateChar(); num40 = (position + num37 + 1) & _posStateMask; uint num42 = num41 + _isMatch[(state4.Index << 4) + num40].GetPrice1() + _isRep[state4.Index].GetPrice1(); uint num43 = num37 + 1 + matchLen3; while (num8 < num17 + num43) { _optimum[++num8].Price = 268435455u; } num39 = num42 + GetRepPrice(0u, matchLen3, state4, num40); optimal8 = _optimum[num17 + num43]; if (num39 < optimal8.Price) { optimal8.Price = num39; optimal8.PosPrev = num17 + num37 + 1; optimal8.BackPrev = 0u; optimal8.Prev1IsChar = true; optimal8.Prev2 = true; optimal8.PosPrev2 = num17; optimal8.BackPrev2 = num38 + 4; } } } num36 += 2; if (num36 == numDistancePairs) { break; } } num37++; } } _numDistancePairs = numDistancePairs; _longestMatchLength = lenRes2; _longestMatchWasFound = true; return Backward(out backRes, num17); } private bool ChangePair(uint smallDist, uint bigDist) { if (smallDist < 33554432) { return bigDist >= smallDist << 7; } return false; } private void WriteEndMarker(uint posState) { if (_writeEndMark) { _isMatch[(_state.Index << 4) + posState].Encode(_rangeEncoder, 1u); _isRep[_state.Index].Encode(_rangeEncoder, 0u); _state.UpdateMatch(); uint num = 2u; _lenEncoder.Encode(_rangeEncoder, num - 2, posState); uint symbol = 63u; uint lenToPosState = Base.GetLenToPosState(num); _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, symbol); int num2 = 30; uint num3 = (uint)((1 << num2) - 1); _rangeEncoder.EncodeDirectBits(num3 >> 4, num2 - 4); _posAlignEncoder.ReverseEncode(_rangeEncoder, num3 & 0xFu); } } private void Flush(uint nowPos) { ReleaseMFStream(); WriteEndMarker(nowPos & _posStateMask); _rangeEncoder.FlushData(); _rangeEncoder.FlushStream(); } public void CodeOneBlock(out long inSize, out long outSize, out bool finished) { inSize = 0L; outSize = 0L; finished = true; if (_inStream != null) { _matchFinder.SetStream(_inStream); _matchFinder.Init(); _needReleaseMFStream = true; _inStream = null; if (_trainSize != 0) { _matchFinder.Skip(_trainSize); } } if (_finished) { return; } _finished = true; long num = nowPos64; if (nowPos64 == 0L) { if (_matchFinder.GetNumAvailableBytes() == 0) { Flush((uint)nowPos64); return; } ReadMatchDistances(out var _, out var _); uint num2 = (uint)(int)nowPos64 & _posStateMask; _isMatch[(_state.Index << 4) + num2].Encode(_rangeEncoder, 0u); _state.UpdateChar(); byte indexByte = _matchFinder.GetIndexByte((int)(0 - _additionalOffset)); _literalEncoder.GetSubCoder((uint)nowPos64, _previousByte).Encode(_rangeEncoder, indexByte); _previousByte = indexByte; _additionalOffset--; nowPos64++; } if (_matchFinder.GetNumAvailableBytes() == 0) { Flush((uint)nowPos64); return; } while (true) { uint backRes; uint optimum = GetOptimum((uint)nowPos64, out backRes); uint num3 = (uint)(int)nowPos64 & _posStateMask; uint num4 = (_state.Index << 4) + num3; if (optimum == 1 && backRes == uint.MaxValue) { _isMatch[num4].Encode(_rangeEncoder, 0u); byte indexByte2 = _matchFinder.GetIndexByte((int)(0 - _additionalOffset)); LiteralEncoder.Encoder2 subCoder = _literalEncoder.GetSubCoder((uint)nowPos64, _previousByte); if (!_state.IsCharState()) { byte indexByte3 = _matchFinder.GetIndexByte((int)(0 - _repDistances[0] - 1 - _additionalOffset)); subCoder.EncodeMatched(_rangeEncoder, indexByte3, indexByte2); } else { subCoder.Encode(_rangeEncoder, indexByte2); } _previousByte = indexByte2; _state.UpdateChar(); } else { _isMatch[num4].Encode(_rangeEncoder, 1u); if (backRes < 4) { _isRep[_state.Index].Encode(_rangeEncoder, 1u); if (backRes == 0) { _isRepG0[_state.Index].Encode(_rangeEncoder, 0u); if (optimum == 1) { _isRep0Long[num4].Encode(_rangeEncoder, 0u); } else { _isRep0Long[num4].Encode(_rangeEncoder, 1u); } } else { _isRepG0[_state.Index].Encode(_rangeEncoder, 1u); if (backRes == 1) { _isRepG1[_state.Index].Encode(_rangeEncoder, 0u); } else { _isRepG1[_state.Index].Encode(_rangeEncoder, 1u); _isRepG2[_state.Index].Encode(_rangeEncoder, backRes - 2); } } if (optimum == 1) { _state.UpdateShortRep(); } else { _repMatchLenEncoder.Encode(_rangeEncoder, optimum - 2, num3); _state.UpdateRep(); } uint num5 = _repDistances[backRes]; if (backRes != 0) { for (uint num6 = backRes; num6 >= 1; num6--) { _repDistances[num6] = _repDistances[num6 - 1]; } _repDistances[0] = num5; } } else { _isRep[_state.Index].Encode(_rangeEncoder, 0u); _state.UpdateMatch(); _lenEncoder.Encode(_rangeEncoder, optimum - 2, num3); backRes -= 4; uint posSlot = GetPosSlot(backRes); uint lenToPosState = Base.GetLenToPosState(optimum); _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); if (posSlot >= 4) { int num7 = (int)((posSlot >> 1) - 1); uint num8 = (2 | (posSlot & 1)) << num7; uint num9 = backRes - num8; if (posSlot < 14) { BitTreeEncoder.ReverseEncode(_posEncoders, num8 - posSlot - 1, _rangeEncoder, num7, num9); } else { _rangeEncoder.EncodeDirectBits(num9 >> 4, num7 - 4); _posAlignEncoder.ReverseEncode(_rangeEncoder, num9 & 0xFu); _alignPriceCount++; } } uint num10 = backRes; for (uint num11 = 3u; num11 >= 1; num11--) { _repDistances[num11] = _repDistances[num11 - 1]; } _repDistances[0] = num10; _matchPriceCount++; } _previousByte = _matchFinder.GetIndexByte((int)(optimum - 1 - _additionalOffset)); } _additionalOffset -= optimum; nowPos64 += optimum; if (_additionalOffset == 0) { if (_matchPriceCount >= 128) { FillDistancesPrices(); } if (_alignPriceCount >= 16) { FillAlignPrices(); } inSize = nowPos64; outSize = _rangeEncoder.GetProcessedSizeAdd(); if (_matchFinder.GetNumAvailableBytes() == 0) { Flush((uint)nowPos64); return; } if (nowPos64 - num >= 4096) { break; } } } _finished = false; finished = false; } private void ReleaseMFStream() { if (_matchFinder != null && _needReleaseMFStream) { _matchFinder.ReleaseStream(); _needReleaseMFStream = false; } } private void SetOutStream(Stream outStream) { _rangeEncoder.SetStream(outStream); } private void ReleaseOutStream() { _rangeEncoder.ReleaseStream(); } private void ReleaseStreams() { ReleaseMFStream(); ReleaseOutStream(); } private void SetStreams(Stream inStream, Stream outStream, long inSize, long outSize) { _inStream = inStream; _finished = false; Create(); SetOutStream(outStream); Init(); FillDistancesPrices(); FillAlignPrices(); _lenEncoder.SetTableSize(_numFastBytes + 1 - 2); _lenEncoder.UpdateTables((uint)(1 << _posStateBits)); _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - 2); _repMatchLenEncoder.UpdateTables((uint)(1 << _posStateBits)); nowPos64 = 0L; } public void Code(Stream inStream, Stream outStream, long inSize, long outSize, ICodeProgress progress) { _needReleaseMFStream = false; try { SetStreams(inStream, outStream, inSize, outSize); while (true) { CodeOneBlock(out var inSize2, out var outSize2, out var finished); if (finished) { break; } progress?.SetProgress(inSize2, outSize2); } } finally { ReleaseStreams(); } } public void WriteCoderProperties(Stream outStream) { properties[0] = (byte)((_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits); for (int i = 0; i < 4; i++) { properties[1 + i] = (byte)((_dictionarySize >> 8 * i) & 0xFFu); } outStream.Write(properties, 0, 5); } private void FillDistancesPrices() { for (uint num = 4u; num < 128; num++) { uint posSlot = GetPosSlot(num); int num2 = (int)((posSlot >> 1) - 1); uint num3 = (2 | (posSlot & 1)) << num2; tempPrices[num] = BitTreeEncoder.ReverseGetPrice(_posEncoders, num3 - posSlot - 1, num2, num - num3); } for (uint num4 = 0u; num4 < 4; num4++) { BitTreeEncoder bitTreeEncoder = _posSlotEncoder[num4]; uint num5 = num4 << 6; for (uint num6 = 0u; num6 < _distTableSize; num6++) { _posSlotPrices[num5 + num6] = bitTreeEncoder.GetPrice(num6); } for (uint num6 = 14u; num6 < _distTableSize; num6++) { _posSlotPrices[num5 + num6] += (num6 >> 1) - 1 - 4 << 6; } uint num7 = num4 * 128; uint num8; for (num8 = 0u; num8 < 4; num8++) { _distancesPrices[num7 + num8] = _posSlotPrices[num5 + num8]; } for (; num8 < 128; num8++) { _distancesPrices[num7 + num8] = _posSlotPrices[num5 + GetPosSlot(num8)] + tempPrices[num8]; } } _matchPriceCount = 0u; } private void FillAlignPrices() { for (uint num = 0u; num < 16; num++) { _alignPrices[num] = _posAlignEncoder.ReverseGetPrice(num); } _alignPriceCount = 0u; } private static int FindMatchFinder(string s) { for (int i = 0; i < kMatchFinderIDs.Length; i++) { if (s == kMatchFinderIDs[i]) { return i; } } return -1; } public void SetCoderProperties(CoderPropID[] propIDs, object[] properties) { for (uint num = 0u; num < properties.Length; num++) { object obj = properties[num]; switch (propIDs[num]) { case CoderPropID.NumFastBytes: if (!(obj is int num2)) { throw new InvalidParamException(); } if (num2 < 5 || (long)num2 > 273L) { throw new InvalidParamException(); } _numFastBytes = (uint)num2; break; case CoderPropID.MatchFinder: { if (!(obj is string)) { throw new InvalidParamException(); } EMatchFinderType matchFinderType = _matchFinderType; int num6 = FindMatchFinder(((string)obj).ToUpper()); if (num6 < 0) { throw new InvalidParamException(); } _matchFinderType = (EMatchFinderType)num6; if (_matchFinder != null && matchFinderType != _matchFinderType) { _dictionarySizePrev = uint.MaxValue; _matchFinder = null; } break; } case CoderPropID.DictionarySize: { if (!(obj is int num7)) { throw new InvalidParamException(); } if ((long)num7 < 1L || (long)num7 > 1073741824L) { throw new InvalidParamException(); } _dictionarySize = (uint)num7; int i; for (i = 0; (long)i < 30L && num7 > (uint)(1 << i); i++) { } _distTableSize = (uint)(i * 2); break; } case CoderPropID.PosStateBits: if (!(obj is int num3)) { throw new InvalidParamException(); } if (num3 < 0 || (long)num3 > 4L) { throw new InvalidParamException(); } _posStateBits = num3; _posStateMask = (uint)((1 << _posStateBits) - 1); break; case CoderPropID.LitPosBits: if (!(obj is int num5)) { throw new InvalidParamException(); } if (num5 < 0 || (long)num5 > 4L) { throw new InvalidParamException(); } _numLiteralPosStateBits = num5; break; case CoderPropID.LitContextBits: if (!(obj is int num4)) { throw new InvalidParamException(); } if (num4 < 0 || (long)num4 > 8L) { throw new InvalidParamException(); } _numLiteralContextBits = num4; break; case CoderPropID.EndMarker: if (!(obj is bool)) { throw new InvalidParamException(); } SetWriteEndMarkerMode((bool)obj); break; default: throw new InvalidParamException(); case CoderPropID.Algorithm: break; } } } public void SetTrainSize(uint trainSize) { _trainSize = trainSize; } } public static class SevenZipHelper { private static CoderPropID[] propIDs = new CoderPropID[8] { CoderPropID.DictionarySize, CoderPropID.PosStateBits, CoderPropID.LitContextBits, CoderPropID.LitPosBits, CoderPropID.Algorithm, CoderPropID.NumFastBytes, CoderPropID.MatchFinder, CoderPropID.EndMarker }; private static object[] properties = new object[8] { 2097152, 2, 3, 0, 2, 32, "bt4", false }; public static byte[] Compress(byte[] inputBytes, ICodeProgress progress = null) { MemoryStream inStream = new MemoryStream(inputBytes); MemoryStream memoryStream = new MemoryStream(); Compress(inStream, memoryStream, progress); return memoryStream.ToArray(); } public static void Compress(Stream inStream, Stream outStream, ICodeProgress progress = null) { Encoder encoder = new Encoder(); encoder.SetCoderProperties(propIDs, properties); encoder.WriteCoderProperties(outStream); encoder.Code(inStream, outStream, -1L, -1L, progress); } public static byte[] Decompress(byte[] inputBytes) { MemoryStream memoryStream = new MemoryStream(inputBytes); Decoder decoder = new Decoder(); memoryStream.Seek(0L, SeekOrigin.Begin); MemoryStream memoryStream2 = new MemoryStream(); byte[] array = new byte[5]; if (memoryStream.Read(array, 0, 5) != 5) { throw new Exception("input .lzma is too short"); } long num = 0L; for (int i = 0; i < 8; i++) { int num2 = memoryStream.ReadByte(); if (num2 < 0) { throw new Exception("Can't Read 1"); } num |= (long)((ulong)(byte)num2 << 8 * i); } decoder.SetDecoderProperties(array); long inSize = memoryStream.Length - memoryStream.Position; decoder.Code(memoryStream, memoryStream2, inSize, num, null); return memoryStream2.ToArray(); } public static MemoryStream StreamDecompress(MemoryStream newInStream) { Decoder decoder = new Decoder(); newInStream.Seek(0L, SeekOrigin.Begin); MemoryStream memoryStream = new MemoryStream(); byte[] array = new byte[5]; if (newInStream.Read(array, 0, 5) != 5) { throw new Exception("input .lzma is too short"); } long num = 0L; for (int i = 0; i < 8; i++) { int num2 = newInStream.ReadByte(); if (num2 < 0) { throw new Exception("Can't Read 1"); } num |= (long)((ulong)(byte)num2 << 8 * i); } decoder.SetDecoderProperties(array); long inSize = newInStream.Length - newInStream.Position; decoder.Code(newInStream, memoryStream, inSize, num, null); memoryStream.Position = 0L; return memoryStream; } public static MemoryStream StreamDecompress(MemoryStream newInStream, long outSize) { Decoder decoder = new Decoder(); newInStream.Seek(0L, SeekOrigin.Begin); MemoryStream memoryStream = new MemoryStream(); byte[] array = new byte[5]; if (newInStream.Read(array, 0, 5) != 5) { throw new Exception("input .lzma is too short"); } decoder.SetDecoderProperties(array); long inSize = newInStream.Length - newInStream.Position; decoder.Code(newInStream, memoryStream, inSize, outSize, null); memoryStream.Position = 0L; return memoryStream; } public static void StreamDecompress(Stream compressedStream, Stream decompressedStream, long compressedSize, long decompressedSize) { long position = compressedStream.Position; Decoder decoder = new Decoder(); byte[] array = new byte[5]; if (compressedStream.Read(array, 0, 5) != 5) { throw new Exception("input .lzma is too short"); } decoder.SetDecoderProperties(array); decoder.Code(compressedStream, decompressedStream, compressedSize - 5, decompressedSize, null); compressedStream.Position = position + compressedSize; } } } namespace SevenZip.Buffer { public class InBuffer { private byte[] m_Buffer; private uint m_Pos; private uint m_Limit; private uint m_BufferSize; private Stream m_Stream; private bool m_StreamWasExhausted; private ulong m_ProcessedSize; public InBuffer(uint bufferSize) { m_Buffer = new byte[bufferSize]; m_BufferSize = bufferSize; } public void Init(Stream stream) { m_Stream = stream; m_ProcessedSize = 0uL; m_Limit = 0u; m_Pos = 0u; m_StreamWasExhausted = false; } public bool ReadBlock() { if (m_StreamWasExhausted) { return false; } m_ProcessedSize += m_Pos; int num = m_Stream.Read(m_Buffer, 0, (int)m_BufferSize); m_Pos = 0u; m_Limit = (uint)num; m_StreamWasExhausted = num == 0; return !m_StreamWasExhausted; } public void ReleaseStream() { m_Stream = null; } public bool ReadByte(byte b) { if (m_Pos >= m_Limit && !ReadBlock()) { return false; } b = m_Buffer[m_Pos++]; return true; } public byte ReadByte() { if (m_Pos >= m_Limit && !ReadBlock()) { return byte.MaxValue; } return m_Buffer[m_Pos++]; } public ulong GetProcessedSize() { return m_ProcessedSize + m_Pos; } } public class OutBuffer { private byte[] m_Buffer; private uint m_Pos; private uint m_BufferSize; private Stream m_Stream; private ulong m_ProcessedSize; public OutBuffer(uint bufferSize) { m_Buffer = new byte[bufferSize]; m_BufferSize = bufferSize; } public void SetStream(Stream stream) { m_Stream = stream; } public void FlushStream() { m_Stream.Flush(); } public void CloseStream() { m_Stream.Close(); } public void ReleaseStream() { m_Stream = null; } public void Init() { m_ProcessedSize = 0uL; m_Pos = 0u; } public void WriteByte(byte b) { m_Buffer[m_Pos++] = b; if (m_Pos >= m_BufferSize) { FlushData(); } } public void FlushData() { if (m_Pos != 0) { m_Stream.Write(m_Buffer, 0, (int)m_Pos); m_Pos = 0u; } } public ulong GetProcessedSize() { return m_ProcessedSize + m_Pos; } } } namespace SevenZip.CommandLineParser { public enum SwitchType { Simple, PostMinus, LimitedPostString, UnLimitedPostString, PostChar } public class SwitchForm { public string IDString; public SwitchType Type; public bool Multi; public int MinLen; public int MaxLen; public string PostCharSet; public SwitchForm(string idString, SwitchType type, bool multi, int minLen, int maxLen, string postCharSet) { IDString = idString; Type = type; Multi = multi; MinLen = minLen; MaxLen = maxLen; PostCharSet = postCharSet; } public SwitchForm(string idString, SwitchType type, bool multi, int minLen) : this(idString, type, multi, minLen, 0, "") { } public SwitchForm(string idString, SwitchType type, bool multi) : this(idString, type, multi, 0) { } } public class SwitchResult { public bool ThereIs; public bool WithMinus; public ArrayList PostStrings = new ArrayList(); public int PostCharIndex; public SwitchResult() { ThereIs = false; } } public class Parser { public ArrayList NonSwitchStrings = new ArrayList(); private SwitchResult[] _switches; private const char kSwitchID1 = '-'; private const char kSwitchID2 = '/'; private const char kSwitchMinus = '-'; private const string kStopSwitchParsing = "--"; public SwitchResult this[int index] => _switches[index]; public Parser(int numSwitches) { _switches = new SwitchResult[numSwitches]; for (int i = 0; i < numSwitches; i++) { _switches[i] = new SwitchResult(); } } private bool ParseString(string srcString, SwitchForm[] switchForms) { int length = srcString.Length; if (length == 0) { return false; } int num = 0; if (!IsItSwitchChar(srcString[num])) { return false; } while (num < length) { if (IsItSwitchChar(srcString[num])) { num++; } int num2 = 0; int num3 = -1; for (int i = 0; i < _switches.Length; i++) { int length2 = switchForms[i].IDString.Length; if (length2 > num3 && num + length2 <= length && string.Compare(switchForms[i].IDString, 0, srcString, num, length2, ignoreCase: true) == 0) { num2 = i; num3 = length2; } } if (num3 == -1) { throw new Exception("maxLen == kNoLen"); } SwitchResult switchResult = _switches[num2]; SwitchForm switchForm = switchForms[num2]; if (!switchForm.Multi && switchResult.ThereIs) { throw new Exception("switch must be single"); } switchResult.ThereIs = true; num += num3; int num4 = length - num; SwitchType type = switchForm.Type; switch (type) { case SwitchType.PostMinus: if (num4 == 0) { switchResult.WithMinus = false; break; } switchResult.WithMinus = srcString[num] == '-'; if (switchResult.WithMinus) { num++; } break; case SwitchType.PostChar: { if (num4 < switchForm.MinLen) { throw new Exception("switch is not full"); } string postCharSet = switchForm.PostCharSet; if (num4 == 0) { switchResult.PostCharIndex = -1; break; } int num6 = postCharSet.IndexOf(srcString[num]); if (num6 < 0) { switchResult.PostCharIndex = -1; break; } switchResult.PostCharIndex = num6; num++; break; } case SwitchType.LimitedPostString: case SwitchType.UnLimitedPostString: { int minLen = switchForm.MinLen; if (num4 < minLen) { throw new Exception("switch is not full"); } if (type == SwitchType.UnLimitedPostString) { switchResult.PostStrings.Add(srcString.Substring(num)); return true; } string text = srcString.Substring(num, minLen); num += minLen; int num5 = minLen; while (num5 < switchForm.MaxLen && num < length) { char c = srcString[num]; if (IsItSwitchChar(c)) { break; } text += c; num5++; num++; } switchResult.PostStrings.Add(text); break; } } } return true; } public void ParseStrings(SwitchForm[] switchForms, string[] commandStrings) { int num = commandStrings.Length; bool flag = false; for (int i = 0; i < num; i++) { string text = commandStrings[i]; if (flag) { NonSwitchStrings.Add(text); } else if (text == "--") { flag = true; } else if (!ParseString(text, switchForms)) { NonSwitchStrings.Add(text); } } } public static int ParseCommand(CommandForm[] commandForms, string commandString, out string postString) { for (int i = 0; i < commandForms.Length; i++) { string iDString = commandForms[i].IDString; if (commandForms[i].PostStringMode) { if (commandString.IndexOf(iDString) == 0) { postString = commandString.Substring(iDString.Length); return i; } } else if (commandString == iDString) { postString = ""; return i; } } postString = ""; return -1; } private static bool ParseSubCharsCommand(int numForms, CommandSubCharsSet[] forms, string commandString, ArrayList indices) { indices.Clear(); int num = 0; for (int i = 0; i < numForms; i++) { CommandSubCharsSet commandSubCharsSet = forms[i]; int num2 = -1; int length = commandSubCharsSet.Chars.Length; for (int j = 0; j < length; j++) { char value = commandSubCharsSet.Chars[j]; int num3 = commandString.IndexOf(value); if (num3 >= 0) { if (num2 >= 0) { return false; } if (commandString.IndexOf(value, num3 + 1) >= 0) { return false; } num2 = j; num++; } } if (num2 == -1 && !commandSubCharsSet.EmptyAllowed) { return false; } indices.Add(num2); } return num == commandString.Length; } private static bool IsItSwitchChar(char c) { if (c != '-') { return c == '/'; } return true; } } public class CommandForm { public string IDString = ""; public bool PostStringMode; public CommandForm(string idString, bool postStringMode) { IDString = idString; PostStringMode = postStringMode; } } internal class CommandSubCharsSet { public string Chars = ""; public bool EmptyAllowed; } } namespace LZ4ps { public static class LZ4Codec { private class LZ4HC_Data_Structure { public byte[] src; public int src_base; public int src_end; public int src_LASTLITERALS; public byte[] dst; public int dst_base; public int dst_len; public int dst_end; public int[] hashTable; public ushort[] chainTable; public int nextToUpdate; } private const int MEMORY_USAGE = 14; private const int NOTCOMPRESSIBLE_DETECTIONLEVEL = 6; private const int BLOCK_COPY_LIMIT = 16; private const int MINMATCH = 4; private const int SKIPSTRENGTH = 6; private const int COPYLENGTH = 8; private const int LASTLITERALS = 5; private const int MFLIMIT = 12; private const int MINLENGTH = 13; private const int MAXD_LOG = 16; private const int MAXD = 65536; private const int MAXD_MASK = 65535; private const int MAX_DISTANCE = 65535; private const int ML_BITS = 4; private const int ML_MASK = 15; private const int RUN_BITS = 4; private const int RUN_MASK = 15; private const int STEPSIZE_64 = 8; private const int STEPSIZE_32 = 4; private const int LZ4_64KLIMIT = 65547; private const int HASH_LOG = 12; private const int HASH_TABLESIZE = 4096; private const int HASH_ADJUST = 20; private const int HASH64K_LOG = 13; private const int HASH64K_TABLESIZE = 8192; private const int HASH64K_ADJUST = 19; private const int HASHHC_LOG = 15; private const int HASHHC_TABLESIZE = 32768; private const int HASHHC_ADJUST = 17; private static readonly int[] DECODER_TABLE_32 = new int[8] { 0, 3, 2, 3, 0, 0, 0, 0 }; private static readonly int[] DECODER_TABLE_64 = new int[8] { 0, 0, 0, -1, 0, 1, 2, 3 }; private static readonly int[] DEBRUIJN_TABLE_32 = new int[32] { 0, 0, 3, 0, 3, 1, 3, 0, 3, 2, 2, 1, 3, 2, 0, 1, 3, 3, 1, 2, 2, 2, 2, 0, 3, 1, 2, 0, 1, 0, 1, 1 }; private static readonly int[] DEBRUIJN_TABLE_64 = new int[64] { 0, 0, 0, 0, 0, 1, 1, 2, 0, 3, 1, 3, 1, 4, 2, 7, 0, 2, 3, 6, 1, 5, 3, 5, 1, 3, 4, 4, 2, 5, 6, 7, 7, 0, 1, 2, 3, 3, 4, 6, 2, 6, 5, 5, 3, 4, 5, 6, 7, 1, 2, 4, 6, 4, 4, 5, 7, 2, 6, 5, 7, 6, 7, 7 }; private const int MAX_NB_ATTEMPTS = 256; private const int OPTIMAL_ML = 18; public static int MaximumOutputLength(int inputLength) { return inputLength + inputLength / 255 + 16; } internal static void CheckArguments(byte[] input, int inputOffset, ref int inputLength, byte[] output, int outputOffset, ref int outputLength) { if (inputLength < 0) { inputLength = input.Length - inputOffset; } if (inputLength == 0) { outputLength = 0; return; } if (input == null) { throw new ArgumentNullException("input"); } if (inputOffset < 0 || inputOffset + inputLength > input.Length) { throw new ArgumentException("inputOffset and inputLength are invalid for given input"); } if (outputLength < 0) { outputLength = output.Length - outputOffset; } if (output == null) { throw new ArgumentNullException("output"); } if (outputOffset >= 0 && outputOffset + outputLength <= output.Length) { return; } throw new ArgumentException("outputOffset and outputLength are invalid for given output"); } [Conditional("DEBUG")] private static void Assert(bool condition, string errorMessage) { if (!condition) { throw new ArgumentException(errorMessage); } } internal static void Poke2(byte[] buffer, int offset, ushort value) { buffer[offset] = (byte)value; buffer[offset + 1] = (byte)(value >> 8); } internal static ushort Peek2(byte[] buffer, int offset) { return (ushort)(buffer[offset] | (buffer[offset + 1] << 8)); } internal static uint Peek4(byte[] buffer, int offset) { return (uint)(buffer[offset] | (buffer[offset + 1] << 8) | (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)); } private static uint Xor4(byte[] buffer, int offset1, int offset2) { int num = buffer[offset1] | (buffer[offset1 + 1] << 8) | (buffer[offset1 + 2] << 16) | (buffer[offset1 + 3] << 24); uint num2 = (uint)(buffer[offset2] | (buffer[offset2 + 1] << 8) | (buffer[offset2 + 2] << 16) | (buffer[offset2 + 3] << 24)); return (uint)num ^ num2; } private static ulong Xor8(byte[] buffer, int offset1, int offset2) { ulong num = buffer[offset1] | ((ulong)buffer[offset1 + 1] << 8) | ((ulong)buffer[offset1 + 2] << 16) | ((ulong)buffer[offset1 + 3] << 24) | ((ulong)buffer[offset1 + 4] << 32) | ((ulong)buffer[offset1 + 5] << 40) | ((ulong)buffer[offset1 + 6] << 48) | ((ulong)buffer[offset1 + 7] << 56); ulong num2 = buffer[offset2] | ((ulong)buffer[offset2 + 1] << 8) | ((ulong)buffer[offset2 + 2] << 16) | ((ulong)buffer[offset2 + 3] << 24) | ((ulong)buffer[offset2 + 4] << 32) | ((ulong)buffer[offset2 + 5] << 40) | ((ulong)buffer[offset2 + 6] << 48) | ((ulong)buffer[offset2 + 7] << 56); return num ^ num2; } private static bool Equal2(byte[] buffer, int offset1, int offset2) { if (buffer[offset1] != buffer[offset2]) { return false; } return buffer[offset1 + 1] == buffer[offset2 + 1]; } private static bool Equal4(byte[] buffer, int offset1, int offset2) { if (buffer[offset1] != buffer[offset2]) { return false; } if (buffer[offset1 + 1] != buffer[offset2 + 1]) { return false; } if (buffer[offset1 + 2] != buffer[offset2 + 2]) { return false; } return buffer[offset1 + 3] == buffer[offset2 + 3]; } private static void Copy4(byte[] buf, int src, int dst) { buf[dst + 3] = buf[src + 3]; buf[dst + 2] = buf[src + 2]; buf[dst + 1] = buf[src + 1]; buf[dst] = buf[src]; } private static void Copy8(byte[] buf, int src, int dst) { buf[dst + 7] = buf[src + 7]; buf[dst + 6] = buf[src + 6]; buf[dst + 5] = buf[src + 5]; buf[dst + 4] = buf[src + 4]; buf[dst + 3] = buf[src + 3]; buf[dst + 2] = buf[src + 2]; buf[dst + 1] = buf[src + 1]; buf[dst] = buf[src]; } private static void BlockCopy(byte[] src, int src_0, byte[] dst, int dst_0, int len) { if (len >= 16) { Buffer.BlockCopy(src, src_0, dst, dst_0, len); return; } while (len >= 8) { dst[dst_0] = src[src_0]; dst[dst_0 + 1] = src[src_0 + 1]; dst[dst_0 + 2] = src[src_0 + 2]; dst[dst_0 + 3] = src[src_0 + 3]; dst[dst_0 + 4] = src[src_0 + 4]; dst[dst_0 + 5] = src[src_0 + 5]; dst[dst_0 + 6] = src[src_0 + 6]; dst[dst_0 + 7] = src[src_0 + 7]; len -= 8; src_0 += 8; dst_0 += 8; } while (len >= 4) { dst[dst_0] = src[src_0]; dst[dst_0 + 1] = src[src_0 + 1]; dst[dst_0 + 2] = src[src_0 + 2]; dst[dst_0 + 3] = src[src_0 + 3]; len -= 4; src_0 += 4; dst_0 += 4; } while (len-- > 0) { dst[dst_0++] = src[src_0++]; } } private static int WildCopy(byte[] src, int src_0, byte[] dst, int dst_0, int dst_end) { int num = dst_end - dst_0; if (num >= 16) { Buffer.BlockCopy(src, src_0, dst, dst_0, num); } else { while (num >= 4) { dst[dst_0] = src[src_0]; dst[dst_0 + 1] = src[src_0 + 1]; dst[dst_0 + 2] = src[src_0 + 2]; dst[dst_0 + 3] = src[src_0 + 3]; num -= 4; src_0 += 4; dst_0 += 4; } while (num-- > 0) { dst[dst_0++] = src[src_0++]; } } return num; } private static int SecureCopy(byte[] buffer, int src, int dst, int dst_end) { int num = dst - src; int num2 = dst_end - dst; int num3 = num2; if (num >= 16) { if (num >= num2) { Buffer.BlockCopy(buffer, src, buffer, dst, num2); return num2; } do { Buffer.BlockCopy(buffer, src, buffer, dst, num); src += num; dst += num; num3 -= num; } while (num3 >= num); } while (num3 >= 4) { buffer[dst] = buffer[src]; buffer[dst + 1] = buffer[src + 1]; buffer[dst + 2] = buffer[src + 2]; buffer[dst + 3] = buffer[src + 3]; dst += 4; src += 4; num3 -= 4; } while (num3-- > 0) { buffer[dst++] = buffer[src++]; } return num2; } public static int Encode32(byte[] input, int inputOffset, int inputLength, byte[] output, int outputOffset, int outputLength) { CheckArguments(input, inputOffset, ref inputLength, output, outputOffset, ref outputLength); if (outputLength == 0) { return 0; } if (inputLength < 65547) { return LZ4_compress64kCtx_safe32(new ushort[8192], input, output, inputOffset, outputOffset, inputLength, outputLength); } return LZ4_compressCtx_safe32(new int[4096], input, output, inputOffset, outputOffset, inputLength, outputLength); } public static byte[] Encode32(byte[] input, int inputOffset, int inputLength) { if (inputLength < 0) { inputLength = input.Length - inputOffset; } if (input == null) { throw new ArgumentNullException("input"); } if (inputOffset < 0 || inputOffset + inputLength > input.Length) { throw new ArgumentException("inputOffset and inputLength are invalid for given input"); } byte[] array = new byte[MaximumOutputLength(inputLength)]; int num = Encode32(input, inputOffset, inputLength, array, 0, array.Length); if (num != array.Length) { if (num < 0) { throw new InvalidOperationException("Compression has been corrupted"); } byte[] array2 = new byte[num]; Buffer.BlockCopy(array, 0, array2, 0, num); return array2; } return array; } public static int Encode64(byte[] input, int inputOffset, int inputLength, byte[] output, int outputOffset, int outputLength) { CheckArguments(input, inputOffset, ref inputLength, output, outputOffset, ref outputLength); if (outputLength == 0) { return 0; } if (inputLength < 65547) { return LZ4_compress64kCtx_safe64(new ushort[8192], input, output, inputOffset, outputOffset, inputLength, outputLength); } return LZ4_compressCtx_safe64(new int[4096], input, output, inputOffset, outputOffset, inputLength, outputLength); } public static byte[] Encode64(byte[] input, int inputOffset, int inputLength) { if (inputLength < 0) { inputLength = input.Length - inputOffset; } if (input == null) { throw new ArgumentNullException("input"); } if (inputOffset < 0 || inputOffset + inputLength > input.Length) { throw new ArgumentException("inputOffset and inputLength are invalid for given input"); } byte[] array = new byte[MaximumOutputLength(inputLength)]; int num = Encode64(input, inputOffset, inputLength, array, 0, array.Length); if (num != array.Length) { if (num < 0) { throw new InvalidOperationException("Compression has been corrupted"); } byte[] array2 = new byte[num]; Buffer.BlockCopy(array, 0, array2, 0, num); return array2; } return array; } public static int Decode32(byte[] input, int inputOffset, int inputLength, byte[] output, int outputOffset, int outputLength, bool knownOutputLength) { CheckArguments(input, inputOffset, ref inputLength, output, outputOffset, ref outputLength); if (outputLength == 0) { return 0; } if (knownOutputLength) { if (LZ4_uncompress_safe32(input, output, inputOffset,
BepInEx/plugins/BepInEx-BepInEx_MLLoader/BepInEx.MelonLoader.Loader/BepInEx.MelonLoader.Loader.UnityMono.dll.old
Decompiled 8 months agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using System.Security.Permissions; using MelonLoader; using Microsoft.CodeAnalysis; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyCompany("BepInEx.MelonLoader.Loader.UnityMono")] [assembly: AssemblyConfiguration("BepInEx5")] [assembly: AssemblyDescription("MelonLoader loader for UnityMono games")] [assembly: AssemblyFileVersion("2.1.0.0")] [assembly: AssemblyInformationalVersion("2.1.0")] [assembly: AssemblyProduct("BepInEx.MelonLoader.Loader.UnityMono")] [assembly: AssemblyTitle("BepInEx.MelonLoader.Loader.UnityMono")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.1.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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 BepInEx.MelonLoader.Loader.UnityMono { [BepInPlugin("BepInEx.MelonLoader.Loader.UnityMono", "BepInEx.MelonLoader.Loader.UnityMono", "2.1.0")] public class Plugin : BaseUnityPlugin { private void Awake() { AppDomain.CurrentDomain.AssemblyResolve += (object sender, ResolveEventArgs args) => args.Name.Contains("MelonLoader") ? typeof(Core).Assembly : null; Core.Initialize(((BaseUnityPlugin)this).Config, false); Core.PreStart(); Core.Start(); } } public static class PluginInfo { public const string PLUGIN_GUID = "BepInEx.MelonLoader.Loader.UnityMono"; public const string PLUGIN_NAME = "BepInEx.MelonLoader.Loader.UnityMono"; public const string PLUGIN_VERSION = "2.1.0"; } }
BepInEx/plugins/BepInEx-BepInEx_MLLoader/BepInEx.MelonLoader.Loader/bHapticsLib.dll.old
Decompiled 8 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Timers; using WebSocketDotNet; using WebSocketDotNet.Messages; using bHapticsLib.Internal; using bHapticsLib.Internal.Models.Connection; using bHapticsLib.Internal.SimpleJSON; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("bHapticsLib")] [assembly: AssemblyCompany("Lava Gang")] [assembly: AssemblyProduct("bHapticsLib")] [assembly: AssemblyCopyright("Created by Herp Derpinstine")] [assembly: AssemblyTrademark("Lava Gang")] [assembly: Guid("C55CC59C-138B-48DF-95CC-FA956D064600")] [assembly: AssemblyFileVersion("1.0.6")] [assembly: NeutralResourcesLanguage("en")] [assembly: AssemblyVersion("1.0.6.0")] namespace bHapticsLib { public class bHapticsConnection : ThreadedTask { private static readonly Type intType = typeof(int); private static readonly Type byteType = typeof(byte); private static readonly Type dotPointType = typeof(DotPoint); private List<RegisterRequest> RegisterCache = new List<RegisterRequest>(); private ThreadSafeQueue<RegisterRequest> RegisterQueue = new ThreadSafeQueue<RegisterRequest>(); private ThreadSafeQueue<SubmitRequest> SubmitQueue = new ThreadSafeQueue<SubmitRequest>(); internal static int Port = 15881; internal static string Endpoint = "v2/feedbacks"; private IPAddress _ipaddress = IPAddress.Loopback; private string _id; private string _name; public bool TryToReconnect; private int _maxRetries = 5; internal WebSocketConnection Socket; private PlayerPacket Packet = new PlayerPacket(); private bool ShouldRun = true; public IPAddress IPAddress { get { return _ipaddress; } set { if (value == null) { RestartAndRunAction(delegate { _ipaddress = IPAddress.Loopback; }); } else { RestartAndRunAction(delegate { _ipaddress = value; }); } } } public string ID { get { return _id; } set { if (string.IsNullOrEmpty(value)) { throw new ArgumentNullException("value"); } RestartAndRunAction(delegate { _id = value.Replace(" ", "_"); }); } } public string Name { get { return _name; } set { if (string.IsNullOrEmpty(value)) { throw new ArgumentNullException("value"); } RestartAndRunAction(delegate { _name = value.Replace(" ", "_"); }); } } public int MaxRetries { get { return _maxRetries; } set { _maxRetries = value.Clamp(0, int.MaxValue); } } public bHapticsStatus Status { get { if (IsAlive()) { if (IsConnected()) { return bHapticsStatus.Connected; } return bHapticsStatus.Connecting; } return bHapticsStatus.Disconnected; } } internal bHapticsConnection() { } public bHapticsConnection(string id, string name, bool tryToReconnect = true, int maxRetries = 5) : this(null, id, name, tryToReconnect, maxRetries) { } public bHapticsConnection(IPAddress ipaddress, string id, string name, bool tryToReconnect = true, int maxRetries = 5) { Setup(ipaddress, id, name, tryToReconnect, maxRetries); } internal void Setup(IPAddress ipaddress, string id, string name, bool tryToReconnect, int maxRetries) { if (string.IsNullOrEmpty(id)) { throw new ArgumentNullException("id"); } if (string.IsNullOrEmpty(name)) { throw new ArgumentNullException("name"); } ID = id; Name = name; TryToReconnect = tryToReconnect; MaxRetries = maxRetries; IPAddress = ipaddress; } internal override bool BeginInitInternal() { if (Socket != null) { EndInit(); } Socket = new WebSocketConnection(this); ShouldRun = true; return true; } internal override bool EndInitInternal() { if (Socket == null) { return false; } ShouldRun = false; while (IsAlive()) { Thread.Sleep(1); } RegisterCache.Clear(); Socket.Dispose(); Socket = null; return true; } internal override void WithinThread() { while (ShouldRun) { if (Socket.FirstTry) { Socket.FirstTry = false; Socket.TryConnect(); } if (IsConnected()) { RegisterRequest aItem; while ((aItem = RegisterQueue.Dequeue()) != null) { Packet.Register.Add(aItem); } SubmitRequest aItem2; while ((aItem2 = SubmitQueue.Dequeue()) != null) { Packet.Submit.Add(aItem2); } if (!Packet.IsEmpty()) { Socket.Send(Packet); Packet.Clear(); } } if (ShouldRun) { Thread.Sleep(1); } } } internal void QueueRegisterCache() { int count = RegisterCache.Count; if (count <= 0) { return; } for (int i = 0; i < count; i++) { RegisterRequest registerRequest = RegisterCache[i]; if (!(registerRequest == null) && !registerRequest.IsNull) { RegisterQueue.Enqueue(registerRequest); } } } private void RestartAndRunAction(Action whileDisconnected) { bool num = Socket != null; if (num) { EndInit(); } whileDisconnected(); if (num) { BeginInit(); } } internal bool IsConnected() { return Socket?.IsConnected() ?? false; } public int GetConnectedDeviceCount() { return (Socket?.LastResponse?.ConnectedDeviceCount).GetValueOrDefault(); } public bool IsDeviceConnected(PositionID type) { if (type == PositionID.VestFront || type == PositionID.VestBack) { type = PositionID.Vest; } return (Socket?.LastResponse?.ConnectedPositions?.ContainsValue(type.ToPacketString())).GetValueOrDefault(); } public int[] GetDeviceStatus(PositionID type) { if (Socket == null || Socket.LastResponse == null) { return null; } JSONNode status = Socket.LastResponse.Status; if (type == PositionID.Vest) { JSONNode jSONNode = status[PositionID.VestFront.ToPacketString()]; JSONNode jSONNode2 = status[PositionID.VestBack.ToPacketString()]; int num = jSONNode.Count + jSONNode2.Count; int[] array = new int[num]; for (int i = 0; i < num; i++) { if (i < jSONNode.Count) { array[i] = jSONNode[i].AsInt; } else { array[i] = jSONNode2[i - jSONNode.Count].AsInt; } } return array; } JSONNode jSONNode3 = status[type.ToPacketString()]; int count = jSONNode3.Count; int[] array2 = new int[count]; for (int j = 0; j < count; j++) { array2[j] = jSONNode3[j].AsInt; } return array2; } public bool IsPlaying(string key) { return (Socket?.LastResponse?.ActiveKeys?.ContainsValue(key)).GetValueOrDefault(); } public bool IsPlayingAny() { WebSocketConnection socket = Socket; if (socket == null) { return false; } return socket.LastResponse?.ActiveKeys?.Count > 0; } public void StopPlaying(string key) { if (IsAlive() && IsConnected()) { SubmitQueue.Enqueue(new SubmitRequest { key = key, type = "turnOff" }); } } public void StopPlayingAll() { if (IsAlive() && IsConnected()) { SubmitQueue.Enqueue(new SubmitRequest { type = "turnOffAll" }); } } public bool IsPatternRegistered(string key) { return (Socket?.LastResponse?.RegisteredKeys?.ContainsValue(key)).GetValueOrDefault(); } public void RegisterPatternFromFile(string key, string tactFilePath) { if (File.Exists(tactFilePath)) { RegisterPatternFromJson(key, File.ReadAllText(tactFilePath)); } } public void RegisterPatternFromJson(string key, string tactFileJson) { if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(tactFileJson)) { return; } JSONNode jSONNode = JSON.Parse(tactFileJson); if (!jSONNode.HasKey("project")) { return; } JSONNode jSONNode2 = jSONNode["project"]; if (!(jSONNode2 == null) && !jSONNode2.IsNull && jSONNode2.IsObject) { RegisterRequest registerRequest = new RegisterRequest(); registerRequest.key = key; registerRequest.project = jSONNode2.AsObject; RegisterCache.Add(registerRequest); if (IsConnected()) { RegisterQueue.Enqueue(registerRequest); } } } public void RegisterPatternSwappedFromFile(string key, string tactFilePath) { if (File.Exists(tactFilePath)) { RegisterPatternSwappedFromJson(key, File.ReadAllText(tactFilePath)); } } public void RegisterPatternSwappedFromJson(string key, string tactFileJson) { if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(tactFileJson)) { return; } JSONNode jSONNode = JSON.Parse(tactFileJson); if (!jSONNode.HasKey("project")) { return; } JSONNode jSONNode2 = jSONNode["project"]; if (!(jSONNode2 == null) && !jSONNode2.IsNull && jSONNode2.IsObject) { RegisterRequest registerRequest = new RegisterRequest(); registerRequest.key = key; JSONObject asObject = jSONNode2.AsObject; JSONArray asArray = asObject["tracks"].AsArray; LoopTracks(asArray, delegate(JSONObject effect) { JSONNode jSONNode3 = effect["modes"]; JSONNode value = jSONNode3[0]; JSONNode value2 = jSONNode3[1]; jSONNode3[0] = value2; jSONNode3[1] = value; effect["modes"] = jSONNode3; }); asObject["tracks"] = asArray; registerRequest.project = asObject; RegisterCache.Add(registerRequest); if (IsConnected()) { RegisterQueue.Enqueue(registerRequest); } } } private static void LoopTracks(JSONArray tracks, Action<JSONObject> act) { for (int i = 0; i < tracks.Count; i++) { JSONObject asObject = tracks[i].AsObject; JSONArray asArray = asObject["effects"].AsArray; for (int j = 0; j < asArray.Count; j++) { JSONObject asObject2 = asArray[j].AsObject; act(asObject2); asArray[j] = asObject2; } asObject["effects"] = asArray; tracks[i] = asObject; } } public void Play<A, B>(string key, int durationMillis, PositionID position, A dotPoints, B pathPoints, MirrorDirection dotMirrorDirection = MirrorDirection.None) where A : IList, ICollection where B : IList<PathPoint>, ICollection<PathPoint> { if (!IsAlive()) { return; } if (position == PositionID.Vest) { Play(key + "Front", durationMillis, PositionID.VestFront, dotPoints, pathPoints, dotMirrorDirection); Play(key + "Back", durationMillis, PositionID.VestBack, dotPoints, pathPoints, dotMirrorDirection); return; } SubmitRequest submitRequest = new SubmitRequest { key = key, type = "frame" }; submitRequest.Frame.durationMillis = durationMillis; submitRequest.Frame.position = position.ToPacketString(); if (dotPoints != null && dotPoints.Count > 0) { object[] dotPoints2 = null; if (dotMirrorDirection != 0) { dotPoints2 = new object[dotPoints.Count]; for (int i = 0; i < dotPoints.Count; i++) { dotPoints2[i] = dotPoints[i]; } switch (dotMirrorDirection) { case MirrorDirection.Horizontal: MirrorHorizontal(ref dotPoints2, position); break; case MirrorDirection.Vertical: MirrorVertical(ref dotPoints2, position); break; case MirrorDirection.Both: MirrorHorizontal(ref dotPoints2, position); MirrorVertical(ref dotPoints2, position); break; } } Type type = null; for (int j = 0; j < ((dotPoints2 == null) ? dotPoints.Count : dotPoints2.Length); j++) { object obj = ((dotPoints2 == null) ? dotPoints[j] : dotPoints2[j]); if (obj == null) { continue; } if ((object)type == null) { type = obj.GetType(); } if ((object)type == intType || (object)type == byteType) { JSONObject jSONObject = new JSONObject(); jSONObject["index"] = j.Clamp(0, 20); if ((object)type == intType) { jSONObject["intensity"] = Extensions.Clamp<int>((int)obj, 0, 500); } else if ((object)type == byteType) { jSONObject["intensity"] = Extensions.Clamp((byte)obj, (byte)0, (byte)200); } submitRequest.Frame.dotPoints.Add(jSONObject); } else if ((object)type == dotPointType) { submitRequest.Frame.dotPoints.Add((obj as DotPoint).node); } } } SubmitQueue.Enqueue(submitRequest); } public void PlayRegistered(string key, string altKey = null, ScaleOption scaleOption = null, RotationOption rotationOption = null) { if (IsAlive()) { SubmitRequest submitRequest = new SubmitRequest { key = key, type = "key" }; if (!string.IsNullOrEmpty(altKey)) { submitRequest.Parameters["altKey"] = altKey; } if (scaleOption != null) { submitRequest.Parameters["scaleOption"] = scaleOption.node; } if (rotationOption != null) { submitRequest.Parameters["rotationOption"] = rotationOption.node; } SubmitQueue.Enqueue(submitRequest); } } public void PlayRegisteredMillis(string key, int startTimeMillis = 0) { if (IsAlive()) { SubmitRequest submitRequest = new SubmitRequest { key = key, type = "key" }; submitRequest.Parameters["startTimeMillis"] = startTimeMillis; SubmitQueue.Enqueue(submitRequest); } } private static void MirrorHorizontal<A>(ref A dotPoints, PositionID position) where A : IList, ICollection { int count = dotPoints.Count; int num = count / 2; if (count != 20) { dotPoints.Reverse(0, count); return; } switch (position) { case PositionID.Head: dotPoints.Reverse(0, count); break; case PositionID.VestFront: case PositionID.VestBack: dotPoints.Reverse(0, 4); dotPoints.Reverse(4, 4); dotPoints.Reverse(8, 4); dotPoints.Reverse(12, 4); dotPoints.Reverse(16, 4); break; case PositionID.FootLeft: case PositionID.FootRight: case PositionID.ArmLeft: case PositionID.ArmRight: dotPoints.Reverse(0, num); dotPoints.Reverse(num + 1, count); break; } } private static void MirrorVertical<A>(ref A dotPoints, PositionID position) where A : IList, ICollection { int count = dotPoints.Count; if (count != 20) { dotPoints.Reverse(0, count); return; } switch (position) { case PositionID.VestFront: case PositionID.VestBack: dotPoints.Swap(0, 16); dotPoints.Swap(1, 17); dotPoints.Swap(2, 18); dotPoints.Swap(3, 19); dotPoints.Swap(4, 12); dotPoints.Swap(5, 13); dotPoints.Swap(6, 14); dotPoints.Swap(7, 15); break; case PositionID.ArmLeft: case PositionID.ArmRight: dotPoints.Swap(0, 3); dotPoints.Swap(1, 4); dotPoints.Swap(2, 5); break; case PositionID.HandLeft: case PositionID.HandRight: dotPoints.Reverse(0, count); break; } } } public static class bHapticsManager { public const int MaxIntensityInInt = 500; public const byte MaxIntensityInByte = 200; public const int MaxMotorsPerDotPoint = 20; public const int MaxMotorsPerPathPoint = 3; private static bHapticsConnection Connection = new bHapticsConnection(); public static bHapticsStatus Status => Connection.Status; public static bool Connect(string id, string name, bool tryToReconnect = true, int maxRetries = 5) { Connection.Setup(null, id, name, tryToReconnect, maxRetries); if (Status == bHapticsStatus.Disconnected) { return Connection.BeginInit(); } return true; } public static bool Disconnect() { if (Status == bHapticsStatus.Disconnected) { return true; } StopPlayingAll(); return Connection.EndInit(); } public static int GetConnectedDeviceCount() { return Connection.GetConnectedDeviceCount(); } public static bool IsAnyDevicesConnected() { return GetConnectedDeviceCount() > 0; } public static bool IsDeviceConnected(PositionID type) { return Connection.IsDeviceConnected(type); } public static int[] GetDeviceStatus(PositionID type) { return Connection.GetDeviceStatus(type); } public static bool IsAnyMotorActive(PositionID type) { return GetDeviceStatus(type)?.ContainsValueMoreThan(0) ?? false; } public static bool IsPlaying(string key) { return Connection.IsPlaying(key); } public static bool IsPlayingAny() { return Connection.IsPlayingAny(); } public static void StopPlaying(string key) { Connection.StopPlaying(key); } public static void StopPlayingAll() { Connection.StopPlayingAll(); } public static bool IsPatternRegistered(string key) { return Connection.IsPatternRegistered(key); } public static void RegisterPatternFromJson(string key, string tactFileJson) { Connection.RegisterPatternFromJson(key, tactFileJson); } public static void RegisterPatternFromFile(string key, string tactFilePath) { Connection.RegisterPatternFromFile(key, tactFilePath); } public static void RegisterPatternSwappedFromJson(string key, string tactFileJson) { Connection.RegisterPatternSwappedFromJson(key, tactFileJson); } public static void RegisterPatternSwappedFromFile(string key, string tactFilePath) { Connection.RegisterPatternSwappedFromFile(key, tactFilePath); } public static void Play(string key, int durationMillis, PositionID position, int[] dotPoints) { Connection.Play<int[], PathPoint[]>(key, durationMillis, position, dotPoints, null); } public static void Play(string key, int durationMillis, PositionID position, List<int> dotPoints) { Connection.Play<List<int>, PathPoint[]>(key, durationMillis, position, dotPoints, null); } public static void Play(string key, int durationMillis, PositionID position, byte[] dotPoints) { Connection.Play<byte[], PathPoint[]>(key, durationMillis, position, dotPoints, null); } public static void Play(string key, int durationMillis, PositionID position, List<byte> dotPoints) { Connection.Play<List<byte>, PathPoint[]>(key, durationMillis, position, dotPoints, null); } public static void Play(string key, int durationMillis, PositionID position, DotPoint[] dotPoints) { Connection.Play<DotPoint[], PathPoint[]>(key, durationMillis, position, dotPoints, null); } public static void Play(string key, int durationMillis, PositionID position, List<DotPoint> dotPoints) { Connection.Play<List<DotPoint>, PathPoint[]>(key, durationMillis, position, dotPoints, null); } public static void Play<A>(string key, int durationMillis, PositionID position, A pathPoints) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play<DotPoint[], A>(key, durationMillis, position, null, pathPoints); } public static void Play<A>(string key, int durationMillis, PositionID position, int[] dotPoints, A pathPoints) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play(key, durationMillis, position, dotPoints, pathPoints); } public static void Play<A>(string key, int durationMillis, PositionID position, List<int> dotPoints, A pathPoints) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play(key, durationMillis, position, dotPoints, pathPoints); } public static void Play<A>(string key, int durationMillis, PositionID position, byte[] dotPoints, A pathPoints) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play(key, durationMillis, position, dotPoints, pathPoints); } public static void Play<A>(string key, int durationMillis, PositionID position, List<byte> dotPoints, A pathPoints) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play(key, durationMillis, position, dotPoints, pathPoints); } public static void Play<A>(string key, int durationMillis, PositionID position, DotPoint[] dotPoints, A pathPoints) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play(key, durationMillis, position, dotPoints, pathPoints); } public static void Play<A>(string key, int durationMillis, PositionID position, List<DotPoint> dotPoints, A pathPoints) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play(key, durationMillis, position, dotPoints, pathPoints); } public static void PlayMirrored(string key, int durationMillis, PositionID position, int[] dotPoints, MirrorDirection mirrorDirection) { Connection.Play<int[], PathPoint[]>(key, durationMillis, position, dotPoints, null, mirrorDirection); } public static void PlayMirrored(string key, int durationMillis, PositionID position, List<int> dotPoints, MirrorDirection mirrorDirection) { Connection.Play<List<int>, PathPoint[]>(key, durationMillis, position, dotPoints, null, mirrorDirection); } public static void PlayMirrored(string key, int durationMillis, PositionID position, byte[] dotPoints, MirrorDirection mirrorDirection) { Connection.Play<byte[], PathPoint[]>(key, durationMillis, position, dotPoints, null, mirrorDirection); } public static void PlayMirrored(string key, int durationMillis, PositionID position, List<byte> dotPoints, MirrorDirection mirrorDirection) { Connection.Play<List<byte>, PathPoint[]>(key, durationMillis, position, dotPoints, null, mirrorDirection); } public static void PlayMirrored(string key, int durationMillis, PositionID position, DotPoint[] dotPoints, MirrorDirection mirrorDirection) { Connection.Play<DotPoint[], PathPoint[]>(key, durationMillis, position, dotPoints, null, mirrorDirection); } public static void PlayMirrored(string key, int durationMillis, PositionID position, List<DotPoint> dotPoints, MirrorDirection mirrorDirection) { Connection.Play<List<DotPoint>, PathPoint[]>(key, durationMillis, position, dotPoints, null, mirrorDirection); } public static void PlayMirrored<A>(string key, int durationMillis, PositionID position, int[] dotPoints, A pathPoints, MirrorDirection dotMirrorDirection) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play(key, durationMillis, position, dotPoints, pathPoints, dotMirrorDirection); } public static void PlayMirrored<A>(string key, int durationMillis, PositionID position, List<int> dotPoints, A pathPoints, MirrorDirection dotMirrorDirection) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play(key, durationMillis, position, dotPoints, pathPoints, dotMirrorDirection); } public static void PlayMirrored<A>(string key, int durationMillis, PositionID position, byte[] dotPoints, A pathPoints, MirrorDirection dotMirrorDirection) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play(key, durationMillis, position, dotPoints, pathPoints, dotMirrorDirection); } public static void PlayMirrored<A>(string key, int durationMillis, PositionID position, List<byte> dotPoints, A pathPoints, MirrorDirection dotMirrorDirection) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play(key, durationMillis, position, dotPoints, pathPoints, dotMirrorDirection); } public static void PlayMirrored<A>(string key, int durationMillis, PositionID position, DotPoint[] dotPoints, A pathPoints, MirrorDirection dotMirrorDirection) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play(key, durationMillis, position, dotPoints, pathPoints, dotMirrorDirection); } public static void PlayMirrored<A>(string key, int durationMillis, PositionID position, List<DotPoint> dotPoints, A pathPoints, MirrorDirection dotMirrorDirection) where A : IList<PathPoint>, ICollection<PathPoint> { Connection.Play(key, durationMillis, position, dotPoints, pathPoints, dotMirrorDirection); } public static void PlayRegistered(string key) { Connection.PlayRegistered(key); } public static void PlayRegistered(string key, int startTimeMillis) { Connection.PlayRegisteredMillis(key, startTimeMillis); } public static void PlayRegistered(string key, ScaleOption option) { Connection.PlayRegistered(key, null, option); } public static void PlayRegistered(string key, RotationOption option) { Connection.PlayRegistered(key, null, null, option); } public static void PlayRegistered(string key, ScaleOption scaleOption, RotationOption rotationOption) { Connection.PlayRegistered(key, null, scaleOption, rotationOption); } public static void PlayRegistered(string key, string altKey) { Connection.PlayRegistered(key, altKey); } public static void PlayRegistered(string key, string altKey, ScaleOption option) { Connection.PlayRegistered(key, altKey, option); } public static void PlayRegistered(string key, string altKey, RotationOption option) { Connection.PlayRegistered(key, altKey, null, option); } public static void PlayRegistered(string key, string altKey, ScaleOption scaleOption, RotationOption rotationOption) { Connection.PlayRegistered(key, altKey, scaleOption, rotationOption); } } public enum bHapticsStatus { Disconnected, Connecting, Connected } public class DotPoint { internal JSONObject node = new JSONObject(); public int Index { get { return node["index"].AsInt; } set { node["index"] = value.Clamp(0, 20); } } public int Intensity { get { return node["intensity"].AsInt; } set { node["intensity"] = value.Clamp(0, 500); } } public DotPoint(int index = 0, int intensity = 50) { Index = index; Intensity = intensity; } public override string ToString() { return string.Format("{0} ( {1}: {2}, {3}: {4} )", "DotPoint", "Index", Index, "Intensity", Intensity); } } public static class Extensions { private static string OscAddressHeader = "/bhaptics"; public static string ToOscAddress(this PositionID value) { return value switch { PositionID.Head => OscAddressHeader + "/head", PositionID.Vest => OscAddressHeader + "/vest", PositionID.VestFront => OscAddressHeader + "/vest/front", PositionID.VestBack => OscAddressHeader + "/vest/back", PositionID.ArmLeft => OscAddressHeader + "/arm/left", PositionID.ArmRight => OscAddressHeader + "/arm/right", PositionID.HandLeft => OscAddressHeader + "/hand/left", PositionID.HandRight => OscAddressHeader + "/hand/right", PositionID.GloveLeft => OscAddressHeader + "/glove/left", PositionID.GloveRight => OscAddressHeader + "/glove/right", PositionID.FootLeft => OscAddressHeader + "/foot/left", PositionID.FootRight => OscAddressHeader + "/foot/right", _ => null, }; } internal static string ToPacketString(this PositionID value) { return value switch { PositionID.ArmLeft => "ForearmL", PositionID.ArmRight => "ForearmR", PositionID.HandLeft => "HandL", PositionID.HandRight => "HandR", PositionID.GloveLeft => "GloveL", PositionID.GloveRight => "GloveR", PositionID.FootLeft => "FootL", PositionID.FootRight => "FootR", _ => value.ToString(), }; } internal static T Clamp<T>(T value, T min, T max) where T : IComparable<T> { if (value.CompareTo(min) < 0) { return min; } if (value.CompareTo(max) > 0) { return max; } return value; } internal static short Clamp(this short value, short min, short max) { return Extensions.Clamp<short>(value, min, max); } internal static ushort Clamp(this ushort value, ushort min, ushort max) { return Extensions.Clamp<ushort>(value, min, max); } internal static int Clamp(this int value, int min, int max) { return Extensions.Clamp<int>(value, min, max); } internal static uint Clamp(this uint value, uint min, uint max) { return Extensions.Clamp<uint>(value, min, max); } internal static double Clamp(this double value, double min, double max) { return Extensions.Clamp<double>(value, min, max); } internal static float Clamp(this float value, float min, float max) { return Extensions.Clamp<float>(value, min, max); } internal static void AddRange<T, Z>(this T arr, List<Z> value) where T : JSONNode where Z : JSONNode { if (value == null || arr.IsNull) { return; } int count = value.Count; if (count <= 0) { return; } for (int i = 0; i < count; i++) { Z val = value[i]; if (!((JSONNode)val == (object)null) && !val.IsNull) { arr.Add(value[i]); } } } internal static void AddRange<T, Z>(this T arr, Z[] value) where T : JSONNode where Z : JSONNode { if (value == null || arr.IsNull) { return; } int num = value.Length; if (num <= 0) { return; } for (int i = 0; i < num; i++) { Z val = value[i]; if (!((JSONNode)val == (object)null) && !val.IsNull) { arr.Add(value[i]); } } } internal static bool ContainsValue<T, Z>(this T arr, Z value) where T : JSONNode where Z : JSONNode { if (arr.IsNull || (JSONNode)value == (object)null || value.IsNull) { return false; } int count = arr.Count; if (count <= 0) { return false; } for (int i = 0; i < count; i++) { JSONNode jSONNode = arr[i]; if (!(jSONNode == null) && !jSONNode.IsNull) { if (value.IsObject && jSONNode.IsObject && jSONNode.AsObject == value) { return true; } if (value.IsArray && jSONNode.IsArray && jSONNode.AsArray == value) { return true; } } } return false; } internal static bool ContainsValue<T>(this T arr, bool value) where T : JSONNode { if (arr.IsNull) { return false; } int count = arr.Count; if (count <= 0) { return false; } for (int i = 0; i < count; i++) { JSONNode jSONNode = arr[i]; if (!(jSONNode == null) && !jSONNode.IsNull && jSONNode.IsBoolean && jSONNode.AsBool == value) { return true; } } return false; } internal static bool ContainsValue<T>(this T arr, string value) where T : JSONNode { if (arr.IsNull || string.IsNullOrEmpty(value)) { return false; } int count = arr.Count; if (count <= 0) { return false; } for (int i = 0; i < count; i++) { JSONNode jSONNode = arr[i]; if (!(jSONNode == null) && !jSONNode.IsNull && jSONNode.IsString && !string.IsNullOrEmpty(jSONNode.Value) && jSONNode.Value.Equals(value)) { return true; } } return false; } internal static bool ContainsValueMoreThan<T>(this T[] arr, T value) where T : IComparable<T> { int num = arr.Length; if (num <= 0) { return false; } for (int i = 0; i < num; i++) { if (arr[i].CompareTo(value) > 0) { return true; } } return false; } internal static void ReverseAll<A>(this A arr) where A : IList, ICollection { arr.Reverse(0, arr.Count); } internal static void Reverse<A>(this A arr, int index, int length) where A : IList, ICollection { int num = index; int num2 = index + length - 1; while (num < num2) { arr.Swap(num2, num); num++; num2--; } } internal static void ReverseAll(this JSONNode node) { node.Reverse(0, node.Count); } internal static void Reverse(this JSONNode node, int index, int length) { int num = index; int num2 = index + length - 1; while (num < num2) { JSONNode value = node[num2]; JSONNode value2 = node[num]; node[num2] = value2; node[num] = value; num++; num2--; } } internal static void Swap<A>(this A dotPoints, int indexA, int indexB) where A : IList, ICollection { int count = dotPoints.Count; if (count <= 1 || indexA < 0 || indexA > count - 1 || indexB < 0 || indexB > count - 1) { return; } object obj = dotPoints[indexA]; object obj2 = dotPoints[indexB]; if ((object)obj.GetType() == typeof(DotPoint)) { if (obj != null) { (obj as DotPoint).Index = indexB; } if (obj2 != null) { (obj2 as DotPoint).Index = indexA; } } dotPoints[indexB] = obj; dotPoints[indexA] = obj2; } } public class HapticPattern { public string Key { get; private set; } public static HapticPattern LoadFromJson(string key, string tactFileJson) { bHapticsManager.RegisterPatternFromJson(key, tactFileJson); return new HapticPattern { Key = key }; } public static HapticPattern LoadFromFile(string key, string tactFilePath) { bHapticsManager.RegisterPatternFromFile(key, tactFilePath); return new HapticPattern { Key = key }; } public static HapticPattern LoadSwappedFromJson(string key, string tactFileJson) { bHapticsManager.RegisterPatternSwappedFromJson(key, tactFileJson); return new HapticPattern { Key = key }; } public static HapticPattern LoadSwappedFromFile(string key, string tactFilePath) { bHapticsManager.RegisterPatternSwappedFromFile(key, tactFilePath); return new HapticPattern { Key = key }; } public bool IsRegistered() { return bHapticsManager.IsPatternRegistered(Key); } public bool IsPlaying() { return bHapticsManager.IsPlaying(Key); } public void Stop() { bHapticsManager.StopPlaying(Key); } public void Play() { bHapticsManager.PlayRegistered(Key); } public void Play(ScaleOption option) { bHapticsManager.PlayRegistered(Key, option); } public void Play(RotationOption option) { bHapticsManager.PlayRegistered(Key, option); } public void Play(ScaleOption scaleOption, RotationOption rotationOption) { bHapticsManager.PlayRegistered(Key, scaleOption, rotationOption); } } public enum MirrorDirection { None, Horizontal, Vertical, Both } public class PathPoint { internal JSONObject node = new JSONObject(); public float X { get { return node["x"].AsFloat; } set { node["x"] = value; } } public float Y { get { return node["y"].AsFloat; } set { node["y"] = value; } } public int Intensity { get { return node["intensity"].AsInt; } set { node["intensity"] = value.Clamp(0, 500); } } public int MotorCount { get { return node["motorCount"].AsInt; } set { node["motorCount"] = value.Clamp(0, 3); } } public PathPoint(float x = 0f, float y = 0f, int intensity = 50, int motorCount = 3) { X = x; Y = y; Intensity = intensity; MotorCount = motorCount; } public override string ToString() { return string.Format("{0} ( {1}: {2}, {3}: {4}, {5}: {6}, {7}: {8} )", "PathPoint", "X", X, "Y", Y, "MotorCount", MotorCount, "Intensity", Intensity); } } public enum PositionID { Vest = 3, Head = 4, HandLeft = 6, HandRight = 7, FootLeft = 8, FootRight = 9, ArmLeft = 10, ArmRight = 11, VestFront = 201, VestBack = 202, GloveLeft = 203, GloveRight = 204 } public class RotationOption { internal JSONObject node = new JSONObject(); public float OffsetAngleX { get { return node["offsetAngleX"].AsFloat; } set { node["offsetAngleX"] = value; } } public float OffsetY { get { return node["offsetY"].AsFloat; } set { node["offsetY"] = value; } } public RotationOption(float offsetAngleX = 0f, float offsetY = 0f) { OffsetAngleX = offsetAngleX; OffsetY = offsetY; } public override string ToString() { return string.Format("{0} ( {1}: {2}, {3}: {4} )", "RotationOption", "OffsetAngleX", OffsetAngleX, "OffsetY", OffsetY); } } public class ScaleOption { internal JSONObject node = new JSONObject(); public float Intensity { get { return node["intensity"].AsFloat; } set { node["intensity"] = value; } } public float Duration { get { return node["duration"].AsFloat; } set { node["duration"] = value; } } public ScaleOption(float intensity = 1f, float duration = 1f) { Intensity = intensity; Duration = duration; } public override string ToString() { return string.Format("{0} ( {1}: {2}, {3}: {4} )", "ScaleOption", "Intensity", Intensity, "Duration", Duration); } } } namespace bHapticsLib.Properties { internal static class BuildInfo { public const string Name = "bHapticsLib"; public const string Author = "Herp Derpinstine"; public const string Company = "Lava Gang"; public const string Version = "1.0.6"; public const string DownloadLink = "https://github.com/HerpDerpinstine/bHapticsLib"; } } namespace bHapticsLib.Internal { public abstract class ThreadedTask { private Thread thread; internal bool IsAlive() { return thread?.IsAlive ?? false; } public bool BeginInit() { if (!BeginInitInternal()) { return false; } RunThread(); return true; } internal abstract bool BeginInitInternal(); public bool EndInit() { if (!EndInitInternal()) { return false; } KillThread(); return true; } internal abstract bool EndInitInternal(); internal abstract void WithinThread(); private void RunThread() { if (IsAlive()) { KillThread(); } thread = new Thread(WithinThread); thread.Start(); } private void KillThread() { if (IsAlive()) { thread.Abort(); thread = null; } } } internal class ThreadSafeQueue<T> : IEnumerable<T>, IEnumerable, ICollection { private Queue<T> queue = new Queue<T>(); public int Count => queue.Count; public object SyncRoot => ((ICollection)queue).SyncRoot; public bool IsSynchronized => true; public void Enqueue(T item) { lock (SyncRoot) { queue.Enqueue(item); } } public T Dequeue() { if (Count <= 0) { return default(T); } lock (SyncRoot) { return queue.Dequeue(); } } public void Clear() { lock (SyncRoot) { queue.Clear(); } } public void CopyTo(Array array, int index) { lock (SyncRoot) { ((ICollection)queue).CopyTo(array, index); } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public IEnumerator<T> GetEnumerator() { lock (SyncRoot) { foreach (T item in queue) { yield return item; } } } } internal class WebSocketConnection : IDisposable { private bHapticsConnection Parent; internal bool FirstTry; private bool isConnected; private int RetryCount; private int RetryDelay = 3; private System.Timers.Timer RetryTimer; internal WebSocket Socket; internal PlayerResponse LastResponse; internal WebSocketConnection(bHapticsConnection parent) { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown Parent = parent; string text = $"ws://{parent.IPAddress}:{bHapticsConnection.Port}/{bHapticsConnection.Endpoint}?app_id={parent.ID}&app_name={parent.Name}"; WebSocketConfiguration val = default(WebSocketConfiguration); ((WebSocketConfiguration)(ref val))..ctor(); ((WebSocketConfiguration)(ref val)).AutoConnect = false; ((WebSocketConfiguration)(ref val)).UseAutomaticReceiveThread = true; Socket = new WebSocket(text, val); Socket.TextReceived += delegate(string txt) { try { if (LastResponse == null) { LastResponse = new PlayerResponse(); } JSONNode jSONNode = JSON.Parse(txt); if (!(jSONNode == null) && !jSONNode.IsNull && jSONNode.IsObject) { LastResponse.m_Dict = jSONNode.AsObject.m_Dict; } } catch { } }; Socket.Opened += delegate { isConnected = true; RetryCount = 0; Parent.QueueRegisterCache(); }; Socket.Closed += delegate { isConnected = false; LastResponse = null; }; if (parent.TryToReconnect) { RetryTimer = new System.Timers.Timer(RetryDelay * 1000); RetryTimer.AutoReset = true; RetryTimer.Elapsed += delegate { RetryCheck(); }; RetryTimer.Start(); } FirstTry = true; } public void Dispose() { try { Socket.SendClose((WebSocketCloseCode)1000, (string)null); isConnected = false; if (Parent.TryToReconnect) { RetryTimer.Stop(); RetryTimer.Dispose(); } } catch { } } internal void TryConnect() { try { Socket.Connect(); } catch { } } private void RetryCheck() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Invalid comparison between Unknown and I4 if (IsConnected() || !Parent.TryToReconnect || (int)Socket.State == 0 || (int)Socket.State == 2) { return; } if (Parent.MaxRetries > 0) { if (RetryCount >= Parent.MaxRetries) { Parent.EndInit(); return; } RetryCount++; } TryConnect(); } internal bool IsConnected() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Invalid comparison between Unknown and I4 if (isConnected) { return (int)Socket.State == 1; } return false; } internal void Send(JSONObject jsonNode) { Send(jsonNode.ToString()); } internal void Send(string msg) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown if (!IsConnected()) { return; } try { Socket.Send((WebSocketMessage)new WebSocketTextMessage(msg)); } catch { } } } } namespace bHapticsLib.Internal.SimpleJSON { internal enum JSONNodeType { Array = 1, Object = 2, String = 3, Number = 4, NullValue = 5, Boolean = 6, None = 7, Custom = 255 } internal enum JSONTextMode { Compact, Indent } internal abstract class JSONNode { internal struct Enumerator { private enum Type { None, Array, Object } private Type type; private Dictionary<string, JSONNode>.Enumerator m_Object; private List<JSONNode>.Enumerator m_Array; internal bool IsValid => type != Type.None; internal KeyValuePair<string, JSONNode> Current { get { if (type == Type.Array) { return new KeyValuePair<string, JSONNode>(string.Empty, m_Array.Current); } if (type == Type.Object) { return m_Object.Current; } return new KeyValuePair<string, JSONNode>(string.Empty, null); } } internal Enumerator(List<JSONNode>.Enumerator aArrayEnum) { type = Type.Array; m_Object = default(Dictionary<string, JSONNode>.Enumerator); m_Array = aArrayEnum; } internal Enumerator(Dictionary<string, JSONNode>.Enumerator aDictEnum) { type = Type.Object; m_Object = aDictEnum; m_Array = default(List<JSONNode>.Enumerator); } internal bool MoveNext() { if (type == Type.Array) { return m_Array.MoveNext(); } if (type == Type.Object) { return m_Object.MoveNext(); } return false; } } internal struct ValueEnumerator { private Enumerator m_Enumerator; internal JSONNode Current => m_Enumerator.Current.Value; internal ValueEnumerator(List<JSONNode>.Enumerator aArrayEnum) : this(new Enumerator(aArrayEnum)) { } internal ValueEnumerator(Dictionary<string, JSONNode>.Enumerator aDictEnum) : this(new Enumerator(aDictEnum)) { } internal ValueEnumerator(Enumerator aEnumerator) { m_Enumerator = aEnumerator; } internal bool MoveNext() { return m_Enumerator.MoveNext(); } internal ValueEnumerator GetEnumerator() { return this; } } internal struct KeyEnumerator { private Enumerator m_Enumerator; internal string Current => m_Enumerator.Current.Key; internal KeyEnumerator(List<JSONNode>.Enumerator aArrayEnum) : this(new Enumerator(aArrayEnum)) { } internal KeyEnumerator(Dictionary<string, JSONNode>.Enumerator aDictEnum) : this(new Enumerator(aDictEnum)) { } internal KeyEnumerator(Enumerator aEnumerator) { m_Enumerator = aEnumerator; } internal bool MoveNext() { return m_Enumerator.MoveNext(); } internal KeyEnumerator GetEnumerator() { return this; } } public class LinqEnumerator : IEnumerator<KeyValuePair<string, JSONNode>>, IDisposable, IEnumerator, IEnumerable<KeyValuePair<string, JSONNode>>, IEnumerable { private JSONNode m_Node; private Enumerator m_Enumerator; public KeyValuePair<string, JSONNode> Current => m_Enumerator.Current; object IEnumerator.Current => m_Enumerator.Current; internal LinqEnumerator(JSONNode aNode) { m_Node = aNode; if (m_Node != null) { m_Enumerator = m_Node.GetEnumerator(); } } public bool MoveNext() { return m_Enumerator.MoveNext(); } public void Dispose() { m_Node = null; m_Enumerator = default(Enumerator); } public IEnumerator<KeyValuePair<string, JSONNode>> GetEnumerator() { return new LinqEnumerator(m_Node); } public void Reset() { if (m_Node != null) { m_Enumerator = m_Node.GetEnumerator(); } } IEnumerator IEnumerable.GetEnumerator() { return new LinqEnumerator(m_Node); } } internal static bool forceASCII = false; internal static bool longAsString = false; internal static bool allowLineComments = true; [ThreadStatic] private static StringBuilder m_EscapeBuilder; internal abstract JSONNodeType Tag { get; } internal virtual JSONNode this[int aIndex] { get { return null; } set { } } internal virtual JSONNode this[string aKey] { get { return null; } set { } } internal virtual string Value { get { return ""; } set { } } internal virtual int Count => 0; internal virtual bool IsNumber => false; internal virtual bool IsString => false; internal virtual bool IsBoolean => false; internal virtual bool IsNull => false; internal virtual bool IsArray => false; internal virtual bool IsObject => false; internal virtual bool Inline { get { return false; } set { } } internal virtual IEnumerable<JSONNode> Children { get { yield break; } } internal IEnumerable<JSONNode> DeepChildren { get { foreach (JSONNode child in Children) { foreach (JSONNode deepChild in child.DeepChildren) { yield return deepChild; } } } } internal IEnumerable<KeyValuePair<string, JSONNode>> Linq => new LinqEnumerator(this); internal KeyEnumerator Keys => new KeyEnumerator(GetEnumerator()); internal ValueEnumerator Values => new ValueEnumerator(GetEnumerator()); internal virtual double AsDouble { get { double result = 0.0; if (double.TryParse(Value, NumberStyles.Float, CultureInfo.InvariantCulture, out result)) { return result; } return 0.0; } set { Value = value.ToString(CultureInfo.InvariantCulture); } } internal virtual int AsInt { get { return (int)AsDouble; } set { AsDouble = value; } } internal virtual float AsFloat { get { return (float)AsDouble; } set { AsDouble = value; } } internal virtual bool AsBool { get { bool result = false; if (bool.TryParse(Value, out result)) { return result; } return !string.IsNullOrEmpty(Value); } set { Value = (value ? "true" : "false"); } } internal virtual long AsLong { get { long result = 0L; if (long.TryParse(Value, out result)) { return result; } return 0L; } set { Value = value.ToString(); } } internal virtual JSONArray AsArray => this as JSONArray; internal virtual JSONObject AsObject => this as JSONObject; internal static StringBuilder EscapeBuilder { get { if (m_EscapeBuilder == null) { m_EscapeBuilder = new StringBuilder(); } return m_EscapeBuilder; } } internal virtual void Add(string aKey, JSONNode aItem) { } internal virtual void Add(JSONNode aItem) { Add("", aItem); } internal virtual JSONNode Remove(string aKey) { return null; } internal virtual JSONNode Remove(int aIndex) { return null; } internal virtual JSONNode Remove(JSONNode aNode) { return aNode; } internal virtual bool HasKey(string aKey) { return false; } internal virtual JSONNode GetValueOrDefault(string aKey, JSONNode aDefault) { return aDefault; } public override string ToString() { StringBuilder stringBuilder = new StringBuilder(); WriteToStringBuilder(stringBuilder, 0, 0, JSONTextMode.Compact); return stringBuilder.ToString(); } internal virtual string ToString(int aIndent) { StringBuilder stringBuilder = new StringBuilder(); WriteToStringBuilder(stringBuilder, 0, aIndent, JSONTextMode.Indent); return stringBuilder.ToString(); } internal abstract void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode); internal abstract Enumerator GetEnumerator(); public static implicit operator JSONNode(string s) { return new JSONString(s); } public static implicit operator string(JSONNode d) { if (!(d == null)) { return d.Value; } return null; } public static implicit operator JSONNode(double n) { return new JSONNumber(n); } public static implicit operator double(JSONNode d) { if (!(d == null)) { return d.AsDouble; } return 0.0; } public static implicit operator JSONNode(float n) { return new JSONNumber(n); } public static implicit operator float(JSONNode d) { if (!(d == null)) { return d.AsFloat; } return 0f; } public static implicit operator JSONNode(int n) { return new JSONNumber(n); } public static implicit operator int(JSONNode d) { if (!(d == null)) { return d.AsInt; } return 0; } public static implicit operator JSONNode(long n) { if (longAsString) { return new JSONString(n.ToString()); } return new JSONNumber(n); } public static implicit operator long(JSONNode d) { if (!(d == null)) { return d.AsLong; } return 0L; } public static implicit operator JSONNode(bool b) { return new JSONBool(b); } public static implicit operator bool(JSONNode d) { if (!(d == null)) { return d.AsBool; } return false; } public static implicit operator JSONNode(KeyValuePair<string, JSONNode> aKeyValue) { return aKeyValue.Value; } public static bool operator ==(JSONNode a, object b) { if ((object)a == b) { return true; } bool flag = a is JSONNull || (object)a == null || a is JSONLazyCreator; bool flag2 = b is JSONNull || b == null || b is JSONLazyCreator; if (flag && flag2) { return true; } if (!flag) { return a.Equals(b); } return false; } public static bool operator !=(JSONNode a, object b) { return !(a == b); } public override bool Equals(object obj) { return (object)this == obj; } public override int GetHashCode() { return base.GetHashCode(); } internal static string Escape(string aText) { StringBuilder escapeBuilder = EscapeBuilder; escapeBuilder.Length = 0; if (escapeBuilder.Capacity < aText.Length + aText.Length / 10) { escapeBuilder.Capacity = aText.Length + aText.Length / 10; } foreach (char c in aText) { switch (c) { case '\\': escapeBuilder.Append("\\\\"); continue; case '"': escapeBuilder.Append("\\\""); continue; case '\n': escapeBuilder.Append("\\n"); continue; case '\r': escapeBuilder.Append("\\r"); continue; case '\t': escapeBuilder.Append("\\t"); continue; case '\b': escapeBuilder.Append("\\b"); continue; case '\f': escapeBuilder.Append("\\f"); continue; } if (c < ' ' || (forceASCII && c > '\u007f')) { ushort num = c; escapeBuilder.Append("\\u").Append(num.ToString("X4")); } else { escapeBuilder.Append(c); } } string result = escapeBuilder.ToString(); escapeBuilder.Length = 0; return result; } private static JSONNode ParseElement(string token, bool quoted) { if (quoted) { return token; } string text = token.ToLower(); switch (text) { case "false": case "true": return text == "true"; case "null": return JSONNull.CreateOrGet(); default: { if (double.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return result; } return token; } } } internal static JSONNode Parse(string aJSON) { Stack<JSONNode> stack = new Stack<JSONNode>(); JSONNode jSONNode = null; int i = 0; StringBuilder stringBuilder = new StringBuilder(); string aKey = ""; bool flag = false; bool flag2 = false; for (; i < aJSON.Length; i++) { switch (aJSON[i]) { case '{': if (flag) { stringBuilder.Append(aJSON[i]); break; } stack.Push(new JSONObject()); if (jSONNode != null) { jSONNode.Add(aKey, stack.Peek()); } aKey = ""; stringBuilder.Length = 0; jSONNode = stack.Peek(); break; case '[': if (flag) { stringBuilder.Append(aJSON[i]); break; } stack.Push(new JSONArray()); if (jSONNode != null) { jSONNode.Add(aKey, stack.Peek()); } aKey = ""; stringBuilder.Length = 0; jSONNode = stack.Peek(); break; case ']': case '}': if (flag) { stringBuilder.Append(aJSON[i]); break; } if (stack.Count == 0) { throw new Exception("JSON Parse: Too many closing brackets"); } stack.Pop(); if (stringBuilder.Length > 0 || flag2) { jSONNode.Add(aKey, ParseElement(stringBuilder.ToString(), flag2)); } flag2 = false; aKey = ""; stringBuilder.Length = 0; if (stack.Count > 0) { jSONNode = stack.Peek(); } break; case ':': if (flag) { stringBuilder.Append(aJSON[i]); break; } aKey = stringBuilder.ToString(); stringBuilder.Length = 0; flag2 = false; break; case '"': flag = !flag; flag2 = flag2 || flag; break; case ',': if (flag) { stringBuilder.Append(aJSON[i]); break; } if (stringBuilder.Length > 0 || flag2) { jSONNode.Add(aKey, ParseElement(stringBuilder.ToString(), flag2)); } flag2 = false; aKey = ""; stringBuilder.Length = 0; flag2 = false; break; case '\t': case ' ': if (flag) { stringBuilder.Append(aJSON[i]); } break; case '\\': i++; if (flag) { char c = aJSON[i]; switch (c) { case 't': stringBuilder.Append('\t'); break; case 'r': stringBuilder.Append('\r'); break; case 'n': stringBuilder.Append('\n'); break; case 'b': stringBuilder.Append('\b'); break; case 'f': stringBuilder.Append('\f'); break; case 'u': { string s = aJSON.Substring(i + 1, 4); stringBuilder.Append((char)int.Parse(s, NumberStyles.AllowHexSpecifier)); i += 4; break; } default: stringBuilder.Append(c); break; } } break; case '/': if (allowLineComments && !flag && i + 1 < aJSON.Length && aJSON[i + 1] == '/') { while (++i < aJSON.Length && aJSON[i] != '\n' && aJSON[i] != '\r') { } } else { stringBuilder.Append(aJSON[i]); } break; default: stringBuilder.Append(aJSON[i]); break; case '\n': case '\r': case '\ufeff': break; } } if (flag) { throw new Exception("JSON Parse: Quotation marks seems to be messed up."); } if (jSONNode == null) { return ParseElement(stringBuilder.ToString(), flag2); } return jSONNode; } } internal class JSONArray : JSONNode { private List<JSONNode> m_List = new List<JSONNode>(); private bool inline; internal override bool Inline { get { return inline; } set { inline = value; } } internal override JSONNodeType Tag => JSONNodeType.Array; internal override bool IsArray => true; internal override JSONNode this[int aIndex] { get { if (aIndex < 0 || aIndex >= m_List.Count) { return new JSONLazyCreator(this); } return m_List[aIndex]; } set { if (value == null) { value = JSONNull.CreateOrGet(); } if (aIndex < 0 || aIndex >= m_List.Count) { m_List.Add(value); } else { m_List[aIndex] = value; } } } internal override JSONNode this[string aKey] { get { return new JSONLazyCreator(this); } set { if (value == null) { value = JSONNull.CreateOrGet(); } m_List.Add(value); } } internal override int Count => m_List.Count; internal override IEnumerable<JSONNode> Children { get { foreach (JSONNode item in m_List) { yield return item; } } } internal override Enumerator GetEnumerator() { return new Enumerator(m_List.GetEnumerator()); } internal override void Add(string aKey, JSONNode aItem) { if (aItem == null) { aItem = JSONNull.CreateOrGet(); } m_List.Add(aItem); } internal override JSONNode Remove(int aIndex) { if (aIndex < 0 || aIndex >= m_List.Count) { return null; } JSONNode result = m_List[aIndex]; m_List.RemoveAt(aIndex); return result; } internal override JSONNode Remove(JSONNode aNode) { m_List.Remove(aNode); return aNode; } internal void Clear() { m_List.Clear(); } internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) { aSB.Append('['); int count = m_List.Count; if (inline) { aMode = JSONTextMode.Compact; } for (int i = 0; i < count; i++) { if (i > 0) { aSB.Append(','); } if (aMode == JSONTextMode.Indent) { aSB.AppendLine(); } if (aMode == JSONTextMode.Indent) { aSB.Append(' ', aIndent + aIndentInc); } m_List[i].WriteToStringBuilder(aSB, aIndent + aIndentInc, aIndentInc, aMode); } if (aMode == JSONTextMode.Indent) { aSB.AppendLine().Append(' ', aIndent); } aSB.Append(']'); } } internal class JSONObject : JSONNode { internal Dictionary<string, JSONNode> m_Dict = new Dictionary<string, JSONNode>(); private bool inline; internal override bool Inline { get { return inline; } set { inline = value; } } internal override JSONNodeType Tag => JSONNodeType.Object; internal override bool IsObject => true; internal override JSONNode this[string aKey] { get { if (m_Dict.ContainsKey(aKey)) { return m_Dict[aKey]; } return new JSONLazyCreator(this, aKey); } set { if (value == null) { value = JSONNull.CreateOrGet(); } if (m_Dict.ContainsKey(aKey)) { m_Dict[aKey] = value; } else { m_Dict.Add(aKey, value); } } } internal override JSONNode this[int aIndex] { get { if (aIndex < 0 || aIndex >= m_Dict.Count) { return null; } return m_Dict.ElementAt(aIndex).Value; } set { if (value == null) { value = JSONNull.CreateOrGet(); } if (aIndex >= 0 && aIndex < m_Dict.Count) { string key = m_Dict.ElementAt(aIndex).Key; m_Dict[key] = value; } } } internal override int Count => m_Dict.Count; internal override IEnumerable<JSONNode> Children { get { foreach (KeyValuePair<string, JSONNode> item in m_Dict) { yield return item.Value; } } } internal override Enumerator GetEnumerator() { return new Enumerator(m_Dict.GetEnumerator()); } internal override void Add(string aKey, JSONNode aItem) { if (aItem == null) { aItem = JSONNull.CreateOrGet(); } if (aKey != null) { if (m_Dict.ContainsKey(aKey)) { m_Dict[aKey] = aItem; } else { m_Dict.Add(aKey, aItem); } } else { m_Dict.Add(Guid.NewGuid().ToString(), aItem); } } internal override JSONNode Remove(string aKey) { if (!m_Dict.ContainsKey(aKey)) { return null; } JSONNode result = m_Dict[aKey]; m_Dict.Remove(aKey); return result; } internal override JSONNode Remove(int aIndex) { if (aIndex < 0 || aIndex >= m_Dict.Count) { return null; } KeyValuePair<string, JSONNode> keyValuePair = m_Dict.ElementAt(aIndex); m_Dict.Remove(keyValuePair.Key); return keyValuePair.Value; } internal override JSONNode Remove(JSONNode aNode) { try { KeyValuePair<string, JSONNode> keyValuePair = m_Dict.Where((KeyValuePair<string, JSONNode> k) => k.Value == aNode).First(); m_Dict.Remove(keyValuePair.Key); return aNode; } catch { return null; } } internal override bool HasKey(string aKey) { return m_Dict.ContainsKey(aKey); } internal override JSONNode GetValueOrDefault(string aKey, JSONNode aDefault) { if (m_Dict.TryGetValue(aKey, out var value)) { return value; } return aDefault; } internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) { aSB.Append('{'); bool flag = true; if (inline) { aMode = JSONTextMode.Compact; } foreach (KeyValuePair<string, JSONNode> item in m_Dict) { if (!flag) { aSB.Append(','); } flag = false; if (aMode == JSONTextMode.Indent) { aSB.AppendLine(); } if (aMode == JSONTextMode.Indent) { aSB.Append(' ', aIndent + aIndentInc); } aSB.Append('"').Append(JSONNode.Escape(item.Key)).Append('"'); if (aMode == JSONTextMode.Compact) { aSB.Append(':'); } else { aSB.Append(" : "); } item.Value.WriteToStringBuilder(aSB, aIndent + aIndentInc, aIndentInc, aMode); } if (aMode == JSONTextMode.Indent) { aSB.AppendLine().Append(' ', aIndent); } aSB.Append('}'); } } internal class JSONString : JSONNode { private string m_Data; internal override JSONNodeType Tag => JSONNodeType.String; internal override bool IsString => true; internal override string Value { get { return m_Data; } set { m_Data = value; } } internal override Enumerator GetEnumerator() { return default(Enumerator); } internal JSONString(string aData) { m_Data = aData; } internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) { aSB.Append('"').Append(JSONNode.Escape(m_Data)).Append('"'); } public override bool Equals(object obj) { if (base.Equals(obj)) { return true; } if (obj is string text) { return m_Data == text; } JSONString jSONString = obj as JSONString; if (jSONString != null) { return m_Data == jSONString.m_Data; } return false; } public override int GetHashCode() { return m_Data.GetHashCode(); } } internal class JSONNumber : JSONNode { private double m_Data; internal override JSONNodeType Tag => JSONNodeType.Number; internal override bool IsNumber => true; internal override string Value { get { return m_Data.ToString(CultureInfo.InvariantCulture); } set { if (double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { m_Data = result; } } } internal override double AsDouble { get { return m_Data; } set { m_Data = value; } } internal override long AsLong { get { return (long)m_Data; } set { m_Data = value; } } internal override Enumerator GetEnumerator() { return default(Enumerator); } internal JSONNumber(double aData) { m_Data = aData; } internal JSONNumber(string aData) { Value = aData; } internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) { aSB.Append(Value); } private static bool IsNumeric(object value) { if (!(value is int) && !(value is uint) && !(value is float) && !(value is double) && !(value is decimal) && !(value is long) && !(value is ulong) && !(value is short) && !(value is ushort) && !(value is sbyte)) { return value is byte; } return true; } public override bool Equals(object obj) { if (obj == null) { return false; } if (base.Equals(obj)) { return true; } JSONNumber jSONNumber = obj as JSONNumber; if (jSONNumber != null) { return m_Data == jSONNumber.m_Data; } if (IsNumeric(obj)) { return Convert.ToDouble(obj) == m_Data; } return false; } public override int GetHashCode() { return m_Data.GetHashCode(); } } internal class JSONBool : JSONNode { private bool m_Data; internal override JSONNodeType Tag => JSONNodeType.Boolean; internal override bool IsBoolean => true; internal override string Value { get { return m_Data.ToString(); } set { if (bool.TryParse(value, out var result)) { m_Data = result; } } } internal override bool AsBool { get { return m_Data; } set { m_Data = value; } } internal override Enumerator GetEnumerator() { return default(Enumerator); } internal JSONBool(bool aData) { m_Data = aData; } internal JSONBool(string aData) { Value = aData; } internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) { aSB.Append(m_Data ? "true" : "false"); } public override bool Equals(object obj) { if (obj == null) { return false; } if (obj is bool) { return m_Data == (bool)obj; } return false; } public override int GetHashCode() { return m_Data.GetHashCode(); } } internal class JSONNull : JSONNode { private static JSONNull m_StaticInstance = new JSONNull(); internal static bool reuseSameInstance = true; internal override JSONNodeType Tag => JSONNodeType.NullValue; internal override bool IsNull => true; internal override string Value { get { return "null"; } set { } } internal override bool AsBool { get { return false; } set { } } internal static JSONNull CreateOrGet() { if (reuseSameInstance) { return m_StaticInstance; } return new JSONNull(); } private JSONNull() { } internal override Enumerator GetEnumerator() { return default(Enumerator); } public override bool Equals(object obj) { if ((object)this == obj) { return true; } return obj is JSONNull; } public override int GetHashCode() { return 0; } internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) { aSB.Append("null"); } } internal class JSONLazyCreator : JSONNode { private JSONNode m_Node; private string m_Key; internal override JSONNodeType Tag => JSONNodeType.None; internal override JSONNode this[int aIndex] { get { return new JSONLazyCreator(this); } set { Set(new JSONArray()).Add(value); } } internal override JSONNode this[string aKey] { get { return new JSONLazyCreator(this, aKey); } set { Set(new JSONObject()).Add(aKey, value); } } internal override int AsInt { get { Set(new JSONNumber(0.0)); return 0; } set { Set(new JSONNumber(value)); } } internal override float AsFloat { get { Set(new JSONNumber(0.0)); return 0f; } set { Set(new JSONNumber(value)); } } internal override double AsDouble { get { Set(new JSONNumber(0.0)); return 0.0; } set { Set(new JSONNumber(value)); } } internal override long AsLong { get { if (JSONNode.longAsString) { Set(new JSONString("0")); } else { Set(new JSONNumber(0.0)); } return 0L; } set { if (JSONNode.longAsString) { Set(new JSONString(value.ToString())); } else { Set(new JSONNumber(value)); } } } internal override bool AsBool { get { Set(new JSONBool(aData: false)); return false; } set { Set(new JSONBool(value)); } } internal override JSONArray AsArray => Set(new JSONArray()); internal override JSONObject AsObject => Set(new JSONObject()); internal override Enumerator GetEnumerator() { return default(Enumerator); } internal JSONLazyCreator(JSONNode aNode) { m_Node = aNode; m_Key = null; } internal JSONLazyCreator(JSONNode aNode, string aKey) { m_Node = aNode; m_Key = aKey; } private T Set<T>(T aVal) where T : JSONNode { if (m_Key == null) { m_Node.Add(aVal); } else { m_Node.Add(m_Key, aVal); } m_Node = null; return aVal; } internal override void Add(JSONNode aItem) { Set(new JSONArray()).Add(aItem); } internal override void Add(string aKey, JSONNode aItem) { Set(new JSONObject()).Add(aKey, aItem); } public static bool operator ==(JSONLazyCreator a, object b) { if (b == null) { return true; } return (object)a == b; } public static bool operator !=(JSONLazyCreator a, object b) { return !(a == b); } public override bool Equals(object obj) { if (obj == null) { return true; } return (object)this == obj; } public override int GetHashCode() { return 0; } internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode) { aSB.Append("null"); } } internal static class JSON { internal static JSONNode Parse(string aJSON) { return JSONNode.Parse(aJSON); } } } namespace bHapticsLib.Internal.Models.Connection { internal class PlayerPacket : JSONObject { internal JSONArray Register { get { string aKey = "Register"; if (this[aKey] == null) { this[aKey] = new JSONArray(); } return this[aKey].AsArray; } } internal JSONArray Submit { get { string aKey = "Submit"; if (this[aKey] == null) { this[aKey] = new JSONArray(); } return this[aKey].AsArray; } } internal void Clear() { Register.Clear(); Submit.Clear(); } internal bool IsEmpty() { if (Register.Count <= 0) { return Submit.Count <= 0; } return false; } } internal class PlayerResponse : JSONObject { internal int ConnectedDeviceCount => this["ConnectedDeviceCount"].AsInt; internal JSONArray ActiveKeys { get { string aKey = "ActiveKeys"; if (this[aKey] == null) { this[aKey] = new JSONArray(); } return this[aKey].AsArray; } } internal JSONArray ConnectedPositions { get { string aKey = "ConnectedPositions"; if (this[aKey] == null) { this[aKey] = new JSONArray(); } return this[aKey].AsArray; } } internal JSONArray RegisteredKeys { get { string aKey = "RegisteredKeys"; if (this[aKey] == null) { this[aKey] = new JSONArray(); } return this[aKey].AsArray; } } internal JSONObject Status { get { string aKey = "Status"; if (this[aKey] == null) { this[aKey] = new JSONObject(); } return this[aKey].AsObject; } } } internal class RegisterRequest : JSONObject { internal string key { get { return this["key"]; } set { this["key"] = value; } } internal JSONObject project { get { string aKey = "project"; if (this[aKey] == null) { this[aKey] = new JSONObject(); } return this[aKey].AsObject; } set { this["project"] = value; } } } internal class SubmitRequest : JSONObject { internal string type { get { return this["type"]; } set { this["type"] = value; } } internal string key { get { return this["key"]; } set { this["key"] = value; } } internal JSONObject Parameters { get { string aKey = "Parameters"; if (this[aKey] == null) { this[aKey] = new JSONObject(); } return this[aKey].AsObject; } } internal SubmitRequestFrame Frame { get { string aKey = "Frame"; if (this[aKey] == null) { this[aKey] = new SubmitRequestFrame(); } return this[aKey].AsObject as SubmitRequestFrame; } } } internal class SubmitRequestFrame : JSONObject { internal int durationMillis { get { return this["durationMillis"].AsInt; } set { this["durationMillis"] = value; } } internal string position { get { return this["position"]; } set { this["position"] = value.ToString(); } } internal JSONArray dotPoints { get { string aKey = "dotPoints"; if (this[aKey] == null) { this[aKey] = new JSONArray(); } return this[aKey].AsArray; } } internal JSONArray pathPoints { get { string aKey = "pathPoints"; if (this[aKey] == null) { this[aKey] = new JSONArray(); } return this[aKey].AsArray; } } } }
BepInEx/plugins/BepInEx-BepInEx_MLLoader/BepInEx.MelonLoader.Loader/MelonLoader.dll.old
Decompiled 8 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Net; using System.Net.Security; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Security; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using AssetRipper.VersionUtilities; using AssetsTools.NET; using AssetsTools.NET.Extra; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Harmony; using HarmonyLib; using HarmonyLib.Public.Patching; using HarmonyLib.Tools; using MelonLoader; using MelonLoader.Assertions; using MelonLoader.Fixes; using MelonLoader.ICSharpCode.SharpZipLib.BZip2; using MelonLoader.ICSharpCode.SharpZipLib.Checksum; using MelonLoader.ICSharpCode.SharpZipLib.Core; using MelonLoader.ICSharpCode.SharpZipLib.Encryption; using MelonLoader.ICSharpCode.SharpZipLib.Zip; using MelonLoader.ICSharpCode.SharpZipLib.Zip.Compression; using MelonLoader.ICSharpCode.SharpZipLib.Zip.Compression.Streams; using MelonLoader.InternalUtils; using MelonLoader.Lemons.Cryptography; using MelonLoader.Modules; using MelonLoader.MonoInternals; using MelonLoader.MonoInternals.ResolveInternals; using MelonLoader.Preferences; using MelonLoader.Preferences.IO; using MelonLoader.TinyJSON; using Microsoft.Cci; using Microsoft.CodeAnalysis; using Microsoft.Win32; using Mono.Cecil; using Mono.Cecil.Cil; using Mono.Cecil.Mdb; using Mono.Cecil.Pdb; using Mono.Cecil.Rocks; using Mono.Collections.Generic; using Mono.CompilerServices.SymbolWriter; using MonoMod.Cil; using MonoMod.ModInterop; using MonoMod.RuntimeDetour; using MonoMod.RuntimeDetour.HookGen; using MonoMod.RuntimeDetour.Platforms; using MonoMod.Utils; using MonoMod.Utils.Cil; using Semver; using Tomlet; using Tomlet.Attributes; using Tomlet.Exceptions; using Tomlet.Models; using bHapticsLib; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("MelonLoader")] [assembly: AssemblyDescription("MelonLoader")] [assembly: AssemblyCompany("discord.gg/2Wn3N2P")] [assembly: AssemblyProduct("MelonLoader")] [assembly: AssemblyCopyright("Created by Lava Gang")] [assembly: AssemblyTrademark("discord.gg/2Wn3N2P")] [assembly: Guid("A662769A-B294-434F-83B5-176FC4795334")] [assembly: AssemblyFileVersion("0.5.7")] [assembly: PatchShield] [assembly: InternalsVisibleTo("BepInEx.MelonLoader.Loader.UnityMono")] [assembly: InternalsVisibleTo("BepInEx.MelonLoader.Loader.IL2CPP")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.5.7.0")] [assembly: TypeForwardedTo(typeof(AccessTools))] [assembly: TypeForwardedTo(typeof(ArgumentType))] [assembly: TypeForwardedTo(typeof(CodeInstruction))] [assembly: TypeForwardedTo(typeof(CodeInstructionExtensions))] [assembly: TypeForwardedTo(typeof(CodeMatch))] [assembly: TypeForwardedTo(typeof(CodeMatcher))] [assembly: TypeForwardedTo(typeof(CollectionExtensions))] [assembly: TypeForwardedTo(typeof(DelegateTypeFactory))] [assembly: TypeForwardedTo(typeof(ExceptionBlock))] [assembly: TypeForwardedTo(typeof(ExceptionBlockType))] [assembly: TypeForwardedTo(typeof(FastAccess))] [assembly: TypeForwardedTo(typeof(FastInvokeHandler))] [assembly: TypeForwardedTo(typeof(FileLog))] [assembly: TypeForwardedTo(typeof(GeneralExtensions))] [assembly: TypeForwardedTo(typeof(GetterHandler<, >))] [assembly: TypeForwardedTo(typeof(Harmony))] [assembly: TypeForwardedTo(typeof(HarmonyAfter))] [assembly: TypeForwardedTo(typeof(HarmonyArgument))] [assembly: TypeForwardedTo(typeof(HarmonyAttribute))] [assembly: TypeForwardedTo(typeof(HarmonyBefore))] [assembly: TypeForwardedTo(typeof(HarmonyCleanup))] [assembly: TypeForwardedTo(typeof(HarmonyDebug))] [assembly: TypeForwardedTo(typeof(HarmonyDelegate))] [assembly: TypeForwardedTo(typeof(HarmonyEmitIL))] [assembly: TypeForwardedTo(typeof(HarmonyException))] [assembly: TypeForwardedTo(typeof(HarmonyFinalizer))] [assembly: TypeForwardedTo(typeof(HarmonyGlobalSettings))] [assembly: TypeForwardedTo(typeof(HarmonyILManipulator))] [assembly: TypeForwardedTo(typeof(HarmonyMethod))] [assembly: TypeForwardedTo(typeof(HarmonyMethodExtensions))] [assembly: TypeForwardedTo(typeof(HarmonyPatch))] [assembly: TypeForwardedTo(typeof(HarmonyPatchAll))] [assembly: TypeForwardedTo(typeof(HarmonyPatchType))] [assembly: TypeForwardedTo(typeof(HarmonyPostfix))] [assembly: TypeForwardedTo(typeof(HarmonyPrefix))] [assembly: TypeForwardedTo(typeof(HarmonyPrepare))] [assembly: TypeForwardedTo(typeof(HarmonyPriority))] [assembly: TypeForwardedTo(typeof(HarmonyReversePatch))] [assembly: TypeForwardedTo(typeof(HarmonyReversePatchType))] [assembly: TypeForwardedTo(typeof(HarmonyTargetMethod))] [assembly: TypeForwardedTo(typeof(HarmonyTargetMethods))] [assembly: TypeForwardedTo(typeof(HarmonyTranspiler))] [assembly: TypeForwardedTo(typeof(HarmonyWrapSafe))] [assembly: TypeForwardedTo(typeof(InlineSignature))] [assembly: TypeForwardedTo(typeof(InstantiationHandler<>))] [assembly: TypeForwardedTo(typeof(InvalidHarmonyPatchArgumentException))] [assembly: TypeForwardedTo(typeof(MemberNotFoundException))] [assembly: TypeForwardedTo(typeof(MethodBaseExtensions))] [assembly: TypeForwardedTo(typeof(MethodDispatchType))] [assembly: TypeForwardedTo(typeof(MethodInvoker))] [assembly: TypeForwardedTo(typeof(MethodType))] [assembly: TypeForwardedTo(typeof(Patch))] [assembly: TypeForwardedTo(typeof(PatchClassProcessor))] [assembly: TypeForwardedTo(typeof(Patches))] [assembly: TypeForwardedTo(typeof(PatchInfo))] [assembly: TypeForwardedTo(typeof(PatchProcessor))] [assembly: TypeForwardedTo(typeof(Priority))] [assembly: TypeForwardedTo(typeof(HarmonyManipulator))] [assembly: TypeForwardedTo(typeof(ManagedMethodPatcher))] [assembly: TypeForwardedTo(typeof(MethodPatcher))] [assembly: TypeForwardedTo(typeof(NativeDetourMethodPatcher))] [assembly: TypeForwardedTo(typeof(PatchManager))] [assembly: TypeForwardedTo(typeof(ReversePatcher))] [assembly: TypeForwardedTo(typeof(SetterHandler<, >))] [assembly: TypeForwardedTo(typeof(SymbolExtensions))] [assembly: TypeForwardedTo(typeof(HarmonyFileLog))] [assembly: TypeForwardedTo(typeof(Logger))] [assembly: TypeForwardedTo(typeof(Transpilers))] [assembly: TypeForwardedTo(typeof(Traverse))] [assembly: TypeForwardedTo(typeof(Traverse<>))] [assembly: TypeForwardedTo(typeof(ILocalScope))] [assembly: TypeForwardedTo(typeof(IName))] [assembly: TypeForwardedTo(typeof(INamespaceScope))] [assembly: TypeForwardedTo(typeof(IUsedNamespace))] [assembly: TypeForwardedTo(typeof(ArrayDimension))] [assembly: TypeForwardedTo(typeof(ArrayMarshalInfo))] [assembly: TypeForwardedTo(typeof(ArrayType))] [assembly: TypeForwardedTo(typeof(AssemblyAttributes))] [assembly: TypeForwardedTo(typeof(AssemblyDefinition))] [assembly: TypeForwardedTo(typeof(AssemblyHashAlgorithm))] [assembly: TypeForwardedTo(typeof(AssemblyLinkedResource))] [assembly: TypeForwardedTo(typeof(AssemblyNameDefinition))] [assembly: TypeForwardedTo(typeof(AssemblyNameReference))] [assembly: TypeForwardedTo(typeof(AssemblyResolutionException))] [assembly: TypeForwardedTo(typeof(AssemblyResolveEventArgs))] [assembly: TypeForwardedTo(typeof(AssemblyResolveEventHandler))] [assembly: TypeForwardedTo(typeof(BaseAssemblyResolver))] [assembly: TypeForwardedTo(typeof(ByReferenceType))] [assembly: TypeForwardedTo(typeof(CallSite))] [assembly: TypeForwardedTo(typeof(AsyncMethodBodyDebugInformation))] [assembly: TypeForwardedTo(typeof(BinaryCustomDebugInformation))] [assembly: TypeForwardedTo(typeof(Code))] [assembly: TypeForwardedTo(typeof(ConstantDebugInformation))] [assembly: TypeForwardedTo(typeof(CustomDebugInformation))] [assembly: TypeForwardedTo(typeof(CustomDebugInformationKind))] [assembly: TypeForwardedTo(typeof(DebugInformation))] [assembly: TypeForwardedTo(typeof(DefaultSymbolReaderProvider))] [assembly: TypeForwardedTo(typeof(DefaultSymbolWriterProvider))] [assembly: TypeForwardedTo(typeof(Document))] [assembly: TypeForwardedTo(typeof(DocumentHashAlgorithm))] [assembly: TypeForwardedTo(typeof(DocumentLanguage))] [assembly: TypeForwardedTo(typeof(DocumentLanguageVendor))] [assembly: TypeForwardedTo(typeof(DocumentType))] [assembly: TypeForwardedTo(typeof(EmbeddedPortablePdbReader))] [assembly: TypeForwardedTo(typeof(EmbeddedPortablePdbReaderProvider))] [assembly: TypeForwardedTo(typeof(EmbeddedPortablePdbWriter))] [assembly: TypeForwardedTo(typeof(EmbeddedPortablePdbWriterProvider))] [assembly: TypeForwardedTo(typeof(EmbeddedSourceDebugInformation))] [assembly: TypeForwardedTo(typeof(ExceptionHandler))] [assembly: TypeForwardedTo(typeof(ExceptionHandlerType))] [assembly: TypeForwardedTo(typeof(FlowControl))] [assembly: TypeForwardedTo(typeof(ICustomDebugInformationProvider))] [assembly: TypeForwardedTo(typeof(ILProcessor))] [assembly: TypeForwardedTo(typeof(ImageDebugDirectory))] [assembly: TypeForwardedTo(typeof(ImageDebugHeader))] [assembly: TypeForwardedTo(typeof(ImageDebugHeaderEntry))] [assembly: TypeForwardedTo(typeof(ImageDebugType))] [assembly: TypeForwardedTo(typeof(ImportDebugInformation))] [assembly: TypeForwardedTo(typeof(ImportTarget))] [assembly: TypeForwardedTo(typeof(ImportTargetKind))] [assembly: TypeForwardedTo(typeof(Instruction))] [assembly: TypeForwardedTo(typeof(InstructionOffset))] [assembly: TypeForwardedTo(typeof(ISymbolReader))] [assembly: TypeForwardedTo(typeof(ISymbolReaderProvider))] [assembly: TypeForwardedTo(typeof(ISymbolWriter))] [assembly: TypeForwardedTo(typeof(ISymbolWriterProvider))] [assembly: TypeForwardedTo(typeof(MethodBody))] [assembly: TypeForwardedTo(typeof(MethodDebugInformation))] [assembly: TypeForwardedTo(typeof(OpCode))] [assembly: TypeForwardedTo(typeof(OpCodes))] [assembly: TypeForwardedTo(typeof(OpCodeType))] [assembly: TypeForwardedTo(typeof(OperandType))] [assembly: TypeForwardedTo(typeof(PortablePdbReader))] [assembly: TypeForwardedTo(typeof(PortablePdbReaderProvider))] [assembly: TypeForwardedTo(typeof(PortablePdbWriter))] [assembly: TypeForwardedTo(typeof(PortablePdbWriterProvider))] [assembly: TypeForwardedTo(typeof(ScopeDebugInformation))] [assembly: TypeForwardedTo(typeof(SequencePoint))] [assembly: TypeForwardedTo(typeof(SourceLinkDebugInformation))] [assembly: TypeForwardedTo(typeof(StackBehaviour))] [assembly: TypeForwardedTo(typeof(StateMachineScope))] [assembly: TypeForwardedTo(typeof(StateMachineScopeDebugInformation))] [assembly: TypeForwardedTo(typeof(SymbolsNotFoundException))] [assembly: TypeForwardedTo(typeof(SymbolsNotMatchingException))] [assembly: TypeForwardedTo(typeof(VariableAttributes))] [assembly: TypeForwardedTo(typeof(VariableDebugInformation))] [assembly: TypeForwardedTo(typeof(VariableDefinition))] [assembly: TypeForwardedTo(typeof(VariableIndex))] [assembly: TypeForwardedTo(typeof(VariableReference))] [assembly: TypeForwardedTo(typeof(CustomAttribute))] [assembly: TypeForwardedTo(typeof(CustomAttributeArgument))] [assembly: TypeForwardedTo(typeof(CustomAttributeNamedArgument))] [assembly: TypeForwardedTo(typeof(CustomMarshalInfo))] [assembly: TypeForwardedTo(typeof(DefaultAssemblyResolver))] [assembly: TypeForwardedTo(typeof(DefaultMetadataImporter))] [assembly: TypeForwardedTo(typeof(DefaultReflectionImporter))] [assembly: TypeForwardedTo(typeof(EmbeddedResource))] [assembly: TypeForwardedTo(typeof(EventAttributes))] [assembly: TypeForwardedTo(typeof(EventDefinition))] [assembly: TypeForwardedTo(typeof(EventReference))] [assembly: TypeForwardedTo(typeof(ExportedType))] [assembly: TypeForwardedTo(typeof(FieldAttributes))] [assembly: TypeForwardedTo(typeof(FieldDefinition))] [assembly: TypeForwardedTo(typeof(FieldReference))] [assembly: TypeForwardedTo(typeof(FixedArrayMarshalInfo))] [assembly: TypeForwardedTo(typeof(FixedSysStringMarshalInfo))] [assembly: TypeForwardedTo(typeof(FunctionPointerType))] [assembly: TypeForwardedTo(typeof(GenericInstanceMethod))] [assembly: TypeForwardedTo(typeof(GenericInstanceType))] [assembly: TypeForwardedTo(typeof(GenericParameter))] [assembly: TypeForwardedTo(typeof(GenericParameterAttributes))] [assembly: TypeForwardedTo(typeof(GenericParameterType))] [assembly: TypeForwardedTo(typeof(IAssemblyResolver))] [assembly: TypeForwardedTo(typeof(IConstantProvider))] [assembly: TypeForwardedTo(typeof(ICustomAttribute))] [assembly: TypeForwardedTo(typeof(ICustomAttributeProvider))] [assembly: TypeForwardedTo(typeof(IGenericInstance))] [assembly: TypeForwardedTo(typeof(IGenericParameterProvider))] [assembly: TypeForwardedTo(typeof(IMarshalInfoProvider))] [assembly: TypeForwardedTo(typeof(IMemberDefinition))] [assembly: TypeForwardedTo(typeof(IMetadataImporter))] [assembly: TypeForwardedTo(typeof(IMetadataImporterProvider))] [assembly: TypeForwardedTo(typeof(IMetadataResolver))] [assembly: TypeForwardedTo(typeof(IMetadataScope))] [assembly: TypeForwardedTo(typeof(IMetadataTokenProvider))] [assembly: TypeForwardedTo(typeof(IMethodSignature))] [assembly: TypeForwardedTo(typeof(IModifierType))] [assembly: TypeForwardedTo(typeof(InterfaceImplementation))] [assembly: TypeForwardedTo(typeof(IReflectionImporter))] [assembly: TypeForwardedTo(typeof(IReflectionImporterProvider))] [assembly: TypeForwardedTo(typeof(ISecurityDeclarationProvider))] [assembly: TypeForwardedTo(typeof(LinkedResource))] [assembly: TypeForwardedTo(typeof(ManifestResourceAttributes))] [assembly: TypeForwardedTo(typeof(MarshalInfo))] [assembly: TypeForwardedTo(typeof(MdbReader))] [assembly: TypeForwardedTo(typeof(MdbReaderProvider))] [assembly: TypeForwardedTo(typeof(MdbWriter))] [assembly: TypeForwardedTo(typeof(MdbWriterProvider))] [assembly: TypeForwardedTo(typeof(MemberReference))] [assembly: TypeForwardedTo(typeof(MetadataKind))] [assembly: TypeForwardedTo(typeof(MetadataResolver))] [assembly: TypeForwardedTo(typeof(MetadataScopeType))] [assembly: TypeForwardedTo(typeof(MetadataToken))] [assembly: TypeForwardedTo(typeof(MetadataType))] [assembly: TypeForwardedTo(typeof(MethodAttributes))] [assembly: TypeForwardedTo(typeof(MethodCallingConvention))] [assembly: TypeForwardedTo(typeof(MethodDefinition))] [assembly: TypeForwardedTo(typeof(MethodImplAttributes))] [assembly: TypeForwardedTo(typeof(MethodReference))] [assembly: TypeForwardedTo(typeof(MethodReturnType))] [assembly: TypeForwardedTo(typeof(MethodSemanticsAttributes))] [assembly: TypeForwardedTo(typeof(MethodSpecification))] [assembly: TypeForwardedTo(typeof(ModuleAttributes))] [assembly: TypeForwardedTo(typeof(ModuleCharacteristics))] [assembly: TypeForwardedTo(typeof(ModuleDefinition))] [assembly: TypeForwardedTo(typeof(ModuleKind))] [assembly: TypeForwardedTo(typeof(ModuleParameters))] [assembly: TypeForwardedTo(typeof(ModuleReference))] [assembly: TypeForwardedTo(typeof(NativeType))] [assembly: TypeForwardedTo(typeof(OptionalModifierType))] [assembly: TypeForwardedTo(typeof(ParameterAttributes))] [assembly: TypeForwardedTo(typeof(ParameterDefinition))] [assembly: TypeForwardedTo(typeof(ParameterReference))] [assembly: TypeForwardedTo(typeof(NativePdbReader))] [assembly: TypeForwardedTo(typeof(NativePdbReaderProvider))] [assembly: TypeForwardedTo(typeof(NativePdbWriter))] [assembly: TypeForwardedTo(typeof(NativePdbWriterProvider))] [assembly: TypeForwardedTo(typeof(PdbReaderProvider))] [assembly: TypeForwardedTo(typeof(PdbWriterProvider))] [assembly: TypeForwardedTo(typeof(PinnedType))] [assembly: TypeForwardedTo(typeof(PInvokeAttributes))] [assembly: TypeForwardedTo(typeof(PInvokeInfo))] [assembly: TypeForwardedTo(typeof(PointerType))] [assembly: TypeForwardedTo(typeof(PropertyAttributes))] [assembly: TypeForwardedTo(typeof(PropertyDefinition))] [assembly: TypeForwardedTo(typeof(PropertyReference))] [assembly: TypeForwardedTo(typeof(ReaderParameters))] [assembly: TypeForwardedTo(typeof(ReadingMode))] [assembly: TypeForwardedTo(typeof(RequiredModifierType))] [assembly: TypeForwardedTo(typeof(ResolutionException))] [assembly: TypeForwardedTo(typeof(Resource))] [assembly: TypeForwardedTo(typeof(ResourceType))] [assembly: TypeForwardedTo(typeof(DocCommentId))] [assembly: TypeForwardedTo(typeof(IILVisitor))] [assembly: TypeForwardedTo(typeof(ILParser))] [assembly: TypeForwardedTo(typeof(MethodBodyRocks))] [assembly: TypeForwardedTo(typeof(MethodDefinitionRocks))] [assembly: TypeForwardedTo(typeof(ModuleDefinitionRocks))] [assembly: TypeForwardedTo(typeof(ParameterReferenceRocks))] [assembly: TypeForwardedTo(typeof(SecurityDeclarationRocks))] [assembly: TypeForwardedTo(typeof(TypeDefinitionRocks))] [assembly: TypeForwardedTo(typeof(TypeReferenceRocks))] [assembly: TypeForwardedTo(typeof(SafeArrayMarshalInfo))] [assembly: TypeForwardedTo(typeof(SecurityAction))] [assembly: TypeForwardedTo(typeof(SecurityAttribute))] [assembly: TypeForwardedTo(typeof(SecurityDeclaration))] [assembly: TypeForwardedTo(typeof(SentinelType))] [assembly: TypeForwardedTo(typeof(TargetArchitecture))] [assembly: TypeForwardedTo(typeof(TargetRuntime))] [assembly: TypeForwardedTo(typeof(TokenType))] [assembly: TypeForwardedTo(typeof(TypeAttributes))] [assembly: TypeForwardedTo(typeof(TypeDefinition))] [assembly: TypeForwardedTo(typeof(TypeReference))] [assembly: TypeForwardedTo(typeof(TypeSpecification))] [assembly: TypeForwardedTo(typeof(TypeSystem))] [assembly: TypeForwardedTo(typeof(VariantType))] [assembly: TypeForwardedTo(typeof(WriterParameters))] [assembly: TypeForwardedTo(typeof(Collection<>))] [assembly: TypeForwardedTo(typeof(ReadOnlyCollection<>))] [assembly: TypeForwardedTo(typeof(AnonymousScopeEntry))] [assembly: TypeForwardedTo(typeof(CapturedScope))] [assembly: TypeForwardedTo(typeof(CapturedVariable))] [assembly: TypeForwardedTo(typeof(CodeBlockEntry))] [assembly: TypeForwardedTo(typeof(CompileUnitEntry))] [assembly: TypeForwardedTo(typeof(ICompileUnit))] [assembly: TypeForwardedTo(typeof(IMethodDef))] [assembly: TypeForwardedTo(typeof(ISourceFile))] [assembly: TypeForwardedTo(typeof(LineNumberEntry))] [assembly: TypeForwardedTo(typeof(LineNumberTable))] [assembly: TypeForwardedTo(typeof(LocalVariableEntry))] [assembly: TypeForwardedTo(typeof(MethodEntry))] [assembly: TypeForwardedTo(typeof(MonoSymbolFile))] [assembly: TypeForwardedTo(typeof(MonoSymbolFileException))] [assembly: TypeForwardedTo(typeof(MonoSymbolWriter))] [assembly: TypeForwardedTo(typeof(NamespaceEntry))] [assembly: TypeForwardedTo(typeof(OffsetTable))] [assembly: TypeForwardedTo(typeof(ScopeVariable))] [assembly: TypeForwardedTo(typeof(SourceFileEntry))] [assembly: TypeForwardedTo(typeof(SourceMethodBuilder))] [assembly: TypeForwardedTo(typeof(SymbolWriterImpl))] [assembly: TypeForwardedTo(typeof(IILReferenceBag))] [assembly: TypeForwardedTo(typeof(ILContext))] [assembly: TypeForwardedTo(typeof(ILCursor))] [assembly: TypeForwardedTo(typeof(ILLabel))] [assembly: TypeForwardedTo(typeof(ILPatternMatchingExt))] [assembly: TypeForwardedTo(typeof(MoveType))] [assembly: TypeForwardedTo(typeof(NopILReferenceBag))] [assembly: TypeForwardedTo(typeof(RuntimeILReferenceBag))] [assembly: TypeForwardedTo(typeof(SearchTarget))] [assembly: TypeForwardedTo(typeof(ModExportNameAttribute))] [assembly: TypeForwardedTo(typeof(ModImportNameAttribute))] [assembly: TypeForwardedTo(typeof(ModInteropManager))] [assembly: TypeForwardedTo(typeof(Detour))] [assembly: TypeForwardedTo(typeof(Detour<>))] [assembly: TypeForwardedTo(typeof(DetourConfig))] [assembly: TypeForwardedTo(typeof(DetourContext))] [assembly: TypeForwardedTo(typeof(DetourHelper))] [assembly: TypeForwardedTo(typeof(DetourModManager))] [assembly: TypeForwardedTo(typeof(HarmonyDetourBridge))] [assembly: TypeForwardedTo(typeof(Hook))] [assembly: TypeForwardedTo(typeof(Hook<>))] [assembly: TypeForwardedTo(typeof(Hook<, >))] [assembly: TypeForwardedTo(typeof(HookConfig))] [assembly: TypeForwardedTo(typeof(HookEndpointManager))] [assembly: TypeForwardedTo(typeof(IDetour))] [assembly: TypeForwardedTo(typeof(IDetourNativePlatform))] [assembly: TypeForwardedTo(typeof(IDetourRuntimePlatform))] [assembly: TypeForwardedTo(typeof(ILHook))] [assembly: TypeForwardedTo(typeof(ILHookConfig))] [assembly: TypeForwardedTo(typeof(ISortableDetour))] [assembly: TypeForwardedTo(typeof(NativeDetour))] [assembly: TypeForwardedTo(typeof(NativeDetourConfig))] [assembly: TypeForwardedTo(typeof(NativeDetourData))] [assembly: TypeForwardedTo(typeof(OnMethodCompiledEvent))] [assembly: TypeForwardedTo(typeof(DetourNativeARMPlatform))] [assembly: TypeForwardedTo(typeof(DetourNativeLibcPlatform))] [assembly: TypeForwardedTo(typeof(DetourNativeMonoPlatform))] [assembly: TypeForwardedTo(typeof(DetourNativeMonoPosixPlatform))] [assembly: TypeForwardedTo(typeof(DetourNativeWindowsPlatform))] [assembly: TypeForwardedTo(typeof(DetourNativeX86Platform))] [assembly: TypeForwardedTo(typeof(DetourRuntimeILPlatform))] [assembly: TypeForwardedTo(typeof(DetourRuntimeMonoPlatform))] [assembly: TypeForwardedTo(typeof(DetourRuntimeNET50Platform))] [assembly: TypeForwardedTo(typeof(DetourRuntimeNET60Platform))] [assembly: TypeForwardedTo(typeof(DetourRuntimeNETCore30Platform))] [assembly: TypeForwardedTo(typeof(DetourRuntimeNETCorePlatform))] [assembly: TypeForwardedTo(typeof(DetourRuntimeNETPlatform))] [assembly: TypeForwardedTo(typeof(CecilILGenerator))] [assembly: TypeForwardedTo(typeof(ILGeneratorShim))] [assembly: TypeForwardedTo(typeof(ILGeneratorShimExt))] [assembly: TypeForwardedTo(typeof(DMDCecilGenerator))] [assembly: TypeForwardedTo(typeof(DMDEmitDynamicMethodGenerator))] [assembly: TypeForwardedTo(typeof(DMDEmitMethodBuilderGenerator))] [assembly: TypeForwardedTo(typeof(DMDGenerator<>))] [assembly: TypeForwardedTo(typeof(DynamicMethodDefinition))] [assembly: TypeForwardedTo(typeof(DynamicMethodHelper))] [assembly: TypeForwardedTo(typeof(DynamicMethodReference))] [assembly: TypeForwardedTo(typeof(DynData<>))] [assembly: TypeForwardedTo(typeof(DynDll))] [assembly: TypeForwardedTo(typeof(DynDllImportAttribute))] [assembly: TypeForwardedTo(typeof(DynDllMapping))] [assembly: TypeForwardedTo(typeof(Extensions))] [assembly: TypeForwardedTo(typeof(FastReflectionDelegate))] [assembly: TypeForwardedTo(typeof(FastReflectionHelper))] [assembly: TypeForwardedTo(typeof(GCListener))] [assembly: TypeForwardedTo(typeof(GenericMethodInstantiationComparer))] [assembly: TypeForwardedTo(typeof(GenericTypeInstantiationComparer))] [assembly: TypeForwardedTo(typeof(ICallSiteGenerator))] [assembly: TypeForwardedTo(typeof(LazyDisposable))] [assembly: TypeForwardedTo(typeof(LazyDisposable<>))] [assembly: TypeForwardedTo(typeof(MMReflectionImporter))] [assembly: TypeForwardedTo(typeof(Platform))] [assembly: TypeForwardedTo(typeof(PlatformHelper))] [assembly: TypeForwardedTo(typeof(ReflectionHelper))] [assembly: TypeForwardedTo(typeof(Relinker))] [assembly: TypeForwardedTo(typeof(RelinkFailedException))] [assembly: TypeForwardedTo(typeof(RelinkTargetNotFoundException))] [assembly: TypeForwardedTo(typeof(WeakReferenceComparer))] [assembly: TypeForwardedTo(typeof(IgnoresAccessChecksToAttribute))] [assembly: TypeForwardedTo(typeof(TomlDoNotInlineObjectAttribute))] [assembly: TypeForwardedTo(typeof(TomlInlineCommentAttribute))] [assembly: TypeForwardedTo(typeof(TomlPrecedingCommentAttribute))] [assembly: TypeForwardedTo(typeof(TomlPropertyAttribute))] [assembly: TypeForwardedTo(typeof(InvalidTomlDateTimeException))] [assembly: TypeForwardedTo(typeof(InvalidTomlEscapeException))] [assembly: TypeForwardedTo(typeof(InvalidTomlInlineTableException))] [assembly: TypeForwardedTo(typeof(InvalidTomlKeyException))] [assembly: TypeForwardedTo(typeof(InvalidTomlNumberException))] [assembly: TypeForwardedTo(typeof(MissingIntermediateInTomlTableArraySpecException))] [assembly: TypeForwardedTo(typeof(NewLineInTomlInlineTableException))] [assembly: TypeForwardedTo(typeof(NoTomlKeyException))] [assembly: TypeForwardedTo(typeof(TimeOffsetOnTomlDateOrTimeException))] [assembly: TypeForwardedTo(typeof(TomlArraySyntaxException))] [assembly: TypeForwardedTo(typeof(TomlContainsDottedKeyNonTableException))] [assembly: TypeForwardedTo(typeof(TomlDateTimeMissingSeparatorException))] [assembly: TypeForwardedTo(typeof(TomlDateTimeUnnecessarySeparatorException))] [assembly: TypeForwardedTo(typeof(TomlDottedKeyException))] [assembly: TypeForwardedTo(typeof(TomlDottedKeyParserException))] [assembly: TypeForwardedTo(typeof(TomlDoubleDottedKeyException))] [assembly: TypeForwardedTo(typeof(TomlEndOfFileException))] [assembly: TypeForwardedTo(typeof(TomlEnumParseException))] [assembly: TypeForwardedTo(typeof(TomlException))] [assembly: TypeForwardedTo(typeof(TomlExceptionWithLine))] [assembly: TypeForwardedTo(typeof(TomlFieldTypeMismatchException))] [assembly: TypeForwardedTo(typeof(TomlInlineTableSeparatorException))] [assembly: TypeForwardedTo(typeof(TomlInstantiationException))] [assembly: TypeForwardedTo(typeof(TomlInternalException))] [assembly: TypeForwardedTo(typeof(TomlInvalidValueException))] [assembly: TypeForwardedTo(typeof(TomlKeyRedefinitionException))] [assembly: TypeForwardedTo(typeof(TomlMissingEqualsException))] [assembly: TypeForwardedTo(typeof(TomlMissingNewlineException))] [assembly: TypeForwardedTo(typeof(TomlNewlineInInlineCommentException))] [assembly: TypeForwardedTo(typeof(TomlNonTableArrayUsedAsTableArrayException))] [assembly: TypeForwardedTo(typeof(TomlNoSuchValueException))] [assembly: TypeForwardedTo(typeof(TomlPrimitiveToDocumentException))] [assembly: TypeForwardedTo(typeof(TomlStringException))] [assembly: TypeForwardedTo(typeof(TomlTableArrayAlreadyExistsAsNonArrayException))] [assembly: TypeForwardedTo(typeof(TomlTableLockedException))] [assembly: TypeForwardedTo(typeof(TomlTableRedefinitionException))] [assembly: TypeForwardedTo(typeof(TomlTripleQuotedKeyException))] [assembly: TypeForwardedTo(typeof(TomlTypeMismatchException))] [assembly: TypeForwardedTo(typeof(TomlUnescapedUnicodeControlCharException))] [assembly: TypeForwardedTo(typeof(TomlWhitespaceInKeyException))] [assembly: TypeForwardedTo(typeof(TripleQuoteInTomlMultilineLiteralException))] [assembly: TypeForwardedTo(typeof(TripleQuoteInTomlMultilineSimpleStringException))] [assembly: TypeForwardedTo(typeof(UnterminatedTomlKeyException))] [assembly: TypeForwardedTo(typeof(UnterminatedTomlStringException))] [assembly: TypeForwardedTo(typeof(UnterminatedTomlTableArrayException))] [assembly: TypeForwardedTo(typeof(UnterminatedTomlTableNameException))] [assembly: TypeForwardedTo(typeof(ITomlValueWithDateTime))] [assembly: TypeForwardedTo(typeof(TomlArray))] [assembly: TypeForwardedTo(typeof(TomlBoolean))] [assembly: TypeForwardedTo(typeof(TomlCommentData))] [assembly: TypeForwardedTo(typeof(TomlDocument))] [assembly: TypeForwardedTo(typeof(TomlDouble))] [assembly: TypeForwardedTo(typeof(TomlLocalDate))] [assembly: TypeForwardedTo(typeof(TomlLocalDateTime))] [assembly: TypeForwardedTo(typeof(TomlLocalTime))] [assembly: TypeForwardedTo(typeof(TomlLong))] [assembly: TypeForwardedTo(typeof(TomlOffsetDateTime))] [assembly: TypeForwardedTo(typeof(TomlString))] [assembly: TypeForwardedTo(typeof(TomlTable))] [assembly: TypeForwardedTo(typeof(TomlValue))] [assembly: TypeForwardedTo(typeof(TomletMain))] [assembly: TypeForwardedTo(typeof(TomletStringReader))] [assembly: TypeForwardedTo(typeof(TomlNumberUtils))] [assembly: TypeForwardedTo(typeof(TomlParser))] [assembly: TypeForwardedTo(typeof(TomlSerializationMethods))] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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 Semver { internal static class IntExtensions { public static int Digits(this int n) { if (n < 10) { return 1; } if (n < 100) { return 2; } if (n < 1000) { return 3; } if (n < 10000) { return 4; } if (n < 100000) { return 5; } if (n < 1000000) { return 6; } if (n < 10000000) { return 7; } if (n < 100000000) { return 8; } if (n < 1000000000) { return 9; } return 10; } } [Serializable] public sealed class SemVersion : IComparable<SemVersion>, IComparable, ISerializable { private static readonly Regex ParseEx = new Regex("^(?<major>\\d+)(?>\\.(?<minor>\\d+))?(?>\\.(?<patch>\\d+))?(?>\\-(?<pre>[0-9A-Za-z\\-\\.]+))?(?>\\+(?<build>[0-9A-Za-z\\-\\.]+))?$", RegexOptions.ExplicitCapture | RegexOptions.CultureInvariant); public int Major { get; } public int Minor { get; } public int Patch { get; } public string Prerelease { get; } public string Build { get; } private SemVersion(SerializationInfo info, StreamingContext context) { if (info == null) { throw new ArgumentNullException("info"); } SemVersion semVersion = Parse(info.GetString("SemVersion")); Major = semVersion.Major; Minor = semVersion.Minor; Patch = semVersion.Patch; Prerelease = semVersion.Prerelease; Build = semVersion.Build; } public SemVersion(int major, int minor = 0, int patch = 0, string prerelease = "", string build = "") { Major = major; Minor = minor; Patch = patch; Prerelease = prerelease ?? ""; Build = build ?? ""; } public SemVersion(Version version) { if (version == null) { throw new ArgumentNullException("version"); } Major = version.Major; Minor = version.Minor; if (version.Revision >= 0) { Patch = version.Revision; } Prerelease = ""; Build = ((version.Build > 0) ? version.Build.ToString(CultureInfo.InvariantCulture) : ""); } public static SemVersion Parse(string version, bool strict = false) { Match match = ParseEx.Match(version); if (!match.Success) { throw new ArgumentException("Invalid version '" + version + "'.", "version"); } int major = int.Parse(match.Groups["major"].Value, CultureInfo.InvariantCulture); Group group = match.Groups["minor"]; int minor = 0; if (group.Success) { minor = int.Parse(group.Value, CultureInfo.InvariantCulture); } else if (strict) { throw new InvalidOperationException("Invalid version (no minor version given in strict mode)"); } Group group2 = match.Groups["patch"]; int patch = 0; if (group2.Success) { patch = int.Parse(group2.Value, CultureInfo.InvariantCulture); } else if (strict) { throw new InvalidOperationException("Invalid version (no patch version given in strict mode)"); } string value = match.Groups["pre"].Value; string value2 = match.Groups["build"].Value; return new SemVersion(major, minor, patch, value, value2); } public static bool TryParse(string version, out SemVersion semver, bool strict = false) { semver = null; if (version == null) { return false; } Match match = ParseEx.Match(version); if (!match.Success) { return false; } if (!int.TryParse(match.Groups["major"].Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return false; } Group group = match.Groups["minor"]; int result2 = 0; if (group.Success) { if (!int.TryParse(group.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out result2)) { return false; } } else if (strict) { return false; } Group group2 = match.Groups["patch"]; int result3 = 0; if (group2.Success) { if (!int.TryParse(group2.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out result3)) { return false; } } else if (strict) { return false; } string value = match.Groups["pre"].Value; string value2 = match.Groups["build"].Value; semver = new SemVersion(result, result2, result3, value, value2); return true; } public static bool Equals(SemVersion versionA, SemVersion versionB) { if ((object)versionA == versionB) { return true; } if ((object)versionA == null || (object)versionB == null) { return false; } return versionA.Equals(versionB); } public static int Compare(SemVersion versionA, SemVersion versionB) { if ((object)versionA == versionB) { return 0; } if ((object)versionA == null) { return -1; } if ((object)versionB == null) { return 1; } return versionA.CompareTo(versionB); } public SemVersion Change(int? major = null, int? minor = null, int? patch = null, string prerelease = null, string build = null) { return new SemVersion(major ?? Major, minor ?? Minor, patch ?? Patch, prerelease ?? Prerelease, build ?? Build); } public override string ToString() { int capacity = 4 + Major.Digits() + Minor.Digits() + Patch.Digits() + Prerelease.Length + Build.Length; StringBuilder stringBuilder = new StringBuilder(capacity); stringBuilder.Append(Major); stringBuilder.Append('.'); stringBuilder.Append(Minor); stringBuilder.Append('.'); stringBuilder.Append(Patch); if (Prerelease.Length > 0) { stringBuilder.Append('-'); stringBuilder.Append(Prerelease); } if (Build.Length > 0) { stringBuilder.Append('+'); stringBuilder.Append(Build); } return stringBuilder.ToString(); } public int CompareTo(object obj) { return CompareTo((SemVersion)obj); } public int CompareTo(SemVersion other) { int num = CompareByPrecedence(other); if (num != 0) { return num; } return CompareComponent(Build, other.Build); } public bool PrecedenceMatches(SemVersion other) { return CompareByPrecedence(other) == 0; } public int CompareByPrecedence(SemVersion other) { if ((object)other == null) { return 1; } int num = Major.CompareTo(other.Major); if (num != 0) { return num; } num = Minor.CompareTo(other.Minor); if (num != 0) { return num; } num = Patch.CompareTo(other.Patch); if (num != 0) { return num; } return CompareComponent(Prerelease, other.Prerelease, nonemptyIsLower: true); } private static int CompareComponent(string a, string b, bool nonemptyIsLower = false) { bool flag = string.IsNullOrEmpty(a); bool flag2 = string.IsNullOrEmpty(b); if (flag && flag2) { return 0; } if (flag) { return nonemptyIsLower ? 1 : (-1); } if (flag2) { return (!nonemptyIsLower) ? 1 : (-1); } string[] array = a.Split(new char[1] { '.' }); string[] array2 = b.Split(new char[1] { '.' }); int num = Math.Min(array.Length, array2.Length); for (int i = 0; i < num; i++) { string text = array[i]; string text2 = array2[i]; int result; bool flag3 = int.TryParse(text, out result); int result2; bool flag4 = int.TryParse(text2, out result2); int num2; if (flag3 && flag4) { num2 = result.CompareTo(result2); if (num2 != 0) { return num2; } continue; } if (flag3) { return -1; } if (flag4) { return 1; } num2 = string.CompareOrdinal(text, text2); if (num2 != 0) { return num2; } } return array.Length.CompareTo(array2.Length); } public override bool Equals(object obj) { if (obj == null) { return false; } if (this == obj) { return true; } SemVersion semVersion = (SemVersion)obj; return Major == semVersion.Major && Minor == semVersion.Minor && Patch == semVersion.Patch && string.Equals(Prerelease, semVersion.Prerelease, StringComparison.Ordinal) && string.Equals(Build, semVersion.Build, StringComparison.Ordinal); } public override int GetHashCode() { int hashCode = Major.GetHashCode(); hashCode = hashCode * 31 + Minor.GetHashCode(); hashCode = hashCode * 31 + Patch.GetHashCode(); hashCode = hashCode * 31 + Prerelease.GetHashCode(); return hashCode * 31 + Build.GetHashCode(); } [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] public void GetObjectData(SerializationInfo info, StreamingContext context) { if (info == null) { throw new ArgumentNullException("info"); } info.AddValue("SemVersion", ToString()); } public static implicit operator SemVersion(string version) { return Parse(version); } public static bool operator ==(SemVersion left, SemVersion right) { return Equals(left, right); } public static bool operator !=(SemVersion left, SemVersion right) { return !Equals(left, right); } public static bool operator >(SemVersion left, SemVersion right) { return Compare(left, right) > 0; } public static bool operator >=(SemVersion left, SemVersion right) { return Equals(left, right) || Compare(left, right) > 0; } public static bool operator <(SemVersion left, SemVersion right) { return Compare(left, right) < 0; } public static bool operator <=(SemVersion left, SemVersion right) { return Equals(left, right) || Compare(left, right) < 0; } } } namespace Harmony { [Obsolete("Harmony.MethodType is Only Here for Compatibility Reasons. Please use HarmonyLib.MethodType instead.")] public enum MethodType { Normal, Getter, Setter, Constructor, StaticConstructor } [Obsolete("Harmony.PropertyMethod is Only Here for Compatibility Reasons. Please use HarmonyLib.MethodType instead.")] public enum PropertyMethod { Getter = 1, Setter } [Obsolete("Harmony.ArgumentType is Only Here for Compatibility Reasons. Please use HarmonyLib.ArgumentType instead.")] public enum ArgumentType { Normal, Ref, Out, Pointer } [Obsolete("Harmony.HarmonyPatchType is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatchType instead.")] public enum HarmonyPatchType { All, Prefix, Postfix, Transpiler } [Obsolete("Harmony.HarmonyAttribute is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyAttribute instead.")] public class HarmonyAttribute : HarmonyAttribute { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Delegate, AllowMultiple = true)] public class HarmonyPatch : HarmonyPatch { [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch() { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(Type declaringType) : base(declaringType) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(Type declaringType, Type[] argumentTypes) : base(declaringType, argumentTypes) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(Type declaringType, string methodName) : base(declaringType, methodName) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(Type declaringType, string methodName, params Type[] argumentTypes) : base(declaringType, methodName, argumentTypes) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(Type declaringType, string methodName, Type[] argumentTypes, ArgumentType[] argumentVariations) : base(declaringType, methodName, argumentTypes, Array.ConvertAll(argumentVariations, (ArgumentType x) => (ArgumentType)x)) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(Type declaringType, MethodType methodType) : base(declaringType, (MethodType)methodType) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(Type declaringType, MethodType methodType, params Type[] argumentTypes) : base(declaringType, (MethodType)methodType, argumentTypes) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(Type declaringType, MethodType methodType, Type[] argumentTypes, ArgumentType[] argumentVariations) : base(declaringType, (MethodType)methodType, argumentTypes, Array.ConvertAll(argumentVariations, (ArgumentType x) => (ArgumentType)x)) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(Type declaringType, string propertyName, MethodType methodType) : base(declaringType, propertyName, (MethodType)methodType) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(string methodName) : base(methodName) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(string methodName, params Type[] argumentTypes) : base(methodName, argumentTypes) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(string methodName, Type[] argumentTypes, ArgumentType[] argumentVariations) : base(methodName, argumentTypes, Array.ConvertAll(argumentVariations, (ArgumentType x) => (ArgumentType)x)) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(string propertyName, MethodType methodType) : base(propertyName, (MethodType)methodType) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(MethodType methodType) : base((MethodType)methodType) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(MethodType methodType, params Type[] argumentTypes) : base((MethodType)methodType, argumentTypes) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(MethodType methodType, Type[] argumentTypes, ArgumentType[] argumentVariations) : base((MethodType)methodType, argumentTypes, Array.ConvertAll(argumentVariations, (ArgumentType x) => (ArgumentType)x)) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(Type[] argumentTypes) : base(argumentTypes) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(Type[] argumentTypes, ArgumentType[] argumentVariations) : base(argumentTypes, Array.ConvertAll(argumentVariations, (ArgumentType x) => (ArgumentType)x)) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(string propertyName, PropertyMethod type) : base(propertyName, (MethodType)type) { } [Obsolete("Harmony.HarmonyPatch is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatch instead.")] public HarmonyPatch(string assemblyQualifiedDeclaringType, string methodName, MethodType methodType, Type[] argumentTypes = null, ArgumentType[] argumentVariations = null) : base(assemblyQualifiedDeclaringType, methodName, (MethodType)methodType, argumentTypes, Array.ConvertAll(argumentVariations, (ArgumentType x) => (ArgumentType)x)) { } } [Obsolete("Harmony.HarmonyPatchAll is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPatchAll instead.")] [AttributeUsage(AttributeTargets.Class)] public class HarmonyPatchAll : HarmonyPatchAll { } [Obsolete("Harmony.HarmonyPriority is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPriority instead.")] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class HarmonyPriority : HarmonyPriority { [Obsolete("Harmony.HarmonyPriority is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPriority instead.")] public HarmonyPriority(int prioritiy) : base(prioritiy) { } } [Obsolete("Harmony.HarmonyBefore is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyBefore instead.")] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class HarmonyBefore : HarmonyBefore { [Obsolete("Harmony.HarmonyBefore is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyBefore instead.")] public HarmonyBefore(params string[] before) : base(before) { } } [Obsolete("Harmony.HarmonyAfter is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyAfter instead.")] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class HarmonyAfter : HarmonyAfter { [Obsolete("Harmony.HarmonyAfter is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyAfter instead.")] public HarmonyAfter(params string[] after) : base(after) { } } [Obsolete("Harmony.HarmonyPrepare is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPrepare instead.")] [AttributeUsage(AttributeTargets.Method)] public class HarmonyPrepare : HarmonyPrepare { } [Obsolete("Harmony.HarmonyCleanup is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyCleanup instead.")] [AttributeUsage(AttributeTargets.Method)] public class HarmonyCleanup : HarmonyCleanup { } [Obsolete("Harmony.HarmonyTargetMethod is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyTargetMethod instead.")] [AttributeUsage(AttributeTargets.Method)] public class HarmonyTargetMethod : HarmonyTargetMethod { } [Obsolete("Harmony.HarmonyTargetMethods is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyTargetMethods instead.")] [AttributeUsage(AttributeTargets.Method)] public class HarmonyTargetMethods : HarmonyTargetMethods { } [Obsolete("Harmony.HarmonyPrefix is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPrefix instead.")] [AttributeUsage(AttributeTargets.Method)] public class HarmonyPrefix : HarmonyPrefix { } [Obsolete("Harmony.HarmonyPostfix is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyPostfix instead.")] [AttributeUsage(AttributeTargets.Method)] public class HarmonyPostfix : HarmonyPostfix { } [Obsolete("Harmony.HarmonyTranspiler is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyTranspiler instead.")] [AttributeUsage(AttributeTargets.Method)] public class HarmonyTranspiler : HarmonyTranspiler { } [Obsolete("Harmony.HarmonyArgument is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyArgument instead.")] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Parameter, AllowMultiple = true)] public class HarmonyArgument : HarmonyArgument { [Obsolete("Harmony.HarmonyArgument is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyArgument instead.")] public HarmonyArgument(string originalName) : base(originalName, (string)null) { } [Obsolete("Harmony.HarmonyArgument is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyArgument instead.")] public HarmonyArgument(int index) : base(index, (string)null) { } [Obsolete("Harmony.HarmonyArgument is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyArgument instead.")] public HarmonyArgument(string originalName, string newName) : base(originalName, newName) { } [Obsolete("Harmony.HarmonyArgument is Only Here for Compatibility Reasons. Please use HarmonyLib.HarmonyArgument instead.")] public HarmonyArgument(int index, string name) : base(index, name) { } } public class DelegateTypeFactory : DelegateTypeFactory { } public delegate object GetterHandler(object source); public delegate void SetterHandler(object source, object value); public delegate object InstantiationHandler(); public class FastAccess { [Obsolete("Use AccessTools.MethodDelegate<Func<T, S>>(PropertyInfo.GetGetMethod(true))")] public static InstantiationHandler CreateInstantiationHandler(Type type) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown ConstructorInfo constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[0], null); if ((object)constructor == null) { throw new ApplicationException($"The type {type} must declare an empty constructor (the constructor may be private, internal, protected, protected internal, or public)."); } DynamicMethodDefinition val = new DynamicMethodDefinition("InstantiateObject_" + type.Name, type, (Type[])null); ILGenerator iLGenerator = val.GetILGenerator(); iLGenerator.Emit(OpCodes.Newobj, constructor); iLGenerator.Emit(OpCodes.Ret); return (InstantiationHandler)Extensions.CreateDelegate((MethodBase)val.Generate(), typeof(InstantiationHandler)); } [Obsolete("Use AccessTools.MethodDelegate<Func<T, S>>(PropertyInfo.GetGetMethod(true))")] public static GetterHandler CreateGetterHandler(PropertyInfo propertyInfo) { MethodInfo getMethod = propertyInfo.GetGetMethod(nonPublic: true); DynamicMethodDefinition val = CreateGetDynamicMethod(propertyInfo.DeclaringType); ILGenerator iLGenerator = val.GetILGenerator(); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Call, getMethod); iLGenerator.Emit(OpCodes.Ret); return (GetterHandler)Extensions.CreateDelegate((MethodBase)val.Generate(), typeof(GetterHandler)); } [Obsolete("Use AccessTools.FieldRefAccess<T, S>(fieldInfo)")] public static GetterHandler CreateGetterHandler(FieldInfo fieldInfo) { DynamicMethodDefinition val = CreateGetDynamicMethod(fieldInfo.DeclaringType); ILGenerator iLGenerator = val.GetILGenerator(); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldfld, fieldInfo); iLGenerator.Emit(OpCodes.Ret); return (GetterHandler)Extensions.CreateDelegate((MethodBase)val.Generate(), typeof(GetterHandler)); } [Obsolete("Use AccessTools.FieldRefAccess<T, S>(name) for fields and AccessTools.MethodDelegate<Func<T, S>>(AccessTools.PropertyGetter(typeof(T), name)) for properties")] public static GetterHandler CreateFieldGetter(Type type, params string[] names) { foreach (string name in names) { FieldInfo field = type.GetField(name, AccessTools.all); if ((object)field != null) { return CreateGetterHandler(field); } PropertyInfo property = type.GetProperty(name, AccessTools.all); if ((object)property != null) { return CreateGetterHandler(property); } } return null; } [Obsolete("Use AccessTools.MethodDelegate<Action<T, S>>(PropertyInfo.GetSetMethod(true))")] public static SetterHandler CreateSetterHandler(PropertyInfo propertyInfo) { MethodInfo setMethod = propertyInfo.GetSetMethod(nonPublic: true); DynamicMethodDefinition val = CreateSetDynamicMethod(propertyInfo.DeclaringType); ILGenerator iLGenerator = val.GetILGenerator(); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldarg_1); iLGenerator.Emit(OpCodes.Call, setMethod); iLGenerator.Emit(OpCodes.Ret); return (SetterHandler)Extensions.CreateDelegate((MethodBase)val.Generate(), typeof(SetterHandler)); } [Obsolete("Use AccessTools.FieldRefAccess<T, S>(fieldInfo)")] public static SetterHandler CreateSetterHandler(FieldInfo fieldInfo) { DynamicMethodDefinition val = CreateSetDynamicMethod(fieldInfo.DeclaringType); ILGenerator iLGenerator = val.GetILGenerator(); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldarg_1); iLGenerator.Emit(OpCodes.Stfld, fieldInfo); iLGenerator.Emit(OpCodes.Ret); return (SetterHandler)Extensions.CreateDelegate((MethodBase)val.Generate(), typeof(SetterHandler)); } private static DynamicMethodDefinition CreateGetDynamicMethod(Type type) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown return new DynamicMethodDefinition("DynamicGet_" + type.Name, typeof(object), new Type[1] { typeof(object) }); } private static DynamicMethodDefinition CreateSetDynamicMethod(Type type) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown return new DynamicMethodDefinition("DynamicSet_" + type.Name, typeof(void), new Type[2] { typeof(object), typeof(object) }); } } public delegate object FastInvokeHandler(object target, object[] paramters); public class MethodInvoker { public static FastInvokeHandler GetHandler(DynamicMethod methodInfo, Module module) { return ConvertFastInvokeHandler(MethodInvoker.GetHandler((MethodInfo)methodInfo, false)); } public static FastInvokeHandler GetHandler(MethodInfo methodInfo) { return ConvertFastInvokeHandler(MethodInvoker.GetHandler(methodInfo, false)); } private static FastInvokeHandler ConvertFastInvokeHandler(FastInvokeHandler sourceDelegate) { return (FastInvokeHandler)Delegate.CreateDelegate(typeof(FastInvokeHandler), ((Delegate)(object)sourceDelegate).Target, ((Delegate)(object)sourceDelegate).Method); } } public class HarmonyInstance : Harmony { [Obsolete("Harmony.HarmonyInstance is obsolete. Please use HarmonyLib.Harmony instead.")] public HarmonyInstance(string id) : base(id) { } [Obsolete("Harmony.HarmonyInstance.Create is obsolete. Please use the HarmonyLib.Harmony Constructor instead.")] public static HarmonyInstance Create(string id) { if (id == null) { throw new Exception("id cannot be null"); } return new HarmonyInstance(id); } [Obsolete("Harmony.HarmonyInstance.Patch is obsolete. Please use HarmonyLib.Harmony.Patch instead.")] public DynamicMethod Patch(MethodBase original, HarmonyMethod prefix = null, HarmonyMethod postfix = null, HarmonyMethod transpiler = null) { ((Harmony)this).Patch(original, (HarmonyMethod)(object)prefix, (HarmonyMethod)(object)postfix, (HarmonyMethod)(object)transpiler, (HarmonyMethod)null, (HarmonyMethod)null); return null; } public void Unpatch(MethodBase original, HarmonyPatchType type, string harmonyID = null) { ((Harmony)this).Unpatch(original, (HarmonyPatchType)type, harmonyID); } } [Obsolete("Harmony.HarmonyMethod is obsolete. Please use HarmonyLib.HarmonyMethod instead.")] public class HarmonyMethod : HarmonyMethod { [Obsolete("Harmony.HarmonyMethod.prioritiy is obsolete. Please use HarmonyLib.HarmonyMethod.priority instead.")] public int prioritiy = -1; [Obsolete("Harmony.HarmonyMethod is obsolete. Please use HarmonyLib.HarmonyMethod instead.")] public HarmonyMethod() { } [Obsolete("Harmony.HarmonyMethod is obsolete. Please use HarmonyLib.HarmonyMethod instead.")] public HarmonyMethod(MethodInfo method) : base(method) { } [Obsolete("Harmony.HarmonyMethod is obsolete. Please use HarmonyLib.HarmonyMethod instead.")] public HarmonyMethod(Type type, string name, Type[] parameters = null) : base(type, name, parameters) { } [Obsolete("Harmony.HarmonyMethod.Merge is obsolete. Please use HarmonyLib.HarmonyMethod.Merge instead.")] public static HarmonyMethod Merge(List<HarmonyMethod> attributes) { return (HarmonyMethod)(object)HarmonyMethod.Merge(Array.ConvertAll(attributes.ToArray(), (HarmonyMethod x) => (HarmonyMethod)(object)x).ToList()); } public override string ToString() { return ((HarmonyMethod)this).ToString(); } } [Obsolete("Harmony.HarmonyMethodExtensions is obsolete. Please use HarmonyLib.HarmonyMethodExtensions instead.")] public static class HarmonyMethodExtensions { [Obsolete("Harmony.HarmonyMethodExtensions.CopyTo is obsolete. Please use HarmonyLib.HarmonyMethodExtensions.CopyTo instead.")] public static void CopyTo(this HarmonyMethod from, HarmonyMethod to) { HarmonyMethodExtensions.CopyTo((HarmonyMethod)(object)from, (HarmonyMethod)(object)to); } [Obsolete("Harmony.HarmonyMethodExtensions.Clone is obsolete. Please use HarmonyLib.HarmonyMethodExtensions.Clone instead.")] public static HarmonyMethod Clone(this HarmonyMethod original) { return (HarmonyMethod)(object)HarmonyMethodExtensions.Clone((HarmonyMethod)(object)original); } [Obsolete("Harmony.HarmonyMethodExtensions.Merge is obsolete. Please use HarmonyLib.HarmonyMethodExtensions.Merge instead.")] public static HarmonyMethod Merge(this HarmonyMethod master, HarmonyMethod detail) { return (HarmonyMethod)(object)HarmonyMethodExtensions.Merge((HarmonyMethod)(object)master, (HarmonyMethod)(object)detail); } [Obsolete("Harmony.HarmonyMethodExtensions.GetHarmonyMethods(Type) is obsolete. Please use HarmonyLib.HarmonyMethodExtensions.GetFromType instead.")] public static List<HarmonyMethod> GetHarmonyMethods(this Type type) { return Array.ConvertAll(HarmonyMethodExtensions.GetFromType(type).ToArray(), (HarmonyMethod x) => (HarmonyMethod)(object)x).ToList(); } [Obsolete("Harmony.HarmonyMethodExtensions.GetHarmonyMethods(MethodBase) is obsolete. Please use HarmonyLib.HarmonyMethodExtensions.GetFromMethod instead.")] public static List<HarmonyMethod> GetHarmonyMethods(this MethodBase method) { return Array.ConvertAll(HarmonyMethodExtensions.GetFromMethod(method).ToArray(), (HarmonyMethod x) => (HarmonyMethod)(object)x).ToList(); } } [Obsolete("Harmony.PatchInfoSerialization is Only Here for Compatibility Reasons. Please use HarmonyLib.PatchInfoSerialization instead.")] public static class PatchInfoSerialization { private delegate PatchInfo HarmonyLib_PatchInfoSerialization_Deserialize_Delegate(byte[] bytes); private delegate int HarmonyLib_PatchInfoSerialization_PriorityComparer_Delegate(object obj, int index, int priority); private static HarmonyLib_PatchInfoSerialization_Deserialize_Delegate HarmonyLib_PatchInfoSerialization_Deserialize = Extensions.CreateDelegate<HarmonyLib_PatchInfoSerialization_Deserialize_Delegate>((MethodBase)AccessTools.Method("HarmonyLib.PatchInfoSerialization:Deserialize", (Type[])null, (Type[])null)); private static HarmonyLib_PatchInfoSerialization_PriorityComparer_Delegate HarmonyLib_PatchInfoSerialization_PriorityComparer = Extensions.CreateDelegate<HarmonyLib_PatchInfoSerialization_PriorityComparer_Delegate>((MethodBase)AccessTools.Method("HarmonyLib.PatchInfoSerialization:PriorityComparer", (Type[])null, (Type[])null)); [Obsolete("Harmony.PatchInfoSerialization.Deserialize is Only Here for Compatibility Reasons. Please use HarmonyLib.PatchInfoSerialization.Deserialize instead.")] public static PatchInfo Deserialize(byte[] bytes) { return (PatchInfo)(object)HarmonyLib_PatchInfoSerialization_Deserialize(bytes); } [Obsolete("Harmony.PatchInfoSerialization.PriorityComparer is Only Here for Compatibility Reasons. Please use HarmonyLib.PatchInfoSerialization.PriorityComparer instead.")] public static int PriorityComparer(object obj, int index, int priority, string[] before, string[] after) { return HarmonyLib_PatchInfoSerialization_PriorityComparer(obj, index, priority); } } [Serializable] [Obsolete("Harmony.PatchInfo is Only Here for Compatibility Reasons. Please use HarmonyLib.PatchInfo instead.")] public class PatchInfo : PatchInfo { } [Serializable] [Obsolete("Harmony.Patch is Only Here for Compatibility Reasons. Please use HarmonyLib.Patch instead.")] public class Patch : IComparable { public readonly MethodInfo patch; private Patch patchWrapper; [Obsolete("Harmony.Patch is Only Here for Compatibility Reasons. Please use HarmonyLib.Patch instead.")] public Patch(MethodInfo patch, int index, string owner, int priority, string[] before, string[] after) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown this.patch = patch; patchWrapper = new Patch(patch, index, owner, priority, before, after, false); } public MethodInfo GetMethod(MethodBase original) { return patchWrapper.GetMethod(original); } public override bool Equals(object obj) { return ((object)patchWrapper).Equals(obj); } public int CompareTo(object obj) { return patchWrapper.CompareTo(obj); } public override int GetHashCode() { return ((object)patchWrapper).GetHashCode(); } } [Obsolete("Harmony.Priority is Only Here for Compatibility Reasons. Please use HarmonyLib.Priority instead.")] public static class Priority { [Obsolete("Harmony.Priority.Last is Only Here for Compatibility Reasons. Please use HarmonyLib.Priority.Last instead.")] public const int Last = 0; [Obsolete("Harmony.Priority.VeryLow is Only Here for Compatibility Reasons. Please use HarmonyLib.Priority.VeryLow instead.")] public const int VeryLow = 100; [Obsolete("Harmony.Priority.Low is Only Here for Compatibility Reasons. Please use HarmonyLib.Priority.Low instead.")] public const int Low = 200; [Obsolete("Harmony.Priority.LowerThanNormal is Only Here for Compatibility Reasons. Please use HarmonyLib.Priority.LowerThanNormal instead.")] public const int LowerThanNormal = 300; [Obsolete("Harmony.Priority.Normal is Only Here for Compatibility Reasons. Please use HarmonyLib.Priority.Normal instead.")] public const int Normal = 400; [Obsolete("Harmony.Priority.HigherThanNormal is Only Here for Compatibility Reasons. Please use HarmonyLib.Priority.HigherThanNormal instead.")] public const int HigherThanNormal = 500; [Obsolete("Harmony.Priority.High is Only Here for Compatibility Reasons. Please use HarmonyLib.Priority.High instead.")] public const int High = 600; [Obsolete("Harmony.Priority.VeryHigh is Only Here for Compatibility Reasons. Please use HarmonyLib.Priority.VeryHigh instead.")] public const int VeryHigh = 700; [Obsolete("Harmony.Priority.First is Only Here for Compatibility Reasons. Please use HarmonyLib.Priority.First instead.")] public const int First = 800; } [Obsolete("Harmony.AccessTools is Only Here for Compatibility Reasons. Please use HarmonyLib.AccessTools instead.")] public static class AccessTools { public delegate ref U FieldRef<T, U>(T obj); public static BindingFlags all = AccessTools.all; public static Type TypeByName(string name) { return AccessTools.TypeByName(name); } public static T FindIncludingBaseTypes<T>(Type type, Func<Type, T> action) where T : class { return AccessTools.FindIncludingBaseTypes<T>(type, action); } public static T FindIncludingInnerTypes<T>(Type type, Func<Type, T> action) where T : class { return AccessTools.FindIncludingInnerTypes<T>(type, action); } public static FieldInfo Field(Type type, string name) { return AccessTools.Field(type, name); } public static FieldInfo Field(Type type, int idx) { return AccessTools.DeclaredField(type, idx); } public static PropertyInfo DeclaredProperty(Type type, string name) { return AccessTools.DeclaredProperty(type, name); } public static PropertyInfo Property(Type type, string name) { return AccessTools.Property(type, name); } public static MethodInfo DeclaredMethod(Type type, string name, Type[] parameters = null, Type[] generics = null) { return AccessTools.DeclaredMethod(type, name, parameters, generics); } public static MethodInfo Method(Type type, string name, Type[] parameters = null, Type[] generics = null) { return AccessTools.Method(type, name, parameters, generics); } public static MethodInfo Method(string typeColonMethodname, Type[] parameters = null, Type[] generics = null) { return AccessTools.Method(typeColonMethodname, parameters, generics); } public static List<string> GetMethodNames(Type type) { return AccessTools.GetMethodNames(type); } public static List<string> GetMethodNames(object instance) { return AccessTools.GetMethodNames(instance); } public static ConstructorInfo DeclaredConstructor(Type type, Type[] parameters = null) { return AccessTools.DeclaredConstructor(type, parameters, false); } public static ConstructorInfo Constructor(Type type, Type[] parameters = null) { return AccessTools.Constructor(type, parameters, false); } public static List<ConstructorInfo> GetDeclaredConstructors(Type type) { return AccessTools.GetDeclaredConstructors(type, (bool?)null); } public static List<MethodInfo> GetDeclaredMethods(Type type) { return AccessTools.GetDeclaredMethods(type); } public static List<PropertyInfo> GetDeclaredProperties(Type type) { return AccessTools.GetDeclaredProperties(type); } public static List<FieldInfo> GetDeclaredFields(Type type) { return AccessTools.GetDeclaredFields(type); } public static Type GetReturnedType(MethodBase method) { return AccessTools.GetReturnedType(method); } public static Type Inner(Type type, string name) { return AccessTools.Inner(type, name); } public static Type FirstInner(Type type, Func<Type, bool> predicate) { return AccessTools.FirstInner(type, predicate); } public static MethodInfo FirstMethod(Type type, Func<MethodInfo, bool> predicate) { return AccessTools.FirstMethod(type, predicate); } public static ConstructorInfo FirstConstructor(Type type, Func<ConstructorInfo, bool> predicate) { return AccessTools.FirstConstructor(type, predicate); } public static PropertyInfo FirstProperty(Type type, Func<PropertyInfo, bool> predicate) { return AccessTools.FirstProperty(type, predicate); } public static Type[] GetTypes(object[] parameters) { return AccessTools.GetTypes(parameters); } public static List<string> GetFieldNames(Type type) { return AccessTools.GetFieldNames(type); } public static List<string> GetFieldNames(object instance) { return AccessTools.GetFieldNames(instance); } public static List<string> GetPropertyNames(Type type) { return AccessTools.GetPropertyNames(type); } public static List<string> GetPropertyNames(object instance) { return AccessTools.GetPropertyNames(instance); } public static FieldRef<T, U> FieldRefAccess<T, U>(string fieldName) { return ConvertFieldRef<T, U>(AccessTools.FieldRefAccess<T, U>(fieldName)); } public static ref U FieldRefAccess<T, U>(T instance, string fieldName) { return ref FieldRefAccess<T, U>(fieldName)(instance); } private static FieldRef<T, U> ConvertFieldRef<T, U>(FieldRef<T, U> sourceDelegate) { return (FieldRef<T, U>)Delegate.CreateDelegate(typeof(FieldRef<T, U>), ((Delegate)(object)sourceDelegate).Target, ((Delegate)(object)sourceDelegate).Method); } public static void ThrowMissingMemberException(Type type, params string[] names) { AccessTools.ThrowMissingMemberException(type, names); } public static object GetDefaultValue(Type type) { return AccessTools.GetDefaultValue(type); } public static object CreateInstance(Type type) { return AccessTools.CreateInstance(type); } public static bool IsStruct(Type type) { return AccessTools.IsStruct(type); } public static bool IsClass(Type type) { return AccessTools.IsClass(type); } public static bool IsValue(Type type) { return AccessTools.IsValue(type); } public static bool IsVoid(Type type) { return AccessTools.IsVoid(type); } } [Obsolete("Harmony.GeneralExtensions is Only Here for Compatibility Reasons. Please use HarmonyLib.GeneralExtensions instead.")] public static class GeneralExtensions { [Obsolete("Harmony.GeneralExtensions.Join is Only Here for Compatibility Reasons. Please use HarmonyLib.GeneralExtensions.Join instead.")] public static string Join<T>(this IEnumerable<T> enumeration, Func<T, string> converter = null, string delimiter = ", ") { return GeneralExtensions.Join<T>(enumeration, converter, delimiter); } [Obsolete("Harmony.GeneralExtensions.Description is Only Here for Compatibility Reasons. Please use HarmonyLib.GeneralExtensions.Description instead.")] public static string Description(this Type[] parameters) { return GeneralExtensions.Description(parameters); } [Obsolete("Harmony.GeneralExtensions.FullDescription is Only Here for Compatibility Reasons. Please use HarmonyLib.GeneralExtensions.FullDescription instead.")] public static string FullDescription(this MethodBase method) { return GeneralExtensions.FullDescription(method); } [Obsolete("Harmony.GeneralExtensions.Types is Only Here for Compatibility Reasons. Please use HarmonyLib.GeneralExtensions.Types instead.")] public static Type[] Types(this ParameterInfo[] pinfo) { return GeneralExtensions.Types(pinfo); } [Obsolete("Harmony.GeneralExtensions.GetValueSafe is Only Here for Compatibility Reasons. Please use HarmonyLib.GeneralExtensions.GetValueSafe instead.")] public static T GetValueSafe<S, T>(this Dictionary<S, T> dictionary, S key) { return GeneralExtensions.GetValueSafe<S, T>(dictionary, key); } [Obsolete("Harmony.GeneralExtensions.GetTypedValue is Only Here for Compatibility Reasons. Please use HarmonyLib.GeneralExtensions.GetTypedValue instead.")] public static T GetTypedValue<T>(this Dictionary<string, object> dictionary, string key) { return GeneralExtensions.GetTypedValue<T>(dictionary, key); } } [Obsolete("Harmony.CollectionExtensions is Only Here for Compatibility Reasons. Please use HarmonyLib.CollectionExtensions instead.")] public static class CollectionExtensions { [Obsolete("Harmony.CollectionExtensions.Do is Only Here for Compatibility Reasons. Please use HarmonyLib.CollectionExtensions.Do instead.")] public static void Do<T>(this IEnumerable<T> sequence, Action<T> action) { CollectionExtensions.Do<T>(sequence, action); } [Obsolete("Harmony.CollectionExtensions.DoIf is Only Here for Compatibility Reasons. Please use HarmonyLib.CollectionExtensions.DoIf instead.")] public static void DoIf<T>(this IEnumerable<T> sequence, Func<T, bool> condition, Action<T> action) { CollectionExtensions.DoIf<T>(sequence, condition, action); } [Obsolete("Harmony.CollectionExtensions.Add is Only Here for Compatibility Reasons. Please use HarmonyLib.CollectionExtensions.Add instead.")] public static IEnumerable<T> Add<T>(this IEnumerable<T> sequence, T item) { return CollectionExtensions.AddItem<T>(sequence, item); } [Obsolete("Harmony.CollectionExtensions.AddRangeToArray is Only Here for Compatibility Reasons. Please use HarmonyLib.CollectionExtensions.AddRangeToArray instead.")] public static T[] AddRangeToArray<T>(this T[] sequence, T[] items) { return CollectionExtensions.AddRangeToArray<T>(sequence, items); } [Obsolete("Harmony.CollectionExtensions.AddToArray is Only Here for Compatibility Reasons. Please use HarmonyLib.CollectionExtensions.AddToArray instead.")] public static T[] AddToArray<T>(this T[] sequence, T item) { return CollectionExtensions.AddToArray<T>(sequence, item); } } [Obsolete("Harmony.SymbolExtensions is Only Here for Compatibility Reasons. Please use HarmonyLib.SymbolExtensions instead.")] public static class SymbolExtensions { [Obsolete("Harmony.SymbolExtensions.GetMethodInfo is Only Here for Compatibility Reasons. Please use HarmonyLib.SymbolExtensions.GetMethodInfo instead.")] public static MethodInfo GetMethodInfo(Expression<Action> expression) { return SymbolExtensions.GetMethodInfo(expression); } [Obsolete("Harmony.SymbolExtensions.GetMethodInfo is Only Here for Compatibility Reasons. Please use HarmonyLib.SymbolExtensions.GetMethodInfo instead.")] public static MethodInfo GetMethodInfo<T>(Expression<Action<T>> expression) { return GetMethodInfo((LambdaExpression)expression); } [Obsolete("Harmony.SymbolExtensions.GetMethodInfo is Only Here for Compatibility Reasons. Please use HarmonyLib.SymbolExtensions.GetMethodInfo instead.")] public static MethodInfo GetMethodInfo<T, TResult>(Expression<Func<T, TResult>> expression) { return GetMethodInfo((LambdaExpression)expression); } [Obsolete("Harmony.SymbolExtensions.GetMethodInfo is Only Here for Compatibility Reasons. Please use HarmonyLib.SymbolExtensions.GetMethodInfo instead.")] public static MethodInfo GetMethodInfo(LambdaExpression expression) { return SymbolExtensions.GetMethodInfo(expression); } } [Obsolete("Harmony.HarmonyShield is Only Here for Compatibility Reasons. Please use MelonLoader.PatchShield instead.")] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method)] public class HarmonyShield : PatchShield { } } namespace MelonLoader { [AttributeUsage(AttributeTargets.Assembly)] public class HarmonyDontPatchAllAttribute : Attribute { } [AttributeUsage(AttributeTargets.Assembly)] public class MelonAdditionalDependenciesAttribute : Attribute { public string[] AssemblyNames { get; internal set; } public MelonAdditionalDependenciesAttribute(params string[] assemblyNames) { AssemblyNames = assemblyNames; } } [AttributeUsage(AttributeTargets.Assembly)] public class MelonAuthorColorAttribute : Attribute { public ConsoleColor Color { get; internal set; } public MelonAuthorColorAttribute() { Color = MelonLogger.DefaultTextColor; } public MelonAuthorColorAttribute(ConsoleColor color) { Color = ((color == ConsoleColor.Black) ? MelonLogger.DefaultMelonColor : color); } } [AttributeUsage(AttributeTargets.Assembly)] public class MelonColorAttribute : Attribute { public ConsoleColor Color { get; internal set; } public MelonColorAttribute() { Color = MelonLogger.DefaultMelonColor; } public MelonColorAttribute(ConsoleColor color) { Color = ((color == ConsoleColor.Black) ? MelonLogger.DefaultMelonColor : color); } } [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] public class MelonGameAttribute : Attribute { public string Developer { get; internal set; } public string Name { get; internal set; } public bool Universal => string.IsNullOrEmpty(Developer) || Developer.Equals("UNKNOWN") || string.IsNullOrEmpty(Name) || Name.Equals("UNKNOWN"); public MelonGameAttribute(string developer = null, string name = null) { Developer = developer; Name = name; } public bool IsCompatible(string developer, string gameName) { return Universal || (!string.IsNullOrEmpty(developer) && Developer.Equals(developer) && !string.IsNullOrEmpty(gameName) && Name.Equals(gameName)); } public bool IsCompatible(MelonGameAttribute att) { return IsCompatibleBecauseUniversal(att) || (att.Developer.Equals(Developer) && att.Name.Equals(Name)); } public bool IsCompatibleBecauseUniversal(MelonGameAttribute att) { return att == null || Universal || att.Universal; } [Obsolete("IsCompatible(MelonModGameAttribute) is obsolete. Please use IsCompatible(MelonGameAttribute) instead.")] public bool IsCompatible(MelonModGameAttribute att) { return att == null || IsCompatibleBecauseUniversal(att) || (att.Developer.Equals(Developer) && att.GameName.Equals(Name)); } [Obsolete("IsCompatible(MelonPluginGameAttribute) is obsolete. Please use IsCompatible(MelonGameAttribute) instead.")] public bool IsCompatible(MelonPluginGameAttribute att) { return att == null || IsCompatibleBecauseUniversal(att) || (att.Developer.Equals(Developer) && att.GameName.Equals(Name)); } [Obsolete("IsCompatibleBecauseUniversal(MelonModGameAttribute) is obsolete. Please use IsCompatible(MelonGameAttribute) instead.")] public bool IsCompatibleBecauseUniversal(MelonModGameAttribute att) { return att == null || Universal || string.IsNullOrEmpty(att.Developer) || string.IsNullOrEmpty(att.GameName); } [Obsolete("IsCompatibleBecauseUniversal(MelonPluginGameAttribute) is obsolete. Please use IsCompatible(MelonGameAttribute) instead.")] public bool IsCompatibleBecauseUniversal(MelonPluginGameAttribute att) { return att == null || Universal || string.IsNullOrEmpty(att.Developer) || string.IsNullOrEmpty(att.GameName); } } [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] public class MelonGameVersionAttribute : Attribute { public string Version { get; internal set; } public bool Universal => string.IsNullOrEmpty(Version); public MelonGameVersionAttribute(string version = null) { Version = version; } } [AttributeUsage(AttributeTargets.Assembly)] public class MelonIDAttribute : Attribute { public string ID { get; internal set; } public MelonIDAttribute(string id) { ID = id; } public MelonIDAttribute(int id) { ID = id.ToString(); } } [AttributeUsage(AttributeTargets.Assembly)] public class MelonIncompatibleAssembliesAttribute : Attribute { public string[] AssemblyNames { get; internal set; } public MelonIncompatibleAssembliesAttribute(params string[] assemblyNames) { AssemblyNames = assemblyNames; } } [AttributeUsage(AttributeTargets.Assembly)] public class MelonInfoAttribute : Attribute { public Type SystemType { get; internal set; } public string Name { get; internal set; } public string Version { get; internal set; } public SemVersion SemanticVersion { get; internal set; } public string Author { get; internal set; } public string DownloadLink { get; internal set; } public MelonInfoAttribute(Type type, string name, string version, string author, string downloadLink = null) { if ((object)type == null) { throw new ArgumentNullException("type"); } SystemType = type; Name = name ?? "UNKNOWN"; Author = author ?? "UNKNOWN"; DownloadLink = downloadLink; if (string.IsNullOrEmpty(version)) { Version = "1.0.0"; } else { Version = version; } if (SemVersion.TryParse(Version, out var semver)) { SemanticVersion = semver; } } public MelonInfoAttribute(Type type, string name, int versionMajor, int versionMinor, int versionRevision, string versionIdentifier, string author, string downloadLink = null) : this(type, name, string.Format("{0}.{1}.{2}{3}", versionMajor, versionMinor, versionRevision, string.IsNullOrEmpty(versionIdentifier) ? "" : versionIdentifier), author, downloadLink) { } public MelonInfoAttribute(Type type, string name, int versionMajor, int versionMinor, int versionRevision, string author, string downloadLink = null) : this(type, name, versionMajor, versionMinor, versionRevision, null, author, downloadLink) { } } [AttributeUsage(AttributeTargets.Assembly)] public class MelonOptionalDependenciesAttribute : Attribute { public string[] AssemblyNames { get; internal set; } public MelonOptionalDependenciesAttribute(params string[] assemblyNames) { AssemblyNames = assemblyNames; } } [AttributeUsage(AttributeTargets.Assembly)] public class MelonPlatformAttribute : Attribute { public enum CompatiblePlatforms { UNIVERSAL, WINDOWS_X86, WINDOWS_X64 } public CompatiblePlatforms[] Platforms { get; internal set; } public MelonPlatformAttribute(params CompatiblePlatforms[] platforms) { Platforms = platforms; } public bool IsCompatible(CompatiblePlatforms platform) { return Platforms == null || Platforms.Length == 0 || Platforms.Contains(platform); } } [AttributeUsage(AttributeTargets.Assembly)] public class MelonPlatformDomainAttribute : Attribute { public enum CompatibleDomains { UNIVERSAL, MONO, IL2CPP } public CompatibleDomains Domain { get; internal set; } public MelonPlatformDomainAttribute(CompatibleDomains domain = CompatibleDomains.UNIVERSAL) { Domain = domain; } public bool IsCompatible(CompatibleDomains domain) { return Domain == CompatibleDomains.UNIVERSAL || domain == CompatibleDomains.UNIVERSAL || Domain == domain; } } [AttributeUsage(AttributeTargets.Assembly)] public class MelonPriorityAttribute : Attribute { public int Priority; public MelonPriorityAttribute(int priority = 0) { Priority = priority; } } [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] public class MelonProcessAttribute : Attribute { public string EXE_Name { get; internal set; } public bool Universal => string.IsNullOrEmpty(EXE_Name); public MelonProcessAttribute(string exe_name = null) { EXE_Name = RemoveExtension(exe_name); } public bool IsCompatible(string processName) { return Universal || string.IsNullOrEmpty(processName) || RemoveExtension(processName) == EXE_Name; } private string RemoveExtension(string name) { return (name == null) ? null : (name.EndsWith(".exe") ? name.Remove(name.Length - 4) : name); } } [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method)] public class PatchShield : Attribute { private static FieldRef<object, MethodBase> PatchProcessor_OriginalRef; private static void LogException(Exception ex) { MelonLogger.Warning($"Patch Shield Exception: {ex}"); } private static bool MethodCheck(MethodBase method) { return (object)method != null && method.DeclaringType.Assembly.GetCustomAttributes(typeof(PatchShield), inherit: false).Length == 0 && method.DeclaringType.GetCustomAttributes(typeof(PatchShield), inherit: false).Length == 0 && method.GetCustomAttributes(typeof(PatchShield), inherit: false).Length == 0; } internal static void Install() { Type typeFromHandle = typeof(PatchProcessor); Type typeFromHandle2 = typeof(PatchShield); PatchProcessor_OriginalRef = AccessTools.FieldRefAccess<MethodBase>(typeFromHandle, "original"); try { Core.HarmonyInstance.Patch((MethodBase)AccessTools.Method("HarmonyLib.PatchFunctions:ReversePatch", (Type[])null, (Type[])null), AccessTools.Method(typeFromHandle2, "PatchMethod_PatchFunctions_ReversePatch", (Type[])null, (Type[])null).ToNewHarmonyMethod(), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } catch (Exception ex) { LogException(ex); } try { HarmonyMethod val = AccessTools.Method(typeFromHandle2, "PatchMethod_PatchProcessor_Unpatch", (Type[])null, (Type[])null).ToNewHarmonyMethod(); foreach (MethodInfo item in from x in typeFromHandle.GetMethods(BindingFlags.Instance | BindingFlags.Public) where x.Name.Equals("Unpatch") select x) { Core.HarmonyInstance.Patch((MethodBase)item, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } catch (Exception ex2) { LogException(ex2); } try { Core.HarmonyInstance.Patch((MethodBase)AccessTools.Method(typeFromHandle, "Patch", (Type[])null, (Type[])null), AccessTools.Method(typeFromHandle2, "PatchMethod_PatchProcessor_Patch", (Type[])null, (Type[])null).ToNewHarmonyMethod(), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } catch (Exception ex3) { LogException(ex3); } Hook.OnDetour = (Func<Hook, MethodBase, MethodBase, object, bool>)Delegate.Combine(Hook.OnDetour, (Func<Hook, MethodBase, MethodBase, object, bool>)((Hook detour, MethodBase originalMethod, MethodBase patchMethod, object delegateTarget) => MethodCheck(originalMethod))); ILHook.OnDetour = (Func<ILHook, MethodBase, Manipulator, bool>)Delegate.Combine(ILHook.OnDetour, (Func<ILHook, MethodBase, Manipulator, bool>)((ILHook detour, MethodBase originalMethod, Manipulator ilmanipulator) => MethodCheck(originalMethod))); Detour.OnDetour = (Func<Detour, MethodBase, MethodBase, bool>)Delegate.Combine(Detour.OnDetour, (Func<Detour, MethodBase, MethodBase, bool>)((Detour detour, MethodBase originalMethod, MethodBase patchMethod) => MethodCheck(originalMethod))); } private static bool PatchMethod_PatchFunctions_ReversePatch(MethodBase __1) { return MethodCheck(__1); } private static bool PatchMethod_PatchProcessor_Patch(PatchProcessor __instance) { return MethodCheck(PatchProcessor_OriginalRef.Invoke((object)__instance)); } private static bool PatchMethod_PatchProcessor_Unpatch(PatchProcessor __instance) { return MethodCheck(PatchProcessor_OriginalRef.Invoke((object)__instance)); } } [AttributeUsage(AttributeTargets.Class)] public class RegisterTypeInIl2Cpp : Attribute { internal static List<Assembly> registrationQueue = new List<Assembly>(); internal static bool ready; internal bool LogSuccess = true; public RegisterTypeInIl2Cpp() { } public RegisterTypeInIl2Cpp(bool logSuccess) { LogSuccess = logSuccess; } public static void RegisterAssembly(Assembly asm) { if (!MelonUtils.IsGameIl2Cpp()) { return; } if (!ready) { registrationQueue.Add(asm); return; } IEnumerable<Type> validTypes = asm.GetValidTypes(); if (validTypes == null || validTypes.Count() <= 0) { return; } foreach (Type item in validTypes) { object[] customAttributes = item.GetCustomAttributes(typeof(RegisterTypeInIl2Cpp), inherit: false); if (customAttributes != null && customAttributes.Length != 0) { RegisterTypeInIl2Cpp registerTypeInIl2Cpp = (RegisterTypeInIl2Cpp)customAttributes[0]; if (registerTypeInIl2Cpp != null) { UnhollowerSupport.RegisterTypeInIl2CppDomain(item, registerTypeInIl2Cpp.LogSuccess); } } } } internal static void SetReady() { ready = true; if (registrationQueue == null) { return; } foreach (Assembly item in registrationQueue) { RegisterAssembly(item); } registrationQueue = null; } } [AttributeUsage(AttributeTargets.Assembly)] public class VerifyLoaderBuildAttribute : Attribute { public string HashCode { get; internal set; } public VerifyLoaderBuildAttribute(string hashcode) { HashCode = hashcode; } public bool IsCompatible(string hashCode) { return string.IsNullOrEmpty(HashCode) || string.IsNullOrEmpty(hashCode) || HashCode == hashCode; } } [AttributeUsage(AttributeTargets.Assembly)] public class VerifyLoaderVersionAttribute : Attribute { public SemVersion SemVer { get; private set; } public int Major { get; } public int Minor { get; } public int Patch { get; } public bool IsMinimum { get; private set; } public VerifyLoaderVersionAttribute(int major, int minor, int patch) : this(new SemVersion(major, minor, patch), is_minimum: false) { } public VerifyLoaderVersionAttribute(int major, int minor, int patch, bool is_minimum) : this(new SemVersion(major, minor, patch), is_minimum) { } public VerifyLoaderVersionAttribute(string version) : this(version, is_minimum: false) { } public VerifyLoaderVersionAttribute(string version, bool is_minimum) : this(SemVersion.Parse(version), is_minimum) { } public VerifyLoaderVersionAttribute(SemVersion semver, bool is_minimum) { SemVer = semver; IsMinimum = is_minimum; } public bool IsCompatible(SemVersion version) { return SemVer == null || version == null || (IsMinimum ? (SemVer <= version) : (SemVer == version)); } public bool IsCompatible(string version) { SemVersion semver; return !SemVersion.TryParse(version, out semver) || IsCompatible(semver); } } public static class bHaptics { [Obsolete("MelonLoader.bHaptics.DeviceType is Only Here for Compatibility Reasons.")] public enum DeviceType { None, Tactal, TactSuit, Tactosy_arms, Tactosy_hands, Tactosy_feet } [Obsolete("MelonLoader.bHaptics.PositionType is Only Here for Compatibility Reasons. Please use bHapticsLib.PositionID instead.")] public enum PositionType { All = 0, Left = 1, Right = 2, Vest = 3, Head = 4, Racket = 5, HandL = 6, HandR = 7, FootL = 8, FootR = 9, ForearmL = 10, ForearmR = 11, VestFront = 201, VestBack = 202, GloveLeft = 203, GloveRight = 204, Custom1 = 251, Custom2 = 252, Custom3 = 253, Custom4 = 254 } [Obsolete("MelonLoader.bHaptics.RotationOption is Only Here for Compatibility Reasons. Please use bHapticsLib.RotationOption instead.")] public class RotationOption { public float OffsetX; public float OffsetY; public RotationOption(float offsetX, float offsetY) { OffsetX = offsetX; OffsetY = offsetY; } public override string ToString() { return "RotationOption { OffsetX=" + OffsetX + ", OffsetY=" + OffsetY + " }"; } } [Obsolete("MelonLoader.bHaptics.ScaleOption is Only Here for Compatibility Reasons. Please use bHapticsLib.ScaleOption instead.")] public class ScaleOption { public float Intensity; public float Duration; public ScaleOption(float intensity = 1f, float duration = 1f) { Intensity = intensity; Duration = duration; } public override string ToString() { return "ScaleOption { Intensity=" + Intensity + ", Duration=" + Duration + " }"; } } [Obsolete("MelonLoader.bHaptics.DotPoint is Only Here for Compatibility Reasons. Please use bHapticsLib.DotPoint instead.")] public class DotPoint { public int Index; public int Intensity; public DotPoint(int index, int intensity = 50) { if (index < 0 || index > 19) { throw new Exception("Invalid argument index : " + index); } Intensity = MelonUtils.Clamp(intensity, 0, 100); Index = index; } public override string ToString() { return "DotPoint { Index=" + Index + ", Intensity=" + Intensity + " }"; } } [Obsolete("MelonLoader.bHaptics.PathPoint is Only Here for Compatibility Reasons. Please use bHapticsLib.PathPoint instead.")] public struct PathPoint { public float X; public float Y; public int Intensity; public int MotorCount; public PathPoint(float x, float y, int intensity = 50, int motorCount = 3) { X = MelonUtils.Clamp(x, 0f, 1f); Y = MelonUtils.Clamp(y, 0f, 1f); Intensity = MelonUtils.Clamp(intensity, 0, 100); MotorCount = MelonUtils.Clamp(motorCount, 0, 3); } public override string ToString() { return "PathPoint { X=" + X + ", Y=" + Y + ", MotorCount=" + MotorCount + ", Intensity=" + Intensity + " }"; } } [Obsolete("MelonLoader.bHaptics.FeedbackStatus is Only Here for Compatibility Reasons.")] public struct FeedbackStatus { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public int[] values; } private static Converter<DotPoint, DotPoint> DotPointConverter = (DotPoint x) => new DotPoint(0, 50) { Index = x.Index, Intensity = x.Intensity }; private static Converter<PathPoint, PathPoint> PathPointConverter = (PathPoint x) => new PathPoint(0f, 0f, 50, 3) { X = x.X, Y = x.Y, Intensity = x.Intensity, MotorCount = x.MotorCount }; public static bool WasError => false; [Obsolete("MelonLoader.bHaptics.IsPlaying is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.IsPlayingAny instead.")] public static bool IsPlaying() { return bHapticsManager.IsPlayingAny(); } [Obsolete("MelonLoader.bHaptics.IsPlaying(string) is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.IsPlaying instead.")] public static bool IsPlaying(string key) { return bHapticsManager.IsPlaying(key); } [Obsolete("MelonLoader.bHaptics.IsDeviceConnected(DeviceType, bool) is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.IsDeviceConnected instead.")] public static bool IsDeviceConnected(DeviceType type, bool isLeft = true) { return IsDeviceConnected(DeviceTypeToPositionType(type, isLeft)); } [Obsolete("MelonLoader.bHaptics.IsDeviceConnected(PositionType) is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.IsDeviceConnected instead.")] public static bool IsDeviceConnected(PositionType type) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return bHapticsManager.IsDeviceConnected(PositionTypeToPositionID(type)); } [Obsolete("MelonLoader.bHaptics.IsFeedbackRegistered is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.IsPatternRegistered instead.")] public static bool IsFeedbackRegistered(string key) { return bHapticsManager.IsPatternRegistered(key); } [Obsolete("MelonLoader.bHaptics.RegisterFeedback is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.RegisterPatternFromJson instead.")] public static void RegisterFeedback(string key, string tactFileStr) { ProxyArray proxyArray = new ProxyArray(); proxyArray["project"] = MelonLoader.TinyJSON.Decoder.Decode(tactFileStr); bHapticsManager.RegisterPatternFromJson(key, MelonLoader.TinyJSON.Encoder.Encode(proxyArray)); } [Obsolete("MelonLoader.bHaptics.RegisterFeedbackFromTactFile is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.RegisterPatternFromJson instead.")] public static void RegisterFeedbackFromTactFile(string key, string tactFileStr) { bHapticsManager.RegisterPatternFromJson(key, tactFileStr); } [Obsolete("MelonLoader.bHaptics.RegisterFeedbackFromTactFileReflected is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.RegisterPatternSwappedFromJson instead.")] public static void RegisterFeedbackFromTactFileReflected(string key, string tactFileStr) { bHapticsManager.RegisterPatternSwappedFromJson(key, tactFileStr); } [Obsolete("MelonLoader.bHaptics.SubmitRegistered is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.PlayRegistered instead.")] public static void SubmitRegistered(string key) { bHapticsManager.PlayRegistered(key); } [Obsolete("MelonLoader.bHaptics.SubmitRegistered is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.PlayRegistered instead.")] public static void SubmitRegistered(string key, int startTimeMillis) { bHapticsManager.PlayRegistered(key, startTimeMillis); } [Obsolete("MelonLoader.bHaptics.SubmitRegistered is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.PlayRegistered instead.")] public static void SubmitRegistered(string key, string altKey, ScaleOption option) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: 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_0030: Expected O, but got Unknown bHapticsManager.PlayRegistered(key, altKey, new ScaleOption(1f, 1f) { Duration = option.Duration, Intensity = option.Intensity }); } [Obsolete("MelonLoader.bHaptics.SubmitRegistered is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.PlayRegistered instead.")] public static void SubmitRegistered(string key, string altKey, ScaleOption sOption, RotationOption rOption) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: 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_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown //IL_0059: Expected O, but got Unknown bHapticsManager.PlayRegistered(key, altKey, new ScaleOption(1f, 1f) { Duration = sOption.Duration, Intensity = sOption.Intensity }, new RotationOption(0f, 0f) { OffsetAngleX = rOption.OffsetX, OffsetY = rOption.OffsetY }); } [Obsolete("MelonLoader.bHaptics.TurnOff is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.StopPlayingAll instead.")] public static void TurnOff() { bHapticsManager.StopPlayingAll(); } [Obsolete("MelonLoader.bHaptics.TurnOff(string) is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.StopPlaying instead.")] public static void TurnOff(string key) { bHapticsManager.StopPlaying(key); } [Obsolete("MelonLoader.bHaptics.Submit is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.Play instead.")] public static void Submit(string key, DeviceType type, bool isLeft, byte[] bytes, int durationMillis) { Submit(key, DeviceTypeToPositionType(type, isLeft), bytes, durationMillis); } [Obsolete("MelonLoader.bHaptics.Submit is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.Play instead.")] public static void Submit(string key, PositionType position, byte[] bytes, int durationMillis) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) bHapticsManager.Play(key, durationMillis, PositionTypeToPositionID(position), bytes); } [Obsolete("MelonLoader.bHaptics.Submit is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.Play instead.")] public static void Submit(string key, DeviceType type, bool isLeft, List<DotPoint> points, int durationMillis) { Submit(key, DeviceTypeToPositionType(type, isLeft), points, durationMillis); } [Obsolete("MelonLoader.bHaptics.Submit is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.Play instead.")] public static void Submit(string key, PositionType position, List<DotPoint> points, int durationMillis) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) bHapticsManager.Play(key, durationMillis, PositionTypeToPositionID(position), points.ConvertAll(DotPointConverter)); } [Obsolete("MelonLoader.bHaptics.Submit is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.Play instead.")] public static void Submit(string key, DeviceType type, bool isLeft, List<PathPoint> points, int durationMillis) { Submit(key, DeviceTypeToPositionType(type, isLeft), points, durationMillis); } [Obsolete("MelonLoader.bHaptics.Submit is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.Play instead.")] public static void Submit(string key, PositionType position, List<PathPoint> points, int durationMillis) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) bHapticsManager.Play<List<PathPoint>>(key, durationMillis, PositionTypeToPositionID(position), (DotPoint[])null, points.ConvertAll(PathPointConverter)); } [Obsolete("MelonLoader.bHaptics.GetCurrentFeedbackStatus is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.GetDeviceStatus instead.")] public static FeedbackStatus GetCurrentFeedbackStatus(DeviceType type, bool isLeft = true) { return GetCurrentFeedbackStatus(DeviceTypeToPositionType(type, isLeft)); } [Obsolete("MelonLoader.bHaptics.GetCurrentFeedbackStatus is Only Here for Compatibility Reasons. Please use bHapticsLib.bHapticsManager.GetDeviceStatus instead.")] public static FeedbackStatus GetCurrentFeedbackStatus(PositionType pos) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) FeedbackStatus result = default(FeedbackStatus); result.values = bHapticsManager.GetDeviceStatus(PositionTypeToPositionID(pos)); return result; } [Obsolete("MelonLoader.bHaptics.DeviceTypeToPositionType is Only Here for Compatibility Reasons.")] public static PositionType DeviceTypeToPositionType(DeviceType pos, bool isLeft = true) { if (1 == 0) { } PositionType result = pos switch { DeviceType.Tactal => PositionType.Head, DeviceType.TactSuit => PositionType.Vest, DeviceType.Tactosy_arms => isLeft ? PositionType.ForearmL : PositionType.ForearmR, DeviceType.Tactosy_feet => isLeft ? PositionType.FootL : PositionType.FootR, DeviceType.Tactosy_hands => isLeft ? PositionType.HandL : PositionType.HandR, _ => PositionType.Head, }; if (1 == 0) { } return result; } private static PositionID PositionTypeToPositionID(PositionType pos) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to inval
BepInEx/plugins/BepInEx-BepInEx_MLLoader/BepInEx.MelonLoader.Loader/Tomlet.dll.old
Decompiled 8 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using System.Text.RegularExpressions; using System.Xml; using Microsoft.CodeAnalysis; using Tomlet.Attributes; using Tomlet.Exceptions; using Tomlet.Models; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyCompany("N/A")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("\n Tomlet allows consumption and creation of TOML files (often used as configuration files) in .NET applications.\n It supports serialization and deserialization of objects to and from TOML, and is compliant with version 1.0.0 of the TOML specification.\n ")] [assembly: AssemblyFileVersion("5.0.0.0")] [assembly: AssemblyInformationalVersion("5.0.0+6c956664aa89c34c3d8ec0c0342ccd675646589d")] [assembly: AssemblyProduct("Tomlet")] [assembly: AssemblyTitle("Tomlet")] [assembly: AssemblyVersion("5.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace Tomlet { internal static class Extensions { private static readonly HashSet<int> IllegalChars = new HashSet<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 127 }; internal static bool IsWhitespace(this int val) { if (!val.IsNewline()) { return char.IsWhiteSpace((char)val); } return false; } internal static bool IsEquals(this int val) { return val == 61; } internal static bool IsSingleQuote(this int val) { return val == 39; } internal static bool IsDoubleQuote(this int val) { return val == 34; } internal static bool IsHashSign(this int val) { return val == 35; } internal static bool IsNewline(this int val) { if (val != 13) { return val == 10; } return true; } internal static bool IsDigit(this int val) { return char.IsDigit((char)val); } internal static bool IsComma(this int val) { return val == 44; } internal static bool IsPeriod(this int val) { return val == 46; } internal static bool IsEndOfArrayChar(this int val) { return val == 93; } internal static bool IsEndOfInlineObjectChar(this int val) { return val == 125; } internal static bool IsHexDigit(this char c) { if (IsDigit(c)) { return true; } char c2 = char.ToUpperInvariant(c); if (c2 >= 'A') { return c2 <= 'F'; } return false; } internal static bool TryPeek(this TomletStringReader reader, out int nextChar) { nextChar = reader.Peek(); return nextChar != -1; } internal static int SkipWhitespace(this TomletStringReader reader) { return reader.ReadWhile((int c) => c.IsWhitespace()).Length; } internal static void SkipPotentialCarriageReturn(this TomletStringReader reader) { if (reader.TryPeek(out var nextChar) && nextChar == 13) { reader.Read(); } } internal static void SkipAnyComment(this TomletStringReader reader) { if (reader.TryPeek(out var nextChar) && nextChar.IsHashSign()) { reader.ReadWhile((int commentChar) => !commentChar.IsNewline()); } } internal static int SkipAnyNewlineOrWhitespace(this TomletStringReader reader) { return reader.ReadWhile((int c) => c.IsNewline() || c.IsWhitespace()).Count((char c) => c == '\n'); } internal static int SkipAnyCommentNewlineWhitespaceEtc(this TomletStringReader reader) { int num = 0; int nextChar; while (reader.TryPeek(out nextChar) && (nextChar.IsHashSign() || nextChar.IsNewline() || nextChar.IsWhitespace())) { if (nextChar.IsHashSign()) { reader.SkipAnyComment(); } num += reader.SkipAnyNewlineOrWhitespace(); } return num; } internal static int SkipAnyNewline(this TomletStringReader reader) { return reader.ReadWhile((int c) => c.IsNewline()).Count((char c) => c == '\n'); } internal static char[] ReadChars(this TomletStringReader reader, int count) { char[] array = new char[count]; reader.ReadBlock(array, 0, count); return array; } internal static string ReadWhile(this TomletStringReader reader, Predicate<int> predicate) { StringBuilder stringBuilder = new StringBuilder(); int nextChar; while (reader.TryPeek(out nextChar) && predicate(nextChar)) { stringBuilder.Append((char)reader.Read()); } return stringBuilder.ToString(); } internal static bool ExpectAndConsume(this TomletStringReader reader, char expectWhat) { if (!reader.TryPeek(out var nextChar)) { return false; } if (nextChar == expectWhat) { reader.Read(); return true; } return false; } public static void Deconstruct<TKey, TValue>(this KeyValuePair<TKey, TValue> pair, out TKey one, out TValue two) { one = pair.Key; two = pair.Value; } public static bool IsNullOrWhiteSpace(this string s) { if (!string.IsNullOrEmpty(s)) { return string.IsNullOrEmpty(s.Trim()); } return true; } internal static T? GetCustomAttribute<T>(this MemberInfo info) where T : Attribute { return (from a in info.GetCustomAttributes(inherit: false) where a is T select a).Cast<T>().FirstOrDefault(); } internal static void EnsureLegalChar(this int c, int currentLineNum) { if (IllegalChars.Contains(c)) { throw new TomlUnescapedUnicodeControlCharException(currentLineNum, c); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool RuntimeCorrectContains(this string original, char c) { return original.Contains(c.ToString()); } } internal static class TomlCompositeDeserializer { public static TomlSerializationMethods.Deserialize<object> For(Type type) { Type type2 = type; TomlSerializationMethods.Deserialize<object> deserialize; if (type2.IsEnum) { TomlSerializationMethods.Deserialize<object> stringDeserializer = TomlSerializationMethods.GetDeserializer(typeof(string)); deserialize = delegate(TomlValue value) { string text = (string)stringDeserializer(value); try { return Enum.Parse(type2, text, ignoreCase: true); } catch (Exception) { throw new TomlEnumParseException(text, type2); } }; } else { FieldInfo[] fields = type2.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); fields = fields.Where((FieldInfo f) => !f.IsNotSerialized && f.GetCustomAttribute<CompilerGeneratedAttribute>() == null).ToArray(); PropertyInfo[] properties = type2.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); Dictionary<PropertyInfo, TomlPropertyAttribute> propsDict = (from p in properties where (object)p.GetSetMethod(nonPublic: true) != null select new KeyValuePair<PropertyInfo, TomlPropertyAttribute>(p, p.GetCustomAttribute<TomlPropertyAttribute>())).ToDictionary((KeyValuePair<PropertyInfo, TomlPropertyAttribute> tuple) => tuple.Key, (KeyValuePair<PropertyInfo, TomlPropertyAttribute> tuple) => tuple.Value); if (fields.Length + propsDict.Count == 0) { return delegate { try { return Activator.CreateInstance(type2); } catch (MissingMethodException) { throw new TomlInstantiationException(type2); } }; } deserialize = delegate(TomlValue value) { if (!(value is TomlTable tomlTable)) { throw new TomlTypeMismatchException(typeof(TomlTable), value.GetType(), type2); } object obj; try { obj = Activator.CreateInstance(type2); } catch (MissingMethodException) { throw new TomlInstantiationException(type2); } FieldInfo[] array = fields; foreach (FieldInfo fieldInfo in array) { if (tomlTable.TryGetValue(fieldInfo.Name, out TomlValue value2)) { object value3; try { value3 = TomlSerializationMethods.GetDeserializer(fieldInfo.FieldType)(value2); } catch (TomlTypeMismatchException cause) { throw new TomlFieldTypeMismatchException(type2, fieldInfo, cause); } fieldInfo.SetValue(obj, value3); } } foreach (KeyValuePair<PropertyInfo, TomlPropertyAttribute> item in propsDict) { Extensions.Deconstruct(item, out var one, out var two); PropertyInfo propertyInfo = one; string key = two?.GetMappedString() ?? propertyInfo.Name; if (tomlTable.TryGetValue(key, out TomlValue value4)) { object value5; try { value5 = TomlSerializationMethods.GetDeserializer(propertyInfo.PropertyType)(value4); } catch (TomlTypeMismatchException cause2) { throw new TomlPropertyTypeMismatchException(type2, propertyInfo, cause2); } propertyInfo.SetValue(obj, value5, null); } } return obj; }; } TomlSerializationMethods.Register(type2, null, deserialize); return deserialize; } } internal static class TomlCompositeSerializer { public static TomlSerializationMethods.Serialize<object> For(Type type) { Type type2 = type; TomlSerializationMethods.Serialize<object> serialize; if (type2.IsEnum) { TomlSerializationMethods.Serialize<object> stringSerializer = TomlSerializationMethods.GetSerializer(typeof(string)); serialize = (object? o) => stringSerializer(Enum.GetName(type2, o) ?? throw new ArgumentException($"Tomlet: Cannot serialize {o} as an enum of type {type2} because the enum type does not declare a name for that value")); } else { FieldInfo[] fields = type2.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); var fieldAttribs = fields.ToDictionary((FieldInfo f) => f, (FieldInfo f) => new { inline = f.GetCustomAttribute<TomlInlineCommentAttribute>(), preceding = f.GetCustomAttribute<TomlPrecedingCommentAttribute>() }); PropertyInfo[] props = type2.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).ToArray(); var propAttribs = props.ToDictionary((PropertyInfo p) => p, (PropertyInfo p) => new { inline = p.GetCustomAttribute<TomlInlineCommentAttribute>(), preceding = p.GetCustomAttribute<TomlPrecedingCommentAttribute>(), prop = p.GetCustomAttribute<TomlPropertyAttribute>() }); bool isForcedNoInline = type2.GetCustomAttribute<TomlDoNotInlineObjectAttribute>() != null; fields = fields.Where((FieldInfo f) => !f.IsNotSerialized && f.GetCustomAttribute<CompilerGeneratedAttribute>() == null && !Enumerable.Contains(f.Name, '<')).ToArray(); if (fields.Length + props.Length == 0) { return (object? _) => new TomlTable(); } serialize = delegate(object? instance) { if (instance == null) { throw new ArgumentNullException("instance", "Object being serialized is null. TOML does not support null values."); } TomlTable tomlTable = new TomlTable { ForceNoInline = isForcedNoInline }; FieldInfo[] array = fields; foreach (FieldInfo fieldInfo in array) { object value = fieldInfo.GetValue(instance); if (value != null) { TomlValue tomlValue = TomlSerializationMethods.GetSerializer(fieldInfo.FieldType)(value); if (tomlValue != null) { var anon = fieldAttribs[fieldInfo]; if (!tomlTable.ContainsKey(fieldInfo.Name)) { tomlValue.Comments.InlineComment = anon.inline?.Comment; tomlValue.Comments.PrecedingComment = anon.preceding?.Comment; tomlTable.PutValue(fieldInfo.Name, tomlValue); } } } } PropertyInfo[] array2 = props; foreach (PropertyInfo propertyInfo in array2) { if ((object)propertyInfo.GetGetMethod(nonPublic: true) != null && !(propertyInfo.Name == "EqualityContract")) { object value2 = propertyInfo.GetValue(instance, null); if (value2 != null) { TomlValue tomlValue2 = TomlSerializationMethods.GetSerializer(propertyInfo.PropertyType)(value2); if (tomlValue2 != null) { var anon2 = propAttribs[propertyInfo]; tomlValue2.Comments.InlineComment = anon2.inline?.Comment; tomlValue2.Comments.PrecedingComment = anon2.preceding?.Comment; tomlTable.PutValue(anon2.prop?.GetMappedString() ?? propertyInfo.Name, tomlValue2); } } } } return tomlTable; }; } TomlSerializationMethods.Register(type2, serialize, null); return serialize; } } internal static class TomlDateTimeUtils { private static readonly Regex DateTimeRegex = new Regex("^(?:(\\d+)-(0[1-9]|1[012])-(0[1-9]|[12]\\d|3[01]))?([\\sTt])?(?:([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d|60)(\\.\\d+)?((?:[Zz])|(?:[\\+|\\-](?:[01]\\d|2[0-3])(?::[0-6][0-9])?(?::[0-6][0-9])?))?)?$", RegexOptions.Compiled); internal static TomlValue? ParseDateString(string input, int lineNumber) { Match match = DateTimeRegex.Match(input); bool flag = !match.Groups[1].Value.IsNullOrWhiteSpace(); bool flag2 = !string.IsNullOrEmpty(match.Groups[4].Value); bool flag3 = !match.Groups[5].Value.IsNullOrWhiteSpace(); bool flag4 = !match.Groups[9].Value.IsNullOrWhiteSpace(); if (flag && flag3 && !flag2) { throw new TomlDateTimeMissingSeparatorException(lineNumber); } if (flag2 && (!flag3 || !flag)) { throw new TomlDateTimeUnnecessarySeparatorException(lineNumber); } if (flag4 && (!flag3 || !flag)) { throw new TimeOffsetOnTomlDateOrTimeException(lineNumber, match.Groups[9].Value); } if (!flag) { return TomlLocalTime.Parse(input); } if (!flag3) { return TomlLocalDate.Parse(input); } if (!flag4) { return TomlLocalDateTime.Parse(input); } return TomlOffsetDateTime.Parse(input); } } public static class TomletMain { [NoCoverage] public static void RegisterMapper<T>(TomlSerializationMethods.Serialize<T>? serializer, TomlSerializationMethods.Deserialize<T>? deserializer) { TomlSerializationMethods.Register(serializer, deserializer); } public static T To<T>(string tomlString) { return To<T>(new TomlParser().Parse(tomlString)); } public static T To<T>(TomlValue value) { return (T)To(typeof(T), value); } public static object To(Type what, TomlValue value) { return TomlSerializationMethods.GetDeserializer(what)(value); } public static TomlValue? ValueFrom<T>(T t) { if (t == null) { throw new ArgumentNullException("t"); } return ValueFrom(t.GetType(), t); } public static TomlValue? ValueFrom(Type type, object t) { return TomlSerializationMethods.GetSerializer(type)(t); } public static TomlDocument DocumentFrom<T>(T t) { if (t == null) { throw new ArgumentNullException("t"); } return DocumentFrom(t.GetType(), t); } public static TomlDocument DocumentFrom(Type type, object t) { TomlValue tomlValue = ValueFrom(type, t); if (!(tomlValue is TomlDocument result)) { if (tomlValue is TomlTable from) { return new TomlDocument(from); } throw new TomlPrimitiveToDocumentException(type); } return result; } public static string TomlStringFrom<T>(T t) { return DocumentFrom(t).SerializedValue; } public static string TomlStringFrom(Type type, object t) { return DocumentFrom(type, t).SerializedValue; } } public class TomletStringReader : IDisposable { private string? _s; private int _pos; private int _length; public TomletStringReader(string s) { _s = s; _length = s.Length; } public void Backtrack(int amount) { if (_pos < amount) { throw new Exception("Cannot backtrack past the beginning of the string"); } _pos -= amount; } public void Dispose() { _s = null; _pos = 0; _length = 0; } public int Peek() { if (_pos != _length) { return _s[_pos]; } return -1; } public int Read() { if (_pos != _length) { return _s[_pos++]; } return -1; } public int Read(char[] buffer, int index, int count) { int num = _length - _pos; if (num <= 0) { return num; } if (num > count) { num = count; } _s.CopyTo(_pos, buffer, index, num); _pos += num; return num; } public int ReadBlock(char[] buffer, int index, int count) { int num = 0; int num2; do { num += (num2 = Read(buffer, index + num, count - num)); } while (num2 > 0 && num < count); return num; } } internal static class TomlKeyUtils { internal static void GetTopLevelAndSubKeys(string key, out string ourKeyName, out string restOfKey) { bool flag = (key.StartsWith("\"") && key.EndsWith("\"")) || (key.StartsWith("'") && key.EndsWith("'")); bool flag2 = !flag && (key.StartsWith("\"") || key.StartsWith("'")); if (!key.Contains(".") || flag) { ourKeyName = key; restOfKey = ""; return; } if (!flag2) { string[] array = key.Split(new char[1] { '.' }); ourKeyName = array[0]; } else { ourKeyName = key; string text = ourKeyName.Substring(1); if (ourKeyName.Contains("\"")) { ourKeyName = ourKeyName.Substring(0, 2 + text.IndexOf("\"", StringComparison.Ordinal)); } else { ourKeyName = ourKeyName.Substring(0, 2 + text.IndexOf("'", StringComparison.Ordinal)); } } restOfKey = key.Substring(ourKeyName.Length + 1); ourKeyName = ourKeyName.Trim(); } } internal static class TomlNumberStyle { internal static NumberStyles FloatingPoint = NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands | NumberStyles.AllowExponent; internal static NumberStyles Integer = NumberStyles.AllowLeadingSign | NumberStyles.AllowThousands; } public static class TomlNumberUtils { public static long? GetLongValue(string input) { bool flag = input.StartsWith("0o"); bool flag2 = input.StartsWith("0x"); bool flag3 = input.StartsWith("0b"); if (flag3 || flag2 || flag) { input = input.Substring(2); } if (input.Contains("__") || input.Any((char c) => c != '_' && c != '-' && c != '+' && !char.IsDigit(c) && (c < 'a' || c > 'f'))) { return null; } if (input.First() == '_') { return null; } if (input.Last() == '_') { return null; } input = input.Replace("_", ""); try { if (flag3) { return Convert.ToInt64(input, 2); } if (flag) { return Convert.ToInt64(input, 8); } if (flag2) { return Convert.ToInt64(input, 16); } return Convert.ToInt64(input, 10); } catch (Exception) { return null; } } public static double? GetDoubleValue(string input) { string text = input.Substring(1); if (input == "nan" || input == "inf" || text == "nan" || text == "inf") { if (input == "nan" || text == "nan") { return double.NaN; } if (input == "inf") { return double.PositiveInfinity; } if (text == "inf") { return input.StartsWith("-") ? double.NegativeInfinity : double.PositiveInfinity; } } if (input.Contains("__") || input.Any((char c) => c != '_' && c != '-' && c != '+' && c != 'e' && c != '.' && !char.IsDigit(c))) { return null; } if (input.First() == '_') { return null; } if (input.Last() == '_') { return null; } input = input.Replace("_", ""); if (input.Contains("e")) { string[] array = input.Split(new char[1] { 'e' }); if (array.Length != 2) { return null; } if (array[0].EndsWith(".")) { return null; } } if (double.TryParse(input, TomlNumberStyle.FloatingPoint, CultureInfo.InvariantCulture, out var result)) { return result; } return null; } } public class TomlParser { private static readonly char[] TrueChars = new char[4] { 't', 'r', 'u', 'e' }; private static readonly char[] FalseChars = new char[5] { 'f', 'a', 'l', 's', 'e' }; private int _lineNumber = 1; private string[] _tableNames = new string[0]; private TomlTable? _currentTable; [NoCoverage] public static TomlDocument ParseFile(string filePath) { string input = File.ReadAllText(filePath); return new TomlParser().Parse(input); } public TomlDocument Parse(string input) { try { TomlDocument tomlDocument = new TomlDocument(); using TomletStringReader tomletStringReader = new TomletStringReader(input); string text = null; int nextChar; while (tomletStringReader.TryPeek(out nextChar)) { _lineNumber += tomletStringReader.SkipAnyNewlineOrWhitespace(); text = ReadAnyPotentialMultilineComment(tomletStringReader); if (!tomletStringReader.TryPeek(out var nextChar2)) { break; } if (nextChar2 == 91) { tomletStringReader.Read(); if (!tomletStringReader.TryPeek(out var nextChar3)) { throw new TomlEndOfFileException(_lineNumber); } TomlValue tomlValue = ((nextChar3 == 91) ? ((TomlValue)ReadTableArrayStatement(tomletStringReader, tomlDocument)) : ((TomlValue)ReadTableStatement(tomletStringReader, tomlDocument))); tomlValue.Comments.PrecedingComment = text; continue; } ReadKeyValuePair(tomletStringReader, out string key, out TomlValue value); value.Comments.PrecedingComment = text; text = null; if (_currentTable != null) { _currentTable.ParserPutValue(key, value, _lineNumber); } else { tomlDocument.ParserPutValue(key, value, _lineNumber); } tomletStringReader.SkipWhitespace(); tomletStringReader.SkipPotentialCarriageReturn(); if (!tomletStringReader.ExpectAndConsume('\n') && tomletStringReader.TryPeek(out var nextChar4)) { throw new TomlMissingNewlineException(_lineNumber, (char)nextChar4); } _lineNumber++; } tomlDocument.TrailingComment = text; return tomlDocument; } catch (Exception ex) when (!(ex is TomlException)) { throw new TomlInternalException(_lineNumber, ex); } } private void ReadKeyValuePair(TomletStringReader reader, out string key, out TomlValue value) { key = ReadKey(reader); reader.SkipWhitespace(); if (!reader.ExpectAndConsume('=')) { if (reader.TryPeek(out var nextChar)) { throw new TomlMissingEqualsException(_lineNumber, (char)nextChar); } throw new TomlEndOfFileException(_lineNumber); } reader.SkipWhitespace(); value = ReadValue(reader); } private string ReadKey(TomletStringReader reader) { reader.SkipWhitespace(); if (!reader.TryPeek(out var nextChar)) { return ""; } if (nextChar.IsEquals()) { throw new NoTomlKeyException(_lineNumber); } reader.SkipWhitespace(); string text; if (nextChar.IsDoubleQuote()) { reader.Read(); if (reader.TryPeek(out var nextChar2) && nextChar2.IsDoubleQuote()) { reader.Read(); if (reader.TryPeek(out var nextChar3) && nextChar3.IsDoubleQuote()) { throw new TomlTripleQuotedKeyException(_lineNumber); } return string.Empty; } text = "\"" + ReadSingleLineBasicString(reader, consumeClosingQuote: false).StringValue + "\""; if (!reader.ExpectAndConsume('"')) { throw new UnterminatedTomlKeyException(_lineNumber); } } else if (nextChar.IsSingleQuote()) { reader.Read(); text = "'" + ReadSingleLineLiteralString(reader, consumeClosingQuote: false).StringValue + "'"; if (!reader.ExpectAndConsume('\'')) { throw new UnterminatedTomlKeyException(_lineNumber); } } else { text = ReadKeyInternal(reader, (int keyChar) => keyChar.IsEquals() || keyChar.IsHashSign()); } return text.Replace("\\n", "\n").Replace("\\t", "\t"); } private string ReadKeyInternal(TomletStringReader reader, Func<int, bool> charSignalsEndOfKey) { List<string> list = new List<string>(); int nextChar; while (reader.TryPeek(out nextChar)) { if (charSignalsEndOfKey(nextChar)) { return string.Join(".", list.ToArray()); } if (nextChar.IsPeriod()) { throw new TomlDoubleDottedKeyException(_lineNumber); } StringBuilder stringBuilder = new StringBuilder(); while (reader.TryPeek(out nextChar)) { nextChar.EnsureLegalChar(_lineNumber); int num = reader.SkipWhitespace(); reader.TryPeek(out var nextChar2); if (nextChar2.IsPeriod()) { list.Add(stringBuilder.ToString()); reader.ExpectAndConsume('.'); reader.SkipWhitespace(); break; } if (num > 0 && charSignalsEndOfKey(nextChar2)) { list.Add(stringBuilder.ToString()); break; } reader.Backtrack(num); if (charSignalsEndOfKey(nextChar)) { list.Add(stringBuilder.ToString()); break; } if (num > 0) { throw new TomlWhitespaceInKeyException(_lineNumber); } stringBuilder.Append((char)reader.Read()); } } throw new TomlEndOfFileException(_lineNumber); } private TomlValue ReadValue(TomletStringReader reader) { if (!reader.TryPeek(out var nextChar)) { throw new TomlEndOfFileException(_lineNumber); } TomlValue tomlValue; switch (nextChar) { case 91: tomlValue = ReadArray(reader); break; case 123: tomlValue = ReadInlineTable(reader); break; case 34: case 39: { int num = reader.Read(); if (reader.Peek() != num) { tomlValue = (num.IsSingleQuote() ? ReadSingleLineLiteralString(reader) : ReadSingleLineBasicString(reader)); break; } reader.Read(); int num2 = reader.Peek(); if (num2 == num) { reader.Read(); tomlValue = (num.IsSingleQuote() ? ReadMultiLineLiteralString(reader) : ReadMultiLineBasicString(reader)); break; } if (num2.IsWhitespace() || num2.IsNewline() || num2.IsHashSign() || num2.IsComma() || num2.IsEndOfArrayChar() || num2 == -1) { tomlValue = TomlString.Empty; break; } throw new TomlStringException(_lineNumber); } case 43: case 45: case 48: case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: case 105: case 110: { string text = reader.ReadWhile((int valueChar) => !valueChar.IsEquals() && !valueChar.IsNewline() && !valueChar.IsHashSign() && !valueChar.IsComma() && !valueChar.IsEndOfArrayChar() && !valueChar.IsEndOfInlineObjectChar()).ToLowerInvariant().Trim(); tomlValue = ((!Enumerable.Contains(text, ':') && !Enumerable.Contains(text, 't') && !Enumerable.Contains(text, ' ') && !Enumerable.Contains(text, 'z')) ? ((!Enumerable.Contains(text, '.') && (!Enumerable.Contains(text, 'e') || text.StartsWith("0x")) && !Enumerable.Contains(text, 'n') && !Enumerable.Contains(text, 'i')) ? (TomlLong.Parse(text) ?? TomlDateTimeUtils.ParseDateString(text, _lineNumber) ?? throw new InvalidTomlNumberException(_lineNumber, text)) : (TomlDouble.Parse(text) ?? TomlDateTimeUtils.ParseDateString(text, _lineNumber) ?? throw new InvalidTomlNumberException(_lineNumber, text))) : (TomlDateTimeUtils.ParseDateString(text, _lineNumber) ?? throw new InvalidTomlDateTimeException(_lineNumber, text))); break; } case 116: { char[] second2 = reader.ReadChars(4); if (!TrueChars.SequenceEqual(second2)) { throw new TomlInvalidValueException(_lineNumber, (char)nextChar); } tomlValue = TomlBoolean.True; break; } case 102: { char[] second = reader.ReadChars(5); if (!FalseChars.SequenceEqual(second)) { throw new TomlInvalidValueException(_lineNumber, (char)nextChar); } tomlValue = TomlBoolean.False; break; } default: throw new TomlInvalidValueException(_lineNumber, (char)nextChar); } reader.SkipWhitespace(); tomlValue.Comments.InlineComment = ReadAnyPotentialInlineComment(reader); return tomlValue; } private TomlValue ReadSingleLineBasicString(TomletStringReader reader, bool consumeClosingQuote = true) { StringBuilder stringBuilder = new StringBuilder(); bool flag = false; bool fourDigitUnicodeMode = false; bool eightDigitUnicodeMode = false; StringBuilder stringBuilder2 = new StringBuilder(); int nextChar; while (reader.TryPeek(out nextChar)) { nextChar.EnsureLegalChar(_lineNumber); if (nextChar == 34 && !flag) { break; } reader.Read(); if (nextChar == 92 && !flag) { flag = true; } else if (flag) { flag = false; char? c = HandleEscapedChar(nextChar, out fourDigitUnicodeMode, out eightDigitUnicodeMode); if (c.HasValue) { stringBuilder.Append(c.Value); } } else if (fourDigitUnicodeMode || eightDigitUnicodeMode) { stringBuilder2.Append((char)nextChar); if ((fourDigitUnicodeMode && stringBuilder2.Length == 4) || (eightDigitUnicodeMode && stringBuilder2.Length == 8)) { string unicodeString = stringBuilder2.ToString(); stringBuilder.Append(DecipherUnicodeEscapeSequence(unicodeString, fourDigitUnicodeMode)); fourDigitUnicodeMode = false; eightDigitUnicodeMode = false; stringBuilder2 = new StringBuilder(); } } else { if (nextChar.IsNewline()) { throw new UnterminatedTomlStringException(_lineNumber); } stringBuilder.Append((char)nextChar); } } if (consumeClosingQuote && !reader.ExpectAndConsume('"')) { throw new UnterminatedTomlStringException(_lineNumber); } return new TomlString(stringBuilder.ToString()); } private string DecipherUnicodeEscapeSequence(string unicodeString, bool fourDigitMode) { if (unicodeString.Any((char c) => !c.IsHexDigit())) { throw new InvalidTomlEscapeException(_lineNumber, $"\\{(fourDigitMode ? 'u' : 'U')}{unicodeString}"); } if (fourDigitMode) { return ((char)short.Parse(unicodeString, NumberStyles.HexNumber)).ToString(); } return char.ConvertFromUtf32(int.Parse(unicodeString, NumberStyles.HexNumber)); } private char? HandleEscapedChar(int escapedChar, out bool fourDigitUnicodeMode, out bool eightDigitUnicodeMode, bool allowNewline = false) { eightDigitUnicodeMode = false; fourDigitUnicodeMode = false; char value; switch (escapedChar) { case 98: value = '\b'; break; case 116: value = '\t'; break; case 110: value = '\n'; break; case 102: value = '\f'; break; case 114: value = '\r'; break; case 34: value = '"'; break; case 92: value = '\\'; break; case 117: fourDigitUnicodeMode = true; return null; case 85: eightDigitUnicodeMode = true; return null; default: if (allowNewline && escapedChar.IsNewline()) { return null; } throw new InvalidTomlEscapeException(_lineNumber, $"\\{escapedChar}"); } return value; } private TomlValue ReadSingleLineLiteralString(TomletStringReader reader, bool consumeClosingQuote = true) { string text = reader.ReadWhile((int valueChar) => !valueChar.IsSingleQuote() && !valueChar.IsNewline()); foreach (int item in ((IEnumerable<char>)text).Select((Func<char, int>)((char c) => c))) { item.EnsureLegalChar(_lineNumber); } if (!reader.TryPeek(out var nextChar)) { throw new TomlEndOfFileException(_lineNumber); } if (!nextChar.IsSingleQuote()) { throw new UnterminatedTomlStringException(_lineNumber); } if (consumeClosingQuote) { reader.Read(); } return new TomlString(text); } private TomlValue ReadMultiLineLiteralString(TomletStringReader reader) { StringBuilder stringBuilder = new StringBuilder(); _lineNumber += reader.SkipAnyNewline(); int nextChar; while (reader.TryPeek(out nextChar)) { int num = reader.Read(); num.EnsureLegalChar(_lineNumber); if (!num.IsSingleQuote()) { stringBuilder.Append((char)num); if (num == 10) { _lineNumber++; } continue; } if (!reader.TryPeek(out var nextChar2) || !nextChar2.IsSingleQuote()) { stringBuilder.Append('\''); continue; } reader.Read(); if (!reader.TryPeek(out var nextChar3) || !nextChar3.IsSingleQuote()) { stringBuilder.Append('\''); stringBuilder.Append('\''); continue; } reader.Read(); if (!reader.TryPeek(out var nextChar4) || !nextChar4.IsSingleQuote()) { break; } reader.Read(); stringBuilder.Append('\''); if (!reader.TryPeek(out var nextChar5) || !nextChar5.IsSingleQuote()) { break; } reader.Read(); stringBuilder.Append('\''); if (!reader.TryPeek(out var nextChar6) || !nextChar6.IsSingleQuote()) { break; } throw new TripleQuoteInTomlMultilineLiteralException(_lineNumber); } return new TomlString(stringBuilder.ToString()); } private TomlValue ReadMultiLineBasicString(TomletStringReader reader) { StringBuilder stringBuilder = new StringBuilder(); bool flag = false; bool fourDigitUnicodeMode = false; bool eightDigitUnicodeMode = false; StringBuilder stringBuilder2 = new StringBuilder(); _lineNumber += reader.SkipAnyNewline(); int nextChar; while (reader.TryPeek(out nextChar)) { int num = reader.Read(); num.EnsureLegalChar(_lineNumber); if (num == 92 && !flag) { flag = true; continue; } if (flag) { flag = false; char? c = HandleEscapedChar(num, out fourDigitUnicodeMode, out eightDigitUnicodeMode, allowNewline: true); if (c.HasValue) { stringBuilder.Append(c.Value); } else if (num.IsNewline()) { if (num == 13 && !reader.ExpectAndConsume('\n')) { throw new Exception($"Found a CR without an LF on line {_lineNumber}"); } _lineNumber++; reader.SkipAnyNewlineOrWhitespace(); } continue; } if (fourDigitUnicodeMode || eightDigitUnicodeMode) { stringBuilder2.Append((char)num); if ((fourDigitUnicodeMode && stringBuilder2.Length == 4) || (eightDigitUnicodeMode && stringBuilder2.Length == 8)) { string unicodeString = stringBuilder2.ToString(); stringBuilder.Append(DecipherUnicodeEscapeSequence(unicodeString, fourDigitUnicodeMode)); fourDigitUnicodeMode = false; eightDigitUnicodeMode = false; stringBuilder2 = new StringBuilder(); } continue; } if (!num.IsDoubleQuote()) { if (num == 10) { _lineNumber++; } stringBuilder.Append((char)num); continue; } if (!reader.TryPeek(out var nextChar2) || !nextChar2.IsDoubleQuote()) { stringBuilder.Append('"'); continue; } reader.Read(); if (!reader.TryPeek(out var nextChar3) || !nextChar3.IsDoubleQuote()) { stringBuilder.Append('"'); stringBuilder.Append('"'); continue; } reader.Read(); if (!reader.TryPeek(out var nextChar4) || !nextChar4.IsDoubleQuote()) { break; } reader.Read(); stringBuilder.Append('"'); if (!reader.TryPeek(out var nextChar5) || !nextChar5.IsDoubleQuote()) { break; } reader.Read(); stringBuilder.Append('"'); if (!reader.TryPeek(out var nextChar6) || !nextChar6.IsDoubleQuote()) { break; } throw new TripleQuoteInTomlMultilineSimpleStringException(_lineNumber); } return new TomlString(stringBuilder.ToString()); } private TomlArray ReadArray(TomletStringReader reader) { if (!reader.ExpectAndConsume('[')) { throw new ArgumentException("Internal Tomlet Bug: ReadArray called and first char is not a ["); } _lineNumber += reader.SkipAnyCommentNewlineWhitespaceEtc(); TomlArray tomlArray = new TomlArray(); int nextChar; while (reader.TryPeek(out nextChar)) { _lineNumber += reader.SkipAnyCommentNewlineWhitespaceEtc(); if (!reader.TryPeek(out var nextChar2)) { throw new TomlEndOfFileException(_lineNumber); } if (nextChar2.IsEndOfArrayChar()) { break; } tomlArray.ArrayValues.Add(ReadValue(reader)); _lineNumber += reader.SkipAnyNewlineOrWhitespace(); if (!reader.TryPeek(out var nextChar3)) { throw new TomlEndOfFileException(_lineNumber); } if (nextChar3.IsEndOfArrayChar()) { break; } if (!nextChar3.IsComma()) { throw new TomlArraySyntaxException(_lineNumber, (char)nextChar3); } reader.ExpectAndConsume(','); } reader.ExpectAndConsume(']'); return tomlArray; } private TomlTable ReadInlineTable(TomletStringReader reader) { if (!reader.ExpectAndConsume('{')) { throw new ArgumentException("Internal Tomlet Bug: ReadInlineTable called and first char is not a {"); } _lineNumber += reader.SkipAnyCommentNewlineWhitespaceEtc(); TomlTable tomlTable = new TomlTable { Defined = true }; int nextChar; while (reader.TryPeek(out nextChar)) { reader.SkipWhitespace(); if (!reader.TryPeek(out var nextChar2)) { throw new TomlEndOfFileException(_lineNumber); } if (nextChar2.IsEndOfInlineObjectChar()) { break; } if (nextChar2.IsNewline()) { throw new NewLineInTomlInlineTableException(_lineNumber); } try { ReadKeyValuePair(reader, out string key, out TomlValue value); tomlTable.ParserPutValue(key, value, _lineNumber); } catch (TomlException ex) when (ex is TomlMissingEqualsException || ex is NoTomlKeyException || ex is TomlWhitespaceInKeyException) { throw new InvalidTomlInlineTableException(_lineNumber, ex); } if (!reader.TryPeek(out var nextChar3)) { throw new TomlEndOfFileException(_lineNumber); } if (!reader.ExpectAndConsume(',')) { reader.SkipWhitespace(); if (!reader.TryPeek(out nextChar3)) { throw new TomlEndOfFileException(_lineNumber); } if (nextChar3.IsEndOfInlineObjectChar()) { break; } throw new TomlInlineTableSeparatorException(_lineNumber, (char)nextChar3); } } reader.ExpectAndConsume('}'); tomlTable.Locked = true; return tomlTable; } private TomlTable ReadTableStatement(TomletStringReader reader, TomlDocument document) { string text = reader.ReadWhile((int c) => !c.IsEndOfArrayChar() && !c.IsNewline()); TomlTable parent = document; string relativeName = text; FindParentAndRelativeKey(ref parent, ref relativeName); TomlTable tomlTable; try { if (parent.ContainsKey(relativeName)) { try { tomlTable = (TomlTable)parent.GetValue(relativeName); if (tomlTable.Defined) { throw new TomlTableRedefinitionException(_lineNumber, text); } } catch (InvalidCastException) { throw new TomlKeyRedefinitionException(_lineNumber, text); } } else { tomlTable = new TomlTable { Defined = true }; parent.ParserPutValue(relativeName, tomlTable, _lineNumber); } } catch (TomlContainsDottedKeyNonTableException ex2) { throw new TomlDottedKeyParserException(_lineNumber, ex2.Key); } if (!reader.TryPeek(out var _)) { throw new TomlEndOfFileException(_lineNumber); } if (!reader.ExpectAndConsume(']')) { throw new UnterminatedTomlTableNameException(_lineNumber); } reader.SkipWhitespace(); tomlTable.Comments.InlineComment = ReadAnyPotentialInlineComment(reader); reader.SkipPotentialCarriageReturn(); if (!reader.TryPeek(out var nextChar2)) { throw new TomlEndOfFileException(_lineNumber); } if (!nextChar2.IsNewline()) { throw new TomlMissingNewlineException(_lineNumber, (char)nextChar2); } _currentTable = tomlTable; _tableNames = text.Split(new char[1] { '.' }); return tomlTable; } private TomlArray ReadTableArrayStatement(TomletStringReader reader, TomlDocument document) { if (!reader.ExpectAndConsume('[')) { throw new ArgumentException("Internal Tomlet Bug: ReadTableArrayStatement called and first char is not a ["); } string text = reader.ReadWhile((int c) => !c.IsEndOfArrayChar() && !c.IsNewline()); if (!reader.ExpectAndConsume(']') || !reader.ExpectAndConsume(']')) { throw new UnterminatedTomlTableArrayException(_lineNumber); } TomlTable parent = document; string relativeName = text; FindParentAndRelativeKey(ref parent, ref relativeName); if (parent == document && Enumerable.Contains(relativeName, '.')) { throw new MissingIntermediateInTomlTableArraySpecException(_lineNumber, relativeName); } TomlArray tomlArray2; if (parent.ContainsKey(relativeName)) { if (!(parent.GetValue(relativeName) is TomlArray tomlArray)) { throw new TomlTableArrayAlreadyExistsAsNonArrayException(_lineNumber, text); } tomlArray2 = tomlArray; if (!tomlArray2.IsLockedToBeTableArray) { throw new TomlNonTableArrayUsedAsTableArrayException(_lineNumber, text); } } else { tomlArray2 = new TomlArray { IsLockedToBeTableArray = true }; parent.ParserPutValue(relativeName, tomlArray2, _lineNumber); } _currentTable = new TomlTable { Defined = true }; tomlArray2.ArrayValues.Add(_currentTable); _tableNames = text.Split(new char[1] { '.' }); return tomlArray2; } private void FindParentAndRelativeKey(ref TomlTable parent, ref string relativeName) { for (int i = 0; i < _tableNames.Length; i++) { string text = _tableNames[i]; if (!relativeName.StartsWith(text + ".")) { break; } TomlValue value = parent.GetValue(text); if (value is TomlTable tomlTable) { parent = tomlTable; } else { if (!(value is TomlArray source)) { throw new TomlTypeMismatchException(typeof(TomlArray), value.GetType(), typeof(TomlArray)); } parent = (TomlTable)source.Last(); } relativeName = relativeName.Substring(text.Length + 1); } } private string? ReadAnyPotentialInlineComment(TomletStringReader reader) { if (!reader.ExpectAndConsume('#')) { return null; } string text = reader.ReadWhile((int c) => !c.IsNewline()).Trim(); if (text.Length < 1) { return null; } if (text[0] == ' ') { text = text.Substring(1); } foreach (int item in ((IEnumerable<char>)text).Select((Func<char, int>)((char c) => c))) { item.EnsureLegalChar(_lineNumber); } return text; } private string? ReadAnyPotentialMultilineComment(TomletStringReader reader) { StringBuilder stringBuilder = new StringBuilder(); while (reader.ExpectAndConsume('#')) { string text = reader.ReadWhile((int c) => !c.IsNewline()); if (text[0] == ' ') { text = text.Substring(1); } foreach (int item in ((IEnumerable<char>)text).Select((Func<char, int>)((char c) => c))) { item.EnsureLegalChar(_lineNumber); } stringBuilder.Append(text); _lineNumber += reader.SkipAnyNewlineOrWhitespace(); } if (stringBuilder.Length == 0) { return null; } return stringBuilder.ToString(); } } public static class TomlSerializationMethods { public delegate T Deserialize<out T>(TomlValue value); public delegate TomlValue? Serialize<in T>(T? t); private static MethodInfo _stringKeyedDictionaryMethod; private static MethodInfo _genericDictionarySerializerMethod; private static MethodInfo _genericNullableSerializerMethod; private static readonly Dictionary<Type, Delegate> Deserializers; private static readonly Dictionary<Type, Delegate> Serializers; [NoCoverage] static TomlSerializationMethods() { _stringKeyedDictionaryMethod = typeof(TomlSerializationMethods).GetMethod("StringKeyedDictionaryDeserializerFor", BindingFlags.Static | BindingFlags.NonPublic); _genericDictionarySerializerMethod = typeof(TomlSerializationMethods).GetMethod("GenericDictionarySerializer", BindingFlags.Static | BindingFlags.NonPublic); _genericNullableSerializerMethod = typeof(TomlSerializationMethods).GetMethod("GenericNullableSerializer", BindingFlags.Static | BindingFlags.NonPublic); Deserializers = new Dictionary<Type, Delegate>(); Serializers = new Dictionary<Type, Delegate>(); Register((string? s) => new TomlString(s), (TomlValue value) => (value as TomlString)?.Value ?? value.StringValue); Register(TomlBoolean.ValueOf, (TomlValue value) => ((value as TomlBoolean) ?? throw new TomlTypeMismatchException(typeof(TomlBoolean), value.GetType(), typeof(bool))).Value); Register((byte i) => new TomlLong(i), (TomlValue value) => (byte)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(byte))).Value); Register((sbyte i) => new TomlLong(i), (TomlValue value) => (sbyte)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(sbyte))).Value); Register((ushort i) => new TomlLong(i), (TomlValue value) => (ushort)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(ushort))).Value); Register((short i) => new TomlLong(i), (TomlValue value) => (short)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(short))).Value); Register((uint i) => new TomlLong(i), (TomlValue value) => (uint)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(uint))).Value); Register((int i) => new TomlLong(i), (TomlValue value) => (int)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(int))).Value); Register((ulong l) => new TomlLong((long)l), (TomlValue value) => (ulong)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(ulong))).Value); Register((long l) => new TomlLong(l), (TomlValue value) => ((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(long))).Value); Register((double d) => new TomlDouble(d), (TomlValue value) => (value as TomlDouble)?.Value ?? ((double)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlDouble), value.GetType(), typeof(double))).Value)); Register((float f) => new TomlDouble(f), (TomlValue value) => (float)((value as TomlDouble)?.Value ?? ((double)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlDouble), value.GetType(), typeof(float))).Value))); Register((DateTime dt) => (!(dt.TimeOfDay == TimeSpan.Zero)) ? ((TomlValue?)new TomlLocalDateTime(dt)) : ((TomlValue?)new TomlLocalDate(dt)), (TomlValue value) => ((value as ITomlValueWithDateTime) ?? throw new TomlTypeMismatchException(typeof(ITomlValueWithDateTime), value.GetType(), typeof(DateTime))).Value); Register((DateTimeOffset odt) => new TomlOffsetDateTime(odt), (TomlValue value) => ((value as TomlOffsetDateTime) ?? throw new TomlTypeMismatchException(typeof(TomlOffsetDateTime), value.GetType(), typeof(DateTimeOffset))).Value); Register((TimeSpan lt) => new TomlLocalTime(lt), (TomlValue value) => ((value as TomlLocalTime) ?? throw new TomlTypeMismatchException(typeof(TomlLocalTime), value.GetType(), typeof(TimeSpan))).Value); } internal static Serialize<object> GetSerializer(Type t) { if (Serializers.TryGetValue(t, out Delegate value)) { return (Serialize<object>)value; } if (t.IsArray || (t.Namespace == "System.Collections.Generic" && t.Name == "List`1")) { Serialize<object> serialize = GenericEnumerableSerializer(); Serializers[t] = serialize; return serialize; } if (t.IsGenericType) { Type[] genericArguments = t.GetGenericArguments(); if (genericArguments != null) { if ((object)t.GetGenericTypeDefinition() == typeof(Dictionary<, >)) { MethodInfo method = _genericDictionarySerializerMethod.MakeGenericMethod(genericArguments); Delegate del2 = Delegate.CreateDelegate(typeof(Serialize<>).MakeGenericType(t), method); Serialize<object> serialize2 = (object? dict) => (TomlValue)del2.DynamicInvoke(dict); Serializers[t] = serialize2; return serialize2; } if ((object)t.GetGenericTypeDefinition() == typeof(Nullable<>)) { MethodInfo method2 = _genericNullableSerializerMethod.MakeGenericMethod(genericArguments); Delegate del = Delegate.CreateDelegate(typeof(Serialize<>).MakeGenericType(t), method2); Serialize<object> serialize3 = (object? dict) => (TomlValue)del.DynamicInvoke(dict); Serializers[t] = serialize3; return serialize3; } } } return TomlCompositeSerializer.For(t); } internal static Deserialize<object> GetDeserializer(Type t) { if (Deserializers.TryGetValue(t, out Delegate value)) { return (Deserialize<object>)value; } if (t.IsArray) { Deserialize<object> deserialize = ArrayDeserializerFor(t.GetElementType()); Deserializers[t] = deserialize; return deserialize; } if (t.Namespace == "System.Collections.Generic" && t.Name == "List`1") { Deserialize<object> deserialize2 = ListDeserializerFor(t.GetGenericArguments()[0]); Deserializers[t] = deserialize2; return deserialize2; } if (t.IsGenericType && (object)t.GetGenericTypeDefinition() == typeof(Nullable<>)) { Type[] genericArguments = t.GetGenericArguments(); if (genericArguments != null && genericArguments.Length == 1) { Deserialize<object> deserialize3 = NullableDeserializerFor(t); Deserializers[t] = deserialize3; return deserialize3; } } if (t.IsGenericType && (object)t.GetGenericTypeDefinition() == typeof(Dictionary<, >)) { Type[] genericArguments2 = t.GetGenericArguments(); if (genericArguments2 != null && genericArguments2.Length == 2 && (object)genericArguments2[0] == typeof(string)) { return (Deserialize<object>)_stringKeyedDictionaryMethod.MakeGenericMethod(genericArguments2[1]).Invoke(null, new object[0]); } } return TomlCompositeDeserializer.For(t); } private static Serialize<object?> GenericEnumerableSerializer() { return delegate(object? o) { IEnumerable obj = (o as IEnumerable) ?? throw new Exception("How did ArraySerializer end up getting a non-array?"); TomlArray tomlArray = new TomlArray(); foreach (object item in obj) { tomlArray.Add(item); } return tomlArray; }; } private static Deserialize<object> ArrayDeserializerFor(Type elementType) { Type elementType2 = elementType; return delegate(TomlValue value) { if (!(value is TomlArray tomlArray)) { throw new TomlTypeMismatchException(typeof(TomlArray), value.GetType(), elementType2.MakeArrayType()); } Array array = Array.CreateInstance(elementType2, tomlArray.Count); Deserialize<object> deserializer = GetDeserializer(elementType2); for (int i = 0; i < tomlArray.ArrayValues.Count; i++) { TomlValue value2 = tomlArray.ArrayValues[i]; array.SetValue(deserializer(value2), i); } return array; }; } private static Deserialize<object> ListDeserializerFor(Type elementType) { Type elementType2 = elementType; Type listType = typeof(List<>).MakeGenericType(elementType2); MethodInfo relevantAddMethod = listType.GetMethod("Add"); return delegate(TomlValue value) { TomlArray obj = (value as TomlArray) ?? throw new TomlTypeMismatchException(typeof(TomlArray), value.GetType(), listType); object obj2 = Activator.CreateInstance(listType); Deserialize<object> deserializer = GetDeserializer(elementType2); foreach (TomlValue arrayValue in obj.ArrayValues) { relevantAddMethod.Invoke(obj2, new object[1] { deserializer(arrayValue) }); } return obj2; }; } private static Deserialize<object> NullableDeserializerFor(Type nullableType) { Type nullableType2 = nullableType; Type t = nullableType2.GetGenericArguments()[0]; Deserialize<object> elementDeserializer = GetDeserializer(t); return delegate(TomlValue value) { object obj = elementDeserializer(value); return Activator.CreateInstance(nullableType2, obj); }; } private static Deserialize<Dictionary<string, T>> StringKeyedDictionaryDeserializerFor<T>() { Deserialize<object> deserializer = GetDeserializer(typeof(T)); return (TomlValue value) => ((value as TomlTable) ?? throw new TomlTypeMismatchException(typeof(TomlTable), value.GetType(), typeof(Dictionary<string, T>))).Entries.ToDictionary<KeyValuePair<string, TomlValue>, string, T>((KeyValuePair<string, TomlValue> entry) => entry.Key, (KeyValuePair<string, TomlValue> entry) => (T)deserializer(entry.Value)); } private static TomlValue? GenericNullableSerializer<T>(T? nullable) where T : struct { Serialize<object> serializer = GetSerializer(typeof(T)); if (nullable.HasValue) { return serializer(nullable.Value); } return null; } private static TomlValue GenericDictionarySerializer<TKey, TValue>(Dictionary<TKey, TValue> dict) where TKey : notnull { Serialize<object> serializer = GetSerializer(typeof(TValue)); TomlTable tomlTable = new TomlTable(); foreach (KeyValuePair<TKey, TValue> item in dict) { TKey key = item.Key; string text = ((key != null) ? key.ToString() : null); if (text != null) { tomlTable.PutValue(text, serializer(item.Value), quote: true); } } return tomlTable; } internal static void Register<T>(Serialize<T>? serializer, Deserialize<T>? deserializer) { if (serializer != null) { RegisterSerializer(serializer); RegisterDictionarySerializer(serializer); } if (deserializer != null) { RegisterDeserializer(deserializer); RegisterDictionaryDeserializer(deserializer); } } internal static void Register(Type t, Serialize<object>? serializer, Deserialize<object>? deserializer) { if (serializer != null) { RegisterSerializer(serializer); } if (deserializer != null) { RegisterDeserializer(deserializer); } } private static void RegisterDeserializer<T>(Deserialize<T> deserializer) { Deserialize<T> deserializer2 = deserializer; Deserializers[typeof(T)] = new Deserialize<object>(BoxedDeserializer); object BoxedDeserializer(TomlValue value) { T val = deserializer2(value); if (val == null) { throw new Exception("TOML Deserializer returned null for type T"); } return val; } } private static void RegisterSerializer<T>(Serialize<T> serializer) { Serialize<T> serializer2 = serializer; Serializers[typeof(T)] = new Serialize<object>(ObjectAcceptingSerializer); TomlValue? ObjectAcceptingSerializer(object value) { return serializer2((T)value); } } private static void RegisterDictionarySerializer<T>(Serialize<T> serializer) { Serialize<T> serializer2 = serializer; RegisterSerializer(delegate(Dictionary<string, T>? dict) { TomlTable tomlTable = new TomlTable(); if (dict == null) { return tomlTable; } List<string> list = dict.Keys.ToList(); List<TomlValue> list2 = dict.Values.Select(serializer2.Invoke).ToList(); for (int i = 0; i < list.Count; i++) { tomlTable.PutValue(list[i], list2[i], quote: true); } return tomlTable; }); } private static void RegisterDictionaryDeserializer<T>(Deserialize<T> deserializer) { Deserialize<T> deserializer2 = deserializer; RegisterDeserializer((TomlValue value) => ((value as TomlTable) ?? throw new TomlTypeMismatchException(typeof(TomlTable), value.GetType(), typeof(Dictionary<string, T>))).Entries.Select<KeyValuePair<string, TomlValue>, KeyValuePair<string, T>>((KeyValuePair<string, TomlValue> kvp) => new KeyValuePair<string, T>(kvp.Key, deserializer2(kvp.Value))).ToDictionary((KeyValuePair<string, T> kvp) => kvp.Key, (KeyValuePair<string, T> kvp) => kvp.Value)); } } internal static class TomlUtils { public static string EscapeStringValue(string key) { return key.Replace("\\", "\\\\").Replace("\n", "\\n").Replace("\r", ""); } public static string AddCorrectQuotes(string key) { if (key.Contains("'") && key.Contains("\"")) { throw new InvalidTomlKeyException(key); } if (key.Contains("\"")) { return "'" + key + "'"; } return "\"" + key + "\""; } } } namespace Tomlet.Models { public class TomlArray : TomlValue, IEnumerable<TomlValue>, IEnumerable { public readonly List<TomlValue> ArrayValues = new List<TomlValue>(); internal bool IsLockedToBeTableArray; public override string StringValue => $"Toml Array ({ArrayValues.Count} values)"; public bool IsTableArray { get { if (!IsLockedToBeTableArray) { return ArrayValues.All((TomlValue t) => t is TomlTable); } return true; } } public bool CanBeSerializedInline { get { if (IsTableArray) { if (ArrayValues.All((TomlValue o) => o is TomlTable tomlTable && tomlTable.ShouldBeSerializedInline)) { return ArrayValues.Count <= 5; } return false; } return true; } } public bool IsSimpleArray { get { if (!IsLockedToBeTableArray) { return !ArrayValues.Any((TomlValue o) => o is TomlArray || o is TomlTable || !o.Comments.ThereAreNoComments); } return false; } } public TomlValue this[int index] => ArrayValues[index]; public int Count => ArrayValues.Count; public override string SerializedValue => SerializeInline(!IsSimpleArray); public void Add<T>(T t) where T : new() { TomlValue tomlValue2 = (((object)t is TomlValue tomlValue) ? tomlValue : TomletMain.ValueFrom(t)); if (tomlValue2 != null) { ArrayValues.Add(tomlValue2); } } public string SerializeInline(bool multiline) { if (!CanBeSerializedInline) { throw new Exception("Complex Toml Tables cannot be serialized into a TomlArray if the TomlArray is not a Table Array. This means that the TOML array cannot contain anything other than tables. If you are manually accessing SerializedValue on the TomlArray, you should probably be calling SerializeTableArray here. (Check the CanBeSerializedInline property and call that method if it is false)"); } StringBuilder stringBuilder = new StringBuilder("["); char value = (multiline ? '\n' : ' '); using (IEnumerator<TomlValue> enumerator = GetEnumerator()) { while (enumerator.MoveNext()) { TomlValue current = enumerator.Current; stringBuilder.Append(value); if (current.Comments.PrecedingComment != null) { stringBuilder.Append(current.Comments.FormatPrecedingComment(1)).Append('\n'); } if (multiline) { stringBuilder.Append('\t'); } stringBuilder.Append(current.SerializedValue); stringBuilder.Append(','); if (current.Comments.InlineComment != null) { stringBuilder.Append(" # ").Append(current.Comments.InlineComment); } } } stringBuilder.Append(value); stringBuilder.Append(']'); return stringBuilder.ToString(); } public string SerializeTableArray(string key) { if (!IsTableArray) { throw new Exception("Cannot serialize normal arrays using this method. Use the normal TomlValue.SerializedValue property."); } StringBuilder stringBuilder = new StringBuilder(); if (base.Comments.InlineComment != null) { throw new Exception("Sorry, but inline comments aren't supported on table-arrays themselves. See https://github.com/SamboyCoding/Tomlet/blob/master/Docs/InlineCommentsOnTableArrays.md for my rationale on this."); } bool flag = true; using (IEnumerator<TomlValue> enumerator = GetEnumerator()) { while (enumerator.MoveNext()) { TomlValue current = enumerator.Current; if (!(current is TomlTable tomlTable)) { throw new Exception($"Toml Table-Array contains non-table entry? Value is {current}"); } if (current.Comments.PrecedingComment != null) { if (flag && base.Comments.PrecedingComment != null) { stringBuilder.Append('\n'); } stringBuilder.Append(current.Comments.FormatPrecedingComment()).Append('\n'); } flag = false; stringBuilder.Append("[[").Append(key).Append("]]"); if (current.Comments.InlineComment != null) { stringBuilder.Append(" # ").Append(current.Comments.InlineComment); } stringBuilder.Append('\n'); stringBuilder.Append(tomlTable.SerializeNonInlineTable(key, includeHeader: false)).Append('\n'); } } return stringBuilder.ToString(); } public IEnumerator<TomlValue> GetEnumerator() { return ArrayValues.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ArrayValues.GetEnumerator(); } } public class TomlBoolean : TomlValue { private bool _value; public static TomlBoolean True => new TomlBoolean(value: true); public static TomlBoolean False => new TomlBoolean(value: false); public bool Value => _value; public override string StringValue { get { if (!Value) { return bool.FalseString.ToLowerInvariant(); } return bool.TrueString.ToLowerInvariant(); } } public override string SerializedValue => StringValue; private TomlBoolean(bool value) { _value = value; } public static TomlBoolean ValueOf(bool b) { if (!b) { return False; } return True; } } public class TomlCommentData { private string? _inlineComment; public string? PrecedingComment { get; set; } public string? InlineComment { get { return _inlineComment; } set { if (value == null) { _inlineComment = null; return; } if (value.Contains("\n") || value.Contains("\r")) { throw new TomlNewlineInInlineCommentException(); } _inlineComment = value; } } public bool ThereAreNoComments { get { if (InlineComment == null) { return PrecedingComment == null; } return false; } } internal string FormatPrecedingComment(int indentCount = 0) { if (PrecedingComment == null) { throw new Exception("Preceding comment is null"); } StringBuilder stringBuilder = new StringBuilder(); string[] array = PrecedingComment.Split(new char[1] { '\n' }); bool flag = true; string[] array2 = array; foreach (string value in array2) { if (!flag) { stringBuilder.Append('\n'); } flag = false; string value2 = new string('\t', indentCount); stringBuilder.Append(value2).Append("# ").Append(value); } return stringBuilder.ToString(); } } public class TomlDocument : TomlTable { public string? TrailingComment { get; set; } public override string SerializedValue => SerializeDocument(); public override string StringValue => $"Toml root document ({Entries.Count} entries)"; public static TomlDocument CreateEmpty() { return new TomlDocument(); } internal TomlDocument() { } internal TomlDocument(TomlTable from) { foreach (string key in from.Keys) { PutValue(key, from.GetValue(key)); } } private string SerializeDocument() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(SerializeNonInlineTable(null, includeHeader: false)); if (TrailingComment != null) { TomlCommentData tomlCommentData = new TomlCommentData { PrecedingComment = TrailingComment }; stringBuilder.Append('\n'); stringBuilder.Append(tomlCommentData.FormatPrecedingComment()); } return stringBuilder.ToString(); } } public class TomlDouble : TomlValue { private double _value; public bool HasDecimal => Value != (double)(int)Value; public double Value => _value; public bool IsNaN => double.IsNaN(Value); public bool IsInfinity => double.IsInfinity(Value); public override string StringValue { get { if (this != null) { if (IsInfinity) { return double.IsPositiveInfinity(Value) ? "inf" : "-inf"; } if (IsNaN) { return "nan"; } if (HasDecimal) { return Value.ToString(CultureInfo.InvariantCulture); } } return $"{Value:F1}"; } } public override string SerializedValue => StringValue; public TomlDouble(double value) { _value = value; } internal static TomlDouble? Parse(string valueInToml) { double? doubleValue = TomlNumberUtils.GetDoubleValue(valueInToml); if (!doubleValue.HasValue) { return null; } return new TomlDouble(doubleValue.Value); } } public class TomlLocalDate : TomlValue, ITomlValueWithDateTime { private readonly DateTime _value; public DateTime Value => _value; public override string StringValue => XmlConvert.ToString(Value, XmlDateTimeSerializationMode.Unspecified); public override string SerializedValue => StringValue; public TomlLocalDate(DateTime value) { _value = value; } public static TomlLocalDate? Parse(string input) { if (!DateTime.TryParse(input, out var result)) { return null; } return new TomlLocalDate(result); } } public class TomlLocalDateTime : TomlValue, ITomlValueWithDateTime { private readonly DateTime _value; public DateTime Value => _value; public override string StringValue => XmlConvert.ToString(Value, XmlDateTimeSerializationMode.Unspecified); public override string SerializedValue => StringValue; public TomlLocalDateTime(DateTime value) { _value = value; } public static TomlLocalDateTime? Parse(string input) { if (!DateTime.TryParse(input, out var result)) { return null; } return new TomlLocalDateTime(result); } } public class TomlLocalTime : TomlValue { private readonly TimeSpan _value; public TimeSpan Value => _value; public override string StringValue => Value.ToString(); public override string SerializedValue => StringValue; public TomlLocalTime(TimeSpan value) { _value = value; } public static TomlLocalTime? Parse(string input) { if (!TimeSpan.TryParse(input, out var result)) { return null; } return new TomlLocalTime(result); } } public class TomlLong : TomlValue { private long _value; public long Value => _value; public override string StringValue => Value.ToString(); public override string SerializedValue => StringValue; public TomlLong(long value) { _value = value; } internal static TomlLong? Parse(string valueInToml) { long? longValue = TomlNumberUtils.GetLongValue(valueInToml); if (!longValue.HasValue) { return null; } return new TomlLong(longValue.Value); } } public class TomlOffsetDateTime : TomlValue { private readonly DateTimeOffset _value; public DateTimeOffset Value => _value; public override string StringValue => Value.ToString("O"); public override string SerializedValue => StringValue; public TomlOffsetDateTime(DateTimeOffset value) { _value = value; } public static TomlOffsetDateTime? Parse(string input) { if (!DateTimeOffset.TryParse(input, out var result)) { return null; } return new TomlOffsetDateTime(result); } } public class TomlString : TomlValue { private readonly string _value; public static TomlString Empty => new TomlString(""); public string Value => _value; public override string StringValue => Value; public override string SerializedValue { get { if (!Value.RuntimeCorrectContains('\'') && Value.RuntimeCorrectContains('\\')) { if (!Value.RuntimeCorrectContains('\n')) { return LiteralStringSerializedForm; } return MultiLineLiteralStringSerializedForm; } if (Value.RuntimeCorrectContains('\'') && !Value.RuntimeCorrectContains('"')) { return StandardStringSerializedForm; } if (Value.RuntimeCorrectContains('"') && !Value.RuntimeCorrectContains('\'') && !Value.RuntimeCorrectContains('\n')) { return LiteralStringSerializedForm; } if (Value.RuntimeCorrectContains('"') && !Value.RuntimeCorrectContains('\'')) { return MultiLineLiteralStringSerializedForm; } return StandardStringSerializedForm; } } internal string StandardStringSerializedForm => "\"" + TomlUtils.EscapeStringValue(Value) + "\""; internal string LiteralStringSerializedForm => "'" + Value + "'"; internal string MultiLineLiteralStringSerializedForm => "'''\n" + Value + "'''"; public TomlString(string? value) { _value = value ?? throw new ArgumentNullException("value", "TomlString's value cannot be null"); } } public class TomlTable : TomlValue { public readonly Dictionary<string, TomlValue> Entries = new Dictionary<string, TomlValue>(); internal bool Locked; internal bool Defined; public bool ForceNoInline { get; set; } public override string StringValue => $"Table ({Entries.Count} entries)"; public HashSet<string> Keys => new HashSet<string>(Entries.Keys); public bool ShouldBeSerializedInline { get { if (!ForceNoInline && Entries.Count < 4) { return Entries.All<KeyValuePair<string, TomlValue>>((KeyValuePair<string, TomlValue> e) => !e.Key.Contains(" ") && e.Value.Comments.ThereAreNoComments && ((!(e.Value is TomlArray tomlArray)) ? (!(e.Value is TomlTable)) : tomlArray.IsSimpleArray)); } return false; } } public override string SerializedValue { get { if (!ShouldBeSerializedInline) { throw new Exception("Cannot use SerializeValue to serialize non-inline tables. Use SerializeNonInlineTable(keyName)."); } StringBuilder stringBuilder = new StringBuilder("{ "); stringBuilder.Append(string.Join(", ", Entries.Select<KeyValuePair<string, TomlValue>, string>((KeyValuePair<string, TomlValue> o) => o.Key + " = " + o.Value.SerializedValue).ToArray())); stringBuilder.Append(" }"); return stringBuilder.ToString(); } } public string SerializeNonInlineTable(string? keyName, bool includeHeader = true) { StringBuilder stringBuilder = new StringBuilder(); if (includeHeader) { stringBuilder.Append('[').Append(keyName).Append("]"); if (base.Comments.InlineComment != null) { stringBuilder.Append(" # ").Append(base.Comments.InlineComment); } stringBuilder.Append('\n'); } string one; TomlValue two; foreach (KeyValuePair<string, TomlValue> entry in Entries) { Extensions.Deconstruct(entry, out one, out two); string subKey = one; TomlValue tomlValue = two; if (tomlValue is TomlTable tomlTable) { if (!tomlTable.ShouldBeSerializedInline) { goto IL_00a4; } } else if (tomlValue is TomlArray tomlArray && !tomlArray.CanBeSerializedInline) { goto IL_00a4; } bool flag = false; goto IL_00ac; IL_00a4: flag = true; goto IL_00ac; IL_00ac: if (!flag) { WriteValueToStringBuilder(keyName, subKey, stringBuilder); } } foreach (KeyValuePair<string, TomlValue> entry2 in Entries) { Extensions.Deconstruct(entry2, out one, out two); string subKey2 = one; if (two is TomlTable tomlTable2 && !tomlTable2.ShouldBeSerializedInline) { WriteValueToStringBuilder(keyName, subKey2, stringBuilder); } } foreach (KeyValuePair<string, TomlValue> entry3 in Entries) { Extensions.Deconstruct(entry3, out one, out two); string subKey3 = one; if (two is TomlArray tomlArray2 && !tomlArray2.CanBeSerializedInline) { WriteValueToStringBuilder(keyName, subKey3, stringBuilder); } } return stringBuilder.ToString(); } private void WriteValueToStringBuilder(string? keyName, string subKey, StringBuilder builder) { TomlValue value = GetValue(subKey); subKey = EscapeKeyIfNeeded(subKey); if (keyName != null) { keyName = EscapeKeyIfNeeded(keyName); } string text = ((keyName == null) ? subKey : (keyName + "." + subKey)); bool flag = builder.Length < 2 || builder[builder.Length - 2] == '\n'; if (value.Comments.PrecedingComment != null) { builder.Append(value.Comments.FormatPrecedingComment()).Append('\n'); } if (value is TomlArray tomlArray) { if (!tomlArray.CanBeSerializedInline) { if (!flag) { builder.Append('\n'); } builder.Append(tomlArray.SerializeTableArray(text)); return; } TomlArray tomlArray2 = tomlArray; builder.Append(subKey).Append(" = ").Append(tomlArray2.SerializedValue); } else if (value is TomlTable tomlTable) { if (!tomlTable.ShouldBeSerializedInline) { TomlTable tomlTable2 = tomlTable; builder.Append(tomlTable2.SerializeNonInlineTable(text)).Append('\n'); return; } builder.Append(subKey).Append(" = ").Append(tomlTable.SerializedValue); } else { builder.Append(subKey).Append(" = ").Append(value.SerializedValue); } if (value.Comments.InlineComment != null) { builder.Append(" # ").Append(value.Comments.InlineComment); } builder.Append('\n'); } private string EscapeKeyIfNeeded(string key) { bool flag = false; if (key.StartsWith("\"") && key.EndsWith("\"") && key.Count((char c) => c == '"') == 2) { return key; } if (key.StartsWith("'") && key.EndsWith("'") && key.Count((char c) => c == '\'') == 2) { return key; } if (key.Contains("\"") || key.Contains("'")) { key = TomlUtils.AddCorrectQuotes(key); flag = true; } string text = TomlUtils.EscapeStringValue(key); if (text.Contains(" ") || (text.Contains("\\") && !flag)) { text = TomlUtils.AddCorrectQuotes(text); } return text; } internal void ParserPutValue(string key, TomlValue value, int lineNumber) { if (Locked) { throw new TomlTableLockedException(lineNumber, key); } InternalPutValue(key, value, lineNumber, callParserForm: true); } public void PutValue(string key, TomlValue value, bool quote = false) { if (key == null) { throw new ArgumentNullException("key"); } if (value == null) { throw new ArgumentNullException("value"); } if (quote) { key = TomlUtils.AddCorrectQuotes(key); } InternalPutValue(key, value, null, callParserForm: false); } public void Put<T>(string key, T t, bool quote = false) { TomlValue tomlValue2 = ((!((object)t is TomlValue tomlValue)) ? TomletMain.ValueFrom(t) : tomlValue); if (tomlValue2 == null) { throw new ArgumentException("Value to insert into TOML table serialized to null.", "t"); } PutValue(key, tomlValue2, quote); } public string DeQuoteKey(string key) { if ((key.StartsWith("\"") && key.EndsWith("\"")) || (key.StartsWith("'") && key.EndsWith("'"))) { return key.Substring(1, key.Length - 2); } return key; } private void InternalPutValue(string key, TomlValue value, int? lineNumber, bool callParserForm) { key = key.Trim(); TomlKeyUtils.GetTopLevelAndSubKeys(key, out string ourKeyName, out string restOfKey); if (!string.IsNullOrEmpty(restOfKey)) { if (!Entries.TryGetValue(DeQuoteKey(ourKeyName), out TomlValue value2)) { TomlTable tomlTable = new TomlTable(); if (callParserForm) { ParserPutValue(ourKeyName, tomlTable, lineNumber.Value); } else { PutValue(ourKeyName, tomlTable); } if (callParserForm) { tomlTable.ParserPutValue(restOfKey, value, lineNumber.Value); } else { tomlTable.PutValue(restOfKey, value); } return; } if (!(value2 is TomlTable tomlTable2)) { if (lineNumber.HasValue) { throw new TomlDottedKeyParserException(lineNumber.Value, ourKeyName); } throw new TomlDottedKeyException(ourKeyName); } if (callParserForm) { tomlTable2.ParserPutValue(restOfKey, value, lineNumber.Value); } else { tomlTable2.PutValue(restOfKey, value); } } else { key = DeQuoteKey(key); if (Entries.ContainsKey(key) && lineNumber.HasValue) { throw new TomlKeyRedefinitionException(lineNumber.Value, key); } Entries[key] = value; } } public bool ContainsKey(string key) { if (key == null) { throw new ArgumentNullException("key"); } TomlKeyUtils.GetTopLevelAndSubKeys(key, out string ourKeyName, out string restOfKey); if (string.IsNullOrEmpty(restOfKey)) { return Entries.ContainsKey(DeQuoteKey(key)); } if (!Entries.TryGetValue(ourKeyName, out TomlValue value)) { return false; } if (value is TomlTable tomlTable) { return tomlTable.ContainsKey(restOfKey); } throw new TomlContainsDottedKeyNonTableException(key); } public bool TryGetValue(string key, out TomlValue? value) { if (ContainsKey(key)) { return (value = GetValue(key)) != null; } value = null; return false; } public TomlValue GetValue(string key) { if (key == null) { throw new ArgumentNullException("key"); } if (!ContainsKey(key)) { throw new TomlNoSuchValueException(key); } TomlKeyUtils.GetTopLevelAndSubKeys(key, out string ourKeyName, out string restOfKey); if (string.IsNullOrEmpty(restOfKey)) { return Entries[DeQuoteKey(key)]; } if (!Entries.TryGetValue(ourKeyName, out TomlValue value)) { throw new TomlNoSuchValueException(key); } if (value is TomlTable tomlTable) { return tomlTable.GetValue(restOfKey); } throw new Exception("Tomlet Internal bug - existing key is not a table in TomlTable GetValue, but we didn't throw in ContainsKey?"); } public string GetString(string key) { if (key == null) { throw new ArgumentNullException("key"); } TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key)); return ((value as TomlString) ?? throw new TomlTypeMismatchException(typeof(TomlString), value.GetType(), typeof(string))).Value; } public int GetInteger(string key) { if (key == null) { throw new ArgumentNullException("key"); } TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key)); return (int)((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(int))).Value; } public long GetLong(string key) { if (key == null) { throw new ArgumentNullException("key"); } TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key)); return ((value as TomlLong) ?? throw new TomlTypeMismatchException(typeof(TomlLong), value.GetType(), typeof(int))).Value; } public float GetFloat(string key) { if (key == null) { throw new ArgumentNullException("key"); } TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key)); return (float)((value as TomlDouble) ?? throw new TomlTypeMismatchException(typeof(TomlDouble), value.GetType(), typeof(float))).Value; } public bool GetBoolean(string key) { if (key == null) { throw new ArgumentNullException("key"); } TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key)); return ((value as TomlBoolean) ?? throw new TomlTypeMismatchException(typeof(TomlBoolean), value.GetType(), typeof(bool))).Value; } public TomlArray GetArray(string key) { if (key == null) { throw new ArgumentNullException("key"); } TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key)); return (value as TomlArray) ?? throw new TomlTypeMismatchException(typeof(TomlArray), value.GetType(), typeof(TomlArray)); } public TomlTable GetSubTable(string key) { if (key == null) { throw new ArgumentNullException("key"); } TomlValue value = GetValue(TomlUtils.AddCorrectQuotes(key)); return (value as TomlTable) ?? throw new TomlTypeMismatchException(typeof(TomlTable), value.GetType(), typeof(TomlTable)); } } public abstract class TomlValue { public TomlCommentData Comments { get; } = new TomlCommentData(); public abstract string StringValue { get; } public abstract string SerializedValue { get; } } public interface ITomlValueWithDateTime { DateTime Value { get; } } } namespace Tomlet.Exceptions { public class InvalidTomlDateTimeException : TomlExceptionWithLine { private readonly string _inputString; public override string Message => $"Found an invalid TOML date/time string '{_inputString}' on line {LineNumber}"; public InvalidTomlDateTimeException(int lineNumber, string inputString) : base(lineNumber) { _inputString = inputString; } } public class InvalidTomlEscapeException : TomlExceptionWithLine { private readonly string _escapeSequence; public override string Message => $"Found an invalid escape sequence '\\{_escapeSequence}' on line {LineNumber}"; public InvalidTomlEscapeException(int lineNumber, string escapeSequence) : base(lineNumber) { _escapeSequence = escapeSequence; } } public class InvalidTomlInlineTableException : TomlExceptionWithLine { public override string Message => $"Found an invalid inline TOML table on line {LineNumber}. See further down for cause."; public InvalidTomlInlineTableException(int lineNumber, TomlException cause) : base(lineNumber, cause) { } } public class InvalidTomlKeyException : TomlException { private readonly string _key; public override string Message => "The string |" + _key + "| (between the two bars) contains at least one of both a double quote and a single quote, so it cannot be used for a TOML key."; public InvalidTomlKeyException(string key) { _key = key; } } public class InvalidTomlNumberException : TomlExceptionWithLine { private readonly string _input; public override string Message => $"While reading input line {LineNumber}, found an invalid number literal '{_input}'"; public InvalidTomlNumberException(int lineNumber, string input) : base(lineNumber) { _input = input; } } public class MissingIntermediateInTomlTableArraySpecException : TomlExceptionWithLine { private readonly string _missing; public override string Message => $"Missing intermediate definition for {_missing} in table-array specification on line {LineNumber}. This is undefined behavior, and I chose to define it as an error."; public MissingIntermediateInTomlTableArraySpecException(int lineNumber, string missing) : base(lineNumber) { _missing = missing; } } public class NewLineInTomlInlineTableException : TomlExceptionWithLine { public override string Message => "Found a new-line character within a TOML inline table. This is not allowed."; public NewLineInTomlInlineTableException(int lineNumber) : base(lineNumber) { } } public class NoTomlKeyException : TomlExceptionWithLine { public override string Message => $"Expected a TOML key on line {LineNumber}, but found an equals sign ('=')."; public NoTomlKeyException(int lineNumber) : base(lineNumber) { } } public class TimeOffsetOnTomlDateOrTimeException : TomlExceptionWithLine { private readonly string _tzString; public override string Message => $"Found a time offset string {_tzString} in a partial datetime on line {LineNumber}. This is not allowed - either specify both the date and the time, or remove the offset specifier."; public TimeOffsetOnTomlDateOrTimeException(int lineNumber, string tzString) : base(lineNumber) { _tzString = tzString; } } public class TomlArraySyntaxException : TomlExceptionWithLine { private readonly char _charFound; public override string Message => $"Expecting ',' or ']' after value in array on line {LineNumber}, found '{_charFound}'"; public TomlArraySyntaxException(int lineNumber, char charFound) : base(lineNumber) { _charFound = charFound; } } public class TomlContainsDottedKeyNonTableException : TomlException { internal readonly string Key; public override string Message => "A call was made on a TOML table which attempted to access a sub-key of " + Key + ", but the value it refers to is not a table"; public TomlContainsDottedKeyNonTableException(string key) { Key = key; } } public class TomlDateTimeMissingSeparatorException : TomlExceptionWithLine { public override string Message => $"Found a date-time on line {LineNumber} which is missing a separator (T, t, or a space) between the date and time."; public TomlDateTimeMissingSeparatorException(int lineNumber) : base(lineNumber) { } } public class TomlDateTimeUnnecessarySeparatorException : TomlExceptionWithLine { public override string Message => $"Found an unnecessary date-time separator (T, t, or a space) in a date or time on line {LineNumber}"; public TomlDateTimeUnnecessarySeparatorException(int lineNumber) : base(lineNumber) { } } public class TomlDottedKeyException : TomlException { private readonly string _key; public override string Message => "Tried to redefine key " + _key + " as a table (by way of a dotted key) when it's already defined as not being a table."; public TomlDottedKeyException(string key) { _key = key; } } public class TomlDottedKeyParserException : TomlExceptionWithLine { private readonly string _key; public override string Message => $"Tried to redefine key {_key} as a table (by way of a dotted key on line {LineNumber}) when it's already defined as not being a table."; public TomlDottedKeyParserException(int lineNumber, string key) : base(lineNumber) { _key = key; } } public class TomlDoubleDottedKeyException : TomlExceptionWithLine { public override string Message => "Found two consecutive dots, or a leading dot, in a key on line " + LineNumber; public TomlDoubleDottedKeyException(int lineNumber) : base(lineNumber) { } } public class TomlEndOfFileException : TomlExceptionWithLine { public override string Message => $"Found unexpected EOF on line {LineNumber} when parsing TOML file"; public TomlEndOfFileException(int lineNumber) : base(lineNumber) { } } public class TomlEnumParseException : TomlException { private string _valueName; private Type _enumType; public override string Message => $"Could not find enum value by name \"{_valueName}\" in enum class {_enumType} while deserializing."; public TomlEnumParseException(string valueName, Type enumType) { _valueName = valueName; _enumType = enumType; } } public abstract class TomlException : Exception { protected TomlException() { } protected TomlException(Exception cause) : base("", cause) { } } public abstract class TomlExceptionWithLine : TomlException { protected int LineNumber; protected TomlExceptionWithLine(int lineNumber) { LineNumber = lineNumber; } protected TomlExceptionWithLine(int lineNumber, Exception cause) : base(cause) { LineNumber = lineNumber; } } public class TomlFieldTypeMismatchException : TomlTypeMismatchException { private readonly Type _typeBeingInstantiated; private readonly FieldInfo _fieldBeingDeserialized; public override string Message => $"While deserializing an object of type {_typeBeingInstantiated}, found field {_fieldBeingDeserialized.Name} expecting a type of {ExpectedTypeName}, but value in TOML was of type {ActualTypeName}"; public TomlFieldTypeMismatchException(Type typeBeingInstantiated, FieldInfo fieldBeingDeserialized, TomlTypeMismatchException cause) : base(cause.ExpectedType, cause.ActualType, fieldBeingDeserialized.FieldType) { _typeBeingInstantiated = typeBeingInstantiated; _fieldBeingDeserialized = fieldBeingDeserialized; } } public class TomlInlineTableSeparatorException : TomlExceptionWithLine { private readonly char _found; public override string Message => $"Expected '}}' or ',' after key-value pair in TOML inline table, found '{_found}'"; public TomlInlineTableSeparatorException(int lineNumber, char found) : base(lineNumber) { _found = found; } } public class TomlInstantiationException : TomlException { private readonly Type _type; public override string Message => "Could not find a no-argument constructor for type " + _type.FullName; public TomlInstantiationException(Type type) { _type = type; } } public class TomlInternalException : TomlExceptionWithLine { public override string Message => $"An internal exception occured while parsing line {LineNumber} of the TOML document"; public TomlInternalException(int lineNumber, Exception cause) : base(lineNumber, cause) { } } public class TomlInvalidValueException : TomlExceptionWithLine { private readonly char _found; public override string Message => $"Expected the start of a number, string literal, boolean, array, or table on line {LineNumber}, found '{_found}'"; public TomlInvalidValueException(int lineNumber, char found) : base(lineNumber) { _found = found; } } public class TomlKeyRedefinitionException : TomlExceptionWithLine { private readonly string _key; public override string Message => $"TOML document attempts to re-define key '{_key}' on line {LineNumber}"; public TomlKeyRedefinitionException(int lineNumber, string key) : base(lineNumber) { _key = key; } } public class TomlMissingEqualsException : TomlExceptionWithLine { private readonly char _found; public override string Message => $"Expecting an equals sign ('=') on line {LineNumber}, but found '{_found}'"; public TomlMissingEqualsException(int lineNumber, char found) : base(lineNumber) { _found = found; } } public class TomlMissingNewlineException : TomlExceptionWithLine { private readonly char _found; public override string Message => $"Expecting a newline character at the end of a statement on line {LineNumber}, but found an unexpected '{_found}'"; public TomlMissingNewlineException(int lineNumber, char found) : base(lineNumber) { _found = found; } } public class TomlNewlineInInlineCommentException : TomlException { public override string Message => "An attempt was made to set an inline comment which contains a newline. This obviously cannot be done, as inline comments must fit on one line."; } public class TomlNonTableArrayUsedAsTableArrayException : TomlExceptionWithLine { private readonly string _arrayName; public override string Message => $"{_arrayName} is used as a table-array on line {LineNumber} when it has previously been defined as a static array. This is not allowed."; public TomlNonTableArrayUsedAsTableArrayException(int lineNumber, string arrayName) : base(lineNumber) { _arrayName = arrayName; } } public class TomlNoSuchValueException : TomlException { private readonly string _key; public override string Message => "Attempted to get the value for key " + _key + " but no value is associated with that key"; public TomlNoSuchValueException(string key) { _key = key; } } public class TomlPrimitiveToDocumentException : TomlException { private Type primitiveType; public override string Message => "Tried to create a TOML document from a primitive value of type " + primitiveType.Name + ". Documents can only be created from objects."; public TomlPrimitiveToDocumentException(Type primitiveType) { this.primitiveType = primitiveType; } } public class TomlPropertyTypeMismatchException : TomlTypeMismatchException { private readonly Type _typeBeingInstantiated; private readonly PropertyInfo _propBeingDeserialized; public override string Message => $"While deserializing an object of type {_typeBeingInstantiated}, found property {_propBeingDeserialized.Name} expecting a type of {ExpectedTypeName}, but value in TOML was of type {ActualTypeName}"; public TomlPropertyTypeMismatchException(Type typeBeingInstantiated, PropertyInfo propBeingDeserialized, TomlTypeMismatchException cause) : base(cause.ExpectedType, cause.ActualType, propBeingDeserialized.PropertyType) { _typeBeingInstantiated = typeBeingInstantiated; _propBeingDeserialized = propBeingDeserialized; } } public class TomlStringException : TomlExceptionWithLine { public override string Message => $"Found an invalid TOML string on line {LineNumber}"; public TomlStringException(int lineNumber) : base(lineNumber) { } } public class TomlTableArrayAlreadyExistsAsNonArrayException : TomlExceptionWithLine { private readonly string _arrayName; public override string Message => $"{_arrayName} is defined as a table-array (double-bracketed section) on line {LineNumber} but it has previously been used as a non-array type."; public TomlTableArrayAlreadyExistsAsNonArrayException(int lineNumber, string arrayName) : base(lineNumber) { _arrayName = arrayName; } } public class TomlTableLockedException : TomlExceptionWithLine { private readonly string _key; public override string Message => $"TOML table is locked (e.g. defined inline), cannot add or update key {_key} to it on line {LineNumber}"; public TomlTableLockedException(int lineNumber, string key) : base(lineNumber) { _key = key; } } public class TomlTableRedefinitionException : TomlExceptionWithLine { private readonly string _key; public override string Message => $"TOML document attempts to re-define table '{_key}' on line {LineNumber}"; public TomlTableRedefinitionException(int lineNumber, string key) : base(lineNumber) { _key = key; } } public class TomlTripleQuotedKeyException : TomlExceptionWithLine { public override string Message => $"Found a triple-quoted key on line {LineNumber}. This is not allowed."; public TomlTripleQuotedKeyException(int lineNumber) : base(lineNumber) { } } public class TomlTypeMismatchException : TomlException { protected readonly string ExpectedTypeName; protected readonly string ActualTypeName; protected internal readonly Type ExpectedType; protected internal readonly Type ActualType; private readonly Type _context; public override string Message => $"While trying to convert to type {_context}, a TOML value of type {ExpectedTypeName} was required but a value of type {ActualTypeName} was found"; public TomlTypeMismatchException(Type expected, Type actual, Type context) { ExpectedTypeName = (typeof(TomlValue).IsAssignableFrom(expected) ? expected.Name.Replace("Toml", "") : expected.Name); ActualTypeName = (typeof(TomlValue).IsAssignableFrom(actual) ? actual.Name.Replace("Toml", "") : actual.Name); ExpectedType = expected; ActualType = actual; _context = context; } } public class TomlUnescapedUnicodeControlCharException : TomlExceptionWithLine { private readonly int _theChar; public override string Message => $"Found an unescaped unicode control character U+{_theChar:0000} on line {LineNumber}. Control character other than tab (U+0009) are not allowed in TOML unless they are escaped."; public TomlUnescapedUnicodeControlCharException(int lineNumber, int theChar) : base(lineNumber) { _theChar = theChar; } } public class TomlWhitespaceInKeyException : TomlExceptionWithLine { public override string Message => "Found whitespace in an unquoted TOML key at line " + LineNumber; public TomlWhitespaceInKeyException(int lineNumber) : base(lineNumber) { } } public class TripleQuoteInTomlMultilineLiteralException : TomlExceptionWithLine { public override string Message => $"Found a triple-single-quote (''') inside a multiline string literal on line {LineNumber}. This is not allowed."; public TripleQuoteInTomlMultilineLiteralException(int lineNumber) : base(lineNumber) { } } public class TripleQuoteInTomlMultilineSimpleStringException : TomlExceptionWithLine { public override string Message => $"Found a triple-double-quote (\"\"\") inside a multiline simple string on line {LineNumber}. This is not allowed."; public TripleQuoteInTomlMultilineSimpleStringException(int lineNumber) : base(lineNumber) { } } public class UnterminatedTomlKeyException : TomlExceptionWithLine { public override string Message => $"Found an unterminated quoted key on line {LineNumber}"; public UnterminatedTomlKeyException(int lineNumber) : base(lineNumber) { } } public class UnterminatedTomlStringException : TomlExceptionWithLine { public override string Message => $"Found an unterminated TOML string on line {LineNumber}"; public UnterminatedTomlStringException(int lineNumber) : base(lineNumber) { } } public class UnterminatedTomlTableArrayException : TomlExceptionWithLine { public override string Message => $"Found an unterminated table-array (expecting two ]s to close it) on line {LineNumber}"; public UnterminatedTomlTableArrayException(int lineNumber) : base(lineNumber) { } } public class UnterminatedTomlTableNameException : TomlExceptionWithLine { public override string Message => $"Found an unterminated table name on line {LineNumber}"; public UnterminatedTomlTableNameException(int lineNumber) : base(lineNumber) { } } } namespace Tomlet.Attributes { internal class NoCoverageAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class)] public class TomlDoNotInlineObjectAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class TomlInlineCommentAttribute : Attribute { internal string Comment { get; } public TomlInlineCommentAttribute(string comment) { Comment = comment; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class TomlPrecedingCommentAttribute : Attribute { internal string Comment { get; } public TomlPrecedingCommentAttribute(string comment) { Comment = comment; } } [AttributeUsage(AttributeTargets.Property)] public class TomlPropertyAttribute : Attribute { private readonly string _mapFrom; public TomlPropertyAttribute(string mapFrom) { _mapFrom = mapFrom; } public string GetMappedString() { return _mapFrom; } } }
BepInEx/plugins/BepInEx-BepInEx_MLLoader/BepInEx.MelonLoader.Loader/WebSocketDotNet.dll.old
Decompiled 8 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Net; using System.Net.Security; using System.Net.Sockets; using System.Reflection; using System.Runtime.CompilerServices; using System.Security.Cryptography; using System.Text; using System.Threading; using Microsoft.CodeAnalysis; using WebSocketDotNet.Http; using WebSocketDotNet.Messages; using WebSocketDotNet.Protocol; using WebSocketDotNet.Utils; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: InternalsVisibleTo("WebSocketDotNet.Tests")] [assembly: AssemblyCompany("N/A")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("\r\n WebSocketDotNet is a .NET library for WebSockets. Compared to similar libraries, the main advantage is that it works\r\n on more versions of .NET, from .NET Framework 3.5 to .NET 6.0.\r\n ")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+e1c3c33f40bfed34fd57b5a048540bcb1e8db26f")] [assembly: AssemblyProduct("WebSocketDotNet")] [assembly: AssemblyTitle("WebSocketDotNet")] [assembly: AssemblyVersion("1.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace WebSocketDotNet { internal static class AssemblyInfo { public static readonly string Name = Assembly.GetExecutingAssembly().GetName().Name; public static readonly Version Version = Assembly.GetExecutingAssembly().GetName().Version; } public enum MessageChunkingMode { AlwaysUseExtendedLength, LimitTo16BitExtendedLength, NeverUseExtendedLength } public class WebSocket { private static readonly Guid WebsocketKeyGuid = new Guid("258EAFA5-E914-47DA-95CA-C5AB0DC85B11"); private readonly Random _random = new Random(); private readonly SHA1 _sha1 = SHA1.Create(); private readonly HttpHandler _httpHandler; private readonly List<WebSocketFragment> _currentPartialFragments = new List<WebSocketFragment>(); private readonly object _sendLock = new object(); private readonly object _receiveLock = new object(); private Thread? _receiveThread; private WebSocketCloseMessage? _closeMessage; private WebSocketConfiguration _configuration; public WebSocketState State { get; private set; } public event Action Opened = delegate { }; public event Action<WebSocketCloseCode, string?> Closing = delegate { }; public event Action<WebSocketCloseCode, string?> Closed = delegate { }; public event Action<byte[]> PongReceived = delegate { }; public event Action<byte[]> BinaryReceived = delegate { }; public event Action<string> TextReceived = delegate { }; public event Action<WebSocketMessage> MessageReceived = delegate { }; [Obsolete("Use the constructor that takes a WebSocketConfiguration instead")] public WebSocket(string url, bool autoConnect = true, bool useReceiveThread = true) : this(url, new WebSocketConfiguration { AutoConnect = autoConnect, UseAutomaticReceiveThread = useReceiveThread }) { } public WebSocket(string url, WebSocketConfiguration configuration = default(WebSocketConfiguration)) { _configuration = configuration; UriUtils.ValidateUrlScheme(ref url); _httpHandler = new HttpHandler(new Uri(url)); State = WebSocketState.Closed; if (configuration.AutoConnect) { Connect(); } } public void Connect() { if (State != WebSocketState.Closed) { throw new InvalidOperationException("Cannot connect while in state " + State); } try { SendHandshakeRequest(); } catch (Exception e) { OnException(e); throw; } OnOpen(); } private void SendHandshakeRequest() { State = WebSocketState.Connecting; Dictionary<string, string> dictionary = BuildHandshakeHeaders(); HttpResponse resp = _httpHandler.SendRequestWithHeaders(dictionary); ValidateResponse(resp, dictionary["Sec-WebSocket-Key"]); } private Dictionary<string, string> BuildHandshakeHeaders() { byte[] array = new byte[16]; _random.NextBytes(array); string value = Convert.ToBase64String(array); return new Dictionary<string, string> { { "Upgrade", "websocket" }, { "Connection", "Upgrade" }, { "Sec-WebSocket-Key", value }, { "Sec-WebSocket-Version", "13" } }; } private void ValidateResponse(HttpResponse resp, string key) { string text = Convert.ToBase64String(_sha1.ComputeHash(Encoding.UTF8.GetBytes(key + WebsocketKeyGuid.ToString().ToUpperInvariant()))); if (resp.StatusCode != HttpStatusCode.SwitchingProtocols) { throw new WebException($"Expecting HTTP 101/SwitchingProtocols, got {(int)resp.StatusCode}/{resp.StatusCode}"); } if (!resp.Headers.TryGetValue("Upgrade", out string value) || value != "websocket") { throw new WebException("Expecting Upgrade: websocket, got \"" + value + "\""); } if (!resp.Headers.TryGetValue("Sec-WebSocket-Accept", out string value2) || value2 != text) { throw new WebException("Invalid or no Sec-WebSocket-Accept header in response (got \"" + value2 + "\", expected \"" + text + "\")"); } } public void Send(WebSocketMessage message) { WebSocketState state = State; if (state != WebSocketState.Open && state != WebSocketState.Closing) { throw new InvalidOperationException("WebSocket is not open"); } List<WebSocketFragment> list = message.ToFrame().ToFragments(_configuration.MessageChunkingMode); Stream orOpenStream = _httpHandler.GetOrOpenStream(); Monitor.Enter(_sendLock); foreach (WebSocketFragment item in list) { byte[] bytes = item.Serialize(); Extensions.Write(orOpenStream, bytes); } Monitor.Exit(_sendLock); } public void SendClose(WebSocketCloseCode code = WebSocketCloseCode.ClosedOk, string? reason = null) { if (State == WebSocketState.Closed) { return; } if (State == WebSocketState.Closing) { if (code == WebSocketCloseCode.InternalError) { this.Closing(code, reason); } return; } if (State == WebSocketState.Connecting) { if (code == WebSocketCloseCode.ProtocolError || code == WebSocketCloseCode.InternalError) { this.Closing(code, reason); _closeMessage = new WebSocketCloseMessage(code, reason); OnClose(); return; } throw new InvalidOperationException("Cannot send close message while connecting"); } if (code == WebSocketCloseCode.Reserved) { throw new ArgumentException("Cannot use reserved close codes", "code"); } State = WebSocketState.Closing; _closeMessage = new WebSocketCloseMessage(code, reason); this.Closing(code, reason); try { Send(_closeMessage); } catch (Exception e) { OnException(e); } } public void ReceiveAllAvailable() { WebSocketState state = State; if (state != WebSocketState.Open && state != WebSocketState.Closing) { return; } List<WebSocketFragment> list = new List<WebSocketFragment>(); Monitor.Enter(_receiveLock); do { try { WebSocketFragment item = ReceiveOneFragment(); list.Add(item); } catch (Exception e) { OnException(e); } } while (_httpHandler.AnyDataAvailable); Monitor.Exit(_receiveLock); try { list.ForEach(ProcessFragment); } catch (Exception e2) { OnException(e2); } } private void ReceiveLoop() { while (true) { WebSocketState state = State; if (state == WebSocketState.Open || state == WebSocketState.Closing) { try { ReceiveAllAvailable(); } catch (Exception e) { OnException(e); } Thread.Sleep(10); continue; } break; } } private WebSocketFragment ReceiveOneFragment() { WebSocketState state = State; if (state != WebSocketState.Open && state != WebSocketState.Closing) { throw new InvalidOperationException("WebSocket is not open"); } return WebSocketFragment.Read(_httpHandler.GetOrOpenStream()); } private void ProcessFragment(WebSocketFragment fragment) { if (fragment.Reserved1 || fragment.Reserved2 || fragment.Reserved3) { throw new WebSocketProtocolException("Reserved bits set in fragment"); } if (fragment.Opcode == WebSocketOpcode.Continuation) { if (_currentPartialFragments.Count == 0) { throw new WebSocketProtocolException("Received unexpected continuation fragment with no partial fragments"); } _currentPartialFragments.Add(fragment); if (fragment.IsFinal) { WebSocketFrame frame = WebSocketFrame.FromFragments(_currentPartialFragments); _currentPartialFragments.Clear(); ProcessFrame(frame); } return; } if (_currentPartialFragments.Count > 0 && !fragment.Opcode.IsControlOpcode()) { throw new WebSocketProtocolException("Received non-continuation, non-control fragment with incomplete frame in buffer"); } if (fragment.IsFinal) { ProcessFrame(WebSocketFrame.FromFragment(fragment)); return; } if (fragment.Opcode.IsControlOpcode()) { throw new WebSocketProtocolException($"Received fragmented control frame! (opcode: {fragment.Opcode})"); } _currentPartialFragments.Add(fragment); } private void ProcessFrame(WebSocketFrame frame) { ProcessMessage(WebSocketMessage.FromFrame(frame)); } private void ProcessMessage(WebSocketMessage message) { if (!(message is WebSocketPingMessage webSocketPingMessage)) { if (!(message is WebSocketPongMessage webSocketPongMessage)) { if (!(message is WebSocketCloseMessage webSocketCloseMessage)) { if (!(message is WebSocketBinaryMessage webSocketBinaryMessage)) { if (message is WebSocketTextMessage webSocketTextMessage) { this.TextReceived(webSocketTextMessage.Text); } } else { this.BinaryReceived(webSocketBinaryMessage.Data); } } else if (State == WebSocketState.Closing) { _closeMessage = webSocketCloseMessage; OnClose(); } else { WebSocketCloseMessage webSocketCloseMessage2 = webSocketCloseMessage; SendClose(webSocketCloseMessage2.CloseReason, webSocketCloseMessage2.CloseReasonText); } } else { this.PongReceived(webSocketPongMessage.PongPayload); } } else { Send(new WebSocketPongMessage(webSocketPingMessage.PingPayload)); } this.MessageReceived(message); } private void OnClose() { if (State != WebSocketState.Closing || _closeMessage == null) { _closeMessage = new WebSocketCloseMessage(WebSocketCloseCode.AbnormalClosure, "Unexpected close"); } _httpHandler.CloseAnyExistingStream(); State = WebSocketState.Closed; this.Closed(_closeMessage.CloseReason, _closeMessage.CloseReasonText); } private void OnOpen() { _closeMessage = null; _currentPartialFragments.Clear(); this.Opened(); if (_receiveThread != null) { if (_receiveThread.IsAlive) { Console.WriteLine("Warning - receive thread still running!"); } _receiveThread = null; } State = WebSocketState.Open; if (_configuration.UseAutomaticReceiveThread) { _receiveThread = new Thread(ReceiveLoop) { Name = "WebSocket Receive Thread", IsBackground = true }; _receiveThread.Start(); } } private void OnException(Exception e) { if (e is WebSocketProtocolException ex) { SendClose(WebSocketCloseCode.ProtocolError, ex.Message); return; } if (e is IOException ex2) { if (ex2.InnerException is SocketException ex3) { e = ex3; } else if (State == WebSocketState.Closing) { OnClose(); return; } } if (e is SocketException ex4) { if (ex4.SocketErrorCode == SocketError.ConnectionReset) { if (State == WebSocketState.Closing) { _closeMessage = new WebSocketCloseMessage(WebSocketCloseCode.ClosedOk, "Websocket closed"); State = WebSocketState.Closing; OnClose(); } else { OnClose(); } return; } if (ex4.SocketErrorCode == SocketError.ConnectionRefused) { _closeMessage = new WebSocketCloseMessage(WebSocketCloseCode.ProtocolError, "Connection refused"); State = WebSocketState.Closing; OnClose(); return; } } SendClose(WebSocketCloseCode.InternalError, e.Message); } } public enum WebSocketCloseCode : ushort { Unspecified = 0, ClosedOk = 1000, GoingAway = 1001, ProtocolError = 1002, UnsupportedData = 1003, Reserved = 1004, NoStatus = 1005, AbnormalClosure = 1006, MismatchTypeAndPayload = 1007, PolicyViolation = 1008, MessageTooBig = 1009, MissingMandatoryExtension = 1010, InternalError = 1011, TlsHandshakeFailure = 1015 } public struct WebSocketConfiguration { public bool AutoConnect { get; set; } public bool UseAutomaticReceiveThread { get; set; } public MessageChunkingMode MessageChunkingMode { get; set; } public WebSocketConfiguration() { AutoConnect = true; UseAutomaticReceiveThread = true; MessageChunkingMode = MessageChunkingMode.LimitTo16BitExtendedLength; } } [NoCoverage] public class WebSocketProtocolException : Exception { public WebSocketProtocolException(string message) : base(message) { } } public enum WebSocketState { Connecting, Open, Closing, Closed } } namespace WebSocketDotNet.Utils { internal static class Extensions { internal static byte[] ReadToEnd(this Stream s, NetworkStreamProvider provider) { List<byte> list = new List<byte>(); byte[] array = new byte[1024]; int num; while (provider.AnythingToRead && (num = s.Read(array, 0, array.Length)) > 0) { byte[] array2 = new byte[num]; Array.Copy(array, 0, array2, 0, num); list.AddRange(array2); } return list.ToArray(); } internal static void Write(this Stream s, byte[] bytes) { s.Write(bytes, 0, bytes.Length); } internal static bool Bit(this byte b, int bit) { return (b & (1 << bit)) != 0; } internal static byte Bits(this byte b, int start, int end) { int num = 255 >> 8 - (end - start + 1); return (byte)((b >> start) & num); } public static bool IsControlOpcode(this WebSocketOpcode opcode) { if (opcode != WebSocketOpcode.Close && opcode != WebSocketOpcode.Ping) { return opcode == WebSocketOpcode.Pong; } return true; } } internal static class MiscUtils { public static T[] EmptyArray<T>() { return new T[0]; } } internal class NoCoverageAttribute : Attribute { } internal static class UriUtils { public static void ValidateUrlScheme(ref string url) { Uri uri = new Uri(url); if (uri.Scheme == "http") { url = $"ws://{uri.Host}:{uri.Port}{uri.PathAndQuery}"; return; } if (uri.Scheme == "https") { url = $"wss://{uri.Host}:{uri.Port}{uri.PathAndQuery}"; return; } string scheme = uri.Scheme; if (scheme == "ws" || scheme == "wss") { return; } throw new WebException("Invalid url protocol. Must be one of http, https, ws or wss"); } } } namespace WebSocketDotNet.Protocol { internal class WebSocketFragment { private const byte MaxSingleFragmentPayloadSize = 125; private const byte ShortLengthExtended16Bit = 126; private const byte ShortLengthExtended64Bit = 127; private static readonly Random MaskGenerator = new Random(); public bool IsFinal; public bool Reserved1; public bool Reserved2; public bool Reserved3; public WebSocketOpcode Opcode; public bool IsMasked; private byte _shortPayloadLength; private ulong _extendedPayloadLength; public byte[] Mask; private byte[] _rawPayload; public ulong PayloadLength { get { if (!UsesExtendedPayloadLength) { return _shortPayloadLength; } return _extendedPayloadLength; } } public byte[] Payload => _rawPayload; private bool UsesExtendedPayloadLength => _extendedPayloadLength != ulong.MaxValue; private WebSocketFragment() { Mask = new byte[4]; _rawPayload = MiscUtils.EmptyArray<byte>(); } public WebSocketFragment(bool final, WebSocketOpcode opcode, byte[] payload, bool mask) : this() { IsFinal = final; Opcode = opcode; _rawPayload = (byte[])payload.Clone(); ComputeOutgoingLength(); if (mask) { MaskPayload(); } } private void XorPayloadWithMask() { for (int i = 0; i < _rawPayload.Length; i++) { int num = i % 4; byte b = Mask[num]; _rawPayload[i] ^= b; } } private void UnmaskPayload() { XorPayloadWithMask(); IsMasked = false; Array.Clear(Mask, 0, 4); } private void MaskPayload() { MaskGenerator.NextBytes(Mask); XorPayloadWithMask(); IsMasked = true; } private void ReadLength(byte[] initialHeader, Stream stream) { byte b = initialHeader[1].Bits(0, 6); switch (b) { case 126: { if (stream.Read(initialHeader, 0, 2) != 2) { throw new IOException("Failed to read 2-byte extended length from stream"); } ref byte reference = ref initialHeader[0]; ref byte reference2 = ref initialHeader[1]; byte b2 = initialHeader[1]; byte b3 = initialHeader[0]; reference = b2; reference2 = b3; _extendedPayloadLength = BitConverter.ToUInt16(initialHeader, 0); break; } case 127: initialHeader = new byte[8]; if (stream.Read(initialHeader, 0, 8) != 8) { throw new IOException("Failed to read 8-byte extended length from stream"); } Array.Reverse((Array)initialHeader); _extendedPayloadLength = BitConverter.ToUInt64(initialHeader, 0); if (_extendedPayloadLength >> 63 != 0L) { throw new IOException("64-bit extended payload length has most significant bit set, which is not allowed"); } break; default: _shortPayloadLength = b; _extendedPayloadLength = ulong.MaxValue; break; } } private void ComputeOutgoingLength() { if (_rawPayload.Length <= 125) { _shortPayloadLength = (byte)_rawPayload.Length; _extendedPayloadLength = ulong.MaxValue; return; } if (_rawPayload.Length <= 65535) { _shortPayloadLength = 126; } else { _shortPayloadLength = 127; } _extendedPayloadLength = (ulong)_rawPayload.Length; } public static WebSocketFragment Read(Stream from) { byte[] array = new byte[2]; if (from.Read(array, 0, 2) != 2) { throw new IOException("Failed to read 2-byte header from stream"); } WebSocketFragment webSocketFragment = ParseTwoByteHeader(array); webSocketFragment.ReadLength(array, from); if (webSocketFragment.IsMasked && from.Read(webSocketFragment.Mask, 0, 4) != 4) { throw new IOException("Failed to read 4-byte mask from stream"); } if (webSocketFragment.PayloadLength > int.MaxValue) { throw new IOException($"Cannot read >2GiB payload (length in header was {webSocketFragment.PayloadLength} bytes)"); } webSocketFragment._rawPayload = new byte[(uint)webSocketFragment.PayloadLength]; if (from.Read(webSocketFragment._rawPayload, 0, (int)webSocketFragment.PayloadLength) != (int)webSocketFragment.PayloadLength) { throw new IOException("Failed to read payload from stream"); } if (webSocketFragment.IsMasked) { webSocketFragment.UnmaskPayload(); } return webSocketFragment; } private static WebSocketFragment ParseTwoByteHeader(byte[] buf) { return new WebSocketFragment { IsFinal = buf[0].Bit(7), Reserved1 = buf[0].Bit(6), Reserved2 = buf[0].Bit(5), Reserved3 = buf[0].Bit(4), Opcode = (WebSocketOpcode)buf[0].Bits(0, 3), IsMasked = buf[1].Bit(7) }; } public byte[] Serialize() { byte[] array; if (!UsesExtendedPayloadLength && !IsMasked) { array = new byte[2 + _rawPayload.Length]; WriteTwoByteHeader(array); Array.Copy(_rawPayload, 0, array, 2, _rawPayload.Length); } else if (!UsesExtendedPayloadLength && IsMasked) { array = new byte[6 + _rawPayload.Length]; WriteTwoByteHeader(array); Array.Copy(Mask, 0, array, 2, 4); Array.Copy(_rawPayload, 0, array, 6, _rawPayload.Length); } else { int num = ((_shortPayloadLength == 126) ? 2 : 8); int num2 = (IsMasked ? 4 : 0); array = new byte[2 + num + num2 + _rawPayload.Length]; WriteTwoByteHeader(array); if (num == 2) { array[2] = (byte)(_extendedPayloadLength >> 8); array[3] = (byte)_extendedPayloadLength; } else { byte[] bytes = BitConverter.GetBytes(_extendedPayloadLength); Array.Reverse((Array)bytes); Array.Copy(bytes, 0, array, 2, 8); } if (IsMasked) { Array.Copy(Mask, 0, array, 2 + num, 4); } Array.Copy(_rawPayload, 0, array, 2 + num + num2, _rawPayload.Length); } return array; } private void WriteTwoByteHeader(byte[] toWrite) { toWrite[0] = (byte)((uint)Opcode | (uint)(byte)(IsFinal ? 128u : 0u) | (byte)(Reserved1 ? 64u : 0u) | (byte)(Reserved2 ? 32u : 0u) | (byte)(Reserved3 ? 16u : 0u)); toWrite[1] = (byte)(_shortPayloadLength | (byte)(IsMasked ? 128u : 0u)); } } internal class WebSocketFrame { public WebSocketOpcode Opcode { get; set; } public byte[] Payload { get; set; } public WebSocketFrame(WebSocketOpcode opcode, byte[] payload) { Opcode = opcode; Payload = payload; } internal List<WebSocketFragment> ToFragments(MessageChunkingMode configurationMessageChunkingMode) { List<WebSocketFragment> list = new List<WebSocketFragment>(); int num = configurationMessageChunkingMode switch { MessageChunkingMode.AlwaysUseExtendedLength => int.MaxValue, MessageChunkingMode.NeverUseExtendedLength => 127, MessageChunkingMode.LimitTo16BitExtendedLength => 65535, _ => throw new ArgumentOutOfRangeException("configurationMessageChunkingMode", configurationMessageChunkingMode, null), }; if (Payload.Length < num) { list.Add(new WebSocketFragment(final: true, Opcode, Payload, mask: true)); } else { int num2 = 0; int num3 = Payload.Length; WebSocketOpcode opcode = Opcode; while (num3 > 0) { int num4 = Math.Min(num3, num); byte[] array = new byte[num4]; Array.Copy(Payload, num2, array, 0, num4); num3 -= num4; num2 += num4; WebSocketFragment item = new WebSocketFragment(num3 == 0, opcode, array, mask: true); list.Add(item); opcode = WebSocketOpcode.Continuation; } } return list; } internal static WebSocketFrame FromFragments(List<WebSocketFragment> fragments) { List<byte> list = new List<byte>(); foreach (WebSocketFragment fragment in fragments) { list.AddRange(fragment.Payload); } return new WebSocketFrame(fragments[0].Opcode, list.ToArray()); } internal static WebSocketFrame FromFragment(WebSocketFragment fragment) { return new WebSocketFrame(fragment.Opcode, fragment.Payload); } } public enum WebSocketOpcode : byte { Continuation, Text, Binary, ReservedData3, ReservedData4, ReservedData5, ReservedData6, ReservedData7, Close, Ping, Pong, ReservedControlB, ReservedControlC, ReservedControlD, ReservedControlE } } namespace WebSocketDotNet.Messages { public class WebSocketBinaryMessage : WebSocketMessage { public byte[] Data { get; private set; } protected override WebSocketOpcode OpcodeToSend => WebSocketOpcode.Binary; public WebSocketBinaryMessage(byte[] data) { Data = data; } internal WebSocketBinaryMessage() { Data = MiscUtils.EmptyArray<byte>(); } protected override void ReadData(byte[] payload) { Data = payload; } protected override byte[] GetPayload() { return Data; } } public class WebSocketCloseMessage : WebSocketMessage { public WebSocketCloseCode CloseReason { get; private set; } public string? CloseReasonText { get; private set; } protected override WebSocketOpcode OpcodeToSend => WebSocketOpcode.Close; public WebSocketCloseMessage(WebSocketCloseCode closeReason, string? closeReasonText = null) { CloseReason = closeReason; CloseReasonText = closeReasonText; } internal WebSocketCloseMessage() { CloseReason = WebSocketCloseCode.NoStatus; } protected override void ReadData(byte[] payload) { if (payload.Length != 0) { if (payload.Length < 2) { throw new WebSocketProtocolException($"Close message payload is too short. Expected at least 2 bytes, got {payload.Length}"); } CloseReason = (WebSocketCloseCode)((payload[0] << 8) | payload[1]); if (payload.Length > 2) { CloseReasonText = Encoding.UTF8.GetString(payload, 2, payload.Length - 2); } } } protected override byte[] GetPayload() { if (CloseReasonText == null) { if (CloseReason != 0) { return new byte[2] { (byte)((int)CloseReason >> 8), (byte)(CloseReason & (WebSocketCloseCode)255) }; } return MiscUtils.EmptyArray<byte>(); } byte[] array = new byte[Encoding.UTF8.GetByteCount(CloseReasonText) + 2]; array[0] = (byte)((int)CloseReason >> 8); array[1] = (byte)(CloseReason & (WebSocketCloseCode)255); Encoding.UTF8.GetBytes(CloseReasonText, 0, CloseReasonText.Length, array, 2); return array; } } public abstract class WebSocketMessage { protected abstract WebSocketOpcode OpcodeToSend { get; } protected abstract void ReadData(byte[] payload); protected abstract byte[] GetPayload(); internal WebSocketFrame ToFrame() { return new WebSocketFrame(OpcodeToSend, GetPayload()); } internal static WebSocketMessage FromFrame(WebSocketFrame frame) { WebSocketMessage webSocketMessage; switch (frame.Opcode) { case WebSocketOpcode.Continuation: throw new Exception("How did we get here? Received continuation frame?"); case WebSocketOpcode.Text: webSocketMessage = new WebSocketTextMessage(); break; case WebSocketOpcode.Binary: webSocketMessage = new WebSocketBinaryMessage(); break; case WebSocketOpcode.Close: webSocketMessage = new WebSocketCloseMessage(); break; case WebSocketOpcode.Ping: webSocketMessage = new WebSocketPingMessage(); break; case WebSocketOpcode.Pong: webSocketMessage = new WebSocketPongMessage(); break; case WebSocketOpcode.ReservedData3: case WebSocketOpcode.ReservedData4: case WebSocketOpcode.ReservedData5: case WebSocketOpcode.ReservedData6: case WebSocketOpcode.ReservedData7: case WebSocketOpcode.ReservedControlB: case WebSocketOpcode.ReservedControlC: case WebSocketOpcode.ReservedControlD: case WebSocketOpcode.ReservedControlE: throw new WebSocketProtocolException($"Received frame with reserved opcode {frame.Opcode}"); default: throw new ArgumentOutOfRangeException("Opcode", "Unknown opcode"); } webSocketMessage.ReadData(frame.Payload); return webSocketMessage; } } public class WebSocketPingMessage : WebSocketMessage { public byte[] PingPayload { get; private set; } protected override WebSocketOpcode OpcodeToSend => WebSocketOpcode.Ping; public WebSocketPingMessage() : this(MiscUtils.EmptyArray<byte>()) { } public WebSocketPingMessage(string payload) : this(Encoding.UTF8.GetBytes(payload)) { } public WebSocketPingMessage(byte[] payload) { if (payload.Length > 125) { throw new ArgumentException("Ping payload must be at most 125 bytes", "payload"); } PingPayload = payload; } protected override void ReadData(byte[] payload) { PingPayload = payload; } protected override byte[] GetPayload() { return PingPayload; } } public class WebSocketPongMessage : WebSocketMessage { public byte[] PongPayload { get; private set; } protected override WebSocketOpcode OpcodeToSend => WebSocketOpcode.Pong; public WebSocketPongMessage(byte[] pongPayload) { PongPayload = pongPayload; } internal WebSocketPongMessage() { PongPayload = MiscUtils.EmptyArray<byte>(); } protected override void ReadData(byte[] payload) { PongPayload = payload; } protected override byte[] GetPayload() { return PongPayload; } } public class WebSocketTextMessage : WebSocketMessage { public string Text { get; private set; } protected override WebSocketOpcode OpcodeToSend => WebSocketOpcode.Text; public WebSocketTextMessage(string text) { Text = text; } internal WebSocketTextMessage() { Text = "Incoming message not decoded yet."; } protected override void ReadData(byte[] payload) { Text = Encoding.UTF8.GetString(payload); } protected override byte[] GetPayload() { return Encoding.UTF8.GetBytes(Text); } } } namespace WebSocketDotNet.Http { internal class EncryptedNetworkStreamProvider : RawTcpNetworkStreamProvider { public EncryptedNetworkStreamProvider(string host, int port) : base(host, port) { } public override Stream GetStream() { SslStream sslStream = new SslStream(base.GetStream(), leaveInnerStreamOpen: false); sslStream.AuthenticateAsClient(base.Host); return sslStream; } } internal class HttpHandler { private Uri _uri; private NetworkStreamProvider _underlyingClient; private Stream? _stream; public bool AnyDataAvailable => _underlyingClient.AnythingToRead; public Stream GetOrOpenStream() { return _stream ?? (_stream = _underlyingClient.GetStream()); } public void CloseAnyExistingStream() { _stream?.Close(); _stream = null; } public HttpHandler(Uri uri) { _uri = uri; _underlyingClient = ((_uri.Scheme == "wss") ? new EncryptedNetworkStreamProvider(uri.DnsSafeHost, uri.Port) : new RawTcpNetworkStreamProvider(uri.DnsSafeHost, uri.Port)); } public HttpResponse SendRequestWithHeaders(Dictionary<string, string> headers) { AddRequiredHeaders(headers); Stream orOpenStream = GetOrOpenStream(); Extensions.Write(orOpenStream, GetRequestBytes(headers)); _underlyingClient.WaitForData(); return HttpResponse.Parse(orOpenStream.ReadToEnd(_underlyingClient)); } private byte[] GetRequestBytes(Dictionary<string, string> headers) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(BuildProtocolLine()).Append("\r\n"); foreach (KeyValuePair<string, string> header in headers) { stringBuilder.Append(BuildHeaderLine(header)).Append("\r\n"); } stringBuilder.Append("\r\n"); string s = stringBuilder.ToString(); return Encoding.UTF8.GetBytes(s); } private void AddRequiredHeaders(Dictionary<string, string> headers) { if (!headers.ContainsKey("User-Agent")) { headers.Add("User-Agent", $"{AssemblyInfo.Name}/{AssemblyInfo.Version}"); } headers["Host"] = _uri.Host; } private string BuildProtocolLine() { return "GET " + _uri.PathAndQuery + " HTTP/1.1"; } private string BuildHeaderLine(KeyValuePair<string, string> header) { if (!header.Key.Contains(":")) { return header.Key + ": " + header.Value; } throw new Exception("Invalid HTTP Header " + header.Key); } } internal class HttpResponse { public HttpStatusCode StatusCode { get; } public string StatusDescription { get; } public Dictionary<string, string> Headers { get; } private HttpResponse(HttpStatusCode statusCode, string statusDescription, Dictionary<string, string> headers) { StatusCode = statusCode; StatusDescription = statusDescription; Headers = headers; } public static HttpResponse Parse(byte[] resultBytes) { string @string = Encoding.UTF8.GetString(resultBytes); if (!@string.StartsWith("HTTP/1.1")) { throw new Exception("Invalid response from server - not a HTTP/1.1 response"); } string[] array = @string.Split(new string[1] { "\r\n" }, StringSplitOptions.None); string text = array[0]; string text2 = text.Substring(9, text.Length - 9); int num = text2.IndexOf(' '); int statusCode = int.Parse(text2.Substring(0, num)); text = text2; int num2 = num + 1; string statusDescription = text.Substring(num2, text.Length - num2); Dictionary<string, string> dictionary = new Dictionary<string, string>(); for (int i = 1; i < array.Length; i++) { string text3 = array[i]; if (text3.Length == 0) { break; } int num3 = text3.IndexOf(':'); string key = text3.Substring(0, num3); text = text3; num2 = num3 + 2; string value = text.Substring(num2, text.Length - num2); dictionary.Add(key, value); } return new HttpResponse((HttpStatusCode)statusCode, statusDescription, dictionary); } } internal abstract class NetworkStreamProvider { private const int WaitIntervalMs = 10; protected string Host { get; } protected int Port { get; } public abstract bool AnythingToRead { get; } protected NetworkStreamProvider(string host, int port) { Host = host; Port = port; } public abstract Stream GetStream(); public void WaitForData(int timeout = 5000) { int num = 0; while (!AnythingToRead) { if ((num += 10) > timeout) { throw new Exception("Timeout waiting for response to initial handshake"); } Thread.Sleep(10); } } } internal class RawTcpNetworkStreamProvider : NetworkStreamProvider { private TcpClient? _client; private NetworkStream? _lastStream; public override bool AnythingToRead => _lastStream?.DataAvailable ?? false; public virtual bool IsClosed => false; public RawTcpNetworkStreamProvider(string host, int port) : base(host, port) { } private void ResetClient() { _client?.Close(); _client = new TcpClient(); _lastStream = null; } public override Stream GetStream() { ResetClient(); _client.Connect(base.Host, base.Port); return _lastStream = _client.GetStream(); } } }
BepInEx/plugins/BepInEx-BepInEx_MLLoader/Demeo.dll.old
Decompiled 8 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using Boardgame.Modding; using HarmonyLib; using MelonLoader; using MelonLoader.Modules; using Prototyping; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("MelonLoader")] [assembly: AssemblyDescription("MelonLoader")] [assembly: AssemblyCompany("discord.gg/2Wn3N2P")] [assembly: AssemblyProduct("MelonLoader")] [assembly: AssemblyCopyright("Created by Lava Gang")] [assembly: AssemblyTrademark("discord.gg/2Wn3N2P")] [assembly: Guid("FEAA0159-5871-4419-9827-3CF5CAD69A53")] [assembly: AssemblyFileVersion("0.5.7")] [assembly: PatchShield] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.5.7.0")] [module: UnverifiableCode] namespace MelonLoader { [AttributeUsage(AttributeTargets.Assembly)] public class Demeo_LobbyRequirement : Attribute { } } namespace MelonLoader.CompatibilityLayers { internal static class Extensions { private static FieldInfo name_field; private static MethodInfo name_get_method; private static MethodInfo name_set_method; private static FieldInfo version_field; private static MethodInfo version_method; private static FieldInfo author_field; private static MethodInfo author_method; private static FieldInfo description_field; private static MethodInfo description_method; private static FieldInfo isNetworkCompatible_field; private static MethodInfo isNetworkCompatible_method; internal static string GetName(this ModInformation info) { if (MelonUtils.IsGameIl2Cpp()) { if (name_get_method == null) { name_get_method = AccessTools.Property(typeof(ModInformation), "name").GetGetMethod(); } if (name_get_method != null) { return (string)name_get_method.Invoke(info, new object[0]); } } else { if (name_field == null) { name_field = AccessTools.Field(typeof(ModInformation), "name"); } if (name_field != null) { return (string)name_field.GetValue(info); } } return null; } internal static void SetName(this ModInformation info, string name) { if (MelonUtils.IsGameIl2Cpp()) { if (name_set_method == null) { name_set_method = AccessTools.Property(typeof(ModInformation), "name").GetSetMethod(); } if (name_set_method != null) { name_set_method.Invoke(info, new object[1] { name }); } } else { if (name_field == null) { name_field = AccessTools.Field(typeof(ModInformation), "name"); } if (name_field != null) { name_field.SetValue(info, name); } } } internal static string GetVersion(this ModInformation info) { if (MelonUtils.IsGameIl2Cpp()) { if (version_method == null) { version_method = AccessTools.Property(typeof(ModInformation), "version").GetGetMethod(); } if (version_method != null) { return (string)version_method.Invoke(info, new object[0]); } } else { if (version_field == null) { version_field = AccessTools.Field(typeof(ModInformation), "version"); } if (version_field != null) { return (string)version_field.GetValue(info); } } return null; } internal static void SetVersion(this ModInformation info, string version) { if (MelonUtils.IsGameIl2Cpp()) { if (version_method == null) { version_method = AccessTools.Property(typeof(ModInformation), "version").GetSetMethod(); } if (version_method != null) { version_method.Invoke(info, new object[1] { version }); } } else { if (version_field == null) { version_field = AccessTools.Field(typeof(ModInformation), "version"); } if (version_field != null) { version_field.SetValue(info, version); } } } internal static string GetAuthor(this ModInformation info) { if (MelonUtils.IsGameIl2Cpp()) { if (author_method == null) { author_method = AccessTools.Property(typeof(ModInformation), "author").GetGetMethod(); } if (author_method != null) { return (string)author_method.Invoke(info, new object[0]); } } else { if (author_field == null) { author_field = AccessTools.Field(typeof(ModInformation), "author"); } if (author_field != null) { return (string)author_field.GetValue(info); } } return null; } internal static void SetAuthor(this ModInformation info, string author) { if (MelonUtils.IsGameIl2Cpp()) { if (author_method == null) { author_method = AccessTools.Property(typeof(ModInformation), "author").GetSetMethod(); } if (author_method != null) { author_method.Invoke(info, new object[1] { author }); } } else { if (author_field == null) { author_field = AccessTools.Field(typeof(ModInformation), "author"); } if (author_field != null) { author_field.SetValue(info, author); } } } internal static void SetDescription(this ModInformation info, string description) { if (MelonUtils.IsGameIl2Cpp()) { if (description_method == null) { description_method = AccessTools.Property(typeof(ModInformation), "description").GetSetMethod(); } if (description_method != null) { description_method.Invoke(info, new object[1] { description }); } } else { if (description_field == null) { description_field = AccessTools.Field(typeof(ModInformation), "description"); } if (description_field != null) { description_field.SetValue(info, description); } } } internal static void SetIsNetworkCompatible(this ModInformation info, bool isNetworkCompatible) { if (MelonUtils.IsGameIl2Cpp()) { if (isNetworkCompatible_method == null) { isNetworkCompatible_method = AccessTools.Property(typeof(ModInformation), "isNetworkCompatible").GetSetMethod(); } if (isNetworkCompatible_method != null) { isNetworkCompatible_method.Invoke(info, new object[1] { isNetworkCompatible }); } } else { if (isNetworkCompatible_field == null) { isNetworkCompatible_field = AccessTools.Field(typeof(ModInformation), "isNetworkCompatible"); } if (isNetworkCompatible_field != null) { isNetworkCompatible_field.SetValue(info, isNetworkCompatible); } } } } internal class Demeo_Module : MelonModule { private static Dictionary<MelonBase, ModInformation> ModInformation = new Dictionary<MelonBase, ModInformation>(); public override void OnInitialize() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown ((MelonEventBase<LemonAction>)(object)MelonEvents.OnApplicationStart).Subscribe(new LemonAction(OnPreAppStart), int.MaxValue, false); ((MelonEventBase<LemonAction<MelonBase>>)(object)MelonBase.OnMelonRegistered).Subscribe((LemonAction<MelonBase>)ParseMelon<MelonBase>, int.MaxValue, false); ((MelonEventBase<LemonAction<MelonBase>>)(object)MelonBase.OnMelonUnregistered).Subscribe((LemonAction<MelonBase>)OnUnregister, int.MaxValue, false); } private static void OnPreAppStart() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) new Harmony("DemeoIntegration").Patch((MethodBase)Assembly.Load("Assembly-CSharp").GetType("Prototyping.RG").GetMethod("Initialize", BindingFlags.Static | BindingFlags.Public), MelonUtils.ToNewHarmonyMethod(typeof(Demeo_Module).GetMethod("InitFix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); foreach (MelonPlugin registeredMelon in MelonTypeBase<MelonPlugin>.RegisteredMelons) { ParseMelon<MelonPlugin>(registeredMelon); } foreach (MelonMod registeredMelon2 in MelonTypeBase<MelonMod>.RegisteredMelons) { ParseMelon<MelonMod>(registeredMelon2); } } private static void OnUnregister(MelonBase melon) { if (melon != null && ModInformation.ContainsKey(melon)) { ModInformation.Remove(melon); if (ModdingAPI.ExternallyInstalledMods == null) { ModdingAPI.ExternallyInstalledMods = new List<ModInformation>(); } else { ModdingAPI.ExternallyInstalledMods.Remove(ModInformation[melon]); } } } private static void ParseMelon<T>(T melon) where T : MelonBase { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown if (melon != null && !ModInformation.ContainsKey((MelonBase)(object)melon)) { ModInformation val = new ModInformation(); val.SetName(((MelonBase)melon).Info.Name); val.SetVersion(((MelonBase)melon).Info.Version); val.SetAuthor(((MelonBase)melon).Info.Author); val.SetDescription(((MelonBase)melon).Info.DownloadLink); val.SetIsNetworkCompatible(MelonUtils.PullAttributeFromAssembly<Demeo_LobbyRequirement>(((MelonBase)melon).MelonAssembly.Assembly, false) == null); ModInformation.Add((MelonBase)(object)melon, val); if (ModdingAPI.ExternallyInstalledMods == null) { ModdingAPI.ExternallyInstalledMods = new List<ModInformation>(); } ModdingAPI.ExternallyInstalledMods.Add(val); } } private static bool InitFix() { if (MotherbrainGlobalVars.IsRunningOnDesktop) { RG.SetVrMode(false); } else { RG.SetVrMode(RG.XRDeviceIsPresent()); } return true; } } }
BepInEx/plugins/BepInEx-BepInEx_MLLoader/IPA.dll.old
Decompiled 8 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using IllusionInjector; using IllusionPlugin; using MelonLoader; using MelonLoader.Modules; using MelonLoader.MonoInternals; using MelonLoader.Preferences; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("MelonLoader")] [assembly: AssemblyDescription("MelonLoader")] [assembly: AssemblyCompany("discord.gg/2Wn3N2P")] [assembly: AssemblyProduct("MelonLoader")] [assembly: AssemblyCopyright("Created by Lava Gang")] [assembly: AssemblyTrademark("discord.gg/2Wn3N2P")] [assembly: Guid("5100810A-9842-4073-9658-E5841FDF9D73")] [assembly: AssemblyFileVersion("0.5.7")] [assembly: PatchShield] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.5.7.0")] [module: UnverifiableCode] namespace IllusionInjector { public static class PluginManager { public class AppInfo { public static string StartupPath => MelonUtils.GameDirectory; } internal static List<IPlugin> _Plugins = new List<IPlugin>(); public static IEnumerable<IPlugin> Plugins => _Plugins; } } namespace IllusionPlugin { public interface IEnhancedPlugin : IPlugin { string[] Filter { get; } void OnLateUpdate(); } public interface IPlugin { string Name { get; } string Version { get; } void OnApplicationStart(); void OnApplicationQuit(); void OnLevelWasLoaded(int level); void OnLevelWasInitialized(int level); void OnUpdate(); void OnFixedUpdate(); } public static class ModPrefs { public static string GetString(string section, string name, string defaultValue = "", bool autoSave = false) { MelonPreferences_Category val = MelonPreferences.GetCategory(section); if (val == null) { val = MelonPreferences.CreateCategory(section); } MelonPreferences_Entry<string> val2 = val.GetEntry<string>(name); if (val2 == null) { val2 = val.CreateEntry<string>(name, defaultValue, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); } return val2.Value; } public static int GetInt(string section, string name, int defaultValue = 0, bool autoSave = false) { MelonPreferences_Category val = MelonPreferences.GetCategory(section); if (val == null) { val = MelonPreferences.CreateCategory(section); } MelonPreferences_Entry<int> val2 = val.GetEntry<int>(name); if (val2 == null) { val2 = val.CreateEntry<int>(name, defaultValue, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); } return val2.Value; } public static float GetFloat(string section, string name, float defaultValue = 0f, bool autoSave = false) { MelonPreferences_Category val = MelonPreferences.GetCategory(section); if (val == null) { val = MelonPreferences.CreateCategory(section); } MelonPreferences_Entry<float> val2 = val.GetEntry<float>(name); if (val2 == null) { val2 = val.CreateEntry<float>(name, defaultValue, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); } return val2.Value; } public static bool GetBool(string section, string name, bool defaultValue = false, bool autoSave = false) { MelonPreferences_Category val = MelonPreferences.GetCategory(section); if (val == null) { val = MelonPreferences.CreateCategory(section); } MelonPreferences_Entry<bool> val2 = val.GetEntry<bool>(name); if (val2 == null) { val2 = val.CreateEntry<bool>(name, defaultValue, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); } return val2.Value; } public static bool HasKey(string section, string name) { return MelonPreferences.HasEntry(section, name); } public static void SetFloat(string section, string name, float value) { MelonPreferences_Category val = MelonPreferences.GetCategory(section); if (val == null) { val = MelonPreferences.CreateCategory(section); } MelonPreferences_Entry<float> val2 = val.GetEntry<float>(name); if (val2 == null) { val2 = val.CreateEntry<float>(name, value, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); } val2.Value = value; } public static void SetInt(string section, string name, int value) { MelonPreferences_Category val = MelonPreferences.GetCategory(section); if (val == null) { val = MelonPreferences.CreateCategory(section); } MelonPreferences_Entry<int> val2 = val.GetEntry<int>(name); if (val2 == null) { val2 = val.CreateEntry<int>(name, value, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); } val2.Value = value; } public static void SetString(string section, string name, string value) { MelonPreferences_Category val = MelonPreferences.GetCategory(section); if (val == null) { val = MelonPreferences.CreateCategory(section); } MelonPreferences_Entry<string> val2 = val.GetEntry<string>(name); if (val2 == null) { val2 = val.CreateEntry<string>(name, value, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); } val2.Value = value; } public static void SetBool(string section, string name, bool value) { MelonPreferences_Category val = MelonPreferences.GetCategory(section); if (val == null) { val = MelonPreferences.CreateCategory(section); } MelonPreferences_Entry<bool> val2 = val.GetEntry<bool>(name); if (val2 == null) { val2 = val.CreateEntry<bool>(name, value, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); } val2.Value = value; } } } namespace MelonLoader.CompatibilityLayers { internal class IPAPluginWrapper : MelonMod { internal IPlugin pluginInstance; public override void OnInitializeMelon() { pluginInstance.OnApplicationStart(); } public override void OnDeinitializeMelon() { pluginInstance.OnApplicationQuit(); } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { pluginInstance.OnLevelWasLoaded(buildIndex); } public override void OnSceneWasInitialized(int buildIndex, string sceneName) { pluginInstance.OnLevelWasInitialized(buildIndex); } public override void OnUpdate() { pluginInstance.OnUpdate(); } public override void OnFixedUpdate() { pluginInstance.OnFixedUpdate(); } public override void OnLateUpdate() { if (pluginInstance is IEnhancedPlugin enhancedPlugin) { enhancedPlugin.OnLateUpdate(); } } } internal class IPA_Module : MelonModule { public override void OnInitialize() { string[] obj = new string[2] { "IllusionPlugin", "IllusionInjector" }; Assembly assembly = typeof(IPA_Module).Assembly; string[] array = obj; for (int i = 0; i < array.Length; i++) { MonoResolveManager.GetAssemblyResolveInfo(array[i]).Override = assembly; } MelonAssembly.CustomMelonResolvers += Resolve; } private ResolvedMelons Resolve(Assembly asm) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown IEnumerable<Type> validTypes = MelonUtils.GetValidTypes(asm, (LemonFunc<Type, bool>)delegate(Type x) { Type[] interfaces = x.GetInterfaces(); return interfaces != null && interfaces.Any() && interfaces.Contains(typeof(IPlugin)); }); if (validTypes != null && validTypes.Any()) { List<MelonBase> list = new List<MelonBase>(); List<RottenMelon> list2 = new List<RottenMelon>(); foreach (Type item in validTypes) { RottenMelon rottenMelon; MelonBase val = LoadPlugin(asm, item, out rottenMelon); if (val != null) { list.Add(val); } else { list2.Add(rottenMelon); } } return new ResolvedMelons(list.ToArray(), list2.ToArray()); } return new ResolvedMelons((MelonBase[])null, (RottenMelon[])null); } private MelonBase LoadPlugin(Assembly asm, Type pluginType, out RottenMelon rottenMelon) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown rottenMelon = null; IPlugin plugin; try { plugin = Activator.CreateInstance(pluginType) as IPlugin; } catch (Exception ex) { rottenMelon = new RottenMelon(pluginType, "Failed to create a new instance of the IPA Plugin.", ex); return null; } MelonProcessAttribute[] array = null; if (plugin is IEnhancedPlugin enhancedPlugin) { array = enhancedPlugin.Filter?.Select((Func<string, MelonProcessAttribute>)((string x) => new MelonProcessAttribute(x))).ToArray(); } string text = plugin.Name; if (string.IsNullOrEmpty(text)) { text = pluginType.FullName; } string text2 = plugin.Version; if (string.IsNullOrEmpty(text2)) { text2 = asm.GetName().Version.ToString(); } if (string.IsNullOrEmpty(text2) || text2.Equals("0.0.0.0")) { text2 = "1.0.0.0"; } IPAPluginWrapper iPAPluginWrapper = MelonBase.CreateWrapper<IPAPluginWrapper>(text, (string)null, text2, (MelonGameAttribute[])null, array, 0, (ConsoleColor?)null, (ConsoleColor?)null, (string)null); iPAPluginWrapper.pluginInstance = plugin; PluginManager._Plugins.Add(plugin); return (MelonBase)(object)iPAPluginWrapper; } } }
BepInEx/plugins/BepInEx-BepInEx_MLLoader/MelonStartScreen.dll.old
Decompiled 8 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using AssetRipper.VersionUtilities; using Il2CppSystem; using MelonLoader; using MelonLoader.InternalUtils; using MelonLoader.MelonStartScreen.NativeUtils; using MelonLoader.MelonStartScreen.Properties; using MelonLoader.MelonStartScreen.UI; using MelonLoader.MelonStartScreen.UI.Objects; using MelonLoader.MelonStartScreen.UI.Themes; using MelonLoader.Modules; using MelonLoader.NativeUtils; using MelonLoader.NativeUtils.PEParser; using MelonLoader.Preferences; using MelonUnityEngine; using MelonUnityEngine.CoreModule; using MelonUnityEngine.Rendering; using Tomlet; using Tomlet.Attributes; using Tomlet.Models; using UnhollowerMini; using UnityPlayer; using Windows; using mgGif; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("MelonLoader")] [assembly: AssemblyDescription("MelonLoader")] [assembly: AssemblyCompany("discord.gg/2Wn3N2P")] [assembly: AssemblyProduct("MelonLoader")] [assembly: AssemblyCopyright("Created by Lava Gang")] [assembly: AssemblyTrademark("discord.gg/2Wn3N2P")] [assembly: Guid("762d7545-6f6b-441a-b040-49cc31a1713b")] [assembly: AssemblyFileVersion("0.5.7")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.5.7.0")] [module: UnverifiableCode] namespace Windows { [StructLayout(LayoutKind.Sequential)] internal class DropFile { private uint pFiles = 14u; public Point pt; public bool fNC; private bool fWide = true; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 300)] public string file = ""; } internal struct Msg { public IntPtr hwnd; public WindowMessage message; public IntPtr wParam; public IntPtr lParam; public uint time; public Point pt; } internal struct Point { public int x; public int y; } internal static class User32 { public delegate void TimerProc(IntPtr hWnd, uint uMsg, IntPtr nIDEvent, uint dwTime); [DllImport("user32.dll")] public static extern bool PeekMessage(out Msg lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg); [DllImport("user32.dll")] public static extern bool TranslateMessage([In] ref Msg lpMsg); [DllImport("user32.dll")] public static extern IntPtr DispatchMessage([In] ref Msg lpmsg); [DllImport("user32.dll")] public static extern IntPtr GetMessageExtraInfo(); [DllImport("user32.dll", ExactSpelling = true)] public static extern IntPtr SetTimer(IntPtr hWnd, IntPtr nIDEvent, uint uElapse, TimerProc lpTimerFunc); [DllImport("user32.dll", ExactSpelling = true)] public static extern bool KillTimer(IntPtr hWnd, IntPtr uIDEvent); [DllImport("user32.dll")] public static extern IntPtr SetClipboardData(uint uFormat, ref DropFile hMem); } internal enum WindowMessage : uint { NULL = 0u, CREATE = 1u, DESTROY = 2u, MOVE = 3u, SIZE = 5u, ACTIVATE = 6u, SETFOCUS = 7u, KILLFOCUS = 8u, ENABLE = 10u, SETREDRAW = 11u, SETTEXT = 12u, GETTEXT = 13u, GETTEXTLENGTH = 14u, PAINT = 15u, CLOSE = 16u, QUERYENDSESSION = 17u, QUERYOPEN = 19u, ENDSESSION = 22u, QUIT = 18u, ERASEBKGND = 20u, SYSCOLORCHANGE = 21u, SHOWWINDOW = 24u, WININICHANGE = 26u, SETTINGCHANGE = 26u, DEVMODECHANGE = 27u, ACTIVATEAPP = 28u, FONTCHANGE = 29u, TIMECHANGE = 30u, CANCELMODE = 31u, SETCURSOR = 32u, MOUSEACTIVATE = 33u, CHILDACTIVATE = 34u, QUEUESYNC = 35u, GETMINMAXINFO = 36u, PAINTICON = 38u, ICONERASEBKGND = 39u, NEXTDLGCTL = 40u, SPOOLERSTATUS = 42u, DRAWITEM = 43u, MEASUREITEM = 44u, DELETEITEM = 45u, VKEYTOITEM = 46u, CHARTOITEM = 47u, SETFONT = 48u, GETFONT = 49u, SETHOTKEY = 50u, GETHOTKEY = 51u, QUERYDRAGICON = 55u, COMPAREITEM = 57u, GETOBJECT = 61u, COMPACTING = 65u, [Obsolete] COMMNOTIFY = 68u, WINDOWPOSCHANGING = 70u, WINDOWPOSCHANGED = 71u, [Obsolete] POWER = 72u, COPYDATA = 74u, CANCELJOURNAL = 75u, NOTIFY = 78u, INPUTLANGCHANGEREQUEST = 80u, INPUTLANGCHANGE = 81u, TCARD = 82u, HELP = 83u, USERCHANGED = 84u, NOTIFYFORMAT = 85u, CONTEXTMENU = 123u, STYLECHANGING = 124u, STYLECHANGED = 125u, DISPLAYCHANGE = 126u, GETICON = 127u, SETICON = 128u, NCCREATE = 129u, NCDESTROY = 130u, NCCALCSIZE = 131u, NCHITTEST = 132u, NCPAINT = 133u, NCACTIVATE = 134u, GETDLGCODE = 135u, SYNCPAINT = 136u, NCMOUSEMOVE = 160u, NCLBUTTONDOWN = 161u, NCLBUTTONUP = 162u, NCLBUTTONDBLCLK = 163u, NCRBUTTONDOWN = 164u, NCRBUTTONUP = 165u, NCRBUTTONDBLCLK = 166u, NCMBUTTONDOWN = 167u, NCMBUTTONUP = 168u, NCMBUTTONDBLCLK = 169u, NCXBUTTONDOWN = 171u, NCXBUTTONUP = 172u, NCXBUTTONDBLCLK = 173u, INPUT_DEVICE_CHANGE = 254u, INPUT = 255u, KEYFIRST = 256u, KEYDOWN = 256u, KEYUP = 257u, CHAR = 258u, DEADCHAR = 259u, SYSKEYDOWN = 260u, SYSKEYUP = 261u, SYSCHAR = 262u, SYSDEADCHAR = 263u, UNICHAR = 265u, KEYLAST = 264u, IME_STARTCOMPOSITION = 269u, IME_ENDCOMPOSITION = 270u, IME_COMPOSITION = 271u, IME_KEYLAST = 271u, INITDIALOG = 272u, COMMAND = 273u, SYSCOMMAND = 274u, TIMER = 275u, HSCROLL = 276u, VSCROLL = 277u, INITMENU = 278u, INITMENUPOPUP = 279u, MENUSELECT = 287u, MENUCHAR = 288u, ENTERIDLE = 289u, MENURBUTTONUP = 290u, MENUDRAG = 291u, MENUGETOBJECT = 292u, UNINITMENUPOPUP = 293u, MENUCOMMAND = 294u, CHANGEUISTATE = 295u, UPDATEUISTATE = 296u, QUERYUISTATE = 297u, CTLCOLORMSGBOX = 306u, CTLCOLOREDIT = 307u, CTLCOLORLISTBOX = 308u, CTLCOLORBTN = 309u, CTLCOLORDLG = 310u, CTLCOLORSCROLLBAR = 311u, CTLCOLORSTATIC = 312u, MOUSEFIRST = 512u, MOUSEMOVE = 512u, LBUTTONDOWN = 513u, LBUTTONUP = 514u, LBUTTONDBLCLK = 515u, RBUTTONDOWN = 516u, RBUTTONUP = 517u, RBUTTONDBLCLK = 518u, MBUTTONDOWN = 519u, MBUTTONUP = 520u, MBUTTONDBLCLK = 521u, MOUSEWHEEL = 522u, XBUTTONDOWN = 523u, XBUTTONUP = 524u, XBUTTONDBLCLK = 525u, MOUSEHWHEEL = 526u, MOUSELAST = 526u, PARENTNOTIFY = 528u, ENTERMENULOOP = 529u, EXITMENULOOP = 530u, NEXTMENU = 531u, SIZING = 532u, CAPTURECHANGED = 533u, MOVING = 534u, POWERBROADCAST = 536u, DEVICECHANGE = 537u, MDICREATE = 544u, MDIDESTROY = 545u, MDIACTIVATE = 546u, MDIRESTORE = 547u, MDINEXT = 548u, MDIMAXIMIZE = 549u, MDITILE = 550u, MDICASCADE = 551u, MDIICONARRANGE = 552u, MDIGETACTIVE = 553u, MDISETMENU = 560u, ENTERSIZEMOVE = 561u, EXITSIZEMOVE = 562u, DROPFILES = 563u, MDIREFRESHMENU = 564u, IME_SETCONTEXT = 641u, IME_NOTIFY = 642u, IME_CONTROL = 643u, IME_COMPOSITIONFULL = 644u, IME_SELECT = 645u, IME_CHAR = 646u, IME_REQUEST = 648u, IME_KEYDOWN = 656u, IME_KEYUP = 657u, MOUSEHOVER = 673u, MOUSELEAVE = 675u, NCMOUSEHOVER = 672u, NCMOUSELEAVE = 674u, WTSSESSION_CHANGE = 689u, TABLET_FIRST = 704u, TABLET_LAST = 735u, CUT = 768u, COPY = 769u, PASTE = 770u, CLEAR = 771u, UNDO = 772u, RENDERFORMAT = 773u, RENDERALLFORMATS = 774u, DESTROYCLIPBOARD = 775u, DRAWCLIPBOARD = 776u, PAINTCLIPBOARD = 777u, VSCROLLCLIPBOARD = 778u, SIZECLIPBOARD = 779u, ASKCBFORMATNAME = 780u, CHANGECBCHAIN = 781u, HSCROLLCLIPBOARD = 782u, QUERYNEWPALETTE = 783u, PALETTEISCHANGING = 784u, PALETTECHANGED = 785u, HOTKEY = 786u, PRINT = 791u, PRINTCLIENT = 792u, APPCOMMAND = 793u, THEMECHANGED = 794u, CLIPBOARDUPDATE = 797u, DWMCOMPOSITIONCHANGED = 798u, DWMNCRENDERINGCHANGED = 799u, DWMCOLORIZATIONCOLORCHANGED = 800u, DWMWINDOWMAXIMIZEDCHANGE = 801u, GETTITLEBARINFOEX = 831u, HANDHELDFIRST = 856u, HANDHELDLAST = 863u, AFXFIRST = 864u, AFXLAST = 895u, PENWINFIRST = 896u, PENWINLAST = 911u, APP = 32768u, USER = 1024u, CPL_LAUNCH = 5120u, CPL_LAUNCHED = 5121u, SYSTIMER = 280u, HSHELL_ACCESSIBILITYSTATE = 11u, HSHELL_ACTIVATESHELLWINDOW = 3u, HSHELL_APPCOMMAND = 12u, HSHELL_GETMINRECT = 5u, HSHELL_LANGUAGE = 8u, HSHELL_REDRAW = 6u, HSHELL_TASKMAN = 7u, HSHELL_WINDOWCREATED = 1u, HSHELL_WINDOWDESTROYED = 2u, HSHELL_WINDOWACTIVATED = 4u, HSHELL_WINDOWREPLACED = 13u } } namespace UnityPlayer { internal class GfxDevice { private delegate void PresentFrameDelegate(); private delegate void WaitForLastPresentationAndGetTimestampDelegate(IntPtr gfxDevice); private delegate IntPtr GetRealGfxDeviceDelegate(); [NativeSignature(1u, NativeSignatureFlags.X86, "e8 ?? ?? ?? ?? 85 c0 74 12 e8 ?? ?? ?? ?? 8b ?? 8b ?? 8b 42 70 ff d0 84 c0 75", new string[] { "2017.1.0", "5.6.0", "2017.1.0" })] [NativeSignature(2u, NativeSignatureFlags.X86, "55 8b ec 51 e8 ?? ?? ?? ?? 85 c0 74 12 e8 ?? ?? ?? ?? 8b c8 8b 10 8b 42 ?? ff d0 84 c0 75", new string[] { "2018.1.0" })] [NativeSignature(3u, NativeSignatureFlags.X86, "55 8b ec 51 e8 ?? ?? ?? ?? 85 c0 74 15 e8 ?? ?? ?? ?? 8b c8 8b 10 8b 82 ?? 00 00 00 ff d0", new string[] { "2018.4.9", "2019.1.0" })] [NativeSignature(4u, NativeSignatureFlags.X86, "55 8b ec 51 56 e8 ?? ?? ?? ?? 8b f0 8b ce e8 ?? ?? ?? ?? e8 ?? ?? ?? ?? 85 c0 74 ?? e8", new string[] { "2018.4.18", "2019.3.0", "2020.1.0" })] [NativeSignature(1u, NativeSignatureFlags.X64, "48 83 ec 28 e8 ?? ?? ?? ?? 48 85 c0 74 15 e8 ?? ?? ?? ?? 48 8b c8 48 8b 10 ff 92 e0 00 00 00 84 c0", new string[] { "5.6.0", "2017.1.0" })] [NativeSignature(2u, NativeSignatureFlags.X64, "48 83 ec 28 e8 ?? ?? ?? ?? 48 85 c0 74 15 e8 ?? ?? ?? ?? 48 8b c8 48 8b 10 ff 92 ?? ?? 00 00 84 c0", new string[] { "2018.3.0", "2019.1.0" })] [NativeSignature(3u, NativeSignatureFlags.X64, "40 53 48 83 ec 20 e8 ?? ?? ?? ?? 48 8b c8 48 8b d8 e8 ?? ?? ?? ?? e8 ?? ?? ?? ?? 48 85 c0 74", new string[] { "2018.4.18", "2019.3.0", "2020.1.0" })] private static PresentFrameDelegate m_PresentFrame; [NativeSignature(0u, NativeSignatureFlags.None, null, new string[] { "2017.1.0" })] [NativeSignature(1u, NativeSignatureFlags.X86, "55 8b ec 83 ec 40 53 56 8b d9 57 89 5d fc e8 ?? ?? ?? ?? 6a 02 8b c8", new string[] { "2020.2.7", "2020.3.0", "2021.1.0" })] [NativeSignature(2u, NativeSignatureFlags.X86, "55 8b ec 83 ec 48 53 56 8b d9 57 89 5d fc e8 ?? ?? ?? ?? 6a 02 8b c8", new string[] { "2021.1.5", "2021.2.0" })] [NativeSignature(3u, NativeSignatureFlags.X86, "55 8b ec 83 ec 58 53 56 8b d9 57 89 5d fc e8 ?? ?? ?? ?? 6a 02 8b c8", new string[] { "2022.1.0" })] [NativeSignature(4u, (NativeSignatureFlags)18, null, new string[] { "2020.3.9" })] [NativeSignature(1u, NativeSignatureFlags.X64, "48 89 5c 24 10 56 48 81 ec 90 00 00 00 0f 29 b4 24 80 00 00 00 48 8b f1", new string[] { "2020.2.7", "2020.3.0", "2021.1.0" })] [NativeSignature(2u, NativeSignatureFlags.X64, "48 89 5c 24 10 56 48 81 ec b0 00 00 00 0f 29 b4 24 a0 00 00 00 48 8b f1", new string[] { "2022.1.0" })] private static WaitForLastPresentationAndGetTimestampDelegate m_D3D11WaitForLastPresentationAndGetTimestamp; [NativeSignature(0u, NativeSignatureFlags.None, null, new string[] { "2017.1.0" })] [NativeSignature(1u, NativeSignatureFlags.X86, "55 8b ec 83 ec 40 53 56 57 8b f9 89 7d f4 e8 ?? ?? ?? ?? 6a 02 8b c8", new string[] { "2020.2.7", "2020.3.0", "2021.1.0" })] [NativeSignature(2u, NativeSignatureFlags.X86, "55 8b ec 83 ec 48 56 57 8b f9 89 7d f0 e8 ?? ?? ?? ?? 6a 02 8b c8", new string[] { "2020.3.9", "2021.1.5" })] [NativeSignature(3u, NativeSignatureFlags.X86, "55 8b ec 83 ec 48 56 57 8b f9 89 7d f8 e8 ?? ?? ?? ?? 6a 02 8b c8", new string[] { "2021.2.0" })] [NativeSignature(4u, NativeSignatureFlags.X86, "55 8b ec 83 ec 58 56 57 8b f9 89 7d f8 e8 ?? ?? ?? ?? 6a 02 8b c8", new string[] { "2022.1.0" })] [NativeSignature(1u, NativeSignatureFlags.X64, "48 89 5c 24 08 57 48 81 ec 90 00 00 00 0f 29 b4 24 80 00 00 00 48 8b d9", new string[] { "2020.2.7", "2020.3.0", "2021.1.0" })] [NativeSignature(2u, NativeSignatureFlags.X64, "48 89 5c 24 08 57 48 81 ec b0 00 00 00 0f 29 b4 24 a0 00 00 00 48 8b d9", new string[] { "2022.1.0" })] private static WaitForLastPresentationAndGetTimestampDelegate m_D3D12WaitForLastPresentationAndGetTimestamp; private static GetRealGfxDeviceDelegate m_GetRealGfxDevice; static GfxDevice() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) UnityVersion engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[3] { "2020.2.7", "2020.3.0", "2021.1.0" })) { m_GetRealGfxDevice = (GetRealGfxDeviceDelegate)Marshal.GetDelegateForFunctionPointer(CppUtils.ResolveRelativeInstruction((IntPtr)((long)UnityInternals.ResolveICall("UnityEngine.FrameTimingManager::CaptureFrameTimings") + ((!MelonUtils.IsGame32Bit()) ? 4 : 0))), typeof(GetRealGfxDeviceDelegate)); } } public static void PresentFrame() { m_PresentFrame(); } public static IntPtr GetRealGfxDevice() { return m_GetRealGfxDevice(); } internal static void WaitForLastPresentationAndGetTimestamp(uint deviceType) { if (m_GetRealGfxDevice == null) { throw new NotImplementedException(); } IntPtr realGfxDevice = GetRealGfxDevice(); if (realGfxDevice == IntPtr.Zero) { throw new NotImplementedException(); } switch (deviceType) { case 2u: if (m_D3D11WaitForLastPresentationAndGetTimestamp == null) { throw new NotImplementedException(); } m_D3D11WaitForLastPresentationAndGetTimestamp(realGfxDevice); break; case 18u: if (m_D3D12WaitForLastPresentationAndGetTimestamp == null) { throw new NotImplementedException(); } m_D3D12WaitForLastPresentationAndGetTimestamp(realGfxDevice); break; default: throw new NotImplementedException(); } } } } namespace MelonUnityEngine { [StructLayout(LayoutKind.Explicit)] internal struct Color { private static readonly IntPtr m_ToString; [FieldOffset(0)] public float r; [FieldOffset(4)] public float g; [FieldOffset(8)] public float b; [FieldOffset(12)] public float a; static Color() { InternalClassPointerStore<Color>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Color"); UnityInternals.runtime_class_init(InternalClassPointerStore<Color>.NativeClassPtr); m_ToString = UnityInternals.GetMethod(InternalClassPointerStore<Color>.NativeClassPtr, "ToString", "System.String"); } public Color(float r, float g, float b, float a = 1f) { this.r = r; this.g = g; this.b = b; this.a = a; } } [StructLayout(LayoutKind.Explicit)] internal struct Color32 { [FieldOffset(0)] public byte r; [FieldOffset(1)] public byte g; [FieldOffset(2)] public byte b; [FieldOffset(3)] public byte a; [FieldOffset(0)] public int rgba; static Color32() { InternalClassPointerStore<Color32>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Color32"); UnityInternals.runtime_class_init(InternalClassPointerStore<Color32>.NativeClassPtr); } public Color32(byte r, byte g, byte b, byte a) { rgba = 0; this.r = r; this.g = g; this.b = b; this.a = a; } public static implicit operator Color(Color32 c) { return new Color((float)(int)c.r / 255f, (float)(int)c.g / 255f, (float)(int)c.b / 255f, (float)(int)c.a / 255f); } } internal enum FilterMode { Point, Bilinear, Trilinear } internal sealed class GL { private delegate bool d_get_sRGBWrite(); private static readonly d_get_sRGBWrite m_get_sRGBWrite; public static bool sRGBWrite => m_get_sRGBWrite(); static GL() { m_get_sRGBWrite = UnityInternals.ResolveICall<d_get_sRGBWrite>("UnityEngine.GL::get_sRGBWrite"); } } internal class Graphics : InternalObjectBase { private delegate IntPtr Internal_DrawMeshNow1_InjectedDelegate(IntPtr mesh, int subsetIndex, ref Vector3 position, ref Quaternion rotation); private delegate void Internal_DrawTextureDelegate(IntPtr args); private static readonly Internal_DrawTextureDelegate fd_Internal_DrawTexture; private static readonly Internal_DrawMeshNow1_InjectedDelegate fd_Internal_DrawMeshNow1_Injected; private static readonly int m_DrawTexture_Internal_struct; static Graphics() { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_010b: 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) m_DrawTexture_Internal_struct = -1; InternalClassPointerStore<Graphics>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Graphics"); fd_Internal_DrawTexture = UnityInternals.ResolveICall<Internal_DrawTextureDelegate>("UnityEngine.Graphics::Internal_DrawTexture"); UnityVersion engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[2] { "2018.2.0", "2019.1.0" })) { fd_Internal_DrawMeshNow1_Injected = UnityInternals.ResolveICall<Internal_DrawMeshNow1_InjectedDelegate>("UnityEngine.Graphics::Internal_DrawMeshNow1_Injected"); } else { fd_Internal_DrawMeshNow1_Injected = UnityInternals.ResolveICall<Internal_DrawMeshNow1_InjectedDelegate>("UnityEngine.Graphics::INTERNAL_CALL_Internal_DrawMeshNow1"); } engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[2] { "2019.3.0", "2020.1.0" })) { m_DrawTexture_Internal_struct = 3; return; } engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[2] { "2018.2.0", "2019.1.0" })) { m_DrawTexture_Internal_struct = 2; return; } engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[2] { "2017.3.0", "2018.1.0" })) { m_DrawTexture_Internal_struct = 1; return; } engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[1] { "2017.2.0" })) { m_DrawTexture_Internal_struct = 0; } } public Graphics(IntPtr ptr) : base(ptr) { } public unsafe static void DrawTexture(Rect screenRect, Texture2D texture) { if (texture != null && !(texture.Pointer == IntPtr.Zero)) { if (m_DrawTexture_Internal_struct == 0) { Internal_DrawTextureArguments_2017 internal_DrawTextureArguments_ = default(Internal_DrawTextureArguments_2017); internal_DrawTextureArguments_.screenRect = screenRect; internal_DrawTextureArguments_.sourceRect = new Rect(0, 0, 1, 1); internal_DrawTextureArguments_.color = new Color32(128, 128, 128, 128); internal_DrawTextureArguments_.texture = UnityInternals.ObjectBaseToPtrNotNull(texture); fd_Internal_DrawTexture((IntPtr)(&internal_DrawTextureArguments_)); } else if (m_DrawTexture_Internal_struct == 1) { Internal_DrawTextureArguments_2018 internal_DrawTextureArguments_2 = default(Internal_DrawTextureArguments_2018); internal_DrawTextureArguments_2.screenRect = screenRect; internal_DrawTextureArguments_2.sourceRect = new Rect(0, 0, 1, 1); internal_DrawTextureArguments_2.color = new Color32(128, 128, 128, 128); internal_DrawTextureArguments_2.texture = UnityInternals.ObjectBaseToPtrNotNull(texture); fd_Internal_DrawTexture((IntPtr)(&internal_DrawTextureArguments_2)); } else if (m_DrawTexture_Internal_struct == 2) { Internal_DrawTextureArguments_2019 internal_DrawTextureArguments_3 = default(Internal_DrawTextureArguments_2019); internal_DrawTextureArguments_3.screenRect = screenRect; internal_DrawTextureArguments_3.sourceRect = new Rect(0, 0, 1, 1); internal_DrawTextureArguments_3.color = new Color(0.5f, 0.5f, 0.5f, 0.5f); internal_DrawTextureArguments_3.texture = UnityInternals.ObjectBaseToPtrNotNull(texture); fd_Internal_DrawTexture((IntPtr)(&internal_DrawTextureArguments_3)); } else if (m_DrawTexture_Internal_struct == 3) { Internal_DrawTextureArguments_2020 internal_DrawTextureArguments_4 = default(Internal_DrawTextureArguments_2020); internal_DrawTextureArguments_4.screenRect = screenRect; internal_DrawTextureArguments_4.sourceRect = new Rect(0, 0, 1, 1); internal_DrawTextureArguments_4.color = new Color(0.5f, 0.5f, 0.5f, 0.5f); internal_DrawTextureArguments_4.leftBorderColor = new Color(0f, 0f, 0f); internal_DrawTextureArguments_4.topBorderColor = new Color(0f, 0f, 0f); internal_DrawTextureArguments_4.rightBorderColor = new Color(0f, 0f, 0f); internal_DrawTextureArguments_4.bottomBorderColor = new Color(0f, 0f, 0f); internal_DrawTextureArguments_4.smoothCorners = true; internal_DrawTextureArguments_4.texture = UnityInternals.ObjectBaseToPtrNotNull(texture); fd_Internal_DrawTexture((IntPtr)(&internal_DrawTextureArguments_4)); } } } public static void DrawMeshNow(Mesh mesh, Vector3 position, Quaternion rotation) { DrawMeshNow(mesh, position, rotation, -1); } public static void DrawMeshNow(Mesh mesh, Vector3 position, Quaternion rotation, int materialIndex) { if (mesh == null) { throw new ArgumentNullException("mesh"); } Internal_DrawMeshNow1(mesh, materialIndex, position, rotation); } private static void Internal_DrawMeshNow1(Mesh mesh, int subsetIndex, Vector3 position, Quaternion rotation) { Internal_DrawMeshNow1_Injected(mesh, subsetIndex, ref position, ref rotation); } private static void Internal_DrawMeshNow1_Injected(Mesh mesh, int subsetIndex, ref Vector3 position, ref Quaternion rotation) { if (mesh != null && !(mesh.Pointer == IntPtr.Zero)) { fd_Internal_DrawMeshNow1_Injected(UnityInternals.ObjectBaseToPtr(mesh), subsetIndex, ref position, ref rotation); } } } internal enum HideFlags { None = 0, HideInHierarchy = 1, HideInInspector = 2, DontSaveInEditor = 4, NotEditable = 8, DontSaveInBuild = 16, DontUnloadUnusedAsset = 32, DontSave = 52, HideAndDontSave = 61 } internal static class ImageConversion { private delegate bool ImageConversion_LoadImage_Delegate(IntPtr tex, IntPtr data, bool markNonReadable); private static ImageConversion_LoadImage_Delegate ImageConversion_LoadImage; static ImageConversion() { IntPtr intPtr = UnityInternals.ResolveICall("UnityEngine.ImageConversion::LoadImage(UnityEngine.Texture2D,System.Byte[],System.Boolean)"); if (intPtr != IntPtr.Zero) { ImageConversion_LoadImage = (ImageConversion_LoadImage_Delegate)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(ImageConversion_LoadImage_Delegate)); } else { MelonLogger.Error("Failed to resolve icall UnityEngine.ImageConversion::LoadImage(UnityEngine.Texture2D,System.Byte[],System.Boolean)"); } } public unsafe static bool LoadImage(Texture2D tex, byte[] data, bool markNonReadable) { if (ImageConversion_LoadImage == null) { MelonLogger.Error("Failed to run UnityEngine.ImageConversion::LoadImage(UnityEngine.Texture2D,System.Byte[],System.Boolean)"); return false; } IntPtr intPtr = UnityInternals.array_new(InternalClassPointerStore<byte>.NativeClassPtr, (uint)data.Length); for (int i = 0; i < data.Length; i++) { ((byte*)((IntPtr)((long)intPtr + 4 * IntPtr.Size)).ToPointer())[i] = data[i]; } return ImageConversion_LoadImage(tex.Pointer, intPtr, markNonReadable); } } internal struct Internal_DrawTextureArguments_2017 { public Rect screenRect; public Rect sourceRect; public int leftBorder; public int rightBorder; public int topBorder; public int bottomBorder; public Color32 color; public Vector4 borderWidths; public float cornerRadius; public int pass; public IntPtr texture; public IntPtr mat; } internal struct Internal_DrawTextureArguments_2018 { public Rect screenRect; public Rect sourceRect; public int leftBorder; public int rightBorder; public int topBorder; public int bottomBorder; public Color32 color; public Vector4 borderWidths; public Vector4 cornerRadius; public int pass; public IntPtr texture; public IntPtr mat; } internal struct Internal_DrawTextureArguments_2019 { public Rect screenRect; public Rect sourceRect; public int leftBorder; public int rightBorder; public int topBorder; public int bottomBorder; public Color color; public Vector4 borderWidths; public Vector4 cornerRadius; public int pass; public IntPtr texture; public IntPtr mat; } internal struct Internal_DrawTextureArguments_2020 { public Rect screenRect; public Rect sourceRect; public int leftBorder; public int rightBorder; public int topBorder; public int bottomBorder; public Color leftBorderColor; public Color rightBorderColor; public Color topBorderColor; public Color bottomBorderColor; public Color color; public Vector4 borderWidths; public Vector4 cornerRadiuses; public bool smoothCorners; public int pass; public IntPtr texture; public IntPtr mat; } internal class Material : UnityObject { private delegate bool d_SetPass(IntPtr @this, int pass); private static readonly d_SetPass m_SetPass; static Material() { InternalClassPointerStore<Material>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Material"); UnityInternals.runtime_class_init(InternalClassPointerStore<Material>.NativeClassPtr); m_SetPass = UnityInternals.ResolveICall<d_SetPass>("UnityEngine.Material::SetPass"); } public Material(IntPtr ptr) : base(ptr) { } public bool SetPass(int pass) { return m_SetPass(UnityInternals.ObjectBaseToPtrNotNull(this), pass); } } internal sealed class Mesh : UnityObject { private delegate void SetArrayForChannelImpl_2017(IntPtr @this, int channel, int format, int dim, IntPtr values, int arraySize); private delegate void SetArrayForChannelImpl_2019(IntPtr @this, int channel, int format, int dim, IntPtr values, int arraySize, int valuesStart, int valuesCount); private delegate void SetArrayForChannelImpl_2020(IntPtr @this, int channel, int format, int dim, IntPtr values, int arraySize, int valuesStart, int valuesCount, int updateFlags); private static readonly IntPtr m_ctor; private static readonly IntPtr m_set_triangles; private static readonly IntPtr m_RecalculateBounds; private static readonly SetArrayForChannelImpl_2017 m_SetArrayForChannelImpl_2017; private static readonly SetArrayForChannelImpl_2019 m_SetArrayForChannelImpl_2019; private static readonly SetArrayForChannelImpl_2020 m_SetArrayForChannelImpl_2020; private static readonly int type_SetArrayForChannelImpl; public unsafe Vector3[] vertices { set { int num = value.Length; IntPtr intPtr = UnityInternals.array_new(InternalClassPointerStore<Vector3>.NativeClassPtr, (ulong)num); for (int i = 0; i < num; i++) { *(Vector3*)((nint)((long)intPtr + 4 * IntPtr.Size) + (nint)i * (nint)sizeof(Vector3)) = value[i]; } SetArrayForChannelImpl(VertexAttribute.Vertex, intPtr, 3, num); } } public unsafe Vector3[] normals { set { int num = value.Length; IntPtr intPtr = UnityInternals.array_new(InternalClassPointerStore<Vector3>.NativeClassPtr, (ulong)num); for (int i = 0; i < num; i++) { *(Vector3*)((nint)((long)intPtr + 4 * IntPtr.Size) + (nint)i * (nint)sizeof(Vector3)) = value[i]; } SetArrayForChannelImpl(VertexAttribute.Normal, intPtr, 3, num); } } public unsafe Vector4[] tangents { set { int num = value.Length; IntPtr intPtr = UnityInternals.array_new(InternalClassPointerStore<Vector4>.NativeClassPtr, (ulong)num); for (int i = 0; i < num; i++) { *(Vector4*)((nint)((long)intPtr + 4 * IntPtr.Size) + (nint)i * (nint)sizeof(Vector4)) = value[i]; } SetArrayForChannelImpl(VertexAttribute.Tangent, intPtr, 4, num); } } public unsafe Vector2[] uv { set { int num = value.Length; IntPtr intPtr = UnityInternals.array_new(InternalClassPointerStore<Vector2>.NativeClassPtr, (ulong)num); for (int i = 0; i < num; i++) { *(Vector2*)((nint)((long)intPtr + 4 * IntPtr.Size) + (nint)i * (nint)sizeof(Vector2)) = value[i]; } SetArrayForChannelImpl(VertexAttribute.TexCoord0, intPtr, 2, num); } } public unsafe Color[] colors { set { int num = value.Length; IntPtr intPtr = UnityInternals.array_new(InternalClassPointerStore<Color>.NativeClassPtr, (ulong)num); for (int i = 0; i < num; i++) { *(Color*)((nint)((long)intPtr + 4 * IntPtr.Size) + (nint)i * (nint)sizeof(Color)) = value[i]; } SetArrayForChannelImpl(VertexAttribute.Color, intPtr, 4, num); } } public unsafe int[] triangles { set { UnityInternals.ObjectBaseToPtrNotNull(this); IntPtr intPtr = UnityInternals.array_new(InternalClassPointerStore<int>.NativeClassPtr, (ulong)value.Length); for (int i = 0; i < value.Length; i++) { *(int*)((nint)((long)intPtr + 4 * IntPtr.Size) + (nint)i * (nint)4) = value[i]; } void** ptr = stackalloc void*[1]; *ptr = (void*)intPtr; IntPtr exc = default(IntPtr); UnityInternals.runtime_invoke(m_set_triangles, UnityInternals.ObjectBaseToPtrNotNull(this), ptr, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); } } static Mesh() { //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) type_SetArrayForChannelImpl = -1; InternalClassPointerStore<Mesh>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Mesh"); UnityInternals.runtime_class_init(InternalClassPointerStore<Mesh>.NativeClassPtr); m_ctor = UnityInternals.GetMethod(InternalClassPointerStore<Mesh>.NativeClassPtr, ".ctor", "System.Void"); m_set_triangles = UnityInternals.GetMethod(InternalClassPointerStore<Mesh>.NativeClassPtr, "set_triangles", "System.Void", "System.Int32[]"); m_RecalculateBounds = UnityInternals.GetMethod(InternalClassPointerStore<Mesh>.NativeClassPtr, "RecalculateBounds", "System.Void"); UnityVersion engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[1] { "2020.1.0" })) { m_SetArrayForChannelImpl_2020 = UnityInternals.ResolveICall<SetArrayForChannelImpl_2020>("UnityEngine.Mesh::SetArrayForChannelImpl"); type_SetArrayForChannelImpl = 2; return; } engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[1] { "2019.3.0" })) { m_SetArrayForChannelImpl_2019 = UnityInternals.ResolveICall<SetArrayForChannelImpl_2019>("UnityEngine.Mesh::SetArrayForChannelImpl"); type_SetArrayForChannelImpl = 1; return; } engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[1] { "2017.1.0" })) { m_SetArrayForChannelImpl_2017 = UnityInternals.ResolveICall<SetArrayForChannelImpl_2017>("UnityEngine.Mesh::SetArrayForChannelImpl"); type_SetArrayForChannelImpl = 0; } } public Mesh(IntPtr ptr) : base(ptr) { } public unsafe Mesh() : base(UnityInternals.object_new(InternalClassPointerStore<Mesh>.NativeClassPtr)) { IntPtr exc = default(IntPtr); UnityInternals.runtime_invoke(m_ctor, UnityInternals.ObjectBaseToPtrNotNull(this), null, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); } private void SetArrayForChannelImpl(int channel, IntPtr values, int channelDimensions, int valuesCount) { if (type_SetArrayForChannelImpl == 0) { m_SetArrayForChannelImpl_2017(UnityInternals.ObjectBaseToPtrNotNull(this), channel, 0, channelDimensions, values, valuesCount); return; } if (type_SetArrayForChannelImpl == 1) { m_SetArrayForChannelImpl_2019(UnityInternals.ObjectBaseToPtrNotNull(this), channel, 0, channelDimensions, values, valuesCount, 0, valuesCount); return; } if (type_SetArrayForChannelImpl == 2) { m_SetArrayForChannelImpl_2020(UnityInternals.ObjectBaseToPtrNotNull(this), channel, 0, channelDimensions, values, valuesCount, 0, valuesCount, 0); return; } throw new NotImplementedException("SetArrayForChannel isn't implemented for this version of Unity"); } public unsafe void RecalculateBounds() { UnityInternals.ObjectBaseToPtrNotNull(this); IntPtr exc = default(IntPtr); UnityInternals.runtime_invoke(m_RecalculateBounds, UnityInternals.ObjectBaseToPtrNotNull(this), null, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); } } [StructLayout(LayoutKind.Explicit)] internal struct Quaternion { [FieldOffset(0)] public float x; [FieldOffset(4)] public float y; [FieldOffset(8)] public float z; [FieldOffset(12)] public float w; public static Quaternion identity => default(Quaternion); static Quaternion() { InternalClassPointerStore<Quaternion>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Quaternion"); } } [StructLayout(LayoutKind.Explicit)] internal struct Rect { [FieldOffset(0)] public float m_XMin; [FieldOffset(4)] public float m_YMin; [FieldOffset(8)] public float m_Width; [FieldOffset(12)] public float m_Height; static Rect() { InternalClassPointerStore<Rect>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Rect"); UnityInternals.runtime_class_init(InternalClassPointerStore<Rect>.NativeClassPtr); } public Rect(int x, int y, int width, int height) { m_XMin = x; m_YMin = y; m_Width = width; m_Height = height; } } internal class Resources { private static readonly IntPtr m_GetBuiltinResource; static Resources() { InternalClassPointerStore<Resources>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Resources"); m_GetBuiltinResource = UnityInternals.GetMethod(InternalClassPointerStore<Resources>.NativeClassPtr, "GetBuiltinResource", "UnityEngine.Object", "System.Type", "System.String"); } public unsafe static IntPtr GetBuiltinResource(Il2CppSystem.Type type, string path) { void** ptr = stackalloc void*[2]; *ptr = (void*)UnityInternals.ObjectBaseToPtr(type); ptr[1] = (void*)UnityInternals.ManagedStringToInternal(path); IntPtr exc = default(IntPtr); MelonDebug.Msg("Calling runtime_invoke for GetBuiltinResource"); IntPtr result = UnityInternals.runtime_invoke(m_GetBuiltinResource, IntPtr.Zero, ptr, ref exc); MelonDebug.Msg("returnedException: " + exc + ", objectPointer: " + result); Il2CppException.RaiseExceptionIfNecessary(exc); return result; } public static T GetBuiltinResource<T>(string path) where T : InternalObjectBase { MelonDebug.Msg("GetBuiltinResource<T>"); IntPtr builtinResource = GetBuiltinResource(InternalType.Of<T>(), path); if (!(builtinResource != IntPtr.Zero)) { return null; } return (T)typeof(T).GetConstructor(new System.Type[1] { typeof(IntPtr) }).Invoke(new object[1] { builtinResource }); } } internal class Screen { private static IntPtr m_get_width; private static IntPtr m_get_height; public unsafe static int width { get { IntPtr* param = null; IntPtr exc = IntPtr.Zero; IntPtr obj = UnityInternals.runtime_invoke(m_get_width, IntPtr.Zero, (void**)param, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); return *(int*)(void*)UnityInternals.object_unbox(obj); } } public unsafe static int height { get { IntPtr* param = null; IntPtr exc = IntPtr.Zero; IntPtr obj = UnityInternals.runtime_invoke(m_get_height, IntPtr.Zero, (void**)param, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); return *(int*)(void*)UnityInternals.object_unbox(obj); } } static Screen() { InternalClassPointerStore<Screen>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Screen"); m_get_width = UnityInternals.GetMethod(InternalClassPointerStore<Screen>.NativeClassPtr, "get_width", "System.Int32"); m_get_height = UnityInternals.GetMethod(InternalClassPointerStore<Screen>.NativeClassPtr, "get_height", "System.Int32"); } } internal class Texture : UnityObject { private delegate int GetDataWidthDelegate(IntPtr @this); private delegate int GetDataHeightDelegate(IntPtr @this); private delegate int set_filterModeDelegate(IntPtr @this, FilterMode filterMode); private static readonly GetDataWidthDelegate getDataWidth; private static readonly GetDataHeightDelegate getDataHeight; private static readonly set_filterModeDelegate set_filterMode_; public int width => getDataWidth(UnityInternals.ObjectBaseToPtrNotNull(this)); public int height => getDataHeight(UnityInternals.ObjectBaseToPtrNotNull(this)); public FilterMode filterMode { set { set_filterMode_(UnityInternals.ObjectBaseToPtrNotNull(this), value); } } static Texture() { //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_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) InternalClassPointerStore<Texture>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Texture"); UnityVersion engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[1] { "2018.1.0" })) { getDataWidth = UnityInternals.ResolveICall<GetDataWidthDelegate>("UnityEngine.Texture::GetDataWidth"); getDataHeight = UnityInternals.ResolveICall<GetDataHeightDelegate>("UnityEngine.Texture::GetDataHeight"); } else { engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[1] { "2017.1.0" })) { getDataWidth = UnityInternals.ResolveICall<GetDataWidthDelegate>("UnityEngine.Texture::Internal_GetWidth"); getDataHeight = UnityInternals.ResolveICall<GetDataHeightDelegate>("UnityEngine.Texture::Internal_GetHeight"); } } set_filterMode_ = UnityInternals.ResolveICall<set_filterModeDelegate>("UnityEngine.Texture::set_filterMode"); } public Texture(IntPtr ptr) : base(ptr) { } } internal class Texture2D : Texture { private delegate void SetPixelsImplDelegate_2017(IntPtr @this, int x, int y, int w, int h, IntPtr pixel, int miplevel); private delegate void SetPixelsImplDelegate_2018(IntPtr @this, int x, int y, int w, int h, IntPtr pixel, int miplevel, int frame); private static readonly IntPtr m_get_whiteTexture; private static readonly IntPtr m_ctor; private static readonly SetPixelsImplDelegate_2017 m_SetPixelsImpl_2017; private static readonly SetPixelsImplDelegate_2018 m_SetPixelsImpl_2018; private static readonly IntPtr m_Apply; private static readonly int type_SetPixelsImpl; public unsafe static Texture2D whiteTexture { get { IntPtr exc = IntPtr.Zero; IntPtr intPtr = UnityInternals.runtime_invoke(m_get_whiteTexture, IntPtr.Zero, null, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); if (!(intPtr == IntPtr.Zero)) { return new Texture2D(intPtr); } return null; } } static Texture2D() { //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) type_SetPixelsImpl = -1; InternalClassPointerStore<Texture2D>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Texture2D"); UnityInternals.runtime_class_init(InternalClassPointerStore<Texture2D>.NativeClassPtr); m_ctor = UnityInternals.GetMethod(InternalClassPointerStore<Texture2D>.NativeClassPtr, ".ctor", "System.Void", "System.Int32", "System.Int32"); m_get_whiteTexture = UnityInternals.GetMethod(InternalClassPointerStore<Texture2D>.NativeClassPtr, "get_whiteTexture", "UnityEngine.Texture2D"); UnityVersion engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[1] { "2018.1.0" })) { type_SetPixelsImpl = 1; m_SetPixelsImpl_2018 = UnityInternals.ResolveICall<SetPixelsImplDelegate_2018>("UnityEngine.Texture2D::SetPixelsImpl"); } else { engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[1] { "2017.1.0" })) { type_SetPixelsImpl = 0; m_SetPixelsImpl_2017 = UnityInternals.ResolveICall<SetPixelsImplDelegate_2017>("UnityEngine.Texture2D::SetPixels"); } } m_Apply = UnityInternals.GetMethod(InternalClassPointerStore<Texture2D>.NativeClassPtr, "Apply", "System.Void"); } public Texture2D(IntPtr ptr) : base(ptr) { } public unsafe Texture2D(int width, int height) : base(UnityInternals.object_new(InternalClassPointerStore<Texture2D>.NativeClassPtr)) { void** ptr = stackalloc void*[2]; *ptr = &width; ptr[1] = &height; IntPtr exc = default(IntPtr); UnityInternals.runtime_invoke(m_ctor, UnityInternals.ObjectBaseToPtrNotNull(this), ptr, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); } public void SetPixels(Color[] colors) { SetPixels(0, 0, base.width, base.height, colors); } public void SetPixels(int x, int y, int blockWidth, int blockHeight, Color[] colors, int miplevel = 0) { SetPixelsImpl(x, y, blockWidth, blockHeight, colors, miplevel, 0); } public unsafe void SetPixelsImpl(int x, int y, int w, int h, Color[] pixel, int miplevel, int frame) { IntPtr intPtr = UnityInternals.array_new(InternalClassPointerStore<Color>.NativeClassPtr, (uint)pixel.Length); for (int i = 0; i < pixel.Length; i++) { *(Color*)((byte*)((IntPtr)((long)intPtr + 4 * IntPtr.Size)).ToPointer() + (nint)i * (nint)sizeof(Color)) = pixel[i]; } if (type_SetPixelsImpl == 0) { m_SetPixelsImpl_2017(UnityInternals.ObjectBaseToPtrNotNull(this), x, y, w, h, intPtr, miplevel); } else if (type_SetPixelsImpl == 1) { m_SetPixelsImpl_2018(UnityInternals.ObjectBaseToPtrNotNull(this), x, y, w, h, intPtr, miplevel, frame); } } public unsafe void Apply() { IntPtr exc = default(IntPtr); UnityInternals.runtime_invoke(m_Apply, UnityInternals.ObjectBaseToPtrNotNull(this), null, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); } } internal static class UnityDebug { private delegate bool get_isDebugBuild_Delegate(); private static get_isDebugBuild_Delegate get_isDebugBuild_Ptr; internal static bool isDebugBuild => get_isDebugBuild_Ptr(); static UnityDebug() { IntPtr intPtr = UnityInternals.ResolveICall("UnityEngine.Debug::get_isDebugBuild"); if (intPtr != IntPtr.Zero) { get_isDebugBuild_Ptr = (get_isDebugBuild_Delegate)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(get_isDebugBuild_Delegate)); } else { MelonLogger.Error("Failed to resolve icall UnityEngine.Debug::get_isDebugBuild"); } } } internal class UnityObject : InternalObjectBase { private delegate HideFlags get_hideFlags_Delegate(IntPtr obj); private delegate void set_hideFlags_Delegate(IntPtr obj, HideFlags hideFlags); private static get_hideFlags_Delegate m_get_hideFlags; private static set_hideFlags_Delegate m_set_hideFlags; private static IntPtr m_DestroyImmediate; private static IntPtr m_DontDestroyOnLoad; public HideFlags hideFlags { get { if (base.Pointer == IntPtr.Zero) { return HideFlags.None; } return m_get_hideFlags(base.Pointer); } set { if (!(base.Pointer == IntPtr.Zero)) { m_set_hideFlags(base.Pointer, value); } } } static UnityObject() { InternalClassPointerStore<UnityObject>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Object"); m_DestroyImmediate = UnityInternals.GetMethod(InternalClassPointerStore<UnityObject>.NativeClassPtr, "DestroyImmediate", "System.Void", "UnityEngine.Object"); m_DontDestroyOnLoad = UnityInternals.GetMethod(InternalClassPointerStore<UnityObject>.NativeClassPtr, "DontDestroyOnLoad", "System.Void", "UnityEngine.Object"); m_get_hideFlags = UnityInternals.ResolveICall<get_hideFlags_Delegate>("UnityEngine.Object::get_hideFlags(UnityEngine.Object)"); m_set_hideFlags = UnityInternals.ResolveICall<set_hideFlags_Delegate>("UnityEngine.Object::set_hideFlags(UnityEngine.Object)"); } public UnityObject(IntPtr ptr) : base(ptr) { } public unsafe void DestroyImmediate() { if (!(base.Pointer == IntPtr.Zero)) { void** ptr = stackalloc void*[1]; *ptr = base.Pointer.ToPointer(); IntPtr exc = IntPtr.Zero; UnityInternals.runtime_invoke(m_DestroyImmediate, IntPtr.Zero, ptr, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); } } public unsafe void DontDestroyOnLoad() { if (!(base.Pointer == IntPtr.Zero)) { void** ptr = stackalloc void*[1]; *ptr = base.Pointer.ToPointer(); IntPtr exc = IntPtr.Zero; UnityInternals.runtime_invoke(m_DontDestroyOnLoad, IntPtr.Zero, ptr, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); } } } [StructLayout(LayoutKind.Explicit)] internal struct Vector2 { [FieldOffset(0)] public float x; [FieldOffset(4)] public float y; static Vector2() { InternalClassPointerStore<Vector2>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Vector2"); } public Vector2(float x, float y) { this.x = x; this.y = y; } } [StructLayout(LayoutKind.Explicit)] internal struct Vector3 { [FieldOffset(0)] public float x; [FieldOffset(4)] public float y; [FieldOffset(8)] public float z; public static Vector3 zero => default(Vector3); static Vector3() { InternalClassPointerStore<Vector3>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Vector3"); } public Vector3(float x, float y, float z) { this.x = x; this.y = y; this.z = z; } public static Vector3 operator *(Vector3 a, float d) { return new Vector3(a.x * d, a.y * d, a.z * d); } public override string ToString() { return $"{x} {y} {z}"; } } [StructLayout(LayoutKind.Explicit)] internal struct Vector4 { [FieldOffset(0)] public float x; [FieldOffset(4)] public float y; [FieldOffset(8)] public float z; [FieldOffset(12)] public float w; static Vector4() { InternalClassPointerStore<Vector4>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.CoreModule.dll", "UnityEngine", "Vector4"); } public static explicit operator Vector2(Vector4 src) { return new Vector2(src.x, src.y); } } internal enum VerticalWrapMode { Truncate, Overflow } internal class Font : UnityObject { private static IntPtr m_get_material; public unsafe Material material { get { UnityInternals.ObjectBaseToPtrNotNull(this); IntPtr exc = default(IntPtr); IntPtr intPtr = UnityInternals.runtime_invoke(m_get_material, UnityInternals.ObjectBaseToPtrNotNull(this), null, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); if (!(intPtr != IntPtr.Zero)) { return null; } return new Material(intPtr); } } static Font() { InternalClassPointerStore<Font>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.TextRenderingModule.dll", "UnityEngine", "Font"); UnityInternals.runtime_class_init(InternalClassPointerStore<Font>.NativeClassPtr); m_get_material = UnityInternals.GetMethod(InternalClassPointerStore<Font>.NativeClassPtr, "get_material", "UnityEngine.Material"); } public Font(IntPtr ptr) : base(ptr) { } } internal enum FontStyle { Normal, Bold, Italic, BoldAndItalic } internal enum TextAnchor { UpperLeft, UpperCenter, UpperRight, MiddleLeft, MiddleCenter, MiddleRight, LowerLeft, LowerCenter, LowerRight } internal class TextGenerationSettings : InternalObjectBase { private static readonly int classsize; private static readonly IntPtr f_font; private static readonly IntPtr f_color; private static readonly IntPtr f_fontSize; private static readonly IntPtr f_lineSpacing; private static readonly IntPtr f_richText; private static readonly IntPtr f_scaleFactor; private static readonly IntPtr f_fontStyle; private static readonly IntPtr f_textAnchor; private static readonly IntPtr f_verticalOverflow; private static readonly IntPtr f_generationExtents; private static readonly IntPtr f_pivot; public unsafe Font font { get { IntPtr intPtr = *(IntPtr*)((uint)(int)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_font)); if (!(intPtr != IntPtr.Zero)) { return null; } return new Font(intPtr); } set { *(IntPtr*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_font)) = UnityInternals.ObjectBaseToPtr(value); } } public unsafe Color color { get { return *(Color*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_color)); } set { *(Color*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_color)) = value; } } public unsafe int fontSize { get { return *(int*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_fontSize)); } set { *(int*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_fontSize)) = value; } } public unsafe float lineSpacing { get { return *(float*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_lineSpacing)); } set { *(float*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_lineSpacing)) = value; } } public unsafe bool richText { get { return *(bool*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_richText)); } set { *(bool*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_richText)) = value; } } public unsafe float scaleFactor { get { return *(float*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_scaleFactor)); } set { *(float*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_scaleFactor)) = value; } } public unsafe FontStyle fontStyle { get { return *(FontStyle*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_fontStyle)); } set { *(FontStyle*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_fontStyle)) = value; } } public unsafe TextAnchor textAnchor { get { return *(TextAnchor*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_textAnchor)); } set { *(TextAnchor*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_textAnchor)) = value; } } public unsafe VerticalWrapMode verticalOverflow { get { return *(VerticalWrapMode*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_verticalOverflow)); } set { *(VerticalWrapMode*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_verticalOverflow)) = value; } } public unsafe Vector2 generationExtents { get { return *(Vector2*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_generationExtents)); } set { *(Vector2*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_generationExtents)) = value; } } public unsafe Vector2 pivot { get { return *(Vector2*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_pivot)); } set { *(Vector2*)((long)UnityInternals.ObjectBaseToPtrNotNull(this) + UnityInternals.field_get_offset(f_pivot)) = value; } } static TextGenerationSettings() { InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.TextRenderingModule.dll", "UnityEngine", "TextGenerationSettings"); uint align = 0u; classsize = UnityInternals.class_value_size(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, ref align); f_font = UnityInternals.GetField(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, "font"); f_color = UnityInternals.GetField(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, "color"); f_fontSize = UnityInternals.GetField(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, "fontSize"); f_lineSpacing = UnityInternals.GetField(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, "lineSpacing"); f_richText = UnityInternals.GetField(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, "richText"); f_scaleFactor = UnityInternals.GetField(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, "scaleFactor"); f_fontStyle = UnityInternals.GetField(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, "fontStyle"); f_textAnchor = UnityInternals.GetField(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, "textAnchor"); f_verticalOverflow = UnityInternals.GetField(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, "verticalOverflow"); f_generationExtents = UnityInternals.GetField(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, "generationExtents"); f_pivot = UnityInternals.GetField(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, "pivot"); } public TextGenerationSettings(IntPtr ptr) : base(ptr) { } public unsafe TextGenerationSettings() { byte** ptr = stackalloc byte*[classsize]; IntPtr obj = UnityInternals.value_box(InternalClassPointerStore<TextGenerationSettings>.NativeClassPtr, (IntPtr)ptr); myGcHandle = UnityInternals.gchandle_new(obj, pinned: false); } } internal class TextGenerator : InternalObjectBase { private delegate int get_vertexCountDelegate(IntPtr @this); private delegate IntPtr GetVerticesArrayDelegate(IntPtr @this); private static readonly IntPtr m_ctor; private static readonly IntPtr m_Populate; private static readonly get_vertexCountDelegate fd_get_vertexCount; private static readonly GetVerticesArrayDelegate fd_GetVerticesArray; public int vertexCount => fd_get_vertexCount(UnityInternals.ObjectBaseToPtrNotNull(this)); static TextGenerator() { InternalClassPointerStore<TextGenerator>.NativeClassPtr = UnityInternals.GetClass("UnityEngine.TextRenderingModule.dll", "UnityEngine", "TextGenerator"); UnityInternals.runtime_class_init(InternalClassPointerStore<TextGenerator>.NativeClassPtr); m_ctor = UnityInternals.GetMethod(InternalClassPointerStore<TextGenerator>.NativeClassPtr, ".ctor", "System.Void"); m_Populate = UnityInternals.GetMethod(InternalClassPointerStore<TextGenerator>.NativeClassPtr, "Populate", "System.Boolean", "System.String", "UnityEngine.TextGenerationSettings"); fd_get_vertexCount = UnityInternals.ResolveICall<get_vertexCountDelegate>("UnityEngine.TextGenerator::get_vertexCount"); fd_GetVerticesArray = UnityInternals.ResolveICall<GetVerticesArrayDelegate>("UnityEngine.TextGenerator::GetVerticesArray"); } public TextGenerator(IntPtr ptr) : base(ptr) { } public unsafe TextGenerator() : this(UnityInternals.object_new(InternalClassPointerStore<TextGenerator>.NativeClassPtr)) { IntPtr exc = default(IntPtr); UnityInternals.runtime_invoke(m_ctor, UnityInternals.ObjectBaseToPtrNotNull(this), null, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); } public unsafe bool Populate(string str, TextGenerationSettings settings) { void** ptr = stackalloc void*[2]; *ptr = (void*)UnityInternals.ManagedStringToInternal(str); ptr[1] = (void*)UnityInternals.object_unbox(UnityInternals.ObjectBaseToPtrNotNull(settings)); IntPtr exc = default(IntPtr); IntPtr obj = UnityInternals.runtime_invoke(m_Populate, UnityInternals.ObjectBaseToPtrNotNull(this), ptr, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); return *(bool*)(void*)UnityInternals.object_unbox(obj); } public UIVertexWrapper[] GetVerticesArray() { IntPtr intPtr = fd_GetVerticesArray(UnityInternals.ObjectBaseToPtrNotNull(this)); if (intPtr == IntPtr.Zero) { return null; } UIVertexWrapper[] array = new UIVertexWrapper[UnityInternals.array_length(intPtr)]; for (int i = 0; i < array.Length; i++) { array[i] = new UIVertexWrapper((IntPtr)((long)intPtr + 4 * IntPtr.Size + i * UIVertexWrapper.sizeOfElement)); } return array; } } internal struct UIVertex_2020 { public Vector3 position; public Vector3 normal; public Vector4 tangent; public Color32 color; public Vector4 uv0; public Vector4 uv1; public Vector4 uv2; public Vector4 uv3; } internal struct UIVertex_2018 { public Vector3 position; public Vector3 normal; public Vector4 tangent; public Color32 color; public Vector2 uv0; public Vector2 uv1; public Vector2 uv2; public Vector2 uv3; } internal struct UIVertex_2017 { public Vector3 position; public Vector3 normal; public Color32 color; public Vector2 uv0; public Vector2 uv1; public Vector2 uv2; public Vector2 uv3; public Vector4 tangent; } internal struct UIVertexWrapper { private static readonly int mode; public static readonly int sizeOfElement; private IntPtr ptr; public unsafe Vector3 position { get { if (mode != 2) { if (mode != 1) { if (mode != 0) { throw new Exception("UIVertex mode not set"); } return ((UIVertex_2017*)(void*)ptr)->position; } return ((UIVertex_2018*)(void*)ptr)->position; } return ((UIVertex_2020*)(void*)ptr)->position; } } public unsafe Vector3 normal { get { if (mode != 2) { if (mode != 1) { if (mode != 0) { throw new Exception("UIVertex mode not set"); } return ((UIVertex_2017*)(void*)ptr)->normal; } return ((UIVertex_2018*)(void*)ptr)->normal; } return ((UIVertex_2020*)(void*)ptr)->normal; } } public unsafe Vector4 tangent { get { if (mode != 2) { if (mode != 1) { if (mode != 0) { throw new Exception("UIVertex mode not set"); } return ((UIVertex_2017*)(void*)ptr)->tangent; } return ((UIVertex_2018*)(void*)ptr)->tangent; } return ((UIVertex_2020*)(void*)ptr)->tangent; } } public unsafe Color32 color { get { if (mode != 2) { if (mode != 1) { if (mode != 0) { throw new Exception("UIVertex mode not set"); } return ((UIVertex_2017*)(void*)ptr)->color; } return ((UIVertex_2018*)(void*)ptr)->color; } return ((UIVertex_2020*)(void*)ptr)->color; } } public unsafe Vector2 uv0 { get { if (mode != 2) { if (mode != 1) { if (mode != 0) { throw new Exception("UIVertex mode not set"); } return ((UIVertex_2017*)(void*)ptr)->uv0; } return ((UIVertex_2018*)(void*)ptr)->uv0; } return (Vector2)((UIVertex_2020*)(void*)ptr)->uv0; } } unsafe static UIVertexWrapper() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) mode = -1; sizeOfElement = 0; UnityVersion engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[2] { "2020.2.0", "2021.1.0" })) { mode = 2; sizeOfElement = sizeof(UIVertex_2020); return; } engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[1] { "2018.1.0" })) { mode = 1; sizeOfElement = sizeof(UIVertex_2018); return; } engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[1] { "2017.2.0" })) { mode = 0; sizeOfElement = sizeof(UIVertex_2017); } } public UIVertexWrapper(IntPtr ptr) { this.ptr = ptr; } } } namespace MelonUnityEngine.Rendering { internal static class VertexAttribute { public static int Vertex = 0; public static int Normal = 1; [NativeFieldValue(1u, NativeSignatureFlags.None, 7, new string[] { "2017.1.0" })] [NativeFieldValue(2u, NativeSignatureFlags.None, 2, new string[] { "2018.1.0" })] public static int Tangent = 0; [NativeFieldValue(1u, NativeSignatureFlags.None, 2, new string[] { "2017.1.0" })] [NativeFieldValue(2u, NativeSignatureFlags.None, 3, new string[] { "2018.1.0" })] public static int Color = 0; [NativeFieldValue(1u, NativeSignatureFlags.None, 3, new string[] { "2017.1.0" })] [NativeFieldValue(2u, NativeSignatureFlags.None, 4, new string[] { "2018.1.0" })] public static int TexCoord0 = 0; } } namespace MelonUnityEngine.CoreModule { internal sealed class SystemInfo { private delegate uint d_GetGraphicsDeviceType(); private static readonly d_GetGraphicsDeviceType m_GetGraphicsDeviceType; static SystemInfo() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) UnityVersion engineVersion = UnityInformationHandler.EngineVersion; if (NativeSignatureResolver.IsUnityVersionOverOrEqual(((UnityVersion)(ref engineVersion)).ToStringWithoutType(), new string[1] { "2018.1.0" })) { m_GetGraphicsDeviceType = UnityInternals.ResolveICall<d_GetGraphicsDeviceType>("UnityEngine.SystemInfo::GetGraphicsDeviceType"); } else { m_GetGraphicsDeviceType = UnityInternals.ResolveICall<d_GetGraphicsDeviceType>("UnityEngine.SystemInfo::get_graphicsDeviceType"); } } public static uint GetGraphicsDeviceType() { return m_GetGraphicsDeviceType(); } } } namespace Il2CppSystem { [StructLayout(LayoutKind.Explicit)] internal class Byte { [FieldOffset(0)] public byte m_value; static Byte() { InternalClassPointerStore<byte>.NativeClassPtr = UnityInternals.GetClass("mscorlib.dll", "System", "Byte"); UnityInternals.runtime_class_init(InternalClassPointerStore<byte>.NativeClassPtr); } } [StructLayout(LayoutKind.Explicit)] internal class Int32 { [FieldOffset(0)] public int m_value; static Int32() { InternalClassPointerStore<int>.NativeClassPtr = UnityInternals.GetClass("mscorlib.dll", "System", "Int32"); UnityInternals.runtime_class_init(InternalClassPointerStore<int>.NativeClassPtr); } } internal class Type : InternalObjectBase { private static readonly IntPtr m_internal_from_handle; static Type() { InternalClassPointerStore<Type>.NativeClassPtr = UnityInternals.GetClass("mscorlib.dll", "System", "Type"); m_internal_from_handle = UnityInternals.GetMethod(InternalClassPointerStore<Type>.NativeClassPtr, "internal_from_handle", "System.Type", "System.IntPtr"); } public Type(IntPtr ptr) : base(ptr) { } public unsafe static Type internal_from_handle(IntPtr handle) { void** ptr = stackalloc void*[1]; *ptr = &handle; IntPtr exc = default(IntPtr); IntPtr intPtr = UnityInternals.runtime_invoke(m_internal_from_handle, IntPtr.Zero, ptr, ref exc); Il2CppException.RaiseExceptionIfNecessary(exc); if (!(intPtr != IntPtr.Zero)) { return null; } return new Type(intPtr); } } } namespace UnhollowerMini { internal class Il2CppException : Exception { [ThreadStatic] private static byte[] ourMessageBytes; public static Func<IntPtr, string> ParseMessageHook; public Il2CppException(IntPtr exception) : base(BuildMessage(exception)) { } private unsafe static string BuildMessage(IntPtr exception) { if (ParseMessageHook != null) { return ParseMessageHook(exception); } if (ourMessageBytes == null) { ourMessageBytes = new byte[65536]; } fixed (byte* message = ourMessageBytes) { UnityInternals.format_exception(exception, message, ourMessageBytes.Length); } string @string = Encoding.UTF8.GetString(ourMessageBytes, 0, Array.IndexOf(ourMessageBytes, (byte)0)); fixed (byte* output = ourMessageBytes) { UnityInternals.format_stack_trace(exception, output, ourMessageBytes.Length); } return @string + "\n" + Encoding.UTF8.GetString(ourMessageBytes, 0, Array.IndexOf(ourMessageBytes, (byte)0)); } public static void RaiseExceptionIfNecessary(IntPtr returnedException) { if (returnedException == IntPtr.Zero) { return; } throw new Il2CppException(returnedException); } } internal static class InternalClassPointerStore<T> { public static IntPtr NativeClassPtr; public static System.Type CreatedTypeRedirect; static InternalClassPointerStore() { System.Type typeFromHandle = typeof(T); RuntimeHelpers.RunClassConstructor(typeFromHandle.TypeHandle); if (typeFromHandle.IsPrimitive || (object)typeFromHandle == typeof(string)) { MelonDebug.Msg("Running class constructor on Il2Cpp" + typeFromHandle.FullName); RuntimeHelpers.RunClassConstructor(typeof(InternalClassPointerStore<>).Assembly.GetType("Il2Cpp" + typeFromHandle.FullName).TypeHandle); MelonDebug.Msg("Done running class constructor"); } } } internal class InternalObjectBase { protected uint myGcHandle; public IntPtr Pointer { get { IntPtr intPtr = UnityInternals.gchandle_get_target(myGcHandle); if (intPtr == IntPtr.Zero) { throw new ObjectCollectedException("Object was garbage collected"); } return intPtr; } } protected InternalObjectBase() { } public InternalObjectBase(IntPtr pointer) { if (pointer == IntPtr.Zero) { throw new NullReferenceException(); } myGcHandle = UnityInternals.gchandle_new(pointer, pinned: false); } ~InternalObjectBase() { UnityInternals.gchandle_free(myGcHandle); } } internal static class InternalType { public static Il2CppSystem.Type TypeFromPointer(IntPtr classPointer, string typeName = "<unknown type>") { if (classPointer == IntPtr.Zero) { throw new ArgumentException(typeName + " does not have a corresponding internal class pointer"); } IntPtr intPtr = UnityInternals.class_get_type(classPointer); if (intPtr == IntPtr.Zero) { throw new ArgumentException(typeName + " does not have a corresponding class type pointer"); } return Il2CppSystem.Type.internal_from_handle(intPtr); } public static Il2CppSystem.Type Of<T>() { return TypeFromPointer(InternalClassPointerStore<T>.NativeClassPtr, typeof(T).Name); } } internal class ObjectCollectedException : Exception { public ObjectCollectedException(string message) : base(message) { } } internal static class UnityInternals { private delegate void delegate_gfunc_mono_assembly_foreach(IntPtr assembly, IntPtr user_data); private class InternalAssembly { public IntPtr ptr; public string name; public InternalAssembly(IntPtr ptr) { this.ptr = ptr; if (MelonUtils.IsGameIl2Cpp()) { name = Marshal.PtrToStringAnsi(il2cpp_image_get_filename(this.ptr)); } else { name = Marshal.PtrToStringAnsi(mono_image_get_filename(this.ptr)); } } } private class InternalClass { public IntPtr ptr; public string name; public string name_space; public InternalClass(IntPtr ptr) { this.ptr = ptr; if (MelonUtils.IsGameIl2Cpp()) { name = Marshal.PtrToStringAnsi(il2cpp_class_get_name(ptr)); name_space = Marshal.PtrToStringAnsi(il2cpp_class_get_namespace(ptr)); return; } throw new NotImplementedException(); } public InternalClass(IntPtr ptr, string name, string name_space) { if (MelonUtils.IsGameIl2Cpp()) { throw new NotImplementedException(); } this.ptr = ptr; this.name = name; this.name_space = name_space; } } private struct MonoMethod { public ushort flags; public ushort iflags; public uint token; public unsafe MonoClass* klass; public unsafe MonoMethodSignature* signature; public unsafe byte* name; public IntPtr method_pointer; public IntPtr invoke_pointer; public ushort bitfield; public int slot; internal unsafe void applyZeroes() { flags = 0; iflags = 0; token = 0u; klass = null; signature = null; name = null; method_pointer = IntPtr.Zero; invoke_pointer = IntPtr.Zero; bitfield = 0; slot = 0; } } private struct MonoMethodSignature { public IntPtr ret; public ushort param_cout; internal void ApplyZeroes() { ret = (IntPtr)0; param_cout = 0; } } private struct MonoClass { public unsafe MonoClass* element_class; public unsafe MonoClass* cast_class; public unsafe MonoClass** supertypes; public ushort idepth; public byte rank; public byte class_kind; public int instance_size; public uint bitfield1; public byte min_align; public uint bitfield2; private byte exception_type; public unsafe MonoClass* parent; public unsafe MonoClass* nested_in; public IntPtr nested_in_0x04; public IntPtr nested_in_0x08; public IntPtr nested_in_0x0C; public IntPtr nested_in_0x10; internal unsafe void applyZeroes() { element_class = null; cast_class = null; supertypes = null; idepth = 0; rank = 0; class_kind = 0; instance_size = 0; bitfield1 = 0u; min_align = 0; bitfield2 = 0u; exception_type = 0; parent = null; nested_in = null; nested_in_0x04 = (IntPtr)0; nested_in_0x08 = (IntPtr)0; nested_in_0x0C = (IntPtr)0; nested_in_0x10 = (IntPtr)0; } } private struct MonoType { public IntPtr data; public short attrs; public byte type; public byte bitflags; internal void applyZeroes() { data = (IntPtr)0; attrs = 0; type = 0; bitflags = 0; } } private static readonly IntPtr domain; private static readonly List<InternalAssembly> assemblies; private static readonly uint monoClassOffset; unsafe static UnityInternals() { assemblies = new List<InternalAssembly>(); monoClassOffset = 0u; if (MelonUtils.IsGameIl2Cpp()) { domain = il2cpp_domain_get(); uint size = 0u; IntPtr* ptr = il2cpp_domain_get_assemblies(domain, ref size); for (int i = 0; i < size; i++) { assemblies.Add(new InternalAssembly(il2cpp_assembly_get_image(ptr[i]))); } return; } domain = mono_domain_get(); MonoClass* ptr2 = (MonoClass*)(void*)Marshal.AllocHGlobal(sizeof(MonoClass)); ptr2->applyZeroes(); ptr2->nested_in_0x04 = (IntPtr)4660; ptr2->nested_in_0x08 = (IntPtr)22136; ptr2->nested_in_0x0C = (IntPtr)36882; long num = (long)mono_class_get_name((IntPtr)ptr2); MelonDebug.Msg($"returnedName {num:X}"); Marshal.FreeHGlobal((IntPtr)ptr2); switch (num) { case 4660L: monoClassOffset = 0u; break; case 22136L: monoClassOffset = (uint)IntPtr.Size; break; case 36882L: monoClassOffset = (uint)(IntPtr.Size * 2); break; default: throw new Exception("Failed to find MonoClass name offset"); } MelonDebug.Msg("monoClassOffset? " + monoClassOffset); } internal unsafe static IntPtr GetClass(string assemblyname, string name_space, string classname) { MelonDebug.Msg("GetClass " + assemblyname + " " + name_space + " " + classname); if (MelonUtils.IsGameIl2Cpp()) { IntPtr intPtr = il2cpp_class_from_name((assemblies.FirstOrDefault((InternalAssembly a) => a.name == assemblyname) ?? throw new Exception("Unable to find assembly " + assemblyname + " in il2cpp domain")).ptr, name_space, classname); MelonDebug.Msg($" > 0x{(long)intPtr:X}"); return intPtr; } string text = (string.IsNullOrEmpty(name_space) ? "" : (name_space + "." + classname)); System.Type type = (AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly a) => a.GetName().Name + ".dll" == assemblyname) ?? throw new Exception("Unable to find assembly " + assemblyname + " in mono domain")).GetType(text); if ((object)type == null) { throw new Exception("Unable to find class " + text + " in assembly " + assemblyname); } MelonDebug.Msg($" > 0x{(long)(*(IntPtr*)(void*)type.TypeHandle.Value):X}"); return *(IntPtr*)(void*)type.TypeHandle.Value; } public static IntPtr GetField(IntPtr clazz, string fieldName) { MelonDebug.Msg("GetField " + fieldName); if (clazz == IntPtr.Zero) { return IntPtr.Zero; } IntPtr intPtr = (MelonUtils.IsGameIl2Cpp() ? il2cpp_class_get_field_from_name(clazz, fieldName) : mono_class_get_field_from_name(clazz, fieldName)); if (intPtr == IntPtr.Zero) { throw new Exception("Field " + fieldName + " was not found on class " + Marshal.PtrToStringAnsi(MelonUtils.IsGameIl2Cpp() ? il2cpp_class_get_name(clazz) : mono_class_get_name(clazz))); } MelonDebug.Msg($" > 0x{(long)intPtr:X}"); return intPtr; } internal static IntPtr GetMethod(IntPtr clazz, string name, string returntype, params string[] parameters) { MelonDebug.Msg("GetMethod " + returntype + " " + name + "(" + string.Join(", ", parameters) + ")"); if (MelonUtils.IsGameIl2Cpp()) { IntPtr iter = IntPtr.Zero; IntPtr intPtr; while ((intPtr = il2cpp_class_get_methods(clazz, ref iter)) != IntPtr.Zero) { if (Marshal.PtrToStringAnsi(il2cpp_method_get_name(intPtr)) != name || Marshal.PtrToStringAnsi(il2cpp_type_get_name(il2cpp_method_get_return_type(intPtr))) != returntype || parameters.Length != il2cpp_method_get_param_count(intPtr)) { continue; } bool flag = true; for (uint num = 0u; num < parameters.Length; num++) { if (Marshal.PtrToStringAnsi(il2cpp_type_get_name(il2cpp_method_get_param(intPtr, num))) != parameters[num]) { flag = false; break; } } if (flag) { MelonDebug.Msg($" > 0x{(long)intPtr:X}"); return intPtr; } } } else { IntPtr iter2 = IntPtr.Zero; IntPtr intPtr2; while ((intPtr2 = mono_class_get_methods(clazz, ref iter2)) != IntPtr.Zero) { if (Marshal.PtrToStringAnsi(mono_method_get_name(intPtr2)) != name) { continue; } IntPtr sig = mono_method_get_signature(intPtr2, IntPtr.Zero, 0u); if (Marshal.PtrToStringAnsi(mono_type_get_name(mono_signature_get_return_type(sig))) != returntype || parameters.Length != mono_signature_get_param_count(sig)) { continue; } bool flag2 = true; IntPtr iter3 = IntPtr.Zero; int num2 = 0; IntPtr type; while ((type = mono_signature_get_params(sig, ref iter3)) != IntPtr.Zero) { if (Marshal.PtrToStringAnsi(mono_type_get_name(type)) != parameters[num2]) { flag2 = false; break; } num2++; } if (flag2) { MelonDebug.Msg($" > 0x{(long)intPtr2:X}"); return intPtr2; } } } throw new Exception("Unable to find method " + returntype + " " + name + "(" + string.Join(", ", parameters) + ")"); } public static IntPtr ObjectBaseToPtr(InternalObjectBase obj) { return obj?.Pointer ?? IntPtr.Zero; } public static IntPtr ObjectBaseToPtrNotNull(InternalObjectBase obj) { if (obj == null) { throw new NullReferenceException(); } return obj.Pointer; } public unsafe static IntPtr ManagedStringToInternal(string str) { if (str == null) { return IntPtr.Zero; } fixed (char* text = str) { if (!MelonUtils.IsGameIl2Cpp()) { return mono_string_new_utf16(domain, text, str.Length); } return il2cpp_string_new_utf16(text, str.Length); } } public unsafe static IntPtr ResolveICall(string signature) { MelonDebug.Msg("Resolving ICall " + signature); IntPtr intPtr; if (MelonUtils.IsGameIl2Cpp()) { intPtr = il2cpp_resolve_icall(signature); } else { MonoMethod* intPtr2 = IcallToFakeMonoMethod(signature); intPtr = mono_lookup_internal_call((IntPtr)intPtr2); DestroyFakeMonoMethod(intPtr2); } if (intPtr == IntPtr.Zero) { throw new Exception("ICall " + signature + " not resolved"); } MelonDebug.Msg($" > 0x{(long)intPtr:X}"); return intPtr; } public static T ResolveICall<T>(string signature) where T : Delegate { IntPtr intPtr = ResolveICall(signature); if (!(intPtr == IntPtr.Zero)) { return (T)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(T)); } return null; } private unsafe static MonoMethod* IcallToFakeMonoMethod(string icallName) { string[] array = icallName.Split(new string[1] { "::" }, StringSplitOptions.None); int num = array[1].IndexOf('('); if (num >= 0) { array[1] = array[1].Substring(0, num); } MonoMethod* ptr = (MonoMethod*)(void*)Marshal.AllocHGlobal(sizeof(MonoMethod) + 256); ptr->applyZeroes(); ptr->klass = (MonoClass*)(void*)Marshal.AllocHGlobal(sizeof(MonoClass) + 256); ptr->klass->applyZeroes(); ptr->name = (byte*)(void*)Marshal.StringToHGlobalAnsi(array[1]); int num2 = array[0].LastIndexOf('.'); if (num2 < 0) { *(IntPtr*)((ulong)(&ptr->klass->nested_in_0x08) + (ulong)monoClassOffset) = Marshal.StringToHGlobalAnsi(""); *(IntPtr*)((ulong)(&ptr->klass->nested_in_0x04) + (ulong)monoClassOffset) = Marshal.StringToHGlobalAnsi(array[0]); } else { string s = array[0].Substring(0, num2); string s2 = array[0].Substring(num2 + 1); *(IntPtr*)((ulong)(&ptr->klass->nested_in_0x08) + (ulong)monoClassOffset) = Marshal.StringToHGlobalAnsi(s); *(IntPtr*)((ulong)(&ptr->klass->nested_in_0x04) + (ulong)monoClassOffset) = Marshal.StringToHGlobalAnsi(s2); } MonoMethodSignature* ptr2 = (MonoMethodSignature*)(void*)Marshal.AllocHGlobal(sizeof(MonoMethodSignature)); ptr2->ApplyZeroes(); ptr->signature = ptr2; return ptr; } private unsafe static void DestroyFakeMonoMethod(MonoMethod* monoMethod) { Marshal.FreeHGlobal((IntPtr)monoMethod->signature); Marshal.FreeHGlobal(*(IntPtr*)((ulong)(&monoMethod->klass->nested_in_0x04) + (ulong)monoClassOffset)); Marshal.FreeHGlobal(*(IntPtr*)((ulong)(&monoMethod->klass->nested_in_0x08) + (ulong)monoClassOffset)); Marshal.FreeHGlobal((IntPtr)monoMethod->klass); Marshal.FreeHGlobal((IntPtr)monoMethod->name); Marshal.FreeHGlobal((IntPtr)monoMethod); } public static IntPtr class_get_type(IntPtr klass) { if (!MelonUtils.IsGameIl2Cpp()) { return mono_class_get_type(klass); } return il2cpp_class_get_type(klass); } public static void runtime_class_init(IntPtr klass) { if (klass == IntPtr.Zero) { throw new ArgumentException("Class to init is null"); } if (MelonUtils.IsGameIl2Cpp()) { il2cpp_runtime_class_init(klass); } else { mono_runtime_class_init(klass); } } public unsafe static IntPtr runtime_invoke(IntPtr method, IntPtr obj, void** param, ref IntPtr exc) { if (!MelonUtils.IsGameIl2Cpp()) { return mono_runtime_invoke(method, obj, param, ref exc); } return il2cpp_runtime_invoke(method, obj, param, ref exc); } public static IntPtr array_new(IntPtr elementTypeInfo, ulong length) { if (!MelonUtils.IsGameIl2Cpp()) { return mono_array_new(domain, elementTypeInfo, length); } return il2cpp_array_new(elementTypeInfo, length); } public unsafe static uint array_length(IntPtr array) { if (!MelonUtils.IsGameIl2Cpp()) { return *(uint*)((long)array + IntPtr.Size * 3); } return il2cpp_array_length(array); } public static uint field_get_offset(IntPtr field) { if (!MelonUtils.IsGameIl2Cpp()) { return mono_field_get_offset(field); } return il2cpp_field_get_offset(field); } public static IntPtr object_unbox(IntPtr obj) { if (!MelonUtils.IsGameIl2Cpp()) { return mono_object_unbox(obj); } return il2cpp_object_unbox(obj); } public static IntPtr object_new(IntPtr klass) { if (!MelonUtils.IsGameIl2Cpp()) { return mono_object_new(domain, klass); } return il2cpp_object_new(klass); } public static int class_value_size(IntPtr klass, ref uint align) { if (!MelonUtils.IsGameIl2Cpp()) { return mono_class_value_size(klass, ref align); } return il2cpp_class_value_size(klass, ref align); } public static uint gchandle_new(IntPtr obj, bool pinned) { if (!MelonUtils.IsGameIl2Cpp()) { return mono_gchandle_new(obj, pinned ? 1 : 0); } return il2cpp_gchandle_new(obj, pinned); } public static void gchandle_free(uint gchandle) { if (MelonUtils.IsGameIl2Cpp()) { il2cpp_gchandle_free(gchandle); } else { mono_gchandle_free(gchandle); } } public static IntPtr gchandle_get_target(uint gchandle) { if (!MelonUtils.IsGameIl2Cpp()) { return mono_gchandle_get_target(gchandle); } return il2cpp_gchandle_get_target(gchandle); } public static IntPtr value_box(IntPtr klass, IntPtr val) { if (!MelonUtils.IsGameIl2Cpp()) { return mono_value_box(domain, klass, val); } return il2cpp_value_box(klass, val); } public unsafe static void format_exception(IntPtr ex, void* message, int message_size) { if (MelonUtils.IsGameIl2Cpp()) { il2cpp_format_exception(ex, message, message_size); } } public unsafe static void format_stack_trace(IntPtr ex, void* output, int output_size) { if (MelonUtils.IsGameIl2Cpp()) { il2cpp_format_stack_trace(ex, output, output_size); } } [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_domain_get(); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern void mono_assembly_foreach(delegate_gfunc_mono_assembly_foreach func, IntPtr user_data); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_assembly_get_image(IntPtr assembly); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_image_get_filename(IntPtr image); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern uint mono_image_get_class_count(IntPtr image); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_image_get_class(IntPtr image, uint index); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_class_get_name(IntPtr klass); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_class_get_namespace(IntPtr klass); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_lookup_internal_call(IntPtr method); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] public static extern IntPtr mono_class_get_type(IntPtr klass); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private unsafe static extern IntPtr mono_runtime_invoke(IntPtr method, IntPtr obj, void** param, ref IntPtr exc); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern void mono_runtime_class_init(IntPtr klass); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_array_new(IntPtr domain, IntPtr eclass, ulong n); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern uint mono_field_get_offset(IntPtr field); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_object_unbox(IntPtr obj); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_object_new(IntPtr domain, IntPtr klass); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern int mono_class_value_size(IntPtr klass, ref uint align); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern uint mono_gchandle_new(IntPtr obj, int pinned); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern void mono_gchandle_free(uint gchandle); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_gchandle_get_target(uint gchandle); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_class_get_field_from_name(IntPtr klass, [MarshalAs(UnmanagedType.LPStr)] string name); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_value_box(IntPtr domain, IntPtr klass, IntPtr data); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_class_get_methods(IntPtr klass, ref IntPtr iter); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] public static extern IntPtr mono_method_get_name(IntPtr method); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_type_get_name(IntPtr type); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_image_get_table_info(IntPtr image, int table_id); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern int mono_table_info_get_rows(IntPtr table); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern void mono_metadata_decode_row(IntPtr t, int idx, uint[] res, int res_size); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_metadata_string_heap(IntPtr meta, uint index); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_class_from_name(IntPtr image, string name_space, string name); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_domain_try_type_resolve(IntPtr domain, string name, IntPtr typebuilder_raw); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_method_get_signature(IntPtr method, IntPtr image, uint token); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_signature_get_return_type(IntPtr sig); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern uint mono_signature_get_param_count(IntPtr sig); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr mono_signature_get_params(IntPtr sig, ref IntPtr iter); [DllImport("__Internal", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private unsafe static extern IntPtr mono_string_new_utf16(IntPtr domain, char* text, int len); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_domain_get(); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_resolve_icall([MarshalAs(UnmanagedType.LPStr)] string name); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern uint il2cpp_array_length(IntPtr array); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_array_new(IntPtr elementTypeInfo, ulong length); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_assembly_get_image(IntPtr assembly); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_class_get_field_from_name(IntPtr klass, [MarshalAs(UnmanagedType.LPStr)] string name); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_class_get_methods(IntPtr klass, ref IntPtr iter); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_class_get_name(IntPtr klass); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_class_get_namespace(IntPtr klass); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] public static extern IntPtr il2cpp_class_get_type(IntPtr klass); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern int il2cpp_class_value_size(IntPtr klass, ref uint align); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private unsafe static extern IntPtr* il2cpp_domain_get_assemblies(IntPtr domain, ref uint size); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private unsafe static extern void il2cpp_format_exception(IntPtr ex, void* message, int message_size); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private unsafe static extern void il2cpp_format_stack_trace(IntPtr ex, void* output, int output_size); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern uint il2cpp_field_get_offset(IntPtr field); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern uint il2cpp_gchandle_new(IntPtr obj, bool pinned); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_gchandle_get_target(uint gchandle); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern void il2cpp_gchandle_free(uint gchandle); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_method_get_return_type(IntPtr method); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern uint il2cpp_method_get_param_count(IntPtr method); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_method_get_param(IntPtr method, uint index); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] public static extern IntPtr il2cpp_method_get_name(IntPtr method); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_object_new(IntPtr klass); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_object_unbox(IntPtr obj); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_value_box(IntPtr klass, IntPtr data); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private unsafe static extern IntPtr il2cpp_runtime_invoke(IntPtr method, IntPtr obj, void** param, ref IntPtr exc); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern void il2cpp_runtime_class_init(IntPtr klass); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private unsafe static extern IntPtr il2cpp_string_new_utf16(char* text, int len); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_type_get_name(IntPtr type); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_image_get_filename(IntPtr image); [DllImport("GameAssembly", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr il2cpp_class_from_name(IntPtr image, string namespaze, string name); } } namespace mgGif { internal class Decoder : IDisposable { private enum ImageFlag { Interlaced = 64, ColourTable = 128, TableSizeMask = 7, BitDepthMask = 112 } private enum Block { Image = 44, Extension = 33, End = 59 } private enum Extension { GraphicControl = 249, Comments = 254, PlainText = 1, ApplicationData = 255 } private enum Disposal { None = 0, DoNotDispose = 4, RestoreBackground = 8, ReturnToPrevious = 12 } private enum ControlFlags { HasTransparency = 1, DisposalMask = 12 } public string Version; public ushort Width; public ushort Height; public Color32 BackgroundColour; private const uint NoCode = 65535u; private const ushort NoTransparency = ushort.MaxValue; private byte[] Input; private int D; private Color32[] GlobalColourTable; private Color32[] LocalColourTable; private Color32[] ActiveColourTable; private ushort TransparentIndex; private Image Image = new Image(); private ushort ImageLeft; private ushort ImageTop; private ushort ImageWidth; private ushort ImageHeight; private Color32[] Output; private Color32[] PreviousImage; private readonly int[] Pow2 = new int[13] { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 }; private int[] Indices = new int[4096]; private ushort[] Codes = new ushort[131072]; private uint[] CurBlock = new uint[64]; public Decoder(byte[] data) : this() { Load(data); } public Decoder Load(byte[] data) { Input = data; D = 0; GlobalColourTable = new Color32[256]; LocalColourTable = new Color32[256]; TransparentIndex = ushort.MaxValue; Output = null; PreviousImage = null; Image.Delay = 0; return this; } private byte ReadByte() { return Input[D++]; } private ushort ReadUInt16() { return (ushort)(Input[D++] | (Input[D++] << 8)); } private void ReadHeader() { if (Input == null || Input.Length <= 12) { throw new Exception("Invalid data"); } Version = Encoding.ASCII.GetString(Input, 0, 6); D = 6; if (Version != "GIF87a" && Version != "GIF89a") { throw new Exception("Unsupported GIF version"); } Width = ReadUInt16(); Height = ReadUInt16(); Image.Width = Width; Image.Height = Height; ImageFlag imageFlag = (ImageFlag)ReadByte(); byte b = ReadByte(); ReadByte(); if (EnumExtensions.HasFlag((Enum)imageFlag, (Enum)ImageFlag.ColourTable)) { ReadColourTable(GlobalColourTable, imageFlag); } BackgroundColour = GlobalColourTable[b]; } public Image NextImage() { if (D == 0) { ReadHeader(); } while (true) { switch ((Block)ReadByte()) { case Block.Image: { Image image = ReadImageBlock(); if (image != null) { return image; } break; } case Block.Extension: if (ReadByte() == 249) { ReadControlBlock(); } else { SkipBlocks(); } break; case Block.End: return null; default: throw new Exception("Unexpected block type"); } } } private Color32[] ReadColourTable(Color32[] colourTable, ImageFlag flags) { int num = Pow2[(int)((flags & ImageFlag.TableSizeMask) + 1)]; for (int i = 0; i < num; i++) { colourTable[i] = new Color32(Input[D++], Input[D++], Input[D++], byte.MaxValue); } return colourTable; } private void SkipBlocks() { for (byte b = Input[D++]; b != 0; b = Input[D++]) { D += b; } } private void ReadControlBlock() { ReadByte(); byte num = ReadByte(); Image.Delay = ReadUInt16() * 10; byte transparentIndex = ReadByte(); ReadByte(); if (EnumExtensions.HasFlag((Enum)(ControlFlags)num, (Enum)ControlFlags.HasTransparency)) { TransparentIndex = transparentIndex; } else { TransparentIndex = ushort.MaxValue; } switch ((Disposal)(num & 0xC)) { default: PreviousImage = Output; break; case Disposal.RestoreBackground: Output = new Color32[Width * Height]; break; case Disposal.ReturnToPrevious: Output = new Color32[Width * Height]; if (PreviousImage != null) { Array.Copy(PreviousImage, Output, Output.Length); } break; } } private Image ReadImageBlock() { ImageLeft = ReadUInt16(); ImageTop = ReadUInt16(); ImageWidth = ReadUInt16(); ImageHeight = ReadUInt16(); ImageFlag imageFlag = (ImageFlag)ReadByte(); if (ImageWidth == 0 || ImageHeight == 0) { return null;
BepInEx/plugins/BepInEx-BepInEx_MLLoader/Mono.dll.old
Decompiled 8 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using MelonLoader; using MelonLoader.Support.Preferences; using Tomlet; using Tomlet.Models; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("MelonLoader")] [assembly: AssemblyDescription("MelonLoader")] [assembly: AssemblyCompany("discord.gg/2Wn3N2P")] [assembly: AssemblyProduct("MelonLoader")] [assembly: AssemblyCopyright("Created by Lava Gang")] [assembly: AssemblyTrademark("discord.gg/2Wn3N2P")] [assembly: Guid("EE48CA52-CCD3-48A5-B507-91773672E216")] [assembly: AssemblyFileVersion("0.5.7")] [assembly: PatchShield] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.5.7.0")] [module: UnverifiableCode] namespace MelonLoader.Support { internal static class Main { internal static ISupportModule_From Interface; internal static GameObject obj; internal static SM_Component component; private static ISupportModule_To Initialize(ISupportModule_From interface_from) { Interface = interface_from; UnityMappers.RegisterMappers(); if (IsUnity53OrLower()) { SM_Component.Create(); } else { SceneHandler.Init(); } return (ISupportModule_To)(object)new SupportModule_To(); } private static bool IsUnity53OrLower() { try { Assembly assembly = Assembly.Load("UnityEngine"); if ((object)assembly == null) { return true; } Type type = assembly.GetType("UnityEngine.SceneManagement.SceneManager"); if ((object)type == null) { return true; } if ((object)type.GetEvent("sceneLoaded") == null) { return true; } return false; } catch { return true; } } } internal class SM_Component : MonoBehaviour { private bool isQuitting; private static MethodInfo SetAsLastSiblingMethod; static SM_Component() { try { SetAsLastSiblingMethod = typeof(Transform).GetMethod("SetAsLastSibling", BindingFlags.Instance | BindingFlags.Public); } catch (Exception arg) { MelonLogger.Warning($"Exception while Getting Transform.SetAsLastSibling: {arg}"); } } internal static void Create() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown if (!((Object)(object)Main.component != (Object)null)) { Main.obj = new GameObject(); Object.DontDestroyOnLoad((Object)(object)Main.obj); ((Object)Main.obj).hideFlags = (HideFlags)52; Main.component = (SM_Component)(object)Main.obj.AddComponent(typeof(SM_Component)); Main.component.SiblingFix(); } } private void SiblingFix() { SetAsLastSiblingMethod?.Invoke(((Component)this).gameObject.transform, new object[0]); SetAsLastSiblingMethod?.Invoke(((Component)this).transform, new object[0]); } internal void Destroy() { Object.Destroy((Object)(object)((Component)this).gameObject); } private void Start() { if (!((Object)(object)Main.component != (Object)null) || !((Object)(object)Main.component != (Object)(object)this)) { SiblingFix(); Main.Interface.OnApplicationLateStart(); } } private void Awake() { if ((Object)(object)Main.component != (Object)null && (Object)(object)Main.component != (Object)(object)this) { return; } foreach (IEnumerator queuedCoroutine in SupportModule_To.QueuedCoroutines) { ((MonoBehaviour)this).StartCoroutine(queuedCoroutine); } SupportModule_To.QueuedCoroutines.Clear(); } private void Update() { if (!((Object)(object)Main.component != (Object)null) || !((Object)(object)Main.component != (Object)(object)this)) { isQuitting = false; SiblingFix(); SceneHandler.OnUpdate(); Main.Interface.Update(); } } private void OnDestroy() { if (!((Object)(object)Main.component != (Object)null) || !((Object)(object)Main.component != (Object)(object)this)) { if (!isQuitting) { Create(); } else { OnApplicationDefiniteQuit(); } } } private void OnApplicationQuit() { if (!((Object)(object)Main.component != (Object)null) || !((Object)(object)Main.component != (Object)(object)this)) { isQuitting = true; Main.Interface.Quit(); } } private void OnApplicationDefiniteQuit() { Main.Interface.DefiniteQuit(); } private void FixedUpdate() { if (!((Object)(object)Main.component != (Object)null) || !((Object)(object)Main.component != (Object)(object)this)) { Main.Interface.FixedUpdate(); } } private void LateUpdate() { if (!((Object)(object)Main.component != (Object)null) || !((Object)(object)Main.component != (Object)(object)this)) { Main.Interface.LateUpdate(); } } private void OnGUI() { if (!((Object)(object)Main.component != (Object)null) || !((Object)(object)Main.component != (Object)(object)this)) { Main.Interface.OnGUI(); } } } internal class SupportModule_To : ISupportModule_To { internal static readonly List<IEnumerator> QueuedCoroutines = new List<IEnumerator>(); public object StartCoroutine(IEnumerator coroutine) { if ((Object)(object)Main.component != (Object)null) { return ((MonoBehaviour)Main.component).StartCoroutine(coroutine); } QueuedCoroutines.Add(coroutine); return coroutine; } public void StopCoroutine(object coroutineToken) { if ((Object)(object)Main.component == (Object)null) { QueuedCoroutines.Remove(coroutineToken as IEnumerator); } else { ((MonoBehaviour)Main.component).StopCoroutine((Coroutine)((coroutineToken is Coroutine) ? coroutineToken : null)); } } public void UnityDebugLog(string msg) { Debug.Log((object)msg); } } internal static class SceneHandler { internal class SceneInitEvent { internal int buildIndex; internal string name; internal bool wasLoadedThisTick; } private static Queue<SceneInitEvent> scenesLoaded = new Queue<SceneInitEvent>(); internal static void Init() { try { SceneManager.sceneLoaded += OnSceneLoad; } catch (Exception arg) { MelonLogger.Error($"SceneManager.sceneLoaded override failed: {arg}"); } try { SceneManager.sceneUnloaded += OnSceneUnload; } catch (Exception arg2) { MelonLogger.Error($"SceneManager.sceneUnloaded override failed: {arg2}"); } } private static void OnSceneLoad(Scene scene, LoadSceneMode mode) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Main.obj == (Object)null) { SM_Component.Create(); } if ((object)scene != null) { Main.Interface.OnSceneWasLoaded(((Scene)(ref scene)).buildIndex, ((Scene)(ref scene)).name); scenesLoaded.Enqueue(new SceneInitEvent { buildIndex = ((Scene)(ref scene)).buildIndex, name = ((Scene)(ref scene)).name }); } } private static void OnSceneUnload(Scene scene) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) if ((object)scene != null) { Main.Interface.OnSceneWasUnloaded(((Scene)(ref scene)).buildIndex, ((Scene)(ref scene)).name); } } internal static void OnUpdate() { if (scenesLoaded.Count <= 0) { return; } Queue<SceneInitEvent> queue = new Queue<SceneInitEvent>(); SceneInitEvent sceneInitEvent = null; while (scenesLoaded.Count > 0 && (sceneInitEvent = scenesLoaded.Dequeue()) != null) { if (sceneInitEvent.wasLoadedThisTick) { Main.Interface.OnSceneWasInitialized(sceneInitEvent.buildIndex, sceneInitEvent.name); continue; } sceneInitEvent.wasLoadedThisTick = true; queue.Enqueue(sceneInitEvent); } while (queue.Count > 0 && (sceneInitEvent = queue.Dequeue()) != null) { scenesLoaded.Enqueue(sceneInitEvent); } } } } namespace MelonLoader.Support.Preferences { internal static class UnityMappers { internal static void RegisterMappers() { TomletMain.RegisterMapper<Color>((Serialize<Color>)WriteColor, (Deserialize<Color>)ReadColor); TomletMain.RegisterMapper<Color32>((Serialize<Color32>)WriteColor32, (Deserialize<Color32>)ReadColor32); TomletMain.RegisterMapper<Vector2>((Serialize<Vector2>)WriteVector2, (Deserialize<Vector2>)ReadVector2); TomletMain.RegisterMapper<Vector3>((Serialize<Vector3>)WriteVector3, (Deserialize<Vector3>)ReadVector3); TomletMain.RegisterMapper<Vector4>((Serialize<Vector4>)WriteVector4, (Deserialize<Vector4>)ReadVector4); TomletMain.RegisterMapper<Quaternion>((Serialize<Quaternion>)WriteQuaternion, (Deserialize<Quaternion>)ReadQuaternion); } private static Color ReadColor(TomlValue value) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) float[] array = MelonPreferences.Mapper.ReadArray<float>(value); if (array == null || array.Length != 4) { return default(Color); } return new Color(array[0] / 255f, array[1] / 255f, array[2] / 255f, array[3] / 255f); } private static TomlValue WriteColor(Color value) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0017: 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_0035: Unknown result type (might be due to invalid IL or missing references) float[] array = new float[4] { value.r * 255f, value.g * 255f, value.b * 255f, value.a * 255f }; return (TomlValue)(object)MelonPreferences.Mapper.WriteArray<float>(array); } private static Color32 ReadColor32(TomlValue value) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) byte[] array = MelonPreferences.Mapper.ReadArray<byte>(value); if (array == null || array.Length != 4) { return default(Color32); } return new Color32(array[0], array[1], array[2], array[3]); } private static TomlValue WriteColor32(Color32 value) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0011: 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) //IL_0023: Unknown result type (might be due to invalid IL or missing references) byte[] array = new byte[4] { value.r, value.g, value.b, value.a }; return (TomlValue)(object)MelonPreferences.Mapper.WriteArray<byte>(array); } private static Vector2 ReadVector2(TomlValue value) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) float[] array = MelonPreferences.Mapper.ReadArray<float>(value); if (array == null || array.Length != 2) { return default(Vector2); } return new Vector2(array[0], array[1]); } private static TomlValue WriteVector2(Vector2 value) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) float[] array = new float[2] { value.x, value.y }; return (TomlValue)(object)MelonPreferences.Mapper.WriteArray<float>(array); } private static Vector3 ReadVector3(TomlValue value) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: 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) float[] array = MelonPreferences.Mapper.ReadArray<float>(value); if (array == null || array.Length != 3) { return default(Vector3); } return new Vector3(array[0], array[1], array[2]); } private static TomlValue WriteVector3(Vector3 value) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0011: 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) float[] array = new float[3] { value.x, value.y, value.z }; return (TomlValue)(object)MelonPreferences.Mapper.WriteArray<float>(array); } private static Vector4 ReadVector4(TomlValue value) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) float[] array = MelonPreferences.Mapper.ReadArray<float>(value); if (array == null || array.Length != 4) { return default(Vector4); } return new Vector4(array[0], array[1], array[2], array[3]); } private static TomlValue WriteVector4(Vector4 value) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0011: 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) //IL_0023: Unknown result type (might be due to invalid IL or missing references) float[] array = new float[4] { value.x, value.y, value.z, value.w }; return (TomlValue)(object)MelonPreferences.Mapper.WriteArray<float>(array); } private static Quaternion ReadQuaternion(TomlValue value) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) float[] array = MelonPreferences.Mapper.ReadArray<float>(value); if (array == null || array.Length != 4) { return default(Quaternion); } return new Quaternion(array[0], array[1], array[2], array[3]); } private static TomlValue WriteQuaternion(Quaternion value) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0011: 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) //IL_0023: Unknown result type (might be due to invalid IL or missing references) float[] array = new float[4] { value.x, value.y, value.z, value.w }; return (TomlValue)(object)MelonPreferences.Mapper.WriteArray<float>(array); } } }
BepInEx/plugins/BepInEx-BepInEx_MLLoader/Muse_Dash_Mono.dll.old
Decompiled 8 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using MelonLoader; using MelonLoader.Modules; using MelonLoader.MonoInternals; using ModHelper; using ModLoader; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("MelonLoader")] [assembly: AssemblyDescription("MelonLoader")] [assembly: AssemblyCompany("discord.gg/2Wn3N2P")] [assembly: AssemblyProduct("MelonLoader")] [assembly: AssemblyCopyright("Created by Lava Gang")] [assembly: AssemblyTrademark("discord.gg/2Wn3N2P")] [assembly: Guid("C268E68B-3DF1-4EE3-A49F-750A8F55B799")] [assembly: AssemblyFileVersion("0.5.7")] [assembly: PatchShield] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.5.7.0")] [module: UnverifiableCode] namespace ModLoader { public class ModLoader { internal static List<IMod> mods = new List<IMod>(); internal static Dictionary<string, Assembly> depends = new Dictionary<string, Assembly>(); public static void LoadDependency(Assembly assembly) { string[] manifestResourceNames = assembly.GetManifestResourceNames(); foreach (string text in manifestResourceNames) { string text2 = assembly.GetName().Name + ".Depends."; if (!text.StartsWith(text2) || !text.EndsWith(".dll")) { continue; } string text3 = text.Remove(text.LastIndexOf(".dll")).Remove(0, text2.Length); if (depends.ContainsKey(text3)) { MelonLogger.Error("Dependency conflict: " + text3 + " First at: " + depends[text3].GetName().Name); continue; } Assembly value; using (Stream stream = assembly.GetManifestResourceStream(text)) { byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); value = Assembly.Load(array); } depends.Add(text3, value); } } } } namespace ModHelper { public interface IMod { string Name { get; } string Description { get; } string Author { get; } string HomePage { get; } void DoPatching(); } public static class ModLogger { public static void Debug(object obj) { StackFrame? frame = new StackTrace().GetFrame(1); string name = frame.GetMethod().ReflectedType.Name; string name2 = frame.GetMethod().Name; AddLog(name, name2, obj); } public static void AddLog(string className, string methodName, object obj) { MelonLogger.Msg($"[{className}:{methodName}]: {obj}"); } } } namespace MelonLoader { internal class MuseDashModWrapper : MelonMod { internal IMod modInstance; public override void OnInitializeMelon() { modInstance.DoPatching(); } } } namespace MelonLoader.CompatibilityLayers { internal class Muse_Dash_Mono_Module : MelonModule { public override void OnInitialize() { string[] obj = new string[2] { "ModHelper", "ModLoader" }; Assembly assembly = typeof(Muse_Dash_Mono_Module).Assembly; string[] array = obj; for (int i = 0; i < array.Length; i++) { MonoResolveManager.GetAssemblyResolveInfo(array[i]).Override = assembly; } MelonAssembly.CustomMelonResolvers += Resolve; } private ResolvedMelons Resolve(Assembly asm) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown IEnumerable<Type> validTypes = MelonUtils.GetValidTypes(asm, (LemonFunc<Type, bool>)delegate(Type x) { Type[] interfaces = x.GetInterfaces(); return interfaces != null && interfaces.Any() && interfaces.Contains(typeof(IMod)); }); if (validTypes != null && validTypes.Any()) { List<MelonBase> list = new List<MelonBase>(); List<RottenMelon> list2 = new List<RottenMelon>(); foreach (Type item in validTypes) { RottenMelon rottenMelon; MelonBase val = LoadMod(asm, item, out rottenMelon); if (val != null) { list.Add(val); } else { list2.Add(rottenMelon); } } return new ResolvedMelons(list.ToArray(), list2.ToArray()); } return new ResolvedMelons((MelonBase[])null, (RottenMelon[])null); } private MelonBase LoadMod(Assembly asm, Type modType, out RottenMelon rottenMelon) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown rottenMelon = null; IMod mod; try { mod = Activator.CreateInstance(modType) as IMod; } catch (Exception ex) { rottenMelon = new RottenMelon(modType, "Failed to create an instance of the MMDL Mod.", ex); return null; } string text = mod.Name; if (string.IsNullOrEmpty(text)) { text = modType.FullName; } string text2 = asm.GetName().Version.ToString(); if (string.IsNullOrEmpty(text2) || text2.Equals("0.0.0.0")) { text2 = "1.0.0.0"; } MuseDashModWrapper museDashModWrapper = MelonBase.CreateWrapper<MuseDashModWrapper>(text, (string)null, text2, (MelonGameAttribute[])null, (MelonProcessAttribute[])null, 0, (ConsoleColor?)null, (ConsoleColor?)null, (string)null); museDashModWrapper.modInstance = mod; global::ModLoader.ModLoader.mods.Add(mod); global::ModLoader.ModLoader.LoadDependency(asm); return (MelonBase)(object)museDashModWrapper; } } }
BepInEx/plugins/BepInEx-BepInEx_MLLoader/Preload.dll.old
Decompiled 8 months agousing System.CodeDom.Compiler; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using MelonLoader.Support.Properties; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("MelonLoader")] [assembly: AssemblyDescription("MelonLoader")] [assembly: AssemblyCompany("discord.gg/2Wn3N2P")] [assembly: AssemblyProduct("MelonLoader")] [assembly: AssemblyCopyright("Created by Lava Gang")] [assembly: AssemblyTrademark("discord.gg/2Wn3N2P")] [assembly: Guid("08BE056B-C854-4F88-92E8-F3B39187B6AF")] [assembly: AssemblyFileVersion("0.5.7")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.5.7.0")] [module: UnverifiableCode] namespace MelonLoader { public static class BuildInfo { public const string Name = "MelonLoader"; public const string Description = "MelonLoader"; public const string Author = "Lava Gang"; public const string Company = "discord.gg/2Wn3N2P"; public const string Version = "0.5.7"; } } namespace MelonLoader.Support { internal static class Preload { private static void Initialize() { string path = string.Copy(GetManagedDirectory()); string path2 = Path.Combine(path, "System.dll"); if (!File.Exists(path2)) { File.WriteAllBytes(path2, Resources.System); } string path3 = Path.Combine(path, "System.Core.dll"); if (!File.Exists(path3)) { File.WriteAllBytes(path3, Resources.System_Core); } } [MethodImpl(MethodImplOptions.InternalCall)] [return: MarshalAs(UnmanagedType.LPStr)] private static extern string GetManagedDirectory(); } } namespace MelonLoader.Support.Properties { [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [DebuggerNonUserCode] [CompilerGenerated] internal class Resources { private static ResourceManager resourceMan; private static CultureInfo resourceCulture; [EditorBrowsable(EditorBrowsableState.Advanced)] internal static ResourceManager ResourceManager { get { if (resourceMan == null) { resourceMan = new ResourceManager("MelonLoader.Support.Properties.Resources", typeof(Resources).Assembly); } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] internal static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } internal static byte[] System => (byte[])ResourceManager.GetObject("System", resourceCulture); internal static byte[] System_Core => (byte[])ResourceManager.GetObject("System_Core", resourceCulture); internal Resources() { } } }
BepInEx/plugins/bizzlemip-BiggerLobby/BiggerLobby.dll
Decompiled 8 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using BiggerLobby.Models; using BiggerLobby.Patches; using BiggerLobby.UI; using Dissonance.Audio.Playback; using GameNetcodeStuff; using HarmonyLib; using LC_API.ServerAPI; using Microsoft.CodeAnalysis; using Steamworks; using Steamworks.Data; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; 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: AssemblyCompany("BiggerLobby")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Increase the max players to 50 in Lethal Company")] [assembly: AssemblyFileVersion("2.7.0.0")] [assembly: AssemblyInformationalVersion("2.7.0")] [assembly: AssemblyProduct("BiggerLobby")] [assembly: AssemblyTitle("BiggerLobby")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.7.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.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 BiggerLobby { public static class Helper { public static T[] ResizeArray<T>(T[] oldArray, int newSize) { if (oldArray.Length >= newSize) { return oldArray; } T[] array = new T[newSize]; oldArray.CopyTo(array, 0); return array; } public static void ResizeList<T>(this List<T> list, int size, T element = default(T)) { int count = list.Count; if (size < count) { list.RemoveRange(size, count - size); } else if (size > count) { if (size > list.Capacity) { list.Capacity = size; } list.AddRange(Enumerable.Repeat(element, size - count)); } } } [BepInPlugin("BiggerLobby", "BiggerLobby", "2.7.0")] public class Plugin : BaseUnityPlugin { public static Plugin Instance; public static bool oldhastime; public static int MaxPlayers = 16; public static bool instantiating; public static NetworkObject[] PlayerObjects = (NetworkObject[])(object)new NetworkObject[0]; public static Harmony _harmony; public static Harmony _harmony2; public static ConfigEntry<int>? _LoudnessMultiplier; public static bool Initialized = false; public static IDictionary<uint, NetworkObject> CustomNetObjects = new Dictionary<uint, NetworkObject>(); internal static ManualLogSource? Logger { get; set; } private void Awake() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown Instance = this; _LoudnessMultiplier = ((BaseUnityPlugin)this).Config.Bind<int>("General", "Player loudness", 1, "Default player loudness"); Logger = ((BaseUnityPlugin)this).Logger; _harmony = new Harmony("BiggerLobby"); _harmony2 = new Harmony("BiggerLobbyA"); _harmony.PatchAll(typeof(NonGamePatches)); _harmony.PatchAll(typeof(NonGamePatches.InternalPatches)); _harmony.PatchAll(typeof(NonGamePatches.InternalPatches2)); CustomNetObjects.Clear(); _harmony2.PatchAll(typeof(ChatPatches)); _harmony2.PatchAll(typeof(ListSizeTranspilers)); _harmony2.PatchAll(typeof(PlayerObjects)); Logger.LogInfo((object)"BiggerLobby loaded"); } private void Start() { Initialize(); } private void OnDestroy() { Initialize(); } private void Initialize() { if (!Initialized) { Initialized = true; ModdedServer.SetServerModdedOnly(); } } public static int GetPlayerCount() { return MaxPlayers; } public static int GetPlayerCountMinusOne() { return MaxPlayers - 1; } public static PlayerControllerB[] GetRealPlayerScripts(StartOfRound startOfRound) { if ((Object)(object)startOfRound == (Object)null || startOfRound.allPlayerScripts == null) { return (PlayerControllerB[])(object)new PlayerControllerB[0]; } return startOfRound.allPlayerScripts.Where((PlayerControllerB x) => x.isPlayerDead || x.isPlayerControlled).ToArray(); } } public static class PluginInfo { public const string PLUGIN_GUID = "BiggerLobby"; public const string PLUGIN_NAME = "BiggerLobby"; public const string PLUGIN_VERSION = "2.7.0"; } } namespace BiggerLobby.UI { public class ExpandedStatsUI : MonoBehaviour { private bool _initialized; private bool _debugStatsUI; private static StatsUIReferences? _statsUIReferences; private PlayerStatsList _fourPlayersList; private PlayerStatsList _eightPlayersList; private PlayerStatsList _moreThanEightPlayersList; private List<GameObject> _moreThanEightPlayersPages = new List<GameObject>(); public int UpperPlayerLimit = 40; public float SecondsPanelVisible = 8.5f; private Sprite FourPlayerStatBoxes; private Sprite EightPlayerStatBoxes; private void Start() { if (!_initialized) { if (_debugStatsUI) { DebugStats(); } SetupFourPlayerSlots(); SetupEightPlayerSlots(); SetupMoreThanEightPlayersSlots(); EightPlayerStatBoxes = _statsUIReferences.StatsBoxesThin; FourPlayerStatBoxes = ((Component)((Component)this).transform.GetChild(1)).GetComponent<Image>().sprite; ((Component)this).transform.GetChild(2).Find("AllDead").SetAsLastSibling(); _initialized = true; } } private void DebugStats() { ((Behaviour)((Component)this).gameObject.GetComponent<Animator>()).enabled = false; ((Component)((Component)this).transform.GetChild(0)).GetComponent<CanvasGroup>().alpha = 1f; ((Component)((Component)this).transform.GetChild(1)).GetComponent<CanvasGroup>().alpha = 1f; ((Component)((Component)this).transform.GetChild(2)).GetComponent<CanvasGroup>().alpha = 1f; ((Component)((Component)this).transform.GetChild(2).Find("AllDead")).gameObject.SetActive(false); } private void SetupFourPlayerSlots() { _fourPlayersList = new PlayerStatsList(CreateTransformAtParentOrigin("FourPlayersList", ((Component)this).transform.GetChild(2))); for (int i = 0; i < 4; i++) { Transform val = ((Component)this).transform.GetChild(2).Find($"PlayerSlot{i + 1}"); val.SetParent(_fourPlayersList.transform); _fourPlayersList.AddPlayerSlotTransform(val); } } private void SetupEightPlayerSlots() { _eightPlayersList = new PlayerStatsList(CreateTransformAtParentOrigin("EightPlayersList", ((Component)this).transform.GetChild(2))); List<Transform> playerSlots = SetupEightPlayerPage(_eightPlayersList.transform); _eightPlayersList.AddPlayerSlotTransforms(playerSlots); } private void SetupMoreThanEightPlayersSlots() { _moreThanEightPlayersList = new PlayerStatsList(CreateTransformAtParentOrigin("MoreThanEightPlayersList", ((Component)this).transform.GetChild(2))); int num = (int)Math.Ceiling((float)UpperPlayerLimit / 8f); for (int i = 0; i < num; i++) { Transform val = CreateTransformAtParentOrigin($"Page{i}", _moreThanEightPlayersList.transform); _moreThanEightPlayersPages.Add(((Component)val).gameObject); List<Transform> playerSlots = SetupEightPlayerPage(val); _moreThanEightPlayersList.AddPlayerSlotTransforms(playerSlots); if (i != 0) { ((Component)val).gameObject.SetActive(false); } } } private List<Transform> SetupEightPlayerPage(Transform parent) { //IL_002c: 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) //IL_0049: Unknown result type (might be due to invalid IL or missing references) List<Transform> list = new List<Transform>(); for (int i = 0; i < 8; i++) { Transform val = Object.Instantiate<Transform>(_fourPlayersList.transform.GetChild(0), parent, true); SetupPlayerSlot(val); val.localPosition = new Vector3(val.localPosition.x, -26.1f * (float)i, val.localPosition.z); list.Add(val); } return list; } private void SetupPlayerSlot(Transform playerSlot) { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) TextMeshProUGUI component = ((Component)playerSlot.Find("Notes")).GetComponent<TextMeshProUGUI>(); TextMeshProUGUI component2 = ((Component)playerSlot.GetChild(0)).GetComponent<TextMeshProUGUI>(); RectTransform component3 = ((Component)component2).GetComponent<RectTransform>(); Image component4 = ((Component)playerSlot.GetChild(1)).GetComponent<Image>(); RectTransform component5 = ((Component)component4).GetComponent<RectTransform>(); ((TMP_Text)component).text = "* Most lazy employee\n* Most paranoid employee\n* Sustained the most injuries"; ((TMP_Text)component).fontSize = 9f; ((TMP_Text)component2).text = "CrazyDude12WW"; ((Transform)component3).localPosition = new Vector3(((Transform)component3).localPosition.x, 101.5f, ((Transform)component3).localPosition.z); component4.sprite = _statsUIReferences.CheckmarkThin; component5.sizeDelta = new Vector2(component5.sizeDelta.x, 31.235f); ((Transform)component5).localPosition = new Vector3(((Transform)component5).localPosition.x, 101.5f, ((Transform)component5).localPosition.z); } private Transform CreateTransformAtParentOrigin(string name, Transform parent) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0013: 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_0029: Unknown result type (might be due to invalid IL or missing references) Transform transform = new GameObject(name).transform; transform.SetParent(parent); transform.localPosition = Vector3.zero; transform.localRotation = Quaternion.identity; transform.localScale = Vector3.one; return transform; } public void LoadStatsUIBundle() { AssetBundle obj = AssetBundle.LoadFromFile(Path.Join((ReadOnlySpan<char>)Path.GetDirectoryName(((BaseUnityPlugin)Plugin.Instance).Info.Location), (ReadOnlySpan<char>)"statsuireferences")); _statsUIReferences = obj.LoadAsset<GameObject>("assets/prefabs/statsuireferences.prefab").GetComponent<StatsUIReferences>(); obj.Unload(false); } public PlayerStatsList GetStatsListFromPlayerCount(int playerCount) { _fourPlayersList.gameObject.SetActive(false); _eightPlayersList.gameObject.SetActive(false); _moreThanEightPlayersList.gameObject.SetActive(false); PlayerStatsList playerStatsList = _fourPlayersList; if (playerCount > 8) { playerStatsList = _moreThanEightPlayersList; } else if (playerCount > 4) { playerStatsList = _eightPlayersList; } SetupStatsList(playerStatsList, playerCount); return playerStatsList; } private void SetupStatsList(PlayerStatsList playerStatsList, int playerCount) { playerStatsList.gameObject.SetActive(true); ((Component)((Component)this).transform.GetChild(1)).GetComponent<Image>().sprite = ((playerCount <= 4) ? FourPlayerStatBoxes : EightPlayerStatBoxes); if (playerCount > 8) { ((MonoBehaviour)this).StartCoroutine(PaginatePlayers(playerCount)); } for (int i = 0; i < playerStatsList.Names.Count; i++) { ((TMP_Text)playerStatsList.Names[i]).text = ""; ((TMP_Text)playerStatsList.Notes[i]).text = ""; ((Behaviour)playerStatsList.States[i]).enabled = false; } } private IEnumerator PaginatePlayers(int playerCount) { int maxPageCount = (int)Math.Ceiling((float)playerCount / 8f); float pageDuration = SecondsPanelVisible / (float)maxPageCount; foreach (GameObject moreThanEightPlayersPage in _moreThanEightPlayersPages) { moreThanEightPlayersPage.SetActive(false); } for (int i = 0; i < maxPageCount; i++) { _moreThanEightPlayersPages[i].SetActive(true); if (i > 0) { _moreThanEightPlayersPages[i - 1].SetActive(false); } yield return (object)new WaitForSeconds(pageDuration); } } public static ExpandedStatsUI GetFromAnimator(Animator endgameStatsAnimator) { ExpandedStatsUI result = default(ExpandedStatsUI); if (((Component)endgameStatsAnimator).TryGetComponent<ExpandedStatsUI>(ref result)) { return result; } ExpandedStatsUI expandedStatsUI = ((Component)endgameStatsAnimator).gameObject.AddComponent<ExpandedStatsUI>(); if ((Object)(object)_statsUIReferences == (Object)null) { expandedStatsUI.LoadStatsUIBundle(); } return expandedStatsUI; } public static Sprite? GetReplacementCheckmark() { return _statsUIReferences?.CheckmarkThin; } } } namespace BiggerLobby.Patches { [HarmonyPatch(typeof(HUDManager))] internal class ChatPatches { private static MethodInfo TargetMethod() { return typeof(HUDManager).GetMethod("AddChatMessage", BindingFlags.Instance | BindingFlags.NonPublic); } [HarmonyTranspiler] public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected O, but got Unknown ConstructorInfo constructorInfo = AccessTools.Constructor(typeof(StringBuilder), new Type[1] { typeof(string) }, false); MethodInfo methodInfo = AccessTools.Method(typeof(ChatPatches), "ApplyCustomPlayerNumber", (Type[])null, (Type[])null); return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Newobj, (object)constructorInfo, (string)null) }).ThrowIfInvalid("Unable to find StringBuilder constructor.").Advance(1) .Insert((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Callvirt, (object)methodInfo) }) .InstructionEnumeration(); } public static StringBuilder ApplyCustomPlayerNumber(StringBuilder stringBuilder) { PlayerControllerB[] realPlayerScripts = Plugin.GetRealPlayerScripts(StartOfRound.Instance); if (realPlayerScripts == null) { return stringBuilder; } for (int i = 4; i < realPlayerScripts.Length; i++) { if (realPlayerScripts[i]?.playerUsername != null) { stringBuilder.Replace($"[playerNum{i}]", realPlayerScripts[i].playerUsername); } } return stringBuilder; } } [HarmonyPatch] public class ListSizeTranspilers { private static MethodInfo _playerCountMethod = AccessTools.Method(typeof(Plugin), "GetPlayerCount", (Type[])null, (Type[])null); private static MethodInfo _playerCountMinusOneMethod = AccessTools.Method(typeof(Plugin), "GetPlayerCountMinusOne", (Type[])null, (Type[])null); private static MethodInfo _realPlayerScriptsMethod = AccessTools.Method(typeof(Plugin), "GetRealPlayerScripts", (Type[])null, (Type[])null); private static void CheckAndReplace(List<CodeInstruction> codes, int index) { if (codes[index].opcode == OpCodes.Ldc_I4_4) { codes[index].opcode = OpCodes.Call; codes[index].operand = _playerCountMethod; } } [HarmonyPatch(typeof(HUDManager), "SyncAllPlayerLevelsServerRpc", new Type[] { })] [HarmonyPatch(typeof(DressGirlAI), "ChoosePlayerToHaunt")] [HarmonyPatch(typeof(CrawlerAI), "Start")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> SyncLevelsRpc(IEnumerable<CodeInstruction> instructions) { List<CodeInstruction> list = new List<CodeInstruction>(instructions); for (int i = 0; i < list.Count; i++) { if (list[i].opcode == OpCodes.Newarr) { CheckAndReplace(list, i - 1); } } return list.AsEnumerable(); } [HarmonyPatch(typeof(PlayerControllerB), "SendNewPlayerValuesServerRpc")] [HarmonyPatch(typeof(StartOfRound), "SyncShipUnlockablesClientRpc")] [HarmonyPatch(typeof(DressGirlAI), "ChoosePlayerToHaunt")] [HarmonyPatch(typeof(EnemyAI), "GetClosestPlayer")] [HarmonyPatch(typeof(SpringManAI), "DoAIInterval")] [HarmonyPatch(typeof(SpringManAI), "Update")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> SendNewPlayerValuesServerRpc(IEnumerable<CodeInstruction> instructions) { List<CodeInstruction> list = new List<CodeInstruction>(instructions); for (int i = 0; i < list.Count; i++) { if (list[i].opcode == OpCodes.Blt) { CheckAndReplace(list, i - 1); } } return list.AsEnumerable(); } [HarmonyPatch(typeof(QuickMenuManager), "ConfirmKickUserFromServer")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> ConfirmKickUserFromServer(IEnumerable<CodeInstruction> instructions) { List<CodeInstruction> list = new List<CodeInstruction>(instructions); for (int i = 0; i < list.Count; i++) { if (list[i].opcode == OpCodes.Ldc_I4_3) { list[i].opcode = OpCodes.Call; list[i].operand = _playerCountMinusOneMethod; break; } } return list.AsEnumerable(); } [HarmonyPatch(typeof(HUDManager), "FillEndGameStats")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> FillEndGameStatsPatch(IEnumerable<CodeInstruction> instructions) { List<CodeInstruction> list = new List<CodeInstruction>(instructions); for (int i = 0; i < list.Count; i++) { if (list[i].opcode == OpCodes.Ldfld && list[i].operand is FieldInfo fieldInfo && fieldInfo.Name == "allPlayerScripts") { list[i].opcode = OpCodes.Call; list[i].operand = _realPlayerScriptsMethod; } } return list.Where((CodeInstruction x) => x.opcode != OpCodes.Nop).AsEnumerable(); } [HarmonyPatch(typeof(StartOfRound), "SyncShipUnlockablesServerRpc")] [HarmonyPatch(typeof(StartOfRound), "OnClientConnect")] [HarmonyPatch(typeof(PlayerControllerB), "SpectateNextPlayer")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> SyncShipUnlockablesServerRpc(IEnumerable<CodeInstruction> instructions) { List<CodeInstruction> list = new List<CodeInstruction>(instructions); for (int i = 0; i < list.Count; i++) { if (list[i].opcode == OpCodes.Ldc_I4_4) { list[i].opcode = OpCodes.Call; list[i].operand = _playerCountMethod; } } return list.AsEnumerable(); } } [HarmonyPatch] public class NonGamePatches { [HarmonyPatch(typeof(GameNetworkManager))] internal class InternalPatches { private static MethodInfo TargetMethod() { return typeof(GameNetworkManager).GetMethod("ConnectionApproval", BindingFlags.Instance | BindingFlags.NonPublic); } [HarmonyPrefix] private static bool PostFix(GameNetworkManager __instance, ConnectionApprovalRequest request, ConnectionApprovalResponse response) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)("Connection approval callback! Game version of client request: " + Encoding.ASCII.GetString(request.Payload).ToString())); Debug.Log((object)$"Joining client id: {request.ClientNetworkId}; Local/host client id: {NetworkManager.Singleton.LocalClientId}"); if (request.ClientNetworkId == NetworkManager.Singleton.LocalClientId) { Debug.Log((object)"Stopped connection approval callback, as the client in question was the host!"); return false; } bool flag = !__instance.disallowConnection; if (flag) { string @string = Encoding.ASCII.GetString(request.Payload); string[] array = @string.Split(","); if (string.IsNullOrEmpty(@string)) { response.Reason = "Unknown; please verify your game files."; flag = false; } else if (__instance.gameHasStarted) { response.Reason = "Game has already started!"; flag = false; } else if (__instance.gameVersionNum.ToString() != array[0]) { response.Reason = $"Game version mismatch! Their version: {__instance.gameVersionNum}. Your version: {array[0]}"; flag = false; } else if (!__instance.disableSteam && ((Object)(object)StartOfRound.Instance == (Object)null || array.Length < 2 || StartOfRound.Instance.KickedClientIds.Contains((ulong)Convert.ToInt64(array[1])))) { response.Reason = "You cannot rejoin after being kicked."; flag = false; } else if (!@string.Contains("BiggerLobbyVersion2.5.0")) { response.Reason = "You need to have <color=#008282>BiggerLobby V2.5.0</color> to join this server!"; flag = false; } } else { response.Reason = "The host was not accepting connections."; } Debug.Log((object)$"Approved connection?: {flag}. Connected players #: {__instance.connectedPlayers}"); Debug.Log((object)("Disapproval reason: " + response.Reason)); response.CreatePlayerObject = false; response.Approved = flag; response.Pending = false; return false; } } [HarmonyPatch(typeof(GameNetworkManager))] internal class InternalPatches2 { private static MethodInfo TargetMethod() { return typeof(GameNetworkManager).GetMethod("SteamMatchmaking_OnLobbyCreated", BindingFlags.Instance | BindingFlags.NonPublic); } [HarmonyPostfix] private static void PostFix(GameNetworkManager __instance, Result result, Lobby lobby) { ((Lobby)(ref lobby)).SetData("name", "[BiggerLobby]" + ((Lobby)(ref lobby)).GetData("name")); } } private static PropertyInfo _playbackVolumeProperty = typeof(VoicePlayback).GetInterface("IVoicePlaybackInternal").GetProperty("PlaybackVolume"); private static FieldInfo _lobbyListField = AccessTools.Field(typeof(SteamLobbyManager), "currentLobbyList"); [HarmonyPatch(typeof(StartOfRound), "UpdatePlayerVoiceEffects")] [HarmonyPrefix] public static void UpdatePlayerVoiceEffects(StartOfRound __instance) { if ((Object)(object)GameNetworkManager.Instance == (Object)null || (Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null) { return; } typeof(StartOfRound).GetField("updatePlayerVoiceInterval", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(__instance, 2f); PlayerControllerB val = ((!GameNetworkManager.Instance.localPlayerController.isPlayerDead || !((Object)(object)GameNetworkManager.Instance.localPlayerController.spectatedPlayerScript != (Object)null)) ? GameNetworkManager.Instance.localPlayerController : GameNetworkManager.Instance.localPlayerController.spectatedPlayerScript); for (int i = 0; i < __instance.allPlayerScripts.Length; i++) { PlayerControllerB val2 = __instance.allPlayerScripts[i]; if ((!val2.isPlayerControlled && !val2.isPlayerDead) || (Object)(object)val2 == (Object)(object)GameNetworkManager.Instance.localPlayerController) { continue; } if (val2.voicePlayerState == null || val2.currentVoiceChatIngameSettings._playerState == null || (Object)(object)val2.currentVoiceChatAudioSource == (Object)null) { __instance.RefreshPlayerVoicePlaybackObjects(); if (val2.voicePlayerState == null || (Object)(object)val2.currentVoiceChatAudioSource == (Object)null) { Debug.Log((object)$"Was not able to access voice chat object for player #{i}; {val2.voicePlayerState == null}; {(Object)(object)val2.currentVoiceChatAudioSource == (Object)null}"); continue; } } AudioSource currentVoiceChatAudioSource = __instance.allPlayerScripts[i].currentVoiceChatAudioSource; bool flag = val2.speakingToWalkieTalkie && val.holdingWalkieTalkie && (Object)(object)val2 != (Object)(object)val; if (val2.isPlayerDead) { ((Behaviour)((Component)currentVoiceChatAudioSource).GetComponent<AudioLowPassFilter>()).enabled = false; ((Behaviour)((Component)currentVoiceChatAudioSource).GetComponent<AudioHighPassFilter>()).enabled = false; currentVoiceChatAudioSource.panStereo = 0f; SoundManager.Instance.playerVoicePitchTargets[val2.playerClientId] = 1f; SoundManager.Instance.SetPlayerPitch(1f, (int)val2.playerClientId); if (GameNetworkManager.Instance.localPlayerController.isPlayerDead) { currentVoiceChatAudioSource.spatialBlend = 0f; val2.currentVoiceChatIngameSettings.set2D = true; if ((Object)(object)val2.currentVoiceChatIngameSettings != (Object)null && (Object)(object)val2.currentVoiceChatIngameSettings._playbackComponent != (Object)null) { _playbackVolumeProperty.SetValue(val2.currentVoiceChatIngameSettings._playbackComponent, Mathf.Clamp((SoundManager.Instance.playerVoiceVolumes[i] + 1f) * (float)(2 * Plugin._LoudnessMultiplier.Value), 0f, 1f)); } } else { currentVoiceChatAudioSource.spatialBlend = 1f; val2.currentVoiceChatIngameSettings.set2D = false; if ((Object)(object)val2.currentVoiceChatIngameSettings != (Object)null && (Object)(object)val2.currentVoiceChatIngameSettings._playbackComponent != (Object)null) { _playbackVolumeProperty.SetValue(val2.currentVoiceChatIngameSettings._playbackComponent, 0); } } continue; } AudioLowPassFilter component = ((Component)currentVoiceChatAudioSource).GetComponent<AudioLowPassFilter>(); OccludeAudio component2 = ((Component)currentVoiceChatAudioSource).GetComponent<OccludeAudio>(); ((Behaviour)component).enabled = true; component2.overridingLowPass = flag || __instance.allPlayerScripts[i].voiceMuffledByEnemy; ((Behaviour)((Component)currentVoiceChatAudioSource).GetComponent<AudioHighPassFilter>()).enabled = flag; if (!flag) { currentVoiceChatAudioSource.spatialBlend = 1f; val2.currentVoiceChatIngameSettings.set2D = false; currentVoiceChatAudioSource.bypassListenerEffects = false; currentVoiceChatAudioSource.bypassEffects = false; currentVoiceChatAudioSource.outputAudioMixerGroup = SoundManager.Instance.playerVoiceMixers[val2.playerClientId]; component.lowpassResonanceQ = 1f; } else { currentVoiceChatAudioSource.spatialBlend = 0f; val2.currentVoiceChatIngameSettings.set2D = true; if (GameNetworkManager.Instance.localPlayerController.isPlayerDead) { currentVoiceChatAudioSource.panStereo = 0f; currentVoiceChatAudioSource.outputAudioMixerGroup = SoundManager.Instance.playerVoiceMixers[val2.playerClientId]; currentVoiceChatAudioSource.bypassListenerEffects = false; currentVoiceChatAudioSource.bypassEffects = false; } else { currentVoiceChatAudioSource.panStereo = 0.4f; currentVoiceChatAudioSource.bypassListenerEffects = false; currentVoiceChatAudioSource.bypassEffects = false; currentVoiceChatAudioSource.outputAudioMixerGroup = SoundManager.Instance.playerVoiceMixers[val2.playerClientId]; } component2.lowPassOverride = 4000f; component.lowpassResonanceQ = 3f; } if ((Object)(object)val2.currentVoiceChatIngameSettings != (Object)null && (Object)(object)val2.currentVoiceChatIngameSettings._playbackComponent != (Object)null) { _playbackVolumeProperty.SetValue(val2.currentVoiceChatIngameSettings._playbackComponent, Mathf.Clamp((SoundManager.Instance.playerVoiceVolumes[i] + 1f) * (float)(2 * Plugin._LoudnessMultiplier.Value), 0f, 1f)); } } } [HarmonyPatch(typeof(StartOfRound), "Awake")] [HarmonyPrefix] public static void ResizeLists(ref StartOfRound __instance) { //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown __instance.allPlayerObjects = Helper.ResizeArray(__instance.allPlayerObjects, Plugin.MaxPlayers); __instance.allPlayerScripts = Helper.ResizeArray(__instance.allPlayerScripts, Plugin.MaxPlayers); __instance.gameStats.allPlayerStats = Helper.ResizeArray(__instance.gameStats.allPlayerStats, Plugin.MaxPlayers); __instance.playerSpawnPositions = Helper.ResizeArray(__instance.playerSpawnPositions, Plugin.MaxPlayers); for (int i = 4; i < Plugin.MaxPlayers; i++) { __instance.gameStats.allPlayerStats[i] = new PlayerStats(); __instance.playerSpawnPositions[i] = __instance.playerSpawnPositions[0]; } } [HarmonyPatch(typeof(HUDManager), "Awake")] [HarmonyPrefix] public static void ResizeHUD(ref HUDManager __instance) { ExpandedStatsUI.GetFromAnimator(__instance.endgameStatsAnimator); } [HarmonyPatch(typeof(SoundManager), "SetPlayerVoiceFilters")] [HarmonyPrefix] public static bool SetPlayerVoiceFilters(ref SoundManager __instance) { for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Length; i++) { if (!StartOfRound.Instance.allPlayerScripts[i].isPlayerControlled && !StartOfRound.Instance.allPlayerScripts[i].isPlayerDead) { __instance.playerVoicePitches[i] = 1f; __instance.playerVoiceVolumes[i] = 1f; continue; } if (StartOfRound.Instance.allPlayerScripts[i].voicePlayerState != null) { typeof(VoicePlayback).GetProperty("Dissonance.Audio.Playback.IVoicePlaybackInternal.PlaybackVolume", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(StartOfRound.Instance.allPlayerScripts[i].currentVoiceChatIngameSettings._playbackComponent, Mathf.Clamp((SoundManager.Instance.playerVoiceVolumes[i] + 1f) * (float)(2 * Plugin._LoudnessMultiplier.Value), 0f, 1f)); } if (Mathf.Abs(__instance.playerVoicePitches[i] - __instance.playerVoicePitchTargets[i]) > 0.025f) { __instance.playerVoicePitches[i] = Mathf.Lerp(__instance.playerVoicePitches[i], __instance.playerVoicePitchTargets[i], 3f * Time.deltaTime); } else if (__instance.playerVoicePitches[i] != __instance.playerVoicePitchTargets[i]) { __instance.playerVoicePitches[i] = __instance.playerVoicePitchTargets[i]; } } return false; } [HarmonyPatch(typeof(MenuManager), "OnEnable")] [HarmonyPostfix] [HarmonyWrapSafe] public static void CustomMenu(ref MenuManager __instance) { //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: 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_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_0238: Unknown result type (might be due to invalid IL or missing references) //IL_023d: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Expected O, but got Unknown //IL_0297: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_02a8: Unknown result type (might be due to invalid IL or missing references) if (__instance.isInitScene) { return; } float num = 30f; GameObject gameObject = ((Component)__instance.HostSettingsOptionsNormal.transform.parent.parent).gameObject; RectTransform val = ((gameObject != null) ? gameObject.GetComponent<RectTransform>() : null); object obj; if (val == null) { obj = null; } else { Transform obj2 = ((Transform)val).Find("LobbyHostOptions"); obj = ((obj2 != null) ? ((Component)obj2).GetComponent<RectTransform>() : null); } RectTransform val2 = (RectTransform)obj; object obj3; if (val2 == null) { obj3 = null; } else { Transform obj4 = ((Transform)val2).Find("OptionsNormal"); obj3 = ((obj4 != null) ? ((Component)obj4).GetComponent<RectTransform>() : null); } RectTransform val3 = (RectTransform)obj3; if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null || (Object)(object)val3 == (Object)null) { return; } object obj5; if (val3 == null) { obj5 = null; } else { Transform obj6 = ((Transform)val3).Find("ServerNameField"); obj5 = ((obj6 != null) ? ((Component)obj6).GetComponent<RectTransform>() : null); } RectTransform val4 = (RectTransform)obj5; object obj7; if (val3 == null) { obj7 = null; } else { Transform obj8 = ((Transform)val3).Find("ServerTagInputField"); obj7 = ((obj8 != null) ? ((Component)obj8).GetComponent<RectTransform>() : null); } RectTransform val5 = (RectTransform)obj7; object obj9; if (val == null) { obj9 = null; } else { Transform obj10 = ((Transform)val).Find("Confirm"); obj9 = ((obj10 != null) ? ((Component)obj10).GetComponent<RectTransform>() : null); } RectTransform val6 = (RectTransform)obj9; object obj11; if (val == null) { obj11 = null; } else { Transform obj12 = ((Transform)val).Find("Back"); obj11 = ((obj12 != null) ? ((Component)obj12).GetComponent<RectTransform>() : null); } RectTransform val7 = (RectTransform)obj11; object obj13; if (val == null) { obj13 = null; } else { Transform obj14 = ((Transform)val).Find("PrivatePublicDescription"); obj13 = ((obj14 != null) ? ((Component)obj14).GetComponent<TextMeshProUGUI>() : null); } TextMeshProUGUI privatePublicDescription = (TextMeshProUGUI)obj13; if ((Object)(object)val4 == (Object)null || (Object)(object)val5 == (Object)null || (Object)(object)val6 == (Object)null || (Object)(object)val7 == (Object)null || (Object)(object)privatePublicDescription == (Object)null) { return; } RectTransform val8 = Object.Instantiate<RectTransform>(val4, ((Component)val4).transform.parent); TMP_InputField playerNumberInputField = ((Component)val8).GetComponent<TMP_InputField>(); val.sizeDelta += new Vector2(0f, num / 2f); val2.anchoredPosition += new Vector2(0f, num / 4f); val5.anchoredPosition += new Vector2(0f, (0f - num) / 2f); val6.anchoredPosition += new Vector2(0f, (0f - num) / 2f); val7.anchoredPosition += new Vector2(0f, (0f - num) / 2f); foreach (RectTransform item in (Transform)val3) { RectTransform val9 = item; if (!((Object)(object)val9 == (Object)null) && !(((Object)val9).name == "EnterAName") && !((Object)(object)val9 == (Object)(object)val4) && !((Object)(object)val9 == (Object)(object)val5)) { val9.anchoredPosition += new Vector2(0f, 0f - num); } } ((Object)val8).name = "ServerPlayersField"; playerNumberInputField.contentType = (ContentType)2; ((TMP_Text)((Component)((Component)val8).transform.Find("Text Area").Find("Placeholder")).gameObject.GetComponent<TextMeshProUGUI>()).text = "Max players (16)..."; ((UnityEvent<string>)(object)playerNumberInputField.onValueChanged).AddListener((UnityAction<string>)delegate { OnChange(); }); void OnChange() { if (!int.TryParse(Regex.Replace(playerNumberInputField.text, "[^0-9]", ""), out var result)) { result = 16; } result = Math.Min(Math.Max(result, 4), 40); ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)$"Setting max player count to: {result}"); } if (result > 16) { ((TMP_Text)privatePublicDescription).text = "Notice: High max player counts\nmay cause lag."; } else if (((TMP_Text)privatePublicDescription).text == "Notice: High max player counts\nmay cause lag.") { ((TMP_Text)privatePublicDescription).text = "yeah you should be good now lol"; } } } [HarmonyPatch(typeof(MenuManager), "StartHosting")] [HarmonyPrefix] public static bool StartHost(MenuManager __instance) { //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) if (!GameNetworkManager.Instance.currentLobby.HasValue) { return true; } if (!int.TryParse(Regex.Replace(((TMP_Text)((Component)((Component)__instance.HostSettingsOptionsNormal.transform.Find("ServerPlayersField")).gameObject.transform.Find("Text Area").Find("Text")).gameObject.GetComponent<TextMeshProUGUI>()).text, "[^0-9]", ""), out var result)) { result = 16; } result = Math.Min(Math.Max(result, 4), 40); Lobby valueOrDefault = GameNetworkManager.Instance.currentLobby.GetValueOrDefault(); ((Lobby)(ref valueOrDefault)).SetData("MaxPlayers", result.ToString()); ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)$"Setting max players to {result}!"); } Plugin.MaxPlayers = result; if ((Object)(object)GameNetworkManager.Instance != (Object)null) { GameNetworkManager.Instance.maxAllowedPlayers = Plugin.MaxPlayers; } return true; } [HarmonyPatch(typeof(HUDManager), "FillEndGameStats")] [HarmonyPrefix] public static void FillEndGameStats(HUDManager __instance) { ExpandedStatsUI fromAnimator = ExpandedStatsUI.GetFromAnimator(__instance.endgameStatsAnimator); if (!((Object)(object)fromAnimator == (Object)null) && !((Object)(object)StartOfRound.Instance == (Object)null)) { PlayerStatsList statsListFromPlayerCount = fromAnimator.GetStatsListFromPlayerCount(Plugin.GetRealPlayerScripts(StartOfRound.Instance).Length); __instance.statsUIElements.playerNamesText = statsListFromPlayerCount.Names.ToArray(); __instance.statsUIElements.playerStates = statsListFromPlayerCount.States.ToArray(); __instance.statsUIElements.playerNotesText = statsListFromPlayerCount.Notes.ToArray(); ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Adding EXPANDED stats!"); } } } [HarmonyPatch(typeof(HUDManager), "FillEndGameStats")] [HarmonyPostfix] public static void FillEndGameStatsPostfix(HUDManager __instance) { if ((Object)(object)StartOfRound.Instance == (Object)null || Plugin.GetRealPlayerScripts(StartOfRound.Instance).Length <= 4) { return; } TextMeshProUGUI[] playerNotesText = __instance.statsUIElements.playerNotesText; foreach (TextMeshProUGUI val in playerNotesText) { if (!(((TMP_Text)val).text == "")) { ((TMP_Text)val).text = ((TMP_Text)val).text.Replace("Notes:", "").Trim(); } } Sprite replacementCheckmark = ExpandedStatsUI.GetReplacementCheckmark(); if ((Object)(object)replacementCheckmark == (Object)null) { return; } Image[] playerStates = __instance.statsUIElements.playerStates; foreach (Image val2 in playerStates) { if (!((Object)(object)val2.sprite != (Object)(object)__instance.statsUIElements.aliveIcon)) { val2.sprite = replacementCheckmark; } } } [HarmonyPatch(typeof(GameNetworkManager), "StartHost")] [HarmonyPrefix] public static bool DoTheThe() { Plugin.CustomNetObjects.Clear(); return true; } [HarmonyPatch(typeof(GameNetworkManager), "StartClient")] [HarmonyPrefix] public static bool StartClient(GameNetworkManager __instance) { Plugin.CustomNetObjects.Clear(); return true; } [HarmonyPatch(typeof(MenuManager), "StartAClient")] [HarmonyPrefix] public static bool StartAClient() { Plugin.CustomNetObjects.Clear(); ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"LAN Running."); } return true; } [HarmonyPatch(typeof(SteamLobbyManager), "loadLobbyListAndFilter")] [HarmonyPostfix] public static IEnumerator LoadLobbyListAndFilter(IEnumerator result, SteamLobbyManager __instance) { while (result.MoveNext()) { yield return result.Current; } ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Injecting BL playercounts into lobby list."); } LobbySlot[] componentsInChildren = ((Component)__instance.levelListContainer).GetComponentsInChildren<LobbySlot>(true); foreach (LobbySlot val in componentsInChildren) { try { ((TMP_Text)val.LobbyName).text = ((TMP_Text)val.LobbyName).text.Replace("[BiggerLobby]", "[BL]"); if (!int.TryParse(((Lobby)(ref val.thisLobby)).GetData("MaxPlayers"), out var result2)) { result2 = 4; } ((TMP_Text)val.playerCount).text = ((TMP_Text)val.playerCount).text.Replace("/ 4", $"/ {result2}"); } catch (Exception ex) { ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogWarning((object)"Exception while injecting BL lobby metadata:"); } ManualLogSource? logger3 = Plugin.Logger; if (logger3 != null) { logger3.LogWarning((object)ex); } } } } [HarmonyPatch(typeof(SteamMatchmaking), "CreateLobbyAsync")] [HarmonyPrefix] public static void SetMaxMembers(ref int maxMembers) { maxMembers = Plugin.MaxPlayers; } [HarmonyPatch(typeof(GameNetworkManager), "SetConnectionDataBeforeConnecting")] [HarmonyPrefix] public static bool SetConnectionDataBeforeConnecting(GameNetworkManager __instance) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) __instance.localClientWaitingForApproval = true; Debug.Log((object)("Game version: " + __instance.gameVersionNum)); if (__instance.disableSteam) { NetworkManager.Singleton.NetworkConfig.ConnectionData = Encoding.ASCII.GetBytes(__instance.gameVersionNum + ",BiggerLobbyVersion2.5.0"); } else { NetworkManager.Singleton.NetworkConfig.ConnectionData = Encoding.ASCII.GetBytes(__instance.gameVersionNum + "," + SteamId.op_Implicit(SteamClient.SteamId) + ",BiggerLobbyVersion2.5.0"); } return false; } [HarmonyPatch(typeof(GameNetworkManager), "LobbyDataIsJoinable")] [HarmonyPrefix] public static bool SkipLobbySizeCheck(ref GameNetworkManager __instance, ref bool __result, Lobby lobby) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) string data = ((Lobby)(ref lobby)).GetData("vers"); if (!int.TryParse(((Lobby)(ref lobby)).GetData("MaxPlayers"), out var result)) { result = 16; } result = Math.Min(Math.Max(result, 4), 40); if (((Lobby)(ref lobby)).MemberCount >= result || ((Lobby)(ref lobby)).MemberCount < 1) { Debug.Log((object)$"Lobby join denied! Too many members in lobby! {((Lobby)(ref lobby)).Id}"); Object.FindObjectOfType<MenuManager>().SetLoadingScreen(false, (RoomEnter)4, "The server is full!"); __result = false; return false; } if (data != __instance.gameVersionNum.ToString()) { Debug.Log((object)$"Lobby join denied! Attempted to join vers.{data} lobby id: {((Lobby)(ref lobby)).Id}"); Object.FindObjectOfType<MenuManager>().SetLoadingScreen(false, (RoomEnter)2, $"The server host is playing on version {data} while you are on version {__instance.gameVersionNum}."); __result = false; return false; } if (((Lobby)(ref lobby)).GetData("joinable") == "false") { Debug.Log((object)"Lobby join denied! Host lobby is not joinable"); Object.FindObjectOfType<MenuManager>().SetLoadingScreen(false, (RoomEnter)2, "The server host has already landed their ship, or they are still loading in."); __result = false; return false; } Plugin.MaxPlayers = result; ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)$"Setting max players to {result}!"); } if ((Object)(object)__instance != (Object)null) { __instance.maxAllowedPlayers = Plugin.MaxPlayers; } __result = true; return false; } } [HarmonyPatch] internal class PlayerObjects { private static StartOfRound startOfRound; private static bool instantiating; private static int nextClientId; private static PlayerControllerB referencePlayer; [HarmonyPatch(typeof(StartOfRound), "Awake")] [HarmonyPrefix] public static void ResizeLists(ref StartOfRound __instance) { //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown __instance.allPlayerObjects = Helper.ResizeArray(__instance.allPlayerObjects, Plugin.MaxPlayers); __instance.allPlayerScripts = Helper.ResizeArray(__instance.allPlayerScripts, Plugin.MaxPlayers); __instance.gameStats.allPlayerStats = Helper.ResizeArray(__instance.gameStats.allPlayerStats, Plugin.MaxPlayers); __instance.playerSpawnPositions = Helper.ResizeArray(__instance.playerSpawnPositions, Plugin.MaxPlayers); for (int i = 4; i < Plugin.MaxPlayers; i++) { __instance.gameStats.allPlayerStats[i] = new PlayerStats(); __instance.playerSpawnPositions[i] = __instance.playerSpawnPositions[0]; } } [HarmonyPatch(typeof(ForestGiantAI), "Start")] [HarmonyPrefix] public static bool ResizeLists2(ref ForestGiantAI __instance) { __instance.playerStealthMeters = Helper.ResizeArray(__instance.playerStealthMeters, Plugin.MaxPlayers); return true; } [HarmonyPatch(typeof(HUDManager), "Awake")] [HarmonyPostfix] public static void ResizeLists2(ref HUDManager __instance) { } [HarmonyPatch(typeof(SoundManager), "Awake")] [HarmonyPostfix] public static void SoundWake(ref SoundManager __instance) { __instance.playerVoiceMixers = Helper.ResizeArray(__instance.playerVoiceMixers, Plugin.MaxPlayers); for (int i = 0; i < Plugin.MaxPlayers; i++) { __instance.playerVoiceMixers[i] = __instance.diageticMixer.outputAudioMixerGroup; } } [HarmonyPatch(typeof(SoundManager), "Start")] [HarmonyPostfix] public static void ResizeSoundManagerLists(ref SoundManager __instance) { __instance.playerVoicePitchLerpSpeed = new float[Plugin.MaxPlayers + 1]; __instance.playerVoicePitchTargets = new float[Plugin.MaxPlayers + 1]; __instance.playerVoiceVolumes = new float[Plugin.MaxPlayers + 1]; __instance.playerVoicePitches = new float[Plugin.MaxPlayers + 1]; for (int i = 1; i < Plugin.MaxPlayers + 1; i++) { __instance.playerVoicePitchLerpSpeed[i] = 3f; __instance.playerVoicePitchTargets[i] = 1f; __instance.playerVoicePitches[i] = 1f; __instance.playerVoiceVolumes[i] = 1f; } } [HarmonyPatch(typeof(EnemyAI), "EnableEnemyMesh")] [HarmonyPrefix] public static bool EnableEnemyMesh(EnemyAI __instance, bool enable, bool overrideDoNotSet = false) { int layer = ((!enable) ? 23 : 19); for (int i = 0; i < __instance.skinnedMeshRenderers.Length; i++) { if (Object.op_Implicit((Object)(object)__instance.skinnedMeshRenderers[i]) && (!((Component)__instance.skinnedMeshRenderers[i]).CompareTag("DoNotSet") || overrideDoNotSet)) { ((Component)__instance.skinnedMeshRenderers[i]).gameObject.layer = layer; } } for (int j = 0; j < __instance.meshRenderers.Length; j++) { if (Object.op_Implicit((Object)(object)__instance.meshRenderers[j]) && (!((Component)__instance.meshRenderers[j]).CompareTag("DoNotSet") || overrideDoNotSet)) { ((Component)__instance.meshRenderers[j]).gameObject.layer = layer; } } return false; } [HarmonyPatch(typeof(ShipTeleporter), "Awake")] [HarmonyPrefix] public static bool Awake2(ShipTeleporter __instance) { int[] array = new int[Plugin.MaxPlayers]; for (int i = 0; i < Plugin.MaxPlayers; i++) { array[i] = -1; } typeof(ShipTeleporter).GetField("playersBeingTeleported", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(__instance, array); __instance.buttonTrigger.interactable = false; typeof(ShipTeleporter).GetField("cooldownTime", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(__instance, __instance.cooldownAmount); return false; } [HarmonyPatch(typeof(NetworkSceneManager), "PopulateScenePlacedObjects")] [HarmonyPrefix] public static bool AddPlayers(NetworkSceneManager __instance) { //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) startOfRound = StartOfRound.Instance; if ((Object)(object)startOfRound.allPlayerObjects[Plugin.MaxPlayers - 1] != (Object)null) { return true; } referencePlayer = startOfRound.allPlayerObjects[0].GetComponent<PlayerControllerB>(); GameObject playerPrefab = startOfRound.playerPrefab; Transform transform = ((Component)startOfRound.playersContainer).transform; FieldInfo field = typeof(NetworkObject).GetField("GlobalObjectIdHash", BindingFlags.Instance | BindingFlags.NonPublic); PropertyInfo property = typeof(NetworkObject).GetProperty("NetworkObjectId", BindingFlags.Instance | BindingFlags.Public); typeof(NetworkSceneManager).GetField("ScenePlacedObjects", BindingFlags.Instance | BindingFlags.NonPublic); instantiating = true; typeof(NetworkSpawnManager).GetMethod("SpawnNetworkObjectLocally", BindingFlags.Instance | BindingFlags.NonPublic, null, CallingConventions.Any, new Type[6] { typeof(NetworkObject), typeof(ulong), typeof(bool), typeof(bool), typeof(ulong), typeof(bool) }, null); for (int i = 4; i < Plugin.MaxPlayers; i++) { nextClientId = i; GameObject val = Object.Instantiate<GameObject>(playerPrefab, transform); PlayerControllerB component = val.GetComponent<PlayerControllerB>(); NetworkObject component2 = val.GetComponent<NetworkObject>(); NetworkObject component3 = ((Component)val.transform.Find("PlayerPhysicsBox")).gameObject.GetComponent<NetworkObject>(); NetworkObject component4 = ((Component)val.transform.Find("ScavengerModel/metarig/ScavengerModelArmsOnly/metarig/spine.003/shoulder.R/arm.R_upper/arm.R_lower/hand.R/LocalItemHolder")).gameObject.GetComponent<NetworkObject>(); NetworkObject component5 = ((Component)val.transform.Find("ScavengerModel/metarig/spine/spine.001/spine.002/spine.003/shoulder.R/arm.R_upper/arm.R_lower/hand.R/ServerItemHolder")).gameObject.GetComponent<NetworkObject>(); component.TeleportPlayer(StartOfRound.Instance.notSpawnedPosition.position, false, 0f, false, true); startOfRound.allPlayerObjects[i] = val; startOfRound.allPlayerScripts[i] = component; uint num = (uint)(6942069 + i); ulong num2 = 6942069uL + (ulong)i; uint num3 = (uint)(123456789 + i); uint num4 = (uint)(987654321 + i); uint num5 = (uint)(124585949 + i); ulong num6 = 123456789uL + (ulong)i; ulong num7 = 987654321uL + (ulong)i; ulong num8 = 124585949uL + (ulong)i; Scene scene = ((Component)component2).gameObject.scene; _ = ((Scene)(ref scene)).handle; field.SetValue(component2, num); property.SetValue(component2, num2); field.SetValue(component3, num3); property.SetValue(component3, num6); field.SetValue(component4, num4); property.SetValue(component4, num7); field.SetValue(component5, num5); property.SetValue(component5, num8); ManualCameraRenderer[] array = Object.FindObjectsByType<ManualCameraRenderer>((FindObjectsInactive)1, (FindObjectsSortMode)0); for (int j = 0; j < array.Length; j++) { array[j].AddTransformAsTargetToRadar(((Component)component).transform, "Player #" + j, false); } } instantiating = false; return true; } [HarmonyPatch(typeof(QuickMenuManager), "AddUserToPlayerList")] [HarmonyPrefix] public static bool AddUserToPlayerList(QuickMenuManager __instance, ulong steamId, string playerName, int playerObjectId) { if (playerObjectId >= 0 && playerObjectId <= Plugin.MaxPlayers) { __instance.playerListSlots[playerObjectId].KickUserButton.SetActive(((NetworkBehaviour)StartOfRound.Instance).IsServer); __instance.playerListSlots[playerObjectId].slotContainer.SetActive(true); __instance.playerListSlots[playerObjectId].isConnected = true; __instance.playerListSlots[playerObjectId].playerSteamId = steamId; ((TMP_Text)__instance.playerListSlots[playerObjectId].usernameHeader).text = playerName.Replace("bizzlemip", "<color=#008282>bizzlemip</color>"); if ((Object)(object)GameNetworkManager.Instance.localPlayerController != (Object)null) { __instance.playerListSlots[playerObjectId].volumeSliderContainer.SetActive(playerObjectId != (int)GameNetworkManager.Instance.localPlayerController.playerClientId); } } return false; } [HarmonyPatch(typeof(QuickMenuManager), "Update")] [HarmonyPrefix] private static bool Update(QuickMenuManager __instance) { for (int i = 0; i < __instance.playerListSlots.Length; i++) { if (__instance.playerListSlots[i].isConnected) { float num = __instance.playerListSlots[i].volumeSlider.value / __instance.playerListSlots[i].volumeSlider.maxValue; if (num == -1f) { SoundManager.Instance.playerVoiceVolumes[i] = -1f; } else { SoundManager.Instance.playerVoiceVolumes[i] = num; } } } return false; } [HarmonyPatch(typeof(QuickMenuManager), "Start")] [HarmonyPrefix] public static bool FixPlayerList(ref QuickMenuManager __instance) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_022d: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02a8: Expected O, but got Unknown //IL_032b: Unknown result type (might be due to invalid IL or missing references) //IL_0335: Expected O, but got Unknown GameObject val = null; GameObject gameObject = ((Component)__instance.playerListPanel.transform.Find("Image")).gameObject; if (Object.op_Implicit((Object)(object)gameObject.transform.Find("Mask"))) { val = ((Component)gameObject.transform.Find("Mask")).gameObject; } GameObject val2 = new GameObject("Mask"); GameObject val3 = new GameObject("ScrollViewport"); GameObject val4 = new GameObject("BGCollision"); GameObject val5 = new GameObject("ScrollContent"); val2.transform.SetParent(gameObject.transform); val3.transform.SetParent(val2.transform); val4.transform.SetParent(val3.transform); val5.transform.SetParent(val3.transform); val2.transform.localScale = Vector3.one; val3.transform.localScale = Vector3.one; val5.transform.localScale = Vector3.one; val2.AddComponent<RectTransform>().sizeDelta = new Vector2(300f, 280f); val2.transform.localPosition = new Vector3(-10f, 110f, 0f); val3.transform.localPosition = new Vector3(0f, -10f, 0f); val5.AddComponent<RectTransform>().pivot = new Vector2(0.5f, 1f); val2.GetComponent<RectTransform>().pivot = new Vector2(0.5f, 1f); val2.transform.localPosition = new Vector3(-10f, 110f, 0f); val2.AddComponent<RectMask2D>(); VerticalLayoutGroup val6 = val5.AddComponent<VerticalLayoutGroup>(); ContentSizeFitter obj = val5.AddComponent<ContentSizeFitter>(); ScrollRect obj2 = val3.AddComponent<ScrollRect>(); obj2.viewport = val3.AddComponent<RectTransform>(); obj2.content = val5.GetComponent<RectTransform>(); obj2.horizontal = false; Image val7 = val4.AddComponent<Image>(); val4.GetComponent<RectTransform>().anchorMin = new Vector2(0f, 0f); val4.GetComponent<RectTransform>().anchorMax = new Vector2(1f, 1f); ((Graphic)val7).color = new Color(255f, 255f, 255f, 0f); ((HorizontalOrVerticalLayoutGroup)val6).spacing = 50f; obj.horizontalFit = (FitMode)0; obj.verticalFit = (FitMode)2; __instance.playerListSlots = Helper.ResizeArray(__instance.playerListSlots, Plugin.MaxPlayers); for (int i = 0; i < Plugin.MaxPlayers; i++) { if (i < 4) { __instance.playerListSlots[i].slotContainer.transform.SetParent(val5.transform); continue; } PlayerListSlot val8 = new PlayerListSlot(); GameObject val9 = (val8.slotContainer = Object.Instantiate<GameObject>(__instance.playerListSlots[0].slotContainer)); val8.volumeSliderContainer = ((Component)val9.transform.Find("VoiceVolumeSlider")).gameObject; val8.KickUserButton = ((Component)val9.transform.Find("KickButton")).gameObject; QuickMenuManager yeahoriginal = __instance; int localI = i; ((UnityEvent)val8.KickUserButton.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { yeahoriginal.KickUserFromServer(localI); }); val8.isConnected = false; val8.usernameHeader = ((Component)val9.transform.Find("PlayerNameButton").Find("PName")).gameObject.GetComponent<TextMeshProUGUI>(); val8.volumeSlider = ((Component)val9.transform.Find("VoiceVolumeSlider").Find("Slider")).gameObject.GetComponent<Slider>(); val8.playerSteamId = __instance.playerListSlots[0].playerSteamId; val9.transform.SetParent(val5.transform, false); __instance.playerListSlots[i] = val8; } if ((Object)(object)val != (Object)null) { Object.Destroy((Object)(object)val); } return true; } [HarmonyPatch(typeof(ManualCameraRenderer), "Awake")] [HarmonyPrefix] public static bool Mawake(ref ManualCameraRenderer __instance) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown for (int i = 0; i < 4; i++) { __instance.radarTargets.Add(new TransformAndName(((Component)StartOfRound.Instance.allPlayerScripts[i]).transform, StartOfRound.Instance.allPlayerScripts[i].playerUsername, false)); } __instance.targetTransformIndex = 0; __instance.targetedPlayer = StartOfRound.Instance.allPlayerScripts[0]; return false; } [HarmonyPatch(typeof(PlayerControllerB), "Awake")] [HarmonyPrefix] public static bool FixPlayerObject(ref PlayerControllerB __instance) { if (!instantiating) { return true; } ((Object)((Component)__instance).gameObject).name = $"ExtraPlayer{nextClientId}"; __instance.playerClientId = (ulong)nextClientId; __instance.actualClientId = (ulong)nextClientId; StartOfRound.Instance.allPlayerObjects[nextClientId] = ((Component)((Component)__instance).transform.parent).gameObject; StartOfRound.Instance.allPlayerScripts[nextClientId] = __instance; FieldInfo[] fields = typeof(PlayerControllerB).GetFields(); foreach (FieldInfo fieldInfo in fields) { object value = fieldInfo.GetValue(__instance); object value2 = fieldInfo.GetValue(referencePlayer); if (value == null && value2 != null) { fieldInfo.SetValue(__instance, value2); } } ((Behaviour)__instance).enabled = true; return true; } [HarmonyPatch(typeof(StartOfRound), "GetPlayerSpawnPosition")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> GetPlayerSpawnPosition(IEnumerable<CodeInstruction> instructions) { List<CodeInstruction> list = new List<CodeInstruction>(instructions); list[0].opcode = OpCodes.Ldc_I4_1; return list.AsEnumerable(); } } } namespace BiggerLobby.Models { public class PlayerStatsList { public Transform transform; public List<TextMeshProUGUI> Names = new List<TextMeshProUGUI>(); public List<Image> States = new List<Image>(); public List<TextMeshProUGUI> Notes = new List<TextMeshProUGUI>(); public GameObject gameObject => ((Component)transform).gameObject; public PlayerStatsList(Transform transform) { this.transform = transform; } public void AddPlayerSlotTransform(Transform playerSlot) { TextMeshProUGUI component = ((Component)playerSlot.GetChild(0)).GetComponent<TextMeshProUGUI>(); Image component2 = ((Component)playerSlot.GetChild(1)).GetComponent<Image>(); TextMeshProUGUI component3 = ((Component)playerSlot.Find("Notes")).GetComponent<TextMeshProUGUI>(); Names.Add(component); States.Add(component2); Notes.Add(component3); } public void AddPlayerSlotTransforms(List<Transform> playerSlots) { foreach (Transform playerSlot in playerSlots) { AddPlayerSlotTransform(playerSlot); } } } public enum StatsScreenType { FourPlayers, EightPlayers, MoreThanEightPlayers } public class StatsUIReferences : MonoBehaviour { public Sprite StatsBoxesThin; public Sprite StatsBoxesGradeOnly; public Sprite CheckmarkThin; public ScrollRect ThinScrollRect; } }
BepInEx/plugins/CCUUMM-YippeeMod/YippeeMod.dll
Decompiled 8 months agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; using YippeeMod.Patches; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("YippeeMod")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("YippeeMod")] [assembly: AssemblyTitle("YippeeMod")] [assembly: AssemblyVersion("1.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace YippeeMod { [BepInPlugin("sunnobunno.YippeeMod", "Yippee tbh mod", "1.2.1")] public class YippeeModBase : BaseUnityPlugin { private const string modGUID = "sunnobunno.YippeeMod"; private const string modName = "Yippee tbh mod"; private const string modVersion = "1.2.1"; private readonly Harmony harmony = new Harmony("sunnobunno.YippeeMod"); private static YippeeModBase? Instance; internal ManualLogSource? mls; internal static AudioClip[]? newSFX; private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } mls = Logger.CreateLogSource("sunnobunno.YippeeMod"); mls.LogInfo((object)"Yippee Mod is loading."); string location = ((BaseUnityPlugin)Instance).Info.Location; string text = "YippeeMod.dll"; string text2 = location.TrimEnd(text.ToCharArray()); string text3 = text2 + "yippeesound"; mls.LogInfo((object)text3); AssetBundle val = AssetBundle.LoadFromFile(text3); if ((Object)(object)val == (Object)null) { mls.LogError((object)"Failed to load audio assets!"); return; } newSFX = val.LoadAssetWithSubAssets<AudioClip>("assets/yippee-tbh.mp3"); harmony.PatchAll(typeof(HoarderBugPatch)); mls.LogInfo((object)"Yippee Mod is loaded. Yippee!!!"); } } } namespace YippeeMod.Patches { [HarmonyPatch(typeof(HoarderBugAI))] internal class HoarderBugPatch { [HarmonyPatch("Start")] [HarmonyPostfix] public static void hoarderBugAudioPatch(ref AudioClip[] ___chitterSFX) { AudioClip[] newSFX = YippeeModBase.newSFX; ___chitterSFX = newSFX; } } }
BepInEx/plugins/FlipMods-MoreBlood/MoreBlood.dll
Decompiled 8 months agousing System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using GameNetcodeStuff; using HarmonyLib; using MoreBlood.Config; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("MoreBlood")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MoreBlood")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("d1f1321d-30a3-4600-9bf8-1e69fe1abf8c")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace MoreBlood { [BepInPlugin("FlipMods.MoreBlood", "MoreBlood", "1.0.2")] public class Plugin : BaseUnityPlugin { public static Plugin instance; private Harmony _harmony; private void Awake() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown instance = this; _harmony = new Harmony("MoreBlood"); ConfigSettings.BindConfigSettings(); _harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"MoreBlood loaded"); } public static void Log(string message) { ((BaseUnityPlugin)instance).Logger.LogInfo((object)message); } } public static class PluginInfo { public const string PLUGIN_GUID = "FlipMods.MoreBlood"; public const string PLUGIN_NAME = "MoreBlood"; public const string PLUGIN_VERSION = "1.0.2"; } } namespace MoreBlood.Patches { [HarmonyPatch(typeof(PlayerControllerB))] internal class MoreBloodPatcher { private static int bloodCount; [HarmonyPatch("DropBlood")] [HarmonyPostfix] public static void MoreBlood(PlayerControllerB __instance, Vector3 direction = default(Vector3), bool leaveBlood = true, bool leaveFootprint = false) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) bloodCount++; if (bloodCount < ConfigSettings.numBloodPools.Value) { __instance.DropBlood(direction, leaveBlood, leaveFootprint); } else { bloodCount = 0; } } [HarmonyPatch("RandomizeBloodRotationAndScale")] [HarmonyPostfix] public static void RandomizeBloodScale(ref Transform blood, PlayerControllerB __instance) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) Transform obj = blood; obj.localScale *= ConfigSettings.bloodScale.Value; blood.position += new Vector3((float)Random.Range(-1, 1) * ConfigSettings.bloodScale.Value, 0.55f, (float)Random.Range(-1, 1) * ConfigSettings.bloodScale.Value); } } } namespace MoreBlood.Config { public static class ConfigSettings { public static ConfigEntry<float> bloodScale; public static ConfigEntry<int> numBloodPools; public static void BindConfigSettings() { Plugin.Log("BindingConfigs"); bloodScale = ((BaseUnityPlugin)Plugin.instance).Config.Bind<float>("MoreBlood", "BloodScale", 4f, "The size of the blood pools"); numBloodPools = ((BaseUnityPlugin)Plugin.instance).Config.Bind<int>("MoreBlood", "NumberOfBloodPools", 4, "Max number of blood pools spread around the blood source."); } } }
BepInEx/plugins/matsuura-HealthMetrics/HealthMetrics.dll
Decompiled 8 months agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("HealthMetrics")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("HealthMetrics")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("eba7b111-51e5-4353-807d-1268e6290901")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace HealthMetrics { [BepInPlugin("Matsuura.HealthMetrics", "HealthMetrics", "1.0.0")] public class HealthMetricsBase : BaseUnityPlugin { private const string modGUID = "Matsuura.HealthMetrics"; private const string modName = "HealthMetrics"; private const string modVersion = "1.0.0"; private readonly Harmony _harmony = new Harmony("Matsuura.HealthMetrics"); private static HealthMetricsBase _instance; private static ManualLogSource _logSource; internal void Awake() { if ((Object)(object)_instance == (Object)null) { _instance = this; } if (_logSource == null) { _logSource = Logger.CreateLogSource("Matsuura.HealthMetrics"); } _harmony.PatchAll(); _logSource.LogInfo((object)"HealthMetrics Awake"); } internal static void Log(string message) { if (_logSource != null) { _logSource.LogInfo((object)message); } } internal static void LogD(string message) { if (_logSource != null) { _logSource.LogDebug((object)message); } } } } namespace HealthMetrics.Patches { [HarmonyPatch(typeof(HUDManager))] internal class HealthHUDPatches { private static TextMeshProUGUI _healthText; private static readonly string DefaultValueHealthText = " ¤"; public static int _oldValuehealthValueForUpdater = 0; public static int _healthValueForUpdater = 100; private static readonly Color _healthyColor = Color32.op_Implicit(new Color32((byte)0, byte.MaxValue, (byte)0, byte.MaxValue)); private static readonly Color _criticalHealthColor = Color32.op_Implicit(new Color32(byte.MaxValue, (byte)0, (byte)0, byte.MaxValue)); [HarmonyPatch("Start")] [HarmonyPostfix] private static void Start(ref HUDManager __instance) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("HealthHUDDisplay"); val.AddComponent<RectTransform>(); TextMeshProUGUI obj = val.AddComponent<TextMeshProUGUI>(); RectTransform rectTransform = ((TMP_Text)obj).rectTransform; ((Transform)rectTransform).SetParent(((Component)__instance.PTTIcon).transform, false); rectTransform.anchoredPosition = new Vector2(8f, -57f); ((TMP_Text)obj).font = ((TMP_Text)__instance.controlTipLines[0]).font; ((TMP_Text)obj).fontSize = 16f; ((TMP_Text)obj).text = "100"; ((Graphic)obj).color = _healthyColor; ((TMP_Text)obj).overflowMode = (TextOverflowModes)0; ((Behaviour)obj).enabled = true; _healthText = obj; } [HarmonyPatch("Update")] [HarmonyPostfix] private static void Update() { //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: 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) if ((Object)(object)_healthText != (Object)null && _healthValueForUpdater != _oldValuehealthValueForUpdater) { _oldValuehealthValueForUpdater = _healthValueForUpdater; if (_healthValueForUpdater > 0) { ((TMP_Text)_healthText).text = _healthValueForUpdater.ToString().PadLeft((_healthValueForUpdater < 10) ? 2 : 3, ' '); } else { ((TMP_Text)_healthText).text = DefaultValueHealthText; } double percentage = (double)_healthValueForUpdater / 100.0; ((Graphic)_healthText).color = ColorInterpolation(_criticalHealthColor, _healthyColor, percentage); } } public static int LinearInterpolation(int start, int end, double percentage) { return start + (int)Math.Round(percentage * (double)(end - start)); } public static Color ColorInterpolation(Color start, Color end, double percentage) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_000b: 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_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) return new Color(hexToFloat(LinearInterpolation(floatToHex(start.r), floatToHex(end.r), percentage)), hexToFloat(LinearInterpolation(floatToHex(start.g), floatToHex(end.g), percentage)), hexToFloat(LinearInterpolation(floatToHex(start.b), floatToHex((int)end.b), percentage)), 1f); } public static float hexToFloat(int hex) { return (float)hex / 255f; } public static int floatToHex(float f) { return (int)f * 255; } } [HarmonyPatch(typeof(PlayerControllerB))] internal class PlayerPatches { [HarmonyPrefix] [HarmonyPatch("LateUpdate")] private static void LateUpdate_Prefix(PlayerControllerB __instance) { if (((NetworkBehaviour)__instance).IsOwner && (!((NetworkBehaviour)__instance).IsServer || __instance.isHostPlayerObject)) { HealthHUDPatches._healthValueForUpdater = ((__instance.health >= 0) ? __instance.health : 0); } } } }
BepInEx/plugins/notnotnotswipez-MoreCompany/MoreCompany.dll
Decompiled 8 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using MoreCompany.Cosmetics; using MoreCompany.Utils; using Steamworks; using Steamworks.Data; using TMPro; using Unity.Netcode; using Unity.Netcode.Transports.UTP; using UnityEngine; using UnityEngine.Audio; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("MoreCompany")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyCopyright("Copyright © NotNotSwipez 2023")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("MoreCompany")] [assembly: AssemblyTitle("MoreCompany")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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 MoreCompany { [HarmonyPatch(typeof(AudioMixer), "SetFloat")] public static class AudioMixerSetFloatPatch { public static bool Prefix(string name, float value) { if (name.StartsWith("PlayerVolume") || name.StartsWith("PlayerPitch")) { string s = name.Replace("PlayerVolume", "").Replace("PlayerPitch", ""); int num = int.Parse(s); PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[num]; if ((Object)(object)val != (Object)null) { AudioSource currentVoiceChatAudioSource = val.currentVoiceChatAudioSource; if (Object.op_Implicit((Object)(object)currentVoiceChatAudioSource)) { if (name.StartsWith("PlayerVolume")) { currentVoiceChatAudioSource.volume = value / 16f; } else if (name.StartsWith("PlayerPitch")) { currentVoiceChatAudioSource.pitch = value; } } return false; } } return true; } } [HarmonyPatch(typeof(HUDManager), "AddTextToChatOnServer")] public static class SendChatToServerPatch { public static bool Prefix(string chatMessage, int playerId = -1) { if (((NetworkBehaviour)StartOfRound.Instance).IsHost && chatMessage.StartsWith("/mc") && DebugCommandRegistry.commandEnabled) { string text = chatMessage.Replace("/mc ", ""); DebugCommandRegistry.HandleCommand(text.Split(' ')); return false; } return true; } } [HarmonyPatch] public static class ClientReceiveMessagePatch { internal enum __RpcExecStage { None, Server, Client } internal static MethodInfo AddTextMessageServerRpc = AccessTools.Method(typeof(HUDManager), "AddTextMessageServerRpc", (Type[])null, (Type[])null); internal static FieldInfo __rpc_exec_stage = AccessTools.Field(typeof(NetworkBehaviour), "__rpc_exec_stage"); [HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")] [HarmonyPostfix] public static void ConnectClientToPlayerObject_Postfix(PlayerControllerB __instance) { MainClass.playerIdsAndCosmetics.Clear(); string text = $"[morecompanycosmetics];{__instance.playerClientId};-1"; foreach (string locallySelectedCosmetic in CosmeticRegistry.locallySelectedCosmetics) { if (CosmeticRegistry.cosmeticInstances.ContainsKey(locallySelectedCosmetic)) { text = text + ";" + locallySelectedCosmetic; } } AddTextMessageServerRpc?.Invoke(HUDManager.Instance, new object[1] { text }); } [HarmonyPatch(typeof(HUDManager), "AddTextMessageServerRpc")] [HarmonyPostfix] public static void AddTextMessageServerRpc_Postfix(HUDManager __instance, string chatMessage) { if (!chatMessage.StartsWith("[morecompanycosmetics]")) { return; } NetworkManager networkManager = ((NetworkBehaviour)__instance).NetworkManager; if ((Object)(object)networkManager == (Object)null || !networkManager.IsListening || (__RpcExecStage)__rpc_exec_stage.GetValue(__instance) == __RpcExecStage.Server || !networkManager.IsHost) { return; } string[] array = chatMessage.Split(';'); int num = int.Parse(array[1]); int num2 = int.Parse(array[2]); if (num2 != -1) { return; } foreach (KeyValuePair<int, List<string>> item in MainClass.playerIdsAndCosmetics.ToList()) { if (item.Key == num) { continue; } string text = $"[morecompanycosmetics];{item.Key};{num}"; foreach (string item2 in item.Value) { text = text + ";" + item2; } AddTextMessageServerRpc?.Invoke(__instance, new object[1] { text }); } } [HarmonyPatch(typeof(HUDManager), "AddTextMessageClientRpc")] [HarmonyPrefix] public static void AddTextMessageClientRpc_Prefix(HUDManager __instance, string chatMessage) { if (chatMessage.StartsWith("[morecompanycosmetics]")) { NetworkManager networkManager = ((NetworkBehaviour)__instance).NetworkManager; if (!((Object)(object)networkManager == (Object)null) && networkManager.IsListening && (__RpcExecStage)__rpc_exec_stage.GetValue(__instance) == __RpcExecStage.Client && (networkManager.IsClient || networkManager.IsHost)) { HandleDataMessage(chatMessage); } } } internal static void HandleDataMessage(string chatMessage) { //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) string[] array = chatMessage.Split(';'); int num = int.Parse(array[1]); int num2 = int.Parse(array[2]); array = array.Skip(3).ToArray(); if (num2 != -1 && num2 != StartOfRound.Instance.thisClientPlayerId) { return; } CosmeticApplication cosmeticApplication = ((Component)((Component)StartOfRound.Instance.allPlayerScripts[num]).transform.Find("ScavengerModel").Find("metarig")).gameObject.GetComponent<CosmeticApplication>(); if (!Object.op_Implicit((Object)(object)cosmeticApplication)) { cosmeticApplication = ((Component)((Component)StartOfRound.Instance.allPlayerScripts[num]).transform.Find("ScavengerModel").Find("metarig")).gameObject.AddComponent<CosmeticApplication>(); } cosmeticApplication.ClearCosmetics(); List<string> list = new List<string>(); string[] array2 = array; foreach (string text in array2) { list.Add(text); if (MainClass.cosmeticsSyncOther.Value) { cosmeticApplication.ApplyCosmetic(text, startEnabled: true); } } if (num == StartOfRound.Instance.thisClientPlayerId) { cosmeticApplication.ClearCosmetics(); } foreach (CosmeticInstance spawnedCosmetic in cosmeticApplication.spawnedCosmetics) { Transform transform = ((Component)spawnedCosmetic).transform; transform.localScale *= 0.38f; } if (MainClass.playerIdsAndCosmetics.ContainsKey(num)) { MainClass.playerIdsAndCosmetics[num] = list; } else { MainClass.playerIdsAndCosmetics.Add(num, list); } } } [HarmonyPatch] public static class PreventOldVersionChatSpamPatch { [HarmonyPatch(typeof(HUDManager), "AddChatMessage")] [HarmonyPrefix] public static bool AddChatMessage_Prefix(string chatMessage, string nameOfUserWhoTyped = "") { if (chatMessage.StartsWith("[replacewithdata]") || chatMessage.StartsWith("[morecompanycosmetics]")) { return false; } return true; } [HarmonyPatch(typeof(HUDManager), "AddPlayerChatMessageClientRpc")] [HarmonyPrefix] public static bool AddPlayerChatMessageClientRpc_Prefix(string chatMessage, int playerId) { if (chatMessage.StartsWith("[replacewithdata]") || chatMessage.StartsWith("[morecompanycosmetics]")) { return false; } return true; } } public class DebugCommandRegistry { public static bool commandEnabled; public static void HandleCommand(string[] args) { //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: 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_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_026f: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_0284: Unknown result type (might be due to invalid IL or missing references) //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_029b: Unknown result type (might be due to invalid IL or missing references) if (!commandEnabled) { return; } PlayerControllerB localPlayerController = StartOfRound.Instance.localPlayerController; switch (args[0]) { case "money": { int groupCredits = int.Parse(args[1]); Terminal val5 = Resources.FindObjectsOfTypeAll<Terminal>().First(); val5.groupCredits = groupCredits; break; } case "spawnscrap": { string text = ""; for (int i = 1; i < args.Length; i++) { text = text + args[i] + " "; } text = text.Trim(); Vector3 val = ((Component)localPlayerController).transform.position + ((Component)localPlayerController).transform.forward * 2f; SpawnableItemWithRarity val2 = null; foreach (SpawnableItemWithRarity item in StartOfRound.Instance.currentLevel.spawnableScrap) { if (item.spawnableItem.itemName.ToLower() == text.ToLower()) { val2 = item; break; } } GameObject val3 = Object.Instantiate<GameObject>(val2.spawnableItem.spawnPrefab, val, Quaternion.identity, (Transform)null); GrabbableObject component = val3.GetComponent<GrabbableObject>(); ((Component)component).transform.rotation = Quaternion.Euler(component.itemProperties.restingRotation); component.fallTime = 0f; NetworkObject component2 = val3.GetComponent<NetworkObject>(); component2.Spawn(false); break; } case "spawnenemy": { string text2 = ""; for (int j = 1; j < args.Length; j++) { text2 = text2 + args[j] + " "; } text2 = text2.Trim(); SpawnableEnemyWithRarity val4 = null; foreach (SpawnableEnemyWithRarity enemy in StartOfRound.Instance.currentLevel.Enemies) { if (enemy.enemyType.enemyName.ToLower() == text2.ToLower()) { val4 = enemy; break; } } RoundManager.Instance.SpawnEnemyGameObject(((Component)localPlayerController).transform.position + ((Component)localPlayerController).transform.forward * 2f, 0f, -1, val4.enemyType); break; } case "listall": MainClass.StaticLogger.LogInfo((object)"Spawnable scrap:"); foreach (SpawnableItemWithRarity item2 in StartOfRound.Instance.currentLevel.spawnableScrap) { MainClass.StaticLogger.LogInfo((object)item2.spawnableItem.itemName); } MainClass.StaticLogger.LogInfo((object)"Spawnable enemies:"); { foreach (SpawnableEnemyWithRarity enemy2 in StartOfRound.Instance.currentLevel.Enemies) { MainClass.StaticLogger.LogInfo((object)enemy2.enemyType.enemyName); } break; } } } } [HarmonyPatch(typeof(ForestGiantAI), "LookForPlayers")] public static class LookForPlayersForestGiantPatch { public static void Prefix(ref ForestGiantAI __instance) { if (__instance.playerStealthMeters.Length != MainClass.newPlayerCount) { Array.Resize(ref __instance.playerStealthMeters, MainClass.newPlayerCount); for (int i = 0; i < MainClass.newPlayerCount; i++) { __instance.playerStealthMeters[i] = 0f; } } } } [HarmonyPatch(typeof(BlobAI), "Start")] public static class BlobAIStartPatch { public static void Postfix(ref BlobAI __instance) { Collider[] value = (Collider[])(object)new Collider[MainClass.newPlayerCount]; ReflectionUtils.SetFieldValue(__instance, "ragdollColliders", value); } } [HarmonyPatch(typeof(CrawlerAI), "Start")] public static class CrawlerAIStartPatch { public static void Postfix(ref CrawlerAI __instance) { Collider[] value = (Collider[])(object)new Collider[MainClass.newPlayerCount]; ReflectionUtils.SetFieldValue(__instance, "nearPlayerColliders", value); } } [HarmonyPatch(typeof(SpringManAI), "Update")] public static class SpringManAIUpdatePatch { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); bool flag = false; bool flag2 = false; foreach (CodeInstruction instruction in instructions) { if (!flag2) { if (!flag && ((object)instruction).ToString() == "call static float UnityEngine.Vector3::Distance(UnityEngine.Vector3 a, UnityEngine.Vector3 b)") { flag = true; } else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL") { flag2 = true; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); continue; } } list.Add(instruction); } if (!flag2) { MainClass.StaticLogger.LogWarning((object)"SpringManAIUpdatePatch failed to replace newPlayerCount"); } return list.AsEnumerable(); } } [HarmonyPatch(typeof(SpringManAI), "DoAIInterval")] public static class SpringManAIIntervalPatch { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); bool flag = false; bool flag2 = false; foreach (CodeInstruction instruction in instructions) { if (!flag2) { if (!flag && ((object)instruction).ToString() == "call void EnemyAI::SwitchToBehaviourState(int stateIndex)") { flag = true; } else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL") { flag2 = true; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); continue; } } list.Add(instruction); } if (!flag2) { MainClass.StaticLogger.LogWarning((object)"SpringManAIIntervalPatch failed to replace newPlayerCount"); } return list.AsEnumerable(); } } [HarmonyPatch(typeof(EnemyAI), "GetClosestPlayer")] public static class GetClosestPlayerPatch { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); bool flag = false; foreach (CodeInstruction instruction in instructions) { if (!flag && ((object)instruction).ToString() == "ldc.i4.4 NULL") { flag = true; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); } else { list.Add(instruction); } } if (!flag) { MainClass.StaticLogger.LogWarning((object)"GetClosestPlayerPatch failed to replace newPlayerCount"); } return list.AsEnumerable(); } } [HarmonyPatch(typeof(EnemyAI), "GetAllPlayersInLineOfSight")] public static class GetAllPlayersInLineOfSightPatch { public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); bool flag = false; foreach (CodeInstruction instruction in instructions) { if (!flag && ((object)instruction).ToString() == "ldc.i4.4 NULL") { flag = true; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); } else { list.Add(instruction); } } if (!flag) { MainClass.StaticLogger.LogWarning((object)"GetAllPlayersInLineOfSightPatch failed to replace newPlayerCount"); } return list.AsEnumerable(); } } [HarmonyPatch(typeof(DressGirlAI), "ChoosePlayerToHaunt")] public static class DressGirlHauntPatch { public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); int num = 0; foreach (CodeInstruction instruction in instructions) { if (((object)instruction).ToString() == "ldc.i4.4 NULL") { num++; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); } else { list.Add(instruction); } } if (num != 3) { MainClass.StaticLogger.LogWarning((object)$"DressGirlHauntPatch failed to replace newPlayerCount: {num}/3"); } return list.AsEnumerable(); } } [HarmonyPatch(typeof(ButlerEnemyAI), "Start")] public static class ButlerEnemyAIPatch { public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); int num = 0; foreach (CodeInstruction instruction in instructions) { if (((object)instruction).ToString() == "ldc.i4.4 NULL") { num++; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); } else { list.Add(instruction); } } if (num != 3) { MainClass.StaticLogger.LogWarning((object)$"ButlerEnemyAIPatch failed to replace newPlayerCount: {num}/3"); } return list.AsEnumerable(); } } [HarmonyPatch(typeof(HUDManager), "AddChatMessage")] public static class HudChatPatch { public static void Prefix(HUDManager __instance, ref string chatMessage, string nameOfUserWhoTyped = "") { if (!(__instance.lastChatMessage == chatMessage)) { StringBuilder stringBuilder = new StringBuilder(chatMessage); for (int i = 0; i < MainClass.newPlayerCount; i++) { string oldValue = $"[playerNum{i}]"; string playerUsername = StartOfRound.Instance.allPlayerScripts[i].playerUsername; stringBuilder.Replace(oldValue, playerUsername); } chatMessage = stringBuilder.ToString(); } } } [HarmonyPatch(typeof(MenuManager), "Awake")] public static class MenuManagerLogoOverridePatch { public static List<TMP_InputField> inputFields = new List<TMP_InputField>(); public static void Postfix(MenuManager __instance) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) try { MainClass.ReadSettingsFromFile(); GameObject gameObject = ((Component)((Component)__instance).transform.parent).gameObject; Sprite sprite = Sprite.Create(MainClass.mainLogo, new Rect(0f, 0f, (float)((Texture)MainClass.mainLogo).width, (float)((Texture)MainClass.mainLogo).height), new Vector2(0.5f, 0.5f)); Transform val = gameObject.transform.Find("MenuContainer/MainButtons/HeaderImage"); if ((Object)(object)val != (Object)null) { ((Component)val).gameObject.GetComponent<Image>().sprite = sprite; } Transform val2 = gameObject.transform.Find("MenuContainer/LoadingScreen"); if ((Object)(object)val2 != (Object)null) { val2.localScale = new Vector3(1.02f, 1.06f, 1.02f); Transform val3 = val2.Find("Image"); if ((Object)(object)val3 != (Object)null) { ((Component)val3).GetComponent<Image>().sprite = sprite; } } CosmeticRegistry.SpawnCosmeticGUI(); LANMenu.InitializeMenu(); inputFields.Clear(); Transform val4 = gameObject.transform.Find("MenuContainer/LobbyHostSettings/HostSettingsContainer/LobbyHostOptions"); if ((Object)(object)val4 != (Object)null) { CreateCrewCountInput(val4.Find(GameNetworkManager.Instance.disableSteam ? "LANOptions" : "OptionsNormal")); } Transform val5 = gameObject.transform.Find("MenuContainer/LobbyJoinSettings/JoinSettingsContainer/LobbyJoinOptions"); if ((Object)(object)val5 != (Object)null) { CreateCrewCountInput(val5.Find("LANOptions")); } } catch (Exception ex) { MainClass.StaticLogger.LogError((object)ex); } } private static void CreateCrewCountInput(Transform parent) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(MainClass.crewCountUI, parent); RectTransform component = val.GetComponent<RectTransform>(); ((Transform)component).localPosition = new Vector3(96.9f, -70f, -6.7f); TMP_InputField inputField = ((Component)val.transform.Find("InputField (TMP)")).GetComponent<TMP_InputField>(); inputField.characterLimit = 3; inputField.text = MainClass.newPlayerCount.ToString(); inputFields.Add(inputField); ((UnityEvent<string>)(object)inputField.onSubmit).AddListener((UnityAction<string>)delegate(string s) { UpdateTextBox(inputField, s); }); ((UnityEvent<string>)(object)inputField.onDeselect).AddListener((UnityAction<string>)delegate(string s) { UpdateTextBox(inputField, s); }); } public static void UpdateTextBox(TMP_InputField inputField, string s) { if (inputField.text == MainClass.newPlayerCount.ToString()) { return; } if (int.TryParse(s, out var result)) { int newPlayerCount = MainClass.newPlayerCount; MainClass.newPlayerCount = Mathf.Clamp(result, MainClass.minPlayerCount, MainClass.maxPlayerCount); foreach (TMP_InputField inputField2 in inputFields) { inputField2.text = MainClass.newPlayerCount.ToString(); } MainClass.SaveSettingsToFile(); if (MainClass.newPlayerCount != newPlayerCount) { MainClass.StaticLogger.LogInfo((object)$"Changed Crew Count: {MainClass.newPlayerCount}"); } } else { if (s.Length == 0) { return; } foreach (TMP_InputField inputField3 in inputFields) { inputField3.text = MainClass.newPlayerCount.ToString(); inputField3.caretPosition = 1; } } } } [HarmonyPatch(typeof(QuickMenuManager), "AddUserToPlayerList")] public static class AddUserPlayerListPatch { private static bool Prefix(QuickMenuManager __instance, ulong steamId, string playerName, int playerObjectId) { QuickmenuVisualInjectPatch.PopulateQuickMenu(__instance); return false; } } [HarmonyPatch(typeof(QuickMenuManager), "RemoveUserFromPlayerList")] public static class RemoveUserPlayerListPatch { public static bool Prefix(QuickMenuManager __instance) { QuickmenuVisualInjectPatch.PopulateQuickMenu(__instance); return false; } } [HarmonyPatch(typeof(QuickMenuManager), "Update")] public static class QuickMenuUpdatePatch { public static bool Prefix() { return false; } } [HarmonyPatch(typeof(QuickMenuManager), "NonHostPlayerSlotsEnabled")] public static class QuickMenuDisplayPatch { public static bool Prefix(ref bool __result) { __result = false; for (int i = 1; i < StartOfRound.Instance.allPlayerScripts.Length; i++) { PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[i]; if (val.isPlayerControlled || val.isPlayerDead) { __result = true; break; } } return false; } } [HarmonyPatch(typeof(QuickMenuManager), "Start")] public static class QuickmenuVisualInjectPatch { public static GameObject quickMenuScrollInstance; public static void Postfix(QuickMenuManager __instance) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) GameObject gameObject = ((Component)__instance.playerListPanel.transform.Find("Image")).gameObject; GameObject val = Object.Instantiate<GameObject>(MainClass.quickMenuScrollParent); val.transform.SetParent(gameObject.transform); RectTransform component = val.GetComponent<RectTransform>(); ((Transform)component).localPosition = new Vector3(0f, -31.2f, 0f); ((Transform)component).localScale = Vector3.one; quickMenuScrollInstance = val; } public static void PopulateQuickMenu(QuickMenuManager __instance) { //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_028c: Unknown result type (might be due to invalid IL or missing references) //IL_0296: Expected O, but got Unknown //IL_02e6: Unknown result type (might be due to invalid IL or missing references) //IL_02f0: Expected O, but got Unknown int childCount = quickMenuScrollInstance.transform.Find("Holder").childCount; List<GameObject> list = new List<GameObject>(); for (int i = 0; i < childCount; i++) { list.Add(((Component)quickMenuScrollInstance.transform.Find("Holder").GetChild(i)).gameObject); } foreach (GameObject item in list) { Object.Destroy((Object)(object)item); } if (!Object.op_Implicit((Object)(object)StartOfRound.Instance)) { return; } for (int j = 0; j < StartOfRound.Instance.allPlayerScripts.Length; j++) { PlayerControllerB playerScript = StartOfRound.Instance.allPlayerScripts[j]; if (!playerScript.isPlayerControlled && !playerScript.isPlayerDead) { continue; } GameObject val = Object.Instantiate<GameObject>(MainClass.playerEntry, quickMenuScrollInstance.transform.Find("Holder")); RectTransform component = val.GetComponent<RectTransform>(); ((Transform)component).localScale = Vector3.one; ((Transform)component).localPosition = new Vector3(0f, 0f - ((Transform)component).localPosition.y, 0f); TextMeshProUGUI component2 = ((Component)val.transform.Find("PlayerNameButton").Find("PName")).GetComponent<TextMeshProUGUI>(); ((TMP_Text)component2).text = playerScript.playerUsername; Slider playerVolume = ((Component)val.transform.Find("PlayerVolumeSlider")).GetComponent<Slider>(); int finalIndex = j; ((UnityEvent<float>)(object)playerVolume.onValueChanged).AddListener((UnityAction<float>)delegate(float f) { if (playerScript.isPlayerControlled || playerScript.isPlayerDead) { float num = f / playerVolume.maxValue + 1f; if (num <= -1f) { SoundManager.Instance.playerVoiceVolumes[finalIndex] = -70f; } else { SoundManager.Instance.playerVoiceVolumes[finalIndex] = num; } } }); if ((Object)(object)StartOfRound.Instance.localPlayerController != (Object)null && StartOfRound.Instance.localPlayerController.playerClientId == playerScript.playerClientId) { ((Component)playerVolume).gameObject.SetActive(false); ((Component)val.transform.Find("Text (1)")).gameObject.SetActive(false); } Button component3 = ((Component)val.transform.Find("KickButton")).GetComponent<Button>(); ((UnityEvent)component3.onClick).AddListener((UnityAction)delegate { __instance.KickUserFromServer(finalIndex); }); if (!GameNetworkManager.Instance.isHostingGame) { ((Component)component3).gameObject.SetActive(false); } Button component4 = ((Component)val.transform.Find("ProfileIcon")).GetComponent<Button>(); ((UnityEvent)component4.onClick).AddListener((UnityAction)delegate { //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (!GameNetworkManager.Instance.disableSteam) { SteamFriends.OpenUserOverlay(SteamId.op_Implicit(playerScript.playerSteamId), "steamid"); } }); } } } [HarmonyPatch(typeof(QuickMenuManager), "ConfirmKickUserFromServer")] public static class KickPatch { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); bool flag = false; bool flag2 = false; foreach (CodeInstruction instruction in instructions) { if (!flag2) { if (!flag && ((object)instruction).ToString() == "ldfld int QuickMenuManager::playerObjToKick") { flag = true; } else if (flag && ((object)instruction).ToString() == "ldc.i4.3 NULL") { flag2 = true; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); continue; } } list.Add(instruction); } if (!flag2) { MainClass.StaticLogger.LogWarning((object)"KickPatch failed to replace newPlayerCount"); } return list.AsEnumerable(); } } [HarmonyPatch(typeof(HUDManager), "UpdateBoxesSpectateUI")] public static class SpectatorBoxUpdatePatch { public static void Postfix(HUDManager __instance) { //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) Dictionary<Animator, PlayerControllerB> fieldValue = ReflectionUtils.GetFieldValue<Dictionary<Animator, PlayerControllerB>>(__instance, "spectatingPlayerBoxes"); int num = -64; int num2 = 0; int num3 = 0; int num4 = -70; int num5 = 230; int num6 = 4; foreach (KeyValuePair<Animator, PlayerControllerB> item in fieldValue) { if (((Component)item.Key).gameObject.activeInHierarchy) { GameObject gameObject = ((Component)item.Key).gameObject; RectTransform component = gameObject.GetComponent<RectTransform>(); int num7 = (int)Math.Floor((double)num3 / (double)num6); int num8 = num3 % num6; int num9 = num8 * num4; int num10 = num7 * num5; component.anchoredPosition = Vector2.op_Implicit(new Vector3((float)(num + num10), (float)(num2 + num9), 0f)); num3++; } } } } [HarmonyPatch(typeof(HUDManager), "Start")] public static class HudStartPatch { public static void Postfix(HUDManager __instance) { //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) EndOfGameStatUIElements statsUIElements = __instance.statsUIElements; GameObject gameObject = ((Component)((Component)statsUIElements.playerNamesText[0]).gameObject.transform.parent).gameObject; GameObject gameObject2 = ((Component)gameObject.transform.parent.parent).gameObject; GameObject gameObject3 = ((Component)gameObject2.transform.Find("BGBoxes")).gameObject; gameObject2.transform.parent.Find("DeathScreen").SetSiblingIndex(3); gameObject3.transform.localScale = new Vector3(2.5f, 1f, 1f); MakePlayerHolder(4, gameObject, statsUIElements, new Vector3(426.9556f, -0.7932f, 0f)); MakePlayerHolder(5, gameObject, statsUIElements, new Vector3(426.9556f, -115.4483f, 0f)); MakePlayerHolder(6, gameObject, statsUIElements, new Vector3(-253.6783f, -115.4483f, 0f)); MakePlayerHolder(7, gameObject, statsUIElements, new Vector3(-253.6783f, -0.7932f, 0f)); for (int i = 8; i < MainClass.newPlayerCount; i++) { MakePlayerHolder(i, gameObject, statsUIElements, new Vector3(10000f, 10000f, 0f)); } } public static void MakePlayerHolder(int index, GameObject original, EndOfGameStatUIElements uiElements, Vector3 localPosition) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) if (index + 1 <= MainClass.newPlayerCount) { GameObject val = Object.Instantiate<GameObject>(original); RectTransform component = val.GetComponent<RectTransform>(); RectTransform component2 = original.GetComponent<RectTransform>(); ((Transform)component).SetParent(((Transform)component2).parent); ((Transform)component).localScale = new Vector3(1f, 1f, 1f); ((Transform)component).localPosition = localPosition; GameObject gameObject = ((Component)val.transform.Find("PlayerName1")).gameObject; GameObject gameObject2 = ((Component)val.transform.Find("Notes")).gameObject; ((Transform)gameObject2.GetComponent<RectTransform>()).localPosition = new Vector3(-95.7222f, 43.3303f, 0f); GameObject gameObject3 = ((Component)val.transform.Find("Symbol")).gameObject; if (index >= uiElements.playerNamesText.Length) { Array.Resize(ref uiElements.playerNamesText, index + 1); Array.Resize(ref uiElements.playerStates, index + 1); Array.Resize(ref uiElements.playerNotesText, index + 1); } uiElements.playerNamesText[index] = gameObject.GetComponent<TextMeshProUGUI>(); uiElements.playerNotesText[index] = gameObject2.GetComponent<TextMeshProUGUI>(); uiElements.playerStates[index] = gameObject3.GetComponent<Image>(); } } } public class LANMenu : MonoBehaviour { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static UnityAction <>9__0_0; internal void <InitializeMenu>b__0_0() { TextMeshProUGUI component = GameObject.Find("Canvas/MenuContainer/LobbyJoinSettings/JoinSettingsContainer/PrivatePublicDescription").GetComponent<TextMeshProUGUI>(); if ((Object)(object)component != (Object)null) { ((TMP_Text)component).text = "The mod will attempt to auto-detect the crew size however you can manually specify it to reduce chance of failure."; } GameObject.Find("Canvas/MenuContainer/LobbyJoinSettings").gameObject.SetActive(true); } } public static void InitializeMenu() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown CreateUI(); GameObject val = GameObject.Find("Canvas/MenuContainer/MainButtons/StartLAN"); if (!((Object)(object)val != (Object)null)) { return; } MainClass.StaticLogger.LogInfo((object)"LANMenu startLAN Patched"); val.GetComponent<Button>().onClick = new ButtonClickedEvent(); ButtonClickedEvent onClick = val.GetComponent<Button>().onClick; object obj = <>c.<>9__0_0; if (obj == null) { UnityAction val2 = delegate { TextMeshProUGUI component = GameObject.Find("Canvas/MenuContainer/LobbyJoinSettings/JoinSettingsContainer/PrivatePublicDescription").GetComponent<TextMeshProUGUI>(); if ((Object)(object)component != (Object)null) { ((TMP_Text)component).text = "The mod will attempt to auto-detect the crew size however you can manually specify it to reduce chance of failure."; } GameObject.Find("Canvas/MenuContainer/LobbyJoinSettings").gameObject.SetActive(true); }; <>c.<>9__0_0 = val2; obj = (object)val2; } ((UnityEvent)onClick).AddListener((UnityAction)obj); } private static GameObject CreateUI() { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Expected O, but got Unknown //IL_02a4: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Expected O, but got Unknown if ((Object)(object)GameObject.Find("Canvas/MenuContainer/LobbyJoinSettings") != (Object)null) { return null; } GameObject val = GameObject.Find("Canvas/MenuContainer"); if ((Object)(object)val == (Object)null) { return null; } GameObject val2 = GameObject.Find("Canvas/MenuContainer/LobbyHostSettings"); if ((Object)(object)val2 == (Object)null) { return null; } GameObject val3 = Object.Instantiate<GameObject>(val2, val2.transform.position, val2.transform.rotation, val.transform); ((Object)val3).name = "LobbyJoinSettings"; Transform val4 = val3.transform.Find("HostSettingsContainer"); if ((Object)(object)val4 != (Object)null) { ((Object)val4).name = "JoinSettingsContainer"; ((Object)((Component)val4).transform.Find("LobbyHostOptions")).name = "LobbyJoinOptions"; Object.Destroy((Object)(object)((Component)val3.transform.Find("ChallengeLeaderboard")).gameObject); Object.Destroy((Object)(object)((Component)val3.transform.Find("FilesPanel")).gameObject); Object.Destroy((Object)(object)((Component)((Component)val4).transform.Find("LobbyJoinOptions/OptionsNormal")).gameObject); Object.Destroy((Object)(object)((Component)((Component)val4).transform.Find("LobbyJoinOptions/LANOptions/AllowRemote")).gameObject); Object.Destroy((Object)(object)((Component)((Component)val4).transform.Find("LobbyJoinOptions/LANOptions/Local")).gameObject); Transform val5 = ((Component)val4).transform.Find("LobbyJoinOptions/LANOptions/Header"); if ((Object)(object)val5 != (Object)null) { ((TMP_Text)((Component)val5).GetComponent<TextMeshProUGUI>()).text = "Join LAN Server:"; } Transform val6 = ((Component)val4).transform.Find("LobbyJoinOptions/LANOptions/ServerNameField"); if ((Object)(object)val6 != (Object)null) { ((Component)val6).transform.localPosition = new Vector3(0f, 15f, -6.5f); ((Component)val6).gameObject.SetActive(true); } TMP_InputField ip_field = ((Component)val6).GetComponent<TMP_InputField>(); if ((Object)(object)ip_field != (Object)null) { TextMeshProUGUI ip_placeholder = ((Component)ip_field.placeholder).GetComponent<TextMeshProUGUI>(); ((TMP_Text)ip_placeholder).text = ES3.Load<string>("LANIPAddress", "LCGeneralSaveData", "127.0.0.1"); Transform obj = ((Component)val4).transform.Find("Confirm"); Button val7 = ((obj != null) ? ((Component)obj).GetComponent<Button>() : null); if ((Object)(object)val7 != (Object)null) { val7.onClick = new ButtonClickedEvent(); ((UnityEvent)val7.onClick).AddListener((UnityAction)delegate { string text = "127.0.0.1"; text = ((!(ip_field.text != "")) ? ((TMP_Text)ip_placeholder).text : ip_field.text); ES3.Save<string>("LANIPAddress", text, "LCGeneralSaveData"); GameObject.Find("Canvas/MenuContainer/LobbyJoinSettings").gameObject.SetActive(false); ((Component)NetworkManager.Singleton).GetComponent<UnityTransport>().ConnectionData.Address = text; MainClass.StaticLogger.LogInfo((object)("Listening to LAN server: " + text)); GameObject.Find("MenuManager").GetComponent<MenuManager>().StartAClient(); }); } } TextMeshProUGUI component = ((Component)((Component)val4).transform.Find("PrivatePublicDescription")).GetComponent<TextMeshProUGUI>(); if ((Object)(object)component != (Object)null) { ((TMP_Text)component).text = "The mod will attempt to auto-detect the crew size however you can manually specify it to reduce chance of failure."; } ((Component)((Component)val4).transform.Find("LobbyJoinOptions/LANOptions")).gameObject.SetActive(true); } return val3; } } [HarmonyPatch(typeof(GameNetworkManager), "SetConnectionDataBeforeConnecting")] public static class ConnectionDataPatch { public static void Postfix(ref GameNetworkManager __instance) { if (__instance.disableSteam) { NetworkManager.Singleton.NetworkConfig.ConnectionData = Encoding.ASCII.GetBytes(__instance.gameVersionNum + "," + MainClass.newPlayerCount); } } } [HarmonyPatch(typeof(GameNetworkManager), "OnLocalClientConnectionDisapproved")] public static class ConnectionDisapprovedPatch { private static int crewSizeMismatch; private static IEnumerator delayedReconnect() { yield return (object)new WaitForSeconds(0.5f); GameObject.Find("MenuManager").GetComponent<MenuManager>().StartAClient(); } private static void Prefix(ref GameNetworkManager __instance, ulong clientId) { crewSizeMismatch = 0; if (!__instance.disableSteam) { return; } try { if (!string.IsNullOrEmpty(NetworkManager.Singleton.DisconnectReason) && NetworkManager.Singleton.DisconnectReason.StartsWith("Crew size mismatch!")) { crewSizeMismatch = int.Parse(NetworkManager.Singleton.DisconnectReason.Split("Their size: ")[1].Split(". ")[0]); } } catch { } } private static void Postfix(ref GameNetworkManager __instance, ulong clientId) { if (__instance.disableSteam && crewSizeMismatch != 0) { MainClass.newPlayerCount = Mathf.Clamp(crewSizeMismatch, MainClass.minPlayerCount, MainClass.maxPlayerCount); if (MainClass.newPlayerCount == crewSizeMismatch) { GameObject.Find("MenuManager").GetComponent<MenuManager>().menuNotification.SetActive(false); Object.FindObjectOfType<MenuManager>().SetLoadingScreen(true, (RoomEnter)5, ""); ((MonoBehaviour)__instance).StartCoroutine(delayedReconnect()); } crewSizeMismatch = 0; } } } public static class PluginInformation { public const string PLUGIN_NAME = "MoreCompany"; public const string PLUGIN_VERSION = "1.9.1"; public const string PLUGIN_GUID = "me.swipez.melonloader.morecompany"; } [BepInPlugin("me.swipez.melonloader.morecompany", "MoreCompany", "1.9.1")] public class MainClass : BaseUnityPlugin { public static int defaultPlayerCount = 32; public static int minPlayerCount = 4; public static int maxPlayerCount = 50; public static int newPlayerCount = 32; public static ConfigFile StaticConfig; public static ConfigEntry<int> playerCount; public static ConfigEntry<bool> cosmeticsSyncOther; public static ConfigEntry<bool> defaultCosmetics; public static ConfigEntry<bool> cosmeticsPerProfile; public static Texture2D mainLogo; public static GameObject quickMenuScrollParent; public static GameObject playerEntry; public static GameObject crewCountUI; public static GameObject cosmeticGUIInstance; public static GameObject cosmeticButton; public static ManualLogSource StaticLogger; public static Dictionary<int, List<string>> playerIdsAndCosmetics = new Dictionary<int, List<string>>(); public static string dynamicCosmeticsPath; public static string cosmeticSavePath; private void Awake() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Expected O, but got Unknown StaticLogger = ((BaseUnityPlugin)this).Logger; StaticConfig = ((BaseUnityPlugin)this).Config; playerCount = StaticConfig.Bind<int>("General", "Player Count", defaultPlayerCount, new ConfigDescription("How many players can be in your lobby?", (AcceptableValueBase)(object)new AcceptableValueRange<int>(minPlayerCount, maxPlayerCount), Array.Empty<object>())); cosmeticsSyncOther = StaticConfig.Bind<bool>("Cosmetics", "Show Cosmetics", true, "Should you be able to see cosmetics of other players?"); defaultCosmetics = StaticConfig.Bind<bool>("Cosmetics", "Default Cosmetics", true, "Should the default cosmetics be enabled?"); cosmeticsPerProfile = StaticConfig.Bind<bool>("Cosmetics", "Per Profile Cosmetics", false, "Should the cosmetics be saved per-profile?"); Harmony val = new Harmony("me.swipez.melonloader.morecompany"); try { val.PatchAll(); } catch (Exception ex) { StaticLogger.LogError((object)("Failed to patch: " + ex)); } StaticLogger.LogInfo((object)"Loading MoreCompany..."); SteamFriends.OnGameLobbyJoinRequested += delegate(Lobby lobby, SteamId steamId) { newPlayerCount = ((Lobby)(ref lobby)).MaxMembers; }; SteamMatchmaking.OnLobbyEntered += delegate(Lobby lobby) { newPlayerCount = ((Lobby)(ref lobby)).MaxMembers; }; StaticLogger.LogInfo((object)"Loading SETTINGS..."); ReadSettingsFromFile(); dynamicCosmeticsPath = Paths.PluginPath + "/MoreCompanyCosmetics"; if (cosmeticsPerProfile.Value) { cosmeticSavePath = Application.persistentDataPath + "/morecompanycosmetics-" + Directory.GetParent(Paths.BepInExRootPath).Name + ".txt"; } else { cosmeticSavePath = Application.persistentDataPath + "/morecompanycosmetics.txt"; } cosmeticsPerProfile.SettingChanged += delegate { if (cosmeticsPerProfile.Value) { cosmeticSavePath = Application.persistentDataPath + "/MCCosmeticsSave-" + Directory.GetParent(Paths.BepInExRootPath).Name + ".mcs"; } else { cosmeticSavePath = Application.persistentDataPath + "/MCCosmeticsSave.mcs"; } }; StaticLogger.LogInfo((object)("Checking: " + dynamicCosmeticsPath)); if (!Directory.Exists(dynamicCosmeticsPath)) { StaticLogger.LogInfo((object)"Creating cosmetics directory"); Directory.CreateDirectory(dynamicCosmeticsPath); } StaticLogger.LogInfo((object)"Loading COSMETICS..."); ReadCosmeticsFromFile(); if (defaultCosmetics.Value) { StaticLogger.LogInfo((object)"Loading DEFAULT COSMETICS..."); AssetBundle val2 = BundleUtilities.LoadBundleFromInternalAssembly("morecompany.cosmetics", Assembly.GetExecutingAssembly()); CosmeticRegistry.LoadCosmeticsFromBundle(val2); val2.Unload(false); } StaticLogger.LogInfo((object)"Loading USER COSMETICS..."); RecursiveCosmeticLoad(Paths.PluginPath); AssetBundle bundle = BundleUtilities.LoadBundleFromInternalAssembly("morecompany.assets", Assembly.GetExecutingAssembly()); LoadAssets(bundle); StaticLogger.LogInfo((object)"Loaded MoreCompany FULLY"); } private void RecursiveCosmeticLoad(string directory) { string[] directories = Directory.GetDirectories(directory); foreach (string directory2 in directories) { RecursiveCosmeticLoad(directory2); } string[] files = Directory.GetFiles(directory); foreach (string text in files) { if (text.EndsWith(".cosmetics")) { AssetBundle val = AssetBundle.LoadFromFile(text); CosmeticRegistry.LoadCosmeticsFromBundle(val); val.Unload(false); } } } private void ReadCosmeticsFromFile() { if (File.Exists(cosmeticSavePath)) { string[] array = File.ReadAllLines(cosmeticSavePath); string[] array2 = array; foreach (string item in array2) { CosmeticRegistry.locallySelectedCosmetics.Add(item); } } } public static void WriteCosmeticsToFile() { string text = ""; foreach (string locallySelectedCosmetic in CosmeticRegistry.locallySelectedCosmetics) { text = text + locallySelectedCosmetic + "\n"; } File.WriteAllText(cosmeticSavePath, text); } public static void SaveSettingsToFile() { playerCount.Value = newPlayerCount; StaticConfig.Save(); } public static void ReadSettingsFromFile() { try { newPlayerCount = Mathf.Clamp(playerCount.Value, minPlayerCount, maxPlayerCount); } catch { newPlayerCount = defaultPlayerCount; playerCount.Value = newPlayerCount; StaticConfig.Save(); } } private static void LoadAssets(AssetBundle bundle) { if (Object.op_Implicit((Object)(object)bundle)) { mainLogo = bundle.LoadPersistentAsset<Texture2D>("assets/morecompanyassets/morecompanytransparentred.png"); quickMenuScrollParent = bundle.LoadPersistentAsset<GameObject>("assets/morecompanyassets/quickmenuoverride.prefab"); playerEntry = bundle.LoadPersistentAsset<GameObject>("assets/morecompanyassets/playerlistslot.prefab"); cosmeticGUIInstance = bundle.LoadPersistentAsset<GameObject>("assets/morecompanyassets/testoverlay.prefab"); cosmeticButton = bundle.LoadPersistentAsset<GameObject>("assets/morecompanyassets/cosmeticinstance.prefab"); crewCountUI = bundle.LoadPersistentAsset<GameObject>("assets/morecompanyassets/crewcountfield.prefab"); bundle.Unload(false); } } public static void ResizePlayerCache(Dictionary<uint, Dictionary<int, NetworkObject>> ScenePlacedObjects) { //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Unknown result type (might be due to invalid IL or missing references) //IL_0296: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Expected O, but got Unknown //IL_02da: Unknown result type (might be due to invalid IL or missing references) //IL_02e4: Expected O, but got Unknown StartOfRound instance = StartOfRound.Instance; if (instance.allPlayerObjects.Length != newPlayerCount) { StaticLogger.LogInfo((object)$"ResizePlayerCache: {newPlayerCount}"); uint num = 10000u; int num2 = instance.allPlayerObjects.Length; int num3 = newPlayerCount - num2; Array.Resize(ref instance.allPlayerObjects, newPlayerCount); Array.Resize(ref instance.allPlayerScripts, newPlayerCount); Array.Resize(ref instance.gameStats.allPlayerStats, newPlayerCount); Array.Resize(ref instance.playerSpawnPositions, newPlayerCount); StaticLogger.LogInfo((object)$"Resizing player cache from {num2} to {newPlayerCount} with difference of {num3}"); if (num3 > 0) { GameObject val = instance.allPlayerObjects[3]; for (int i = 0; i < num3; i++) { uint num4 = num + (uint)i; GameObject val2 = Object.Instantiate<GameObject>(val, val.transform.parent); NetworkObject component = val2.GetComponent<NetworkObject>(); ReflectionUtils.SetFieldValue(component, "GlobalObjectIdHash", num4); Scene scene = ((Component)component).gameObject.scene; int handle = ((Scene)(ref scene)).handle; uint num5 = num4; if (!ScenePlacedObjects.ContainsKey(num5)) { ScenePlacedObjects.Add(num5, new Dictionary<int, NetworkObject>()); } if (ScenePlacedObjects[num5].ContainsKey(handle)) { string arg = (((Object)(object)ScenePlacedObjects[num5][handle] != (Object)null) ? ((Object)ScenePlacedObjects[num5][handle]).name : "Null Entry"); throw new Exception(((Object)component).name + " tried to registered with ScenePlacedObjects which already contains " + string.Format("the same {0} value {1} for {2}!", "GlobalObjectIdHash", num5, arg)); } ScenePlacedObjects[num5].Add(handle, component); ((Object)val2).name = $"Player ({4 + i})"; PlayerControllerB componentInChildren = val2.GetComponentInChildren<PlayerControllerB>(); componentInChildren.playerClientId = (ulong)(4 + i); componentInChildren.playerUsername = $"Player #{componentInChildren.playerClientId}"; componentInChildren.isPlayerControlled = false; componentInChildren.isPlayerDead = false; componentInChildren.DropAllHeldItems(false, false); componentInChildren.TeleportPlayer(instance.notSpawnedPosition.position, false, 0f, false, true); UnlockableSuit.SwitchSuitForPlayer(componentInChildren, 0, false); instance.allPlayerObjects[num2 + i] = val2; instance.gameStats.allPlayerStats[num2 + i] = new PlayerStats(); instance.allPlayerScripts[num2 + i] = componentInChildren; instance.playerSpawnPositions[num2 + i] = instance.playerSpawnPositions[3]; StartOfRound.Instance.mapScreen.radarTargets.Add(new TransformAndName(((Component)componentInChildren).transform, componentInChildren.playerUsername, false)); } } } PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val3 in allPlayerScripts) { ((TMP_Text)val3.usernameBillboardText).text = val3.playerUsername; } } } [HarmonyPatch(typeof(PlayerControllerB), "Start")] public static class PlayerControllerBStartPatch { public static void Postfix(ref PlayerControllerB __instance) { Collider[] value = (Collider[])(object)new Collider[MainClass.newPlayerCount]; ReflectionUtils.SetFieldValue(__instance, "nearByPlayers", value); } } [HarmonyPatch(typeof(PlayerControllerB), "SendNewPlayerValuesServerRpc")] public static class SendNewPlayerValuesServerRpcPatch { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); bool flag = false; bool flag2 = false; foreach (CodeInstruction instruction in instructions) { if (!flag2) { if (!flag && ((object)instruction).ToString() == "callvirt virtual void System.Collections.Generic.List<ulong>::Add(ulong item)") { flag = true; } else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL") { flag2 = true; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); continue; } } list.Add(instruction); } if (!flag2) { MainClass.StaticLogger.LogWarning((object)"SendNewPlayerValuesServerRpcPatch failed to replace newPlayerCount"); } return list.AsEnumerable(); } } [HarmonyPatch(typeof(HUDManager), "SyncAllPlayerLevelsServerRpc", new Type[] { })] public static class SyncAllPlayerLevelsPatch { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); int num = 0; foreach (CodeInstruction instruction in instructions) { if (((object)instruction).ToString() == "ldc.i4.4 NULL") { num++; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); } else { list.Add(instruction); } } if (num != 2) { MainClass.StaticLogger.LogWarning((object)$"SyncAllPlayerLevelsPatch failed to replace newPlayerCount: {num}/2"); } return list.AsEnumerable(); } } [HarmonyPatch] public static class SyncShipUnlockablesPatch { [HarmonyPatch(typeof(StartOfRound), "SyncShipUnlockablesServerRpc")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> ServerTranspiler(IEnumerable<CodeInstruction> instructions) { //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); bool flag = false; int num = 0; foreach (CodeInstruction instruction in instructions) { if (num != 2) { if (!flag && ((object)instruction).ToString() == "callvirt bool Unity.Netcode.NetworkManager::get_IsHost()") { flag = true; } else if (((object)instruction).ToString().StartsWith("ldc.i4.4 NULL")) { num++; CodeInstruction val = new CodeInstruction(instruction); val.opcode = OpCodes.Ldsfld; val.operand = AccessTools.Field(typeof(MainClass), "newPlayerCount"); list.Add(val); continue; } } list.Add(instruction); } if (num != 2) { MainClass.StaticLogger.LogWarning((object)$"SyncShipUnlockablesServerRpc failed to replace newPlayerCount: {num}/2"); } return list.AsEnumerable(); } [HarmonyPatch(typeof(StartOfRound), "SyncShipUnlockablesClientRpc")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> ClientTranspiler(IEnumerable<CodeInstruction> instructions) { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); bool flag = false; bool flag2 = false; foreach (CodeInstruction instruction in instructions) { if (!flag2) { if (!flag && ((object)instruction).ToString() == "callvirt void UnityEngine.Renderer::set_sharedMaterial(UnityEngine.Material value)") { flag = true; } else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL") { flag2 = true; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); continue; } } list.Add(instruction); } if (!flag2) { MainClass.StaticLogger.LogWarning((object)"SyncShipUnlockablesClientRpc failed to replace newPlayerCount"); } return list.AsEnumerable(); } } [HarmonyPatch(typeof(NetworkSceneManager), "PopulateScenePlacedObjects")] public static class ScenePlacedObjectsInitPatch { public static void Postfix(ref Dictionary<uint, Dictionary<int, NetworkObject>> ___ScenePlacedObjects) { MainClass.ResizePlayerCache(___ScenePlacedObjects); } } [HarmonyPatch(typeof(GameNetworkManager), "LobbyDataIsJoinable")] public static class LobbyDataJoinablePatch { public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); bool flag = false; bool flag2 = false; foreach (CodeInstruction instruction in instructions) { if (!flag2) { if (!flag && ((object)instruction).ToString() == "call int Steamworks.Data.Lobby::get_MemberCount()") { flag = true; } else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL") { flag2 = true; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "maxPlayerCount")); list.Add(item); continue; } } list.Add(instruction); } if (!flag2) { MainClass.StaticLogger.LogWarning((object)"LobbyDataIsJoinable failed to replace maxPlayerCount"); } return list.AsEnumerable(); } } [HarmonyPatch(typeof(SteamMatchmaking), "CreateLobbyAsync")] public static class LobbyThingPatch { public static void Prefix(ref int maxMembers) { MainClass.ReadSettingsFromFile(); maxMembers = MainClass.newPlayerCount; } } [HarmonyPatch(typeof(GameNetworkManager), "ConnectionApproval")] public static class ConnectionApproval { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); bool flag = false; bool flag2 = false; foreach (CodeInstruction instruction in instructions) { if (!flag2) { if (!flag && ((object)instruction).ToString() == "ldfld int GameNetworkManager::connectedPlayers") { flag = true; } else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL") { flag2 = true; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); continue; } } list.Add(instruction); } if (!flag2) { MainClass.StaticLogger.LogWarning((object)"ConnectionApproval failed to replace newPlayerCount"); } return list.AsEnumerable(); } private static void Postfix(ref GameNetworkManager __instance, ref ConnectionApprovalRequest request, ref ConnectionApprovalResponse response) { if (response.Approved && __instance.disableSteam) { string @string = Encoding.ASCII.GetString(request.Payload); string[] array = @string.Split(","); if (!string.IsNullOrEmpty(@string) && (array.Length < 2 || array[1] != MainClass.newPlayerCount.ToString())) { response.Reason = $"Crew size mismatch! Their size: {MainClass.newPlayerCount}. Your size: {array[1]}"; response.Approved = false; } } } } [HarmonyPatch] public static class TogglePlayerObjectsPatch { [HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")] [HarmonyPrefix] private static void ConnectClientToPlayerObject() { PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (val.isPlayerControlled || val.isPlayerDead) { ((Component)val).gameObject.SetActive(true); } else { ((Component)val).gameObject.SetActive(false); } } } [HarmonyPatch(typeof(StartOfRound), "OnPlayerConnectedClientRpc")] [HarmonyPrefix] private static void OnPlayerConnectedClientRpc(StartOfRound __instance, ulong clientId, int connectedPlayers, ulong[] connectedPlayerIdsOrdered, int assignedPlayerObjectId, int serverMoneyAmount, int levelID, int profitQuota, int timeUntilDeadline, int quotaFulfilled, int randomSeed, bool isChallenge) { ((Component)__instance.allPlayerScripts[assignedPlayerObjectId]).gameObject.SetActive(true); } [HarmonyPatch(typeof(StartOfRound), "OnPlayerDC")] [HarmonyPostfix] private static void OnPlayerDC(StartOfRound __instance, int playerObjectNumber, ulong clientId) { ((Component)__instance.allPlayerScripts[playerObjectNumber]).gameObject.SetActive(false); } } public class MimicPatches { [HarmonyPatch(typeof(MaskedPlayerEnemy), "SetEnemyOutside")] public class MaskedPlayerEnemyOnEnablePatch { public static void Postfix(ref MaskedPlayerEnemy __instance) { //IL_00fd: 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 (!((Object)(object)__instance.mimickingPlayer != (Object)null) || !MainClass.cosmeticsSyncOther.Value || !MainClass.playerIdsAndCosmetics.ContainsKey((int)__instance.mimickingPlayer.playerClientId)) { return; } List<string> list = MainClass.playerIdsAndCosmetics[(int)__instance.mimickingPlayer.playerClientId]; Transform val = ((Component)__instance).transform.Find("ScavengerModel").Find("metarig"); CosmeticApplication component = ((Component)val).GetComponent<CosmeticApplication>(); if (Object.op_Implicit((Object)(object)component)) { component.ClearCosmetics(); Object.Destroy((Object)(object)component); } component = ((Component)val).gameObject.AddComponent<CosmeticApplication>(); foreach (string item in list) { component.ApplyCosmetic(item, startEnabled: true); } foreach (CosmeticInstance spawnedCosmetic in component.spawnedCosmetics) { Transform transform = ((Component)spawnedCosmetic).transform; transform.localScale *= 0.38f; } ((EnemyAI)__instance).skinnedMeshRenderers = ((Component)__instance).gameObject.GetComponentsInChildren<SkinnedMeshRenderer>(); ((EnemyAI)__instance).meshRenderers = ((Component)__instance).gameObject.GetComponentsInChildren<MeshRenderer>(); } } } public class ReflectionUtils { public static void InvokeMethod(object obj, string methodName, object[] parameters) { Type type = obj.GetType(); MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); method.Invoke(obj, parameters); } public static void InvokeMethod(object obj, Type forceType, string methodName, object[] parameters) { MethodInfo method = forceType.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); method.Invoke(obj, parameters); } public static void SetPropertyValue(object obj, string propertyName, object value) { Type type = obj.GetType(); PropertyInfo property = type.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); property.SetValue(obj, value); } public static T InvokeMethod<T>(object obj, string methodName, object[] parameters) { Type type = obj.GetType(); MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); return (T)method.Invoke(obj, parameters); } public static T GetFieldValue<T>(object obj, string fieldName) { Type type = obj.GetType(); FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); return (T)field.GetValue(obj); } public static void SetFieldValue(object obj, string fieldName, object value) { Type type = obj.GetType(); FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); field.SetValue(obj, value); } } [HarmonyPatch(typeof(ShipTeleporter), "Awake")] public static class ShipTeleporterAwakePatch { public static void Postfix(ref ShipTeleporter __instance) { int[] array = new int[MainClass.newPlayerCount]; for (int i = 0; i < MainClass.newPlayerCount; i++) { array[i] = -1; } ReflectionUtils.SetFieldValue(__instance, "playersBeingTeleported", array); } } [HarmonyPatch(typeof(PlayerControllerB), "SpectateNextPlayer")] public static class SpectatePatches { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); int num = 0; foreach (CodeInstruction instruction in instructions) { if (((object)instruction).ToString() == "ldc.i4.4 NULL") { num++; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); } else { list.Add(instruction); } } if (num != 2) { MainClass.StaticLogger.LogWarning((object)$"SpectateNextPlayer failed to replace newPlayerCount: {num}/2"); } return list.AsEnumerable(); } } [HarmonyPatch(typeof(SoundManager), "Start")] public static class SoundManagerStartPatch { public static void Postfix(ref SoundManager __instance) { Array.Resize(ref __instance.playerVoicePitchLerpSpeed, MainClass.newPlayerCount); Array.Resize(ref __instance.playerVoicePitchTargets, MainClass.newPlayerCount); Array.Resize(ref __instance.playerVoicePitches, MainClass.newPlayerCount); Array.Resize(ref __instance.playerVoiceVolumes, MainClass.newPlayerCount); Array.Resize(ref __instance.playerVoiceMixers, MainClass.newPlayerCount); AudioMixerGroup val = ((IEnumerable<AudioMixerGroup>)Resources.FindObjectsOfTypeAll<AudioMixerGroup>()).FirstOrDefault((Func<AudioMixerGroup, bool>)((AudioMixerGroup x) => ((Object)x).name.StartsWith("VoicePlayer"))); for (int i = 0; i < MainClass.newPlayerCount; i++) { __instance.playerVoicePitchLerpSpeed[i] = 3f; __instance.playerVoicePitchTargets[i] = 1f; __instance.playerVoicePitches[i] = 1f; __instance.playerVoiceVolumes[i] = 0.5f; if (!Object.op_Implicit((Object)(object)__instance.playerVoiceMixers[i])) { AudioMixerGroup val2 = Object.Instantiate<AudioMixerGroup>(val); ((Object)val2).name = $"VoicePlayer{i}"; __instance.playerVoiceMixers[i] = val2; } } } } [HarmonyPatch(typeof(StartOfRound), "GetPlayerSpawnPosition")] public static class SpawnPositionClampPatch { public static void Prefix(ref StartOfRound __instance, ref int playerNum, bool simpleTeleport = false) { if (!Object.op_Implicit((Object)(object)__instance.playerSpawnPositions[playerNum])) { playerNum = __instance.playerSpawnPositions.Length - 1; } } } [HarmonyPatch(typeof(StartOfRound), "OnClientConnect")] public static class OnClientConnectedPatch { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(); bool flag = false; bool flag2 = false; foreach (CodeInstruction instruction in instructions) { if (!flag2) { if (!flag && ((object)instruction).ToString() == "callvirt virtual bool System.Collections.Generic.List<int>::Contains(int item)") { flag = true; } else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL") { flag2 = true; CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount")); list.Add(item); continue; } } list.Add(instruction); } if (!flag2) { MainClass.StaticLogger.LogWarning((object)"OnClientConnect failed to replace newPlayerCount"); } return list.AsEnumerable(); } } [HarmonyPatch(typeof(StartOfRound), "OnPlayerDC")] public static class OnPlayerDCPatch { public static void Postfix(int playerObjectNumber, ulong clientId) { if (MainClass.playerIdsAndCosmetics.ContainsKey(playerObjectNumber)) { MainClass.playerIdsAndCosmetics.Remove(playerObjectNumber); } } } [HarmonyPatch(/*Could not decode attribute arguments.*/)] public static class LoadLobbyListAndFilterPatch { private static void Postfix() { LobbySlot[] array = Object.FindObjectsOfType<LobbySlot>(); LobbySlot[] array2 = array; foreach (LobbySlot val in array2) { ((TMP_Text)val.playerCount).text = $"{((Lobby)(ref val.thisLobby)).MemberCount} / {((Lobby)(ref val.thisLobby)).MaxMembers}"; } } } [HarmonyPatch(typeof(GameNetworkManager), "Awake")] public static class GameNetworkAwakePatch { public static int originalVersion; public static void Postfix(GameNetworkManager __instance) { originalVersion = __instance.gameVersionNum; if (!Chainloader.PluginInfos.ContainsKey("LC_API")) { __instance.gameVersionNum = 9950 + originalVersion; } } } [HarmonyPatch(typeof(MenuManager), "Awake")] public static class MenuManagerVersionDisplayPatch { public static void Postfix(MenuManager __instance) { if ((Object)(object)GameNetworkManager.Instance != (Object)null && (Object)(object)__instance.versionNumberText != (Object)null) { ((TMP_Text)__instance.versionNumberText).text = $"v{GameNetworkAwakePatch.originalVersion} (MC)"; } } } } namespace MoreCompany.Utils { public class BundleUtilities { public static byte[] GetResourceBytes(string filename, Assembly assembly) { string[] manifestResourceNames = assembly.GetManifestResourceNames(); foreach (string text in manifestResourceNames) { if (!text.Contains(filename)) { continue; } using Stream stream = assembly.GetManifestResourceStream(text); if (stream == null) { return null; } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); return array; } return null; } public static AssetBundle LoadBundleFromInternalAssembly(string filename, Assembly assembly) { return AssetBundle.LoadFromMemory(GetResourceBytes(filename, assembly)); } } public static class AssetBundleExtension { public static T LoadPersistentAsset<T>(this AssetBundle bundle, string name) where T : Object { Object val = bundle.LoadAsset(name); if (val != (Object)null) { val.hideFlags = (HideFlags)32; return (T)(object)val; } return default(T); } } } namespace MoreCompany.Cosmetics { public class CosmeticApplication : MonoBehaviour { public Transform head; public Transform hip; public Transform lowerArmRight; public Transform shinLeft; public Transform shinRight; public Transform chest; public List<CosmeticInstance> spawnedCosmetics = new List<CosmeticInstance>(); public void Awake() { head = ((Component)this).transform.Find("spine").Find("spine.001").Find("spine.002") .Find("spine.003") .Find("spine.004"); chest = ((Component)this).transform.Find("spine").Find("spine.001").Find("spine.002") .Find("spine.003"); lowerArmRight = ((Component)this).transform.Find("spine").Find("spine.001").Find("spine.002") .Find("spine.003") .Find("shoulder.R") .Find("arm.R_upper") .Find("arm.R_lower"); hip = ((Component)this).transform.Find("spine"); shinLeft = ((Component)this).transform.Find("spine").Find("thigh.L").Find("shin.L"); shinRight = ((Component)this).transform.Find("spine").Find("thigh.R").Find("shin.R"); RefreshAllCosmeticPositions(); } private void OnDisable() { foreach (CosmeticInstance spawnedCosmetic in spawnedCosmetics) { ((Component)spawnedCosmetic).gameObject.SetActive(false); } } private void OnEnable() { foreach (CosmeticInstance spawnedCosmetic in spawnedCosmetics) { ((Component)spawnedCosmetic).gameObject.SetActive(true); } } public void ClearCosmetics() { foreach (CosmeticInstance spawnedCosmetic in spawnedCosmetics) { Object.Destroy((Object)(object)((Component)spawnedCosmetic).gameObject); } spawnedCosmetics.Clear(); } public void ApplyCosmetic(string cosmeticId, bool startEnabled) { if (CosmeticRegistry.cosmeticInstances.ContainsKey(cosmeticId)) { CosmeticInstance cosmeticInstance = CosmeticRegistry.cosmeticInstances[cosmeticId]; GameObject val = Object.Instantiate<GameObject>(((Component)cosmeticInstance).gameObject); val.SetActive(startEnabled); CosmeticInstance component = val.GetComponent<CosmeticInstance>(); spawnedCosmetics.Add(component); if (startEnabled) { ParentCosmetic(component); } } } public void RefreshAllCosmeticPositions() { foreach (CosmeticInstance spawnedCosmetic in spawnedCosmetics) { ParentCosmetic(spawnedCosmetic); } } private void ParentCosmetic(CosmeticInstance cosmeticInstance) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) Transform val = null; switch (cosmeticInstance.cosmeticType) { case CosmeticType.HAT: val = head; break; case CosmeticType.R_LOWER_ARM: val = lowerArmRight; break; case CosmeticType.HIP: val = hip; break; case CosmeticType.L_SHIN: val = shinLeft; break; case CosmeticType.R_SHIN: val = shinRight; break; case CosmeticType.CHEST: val = chest; break; } ((Component)cosmeticInstance).transform.position = val.position; ((Component)cosmeticInstance).transform.rotation = val.rotation; ((Component)cosmeticInstance).transform.parent = val; } } public class CosmeticInstance : MonoBehaviour { public CosmeticType cosmeticType; public string cosmeticId; public Texture2D icon; } public class CosmeticGeneric { public virtual string gameObjectPath { get; } public virtual string cosmeticId { get; } public virtual string textureIconPath { get; } public CosmeticType cosmeticType { get; } public void LoadFromBundle(AssetBundle bundle) { GameObject val = bundle.LoadPersistentAsset<GameObject>(gameObjectPath); Texture2D icon = bundle.LoadPersistentAsset<Texture2D>(textureIconPath); CosmeticInstance cosmeticInstance = val.AddComponent<CosmeticInstance>(); cosmeticInstance.cosmeticId = cosmeticId; cosmeticInstance.icon = icon; cosmeticInstance.cosmeticType = cosmeticType; MainClass.StaticLogger.LogInfo((object)("Loaded cosmetic: " + cosmeticId + " from bundle: " + ((Object)bundle).name)); CosmeticRegistry.cosmeticInstances.Add(cosmeticId, cosmeticInstance); } } public enum CosmeticType { HAT, WRIST, CHEST, R_LOWER_ARM, HIP, L_SHIN, R_SHIN } public class CosmeticRegistry { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static UnityAction <>9__9_0; public static UnityAction <>9__9_1; internal void <SpawnCosmeticGUI>b__9_0() { MainClass.cosmeticsSyncOther.Value = true; MainClass.StaticConfig.Save(); } internal void <SpawnCosmeticGUI>b__9_1() { MainClass.cosmeticsSyncOther.Value = false; MainClass.StaticConfig.Save(); } } public static Dictionary<string, CosmeticInstance> cosmeticInstances = new Dictionary<string, CosmeticInstance>(); public static GameObject cosmeticGUI; private static GameObject displayGuy; private static CosmeticApplication cosmeticApplication; public static List<string> locallySelectedCosmetics = new List<string>(); public const float COSMETIC_PLAYER_SCALE_MULT = 0.38f; public static void LoadCosmeticsFromBundle(AssetBundle bundle) { string[] allAssetNames = bundle.GetAllAssetNames(); foreach (string text in allAssetNames) { if (!text.EndsWith(".prefab")) { continue; } GameObject val = bundle.LoadPersistentAsset<GameObject>(text); CosmeticInstance component = val.GetComponent<CosmeticInstance>(); if (!((Object)(object)component == (Object)null)) { MainClass.StaticLogger.LogInfo((object)("Loaded cosmetic: " + component.cosmeticId + " from bundle")); if (cosmeticInstances.ContainsKey(component.cosmeticId)) { MainClass.StaticLogger.LogError((object)("Duplicate cosmetic id: " + component.cosmeticId)); } else { cosmeticInstances.Add(component.cosmeticId, component); } } } } public static void LoadCosmeticsFromAssembly(Assembly assembly, AssetBundle bundle) { Type[] types = assembly.GetTypes(); foreach (Type type in types) { if (type.IsSubclassOf(typeof(CosmeticGeneric))) { CosmeticGeneric cosmeticGeneric = (CosmeticGeneric)type.GetConstructor(new Type[0]).Invoke(new object[0]); cosmeticGeneric.LoadFromBundle(bundle); } } } public static void UpdateVisibilityCheckbox(GameObject enableCosmeticsButton, GameObject disableCosmeticsButton) { if (MainClass.cosmeticsSyncOther.Value) { enableCosmeticsButton.SetActive(false); disableCosmeticsButton.SetActive(true); } else { enableCosmeticsButton.SetActive(true); disableCosmeticsButton.SetActive(false); } } public static void SpawnCosmeticGUI() { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Expected O, but got Unknown //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Expected O, but got Unknown cosmeticGUI = Object.Instantiate<GameObject>(MainClass.cosmeticGUIInstance); ((Component)cosmeticGUI.transform.Find("Canvas").Find("GlobalScale")).transform.localScale = new Vector3(2f, 2f, 2f); displayGuy = ((Component)cosmeticGUI.transform.Find("Canvas").Find("GlobalScale").Find("CosmeticsScreen") .Find("ObjectHolder") .Find("ScavengerModel") .Find("metarig")).gameObject; cosmeticApplication = displayGuy.AddComponent<CosmeticApplication>(); GameObject gameObject = ((Component)cosmeticGUI.transform.Find("Canvas").Find("GlobalScale").Find("CosmeticsScreen") .Find("EnableButton")).gameObject; GameObject gameObject2 = ((Component)cosmeticGUI.transform.Find("Canvas").Find("GlobalScale").Find("CosmeticsScreen") .Find("DisableButton")).gameObject; ButtonClickedEvent onClick = gameObject.GetComponent<Button>().onClick; object obj = <>c.<>9__9_0; if (obj == null) { UnityAction val = delegate { MainClass.cosmeticsSyncOther.Value = true; MainClass.StaticConfig.Save(); }; <>c.<>9__9_0 = val; obj = (object)val; } ((UnityEvent)onClick).AddListener((UnityAction)obj); ButtonClickedEvent onClick2 = gameObject2.GetComponent<Button>().onClick; object obj2 = <>c.<>9__9_1; if (obj2 == null) { UnityAction val2 = delegate { MainClass.cosmeticsSyncOther.Value = false; MainClass.StaticConfig.Save(); }; <>c.<>9__9_1 = val2; obj2 = (object)val2; } ((UnityEvent)onClick2).AddListener((UnityAction)obj2); UpdateVisibilityCheckbox(gameObject, gameObject2); PopulateCosmetics(); UpdateCosmeticsOnDisplayGuy(startEnabled: false); } public static void PopulateCosmetics() { //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Expected O, but got Unknown GameObject gameObject = ((Component)cosmeticGUI.transform.Find("Canvas").Find("GlobalScale").Find("CosmeticsScreen") .Find("CosmeticsHolder") .Find("Content")).gameObject; List<Transform> list = new List<Transform>(); for (int i = 0; i < gameObject.transform.childCount; i++) { list.Add(gameObject.transform.GetChild(i)); } foreach (Transform item in list) { Object.Destroy((Object)(object)((Component)item).gameObject); } foreach (KeyValuePair<string, CosmeticInstance> cosmeticInstance in cosmeticInstances) { GameObject val = Object.Instantiate<GameObject>(MainClass.cosmeticButton, gameObject.transform); val.transform.localScale = Vector3.one; GameObject disabledOverlay = ((Component)val.transform.Find("Deselected")).gameObject; disabledOverlay.SetActive(true); GameObject enabledOverlay = ((Component)val.transform.Find("Selected")).gameObject; enabledOverlay.SetActive(true); if (IsEquipped(cosmeticInstance.Value.cosmeticId)) { enabledOverlay.SetActive(true); disabledOverlay.SetActive(false); } else { enabledOverlay.SetActive(false); disabledOverlay.SetActive(true); } RawImage component = ((Component)val.transform.Find("Icon")).GetComponent<RawImage>(); component.texture = (Texture)(object)cosmeticInstance.Value.icon; Button component2 = val.GetComponent<Button>(); ((UnityEvent)component2.onClick).AddListener((UnityAction)delegate { ToggleCosmetic(cosmeticInstance.Value.cosmeticId); if (IsEquipped(cosmeticInstance.Value.cosmeticId)) { enabledOverlay.SetActive(true); disabledOverlay.SetActive(false); } else { enabledOverlay.SetActive(false); disabledOverlay.SetActive(true); } MainClass.WriteCosmeticsToFile(); UpdateCosmeticsOnDisplayGuy(startEnabled: true); }); } } private static Color HexToColor(string hex) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) Color result = default(Color); ColorUtility.TryParseHtmlString(hex, ref result); return result; } public static void UpdateCosmeticsOnDisplayGuy(bool startEnabled) { cosmeticApplication.ClearCosmetics(); foreach (string locallySelectedCosmetic in locallySelectedCosmetics) { cosmeticApplication.ApplyCosmetic(locallySelectedCosmetic, startEnabled); } foreach (CosmeticInstance spawnedCosmetic in cosmeticApplication.spawnedCosmetics) { RecursiveLayerChange(((Component)spawnedCosmetic).transform, 5); } } private static void RecursiveLayerChange(Transform transform, int layer) { ((Component)transform).gameObject.layer = layer; for (int i = 0; i < transform.childCount; i++) { RecursiveLayerChange(transform.GetChild(i), layer); } } public static bool IsEquipped(string cosmeticId) { return locallySelectedCosmetics.Contains(cosmeticId); } public static void ToggleCosmetic(string cosmeticId) { if (locallySelectedCosmetics.Contains(cosmeticId)) { locallySelectedCosmetics.Remove(cosmeticId); } else { locallySelectedCosmetics.Add(cosmeticId); } } } } namespace MoreCompany.Behaviors { public class SpinDragger : MonoBehaviour, IPointerDownHandler, IEventSystemHandler, IPointerUpHandler { public float speed = 1f; private Vector2 lastMousePosition; private bool dragging = false; private Vector3 rotationalVelocity = Vector3.zero; public float dragSpeed = 1f; public float airDrag = 0.99f; public GameObject target; private void Update() { //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: 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_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) if (dragging) { Vector3 val = Vector2.op_Implicit(((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).ReadValue() - lastMousePosition); rotationalVelocity += new Vector3(0f, 0f - val.x, 0f) * dragSpeed; lastMousePosition = ((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).ReadValue(); } rotationalVelocity *= airDrag; target.transform.Rotate(rotationalVelocity * Time.deltaTime * speed, (Space)0); } public void OnPointerDown(PointerEventData eventData) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) lastMousePosition = ((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).ReadValue(); dragging = true; } public void OnPointerUp(PointerEventData eventData) { dragging = false; } } }
BepInEx/plugins/Ozone-Runtime_Netcode_Patcher/NicholaScott.BepInEx.RuntimeNetcodeRPCValidator.dll
Decompiled 8 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Logging; using HarmonyLib; using Unity.Collections; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: AssemblyCompany("NicholaScott.BepInEx.RuntimeNetcodeRPCValidator")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.2.5.0")] [assembly: AssemblyInformationalVersion("0.2.5+6e2f89b3631ae55d2f51a00ccfd3f20fec9d2372")] [assembly: AssemblyProduct("RuntimeNetcodeRPCValidator")] [assembly: AssemblyTitle("NicholaScott.BepInEx.RuntimeNetcodeRPCValidator")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] namespace RuntimeNetcodeRPCValidator { public class AlreadyRegisteredException : Exception { public AlreadyRegisteredException(string PluginGUID) : base("Can't register plugin " + PluginGUID + " until the other instance of NetcodeValidator is Disposed of!") { } } public class InvalidPluginGuidException : Exception { public InvalidPluginGuidException(string pluginGUID) : base("Can't patch plugin " + pluginGUID + " because it doesn't exist!") { } } public class NotNetworkBehaviourException : Exception { public NotNetworkBehaviourException(Type type) : base("Netcode Runtime RPC Validator tried to NetcodeValidator.Patch type " + type.Name + " that doesn't inherit from NetworkBehaviour!") { } } public class MustCallFromDeclaredTypeException : Exception { public MustCallFromDeclaredTypeException() : base("Netcode Runtime RPC Validator tried to run NetcodeValidator.PatchAll from a delegate! You must call PatchAll from a declared type.") { } } public static class FastBufferExtensions { private const BindingFlags BindingAll = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; private static void WriteSystemSerializable(this FastBufferWriter fastBufferWriter, object serializable) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) BinaryFormatter binaryFormatter = new BinaryFormatter(); using MemoryStream memoryStream = new MemoryStream(); binaryFormatter.Serialize(memoryStream, serializable); byte[] array = memoryStream.ToArray(); int num = array.Length; ((FastBufferWriter)(ref fastBufferWriter)).WriteValueSafe<int>(ref num, default(ForPrimitives)); ((FastBufferWriter)(ref fastBufferWriter)).WriteBytes(array, -1, 0); } private static void ReadSystemSerializable(this FastBufferReader fastBufferReader, out object serializable) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) int num = default(int); ((FastBufferReader)(ref fastBufferReader)).ReadValueSafe<int>(ref num, default(ForPrimitives)); byte[] buffer = new byte[num]; ((FastBufferReader)(ref fastBufferReader)).ReadBytes(ref buffer, num, 0); using MemoryStream memoryStream = new MemoryStream(buffer); memoryStream.Seek(0L, SeekOrigin.Begin); BinaryFormatter binaryFormatter = new BinaryFormatter(); serializable = binaryFormatter.Deserialize(memoryStream); } private static void WriteNetcodeSerializable(this FastBufferWriter fastBufferWriter, object networkSerializable) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: 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_003f: 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) FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(1024, (Allocator)2, -1); try { BufferSerializer<BufferSerializerWriter> val2 = default(BufferSerializer<BufferSerializerWriter>); val2..ctor(new BufferSerializerWriter(val)); object obj = ((networkSerializable is INetworkSerializable) ? networkSerializable : null); if (obj != null) { ((INetworkSerializable)obj).NetworkSerialize<BufferSerializerWriter>(val2); } byte[] array = ((FastBufferWriter)(ref val)).ToArray(); int num = array.Length; ((FastBufferWriter)(ref fastBufferWriter)).WriteValueSafe<int>(ref num, default(ForPrimitives)); ((FastBufferWriter)(ref fastBufferWriter)).WriteBytes(array, -1, 0); } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } private static void ReadNetcodeSerializable(this FastBufferReader fastBufferReader, Type type, out object serializable) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) int num = default(int); ((FastBufferReader)(ref fastBufferReader)).ReadValueSafe<int>(ref num, default(ForPrimitives)); byte[] array = new byte[num]; ((FastBufferReader)(ref fastBufferReader)).ReadBytes(ref array, num, 0); FastBufferReader val = default(FastBufferReader); ((FastBufferReader)(ref val))..ctor(array, (Allocator)2, -1, 0); try { BufferSerializer<BufferSerializerReader> val2 = default(BufferSerializer<BufferSerializerReader>); val2..ctor(new BufferSerializerReader(val)); serializable = Activator.CreateInstance(type); object obj = serializable; object obj2 = ((obj is INetworkSerializable) ? obj : null); if (obj2 != null) { ((INetworkSerializable)obj2).NetworkSerialize<BufferSerializerReader>(val2); } } finally { ((IDisposable)(FastBufferReader)(ref val)).Dispose(); } } public static void WriteMethodInfoAndParameters(this FastBufferWriter fastBufferWriter, MethodBase methodInfo, object[] args) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) ((FastBufferWriter)(ref fastBufferWriter)).WriteValueSafe(methodInfo.Name, false); ParameterInfo[] parameters = methodInfo.GetParameters(); int num = parameters.Length; ((FastBufferWriter)(ref fastBufferWriter)).WriteValueSafe<int>(ref num, default(ForPrimitives)); for (int i = 0; i < parameters.Length; i++) { ParameterInfo parameterInfo = parameters[i]; object obj = args[i]; bool flag = obj == null || parameterInfo.ParameterType == typeof(ServerRpcParams) || parameterInfo.ParameterType == typeof(ClientRpcParams); ((FastBufferWriter)(ref fastBufferWriter)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { continue; } if (parameterInfo.ParameterType.GetInterfaces().Contains(typeof(INetworkSerializable))) { fastBufferWriter.WriteNetcodeSerializable(obj); continue; } if (parameterInfo.ParameterType.IsSerializable) { fastBufferWriter.WriteSystemSerializable(obj); continue; } throw new SerializationException(TextHandler.ObjectNotSerializable(parameterInfo)); } } public static MethodInfo ReadMethodInfoAndParameters(this FastBufferReader fastBufferReader, Type methodDeclaringType, ref object[] args) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0016: 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_007d: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) string name = default(string); ((FastBufferReader)(ref fastBufferReader)).ReadValueSafe(ref name, false); int num = default(int); ((FastBufferReader)(ref fastBufferReader)).ReadValueSafe<int>(ref num, default(ForPrimitives)); MethodInfo method = methodDeclaringType.GetMethod(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (num != method?.GetParameters().Length) { throw new Exception(TextHandler.InconsistentParameterCount(method, num)); } bool flag = default(bool); for (int i = 0; i < num; i++) { ((FastBufferReader)(ref fastBufferReader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { continue; } ParameterInfo parameterInfo = method.GetParameters()[i]; object serializable; if (parameterInfo.ParameterType.GetInterfaces().Contains(typeof(INetworkSerializable))) { fastBufferReader.ReadNetcodeSerializable(parameterInfo.ParameterType, out serializable); } else { if (!parameterInfo.ParameterType.IsSerializable) { throw new SerializationException(TextHandler.ObjectNotSerializable(parameterInfo)); } fastBufferReader.ReadSystemSerializable(out serializable); } args[i] = serializable; } return method; } } public sealed class NetcodeValidator : IDisposable { private static readonly List<string> AlreadyRegistered = new List<string>(); internal const string TypeCustomMessageHandlerPrefix = "Net"; private static List<(NetcodeValidator validator, Type custom, Type native)> BoundNetworkObjects { get; } = new List<(NetcodeValidator, Type, Type)>(); private List<string> CustomMessageHandlers { get; } private Harmony Patcher { get; } public string PluginGuid { get; } internal static event Action<NetcodeValidator, Type> AddedNewBoundBehaviour; private event Action<string> AddedNewCustomMessageHandler; public NetcodeValidator(string pluginGuid) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown if (!Chainloader.PluginInfos.TryGetValue(pluginGuid, out var _)) { throw new InvalidPluginGuidException(pluginGuid); } if (AlreadyRegistered.Contains(pluginGuid)) { throw new AlreadyRegisteredException(pluginGuid); } AlreadyRegistered.Add(pluginGuid); PluginGuid = pluginGuid; CustomMessageHandlers = new List<string>(); Patcher = new Harmony(pluginGuid + "NicholaScott.BepInEx.RuntimeNetcodeRPCValidator"); Plugin.NetworkManagerInitialized += NetworkManagerInitialized; Plugin.NetworkManagerShutdown += NetworkManagerShutdown; } internal static void TryLoadRelatedComponentsInOrder(NetworkBehaviour __instance, MethodBase __originalMethod) { foreach (var item in from obj in BoundNetworkObjects where obj.native == __originalMethod.DeclaringType select obj into it orderby it.validator.PluginGuid select it) { Plugin.Logger.LogInfo((object)TextHandler.CustomComponentAddedToExistingObject(item, __originalMethod)); Component obj2 = ((Component)__instance).gameObject.AddComponent(item.custom); ((NetworkBehaviour)(object)((obj2 is NetworkBehaviour) ? obj2 : null)).SyncWithNetworkObject(); } } private bool Patch(MethodInfo rpcMethod, out bool isServerRpc, out bool isClientRpc) { //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Expected O, but got Unknown isServerRpc = ((MemberInfo)rpcMethod).GetCustomAttributes<ServerRpcAttribute>().Any(); isClientRpc = ((MemberInfo)rpcMethod).GetCustomAttributes<ClientRpcAttribute>().Any(); bool flag = rpcMethod.Name.EndsWith("ServerRpc"); bool flag2 = rpcMethod.Name.EndsWith("ClientRpc"); if (!isClientRpc && !isServerRpc && !flag2 && !flag) { return false; } if ((!isServerRpc && flag) || (!isClientRpc && flag2)) { Plugin.Logger.LogError((object)TextHandler.MethodLacksRpcAttribute(rpcMethod)); return false; } if ((isServerRpc && !flag) || (isClientRpc && !flag2)) { Plugin.Logger.LogError((object)TextHandler.MethodLacksSuffix(rpcMethod)); return false; } Patcher.Patch((MethodBase)rpcMethod, new HarmonyMethod(typeof(NetworkBehaviourExtensions), "MethodPatch", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); return true; } public void BindToPreExistingObjectByBehaviour<TCustomBehaviour, TNativeBehaviour>() where TCustomBehaviour : NetworkBehaviour where TNativeBehaviour : NetworkBehaviour { if (Object.op_Implicit((Object)(object)NetworkManager.Singleton) && (NetworkManager.Singleton.IsListening || NetworkManager.Singleton.IsConnectedClient)) { Plugin.Logger.LogError((object)TextHandler.PluginTriedToBindToPreExistingObjectTooLate(this, typeof(TCustomBehaviour), typeof(TNativeBehaviour))); } else { OnAddedNewBoundBehaviour(this, typeof(TCustomBehaviour), typeof(TNativeBehaviour)); } } public void Patch(Type netBehaviourTyped) { if (netBehaviourTyped.BaseType != typeof(NetworkBehaviour)) { throw new NotNetworkBehaviourException(netBehaviourTyped); } OnAddedNewCustomMessageHandler("Net." + netBehaviourTyped.Name); int num = 0; int num2 = 0; MethodInfo[] methods = netBehaviourTyped.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (MethodInfo rpcMethod in methods) { if (Patch(rpcMethod, out var isServerRpc, out var isClientRpc)) { num += (isServerRpc ? 1 : 0); num2 += (isClientRpc ? 1 : 0); } } Plugin.Logger.LogInfo((object)TextHandler.SuccessfullyPatchedType(netBehaviourTyped, num, num2)); } public void Patch(Assembly assembly) { Type[] types = assembly.GetTypes(); foreach (Type type in types) { if (type.BaseType == typeof(NetworkBehaviour)) { Patch(type); } } } public void PatchAll() { Assembly assembly = new StackTrace().GetFrame(1).GetMethod().ReflectedType?.Assembly; if (assembly == null) { throw new MustCallFromDeclaredTypeException(); } Patch(assembly); } public void UnpatchSelf() { Plugin.Logger.LogInfo((object)TextHandler.PluginUnpatchedAllRPCs(this)); Patcher.UnpatchSelf(); } private static void RegisterMessageHandlerWithNetworkManager(string handler) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler(handler, new HandleNamedMessageDelegate(NetworkBehaviourExtensions.ReceiveNetworkMessage)); } private void NetworkManagerInitialized() { AddedNewCustomMessageHandler += RegisterMessageHandlerWithNetworkManager; foreach (string customMessageHandler in CustomMessageHandlers) { RegisterMessageHandlerWithNetworkManager(customMessageHandler); } } private void NetworkManagerShutdown() { AddedNewCustomMessageHandler -= RegisterMessageHandlerWithNetworkManager; foreach (string customMessageHandler in CustomMessageHandlers) { NetworkManager.Singleton.CustomMessagingManager.UnregisterNamedMessageHandler(customMessageHandler); } } public void Dispose() { Plugin.NetworkManagerInitialized -= NetworkManagerInitialized; Plugin.NetworkManagerShutdown -= NetworkManagerShutdown; AlreadyRegistered.Remove(PluginGuid); if (Object.op_Implicit((Object)(object)NetworkManager.Singleton)) { NetworkManagerShutdown(); } if (Patcher.GetPatchedMethods().Any()) { UnpatchSelf(); } } private void OnAddedNewCustomMessageHandler(string obj) { CustomMessageHandlers.Add(obj); this.AddedNewCustomMessageHandler?.Invoke(obj); } private static void OnAddedNewBoundBehaviour(NetcodeValidator validator, Type custom, Type native) { BoundNetworkObjects.Add((validator, custom, native)); NetcodeValidator.AddedNewBoundBehaviour?.Invoke(validator, native); } } public static class NetworkBehaviourExtensions { public enum RpcState { FromUser, FromNetworking } private static RpcState RpcSource; public static ClientRpcParams CreateSendToFromReceived(this ServerRpcParams senderId) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) ClientRpcParams result = default(ClientRpcParams); result.Send = new ClientRpcSendParams { TargetClientIds = new ulong[1] { senderId.Receive.SenderClientId } }; return result; } public static void SyncWithNetworkObject(this NetworkBehaviour networkBehaviour) { if (!networkBehaviour.NetworkObject.ChildNetworkBehaviours.Contains(networkBehaviour)) { networkBehaviour.NetworkObject.ChildNetworkBehaviours.Add(networkBehaviour); } networkBehaviour.UpdateNetworkProperties(); } private static bool ValidateRPCMethod(NetworkBehaviour networkBehaviour, MethodBase method, RpcState state, out RpcAttribute rpcAttribute) { bool flag = ((MemberInfo)method).GetCustomAttributes<ServerRpcAttribute>().Any(); bool flag2 = ((MemberInfo)method).GetCustomAttributes<ClientRpcAttribute>().Any(); bool num = flag && ((MemberInfo)method).GetCustomAttribute<ServerRpcAttribute>().RequireOwnership; rpcAttribute = (RpcAttribute)(flag ? ((object)((MemberInfo)method).GetCustomAttribute<ServerRpcAttribute>()) : ((object)((MemberInfo)method).GetCustomAttribute<ClientRpcAttribute>())); if (num && networkBehaviour.OwnerClientId != NetworkManager.Singleton.LocalClientId) { Plugin.Logger.LogError((object)TextHandler.NotOwnerOfNetworkObject((state == RpcState.FromUser) ? "We" : "Client", method, networkBehaviour.NetworkObject)); return false; } if (state == RpcState.FromUser && flag2 && !NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { Plugin.Logger.LogError((object)TextHandler.CantRunClientRpcFromClient(method)); return false; } if (state == RpcState.FromUser && !flag && !flag2) { Plugin.Logger.LogError((object)TextHandler.MethodPatchedButLacksAttributes(method)); return false; } if (state == RpcState.FromNetworking && !flag && !flag2) { Plugin.Logger.LogError((object)TextHandler.MethodPatchedAndNetworkCalledButLacksAttributes(method)); return false; } if (state == RpcState.FromNetworking && flag && !networkBehaviour.IsServer && !networkBehaviour.IsHost) { Plugin.Logger.LogError((object)TextHandler.CantRunServerRpcAsClient(method)); return false; } return true; } private static bool MethodPatchInternal(NetworkBehaviour networkBehaviour, MethodBase method, object[] args) { //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)NetworkManager.Singleton) || (!NetworkManager.Singleton.IsListening && !NetworkManager.Singleton.IsConnectedClient)) { Plugin.Logger.LogError((object)TextHandler.NoNetworkManagerPresentToSendRpc(networkBehaviour)); return false; } RpcState rpcSource = RpcSource; RpcSource = RpcState.FromUser; if (rpcSource == RpcState.FromNetworking) { return true; } if (!ValidateRPCMethod(networkBehaviour, method, rpcSource, out var rpcAttribute)) { return false; } FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor((method.GetParameters().Length + 1) * 128, (Allocator)2, -1); ulong networkObjectId = networkBehaviour.NetworkObjectId; ((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref networkObjectId, default(ForPrimitives)); ushort networkBehaviourId = networkBehaviour.NetworkBehaviourId; ((FastBufferWriter)(ref val)).WriteValueSafe<ushort>(ref networkBehaviourId, default(ForPrimitives)); val.WriteMethodInfoAndParameters(method, args); string text = new StringBuilder("Net").Append(".").Append(method.DeclaringType.Name).ToString(); NetworkDelivery val2 = (NetworkDelivery)(((int)rpcAttribute.Delivery == 0) ? 2 : 0); if (rpcAttribute is ServerRpcAttribute) { NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage(text, 0uL, val, val2); } else { ParameterInfo[] parameters = method.GetParameters(); if (parameters.Length != 0 && parameters[^1].ParameterType == typeof(ClientRpcParams)) { NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage(text, ((ClientRpcParams)args[^1]).Send.TargetClientIds, val, val2); } else { NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll(text, val, val2); } } return false; } internal static void ReceiveNetworkMessage(ulong sender, FastBufferReader reader) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0019: 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_0100: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) ulong key = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref key, default(ForPrimitives)); ushort num = default(ushort); ((FastBufferReader)(ref reader)).ReadValueSafe<ushort>(ref num, default(ForPrimitives)); int position = ((FastBufferReader)(ref reader)).Position; string text = default(string); ((FastBufferReader)(ref reader)).ReadValueSafe(ref text, false); ((FastBufferReader)(ref reader)).Seek(position); if (!NetworkManager.Singleton.SpawnManager.SpawnedObjects.TryGetValue(key, out var value)) { Plugin.Logger.LogError((object)TextHandler.RpcCalledBeforeObjectSpawned()); return; } NetworkBehaviour networkBehaviourAtOrderIndex = value.GetNetworkBehaviourAtOrderIndex(num); MethodInfo method = ((object)networkBehaviourAtOrderIndex).GetType().GetMethod(text, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); RpcAttribute rpcAttribute; if (method == null) { Plugin.Logger.LogError((object)TextHandler.NetworkCalledNonExistentMethod(networkBehaviourAtOrderIndex, text)); } else if (ValidateRPCMethod(networkBehaviourAtOrderIndex, method, RpcState.FromNetworking, out rpcAttribute)) { RpcSource = RpcState.FromNetworking; ParameterInfo[] parameters = method.GetParameters(); bool num2 = rpcAttribute is ServerRpcAttribute && parameters.Length != 0 && parameters[^1].ParameterType == typeof(ServerRpcParams); object[] args = null; if (parameters.Length != 0) { args = new object[parameters.Length]; } reader.ReadMethodInfoAndParameters(method.DeclaringType, ref args); if (num2) { args[^1] = (object)new ServerRpcParams { Receive = new ServerRpcReceiveParams { SenderClientId = sender } }; } method.Invoke(networkBehaviourAtOrderIndex, args); } } internal static bool MethodPatch(NetworkBehaviour __instance, MethodBase __originalMethod, object[] __args) { return MethodPatchInternal(__instance, __originalMethod, __args); } } [BepInPlugin("NicholaScott.BepInEx.RuntimeNetcodeRPCValidator", "RuntimeNetcodeRPCValidator", "0.2.5")] public class Plugin : BaseUnityPlugin { private readonly Harmony _harmony = new Harmony("NicholaScott.BepInEx.RuntimeNetcodeRPCValidator"); private List<Type> AlreadyPatchedNativeBehaviours { get; } = new List<Type>(); internal static ManualLogSource Logger { get; private set; } public static event Action NetworkManagerInitialized; public static event Action NetworkManagerShutdown; private void Awake() { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; NetcodeValidator.AddedNewBoundBehaviour += NetcodeValidatorOnAddedNewBoundBehaviour; _harmony.Patch((MethodBase)AccessTools.Method(typeof(NetworkManager), "Initialize", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(Plugin), "OnNetworkManagerInitialized", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); _harmony.Patch((MethodBase)AccessTools.Method(typeof(NetworkManager), "Shutdown", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(Plugin), "OnNetworkManagerShutdown", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } private void NetcodeValidatorOnAddedNewBoundBehaviour(NetcodeValidator validator, Type netBehaviour) { //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown if (!AlreadyPatchedNativeBehaviours.Contains(netBehaviour)) { AlreadyPatchedNativeBehaviours.Add(netBehaviour); MethodBase methodBase = AccessTools.Method(netBehaviour, "Awake", (Type[])null, (Type[])null); if (methodBase == null) { methodBase = AccessTools.Method(netBehaviour, "Start", (Type[])null, (Type[])null); } if (methodBase == null) { methodBase = AccessTools.Constructor(netBehaviour, (Type[])null, false); } Logger.LogInfo((object)TextHandler.RegisteredPatchForType(validator, netBehaviour, methodBase)); HarmonyMethod val = new HarmonyMethod(typeof(NetcodeValidator), "TryLoadRelatedComponentsInOrder", (Type[])null); _harmony.Patch(methodBase, (HarmonyMethod)null, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } protected static void OnNetworkManagerInitialized() { Plugin.NetworkManagerInitialized?.Invoke(); } protected static void OnNetworkManagerShutdown() { Plugin.NetworkManagerShutdown?.Invoke(); } } internal static class TextHandler { private const string NoNetworkManagerPresentToSendRpcConst = "NetworkBehaviour {0} tried to send a RPC but the NetworkManager is non-existant!"; private const string MethodLacksAttributeConst = "Can't patch method {0}.{1} because it lacks a [{2}] attribute."; private const string MethodLacksSuffixConst = "Can't patch method {0}.{1} because it's name doesn't end with '{2}'!"; private const string SuccessfullyPatchedTypeConst = "Patched {0} ServerRPC{1} & {2} ClientRPC{3} on NetworkBehaviour {4}."; private const string NotOwnerOfNetworkObjectConst = "{0} tried to run ServerRPC {1} but not the owner of NetworkObject {2}"; private const string CantRunClientRpcFromClientConst = "Tried to run ClientRpc {0} but we're not a host! You should only call ClientRpc(s) from inside a ServerRpc OR if you've checked you're on the server with IsHost!"; private const string CantRunServerRpcAsClientConst = "Received message to run ServerRPC {0}.{1} but we're a client!"; private const string MethodPatchedButLacksAttributesConst = "Rpc Method {0} has been patched to attempt networking but lacks any RpcAttributes! This should never happen!"; private const string MethodPatchedAndNetworkCalledButLacksAttributesConst = "Rpc Method {0} has been patched && even received a network call to execute but lacks any RpcAttributes! This should never happen! Something is VERY fucky!!!"; private const string RpcCalledBeforeObjectSpawnedConst = "An RPC called on a NetworkObject that is not in the spawned objects list. Please make sure the NetworkObject is spawned before calling RPCs."; private const string NetworkCalledNonExistentMethodConst = "NetworkBehaviour {0} received RPC {1} but that method doesn't exist on {2}!"; private const string ObjectNotSerializableConst = "[Network] Parameter ({0} {1}) is not marked [Serializable] nor does it implement INetworkSerializable!"; private const string InconsistentParameterCountConst = "[Network] NetworkBehaviour received a RPC {0} but the number of parameters sent {1} != MethodInfo param count {2}"; private const string PluginTriedToBindToPreExistingObjectTooLateConst = "Plugin '{0}' tried to bind {1} to {2} but it's too late! Make sure you bind to any pre-existing NetworkObjects before NetworkManager.IsListening || IsConnectedClient."; private const string RegisteredPatchForTypeConst = "Successfully registered first patch for type {0}.{1} | Triggered by {2}"; private const string CustomComponentAddedToExistingObjectConst = "Successfully added {0} to {1} via {2}. Triggered by plugin {3}"; private const string PluginUnpatchedAllRPCsConst = "Plugin {0} has unpatched all RPCs!"; internal static string NoNetworkManagerPresentToSendRpc(NetworkBehaviour networkBehaviour) { return $"NetworkBehaviour {networkBehaviour.NetworkBehaviourId} tried to send a RPC but the NetworkManager is non-existant!"; } internal static string MethodLacksRpcAttribute(MethodInfo method) { return string.Format("Can't patch method {0}.{1} because it lacks a [{2}] attribute.", method.DeclaringType?.Name, method.Name, method.Name.EndsWith("ServerRpc") ? "ServerRpc" : "ClientRpc"); } internal static string MethodLacksSuffix(MethodBase method) { return string.Format("Can't patch method {0}.{1} because it's name doesn't end with '{2}'!", method.DeclaringType?.Name, method.Name, (((MemberInfo)method).GetCustomAttribute<ServerRpcAttribute>() != null) ? "ServerRpc" : "ClientRpc"); } internal static string SuccessfullyPatchedType(Type networkType, int serverRpcCount, int clientRpcCount) { return string.Format("Patched {0} ServerRPC{1} & {2} ClientRPC{3} on NetworkBehaviour {4}.", serverRpcCount, (serverRpcCount == 1) ? "" : "s", clientRpcCount, (clientRpcCount == 1) ? "" : "s", networkType.Name); } internal static string NotOwnerOfNetworkObject(string whoIsNotOwner, MethodBase method, NetworkObject networkObject) { return $"{whoIsNotOwner} tried to run ServerRPC {method.Name} but not the owner of NetworkObject {networkObject.NetworkObjectId}"; } internal static string CantRunClientRpcFromClient(MethodBase method) { return $"Tried to run ClientRpc {method.Name} but we're not a host! You should only call ClientRpc(s) from inside a ServerRpc OR if you've checked you're on the server with IsHost!"; } internal static string CantRunServerRpcAsClient(MethodBase method) { return $"Received message to run ServerRPC {method.DeclaringType?.Name}.{method.Name} but we're a client!"; } internal static string MethodPatchedButLacksAttributes(MethodBase method) { return $"Rpc Method {method.Name} has been patched to attempt networking but lacks any RpcAttributes! This should never happen!"; } internal static string MethodPatchedAndNetworkCalledButLacksAttributes(MethodBase method) { return $"Rpc Method {method.Name} has been patched && even received a network call to execute but lacks any RpcAttributes! This should never happen! Something is VERY fucky!!!"; } internal static string RpcCalledBeforeObjectSpawned() { return "An RPC called on a NetworkObject that is not in the spawned objects list. Please make sure the NetworkObject is spawned before calling RPCs."; } internal static string NetworkCalledNonExistentMethod(NetworkBehaviour networkBehaviour, string rpcName) { return $"NetworkBehaviour {networkBehaviour.NetworkBehaviourId} received RPC {rpcName} but that method doesn't exist on {((object)networkBehaviour).GetType().Name}!"; } internal static string ObjectNotSerializable(ParameterInfo paramInfo) { return $"[Network] Parameter ({paramInfo.ParameterType.Name} {paramInfo.Name}) is not marked [Serializable] nor does it implement INetworkSerializable!"; } internal static string InconsistentParameterCount(MethodBase method, int paramsSent) { return $"[Network] NetworkBehaviour received a RPC {method.Name} but the number of parameters sent {paramsSent} != MethodInfo param count {method.GetParameters().Length}"; } internal static string PluginTriedToBindToPreExistingObjectTooLate(NetcodeValidator netcodeValidator, Type from, Type to) { return $"Plugin '{netcodeValidator.PluginGuid}' tried to bind {from.Name} to {to.Name} but it's too late! Make sure you bind to any pre-existing NetworkObjects before NetworkManager.IsListening || IsConnectedClient."; } internal static string RegisteredPatchForType(NetcodeValidator validator, Type netBehaviour, MethodBase method) { return $"Successfully registered first patch for type {netBehaviour.Name}.{method.Name} | Triggered by {validator.PluginGuid}"; } internal static string CustomComponentAddedToExistingObject((NetcodeValidator validator, Type custom, Type native) it, MethodBase methodBase) { return $"Successfully added {it.custom.Name} to {it.native.Name} via {methodBase.Name}. Triggered by plugin {it.validator.PluginGuid}"; } internal static string PluginUnpatchedAllRPCs(NetcodeValidator netcodeValidator) { return $"Plugin {netcodeValidator.PluginGuid} has unpatched all RPCs!"; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "NicholaScott.BepInEx.RuntimeNetcodeRPCValidator"; public const string PLUGIN_NAME = "RuntimeNetcodeRPCValidator"; public const string PLUGIN_VERSION = "0.2.5"; } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }
BepInEx/plugins/RugbugRedfern-Skinwalkers/SkinwalkerMod.dll
Decompiled 8 months agousing System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Dissonance; using Dissonance.Config; using HarmonyLib; using SkinwalkerMod.Properties; using Steamworks; using Unity.Netcode; using UnityEngine; using UnityEngine.Networking; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("SkinwalkerMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("SkinwalkerMod")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("fd4979a2-cef0-46af-8bf8-97e630b11475")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] internal class <Module> { static <Module>() { NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpy<bool>(); NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<bool>(); NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpy<float>(); NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<float>(); } } namespace SkinwalkerMod { internal class LogoManager : MonoBehaviour { private AssetBundle bundle; private readonly Logo[] logos = new Logo[5] { new Logo { fileName = "Teo", playerNames = new string[9] { "SAMMY", "paddy", "Ozias", "Teo", "Rugbug Redfern", "WuluKing", "Boolie", "TeaEditor", "FlashGamesNemesis" } }, new Logo { fileName = "OfflineTV", playerNames = new string[3] { "Masayoshi", "QUARTERJADE", "DisguisedToast" } }, new Logo { fileName = "Neuro", playerNames = new string[1] { "vedal" } }, new Logo { fileName = "Mogul", playerNames = new string[2] { "ludwig", "AirCoots" } }, new Logo { fileName = "Imp", playerNames = new string[1] { "camila" } } }; private Image cachedHeader; private Image cachedLogoHeader; private void Awake() { try { bundle = AssetBundle.LoadFromMemory(Resources.logos); SceneManager.sceneLoaded += OnSceneLoaded; } catch (Exception ex) { SkinwalkerLogger.LogError("LogoManager Awake Error: " + ex.Message); } } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { try { if (!(((Scene)(ref scene)).name == "MainMenu")) { return; } cachedHeader = GameObject.Find("HeaderImage").GetComponent<Image>(); cachedLogoHeader = ((Component)GameObject.Find("Canvas/MenuContainer").transform.GetChild(0).GetChild(1)).GetComponent<Image>(); string value = SteamClient.Name.ToString(); Logo[] array = logos; foreach (Logo logo in array) { string[] playerNames = logo.playerNames; foreach (string text in playerNames) { if (text.Equals(value, StringComparison.OrdinalIgnoreCase)) { ((MonoBehaviour)this).StartCoroutine(I_ChangeLogo(bundle.LoadAsset<Sprite>("Assets/Logos/" + logo.fileName + ".png"))); return; } } } } catch (Exception ex) { SkinwalkerLogger.LogError("LogoManager OnSceneLoaded Error: " + ex.Message + ". If you launched in LAN mode, then this is just gonna happen, it doesn't break anything so don't worry about it."); } } private IEnumerator I_ChangeLogo(Sprite sprite) { for (int i = 0; i < 20; i++) { if ((Object)(object)cachedHeader == (Object)null) { break; } if ((Object)(object)cachedLogoHeader == (Object)null) { break; } SetHeaderImage(sprite); yield return null; } } private void SetHeaderImage(Sprite sprite) { if (!((Object)(object)sprite == (Object)null)) { cachedHeader.sprite = sprite; cachedLogoHeader.sprite = sprite; } } } internal class Logo { public string fileName; public string[] playerNames; } [BepInPlugin("RugbugRedfern.SkinwalkerMod", "Skinwalker Mod", "5.0.0")] internal class PluginLoader : BaseUnityPlugin { private readonly Harmony harmony = new Harmony("RugbugRedfern.SkinwalkerMod"); private const string modGUID = "RugbugRedfern.SkinwalkerMod"; private const string modVersion = "5.0.0"; private static bool initialized; public static PluginLoader Instance { get; private set; } private void Awake() { //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Expected O, but got Unknown //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected O, but got Unknown if (initialized) { return; } initialized = true; Instance = this; harmony.PatchAll(Assembly.GetExecutingAssembly()); Type[] types = Assembly.GetExecutingAssembly().GetTypes(); Type[] array = types; foreach (Type type in array) { MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] array2 = methods; foreach (MethodInfo methodInfo in array2) { object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false); if (customAttributes.Length != 0) { methodInfo.Invoke(null, null); } } } SkinwalkerLogger.Initialize("RugbugRedfern.SkinwalkerMod"); SkinwalkerLogger.Log("SKINWALKER MOD STARTING UP 5.0.0"); SkinwalkerConfig.InitConfig(); SceneManager.sceneLoaded += SkinwalkerNetworkManagerHandler.ClientConnectInitializer; GameObject val = new GameObject("Skinwalker Mod"); val.AddComponent<SkinwalkerModPersistent>(); ((Object)val).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)val); Logs.SetLogLevel((LogCategory)1, (LogLevel)4); Logs.SetLogLevel((LogCategory)3, (LogLevel)4); Logs.SetLogLevel((LogCategory)2, (LogLevel)4); GameObject val2 = new GameObject("Logo Manager"); val2.AddComponent<LogoManager>(); ((Object)val2).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)val2); } public void BindConfig<T>(ref ConfigEntry<T> config, string section, string key, T defaultValue, string description = "") { config = ((BaseUnityPlugin)this).Config.Bind<T>(section, key, defaultValue, description); } } internal class SkinwalkerBehaviour : MonoBehaviour { private AudioSource audioSource; public const float PLAY_INTERVAL_MIN = 15f; public const float PLAY_INTERVAL_MAX = 40f; private const float MAX_DIST = 100f; private float nextTimeToPlayAudio; private EnemyAI ai; public void Initialize(EnemyAI ai) { this.ai = ai; audioSource = ai.creatureVoice; SetNextTime(); } private void Update() { if (Time.time > nextTimeToPlayAudio) { SetNextTime(); AttemptPlaySound(); } } private void AttemptPlaySound() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) float num = -1f; if (Object.op_Implicit((Object)(object)ai) && !ai.isEnemyDead) { if (((Object)((Component)ai).gameObject).name == "DressGirl(Clone)") { DressGirlAI val = (DressGirlAI)ai; if ((Object)(object)val.hauntingPlayer != (Object)(object)StartOfRound.Instance.localPlayerController) { SkinwalkerLogger.Log(((Object)this).name + " played voice line no (not haunted) EnemyAI: " + (object)ai); return; } if (!val.staringInHaunt && !((EnemyAI)val).moveTowardsDestination) { SkinwalkerLogger.Log(((Object)this).name + " played voice line no (not visible) EnemyAI: " + (object)ai); return; } } Vector3 val2 = (StartOfRound.Instance.localPlayerController.isPlayerDead ? ((Component)StartOfRound.Instance.spectateCamera).transform.position : ((Component)StartOfRound.Instance.localPlayerController).transform.position); if ((Object)(object)StartOfRound.Instance == (Object)null || (Object)(object)StartOfRound.Instance.localPlayerController == (Object)null || (num = Vector3.Distance(val2, ((Component)this).transform.position)) < 100f) { AudioClip sample = SkinwalkerModPersistent.Instance.GetSample(); if ((Object)(object)sample != (Object)null) { SkinwalkerLogger.Log(((Object)this).name + " played voice line 1"); audioSource.PlayOneShot(sample); } else { SkinwalkerLogger.Log(((Object)this).name + " played voice line 0"); } } else { SkinwalkerLogger.Log(((Object)this).name + " played voice line no (too far away) " + num); } } else { SkinwalkerLogger.Log(((Object)this).name + " played voice line no (dead) EnemyAI: " + (object)ai); } } private void SetNextTime() { if (SkinwalkerNetworkManager.Instance.VoiceLineFrequency.Value <= 0f) { nextTimeToPlayAudio = Time.time + 100000000f; } else { nextTimeToPlayAudio = Time.time + Random.Range(15f, 40f) / SkinwalkerNetworkManager.Instance.VoiceLineFrequency.Value; } } private T CopyComponent<T>(T original, GameObject destination) where T : Component { Type type = ((object)original).GetType(); Component val = destination.AddComponent(type); FieldInfo[] fields = type.GetFields(); FieldInfo[] array = fields; foreach (FieldInfo fieldInfo in array) { fieldInfo.SetValue(val, fieldInfo.GetValue(original)); } return (T)(object)((val is T) ? val : null); } } internal class SkinwalkerConfig { public static ConfigEntry<bool> VoiceEnabled_BaboonHawk; public static ConfigEntry<bool> VoiceEnabled_Bracken; public static ConfigEntry<bool> VoiceEnabled_BunkerSpider; public static ConfigEntry<bool> VoiceEnabled_Centipede; public static ConfigEntry<bool> VoiceEnabled_CoilHead; public static ConfigEntry<bool> VoiceEnabled_EyelessDog; public static ConfigEntry<bool> VoiceEnabled_ForestGiant; public static ConfigEntry<bool> VoiceEnabled_GhostGirl; public static ConfigEntry<bool> VoiceEnabled_GiantWorm; public static ConfigEntry<bool> VoiceEnabled_HoardingBug; public static ConfigEntry<bool> VoiceEnabled_Hygrodere; public static ConfigEntry<bool> VoiceEnabled_Jester; public static ConfigEntry<bool> VoiceEnabled_Masked; public static ConfigEntry<bool> VoiceEnabled_Nutcracker; public static ConfigEntry<bool> VoiceEnabled_SporeLizard; public static ConfigEntry<bool> VoiceEnabled_Thumper; public static ConfigEntry<bool> VoiceEnabled_OtherEnemies; public static ConfigEntry<float> VoiceLineFrequency; public static void InitConfig() { PluginLoader.Instance.BindConfig(ref VoiceLineFrequency, "Voice Settings", "VoiceLineFrequency", 1f, "1 is the default, and voice lines will occur every " + 15f.ToString("0") + " to " + 40f.ToString("0") + " seconds per enemy. Setting this to 2 means they will occur twice as often, 0.5 means half as often, etc."); PluginLoader.Instance.BindConfig(ref VoiceEnabled_BaboonHawk, "Monster Voices", "Baboon Hawk", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_Bracken, "Monster Voices", "Bracken", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_BunkerSpider, "Monster Voices", "Bunker Spider", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_Centipede, "Monster Voices", "Centipede", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_CoilHead, "Monster Voices", "Coil Head", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_EyelessDog, "Monster Voices", "Eyeless Dog", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_ForestGiant, "Monster Voices", "Forest Giant", defaultValue: false); PluginLoader.Instance.BindConfig(ref VoiceEnabled_GhostGirl, "Monster Voices", "Ghost Girl", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_GiantWorm, "Monster Voices", "Giant Worm", defaultValue: false); PluginLoader.Instance.BindConfig(ref VoiceEnabled_HoardingBug, "Monster Voices", "Hoarding Bug", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_Hygrodere, "Monster Voices", "Hygrodere", defaultValue: false); PluginLoader.Instance.BindConfig(ref VoiceEnabled_Jester, "Monster Voices", "Jester", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_Masked, "Monster Voices", "Masked", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_Nutcracker, "Monster Voices", "Nutcracker", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_SporeLizard, "Monster Voices", "Spore Lizard", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_Thumper, "Monster Voices", "Thumper", defaultValue: true); PluginLoader.Instance.BindConfig(ref VoiceEnabled_OtherEnemies, "Monster Voices", "Other Enemies (Including Modded)", defaultValue: true); SkinwalkerLogger.Log("VoiceEnabled_BaboonHawk" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_BaboonHawk.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_Bracken" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_Bracken.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_BunkerSpider" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_BunkerSpider.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_Centipede" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_Centipede.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_CoilHead" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_CoilHead.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_EyelessDog" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_EyelessDog.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_ForestGiant" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_ForestGiant.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_GhostGirl" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_GhostGirl.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_GiantWorm" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_GiantWorm.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_HoardingBug" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_HoardingBug.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_Hygrodere" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_Hygrodere.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_Jester" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_Jester.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_Masked" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_Masked.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_Nutcracker" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_Nutcracker.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_SporeLizard" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_SporeLizard.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_Thumper" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_Thumper.Value}]"); SkinwalkerLogger.Log("VoiceEnabled_OtherEnemies" + $" VALUE LOADED FROM CONFIG: [{VoiceEnabled_OtherEnemies.Value}]"); SkinwalkerLogger.Log("VoiceLineFrequency" + $" VALUE LOADED FROM CONFIG: [{VoiceLineFrequency.Value}]"); } } internal static class SkinwalkerLogger { internal static ManualLogSource logSource; public static void Initialize(string modGUID) { logSource = Logger.CreateLogSource(modGUID); } public static void Log(object message) { logSource.LogInfo(message); } public static void LogError(object message) { logSource.LogError(message); } public static void LogWarning(object message) { logSource.LogWarning(message); } } public class SkinwalkerModPersistent : MonoBehaviour { private string audioFolder; private List<AudioClip> cachedAudio = new List<AudioClip>(); private float nextTimeToCheckFolder = 30f; private float nextTimeToCheckEnemies = 30f; private const float folderScanInterval = 8f; private const float enemyScanInterval = 5f; public static SkinwalkerModPersistent Instance { get; private set; } private void Awake() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) Instance = this; ((Component)this).transform.position = Vector3.zero; SkinwalkerLogger.Log("Skinwalker Mod Object Initialized"); audioFolder = Path.Combine(Application.dataPath, "..", "Dissonance_Diagnostics"); EnableRecording(); if (!Directory.Exists(audioFolder)) { Directory.CreateDirectory(audioFolder); } } private void Start() { try { if (Directory.Exists(audioFolder)) { Directory.Delete(audioFolder, recursive: true); } } catch (Exception message) { SkinwalkerLogger.Log(message); } } private void OnApplicationQuit() { DisableRecording(); } private void EnableRecording() { DebugSettings.Instance.EnablePlaybackDiagnostics = true; DebugSettings.Instance.RecordFinalAudio = true; } private void Update() { if (Time.realtimeSinceStartup > nextTimeToCheckFolder) { nextTimeToCheckFolder = Time.realtimeSinceStartup + 8f; if (!Directory.Exists(audioFolder)) { SkinwalkerLogger.Log("Audio folder not present. Don't worry about it, it will be created automatically when you play with friends. (" + audioFolder + ")"); return; } string[] files = Directory.GetFiles(audioFolder); SkinwalkerLogger.Log($"Got audio file paths ({files.Length})"); string[] array = files; foreach (string path in array) { ((MonoBehaviour)this).StartCoroutine(LoadWavFile(path, delegate(AudioClip audioClip) { cachedAudio.Add(audioClip); })); } } if (!(Time.realtimeSinceStartup > nextTimeToCheckEnemies)) { return; } nextTimeToCheckEnemies = Time.realtimeSinceStartup + 5f; EnemyAI[] array2 = Object.FindObjectsOfType<EnemyAI>(true); EnemyAI[] array3 = array2; SkinwalkerBehaviour skinwalkerBehaviour = default(SkinwalkerBehaviour); foreach (EnemyAI val in array3) { SkinwalkerLogger.Log("IsEnemyEnabled " + ((Object)val).name + " " + IsEnemyEnabled(val)); if (IsEnemyEnabled(val) && !((Component)val).TryGetComponent<SkinwalkerBehaviour>(ref skinwalkerBehaviour)) { ((Component)val).gameObject.AddComponent<SkinwalkerBehaviour>().Initialize(val); } } } private bool IsEnemyEnabled(EnemyAI enemy) { if ((Object)(object)enemy == (Object)null) { return false; } return ((Object)((Component)enemy).gameObject).name switch { "MaskedPlayerEnemy(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_Masked.Value, "NutcrackerEnemy(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_Nutcracker.Value, "BaboonHawkEnemy(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_BaboonHawk.Value, "Flowerman(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_Bracken.Value, "SandSpider(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_BunkerSpider.Value, "RedLocustBees(Clone)" => false, "Centipede(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_Centipede.Value, "SpringMan(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_CoilHead.Value, "MouthDog(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_EyelessDog.Value, "ForestGiant(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_ForestGiant.Value, "DressGirl(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_GhostGirl.Value, "SandWorm(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_GiantWorm.Value, "HoarderBug(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_HoardingBug.Value, "Blob(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_Hygrodere.Value, "JesterEnemy(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_Jester.Value, "PufferEnemy(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_SporeLizard.Value, "Crawler(Clone)" => SkinwalkerNetworkManager.Instance.VoiceEnabled_Thumper.Value, "DocileLocustBees(Clone)" => false, "DoublewingedBird(Clone)" => false, _ => SkinwalkerNetworkManager.Instance.VoiceEnabled_OtherEnemies.Value, }; } internal IEnumerator LoadWavFile(string path, Action<AudioClip> callback) { UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(path, (AudioType)20); try { yield return www.SendWebRequest(); if ((int)www.result == 1) { SkinwalkerLogger.Log("Loaded clip from path " + path); AudioClip audioClip = DownloadHandlerAudioClip.GetContent(www); if (audioClip.length > 0.9f) { callback(audioClip); } try { File.Delete(path); } catch (Exception e) { SkinwalkerLogger.LogWarning(e); } } } finally { ((IDisposable)www)?.Dispose(); } } private void DisableRecording() { DebugSettings.Instance.EnablePlaybackDiagnostics = false; DebugSettings.Instance.RecordFinalAudio = false; if (Directory.Exists(audioFolder)) { Directory.Delete(audioFolder, recursive: true); } } public AudioClip GetSample() { while (cachedAudio.Count > 200) { cachedAudio.RemoveAt(Random.Range(0, cachedAudio.Count)); } if (cachedAudio.Count > 0) { int index = Random.Range(0, cachedAudio.Count - 1); AudioClip result = cachedAudio[index]; cachedAudio.RemoveAt(index); return result; } return null; } public void ClearCache() { cachedAudio.Clear(); } } internal static class SkinwalkerNetworkManagerHandler { internal static void ClientConnectInitializer(Scene sceneName, LoadSceneMode sceneEnum) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown if (((Scene)(ref sceneName)).name == "SampleSceneRelay") { GameObject val = new GameObject("SkinwalkerNetworkManager"); val.AddComponent<NetworkObject>(); val.AddComponent<SkinwalkerNetworkManager>(); Debug.Log((object)"Initialized SkinwalkerNetworkManager"); } } } internal class SkinwalkerNetworkManager : NetworkBehaviour { public NetworkVariable<bool> VoiceEnabled_BaboonHawk = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_Bracken = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_BunkerSpider = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_Centipede = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_CoilHead = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_EyelessDog = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_ForestGiant = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_GhostGirl = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_GiantWorm = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_HoardingBug = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_Hygrodere = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_Jester = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_Masked = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_Nutcracker = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_SporeLizard = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_Thumper = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<bool> VoiceEnabled_OtherEnemies = new NetworkVariable<bool>(true, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public NetworkVariable<float> VoiceLineFrequency = new NetworkVariable<float>(1f, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public static SkinwalkerNetworkManager Instance { get; private set; } private void Awake() { Instance = this; if (GameNetworkManager.Instance.isHostingGame) { VoiceEnabled_BaboonHawk.Value = SkinwalkerConfig.VoiceEnabled_BaboonHawk.Value; VoiceEnabled_Bracken.Value = SkinwalkerConfig.VoiceEnabled_Bracken.Value; VoiceEnabled_BunkerSpider.Value = SkinwalkerConfig.VoiceEnabled_BunkerSpider.Value; VoiceEnabled_Centipede.Value = SkinwalkerConfig.VoiceEnabled_Centipede.Value; VoiceEnabled_CoilHead.Value = SkinwalkerConfig.VoiceEnabled_CoilHead.Value; VoiceEnabled_EyelessDog.Value = SkinwalkerConfig.VoiceEnabled_EyelessDog.Value; VoiceEnabled_ForestGiant.Value = SkinwalkerConfig.VoiceEnabled_ForestGiant.Value; VoiceEnabled_GhostGirl.Value = SkinwalkerConfig.VoiceEnabled_GhostGirl.Value; VoiceEnabled_GiantWorm.Value = SkinwalkerConfig.VoiceEnabled_GiantWorm.Value; VoiceEnabled_HoardingBug.Value = SkinwalkerConfig.VoiceEnabled_HoardingBug.Value; VoiceEnabled_Hygrodere.Value = SkinwalkerConfig.VoiceEnabled_Hygrodere.Value; VoiceEnabled_Jester.Value = SkinwalkerConfig.VoiceEnabled_Jester.Value; VoiceEnabled_Masked.Value = SkinwalkerConfig.VoiceEnabled_Masked.Value; VoiceEnabled_Nutcracker.Value = SkinwalkerConfig.VoiceEnabled_Nutcracker.Value; VoiceEnabled_SporeLizard.Value = SkinwalkerConfig.VoiceEnabled_SporeLizard.Value; VoiceEnabled_Thumper.Value = SkinwalkerConfig.VoiceEnabled_Thumper.Value; VoiceEnabled_OtherEnemies.Value = SkinwalkerConfig.VoiceEnabled_OtherEnemies.Value; VoiceLineFrequency.Value = SkinwalkerConfig.VoiceLineFrequency.Value; SkinwalkerLogger.Log("HOST SENDING CONFIG TO CLIENTS"); } SkinwalkerLogger.Log("SkinwalkerNetworkManager Awake"); } public override void OnDestroy() { ((NetworkBehaviour)this).OnDestroy(); SkinwalkerLogger.Log("SkinwalkerNetworkManager OnDestroy"); SkinwalkerModPersistent.Instance?.ClearCache(); } protected override void __initializeVariables() { if (VoiceEnabled_BaboonHawk == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_BaboonHawk cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_BaboonHawk).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_BaboonHawk, "VoiceEnabled_BaboonHawk"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_BaboonHawk); if (VoiceEnabled_Bracken == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_Bracken cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_Bracken).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_Bracken, "VoiceEnabled_Bracken"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_Bracken); if (VoiceEnabled_BunkerSpider == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_BunkerSpider cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_BunkerSpider).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_BunkerSpider, "VoiceEnabled_BunkerSpider"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_BunkerSpider); if (VoiceEnabled_Centipede == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_Centipede cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_Centipede).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_Centipede, "VoiceEnabled_Centipede"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_Centipede); if (VoiceEnabled_CoilHead == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_CoilHead cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_CoilHead).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_CoilHead, "VoiceEnabled_CoilHead"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_CoilHead); if (VoiceEnabled_EyelessDog == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_EyelessDog cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_EyelessDog).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_EyelessDog, "VoiceEnabled_EyelessDog"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_EyelessDog); if (VoiceEnabled_ForestGiant == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_ForestGiant cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_ForestGiant).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_ForestGiant, "VoiceEnabled_ForestGiant"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_ForestGiant); if (VoiceEnabled_GhostGirl == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_GhostGirl cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_GhostGirl).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_GhostGirl, "VoiceEnabled_GhostGirl"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_GhostGirl); if (VoiceEnabled_GiantWorm == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_GiantWorm cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_GiantWorm).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_GiantWorm, "VoiceEnabled_GiantWorm"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_GiantWorm); if (VoiceEnabled_HoardingBug == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_HoardingBug cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_HoardingBug).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_HoardingBug, "VoiceEnabled_HoardingBug"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_HoardingBug); if (VoiceEnabled_Hygrodere == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_Hygrodere cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_Hygrodere).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_Hygrodere, "VoiceEnabled_Hygrodere"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_Hygrodere); if (VoiceEnabled_Jester == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_Jester cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_Jester).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_Jester, "VoiceEnabled_Jester"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_Jester); if (VoiceEnabled_Masked == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_Masked cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_Masked).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_Masked, "VoiceEnabled_Masked"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_Masked); if (VoiceEnabled_Nutcracker == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_Nutcracker cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_Nutcracker).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_Nutcracker, "VoiceEnabled_Nutcracker"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_Nutcracker); if (VoiceEnabled_SporeLizard == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_SporeLizard cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_SporeLizard).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_SporeLizard, "VoiceEnabled_SporeLizard"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_SporeLizard); if (VoiceEnabled_Thumper == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_Thumper cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_Thumper).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_Thumper, "VoiceEnabled_Thumper"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_Thumper); if (VoiceEnabled_OtherEnemies == null) { throw new Exception("SkinwalkerNetworkManager.VoiceEnabled_OtherEnemies cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceEnabled_OtherEnemies).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceEnabled_OtherEnemies, "VoiceEnabled_OtherEnemies"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceEnabled_OtherEnemies); if (VoiceLineFrequency == null) { throw new Exception("SkinwalkerNetworkManager.VoiceLineFrequency cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)VoiceLineFrequency).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)VoiceLineFrequency, "VoiceLineFrequency"); base.NetworkVariableFields.Add((NetworkVariableBase)(object)VoiceLineFrequency); ((NetworkBehaviour)this).__initializeVariables(); } protected internal override string __getTypeName() { return "SkinwalkerNetworkManager"; } } } namespace SkinwalkerMod.Properties { [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [DebuggerNonUserCode] [CompilerGenerated] internal class Resources { private static ResourceManager resourceMan; private static CultureInfo resourceCulture; [EditorBrowsable(EditorBrowsableState.Advanced)] internal static ResourceManager ResourceManager { get { if (resourceMan == null) { ResourceManager resourceManager = new ResourceManager("SkinwalkerMod.Properties.Resources", typeof(Resources).Assembly); resourceMan = resourceManager; } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] internal static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } internal static byte[] logos { get { object @object = ResourceManager.GetObject("logos", resourceCulture); return (byte[])@object; } } internal Resources() { } } }
BepInEx/plugins/Sligili-More_Emotes/MoreEmotes1.2.2.dll
Decompiled 8 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using GameNetcodeStuff; using HarmonyLib; using MoreEmotes.Patch; using Tools; using Unity.Netcode; using UnityEngine; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.InputSystem.Utilities; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("FuckYouMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("FuckYouMod")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("5ecc2bf2-af12-4e83-a6f1-cf2eacbf3060")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace Tools { public class Reflection { public static object GetInstanceField(Type type, object instance, string fieldName) { BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; FieldInfo field = type.GetField(fieldName, bindingAttr); return field.GetValue(instance); } public static object CallMethod(object instance, string methodName, params object[] args) { MethodInfo method = instance.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { return method.Invoke(instance, args); } return null; } } } namespace MoreEmotes { [BepInPlugin("MoreEmotes", "MoreEmotes-Sligili", "1.2.2")] public class FuckYouModInitialization : BaseUnityPlugin { private Harmony _harmony; private ConfigEntry<string> config_KeyWheel; private ConfigEntry<bool> config_InventoryCheck; private ConfigEntry<string> config_KeyEmote3; private ConfigEntry<string> config_KeyEmote4; private ConfigEntry<string> config_KeyEmote5; private ConfigEntry<string> config_KeyEmote6; private ConfigEntry<string> config_KeyEmote7; private ConfigEntry<string> config_KeyEmote8; private void Awake() { //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Expected O, but got Unknown ((BaseUnityPlugin)this).Logger.LogInfo((object)"MoreEmotes loaded"); EmotePatch.animationsBundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MoreEmotes/animationsbundle")); EmotePatch.animatorBundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MoreEmotes/animatorbundle")); EmotePatch.local = EmotePatch.animatorBundle.LoadAsset<RuntimeAnimatorController>("Assets/MoreEmotes/NEWmetarig.controller"); EmotePatch.others = EmotePatch.animatorBundle.LoadAsset<RuntimeAnimatorController>("Assets/MoreEmotes/NEWmetarigOtherPlayers.controller"); CustomAudioAnimationEvent.claps[0] = EmotePatch.animationsBundle.LoadAsset<AudioClip>("Assets/MoreEmotes/SingleClapEmote1.wav"); CustomAudioAnimationEvent.claps[1] = EmotePatch.animationsBundle.LoadAsset<AudioClip>("Assets/MoreEmotes/SingleClapEmote2.wav"); ConfigFile(); IncompatibilityAids(); _harmony = new Harmony("MoreEmotes"); _harmony.PatchAll(typeof(EmotePatch)); } private void IncompatibilityAids() { foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos) { BepInPlugin metadata = pluginInfo.Value.Metadata; if (metadata.GUID.Equals("com.malco.lethalcompany.moreshipupgrades") || metadata.GUID.Equals("Stoneman.LethalProgression")) { EmotePatch.IncompatibleStuff = true; break; } } } private void ConfigFile() { EmotePatch.keybinds = new string[9]; config_KeyWheel = ((BaseUnityPlugin)this).Config.Bind<string>("EMOTE WHEEL", "Key", "v", (ConfigDescription)null); EmotePatch.wheelKeybind = config_KeyWheel.Value; config_InventoryCheck = ((BaseUnityPlugin)this).Config.Bind<bool>("OTHERS", "InventoryCheck", true, "Prevents some emotes from performing while holding any item/scrap"); EmotePatch.InvCheck = config_InventoryCheck.Value; config_KeyEmote3 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Middle Finger", "3", (ConfigDescription)null); EmotePatch.keybinds[2] = config_KeyEmote3.Value.Replace(" ", ""); config_KeyEmote4 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "The Griddy", "6", (ConfigDescription)null); EmotePatch.keybinds[5] = config_KeyEmote4.Value.Replace(" ", ""); config_KeyEmote5 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Shy", "5", (ConfigDescription)null); EmotePatch.keybinds[4] = config_KeyEmote5.Value.Replace(" ", ""); config_KeyEmote6 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Clap", "4", (ConfigDescription)null); EmotePatch.keybinds[3] = config_KeyEmote6.Value.Replace(" ", ""); config_KeyEmote7 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Twerk", "7", (ConfigDescription)null); EmotePatch.keybinds[6] = config_KeyEmote7.Value.Replace(" ", ""); config_KeyEmote8 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Salute", "8", (ConfigDescription)null); EmotePatch.keybinds[7] = config_KeyEmote8.Value.Replace(" ", ""); } } public static class PluginInfo { public const string Guid = "MoreEmotes"; public const string Name = "MoreEmotes-Sligili"; public const string Ver = "1.2.2"; } } namespace MoreEmotes.Patch { internal class EmotePatch { public static AssetBundle animationsBundle; public static AssetBundle animatorBundle; public static string[] keybinds; public static string wheelKeybind; private static CallbackContext context; public static RuntimeAnimatorController local; public static RuntimeAnimatorController others; private static int currentEmoteID; private static float svMovSpeed; public static bool IncompatibleStuff; public static bool InvCheck; public static bool emoteWheelIsOpened; public static GameObject wheel; public static GameObject rebindmenu; public static GameObject btn; private static SelectionWheel selectionWheel; [HarmonyPatch(typeof(MenuManager), "Start")] [HarmonyPostfix] private static void MenuStart(MenuManager __instance) { GameObject val = animationsBundle.LoadAsset<GameObject>("Assets/MoreEmotes/Resources/MoreEmotesPanel.prefab"); GameObject val2 = animationsBundle.LoadAsset<GameObject>("Assets/MoreEmotes/Resources/MoreEmotesButton.prefab"); GameObject gameObject = ((Component)((Component)__instance).transform.parent).gameObject; GameObject gameObject2 = ((Component)((Component)gameObject.transform.Find("MenuContainer")).transform.Find("SettingsPanel")).gameObject; if ((Object)(object)btn != (Object)null) { Object.Destroy((Object)(object)btn.gameObject); } btn = Object.Instantiate<GameObject>(val2, gameObject2.transform); btn.transform.SetSiblingIndex(7); if ((Object)(object)rebindmenu != (Object)null) { Object.Destroy((Object)(object)rebindmenu.gameObject); } rebindmenu = Object.Instantiate<GameObject>(val, gameObject2.transform); RebindBtn.defaultKeys = keybinds; BasicToggle.configValueInv = InvCheck; if ((Object)(object)gameObject2.GetComponent<SetupEverything>() == (Object)null) { gameObject2.AddComponent<SetupEverything>(); } SetupEverything.configValue = InvCheck; } [HarmonyPatch(typeof(PlayerControllerB), "Start")] [HarmonyPostfix] private static void StartPostfix(PlayerControllerB __instance) { GameObject gameObject = ((Component)((Component)((Component)__instance).gameObject.transform.Find("ScavengerModel")).transform.Find("metarig")).gameObject; CustomAudioAnimationEvent customAudioAnimationEvent = gameObject.AddComponent<CustomAudioAnimationEvent>(); svMovSpeed = __instance.movementSpeed; customAudioAnimationEvent.player = __instance; if (Object.FindObjectsOfType(typeof(SelectionWheel)).Length == 0) { GameObject val = animationsBundle.LoadAsset<GameObject>("Assets/MoreEmotes/Resources/MoreEmotesMenu.prefab"); GameObject gameObject2 = ((Component)((Component)GameObject.Find("Systems").gameObject.transform.Find("UI")).gameObject.transform.Find("Canvas")).gameObject; GameObject val2 = animationsBundle.LoadAsset<GameObject>("Assets/MoreEmotes/Resources/MoreEmotesPanel.prefab"); GameObject val3 = animationsBundle.LoadAsset<GameObject>("Assets/MoreEmotes/Resources/MoreEmotesButton.prefab"); GameObject gameObject3 = ((Component)((Component)gameObject2.transform.Find("QuickMenu")).transform.Find("SettingsPanel")).gameObject; if ((Object)(object)btn != (Object)null) { Object.Destroy((Object)(object)btn.gameObject); } btn = Object.Instantiate<GameObject>(val3, gameObject3.transform); btn.transform.SetSiblingIndex(7); if ((Object)(object)rebindmenu != (Object)null) { Object.Destroy((Object)(object)rebindmenu.gameObject); } rebindmenu = Object.Instantiate<GameObject>(val2, gameObject3.transform); RebindBtn.defaultKeys = keybinds; BasicToggle.configValueInv = InvCheck; if ((Object)(object)wheel != (Object)null) { Object.Destroy((Object)(object)wheel.gameObject); } wheel = Object.Instantiate<GameObject>(val, gameObject2.transform); selectionWheel = wheel.AddComponent<SelectionWheel>(); SelectionWheel.emotes_Keybinds = new string[keybinds.Length + 1]; SelectionWheel.emotes_Keybinds = keybinds; if ((Object)(object)gameObject3.GetComponent<SetupEverything>() == (Object)null) { gameObject3.AddComponent<SetupEverything>(); } SetupEverything.configValue = InvCheck; } } [HarmonyPatch(typeof(PlayerControllerB), "Update")] [HarmonyPostfix] private static void UpdatePostfix(PlayerControllerB __instance) { //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_0251: Unknown result type (might be due to invalid IL or missing references) if (!__instance.isPlayerControlled || !((NetworkBehaviour)__instance).IsOwner) { __instance.playerBodyAnimator.runtimeAnimatorController = others; return; } if ((Object)(object)__instance.playerBodyAnimator != (Object)(object)local) { __instance.playerBodyAnimator.runtimeAnimatorController = local; } if (__instance.performingEmote) { currentEmoteID = __instance.playerBodyAnimator.GetInteger("emoteNumber"); } if (!IncompatibleStuff) { bool flag = (bool)Reflection.CallMethod(__instance, "CheckConditionsForEmote") && currentEmoteID == 6 && __instance.performingEmote; __instance.movementSpeed = (flag ? (svMovSpeed / 2f) : svMovSpeed); } if (!PlayerPrefs.HasKey("InvCheck")) { PlayerPrefs.SetInt("InvCheck", InvCheck ? 1 : 0); } else { InvCheck = PlayerPrefs.GetInt("InvCheck") == 1; } if (!PlayerPrefs.HasKey("Emote_Wheel")) { PlayerPrefs.SetString("Emote_Wheel", wheelKeybind); } if (InputControlExtensions.IsPressed(((InputControl)Keyboard.current)[PlayerPrefs.GetString("Emote_Wheel")], 0f) && !emoteWheelIsOpened && !__instance.isPlayerDead && !__instance.inTerminalMenu && !__instance.quickMenuManager.isMenuOpen) { emoteWheelIsOpened = true; Cursor.visible = true; Cursor.lockState = (CursorLockMode)2; wheel.SetActive(emoteWheelIsOpened); __instance.disableLookInput = true; } else if ((!InputControlExtensions.IsPressed(((InputControl)Keyboard.current)[PlayerPrefs.GetString("Emote_Wheel")], 0f) && emoteWheelIsOpened) || __instance.quickMenuManager.isMenuOpen) { if (!__instance.quickMenuManager.isMenuOpen || __instance.isPlayerDead) { int selectedEmoteID = selectionWheel.selectedEmoteID; if (selectedEmoteID <= 3 || selectedEmoteID == 6 || !InvCheck) { __instance.PerformEmote(context, selectedEmoteID); } else if (!__instance.isHoldingObject) { __instance.PerformEmote(context, selectedEmoteID); } Cursor.visible = false; Cursor.lockState = (CursorLockMode)1; } if (__instance.isPlayerDead && !__instance.quickMenuManager.isMenuOpen) { Cursor.visible = false; Cursor.lockState = (CursorLockMode)1; } __instance.disableLookInput = false; emoteWheelIsOpened = false; wheel.SetActive(emoteWheelIsOpened); } if (!emoteWheelIsOpened && !__instance.quickMenuManager.isMenuOpen) { EmoteInput(keybinds[2], needsEmptyHands: false, 3, __instance); EmoteInput(keybinds[3], needsEmptyHands: true, 4, __instance); EmoteInput(keybinds[4], needsEmptyHands: true, 5, __instance); EmoteInput(keybinds[5], needsEmptyHands: false, 6, __instance); EmoteInput(keybinds[6], needsEmptyHands: true, 7, __instance); EmoteInput(keybinds[7], needsEmptyHands: true, 8, __instance); } } private static void EmoteInput(string keyBind, bool needsEmptyHands, int emoteID, PlayerControllerB player) { //IL_00a7: Unknown result type (might be due to invalid IL or missing references) bool flag = PlayerPrefs.GetInt("InvCheck") == 1; Emotes emotes = (Emotes)emoteID; string text = emotes.ToString(); if (PlayerPrefs.HasKey(text)) { keyBind = PlayerPrefs.GetString(text); } else { PlayerPrefs.SetString(text, keyBind); } if (!keyBind.Equals(string.Empty) && InputControlExtensions.IsPressed(((InputControl)Keyboard.current)[keyBind], 0f) && (!player.isHoldingObject || !needsEmptyHands || !flag) && (!player.performingEmote || currentEmoteID != emoteID)) { Debug.Log((object)text); player.PerformEmote(context, emoteID); } } [HarmonyPatch(typeof(PlayerControllerB), "CheckConditionsForEmote")] [HarmonyPrefix] private static bool prefixCheckConditions(ref bool __result, PlayerControllerB __instance) { bool flag = (bool)Reflection.GetInstanceField(typeof(PlayerControllerB), __instance, "isJumping"); if (currentEmoteID == 6) { __result = !__instance.inSpecialInteractAnimation && !__instance.isPlayerDead && !flag && __instance.moveInputVector.x == 0f && !__instance.isSprinting && !__instance.isCrouching && !__instance.isClimbingLadder && !__instance.isGrabbingObjectAnimation && !__instance.inTerminalMenu && !__instance.isTypingChat; return false; } return true; } [HarmonyPatch(typeof(PlayerControllerB), "PerformEmote")] [HarmonyPrefix] private static void PerformEmotePrefix(CallbackContext context, int emoteID, PlayerControllerB __instance) { if ((emoteID >= 3 || emoteWheelIsOpened || ((CallbackContext)(ref context)).performed) && ((((NetworkBehaviour)__instance).IsOwner && __instance.isPlayerControlled && (!((NetworkBehaviour)__instance).IsServer || __instance.isHostPlayerObject)) || __instance.isTestingPlayer) && (bool)Reflection.CallMethod(__instance, "CheckConditionsForEmote") && !(__instance.timeSinceStartingEmote < 0.5f)) { __instance.timeSinceStartingEmote = 0f; __instance.performingEmote = true; __instance.playerBodyAnimator.SetInteger("emoteNumber", emoteID); __instance.StartPerformingEmoteServerRpc(); } } } public class CustomAudioAnimationEvent : MonoBehaviour { private Animator animator; private AudioSource SoundsSource; public static AudioClip[] claps = (AudioClip[])(object)new AudioClip[2]; public PlayerControllerB player; private void Start() { animator = ((Component)this).GetComponent<Animator>(); SoundsSource = player.movementAudio; } public void PlayClapSound() { //IL_0087: Unknown result type (might be due to invalid IL or missing references) if (player.performingEmote && (!((NetworkBehaviour)player).IsOwner || !player.isPlayerControlled || animator.GetInteger("emoteNumber") == 4)) { bool flag = player.isInHangarShipRoom && player.playersManager.hangarDoorsClosed; RoundManager.Instance.PlayAudibleNoise(((Component)player).transform.position, 22f, 0.6f, 0, flag, 6); SoundsSource.pitch = Random.Range(0.59f, 0.79f); SoundsSource.PlayOneShot(claps[Random.Range(0, claps.Length)]); } } public void PlayFootstepSound() { if (player.performingEmote && (!((NetworkBehaviour)player).IsOwner || !player.isPlayerControlled || animator.GetInteger("emoteNumber") == 6 || animator.GetInteger("emoteNumber") == 8) && ((Vector2)(ref player.moveInputVector)).sqrMagnitude == 0f) { player.PlayFootstepLocal(); player.PlayFootstepServer(); } } } public enum Emotes { Dance = 1, Point, Middle_Finger, Clap, Shy, The_Griddy, Twerk, Salute } public class SelectionWheel : MonoBehaviour { public RectTransform selectionBlock; public Text emoteInformation; public Text pageInformation; private int blocksNumber = 8; private int currentBlock = 1; public int pageNumber; public int selectedEmoteID; private float angle; private float pageCooldown = 0.1f; public GameObject[] Pages; private int cuadrante = 0; public string selectedEmoteName; public float wheelMovementOffset = 3.3f; public static string[] emotes_Keybinds; private Vector2 center; private void OnEnable() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) center = new Vector2((float)(Screen.width / 2), (float)(Screen.height / 2)); PlayerInput component = GameObject.Find("PlayerSettingsObject").GetComponent<PlayerInput>(); emotes_Keybinds[0] = InputActionRebindingExtensions.GetBindingDisplayString(component.currentActionMap.FindAction("Emote1", false), 0, (DisplayStringOptions)0); emotes_Keybinds[1] = InputActionRebindingExtensions.GetBindingDisplayString(component.currentActionMap.FindAction("Emote2", false), 0, (DisplayStringOptions)0); Cursor.visible = true; selectionBlock = ((Component)((Component)this).gameObject.transform.Find("SelectedEmote")).gameObject.GetComponent<RectTransform>(); GameObject gameObject = ((Component)((Component)this).gameObject.transform.Find("FunctionalContent")).gameObject; emoteInformation = ((Component)((Component)((Component)this).gameObject.transform.Find("Graphics")).gameObject.transform.Find("EmoteInfo")).GetComponent<Text>(); Pages = (GameObject[])(object)new GameObject[gameObject.transform.childCount]; pageInformation = ((Component)((Component)((Component)this).gameObject.transform.Find("Graphics")).gameObject.transform.Find("PageNumber")).GetComponent<Text>(); pageInformation.text = "Page " + Pages.Length + "/" + (pageNumber + 1); for (int i = 0; i < gameObject.transform.childCount; i++) { Pages[i] = ((Component)gameObject.transform.GetChild(i)).gameObject; } Mouse.current.WarpCursorPosition(center); } private void Update() { wheelSelection(); pageSelection(); selectedEmoteID = currentBlock + Mathf.RoundToInt((float)(blocksNumber / 4)) + blocksNumber * pageNumber; displayEmoteInfo(); } private void wheelSelection() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) if (!(Vector2.Distance(center, ((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).ReadValue()) < wheelMovementOffset)) { bool flag = ((InputControl<float>)(object)((Pointer)Mouse.current).position.x).ReadValue() > center.x; bool flag2 = ((InputControl<float>)(object)((Pointer)Mouse.current).position.y).ReadValue() > center.y; cuadrante = ((!flag) ? (flag2 ? 2 : 3) : (flag2 ? 1 : 4)); float num = (((InputControl<float>)(object)((Pointer)Mouse.current).position.y).ReadValue() - center.y) / (((InputControl<float>)(object)((Pointer)Mouse.current).position.x).ReadValue() - center.x); float num2 = 180 * (cuadrante - ((cuadrante <= 2) ? 1 : 2)); angle = Mathf.Atan(num) * (180f / (float)Math.PI) + num2; if (angle == 90f) { angle = 270f; } else if (angle == 270f) { angle = 90f; } float num3 = 360 / blocksNumber; currentBlock = Mathf.RoundToInt((angle - num3 * 1.5f) / num3); ((Transform)selectionBlock).localRotation = Quaternion.Euler(((Component)this).transform.rotation.z, ((Component)this).transform.rotation.y, num3 * (float)currentBlock); } } private void pageSelection() { pageInformation.text = "Page " + Pages.Length + "/" + (pageNumber + 1); if (pageCooldown > 0f) { pageCooldown -= Time.deltaTime; } else if (((InputControl<float>)(object)((Vector2Control)Mouse.current.scroll).y).ReadValue() != 0f) { GameObject[] pages = Pages; foreach (GameObject val in pages) { val.SetActive(false); } int num = ((((InputControl<float>)(object)((Vector2Control)Mouse.current.scroll).y).ReadValue() > 0f) ? 1 : (-1)); if (pageNumber + 1 > Pages.Length - 1 && num > 0) { pageNumber = 0; } else if (pageNumber - 1 < 0 && num < 0) { pageNumber = Pages.Length - 1; } else { pageNumber += num; } Pages[pageNumber].SetActive(true); pageCooldown = 0.1f; } } private void displayEmoteInfo() { string text = ((selectedEmoteID > emotes_Keybinds.Length) ? "" : emotes_Keybinds[selectedEmoteID - 1]); object obj; if (selectedEmoteID <= Enum.GetValues(typeof(Emotes)).Length) { Emotes emotes = (Emotes)selectedEmoteID; obj = emotes.ToString().Replace("_", " "); } else { obj = "EMPTY"; } string text2 = (string)obj; if (!PlayerPrefs.HasKey(text2.Replace(" ", "_"))) { PlayerPrefs.SetString(text2.Replace(" ", "_"), (selectedEmoteID > emotes_Keybinds.Length) ? "" : emotes_Keybinds[selectedEmoteID - 1]); } else { text = PlayerPrefs.GetString(text2.Replace(" ", "_")); } emoteInformation.text = text2 + "\n[" + text.ToUpper() + "]"; } } public class RebindBtn : MonoBehaviour { public string defaultKey; public static string[] defaultKeys; public string playerPrefs; public GameObject waitingForInput; public Text keyInfo; public Text description; private void Start() { //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Expected O, but got Unknown string text = ((Component)((Component)this).gameObject.transform.Find("Description")).GetComponent<Text>().text; try { int num = (int)(Emotes)Enum.Parse(typeof(Emotes), text.Replace(" ", "_")); defaultKey = defaultKeys[num - 1]; } catch { defaultKey = "V"; } playerPrefs = ((Component)((Component)this).gameObject.transform.Find("Description")).GetComponent<Text>().text.Replace(" ", "_"); ((Component)((Component)((Component)this).transform.parent).transform.Find("Delete")).gameObject.AddComponent<DeleteBtn>(); keyInfo = ((Component)((Component)this).transform.Find("InputText")).GetComponent<Text>(); waitingForInput = ((Component)((Component)this).transform.Find("wait")).gameObject; ((UnityEvent)((Component)this).GetComponent<Button>().onClick).AddListener(new UnityAction(GetKey)); if (!PlayerPrefs.HasKey(playerPrefs)) { PlayerPrefs.SetString(playerPrefs, defaultKey); } SetKeybind(PlayerPrefs.GetString(playerPrefs)); } public void SetKeybind(string key) { PlayerPrefs.SetString(playerPrefs, key); keyInfo.text = key; ((MonoBehaviour)this).StopAllCoroutines(); waitingForInput.SetActive(false); } public void GetKey() { waitingForInput.SetActive(true); ((MonoBehaviour)this).StartCoroutine(WaitForKey(delegate(string key) { SetKeybind(key); })); } private IEnumerator WaitForKey(Action<string> callback) { while (!((ButtonControl)Keyboard.current.anyKey).wasPressedThisFrame) { yield return (object)new WaitForEndOfFrame(); Observable.CallOnce<InputControl>(InputSystem.onAnyButtonPress, (Action<InputControl>)delegate(InputControl ctrl) { callback((ctrl.device == Keyboard.current) ? ctrl.name : defaultKey); }); } } } public class DeleteBtn : MonoBehaviour { private RebindBtn rebindBtn; private void Start() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown rebindBtn = ((Component)((Component)((Component)this).transform.parent).transform.Find("Button")).GetComponent<RebindBtn>(); Button component = ((Component)this).GetComponent<Button>(); ((UnityEvent)component.onClick).AddListener(new UnityAction(deleteKey)); } public void deleteKey() { rebindBtn.SetKeybind(string.Empty); } } public class BasicToggle : MonoBehaviour { private Toggle tog; public static bool configValueInv; public string playerPrefs; private void Start() { tog = ((Component)this).GetComponent<Toggle>(); ((UnityEvent<bool>)(object)tog.onValueChanged).AddListener((UnityAction<bool>)SetNewValue); if (!PlayerPrefs.HasKey(playerPrefs)) { PlayerPrefs.SetInt(playerPrefs, configValueInv ? 1 : 0); } } public void SetNewValue(bool arg) { PlayerPrefs.SetInt(playerPrefs, tog.isOn ? 1 : 0); } } public class ButtonBasic : MonoBehaviour { public GameObject[] alternateActive = (GameObject[])(object)new GameObject[1]; private void Start() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown ((UnityEvent)((Component)this).GetComponent<Button>().onClick).AddListener(new UnityAction(onButtonTrigger)); if (((Object)((Component)this).gameObject).name.Equals("BackButton")) { alternateActive[0] = ((Component)((Component)this).transform.parent).gameObject; } if (((Object)((Component)this).gameObject).name.Equals("MoreEmotesButton(Clone)")) { alternateActive[0] = ((Component)((Component)((Component)this).transform.parent).gameObject.transform.Find("MoreEmotesPanel(Clone)")).gameObject; } } public void onButtonTrigger() { GameObject[] array = alternateActive; foreach (GameObject val in array) { val.SetActive((!val.activeInHierarchy) ? true : false); } } } public class SetupEverything : MonoBehaviour { private GameObject panel; public static bool configValue; private void Start() { panel = ((Component)((Component)this).transform.Find("MoreEmotesPanel(Clone)")).gameObject; ((Component)panel.transform.Find("Version")).GetComponent<Text>().text = "Sligili - 1.2.2"; if (!PlayerPrefs.HasKey("InvCheck")) { PlayerPrefs.SetInt("InvCheck", configValue ? 1 : 0); } SetupMenuButton(); BackButton(); KeybindButtons(); Others(); } private void SetupMenuButton() { GameObject gameObject = ((Component)((Component)this).transform.Find("MoreEmotesButton(Clone)")).gameObject; gameObject.AddComponent<ButtonBasic>(); } private void BackButton() { GameObject gameObject = ((Component)panel.transform.Find("BackButton")).gameObject; gameObject.AddComponent<ButtonBasic>(); } private void KeybindButtons() { GameObject gameObject = ((Component)panel.transform.Find("KeybindButtons")).gameObject; GameObject[] array = (GameObject[])(object)new GameObject[gameObject.transform.childCount]; for (int i = 0; i < gameObject.transform.childCount; i++) { array[i] = ((Component)gameObject.transform.GetChild(i)).gameObject; } GameObject[] array2 = array; foreach (GameObject val in array2) { ((Component)val.transform.Find("Button")).gameObject.AddComponent<RebindBtn>(); } } private void Others() { GameObject gameObject = ((Component)panel.transform.Find("Inv")).gameObject; gameObject.AddComponent<BasicToggle>(); BasicToggle basicToggle = gameObject.AddComponent<BasicToggle>(); basicToggle.playerPrefs = "InvCheck"; } } }
BepInEx/plugins/Sligili-More_Emotes/MoreEmotes1.3.2.dll
Decompiled 8 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using GameNetcodeStuff; using HarmonyLib; using MoreEmotes.Patch; using MoreEmotes.Scripts; using RuntimeNetcodeRPCValidator; using TMPro; using Tools; using Unity.Netcode; using UnityEngine; using UnityEngine.Animations.Rigging; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.InputSystem.Utilities; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("FuckYouMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("FuckYouMod")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("5ecc2bf2-af12-4e83-a6f1-cf2eacbf3060")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace Tools { public class Ref { public static object GetInstanceField(Type type, object instance, string fieldName) { BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; FieldInfo field = type.GetField(fieldName, bindingAttr); return field.GetValue(instance); } public static object Method(object instance, string methodName, params object[] args) { MethodInfo method = instance.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { return method.Invoke(instance, args); } return null; } } public class D : MonoBehaviour { public static bool Debug; public static void L(string msg) { if (Debug) { Debug.Log((object)msg); } } public static void W(string msg) { if (Debug) { Debug.LogWarning((object)msg); } } } } namespace MoreEmotes { [BepInPlugin("MoreEmotes", "MoreEmotes-Sligili", "1.3.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class MoreEmotesInitialization : BaseUnityPlugin { private Harmony _harmony; private NetcodeValidator netcodeValidator; private ConfigEntry<string> config_KeyWheel; private ConfigEntry<string> config_KeyWheel_c; private ConfigEntry<bool> config_InventoryCheck; private ConfigEntry<bool> config_UseConfigFile; private ConfigEntry<string> config_KeyEmote3; private ConfigEntry<string> config_KeyEmote4; private ConfigEntry<string> config_KeyEmote5; private ConfigEntry<string> config_KeyEmote6; private ConfigEntry<string> config_KeyEmote7; private ConfigEntry<string> config_KeyEmote8; private ConfigEntry<string> config_KeyEmote9; private ConfigEntry<string> config_KeyEmote10; private void Awake() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown ((BaseUnityPlugin)this).Logger.LogInfo((object)"MoreEmotes loaded"); LoadAssetBundles(); LoadAssets(); ConfigFile(); SearchForIncompatibleMods(); _harmony = new Harmony("MoreEmotes"); _harmony.PatchAll(typeof(EmotePatch)); netcodeValidator = new NetcodeValidator("MoreEmotes"); netcodeValidator.PatchAll(); netcodeValidator.BindToPreExistingObjectByBehaviour<SignEmoteText, PlayerControllerB>(); netcodeValidator.BindToPreExistingObjectByBehaviour<SyncAnimatorToOthers, PlayerControllerB>(); } private void LoadAssetBundles() { string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MoreEmotes/animationsbundle"); string text2 = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MoreEmotes/animatorbundle"); try { EmotePatch.AnimationsBundle = AssetBundle.LoadFromFile(text); EmotePatch.AnimatorBundle = AssetBundle.LoadFromFile(text2); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("Failed to load AssetBundles. Make sure \"animatorsbundle\" and \"animationsbundle\" are inside the MoreEmotes folder.\nError: " + ex.Message)); } } private void LoadAssets() { string path = "Assets/MoreEmotes"; EmotePatch.local = EmotePatch.AnimatorBundle.LoadAsset<RuntimeAnimatorController>(Path.Combine(path, "NEWmetarig.controller")); EmotePatch.others = EmotePatch.AnimatorBundle.LoadAsset<RuntimeAnimatorController>(Path.Combine(path, "NEWmetarigOtherPlayers.controller")); MoreEmotesEvents.ClapSounds[0] = EmotePatch.AnimationsBundle.LoadAsset<AudioClip>(Path.Combine(path, "SingleClapEmote1.wav")); MoreEmotesEvents.ClapSounds[1] = EmotePatch.AnimationsBundle.LoadAsset<AudioClip>(Path.Combine(path, "SingleClapEmote2.wav")); EmotePatch.SettingsPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/MoreEmotesPanel.prefab")); EmotePatch.ButtonPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/MoreEmotesButton.prefab")); EmotePatch.LegsPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/plegs.prefab")); EmotePatch.SignPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/Sign.prefab")); EmotePatch.SignUIPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/SignTextUI.prefab")); EmotePatch.WheelPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>("Assets/MoreEmotes/Resources/MoreEmotesMenu.prefab"); } private void ConfigFile() { EmotePatch.ConfigFile_Keybinds = new string[32]; config_KeyWheel = ((BaseUnityPlugin)this).Config.Bind<string>("EMOTE WHEEL", "Key", "v", (ConfigDescription)null); EmotePatch.ConfigFile_WheelKeybind = config_KeyWheel.Value; config_KeyWheel_c = ((BaseUnityPlugin)this).Config.Bind<string>("EMOTE WHEEL (Controller)", "Key", "leftshoulder", (ConfigDescription)null); EmotePatch.ConfigFile_WheelKeybind_controller = config_KeyWheel_c.Value; config_InventoryCheck = ((BaseUnityPlugin)this).Config.Bind<bool>("OTHERS", "InventoryCheck", true, "Prevents some emotes from performing while holding any item/scrap"); EmotePatch.ConfigFile_InventoryCheck = config_InventoryCheck.Value; config_UseConfigFile = ((BaseUnityPlugin)this).Config.Bind<bool>("OTHERS", "ConfigFile", false, "Ignores all in-game saved settings and instead uses the config file"); EmotePatch.UseConfigFile = config_UseConfigFile.Value; config_KeyEmote3 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Middle Finger", "3", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[2] = config_KeyEmote3.Value.Replace(" ", ""); config_KeyEmote4 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "The Griddy", "6", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[5] = config_KeyEmote4.Value.Replace(" ", ""); config_KeyEmote5 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Shy", "5", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[4] = config_KeyEmote5.Value.Replace(" ", ""); config_KeyEmote6 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Clap", "4", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[3] = config_KeyEmote6.Value.Replace(" ", ""); config_KeyEmote7 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Twerk", "7", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[6] = config_KeyEmote7.Value.Replace(" ", ""); config_KeyEmote8 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Salute", "8", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[7] = config_KeyEmote8.Value.Replace(" ", ""); config_KeyEmote9 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Prisyadka", "9", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[8] = config_KeyEmote9.Value.Replace(" ", ""); config_KeyEmote10 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Sign", "0", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[9] = config_KeyEmote10.Value.Replace(" ", ""); } private void SearchForIncompatibleMods() { foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos) { BepInPlugin metadata = pluginInfo.Value.Metadata; if (metadata.GUID.Equals("com.malco.lethalcompany.moreshipupgrades", StringComparison.OrdinalIgnoreCase) || metadata.GUID.Equals("Stoneman.LethalProgression", StringComparison.OrdinalIgnoreCase)) { EmotePatch.IncompatibleStuff = true; break; } } } } public static class PluginInfo { public const string GUID = "MoreEmotes"; public const string NAME = "MoreEmotes-Sligili"; public const string VER = "1.3.2"; } } namespace MoreEmotes.Patch { public enum Emotes { D_Sign = 1010, D_Clap = 1004, D_Middle_Finger = 1003, Dance = 1, Point = 2, Middle_Finger = 3, Clap = 4, Shy = 5, The_Griddy = 6, Twerk = 7, Salute = 8, Prisyadka = 9, Sign = 10 } public class EmotePatch { public static AssetBundle AnimationsBundle; public static AssetBundle AnimatorBundle; public static RuntimeAnimatorController local; public static RuntimeAnimatorController others; public static bool UseConfigFile; public static string[] ConfigFile_Keybinds; public static string ConfigFile_WheelKeybind; public static string ConfigFile_WheelKeybind_controller; public static bool ConfigFile_InventoryCheck; public static string EmoteWheelKeyboard; public static string EmoteWheelController; public static bool IncompatibleStuff; private static int s_currentEmoteID = 0; private static float s_defaultPlayerSpeed; private static bool[] s_wasPerformingEmote = new bool[32]; public static bool IsEmoteWheelOpen; private static bool s_isPlayerFirstFrame; private static bool s_isFirstTimeOnMenu; private static bool s_isPlayerSpawning; public const int AlternateEmoteIDOffset = 1000; private static int[] s_doubleEmotesIDS = new int[2] { 3, 4 }; public static bool LocalArmsSeparatedFromCamera; private static Transform s_freeArmsTarget; private static Transform s_lockedArmsTarget; private static CallbackContext emptyContext; public static GameObject ButtonPrefab; public static GameObject SettingsPrefab; public static GameObject LegsPrefab; public static GameObject SignPrefab; public static GameObject SignUIPrefab; public static GameObject WheelPrefab; private static GameObject s_localPlayerLevelBadge; private static GameObject s_localPlayerBetaBadge; private static Transform s_legsMesh; private static EmoteWheel s_selectionWheel; private static SignUI s_customSignInputField; private static SyncAnimatorToOthers s_syncAnimator; private static int _AlternateEmoteIDOffset => 1000; private static void InstantiateSettingsMenu(Transform container) { RebindButton.ConfigFile_Keybinds = ConfigFile_Keybinds; if (!PlayerPrefs.HasKey("InvCheck") || UseConfigFile) { PlayerPrefs.SetInt("InvCheck", ConfigFile_InventoryCheck ? 1 : 0); } ToggleButton.s_InventoryCheck = (UseConfigFile ? ConfigFile_InventoryCheck : (PlayerPrefs.GetInt("InvCheck") == 1)); SetupUI.UseConfigFile = UseConfigFile; SetupUI.InventoryCheck = ToggleButton.s_InventoryCheck; GameObject gameObject = ((Component)((Component)container).transform.Find("SettingsPanel")).gameObject; Object.Instantiate<GameObject>(ButtonPrefab, gameObject.transform).transform.SetSiblingIndex(7); Object.Instantiate<GameObject>(SettingsPrefab, gameObject.transform); gameObject.AddComponent<SetupUI>(); } private static void CheckEmoteInput(string keyBind, bool needsEmptyHands, int emoteID, PlayerControllerB player) { //IL_00b0: Unknown result type (might be due to invalid IL or missing references) Emotes emotes = (Emotes)emoteID; string text = emotes.ToString(); bool flag; if (UseConfigFile) { flag = ConfigFile_InventoryCheck; keyBind = ConfigFile_Keybinds[emoteID - 1]; } else { flag = PlayerPrefs.GetInt("InvCheck") == 1; if (PlayerPrefs.HasKey(text)) { keyBind = PlayerPrefs.GetString(text); } else { PlayerPrefs.SetString(text, keyBind); } } if (!keyBind.Equals(string.Empty) && InputControlExtensions.IsPressed(((InputControl)Keyboard.current)[keyBind], 0f) && (!player.isHoldingObject || !needsEmptyHands || !flag)) { player.PerformEmote(emptyContext, emoteID); } } private static void CheckWheelInput(string keybind, string controller, PlayerControllerB player) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) bool flag = false; bool flag2 = false; if (Gamepad.all.Count != 0 && !controller.Equals(string.Empty)) { flag = InputControlExtensions.IsPressed(((InputControl)Gamepad.current)[controller], 0f); } if (keybind != string.Empty) { flag2 = InputControlExtensions.IsPressed(((InputControl)Keyboard.current)[keybind], 0f) && !((ButtonControl)Keyboard.current[(Key)55]).wasPressedThisFrame; } bool flag3 = flag || flag2; if (flag3 && !IsEmoteWheelOpen && !player.isPlayerDead && !player.inTerminalMenu && !player.quickMenuManager.isMenuOpen && !player.isTypingChat && !s_customSignInputField.IsSignUIOpen) { IsEmoteWheelOpen = true; Cursor.visible = true; Cursor.lockState = (CursorLockMode)2; ((Component)s_selectionWheel).gameObject.SetActive(IsEmoteWheelOpen); player.disableLookInput = true; } else { if (!IsEmoteWheelOpen || (flag3 && !player.quickMenuManager.isMenuOpen && !player.isTypingChat && !s_customSignInputField.IsSignUIOpen)) { return; } int selectedEmoteID = s_selectionWheel.SelectedEmoteID; if (!player.quickMenuManager.isMenuOpen && !s_customSignInputField.IsSignUIOpen) { Cursor.visible = false; Cursor.lockState = (CursorLockMode)1; } if (!player.isPlayerDead && !player.quickMenuManager.isMenuOpen) { if (selectedEmoteID <= 3 || selectedEmoteID == 6 || !ConfigFile_InventoryCheck) { player.PerformEmote(emptyContext, selectedEmoteID); } else if (!player.isHoldingObject) { player.PerformEmote(emptyContext, selectedEmoteID); } } if (!s_customSignInputField.IsSignUIOpen) { player.disableLookInput = false; } IsEmoteWheelOpen = false; ((Component)s_selectionWheel).gameObject.SetActive(IsEmoteWheelOpen); } } private static void OnFirstLocalPlayerFrameWithNewAnimator(PlayerControllerB player) { s_isPlayerFirstFrame = false; s_syncAnimator = ((Component)player).GetComponent<SyncAnimatorToOthers>(); s_customSignInputField.Player = player; s_freeArmsTarget = Object.Instantiate<Transform>(player.localArmsRotationTarget, player.localArmsRotationTarget.parent.parent); s_lockedArmsTarget = player.localArmsRotationTarget; Transform val = ((Component)player).transform.Find("ScavengerModel").Find("metarig").Find("spine") .Find("spine.001") .Find("spine.002") .Find("spine.003"); s_localPlayerLevelBadge = ((Component)val.Find("LevelSticker")).gameObject; s_localPlayerBetaBadge = ((Component)val.Find("BetaBadge")).gameObject; player.SpawnPlayerAnimation(); } private static void SpawnSign(PlayerControllerB player) { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(SignPrefab, ((Component)((Component)((Component)player).transform.Find("ScavengerModel")).transform.Find("metarig")).transform); val.transform.SetSiblingIndex(6); ((Object)val).name = "Sign"; val.transform.localPosition = new Vector3(0.029f, -0.45f, 1.3217f); val.transform.localRotation = Quaternion.Euler(65.556f, 180f, 180f); } private static void SpawnLegs(PlayerControllerB player) { //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(LegsPrefab, ((Component)((Component)player.playerBodyAnimator).transform.parent).transform); s_legsMesh = val.transform.Find("Mesh"); ((Component)s_legsMesh).transform.parent = ((Component)player.playerBodyAnimator).transform.parent; ((Object)s_legsMesh).name = "LEGS"; GameObject gameObject = ((Component)val.transform.Find("Armature")).gameObject; gameObject.transform.parent = ((Component)player.playerBodyAnimator).transform; ((Object)gameObject).name = "FistPersonLegs"; gameObject.transform.position = new Vector3(0f, 0.197f, 0f); gameObject.transform.localScale = new Vector3(13.99568f, 13.99568f, 13.99568f); Object.Destroy((Object)(object)val); } private static void SetIKWeights(PlayerControllerB player) { Transform val = ((Component)player.playerBodyAnimator).transform.Find("Rig 1"); ChainIKConstraint component = ((Component)val.Find("RightArm")).GetComponent<ChainIKConstraint>(); ChainIKConstraint component2 = ((Component)val.Find("LeftArm")).GetComponent<ChainIKConstraint>(); TwoBoneIKConstraint component3 = ((Component)val.Find("RightLeg")).GetComponent<TwoBoneIKConstraint>(); TwoBoneIKConstraint component4 = ((Component)val.Find("LeftLeg")).GetComponent<TwoBoneIKConstraint>(); Transform val2 = ((Component)player.playerBodyAnimator).transform.Find("ScavengerModelArmsOnly").Find("metarig").Find("spine.003") .Find("RigArms"); ChainIKConstraint component5 = ((Component)val2.Find("RightArm")).GetComponent<ChainIKConstraint>(); ChainIKConstraint component6 = ((Component)val2.Find("LeftArm")).GetComponent<ChainIKConstraint>(); ((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component).weight = 1f; ((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component2).weight = 1f; ((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component).weight = 1f; ((RigConstraint<TwoBoneIKConstraintJob, TwoBoneIKConstraintData, TwoBoneIKConstraintJobBinder<TwoBoneIKConstraintData>>)(object)component4).weight = 1f; ((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component5).weight = 1f; ((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component6).weight = 1f; } private static void UpdateLegsMaterial(PlayerControllerB player) { ((Renderer)((Component)s_legsMesh).GetComponent<SkinnedMeshRenderer>()).material = ((Renderer)((Component)((Component)((Component)player.playerBodyAnimator).transform.parent).transform.Find("LOD1")).gameObject.GetComponent<SkinnedMeshRenderer>()).material; } private static void TogglePlayerBadges(PlayerControllerB player, bool enabled) { if ((Object)(object)s_localPlayerBetaBadge != (Object)null) { ((Renderer)s_localPlayerBetaBadge.GetComponent<MeshRenderer>()).enabled = enabled; } if ((Object)(object)s_localPlayerLevelBadge != (Object)null) { ((Renderer)s_localPlayerLevelBadge.GetComponent<MeshRenderer>()).enabled = enabled; } else { Debug.LogError((object)"[MoreEmotes-Sligili] Couldn't find the level badge"); } } public static void UpdateWheelKeybinds() { if (UseConfigFile) { EmoteWheelKeyboard = ConfigFile_WheelKeybind; EmoteWheelController = ConfigFile_WheelKeybind_controller; return; } if (!PlayerPrefs.HasKey("Emote_Wheel_c")) { PlayerPrefs.SetString("Emote_Wheel_c", ConfigFile_WheelKeybind_controller); } EmoteWheelController = PlayerPrefs.GetString("Emote_Wheel_c"); if (!PlayerPrefs.HasKey("Emote_Wheel")) { PlayerPrefs.SetString("Emote_Wheel", ConfigFile_WheelKeybind); } EmoteWheelKeyboard = PlayerPrefs.GetString("Emote_Wheel"); if (!PlayerPrefs.HasKey("InvCheck")) { PlayerPrefs.SetInt("InvCheck", ConfigFile_InventoryCheck ? 1 : 0); } ConfigFile_InventoryCheck = PlayerPrefs.GetInt("InvCheck") == 1; } [HarmonyPatch(typeof(MenuManager), "Start")] [HarmonyPostfix] private static void MenuStart(MenuManager __instance) { D.Debug = false; try { InstantiateSettingsMenu(((Component)((Component)__instance).transform.parent).transform.Find("MenuContainer")); } catch (Exception ex) { if (!s_isFirstTimeOnMenu) { s_isFirstTimeOnMenu = true; } else { Debug.LogError((object)(ex.Message + "\n[MoreEmotes-Sligili] Couldn't find MenuContainer")); } } } [HarmonyPatch(typeof(RoundManager), "Awake")] [HarmonyPostfix] private static void AwakePost(RoundManager __instance) { if (!PlayerPrefs.HasKey("InvCheck")) { PlayerPrefs.SetInt("InvCheck", ConfigFile_InventoryCheck ? 1 : 0); } UpdateWheelKeybinds(); GameObject gameObject = ((Component)((Component)GameObject.Find("Systems").gameObject.transform.Find("UI")).gameObject.transform.Find("Canvas")).gameObject; InstantiateSettingsMenu(gameObject.transform.Find("QuickMenu")); s_selectionWheel = Object.Instantiate<GameObject>(WheelPrefab, gameObject.transform).AddComponent<EmoteWheel>(); s_customSignInputField = Object.Instantiate<GameObject>(SignUIPrefab, gameObject.transform).AddComponent<SignUI>(); EmoteWheel.Keybinds = new string[ConfigFile_Keybinds.Length + 1]; EmoteWheel.Keybinds = ConfigFile_Keybinds; s_isPlayerFirstFrame = true; } [HarmonyPatch(typeof(HUDManager), "EnableChat_performed")] [HarmonyPrefix] private static bool OpenChatPrefix() { if (s_customSignInputField.IsSignUIOpen) { return false; } return true; } [HarmonyPatch(typeof(HUDManager), "SubmitChat_performed")] [HarmonyPrefix] private static bool SubmitChatPrefix() { if (s_customSignInputField.IsSignUIOpen) { return false; } return true; } [HarmonyPatch(typeof(PlayerControllerB), "Start")] [HarmonyPostfix] private static void StartPostfix(PlayerControllerB __instance) { ((Component)((Component)((Component)__instance).gameObject.transform.Find("ScavengerModel")).transform.Find("metarig")).gameObject.AddComponent<MoreEmotesEvents>().Player = __instance; s_defaultPlayerSpeed = __instance.movementSpeed; ((Component)__instance).gameObject.AddComponent<CustomAnimationObjects>(); SpawnSign(__instance); } [HarmonyPatch(typeof(PlayerControllerB), "Update")] [HarmonyPostfix] private static void UpdatePostfix(PlayerControllerB __instance) { if (!__instance.isPlayerControlled || !((NetworkBehaviour)__instance).IsOwner) { __instance.playerBodyAnimator.runtimeAnimatorController = others; return; } if ((Object)(object)__instance.playerBodyAnimator != (Object)(object)local) { if (s_isPlayerFirstFrame) { SpawnLegs(__instance); } __instance.playerBodyAnimator.runtimeAnimatorController = local; if (s_isPlayerFirstFrame) { OnFirstLocalPlayerFrameWithNewAnimator(__instance); } if (s_isPlayerSpawning) { __instance.SpawnPlayerAnimation(); s_isPlayerSpawning = false; } } if (!IncompatibleStuff) { if ((bool)Ref.Method(__instance, "CheckConditionsForEmote") && __instance.performingEmote) { switch (s_currentEmoteID) { case 6: __instance.movementSpeed = s_defaultPlayerSpeed / 2f; break; case 9: __instance.movementSpeed = s_defaultPlayerSpeed / 3f; break; } } else { __instance.movementSpeed = s_defaultPlayerSpeed; } } __instance.localArmsRotationTarget = (LocalArmsSeparatedFromCamera ? (__instance.localArmsRotationTarget = s_freeArmsTarget) : (__instance.localArmsRotationTarget = s_lockedArmsTarget)); CheckWheelInput(EmoteWheelKeyboard, EmoteWheelController, __instance); if (!__instance.quickMenuManager.isMenuOpen && !IsEmoteWheelOpen) { CheckEmoteInput(ConfigFile_Keybinds[2], needsEmptyHands: false, 3, __instance); CheckEmoteInput(ConfigFile_Keybinds[3], needsEmptyHands: true, 4, __instance); CheckEmoteInput(ConfigFile_Keybinds[4], needsEmptyHands: true, 5, __instance); CheckEmoteInput(ConfigFile_Keybinds[5], needsEmptyHands: false, 6, __instance); CheckEmoteInput(ConfigFile_Keybinds[6], needsEmptyHands: true, 7, __instance); CheckEmoteInput(ConfigFile_Keybinds[7], needsEmptyHands: true, 8, __instance); CheckEmoteInput(ConfigFile_Keybinds[8], needsEmptyHands: true, 9, __instance); CheckEmoteInput(ConfigFile_Keybinds[9], needsEmptyHands: true, 10, __instance); } } [HarmonyPatch(typeof(PlayerControllerB), "Update")] [HarmonyPrefix] private static void UpdatePrefix(PlayerControllerB __instance) { if (!((NetworkBehaviour)__instance).IsOwner && __instance.isPlayerControlled) { D.L(__instance.playerBodyAnimator.GetInteger("emoteNumber").ToString() ?? ""); } if (__instance.performingEmote) { s_wasPerformingEmote[__instance.playerClientId] = true; } if (!__instance.performingEmote && s_wasPerformingEmote[__instance.playerClientId]) { s_wasPerformingEmote[__instance.playerClientId] = false; SetIKWeights(__instance); } } [HarmonyPatch(typeof(PlayerControllerB), "SpawnPlayerAnimation")] [HarmonyPrefix] private static void OnLocalPlayerSpawn(PlayerControllerB __instance) { if (((NetworkBehaviour)__instance).IsOwner && __instance.isPlayerControlled) { s_isPlayerSpawning = true; } } [HarmonyPatch(typeof(PlayerControllerB), "CheckConditionsForEmote")] [HarmonyPrefix] private static bool CheckConditionsPrefix(ref bool __result, PlayerControllerB __instance) { bool flag = (bool)Ref.GetInstanceField(typeof(PlayerControllerB), __instance, "isJumping"); bool flag2 = (bool)Ref.GetInstanceField(typeof(PlayerControllerB), __instance, "isWalking"); if (s_currentEmoteID == 6 || s_currentEmoteID == 9) { __result = !__instance.inSpecialInteractAnimation && !__instance.isPlayerDead && !flag && __instance.moveInputVector.x == 0f && !__instance.isSprinting && !__instance.isCrouching && !__instance.isClimbingLadder && !__instance.isGrabbingObjectAnimation && !__instance.inTerminalMenu && !__instance.isTypingChat; return false; } if (s_currentEmoteID == 10 || s_currentEmoteID == 1010) { __result = !__instance.inSpecialInteractAnimation && !__instance.isPlayerDead && !flag && !flag2 && !__instance.isCrouching && !__instance.isClimbingLadder && !__instance.isGrabbingObjectAnimation && !__instance.inTerminalMenu; return false; } return true; } [HarmonyPatch(typeof(PlayerControllerB), "PerformEmote")] [HarmonyPrefix] private static bool PerformEmotePrefix(CallbackContext context, int emoteID, PlayerControllerB __instance) { if ((!((NetworkBehaviour)__instance).IsOwner || !__instance.isPlayerControlled || (((NetworkBehaviour)__instance).IsServer && !__instance.isHostPlayerObject)) && !__instance.isTestingPlayer) { return false; } if (s_customSignInputField.IsSignUIOpen && emoteID != 1010) { return false; } if (emoteID > 0 && emoteID < 3 && !IsEmoteWheelOpen && !((CallbackContext)(ref context)).performed) { return false; } D.L("Emote ID pre doubleemote check " + emoteID); int[] array = s_doubleEmotesIDS; foreach (int num in array) { int num2 = num + _AlternateEmoteIDOffset; bool flag = (UseConfigFile ? ConfigFile_InventoryCheck : (PlayerPrefs.GetInt("InvCheck") == 1)); if (emoteID == num && s_currentEmoteID == emoteID && __instance.performingEmote && (!__instance.isHoldingObject || !flag)) { if (emoteID == num) { emoteID += _AlternateEmoteIDOffset; } else { emoteID -= 1000; } } } D.L("Emote ID post doubleemote check " + emoteID); if ((s_currentEmoteID != emoteID && emoteID < 3) || !__instance.performingEmote) { SetIKWeights(__instance); } if (!(bool)Ref.Method(__instance, "CheckConditionsForEmote")) { return false; } if (__instance.timeSinceStartingEmote < 0.5f) { return false; } s_currentEmoteID = emoteID; Action action = delegate { __instance.timeSinceStartingEmote = 0f; __instance.playerBodyAnimator.SetInteger("emoteNumber", emoteID); __instance.performingEmote = true; __instance.StartPerformingEmoteServerRpc(); s_syncAnimator.UpdateEmoteIDForOthers(emoteID); TogglePlayerBadges(__instance, enabled: false); }; switch (emoteID) { case 9: action = (Action)Delegate.Combine(action, (Action)delegate { UpdateLegsMaterial(__instance); }); break; case 10: action = (Action)Delegate.Combine(action, (Action)delegate { ((Component)s_customSignInputField).gameObject.SetActive(true); }); break; } action(); return false; } [HarmonyPatch(typeof(PlayerControllerB), "StopPerformingEmoteServerRpc")] [HarmonyPostfix] private static void StopPerformingEmoteServerPrefix(PlayerControllerB __instance) { if (((NetworkBehaviour)__instance).IsOwner && __instance.isPlayerControlled) { __instance.playerBodyAnimator.SetInteger("emoteNumber", 0); } TogglePlayerBadges(__instance, enabled: true); s_syncAnimator.UpdateEmoteIDForOthers(0); } } } namespace MoreEmotes.Scripts { public class MoreEmotesEvents : MonoBehaviour { private Animator _playerAnimator; private AudioSource _playerAudioSource; public static AudioClip[] ClapSounds = (AudioClip[])(object)new AudioClip[2]; public PlayerControllerB Player; private void Start() { _playerAnimator = ((Component)this).GetComponent<Animator>(); _playerAudioSource = Player.movementAudio; } public void PlayClapSound() { //IL_007d: Unknown result type (might be due to invalid IL or missing references) if (Player.performingEmote) { int currentEmoteID = GetCurrentEmoteID(); if (!((NetworkBehaviour)Player).IsOwner || !Player.isPlayerControlled || currentEmoteID == 4) { bool flag = Player.isInHangarShipRoom && Player.playersManager.hangarDoorsClosed; RoundManager.Instance.PlayAudibleNoise(((Component)Player).transform.position, 22f, 0.6f, 0, flag, 6); _playerAudioSource.pitch = Random.Range(0.59f, 0.79f); _playerAudioSource.PlayOneShot(ClapSounds[Random.Range(0, ClapSounds.Length)]); } } } public void PlayFootstepSound() { if (Player.performingEmote) { int currentEmoteID = GetCurrentEmoteID(); if ((!((NetworkBehaviour)Player).IsOwner || !Player.isPlayerControlled || currentEmoteID == 6 || currentEmoteID == 8 || currentEmoteID == 9) && ((Vector2)(ref Player.moveInputVector)).sqrMagnitude == 0f) { Player.PlayFootstepLocal(); Player.PlayFootstepServer(); } } } private int GetCurrentEmoteID() { int num = _playerAnimator.GetInteger("emoteNumber"); if (num >= 1000) { num -= 1000; } return num; } } public class SignEmoteText : NetworkBehaviour { private PlayerControllerB _playerInstance; private TextMeshPro _signModelText; public string Text => ((TMP_Text)_signModelText).text; private void Start() { _playerInstance = ((Component)this).GetComponent<PlayerControllerB>(); _signModelText = ((Component)((Component)_playerInstance).transform.Find("ScavengerModel").Find("metarig").Find("Sign") .Find("Text")).GetComponent<TextMeshPro>(); } public void UpdateSignText(string newText) { if (((NetworkBehaviour)_playerInstance).IsOwner && _playerInstance.isPlayerControlled) { UpdateSignTextServerRpc(newText); } } [ServerRpc(RequireOwnership = false)] private void UpdateSignTextServerRpc(string newText) { UpdateSignTextClientRpc(newText); } [ClientRpc] private void UpdateSignTextClientRpc(string newText) { ((TMP_Text)_signModelText).text = newText; } } public class EmoteWheel : MonoBehaviour { private RectTransform _graphics_selectedBlock; private RectTransform _graphics_selectionArrow; private Text _graphics_emoteInformation; private Text _graphics_pageInformation; private int _blocksNumber = 8; private int _selectedBlock = 1; private float _changePageCooldown = 0.1f; private float _selectionArrowLerpSpeed = 30f; private float _angle; private GameObject[] _pages; public float WheelMovementDeadzone = 3.3f; public float WheelMovementDeadzoneController = 0.7f; public static string[] Keybinds; private Vector2 _wheelCenter; private Vector2 _lastMouseCoords; public int SelectedPageNumber { get; private set; } public int SelectedEmoteID { get; private set; } public bool IsUsingController { get; private set; } private void Awake() { GetVanillaKeybinds(); FindGraphics(); FindPages(((Component)this).gameObject.transform.Find("FunctionalContent")); UpdatePageInfo(); } private void OnEnable() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) _wheelCenter = new Vector2((float)(Screen.width / 2), (float)(Screen.height / 2)); Mouse.current.WarpCursorPosition(_wheelCenter); } private void GetVanillaKeybinds() { PlayerInput component = GameObject.Find("PlayerSettingsObject").GetComponent<PlayerInput>(); if ((Object)(object)component == (Object)null) { Debug.LogError((object)" MoreEmotes: PlayerSettingsObject is null"); return; } Keybinds[0] = InputActionRebindingExtensions.GetBindingDisplayString(component.currentActionMap.FindAction("Emote1", false), 0, (DisplayStringOptions)0); Keybinds[1] = InputActionRebindingExtensions.GetBindingDisplayString(component.currentActionMap.FindAction("Emote2", false), 0, (DisplayStringOptions)0); } private void FindGraphics() { _graphics_selectionArrow = ((Component)((Component)((Component)this).gameObject.transform.Find("Graphics")).gameObject.transform.Find("SelectionArrow")).gameObject.GetComponent<RectTransform>(); _graphics_selectedBlock = ((Component)((Component)this).gameObject.transform.Find("SelectedEmote")).gameObject.GetComponent<RectTransform>(); _graphics_emoteInformation = ((Component)((Component)((Component)this).gameObject.transform.Find("Graphics")).gameObject.transform.Find("EmoteInfo")).GetComponent<Text>(); _graphics_pageInformation = ((Component)((Component)((Component)this).gameObject.transform.Find("Graphics")).gameObject.transform.Find("PageNumber")).GetComponent<Text>(); } private void FindPages(Transform contentParent) { _pages = (GameObject[])(object)new GameObject[((Component)contentParent).transform.childCount]; _graphics_pageInformation.text = "< Page " + (SelectedPageNumber + 1) + "/" + _pages.Length + " >"; for (int i = 0; i < ((Component)contentParent).transform.childCount; i++) { _pages[i] = ((Component)((Component)contentParent).transform.GetChild(i)).gameObject; } } private void Update() { ControllerInput(); if (!IsUsingController) { MouseInput(); } Cursor.visible = !IsUsingController; UpdateSelectionArrow(); PageSelection(); SelectedEmoteID = _selectedBlock + Mathf.RoundToInt((float)(_blocksNumber / 4)) + _blocksNumber * SelectedPageNumber; UpdateEmoteInfo(); } private unsafe void ControllerInput() { //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) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_0082: 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) if (Gamepad.all.Count == 0) { IsUsingController = false; return; } float num = ((InputControl<float>)(object)((Vector2Control)Gamepad.current.rightStick).x).ReadUnprocessedValue(); float num2 = ((InputControl<float>)(object)((Vector2Control)Gamepad.current.rightStick).y).ReadUnprocessedValue(); if (Mathf.Abs(num) < WheelMovementDeadzoneController && Mathf.Abs(num2) < WheelMovementDeadzoneController) { if (System.Runtime.CompilerServices.Unsafe.Read<Vector2>((void*)((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).value) != _lastMouseCoords) { IsUsingController = false; } } else { IsUsingController = true; _lastMouseCoords = System.Runtime.CompilerServices.Unsafe.Read<Vector2>((void*)((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).value); WheelSelection(Vector2.zero, num, num2); } } private void MouseInput() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) if (!(Vector2.Distance(_wheelCenter, ((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).ReadValue()) < WheelMovementDeadzone)) { WheelSelection(_wheelCenter, ((InputControl<float>)(object)((Pointer)Mouse.current).position.x).ReadValue(), ((InputControl<float>)(object)((Pointer)Mouse.current).position.y).ReadValue()); } } private void WheelSelection(Vector2 origin, float xAxisValue, float yAxisValue) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) bool flag = xAxisValue > origin.x; bool flag2 = yAxisValue > origin.y; int num = ((!flag) ? (flag2 ? 2 : 3) : (flag2 ? 1 : 4)); float num2 = (yAxisValue - origin.y) / (xAxisValue - origin.x); float num3 = 180 * (num - ((num <= 2) ? 1 : 2)); _angle = Mathf.Atan(num2) * (180f / (float)Math.PI) + num3; if (_angle == 90f) { _angle = 270f; } else if (_angle == 270f) { _angle = 90f; } float num4 = 360 / _blocksNumber; _selectedBlock = Mathf.RoundToInt((_angle - num4 * 1.5f) / num4); ((Transform)_graphics_selectedBlock).localRotation = Quaternion.Euler(((Component)this).transform.rotation.z, ((Component)this).transform.rotation.y, num4 * (float)_selectedBlock); } private void PageSelection() { UpdatePageInfo(); if (_changePageCooldown > 0f) { _changePageCooldown -= Time.deltaTime; return; } int num; if (IsUsingController) { if (!Gamepad.current.dpad.left.isPressed && !Gamepad.current.dpad.right.isPressed) { return; } num = (Gamepad.current.dpad.left.isPressed ? 1 : (-1)); } else { if (((InputControl<float>)(object)((Vector2Control)Mouse.current.scroll).y).ReadValue() == 0f) { return; } num = ((((InputControl<float>)(object)((Vector2Control)Mouse.current.scroll).y).ReadValue() > 0f) ? 1 : (-1)); } GameObject[] pages = _pages; foreach (GameObject val in pages) { val.SetActive(false); } SelectedPageNumber = (SelectedPageNumber + num + _pages.Length) % _pages.Length; _pages[SelectedPageNumber].SetActive(true); _changePageCooldown = ((!IsUsingController) ? 0.1f : 0.3f); } private void UpdatePageInfo() { _graphics_pageInformation.text = $"<color=#fe6b02><</color> Page {SelectedPageNumber + 1}/{_pages.Length} <color=#fe6b02>></color>"; } private void UpdateEmoteInfo() { string text = ((SelectedEmoteID > Keybinds.Length) ? "" : Keybinds[SelectedEmoteID - 1]); int num = 0; foreach (Emotes value in Enum.GetValues(typeof(Emotes))) { if (value >= Emotes.Dance && value < (Emotes)64) { num++; } } string text2 = ((SelectedEmoteID > num) ? "EMPTY" : ((Emotes)SelectedEmoteID).ToString().Replace("_", " ")); if (SelectedEmoteID > 2 && SelectedEmoteID <= Keybinds.Length) { if (!PlayerPrefs.HasKey(text2.Replace(" ", "_"))) { PlayerPrefs.SetString(text2.Replace(" ", "_"), (SelectedEmoteID > Keybinds.Length) ? "" : Keybinds[SelectedEmoteID - 1]); } else { text = PlayerPrefs.GetString(text2.Replace(" ", "_")); } } text = "<size=120>[" + text + "]</size>"; _graphics_emoteInformation.text = text2 + "\n" + text.ToUpper(); } private void UpdateSelectionArrow() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) float num = 360 / _blocksNumber; Quaternion val = Quaternion.Euler(0f, 0f, _angle - num * 2f); ((Transform)_graphics_selectionArrow).localRotation = Quaternion.Lerp(((Transform)_graphics_selectionArrow).localRotation, val, Time.deltaTime * _selectionArrowLerpSpeed); } } public class RebindButton : MonoBehaviour { public static string[] ConfigFile_Keybinds; private string _defaultKey; private string _playerPrefsString; private Transform _waitingForInput; private Text _keyInfo; public bool IsControllerButton { get; private set; } = false; private void Start() { //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Expected O, but got Unknown string text = ((Component)((Component)this).gameObject.transform.Find("Description")).GetComponent<Text>().text; IsControllerButton = GetControllerFlag(); _playerPrefsString = ((Component)((Component)this).gameObject.transform.Find("Description")).GetComponent<Text>().text.Replace(" ", "_") + (IsControllerButton ? "_c" : ""); _defaultKey = GetDefaultKey(text); FindComponents(); ((UnityEvent)((Component)this).GetComponent<Button>().onClick).AddListener(new UnityAction(GetKey)); if (!PlayerPrefs.HasKey(_playerPrefsString)) { PlayerPrefs.SetString(_playerPrefsString, _defaultKey); } SetKeybind(PlayerPrefs.GetString(_playerPrefsString)); } private string GetDefaultKey(string emoteName) { if (Enum.TryParse<Emotes>(emoteName.Replace(" ", "_"), out var result)) { return ConfigFile_Keybinds[(int)(result - 1)]; } return IsControllerButton ? "leftshoulder" : "V"; } private bool GetControllerFlag() { Transform val = ((Component)this).gameObject.transform.Find("Description").Find("Subtext"); if ((Object)(object)val == (Object)null) { return false; } Text val2 = default(Text); if (((Component)val).TryGetComponent<Text>(ref val2)) { return val2.text.Equals("(Controller)", StringComparison.OrdinalIgnoreCase); } return false; } private void FindComponents() { ((Component)((Component)((Component)this).transform.parent).transform.Find("Delete")).gameObject.AddComponent<DeleteButton>(); _keyInfo = ((Component)((Component)this).transform.Find("InputText")).GetComponent<Text>(); _waitingForInput = ((Component)this).transform.Find("wait"); } public void SetKeybind(string key) { List<string> list = new List<string> { "up", "down", "left", "right" }; if (list.Contains(key.ToLower()) && key.Length < 5) { key = "dpad/" + key; } PlayerPrefs.SetString(_playerPrefsString, key); _keyInfo.text = key.ToUpper(); ((MonoBehaviour)this).StopAllCoroutines(); ((Component)_waitingForInput).gameObject.SetActive(false); } private void GetKey() { ((Component)_waitingForInput).gameObject.SetActive(true); ((MonoBehaviour)this).StartCoroutine(WaitForKey(delegate(string key) { SetKeybind(key); })); } private IEnumerator WaitForKey(Action<string> callback) { while (!((ButtonControl)Keyboard.current.anyKey).wasPressedThisFrame || (!((InputDevice)Gamepad.current).wasUpdatedThisFrame && !InputControlExtensions.IsActuated((InputControl)(object)Gamepad.current.leftStick, 0f) && !InputControlExtensions.IsActuated((InputControl)(object)Gamepad.current.rightStick, 0f))) { yield return (object)new WaitForEndOfFrame(); Observable.CallOnce<InputControl>(InputSystem.onAnyButtonPress, (Action<InputControl>)delegate(InputControl ctrl) { callback(((ctrl.device == Gamepad.current && IsControllerButton) || (ctrl.device == Keyboard.current && !IsControllerButton)) ? ctrl.name : _defaultKey); }); } } } public class DeleteButton : MonoBehaviour { private void Start() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown RebindButton _rebindButton = ((Component)((Component)((Component)this).transform.parent).transform.Find("Button")).GetComponent<RebindButton>(); ((UnityEvent)((Component)this).GetComponent<Button>().onClick).AddListener((UnityAction)delegate { _rebindButton.SetKeybind(string.Empty); }); } } public class ToggleButton : MonoBehaviour { private Toggle _toggle; public static bool s_InventoryCheck; public string PlayerPrefsString; private void Start() { _toggle = ((Component)this).GetComponent<Toggle>(); _toggle.isOn = s_InventoryCheck; ((UnityEvent<bool>)(object)_toggle.onValueChanged).AddListener((UnityAction<bool>)SetNewValue); if (!PlayerPrefs.HasKey(PlayerPrefsString)) { SetNewValue(s_InventoryCheck); } } public void SetNewValue(bool arg) { PlayerPrefs.SetInt(PlayerPrefsString, arg ? 1 : 0); } } public class EnableDisableButton : MonoBehaviour { public GameObject[] ToAlternateUI = (GameObject[])(object)new GameObject[1]; private void Start() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown ((UnityEvent)((Component)this).GetComponent<Button>().onClick).AddListener((UnityAction)delegate { GameObject[] toAlternateUI = ToAlternateUI; foreach (GameObject val in toAlternateUI) { val.SetActive((!val.activeInHierarchy) ? true : false); } }); if (((Object)((Component)this).gameObject).name.Equals("BackButton", StringComparison.OrdinalIgnoreCase)) { ToAlternateUI[0] = ((Component)((Component)this).transform.parent).gameObject; } if (((Object)((Component)this).gameObject).name.Equals("MoreEmotesButton(Clone)", StringComparison.OrdinalIgnoreCase)) { ToAlternateUI[0] = ((Component)((Component)((Component)this).transform.parent).gameObject.transform.Find("MoreEmotesPanel(Clone)")).gameObject; } } } public class SetupUI : MonoBehaviour { public static bool UseConfigFile; public static bool InventoryCheck; private void Awake() { Transform settingsUIPanel = ((Component)this).transform.Find("MoreEmotesPanel(Clone)"); ((Component)settingsUIPanel.Find("Version")).GetComponent<Text>().text = "1.3.2 - Sligili"; SetupOpenSettingsButton(); SetupBackButton(); SetupRebindButtons(((Component)settingsUIPanel).transform.Find("KeybindButtons")); SetupRebindButtons(((Component)((Component)((Component)settingsUIPanel).transform.Find("Scroll View")).transform.Find("Viewport")).transform.Find("Content")); SetupInventoryCheckToggle(); SetupUseConfigFileToggle(); void SetupBackButton() { ((Component)((Component)settingsUIPanel).transform.Find("BackButton")).gameObject.AddComponent<EnableDisableButton>(); } void SetupInventoryCheckToggle() { ((Component)((Component)settingsUIPanel).transform.Find("Inv")).gameObject.AddComponent<ToggleButton>().PlayerPrefsString = "InvCheck"; } void SetupOpenSettingsButton() { ((Component)((Component)this).transform.Find("MoreEmotesButton(Clone)")).gameObject.AddComponent<EnableDisableButton>(); } static void SetupRebindButtons(Transform ButtonsParent) { Transform[] array = (Transform[])(object)new Transform[ButtonsParent.childCount]; for (int i = 0; i < array.Length; i++) { array[i] = ButtonsParent.GetChild(i); } Transform[] array2 = array; foreach (Transform val in array2) { ((Component)val.Find("Button")).gameObject.AddComponent<RebindButton>(); } } void SetupUseConfigFileToggle() { ((Component)((Component)settingsUIPanel).transform.Find("cfg")).gameObject.GetComponent<Toggle>().isOn = UseConfigFile; } } private void Update() { EmotePatch.UpdateWheelKeybinds(); } } public class SignUI : MonoBehaviour { public PlayerControllerB Player; private TMP_InputField _inputField; private Text _charactersLeftText; private TMP_Text _previewText; private Button _submitButton; private Button _cancelButton; public bool IsSignUIOpen; private void Awake() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown FindComponents(); ((UnityEvent)_submitButton.onClick).AddListener(new UnityAction(SubmitText)); ((UnityEvent)_cancelButton.onClick).AddListener((UnityAction)delegate { Close(cancelAction: true); }); ((UnityEvent<string>)(object)_inputField.onValueChanged).AddListener((UnityAction<string>)delegate(string fieldText) { UpdatePreviewText(fieldText); UpdateCharactersLeftText(); }); } private void OnEnable() { Player.isTypingChat = true; IsSignUIOpen = true; ((Selectable)_inputField).Select(); _inputField.text = string.Empty; _previewText.text = "PREVIEW"; Player.disableLookInput = true; } private void Update() { //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) Cursor.visible = true; Cursor.lockState = (CursorLockMode)2; if (!Player.performingEmote) { Close(cancelAction: true); } if (((ButtonControl)Keyboard.current[(Key)2]).wasPressedThisFrame && !((ButtonControl)Keyboard.current[(Key)51]).isPressed) { SubmitText(); } if (Player.quickMenuManager.isMenuOpen || EmotePatch.IsEmoteWheelOpen || InputControlExtensions.IsPressed(((InputControl)Mouse.current)["rightButton"], 0f)) { Close(cancelAction: true); } if (Gamepad.all.Count != 0) { if (Gamepad.current.buttonWest.isPressed || Gamepad.current.startButton.isPressed) { SubmitText(); } if (Gamepad.current.buttonEast.isPressed || Gamepad.current.selectButton.isPressed) { Close(cancelAction: true); } } } private void FindComponents() { _inputField = ((Component)((Component)this).transform.Find("InputField")).GetComponent<TMP_InputField>(); _charactersLeftText = ((Component)((Component)this).transform.Find("CharsLeft")).GetComponent<Text>(); _submitButton = ((Component)((Component)this).transform.Find("Submit")).GetComponent<Button>(); _cancelButton = ((Component)((Component)this).transform.Find("Cancel")).GetComponent<Button>(); _previewText = ((Component)((Component)((Component)this).transform.Find("Sign")).transform.Find("Text")).GetComponent<TMP_Text>(); } private void UpdateCharactersLeftText() { _charactersLeftText.text = $"CHARACTERS LEFT: <color=yellow>{_inputField.characterLimit - _inputField.text.Length}</color>"; } private void UpdatePreviewText(string text) { _previewText.text = text; } private void SubmitText() { //IL_007c: 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) if (_inputField.text.Equals(string.Empty)) { Close(cancelAction: true); return; } D.L("Submitted " + _inputField.text + " to server"); ((Component)Player).GetComponent<SignEmoteText>().UpdateSignText(_inputField.text); float num = 0.5f; if (Player.timeSinceStartingEmote > num) { Player.PerformEmote(default(CallbackContext), 1010); } Close(cancelAction: false); } private void Close(bool cancelAction) { Player.isTypingChat = false; IsSignUIOpen = false; if (cancelAction) { Player.performingEmote = false; Player.StopPerformingEmoteServerRpc(); } if (!Player.quickMenuManager.isMenuOpen) { Cursor.visible = false; Cursor.lockState = (CursorLockMode)1; } Player.disableLookInput = false; ((Component)this).gameObject.SetActive(false); } } public class SyncAnimatorToOthers : NetworkBehaviour { private PlayerControllerB _player; private void Start() { _player = ((Component)this).GetComponent<PlayerControllerB>(); } public void UpdateEmoteIDForOthers(int newID) { if (((NetworkBehaviour)_player).IsOwner && _player.isPlayerControlled) { UpdateCurrentEmoteIDServerRpc(newID); } } [ServerRpc(RequireOwnership = false)] private void UpdateCurrentEmoteIDServerRpc(int newID) { UpdateCurrentEmoteIDClientRpc(newID); } [ClientRpc] private void UpdateCurrentEmoteIDClientRpc(int newID) { if (!((NetworkBehaviour)_player).IsOwner) { _player.playerBodyAnimator.SetInteger("emoteNumber", newID); } } } public class CustomAnimationObjects : MonoBehaviour { private PlayerControllerB _player; private MeshRenderer _sign; private GameObject _signText; private SkinnedMeshRenderer _legs; private void Start() { _player = ((Component)this).GetComponent<PlayerControllerB>(); } private void Update() { //IL_0054: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_sign == (Object)null || (Object)(object)_signText == (Object)null) { FindSign(); return; } ((Component)_sign).transform.localPosition = ((Component)_sign).transform.parent.Find("spine").localPosition; if ((Object)(object)_legs == (Object)null && ((NetworkBehaviour)_player).IsOwner && _player.isPlayerControlled) { FindLegs(); return; } DisableEverything(); if (!_player.performingEmote) { return; } switch (_player.playerBodyAnimator.GetInteger("emoteNumber")) { case 10: case 1010: ((Renderer)_sign).enabled = true; if (!_signText.activeSelf) { _signText.SetActive(true); } if (((NetworkBehaviour)_player).IsOwner) { EmotePatch.LocalArmsSeparatedFromCamera = true; } break; case 9: if ((Object)(object)_legs != (Object)null) { ((Renderer)_legs).enabled = true; } if (((NetworkBehaviour)_player).IsOwner) { EmotePatch.LocalArmsSeparatedFromCamera = true; } break; } } private void DisableEverything() { if ((Object)(object)_legs != (Object)null) { ((Renderer)_legs).enabled = false; } ((Renderer)_sign).enabled = false; if (_signText.activeSelf) { _signText.SetActive(false); } if (((NetworkBehaviour)_player).IsOwner && _player.isPlayerControlled) { EmotePatch.LocalArmsSeparatedFromCamera = false; } } private void FindSign() { _sign = ((Component)((Component)_player).transform.Find("ScavengerModel").Find("metarig").Find("Sign")).GetComponent<MeshRenderer>(); _signText = ((Component)((Component)_sign).transform.Find("Text")).gameObject; } private void FindLegs() { _legs = ((Component)((Component)_player).transform.Find("ScavengerModel").Find("LEGS")).GetComponent<SkinnedMeshRenderer>(); } } }
BepInEx/plugins/Sligili-More_Emotes/MoreEmotes1.3.3.dll
Decompiled 8 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using GameNetcodeStuff; using HarmonyLib; using MoreEmotes.Patch; using MoreEmotes.Scripts; using RuntimeNetcodeRPCValidator; using TMPro; using Tools; using Unity.Netcode; using UnityEngine; using UnityEngine.Animations.Rigging; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.InputSystem.Utilities; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("FuckYouMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("FuckYouMod")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("5ecc2bf2-af12-4e83-a6f1-cf2eacbf3060")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace Tools { public class Ref { public static object GetInstanceField(Type type, object instance, string fieldName) { BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; FieldInfo field = type.GetField(fieldName, bindingAttr); return field.GetValue(instance); } public static object Method(object instance, string methodName, params object[] args) { MethodInfo method = instance.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { return method.Invoke(instance, args); } return null; } } public class D : MonoBehaviour { public static bool Debug; public static void L(string msg) { if (Debug) { Debug.Log((object)msg); } } public static void W(string msg) { if (Debug) { Debug.LogWarning((object)msg); } } } } namespace MoreEmotes { [BepInPlugin("MoreEmotes", "MoreEmotes-Sligili", "1.3.3")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class MoreEmotesInitialization : BaseUnityPlugin { private Harmony _harmony; private NetcodeValidator netcodeValidator; private ConfigEntry<string> config_KeyWheel; private ConfigEntry<string> config_KeyWheel_c; private ConfigEntry<bool> config_InventoryCheck; private ConfigEntry<bool> config_UseConfigFile; private ConfigEntry<string> config_KeyEmote3; private ConfigEntry<string> config_KeyEmote4; private ConfigEntry<string> config_KeyEmote5; private ConfigEntry<string> config_KeyEmote6; private ConfigEntry<string> config_KeyEmote7; private ConfigEntry<string> config_KeyEmote8; private ConfigEntry<string> config_KeyEmote9; private ConfigEntry<string> config_KeyEmote10; private void Awake() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown ((BaseUnityPlugin)this).Logger.LogInfo((object)"MoreEmotes loaded"); LoadAssetBundles(); LoadAssets(); ConfigFile(); SearchForIncompatibleMods(); _harmony = new Harmony("MoreEmotes"); _harmony.PatchAll(typeof(EmotePatch)); netcodeValidator = new NetcodeValidator("MoreEmotes"); netcodeValidator.PatchAll(); netcodeValidator.BindToPreExistingObjectByBehaviour<SignEmoteText, PlayerControllerB>(); netcodeValidator.BindToPreExistingObjectByBehaviour<SyncAnimatorToOthers, PlayerControllerB>(); } private void LoadAssetBundles() { string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MoreEmotes/animationsbundle"); string text2 = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MoreEmotes/animatorbundle"); try { EmotePatch.AnimationsBundle = AssetBundle.LoadFromFile(text); EmotePatch.AnimatorBundle = AssetBundle.LoadFromFile(text2); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("Failed to load AssetBundles. Make sure \"animatorsbundle\" and \"animationsbundle\" are inside the MoreEmotes folder.\nError: " + ex.Message)); } } private void LoadAssets() { string path = "Assets/MoreEmotes"; EmotePatch.local = EmotePatch.AnimatorBundle.LoadAsset<RuntimeAnimatorController>(Path.Combine(path, "NEWmetarig.controller")); EmotePatch.others = EmotePatch.AnimatorBundle.LoadAsset<RuntimeAnimatorController>(Path.Combine(path, "NEWmetarigOtherPlayers.controller")); MoreEmotesEvents.ClapSounds[0] = EmotePatch.AnimationsBundle.LoadAsset<AudioClip>(Path.Combine(path, "SingleClapEmote1.wav")); MoreEmotesEvents.ClapSounds[1] = EmotePatch.AnimationsBundle.LoadAsset<AudioClip>(Path.Combine(path, "SingleClapEmote2.wav")); EmotePatch.SettingsPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/MoreEmotesPanel.prefab")); EmotePatch.ButtonPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/MoreEmotesButton.prefab")); EmotePatch.LegsPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/plegs.prefab")); EmotePatch.SignPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/Sign.prefab")); EmotePatch.SignUIPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/SignTextUI.prefab")); EmotePatch.WheelPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>("Assets/MoreEmotes/Resources/MoreEmotesMenu.prefab"); } private void ConfigFile() { EmotePatch.ConfigFile_Keybinds = new string[32]; config_KeyWheel = ((BaseUnityPlugin)this).Config.Bind<string>("EMOTE WHEEL", "Key", "v", (ConfigDescription)null); EmotePatch.ConfigFile_WheelKeybind = config_KeyWheel.Value; config_KeyWheel_c = ((BaseUnityPlugin)this).Config.Bind<string>("EMOTE WHEEL (Controller)", "Key", "leftshoulder", (ConfigDescription)null); EmotePatch.ConfigFile_WheelKeybind_controller = config_KeyWheel_c.Value; config_InventoryCheck = ((BaseUnityPlugin)this).Config.Bind<bool>("OTHERS", "InventoryCheck", true, "Prevents some emotes from performing while holding any item/scrap"); EmotePatch.ConfigFile_InventoryCheck = config_InventoryCheck.Value; config_UseConfigFile = ((BaseUnityPlugin)this).Config.Bind<bool>("OTHERS", "ConfigFile", false, "Ignores all in-game saved settings and instead uses the config file"); EmotePatch.UseConfigFile = config_UseConfigFile.Value; config_KeyEmote3 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Middle Finger", "3", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[2] = config_KeyEmote3.Value.Replace(" ", ""); config_KeyEmote4 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "The Griddy", "6", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[5] = config_KeyEmote4.Value.Replace(" ", ""); config_KeyEmote5 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Shy", "5", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[4] = config_KeyEmote5.Value.Replace(" ", ""); config_KeyEmote6 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Clap", "4", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[3] = config_KeyEmote6.Value.Replace(" ", ""); config_KeyEmote7 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Twerk", "7", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[6] = config_KeyEmote7.Value.Replace(" ", ""); config_KeyEmote8 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Salute", "8", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[7] = config_KeyEmote8.Value.Replace(" ", ""); config_KeyEmote9 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Prisyadka", "9", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[8] = config_KeyEmote9.Value.Replace(" ", ""); config_KeyEmote10 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Sign", "0", (ConfigDescription)null); EmotePatch.ConfigFile_Keybinds[9] = config_KeyEmote10.Value.Replace(" ", ""); } private void SearchForIncompatibleMods() { foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos) { BepInPlugin metadata = pluginInfo.Value.Metadata; if (metadata.GUID.Equals("com.malco.lethalcompany.moreshipupgrades", StringComparison.OrdinalIgnoreCase) || metadata.GUID.Equals("Stoneman.LethalProgression", StringComparison.OrdinalIgnoreCase)) { EmotePatch.IncompatibleStuff = true; break; } } } } public static class PluginInfo { public const string GUID = "MoreEmotes"; public const string NAME = "MoreEmotes-Sligili"; public const string VER = "1.3.3"; } } namespace MoreEmotes.Patch { public enum Emotes { D_Sign = 1010, D_Clap = 1004, D_Middle_Finger = 1003, Dance = 1, Point = 2, Middle_Finger = 3, Clap = 4, Shy = 5, The_Griddy = 6, Twerk = 7, Salute = 8, Prisyadka = 9, Sign = 10 } public class EmotePatch { public static AssetBundle AnimationsBundle; public static AssetBundle AnimatorBundle; public static RuntimeAnimatorController local; public static RuntimeAnimatorController others; public static bool UseConfigFile; public static string[] ConfigFile_Keybinds; public static string ConfigFile_WheelKeybind; public static string ConfigFile_WheelKeybind_controller; public static bool ConfigFile_InventoryCheck; public static string EmoteWheelKeyboard; public static string EmoteWheelController; public static bool IncompatibleStuff; private static int s_currentEmoteID = 0; private static float s_defaultPlayerSpeed; private static bool[] s_wasPerformingEmote = new bool[32]; public static bool IsEmoteWheelOpen; private static bool s_isPlayerFirstFrame; private static bool s_isFirstTimeOnMenu; private static bool s_isPlayerSpawning; public const int AlternateEmoteIDOffset = 1000; private static int[] s_doubleEmotesIDS = new int[2] { 3, 4 }; public static bool LocalArmsSeparatedFromCamera; private static Transform s_freeArmsTarget; private static Transform s_lockedArmsTarget; private static CallbackContext emptyContext; public static GameObject ButtonPrefab; public static GameObject SettingsPrefab; public static GameObject LegsPrefab; public static GameObject SignPrefab; public static GameObject SignUIPrefab; public static GameObject WheelPrefab; private static GameObject s_localPlayerLevelBadge; private static GameObject s_localPlayerBetaBadge; private static Transform s_legsMesh; private static EmoteWheel s_selectionWheel; private static SignUI s_customSignInputField; private static SyncAnimatorToOthers s_syncAnimator; private static int _AlternateEmoteIDOffset => 1000; private static void InstantiateSettingsMenu(Transform container) { RebindButton.ConfigFile_Keybinds = ConfigFile_Keybinds; if (!PlayerPrefs.HasKey("InvCheck") || UseConfigFile) { PlayerPrefs.SetInt("InvCheck", ConfigFile_InventoryCheck ? 1 : 0); } ToggleButton.s_InventoryCheck = (UseConfigFile ? ConfigFile_InventoryCheck : (PlayerPrefs.GetInt("InvCheck") == 1)); SetupUI.UseConfigFile = UseConfigFile; SetupUI.InventoryCheck = ToggleButton.s_InventoryCheck; GameObject gameObject = ((Component)((Component)container).transform.Find("SettingsPanel")).gameObject; Object.Instantiate<GameObject>(ButtonPrefab, gameObject.transform).transform.SetSiblingIndex(7); Object.Instantiate<GameObject>(SettingsPrefab, gameObject.transform); gameObject.AddComponent<SetupUI>(); } private static void CheckEmoteInput(string keyBind, bool needsEmptyHands, int emoteID, PlayerControllerB player) { //IL_00b0: Unknown result type (might be due to invalid IL or missing references) Emotes emotes = (Emotes)emoteID; string text = emotes.ToString(); bool flag; if (UseConfigFile) { flag = ConfigFile_InventoryCheck; keyBind = ConfigFile_Keybinds[emoteID - 1]; } else { flag = PlayerPrefs.GetInt("InvCheck") == 1; if (PlayerPrefs.HasKey(text)) { keyBind = PlayerPrefs.GetString(text); } else { PlayerPrefs.SetString(text, keyBind); } } if (!keyBind.Equals(string.Empty) && InputControlExtensions.IsPressed(((InputControl)Keyboard.current)[keyBind], 0f) && (!player.isHoldingObject || !needsEmptyHands || !flag)) { player.PerformEmote(emptyContext, emoteID); } } private static void CheckWheelInput(string keybind, string controller, PlayerControllerB player) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) bool flag = false; bool flag2 = false; if (Gamepad.all.Count != 0 && !controller.Equals(string.Empty)) { flag = InputControlExtensions.IsPressed(((InputControl)Gamepad.current)[controller], 0f); } if (keybind != string.Empty) { flag2 = InputControlExtensions.IsPressed(((InputControl)Keyboard.current)[keybind], 0f) && !((ButtonControl)Keyboard.current[(Key)55]).wasPressedThisFrame; } bool flag3 = flag || flag2; if (flag3 && !IsEmoteWheelOpen && !player.isPlayerDead && !player.inTerminalMenu && !player.quickMenuManager.isMenuOpen && !player.isTypingChat && !s_customSignInputField.IsSignUIOpen) { IsEmoteWheelOpen = true; Cursor.visible = true; Cursor.lockState = (CursorLockMode)2; ((Component)s_selectionWheel).gameObject.SetActive(IsEmoteWheelOpen); player.disableLookInput = true; } else { if (!IsEmoteWheelOpen || (flag3 && !player.quickMenuManager.isMenuOpen && !player.isTypingChat && !s_customSignInputField.IsSignUIOpen)) { return; } int selectedEmoteID = s_selectionWheel.SelectedEmoteID; if (!player.quickMenuManager.isMenuOpen && !s_customSignInputField.IsSignUIOpen) { Cursor.visible = false; Cursor.lockState = (CursorLockMode)1; } if (!player.isPlayerDead && !player.quickMenuManager.isMenuOpen) { if (selectedEmoteID <= 3 || selectedEmoteID == 6 || !ConfigFile_InventoryCheck) { player.PerformEmote(emptyContext, selectedEmoteID); } else if (!player.isHoldingObject) { player.PerformEmote(emptyContext, selectedEmoteID); } } if (!s_customSignInputField.IsSignUIOpen) { player.disableLookInput = false; } IsEmoteWheelOpen = false; ((Component)s_selectionWheel).gameObject.SetActive(IsEmoteWheelOpen); } } private static void OnFirstLocalPlayerFrameWithNewAnimator(PlayerControllerB player) { s_isPlayerFirstFrame = false; TurnControllerIntoAnOverrideController(player.playerBodyAnimator.runtimeAnimatorController); s_syncAnimator = ((Component)player).GetComponent<SyncAnimatorToOthers>(); s_customSignInputField.Player = player; s_freeArmsTarget = Object.Instantiate<Transform>(player.localArmsRotationTarget, player.localArmsRotationTarget.parent.parent); s_lockedArmsTarget = player.localArmsRotationTarget; Transform val = ((Component)player).transform.Find("ScavengerModel").Find("metarig").Find("spine") .Find("spine.001") .Find("spine.002") .Find("spine.003"); s_localPlayerLevelBadge = ((Component)val.Find("LevelSticker")).gameObject; s_localPlayerBetaBadge = ((Component)val.Find("BetaBadge")).gameObject; player.SpawnPlayerAnimation(); } private static void SpawnSign(PlayerControllerB player) { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(SignPrefab, ((Component)((Component)((Component)player).transform.Find("ScavengerModel")).transform.Find("metarig")).transform); val.transform.SetSiblingIndex(6); ((Object)val).name = "Sign"; val.transform.localPosition = new Vector3(0.029f, -0.45f, 1.3217f); val.transform.localRotation = Quaternion.Euler(65.556f, 180f, 180f); } private static void SpawnLegs(PlayerControllerB player) { //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(LegsPrefab, ((Component)((Component)player.playerBodyAnimator).transform.parent).transform); s_legsMesh = val.transform.Find("Mesh"); ((Component)s_legsMesh).transform.parent = ((Component)player.playerBodyAnimator).transform.parent; ((Object)s_legsMesh).name = "LEGS"; GameObject gameObject = ((Component)val.transform.Find("Armature")).gameObject; gameObject.transform.parent = ((Component)player.playerBodyAnimator).transform; ((Object)gameObject).name = "FistPersonLegs"; gameObject.transform.position = new Vector3(0f, 0.197f, 0f); gameObject.transform.localScale = new Vector3(13.99568f, 13.99568f, 13.99568f); Object.Destroy((Object)(object)val); } private static void ResetIKWeights(PlayerControllerB player) { Transform val = ((Component)player.playerBodyAnimator).transform.Find("Rig 1"); ChainIKConstraint component = ((Component)val.Find("RightArm")).GetComponent<ChainIKConstraint>(); ChainIKConstraint component2 = ((Component)val.Find("LeftArm")).GetComponent<ChainIKConstraint>(); TwoBoneIKConstraint component3 = ((Component)val.Find("RightLeg")).GetComponent<TwoBoneIKConstraint>(); TwoBoneIKConstraint component4 = ((Component)val.Find("LeftLeg")).GetComponent<TwoBoneIKConstraint>(); Transform val2 = ((Component)player.playerBodyAnimator).transform.Find("ScavengerModelArmsOnly").Find("metarig").Find("spine.003") .Find("RigArms"); ChainIKConstraint component5 = ((Component)val2.Find("RightArm")).GetComponent<ChainIKConstraint>(); ChainIKConstraint component6 = ((Component)val2.Find("LeftArm")).GetComponent<ChainIKConstraint>(); ((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component).weight = 1f; ((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component2).weight = 1f; ((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component).weight = 1f; ((RigConstraint<TwoBoneIKConstraintJob, TwoBoneIKConstraintData, TwoBoneIKConstraintJobBinder<TwoBoneIKConstraintData>>)(object)component4).weight = 1f; ((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component5).weight = 1f; ((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component6).weight = 1f; } private static void UpdateLegsMaterial(PlayerControllerB player) { ((Renderer)((Component)s_legsMesh).GetComponent<SkinnedMeshRenderer>()).material = ((Renderer)((Component)((Component)((Component)player.playerBodyAnimator).transform.parent).transform.Find("LOD1")).gameObject.GetComponent<SkinnedMeshRenderer>()).material; } private static void TogglePlayerBadges(bool enabled) { if ((Object)(object)s_localPlayerBetaBadge != (Object)null) { ((Renderer)s_localPlayerBetaBadge.GetComponent<MeshRenderer>()).enabled = enabled; } if ((Object)(object)s_localPlayerLevelBadge != (Object)null) { ((Renderer)s_localPlayerLevelBadge.GetComponent<MeshRenderer>()).enabled = enabled; } else { Debug.LogError((object)"[MoreEmotes-Sligili] Couldn't find the level badge"); } } private static bool CheckIfTooManyEmotesIsPlaying(PlayerControllerB player) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) Animator playerBodyAnimator = player.playerBodyAnimator; AnimatorStateInfo currentAnimatorStateInfo = playerBodyAnimator.GetCurrentAnimatorStateInfo(1); return ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Dance1") && player.performingEmote && GetAnimatorEmoteClipName(playerBodyAnimator) != "Dance1"; } private static string GetAnimatorEmoteClipName(Animator animator) { AnimatorClipInfo[] currentAnimatorClipInfo = animator.GetCurrentAnimatorClipInfo(1); return ((Object)((AnimatorClipInfo)(ref currentAnimatorClipInfo[0])).clip).name; } private static void TurnControllerIntoAnOverrideController(RuntimeAnimatorController controller) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown if (!(controller is AnimatorOverrideController)) { controller = (RuntimeAnimatorController)new AnimatorOverrideController(controller); } } public static void UpdateWheelKeybinds() { if (UseConfigFile) { EmoteWheelKeyboard = ConfigFile_WheelKeybind; EmoteWheelController = ConfigFile_WheelKeybind_controller; return; } if (!PlayerPrefs.HasKey("Emote_Wheel_c")) { PlayerPrefs.SetString("Emote_Wheel_c", ConfigFile_WheelKeybind_controller); } EmoteWheelController = PlayerPrefs.GetString("Emote_Wheel_c"); if (!PlayerPrefs.HasKey("Emote_Wheel")) { PlayerPrefs.SetString("Emote_Wheel", ConfigFile_WheelKeybind); } EmoteWheelKeyboard = PlayerPrefs.GetString("Emote_Wheel"); if (!PlayerPrefs.HasKey("InvCheck")) { PlayerPrefs.SetInt("InvCheck", ConfigFile_InventoryCheck ? 1 : 0); } ConfigFile_InventoryCheck = PlayerPrefs.GetInt("InvCheck") == 1; } [HarmonyPatch(typeof(MenuManager), "Start")] [HarmonyPostfix] private static void MenuStart(MenuManager __instance) { D.Debug = true; try { InstantiateSettingsMenu(((Component)((Component)__instance).transform.parent).transform.Find("MenuContainer")); } catch (Exception ex) { if (!s_isFirstTimeOnMenu) { s_isFirstTimeOnMenu = true; } else { Debug.LogError((object)(ex.Message + "\n[MoreEmotes-Sligili] Couldn't find MenuContainer")); } } } [HarmonyPatch(typeof(RoundManager), "Awake")] [HarmonyPostfix] private static void AwakePost(RoundManager __instance) { if (!PlayerPrefs.HasKey("InvCheck")) { PlayerPrefs.SetInt("InvCheck", ConfigFile_InventoryCheck ? 1 : 0); } UpdateWheelKeybinds(); GameObject gameObject = ((Component)((Component)GameObject.Find("Systems").gameObject.transform.Find("UI")).gameObject.transform.Find("Canvas")).gameObject; InstantiateSettingsMenu(gameObject.transform.Find("QuickMenu")); s_selectionWheel = Object.Instantiate<GameObject>(WheelPrefab, gameObject.transform).AddComponent<EmoteWheel>(); s_customSignInputField = Object.Instantiate<GameObject>(SignUIPrefab, gameObject.transform).AddComponent<SignUI>(); EmoteWheel.Keybinds = new string[ConfigFile_Keybinds.Length + 1]; EmoteWheel.Keybinds = ConfigFile_Keybinds; s_isPlayerFirstFrame = true; } [HarmonyPatch(typeof(HUDManager), "EnableChat_performed")] [HarmonyPrefix] private static bool OpenChatPrefix() { if (s_customSignInputField.IsSignUIOpen) { return false; } return true; } [HarmonyPatch(typeof(HUDManager), "SubmitChat_performed")] [HarmonyPrefix] private static bool SubmitChatPrefix() { if (s_customSignInputField.IsSignUIOpen) { return false; } return true; } [HarmonyPatch(typeof(PlayerControllerB), "Start")] [HarmonyPostfix] private static void StartPostfix(PlayerControllerB __instance) { ((Component)((Component)((Component)__instance).gameObject.transform.Find("ScavengerModel")).transform.Find("metarig")).gameObject.AddComponent<MoreEmotesEvents>().Player = __instance; s_defaultPlayerSpeed = __instance.movementSpeed; ((Component)__instance).gameObject.AddComponent<CustomAnimationObjects>(); SpawnSign(__instance); } [HarmonyPatch(typeof(PlayerControllerB), "Update")] [HarmonyPostfix] private static void UpdatePostfix(PlayerControllerB __instance) { if (!__instance.isPlayerControlled || !((NetworkBehaviour)__instance).IsOwner) { __instance.playerBodyAnimator.runtimeAnimatorController = others; TurnControllerIntoAnOverrideController(__instance.playerBodyAnimator.runtimeAnimatorController); return; } if ((Object)(object)__instance.playerBodyAnimator != (Object)(object)local) { if (s_isPlayerFirstFrame) { SpawnLegs(__instance); } __instance.playerBodyAnimator.runtimeAnimatorController = local; if (s_isPlayerFirstFrame) { OnFirstLocalPlayerFrameWithNewAnimator(__instance); } if (s_isPlayerSpawning) { __instance.SpawnPlayerAnimation(); s_isPlayerSpawning = false; } } if (!IncompatibleStuff) { if ((bool)Ref.Method(__instance, "CheckConditionsForEmote") && __instance.performingEmote) { switch (s_currentEmoteID) { case 6: __instance.movementSpeed = s_defaultPlayerSpeed / 2f; break; case 9: __instance.movementSpeed = s_defaultPlayerSpeed / 3f; break; } } else { __instance.movementSpeed = s_defaultPlayerSpeed; } } __instance.localArmsRotationTarget = (LocalArmsSeparatedFromCamera ? (__instance.localArmsRotationTarget = s_freeArmsTarget) : (__instance.localArmsRotationTarget = s_lockedArmsTarget)); CheckWheelInput(EmoteWheelKeyboard, EmoteWheelController, __instance); if (!__instance.quickMenuManager.isMenuOpen && !IsEmoteWheelOpen) { CheckEmoteInput(ConfigFile_Keybinds[2], needsEmptyHands: false, 3, __instance); CheckEmoteInput(ConfigFile_Keybinds[3], needsEmptyHands: true, 4, __instance); CheckEmoteInput(ConfigFile_Keybinds[4], needsEmptyHands: true, 5, __instance); CheckEmoteInput(ConfigFile_Keybinds[5], needsEmptyHands: false, 6, __instance); CheckEmoteInput(ConfigFile_Keybinds[6], needsEmptyHands: true, 7, __instance); CheckEmoteInput(ConfigFile_Keybinds[7], needsEmptyHands: true, 8, __instance); CheckEmoteInput(ConfigFile_Keybinds[8], needsEmptyHands: true, 9, __instance); CheckEmoteInput(ConfigFile_Keybinds[9], needsEmptyHands: true, 10, __instance); } } [HarmonyPatch(typeof(PlayerControllerB), "Update")] [HarmonyPrefix] private static void UpdatePrefix(PlayerControllerB __instance) { if (__instance.performingEmote) { s_wasPerformingEmote[__instance.playerClientId] = true; } if (!__instance.performingEmote && s_wasPerformingEmote[__instance.playerClientId]) { s_wasPerformingEmote[__instance.playerClientId] = false; ResetIKWeights(__instance); } } [HarmonyPatch(typeof(PlayerControllerB), "SpawnPlayerAnimation")] [HarmonyPrefix] private static void OnLocalPlayerSpawn(PlayerControllerB __instance) { if (((NetworkBehaviour)__instance).IsOwner && __instance.isPlayerControlled) { s_isPlayerSpawning = true; } } [HarmonyPatch(typeof(PlayerControllerB), "CheckConditionsForEmote")] [HarmonyPrefix] private static bool CheckConditionsPrefix(ref bool __result, PlayerControllerB __instance) { bool flag = (bool)Ref.GetInstanceField(typeof(PlayerControllerB), __instance, "isJumping"); bool flag2 = (bool)Ref.GetInstanceField(typeof(PlayerControllerB), __instance, "isWalking"); if (s_currentEmoteID == 6 || s_currentEmoteID == 9) { __result = !__instance.inSpecialInteractAnimation && !__instance.isPlayerDead && !flag && __instance.moveInputVector.x == 0f && !__instance.isSprinting && !__instance.isCrouching && !__instance.isClimbingLadder && !__instance.isGrabbingObjectAnimation && !__instance.inTerminalMenu && !__instance.isTypingChat; return false; } if (s_currentEmoteID == 10 || s_currentEmoteID == 1010) { __result = !__instance.inSpecialInteractAnimation && !__instance.isPlayerDead && !flag && !flag2 && !__instance.isCrouching && !__instance.isClimbingLadder && !__instance.isGrabbingObjectAnimation && !__instance.inTerminalMenu; return false; } return true; } [HarmonyPatch(typeof(PlayerControllerB), "PerformEmote")] [HarmonyPrefix] private static bool PerformEmotePrefix(CallbackContext context, int emoteID, PlayerControllerB __instance) { if ((emoteID < 0 || CheckIfTooManyEmotesIsPlaying(__instance)) && emoteID > 2) { return false; } if ((!((NetworkBehaviour)__instance).IsOwner || !__instance.isPlayerControlled || (((NetworkBehaviour)__instance).IsServer && !__instance.isHostPlayerObject)) && !__instance.isTestingPlayer) { return false; } if (s_customSignInputField.IsSignUIOpen && emoteID != 1010) { return false; } if (emoteID > 0 && emoteID < 3 && !IsEmoteWheelOpen && !((CallbackContext)(ref context)).performed) { return false; } int[] array = s_doubleEmotesIDS; foreach (int num in array) { int num2 = num + _AlternateEmoteIDOffset; bool flag = (UseConfigFile ? ConfigFile_InventoryCheck : (PlayerPrefs.GetInt("InvCheck") == 1)); if (emoteID == num && s_currentEmoteID == emoteID && __instance.performingEmote && (!__instance.isHoldingObject || !flag)) { if (emoteID == num) { emoteID += _AlternateEmoteIDOffset; } else { emoteID -= 1000; } } } if ((s_currentEmoteID != emoteID && emoteID < 3) || !__instance.performingEmote) { ResetIKWeights(__instance); } if (!(bool)Ref.Method(__instance, "CheckConditionsForEmote")) { return false; } if (__instance.timeSinceStartingEmote < 0.5f) { return false; } s_currentEmoteID = emoteID; Action action = delegate { __instance.timeSinceStartingEmote = 0f; __instance.playerBodyAnimator.SetInteger("emoteNumber", emoteID); __instance.performingEmote = true; __instance.StartPerformingEmoteServerRpc(); s_syncAnimator.UpdateEmoteIDForOthers(emoteID); TogglePlayerBadges(enabled: false); }; switch (emoteID) { case 9: action = (Action)Delegate.Combine(action, (Action)delegate { UpdateLegsMaterial(__instance); }); break; case 10: action = (Action)Delegate.Combine(action, (Action)delegate { ((Component)s_customSignInputField).gameObject.SetActive(true); }); break; } action(); return false; } [HarmonyPatch(typeof(PlayerControllerB), "StopPerformingEmoteServerRpc")] [HarmonyPostfix] private static void StopPerformingEmoteServerPrefix(PlayerControllerB __instance) { if (((NetworkBehaviour)__instance).IsOwner && __instance.isPlayerControlled) { __instance.playerBodyAnimator.SetInteger("emoteNumber", 0); } TogglePlayerBadges(enabled: true); s_syncAnimator.UpdateEmoteIDForOthers(0); s_currentEmoteID = 0; } } } namespace MoreEmotes.Scripts { public class MoreEmotesEvents : MonoBehaviour { private Animator _playerAnimator; private AudioSource _playerAudioSource; public static AudioClip[] ClapSounds = (AudioClip[])(object)new AudioClip[2]; public PlayerControllerB Player; private void Start() { _playerAnimator = ((Component)this).GetComponent<Animator>(); _playerAudioSource = Player.movementAudio; } public void PlayClapSound() { //IL_007d: Unknown result type (might be due to invalid IL or missing references) if (Player.performingEmote) { int currentEmoteID = GetCurrentEmoteID(); if (!((NetworkBehaviour)Player).IsOwner || !Player.isPlayerControlled || currentEmoteID == 4) { bool flag = Player.isInHangarShipRoom && Player.playersManager.hangarDoorsClosed; RoundManager.Instance.PlayAudibleNoise(((Component)Player).transform.position, 22f, 0.6f, 0, flag, 6); _playerAudioSource.pitch = Random.Range(0.59f, 0.79f); _playerAudioSource.PlayOneShot(ClapSounds[Random.Range(0, ClapSounds.Length)]); } } } public void PlayFootstepSound() { if (Player.performingEmote) { int currentEmoteID = GetCurrentEmoteID(); if ((!((NetworkBehaviour)Player).IsOwner || !Player.isPlayerControlled || currentEmoteID == 6 || currentEmoteID == 8 || currentEmoteID == 9) && ((Vector2)(ref Player.moveInputVector)).sqrMagnitude == 0f) { Player.PlayFootstepLocal(); Player.PlayFootstepServer(); } } } private int GetCurrentEmoteID() { int num = _playerAnimator.GetInteger("emoteNumber"); if (num >= 1000) { num -= 1000; } return num; } } public class SignEmoteText : NetworkBehaviour { private PlayerControllerB _playerInstance; private TextMeshPro _signModelText; public string Text => ((TMP_Text)_signModelText).text; private void Start() { _playerInstance = ((Component)this).GetComponent<PlayerControllerB>(); _signModelText = ((Component)((Component)_playerInstance).transform.Find("ScavengerModel").Find("metarig").Find("Sign") .Find("Text")).GetComponent<TextMeshPro>(); } public void UpdateSignText(string newText) { if (((NetworkBehaviour)_playerInstance).IsOwner && _playerInstance.isPlayerControlled) { UpdateSignTextServerRpc(newText); } } [ServerRpc(RequireOwnership = false)] private void UpdateSignTextServerRpc(string newText) { UpdateSignTextClientRpc(newText); } [ClientRpc] private void UpdateSignTextClientRpc(string newText) { ((TMP_Text)_signModelText).text = newText; } } public class EmoteWheel : MonoBehaviour { private RectTransform _graphics_selectedBlock; private RectTransform _graphics_selectionArrow; private Text _graphics_emoteInformation; private Text _graphics_pageInformation; private int _blocksNumber = 8; private int _selectedBlock = 1; private float _changePageCooldown = 0.1f; private float _selectionArrowLerpSpeed = 30f; private float _angle; private GameObject[] _pages; public float WheelMovementDeadzone = 3.3f; public float WheelMovementDeadzoneController = 0.7f; public static string[] Keybinds; private Vector2 _wheelCenter; private Vector2 _lastMouseCoords; public int SelectedPageNumber { get; private set; } public int SelectedEmoteID { get; private set; } public bool IsUsingController { get; private set; } private void Awake() { GetVanillaKeybinds(); FindGraphics(); FindPages(((Component)this).gameObject.transform.Find("FunctionalContent")); UpdatePageInfo(); } private void OnEnable() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) _wheelCenter = new Vector2((float)(Screen.width / 2), (float)(Screen.height / 2)); Mouse.current.WarpCursorPosition(_wheelCenter); } private void GetVanillaKeybinds() { PlayerInput component = GameObject.Find("PlayerSettingsObject").GetComponent<PlayerInput>(); if ((Object)(object)component == (Object)null) { Debug.LogError((object)" MoreEmotes: PlayerSettingsObject is null"); return; } Keybinds[0] = InputActionRebindingExtensions.GetBindingDisplayString(component.currentActionMap.FindAction("Emote1", false), 0, (DisplayStringOptions)0); Keybinds[1] = InputActionRebindingExtensions.GetBindingDisplayString(component.currentActionMap.FindAction("Emote2", false), 0, (DisplayStringOptions)0); } private void FindGraphics() { _graphics_selectionArrow = ((Component)((Component)((Component)this).gameObject.transform.Find("Graphics")).gameObject.transform.Find("SelectionArrow")).gameObject.GetComponent<RectTransform>(); _graphics_selectedBlock = ((Component)((Component)this).gameObject.transform.Find("SelectedEmote")).gameObject.GetComponent<RectTransform>(); _graphics_emoteInformation = ((Component)((Component)((Component)this).gameObject.transform.Find("Graphics")).gameObject.transform.Find("EmoteInfo")).GetComponent<Text>(); _graphics_pageInformation = ((Component)((Component)((Component)this).gameObject.transform.Find("Graphics")).gameObject.transform.Find("PageNumber")).GetComponent<Text>(); } private void FindPages(Transform contentParent) { _pages = (GameObject[])(object)new GameObject[((Component)contentParent).transform.childCount]; _graphics_pageInformation.text = "< Page " + (SelectedPageNumber + 1) + "/" + _pages.Length + " >"; for (int i = 0; i < ((Component)contentParent).transform.childCount; i++) { _pages[i] = ((Component)((Component)contentParent).transform.GetChild(i)).gameObject; } } private void Update() { ControllerInput(); if (!IsUsingController) { MouseInput(); } Cursor.visible = !IsUsingController; UpdateSelectionArrow(); PageSelection(); SelectedEmoteID = _selectedBlock + Mathf.RoundToInt((float)(_blocksNumber / 4)) + _blocksNumber * SelectedPageNumber; UpdateEmoteInfo(); } private unsafe void ControllerInput() { //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) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_0082: 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) if (Gamepad.all.Count == 0) { IsUsingController = false; return; } float num = ((InputControl<float>)(object)((Vector2Control)Gamepad.current.rightStick).x).ReadUnprocessedValue(); float num2 = ((InputControl<float>)(object)((Vector2Control)Gamepad.current.rightStick).y).ReadUnprocessedValue(); if (Mathf.Abs(num) < WheelMovementDeadzoneController && Mathf.Abs(num2) < WheelMovementDeadzoneController) { if (System.Runtime.CompilerServices.Unsafe.Read<Vector2>((void*)((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).value) != _lastMouseCoords) { IsUsingController = false; } } else { IsUsingController = true; _lastMouseCoords = System.Runtime.CompilerServices.Unsafe.Read<Vector2>((void*)((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).value); WheelSelection(Vector2.zero, num, num2); } } private void MouseInput() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) if (!(Vector2.Distance(_wheelCenter, ((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).ReadValue()) < WheelMovementDeadzone)) { WheelSelection(_wheelCenter, ((InputControl<float>)(object)((Pointer)Mouse.current).position.x).ReadValue(), ((InputControl<float>)(object)((Pointer)Mouse.current).position.y).ReadValue()); } } private void WheelSelection(Vector2 origin, float xAxisValue, float yAxisValue) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) bool flag = xAxisValue > origin.x; bool flag2 = yAxisValue > origin.y; int num = ((!flag) ? (flag2 ? 2 : 3) : (flag2 ? 1 : 4)); float num2 = (yAxisValue - origin.y) / (xAxisValue - origin.x); float num3 = 180 * (num - ((num <= 2) ? 1 : 2)); _angle = Mathf.Atan(num2) * (180f / (float)Math.PI) + num3; if (_angle == 90f) { _angle = 270f; } else if (_angle == 270f) { _angle = 90f; } float num4 = 360 / _blocksNumber; _selectedBlock = Mathf.RoundToInt((_angle - num4 * 1.5f) / num4); ((Transform)_graphics_selectedBlock).localRotation = Quaternion.Euler(((Component)this).transform.rotation.z, ((Component)this).transform.rotation.y, num4 * (float)_selectedBlock); } private void PageSelection() { UpdatePageInfo(); if (_changePageCooldown > 0f) { _changePageCooldown -= Time.deltaTime; return; } int num; if (IsUsingController) { if (!Gamepad.current.dpad.left.isPressed && !Gamepad.current.dpad.right.isPressed) { return; } num = (Gamepad.current.dpad.left.isPressed ? 1 : (-1)); } else { if (((InputControl<float>)(object)((Vector2Control)Mouse.current.scroll).y).ReadValue() == 0f) { return; } num = ((((InputControl<float>)(object)((Vector2Control)Mouse.current.scroll).y).ReadValue() > 0f) ? 1 : (-1)); } GameObject[] pages = _pages; foreach (GameObject val in pages) { val.SetActive(false); } SelectedPageNumber = (SelectedPageNumber + num + _pages.Length) % _pages.Length; _pages[SelectedPageNumber].SetActive(true); _changePageCooldown = ((!IsUsingController) ? 0.1f : 0.3f); } private void UpdatePageInfo() { _graphics_pageInformation.text = $"<color=#fe6b02><</color> Page {SelectedPageNumber + 1}/{_pages.Length} <color=#fe6b02>></color>"; } private void UpdateEmoteInfo() { string text = ((SelectedEmoteID > Keybinds.Length) ? "" : Keybinds[SelectedEmoteID - 1]); int num = 0; foreach (Emotes value in Enum.GetValues(typeof(Emotes))) { if (value >= Emotes.Dance && value < (Emotes)64) { num++; } } string text2 = ((SelectedEmoteID > num) ? "EMPTY" : ((Emotes)SelectedEmoteID).ToString().Replace("_", " ")); if (SelectedEmoteID > 2 && SelectedEmoteID <= Keybinds.Length) { if (!PlayerPrefs.HasKey(text2.Replace(" ", "_"))) { PlayerPrefs.SetString(text2.Replace(" ", "_"), (SelectedEmoteID > Keybinds.Length) ? "" : Keybinds[SelectedEmoteID - 1]); } else { text = PlayerPrefs.GetString(text2.Replace(" ", "_")); } } text = "<size=120>[" + text + "]</size>"; _graphics_emoteInformation.text = text2 + "\n" + text.ToUpper(); } private void UpdateSelectionArrow() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) float num = 360 / _blocksNumber; Quaternion val = Quaternion.Euler(0f, 0f, _angle - num * 2f); ((Transform)_graphics_selectionArrow).localRotation = Quaternion.Lerp(((Transform)_graphics_selectionArrow).localRotation, val, Time.deltaTime * _selectionArrowLerpSpeed); } } public class RebindButton : MonoBehaviour { public static string[] ConfigFile_Keybinds; private string _defaultKey; private string _playerPrefsString; private Transform _waitingForInput; private Text _keyInfo; public bool IsControllerButton { get; private set; } = false; private void Start() { //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Expected O, but got Unknown string text = ((Component)((Component)this).gameObject.transform.Find("Description")).GetComponent<Text>().text; IsControllerButton = GetControllerFlag(); _playerPrefsString = ((Component)((Component)this).gameObject.transform.Find("Description")).GetComponent<Text>().text.Replace(" ", "_") + (IsControllerButton ? "_c" : ""); _defaultKey = GetDefaultKey(text); FindComponents(); ((UnityEvent)((Component)this).GetComponent<Button>().onClick).AddListener(new UnityAction(GetKey)); if (!PlayerPrefs.HasKey(_playerPrefsString)) { PlayerPrefs.SetString(_playerPrefsString, _defaultKey); } SetKeybind(PlayerPrefs.GetString(_playerPrefsString)); } private string GetDefaultKey(string emoteName) { if (Enum.TryParse<Emotes>(emoteName.Replace(" ", "_"), out var result)) { return ConfigFile_Keybinds[(int)(result - 1)]; } return IsControllerButton ? "leftshoulder" : "V"; } private bool GetControllerFlag() { Transform val = ((Component)this).gameObject.transform.Find("Description").Find("Subtext"); if ((Object)(object)val == (Object)null) { return false; } Text val2 = default(Text); if (((Component)val).TryGetComponent<Text>(ref val2)) { return val2.text.Equals("(Controller)", StringComparison.OrdinalIgnoreCase); } return false; } private void FindComponents() { ((Component)((Component)((Component)this).transform.parent).transform.Find("Delete")).gameObject.AddComponent<DeleteButton>(); _keyInfo = ((Component)((Component)this).transform.Find("InputText")).GetComponent<Text>(); _waitingForInput = ((Component)this).transform.Find("wait"); } public void SetKeybind(string key) { List<string> list = new List<string> { "up", "down", "left", "right" }; if (list.Contains(key.ToLower()) && key.Length < 5) { key = "dpad/" + key; } PlayerPrefs.SetString(_playerPrefsString, key); _keyInfo.text = key.ToUpper(); ((MonoBehaviour)this).StopAllCoroutines(); ((Component)_waitingForInput).gameObject.SetActive(false); } private void GetKey() { ((Component)_waitingForInput).gameObject.SetActive(true); ((MonoBehaviour)this).StartCoroutine(WaitForKey(delegate(string key) { SetKeybind(key); })); } private IEnumerator WaitForKey(Action<string> callback) { while (!((ButtonControl)Keyboard.current.anyKey).wasPressedThisFrame || (!((InputDevice)Gamepad.current).wasUpdatedThisFrame && !InputControlExtensions.IsActuated((InputControl)(object)Gamepad.current.leftStick, 0f) && !InputControlExtensions.IsActuated((InputControl)(object)Gamepad.current.rightStick, 0f))) { yield return (object)new WaitForEndOfFrame(); Observable.CallOnce<InputControl>(InputSystem.onAnyButtonPress, (Action<InputControl>)delegate(InputControl ctrl) { callback(((ctrl.device == Gamepad.current && IsControllerButton) || (ctrl.device == Keyboard.current && !IsControllerButton)) ? ctrl.name : _defaultKey); }); } } } public class DeleteButton : MonoBehaviour { private void Start() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown RebindButton _rebindButton = ((Component)((Component)((Component)this).transform.parent).transform.Find("Button")).GetComponent<RebindButton>(); ((UnityEvent)((Component)this).GetComponent<Button>().onClick).AddListener((UnityAction)delegate { _rebindButton.SetKeybind(string.Empty); }); } } public class ToggleButton : MonoBehaviour { private Toggle _toggle; public static bool s_InventoryCheck; public string PlayerPrefsString; private void Start() { _toggle = ((Component)this).GetComponent<Toggle>(); _toggle.isOn = s_InventoryCheck; ((UnityEvent<bool>)(object)_toggle.onValueChanged).AddListener((UnityAction<bool>)SetNewValue); if (!PlayerPrefs.HasKey(PlayerPrefsString)) { SetNewValue(s_InventoryCheck); } } public void SetNewValue(bool arg) { PlayerPrefs.SetInt(PlayerPrefsString, arg ? 1 : 0); } } public class EnableDisableButton : MonoBehaviour { public GameObject[] ToAlternateUI = (GameObject[])(object)new GameObject[1]; private void Start() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown ((UnityEvent)((Component)this).GetComponent<Button>().onClick).AddListener((UnityAction)delegate { GameObject[] toAlternateUI = ToAlternateUI; foreach (GameObject val in toAlternateUI) { val.SetActive((!val.activeInHierarchy) ? true : false); } }); if (((Object)((Component)this).gameObject).name.Equals("BackButton", StringComparison.OrdinalIgnoreCase)) { ToAlternateUI[0] = ((Component)((Component)this).transform.parent).gameObject; } if (((Object)((Component)this).gameObject).name.Equals("MoreEmotesButton(Clone)", StringComparison.OrdinalIgnoreCase)) { ToAlternateUI[0] = ((Component)((Component)((Component)this).transform.parent).gameObject.transform.Find("MoreEmotesPanel(Clone)")).gameObject; } } } public class SetupUI : MonoBehaviour { public static bool UseConfigFile; public static bool InventoryCheck; private void Awake() { Transform settingsUIPanel = ((Component)this).transform.Find("MoreEmotesPanel(Clone)"); ((Component)settingsUIPanel.Find("Version")).GetComponent<Text>().text = "1.3.3 - Sligili"; SetupOpenSettingsButton(); SetupBackButton(); SetupRebindButtons(((Component)settingsUIPanel).transform.Find("KeybindButtons")); SetupRebindButtons(((Component)((Component)((Component)settingsUIPanel).transform.Find("Scroll View")).transform.Find("Viewport")).transform.Find("Content")); SetupInventoryCheckToggle(); SetupUseConfigFileToggle(); void SetupBackButton() { ((Component)((Component)settingsUIPanel).transform.Find("BackButton")).gameObject.AddComponent<EnableDisableButton>(); } void SetupInventoryCheckToggle() { ((Component)((Component)settingsUIPanel).transform.Find("Inv")).gameObject.AddComponent<ToggleButton>().PlayerPrefsString = "InvCheck"; } void SetupOpenSettingsButton() { ((Component)((Component)this).transform.Find("MoreEmotesButton(Clone)")).gameObject.AddComponent<EnableDisableButton>(); } static void SetupRebindButtons(Transform ButtonsParent) { Transform[] array = (Transform[])(object)new Transform[ButtonsParent.childCount]; for (int i = 0; i < array.Length; i++) { array[i] = ButtonsParent.GetChild(i); } Transform[] array2 = array; foreach (Transform val in array2) { ((Component)val.Find("Button")).gameObject.AddComponent<RebindButton>(); } } void SetupUseConfigFileToggle() { ((Component)((Component)settingsUIPanel).transform.Find("cfg")).gameObject.GetComponent<Toggle>().isOn = UseConfigFile; } } private void Update() { EmotePatch.UpdateWheelKeybinds(); } } public class SignUI : MonoBehaviour { public PlayerControllerB Player; private TMP_InputField _inputField; private Text _charactersLeftText; private TMP_Text _previewText; private Button _submitButton; private Button _cancelButton; public bool IsSignUIOpen; private void Awake() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown FindComponents(); ((UnityEvent)_submitButton.onClick).AddListener(new UnityAction(SubmitText)); ((UnityEvent)_cancelButton.onClick).AddListener((UnityAction)delegate { Close(cancelAction: true); }); ((UnityEvent<string>)(object)_inputField.onValueChanged).AddListener((UnityAction<string>)delegate(string fieldText) { UpdatePreviewText(fieldText); UpdateCharactersLeftText(); }); } private void OnEnable() { Player.isTypingChat = true; IsSignUIOpen = true; ((Selectable)_inputField).Select(); _inputField.text = string.Empty; _previewText.text = "PREVIEW"; Player.disableLookInput = true; } private void Update() { //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) Cursor.visible = true; Cursor.lockState = (CursorLockMode)2; if (!Player.performingEmote) { Close(cancelAction: true); } if (((ButtonControl)Keyboard.current[(Key)2]).wasPressedThisFrame && !((ButtonControl)Keyboard.current[(Key)51]).isPressed) { SubmitText(); } if (Player.quickMenuManager.isMenuOpen || EmotePatch.IsEmoteWheelOpen || InputControlExtensions.IsPressed(((InputControl)Mouse.current)["rightButton"], 0f)) { Close(cancelAction: true); } if (Gamepad.all.Count != 0) { if (Gamepad.current.buttonWest.isPressed || Gamepad.current.startButton.isPressed) { SubmitText(); } if (Gamepad.current.buttonEast.isPressed || Gamepad.current.selectButton.isPressed) { Close(cancelAction: true); } } } private void FindComponents() { _inputField = ((Component)((Component)this).transform.Find("InputField")).GetComponent<TMP_InputField>(); _charactersLeftText = ((Component)((Component)this).transform.Find("CharsLeft")).GetComponent<Text>(); _submitButton = ((Component)((Component)this).transform.Find("Submit")).GetComponent<Button>(); _cancelButton = ((Component)((Component)this).transform.Find("Cancel")).GetComponent<Button>(); _previewText = ((Component)((Component)((Component)this).transform.Find("Sign")).transform.Find("Text")).GetComponent<TMP_Text>(); } private void UpdateCharactersLeftText() { _charactersLeftText.text = $"CHARACTERS LEFT: <color=yellow>{_inputField.characterLimit - _inputField.text.Length}</color>"; } private void UpdatePreviewText(string text) { _previewText.text = text; } private void SubmitText() { //IL_007c: 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) if (_inputField.text.Equals(string.Empty)) { Close(cancelAction: true); return; } D.L("Submitted " + _inputField.text + " to server"); ((Component)Player).GetComponent<SignEmoteText>().UpdateSignText(_inputField.text); float num = 0.5f; if (Player.timeSinceStartingEmote > num) { Player.PerformEmote(default(CallbackContext), 1010); } Close(cancelAction: false); } private void Close(bool cancelAction) { Player.isTypingChat = false; IsSignUIOpen = false; if (cancelAction) { Player.performingEmote = false; Player.StopPerformingEmoteServerRpc(); } if (!Player.quickMenuManager.isMenuOpen) { Cursor.visible = false; Cursor.lockState = (CursorLockMode)1; } Player.disableLookInput = false; ((Component)this).gameObject.SetActive(false); } } public class SyncAnimatorToOthers : NetworkBehaviour { private PlayerControllerB _player; private void Start() { _player = ((Component)this).GetComponent<PlayerControllerB>(); } public void UpdateEmoteIDForOthers(int newID) { if (((NetworkBehaviour)_player).IsOwner && _player.isPlayerControlled) { UpdateCurrentEmoteIDServerRpc(newID); } } [ServerRpc(RequireOwnership = false)] private void UpdateCurrentEmoteIDServerRpc(int newID) { UpdateCurrentEmoteIDClientRpc(newID); } [ClientRpc] private void UpdateCurrentEmoteIDClientRpc(int newID) { if (!((NetworkBehaviour)_player).IsOwner) { _player.playerBodyAnimator.SetInteger("emoteNumber", newID); } } } public class CustomAnimationObjects : MonoBehaviour { private PlayerControllerB _player; private MeshRenderer _sign; private GameObject _signText; private SkinnedMeshRenderer _legs; private void Start() { _player = ((Component)this).GetComponent<PlayerControllerB>(); } private void Update() { //IL_0054: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_sign == (Object)null || (Object)(object)_signText == (Object)null) { FindSign(); return; } ((Component)_sign).transform.localPosition = ((Component)_sign).transform.parent.Find("spine").localPosition; if ((Object)(object)_legs == (Object)null && ((NetworkBehaviour)_player).IsOwner && _player.isPlayerControlled) { FindLegs(); return; } DisableEverything(); if (!_player.performingEmote) { return; } switch (_player.playerBodyAnimator.GetInteger("emoteNumber")) { case 10: case 1010: ((Renderer)_sign).enabled = true; if (!_signText.activeSelf) { _signText.SetActive(true); } if (((NetworkBehaviour)_player).IsOwner) { EmotePatch.LocalArmsSeparatedFromCamera = true; } break; case 9: if ((Object)(object)_legs != (Object)null) { ((Renderer)_legs).enabled = true; } if (((NetworkBehaviour)_player).IsOwner) { EmotePatch.LocalArmsSeparatedFromCamera = true; } break; } } private void DisableEverything() { if ((Object)(object)_legs != (Object)null) { ((Renderer)_legs).enabled = false; } ((Renderer)_sign).enabled = false; if (_signText.activeSelf) { _signText.SetActive(false); } if (((NetworkBehaviour)_player).IsOwner && _player.isPlayerControlled) { EmotePatch.LocalArmsSeparatedFromCamera = false; } } private void FindSign() { _sign = ((Component)((Component)_player).transform.Find("ScavengerModel").Find("metarig").Find("Sign")).GetComponent<MeshRenderer>(); _signText = ((Component)((Component)_sign).transform.Find("Text")).gameObject; } private void FindLegs() { _legs = ((Component)((Component)_player).transform.Find("ScavengerModel").Find("LEGS")).GetComponent<SkinnedMeshRenderer>(); } } }
BepInEx/plugins/tinyhoot-ShipLoot/ShipLoot/ShipLoot.dll
Decompiled 8 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using TMPro; using UnityEngine; using UnityEngine.InputSystem; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("ShipLoot")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyProduct("ShipLoot")] [assembly: AssemblyCopyright("Copyright © tinyhoot 2023")] [assembly: ComVisible(false)] [assembly: AssemblyFileVersion("1.1")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.0.0")] [module: UnverifiableCode] namespace ShipLoot { [BepInPlugin("com.github.tinyhoot.ShipLoot", "ShipLoot", "1.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] internal class ShipLoot : BaseUnityPlugin { public const string GUID = "com.github.tinyhoot.ShipLoot"; public const string NAME = "ShipLoot"; public const string VERSION = "1.1"; internal static ShipLootConfig Config; internal static ManualLogSource Log; private void Awake() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; Config = new ShipLootConfig(((BaseUnityPlugin)this).Config); Config.RegisterOptions(); new Harmony("com.github.tinyhoot.ShipLoot").PatchAll(Assembly.GetExecutingAssembly()); } private void Start() { SetLobbyCompatibility(); } private void SetLobbyCompatibility() { if (!Chainloader.PluginInfos.ContainsKey("BMX.LobbyCompatibility")) { return; } MethodInfo methodInfo = AccessTools.Method("LobbyCompatibility.Features.PluginHelper:RegisterPlugin", (Type[])null, (Type[])null); if ((object)methodInfo == null) { Log.LogWarning((object)"Found LobbyCompatibility mod but failed to find plugin register API method!"); return; } Log.LogDebug((object)"Registering compatibility with LobbyCompatibility."); try { methodInfo.Invoke(null, new object[4] { "com.github.tinyhoot.ShipLoot", new Version("1.1"), 0, 0 }); } catch (Exception arg) { Log.LogError((object)$"Failed to register plugin compatibility with LobbyCompatibility.\n{arg}"); return; } Log.LogDebug((object)"Successfully registered with LobbyCompatibility."); } } internal class ShipLootConfig { private readonly ConfigFile _configFile; public ConfigEntry<float> DisplayTime; public ShipLootConfig(ConfigFile configFile) { _configFile = configFile; } public void RegisterOptions() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown DisplayTime = _configFile.Bind<float>("General", "DisplayTime", 5f, new ConfigDescription("How long to display the total scrap value for, counted in seconds.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 30f), Array.Empty<object>())); } } } namespace ShipLoot.Patches { [HarmonyPatch] internal class HudManagerPatcher { private static GameObject _ship; private static GameObject _totalCounter; private static TextMeshProUGUI _textMesh; private static float _displayTimeLeft; [HarmonyPrefix] [HarmonyPatch(typeof(HUDManager), "PingScan_performed")] private static void OnScan(HUDManager __instance, CallbackContext context) { if (!((Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null) && ((CallbackContext)(ref context)).performed && __instance.CanPlayerScan() && !(__instance.playerPingingScan > -0.5f) && (StartOfRound.Instance.inShipPhase || GameNetworkManager.Instance.localPlayerController.isInHangarShipRoom)) { if (!Object.op_Implicit((Object)(object)_ship)) { _ship = GameObject.Find("/Environment/HangarShip"); } if (!Object.op_Implicit((Object)(object)_totalCounter)) { CopyValueCounter(); } float num = CalculateLootValue(); ((TMP_Text)_textMesh).text = $"SHIP: ${num:F0}"; _displayTimeLeft = ShipLoot.Config.DisplayTime.Value; if (!_totalCounter.activeSelf) { ((MonoBehaviour)GameNetworkManager.Instance).StartCoroutine(ShipLootCoroutine()); } } } private static IEnumerator ShipLootCoroutine() { _totalCounter.SetActive(true); while (_displayTimeLeft > 0f) { float displayTimeLeft = _displayTimeLeft; _displayTimeLeft = 0f; yield return (object)new WaitForSeconds(displayTimeLeft); } _totalCounter.SetActive(false); } private static float CalculateLootValue() { List<GrabbableObject> list = (from obj in _ship.GetComponentsInChildren<GrabbableObject>() where obj.itemProperties.isScrap && !(obj is RagdollGrabbableObject) select obj).ToList(); ShipLoot.Log.LogDebug((object)"Calculating total ship scrap value."); CollectionExtensions.Do<GrabbableObject>((IEnumerable<GrabbableObject>)list, (Action<GrabbableObject>)delegate(GrabbableObject scrap) { ShipLoot.Log.LogDebug((object)$"{((Object)scrap).name} - ${scrap.scrapValue}"); }); return list.Sum((GrabbableObject scrap) => scrap.scrapValue); } private static void CopyValueCounter() { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) GameObject val = GameObject.Find("/Systems/UI/Canvas/IngamePlayerHUD/BottomMiddle/ValueCounter"); if (!Object.op_Implicit((Object)(object)val)) { ShipLoot.Log.LogError((object)"Failed to find ValueCounter object to copy!"); } _totalCounter = Object.Instantiate<GameObject>(val.gameObject, val.transform.parent, false); _totalCounter.transform.Translate(0f, 1f, 0f); Vector3 localPosition = _totalCounter.transform.localPosition; _totalCounter.transform.localPosition = new Vector3(localPosition.x + 50f, -50f, localPosition.z); _textMesh = _totalCounter.GetComponentInChildren<TextMeshProUGUI>(); } } }