Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of 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)); } } }