Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of PingIconsOverhaul v1.4.0
plugins/PingIconsOverhaul/PingIconsOverhaul.dll
Decompiled 5 months 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.Logging; using Microsoft.CodeAnalysis; using R2API.Utils; using RoR2; using RoR2BepInExPack.GameAssetPaths; using UnityEngine; using UnityEngine.AddressableAssets; [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("PingIconsOverhaul")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.4.0.0")] [assembly: AssemblyInformationalVersion("1.4.0+f3fdcd613747beaf162e255f821c8e0114024c53")] [assembly: AssemblyProduct("PingIconsOverhaul")] [assembly: AssemblyTitle("PingIconsOverhaul")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.4.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace PingIconsOverhaul { internal static class Log { private static ManualLogSource? _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } internal struct TexData { public string addressable; public string texName; } [BepInPlugin("NotAJunkie.PingIconsOverhaul", "PingIconsOverhaul", "1.4.0")] public class PingIconsOverhaul : BaseUnityPlugin { public const string PluginGUID = "NotAJunkie.PingIconsOverhaul"; public const string PluginAuthor = "NotAJunkie"; public const string PluginName = "PingIconsOverhaul"; public const string PluginVersion = "1.4.0"; private const string bundleName = "pingiconsoverhaul"; private static AssetBundle? bundle; private static readonly Dictionary<string, TexData> INTERACTABLES = new Dictionary<string, TexData> { { "ShrineCleanse", new TexData { addressable = RoR2_Base_ShrineCleanse.ShrineCleanse_prefab, texName = "texCleansingPoolIcon" } }, { "ShrineCleanseSandy Variant", new TexData { addressable = RoR2_Base_ShrineCleanse_ShrineCleanseSandy.Variant_prefab, texName = "texCleansingPoolIcon" } }, { "ShrineCleanseSnowy Variant", new TexData { addressable = RoR2_Base_ShrineCleanse_ShrineCleanseSnowy.Variant_prefab, texName = "texCleansingPoolIcon" } }, { "Duplicator", new TexData { addressable = RoR2_Base_Duplicator.Duplicator_prefab, texName = "texDuplicatorIcon" } }, { "DuplicatorLarge", new TexData { addressable = RoR2_Base_DuplicatorLarge.DuplicatorLarge_prefab, texName = "texDuplicatorIcon" } }, { "DuplicatorMilitary", new TexData { addressable = RoR2_Base_DuplicatorMilitary.DuplicatorMilitary_prefab, texName = "texDuplicatorIcon" } }, { "DuplicatorWild", new TexData { addressable = RoR2_Base_DuplicatorWild.DuplicatorWild_prefab, texName = "texDuplicatorIcon" } }, { "Barrel1", new TexData { addressable = RoR2_Base_Barrel1.Barrel1_prefab, texName = "texBarrelIcon" } }, { "VoidCoinBarrel", new TexData { addressable = RoR2_DLC1_VoidCoinBarrel.VoidCoinBarrel_prefab, texName = "texVoidStalkIcon" } }, { "Teleporter1", new TexData { addressable = RoR2_Base_Teleporters.Teleporter1_prefab, texName = "texTeleporterIcon" } }, { "LunarTeleporter Variant", new TexData { addressable = RoR2_Base_Teleporters_LunarTeleporter.Variant_prefab, texName = "texMoonTeleporterIcon" } }, { "LunarTeleporterProngs", new TexData { addressable = RoR2_Base_Teleporters.LunarTeleporterProngs_prefab, texName = "texMoonTeleporterIcon" } }, { "MoonBatteryBlood", new TexData { addressable = RoR2_Base_moon2.MoonBatteryBlood_prefab, texName = "texPillarBloodIcon" } }, { "MoonBatteryDesign", new TexData { addressable = RoR2_Base_moon2.MoonBatteryDesign_prefab, texName = "texPillarDesignIcon" } }, { "MoonBatteryMass", new TexData { addressable = RoR2_Base_moon2.MoonBatteryMass_prefab, texName = "texPillarMassIcon" } }, { "MoonBatterySoul", new TexData { addressable = RoR2_Base_moon2.MoonBatterySoul_prefab, texName = "texPillarSoulIcon" } }, { "DeepVoidPortalBattery", new TexData { addressable = RoR2_DLC1_DeepVoidPortalBattery.DeepVoidPortalBattery_prefab, texName = "texVoidSignalIcon" } }, { "NullSafeZone", new TexData { addressable = "", texName = "texCellVentIcon" } }, { "InfiniteTowerSafeWard", new TexData { addressable = RoR2_DLC1_GameModes_InfiniteTowerRun_InfiniteTowerAssets.InfiniteTowerSafeWard_prefab, texName = "texVoidFocusIcon" } }, { "CasinoChest", new TexData { addressable = RoR2_Base_CasinoChest.CasinoChest_prefab, texName = "texAdaptiveChestIcon" } }, { "Chest1", new TexData { addressable = RoR2_Base_Chest1.Chest1_prefab, texName = "texSmallChestIcon" } }, { "CategoryChestDamage", new TexData { addressable = RoR2_Base_CategoryChest.CategoryChestDamage_prefab, texName = "texSmallCatChestDamIcon" } }, { "CategoryChestHealing", new TexData { addressable = RoR2_Base_CategoryChest.CategoryChestHealing_prefab, texName = "texSmallCatChestHealIcon" } }, { "CategoryChestUtility", new TexData { addressable = RoR2_Base_CategoryChest.CategoryChestUtility_prefab, texName = "texSmallCatChestUtilIcon" } }, { "Chest1StealthedVariant", new TexData { addressable = RoR2_Base_Chest1StealthedVariant.Chest1StealthedVariant_prefab, texName = "texCloackedChestIcon" } }, { "EquipmentBarrel", new TexData { addressable = RoR2_Base_EquipmentBarrel.EquipmentBarrel_prefab, texName = "texEquipmentBarrelIcon" } }, { "Chest2", new TexData { addressable = RoR2_Base_Chest2.Chest2_prefab, texName = "texLargeChestIcon" } }, { "CategoryChest2Damage Variant", new TexData { addressable = RoR2_DLC1_CategoryChest2_CategoryChest2Damage.Variant_prefab, texName = "texLargeCatChestDamIcon" } }, { "CategoryChest2Healing Variant", new TexData { addressable = RoR2_DLC1_CategoryChest2_CategoryChest2Healing.Variant_prefab, texName = "texLargeCatChestHealIcon" } }, { "CategoryChest2Utility Variant", new TexData { addressable = RoR2_DLC1_CategoryChest2_CategoryChest2Utility.Variant_prefab, texName = "texLargeCatChestUtilIcon" } }, { "MultiShopEquipment", new TexData { addressable = RoR2_Base_MultiShopEquipmentTerminal.MultiShopEquipmentTerminal_prefab, texName = "texTripleshopEquipmentIcon" } }, { "MultiShopTerminal", new TexData { addressable = RoR2_Base_MultiShopTerminal.MultiShopTerminal_prefab, texName = "texTripleShopIcon" } }, { "MultiShopLargeTerminal", new TexData { addressable = RoR2_Base_MultiShopLargeTerminal.MultiShopLargeTerminal_prefab, texName = "texTripleShopIcon" } }, { "GoldChest", new TexData { addressable = RoR2_Base_GoldChest.GoldChest_prefab, texName = "texLegendaryChestIcon" } }, { "LunarChest", new TexData { addressable = RoR2_Base_LunarChest.LunarChest_prefab, texName = "texLunarPodIcon" } }, { "Lockbox", new TexData { addressable = RoR2_Base_TreasureCache.Lockbox_prefab, texName = "texRustyLockboxIcon" } }, { "ScavBackpack", new TexData { addressable = RoR2_Base_Scav.ScavBackpack_prefab, texName = "texScavBackpackIcon" } }, { "FreeChestTerminalShippingDrone", new TexData { addressable = RoR2_DLC1_FreeChestTerminalShippingDrone.FreeChestTerminalShippingDrone_prefab, texName = "texCrashedDeliveryIcon" } }, { "LockboxVoid", new TexData { addressable = RoR2_DLC1_TreasureCacheVoid.LockboxVoid_prefab, texName = "texEncrustedCacheIcon" } }, { "VoidChest", new TexData { addressable = RoR2_DLC1_VoidChest.VoidChest_prefab, texName = "texVoidCradleIcon" } }, { "VoidTriple", new TexData { addressable = RoR2_DLC1_VoidTriple.VoidTriple_prefab, texName = "texVoidPotentialIcon" } }, { "FragmentPotentialPickup", new TexData { addressable = RoR2_DLC2.FragmentPotentialPickup_prefab, texName = "texAurelioniteFragmentIcon" } }, { "Drone1Broken", new TexData { addressable = RoR2_Base_Drones.Drone1Broken_prefab, texName = "texCombatDroneIcon" } }, { "EmergencyDroneBroken", new TexData { addressable = RoR2_Base_Drones.EmergencyDroneBroken_prefab, texName = "texEmergencyDroneIcon" } }, { "EquipmentDroneBroken", new TexData { addressable = RoR2_Base_Drones.EquipmentDroneBroken_prefab, texName = "texEquipmentDroneIcon" } }, { "Drone2Broken", new TexData { addressable = RoR2_Base_Drones.Drone2Broken_prefab, texName = "texHealingDroneIcon" } }, { "FlameDroneBroken", new TexData { addressable = RoR2_Base_Drones.FlameDroneBroken_prefab, texName = "texIncineratorDroneIcon" } }, { "LemurianEgg", new TexData { addressable = RoR2_CU8_LemurianEgg.LemurianEgg_prefab, texName = "texLemurianDroneIcon" } }, { "MissileDroneBroken", new TexData { addressable = RoR2_Base_Drones.MissileDroneBroken_prefab, texName = "texMissileDroneIcon" } }, { "MegaDroneBroken", new TexData { addressable = RoR2_Base_Drones.MegaDroneBroken_prefab, texName = "texTC280DroneIcon" } }, { "Turret1Broken", new TexData { addressable = RoR2_Base_Drones.Turret1Broken_prefab, texName = "texTurretDroneIcon" } }, { "SetpiecePickup", new TexData { addressable = RoR2_Base_Common.SetpiecePickup_prefab, texName = "texArtifactPickupIcon" } }, { "CommandCube", new TexData { addressable = RoR2_Base_Command.CommandCube_prefab, texName = "texCommandEssenceIcon" } }, { "GenericPickup", new TexData { addressable = RoR2_Base_Common.GenericPickup_prefab, texName = "texGenericPickupIcon" } }, { "LogPickup", new TexData { addressable = RoR2_Base_Common.LogPickup_prefab, texName = "texLogbookEntryIcon" } }, { "QuestVolatileBatteryWorldPickup", new TexData { addressable = RoR2_Base_QuestVolatileBattery.QuestVolatileBatteryWorldPickup_prefab, texName = "texFuelArrayQuestIcon" } }, { "Scrapper", new TexData { addressable = RoR2_Base_Scrapper.Scrapper_prefab, texName = "texScrapperIcon" } }, { "ShrineGoldshoresAccess", new TexData { addressable = RoR2_Base_ShrineGoldshoresAccess.ShrineGoldshoresAccess_prefab, texName = "texShrineGoldIcon" } }, { "ShrineBlood", new TexData { addressable = RoR2_Base_ShrineBlood.ShrineBlood_prefab, texName = "texShrineBloodIcon" } }, { "ShrineBloodSandy Variant", new TexData { addressable = RoR2_Base_ShrineBlood_ShrineBloodSandy.Variant_prefab, texName = "texShrineBloodIcon" } }, { "ShrineBloodSnowy Variant", new TexData { addressable = RoR2_Base_ShrineBlood_ShrineBloodSnowy.Variant_prefab, texName = "texShrineBloodIcon" } }, { "ShrineChance", new TexData { addressable = RoR2_Base_ShrineChance.ShrineChance_prefab, texName = "texShrineChanceIcon" } }, { "ShrineChanceSandy Variant", new TexData { addressable = RoR2_Base_ShrineChance_ShrineChanceSandy.Variant_prefab, texName = "texShrineChanceIcon" } }, { "ShrineChanceSnowy Variant", new TexData { addressable = RoR2_Base_ShrineChance_ShrineChanceSnowy.Variant_prefab, texName = "texShrineChanceIcon" } }, { "ShrineCombat", new TexData { addressable = RoR2_Base_ShrineCombat.ShrineCombat_prefab, texName = "texShrineCombatIcon" } }, { "ShrineCombatSandy Variant", new TexData { addressable = RoR2_Base_ShrineCombat_ShrineCombatSandy.Variant_prefab, texName = "texShrineCombatIcon" } }, { "ShrineCombatSnowy Variant", new TexData { addressable = RoR2_Base_ShrineCombat_ShrineCombatSnowy.Variant_prefab, texName = "texShrineCombatIcon" } }, { "ShrineRestack", new TexData { addressable = RoR2_Base_ShrineRestack.ShrineRestack_prefab, texName = "texShrineOrderIcon" } }, { "ShrineRestackSandy Variant", new TexData { addressable = RoR2_Base_ShrineRestack_ShrineRestackSandy.Variant_prefab, texName = "texShrineOrderIcon" } }, { "ShrineRestackSnowy Variant", new TexData { addressable = RoR2_Base_ShrineRestack_ShrineRestackSnowy.Variant_prefab, texName = "texShrineOrderIcon" } }, { "ShrineBoss", new TexData { addressable = RoR2_Base_ShrineBoss.ShrineBoss_prefab, texName = "texShrineMountainIcon" } }, { "ShrineBossSandy Variant", new TexData { addressable = RoR2_Base_ShrineBoss_ShrineBossSandy.Variant_prefab, texName = "texShrineMountainIcon" } }, { "ShrineBossSnowy Variant", new TexData { addressable = RoR2_Base_ShrineBoss_ShrineBossSnowy.Variant_prefab, texName = "texShrineMountainIcon" } }, { "ShrineHealing", new TexData { addressable = RoR2_Base_ShrineHealing.ShrineHealing_prefab, texName = "texShrineWoodsIcon" } }, { "ShrineColossusAccess", new TexData { addressable = RoR2_DLC2.ShrineColossusAccess_prefab, texName = "texShrineShapingIcon" } }, { "ShrineRebirth", new TexData { addressable = RoR2_DLC2.ShrineRebirth_prefab, texName = "texShrineRebirthIcon" } }, { "ShrineHalcyonite", new TexData { addressable = RoR2_DLC2.ShrineHalcyonite_prefab, texName = "texShrineHalcyonIcon" } }, { "CaptainSupplyDrop, EquipmentRestock", new TexData { addressable = RoR2_Base_Captain_CaptainSupplyDrop.EquipmentRestock_prefab, texName = "texResupplyIcon" } }, { "VendingMachine", new TexData { addressable = RoR2_DLC1_VendingMachine.VendingMachine_prefab, texName = "texVendingMachineIcon" } }, { "ZiplineVehicle", new TexData { addressable = RoR2_Base_Gateway.ZiplineVehicle_prefab, texName = "texTunnelIcon" } } }; public void Awake() { Log.Init(((BaseUnityPlugin)this).Logger); } public void Start() { Log.Info("Initializing PingIconsOverhaul v1.4.0 by NotAJunkie"); bundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "pingiconsoverhaul")); SetPingIconsForInteractables(); Stage.onStageStartGlobal += delegate(Stage stage) { Log.Info("Stage started: " + ((Object)stage).name); OverridePingIconsForObjects<PurchaseInteraction>(); OverridePingIconsForObjects<GenericPickupController>(); OverridePingIconsForTeleporters(); }; } private void Update() { if (!Input.GetKeyDown((KeyCode)92)) { return; } EnumerableExtensions.ForEachTry<KeyValuePair<Type, IEnumerable<MonoBehaviour>>>((IEnumerable<KeyValuePair<Type, IEnumerable<MonoBehaviour>>>)InstanceTracker.instancesLists, (Action<KeyValuePair<Type, IEnumerable<MonoBehaviour>>>)delegate(KeyValuePair<Type, IEnumerable<MonoBehaviour>> kvp) { Log.Info($"Key: {kvp.Key}, Value: {kvp.Value}"); foreach (MonoBehaviour item in kvp.Value) { Log.Info($" Instance: {((Object)item).name} of type {((object)item).GetType()}"); } }, (IDictionary<KeyValuePair<Type, IEnumerable<MonoBehaviour>>, Exception>)null); } private void SetPingIconsForInteractables() { foreach (KeyValuePair<string, TexData> iNTERACTABLE in INTERACTABLES) { if (string.IsNullOrEmpty(iNTERACTABLE.Value.addressable)) { Log.Warning("Skipping " + iNTERACTABLE.Key + " due to missing addressable."); continue; } TexData value = iNTERACTABLE.Value; if (LoadInteractable(value.addressable, out GameObject interactable) && LoadPingIcon(value.addressable, value.texName, out Sprite pingIcon)) { if (!iNTERACTABLE.Key.Contains("Prongs")) { AddGenericDisplayNameProvider(interactable, iNTERACTABLE.Key); } AddPingIconOverride(interactable, pingIcon); } } } private static bool LoadInteractable(string addressable, out GameObject interactable) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) interactable = Addressables.LoadAssetAsync<GameObject>((object)addressable).WaitForCompletion(); if ((Object)(object)interactable == (Object)null) { Log.Error("Failed to load interactable \"" + addressable + "\""); } return (Object)(object)interactable != (Object)null; } private static bool LoadPingIcon(string addressable, string texName, out Sprite? pingIcon) { if ((Object)(object)bundle == (Object)null) { Log.Error("Failed to load Asset bundle."); pingIcon = null; return false; } pingIcon = bundle.LoadAsset<Sprite>(texName); if ((Object)(object)pingIcon == (Object)null) { Log.Error("Failed to load ping icon \"" + texName + "\" from bundle for \"" + addressable + "\""); } return (Object)(object)pingIcon != (Object)null; } private static void AddGenericDisplayNameProvider(GameObject interactable, string displayName) { IDisplayNameProvider val = default(IDisplayNameProvider); if (!interactable.TryGetComponent<IDisplayNameProvider>(ref val)) { Log.Info("Adding GenericDisplayNameProvider to " + ((Object)interactable).name + ", display name: " + displayName); GenericDisplayNameProvider val2 = interactable.AddComponent<GenericDisplayNameProvider>(); val2.SetDisplayToken(displayName); } } private void AddPingIconOverride(GameObject interactable, Sprite sprite) { PingInfoProvider val = default(PingInfoProvider); if (!interactable.TryGetComponent<PingInfoProvider>(ref val)) { val = interactable.AddComponent<PingInfoProvider>(); } val.pingIconOverride = sprite; Log.Info("Successfully added ping icon override for " + ((Object)interactable).name + " with " + ((Object)sprite).name); } private static void OverridePingIconsForObjects<T>() where T : MonoBehaviour { EnumerableExtensions.ForEachTry<T>((IEnumerable<T>)InstanceTracker.GetInstancesList<T>(), (Action<T>)delegate(T interactable) { string text = ((Object)(object)interactable).name.Split('(')[0].Trim(); if (!INTERACTABLES.TryGetValue(text, out var value)) { Log.Warning("No ping icon is available for " + text + " in asset dictionary"); } else { PingInfoProvider val = default(PingInfoProvider); if (!((Component)(object)interactable).TryGetComponent<PingInfoProvider>(ref val)) { val = ((Component)(object)interactable).gameObject.AddComponent<PingInfoProvider>(); } if (((Object)val.pingIconOverride).name != value.texName) { Log.Info("Overriding ping icon for " + text + " with " + value.texName); if (LoadPingIcon(value.addressable, value.texName, out Sprite pingIcon)) { val.pingIconOverride = pingIcon; } } } }, (IDictionary<T, Exception>)null); } private static void OverridePingIconsForTeleporters() { List<TeleporterInteraction> instancesList = InstanceTracker.GetInstancesList<TeleporterInteraction>(); if (instancesList.Count == 0) { Log.Warning("No TeleporterInteraction instances found."); return; } Log.Info($"Found {instancesList.Count} TeleporterInteraction instances."); EnumerableExtensions.ForEachTry<TeleporterInteraction>((IEnumerable<TeleporterInteraction>)instancesList, (Action<TeleporterInteraction>)delegate(TeleporterInteraction teleporter) { if ((Object)(object)teleporter == (Object)null) { Log.Warning("Found a null TeleporterInteraction instance."); } else { ReplaceTeleporterPingIcon(teleporter); } }, (IDictionary<TeleporterInteraction, Exception>)null); } private static void ReplaceTeleporterPingIcon(TeleporterInteraction teleporter) { string text = ((Object)teleporter).name.Split('(')[0].Trim(); if (!INTERACTABLES.TryGetValue(text, out var _)) { Log.Warning("No ping icon found for teleporter: " + text); return; } Log.Info("Replacing icon for teleporter: " + text); PositionIndicator teleporterPositionIndicator = teleporter.teleporterPositionIndicator; SpriteRenderer val = default(SpriteRenderer); PingInfoProvider val2 = default(PingInfoProvider); if (teleporterPositionIndicator == null || !teleporterPositionIndicator.alwaysVisibleObject.TryGetComponent<SpriteRenderer>(ref val)) { Log.Warning("No SpriteRenderer found on alwaysVisibleObject."); } else if (!((Component)teleporter).TryGetComponent<PingInfoProvider>(ref val2)) { Log.Warning("No PingInfoProvider found on the teleporter."); } else { val.sprite = val2.pingIconOverride; } } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }