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 Last Resort v2.1.0
lastresort.dll
Decompiled 4 months 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.Bootstrap; using BepInEx.Configuration; using Microsoft.CodeAnalysis; using On.RoR2; using R2API.Utils; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("atwhatcost")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("atwhatcost")] [assembly: AssemblyTitle("atwhatcost")] [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 LastResort { public enum EnemyPreset { None, Beetle, Lemurian, Imp, HermitCrab, BeetleGuard, ElderLemurian, StoneGolem, BighornBison, ClayTemplar, MiniMushrum, Parent, Gup, Geep, Gip, LesserWisp, GreaterWisp, Jellyfish, BrassContraption, ClayDunestrider, BeetleQueen, ImpOverlord, StoneTitan, Vagrant, MagmaWorm, OverloadingWorm, SolusControlUnit, LunarGolem, LunarWisp, LunarExploder, VoidReaver, VoidJailer, VoidDevastator, VoidBarnacle, VoidInfestor, Direseeker, FalseSon, Custom } public enum EliteType { None = -1, Blazing, Overloading, Glacial, Malachite, Celestine, Void, Echo, Haunted, Earth, Aurelionite, Bead, Collective } public enum ItemTierPriority { Random, FavorWhite, FavorGreen, FavorRed, FavorBoss, FavorLunar, FavorVoid } public enum LogVerbosity { Minimal, Verbose } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.gogogadgetjustice.lastresort", "Last Resort", "2.3.0")] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class LastResortPlugin : BaseUnityPlugin { public const string PluginGUID = "com.gogogadgetjustice.lastresort"; public const string PluginName = "Last Resort"; public const string PluginVersion = "2.3.0"; private ConfigEntry<float> healthThresholdPercent; private ConfigEntry<bool> enableHealing; private ConfigEntry<float> healToPercent; private ConfigEntry<float> itemLossPercent; private ConfigEntry<ItemTierPriority> itemTierPriority; private ConfigEntry<float> cooldownSeconds; private ConfigEntry<float> invulnerabilitySeconds; private ConfigEntry<bool> enableForAllPlayers; private ConfigEntry<string> enabledPlayerNames; private ConfigEntry<string> disabledPlayerNames; private ConfigEntry<int> directorCreditsBase; private ConfigEntry<int> directorCreditsMultiplier; private ConfigEntry<EnemyPreset> enemy1Preset; private ConfigEntry<string> enemy1Master; private ConfigEntry<EliteType> enemy1EliteType; private ConfigEntry<int> enemy1BaseCount; private ConfigEntry<bool> enemy1ScaleWithUses; private ConfigEntry<int> enemy1ScalingMultiplier; private ConfigEntry<EnemyPreset> enemy2Preset; private ConfigEntry<string> enemy2Master; private ConfigEntry<EliteType> enemy2EliteType; private ConfigEntry<int> enemy2BaseCount; private ConfigEntry<bool> enemy2ScaleWithUses; private ConfigEntry<int> enemy2ScalingMultiplier; private ConfigEntry<EnemyPreset> enemy3Preset; private ConfigEntry<string> enemy3Master; private ConfigEntry<EliteType> enemy3EliteType; private ConfigEntry<int> enemy3BaseCount; private ConfigEntry<bool> enemy3ScaleWithUses; private ConfigEntry<int> enemy3ScalingMultiplier; private ConfigEntry<bool> chatNotifications; private ConfigEntry<bool> chatShowCredits; private ConfigEntry<bool> chatShowTotalEnemies; private ConfigEntry<bool> chatShowEnemyDetails; private ConfigEntry<LogVerbosity> logVerbosity; private Dictionary<CharacterBody, float> playerCooldowns = new Dictionary<CharacterBody, float>(); private Dictionary<CharacterBody, int> playerTriggerCount = new Dictionary<CharacterBody, int>(); public void Awake() { //IL_0563: Unknown result type (might be due to invalid IL or missing references) //IL_056d: Expected O, but got Unknown ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Awake called! Setting up config..."); healthThresholdPercent = ((BaseUnityPlugin)this).Config.Bind<float>("1. Activation", "Health Threshold", 25f, "Health percentage threshold to trigger Last Resort"); enableHealing = ((BaseUnityPlugin)this).Config.Bind<bool>("1. Activation", "Enable Healing", true, "Enable healing when Last Resort triggers"); healToPercent = ((BaseUnityPlugin)this).Config.Bind<float>("1. Activation", "Heal To Percent", 100f, "Percentage of max HP to heal to when triggered (only if healing is enabled)"); itemLossPercent = ((BaseUnityPlugin)this).Config.Bind<float>("1. Activation", "Item Loss Percent", 5f, "Percentage of items to lose when Last Resort triggers"); itemTierPriority = ((BaseUnityPlugin)this).Config.Bind<ItemTierPriority>("1. Activation", "Item Tier Priority", ItemTierPriority.FavorGreen, "Which item tier to prioritize removing"); cooldownSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("1. Activation", "Cooldown", 10f, "Cooldown in seconds before Last Resort can trigger again"); invulnerabilitySeconds = ((BaseUnityPlugin)this).Config.Bind<float>("1. Activation", "Invulnerability Duration", 3f, "Seconds of invulnerability after activation"); enableForAllPlayers = ((BaseUnityPlugin)this).Config.Bind<bool>("1. Activation", "Enable For All Players", true, "If true, Last Resort works for everyone. If false, use the player name lists below"); enabledPlayerNames = ((BaseUnityPlugin)this).Config.Bind<string>("1. Activation", "Enabled Player Names", "", "Comma-separated list of player names to ENABLE Last Resort for (only used if EnableForAllPlayers is false). Example: PlayerOne,FriendName,NoobPlayer"); disabledPlayerNames = ((BaseUnityPlugin)this).Config.Bind<string>("1. Activation", "Disabled Player Names", "", "Comma-separated list of player names to DISABLE Last Resort for (takes priority over enabled list). Example: ProPlayer,Veteran"); directorCreditsBase = ((BaseUnityPlugin)this).Config.Bind<int>("2. Director Credits", "Minimum Base Pay", 10, "The Director always receives this amount per Last Resort activation"); directorCreditsMultiplier = ((BaseUnityPlugin)this).Config.Bind<int>("2. Director Credits", "Multiple Activation Kickback", 20, "Added to base pay and increases with each activation (e.g., 100 means +100 on 1st use, +200 on 2nd, +300 on 3rd)"); enemy1Preset = ((BaseUnityPlugin)this).Config.Bind<EnemyPreset>("3. Enemy Slot 1", "Enemy1 Preset", EnemyPreset.Beetle, "Select enemy preset or use Custom to manually set MasterName"); enemy1Master = ((BaseUnityPlugin)this).Config.Bind<string>("3. Enemy Slot 1", "Custom MasterName?", "", "Master prefab name (only used if Preset is 'Custom' and otherwise ignored)"); enemy1EliteType = ((BaseUnityPlugin)this).Config.Bind<EliteType>("3. Enemy Slot 1", "Elite Type", EliteType.Earth, "Elite type for this enemy"); enemy1BaseCount = ((BaseUnityPlugin)this).Config.Bind<int>("3. Enemy Slot 1", "Base Count", 2, "Base number to spawn"); enemy1ScaleWithUses = ((BaseUnityPlugin)this).Config.Bind<bool>("3. Enemy Slot 1", "Bring more friends to the party?", true, "Check to spawn more of this enemy with each Last Resort activation"); enemy1ScalingMultiplier = ((BaseUnityPlugin)this).Config.Bind<int>("3. Enemy Slot 1", "Party Crasher Escalation Rate", 2, "[(useCount - 1) * this number] + basecount = total enemies added per activation. Ensure the box above is checked and you have at least 1 intial enemy."); enemy2Preset = ((BaseUnityPlugin)this).Config.Bind<EnemyPreset>("4. Enemy Slot 2", "Enemy2 Preset", EnemyPreset.VoidInfestor, "Select enemy preset or use Custom to manually set MasterName"); enemy2Master = ((BaseUnityPlugin)this).Config.Bind<string>("4. Enemy Slot 2", "Custom MasterName?", "V", "Master prefab name (only used if Preset is 'Custom') and otherwise ignored"); enemy2EliteType = ((BaseUnityPlugin)this).Config.Bind<EliteType>("4. Enemy Slot 2", "Elite Type", EliteType.Blazing, "Elite type for this enemy"); enemy2BaseCount = ((BaseUnityPlugin)this).Config.Bind<int>("4. Enemy Slot 2", "Base Count", 3, "Base number to spawn"); enemy2ScaleWithUses = ((BaseUnityPlugin)this).Config.Bind<bool>("4. Enemy Slot 2", "Bring more friends to the party?", true, "Spawn more of this enemy with each Last Resort activation"); enemy2ScalingMultiplier = ((BaseUnityPlugin)this).Config.Bind<int>("4. Enemy Slot 2", "Party Crasher Escalation Rate", 2, "[(useCount - 1) * this number] + basecount = total enemies added per activation. Ensure the box above is checked and you have at least 1 intial enemy."); enemy3Preset = ((BaseUnityPlugin)this).Config.Bind<EnemyPreset>("5. Enemy Slot 3", "Enemy3 Preset", EnemyPreset.GreaterWisp, "Select enemy preset or use Custom to manually set MasterName"); enemy3Master = ((BaseUnityPlugin)this).Config.Bind<string>("5. Enemy Slot 3", "Custgm MasterName>", "", "Master prefab name (only used if Preset is 'Custom') and otherwise ignored "); enemy3EliteType = ((BaseUnityPlugin)this).Config.Bind<EliteType>("5. Enemy Slot 3", "Elite Type", EliteType.Earth, "Elite type for this enemy"); enemy3BaseCount = ((BaseUnityPlugin)this).Config.Bind<int>("5. Enemy Slot 3", "Base Count", 1, "Base number to spawn"); enemy3ScaleWithUses = ((BaseUnityPlugin)this).Config.Bind<bool>("5. Enemy Slot 3", "Bring more friends to the party?", false, "Toggle to spawn more of this enemy with each Last Resort activation"); enemy3ScalingMultiplier = ((BaseUnityPlugin)this).Config.Bind<int>("5. Enemy Slot 3", "Party Crasher Escalation Rate", 0, "[(useCount - 1) * this number] + basecount = total enemies added per activation. Ensure the box above is checked ."); chatNotifications = ((BaseUnityPlugin)this).Config.Bind<bool>("6. Chat & Logs", "Chat Notifications", true, "Enable chat notifications when Last Resort triggers"); chatShowCredits = ((BaseUnityPlugin)this).Config.Bind<bool>("6. Chat & Logs", "Show Credits Added", true, "Show director credits added in chat notifications"); chatShowTotalEnemies = ((BaseUnityPlugin)this).Config.Bind<bool>("6. Chat & Logs", "Show Total Enemies", true, "Show total number of enemies spawned in chat notifications"); chatShowEnemyDetails = ((BaseUnityPlugin)this).Config.Bind<bool>("6. Chat & Logs", "Show Enemy Details", false, "Show detailed breakdown of each enemy type spawned in chat notifications"); logVerbosity = ((BaseUnityPlugin)this).Config.Bind<LogVerbosity>("6. Chat & Logs", "Logging Verbosity", LogVerbosity.Minimal, "Set logging detail level (Minimal or Verbose)"); SetupRiskOfOptions(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Config loaded!"); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Last Resort] Enemy 1 Elite: {enemy1EliteType.Value}"); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Last Resort] Enemy 2 Elite: {enemy2EliteType.Value}"); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Last Resort] Enemy 3 Elite: {enemy3EliteType.Value}"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Setting up hooks..."); HealthComponent.TakeDamage += new hook_TakeDamage(OnTakeDamage); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Last Resort v2.3.0 loaded successfully!"); } private void SetupRiskOfOptions() { //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_0060: 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_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Expected O, but got Unknown //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Expected O, but got Unknown //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: 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_00bf: 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) //IL_00db: Expected O, but got Unknown //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Expected O, but got Unknown //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0102: 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_011e: Expected O, but got Unknown //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected O, but got Unknown //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Expected O, but got Unknown //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Expected O, but got Unknown //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Expected O, but got Unknown //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Expected O, but got Unknown //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Expected O, but got Unknown //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Expected O, but got Unknown //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Expected O, but got Unknown //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Expected O, but got Unknown //IL_01f4: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Expected O, but got Unknown //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Expected O, but got Unknown //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_0221: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_0238: Expected O, but got Unknown //IL_0233: Unknown result type (might be due to invalid IL or missing references) //IL_023d: Expected O, but got Unknown //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Expected O, but got Unknown //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Expected O, but got Unknown //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_0270: Expected O, but got Unknown //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_027c: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Expected O, but got Unknown //IL_028b: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Expected O, but got Unknown //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Expected O, but got Unknown //IL_02ad: Unknown result type (might be due to invalid IL or missing references) //IL_02b2: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Unknown result type (might be due to invalid IL or missing references) //IL_02c6: Expected O, but got Unknown //IL_02c1: Unknown result type (might be due to invalid IL or missing references) //IL_02cb: Expected O, but got Unknown //IL_02d2: Unknown result type (might be due to invalid IL or missing references) //IL_02dc: Expected O, but got Unknown //IL_02e3: Unknown result type (might be due to invalid IL or missing references) //IL_02ed: Expected O, but got Unknown //IL_02f4: Unknown result type (might be due to invalid IL or missing references) //IL_02fe: Expected O, but got Unknown //IL_0305: Unknown result type (might be due to invalid IL or missing references) //IL_030a: Unknown result type (might be due to invalid IL or missing references) //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_031e: Expected O, but got Unknown //IL_0319: Unknown result type (might be due to invalid IL or missing references) //IL_0323: Expected O, but got Unknown //IL_032a: Unknown result type (might be due to invalid IL or missing references) //IL_0334: Expected O, but got Unknown //IL_033b: Unknown result type (might be due to invalid IL or missing references) //IL_0340: Unknown result type (might be due to invalid IL or missing references) //IL_0347: Unknown result type (might be due to invalid IL or missing references) //IL_0354: Expected O, but got Unknown //IL_034f: Unknown result type (might be due to invalid IL or missing references) //IL_0359: Expected O, but got Unknown //IL_0360: Unknown result type (might be due to invalid IL or missing references) //IL_036a: Expected O, but got Unknown //IL_0371: Unknown result type (might be due to invalid IL or missing references) //IL_037b: Expected O, but got Unknown //IL_0382: Unknown result type (might be due to invalid IL or missing references) //IL_038c: Expected O, but got Unknown //IL_0393: Unknown result type (might be due to invalid IL or missing references) //IL_0398: Unknown result type (might be due to invalid IL or missing references) //IL_039f: Unknown result type (might be due to invalid IL or missing references) //IL_03ac: Expected O, but got Unknown //IL_03a7: Unknown result type (might be due to invalid IL or missing references) //IL_03b1: Expected O, but got Unknown //IL_03b8: Unknown result type (might be due to invalid IL or missing references) //IL_03c2: Expected O, but got Unknown //IL_03c9: Unknown result type (might be due to invalid IL or missing references) //IL_03ce: Unknown result type (might be due to invalid IL or missing references) //IL_03d5: Unknown result type (might be due to invalid IL or missing references) //IL_03e2: Expected O, but got Unknown //IL_03dd: Unknown result type (might be due to invalid IL or missing references) //IL_03e7: Expected O, but got Unknown //IL_03ee: Unknown result type (might be due to invalid IL or missing references) //IL_03f8: Expected O, but got Unknown //IL_03ff: Unknown result type (might be due to invalid IL or missing references) //IL_0409: Expected O, but got Unknown //IL_0410: Unknown result type (might be due to invalid IL or missing references) //IL_041a: Expected O, but got Unknown //IL_0421: Unknown result type (might be due to invalid IL or missing references) //IL_042b: Expected O, but got Unknown //IL_0432: Unknown result type (might be due to invalid IL or missing references) //IL_043c: Expected O, but got Unknown if (!Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions")) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Risk of Options not found, skipping GUI setup"); return; } ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Setting up Risk of Options integration..."); ModSettingsManager.SetModDescription("Cheat death and/or face escalating consequences"); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(healthThresholdPercent, new StepSliderConfig { min = 1f, max = 99f, increment = 1f, FormatString = "{0:0}%" })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(enableHealing)); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(healToPercent, new StepSliderConfig { min = 1f, max = 100f, increment = 1f, FormatString = "{0:0}%" })); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(cooldownSeconds, new StepSliderConfig { min = 0f, max = 60f, increment = 1f, FormatString = "{0:0}s" })); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(invulnerabilitySeconds, new StepSliderConfig { min = 0f, max = 10f, increment = 0.5f, FormatString = "{0:0.0}s" })); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(itemLossPercent, new StepSliderConfig { min = 0f, max = 100f, increment = 1f, FormatString = "{0:0}%" })); ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)itemTierPriority)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(enableForAllPlayers)); ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(enabledPlayerNames)); ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(disabledPlayerNames)); ModSettingsManager.AddOption((BaseOption)new IntSliderOption(directorCreditsBase, new IntSliderConfig { min = 0, max = 1000 })); ModSettingsManager.AddOption((BaseOption)new IntSliderOption(directorCreditsMultiplier, new IntSliderConfig { min = 0, max = 500 })); ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)enemy1Preset)); ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(enemy1Master)); ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)enemy1EliteType)); ModSettingsManager.AddOption((BaseOption)new IntSliderOption(enemy1BaseCount, new IntSliderConfig { min = 0, max = 10 })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(enemy1ScaleWithUses)); ModSettingsManager.AddOption((BaseOption)new IntSliderOption(enemy1ScalingMultiplier, new IntSliderConfig { min = 0, max = 10 })); ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)enemy2Preset)); ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(enemy2Master)); ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)enemy2EliteType)); ModSettingsManager.AddOption((BaseOption)new IntSliderOption(enemy2BaseCount, new IntSliderConfig { min = 0, max = 10 })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(enemy2ScaleWithUses)); ModSettingsManager.AddOption((BaseOption)new IntSliderOption(enemy2ScalingMultiplier, new IntSliderConfig { min = 0, max = 10 })); ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)enemy3Preset)); ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(enemy3Master)); ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)enemy3EliteType)); ModSettingsManager.AddOption((BaseOption)new IntSliderOption(enemy3BaseCount, new IntSliderConfig { min = 0, max = 10 })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(enemy3ScaleWithUses)); ModSettingsManager.AddOption((BaseOption)new IntSliderOption(enemy3ScalingMultiplier, new IntSliderConfig { min = 0, max = 10 })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(chatNotifications)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(chatShowCredits)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(chatShowTotalEnemies)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(chatShowEnemyDetails)); ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)logVerbosity)); AddTemplateButtons(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Risk of Options setup complete!"); } private void AddTemplateButtons() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Expected O, but got Unknown //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Expected O, but got Unknown //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Expected O, but got Unknown //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Expected O, but got Unknown //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Expected O, but got Unknown //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Expected O, but got Unknown //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Expected O, but got Unknown //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Expected O, but got Unknown //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Expected O, but got Unknown //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Expected O, but got Unknown //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Expected O, but got Unknown //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Expected O, but got Unknown //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Expected O, but got Unknown //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Expected O, but got Unknown //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Expected O, but got Unknown //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Expected O, but got Unknown //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Expected O, but got Unknown //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_022f: Expected O, but got Unknown //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Expected O, but got Unknown //IL_0250: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Training Wheels", "7. Templates", "Casual mode - no consequences, just safety net", "Apply Training Wheels", (UnityAction)delegate { ApplyTemplate_TrainingWheels(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Devil's Bargain", "7. Templates", "Default config - moderate consequences with scaling", "Apply Devil's Bargain", (UnityAction)delegate { ApplyTemplate_DevilsBargain(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Harsh Consequences", "7. Templates", "Hard mode - heavy item loss, tough enemies, aggressive scaling", "Apply Harsh consequences", (UnityAction)delegate { ApplyTemplate_Harshconsequences(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Boss Rush", "7. Templates", "All three slots spawn boss enemies with scaling", "Apply Boss Rush", (UnityAction)delegate { ApplyTemplate_BossRush(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Void the Noid", "7. Templates", "All void enemies, void item priority, aggressive scaling", "Apply Void Infection", (UnityAction)delegate { ApplyTemplate_VoidtheNoid(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Oops! All False Sons", "7. Templates", "Three elite False Sons. Very stupid very quickly.", "Apply Oops! All False Sons", (UnityAction)delegate { ApplyTemplate_OopsAllFalseSons(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Close Call", "7. Templates", "Casual - Another chance when they get you under 5% but don't finisn the job", "Apply Close Call", (UnityAction)delegate { ApplyTemplate_GenerousSecondChance(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Mistake Avalanche", "7. Templates", "Punishing early trigger with heavy item loss and brutal enemies", "Apply Mistake Avalanche", (UnityAction)delegate { ApplyTemplate_MistakeAvalanche(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Safety?", "7. Templates", "Still easy to die if you're reckless - heavy penalties", "Apply Safety Not Guaranteed", (UnityAction)delegate { ApplyTemplate_SafetyNotGuaranteed(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Drizz", "7. Templates", "Triggers at 99% health, drops you to 25% health, lose 90% items, massive director boost, 3 Wise Lemurians visit you each time.", "Apply Drizzle Demands Perfection", (UnityAction)delegate { ApplyTemplate_DrizzleDemandsPerfection(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Void Infection", "7. Templates", "3 flavors of Infestors with scaling that can get ugly fast", "Apply Void Infection", (UnityAction)delegate { ApplyTemplate_VoidInfection(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Falling Sky", "7. Templates", "Each trigger brings scaling overloaded lesser wisps, a glacial jellyfish, and scaling haunted brass contraptions that hide the last two.", "Apply Falling Sky", (UnityAction)delegate { ApplyTemplate_FallingSkyFalling(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("...", "7. Templates", "32 elite beetles swarm you with extreme scaling", "Apply Someone Saw a Cockroach up on Twelve", (UnityAction)delegate { ApplyTemplate_CockroachOnTwelve(); })); ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Wellp", "7. Templates", "30 elite False Sons. Enjoy a slidesow until ror2.exe has stopped responding..", "Just Crash My Computer, Thanks", (UnityAction)delegate { ApplyTemplate_CrashMyComputer(); })); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Template buttons registered"); } private void ApplyTemplate_TrainingWheels() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Training Wheels template"); healthThresholdPercent.Value = 50f; enableHealing.Value = true; healToPercent.Value = 100f; itemLossPercent.Value = 0f; cooldownSeconds.Value = 5f; invulnerabilitySeconds.Value = 5f; enemy1BaseCount.Value = 0; enemy2BaseCount.Value = 0; enemy3BaseCount.Value = 0; directorCreditsBase.Value = 0; directorCreditsMultiplier.Value = 0; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Training Wheels template applied! Settings will take effect on next activation."); } private void ApplyTemplate_DevilsBargain() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Devil's Bargain template"); healthThresholdPercent.Value = 25f; enableHealing.Value = true; healToPercent.Value = 100f; itemLossPercent.Value = 5f; itemTierPriority.Value = ItemTierPriority.FavorGreen; cooldownSeconds.Value = 10f; invulnerabilitySeconds.Value = 3f; enemy1Preset.Value = EnemyPreset.Beetle; enemy1EliteType.Value = EliteType.Earth; enemy1BaseCount.Value = 1; enemy1ScaleWithUses.Value = true; enemy1ScalingMultiplier.Value = 2; enemy2Preset.Value = EnemyPreset.VoidInfestor; enemy2EliteType.Value = EliteType.Glacial; enemy2BaseCount.Value = 1; enemy2ScaleWithUses.Value = true; enemy2ScalingMultiplier.Value = 2; enemy3Preset.Value = EnemyPreset.GreaterWisp; enemy3EliteType.Value = EliteType.Blazing; enemy3BaseCount.Value = 1; enemy3ScaleWithUses.Value = false; enemy3ScalingMultiplier.Value = 2; directorCreditsBase.Value = 100; directorCreditsMultiplier.Value = 100; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Devil's Bargain template applied! Settings will take effect on next activation."); } private void ApplyTemplate_Harshconsequences() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Harsh consequences template"); healthThresholdPercent.Value = 10f; enableHealing.Value = true; healToPercent.Value = 60f; itemLossPercent.Value = 30f; itemTierPriority.Value = ItemTierPriority.FavorRed; cooldownSeconds.Value = 20f; invulnerabilitySeconds.Value = 2f; enemy1Preset.Value = EnemyPreset.BeetleGuard; enemy1EliteType.Value = EliteType.Glacial; enemy1BaseCount.Value = 1; enemy1ScaleWithUses.Value = true; enemy1ScalingMultiplier.Value = 2; enemy2Preset.Value = EnemyPreset.Gup; enemy2EliteType.Value = EliteType.Celestine; enemy2BaseCount.Value = 2; enemy2ScaleWithUses.Value = true; enemy2ScalingMultiplier.Value = 3; enemy3Preset.Value = EnemyPreset.ClayDunestrider; enemy3EliteType.Value = EliteType.None; enemy3BaseCount.Value = 1; enemy3ScaleWithUses.Value = false; enemy3ScalingMultiplier.Value = 0; directorCreditsBase.Value = 100; directorCreditsMultiplier.Value = 80; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Harsh consequences template applied! Settings will take effect on next activation."); } private void ApplyTemplate_BossRush() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Boss Rush template"); healthThresholdPercent.Value = 25f; enableHealing.Value = true; healToPercent.Value = 100f; itemLossPercent.Value = 15f; itemTierPriority.Value = ItemTierPriority.FavorGreen; enemy1Preset.Value = EnemyPreset.StoneTitan; enemy1EliteType.Value = EliteType.Blazing; enemy1BaseCount.Value = 1; enemy1ScaleWithUses.Value = true; enemy1ScalingMultiplier.Value = 2; enemy2Preset.Value = EnemyPreset.BeetleQueen; enemy2EliteType.Value = EliteType.Malachite; enemy2BaseCount.Value = 1; enemy2ScaleWithUses.Value = true; enemy2ScalingMultiplier.Value = 2; enemy3Preset.Value = EnemyPreset.ImpOverlord; enemy3EliteType.Value = EliteType.Overloading; enemy3BaseCount.Value = 1; enemy3ScaleWithUses.Value = true; enemy3ScalingMultiplier.Value = 3; directorCreditsBase.Value = 20; directorCreditsMultiplier.Value = 10; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Boss Rush template applied! Settings will take effect on next activation."); } private void ApplyTemplate_VoidInfection() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Void Infection template"); healthThresholdPercent.Value = 25f; enableHealing.Value = true; healToPercent.Value = 75f; itemLossPercent.Value = 20f; itemTierPriority.Value = ItemTierPriority.FavorVoid; enemy1Preset.Value = EnemyPreset.VoidInfestor; enemy1EliteType.Value = EliteType.Glacial; enemy1BaseCount.Value = 1; enemy1ScaleWithUses.Value = true; enemy1ScalingMultiplier.Value = 3; enemy2Preset.Value = EnemyPreset.VoidInfestor; enemy2EliteType.Value = EliteType.Earth; enemy2BaseCount.Value = 1; enemy2ScaleWithUses.Value = true; enemy2ScalingMultiplier.Value = 3; enemy3Preset.Value = EnemyPreset.VoidInfestor; enemy3EliteType.Value = EliteType.Celestine; enemy3BaseCount.Value = 1; enemy3ScaleWithUses.Value = true; enemy3ScalingMultiplier.Value = 3; directorCreditsBase.Value = 15; directorCreditsMultiplier.Value = 10; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Void Infection template applied! Settings will take effect on next activation."); } private void ApplyTemplate_OopsAllFalseSons() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Oops! All False Sons template"); healthThresholdPercent.Value = 15f; enableHealing.Value = true; healToPercent.Value = 100f; itemLossPercent.Value = 30f; itemTierPriority.Value = ItemTierPriority.FavorRed; cooldownSeconds.Value = 15f; invulnerabilitySeconds.Value = 5f; enemy1Preset.Value = EnemyPreset.FalseSon; enemy1EliteType.Value = EliteType.Blazing; enemy1BaseCount.Value = 1; enemy1ScaleWithUses.Value = true; enemy1ScalingMultiplier.Value = 2; enemy2Preset.Value = EnemyPreset.FalseSon; enemy2EliteType.Value = EliteType.Malachite; enemy2BaseCount.Value = 1; enemy2ScaleWithUses.Value = true; enemy2ScalingMultiplier.Value = 0; enemy3Preset.Value = EnemyPreset.FalseSon; enemy3EliteType.Value = EliteType.Overloading; enemy3BaseCount.Value = 1; enemy3ScaleWithUses.Value = true; enemy3ScalingMultiplier.Value = 2; directorCreditsBase.Value = 0; directorCreditsMultiplier.Value = 0; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Oops! All False Sons template applied! Settings will take effect on next activation."); } private void ApplyTemplate_GenerousSecondChance() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Close Call template"); healthThresholdPercent.Value = 5f; enableHealing.Value = true; healToPercent.Value = 88f; itemLossPercent.Value = 20f; itemTierPriority.Value = ItemTierPriority.FavorGreen; cooldownSeconds.Value = 20f; invulnerabilitySeconds.Value = 10f; enemy1Preset.Value = EnemyPreset.Lemurian; enemy1EliteType.Value = EliteType.None; enemy1BaseCount.Value = 10; enemy1ScaleWithUses.Value = true; enemy1ScalingMultiplier.Value = 1; enemy2Preset.Value = EnemyPreset.Lemurian; enemy2EliteType.Value = EliteType.None; enemy2BaseCount.Value = 0; enemy2ScaleWithUses.Value = false; enemy2ScalingMultiplier.Value = 0; enemy3Preset.Value = EnemyPreset.Lemurian; enemy3EliteType.Value = EliteType.None; enemy3BaseCount.Value = 0; enemy3ScaleWithUses.Value = false; enemy3ScalingMultiplier.Value = 0; directorCreditsBase.Value = 10; directorCreditsMultiplier.Value = 10; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Close Call template applied! Settings will take effect on next activation."); } private void ApplyTemplate_MistakeAvalanche() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Mistake Avalanche template"); healthThresholdPercent.Value = 50f; enableHealing.Value = true; healToPercent.Value = 50f; itemLossPercent.Value = 50f; itemTierPriority.Value = ItemTierPriority.FavorRed; cooldownSeconds.Value = 3f; invulnerabilitySeconds.Value = 4f; enemy1Preset.Value = EnemyPreset.Direseeker; enemy1EliteType.Value = EliteType.Blazing; enemy1BaseCount.Value = 3; enemy1ScaleWithUses.Value = true; enemy1ScalingMultiplier.Value = 2; enemy2Preset.Value = EnemyPreset.StoneTitan; enemy2EliteType.Value = EliteType.Malachite; enemy2BaseCount.Value = 1; enemy2ScaleWithUses.Value = false; enemy2ScalingMultiplier.Value = 0; enemy3Preset.Value = EnemyPreset.BeetleQueen; enemy3EliteType.Value = EliteType.Overloading; enemy3BaseCount.Value = 1; enemy3ScaleWithUses.Value = false; enemy3ScalingMultiplier.Value = 0; directorCreditsBase.Value = 1; directorCreditsMultiplier.Value = 1; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Mistake Avalanche template applied! Settings will take effect on next activation."); } private void ApplyTemplate_SafetyNotGuaranteed() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Safety Not Guaranteed template"); healthThresholdPercent.Value = 10f; enableHealing.Value = true; healToPercent.Value = 50f; itemLossPercent.Value = 25f; itemTierPriority.Value = ItemTierPriority.FavorRed; cooldownSeconds.Value = 10f; invulnerabilitySeconds.Value = 3f; enemy1Preset.Value = EnemyPreset.BeetleGuard; enemy1EliteType.Value = EliteType.Malachite; enemy1BaseCount.Value = 1; enemy1ScaleWithUses.Value = false; enemy1ScalingMultiplier.Value = 0; enemy2Preset.Value = EnemyPreset.VoidJailer; enemy2EliteType.Value = EliteType.None; enemy2BaseCount.Value = 1; enemy2ScaleWithUses.Value = true; enemy2ScalingMultiplier.Value = 1; enemy3Preset.Value = EnemyPreset.ClayDunestrider; enemy3EliteType.Value = EliteType.None; enemy3BaseCount.Value = 1; enemy3ScaleWithUses.Value = false; enemy3ScalingMultiplier.Value = 0; directorCreditsBase.Value = 30; directorCreditsMultiplier.Value = 20; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Safety Not Guaranteed template applied! Settings will take effect on next activation."); } private void ApplyTemplate_DrizzleDemandsPerfection() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Drizzle Demands Perfection template"); healthThresholdPercent.Value = 99f; enableHealing.Value = true; healToPercent.Value = 25f; itemLossPercent.Value = 90f; itemTierPriority.Value = ItemTierPriority.FavorRed; cooldownSeconds.Value = 30f; invulnerabilitySeconds.Value = 1f; enemy1Preset.Value = EnemyPreset.Lemurian; enemy1EliteType.Value = EliteType.Celestine; enemy1BaseCount.Value = 1; enemy1ScaleWithUses.Value = false; enemy1ScalingMultiplier.Value = 0; enemy2Preset.Value = EnemyPreset.Lemurian; enemy2EliteType.Value = EliteType.Malachite; enemy2BaseCount.Value = 1; enemy2ScaleWithUses.Value = false; enemy2ScalingMultiplier.Value = 0; enemy3Preset.Value = EnemyPreset.Lemurian; enemy3EliteType.Value = EliteType.Haunted; enemy3BaseCount.Value = 1; enemy3ScaleWithUses.Value = false; enemy3ScalingMultiplier.Value = 0; directorCreditsBase.Value = 100; directorCreditsMultiplier.Value = 50; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Drizzle Demands Perfection template applied! Settings will take effect on next activation."); } private void ApplyTemplate_VoidtheNoid() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Void the Noid template"); healthThresholdPercent.Value = 25f; enableHealing.Value = true; healToPercent.Value = 75f; itemLossPercent.Value = 20f; itemTierPriority.Value = ItemTierPriority.FavorVoid; cooldownSeconds.Value = 10f; invulnerabilitySeconds.Value = 5f; enemy1Preset.Value = EnemyPreset.VoidReaver; enemy1EliteType.Value = EliteType.Void; enemy1BaseCount.Value = 1; enemy1ScaleWithUses.Value = true; enemy1ScalingMultiplier.Value = 1; enemy2Preset.Value = EnemyPreset.VoidJailer; enemy2EliteType.Value = EliteType.Void; enemy2BaseCount.Value = 1; enemy2ScaleWithUses.Value = true; enemy2ScalingMultiplier.Value = 1; enemy3Preset.Value = EnemyPreset.VoidDevastator; enemy3EliteType.Value = EliteType.Void; enemy3BaseCount.Value = 1; enemy3ScaleWithUses.Value = false; enemy3ScalingMultiplier.Value = 0; directorCreditsBase.Value = 5; directorCreditsMultiplier.Value = 5; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Void Infection template applied! Settings will take effect on next activation."); } private void ApplyTemplate_FallingSkyFalling() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Falling Sky Falling template"); healthThresholdPercent.Value = 25f; enableHealing.Value = true; healToPercent.Value = 100f; itemLossPercent.Value = 10f; itemTierPriority.Value = ItemTierPriority.FavorGreen; cooldownSeconds.Value = 10f; invulnerabilitySeconds.Value = 3f; enemy1Preset.Value = EnemyPreset.LesserWisp; enemy1EliteType.Value = EliteType.Overloading; enemy1BaseCount.Value = 1; enemy1ScaleWithUses.Value = true; enemy1ScalingMultiplier.Value = 10; enemy2Preset.Value = EnemyPreset.Jellyfish; enemy2EliteType.Value = EliteType.Glacial; enemy2BaseCount.Value = 1; enemy2ScaleWithUses.Value = false; enemy2ScalingMultiplier.Value = 0; enemy3Preset.Value = EnemyPreset.BrassContraption; enemy3EliteType.Value = EliteType.Haunted; enemy3BaseCount.Value = 2; enemy3ScaleWithUses.Value = true; enemy3ScalingMultiplier.Value = 2; directorCreditsBase.Value = 10; directorCreditsMultiplier.Value = 50; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Falling Sky Falling template applied! Settings will take effect on next activation."); } private void ApplyTemplate_CockroachOnTwelve() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Someone Saw a Cockroach up on Twelve template"); healthThresholdPercent.Value = 40f; enableHealing.Value = true; healToPercent.Value = 100f; itemLossPercent.Value = 15f; itemTierPriority.Value = ItemTierPriority.FavorGreen; cooldownSeconds.Value = 10f; invulnerabilitySeconds.Value = 3f; enemy1Preset.Value = EnemyPreset.Beetle; enemy1EliteType.Value = EliteType.None; enemy1BaseCount.Value = 5; enemy1ScaleWithUses.Value = true; enemy1ScalingMultiplier.Value = 20; enemy2Preset.Value = EnemyPreset.Beetle; enemy2EliteType.Value = EliteType.Celestine; enemy2BaseCount.Value = 2; enemy2ScaleWithUses.Value = false; enemy2ScalingMultiplier.Value = 0; enemy3Preset.Value = EnemyPreset.Beetle; enemy3EliteType.Value = EliteType.Malachite; enemy3BaseCount.Value = 1; enemy3ScaleWithUses.Value = true; enemy3ScalingMultiplier.Value = 1; directorCreditsBase.Value = 0; directorCreditsMultiplier.Value = 0; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Someone Saw a Cockroach up on Twelve template applied! Settings will take effect on next activation."); } private void ApplyTemplate_CrashMyComputer() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Applying Just Crash My Computer, Thanks template"); healthThresholdPercent.Value = 25f; enableHealing.Value = true; healToPercent.Value = 100f; itemLossPercent.Value = 50f; itemTierPriority.Value = ItemTierPriority.FavorRed; cooldownSeconds.Value = 20f; invulnerabilitySeconds.Value = 5f; enemy1Preset.Value = EnemyPreset.FalseSon; enemy1EliteType.Value = EliteType.Overloading; enemy1BaseCount.Value = 10; enemy1ScaleWithUses.Value = true; enemy1ScalingMultiplier.Value = 5; enemy2Preset.Value = EnemyPreset.FalseSon; enemy2EliteType.Value = EliteType.Celestine; enemy2BaseCount.Value = 10; enemy2ScaleWithUses.Value = true; enemy2ScalingMultiplier.Value = 5; enemy3Preset.Value = EnemyPreset.FalseSon; enemy3EliteType.Value = EliteType.Malachite; enemy3BaseCount.Value = 10; enemy3ScaleWithUses.Value = true; enemy3ScalingMultiplier.Value = 5; directorCreditsBase.Value = 0; directorCreditsMultiplier.Value = 0; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] Just Crash My Computer, Thanks template applied! Your PC will never forgive you."); } private string GetEliteName(int index) { if (1 == 0) { } string result = index switch { 66 => "Normal", 0 => "Blazing", 1 => "Overloading", 2 => "Glacial", 3 => "Malachite", 4 => "Celestine", 5 => "Void", 6 => "Echo", 7 => "Haunted", 8 => "Mending", 9 => "Aurelionite", 10 => "Twisted", 11 => "Collective", _ => "Unknown", }; if (1 == 0) { } return result; } private string GetMasterNameFromPreset(EnemyPreset preset, string fallbackMaster) { if (1 == 0) { } string result = preset switch { EnemyPreset.None => "", EnemyPreset.Beetle => "BeetleMaster", EnemyPreset.Lemurian => "LemurianMaster", EnemyPreset.Imp => "ImpMaster", EnemyPreset.HermitCrab => "HermitCrabMaster", EnemyPreset.BeetleGuard => "BeetleGuardMaster", EnemyPreset.ElderLemurian => "LemurianBruiserMaster", EnemyPreset.StoneGolem => "GolemMaster", EnemyPreset.BighornBison => "BisonMaster", EnemyPreset.ClayTemplar => "ClayBruiserMaster", EnemyPreset.MiniMushrum => "MiniMushroomMaster", EnemyPreset.Parent => "ParentMaster", EnemyPreset.Gup => "GupMaster", EnemyPreset.Geep => "GeepMaster", EnemyPreset.Gip => "GipMaster", EnemyPreset.LesserWisp => "WispMaster", EnemyPreset.GreaterWisp => "GreaterWispMaster", EnemyPreset.Jellyfish => "JellyfishMaster", EnemyPreset.BrassContraption => "BellMaster", EnemyPreset.ClayDunestrider => "ClayBossMaster", EnemyPreset.BeetleQueen => "BeetleQueen2Master", EnemyPreset.ImpOverlord => "ImpBossMaster", EnemyPreset.StoneTitan => "TitanMaster", EnemyPreset.Vagrant => "VagrantMaster", EnemyPreset.MagmaWorm => "MagmaWormMaster", EnemyPreset.OverloadingWorm => "ElectricWormMaster", EnemyPreset.SolusControlUnit => "RoboBallBossMaster", EnemyPreset.LunarGolem => "LunarGolemMaster", EnemyPreset.LunarWisp => "LunarWispMaster", EnemyPreset.LunarExploder => "LunarExploderMaster", EnemyPreset.VoidReaver => "NullifierMaster", EnemyPreset.VoidJailer => "VoidJailerMaster", EnemyPreset.VoidDevastator => "VoidMegaCrabMaster", EnemyPreset.VoidBarnacle => "VoidBarnacleNoCastMaster", EnemyPreset.VoidInfestor => "VoidInfestorMaster", EnemyPreset.Direseeker => "DireSeekerBossMaster", EnemyPreset.FalseSon => "FalseSonBossMaster", EnemyPreset.Custom => fallbackMaster, _ => fallbackMaster, }; if (1 == 0) { } return result; } private void OnTakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo) { orig.Invoke(self, damageInfo); if (Object.op_Implicit((Object)(object)self.body) && self.body.isPlayerControlled && self.alive) { float num = self.health / self.fullHealth * 100f; if (num <= healthThresholdPercent.Value) { TryActivateLastResort(self.body, self); } } } private void TryActivateLastResort(CharacterBody body, HealthComponent health) { //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_06d8: Unknown result type (might be due to invalid IL or missing references) //IL_06dd: Unknown result type (might be due to invalid IL or missing references) //IL_06ea: Expected O, but got Unknown if (!IsPlayerAllowed(body) || (Object.op_Implicit((Object)(object)body.inventory) && body.inventory.GetItemCountPermanent(Items.ShieldOnly) > 0)) { return; } if (playerCooldowns.ContainsKey(body)) { float num = Time.time - playerCooldowns[body]; if (num < cooldownSeconds.Value) { float num2 = cooldownSeconds.Value - num; if (chatNotifications.Value) { Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = $"<color=#ffaa00>⏳ {body.GetUserName()} needs {num2:F0}s cooldown...</color>" }); } return; } } if (!playerTriggerCount.ContainsKey(body)) { playerTriggerCount[body] = 0; } playerTriggerCount[body]++; int num3 = playerTriggerCount[body]; if (logVerbosity.Value == LogVerbosity.Verbose) { ((BaseUnityPlugin)this).Logger.LogWarning((object)$"[Last Resort] ✅ ACTIVATING for {body.GetUserName()} (Use #{num3})!"); } if (invulnerabilitySeconds.Value > 0f) { body.AddTimedBuff(Buffs.Immune, invulnerabilitySeconds.Value); } if (enableHealing.Value) { float num4 = health.fullHealth * (healToPercent.Value / 100f); float num5 = num4 - health.health; if (num5 > 0f) { health.Heal(num5, default(ProcChainMask), true); } } string text = "lost nothing"; if (Object.op_Implicit((Object)(object)body.inventory) && itemLossPercent.Value > 0f) { text = RemoveRandomItems(body.inventory); } int num6 = 0; List<string> list = new List<string>(); string masterNameFromPreset = GetMasterNameFromPreset(enemy1Preset.Value, enemy1Master.Value); string masterNameFromPreset2 = GetMasterNameFromPreset(enemy2Preset.Value, enemy2Master.Value); string masterNameFromPreset3 = GetMasterNameFromPreset(enemy3Preset.Value, enemy3Master.Value); int num7 = SpawnEnemySlot(body, masterNameFromPreset, (int)enemy1EliteType.Value, enemy1BaseCount.Value, enemy1ScaleWithUses.Value, enemy1ScalingMultiplier.Value, num3); num6 += num7; if (num7 > 0 && chatShowEnemyDetails.Value) { string arg = ((enemy1EliteType.Value != EliteType.None) ? (GetEliteName((int)enemy1EliteType.Value) + " ") : ""); list.Add($"{num7} {arg}{enemy1Preset.Value}"); } int num8 = SpawnEnemySlot(body, masterNameFromPreset2, (int)enemy2EliteType.Value, enemy2BaseCount.Value, enemy2ScaleWithUses.Value, enemy2ScalingMultiplier.Value, num3); num6 += num8; if (num8 > 0 && chatShowEnemyDetails.Value) { string arg2 = ((enemy2EliteType.Value != EliteType.None) ? (GetEliteName((int)enemy2EliteType.Value) + " ") : ""); list.Add($"{num8} {arg2}{enemy2Preset.Value}"); } int num9 = SpawnEnemySlot(body, masterNameFromPreset3, (int)enemy3EliteType.Value, enemy3BaseCount.Value, enemy3ScaleWithUses.Value, enemy3ScalingMultiplier.Value, num3); num6 += num9; if (num9 > 0 && chatShowEnemyDetails.Value) { string arg3 = ((enemy3EliteType.Value != EliteType.None) ? (GetEliteName((int)enemy3EliteType.Value) + " ") : ""); list.Add($"{num9} {arg3}{enemy3Preset.Value}"); } int num10 = directorCreditsBase.Value + num3 * directorCreditsMultiplier.Value; if (CombatDirector.instancesList.Count > 0) { foreach (CombatDirector instances in CombatDirector.instancesList) { if (Object.op_Implicit((Object)(object)instances) && ((Behaviour)instances).enabled) { instances.monsterCredit += (float)num10; } } } playerCooldowns[body] = Time.time; if (logVerbosity.Value == LogVerbosity.Verbose) { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Last Resort] Credits Added: {num10}"); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Last Resort] Total Enemies: {num6}"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Last Resort] ✅ Activation complete!"); } if (chatNotifications.Value) { List<string> list2 = new List<string>(); list2.Add($"<color=#ff6b6b>⚠ {body.GetUserName()}'s LAST RESORT #{num3}!"); if (itemLossPercent.Value > 0f && text != "lost nothing" && text != "they had nothing to lose") { list2.Add(text); } if (chatShowEnemyDetails.Value && list.Count > 0) { list2.Add(string.Join(", ", list)); } else if (chatShowTotalEnemies.Value && num6 > 0) { list2.Add($"{num6} enemies"); } if (chatShowCredits.Value && num10 > 0) { list2.Add($"+{num10} credits"); } string baseToken = string.Join(", ", list2) + "!</color>"; Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = baseToken }); } } private bool IsPlayerAllowed(CharacterBody body) { string playerName = body.GetUserName(); if (!string.IsNullOrEmpty(disabledPlayerNames.Value)) { string[] source = (from n in disabledPlayerNames.Value.Split(',') select n.Trim() into n where !string.IsNullOrEmpty(n) select n).ToArray(); if (source.Any((string name) => playerName.Equals(name, StringComparison.OrdinalIgnoreCase))) { if (logVerbosity.Value == LogVerbosity.Verbose) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("[Last Resort] " + playerName + " is in disabled list, skipping")); } return false; } } if (enableForAllPlayers.Value) { return true; } if (!string.IsNullOrEmpty(enabledPlayerNames.Value)) { string[] source2 = (from n in enabledPlayerNames.Value.Split(',') select n.Trim() into n where !string.IsNullOrEmpty(n) select n).ToArray(); if (source2.Any((string name) => playerName.Equals(name, StringComparison.OrdinalIgnoreCase))) { if (logVerbosity.Value == LogVerbosity.Verbose) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("[Last Resort] " + playerName + " is in enabled list")); } return true; } if (logVerbosity.Value == LogVerbosity.Verbose) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("[Last Resort] " + playerName + " is not in enabled list, skipping")); } return false; } return false; } private int SpawnEnemySlot(CharacterBody playerBody, string masterName, int eliteIndex, int baseCount, bool scaleWithUses, int scalingMultiplier, int useCount) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: 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_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: 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) //IL_00dd: 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) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) if (baseCount <= 0 || string.IsNullOrEmpty(masterName)) { return 0; } int num = (scaleWithUses ? (baseCount + (useCount - 1) * scalingMultiplier) : baseCount); GameObject val = MasterCatalog.FindMasterPrefab(masterName); if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)("[Last Resort] Could not find master prefab: " + masterName)); return 0; } EliteDef eliteDef = GetEliteDef(eliteIndex); int num2 = 0; for (int i = 0; i < num; i++) { Vector3 onUnitSphere = Random.onUnitSphere; onUnitSphere.y = Mathf.Abs(onUnitSphere.y) * 0.6f; ((Vector3)(ref onUnitSphere)).Normalize(); float num3 = Random.Range(70f, 80f); Vector3 val2 = ((Component)playerBody).transform.position + onUnitSphere * num3; val2.y += 5f; GameObject val3 = Object.Instantiate<GameObject>(val, val2, Quaternion.identity); CharacterMaster component = val3.GetComponent<CharacterMaster>(); if (Object.op_Implicit((Object)(object)component)) { component.teamIndex = (TeamIndex)2; if ((Object)(object)eliteDef != (Object)null && Object.op_Implicit((Object)(object)component.inventory)) { component.inventory.SetEquipmentIndex(eliteDef.eliteEquipmentDef.equipmentIndex, false); component.inventory.GiveItemPermanent(Items.BoostHp, Mathf.RoundToInt((eliteDef.healthBoostCoefficient - 1f) * 10f)); component.inventory.GiveItemPermanent(Items.BoostDamage, Mathf.RoundToInt((eliteDef.damageBoostCoefficient - 1f) * 10f)); } NetworkServer.Spawn(val3); CharacterBody val4 = component.SpawnBody(val2, Quaternion.identity); if (Object.op_Implicit((Object)(object)val4) && (Object)(object)eliteDef != (Object)null) { val4.AddTimedBuff(eliteDef.eliteEquipmentDef.passiveBuffDef, float.PositiveInfinity); } num2++; } else { Object.Destroy((Object)(object)val3); } } if (num2 > 0 && logVerbosity.Value == LogVerbosity.Verbose) { string eliteName = GetEliteName(eliteIndex); string arg = ((eliteIndex >= 0) ? (eliteName + " ") : ""); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Last Resort] Spawned {num2} {arg}{masterName}(s)"); } return num2; } private EliteDef GetEliteDef(int eliteIndex) { if (1 == 0) { } EliteDef result = (EliteDef)(eliteIndex switch { 0 => Elites.Fire, 1 => Elites.Lightning, 2 => Elites.Ice, 3 => Elites.Poison, 4 => Elites.Lunar, 5 => Elites.Void, 6 => Elites.Echo, 7 => Elites.Haunted, 8 => Elites.Earth, 9 => Elites.Aurelionite, 10 => Elites.Bead, 11 => Elites.Collective, _ => null, }); if (1 == 0) { } return result; } private string RemoveRandomItems(Inventory inventory) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //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) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: 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_0035: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //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_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0147: 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_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Invalid comparison between Unknown and I4 //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Invalid comparison between Unknown and I4 //IL_022d: Unknown result type (might be due to invalid IL or missing references) //IL_0232: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Invalid comparison between Unknown and I4 //IL_0261: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_02ac: Unknown result type (might be due to invalid IL or missing references) //IL_02b5: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Invalid comparison between Unknown and I4 //IL_0295: Unknown result type (might be due to invalid IL or missing references) //IL_029a: Unknown result type (might be due to invalid IL or missing references) List<ItemIndex> list = new List<ItemIndex>(); GenericStaticEnumerable<ItemIndex, AllItemsEnumerator> allItems = ItemCatalog.allItems; AllItemsEnumerator enumerator = allItems.GetEnumerator(); try { while (((AllItemsEnumerator)(ref enumerator)).MoveNext()) { ItemIndex current = ((AllItemsEnumerator)(ref enumerator)).Current; int itemCountPermanent = inventory.GetItemCountPermanent(current); for (int i = 0; i < itemCountPermanent; i++) { list.Add(current); } } } finally { ((IDisposable)(AllItemsEnumerator)(ref enumerator)).Dispose(); } if (list.Count == 0) { return "they had nothing to lose"; } int num = Mathf.Max(1, Mathf.CeilToInt((float)list.Count * (itemLossPercent.Value / 100f))); List<ItemIndex> list2 = new List<ItemIndex>(); List<ItemIndex> list3 = new List<ItemIndex>(); ItemTierPriority value = itemTierPriority.Value; if (1 == 0) { } ItemTier val = (ItemTier)(value switch { ItemTierPriority.FavorWhite => 0, ItemTierPriority.FavorGreen => 1, ItemTierPriority.FavorRed => 2, ItemTierPriority.FavorBoss => 4, ItemTierPriority.FavorLunar => 3, ItemTierPriority.FavorVoid => 6, _ => 5, }); if (1 == 0) { } ItemTier val2 = val; if (itemTierPriority.Value != 0) { foreach (ItemIndex item in list) { ItemDef itemDef = ItemCatalog.GetItemDef(item); bool flag = false; if ((itemTierPriority.Value != ItemTierPriority.FavorVoid) ? (itemDef.tier == val2) : ((int)itemDef.tier == 6 || (int)itemDef.tier == 7 || (int)itemDef.tier == 8 || (int)itemDef.tier == 9)) { list2.Add(item); } else { list3.Add(item); } } } else { list3 = list; } List<string> list4 = new List<string>(); for (int j = 0; j < num; j++) { ItemIndex val3; if (list2.Count > 0 && Random.value < 0.7f) { int index = Random.Range(0, list2.Count); val3 = list2[index]; list2.RemoveAt(index); } else if (list3.Count > 0) { int index2 = Random.Range(0, list3.Count); val3 = list3[index2]; list3.RemoveAt(index2); } else { if (list2.Count <= 0) { break; } int index3 = Random.Range(0, list2.Count); val3 = list2[index3]; list2.RemoveAt(index3); } inventory.RemoveItemPermanent(val3, 1); ItemDef itemDef2 = ItemCatalog.GetItemDef(val3); string text = Language.GetString(itemDef2.nameToken); if (string.IsNullOrEmpty(text) || text.Contains("_NAME")) { text = ((Object)itemDef2).name.Replace("Item", ""); } list4.Add(text); } if (list4.Count == 1) { return "lost " + list4[0]; } if (list4.Count == 2) { return "lost " + list4[0] + " and " + list4[1]; } return $"lost {list4.Count} items"; } } }