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 FindRemainingValuables v2.5.0
FindRemainingValuables.dll
Decompiled 9 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.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using TMPro; using UnityEngine; using UnityEngine.SceneManagement; [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("QNCNXW8R")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+d0d59f8b85e99fdf63a7645c43621de0dce46fb6")] [assembly: AssemblyProduct("FindRemainingValuables")] [assembly: AssemblyTitle("FindRemainingValuables")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.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 FindRemainingValuables { [BepInPlugin("QNCNXW8R.FindRemainingValuables", "FindRemainingValuables", "2.5.0")] public class FindRemainingValuables : BaseUnityPlugin { [CompilerGenerated] private sealed class <EnableHaulUIAfterDelay>d__35 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public HaulUI ui; public float delay; public FindRemainingValuables <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <EnableHaulUIAfterDelay>d__35(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(delay); <>1__state = 1; return true; case 1: <>1__state = -1; ((Behaviour)ui).enabled = true; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <PeriodicValueCheck>d__31 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public FindRemainingValuables <>4__this; private ValuableObject[] <valuables>5__1; private float <totalValue>5__2; private RoundDirector <director>5__3; private float <undiscoveredValue>5__4; private float <currentHaul>5__5; private int <goal>5__6; private float <threshold>5__7; private float <remainingValue>5__8; private float <thresholdValue>5__9; private int <totalPoints>5__10; private int <completedPoints>5__11; private float <goalPerPoint>5__12; private List<GameObject>.Enumerator <>s__13; private GameObject <pointObj>5__14; private ExtractionPoint <point>5__15; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <PeriodicValueCheck>d__31(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <valuables>5__1 = null; <director>5__3 = null; <>s__13 = default(List<GameObject>.Enumerator); <pointObj>5__14 = null; <point>5__15 = null; <>1__state = -2; } private bool MoveNext() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Invalid comparison between Unknown and I4 switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; <valuables>5__1 = Object.FindObjectsOfType<ValuableObject>(); <totalValue>5__2 = <valuables>5__1.Sum((ValuableObject v) => v.dollarValueCurrent); <director>5__3 = Object.FindObjectOfType<RoundDirector>(); if ((Object)(object)<director>5__3 == (Object)null || !SemiFunc.RunIsLevel()) { break; } <>4__this.isHostOrSingleplayer = !GameManager.Multiplayer() || PhotonNetwork.IsMasterClient; if (<>4__this.awaitingActiveExtraction && <director>5__3.extractionPointActive && (Object)(object)<director>5__3.extractionPointCurrent != (Object)null) { <>4__this.awaitingActiveExtraction = false; <>4__this.AlertEnemies(); } <undiscoveredValue>5__4 = <valuables>5__1.Where((ValuableObject v) => !v.discovered).Sum((ValuableObject v) => v.dollarValueCurrent); <>4__this.previousRemainingValue = <undiscoveredValue>5__4; if (<undiscoveredValue>5__4 == 0f && <>4__this.previousRemainingValue > 0f) { <>4__this.ForceReveal(); } <currentHaul>5__5 = <director>5__3.currentHaul; if (GoalType.Value == "LevelGoal") { <goal>5__6 = <director>5__3.haulGoal; <totalPoints>5__10 = <director>5__3.extractionPoints; <completedPoints>5__11 = <director>5__3.extractionPointsCompleted; if (<totalPoints>5__10 > 0 && <director>5__3.extractionPointList != null) { <goalPerPoint>5__12 = (float)<director>5__3.haulGoal / (float)<totalPoints>5__10; <>s__13 = <director>5__3.extractionPointList.GetEnumerator(); try { while (<>s__13.MoveNext()) { <pointObj>5__14 = <>s__13.Current; <point>5__15 = <pointObj>5__14.GetComponent<ExtractionPoint>(); if ((Object)(object)<point>5__15 != (Object)null && (int)<point>5__15.currentState == 7) { <currentHaul>5__5 += <goalPerPoint>5__12; } <point>5__15 = null; <pointObj>5__14 = null; } } finally { ((IDisposable)<>s__13).Dispose(); } <>s__13 = default(List<GameObject>.Enumerator); } } else if (GoalType.Value == "ExtractionGoal") { <goal>5__6 = <director>5__3.extractionHaulGoal; } else if (GoalType.Value == "LevelLoot") { <goal>5__6 = (int)<totalValue>5__2; } else { <goal>5__6 = 1; } <threshold>5__7 = RevealThreshold.Value; if (GoalType.Value == "Extractions") { <remainingValue>5__8 = <director>5__3.extractionPoints - <director>5__3.extractionPointsCompleted; } else if (TrackingMethod.Value == "Haul") { <remainingValue>5__8 = <totalValue>5__2 - <currentHaul>5__5; } else { <remainingValue>5__8 = <undiscoveredValue>5__4; } <thresholdValue>5__9 = (float)<goal>5__6 * <threshold>5__7; if (<remainingValue>5__8 <= <thresholdValue>5__9 && <goal>5__6 > 0 && (<director>5__3.extractionPointActive || <director>5__3.extractionPointsCompleted > 0) && <>4__this.isHostOrSingleplayer) { <>4__this.ForceReveal(); <>4__this.previousRemainingValue = 0f; } if ((EnableLogging?.Value).Value) { Logger.LogInfo((object)$"Current Haul: {<currentHaul>5__5}, Goal: {<goal>5__6}"); Logger.LogInfo((object)$"Missing Value: {<remainingValue>5__8}, Threshold: {<thresholdValue>5__9}"); } <valuables>5__1 = null; <director>5__3 = null; break; } <>2__current = (object)new WaitForSeconds(5f); <>1__state = 1; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private bool isHostOrSingleplayer = false; private bool sceneReady = false; private bool hasRevealedThisScene = false; private float previousRemainingValue = -1f; private bool awaitingActiveExtraction = false; public static ConfigEntry<float>? RevealThreshold; public static ConfigEntry<string>? TrackingMethod; public static ConfigEntry<string>? GoalType; public static ConfigEntry<bool>? NotificationSound; public static ConfigEntry<bool>? EnemiesRespond; public static ConfigEntry<string>? AlertDifficulty; public static ConfigEntry<bool>? EnableHotkeys; public static ConfigEntry<KeyboardShortcut>? RevealKeybind; public static ConfigEntry<bool>? EnableLogging; internal static FindRemainingValuables Instance { get; private set; } internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { 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_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Expected O, but got Unknown //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Expected O, but got Unknown //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Expected O, but got Unknown //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Expected O, but got Unknown Instance = this; RevealThreshold = ((BaseUnityPlugin)this).Config.Bind<float>("General", "RevealThreshold", 0.1f, new ConfigDescription("Proportion of goal remaining before revealing all valuables: 0 is never, 1 is always in LevelLoot mode, 4 is probably always in other modes", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 4f), Array.Empty<object>())); TrackingMethod = ((BaseUnityPlugin)this).Config.Bind<string>("General", "TrackingMethod", "Haul", new ConfigDescription("Method to track progress towards the threshold", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[2] { "Haul", "Discovery" }), Array.Empty<object>())); GoalType = ((BaseUnityPlugin)this).Config.Bind<string>("General", "GoalType", "LevelLoot", new ConfigDescription("Which goal to use when calculating reveal threshold: ExtractionGoal, LevelGoal, LevelLoot, Extractions", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[4] { "ExtractionGoal", "LevelGoal", "LevelLoot", "Extractions" }), Array.Empty<object>())); NotificationSound = ((BaseUnityPlugin)this).Config.Bind<bool>("Notification", "NotificationSound", true, "If true, enables the notification sound when the reveal is triggered"); EnemiesRespond = ((BaseUnityPlugin)this).Config.Bind<bool>("Notification", "EnemiesRespond", false, "If true, causes enemies to investigate when the reveal is triggered"); AlertDifficulty = ((BaseUnityPlugin)this).Config.Bind<string>("Notification", "AlertDifficulty", "Investigate", new ConfigDescription("How strongly enemies respond when valuables are revealed", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[5] { "Investigate", "Sweep", "Purge", "Annihilation", "Dynamic" }), Array.Empty<object>())); EnableHotkeys = ((BaseUnityPlugin)this).Config.Bind<bool>("Controls", "EnableHotkeys", true, "If true, enables hotkeys"); RevealKeybind = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Controls", "RevealKeybind", new KeyboardShortcut((KeyCode)291, Array.Empty<KeyCode>()), new ConfigDescription("Key to press to reveal all remaining valuables", (AcceptableValueBase)null, new object[1] { "HideFromREPOConfig" })); EnableLogging = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "EnableLogging", false, "If true, prints debug data to console"); ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Patch(); SceneManager.sceneLoaded += OnSceneLoaded; Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); } internal void Patch() { //IL_001a: 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_0021: Expected O, but got Unknown //IL_0026: Expected O, but got Unknown if (Harmony == null) { Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony val2 = val; Harmony = val; } Harmony.PatchAll(); ((MonoBehaviour)this).StartCoroutine(PeriodicValueCheck()); } internal void Unpatch() { Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { sceneReady = true; hasRevealedThisScene = false; awaitingActiveExtraction = false; } internal void Update() { //IL_0031: 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_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) if (!sceneReady || hasRevealedThisScene || !isHostOrSingleplayer || !EnableHotkeys.Value) { return; } KeyboardShortcut value = RevealKeybind.Value; if ((int)((KeyboardShortcut)(ref value)).MainKey != 0) { value = RevealKeybind.Value; if (((KeyboardShortcut)(ref value)).IsDown()) { Logger.LogInfo((object)"Force reveal triggered by keybind"); ForceReveal(); } } } [IteratorStateMachine(typeof(<PeriodicValueCheck>d__31))] private IEnumerator PeriodicValueCheck() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <PeriodicValueCheck>d__31(0) { <>4__this = this }; } internal void ForceReveal() { if (hasRevealedThisScene) { return; } hasRevealedThisScene = true; ValuableObject[] array = Object.FindObjectsOfType<ValuableObject>(); float num = array.Where((ValuableObject v) => !v.discovered).Sum((ValuableObject v) => v.dollarValueCurrent); if (num == 0f) { num = previousRemainingValue; } ValuableObject[] array2 = array; foreach (ValuableObject val in array2) { if (!val.discovered) { val.Discover((State)0); } } if (NotificationSound.Value) { PlayNotificationSound(); } ShowHaulMessage($"${Mathf.RoundToInt(num)} of Valuables Revealed!"); if (EnemiesRespond.Value) { AlertEnemies(); } Logger.LogInfo((object)"Revealed valuables."); } public void PlayNotificationSound() { //IL_0055: 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_005a: 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) AudioClip val = ((IEnumerable<AudioClip>)Resources.FindObjectsOfTypeAll<AudioClip>()).FirstOrDefault((Func<AudioClip, bool>)((AudioClip c) => ((Object)c).name.Equals("valuable tracker target found"))); if ((Object)(object)val != (Object)null) { Vector3 val2 = (((Object)(object)Camera.main != (Object)null) ? ((Component)Camera.main).transform.position : Vector3.zero); Logger.LogInfo((object)("Playing Audio: " + ((Object)val).name)); AudioSource.PlayClipAtPoint(val, val2); } else { Logger.LogWarning((object)"AudioClip 'valuable tracker target found' not found."); } } private void ShowHaulMessage(string message, float duration = 2f) { //IL_0065: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)HaulUI.instance == (Object)null) { Logger.LogWarning((object)"HaulUI.instance not found."); return; } HaulUI instance = HaulUI.instance; ((Behaviour)instance).enabled = false; object? value = AccessTools.Field(typeof(HaulUI), "Text").GetValue(instance); TextMeshProUGUI val = (TextMeshProUGUI)((value is TextMeshProUGUI) ? value : null); if ((Object)(object)val != (Object)null) { ((TMP_Text)val).text = message; } ((SemiUI)instance).SemiUITextFlashColor(Color.yellow, duration); ((SemiUI)instance).SemiUISpringShakeY(2f, 4f, 1f); ((MonoBehaviour)instance).StartCoroutine(EnableHaulUIAfterDelay(instance, duration)); } [IteratorStateMachine(typeof(<EnableHaulUIAfterDelay>d__35))] private IEnumerator EnableHaulUIAfterDelay(HaulUI ui, float delay) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <EnableHaulUIAfterDelay>d__35(0) { <>4__this = this, ui = ui, delay = delay }; } private void AlertEnemies() { //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0215: 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_021d: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_0225: 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_023a: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_02ca: Unknown result type (might be due to invalid IL or missing references) //IL_02e0: Unknown result type (might be due to invalid IL or missing references) string text; if (AlertDifficulty?.Value == "Dynamic") { string[] array = new string[5] { "None", "Investigate", "Sweep", "Purge", "Annihilation" }; text = array[SemiFunc.MoonLevel()]; } else { text = AlertDifficulty?.Value; } if (text == "None") { Logger.LogInfo((object)"Moon Phase 0: Not alerting enemies"); return; } RoundDirector val = Object.FindObjectOfType<RoundDirector>(); if ((Object)(object)val == (Object)null) { Logger.LogWarning((object)"RoundDirector not found."); return; } if (!val.extractionPointActive || (Object)(object)val.extractionPointCurrent == (Object)null) { Logger.LogInfo((object)"No active extraction point to alert enemies to. Awaiting activation"); awaitingActiveExtraction = true; return; } EnemyDirector val2 = Object.FindObjectOfType<EnemyDirector>(); if ((Object)(object)val2 == (Object)null || val2.enemiesSpawned == null) { Logger.LogWarning((object)"EnemyDirector or enemiesSpawned list not found."); return; } if (text == "Purge" || text == "Annihilation") { foreach (EnemyParent item in val2.enemiesSpawned) { if ((Object)(object)item != (Object)null && !item.Spawned) { item.Spawn(); if ((EnableLogging?.Value).Value) { Logger.LogInfo((object)("Respawned enemy: " + ((Object)item).name)); } } } } Transform transform = ((Component)val.extractionPointCurrent).transform; Vector3 forward = transform.forward; Vector3 right = transform.right; Vector3 val3 = transform.position; if (text != "Annihilation") { val3 += forward * 5f; } if (1 == 0) { } float num = text switch { "Investigate" => 40f, "Sweep" => 80f, "Purge" => 200f, "Annihilation" => 200f, _ => 80f, }; if (1 == 0) { } float num2 = num; bool flag = text == "Investigate"; val2.SetInvestigate(val3, num2, flag); Logger.LogInfo((object)$"Alerted all enemies to investigate {val3}"); } } }