Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of AmmoLocker v2.0.0
AmmoLocker.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Threading; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using On.RoR2; using On.RoR2.Skills; using On.RoR2.UI; using R2API; using R2API.Utils; using RoR2; using RoR2.ContentManagement; using RoR2.Skills; using RoR2.UI; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.Networking; [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = "")] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: AssemblyCompany("AmmoLocker")] [assembly: AssemblyProduct("AmmoLocker")] [assembly: AssemblyTitle("AmmoLocker")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [Microsoft.CodeAnalysis.Embedded] [CompilerGenerated] [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; } } } namespace AmmoLocker { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("Cedev.AmmoLocker", "AmmoLocker", "2.0.0")] [R2APISubmoduleDependency(new string[] { "DeployableAPI", "LanguageAPI", "CommandHelper" })] public class AmmoLocker : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static GetDeployableSameSlotLimit <>9__21_1; public static hook_RecalculateStats <>9__21_2; public static hook_RecalculateMaxStock <>9__21_5; public static hook_OnFixedUpdate <>9__21_6; public static hook_Awake <>9__21_7; internal int <Awake>b__21_1(CharacterMaster master, int multiplier) { return ammoLockerMaxDeployed; } internal void <Awake>b__21_2(orig_RecalculateStats orig, CharacterBody self) { orig.Invoke(self); if (self.HasBuff(shoringDef)) { self.barrierDecayRate = 0f; } } internal void <Awake>b__21_5(orig_RecalculateMaxStock orig, GenericSkill self) { orig.Invoke(self); if ((Object)(object)self.characterBody != (Object)null && self.characterBody.HasBuff(overchargeDef)) { self.maxStock += Math.Max(1, self.rechargeStock); } } internal void <Awake>b__21_6(orig_OnFixedUpdate orig, ReloadSkillDef self, GenericSkill genericSkill) { int baseMaxStock = ((SkillDef)self).baseMaxStock; ((SkillDef)self).baseMaxStock = genericSkill.maxStock; orig.Invoke(self, genericSkill); ((SkillDef)self).baseMaxStock = baseMaxStock; } internal void <Awake>b__21_7(orig_Awake orig, CrosshairController self) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: 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_007c: 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_0064: Unknown result type (might be due to invalid IL or missing references) Log.LogInfo(string.Format("CrosshairController {0} Awake on {0}", ((Object)self).name, ((Object)((Component)self).gameObject).name)); orig.Invoke(self); if (((Object)((Component)self).gameObject).name.StartsWith("Bandit2Crosshair")) { for (int i = 0; i < self.skillStockSpriteDisplays.Length; i++) { SkillStockSpriteDisplay val = self.skillStockSpriteDisplays[i]; if ((int)val.skillSlot == 0 && val.maximumStockCountToBeValid >= 4) { val.maximumStockCountToBeValid = Math.Max(99, val.maximumStockCountToBeValid); } self.skillStockSpriteDisplays[i] = val; } } else if (((Object)((Component)self).gameObject).name.StartsWith("CaptainSupplyDropCrosshair")) { for (int j = 0; j < self.skillStockSpriteDisplays.Length; j++) { SkillStockSpriteDisplay val2 = self.skillStockSpriteDisplays[j]; val2.maximumStockCountToBeValid = Math.Max(99, val2.maximumStockCountToBeValid); self.skillStockSpriteDisplays[j] = val2; } } } } public const string PluginGUID = "Cedev.AmmoLocker"; public const string PluginAuthor = "Cedev"; public const string PluginName = "AmmoLocker"; public const string PluginVersion = "2.0.0"; public static BuffDef shoringDef; public static BuffDef overchargeDef; public static EquipmentDef ammoLockerDef; public static DeployableSlot ammoLockerSlot; public static float ammoLockerCooldown; public static float ammoLockerBuffDuration; public static float ammoLockerRange; public static float ammoLockerBarrier; public static float ammoLockerScale; public static float ammoLockerSpacing; public static int ammoLockerMaxDeployed; public static int ammoLockerMaxLockers; public static bool ammoLockerEnigmaCompatible; public static bool ammoLockerCanBeRandomlyTriggered; public static GameObject ammoLockerPrefab; public static Texture2D skinSwatches; public static Random random; public void Awake() { //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Expected O, but got Unknown //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Expected O, but got Unknown //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Expected O, but got Unknown //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Expected O, but got Unknown //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Expected O, but got Unknown //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Expected O, but got Unknown //IL_026f: Unknown result type (might be due to invalid IL or missing references) //IL_0279: Expected O, but got Unknown //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Expected O, but got Unknown Log.Init(((BaseUnityPlugin)this).Logger); ammoLockerCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Ammo Locker", "ammoLockerCooldown", 60f, (ConfigDescription)null).Value; ammoLockerBuffDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Ammo Locker", "ammoLockerBuffDuration", 20f, (ConfigDescription)null).Value; ammoLockerRange = ((BaseUnityPlugin)this).Config.Bind<float>("Ammo Locker", "ammoLockerRange", 1000f, (ConfigDescription)null).Value; ammoLockerBarrier = ((BaseUnityPlugin)this).Config.Bind<float>("Ammo Locker", "ammoLockerBarrier", 0.25f, (ConfigDescription)null).Value; ammoLockerSpacing = ((BaseUnityPlugin)this).Config.Bind<float>("Ammo Locker", "ammoLockerSpacing", 1f, (ConfigDescription)null).Value; ammoLockerScale = ((BaseUnityPlugin)this).Config.Bind<float>("Ammo Locker", "ammoLockerScale", 1.05f, (ConfigDescription)null).Value; ammoLockerMaxDeployed = ((BaseUnityPlugin)this).Config.Bind<int>("Ammo Locker", "ammoLockerMaxDeployed", 4, (ConfigDescription)null).Value; ammoLockerMaxLockers = ((BaseUnityPlugin)this).Config.Bind<int>("Ammo Locker", "ammoLockerMaxLockers", 8, (ConfigDescription)null).Value; ammoLockerEnigmaCompatible = ((BaseUnityPlugin)this).Config.Bind<bool>("Ammo Locker", "ammoLockerEnigmaCompatible", false, (ConfigDescription)null).Value; ammoLockerCanBeRandomlyTriggered = ((BaseUnityPlugin)this).Config.Bind<bool>("Ammo Locker", "ammoLockerCanBeRandomlyTriggered", false, (ConfigDescription)null).Value; PluginContent.LoadContentAsync("Cedev.AmmoLocker", async delegate(ContentPack contentPack, IProgress progress) { Task<AssetBundle> bundle = progress.Step(PluginContent.LoadAssetBundle(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "assets"))); Task<Texture2D> task = progress.Step(bundle.LoadAsync<Texture2D>("Assets/Icons/texBuffShoring.png")); Task<Texture2D> texOverchargeBuff = progress.Step(bundle.LoadAsync<Texture2D>("Assets/Icons/texBuffOvercharge.png")); Task<Texture2D> texAmmoLockerIcon = progress.Step(bundle.LoadAsync<Texture2D>("Assets/Icons/texAmmoLockerIcon.png")); Task<GameObject> padlockPrefab = progress.Step(bundle.LoadAsync<GameObject>("Assets/Prefabs/padlock.prefab")); Task<GameObject> ammoLockerPrefabStep = progress.Step(bundle.LoadAsync<GameObject>("Assets/Prefabs/locker.prefab")); Task<Texture2D> texSkinSwatches = progress.Step(bundle.LoadAsync<Texture2D>("Assets/Icons/texSkinSwatches.png")); shoringDef = ScriptableObject.CreateInstance<BuffDef>(); ((Object)shoringDef).name = "CHEEESYBUFFS_SHORING_NAME"; shoringDef.canStack = false; BuffDef val8 = shoringDef; val8.iconSprite = (await task).ToSprite(); contentPack.buffDefs.Add((BuffDef[])(object)new BuffDef[1] { shoringDef }); overchargeDef = ScriptableObject.CreateInstance<BuffDef>(); ((Object)overchargeDef).name = "CHEEESYBUFFS_OVERCHARGE_NAME"; overchargeDef.canStack = false; val8 = overchargeDef; val8.iconSprite = (await texOverchargeBuff).ToSprite(); contentPack.buffDefs.Add((BuffDef[])(object)new BuffDef[1] { overchargeDef }); ammoLockerDef = ScriptableObject.CreateInstance<EquipmentDef>(); ((Object)ammoLockerDef).name = "CHEESEBOARD_AMMOLOCKER_EQUIPMENT_NAME"; ammoLockerDef.nameToken = "CHEESEBOARD_AMMOLOCKER_EQUIPMENT_NAME"; ammoLockerDef.pickupToken = "CHEESEBOARD_AMMOLOCKER_EQUIPMENT_PICKUP"; ammoLockerDef.descriptionToken = "CHEESEBOARD_AMMOLOCKER_EQUIPMENT_DESC"; ammoLockerDef.loreToken = "CHEESEBOARD_AMMOLOCKER_EQUIPMENT_LORE"; EquipmentDef val9 = ammoLockerDef; val9.pickupIconSprite = (await texAmmoLockerIcon).ToSprite(); val9 = ammoLockerDef; val9.pickupModelPrefab = await padlockPrefab; ammoLockerDef.canDrop = true; ammoLockerDef.colorIndex = (ColorIndex)5; ammoLockerDef.enigmaCompatible = ammoLockerEnigmaCompatible; ammoLockerDef.canBeRandomlyTriggered = ammoLockerCanBeRandomlyTriggered; ammoLockerDef.cooldown = ammoLockerCooldown; contentPack.equipmentDefs.Add((EquipmentDef[])(object)new EquipmentDef[1] { ammoLockerDef }); ammoLockerPrefab = await ammoLockerPrefabStep; ammoLockerPrefab.AddComponent<AmmoLockerInteraction>(); ammoLockerPrefab.AddComponent<InteractionProcFilter>(); Log.LogInfo($"Ammo locker prefab NetworkInstance asset ID: {ammoLockerPrefab.GetComponent<NetworkIdentity>().assetId}"); contentPack.networkedObjectPrefabs.Add((GameObject[])(object)new GameObject[1] { ammoLockerPrefab }); skinSwatches = await texSkinSwatches; }); object obj = <>c.<>9__21_1; if (obj == null) { GetDeployableSameSlotLimit val = (CharacterMaster master, int multiplier) => ammoLockerMaxDeployed; <>c.<>9__21_1 = val; obj = (object)val; } ammoLockerSlot = DeployableAPI.RegisterDeployableSlot((GetDeployableSameSlotLimit)obj); random = new Random(); object obj2 = <>c.<>9__21_2; if (obj2 == null) { hook_RecalculateStats val2 = delegate(orig_RecalculateStats orig, CharacterBody self) { orig.Invoke(self); if (self.HasBuff(shoringDef)) { self.barrierDecayRate = 0f; } }; <>c.<>9__21_2 = val2; obj2 = (object)val2; } CharacterBody.RecalculateStats += (hook_RecalculateStats)obj2; CharacterBody.OnBuffFirstStackGained += (hook_OnBuffFirstStackGained)delegate(orig_OnBuffFirstStackGained orig, CharacterBody self, BuffDef buff) { orig.Invoke(self, buff); if ((Object)(object)buff == (Object)(object)overchargeDef) { RecalulateSkillStocks(self); } }; CharacterBody.OnBuffFinalStackLost += (hook_OnBuffFinalStackLost)delegate(orig_OnBuffFinalStackLost orig, CharacterBody self, BuffDef buff) { orig.Invoke(self, buff); if ((Object)(object)buff == (Object)(object)overchargeDef) { RecalulateSkillStocks(self); } }; object obj3 = <>c.<>9__21_5; if (obj3 == null) { hook_RecalculateMaxStock val3 = delegate(orig_RecalculateMaxStock orig, GenericSkill self) { orig.Invoke(self); if ((Object)(object)self.characterBody != (Object)null && self.characterBody.HasBuff(overchargeDef)) { self.maxStock += Math.Max(1, self.rechargeStock); } }; <>c.<>9__21_5 = val3; obj3 = (object)val3; } GenericSkill.RecalculateMaxStock += (hook_RecalculateMaxStock)obj3; object obj4 = <>c.<>9__21_6; if (obj4 == null) { hook_OnFixedUpdate val4 = delegate(orig_OnFixedUpdate orig, ReloadSkillDef self, GenericSkill genericSkill) { int baseMaxStock = ((SkillDef)self).baseMaxStock; ((SkillDef)self).baseMaxStock = genericSkill.maxStock; orig.Invoke(self, genericSkill); ((SkillDef)self).baseMaxStock = baseMaxStock; }; <>c.<>9__21_6 = val4; obj4 = (object)val4; } ReloadSkillDef.OnFixedUpdate += (hook_OnFixedUpdate)obj4; object obj5 = <>c.<>9__21_7; if (obj5 == null) { hook_Awake val5 = delegate(orig_Awake orig, CrosshairController self) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: 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_007c: 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_0064: Unknown result type (might be due to invalid IL or missing references) Log.LogInfo(string.Format("CrosshairController {0} Awake on {0}", ((Object)self).name, ((Object)((Component)self).gameObject).name)); orig.Invoke(self); if (((Object)((Component)self).gameObject).name.StartsWith("Bandit2Crosshair")) { for (int i = 0; i < self.skillStockSpriteDisplays.Length; i++) { SkillStockSpriteDisplay val6 = self.skillStockSpriteDisplays[i]; if ((int)val6.skillSlot == 0 && val6.maximumStockCountToBeValid >= 4) { val6.maximumStockCountToBeValid = Math.Max(99, val6.maximumStockCountToBeValid); } self.skillStockSpriteDisplays[i] = val6; } } else if (((Object)((Component)self).gameObject).name.StartsWith("CaptainSupplyDropCrosshair")) { for (int j = 0; j < self.skillStockSpriteDisplays.Length; j++) { SkillStockSpriteDisplay val7 = self.skillStockSpriteDisplays[j]; val7.maximumStockCountToBeValid = Math.Max(99, val7.maximumStockCountToBeValid); self.skillStockSpriteDisplays[j] = val7; } } }; <>c.<>9__21_7 = val5; obj5 = (object)val5; } CrosshairController.Awake += (hook_Awake)obj5; EquipmentSlot.PerformEquipmentAction += (hook_PerformEquipmentAction)delegate(orig_PerformEquipmentAction orig, EquipmentSlot self, EquipmentDef equipmentDef) { if ((Object)(object)equipmentDef == (Object)(object)ammoLockerDef) { FireAmmoLocker(self, equipmentDef); return true; } return orig.Invoke(self, equipmentDef); }; CommandHelper.AddToConsoleWhenReady(); Log.LogInfo("Awake done."); } private void RecalulateSkillStocks(CharacterBody self) { GenericSkill[] allSkills = self.skillLocator.allSkills; for (int i = 0; i < allSkills.Length; i++) { allSkills[i].RecalculateMaxStock(); } } public GameObject MakeAmmoLockers(EquipmentSlot self, Vector3 position, Quaternion rotation) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_001c: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: 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_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Expected O, but got Unknown GameObject lockers = new GameObject(); lockers.transform.position = position; lockers.transform.rotation = rotation; Deployable val = lockers.AddComponent<Deployable>(); val.onUndeploy = (UnityEvent)(((object)val.onUndeploy) ?? ((object)new UnityEvent())); val.onUndeploy.AddListener((UnityAction)delegate { Object.Destroy((Object)(object)lockers); }); self.characterBody.master.AddDeployable(val, ammoLockerSlot); List<CharacterBody> list = new List<CharacterBody>(); List<CharacterBody> list2 = new List<CharacterBody>(); CharacterBody characterBody = self.characterBody; TeamIndex? obj; if (characterBody == null) { obj = null; } else { TeamComponent teamComponent = characterBody.teamComponent; obj = ((teamComponent != null) ? new TeamIndex?(teamComponent.teamIndex) : null); } foreach (TeamComponent teamMember in TeamComponent.GetTeamMembers((TeamIndex)(((int?)obj) ?? (-1)))) { CharacterBody body = teamMember.body; if (body != null && body.isPlayerControlled) { list.Add(teamMember.body); } else if (Object.op_Implicit((Object)(object)teamMember.body)) { list2.Insert((int)(random.NextDouble() * (double)(list2.Count + 1)), teamMember.body); } } list.AddRange(list2.Take(ammoLockerMaxLockers - list.Count)); Log.LogInfo($"Making ammo lockers for {list.Count} players"); for (int i = 0; i < list.Count; i++) { CharacterBody body2 = list[i]; Vector3 val2 = ammoLockerScale * ammoLockerSpacing * (Vector3.right * (float)(list.Count - 1) / 2f + Vector3.left * (float)i); GameObject playerLocker = Object.Instantiate<GameObject>(ammoLockerPrefab, position + rotation * val2, rotation); playerLocker.transform.localScale = ammoLockerScale * Vector3.one; NetworkServer.Spawn(playerLocker); val.onUndeploy.AddListener((UnityAction)delegate { Object.Destroy((Object)(object)playerLocker); }); playerLocker.GetComponent<AmmoLockerInteraction>().SetCharacterBodies(self.characterBody, body2); } return lockers; } public void FireAmmoLocker(EquipmentSlot self, EquipmentDef equipmentDef) { //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_003c: 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: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) Log.LogInfo("Firing ammo locker"); RaycastHit val = default(RaycastHit); if (Physics.Raycast(self.GetAimRay(), ref val, ammoLockerRange, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask), (QueryTriggerInteraction)1)) { Log.LogInfo("Making ammo lockers"); MakeAmmoLockers(self, ((RaycastHit)(ref val)).point, Util.QuaternionSafeLookRotation(self.characterBody.corePosition - ((RaycastHit)(ref val)).point, ((RaycastHit)(ref val)).normal)); } } } public class AmmoLockerInteraction : NetworkBehaviour, IInteractable, IDisplayNameProvider { [SyncVar] public bool available = true; [SyncVar] public NetworkInstanceId characterBodyNetId; private static int kRpcRpcSetPortrait; private static int kRpcRpcOnInteraction; public bool Networkavailable { get { return available; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<bool>(value, ref available, 1u); } } public NetworkInstanceId NetworkcharacterBodyNetId { get { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return characterBodyNetId; } [param: In] set { //IL_0001: Unknown result type (might be due to invalid IL or missing references) ((NetworkBehaviour)this).SetSyncVar<NetworkInstanceId>(value, ref characterBodyNetId, 2u); } } private void Awake() { Collider[] componentsInChildren = ((Component)this).gameObject.GetComponentsInChildren<Collider>(); foreach (Collider val in componentsInChildren) { (((Component)val).gameObject.GetComponent<EntityLocator>() ?? ((Component)val).gameObject.AddComponent<EntityLocator>()).entity = ((Component)this).gameObject; } } [Server] public void SetCharacterBodies(CharacterBody owner, CharacterBody body) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogWarning((object)"[Server] function 'System.Void AmmoLocker.AmmoLockerInteraction::SetCharacterBodies(RoR2.CharacterBody,RoR2.CharacterBody)' called on client"); return; } Log.LogDebug($"SetCharacterBodies {owner}, {body}"); NetworkcharacterBodyNetId = ((NetworkBehaviour)body).netId; CallRpcSetPortrait(((NetworkBehaviour)owner).netId, ((NetworkBehaviour)body).netId); } public static CharacterBody GetCharacterBody(NetworkInstanceId netId) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) GameObject obj = ClientScene.FindLocalObject(netId); if (obj == null) { return null; } return obj.GetComponent<CharacterBody>(); } [ClientRpc] public void RpcSetPortrait(NetworkInstanceId ownerNetId, NetworkInstanceId characterNetId) { //IL_0005: 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_001b: 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) Log.LogDebug($"RpcSetPortrait {ownerNetId}, {characterNetId}"); Texture2D val = SkinCatalog.FindCurrentSkinDefForBodyInstance(((Component)GetCharacterBody(ownerNetId)).gameObject)?.icon?.ToTexture2D(AmmoLocker.skinSwatches); CharacterBody characterBody = GetCharacterBody(characterNetId); Renderer[] componentsInChildren = ((Component)this).gameObject.GetComponentsInChildren<Renderer>(); foreach (Renderer val2 in componentsInChildren) { Log.LogDebug($"Renderer on {((Component)val2).gameObject}"); Material[] materials = val2.materials; Material[] array = materials; foreach (Material val3 in array) { Log.LogDebug($"Material {((Object)val3).name}"); if ((Object)(object)characterBody.portraitIcon != (Object)null && ((Object)val3).name.StartsWith("Portrait")) { Log.LogDebug($"Setting portrait mainTexture to {characterBody.portraitIcon}"); val3.mainTexture = characterBody.portraitIcon; } else if ((Object)(object)val != (Object)null && ((Object)val3).name.StartsWith("Skin")) { Log.LogDebug($"Setting skin mainTexture to {val}"); val3.mainTexture = (Texture)(object)val; } } val2.materials = materials; } } public string GetContextString([NotNull] Interactor activator) { return Language.GetString("CHEESEBOARD_AMMOLOCKER_CONTEXT"); } public Interactability GetInteractability([NotNull] Interactor activator) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0029: 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_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) if (available) { CharacterBody component = ((Component)activator).GetComponent<CharacterBody>(); NetworkInstanceId? val = ((component != null) ? new NetworkInstanceId?(((NetworkBehaviour)component).netId) : null); NetworkInstanceId val2 = characterBodyNetId; if (val.HasValue && (!val.HasValue || val.GetValueOrDefault() == val2)) { return (Interactability)2; } } return (Interactability)0; } public void OnInteractionBegin([NotNull] Interactor activator) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) if (available) { CharacterBody component = ((Component)activator).GetComponent<CharacterBody>(); if ((Object)(object)component != (Object)null) { Networkavailable = false; component.AddTimedBuffAuthority(AmmoLocker.overchargeDef.buffIndex, AmmoLocker.ammoLockerBuffDuration); component.AddTimedBuffAuthority(AmmoLocker.shoringDef.buffIndex, AmmoLocker.ammoLockerBuffDuration); component.healthComponent.AddBarrierAuthority(component.healthComponent.fullBarrier * AmmoLocker.ammoLockerBarrier); CallRpcOnInteraction(((NetworkBehaviour)component).netId); } } } [ClientRpc] public void RpcOnInteraction(NetworkInstanceId bodyId) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) Log.LogDebug("RpcOnInteraction"); CharacterBody characterBody = GetCharacterBody(bodyId); SkillLocator val = ((characterBody != null) ? characterBody.skillLocator : null); if ((Object)(object)val != (Object)null) { GenericSkill[] allSkills = val.allSkills; for (int i = 0; i < allSkills.Length; i++) { allSkills[i].Reset(); } } ((Component)this).gameObject.GetComponentInChildren<Animator>().Play("Base Layer.Opening"); } public bool ShouldIgnoreSpherecastForInteractibility([NotNull] Interactor activator) { return false; } public bool ShouldShowOnScanner() { return false; } public string GetDisplayName() { return Language.GetString("CHEESEBOARD_AMMOLOCKER_NAME"); } private void UNetVersion() { } protected static void InvokeRpcRpcSetPortrait(NetworkBehaviour obj, NetworkReader reader) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcSetPortrait called on server."); } else { ((AmmoLockerInteraction)(object)obj).RpcSetPortrait(reader.ReadNetworkId(), reader.ReadNetworkId()); } } protected static void InvokeRpcRpcOnInteraction(NetworkBehaviour obj, NetworkReader reader) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcOnInteraction called on server."); } else { ((AmmoLockerInteraction)(object)obj).RpcOnInteraction(reader.ReadNetworkId()); } } public void CallRpcSetPortrait(NetworkInstanceId ownerNetId, NetworkInstanceId characterNetId) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcSetPortrait called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcSetPortrait); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); val.Write(ownerNetId); val.Write(characterNetId); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcSetPortrait"); } public void CallRpcOnInteraction(NetworkInstanceId bodyId) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcOnInteraction called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcOnInteraction); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); val.Write(bodyId); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcOnInteraction"); } static AmmoLockerInteraction() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown kRpcRpcSetPortrait = 38177051; NetworkBehaviour.RegisterRpcDelegate(typeof(AmmoLockerInteraction), kRpcRpcSetPortrait, new CmdDelegate(InvokeRpcRpcSetPortrait)); kRpcRpcOnInteraction = -865747407; NetworkBehaviour.RegisterRpcDelegate(typeof(AmmoLockerInteraction), kRpcRpcOnInteraction, new CmdDelegate(InvokeRpcRpcOnInteraction)); NetworkCRC.RegisterBehaviour("AmmoLockerInteraction", 0); } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { //IL_0014: 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) if (forceAll) { writer.Write(available); writer.Write(characterBodyNetId); return true; } bool flag = false; if ((((NetworkBehaviour)this).syncVarDirtyBits & (true ? 1u : 0u)) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } writer.Write(available); } if ((((NetworkBehaviour)this).syncVarDirtyBits & 2u) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } writer.Write(characterBodyNetId); } if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); } return flag; } public override void OnDeserialize(NetworkReader reader, bool initialState) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) if (initialState) { available = reader.ReadBoolean(); characterBodyNetId = reader.ReadNetworkId(); return; } int num = (int)reader.ReadPackedUInt32(); if (((uint)num & (true ? 1u : 0u)) != 0) { available = reader.ReadBoolean(); } if (((uint)num & 2u) != 0) { characterBodyNetId = reader.ReadNetworkId(); } } } public static class ConsoleCommands { [ConCommand(/*Could not decode attribute arguments.*/)] public static void DropDebugItems(ConCommandArgs args) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: 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_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) PlayerCharacterMasterController.instances[0].master.GetBody(); Transform transform = PlayerCharacterMasterController.instances[0].master.GetBodyObject().transform; PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(AmmoLocker.ammoLockerDef.equipmentIndex), transform.position, transform.forward * 20f); PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(Items.Firework.itemIndex), transform.position, transform.forward * 40f); PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(Items.Squid.itemIndex), transform.position, transform.forward * 60f); PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(Items.EquipmentMagazineVoid.itemIndex), transform.position, transform.forward * 80f); } [ConCommand(/*Could not decode attribute arguments.*/)] public static void ListCrosshairs(ConCommandArgs args) { //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) foreach (CrosshairManager instances in CrosshairManager.instancesList) { Log.LogMessage($"Found CrosshairManager {((Object)instances).name} attached to {((Object)((Component)instances).gameObject).name}"); if ((Object)(object)instances.crosshairController != (Object)null) { CrosshairController crosshairController = instances.crosshairController; Log.LogMessage($"Found CrosshairController {((Object)crosshairController).name} attached to {((Object)((Component)crosshairController).gameObject).name}"); SkillStockSpriteDisplay[] skillStockSpriteDisplays = crosshairController.skillStockSpriteDisplays; foreach (SkillStockSpriteDisplay val in skillStockSpriteDisplays) { Log.LogMessage($"SkillStockSpriteDisplay skillSlot: {val.skillSlot}, requiredSkillDef: {val.requiredSkillDef?.skillName}, minStock: {val.minimumStockCountToBeValid}, maxStock: {val.maximumStockCountToBeValid}"); } } } } } public static class Log { internal static ManualLogSource _logSource; public static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void LogDebug(object data) { _logSource.LogDebug(data); } internal static void LogError(object data) { _logSource.LogError(data); } internal static void LogFatal(object data) { _logSource.LogFatal(data); } internal static void LogInfo(object data) { _logSource.LogInfo(data); } internal static void LogMessage(object data) { _logSource.LogMessage(data); } internal static void LogWarning(object data) { _logSource.LogWarning(data); } } public class PluginContentPack : IContentPackProvider { public ContentPack contentPack; private Func<ContentPack, IProgress, Task> loadContent; public string identifier { get; set; } public PluginContentPack(string identifier, Func<ContentPack, IProgress, Task> loadContent) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown this.identifier = identifier; contentPack = new ContentPack(); this.loadContent = loadContent; ContentManager.collectContentPackProviders += (CollectContentPackProvidersDelegate)delegate(AddContentPackProviderDelegate addContentPack) { addContentPack.Invoke((IContentPackProvider)(object)this); }; } public IEnumerator FinalizeAsync(FinalizeAsyncArgs args) { args.ReportProgress(1f); yield break; } public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args) { contentPack.identifier = identifier; ContentPack.Copy(contentPack, args.output); args.ReportProgress(1f); yield break; } public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { Progress progress = new Progress(); progress.OnProgress += delegate(double x) { args.ReportProgress((float)x); }; Task task = Task.Run(async delegate { await loadContent(contentPack, progress); }); while (!task.IsCompleted) { yield return null; } if (task.IsFaulted) { Log.LogError(task.Exception); } } } public interface IAwaitable<out T> { IAwaiter<T> GetAwaiter(); } public interface IAwaiter<out T> : INotifyCompletion { bool IsCompleted { get; } T GetResult(); } public class UnityTask<T> : IAwaitable<T>, IAwaiter<T>, INotifyCompletion where T : AsyncOperation { private readonly T unityAsyncOperation; public bool IsCompleted => ((AsyncOperation)unityAsyncOperation).isDone; public UnityTask(T unityAsyncOperation) { this.unityAsyncOperation = unityAsyncOperation; } public T GetResult() { return unityAsyncOperation; } public void OnCompleted(Action continuation) { ((AsyncOperation)unityAsyncOperation).completed += delegate { continuation(); }; } public IAwaiter<T> GetAwaiter() { return this; } } public static class PluginContent { public static void LoadContentAsync(string identifier, Func<ContentPack, IProgress, Task> loadContent) { new PluginContentPack(identifier, loadContent); } public static void Add<T>(this NamedAssetCollection<T> assetCollection, params T[] items) { assetCollection.Add(items); } public static Task<T> LoadAsync<T>(string key) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) Log.LogInfo($"Loading addressable asset {key}"); return Addressables.LoadAssetAsync<T>((object)key).Task; } public static Task<T> LoadLegacyAsync<T>(string name) { Log.LogInfo($"Loading legacy asset {name}"); return LoadAsync<T>(LegacyResourcesAPI.GetPathGuidString(name)); } public static UnityTask<T> Awaitable<T>(this T asyncOperation) where T : AsyncOperation { return new UnityTask<T>(asyncOperation); } public static async Task<T> LoadAsync<T>(this AssetBundle bundle, string name) where T : Object { Log.LogInfo($"Loading {name} from bundle"); AssetBundleRequest val = await bundle.LoadAssetAsync(name).Awaitable<AssetBundleRequest>(); Log.LogInfo($"Loaded {name} from bundle: {val.asset}"); return (T)(object)val.asset; } public static async Task<T> LoadAsync<T>(this Task<AssetBundle> bundle, string name) where T : Object { return await (await bundle).LoadAsync<T>(name); } public static async Task<AssetBundle> LoadAssetBundle(string path) { Log.LogInfo($"Loading AssetBundle {path}"); AssetBundleCreateRequest val = await AssetBundle.LoadFromFileAsync(path).Awaitable<AssetBundleCreateRequest>(); Log.LogInfo($"Loaded AssetBundle {path}: {val.assetBundle}"); return val.assetBundle; } public static Sprite ToSprite(this Texture2D texture) { //IL_0019: 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) return Sprite.Create(texture, new Rect(0f, 0f, (float)((Texture)texture).width, (float)((Texture)texture).height), new Vector2(0.5f, 0.5f)); } public static int Round(this float x) { return (int)Math.Round(x); } public static Texture2D ToTexture2D(this Sprite sprite, params Texture2D[] fallbackSources) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_002b: 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) Rect val = sprite.rect; if (((Rect)(ref val)).x.Round() == 0) { val = sprite.rect; if (((Rect)(ref val)).y.Round() == 0) { val = sprite.rect; if (((Rect)(ref val)).width.Round() == ((Texture)sprite.texture).width) { val = sprite.rect; if (((Rect)(ref val)).height.Round() == ((Texture)sprite.texture).height) { return sprite.texture; } } } } val = sprite.rect; int num = ((Rect)(ref val)).width.Round(); val = sprite.rect; Texture2D val2 = new Texture2D(num, ((Rect)(ref val)).height.Round()); ((Object)val2).name = ((Object)sprite).name; List<Texture2D> list = new List<Texture2D>(); list.Add(sprite.texture); list.AddRange(fallbackSources); foreach (Texture2D item in list) { try { val = sprite.textureRect; int num2 = ((Rect)(ref val)).x.Round(); val = sprite.textureRect; int num3 = ((Rect)(ref val)).y.Round(); val = sprite.textureRect; int num4 = ((Rect)(ref val)).width.Round(); val = sprite.textureRect; Color[] pixels = item.GetPixels(num2, num3, num4, ((Rect)(ref val)).height.Round()); val2.SetPixels(pixels); val2.Apply(); return val2; } catch (UnityException val3) { Log.LogDebug((object)val3); } } return null; } } public interface IProgress { Task<T> Step<T>(Task<T> step, double weight = 1.0); } public class Progress : IProgress { public delegate void ProgressHandler(double progress); private double weightExpected; private double weightCompleted; public event ProgressHandler OnProgress; public Progress() { weightExpected = 0.0; weightCompleted = 0.0; } private void Expect(double weight) { Interlocking.Add(ref weightExpected, weight); } private void Complete(double weight) { double num = Interlocking.Add(ref weightCompleted, weight); if (weightExpected > 0.0) { this.OnProgress(num / weightExpected); } } public async Task<T> Step<T>(Task<T> step, double weight = 1.0) { Expect(weight); T result = await step; Complete(weight); return result; } } public static class ProgressExtensions { public static async Task<T> SelectMany<T, W>(this Task<W> first, Func<W, Task<T>> then) { return await then(await first); } public static Task<T> After<W, T>(this IProgress progress, Task<W> first, Func<W, Task<T>> then, double weight = 1.0) { return progress.Step(first.SelectMany(then), weight); } } public static class Interlocking { public delegate T CompareExchanger<T>(ref T location, T value, T comparand); public static T AtomicModify<T>(CompareExchanger<T> compareExchange, ref T location, Func<T, T> update) where T : IEquatable<T> { T val = location; T val2; while (true) { val2 = update(val); T val3 = compareExchange(ref location, val2, val); if (val3.Equals(val)) { break; } val = val3; } return val2; } public static double Add(ref double location, double value) { return AtomicModify(Interlocked.CompareExchange, ref location, (double x) => x + value); } } public class RenderWaiter : MonoBehaviour { private SemaphoreSlim semaphore = new SemaphoreSlim(0, 1); public void OnPostRender() { semaphore.Release(); } public async Task Wait() { await semaphore.WaitAsync(); } } public static class RenderSprite { private static int position; public static async Task<RenderTexture> Render(this Sprite sprite) { Rect rect = sprite.rect; int num = ((Rect)(ref rect)).width.Round(); rect = sprite.rect; int num2 = ((Rect)(ref rect)).height.Round(); int num3 = Interlocked.Add(ref position, num + 10) - num / 2; GameObject gameObject = new GameObject(); try { gameObject.layer = 31; gameObject.transform.position = Vector3.left * (float)num3; SpriteRenderer val = gameObject.AddComponent<SpriteRenderer>(); val.sprite = sprite; ((Component)val).transform.localScale = Vector3.one * sprite.pixelsPerUnit; Camera val2 = gameObject.AddComponent<Camera>(); ((Behaviour)val2).enabled = false; val2.cullingMask = 31; val2.orthographic = true; Bounds bounds = ((Renderer)val).bounds; float x = ((Bounds)(ref bounds)).size.x; bounds = ((Renderer)val).bounds; val2.aspect = x / ((Bounds)(ref bounds)).size.y; bounds = ((Renderer)val).bounds; val2.orthographicSize = ((Bounds)(ref bounds)).size.y / 2f; Transform transform = ((Component)val2).transform; bounds = ((Renderer)val).bounds; transform.position = ((Bounds)(ref bounds)).center + Vector3.forward; Transform transform2 = ((Component)val2).transform; bounds = ((Renderer)val).bounds; transform2.LookAt(((Bounds)(ref bounds)).center, Vector3.up); RenderTexture renderTexture = (val2.targetTexture = new RenderTexture(num, num2, 0)); RenderWaiter renderWaiter = gameObject.AddComponent<RenderWaiter>(); val2.Render(); await renderWaiter.Wait(); return renderTexture; } finally { Object.DestroyImmediate((Object)(object)gameObject); } } } public static class StockTracer { private static int tracingStocks; [ConCommand(/*Could not decode attribute arguments.*/)] public static void TraceStock(ConCommandArgs args) { if (Interlocked.Exchange(ref tracingStocks, 1) == 0) { Tracer.Instance.Format((GenericSkill gs) => $"{gs} {{stacks: {gs.stock}/{gs.maxStock}}}"); Tracer.Instance.Filter((GenericSkill gs) => Object.op_Implicit((Object)(object)gs.characterBody) && gs.characterBody.isPlayerControlled); GenericSkill.AddOneStock += LogStock<hook_AddOneStock>(); GenericSkill.ApplyAmmoPack += LogStock<hook_ApplyAmmoPack>(); GenericSkill.AssignSkill += LogStock<hook_AssignSkill>(); GenericSkill.DeductStock += LogStock<hook_DeductStock>(); GenericSkill.RemoveAllStocks += LogStock<hook_RemoveAllStocks>(); GenericSkill.Reset += LogStock<hook_Reset>(); GenericSkill.RestockContinuous += LogStock<hook_RestockContinuous>(); GenericSkill.RestockSteplike += LogStock<hook_RestockSteplike>(); GenericSkill.Start += LogStock<hook_Start>(); GenericSkill.OnExecute += LogStock<hook_OnExecute>(); SkillDef.OnExecute += LogStock<hook_OnExecute>(); GenericSkill.RecalculateMaxStock += LogStock<hook_RecalculateMaxStock>(); } } private static T LogStock<T>() { return Tracing.Trace<T>(Tracer.Instance); } } public static class Tracing { public static TDelegate Trace<TDelegate>(ITrace tracer) { MethodInfo method = typeof(TDelegate).GetMethod("Invoke"); ParameterExpression[] array = (from x in method.GetParameters() select Expression.Parameter(x.ParameterType, x.Name)).ToArray(); ParameterExpression[] array2 = array.Skip(1).ToArray(); ConstantExpression instance = Expression.Constant(tracer); MethodInfo method2 = typeof(ITrace).GetMethod("Enter"); MethodInfo method3 = typeof(ITraceScope).GetMethod("Exception"); MethodInfo method4 = typeof(ITraceScope).GetMethod("Return"); MethodInfo method5 = typeof(IDisposable).GetMethod("Dispose"); ParameterExpression parameterExpression = Expression.Variable(typeof(ITraceScope), "scope"); ParameterExpression expression = array[0]; Expression[] arguments = array2; Expression expression2 = Expression.Invoke(expression, arguments); if (method.ReturnType != typeof(void)) { ParameterExpression parameterExpression2 = Expression.Variable(method.ReturnType, "result"); expression2 = Expression.Block(Sanity.Vars(parameterExpression2), Expression.Assign(parameterExpression2, expression2), Expression.Call(parameterExpression, method4, parameterExpression2.ConvertTo<object>()), parameterExpression2); } ParameterExpression parameterExpression3 = Expression.Parameter(typeof(Exception), "e"); return Expression.Lambda<TDelegate>(Expression.Block(Sanity.Vars(parameterExpression), Expression.Assign(parameterExpression, Expression.Call(instance, method2, array[0], array2.ToArrayExpression<object>())), Expression.TryCatchFinally(expression2, Expression.Call(parameterExpression, method5), Expression.MakeCatchBlock(typeof(Exception), parameterExpression3, Expression.Block(Expression.Call(parameterExpression, method3, parameterExpression3), Expression.Throw(parameterExpression3, method.ReturnType)), Expression.Constant(true)))), array).Compile(); } } public static class Sanity { public static ParameterExpression[] Vars(params ParameterExpression[] vars) { return vars; } public static Expression ToArrayExpression<T>(this IEnumerable<Expression> expressions) { return Expression.NewArrayInit(typeof(T), expressions.Select(ConvertTo<T>)); } public static Expression ConvertTo<T>(this Expression expr) { return Expression.Convert(expr, typeof(T)); } } public interface ITraceScope : IDisposable { void Exception(Exception e); void Return(object obj); } public interface ITrace { ITraceScope Enter(object target, params object[] args); } public class TraceScope : ITraceScope, IDisposable { private readonly Action onExit; private readonly Func<object, object> formatter; private readonly string spaces; private readonly object target; private readonly object[] args; public TraceScope(Action onExit, Func<object, object> formatter, int indentation, object target, object[] args) { this.onExit = onExit; this.formatter = formatter; spaces = new string(' ', 2 * indentation); this.target = target; this.args = args; Log.LogDebug(string.Format("{0}Enter {1}({2})", spaces, target, string.Join(", ", args.Select(formatter)))); } public void Dispose() { Log.LogDebug(string.Format("{0}Exit {1}({2})", spaces, target, string.Join(", ", args.Select(formatter)))); onExit(); } public void Exception(Exception e) { Log.LogDebug(e); } public void Return(object obj) { Log.LogDebug($"{spaces}Return: {formatter(obj)}"); } } public class NullScope : ITraceScope, IDisposable { public static NullScope Instance = new NullScope(); void ITraceScope.Exception(Exception e) { } void ITraceScope.Return(object obj) { } void IDisposable.Dispose() { } } public class Tracer : ITrace { public static Tracer Instance = new Tracer(); public int indentation; public List<Func<object, bool>> Filters; public List<Func<object, object>> Formatters; public Tracer() { indentation = 0; Filters = new List<Func<object, bool>>(); Formatters = new List<Func<object, object>>(); } public ITraceScope Enter(object target, params object[] args) { if (args.Any((object x) => Filters.Any((Func<object, bool> f) => f(x)))) { indentation++; return new TraceScope(delegate { indentation--; }, FormatArg, indentation, target, args); } return NullScope.Instance; } public object FormatArg(object arg) { if (arg == null) { return "null"; } foreach (Func<object, object> formatter in Formatters) { object obj = formatter(arg); if (obj != null) { return obj; } } return arg; } public void Format<T>(Func<T, object> formatter) { Formatters.Add((object x) => (!(x is T)) ? null : formatter((T)x)); } public void Filter<T>(Func<T, bool> filter) { Filters.Add((object x) => x is T && filter((T)x)); } } }