Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of LethalSex Core v2.0.1
LethalSex-Core.dll
Decompiled 2 years agousing 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.Runtime.Versioning; using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalSex_Core.Modules; using LethalSex_Core.Properties; using Microsoft.CodeAnalysis; using TMPro; using UnityEngine; using UnityEngine.AI; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("LethalSex")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("LethalSex")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("aec54baa-710e-4860-aed4-d905e4489577")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [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.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 LethalSex_Core { internal class Config { private static ConfigFile config { get; set; } internal static bool ToggleDebugConsole { get; private set; } internal void Init() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown config = new ConfigFile(Path.Combine(Paths.ConfigPath, "LethalSexCore.cfg"), true); ToggleDebugConsole = config.Bind<bool>("Console", "Toggle debug console", false, "Allow the console to be toggled on and off? (F10)").Value; } } public static class Extensions { private static Dictionary<string, CancellationTokenSource> ctsDict = new Dictionary<string, CancellationTokenSource>(); public static T GetOrAddComponent<T>(this GameObject gameObject, bool Log = false) where T : Component { T val = gameObject.GetComponent<T>(); if (!Object.op_Implicit((Object)(object)val)) { val = gameObject.AddComponent<T>(); if (Log) { Main.mls.LogError((object)("Added " + ((Object)(object)val).name)); } } return val; } public static bool TryDestroy(this Object o) { try { Object.Destroy(o); return true; } catch { return false; } } public static string Join(this object[] array) { return string.Join(", ", array); } public static string ColorWrap(string text, string hexCode) { return "<color=" + hexCode + ">" + text + "</color>"; } public static string HexColor(Color baseColor) { //IL_0005: 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) //IL_0041: Unknown result type (might be due to invalid IL or missing references) return "#" + Convert.ToInt32(baseColor.r * 255f).ToString("X2") + Convert.ToInt32(baseColor.g * 255f).ToString("X2") + Convert.ToInt32(baseColor.b * 255f).ToString("X2"); } public static string GetObjPath(this Transform transform) { string text = ((Object)transform).name; while ((Object)(object)transform.parent != (Object)null) { transform = transform.parent; text = ((Object)transform).name + "/" + text; } return text; } public static async void SmoothIncrementValue(string ActionName, Action<float> action, float start, float target, float duration) { if (ctsDict.ContainsKey(ActionName)) { ctsDict[ActionName].Cancel(); ctsDict[ActionName].Dispose(); Main.mls.LogWarning((object)("Cancelling smooth increment task: " + ActionName)); ctsDict.Remove(ActionName); } ctsDict.Add(ActionName, new CancellationTokenSource()); await SmoothIncrementValueTask(delegate(float value) { action(value); }, start, target, duration, ctsDict[ActionName].Token); ctsDict.Remove(ActionName); } private static async Task SmoothIncrementValueTask(Action<float> action, float start, float target, float duration, CancellationToken cancellationToken) { float elapsedTime = 0f; float obj; while (elapsedTime < duration) { if (cancellationToken.IsCancellationRequested) { return; } obj = Mathf.Lerp(start, target, elapsedTime / duration); action(obj); elapsedTime += Time.deltaTime; await Task.Yield(); } obj = target; action(obj); } public static bool TryCatch(object description, Action action) { try { action(); return true; } catch (Exception ex) { MethodBase? method = new StackTrace().GetFrame(1).GetMethod(); string text = method.DeclaringType?.FullName; string name = method.Name; string msg = $"An error occoured in {text}.{name}:\nDescription: {description}\nLog: {ex.Message}\n"; ConsoleManager.Error(msg); return false; } } public static Vector3 GetRandomNavMeshPositionInRadiusSpherical(Vector3 origin, float minRadius, float maxRadius, float rayHit = 20f, float samHit = 10f) { //IL_0046: 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) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: 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) //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) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_0092: 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) RaycastHit val2 = default(RaycastHit); NavMeshHit val3 = default(NavMeshHit); for (int i = 0; i < 10; i++) { float num = Mathf.Sin(Time.time * NumberUtils.NextF(1f, 361f)); float num2 = Mathf.Cos(Time.time * NumberUtils.NextF(1f, 361f)); Vector3 val = new Vector3(NumberUtils.NextF(minRadius, maxRadius) * num, Random.insideUnitSphere.y * maxRadius, NumberUtils.NextF(minRadius, maxRadius) * num2) + origin + Vector3.up * 20f; if (Physics.Raycast(new Ray(val, Vector3.down), ref val2, rayHit)) { if (NavMesh.SamplePosition(((RaycastHit)(ref val2)).point, ref val3, samHit, -1)) { return ((NavMeshHit)(ref val3)).position; } ConsoleManager.Log("Sample not hit"); } else { ConsoleManager.Log("Ray not hit"); } } return new Vector3(0f, -10000f, 0f); } } public static class NumberUtils { public static readonly Random random = new Random(GenerateTrulyRandomNumber()); public static int GenerateTrulyRandomNumber() { using RNGCryptoServiceProvider rNGCryptoServiceProvider = new RNGCryptoServiceProvider(); byte[] array = new byte[4]; rNGCryptoServiceProvider.GetBytes(array); return Math.Abs(BitConverter.ToInt32(array, 0) % 40) + 10; } public static bool Chance(int percentage = 50) { if (percentage < 0 || percentage > 100) { throw new Exception("Uh...?"); } return Next(0, 100) < percentage; } public static bool Chance(float percentage = 50f) { if (percentage < 0f || percentage > 100f) { throw new Exception("Uh...?"); } return NextF(0f, 100f) < percentage; } public static long GenInt64() { byte[] array = new byte[8]; random.NextBytes(array); return BitConverter.ToInt64(array, 0); } public static int Next() { return Next(0, int.MaxValue); } public static int NextL(int max) { return Next(0, max - 1); } public static int Next(int max) { return Next(0, max + 1); } public static int Next(int min, int max) { return random.Next(min, max + 1); } public static int NextO(int input, int offset) { return Mathf.Clamp(Next(input - offset, input + offset), 0, int.MaxValue); } public static int NextO(int input, int offset, int max) { return Mathf.Clamp(Next(input - offset, input + offset), 0, max); } public static int NextO(int input, int offset, int min, int max) { return Mathf.Clamp(Next(input - offset, input + offset), min, max); } public static float NextO(float input, float offset) { return Mathf.Clamp(NextF(input - offset, input + offset), 0f, float.MaxValue); } public static float NextO(float input, float offset, float max) { return Mathf.Clamp(NextF(input - offset, input + offset), 0f, max); } public static float NextO(float input, float offset, float min, float max) { return Mathf.Clamp(NextF(input - offset, input + offset), min, max); } public static float NextF() { return NextF(0f, float.MaxValue); } public static float NextF(float max) { return NextF(0f, max + 1f); } public static float NextF(float min, float max) { return (float)(NextD() * (double)(max - min) + (double)min); } public static double NextD() { return random.NextDouble(); } public static string String128(object input) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) Hash128 val = default(Hash128); ((Hash128)(ref val)).Append(input.ToString()); return ((object)(Hash128)(ref val)).ToString(); } public static Vector3 NextV3(float x, float y, float z) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) return new Vector3(NextF(0f - x, x), NextF(0f - y, y), NextF(0f - z, z)); } public static string MD5(object input) { using MD5 mD = System.Security.Cryptography.MD5.Create(); byte[] bytes = Encoding.UTF8.GetBytes(input.ToString()); byte[] array = mD.ComputeHash(bytes); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < array.Length; i++) { stringBuilder.Append(array[i].ToString("x2")); } return stringBuilder.ToString(); } } public static class LocalPlayer { public static InputActionAsset Actions; public static PlayerControllerB? PlayerController => GameNetworkManager.Instance?.localPlayerController ?? null; public static GameObject? Player { get { PlayerControllerB? playerController = PlayerController; if (playerController == null) { return null; } return ((Component)playerController).gameObject; } } public static float Insanity { get { return PlayerController?.insanityLevel ?? (-1f); } set { PlayerController.insanityLevel = value; } } public static float MaxInsanity { get { return PlayerController?.maxInsanityLevel ?? (-1f); } set { PlayerController.maxInsanityLevel = value; } } public static Camera? Camera { get { GameObject? player = Player; if (player == null) { return null; } return player.GetComponentInChildren<Camera>(); } } public static bool IsNearOtherPlayers => PlayersNearMe().Length != 0; public static bool IsMenuOpen => PlayerController.quickMenuManager.isMenuOpen; public static bool IsTermOpen => PlayerController.inTerminalMenu; public static bool Interected => Actions.FindAction("Interact", false).WasPressedThisFrame(); public static async Task<PlayerControllerB> PlayerControllerAsync(int maxIter = 25, int delay = 250) { if ((Object)(object)PlayerController != (Object)null) { return PlayerController; } int iterCount = 0; PlayerControllerB player; int num; do { player = GameNetworkManager.Instance?.localPlayerController; if (!Object.op_Implicit((Object)(object)player)) { await Task.Delay(delay); } num = iterCount + 1; iterCount = num; } while (num < maxIter || !Object.op_Implicit((Object)(object)player)); return player; } public static async Task<GameObject> PlayerAsync(int maxIter = 25, int delay = 250) { int iterCount = 0; GameObject player; int num; do { StartOfRound instance = StartOfRound.Instance; object obj; if (instance == null) { obj = null; } else { PlayerControllerB localPlayerController = instance.localPlayerController; obj = ((localPlayerController != null) ? ((Component)localPlayerController).gameObject : null); } player = (GameObject)obj; if (!Object.op_Implicit((Object)(object)player)) { await Task.Delay(delay); } num = iterCount + 1; iterCount = num; } while (num < maxIter || !Object.op_Implicit((Object)(object)player)); return player; } public static async Task<float> InsanityAsync(int maxIter = 25, int delay = 250) { int iterCount = 0; float insanity; int num; do { insanity = (StartOfRound.Instance?.localPlayerController?.insanityLevel).GetValueOrDefault(-1f); if (insanity < 0f) { await Task.Delay(delay); } num = iterCount + 1; iterCount = num; } while (num < maxIter || insanity < 0f); return insanity; } public static async Task<float> MaxInsanityAsync(int maxIter = 25, int delay = 250) { int iterCount = 0; float insanity; int num; do { insanity = (StartOfRound.Instance?.localPlayerController?.maxInsanityLevel).GetValueOrDefault(-1f); if (insanity < 0f) { await Task.Delay(delay); } num = iterCount + 1; iterCount = num; } while (num < maxIter || insanity < 0f); return insanity; } public static async Task<Camera> CameraAsync(int maxIter = 25, int delay = 250) { int iterCount = 0; Camera cam; int num; do { GameObject? player = Player; cam = ((player != null) ? player.GetComponentInChildren<Camera>() : null); if (!Object.op_Implicit((Object)(object)cam)) { await Task.Delay(delay); } num = iterCount + 1; iterCount = num; } while (num < maxIter || !Object.op_Implicit((Object)(object)cam)); return cam; } public static PlayerControllerB[] PlayersNearMe(float rad = 10f) { //IL_0016: 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) PlayerControllerB[] array = null; PlayerControllerB[] array2 = Resources.FindObjectsOfTypeAll<PlayerControllerB>(); foreach (PlayerControllerB val in array2) { if (Vector3.Distance(((Component)val).transform.position, Player.transform.position) <= rad) { array[array.Length] = val; } } return array; } static LocalPlayer() { IngamePlayerSettings instance = IngamePlayerSettings.Instance; object actions; if (instance == null) { actions = null; } else { PlayerInput playerInput = instance.playerInput; actions = ((playerInput != null) ? playerInput.actions : null); } Actions = (InputActionAsset)actions; } } public class LethalMod { public string Name { get; private set; } public string Author { get; private set; } public string Version { get; private set; } public string AssemblyName { get; private set; } public List<LethalModule> Modules { get; private set; } public LethalMod(string assemblyName, string modName, string modVersion, string modAuthor) { Modules = new List<LethalModule>(); Name = modName; Author = modAuthor; Version = modVersion; AssemblyName = assemblyName; } public LethalModule? RegisterModule(Type module, string moduleName) { try { if (Modules.Exists((LethalModule m) => string.Equals(m.ModuleName, moduleName, StringComparison.OrdinalIgnoreCase))) { Main.mls.LogError((object)("[" + moduleName + "] already exists in [" + Name + "]")); return null; } LethalModule lethalModule = (LethalModule)Activator.CreateInstance(module); lethalModule.Mod = this; lethalModule.ModuleName = moduleName; Modules.Add(lethalModule); lethalModule.OnRegister(); Main.mls.LogWarning((object)("[" + Name + "] loaded module of: [" + moduleName + "]")); ConsoleManager.Warn("[" + Name + "] loaded module of: [" + moduleName + "]"); return lethalModule; } catch (Exception arg) { Main.mls.LogError((object)$"[{Name}] failed to load module of: [{moduleName}]\n{arg}\n"); ConsoleManager.Error($"[{Name}] failed to load module of: [{moduleName}]\n{arg}\n"); return null; } } public LethalModule? RegisterModule(Type module) { return RegisterModule(module, module.Name); } public void UnregisterModule(string moduleName) { if (Modules.Exists((LethalModule m) => string.Equals(m.ModuleName, moduleName, StringComparison.OrdinalIgnoreCase))) { Modules.ForEach(delegate(LethalModule m) { if (string.Equals(m.ModuleName, moduleName, StringComparison.OrdinalIgnoreCase)) { UnregisterModule(m); } }); } else { Main.mls.LogError((object)("Could not unregister [" + moduleName + "] since it cannot be found")); ConsoleManager.Error("Could not unregister [" + moduleName + "] since it cannot be found"); } } public void UnregisterModule(Type module) { foreach (LethalModule module2 in Modules) { if (((object)module2).GetType() == module) { UnregisterModule(module2); } } Main.mls.LogError((object)("Could not unregister [" + module.Name + "] since it cannot be found")); } public void UnregisterModule(LethalModule module) { try { if (Modules.Contains(module)) { module.Module = null; Modules.Remove(module); Main.mls.LogWarning((object)("[" + module.ModuleName + "] has been unregistered")); } else { Main.mls.LogError((object)("Could not unregister [" + module.ModuleName + "] since it cannot be found")); } } catch (Exception arg) { Main.mls.LogError((object)$"Failed to unregister a module from [{module.ModuleName}]\n{arg}\n"); ConsoleManager.Error($"Failed to unregister a module from [{module.ModuleName}]\n{arg}\n"); } } } public abstract class LethalModule : MonoBehaviour { public struct Event { public float Sanity; public Action OnAction; public Action OffAction; public bool Applied; internal Event(float sanity, Action onAct = null, Action offAct = null) { Sanity = sanity; OnAction = onAct; OffAction = offAct; Applied = false; } } public string ModuleName { get; set; } public LethalMod Mod { get; set; } public LethalModule Module { get; set; } public LethalModule() { Module = this; } public virtual void Unregister() { Mod.UnregisterModule(this); Module = null; } public virtual void OnRegister() { } protected virtual void Enabled() { Main.mls.LogWarning((object)("Behaviour: " + ((object)this).GetType().Name + " has been enabled")); ConsoleManager.Warn("Behaviour: " + ((object)this).GetType().Name + " has been enabled"); } protected virtual void Disabled() { Main.mls.LogWarning((object)("Behaviour: " + ((object)this).GetType().Name + " has been disabled")); ConsoleManager.Warn("Behaviour: " + ((object)this).GetType().Name + " has been disabled"); } protected virtual void Destroyed() { Main.mls.LogWarning((object)("Behaviour: " + ((object)this).GetType().Name + " has been destroyed")); ConsoleManager.Warn("Behaviour: " + ((object)this).GetType().Name + " has been destroyed"); } public virtual void OnHUDAwake() { } public virtual void OnHUDStart() { } public virtual void OnLocalStart(PlayerControllerB _LocalPlayer) { } public virtual void OnShipLand() { } public virtual void OnGrabObject(GrabbableObject obj) { } public virtual void OnLocalDie() { } public virtual bool OnDamagePlayer(ref int damageNumber, ref bool hasDamageSFX, ref bool callRPC, ref CauseOfDeath causeOfDeath, ref int deathAnimation, ref bool fallDamage, ref Vector3 force) { return true; } public virtual void OnSanityChanged(float sanity) { } public virtual void OnFinishedGen() { } public void AddSanityEvent(float sanity, Action onAct = null, Action offAct = null) { SanityEventManager.Instance.New(sanity, onAct, offAct); } } [BepInPlugin("com.GitHub.IGNOREDSOUL.LethalSex.LethalSexCore", "LethalSex-Core", "2.0.1")] [BepInProcess("Lethal Company.exe")] public class Main : BaseUnityPlugin { internal readonly Harmony harmony = new Harmony("com.GitHub.IGNOREDSOUL.LethalSex.LethalSexCore"); internal const string modVersion = "2.0.1"; private const string modGUID = "com.GitHub.IGNOREDSOUL.LethalSex.LethalSexCore"; private const string modName = "LethalSex-Core"; private const string waterMark = "\r\n ▄▀▀▀▀▄ ▄▀▀█▄▄▄▄ ▄▀▀▀█▀▀▄ ▄▀▀▄ ▄▄ ▄▀▀█▄ ▄▀▀▀▀▄ ▄▀▀▀▀▄ ▄▀▀█▄▄▄▄ ▄▀▀▄ ▄▀▄\r\n█ █ ▐ ▄▀ ▐ █ █ ▐ █ █ ▄▀ ▐ ▄▀ ▀▄ █ █ █ █ ▐ ▐ ▄▀ ▐ █ █ █\r\n▐ █ █▄▄▄▄▄ ▐ █ ▐ █▄▄▄█ █▄▄▄█ ▐ █ ▀▄ █▄▄▄▄▄ ▐ ▀▄▀\r\n █ █ ▌ █ █ █ ▄▀ █ █ ▀▄ █ █ ▌ ▄▀ █\r\n ▄▀▄▄▄▄▄▄▀ ▄▀▄▄▄▄ ▄▀ ▄▀ ▄▀ █ ▄▀ ▄▀▄▄▄▄▄▄▀ █▀▀▀ ▄▀▄▄▄▄ █ ▄▀\r\n █ █ ▐ █ █ █ ▐ ▐ █ ▐ █ ▐ ▄▀ ▄▀\r\n ▐ ▐ ▐ IGNORED ▐ ▐ SOUL ▐ ▐ █ ▐ "; protected internal static List<LethalMod> LethalMods = new List<LethalMod>(); public static Main instance { get; private set; } internal static ManualLogSource mls { get; private set; } internal static LethalMod CoreMod { get; private set; } internal static AssetBundle bundle { get; private set; } private void Awake() { while (!Object.op_Implicit((Object)(object)instance)) { instance = this; } mls = Logger.CreateLogSource("LethalSex-Core"); mls.LogError((object)"\r\n ▄▀▀▀▀▄ ▄▀▀█▄▄▄▄ ▄▀▀▀█▀▀▄ ▄▀▀▄ ▄▄ ▄▀▀█▄ ▄▀▀▀▀▄ ▄▀▀▀▀▄ ▄▀▀█▄▄▄▄ ▄▀▀▄ ▄▀▄\r\n█ █ ▐ ▄▀ ▐ █ █ ▐ █ █ ▄▀ ▐ ▄▀ ▀▄ █ █ █ █ ▐ ▐ ▄▀ ▐ █ █ █\r\n▐ █ █▄▄▄▄▄ ▐ █ ▐ █▄▄▄█ █▄▄▄█ ▐ █ ▀▄ █▄▄▄▄▄ ▐ ▀▄▀\r\n █ █ ▌ █ █ █ ▄▀ █ █ ▀▄ █ █ ▌ ▄▀ █\r\n ▄▀▄▄▄▄▄▄▀ ▄▀▄▄▄▄ ▄▀ ▄▀ ▄▀ █ ▄▀ ▄▀▄▄▄▄▄▄▀ █▀▀▀ ▄▀▄▄▄▄ █ ▄▀\r\n █ █ ▐ █ █ █ ▐ ▐ █ ▐ █ ▐ ▄▀ ▄▀\r\n ▐ ▐ ▐ IGNORED ▐ ▐ SOUL ▐ ▐ █ ▐ "); bundle = AssetBundle.LoadFromMemory(resources.lethalsex_core); new Config().Init(); harmony.PatchAll(typeof(Patching)); CoreMod = RegisterMod("LethalSex-Core", "2.0.1", "IGNOREDSOUL"); CoreMod.RegisterModule(typeof(ConsoleManager)); CoreMod.RegisterModule(typeof(SanityEventManager)); } public static LethalMod RegisterMod(string modName, string modVersion, string modAuthor) { LethalMod lethalMod = new LethalMod(Assembly.GetCallingAssembly().GetName().Name, modName, modVersion, modAuthor); mls.LogMessage((object)("[" + modAuthor + "] created a new mod of: [" + modName + " v" + modVersion + "]")); ConsoleManager.Log("[" + modAuthor + "] created a new mod of: [" + modName + " v" + modVersion + "]"); LethalMods.Add(lethalMod); return lethalMod; } } [HarmonyPatch] public static class Patching { private static float prev_san { get; set; } = -666f; [HarmonyPatch(typeof(HUDManager), "Start")] [HarmonyPostfix] private static void ONHUDSTART() { Main.LethalMods.ForEach(delegate(LethalMod mod) { mod.Modules.ForEach(delegate(LethalModule module) { Extensions.TryCatch("An error occoured at ONHUDSTART. Failed to send OnHUDStart to module: " + module.ModuleName, delegate { module?.OnHUDStart(); }); }); }); } [HarmonyPatch(typeof(HUDManager), "Awake")] [HarmonyPostfix] private static void ONHUDAWAKE() { Main.LethalMods.ForEach(delegate(LethalMod mod) { mod.Modules.ForEach(delegate(LethalModule module) { Extensions.TryCatch("An error occoured at ONHUDAWAKE. Failed to send OnHUDAwake to module: " + module.ModuleName, delegate { module?.OnHUDAwake(); }); }); }); } [HarmonyPatch(typeof(HUDManager), "Update")] [HarmonyPostfix] private static void ONHUDUPDATE() { ONSANITYCHANGED(); } [HarmonyPatch(typeof(StartOfRound), "OnShipLandedMiscEvents")] [HarmonyPostfix] private static void ONSHIPLAND() { Main.LethalMods.ForEach(delegate(LethalMod mod) { mod.Modules.ForEach(delegate(LethalModule module) { Extensions.TryCatch("An error occoured at ONSHIPLAND. Failed to send OnShipLand to module: " + module.ModuleName, delegate { module?.OnShipLand(); }); }); }); } [HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")] [HarmonyPostfix] private static void ONLOCALSTART(PlayerControllerB __instance) { Main.LethalMods.ForEach(delegate(LethalMod mod) { mod.Modules.ForEach(delegate(LethalModule module) { Extensions.TryCatch("An error occoured at ONPLAYERSTART. Failed to send OnHUDAwake to module: " + module.ModuleName, delegate { module?.OnLocalStart(__instance); }); }); }); } [HarmonyPatch(typeof(PlayerControllerB), "KillPlayer")] [HarmonyPostfix] private static void ONLOCALDIE() { PlayerControllerB? playerController = LocalPlayer.PlayerController; if (((playerController != null) ? new bool?(!playerController.isPlayerDead) : null).Value) { return; } Main.LethalMods.ForEach(delegate(LethalMod mod) { mod.Modules.ForEach(delegate(LethalModule module) { Extensions.TryCatch("An error occoured at ONKILLPLAYER. Failed to send OnLocalPlayerDie to module: " + module.ModuleName, delegate { module?.OnLocalDie(); }); }); }); } [HarmonyPatch(typeof(PlayerControllerB), "BeginGrabObject")] [HarmonyPostfix] private static void ONGRABOBJECT() { PlayerControllerB? playerController = LocalPlayer.PlayerController; if (((playerController != null) ? new bool?(!playerController.isPlayerDead) : null).Value || !LocalPlayer.Interected) { return; } Main.LethalMods.ForEach(delegate(LethalMod mod) { mod.Modules.ForEach(delegate(LethalModule module) { Extensions.TryCatch("An error occoured at ONGRABOBJECT. Failed to send OnGrabObject to module: " + module.ModuleName, delegate { //IL_000f: 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) //IL_0028: Unknown result type (might be due to invalid IL or missing references) RaycastHit val = default(RaycastHit); if (Physics.Raycast(new Ray(((Component)LocalPlayer.PlayerController.gameplayCamera).transform.position, ((Component)LocalPlayer.PlayerController.gameplayCamera).transform.forward), ref val, LocalPlayer.PlayerController.grabDistance, 832)) { Collider collider = ((RaycastHit)(ref val)).collider; object obj; if (collider == null) { obj = null; } else { GameObject gameObject = ((Component)((Component)collider).transform).gameObject; obj = ((gameObject != null) ? gameObject.GetComponent<GrabbableObject>() : null); } if ((Object)obj != (Object)null) { module?.OnGrabObject(((Component)((Component)((RaycastHit)(ref val)).collider).transform).gameObject.GetComponent<GrabbableObject>()); } } }); }); }); } [HarmonyPatch(typeof(RoundManager), "FinishGeneratingLevel")] [HarmonyPostfix] private static void ONFINISHEDGEN() { Main.LethalMods.ForEach(delegate(LethalMod mod) { mod.Modules.ForEach(delegate(LethalModule module) { Extensions.TryCatch("An error occoured at ONFINISHEDGEN. Failed to send OnFinishedGen to module: " + module.ModuleName, delegate { module?.OnFinishedGen(); }); }); }); } private static void ONSANITYCHANGED() { if (!Object.op_Implicit((Object)(object)LocalPlayer.Player) || (LocalPlayer.PlayerController?.isPlayerDead).Value || prev_san == float.Parse(LocalPlayer.Insanity.ToString("0.0"))) { return; } prev_san = float.Parse(LocalPlayer.Insanity.ToString("0.0")); Main.LethalMods.ForEach(delegate(LethalMod mod) { mod.Modules.ForEach(delegate(LethalModule module) { Extensions.TryCatch("An error occoured at ONSANITYCHANGED. Failed to send OnSanityChanged to module: " + module.ModuleName, delegate { module?.OnSanityChanged(LocalPlayer.Insanity); }); }); }); } } } namespace LethalSex_Core.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) { resourceMan = new ResourceManager("LethalSex_Core.Properties.resources", typeof(resources).Assembly); } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] internal static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } internal static byte[] lethalsex_core => (byte[])ResourceManager.GetObject("lethalsex_core", resourceCulture); internal resources() { } } } namespace LethalSex_Core.Modules { public class ConsoleManager : LethalModule { private static StringBuilder _consoleTextBuffer = new StringBuilder(); public static ConsoleManager instance { get; private set; } public static ConsoleManager component { get; private set; } public static TextMeshProUGUI ConsoleText { get; private set; } public static GameObject ConsoleObject { get; private set; } public static ScrollRect ConsoleScroll { get; private set; } public override void OnRegister() { if (!Config.ToggleDebugConsole) { base.Mod.UnregisterModule(this); } instance = this; } public override void OnHUDAwake() { if (!Object.op_Implicit((Object)(object)ConsoleObject)) { ConsoleObject = Object.Instantiate<GameObject>(Main.bundle.LoadAsset<GameObject>("assets/lethalsex-core/console/ls-console.prefab"), GameObject.Find("Systems/UI/Canvas/").transform); ConsoleText = ((Component)ConsoleObject.transform.Find("ConsoleArea/Viewport/ConsoleText")).GetComponent<TextMeshProUGUI>(); ConsoleScroll = ((Component)ConsoleObject.transform.Find("ConsoleArea")).GetComponent<ScrollRect>(); if (Object.op_Implicit((Object)(object)ConsoleText) && Object.op_Implicit((Object)(object)ConsoleScroll)) { ((TMP_Text)ConsoleText).text = _consoleTextBuffer.ToString(); } component = ConsoleObject.AddComponent<ConsoleManager>(); ((TMP_Text)((Component)ConsoleObject.transform.Find("ConsoleArea/ConsoleBackground/GameVersion")).GetComponent<TextMeshProUGUI>()).text = "v2.0.1"; } } private void Update() { if (((ButtonControl)Keyboard.current.f10Key).wasPressedThisFrame && Object.op_Implicit((Object)(object)ConsoleObject)) { GameObject consoleObject = ConsoleObject; if (consoleObject != null) { ((Component)consoleObject.transform.GetChild(0)).gameObject.SetActive(!((Component)ConsoleObject.transform.GetChild(0)).gameObject.activeInHierarchy); } } if (InputControlExtensions.IsPressed((InputControl)(object)Keyboard.current.spaceKey, 0f) && Object.op_Implicit((Object)(object)ConsoleScroll)) { ConsoleScroll.verticalNormalizedPosition = 0f; } } public static void Log(object msg) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) Log(msg, "Info", Color.cyan); } public static void Error(object msg) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) Log(msg, "Error", Color.red); } public static void Warn(object msg) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) Log(msg, "Warn", Color.yellow); } public static void Log(object msg, Color color) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) Log(msg, "Info", color); } public static void Log(object msg, object prefix) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) Log(msg, prefix, Color.cyan); } public static void Log(object msg, object prefix, Color color) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) _consoleTextBuffer.Append($"[{DateTimeOffset.Now:hh:mm:ss:ff}] [{Extensions.ColorWrap($"{prefix}", Extensions.HexColor(color))}] ~> {msg}\n"); if (Object.op_Implicit((Object)(object)ConsoleObject) && Object.op_Implicit((Object)(object)ConsoleText) && Object.op_Implicit((Object)(object)ConsoleScroll)) { ((TMP_Text)ConsoleText).text = _consoleTextBuffer.ToString(); } } private void OnDestroy() { base.Destroyed(); } private void OnDisable() { base.Disabled(); } private void OnEnable() { base.Enabled(); } } internal class SanityEventManager : LethalModule { protected List<Event> events = new List<Event>(); public static SanityEventManager Instance { get; private set; } public override void OnRegister() { Instance = this; } public void New(float sanity, Action onAct = null, Action offAct = null) { events.Add(new Event(sanity, onAct, offAct)); } public override void OnSanityChanged(float sanity) { Event[] array = events.Where((Event i) => i.Sanity < sanity).ToArray(); foreach (Event item in array) { int num = events.IndexOf(item); if (num != -1 && !events[num].Applied) { Event value = events[num]; value.Applied = true; events[num] = value; value.OnAction?.Invoke(); } } array = events.Where((Event i) => i.Sanity >= sanity).ToArray(); foreach (Event item2 in array) { int num2 = events.IndexOf(item2); if (num2 != -1 && events[num2].Applied) { Event value2 = events[num2]; value2.Applied = false; events[num2] = value2; value2.OffAction?.Invoke(); } } } } }