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 EmergencyTakeoff v1.0.0
EmergencyTakeoff.dll
Decompiled 2 years 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 EmergencyTakeoff.Patches; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using TMPro; using Unity.Netcode; using UnityEngine; 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("RadiationIsCool")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("RadiationIsCool")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("8ee335db-0cbe-470c-8fbc-69263f01b35a")] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace EmergencyTakeoff { [BepInPlugin("Piggy.EmergencyTakeoff", "EmergencyTakeoff", "1.0.0")] public class EmergencyTakeoffModBase : BaseUnityPlugin { private const string modGUID = "Piggy.EmergencyTakeoff"; private const string modName = "EmergencyTakeoff"; private const string modVersion = "1.0.0"; private readonly Harmony harmony = new Harmony("Piggy.EmergencyTakeoff"); private static EmergencyTakeoffModBase Instance; public static ManualLogSource mls; public static int EventProbability; public static float maxProbability; public static float minProbability; public static bool showMessage; public static bool showTimer; private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } mls = Logger.CreateLogSource("Piggy.EmergencyTakeoff"); mls.LogInfo((object)"Emergency Takeoff is loaded"); EventProbability = ((BaseUnityPlugin)this).Config.Bind<int>("General", "EventProbability", 10, "Chance of emergency return occurring (Probability and numbers are inversely proportional. If set to 1, it will always occur.)").Value; maxProbability = ((BaseUnityPlugin)this).Config.Bind<float>("General", "MaximumProbabilityIncrease", 0.5f, "This is the maximum value at which the probability increases continuously. Must be higher than the minimum.").Value; minProbability = ((BaseUnityPlugin)this).Config.Bind<float>("General", "MinimumProbabilityIncrease", 0.3f, "It is the minimum value at which the probability increases continuously. It must be lower than the maximum.").Value; showMessage = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ShowTipMessage", false, "If enabled, displays a message after landing if the probability of an event occurring exists.").Value; showTimer = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ShowTimer", true, "Shows the departure timer in the lower left corner.").Value; StartOfRoundPatch.eventProbability = EventProbability; TimeOfDayPatch.minimumIncrease = minProbability; TimeOfDayPatch.maximumIncrease = maxProbability; StartOfRoundPatch.messageEnabled = showMessage; HUDManagerPatch.isTimerEnabled = showTimer; harmony.PatchAll(typeof(EmergencyTakeoffModBase)); harmony.PatchAll(typeof(TimeOfDayPatch)); harmony.PatchAll(typeof(StartOfRoundPatch)); harmony.PatchAll(typeof(PlayerControllerBPatch)); harmony.PatchAll(typeof(HUDManagerPatch)); harmony.PatchAll(typeof(WalkieTalkiePatch)); harmony.PatchAll(typeof(GameNetworkManagerPatch)); harmony.PatchAll(typeof(EmergencyActivatedBool)); harmony.PatchAll(typeof(EmergencyBool)); } } } namespace EmergencyTakeoff.Patches { public static class EmergencyActivatedBool { public static bool leavingActivated; } [HarmonyPatch(typeof(HUDManager))] internal class HUDManagerPatch { public static TextMeshProUGUI TimerTextGUI; public static bool isTimerActivated; public static bool isTimerEnabled = EmergencyTakeoffModBase.showTimer; public static HUDManager hudManager; [HarmonyPostfix] [HarmonyPatch("Awake")] private static void Awake_Postfix(ref HUDManager __instance) { hudManager = __instance; if (GameNetworkManager.Instance.isHostingGame) { SetupHUDTimerRPC(); } } [ClientRpc] public static void SetupHUDTimerRPC() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_004b: 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_007c: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("TimerText"); val.AddComponent<RectTransform>(); TimerTextGUI = val.AddComponent<TextMeshProUGUI>(); RectTransform rectTransform = ((TMP_Text)TimerTextGUI).rectTransform; ((Transform)rectTransform).SetParent(GameObject.Find("Systems/UI/Canvas/IngamePlayerHUD").transform, false); rectTransform.sizeDelta = new Vector2(600f, 200f); rectTransform.anchoredPosition = new Vector2(-60f, -200f); ((Transform)rectTransform).rotation = Quaternion.Euler(19.4f, -11.7f, 0f); ((TMP_Text)TimerTextGUI).alignment = (TextAlignmentOptions)513; ((TMP_Text)TimerTextGUI).font = ((TMP_Text)hudManager.controlTipLines[0]).font; ((TMP_Text)TimerTextGUI).fontSize = 30f; } [HarmonyPrefix] [HarmonyPatch("Update")] private static void Update_Prefix() { if (!isTimerActivated || !isTimerEnabled) { ((TMP_Text)TimerTextGUI).text = ""; } } } [HarmonyPatch(typeof(GameNetworkManager))] internal class GameNetworkManagerPatch { [HarmonyPrefix] [HarmonyPatch("LeaveCurrentSteamLobby")] private static void LeaveCurrentSteamLobby_PreFix() { //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) HUDManagerPatch.isTimerActivated = false; EmergencyActivatedBool.leavingActivated = false; EmergencyBool.canBeLeave = false; PlayerControllerBPatch.timerFloat = 60f; PlayerControllerBPatch.timerString = ""; PlayerControllerBPatch.textFlickered = false; TimeOfDayPatch.randomTriggerTimer = 0f; TimeOfDayPatch.randomTriggerPercentage = 0f; TimeOfDayPatch.randomTriggerCurrentPercentage = 100f; TimeOfDayPatch.isMessaged = false; TimeOfDayPatch.isNotCalled = true; TimeOfDayPatch.normalizedTimeOfDayB = 0f; TimeOfDayPatch.shipLeaveAutomaticallyTimeB = 0f; ((Graphic)GameObject.Find("SprintMeter").GetComponent<Image>()).color = Color32.op_Implicit(new Color32(byte.MaxValue, (byte)118, (byte)0, byte.MaxValue)); if ((Object)(object)Object.FindAnyObjectByType<ShipTeleporter>() != (Object)null) { ShipTeleporter[] array = Object.FindObjectsOfType<ShipTeleporter>(); ShipTeleporter[] array2 = array; foreach (ShipTeleporter val in array2) { val.buttonTrigger.interactable = true; } } } } [HarmonyPatch(typeof(WalkieTalkie))] internal class WalkieTalkiePatch { [HarmonyPrefix] [HarmonyPatch("TimeAllAudioSources")] private static void TimeAllAudioSources_PreFix() { if (!EmergencyActivatedBool.leavingActivated) { } } [HarmonyPostfix] [HarmonyPatch("Update")] private static void Update_PostFix(ref AudioClip ___playerDieOnWalkieTalkieSFX, ref AudioSource ___thisAudio, ref bool ___isBeingUsed) { if (!EmergencyActivatedBool.leavingActivated) { return; } if (___isBeingUsed) { ___thisAudio.clip = ___playerDieOnWalkieTalkieSFX; ___thisAudio.loop = true; if (!___thisAudio.isPlaying) { ___thisAudio.Play(); } } else { ___thisAudio.loop = false; } } } [HarmonyPatch(typeof(PlayerControllerB))] internal class PlayerControllerBPatch : MonoBehaviour { public static float timerFloat; public static string timerString; public static bool textFlickered; [HarmonyPostfix] [HarmonyPatch("Start")] private static void Start_PostFix() { timerFloat = 60f; } [HarmonyPrefix] [HarmonyPatch("Update")] private static void Update_PreFix(ref float ___sprintMeter) { //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: 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_0175: Unknown result type (might be due to invalid IL or missing references) if (EmergencyActivatedBool.leavingActivated) { ((Component)Object.FindObjectOfType<ShipLights>()).GetComponent<ShipLights>().areLightsOn = false; ((Component)Object.FindObjectOfType<ShipLights>()).GetComponent<ShipLights>().shipLightsAnimator.SetBool("lightsOn", false); ___sprintMeter = 1f; if (timerFloat > 0f) { timerFloat -= Time.deltaTime / 4f; } if (timerFloat < 0f && !textFlickered) { timerFloat = 0f; ((TMP_Text)HUDManagerPatch.TimerTextGUI).text = "<color=red>00:00</color>"; textFlickered = true; } else { timerString = (Mathf.Floor(timerFloat * 100f) / 100f).ToString(); } if (timerFloat >= 10f) { ((TMP_Text)HUDManagerPatch.TimerTextGUI).text = timerString; } else if (!textFlickered && timerFloat > 0f && timerFloat < 10f) { ((TMP_Text)HUDManagerPatch.TimerTextGUI).text = "<color=red>0" + timerString + "</color>"; } if (timerFloat <= 0f) { } ((Graphic)GameObject.Find("SprintMeter").GetComponent<Image>()).color = Color32.op_Implicit(new Color32(byte.MaxValue, (byte)0, (byte)0, byte.MaxValue)); } else { ((Graphic)GameObject.Find("SprintMeter").GetComponent<Image>()).color = Color32.op_Implicit(new Color32(byte.MaxValue, (byte)118, (byte)0, byte.MaxValue)); } } } public static class EmergencyBool { public static bool canBeLeave; } [HarmonyPatch(typeof(StartOfRound))] internal class StartOfRoundPatch { public static int eventProbability = EmergencyTakeoffModBase.EventProbability; public static bool messageEnabled = EmergencyTakeoffModBase.showMessage; [HarmonyPrefix] [HarmonyPatch("OnShipLandedMiscEvents")] private static void OnShipLandedMiscEvents_Patch() { if (Random.Range(0, eventProbability) == 0) { EmergencyBool.canBeLeave = true; EmergencyTakeoffModBase.mls.LogInfo((object)$"canbeleave"); } else { EmergencyBool.canBeLeave = false; EmergencyTakeoffModBase.mls.LogInfo((object)$"cannotbeleave"); } if (EmergencyBool.canBeLeave && GameNetworkManager.Instance.isHostingGame && messageEnabled) { ShipEmergencyTextRPC(); } } public static void ShipEmergencyText() { HUDManager.Instance.DisplayTip("???", "Something feels different today.", false, false, "LC_WhatIsThisThingy"); } [ClientRpc] public static void ShipEmergencyTextRPC() { ShipEmergencyText(); } [HarmonyPrefix] [HarmonyPatch("ShipHasLeft")] private static void ShipHasLeft_Patch() { //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) HUDManagerPatch.isTimerActivated = false; EmergencyActivatedBool.leavingActivated = false; EmergencyBool.canBeLeave = false; PlayerControllerBPatch.timerFloat = 60f; PlayerControllerBPatch.timerString = ""; PlayerControllerBPatch.textFlickered = false; TimeOfDayPatch.randomTriggerTimer = 0f; TimeOfDayPatch.randomTriggerPercentage = 0f; TimeOfDayPatch.randomTriggerCurrentPercentage = 100f; TimeOfDayPatch.isMessaged = false; TimeOfDayPatch.isNotCalled = true; TimeOfDayPatch.normalizedTimeOfDayB = 0f; TimeOfDayPatch.shipLeaveAutomaticallyTimeB = 0f; ((Graphic)GameObject.Find("SprintMeter").GetComponent<Image>()).color = Color32.op_Implicit(new Color32(byte.MaxValue, (byte)118, (byte)0, byte.MaxValue)); if ((Object)(object)Object.FindAnyObjectByType<ShipTeleporter>() != (Object)null) { ShipTeleporter[] array = Object.FindObjectsOfType<ShipTeleporter>(); ShipTeleporter[] array2 = array; foreach (ShipTeleporter val in array2) { val.buttonTrigger.interactable = true; } } } } [HarmonyPatch(typeof(TimeOfDay))] internal class TimeOfDayPatch { public static bool isWeathed; public static float randomTriggerTimer; public static float randomTriggerPercentage; public static float randomTriggerCurrentPercentage = 100f; public static bool isMessaged; public static bool isNotCalled; public static float normalizedTimeOfDayB; public static float shipLeaveAutomaticallyTimeB; public static DialogueSegment[] shipLeavingEarlyDialogueB; public static float minimumIncrease = EmergencyTakeoffModBase.minProbability; public static float maximumIncrease = EmergencyTakeoffModBase.maxProbability; [HarmonyPrefix] [HarmonyPatch("Awake")] private static void Awake_Patch() { randomTriggerPercentage = 0f; randomTriggerCurrentPercentage = 100f; isNotCalled = true; } [HarmonyPrefix] [HarmonyPatch("Start")] private static void Start_Patch(ref DialogueSegment[] ___shipLeavingEarlyDialogue) { ___shipLeavingEarlyDialogue[0].speakerText = "PILOT COMPUTER"; ___shipLeavingEarlyDialogue[0].bodyText = "WARNING!!! A major disaster is expected in the area, and the ship will leave automatically in a moment.\nThe suit has activated emergency mode. Escape immediately."; } [HarmonyPostfix] [HarmonyPatch("Update")] private static void Update_PostFix(ref float ___normalizedTimeOfDay, ref float ___shipLeaveAutomaticallyTime, ref DialogueSegment[] ___shipLeavingEarlyDialogue) { if (___normalizedTimeOfDay >= 0.3355214f && !isMessaged && EmergencyBool.canBeLeave) { randomTriggerTimer += Time.deltaTime; } if (randomTriggerTimer >= 5f && GameNetworkManager.Instance.isHostingGame) { randomTriggerPercentage += Random.Range(minimumIncrease, maximumIncrease); randomTriggerCurrentPercentage = Random.Range(2f, 100f); EmergencyTakeoffModBase.mls.LogInfo((object)string.Format("new emergency percentage: " + randomTriggerPercentage)); EmergencyTakeoffModBase.mls.LogInfo((object)string.Format("emergency percentage now: " + randomTriggerCurrentPercentage)); if (randomTriggerCurrentPercentage >= randomTriggerPercentage && !isMessaged) { EmergencyTakeoffModBase.mls.LogInfo((object)$"emergency leave failed"); } randomTriggerTimer = 0f; if (randomTriggerCurrentPercentage < randomTriggerPercentage && !isMessaged && GameNetworkManager.Instance.isHostingGame) { ShipEmergencyLeaveRPC(); } } normalizedTimeOfDayB = ___normalizedTimeOfDay; shipLeaveAutomaticallyTimeB = ___shipLeaveAutomaticallyTime; shipLeavingEarlyDialogueB = ___shipLeavingEarlyDialogue; if (isNotCalled) { ___shipLeaveAutomaticallyTime = ___normalizedTimeOfDay + 0.0777f; isNotCalled = false; } } [ClientRpc] public static void ShipEmergencyLeaveRPC() { HUDManager.Instance.ReadDialogue(shipLeavingEarlyDialogueB); EmergencyActivatedBool.leavingActivated = true; isMessaged = true; isNotCalled = true; if (HUDManagerPatch.isTimerEnabled) { HUDManagerPatch.isTimerActivated = true; } if ((Object)(object)Object.FindAnyObjectByType<ShipTeleporter>() != (Object)null) { ShipTeleporter[] array = Object.FindObjectsOfType<ShipTeleporter>(); ShipTeleporter[] array2 = array; foreach (ShipTeleporter val in array2) { val.buttonTrigger.interactable = false; } } ((Component)Object.FindObjectOfType<ShipLights>()).GetComponent<ShipLights>().areLightsOn = false; } } }