Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of BlindItems v1.0.0
BlindItems.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using IL.RoR2.UI; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using On.RoR2.UI; using RiskOfOptions; using RiskOfOptions.Options; using RoR2; using RoR2.UI; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("BlindItems")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BlindItems")] [assembly: AssemblyTitle("BlindItems")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace BlindItems { public class ItemAddressables { public static readonly AssetBundle assets = AssetBundle.LoadFromFile(Path.Combine(Paths.PluginPath, "MarkTullius-BlindItems/blinditemsbundle")); public Sprite whiteSprite = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Scrap/texScrapWhiteIcon.png").WaitForCompletion(); public Sprite greenSprite = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Scrap/texScrapGreenIcon.png").WaitForCompletion(); public Sprite redSprite = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Scrap/texScrapRedIcon.png").WaitForCompletion(); public Sprite bossSprite = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Scrap/texScrapYellowIcon.png").WaitForCompletion(); public Sprite voidWhiteSprite = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/DLC1/ScrapVoid/texVoidScrapWhiteIcon.png").WaitForCompletion(); public Sprite voidGreenSprite = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/DLC1/ScrapVoid/texVoidScrapGreenIcon.png").WaitForCompletion(); public Sprite voidRedSprite = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/DLC1/ScrapVoid/texVoidScrapRedIcon.png").WaitForCompletion(); public Sprite lunarSprite = assets.LoadAsset<Sprite>("texScrapLunarIcon.png"); public Sprite equipSprite = assets.LoadAsset<Sprite>("texScrapEquipmentIcon.png"); public Sprite voidBossSprite = assets.LoadAsset<Sprite>("texVoidScrapBossIcon.png"); public static Sprite modIcon = assets.LoadAsset<Sprite>("modIcon.png"); } public class ItemInventory { public ItemInventory() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown GameEndReportPanelController.SetDisplayData += (hook_SetDisplayData)delegate(orig_SetDisplayData orig, GameEndReportPanelController self, DisplayData newDisplayData) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown ItemIcon.SetItemIndex += new Manipulator(AllocateItemIcons); EquipmentCatalog.GetEquipmentDef += new hook_GetEquipmentDef(AllocateEquipIcon); orig.Invoke(self, newDisplayData); ItemIcon.SetItemIndex -= new Manipulator(AllocateItemIcons); EquipmentCatalog.GetEquipmentDef -= new hook_GetEquipmentDef(AllocateEquipIcon); }; } public void AllocateItemIcons(ILContext context) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(context); MethodInfo method = typeof(ItemCatalog).GetMethod("GetItemDef"); val.GotoNext(new Func<Instruction, bool>[1] { (Instruction i) => ILPatternMatchingExt.MatchCall(i, (MethodBase)method) }); val.Remove(); method = typeof(Notifications).GetMethod("GetOrigItemDef"); val.Emit(OpCodes.Call, (MethodBase)method); } public EquipmentDef AllocateEquipIcon(orig_GetEquipmentDef orig, EquipmentIndex equipmentIndex) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return Notifications.GetOrigEquipDef(equipmentIndex); } } [BepInPlugin("MarkTullius.BlindItems", "BlindItems", "1.0.0")] public class Main : BaseUnityPlugin { public const string PluginGUID = "MarkTullius.BlindItems"; public const string PluginAuthor = "MarkTullius"; public const string PluginName = "BlindItems"; public const string PluginVersion = "1.0.0"; private Obfuscate _obfuscate; private Notifications _notifs; private Randomise _randomise; private PrinterFix _printerFix; private ItemInventory _itemInventory; public static List<ItemDef> itemNotifications; public static List<EquipmentDef> equipNotifications; public const string desc = "Obscures the pickup models and inventory icons, for items and equipments, by replacing them with '?' to add a cursed challenge where you don't know what you're picking up (scrapping/printing) until you have done so."; public static ConfigEntry<bool> RandomiseOrder { get; set; } public static ConfigEntry<bool> ObscureEquipment { get; set; } public static ConfigEntry<bool> ObscureNotifs { get; set; } public void Awake() { InitConfig(); if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions")) { BuildSettings(); } else { Debug.Log((object)"Risk of Options is not installed, skipping setup."); } itemNotifications = new List<ItemDef>(); equipNotifications = new List<EquipmentDef>(); _obfuscate = new Obfuscate(itemNotifications, equipNotifications); if (!ObscureNotifs.Value) { _notifs = new Notifications(itemNotifications, equipNotifications); } _randomise = new Randomise(); _printerFix = new PrinterFix(); _itemInventory = new ItemInventory(); } public void InitConfig() { RandomiseOrder = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Randomise Item Order Each Stage", false, "Turn on to randomise the order of your items every time you load into a new stage."); ObscureEquipment = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Obscure Current Equipment", true, "Turn off to retain the icon for your currently held equipment(s). Requires a restart"); ObscureNotifs = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Obscure Notifications", false, "Turn off to retain the icon and descriptions upon pickup/printing/scrapping. Requires a restart"); } public void BuildSettings() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown ModSettingsManager.SetModDescription("Obscures the pickup models and inventory icons, for items and equipments, by replacing them with '?' to add a cursed challenge where you don't know what you're picking up (scrapping/printing) until you have done so.", "MarkTullius.BlindItems", "BlindItems"); ModSettingsManager.SetModIcon(ItemAddressables.modIcon); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(RandomiseOrder)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ObscureEquipment, true)); } } public class Notifications { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_PushEquipmentNotification <>9__9_0; internal void <PushEquipmentNotification>b__9_0(orig_PushEquipmentNotification orig, CharacterMaster characterMaster, EquipmentIndex equipmentIndex) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Invalid comparison between Unknown and I4 //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Expected O, but got Unknown orig.Invoke(characterMaster, (EquipmentIndex)(-1)); EquipmentDef origEquipDef = GetOrigEquipDef(equipmentIndex); if (!((NetworkBehaviour)characterMaster).hasAuthority) { Debug.LogError((object)("Can't PushItemNotification for " + Util.GetBestMasterName(characterMaster) + " because they aren't local.")); return; } CharacterMasterNotificationQueue notificationQueueForMaster = CharacterMasterNotificationQueue.GetNotificationQueueForMaster(characterMaster); if (Object.op_Implicit((Object)(object)notificationQueueForMaster) && (int)equipmentIndex != -1 && !((Object)(object)origEquipDef == (Object)null)) { float num = 6f; notificationQueueForMaster.PushNotification(new NotificationInfo((object)origEquipDef, (TransformationInfo)null), num); } } } public static List<ItemDef> itemNotifs; public static List<EquipmentDef> equipNotifs; private const float AddedNotificationDuration = 6f; private const float RemovedNotificationDuration = 3f; public Notifications(List<ItemDef> itemNotifications, List<EquipmentDef> equipNotifications) { itemNotifs = itemNotifications; equipNotifs = equipNotifications; Awake(); } public void Awake() { PushItemNotification(); PushItemRemovalNotification(); PushEquipmentNotification(); } public void PushItemNotification() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown CharacterMasterNotificationQueue.PushItemNotification += (hook_PushItemNotification)delegate(orig_PushItemNotification orig, CharacterMaster characterMaster, ItemIndex itemIndex) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown orig.Invoke(characterMaster, (ItemIndex)(-1)); ItemDef origItemDef = GetOrigItemDef(itemIndex); CharacterMasterNotificationQueue notificationQueueForMaster = CharacterMasterNotificationQueue.GetNotificationQueueForMaster(characterMaster); if (ItemNotificationHandler(characterMaster, itemIndex, origItemDef, notificationQueueForMaster)) { float num = 6f; notificationQueueForMaster.PushNotification(new NotificationInfo((object)origItemDef, (TransformationInfo)null), num); } }; } public void PushItemRemovalNotification() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown PurchaseInteraction.CreateItemTakenOrb += (hook_CreateItemTakenOrb)delegate(orig_CreateItemTakenOrb orig, Vector3 effectOrigin, GameObject targetObject, ItemIndex itemIndex) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(effectOrigin, targetObject, itemIndex); BuildItemRemovalNotification(itemIndex); }; ScrapperController.CreateItemTakenOrb += (hook_CreateItemTakenOrb)delegate(orig_CreateItemTakenOrb orig, Vector3 effectOrigin, GameObject targetObject, ItemIndex itemIndex) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(effectOrigin, targetObject, itemIndex); BuildItemRemovalNotification(itemIndex); }; } public void BuildItemRemovalNotification(ItemIndex itemIndex) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown CharacterMaster master = PlayerCharacterMasterController._instances[0].master; ItemDef origItemDef = GetOrigItemDef(itemIndex); CharacterMasterNotificationQueue notificationQueueForMaster = CharacterMasterNotificationQueue.GetNotificationQueueForMaster(master); if (ItemNotificationHandler(master, itemIndex, origItemDef, notificationQueueForMaster)) { float num = 3f; TransformationInfo val = new TransformationInfo((TransformationType)3, (object)origItemDef); NotificationInfo val2 = new NotificationInfo((object)ItemCatalog.GetItemDef(itemIndex), val); notificationQueueForMaster.PushNotification(val2, num); } } public void PushEquipmentNotification() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__9_0; if (obj == null) { hook_PushEquipmentNotification val = delegate(orig_PushEquipmentNotification orig, CharacterMaster characterMaster, EquipmentIndex equipmentIndex) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Invalid comparison between Unknown and I4 //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Expected O, but got Unknown orig.Invoke(characterMaster, (EquipmentIndex)(-1)); EquipmentDef origEquipDef = GetOrigEquipDef(equipmentIndex); if (!((NetworkBehaviour)characterMaster).hasAuthority) { Debug.LogError((object)("Can't PushItemNotification for " + Util.GetBestMasterName(characterMaster) + " because they aren't local.")); } else { CharacterMasterNotificationQueue notificationQueueForMaster = CharacterMasterNotificationQueue.GetNotificationQueueForMaster(characterMaster); if (Object.op_Implicit((Object)(object)notificationQueueForMaster) && (int)equipmentIndex != -1 && !((Object)(object)origEquipDef == (Object)null)) { float num = 6f; notificationQueueForMaster.PushNotification(new NotificationInfo((object)origEquipDef, (TransformationInfo)null), num); } } }; <>c.<>9__9_0 = val; obj = (object)val; } CharacterMasterNotificationQueue.PushEquipmentNotification += (hook_PushEquipmentNotification)obj; } public static ItemDef GetOrigItemDef(ItemIndex itemIndex) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) return itemNotifs.Find((ItemDef itemDef) => itemDef.itemIndex == itemIndex); } public static EquipmentDef GetOrigEquipDef(EquipmentIndex equipmentIndex) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) return equipNotifs.Find((EquipmentDef equipDef) => equipDef.equipmentIndex == equipmentIndex); } public bool ItemNotificationHandler(CharacterMaster characterMaster, ItemIndex itemIndex, ItemDef itemDef, CharacterMasterNotificationQueue notificationQueue) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Invalid comparison between Unknown and I4 if (!((NetworkBehaviour)characterMaster).hasAuthority) { Debug.LogError((object)("Can't PushItemNotification for " + Util.GetBestMasterName(characterMaster) + " because they aren't local.")); return false; } if (Object.op_Implicit((Object)(object)notificationQueue) && (int)itemIndex != -1 && ((Object)(object)itemDef == (Object)null || itemDef.hidden)) { return false; } return true; } } public class Obfuscate { public const string itemName = "???"; private const string itemDescription = "?????"; private readonly ItemAddressables _addressables; public Obfuscate(List<ItemDef> itemNotifications, List<EquipmentDef> equipNotifications) { _addressables = new ItemAddressables(); Awake(itemNotifications, equipNotifications); } public void Awake(List<ItemDef> itemNotifications, List<EquipmentDef> equipNotifications) { ObfuscateItems(itemNotifications); ObfuscateEquipments(equipNotifications); } public void ObfuscateItems(List<ItemDef> itemNotifications) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown ItemCatalog.SetItemDefs += (hook_SetItemDefs)delegate(orig_SetItemDefs orig, ItemDef[] itemDefs) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Invalid comparison between Unknown and I4 //IL_00a4: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(itemDefs); foreach (ItemDef val in itemDefs) { ItemDef val2 = ScriptableObject.CreateInstance<ItemDef>(); val2.itemIndex = val.itemIndex; val2.pickupIconSprite = val.pickupIconSprite; val2.nameToken = val.nameToken; val2.pickupToken = val.pickupToken; val2.hidden = val.hidden; itemNotifications.Add(val2); if ((int)val.deprecatedTier != 5) { val.pickupModelPrefab = PickupCatalog.GetHiddenPickupDisplayPrefab(); val.nameToken = "???"; val.pickupToken = "?????"; val.pickupIconSprite = GetPickupIconSprite(val.deprecatedTier); } } }; } public void ObfuscateEquipments(List<EquipmentDef> equipNotifications) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown EquipmentCatalog.SetEquipmentDefs += (hook_SetEquipmentDefs)delegate(orig_SetEquipmentDefs orig, EquipmentDef[] equipDefs) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(equipDefs); foreach (EquipmentDef val in equipDefs) { EquipmentDef val2 = ScriptableObject.CreateInstance<EquipmentDef>(); val2.equipmentIndex = val.equipmentIndex; val2.pickupIconSprite = val.pickupIconSprite; val2.nameToken = val.nameToken; val2.pickupToken = val.pickupToken; equipNotifications.Add(val2); val.pickupModelPrefab = PickupCatalog.GetHiddenPickupDisplayPrefab(); val.nameToken = "???"; val.pickupToken = "?????"; val.descriptionToken = "?????"; if (Main.ObscureEquipment.Value) { val.pickupIconSprite = _addressables.equipSprite; } } }; } public Sprite GetPickupIconSprite(ItemTier tier) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected I4, but got Unknown return (Sprite)((int)tier switch { 0 => _addressables.whiteSprite, 1 => _addressables.greenSprite, 2 => _addressables.redSprite, 4 => _addressables.bossSprite, 3 => _addressables.lunarSprite, 6 => _addressables.voidWhiteSprite, 7 => _addressables.voidGreenSprite, 8 => _addressables.voidRedSprite, 9 => _addressables.voidBossSprite, _ => null, }); } } public class PrinterFix { private const float yPos = 2.5f; public PrinterFix() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown InteractableSpawnCard.Spawn += new hook_Spawn(CorrectPickupPosition); } public void CorrectPickupPosition(orig_Spawn orig, InteractableSpawnCard self, Vector3 position, Quaternion rotation, DirectorSpawnRequest directorSpawnRequest, ref SpawnResult result) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, position, rotation, directorSpawnRequest, ref result); GameObject spawnedInstance = result.spawnedInstance; if (!((Object)spawnedInstance).name.Contains("Duplicator")) { return; } Transform child = spawnedInstance.transform.GetChild(0); if ((Object)(object)child != (Object)null && child.childCount > 2) { Transform child2 = child.GetChild(2); if ((Object)(object)child2 != (Object)null) { Vector3 localPosition = ((Component)child2).transform.localPosition; Vector3 localPosition2 = default(Vector3); ((Vector3)(ref localPosition2))..ctor(localPosition.x, 2.5f, localPosition.z); ((Component)spawnedInstance.transform.GetChild(0).GetChild(2)).transform.localPosition = localPosition2; } else { Debug.LogError((object)"Pickup display not found. Unable to adjust model height."); } } else { Debug.LogError((object)"Printer does not appear to have the correct number of children."); } } } public class Randomise { public Randomise() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown Stage.Start += new hook_Start(ShuffleItemOrder); } public void ShuffleItemOrder(orig_Start orig, Stage self) { orig.Invoke(self); if (Main.RandomiseOrder.Value) { List<ItemIndex> itemAcquisitionOrder = PlayerCharacterMasterController._instances[0].master.inventory.itemAcquisitionOrder; Util.ShuffleList<ItemIndex>(itemAcquisitionOrder); PlayerCharacterMasterController._instances[0].master.inventory.itemAcquisitionOrder = itemAcquisitionOrder; } } } }