The BepInEx console will not appear when launching like it does for other games on Thunderstore (you can turn it back on in your BepInEx.cfg file). If your PEAK crashes on startup, add -dx12 to your launch parameters.
Decompiled source of MoreAscents v1.4.1
BepInEx/plugins/MoreAscents.dll
Decompiled 3 days agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using MoreAscents.API; using MoreAscents.Patches; using UnityEngine; using Zorro.Core; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.1", FrameworkDisplayName = ".NET Framework 4.7.1")] [assembly: AssemblyCompany("MoreAscents")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+190ef7d78b52ef4146244fde0130108317e88e26")] [assembly: AssemblyProduct("MoreAscents")] [assembly: AssemblyTitle("MoreAscents")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace MoreAscents { public class AscentGimmick { public AscentStruct _ascentData; public bool active; public virtual string GetTitle() { return ""; } public virtual string GetDescription() { return ""; } public virtual Color GetColor() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return Color.red; } public virtual string GetTitleReward() { return ""; } public virtual void CharacterPassedOut(Character character) { } public virtual void OnLavaExisted(Lava lava) { } public virtual void OnFogInitNewSphere(OrbFogHandler __instance) { } public virtual void OnCharacterFall(Character character) { } public virtual void RespawnChestExisted(Spawner chest) { } public virtual void OnFinishCooking(ItemCooking itemCooking) { } public virtual void SpawnerSpawnItems(Spawner spawner, ref List<Transform> spawnSpots) { } public virtual void OnGrabbedCharacter(Character thisCharacter) { } public virtual void OnUpdateNormalStatuses(Character character) { } public virtual void Update() { } public virtual float AfflictionMultiplier(CharacterAfflictions afflictions, STATUSTYPE statusType, float amount) { return 0f; } } public static class AscentGimmickHandler { internal static readonly List<AscentGimmick> gimmicks = new List<AscentGimmick>(); private static readonly List<AscentInstanceData> pendingDatas = new List<AscentInstanceData>(); private static bool HasInitialized = false; internal static int BaseAscents { get; private set; } = -1; internal static void MarkGimmicksAsActive(int ascentIndex) { int num = 0; foreach (AscentInstanceData ascent in SingletonAsset<AscentData>.Instance.ascents) { AscentGimmick gimmickByData = GetGimmickByData(ascent); if (num <= ascentIndex && gimmickByData != null) { gimmickByData.active = true; Plugin.Logger.LogWarning((object)("enabled gimmick " + gimmickByData.GetType().Name + " [" + gimmickByData.GetTitle() + "]!")); } num++; } } public static AscentGimmick GetGimmickByData(AscentInstanceData data) { foreach (AscentGimmick gimmick in gimmicks) { if (gimmick._ascentData.data == data) { return gimmick; } } return null; } internal static void DisableGimmicks() { foreach (AscentGimmick gimmick in gimmicks) { gimmick.active = false; } } internal static int GetBaseAscentCount() { if (BaseAscents == -1) { BaseAscents = SingletonAsset<AscentData>.Instance.ascents.Count; } return BaseAscents; } internal static void Initialize() { if (HasInitialized) { Plugin.Logger.LogError((object)"already initialized"); return; } HasInitialized = true; AscentData instance = SingletonAsset<AscentData>.Instance; List<AscentInstanceData> ascents = instance.ascents; List<AscentInstanceData> list = new List<AscentInstanceData>(); Plugin.Logger.LogInfo((object)$"initializing with ({pendingDatas.Count} custom) and ({ascents.Count} base)"); foreach (AscentInstanceData item in ascents) { HotLoadAscentInstanceData(list, item); } foreach (AscentInstanceData pendingData in pendingDatas) { HotLoadAscentInstanceData(list, pendingData); } instance.ascents = list; } private static void HotLoadAscentInstanceData(List<AscentInstanceData> targetList, AscentInstanceData data) { if (data.titleReward == "") { data.titleReward = data.title + " Conqueror"; } targetList.Add(data); } public static void RegisterAscent<T>() where T : AscentGimmick { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: 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_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_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_0040: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown AscentGimmick ascentGimmick = Activator.CreateInstance<T>(); AscentInstanceData val2 = new AscentInstanceData { title = ascentGimmick.GetTitle(), description = ascentGimmick.GetDescription(), titleReward = ascentGimmick.GetTitleReward(), color = ascentGimmick.GetColor(), sashSprite = SingletonAsset<AscentData>.Instance.ascents[0].sashSprite }; ascentGimmick._ascentData = new AscentStruct { data = val2, order = 9 + (gimmicks.Count + 1) }; gimmicks.Add(ascentGimmick); if (HasInitialized) { HotLoadAscentInstanceData(SingletonAsset<AscentData>.Instance.ascents, val2); Plugin.Logger.LogInfo((object)("Hot loaded " + val2.title + "!")); return; } pendingDatas.Add(val2); Plugin.Logger.LogInfo((object)("Queued " + val2.title)); _ = ascentGimmick._ascentData; AddIdentityTranslation(ascentGimmick.GetTitle(), ascentGimmick.GetTitle()); AddIdentityTranslation("desc_" + ascentGimmick.GetTitle(), ascentGimmick.GetDescription()); static void AddIdentityTranslation(string key, string val) { if (string.IsNullOrWhiteSpace(key)) { throw new NotImplementedException($"translation was empty?? {typeof(T)}"); } LocalizedText.mainTable.Add(key.ToUpperInvariant(), Enumerable.Repeat(val.ToUpperInvariant(), 14).ToList()); } } } public struct AscentStruct { public AscentInstanceData data; public int order; } public class AfflictionGimmick : AscentGimmick { public override string GetTitle() { return "Ascent 9"; } public override string GetDescription() { return "You're more vulnerable to everything but Injuries, Hunger and Weight."; } public override float AfflictionMultiplier(CharacterAfflictions affliction, STATUSTYPE statusType, float amount) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Invalid comparison between Unknown and I4 //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Invalid comparison between Unknown and I4 //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Invalid comparison between Unknown and I4 if ((int)statusType == 0 || (int)statusType == 1 || (int)statusType == 7 || !affliction.character.IsLocal || (CharacterPatches.UpdateNormalStatuses.InUpdateNormalStatuses && (int)statusType == 2)) { return 0f; } return 2f; } } public class BingBongGimmick : AscentGimmick { private static float SinceLastShake; public override string GetDescription() { return "Bing Bong calls upon an evil force if not given attention."; } public override string GetTitle() { return "Chaos 4"; } public override void Update() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Invalid comparison between Unknown and I4 float deltaTime = Time.deltaTime; SinceLastShake += deltaTime; Item heldBingBongItem = BingBongPatches.heldBingBongItem; if ((Object)(object)heldBingBongItem != (Object)null && (int)heldBingBongItem.itemState == 1) { BingBongMechanics.BingBongUnheldFor = 0f; } else { BingBongMechanics.BingBongUnheldFor += deltaTime; } foreach (Character allCharacter in Character.AllCharacters) { if (allCharacter.IsLocal) { if (allCharacter.data.passedOutOnTheBeach > 0f) { BingBongMechanics.BingBongUnheldFor = 0f; break; } if (BingBongMechanics.BingBongUnheldFor > 10f && BingBongMechanics.BingBongUnheldFor <= 15f && SinceLastShake > 0f) { SinceLastShake = 0f; GamefeelHandler.instance.AddPerlinShake(0.7f, 0.15f, 15f); } if (BingBongMechanics.BingBongUnheldFor >= 15f) { allCharacter.refs.afflictions.AddStatus((STATUSTYPE)4, 0.05f * Time.deltaTime, false); break; } } } } } public class CampfireGimmick : AscentGimmick { public override string GetDescription() { return "Campfires are extremely hot."; } public override string GetTitle() { return "Chaos 2"; } public override void OnFinishCooking(ItemCooking itemCooking) { itemCooking.wreckWhenCooked = true; } } public class SkeletonGimmick : AscentGimmick { public override string GetDescription() { return "Passing out instantly turns you into a skeleton."; } public override string GetTitle() { return "Chaos 1"; } public override void CharacterPassedOut(Character character) { if (character.IsLocal) { ((object)character).GetType().GetMethod("DieInstantly", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(character, Array.Empty<object>()); } } } public class SunHotGimmick : AscentGimmick { public override string GetDescription() { return "The sun is very hot, don't get heatstroke."; } public override string GetTitle() { return "Chaos 3"; } public override void OnUpdateNormalStatuses(Character character) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: 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_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) //IL_005b: 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_006c: 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) if (!character.IsLocal || DayNightManager.instance.isDay < 0.5f) { return; } MountainProgressHandler instance = Singleton<MountainProgressHandler>.Instance; if (!((Object)(object)instance == (Object)null) && instance.maxProgressPointReached < 3) { Vector3 val = -((Component)RenderSettings.sun).transform.forward; RaycastHit val2 = HelperFunctions.LineCheck(character.Center, character.Center + val * 1000f, (LayerType)5, 0f, (QueryTriggerInteraction)1); if (!Object.op_Implicit((Object)(object)((RaycastHit)(ref val2)).transform) || !(((Object)((Component)((RaycastHit)(ref val2)).transform).gameObject).name != "EdgeWall")) { character.refs.afflictions.AddStatus((STATUSTYPE)8, 0.0025f * Time.deltaTime, false); } } } } public class FallDamageGimmick : AscentGimmick { public override string GetTitle() { return "Ascent 8"; } public override string GetDescription() { return "Butter Fingers."; } public override void OnCharacterFall(Character character) { if (character.IsLocal) { ((object)Character.localCharacter.refs.items).GetType().GetMethod("DropAllItems", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(Character.localCharacter.refs.items, new object[1] { true }); } } } public class HelpingIsBadGimmick : AscentGimmick { public override string GetTitle() { return "Ascent 11"; } public override string GetDescription() { return "Helping makes you drowsy."; } public override void OnGrabbedCharacter(Character character) { character.refs.afflictions.AddStatus((STATUSTYPE)6, 0.05f, false); } } public class LuggageGimmick : AscentGimmick { public override string GetTitle() { return "Ascent 10"; } public override string GetDescription() { return "Big Luggage's have a chance to only contain one item."; } public override void SpawnerSpawnItems(Spawner spawner, ref List<Transform> spawnSpots) { if (((Object)((Component)spawner).gameObject).name == "LuggageBig" && Random.Range(0, 2) == 0) { List<Transform> list = new List<Transform>(); list.Add(spawnSpots[0]); spawnSpots = list; } } } public class OccultStatueGimmick : AscentGimmick { public override string GetTitle() { return "Ascent 12"; } public override string GetDescription() { return "No more Revive Statues."; } public override void RespawnChestExisted(Spawner chest) { if (Plugin.ascent7Disabler.Value) { ((Component)chest).gameObject.SetActive(false); } } } public class FogGimmick : AscentGimmick { public override string GetDescription() { return "The fog starts earlier and moves faster."; } public override string GetTitle() { return "Chaos 2"; } public override void OnFogInitNewSphere(OrbFogHandler fog) { fog.currentStartForward = 0f; fog.currentStartHeight = 0f; fog.speed *= 2f; fog.maxWaitTime /= 10f; Plugin.Logger.LogWarning((object)"patched fog AGAIN"); } } [BepInPlugin("MoreAscents", "MoreAscents", "1.0.0")] internal class Plugin : BaseUnityPlugin { internal static ManualLogSource Logger; internal static ConfigEntry<int> ascentsUnlocked; internal static ConfigEntry<bool> ascent7Disabler; private static bool Initted; private void Awake() { //IL_0097: Unknown result type (might be due to invalid IL or missing references) Logger = ((BaseUnityPlugin)this).Logger; ascentsUnlocked = ((BaseUnityPlugin)this).Config.Bind<int>("General", "MaxAscent", 0, ""); ascent7Disabler = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Ascent 7/12 Disabler", false, "Disables ascent 7 and 12."); AscentGimmickHandler.GetBaseAscentCount(); AscentGimmickHandler.RegisterAscent<FallDamageGimmick>(); AscentGimmickHandler.RegisterAscent<AfflictionGimmick>(); AscentGimmickHandler.RegisterAscent<LuggageGimmick>(); AscentGimmickHandler.RegisterAscent<HelpingIsBadGimmick>(); AscentGimmickHandler.RegisterAscent<OccultStatueGimmick>(); AscentGimmickHandler.RegisterAscent<SkeletonGimmick>(); AscentGimmickHandler.RegisterAscent<CampfireGimmick>(); AscentGimmickHandler.RegisterAscent<SunHotGimmick>(); AscentGimmickHandler.RegisterAscent<BingBongGimmick>(); AscentGimmickHandler.Initialize(); Logger.LogInfo((object)"Plugin MoreAscents is loaded!"); new Harmony("MoreAscents").PatchAll(); } internal static void Init() { if (Initted) { return; } Initted = true; int num = default(int); if (Singleton<AchievementManager>.Instance.GetSteamStatInt((STEAMSTATTYPE)13, ref num)) { if (num > AscentGimmickHandler.BaseAscents) { Singleton<AchievementManager>.Instance.SetSteamStat((STEAMSTATTYPE)13, AscentGimmickHandler.BaseAscents); } ascentsUnlocked.Value = ((ascentsUnlocked.Value < num) ? num : ascentsUnlocked.Value); } Logger.LogInfo((object)"Initted"); } private void Update() { GUIManagerPatches.Grasp.SinceLastGrab += Time.deltaTime; foreach (AscentGimmick gimmick in AscentGimmickHandler.gimmicks) { if (gimmick.active) { gimmick.Update(); } } } } [HarmonyPatch(typeof(BoardingPass), "UpdateAscent")] internal static class boarding_initilize_patch { internal static void Prefix(BoardingPass __instance) { if (Input.GetKey((KeyCode)108)) { Singleton<AchievementManager>.Instance.SetSteamStat((STEAMSTATTYPE)13, 155); } FieldInfo field = ((object)__instance).GetType().GetField("maxAscent", BindingFlags.Instance | BindingFlags.NonPublic); field.SetValue(__instance, SingletonAsset<AscentData>.Instance.ascents.Count - 2); Plugin.Logger.LogInfo((object)$"Ascents capped {field.GetValue(__instance)}"); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "MoreAscents"; public const string PLUGIN_NAME = "MoreAscents"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace MoreAscents.Patches { public class AirportCheckInKioskPatches { [HarmonyPatch(typeof(AirportCheckInKiosk), "BeginIslandLoadRPC")] public static class LoadIslandMaster { [HarmonyPrefix] public static void Prefix(int ascent) { _ = GUIManager.instance.boardingPass.ascentData.ascents[ascent + 1]; AscentGimmickHandler.DisableGimmicks(); AscentGimmickHandler.MarkGimmicksAsActive(ascent + 1); } } } internal class BingBongPatches { [HarmonyPatch(/*Could not decode attribute arguments.*/)] internal static class Patch { [HarmonyPrefix] internal static void Prefix(Item value) { if ((Object)(object)value != (Object)null && value.GetItemName((ItemInstanceData)null) == "BING BONG") { heldBingBongItem = value; } else { heldBingBongItem = null; } } } internal static Item heldBingBongItem; } public class CharacterPatches { [HarmonyPatch(typeof(CharacterMovement), "CheckFallDamage")] public static class CheckFallDamage { public static bool InFallDamage; [HarmonyPrefix] public static void Prefix(CharacterMovement __instance) { InFallDamage = true; } [HarmonyPostfix] public static void Postfix(CharacterMovement __instance) { InFallDamage = false; } } [HarmonyPatch(typeof(CharacterGrabbing), "Reach")] public static class Reach { public static Character character; [HarmonyPrefix] public static void Prefix(CharacterGrabbing __instance) { character = ((Component)__instance).GetComponent<Character>(); } [HarmonyPostfix] public static void Postfix() { character = null; } } [HarmonyPatch(typeof(Character), "RPCA_PassOut")] public static class RPCA_PassOut { [HarmonyPostfix] public static void Prefix(Character __instance) { foreach (AscentGimmick gimmick in AscentGimmickHandler.gimmicks) { if (gimmick.active) { gimmick.CharacterPassedOut(__instance); } } } } [HarmonyPatch(typeof(CharacterAfflictions), "UpdateNormalStatuses")] public static class UpdateNormalStatuses { public static bool InUpdateNormalStatuses; [HarmonyPrefix] public static void Prefix(CharacterAfflictions __instance) { foreach (AscentGimmick gimmick in AscentGimmickHandler.gimmicks) { if (gimmick.active) { gimmick.OnUpdateNormalStatuses(__instance.character); } } InUpdateNormalStatuses = true; } [HarmonyPostfix] public static void Postfix() { InUpdateNormalStatuses = false; } } [HarmonyPatch(typeof(CharacterAfflictions), "AddStatus")] public static class AddStatus { [HarmonyPrefix] public static void Prefix(CharacterAfflictions __instance, ref float amount, STATUSTYPE statusType) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) float num = 1f; foreach (AscentGimmick gimmick in AscentGimmickHandler.gimmicks) { if (gimmick.active) { num += gimmick.AfflictionMultiplier(__instance, statusType, amount); } } amount *= num; } [HarmonyPostfix] public static void Postfix(CharacterAfflictions __instance, bool __result, float amount, STATUSTYPE statusType) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) if (!__result || !CheckFallDamage.InFallDamage || (int)statusType != 0) { return; } foreach (AscentGimmick gimmick in AscentGimmickHandler.gimmicks) { if (gimmick.active) { gimmick.OnCharacterFall(__instance.character); } } } } } internal class DisableAscent7 { [HarmonyPatch(/*Could not decode attribute arguments.*/)] public static class Patch { [HarmonyPostfix] public static void Postfix(ref bool __result) { if (Plugin.ascent7Disabler.Value) { __result = true; } } } } internal static class AchievementManagerPatches { [HarmonyPatch(typeof(AchievementManager), "GetMaxAscent")] internal static class GetMaxAscent { [HarmonyPostfix] internal static void Postfix(ref int __result) { __result = Plugin.ascentsUnlocked.Value; if (__result > SingletonAsset<AscentData>.Instance.ascents.Count - 1) { __result = SingletonAsset<AscentData>.Instance.ascents.Count - 1; } } } [HarmonyPatch(typeof(AchievementManager), "Start")] internal static class Start { [HarmonyPrefix] internal static void Prefix() { Plugin.Init(); } } [HarmonyPatch(typeof(AchievementManager), "SetSteamStat")] internal static class SetSteamStat { [HarmonyPrefix] internal static void Prefix(STEAMSTATTYPE steamStatType, ref int value) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 if ((int)steamStatType == 13) { Plugin.ascentsUnlocked.Value = value; if (value > AscentGimmickHandler.BaseAscents - 1) { value = AscentGimmickHandler.BaseAscents - 1; } } } } } internal static class CharacterCustomizationPatches { [HarmonyPatch(typeof(CharacterCustomization), "SetCharacterSash")] internal static class SetCharacterSash { [HarmonyPrefix] internal static void Prefix(ref int index) { if (index > AscentGimmickHandler.BaseAscents - 2) { index = AscentGimmickHandler.BaseAscents - 2; } } } } public class FogPatches { [HarmonyPatch(typeof(OrbFogHandler), "InitNewSphere")] public static class Start { [HarmonyPostfix] public static void Postfix(OrbFogHandler __instance) { foreach (AscentGimmick gimmick in AscentGimmickHandler.gimmicks) { if (gimmick.active) { gimmick.OnFogInitNewSphere(__instance); } } } } } public class GUIManagerPatches { [HarmonyPatch(typeof(GUIManager), "Grasp")] public static class Grasp { public static float SinceLastGrab; [HarmonyPrefix] public static void Prefix() { if (!CharacterPatches.Reach.character.IsLocal) { Plugin.Logger.LogWarning((object)"not local, not firing OnGrabbedCharacter to gimmicks."); } else { if (SinceLastGrab <= 1f) { return; } SinceLastGrab = 0f; Plugin.Logger.LogInfo((object)"success"); foreach (AscentGimmick gimmick in AscentGimmickHandler.gimmicks) { if (gimmick.active) { gimmick.OnGrabbedCharacter(Character.localCharacter); } } } } } } public class ItemCookingPatches { [HarmonyPatch(typeof(ItemCooking), "FinishCookingRPC")] public static class FinishCookingRPC { [HarmonyPrefix] public static void Prefix(ItemCooking __instance) { foreach (AscentGimmick gimmick in AscentGimmickHandler.gimmicks) { if (gimmick.active) { gimmick.OnFinishCooking(__instance); } } } } } public class LavaRiverPatches { [HarmonyPatch(typeof(Lava), "Start")] public static class Start { [HarmonyPrefix] public static void Prefix(Lava __instance) { foreach (AscentGimmick gimmick in AscentGimmickHandler.gimmicks) { if (gimmick.active) { gimmick.OnLavaExisted(__instance); } } } } } public class RopeSpoolPatches { [HarmonyPatch(typeof(RopeSpool), "OnInstanceDataSet")] public static class OnInstanceDataSet { [HarmonyPrefix] public static void Prefix(RopeSpool __instance) { } } } public class SpawnerPatches { [HarmonyPatch(typeof(Spawner), "SpawnItems")] public static class GetSpawnSpots { [HarmonyPrefix] public static void Prefix(Spawner __instance, ref List<Transform> spawnSpots) { foreach (AscentGimmick gimmick in AscentGimmickHandler.gimmicks) { if (gimmick.active) { gimmick.SpawnerSpawnItems(__instance, ref spawnSpots); } } } } [HarmonyPatch(typeof(Luggage), "Awake")] public static class Awake { [HarmonyPostfix] public static void Postfix(Luggage __instance) { if (((object)__instance).GetType() != typeof(RespawnChest)) { return; } foreach (AscentGimmick gimmick in AscentGimmickHandler.gimmicks) { if (gimmick.active) { gimmick.RespawnChestExisted((Spawner)(object)__instance); } } } } } } namespace MoreAscents.API { internal class BingBongMechanics { internal static float BingBongUnheldFor; } }