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 StageRecap v1.4.0
StageRecap.dll
Decompiled 5 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security.Permissions; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HG.Reflection; using On.RoR2; using On.RoR2.UI; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.ContentManagement; using RoR2.UI; using StageReport; using TMPro; using Unity; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: OptIn] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] namespace StageReport { public class ContentProvider : IContentPackProvider { public static ContentPack ContentPack = new ContentPack(); public static GameObject interactableTrackerPrefab; public static GameObject stageReportPanelPrefab; public string identifier => "Lawlzee.StageRecap.ContentProvider"; public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { ContentPack.identifier = identifier; string directoryName = Path.GetDirectoryName(typeof(ContentProvider).Assembly.Location); AssetBundle stageReportBundle = null; yield return LoadAssetBundle(Path.Combine(directoryName, "stageRecap"), args.progressReceiver, delegate(AssetBundle assetBundle) { stageReportBundle = assetBundle; }); yield return LoadAllAssetsAsync<InteractablesCollection>(stageReportBundle, args.progressReceiver, (Action<InteractablesCollection[]>)delegate(InteractablesCollection[] assets) { assets.First().Init(); }); yield return LoadAllAssetsAsync<GameObject>(stageReportBundle, args.progressReceiver, (Action<GameObject[]>)delegate(GameObject[] assets) { interactableTrackerPrefab = assets.First((GameObject a) => ((Object)a).name == "InteractableTracker"); stageReportPanelPrefab = assets.First((GameObject a) => ((Object)a).name == "StageReportPanel"); for (int i = 0; i < assets.Length; i++) { ClientScene.RegisterPrefab(assets[i]); } }); } private IEnumerator LoadAssetBundle(string assetBundleFullPath, IProgress<float> progress, Action<AssetBundle> onAssetBundleLoaded) { AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(assetBundleFullPath); while (!((AsyncOperation)assetBundleCreateRequest).isDone) { progress.Report(((AsyncOperation)assetBundleCreateRequest).progress); yield return null; } onAssetBundleLoaded(assetBundleCreateRequest.assetBundle); } private static IEnumerator LoadAllAssetsAsync<T>(AssetBundle assetBundle, IProgress<float> progress, Action<T[]> onAssetsLoaded) where T : Object { AssetBundleRequest sceneDefsRequest = assetBundle.LoadAllAssetsAsync<T>(); while (!((AsyncOperation)sceneDefsRequest).isDone) { progress.Report(((AsyncOperation)sceneDefsRequest).progress); yield return null; } onAssetsLoaded(sceneDefsRequest.allAssets.Cast<T>().ToArray()); } public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args) { ContentPack.Copy(ContentPack, args.output); args.ReportProgress(1f); yield break; } public IEnumerator FinalizeAsync(FinalizeAsyncArgs args) { args.ReportProgress(1f); yield break; } } public static class ChestRevealerHooks { public static bool reportOpened; private static bool _inRevealingContext; public static void Init() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown RevealedObject.OnEnable += new hook_OnEnable(RevealedObject_OnEnable); PingIndicator.GetInteractableIcon += new hook_GetInteractableIcon(PingIndicator_GetInteractableIcon); } private static void RevealedObject_OnEnable(orig_OnEnable orig, MonoBehaviour self) { Log.Debug("RevealedObject_OnEnable " + ((Object)self).name); try { _inRevealingContext = reportOpened; orig.Invoke(self); } finally { _inRevealingContext = false; } } private static Sprite PingIndicator_GetInteractableIcon(orig_GetInteractableIcon orig, GameObject gameObject) { //IL_0051: 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) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) Log.Debug("PingIndicator_GetInteractableIcon " + ((Object)gameObject).name); if (!_inRevealingContext) { Log.Debug("_inRevealingContext: false"); return orig.Invoke(gameObject); } NetworkIdentity component = gameObject.GetComponent<NetworkIdentity>(); if ((Object)(object)component == (Object)null) { Log.Debug("networkIdentity == null"); return orig.Invoke(gameObject); } NetworkInstanceId netId = component.netId; int? num = InteractableHooks.FindInteractableIndex(((NetworkInstanceId)(ref netId)).Value); if (!num.HasValue) { Log.Debug("index == null"); return orig.Invoke(gameObject); } InteractableType type = ((SyncList<TrackedInteractable>)(object)InteractableTracker.instance.trackedInteractables)[num.Value].type; InteractableDef interactableDef = InteractablesCollection.instance[type]; return Sprite.Create(interactableDef.Texture, new Rect(0f, 0f, (float)((Texture)interactableDef.Texture).width, (float)((Texture)interactableDef.Texture).height), new Vector2(0.5f, 0.5f)); } } public static class InteractableHooks { public static void Init() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Expected O, but got Unknown //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Expected O, but got Unknown //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Expected O, but got Unknown //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Expected O, but got Unknown //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Expected O, but got Unknown //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Expected O, but got Unknown PurchaseInteraction.PreStartClient += new hook_PreStartClient(PurchaseInteraction_PreStartClient); PurchaseInteraction.OnDisable += new hook_OnDisable(PurchaseInteraction_OnDisable); ShrineChanceBehavior.AddShrineStack += new hook_AddShrineStack(ShrineChanceBehavior_AddShrineStack); MultiShopController.Start += new hook_Start(MultiShopController_Start); MultiShopController.OnPurchase += new hook_OnPurchase(MultiShopController_OnPurchase); DroneVendorMultiShopController.Start += new hook_Start(DroneVendorMultiShopController_Start); DroneVendorMultiShopController.OnPurchase += new hook_OnPurchase(DroneVendorMultiShopController_OnPurchase); AccessCodesMissionController.OnStartServer += new hook_OnStartServer(AccessCodesMissionController_OnStartServer); AccessCodesMissionController.ActivateCode += new hook_ActivateCode(AccessCodesMissionController_ActivateCode); BarrelInteraction.Start += new hook_Start(BarrelInteraction_Start); BarrelInteraction.CoinDrop += new hook_CoinDrop(BarrelInteraction_CoinDrop); ScrapperController.PreStartClient += new hook_PreStartClient(ScrapperController_PreStartClient); CharacterBody.Start += new hook_Start(CharacterBody_Start); CharacterDeathBehavior.OnDeath += new hook_OnDeath(CharacterDeathBehavior_OnDeath); ShopTerminalBehavior.UpdatePickupDisplayAndAnimations += new hook_UpdatePickupDisplayAndAnimations(ShopTerminalBehavior_UpdatePickupDisplayAndAnimations); } private static void AccessCodesMissionController_OnStartServer(orig_OnStartServer orig, AccessCodesMissionController self) { //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); Log.Debug("AccessCodesMissionController_OnStartServer " + ((Object)((Component)self).gameObject).name); if (NetworkServer.active) { bool flag = self.ignoreSolusWingDeath || !Run.instance.GetEventFlag("SolusWingBeaten"); if (self.RunHasRequiredExpansion() && flag && self.nodes.Length != 0) { InteractableDef interactableDef = InteractablesCollection.instance[InteractableType.AccessCodesNode]; Log.Debug(interactableDef.type.ToString() + " found"); TrackedInteractable trackedInteractable = default(TrackedInteractable); NetworkInstanceId netId = ((Component)self).GetComponent<NetworkIdentity>().netId; trackedInteractable.netId = ((NetworkInstanceId)(ref netId)).Value; trackedInteractable.type = interactableDef.type; trackedInteractable.charges = interactableDef.charges; TrackedInteractable trackedInteractable2 = trackedInteractable; ((SyncList<TrackedInteractable>)(object)InteractableTracker.instance.trackedInteractables).Add(trackedInteractable2); } } } private static void AccessCodesMissionController_ActivateCode(orig_ActivateCode orig, AccessCodesMissionController self) { //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) orig.Invoke(self); if (NetworkServer.active) { NetworkInstanceId netId = ((Component)self).GetComponent<NetworkIdentity>().netId; SetCharges(((NetworkInstanceId)(ref netId)).Value, 0); } } private static void ShopTerminalBehavior_UpdatePickupDisplayAndAnimations(orig_UpdatePickupDisplayAndAnimations orig, ShopTerminalBehavior self) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: 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_0081: 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_0094: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); if (self.pickup.pickupIndex == PickupIndex.none) { return; } NetworkInstanceId netId = ((Component)self).GetComponent<NetworkIdentity>().netId; int? num = FindInteractableIndex(((NetworkInstanceId)(ref netId)).Value); if (num.HasValue) { TrackedInteractable trackedInteractable = ((SyncList<TrackedInteractable>)(object)InteractableTracker.instance.trackedInteractables)[num.Value]; if (InteractablesCollection.instance[trackedInteractable.type].unstackable) { ItemDef itemDef = ItemCatalog.GetItemDef(PickupCatalog.GetPickupDef(self.pickup.pickupIndex).itemIndex); trackedInteractable.itemIndex = itemDef.itemIndex; ((SyncList<TrackedInteractable>)(object)InteractableTracker.instance.trackedInteractables)[num.Value] = trackedInteractable; } } } private static void CharacterDeathBehavior_OnDeath(orig_OnDeath orig, CharacterDeathBehavior self) { //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) orig.Invoke(self); if (NetworkServer.active) { NetworkInstanceId netId = ((Component)self).GetComponent<NetworkIdentity>().netId; SetCharges(((NetworkInstanceId)(ref netId)).Value, 0); } } private static void CharacterBody_Start(orig_Start orig, CharacterBody self) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown orig.Invoke(self); if (!TryRegistering("CharacterBody_Start", (NetworkBehaviour)(object)self, log: false)) { return; } OnDisableEvent obj = ((Component)self).gameObject.AddComponent<OnDisableEvent>(); obj.action = new UnityEvent(); obj.action.AddListener((UnityAction)delegate { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) Log.Debug("CharacterBody_Disabled"); NetworkInstanceId netId = ((Component)self).GetComponent<NetworkIdentity>().netId; int? num = FindInteractableIndex(((NetworkInstanceId)(ref netId)).Value); if (num.HasValue) { Log.Debug("Removed"); ((SyncList<TrackedInteractable>)(object)InteractableTracker.instance.trackedInteractables).RemoveAt(num.Value); } }); } private static void ScrapperController_PreStartClient(orig_PreStartClient orig, ScrapperController self) { orig.Invoke(self); TryRegistering("ScrapperController_Start", (NetworkBehaviour)(object)self); } private static void BarrelInteraction_CoinDrop(orig_CoinDrop orig, BarrelInteraction self) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); Log.Debug("BarrelInteraction_Start " + ((Object)((Component)self).gameObject).name); if (NetworkServer.active) { NetworkInstanceId netId = ((Component)self).GetComponent<NetworkIdentity>().netId; SetCharges(((NetworkInstanceId)(ref netId)).Value, 0); } } private static void BarrelInteraction_Start(orig_Start orig, BarrelInteraction self) { orig.Invoke(self); TryRegistering("BarrelInteraction_Start", (NetworkBehaviour)(object)self); } private static void MultiShopController_Start(orig_Start orig, MultiShopController self) { orig.Invoke(self); TryRegistering("MultiShopController_Start", (NetworkBehaviour)(object)self); } private static void DroneVendorMultiShopController_Start(orig_Start orig, DroneVendorMultiShopController self) { orig.Invoke(self); TryRegistering("DroneVendorMultiShopController_Start", (NetworkBehaviour)(object)self); } private static bool TryRegistering(string caller, NetworkBehaviour self, bool log = true) { //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) if (log) { Log.Debug(caller + " " + ((Object)((Component)self).gameObject).name); } if (NetworkServer.active) { InteractableDef byGameObjectName = InteractablesCollection.instance.GetByGameObjectName(((Object)((Component)self).gameObject).name); if ((Object)(object)byGameObjectName == (Object)null) { if (log) { Log.Debug("interactableDef not found"); } return false; } Log.Debug(byGameObjectName.type.ToString() + " found"); TrackedInteractable trackedInteractable = default(TrackedInteractable); NetworkInstanceId netId = ((Component)self).GetComponent<NetworkIdentity>().netId; trackedInteractable.netId = ((NetworkInstanceId)(ref netId)).Value; trackedInteractable.type = byGameObjectName.type; trackedInteractable.charges = byGameObjectName.charges; TrackedInteractable trackedInteractable2 = trackedInteractable; ((SyncList<TrackedInteractable>)(object)InteractableTracker.instance.trackedInteractables).Add(trackedInteractable2); return true; } return false; } private static void MultiShopController_OnPurchase(orig_OnPurchase orig, MultiShopController self, PayCostContext payCostContext, PayCostResults payCostResult) { //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) orig.Invoke(self, payCostContext, payCostResult); Log.Debug("MultiShopController_OnPurchase " + ((Object)((Component)self).gameObject).name); if (!NetworkServer.active) { return; } int num = 0; GameObject[] terminalGameObjects = self.terminalGameObjects; for (int i = 0; i < terminalGameObjects.Length; i++) { if (terminalGameObjects[i].GetComponent<PurchaseInteraction>().Networkavailable) { num++; } } NetworkInstanceId netId = ((Component)self).GetComponent<NetworkIdentity>().netId; SetCharges(((NetworkInstanceId)(ref netId)).Value, num); } private static void DroneVendorMultiShopController_OnPurchase(orig_OnPurchase orig, DroneVendorMultiShopController self, PayCostContext payCostContext, PayCostResults payCostResult) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: 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) //IL_0064: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, payCostContext, payCostResult); Log.Debug("DroneVendorMultiShopController_OnPurchase " + ((Object)((Component)self).gameObject).name); if (!NetworkServer.active) { return; } int num = 0; DroneVendorTerminalBehavior[] terminals = self._terminals; for (int i = 0; i < terminals.Length; i++) { if (terminals[i].NetworkcurrentPickup != UniquePickup.none) { num++; } } NetworkInstanceId netId = ((Component)self).GetComponent<NetworkIdentity>().netId; SetCharges(((NetworkInstanceId)(ref netId)).Value, num); } private static void ShrineChanceBehavior_AddShrineStack(orig_AddShrineStack orig, ShrineChanceBehavior self, Interactor activator) { //IL_002f: 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) orig.Invoke(self, activator); Log.Debug("ShrineChanceBehavior_AddShrineStack " + ((Object)((Component)self).gameObject).name); if (NetworkServer.active) { NetworkInstanceId netId = ((Component)self).GetComponent<NetworkIdentity>().netId; SetCharges(((NetworkInstanceId)(ref netId)).Value, self.maxPurchaseCount - self.successfulPurchaseCount); } } private static void PurchaseInteraction_OnDisable(orig_OnDisable orig, PurchaseInteraction self) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); Log.Debug("PurchaseInteraction_OnDisable" + ((Object)((Component)self).gameObject).name); if (!NetworkServer.active) { return; } if (((Object)((Component)self).gameObject).name.Contains("(Clone)")) { Log.Debug("Contains (Clone)"); return; } NetworkInstanceId netId = ((Component)self).GetComponent<NetworkIdentity>().netId; int? num = FindInteractableIndex(((NetworkInstanceId)(ref netId)).Value); if (num.HasValue) { Log.Debug("Removed"); ((SyncList<TrackedInteractable>)(object)InteractableTracker.instance.trackedInteractables).RemoveAt(num.Value); } } private static void PurchaseInteraction_PreStartClient(orig_PreStartClient orig, PurchaseInteraction self) { //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); Log.Debug("PurchaseInteraction_PreStartClient " + ((Object)((Component)self).gameObject).name); if (!NetworkServer.active) { return; } InteractableDef byGameObjectName = InteractablesCollection.instance.GetByGameObjectName(((Object)((Component)self).gameObject).name); if ((Object)(object)byGameObjectName == (Object)null) { Log.Debug("interactableDef not found"); return; } Log.Debug(byGameObjectName.type.ToString() + " found"); int index = ((SyncListStruct<TrackedInteractable>)InteractableTracker.instance.trackedInteractables).Count; TrackedInteractable trackedInteractable2 = default(TrackedInteractable); NetworkInstanceId netId = ((Component)self).GetComponent<NetworkIdentity>().netId; trackedInteractable2.netId = ((NetworkInstanceId)(ref netId)).Value; trackedInteractable2.type = byGameObjectName.type; trackedInteractable2.charges = byGameObjectName.charges; TrackedInteractable trackedInteractable = trackedInteractable2; ((SyncList<TrackedInteractable>)(object)InteractableTracker.instance.trackedInteractables).Add(trackedInteractable); if (byGameObjectName.charges != 1 && byGameObjectName.type != InteractableType.BloodShrine && byGameObjectName.type != InteractableType.WoodShrine) { Log.Debug("charges != 1"); return; } ((UnityEvent<Interactor>)(object)self.onPurchase).AddListener((UnityAction<Interactor>)delegate { trackedInteractable.charges = Mathf.Max(0, trackedInteractable.charges - 1); ((SyncList<TrackedInteractable>)(object)InteractableTracker.instance.trackedInteractables)[index] = trackedInteractable; }); } public static int? FindInteractableIndex(uint netId) { return (from x in ((IEnumerable<TrackedInteractable>)InteractableTracker.instance.trackedInteractables).Select((TrackedInteractable x, int i) => (x.netId, i)) where x.netId == netId select x.index).FirstOrDefault(); } private static bool SetCharges(uint netId, int charges) { int? num = FindInteractableIndex(netId); if (!num.HasValue) { Log.Debug("index == null. netId = " + netId); return false; } TrackedInteractable trackedInteractable = ((SyncList<TrackedInteractable>)(object)InteractableTracker.instance.trackedInteractables)[num.Value]; trackedInteractable.charges = charges; ((SyncList<TrackedInteractable>)(object)InteractableTracker.instance.trackedInteractables)[num.Value] = trackedInteractable; return true; } } public static class RunHooks { public static void Init() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown PreGameController.Awake += new hook_Awake(PreGameController_Awake); Run.AdvanceStage += new hook_AdvanceStage(Run_AdvanceStage); SceneExitController.Begin += new hook_Begin(SceneExitController_Begin); } private static void Run_AdvanceStage(orig_AdvanceStage orig, Run self, SceneDef nextScene) { if (NetworkServer.active) { ((SyncList<TrackedInteractable>)(object)InteractableTracker.instance.trackedInteractables).Clear(); } orig.Invoke(self, nextScene); } private static void PreGameController_Awake(orig_Awake orig, PreGameController self) { orig.Invoke(self); if (NetworkServer.active) { NetworkServer.Spawn(Object.Instantiate<GameObject>(ContentProvider.interactableTrackerPrefab)); } } private static void SceneExitController_Begin(orig_Begin orig, SceneExitController self) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if ((int)self.exitState == 0) { InteractableTracker.instance.CallRpcShowRecap(); } orig.Invoke(self); } } [CreateAssetMenu(fileName = "InteractableDef", menuName = "StageReport/InteractableDef", order = 1)] public class InteractableDef : ScriptableObject { public InteractableType type; public string nameToken; public Texture2D texture; public string textureKey; public int charges = 1; [Range(0f, 100f)] public int defaultScoreWeight; public bool unstackable; public string[] gameObjectNames; private Texture2D _texture; public Texture2D Texture { get { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_texture == (Object)null)) { return _texture; } return _texture = (((Object)(object)texture != (Object)null) ? texture : Addressables.LoadAssetAsync<Texture2D>((object)textureKey).WaitForCompletion()); } } public int score { get { if (!Application.isEditor) { return ModConfig.interactablesScore[type].Value; } return defaultScoreWeight; } } } [CreateAssetMenu(fileName = "InteractablesCollection", menuName = "StageReport/InteractablesCollection", order = 2)] public class InteractablesCollection : ScriptableObject { public static InteractablesCollection instance; private Dictionary<InteractableType, InteractableDef> _interactableByType; private Dictionary<InteractableType, int> _interactableOrder; private Dictionary<string, InteractableDef> _interactableByGameObjectName; public InteractableDef[] interactables; public InteractableDef this[InteractableType type] => _interactableByType[type]; public void Init() { instance = this; _interactableByType = interactables.ToDictionary((InteractableDef x) => x.type); _interactableOrder = interactables.Select((InteractableDef value, int index) => (value, index)).ToDictionary<(InteractableDef, int), InteractableType, int>(((InteractableDef value, int index) x) => x.value.type, ((InteractableDef value, int index) x) => x.index); _interactableByGameObjectName = interactables.SelectMany((InteractableDef interactable) => interactable.gameObjectNames.Select((string name) => (interactable, name))).ToDictionary<(InteractableDef, string), string, InteractableDef>(((InteractableDef interactable, string name) x) => x.name, ((InteractableDef interactable, string name) x) => x.interactable); } public InteractableDef GetByGameObjectName(string name) { if (!_interactableByGameObjectName.TryGetValue(name, out var value)) { return null; } return value; } public int GetOrder(InteractableType type) { return _interactableOrder[type]; } } [Serializable] public struct TrackedInteractable : IEquatable<TrackedInteractable> { public InteractableType type; public int charges; public uint netId; public ItemIndex itemIndex; public bool Equals(TrackedInteractable other) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) if (type == other.type && charges == other.charges && netId == other.netId) { return itemIndex == other.itemIndex; } return false; } } public class SyncListTrackedInteractable : SyncListStruct<TrackedInteractable> { public override void SerializeItem(NetworkWriter writer, TrackedInteractable item) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected I4, but got Unknown writer.Write((int)item.type); writer.WritePackedUInt32((uint)item.charges); writer.WritePackedUInt32(item.netId); writer.Write((int)item.itemIndex); } public override TrackedInteractable DeserializeItem(NetworkReader reader) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) TrackedInteractable result = default(TrackedInteractable); result.type = (InteractableType)reader.ReadInt32(); result.charges = (int)reader.ReadPackedUInt32(); result.netId = reader.ReadPackedUInt32(); result.itemIndex = (ItemIndex)reader.ReadInt32(); return result; } } public class InteractableTracker : NetworkBehaviour { public static InteractableTracker instance; public SyncListTrackedInteractable trackedInteractables; private static int kListtrackedInteractables; private static int kRpcRpcShowRecap; public void Awake() { instance = this; Object.DontDestroyOnLoad((Object)(object)this); ((SyncList<TrackedInteractable>)(object)trackedInteractables).InitializeBehaviour((NetworkBehaviour)(object)this, kListtrackedInteractables); } public void OnDestroy() { instance = null; } [ClientRpc] public void RpcShowRecap() { if (ModConfig.modEnabled.Value) { StageReportPanel.Show((IList<TrackedInteractable>)trackedInteractables); } } public InteractableTracker() { trackedInteractables = new SyncListTrackedInteractable(); } private void UNetVersion() { } protected static void InvokeSyncListtrackedInteractables(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError((object)"SyncList trackedInteractables called on server."); } else { ((SyncList<TrackedInteractable>)(object)((InteractableTracker)(object)obj).trackedInteractables).HandleMsg(reader); } } protected static void InvokeRpcRpcShowRecap(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcShowRecap called on server."); } else { ((InteractableTracker)(object)obj).RpcShowRecap(); } } public void CallRpcShowRecap() { //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) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcShowRecap called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcShowRecap); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcShowRecap"); } static InteractableTracker() { //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 kRpcRpcShowRecap = -1110127644; NetworkBehaviour.RegisterRpcDelegate(typeof(InteractableTracker), kRpcRpcShowRecap, new CmdDelegate(InvokeRpcRpcShowRecap)); kListtrackedInteractables = -1574685821; NetworkBehaviour.RegisterSyncListDelegate(typeof(InteractableTracker), kListtrackedInteractables, new CmdDelegate(InvokeSyncListtrackedInteractables)); NetworkCRC.RegisterBehaviour("InteractableTracker", 0); } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { if (forceAll) { GeneratedNetworkCode._WriteStructSyncListTrackedInteractable_None(writer, trackedInteractables); return true; } bool flag = false; if ((((NetworkBehaviour)this).syncVarDirtyBits & (true ? 1u : 0u)) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } GeneratedNetworkCode._WriteStructSyncListTrackedInteractable_None(writer, trackedInteractables); } if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); } return flag; } public override void OnDeserialize(NetworkReader reader, bool initialState) { if (initialState) { GeneratedNetworkCode._ReadStructSyncListTrackedInteractable_None(reader, trackedInteractables); return; } int num = (int)reader.ReadPackedUInt32(); if (((uint)num & (true ? 1u : 0u)) != 0) { GeneratedNetworkCode._ReadStructSyncListTrackedInteractable_None(reader, trackedInteractables); } } public override void PreStartClient() { } } public enum InteractableType { Chest, DamageChest, UtilityChest, HealingChest, WhiteMultishop, LargeChest, LargeDamageChest, LargeUtilityChest, LargeHealingChest, GreenMultishop, LegendaryChest, RedMultishop, AdaptiveChest, EquipmentBarrel, EquipmentMultishop, Lockbox, EncrustedCache, CrashedMultishop, CloakedChest, LunarPod, VoidCradle, VoidPotential, Barrel, Stalk, ChanceShrine, BloodShrine, CombatShrine, MountainShrine, WoodShrine, OrderShrine, GoldShrine, GunnerDrone, HealingDrone, MissileDrone, IcineratorDrone, EquipmentDrone, EmergencyDrone, TCDrone, GunnerTurret, NewtAltar, TimedSecurityChest, AlloyVultureNest, WhitePrinter, GreenPrinter, RedPrinter, YellowPrinter, Scapper, CleansingPool, VultureEgg, ShippingRequestForm, ShrineColossusAccess, ShrineHalcyonite, Geode, TemporaryItemsShopTerminal, TripleDroneShop, AccessCodesNode, DroneScrapper, DroneCombinerStation, BombardmentDrone, CleanUpDrone, CopycatDrone, HaulerDrone, JailerDrone, JunkDrone, RechargeDrone } public static class Log { private static ManualLogSource _logSource; public static void Init(ManualLogSource logSource) { _logSource = logSource; } public static void Debug(object data) { if (_logSource == null) { Debug.Log(data); } else { _logSource.LogDebug(data); } } public static void Error(object data) { if (_logSource == null) { Debug.LogError(data); } else { _logSource.LogError(data); } } public static void Fatal(object data) { if (_logSource == null) { Debug.LogError(data); } else { _logSource.LogFatal(data); } } public static void Info(object data) { if (_logSource == null) { Debug.Log(data); } else { _logSource.LogInfo(data); } } public static void Message(object data) { if (_logSource == null) { Debug.Log(data); } else { _logSource.LogMessage(data); } } public static void Warning(object data) { if (_logSource == null) { Debug.LogWarning(data); } else { _logSource.LogWarning(data); } } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("Lawlzee.StageRecap", "StageRecap", "1.4.0")] public class Main : BaseUnityPlugin { public const string PluginGUID = "Lawlzee.StageRecap"; public const string PluginAuthor = "Lawlzee"; public const string PluginName = "StageRecap"; public const string PluginVersion = "1.4.0"; public void Awake() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown Log.Init(((BaseUnityPlugin)this).Logger); Texture2D val = LoadTexture("icon.png"); ModSettingsManager.SetModIcon(Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0f, 0f))); ModSettingsManager.SetModDescription("At the end of each stage, StageRecap shows all the interactables on the stage and how many you’ve collected. This helps players improve at full looting stages."); RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate { ModConfig.Init(((BaseUnityPlugin)this).Config); }); RunHooks.Init(); InteractableHooks.Init(); ContentManager.collectContentPackProviders += new CollectContentPackProvidersDelegate(GiveToRoR2OurContentPackProviders); } private Texture2D LoadTexture(string name) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_002a: Expected O, but got Unknown Texture2D val = new Texture2D(2, 2); ImageConversion.LoadImage(val, File.ReadAllBytes(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), name))); return val; } private void GiveToRoR2OurContentPackProviders(AddContentPackProviderDelegate addContentPackProvider) { addContentPackProvider.Invoke((IContentPackProvider)(object)new ContentProvider()); } } public static class ModConfig { public static ConfigEntry<bool> modEnabled; public static ConfigEntry<bool> revealInteractableOnStageEnd; public static Dictionary<InteractableType, ConfigEntry<bool>> visibleInteractables = new Dictionary<InteractableType, ConfigEntry<bool>>(); public static Dictionary<InteractableType, ConfigEntry<int>> interactablesScore = new Dictionary<InteractableType, ConfigEntry<int>>(); public static void Init(ConfigFile config) { //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 //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Expected O, but got Unknown //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Expected O, but got Unknown //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Expected O, but got Unknown modEnabled = config.Bind<bool>("Configuration", "Mod enabled", true, "Mod enabled"); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(modEnabled)); revealInteractableOnStageEnd = config.Bind<bool>("Configuration", "Reveal interactables on stage end", true, "When the stage recap is shown, the Radar Scanner effect is now activated to show missed interactables."); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(revealInteractableOnStageEnd)); InteractableDef[] interactables = InteractablesCollection.instance.interactables; foreach (InteractableDef interactableDef in interactables) { string text = string.Join(" ", ((IEnumerable<string>)interactableDef.nameToken.Split(' ')).Select((Func<string, string>)Language.GetString)); string text2 = NormaliseName(text); ConfigEntry<bool> val = config.Bind<bool>("Visible", text2, true, "Is <style=cIsHealing>" + text + "</style> shown in the stage recap?"); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(val)); visibleInteractables[interactableDef.type] = val; ConfigEntry<int> val2 = config.Bind<int>("Score", text2, interactableDef.defaultScoreWeight, "How many points does <style=cIsHealing>" + text + "</style> add to the stage completion percentage?"); ModSettingsManager.AddOption((BaseOption)new IntSliderOption(val2, new IntSliderConfig { min = 0, max = 100 })); interactablesScore[interactableDef.type] = val2; } static string NormaliseName(string name) { return Regex.Replace(name, "[=\\n\\t\\\\\"'\\[\\]]", "").Trim(); } } } public class ProfilerLog : IDisposable { private readonly ProfilerLog _parent; private readonly Stopwatch _stopwatch; private readonly string _name; private readonly int _depth; public static ProfilerLog Current { get; private set; } = new ProfilerLog(null, null); private ProfilerLog(ProfilerLog parent, string name) { _parent = parent; _stopwatch = Stopwatch.StartNew(); _name = name; _depth = (parent?._depth ?? 0) + 1; } public static void Reset() { while (Current._parent != null) { Current = Current._parent; } Current._stopwatch.Restart(); } public static void Debug(object data) { Log.Debug(GetMessage(data)); Current._stopwatch.Restart(); } public static void Error(object data) { Log.Error(GetMessage(data)); Current._stopwatch.Restart(); } public static void Fatal(object data) { Log.Fatal(GetMessage(data)); Current._stopwatch.Restart(); } public static void Info(object data) { Log.Info(GetMessage(data)); Current._stopwatch.Restart(); } public static void Message(object data) { Log.Message(GetMessage(data)); Current._stopwatch.Restart(); } public static void Warning(object data) { Log.Warning(GetMessage(data)); Current._stopwatch.Restart(); } private static string GetMessage(object data) { return $"Profiler <{Current._depth}> {data}: {Current._stopwatch.Elapsed}"; } public static ProfilerLog CreateScope(string name) { Current = new ProfilerLog(Current, name); return Current; } public void Dispose() { Current = _parent; Debug(_name); } } public class SemanticVersion { public int Major; public int Minor; public int Patch; public static SemanticVersion Parse(string version) { string[] array = version.Split('.'); return new SemanticVersion { Major = int.Parse(array[0]), Minor = int.Parse(array[1]), Patch = int.Parse(array[2]) }; } public static bool operator <(SemanticVersion a, SemanticVersion b) { if (a.Major < b.Major) { return true; } if (a.Major > b.Major) { return false; } if (a.Minor < b.Minor) { return true; } if (a.Minor > b.Minor) { return false; } if (a.Patch < b.Patch) { return true; } return false; } public static bool operator >(SemanticVersion a, SemanticVersion b) { if (a.Major > b.Major) { return true; } if (a.Major < b.Major) { return false; } if (a.Minor > b.Minor) { return true; } if (a.Minor < b.Minor) { return false; } if (a.Patch > b.Patch) { return true; } return false; } public static bool operator ==(SemanticVersion a, SemanticVersion b) { if (a.Major == b.Major && a.Minor == b.Minor) { return a.Patch == b.Patch; } return false; } public static bool operator !=(SemanticVersion a, SemanticVersion b) { if (a.Major == b.Major && a.Minor == b.Minor) { return a.Patch != b.Patch; } return true; } public override bool Equals(object obj) { if (obj is SemanticVersion semanticVersion && Major == semanticVersion.Major && Minor == semanticVersion.Minor) { return Patch == semanticVersion.Patch; } return false; } public override int GetHashCode() { return ((-639545495 * -1521134295 + Major.GetHashCode()) * -1521134295 + Minor.GetHashCode()) * -1521134295 + Patch.GetHashCode(); } } public class StageReportPanel : MonoBehaviour { public string labelPrefabKey; public string interactableIconPrefabKey; public GameObject interactablePanel; public GameObject printerItemIconPrefab; public InteractablesCollection interactablesCollection; public string stageLabelText; public Vector3 stageLabelScale; public Vector2 stageLabelPivot; public Color stageLabelColor; public int stageLabelFontSize; public Texture2D numberRamp; public Color noChargesColor; public float interactableShowInitialDelay; public float interactableShowDelay; public static void Show(IList<TrackedInteractable> trackedInteractables) { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) Transform val = (GameObject.Find("HUDSimple(Clone)") ?? GameObject.Find("RiskUI(Clone)")).transform.Find("MainContainer").Find("MainUIArea").Find("SpringCanvas"); Object.Instantiate<GameObject>(ContentProvider.stageReportPanelPrefab, val).GetComponent<StageReportPanel>().Render(trackedInteractables); if (!Application.isEditor && ModConfig.revealInteractableOnStageEnd.Value) { GameObject obj = Object.Instantiate<GameObject>(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Scanner/ChestScanner.prefab").WaitForCompletion(), ((Component)Camera.main).transform); ChestRevealer component = obj.GetComponent<ChestRevealer>(); component.radius = float.MaxValue; component.pulseTravelSpeed *= 2f; OnDestroyCallback.AddCallback(obj, (Action<OnDestroyCallback>)delegate { ChestRevealerHooks.reportOpened = false; }); ChestRevealerHooks.reportOpened = true; } } public static void Toggle(IList<TrackedInteractable> trackedInteractables) { Transform obj = (GameObject.Find("HUDSimple(Clone)") ?? GameObject.Find("RiskUI(Clone)")).transform.Find("MainContainer").Find("MainUIArea").Find("SpringCanvas") .Find("StageReportPanel(Clone)"); GameObject val = ((obj != null) ? ((Component)obj).gameObject : null); if ((Object)(object)val != (Object)null) { Object.Destroy((Object)(object)val); } else { Show(trackedInteractables); } } public void Render(IList<TrackedInteractable> trackedInteractables) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0024: 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_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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) GameObject obj = Object.Instantiate<GameObject>(Addressables.LoadAssetAsync<GameObject>((object)labelPrefabKey).WaitForCompletion(), ((Component)this).transform); RectTransform val = (RectTransform)obj.transform; ((Transform)val).localScale = stageLabelScale; val.pivot = stageLabelPivot; ((Transform)val).SetAsFirstSibling(); HGTextMeshProUGUI component = obj.GetComponent<HGTextMeshProUGUI>(); ((TMP_Text)component).text = stageLabelText; ((Graphic)component).color = stageLabelColor; ((TMP_Text)component).fontSize = stageLabelFontSize; ((MonoBehaviour)this).StartCoroutine(RenderInteractables(component, trackedInteractables)); } private IEnumerator RenderInteractables(HGTextMeshProUGUI textMesh, IList<TrackedInteractable> trackedInteractables) { yield return (object)new WaitForSeconds(interactableShowInitialDelay); GameObject interactableIconPrefab = Addressables.LoadAssetAsync<GameObject>((object)interactableIconPrefabKey).WaitForCompletion(); List<(InteractableType, ItemIndex, int, int, InteractableDef)> list = (from x in trackedInteractables where Application.isEditor || ModConfig.visibleInteractables[x.type].Value select (x, InteractablesCollection.instance[x.type]) into x group x by (x.value.type, x.def.unstackable ? Guid.NewGuid() : Guid.Empty) into kvp select (kvp.Key.type, kvp.First().value.itemIndex, kvp.Select(((TrackedInteractable value, InteractableDef def) x) => x.value.charges).Sum(), kvp.Count(), kvp.First().def) into x orderby InteractablesCollection.instance.GetOrder(x.type) select x).ToList(); float currentScore = 0f; float total = (from x in list where x.def.charges > 0 select x.def.score * x.count).Sum(); foreach (var item in list) { GameObject val = Object.Instantiate<GameObject>(interactableIconPrefab, interactablePanel.transform); ((Component)val.transform.Find("Timer")).gameObject.SetActive(false); val.GetComponent<RawImage>().texture = (Texture)(object)item.Item5.Texture; Transform child = val.transform.GetChild(0); HGTextMeshProUGUI component = ((Component)child).GetComponent<HGTextMeshProUGUI>(); ((Component)child).gameObject.SetActive(true); if (item.Item5.unstackable) { ((TMP_Text)component).text = ""; GameObject val2 = Object.Instantiate<GameObject>(printerItemIconPrefab, val.transform); if (!Application.isEditor) { val2.GetComponent<RawImage>().texture = ItemCatalog.GetItemDef(item.Item2).pickupIconTexture; } } else if (item.Item5.charges == 0) { ((TMP_Text)component).text = item.Item4.ToString(); ((Graphic)component).color = noChargesColor; } else { float num = 1f - (float)item.Item3 / ((float)item.Item5.charges * (float)item.Item4); ((Graphic)component).color = numberRamp.GetPixelBilinear(num, 0f); currentScore += (float)item.Item5.score * ((float)item.Item4 - (float)item.Item3 / (float)item.Item5.charges); ((TMP_Text)component).text = $"{(float)item.Item4 - (float)item.Item3 / (float)item.Item5.charges:0.##}/{item.Item4}"; } val.GetComponent<TooltipProvider>().titleToken = item.Item5.nameToken; float num2 = ((total > 0f) ? (100f * Mathf.Clamp01(currentScore / total)) : 100f); ((TMP_Text)textMesh).text = $"{stageLabelText} - {Mathf.CeilToInt(num2)}%"; yield return (object)new WaitForSeconds(interactableShowDelay); } } } [DefaultExecutionOrder(-1)] public class HudInstantier : MonoBehaviour { public GameObject stageReportPrefab; public InteractablesCollection interactablesCollection; public TrackedInteractable[] trackedInteractables; private int initalised; private NetworkUser networkUser; private GameObject camera; private void Awake() { if (Application.isPlaying) { interactablesCollection.Init(); ContentProvider.stageReportPanelPrefab = stageReportPrefab; } } private void Update() { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) if (Application.isPlaying) { if (Input.GetKeyDown((KeyCode)286)) { StageReportPanel.Toggle(trackedInteractables); } if (initalised == 0) { GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Core/Camera/Main Camera.prefab").WaitForCompletion(); val.GetComponent<CameraRigController>().nextTarget = ((Component)this).gameObject; camera = Object.Instantiate<GameObject>(val); initalised = 1; } else if (initalised == 1) { initalised = 2; GameObject obj = GameObject.Find("HUDSimple(Clone)"); HUD.cvHudEnable.value = true; Transform obj2 = obj.transform.Find("MainContainer").Find("MainUIArea"); ((Component)obj2).gameObject.SetActive(true); Transform val2 = obj2.Find("SpringCanvas").Find("UpperRightCluster"); Object.Instantiate<GameObject>(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/ClassicRun/ClassicRunInfoHudPanel.prefab").WaitForCompletion(), val2); StageReportPanel.Show(trackedInteractables); } } } } [DefaultExecutionOrder(-100)] public class ServerStarter : MonoBehaviour { public void Awake() { Log.Debug("Starting server"); ((Component)this).GetComponent<NetworkManager>().StartHost(); Log.Debug("Server started: " + NetworkServer.active); } } } namespace Assets.StageReport { public static class Commands { [ConCommand(/*Could not decode attribute arguments.*/)] public static void ToggleReport(ConCommandArgs args) { StageReportPanel.Toggle((IList<TrackedInteractable>)InteractableTracker.instance.trackedInteractables); } } } namespace Unity { [StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)] public class GeneratedNetworkCode { public static void _ReadStructSyncListTrackedInteractable_None(NetworkReader reader, SyncListTrackedInteractable instance) { ushort num = reader.ReadUInt16(); ((SyncList<TrackedInteractable>)(object)instance).Clear(); for (ushort num2 = 0; num2 < num; num2++) { ((SyncListStruct<TrackedInteractable>)instance).AddInternal(instance.DeserializeItem(reader)); } } public static void _WriteStructSyncListTrackedInteractable_None(NetworkWriter writer, SyncListTrackedInteractable value) { ushort count = ((SyncListStruct<TrackedInteractable>)value).Count; writer.Write(count); for (ushort num = 0; num < count; num++) { value.SerializeItem(writer, ((SyncListStruct<TrackedInteractable>)value).GetItem((int)num)); } } } }