Decompiled source of SmallSurvivorTweaks v1.1.0

Survivor.dll

Decompiled 3 months ago
using 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;
			}
		}
	}
}