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 ScannerPlusOne v2.7.1
ScannerPlusOne.dll
Decompiled a year 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; } }