Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of SmallSurvivorTweaks v1.1.0
Survivor.dll
Decompiled a year agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using EntityStates; using EntityStates.Commando; using EntityStates.Croco; using EntityStates.Loader; using EntityStates.Treebot; using HG.Reflection; using On.EntityStates.Commando; using On.EntityStates.Croco; using On.EntityStates.Loader; using On.EntityStates.Treebot; using On.RoR2.Skills; using R2API; using R2API.Utils; using RoR2; using RoR2.Skills; using UnityEngine; 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: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")] [assembly: AssemblyCompany("Survivor")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("Survivor")] [assembly: AssemblyTitle("Survivor")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace BenSurvivorSpace; [R2APISubmoduleDependency(new string[] { "LanguageAPI", "RecalculateStatsAPI" })] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.Ben.SmallSurvivorTweaks", "Small Survivor Tweaks", "1.1.0")] public class SmallSurivivorTweaks : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnEnter <>9__48_0; internal void <CommandoChange>b__48_0(orig_OnEnter orig, DodgeState self) { orig.Invoke(self); if (NetworkServer.active) { ((EntityState)self).characterBody.AddTimedBuff(Buffs.HiddenInvincibility, CommandoInvic.Value); } } } private bool RexBuffs = true; private bool Multbuffs = true; private bool AcridBuff = false; private bool CaptHealingBuff = true; public static ConfigEntry<float> CommandoInvic { get; set; } public ConfigEntry<bool> HuntressAgile { get; private set; } public ConfigEntry<float> MultRecharge { get; private set; } public ConfigEntry<bool> MultResetCoolDown { get; private set; } public ConfigEntry<float> LoaderPylon { get; private set; } public ConfigEntry<float> AcridFrenzy { get; private set; } public ConfigEntry<float> RexDrill { get; private set; } public ConfigEntry<int> RexDisperse { get; private set; } public ConfigEntry<float> RexHarvest { get; private set; } public ConfigEntry<int> CaptainHealing { get; private set; } public void Awake() { //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Expected O, but got Unknown ((BaseUnityPlugin)this).Logger.LogMessage((object)"Execute Order 69"); CommandoInvic = ((BaseUnityPlugin)this).Config.Bind<float>("SmallSurvivorTweaks", "CommandoInvic", 0.5f, "How long does commando get invicibility for on his combat roll. Vanilla is 0 seconds."); HuntressAgile = ((BaseUnityPlugin)this).Config.Bind<bool>("SmallSurvivorTweaks", "HuntressAgile", true, "Gives Huntresses glaive attack the agile attribute, allowing her to continue sprinting while using it. In vanilla this is false."); MultRecharge = ((BaseUnityPlugin)this).Config.Bind<float>("SmallSurvivorTweaks", "MultRecharge", 2.5f, "Base time for Scrap Launcher to reload. In vanilla this is 1.5s."); MultResetCoolDown = ((BaseUnityPlugin)this).Config.Bind<bool>("SmallSurvivorTweaks", "MultResetCoolDown", false, "Allows scrap launcher to start recharging after the first stock is used and will refresh all when finished. In vanilla this is true, which means that firing would reset cooldown."); LoaderPylon = ((BaseUnityPlugin)this).Config.Bind<float>("SmallSurvivorTweaks", "LoaderPylon", 2f, "Scaling of Loader's Pylon Damage. In vanilla this is 1, or 100% for each burst of electricity."); AcridFrenzy = ((BaseUnityPlugin)this).Config.Bind<float>("SmallSurvivorTweaks", "AcridFrenzy", 0.5f, "Duration of the invicibility acrid gets when landing frenzy leap. In vanilla this is 0."); RexDrill = ((BaseUnityPlugin)this).Config.Bind<float>("SmallSurvivorTweaks", "RexDrill", 4.5f, "Base recharge duration of Rex's Driective Drill Ability. In vanilla this is 6s."); RexDisperse = ((BaseUnityPlugin)this).Config.Bind<int>("SmallSurvivorTweaks", "RexDisperse", 2, "Base stock of Rex's Directive Disperse ablity. In vanilla this is 1."); RexHarvest = ((BaseUnityPlugin)this).Config.Bind<float>("SmallSurvivorTweaks", "RexHarvest", 4.2f, "Damage scale of Rex's Harvest / Fruiting ability. In vanilla this is 3.3."); CaptainHealing = ((BaseUnityPlugin)this).Config.Bind<int>("SmallSurvivorTweaks", "RexDispers", 2, "Base Stock of Captain's Healing Beacon. In Vanilla this is 1."); SkillCatalog.Init += new hook_Init(HuntressChange); TextChange(); RexChange(); CommandoChange(); NewCrocoChange(); LoaderChange(); } private void TextChange() { float num = LoaderPylon.Value * 100f; float num2 = RexHarvest.Value * 100f; if (HuntressAgile.Value) { LanguageAPI.Add("HUNTRESS_SECONDARY_DESCRIPTION", $"<style=cIsUtility>Agile</style>. Throw a seeking glaive that bounces up to <style=cIsDamage>6</style> times for <style=cIsDamage>250% damage</style>. Damage increases by <style=cIsDamage>10%</style> per bounce."); LanguageAPI.Add("HUNTRESS_DESCRIPTION", $"The Huntress is an extremely mobile but fragile survivor with a high damage output. <style=cSub>\r\n\r\n< ! > Remember that Strafe can be uniquely used while sprinting, allowing you to move at high speeds while still taking out potential threats.\r\n\r\n< ! > Blink and Arrow Rain can be used to reposition closer or used as a dodge in a tight spot.\r\n\r\n< ! > Laser Glaive will take out pairs of tough targets quickly as it bounces between the two. \r\n\r\n< ! > Arrow Rain has extremely high damage output and also slows enemies inside, making it great for tough, fast enemies.</style>\r\n"); } LanguageAPI.Add("COMMANDO_UTILITY_DESCRIPTION", $"<style=cIsUtility>Roll</style> a short distance while being <style=cIsHealing>invincible</style> for {CommandoInvic.Value} seconds"); LanguageAPI.Add("LOADER_SPECIAL_DESCRIPTION", $"Throw a floating pylon that <style=cIsDamage>zaps</style> up to <style=cIsDamage>6</style> nearby enemies for <style=cIsDamage>{num}% damage</style>. Can be <style=cIsUtility>grappled</style>."); if (AcridFrenzy.Value > 0f) { LanguageAPI.Add("CROCO_UTILITY_ALT1_DESCRIPTION", $"<style=cIsDamage>Stunning</style> and <style=cIsHealing>Invincible</style> when landing. Leap in the air, dealing <style=cIsDamage>550% damage</style>. <style=cIsUtility>Reduce</style> the cooldown by <style=cIsUtility>2s</style> for every enemy hit."); } LanguageAPI.Add("TREEBOT_SPECIAL_ALT1_DESCRIPTION", $"Fire a bolt that deals <style=cIsDamage>{num2}% damage</style> and <style=cIsDamage>injects</style> an enemy. On death, drop multiple <style=cIsHealing>healing fruits</style> that heal for <style=cIsHealing>25% HP</style>."); if (CaptainHealing.Value > 1) { LanguageAPI.Add("CAPTAIN_SUPPLY_HEAL_DESCRIPTION", $"<style=cIsHealing>Heal</style> all nearby allies for <style=cIsHealing>10%</style></style> of their <style=cIsHealing>maximum health</style> every second. Base stock of <style=cIsUtility>{CaptainHealing.Value}</style>."); } } public void LoaderChange() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown ThrowPylon.OnEnter += (hook_OnEnter)delegate(orig_OnEnter orig, ThrowPylon self) { float fieldValue = Reflection.GetFieldValue<float>((object)self, "damageCoefficient"); bool flag = self != null; if (fieldValue != 0f && flag) { ThrowPylon.damageCoefficient = LoaderPylon.Value; } orig.Invoke(self); }; } public void RexChange() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown TreebotFireFruitSeed.OnEnter += (hook_OnEnter)delegate(orig_OnEnter orig, TreebotFireFruitSeed self) { float fieldValue = Reflection.GetFieldValue<float>((object)self, "damageCoefficient"); bool flag = self != null; if (fieldValue != 0f && flag) { self.damageCoefficient = RexHarvest.Value; } orig.Invoke(self); }; } public void CommandoChange() { //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) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__48_0; if (obj == null) { hook_OnEnter val = delegate(orig_OnEnter orig, DodgeState self) { orig.Invoke(self); if (NetworkServer.active) { ((EntityState)self).characterBody.AddTimedBuff(Buffs.HiddenInvincibility, CommandoInvic.Value); } }; <>c.<>9__48_0 = val; obj = (object)val; } DodgeState.OnEnter += (hook_OnEnter)obj; } public void NewCrocoChange() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown ChainableLeap.DoImpactAuthority += (hook_DoImpactAuthority)delegate(orig_DoImpactAuthority orig, ChainableLeap self) { orig.Invoke(self); if (NetworkServer.active) { ((EntityState)self).characterBody.AddTimedBuff(Buffs.HiddenInvincibility, AcridFrenzy.Value); } }; } public void HuntressChange(orig_Init orig) { orig.Invoke(); if (HuntressAgile.Value) { SkillDef val = Resources.Load<SkillDef>("skilldefs/huntressbody/huntressbodyglaive"); if (Object.op_Implicit((Object)(object)val)) { val.canceledFromSprinting = false; val.cancelSprintingOnActivation = false; } } if (RexBuffs) { SkillDef val2 = Resources.Load<SkillDef>("skilldefs/treebotbody/treebotbodyaimmortarrain"); if (Object.op_Implicit((Object)(object)val2)) { val2.baseRechargeInterval = RexDrill.Value; } SkillDef val3 = Resources.Load<SkillDef>("skilldefs/treebotbody/treebotbodysonicboom"); if (Object.op_Implicit((Object)(object)val3)) { val3.baseMaxStock = RexDisperse.Value; } } if (Multbuffs) { SkillDef val4 = Resources.Load<SkillDef>("skilldefs/toolbotbody/toolbotbodyfiregrenadelauncher"); if (Object.op_Implicit((Object)(object)val4)) { val4.baseRechargeInterval = MultRecharge.Value; val4.resetCooldownTimerOnUse = MultResetCoolDown.Value; } } if (AcridBuff) { SkillDef val5 = Resources.Load<SkillDef>("skilldefs/crocobody/crocochainableleap"); if (Object.op_Implicit((Object)(object)val5)) { val5.baseMaxStock = 3; } } if (CaptHealingBuff) { SkillDef val6 = Resources.Load<SkillDef>("skilldefs/captainbody/callsupplydrophealing"); if (Object.op_Implicit((Object)(object)val6)) { val6.baseMaxStock = CaptainHealing.Value; } } } }