Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of ScannerPlusOne v2.7.1
ScannerPlusOne.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.Versioning; using BepInEx; using BepInEx.Configuration; using On.RoR2; using R2API.Utils; using RoR2; using RoR2.UI; using UnityEngine; using UnityEngine.Networking; [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("ScannerPlusOne")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("ScannerPlusOne")] [assembly: AssemblyTitle("ScannerPlusOne")] [assembly: AssemblyVersion("1.0.0.0")] namespace ScannerPlusOne; public static class Reflection { private static readonly BindingFlags _defaultFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; public static TReturn GetFieldValue<TReturn>(this object instance, string fieldName) { return (TReturn)instance.GetType().GetField(fieldName, _defaultFlags | BindingFlags.Instance).GetValue(instance); } public static TReturn GetFieldValue<TClass, TReturn>(string fieldName) { return typeof(TClass).GetFieldValue<TReturn>(fieldName); } public static TReturn GetFieldValue<TReturn>(this Type type, string fieldName) { return (TReturn)type.GetField(fieldName, _defaultFlags | BindingFlags.Static).GetValue(null); } public static void SetFieldValue(this object instance, string fieldName, object value) { instance.GetType().GetField(fieldName, _defaultFlags | BindingFlags.Instance).SetValue(instance, value); } public static void SetFieldValue<TClass>(string fieldName, object value) { typeof(TClass).SetFieldValue(fieldName, value); } public static void SetFieldValue(this Type type, string fieldName, object value) { type.GetField(fieldName, _defaultFlags | BindingFlags.Static).SetValue(null, value); } public static TReturn GetPropertyValue<TReturn>(this object instance, string propName) { return (TReturn)instance.GetType().GetProperty(propName, _defaultFlags | BindingFlags.Instance).GetValue(instance); } public static TReturn GetPropertyValue<TClass, TReturn>(string propName) { return typeof(TClass).GetPropertyValue<TReturn>(propName); } public static TReturn GetPropertyValue<TReturn>(this Type type, string propName) { return (TReturn)type.GetProperty(propName, _defaultFlags | BindingFlags.Static).GetValue(null); } public static void SetPropertyValue(this object instance, string propName, object value) { instance.GetType().GetProperty(propName, _defaultFlags | BindingFlags.Instance).SetValue(instance, value); } public static void SetPropertyValue<TClass>(string propName, object value) { typeof(TClass).SetPropertyValue(propName, value); } public static void SetPropertyValue(this Type type, string propName, object value) { type.GetProperty(propName, _defaultFlags | BindingFlags.Static).SetValue(null, value); } public static TReturn InvokeMethod<TReturn>(this object instance, string methodName, params object[] methodParams) { return (TReturn)instance.GetType().GetMethod(methodName, _defaultFlags | BindingFlags.Instance).Invoke(instance, methodParams); } public static TReturn InvokeMethod<TClass, TReturn>(string methodName, params object[] methodParams) { return typeof(TClass).InvokeMethod<TReturn>(methodName, methodParams); } public static TReturn InvokeMethod<TReturn>(this Type type, string methodName, params object[] methodParams) { return (TReturn)type.GetMethod(methodName, _defaultFlags | BindingFlags.Static).Invoke(null, methodParams); } public static void InvokeMethod(this object instance, string methodName, params object[] methodParams) { instance.InvokeMethod<object>(methodName, methodParams); } public static void InvokeMethod<TClass>(string methodName, params object[] methodParams) { InvokeMethod<TClass, object>(methodName, methodParams); } public static void InvokeMethod(this Type type, string methodName, params object[] methodParams) { InvokeMethod<object>(methodName, methodParams); } public static Type GetNestedType<TParent>(string name) { return GetNestedType(typeof(TParent), name); } public static Type GetNestedType(this Type parentType, string name) { return parentType.GetNestedType(name, BindingFlags.Public | BindingFlags.NonPublic); } public static object Instantiate(this Type type) { return Activator.CreateInstance(type, nonPublic: true); } public static object InstantiateGeneric<TClass>(Type typeArgument) { return typeof(TClass).InstantiateGeneric(typeArgument); } public static object InstantiateGeneric(this Type genericType, Type typeArgument) { return genericType.MakeGenericType(typeArgument).Instantiate(); } public static object InstantiateGeneric<TClass>(Type[] typeArguments) { return typeof(TClass).InstantiateGeneric(typeArguments); } public static object InstantiateGeneric(this Type genericType, Type[] typeArguments) { return genericType.MakeGenericType(typeArguments).Instantiate(); } public static IList InstantiateList(this Type type) { return (IList)typeof(List<>).MakeGenericType(type).Instantiate(); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.MagnusMagnuson.ScannerPlusOne", "ScannerPlusOne", "2.7.1")] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class ScannerPlusOne : BaseUnityPlugin { private List<PendingRevealInteractable> interactableList = new List<PendingRevealInteractable>(); public static ConfigWrapper<bool> UseScannerChat; public static ConfigWrapper<bool> UseScannerIcons; public static ConfigWrapper<bool> ShowQuestionMarks; public static ConfigWrapper<int> IconTransparency; public static ConfigWrapper<bool> ShowBarrels; public static ConfigWrapper<string> BarrelColor; public static ConfigWrapper<bool> ShowChests; public static ConfigWrapper<string> ChestColor; public static ConfigWrapper<bool> ShowEquipment; public static ConfigWrapper<string> EquipmentColor; public static ConfigWrapper<bool> ShowLunarChests; public static ConfigWrapper<string> LunarChestColor; public static ConfigWrapper<bool> ShowShrines; public static ConfigWrapper<string> ShrineColor; public static ConfigWrapper<bool> ShowChanceShrines; public static ConfigWrapper<string> ChanceShrineColor; public static ConfigWrapper<bool> ShowIndividualShrines; public static ConfigWrapper<bool> ShowBloodShrines; public static ConfigWrapper<string> BloodShrineColor; public static ConfigWrapper<bool> ShowCombatShrines; public static ConfigWrapper<string> CombatShrineColor; public static ConfigWrapper<bool> ShowMountainShrines; public static ConfigWrapper<string> MountainShrineColor; public static ConfigWrapper<bool> ShowGoldShrines; public static ConfigWrapper<string> GoldShrineColor; public static ConfigWrapper<bool> ShowWoodShrines; public static ConfigWrapper<string> WoodShrineColor; public static ConfigWrapper<bool> ShowOrderShrines; public static ConfigWrapper<string> OrderShrineColor; public static ConfigWrapper<bool> ShowCleanseShrines; public static ConfigWrapper<string> CleanseShrineColor; public static ConfigWrapper<bool> ShowDrones; public static ConfigWrapper<string> DroneColor; public static ConfigWrapper<bool> ShowTurrets; public static ConfigWrapper<string> TurretColor; public static ConfigWrapper<bool> ShowDuplicator; public static ConfigWrapper<string> DuplicatorColor; public static ConfigWrapper<bool> ShowCategoryChestDamage; public static ConfigWrapper<string> CategoryChestDamageColor; public static ConfigWrapper<bool> ShowCategoryChestHealing; public static ConfigWrapper<string> CategoryChestHealingColor; public static ConfigWrapper<bool> ShowCategoryChestUtility; public static ConfigWrapper<string> CategoryChestUtilityColor; public static ConfigWrapper<bool> ShowRusty; public static ConfigWrapper<string> RustyColor; public static ConfigWrapper<bool> ShowNewtAltar; public static ConfigWrapper<string> NewtAltarColor; public static ConfigWrapper<bool> ShowTeleporter; public static ConfigWrapper<string> TeleporterColor; public static ConfigWrapper<bool> ShowScrapper; public static ConfigWrapper<string> ScrapperColor; public static ConfigWrapper<string> VoidChestColor; public static ConfigWrapper<string> VoidBarrelColor; public static ConfigWrapper<bool> LegacyMode; public static ConfigWrapper<bool> ShowBarrelsChat; public static ConfigWrapper<bool> ShowChestsChat; public static ConfigWrapper<bool> ShowEquipmentChat; public static ConfigWrapper<bool> ShowLunarChestsChat; public static ConfigWrapper<bool> ShowShrinesChat; public static ConfigWrapper<bool> ShowIndividualShrinesChat; public static ConfigWrapper<bool> ShowChanceShrinesChat; public static ConfigWrapper<bool> ShowBloodShrinesChat; public static ConfigWrapper<bool> ShowCombatShrinesChat; public static ConfigWrapper<bool> ShowMountainShrinesChat; public static ConfigWrapper<bool> ShowGoldShrinesChat; public static ConfigWrapper<bool> ShowWoodShrinesChat; public static ConfigWrapper<bool> ShowOrderShrinesChat; public static ConfigWrapper<bool> ShowCleanseShrinesChat; public static ConfigWrapper<bool> ShowDronesAndTurretsChat; public static ConfigWrapper<bool> ShowDuplicatorChat; public static ConfigWrapper<bool> ShowCategoryChestDamageChat; public static ConfigWrapper<bool> ShowCategoryChestHealingChat; public static ConfigWrapper<bool> ShowCategoryChestUtilityChat; public static ConfigWrapper<bool> ShowRustyChat; public static ConfigWrapper<bool> ShowNewtAltarChat; public static ConfigWrapper<bool> ShowScrapperChat; public void InitConfig() { UseScannerChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("1. Turn on/off components", "UseScannerChat", "The scanner tells you in the chat how many gold purchaseables (chests, equipment barrels and chance shrines) and lunar chests are left.", true); UseScannerIcons = ((BaseUnityPlugin)this).Config.Wrap<bool>("1. Turn on/off components", "UseScannerIcons", "Instead of question marks, the scanner reveals what kind of interactable (e.g. chest, duplicator, teleporter etc) there really are.", true); ShowQuestionMarks = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowQuestionMarks", "If this is turned on, hidden scanner icons will not simply be gone, but instead appear as question marks.", true); IconTransparency = ((BaseUnityPlugin)this).Config.Wrap<int>("3. ScannerIcons", "IconTransparency", "Determine the transparency of the scanner icons. Valid values range from 0 to 255. O being fully transparent and 255 being fully opaque.", 122); ShowBarrels = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowBarrels", "Whether money barrels should show up on the scanner.", false); BarrelColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "BarrelColor", "Color for the money barrel icon (chest) that shows up on the scanner.", "#05cea5"); ShowChests = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowChests", "Whether money chests should show up on the scanner.", true); ChestColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "ChestColor", "Color for the chest icon (chest) that shows up on the scanner.", "#f9da0c"); ShowEquipment = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowEquipment", "Whether equipment barrels should show up on the scanner.", true); EquipmentColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "EquipmentColor", "Color for the equipment barrel icon (chest) that shows up on the scanner.", "#ff8019"); ShowLunarChests = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowLunarChests", "Whether lunar chests should show up on the scanner.", true); LunarChestColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "LunarChestColor", "Color for the lunar chest icon (chest) that shows up on the scanner.", "#1822ad"); ShowShrines = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowShrines", "Whether shrines should show up on the scanner.", true); ShrineColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "ShrineColor", "Color for the shrine icon (shrine) that shows up on the scanner.", "#6d523b"); ShowIndividualShrines = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowIndividualShrines", "Whether shrines should use individual config when showing up on the scanner.", true); ShowChanceShrines = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowChanceShrines", "(Only matters if ShowIndividualShrines is set to true) Whether chance shrines should show up on the scanner.", true); ChanceShrineColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "ChanceShrineColor", "Color for the chance shrine icon (shrine) that shows up on the scanner.", "#c4f743"); ShowBloodShrines = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowBloodShrines", "(Only matters if ShowIndividualShrines is set to true) Whether blood shrines should show up on the scanner.", true); BloodShrineColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "BloodShrineColor", "Color for the blood shrine icon (shrine) that shows up on the scanner.", "#f76363"); ShowCombatShrines = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowCombatShrines", "(Only matters if ShowIndividualShrines is set to true) Whether combat shrines should show up on the scanner.", true); CombatShrineColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "CombatShrineColor", "Color for the combat shrine icon (shrine) that shows up on the scanner.", "#fab8ff"); ShowMountainShrines = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowMountainShrines", "(Only matters if ShowIndividualShrines is set to true) Whether mountain shrines should show up on the scanner.", true); MountainShrineColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "MountainShrineColor", "Color for the mountain shrine icon (shrine) that shows up on the scanner.", "#4dc3ff"); ShowGoldShrines = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowGoldShrines", "(Only matters if ShowIndividualShrines is set to true) Whether gold shrines should show up on the scanner.", true); GoldShrineColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "GoldShrineColor", "Color for the gold shrine icon (shrine) that shows up on the scanner.", "#b5b507"); ShowWoodShrines = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowWoodShrines", "(Only matters if ShowIndividualShrines is set to true) Whether wood shrines should show up on the scanner.", true); WoodShrineColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "WoodShrineColor", "Color for the wood shrine icon (shrine) that shows up on the scanner.", "#006e0d"); ShowOrderShrines = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowOrderShrines", "(Only matters if ShowIndividualShrines is set to true) Whether order shrines should show up on the scanner.", true); OrderShrineColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "OrderShrineColor", "Color for the order shrine icon (shrine) that shows up on the scanner.", "#dbf7ff"); ShowCleanseShrines = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowCleanseShrines", "(Only matters if ShowIndividualShrines is set to true) Whether cleansing pool should show up on the scanner.", true); CleanseShrineColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "CleanseShrineColor", "Color for the cleansing pool icon (shrine) that shows up on the scanner.", "#0033cc"); ShowDrones = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowDrones", "Whether drones should show up on the scanner.", true); DroneColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "DroneColor", "Color for the drone icon (drone) that shows up on the scanner.", "#005919"); ShowTurrets = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowTurrets", "Whether turrets should show up on the scanner.", true); TurretColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "TurretColor", "Color for the turret icon (drone) that shows up on the scanner.", "#005919"); ShowDuplicator = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowDuplicator", "Whether duplicators should show up on the scanner.", true); DuplicatorColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "DuplicatorColor", "Color for the duplicator icon (chest) that shows up on the scanner.", "#538daa"); ShowScrapper = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowScrapper", "Whether scrappers should show up on the scanner.", true); ScrapperColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "ScrapperColor", "Color for the scrapper icon (bag) that shows up on the scanner.", "#48f542"); ShowCategoryChestDamage = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowCategoryChestDamage", "Whether the new Damage Chest should show up on the scanner.", true); CategoryChestDamageColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "CategoryChestDamageColor", "Color for the new Damage Chest that shows up on the scanner.", "#8a3226"); ShowCategoryChestHealing = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowCategoryChestHealing", "Whether the new Healing Chest should show up on the scanner.", true); CategoryChestHealingColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "CategoryChestHealingColor", "Color for the new Healing Chest that shows up on the scanner.", "#2e9348"); ShowCategoryChestUtility = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowCategoryChestUtility", "Whether the new Utility Chest should show up on the scanner.", true); CategoryChestUtilityColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "CategoryChestUtilityColor", "Color for the new Utility Chest that shows up on the scanner.", "#843e87"); ShowRusty = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowRusty", "Whether Rusty Boxes should show up on the scanner.", true); RustyColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "RustyColor", "Color for the Rusty Lockbox icon (chest) that shows up on the scanner.", "#eaeaea"); ShowNewtAltar = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowNewtAltar", "Whether newt altars should show up on the scanner.", false); NewtAltarColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "NewtAltarColor", "Color for the newt altar icon (teleporter icon, because too many chest icons and it basically is a teleporter) that shows up on the scanner.", "#1139ff"); ShowTeleporter = ((BaseUnityPlugin)this).Config.Wrap<bool>("3. ScannerIcons", "ShowTeleporter", "Whether the teleporter should show up on the scanner.", true); TeleporterColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "TeleporterColor", "Color for the Teleporter icon (teleporter) that shows up on the scanner.", "#590808"); VoidChestColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "VoidChestColor", "Color for the void chest icon (chest) that shows up on the scanner.", "#964092"); VoidBarrelColor = ((BaseUnityPlugin)this).Config.Wrap<string>("3. ScannerIcons", "VoidBarrelColor", "Color for the void money barrel icon (chest) that shows up on the scanner.", "#964092"); LegacyMode = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "LegacyMode", "Whether to use the Scanner's chat message settings from before v2.0.0", false); ShowBarrelsChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowBarrelsChat", "Whether to add money barrels to the scanner chat notification.", false); ShowChestsChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowChestsChat", "Whether to add chests to the scanner chat notification.", true); ShowEquipmentChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowEquipmentChat", "Whether to add equipment barrels to the scanner chat notification.", true); ShowLunarChestsChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowLunarChestsChat", "Whether to add lunar chests to the scanner chat notification.", false); ShowShrinesChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowShrinesChat", "Whether to add shrines to the scanner chat notification.", true); ShowIndividualShrinesChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowIndividualShrinesChat", "Whether to list the individual shrine types, rather than summing them up, in the chat notification.", true); ShowChanceShrinesChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowChanceShrinesChat", "(Only matters if you set ShowIndividualShrinesChat to true) Whether to add chance shrines to the scanner chat notification.", true); ShowBloodShrinesChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowBloodShrinesChat", "(Only matters if you set ShowIndividualShrinesChat to true) Whether to add blood shrines to the scanner chat notification.", true); ShowCombatShrinesChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowCombatShrinesChat", "(Only matters if you set ShowIndividualShrinesChat to true) Whether to add combat shrines to the scanner chat notification.", true); ShowMountainShrinesChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowMountainShrinesChat", "(Only matters if you set ShowIndividualShrinesChat to true) Whether to add mountain shrines to the scanner chat notification.", true); ShowGoldShrinesChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowGoldShrinesChat", "(Only matters if you set ShowIndividualShrinesChat to true) Whether to add gold shrines to the scanner chat notification.", true); ShowWoodShrinesChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowWoodShrinesChat", "(Only matters if you set ShowIndividualShrinesChat to true) Whether to add wood shrines to the scanner chat notification.", true); ShowOrderShrinesChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowOrderShrinesChat", "(Only matters if you set ShowIndividualShrinesChat to true) Whether to add order shrines to the scanner chat notification.", true); ShowCleanseShrinesChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowCleanseShrinesChat", "(Only matters if you set ShowIndividualShrinesChat to true) Whether to add cleansing pool to the scanner chat notification.", true); ShowDronesAndTurretsChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowDronesAndTurretsChat", "Whether to add drones and turrets to the scanner chat notification.", true); ShowDuplicatorChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowDuplicatorChat", "Whether to add duplicators to the scanner chat notification.", false); ShowScrapperChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowScrapperChat", "Whether to add scrappers to the scanner chat notification.", false); ShowCategoryChestDamageChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowCategoryChestDamageChat", "Whether to add the new Damage Chest to the scanner chat notification.", true); ShowCategoryChestHealingChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowCategoryChestHealingChat", "Whether to add the new Healing Chest to the scanner chat notification.", true); ShowCategoryChestUtilityChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowCategoryChestUtilityChat", "Whether to add the new Utility Chest to the scanner chat notification.", true); ShowRustyChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowRustyChat", "Whether to add rusty lockbox to the scanner chat notification.", false); ShowNewtAltarChat = ((BaseUnityPlugin)this).Config.Wrap<bool>("2. ScannerChat", "ShowNewtAltarChat", "Whether to add newt altars to the scanner chat notification.", false); } public void Awake() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown InitConfig(); ChestRevealer.FixedUpdate += (hook_FixedUpdate)delegate(orig_FixedUpdate orig, ChestRevealer self) { //IL_0006: 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_001c: 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_0057: 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) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Expected O, but got Unknown //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: 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) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) FixedTimeStamp fieldValue = self.GetFieldValue<FixedTimeStamp>("nextPulse"); if (((FixedTimeStamp)(ref fieldValue)).hasPassed) { self.SetFieldValue("nextPulse", FixedTimeStamp.now + self.pulseInterval); ChatTreasureInfo cti = new ChatTreasureInfo(); interactableList = new List<PendingRevealInteractable>(); Vector3 footPosition = CameraRigController.readOnlyInstancesList[0].targetBody.footPosition; Type[] array = (from t in typeof(ChestRevealer).Assembly.GetTypes() where typeof(IInteractable).IsAssignableFrom(t) select t).ToArray(); string text = ""; int num = 0; for (int i = 0; i < array.Length; i++) { foreach (MonoBehaviour item2 in InstanceTracker.FindInstancesEnumerable(array[i])) { if (((IInteractable)item2).ShouldShowOnScanner()) { string text2 = ((object)(IInteractable)item2).ToString().ToLower(); text = text + text2.Split(' ')[0] + " "; num++; if (num == 5) { num = 0; text += "\n"; } if (UseScannerChat.Value) { if (LegacyMode.Value) { addTreasureInfoLegacy(cti, text2); } else { addTreasureInfo(cti, text2); } } if (UseScannerIcons.Value) { PendingRevealInteractable.ItemType itemType = PendingRevealInteractable.GetItemType(text2); if (skipInstance(itemType, text2)) { if (ShowQuestionMarks.Value) { addQuestionMark(self, ((Component)item2).transform); } } else { Vector3 val = ((Component)item2).transform.position - footPosition; float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude; _ = self.radius; _ = self.radius; float num2 = 1f / self.pulseTravelSpeed; float num3 = Mathf.Sqrt(sqrMagnitude) * num2; PendingRevealInteractable item = new PendingRevealInteractable(((Component)item2).gameObject, FixedTimeStamp.now + num3, itemType); interactableList.Add(item); } } } } } if (UseScannerIcons.Value) { Pulse(self, array); } else { self.Pulse(); } if (UseScannerChat.Value) { printChatTreasureInfo(cti); } } }; ChestRevealer.StaticFixedUpdate += (hook_StaticFixedUpdate)delegate(orig_StaticFixedUpdate orig) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(); if (CameraRigController.readOnlyInstancesList.Count > 0) { CharacterBody targetBody = CameraRigController.readOnlyInstancesList[0].targetBody; if (Object.op_Implicit((Object)(object)targetBody)) { _ = targetBody.footPosition; interactableList.Sort(); while (interactableList.Count > 0) { PendingRevealInteractable pendingRevealInteractable = interactableList[0]; if (!((FixedTimeStamp)(ref pendingRevealInteractable.time)).hasPassed) { break; } if (Object.op_Implicit((Object)(object)pendingRevealInteractable.gameObject)) { createPingIndicator(pendingRevealInteractable); } interactableList.RemoveAt(0); } } } }; } private bool skipSpecificShrine(string item) { if (item.Contains("chance")) { return !ShowChanceShrines.Value; } if (item.Contains("blood")) { return !ShowBloodShrines.Value; } if (item.Contains("combat")) { return !ShowChanceShrines.Value; } if (item.Contains("boss")) { return !ShowMountainShrines.Value; } if (item.Contains("gold")) { return !ShowGoldShrines.Value; } if (item.Contains("healing")) { return !ShowWoodShrines.Value; } if (item.Contains("restack")) { return !ShowOrderShrines.Value; } if (item.Contains("cleanse")) { return !ShowCleanseShrines.Value; } return true; } private void addQuestionMark(ChestRevealer self, Transform revealableTransform) { //IL_0006: 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_0028: 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) //IL_0078: 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) Vector3 position = ((Component)self).transform.position; _ = self.radius; _ = self.radius; float num = 1f / self.pulseTravelSpeed; Vector3 val = revealableTransform.position - position; float num2 = Mathf.Sqrt(((Vector3)(ref val)).sqrMagnitude) * num; object obj = Activator.CreateInstance(typeof(ChestRevealer).GetNestedType("PendingReveal", BindingFlags.NonPublic), nonPublic: true); obj.SetFieldValue("gameObject", ((Component)revealableTransform).gameObject); obj.SetFieldValue("time", FixedTimeStamp.now + num2); obj.SetFieldValue("duration", self.revealDuration); BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; typeof(ChestRevealer).GetField("pendingReveals", bindingAttr).GetValue(null).InvokeMethod("Add", obj); } private void addTreasureInfo(ChatTreasureInfo cti, string item) { if (item.Contains("voidtriple")) { cti.voidmultishopCount++; return; } if (item.Contains("multi")) { cti.multishopCount++; return; } switch (PendingRevealInteractable.GetItemType(item)) { case PendingRevealInteractable.ItemType.Barrel: cti.moneyBarrelsCount++; break; case PendingRevealInteractable.ItemType.ItemChest: cti.itemTreasureCount++; break; case PendingRevealInteractable.ItemType.EquipmentChest: cti.equipmentTreasureCount++; break; case PendingRevealInteractable.ItemType.Drone: cti.dronesCount++; break; case PendingRevealInteractable.ItemType.Turret: cti.turretsCount++; break; case PendingRevealInteractable.ItemType.LunarChest: cti.lunarTreasureCount++; break; case PendingRevealInteractable.ItemType.Rusty: cti.rustyCount++; break; case PendingRevealInteractable.ItemType.Shrine: cti.shrineCount++; if (ShowIndividualShrinesChat.Value) { countSpecificShrine(cti, item); } break; case PendingRevealInteractable.ItemType.Duplicator: cti.duplicatorCount++; break; case PendingRevealInteractable.ItemType.CategoryChestDamage: cti.damageChestCount++; break; case PendingRevealInteractable.ItemType.CategoryChestHealing: cti.healingChestCount++; break; case PendingRevealInteractable.ItemType.CategoryChestUtility: cti.utilityChestCount++; break; case PendingRevealInteractable.ItemType.NewtAltar: cti.newtAltarCount++; break; case PendingRevealInteractable.ItemType.Scrapper: cti.scrapperCount++; break; case PendingRevealInteractable.ItemType.VoidChest: cti.itemTreasureCount++; break; case PendingRevealInteractable.ItemType.VoidBarrel: cti.moneyBarrelsCount++; break; case PendingRevealInteractable.ItemType.Multi: case PendingRevealInteractable.ItemType.Teleporter: case PendingRevealInteractable.ItemType.Invalid: break; } } private void countSpecificShrine(ChatTreasureInfo cti, string item) { if (item.Contains("chance")) { cti.chanceShrineCount++; } else if (item.Contains("blood")) { cti.bloodShrineCount++; } else if (item.Contains("combat")) { cti.combatShrineCount++; } else if (item.Contains("boss")) { cti.mountainShrineCount++; } else if (item.Contains("gold")) { cti.goldShrineCount++; } else if (item.Contains("healing")) { cti.woodShrineCount++; } else if (item.Contains("restack")) { cti.orderShrineCount++; } else if (item.Contains("cleanse")) { cti.cleanseShrineCount++; } } private bool skipInstance(PendingRevealInteractable.ItemType itemType, string item) { switch (itemType) { case PendingRevealInteractable.ItemType.Barrel: return !ShowBarrels.Value; case PendingRevealInteractable.ItemType.VoidBarrel: return !ShowBarrels.Value; case PendingRevealInteractable.ItemType.ItemChest: return !ShowChests.Value; case PendingRevealInteractable.ItemType.VoidChest: return !ShowChests.Value; case PendingRevealInteractable.ItemType.EquipmentChest: return !ShowEquipment.Value; case PendingRevealInteractable.ItemType.Drone: return !ShowDrones.Value; case PendingRevealInteractable.ItemType.Turret: return !ShowTurrets.Value; case PendingRevealInteractable.ItemType.LunarChest: return !ShowLunarChests.Value; case PendingRevealInteractable.ItemType.Multi: return !ShowChests.Value; case PendingRevealInteractable.ItemType.Rusty: return !ShowRusty.Value; case PendingRevealInteractable.ItemType.Shrine: if (ShowShrines.Value && ShowIndividualShrines.Value) { return skipSpecificShrine(item); } return !ShowShrines.Value; case PendingRevealInteractable.ItemType.Duplicator: return !ShowDuplicator.Value; case PendingRevealInteractable.ItemType.Scrapper: return !ShowScrapper.Value; case PendingRevealInteractable.ItemType.CategoryChestDamage: return !ShowCategoryChestDamage.Value; case PendingRevealInteractable.ItemType.CategoryChestHealing: return !ShowCategoryChestHealing.Value; case PendingRevealInteractable.ItemType.CategoryChestUtility: return !ShowCategoryChestUtility.Value; case PendingRevealInteractable.ItemType.NewtAltar: return !ShowNewtAltar.Value; case PendingRevealInteractable.ItemType.Teleporter: return !ShowTeleporter.Value; case PendingRevealInteractable.ItemType.Invalid: return true; default: return true; } } private void createPingIndicator(PendingRevealInteractable pending) { //IL_000e: 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_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: 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_0042: 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_0088: 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) NetworkIdentity component = pending.gameObject.GetComponent<NetworkIdentity>(); PingInfo val = default(PingInfo); val.active = true; val.targetNetworkIdentity = component; val.origin = ((Component)component).transform.TransformPoint(((Component)component).transform.position); PingInfo val2 = val; PingIndicator component2 = ((GameObject)Object.Instantiate(Resources.Load("Prefabs/PingIndicator"))).GetComponent<PingIndicator>(); component2.pingOwner = ((Component)CharacterMaster.readOnlyInstancesList.First()).gameObject; component2.SetFieldValue("pingDuration", 1f); component2.pingOrigin = val2.origin; component2.pingTarget = ((PingInfo)(ref val2)).targetGameObject; RebuildPingOwn(component2); } public void RebuildPingOwn(PingIndicator pingIndicator) { //IL_0032: 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_00c9: Expected O, but got Unknown //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Invalid comparison between Unknown and I4 //IL_00cc: 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_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_023b: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_02dd: Unknown result type (might be due to invalid IL or missing references) //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_029a: Unknown result type (might be due to invalid IL or missing references) //IL_02c1: Unknown result type (might be due to invalid IL or missing references) //IL_0362: Unknown result type (might be due to invalid IL or missing references) //IL_037e: Unknown result type (might be due to invalid IL or missing references) //IL_039a: Unknown result type (might be due to invalid IL or missing references) //IL_03b6: Unknown result type (might be due to invalid IL or missing references) //IL_03fe: Unknown result type (might be due to invalid IL or missing references) //IL_03da: Unknown result type (might be due to invalid IL or missing references) //IL_0422: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_021f: Unknown result type (might be due to invalid IL or missing references) //IL_0346: Unknown result type (might be due to invalid IL or missing references) //IL_032c: Unknown result type (might be due to invalid IL or missing references) pingIndicator.positionIndicator.targetTransform = (Object.op_Implicit((Object)(object)pingIndicator.pingTarget) ? pingIndicator.pingTarget.transform : null); pingIndicator.positionIndicator.defaultPosition = ((Component)this).transform.position; IDisplayNameProvider componentInParent = ((Component)this).GetComponentInParent<IDisplayNameProvider>(); pingIndicator.SetFieldValue("pingType", (object)(PingType)2); ((Behaviour)pingIndicator.pingObjectScaleCurve).enabled = false; ((Behaviour)pingIndicator.pingObjectScaleCurve).enabled = true; GameObject[] defaultPingGameObjects = pingIndicator.defaultPingGameObjects; defaultPingGameObjects = pingIndicator.interactablePingGameObjects; for (int i = 0; i < defaultPingGameObjects.Length; i++) { defaultPingGameObjects[i].SetActive(false); } if (Object.op_Implicit((Object)(object)pingIndicator.pingTarget)) { pingIndicator.pingTarget.GetComponent<ModelLocator>(); if (componentInParent != null) { pingIndicator.SetFieldValue("pingType", (object)(PingType)2); } } if (Object.op_Implicit((Object)(MonoBehaviour)componentInParent)) { Util.GetBestBodyName(((Component)(MonoBehaviour)componentInParent).gameObject); } ((Behaviour)pingIndicator.pingText).enabled = false; if ((int)pingIndicator.GetFieldValue<PingType>("pingType") == 2) { pingIndicator.SetFieldValue("pingColor", pingIndicator.interactablePingColor); pingIndicator.SetFieldValue("pingDuration", 10f); pingIndicator.SetFieldValue("pingTargetPurchaseInteraction", pingIndicator.pingTarget.GetComponent<PurchaseInteraction>()); Sprite sprite = Resources.Load<Sprite>("Textures/MiscIcons/texInventoryIconOutlined"); SpriteRenderer component = pingIndicator.interactablePingGameObjects[0].GetComponent<SpriteRenderer>(); component.color = Color32.op_Implicit(new Color32((byte)206, (byte)6, (byte)166, (byte)122)); pingIndicator.pingTarget.GetComponent<ShopTerminalBehavior>(); string text = ((Object)pingIndicator.pingTarget.gameObject).name.ToLower(); switch (PendingRevealInteractable.GetItemType(text)) { case PendingRevealInteractable.ItemType.Barrel: component.color = getColorFromHex(BarrelColor.Value); break; case PendingRevealInteractable.ItemType.VoidBarrel: component.color = getColorFromHex(VoidBarrelColor.Value); break; case PendingRevealInteractable.ItemType.ItemChest: component.color = getColorFromHex(ChestColor.Value); break; case PendingRevealInteractable.ItemType.VoidChest: component.color = getColorFromHex(VoidChestColor.Value); break; case PendingRevealInteractable.ItemType.EquipmentChest: component.color = getColorFromHex(EquipmentColor.Value); break; case PendingRevealInteractable.ItemType.Drone: sprite = Resources.Load<Sprite>("Textures/MiscIcons/texDroneIconOutlined"); component.color = getColorFromHex(DroneColor.Value); break; case PendingRevealInteractable.ItemType.Turret: sprite = Resources.Load<Sprite>("Textures/MiscIcons/texDroneIconOutlined"); component.color = getColorFromHex(TurretColor.Value); break; case PendingRevealInteractable.ItemType.LunarChest: component.color = getColorFromHex(LunarChestColor.Value); break; case PendingRevealInteractable.ItemType.Rusty: component.color = getColorFromHex(RustyColor.Value); break; case PendingRevealInteractable.ItemType.Shrine: sprite = Resources.Load<Sprite>("Textures/MiscIcons/texShrineIconOutlined"); if (!ShowIndividualShrines.Value) { component.color = getColorFromHex(ShrineColor.Value); } else { component.color = getColorFromHex(getSpecificShrineColor(text)); } break; case PendingRevealInteractable.ItemType.Duplicator: component.color = getColorFromHex(DuplicatorColor.Value); break; case PendingRevealInteractable.ItemType.CategoryChestDamage: component.color = getColorFromHex(CategoryChestDamageColor.Value); break; case PendingRevealInteractable.ItemType.CategoryChestHealing: component.color = getColorFromHex(CategoryChestHealingColor.Value); break; case PendingRevealInteractable.ItemType.CategoryChestUtility: component.color = getColorFromHex(CategoryChestUtilityColor.Value); break; case PendingRevealInteractable.ItemType.NewtAltar: sprite = Resources.Load<Sprite>("Textures/MiscIcons/texTeleporterIconOutlined"); component.color = getColorFromHex(NewtAltarColor.Value); break; case PendingRevealInteractable.ItemType.Teleporter: sprite = Resources.Load<Sprite>("Textures/MiscIcons/texTeleporterIconOutlined"); component.color = getColorFromHex(TeleporterColor.Value); break; case PendingRevealInteractable.ItemType.Scrapper: sprite = Resources.Load<Sprite>("Textures/MiscIcons/texLootIconOutlined"); component.color = getColorFromHex(ScrapperColor.Value); break; } defaultPingGameObjects = pingIndicator.interactablePingGameObjects; for (int j = 0; j < defaultPingGameObjects.Length; j++) { defaultPingGameObjects[j].SetActive(true); } component.sprite = sprite; } pingIndicator.SetFieldValue("fixedTimer", pingIndicator.GetFieldValue<float>("pingDuration")); } private string getSpecificShrineColor(string interactableName) { if (interactableName.Contains("chance")) { return ChanceShrineColor.Value; } if (interactableName.Contains("blood")) { return BloodShrineColor.Value; } if (interactableName.Contains("combat")) { return CombatShrineColor.Value; } if (interactableName.Contains("boss")) { return MountainShrineColor.Value; } if (interactableName.Contains("gold")) { return GoldShrineColor.Value; } if (interactableName.Contains("healing")) { return WoodShrineColor.Value; } if (interactableName.Contains("restack")) { return OrderShrineColor.Value; } if (interactableName.Contains("cleanse")) { return CleanseShrineColor.Value; } return "#ff9900"; } public void Pulse(ChestRevealer self, Type[] arr) { //IL_0006: 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_002d: 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_0033: 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_0052: Expected O, but got Unknown Vector3 position = ((Component)self).transform.position; _ = self.radius; _ = self.radius; _ = 1f / self.pulseTravelSpeed; EffectManager.SpawnEffect(self.pulseEffectPrefab, new EffectData { origin = position, scale = self.radius * self.pulseEffectScale }, false); } private Color getColorFromHex(string hexColor) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) Color result = default(Color); ((Color)(ref result))..ctor(0f, 0f, 0f, 1f); if (!hexColor.StartsWith("#")) { hexColor = "#" + hexColor; } ColorUtility.TryParseHtmlString(hexColor, ref result); result.a = (float)IconTransparency.Value / 255f; return result; } private void addTreasureInfoLegacy(ChatTreasureInfo cti, string purchaseable) { if (purchaseable.StartsWith("chest") || purchaseable.StartsWith("voidchest") || purchaseable.Contains("shrinechance") || purchaseable.Contains("goldchest") || purchaseable.Contains("casino")) { cti.goldTreasureCount++; } else if (purchaseable.Contains("lunarchest")) { cti.lunarTreasureCount++; } else if (purchaseable.Contains("multishop")) { cti.multishopCount++; } else if (purchaseable.Contains("voidtriple")) { cti.voidmultishopCount++; } else if (purchaseable.Contains("equipment")) { cti.goldTreasureCount++; cti.equipmentTreasureCount++; } } private void printChatTreasureInfo(ChatTreasureInfo cti) { if (LegacyMode.Value) { if (cti.multishopCount + cti.voidmultishopCount != 0) { cti.goldTreasureCount += cti.multishopCount / 3 + cti.voidmultishopCount; } Chat.AddMessage(constructTreasuresLeftStringLegacy(cti.goldTreasureCount, cti.equipmentTreasureCount, cti.lunarTreasureCount)); } else { if (cti.multishopCount + cti.voidmultishopCount != 0) { cti.multishopCount = cti.multishopCount / 3 + cti.voidmultishopCount; } Chat.AddMessage(constructTreasuresLeftString(cti)); } } private string constructTreasuresLeftString(ChatTreasureInfo cti) { string text = ""; string text2 = ""; if (ShowBarrelsChat.Value && cti.moneyBarrelsCount != 0) { text = ((cti.moneyBarrelsCount != 1) ? "s" : ""); text2 = text2 + "<color=" + BarrelColor.Value + ">" + cti.moneyBarrelsCount + " money barrel" + text + "</color> left.\n"; } if (ShowChestsChat.Value && (cti.itemTreasureCount != 0 || cti.multishopCount != 0)) { text = ((cti.itemTreasureCount != 1) ? "s" : ""); string text3 = ((cti.multishopCount != 1) ? "s" : ""); bool flag = true; if (cti.itemTreasureCount != 0) { text2 = text2 + "<color=" + ChestColor.Value + ">" + cti.itemTreasureCount + " chest" + text + "</color>"; flag = false; } if (cti.multishopCount != 0) { string text4 = ((cti.itemTreasureCount == 0) ? "" : " and "); text2 = text2 + text4 + "<color=" + ChestColor.Value + ">" + cti.multishopCount + " multishop" + text3 + "</color>"; flag = false; } if (!flag) { text2 += " left.\n"; } } if (ShowEquipmentChat.Value && cti.equipmentTreasureCount != 0) { text = ((cti.equipmentTreasureCount != 1) ? "s" : ""); text2 = text2 + "<color=" + EquipmentColor.Value + ">" + cti.equipmentTreasureCount + " equipment barrel" + text + "</color> left.\n"; } if (ShowLunarChestsChat.Value && cti.lunarTreasureCount != 0) { text = ((cti.lunarTreasureCount != 1) ? "s" : ""); text2 = text2 + "<color=" + LunarChestColor.Value + ">" + cti.lunarTreasureCount + " lunar chest" + text + "</color> left.\n"; } if (!ShowIndividualShrinesChat.Value) { if (ShowShrinesChat.Value && cti.shrineCount != 0) { text = ((cti.shrineCount != 1) ? "s" : ""); text2 = text2 + "<color=" + ShrineColor.Value + ">" + cti.shrineCount + " shrine" + text + "</color> left.\n"; } } else if (ShowShrinesChat.Value && cti.shrineCount != 0) { bool flag2 = false; if (ShowChanceShrinesChat.Value && cti.chanceShrineCount != 0) { text = ((cti.chanceShrineCount != 1) ? "s" : ""); text2 = text2 + "<color=" + ChanceShrineColor.Value + ">" + cti.chanceShrineCount + " chance shrine" + text + "</color>"; flag2 = true; } if (ShowBloodShrinesChat.Value && cti.bloodShrineCount != 0) { text = ((cti.bloodShrineCount != 1) ? "s" : ""); if (flag2) { text2 += ", "; } text2 = text2 + "<color=" + BloodShrineColor.Value + ">" + cti.bloodShrineCount + " blood shrine" + text + "</color>"; flag2 = true; } if (ShowCombatShrinesChat.Value && cti.combatShrineCount != 0) { text = ((cti.combatShrineCount != 1) ? "s" : ""); if (flag2) { text2 += ", "; } text2 = text2 + "<color=" + CombatShrineColor.Value + ">" + cti.combatShrineCount + " combat shrine" + text + "</color>"; flag2 = true; } if (ShowMountainShrinesChat.Value && cti.mountainShrineCount != 0) { text = ((cti.mountainShrineCount != 1) ? "s" : ""); if (flag2) { text2 += ", "; } text2 = text2 + "<color=" + MountainShrineColor.Value + ">" + cti.mountainShrineCount + " mountain shrine" + text + "</color>"; flag2 = true; } if (ShowGoldShrinesChat.Value && cti.goldShrineCount != 0) { text = ((cti.goldShrineCount != 1) ? "s" : ""); if (flag2) { text2 += ", "; } text2 = text2 + "<color=" + GoldShrineColor.Value + ">" + cti.goldShrineCount + " gold shrine" + text + "</color>"; flag2 = true; } if (ShowWoodShrinesChat.Value && cti.woodShrineCount != 0) { text = ((cti.woodShrineCount != 1) ? "s" : ""); if (flag2) { text2 += ", "; } text2 = text2 + "<color=" + WoodShrineColor.Value + ">" + cti.woodShrineCount + " wood shrine" + text + "</color>"; flag2 = true; } if (ShowOrderShrinesChat.Value && cti.orderShrineCount != 0) { text = ((cti.orderShrineCount != 1) ? "s" : ""); if (flag2) { text2 += ", "; } text2 = text2 + "<color=" + OrderShrineColor.Value + ">" + cti.orderShrineCount + " order shrine" + text + "</color>"; flag2 = true; } if (ShowCleanseShrinesChat.Value && cti.cleanseShrineCount != 0) { text = ((cti.cleanseShrineCount != 1) ? "s" : ""); if (flag2) { text2 += ", "; } text2 = text2 + "<color=" + CleanseShrineColor.Value + ">" + cti.cleanseShrineCount + " cleansing pool" + text + "</color>"; flag2 = true; } if (flag2) { text2 += " left.\n"; } } if (ShowDronesAndTurretsChat.Value && (cti.dronesCount != 0 || cti.turretsCount != 0)) { text = ((cti.dronesCount != 1) ? "s" : ""); string text5 = ((cti.turretsCount != 1) ? "s" : ""); text2 = text2 + "<color=" + DroneColor.Value + ">" + cti.dronesCount + " drone" + text + "</color> and <color=" + TurretColor.Value + ">" + cti.turretsCount + " turret" + text5 + "</color> left.\n"; } bool flag3 = false; if ((ShowDuplicatorChat.Value || ShowScrapperChat.Value) && (cti.duplicatorCount != 0 || cti.scrapperCount != 0)) { if (ShowDuplicatorChat.Value && cti.duplicatorCount != 0) { text = ((cti.duplicatorCount != 1) ? "s" : ""); text2 = text2 + "<color=" + DuplicatorColor.Value + ">" + cti.duplicatorCount + " duplicator" + text + "</color>"; flag3 = true; } if (ShowScrapperChat.Value && cti.scrapperCount != 0) { text = ((cti.scrapperCount != 1) ? "s" : ""); if (flag3) { text2 += ", "; } text2 = text2 + "<color=" + ScrapperColor.Value + ">" + cti.scrapperCount + " scrapper" + text + "</color>"; flag3 = true; } if (flag3) { text2 += ".\n"; } } flag3 = false; if (ShowCategoryChestDamageChat.Value && cti.damageChestCount != 0) { text = ((cti.damageChestCount != 1) ? "s" : ""); text2 = text2 + "<color=" + CategoryChestDamageColor.Value + ">" + cti.damageChestCount + " damage Chest" + text + "</color>"; flag3 = true; } if (ShowCategoryChestHealingChat.Value && cti.healingChestCount != 0) { text = ((cti.healingChestCount != 1) ? "s" : ""); if (flag3) { text2 += ", "; } text2 = text2 + "<color=" + CategoryChestHealingColor.Value + ">" + cti.healingChestCount + " healing Chest" + text + "</color>"; flag3 = true; } if (ShowCategoryChestUtilityChat.Value && cti.utilityChestCount != 0) { text = ((cti.utilityChestCount != 1) ? "s" : ""); if (flag3) { text2 += ", "; } text2 = text2 + "<color=" + CategoryChestUtilityColor.Value + ">" + cti.utilityChestCount + " utility Chest" + text + "</color>"; flag3 = true; } if (flag3) { text2 += " left.\n"; } if (ShowRustyChat.Value && cti.rustyCount != 0) { text = ((cti.rustyCount != 1) ? "s" : ""); text2 = text2 + "<color=" + RustyColor.Value + ">" + cti.rustyCount + " rusty lockbox" + text + "</color> left.\n"; } if (ShowNewtAltarChat.Value && cti.newtAltarCount != 0) { text = ((cti.newtAltarCount != 1) ? "s" : ""); text2 = text2 + "<color=" + NewtAltarColor.Value + ">" + cti.newtAltarCount + " newt altar" + text + "</color> left.\n"; } text2 = ((text2.Length != 0) ? text2[..text2.LastIndexOf("\n")] : (text2 + "There's nothing left you want.")); return "<color=#8296ae>" + text2 + "</color>"; } private string constructTreasuresLeftStringLegacy(int goldTreasureCount, int equipmentTreasureCount, int lunarTreasureCount) { string text = "<color=#8296ae>"; if (goldTreasureCount == 0) { text += "No <color=#827e3d>gold</color> treasures"; } else { text = text + "<color=#dbd451>" + goldTreasureCount + " gold</color> treasure"; if (goldTreasureCount > 1) { text += "s"; } } text += " left"; if (equipmentTreasureCount > 0) { text = text + " (of those <color=#ff7f00>" + equipmentTreasureCount + " equipment</color> barrel"; if (equipmentTreasureCount > 1) { text += "s"; } text += ")"; } text += "."; if (lunarTreasureCount > 0) { text = text + "\n<color=#5d60cc>" + lunarTreasureCount + " lunar</color> treasure"; if (lunarTreasureCount > 1) { text += "s"; } text += " left."; } return text + "</color>"; } } public class ChatTreasureInfo { public int goldTreasureCount; public int equipmentTreasureCount; public int lunarTreasureCount; public int multishopCount; public int voidmultishopCount; public int itemTreasureCount; public int dronesCount; public int turretsCount; public int moneyBarrelsCount; public int shrineCount; public int newtAltarCount; public int duplicatorCount; public int damageChestCount; public int healingChestCount; public int utilityChestCount; public int rustyCount; public int chanceShrineCount; public int bloodShrineCount; public int combatShrineCount; public int mountainShrineCount; public int goldShrineCount; public int woodShrineCount; public int orderShrineCount; public int cleanseShrineCount; public int scrapperCount; public ChatTreasureInfo() { goldTreasureCount = 0; equipmentTreasureCount = 0; lunarTreasureCount = 0; multishopCount = 0; voidmultishopCount = 0; itemTreasureCount = 0; dronesCount = 0; turretsCount = 0; moneyBarrelsCount = 0; shrineCount = 0; newtAltarCount = 0; duplicatorCount = 0; scrapperCount = 0; damageChestCount = 0; healingChestCount = 0; utilityChestCount = 0; rustyCount = 0; chanceShrineCount = 0; bloodShrineCount = 0; combatShrineCount = 0; mountainShrineCount = 0; goldShrineCount = 0; woodShrineCount = 0; orderShrineCount = 0; cleanseShrineCount = 0; } } public class PendingRevealInteractable : IComparable<PendingRevealInteractable> { public enum ItemType { Barrel, ItemChest, EquipmentChest, LunarChest, Multi, Rusty, Shrine, Drone, Turret, Duplicator, CategoryChestDamage, CategoryChestHealing, CategoryChestUtility, Teleporter, NewtAltar, Invalid, Scrapper, VoidChest, VoidBarrel } public GameObject gameObject; public FixedTimeStamp time; public ItemType itemType; public PendingRevealInteractable(GameObject gameObject, FixedTimeStamp time, ItemType itemType) { //IL_000e: 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) this.gameObject = gameObject; this.time = time; this.itemType = itemType; } public int CompareTo(PendingRevealInteractable other) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) return ((FixedTimeStamp)(ref time)).CompareTo(other.time); } internal static ItemType GetItemType(string item) { if (item.StartsWith("chest") || item.StartsWith("voidchest") || item.Contains("goldchest") || item.Contains("multishop") || item.Contains("casino")) { return ItemType.ItemChest; } if (item.Contains("lunarchest")) { return ItemType.LunarChest; } if (item.Contains("drone")) { return ItemType.Drone; } if (item.Contains("turret")) { return ItemType.Turret; } if (item.Contains("equipment")) { return ItemType.EquipmentChest; } if (item.Contains("shrine")) { return ItemType.Shrine; } if (item.StartsWith("barrel") || item.StartsWith("voidcoinbarrel")) { return ItemType.Barrel; } if (item.Contains("duplicator")) { return ItemType.Duplicator; } if (item.Contains("categorychestdamage")) { return ItemType.CategoryChestDamage; } if (item.Contains("categorychesthealing")) { return ItemType.CategoryChestHealing; } if (item.Contains("categorychestutility")) { return ItemType.CategoryChestUtility; } if (item.Contains("lockbox")) { return ItemType.Rusty; } if (item.Contains("newt")) { return ItemType.NewtAltar; } if (item.Contains("teleporter")) { return ItemType.Teleporter; } if (item.Contains("scrapper")) { return ItemType.Scrapper; } return ItemType.Invalid; } }