Decompiled source of SurvivorsPlus v1.1.1

SurvivorsPlus.dll

Decompiled 6 months ago
using 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 EntityStates;
using EntityStates.Bandit2.Weapon;
using EntityStates.Captain.Weapon;
using EntityStates.CaptainDefenseMatrixItem;
using EntityStates.Commando;
using EntityStates.Commando.CommandoWeapon;
using EntityStates.Engi.EngiWeapon;
using EntityStates.Engi.Mine;
using EntityStates.Huntress;
using EntityStates.Merc;
using EntityStates.Railgunner.Reload;
using EntityStates.Railgunner.Weapon;
using EntityStates.VoidSurvivor;
using IL.RoR2;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.EntityStates;
using On.EntityStates.Bandit2.Weapon;
using On.EntityStates.CaptainDefenseMatrixItem;
using On.EntityStates.Commando;
using On.EntityStates.Engi.EngiWeapon;
using On.EntityStates.Engi.Mine;
using On.EntityStates.Huntress;
using On.EntityStates.Railgunner.Reload;
using On.EntityStates.Railgunner.Weapon;
using On.EntityStates.VoidSurvivor;
using On.RoR2;
using R2API;
using RoR2;
using RoR2.CharacterAI;
using RoR2.EntityLogic;
using RoR2.HudOverlay;
using RoR2.Projectile;
using RoR2.Skills;
using SurvivorsPlus.Bandit;
using SurvivorsPlus.Captain;
using SurvivorsPlus.Commando;
using SurvivorsPlus.Engineer;
using SurvivorsPlus.Huntress;
using SurvivorsPlus.Loader;
using SurvivorsPlus.Mercenary;
using SurvivorsPlus.REX;
using SurvivorsPlus.Railgunner;
using SurvivorsPlus.VoidFiend;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("SurvivorsPlus")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+3a19b9bebbdbe9a3ce97821a90e60a74bc40b147")]
[assembly: AssemblyProduct("SurvivorsPlus")]
[assembly: AssemblyTitle("SurvivorsPlus")]
[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 SurvivorsPlus
{
	[BepInPlugin("com.Nuxlar.SurvivorsPlus", "SurvivorsPlus", "1.1.1")]
	public class SurvivorsPlus : BaseUnityPlugin
	{
		private GameObject arti = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mage/MageBody.prefab").WaitForCompletion();

		private GameObject mult = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Toolbot/ToolbotBody.prefab").WaitForCompletion();

		public static ConfigEntry<bool> enableAccelerationChanges;

		public static ConfigEntry<bool> enableCommandoChanges;

		public static ConfigEntry<bool> enableHuntressChanges;

		public static ConfigEntry<bool> enableBanditChanges;

		public static ConfigEntry<bool> enableEngineerChanges;

		public static ConfigEntry<bool> enableMercChanges;

		public static ConfigEntry<bool> enableREXChanges;

		public static ConfigEntry<bool> enableRunnerChanges;

		public static ConfigEntry<bool> enableAcridChanges;

		public static ConfigEntry<bool> enableCaptainChanges;

		public static ConfigEntry<bool> enableVoidFiendChanges;

		public static ConfigEntry<bool> enableArtificerChanges;

		public static ConfigEntry<bool> enableLoaderChanges;

		private static ConfigFile SPConfig { get; set; }

		public void Awake()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Expected O, but got Unknown
			SPConfig = new ConfigFile(Paths.ConfigPath + "\\com.Nuxlar.SurvivorsPlus.cfg", true);
			enableAccelerationChanges = SPConfig.Bind<bool>("General", "Enable Acceleration Changes", true, "Toggle Artificer and MUL-T acceleration changes on/off");
			enableCommandoChanges = SPConfig.Bind<bool>("General", "Enable Commando Changes", true, "Toggle commando changes on/off");
			enableHuntressChanges = SPConfig.Bind<bool>("General", "Enable Huntress Changes", true, "Toggle huntress changes on/off");
			enableBanditChanges = SPConfig.Bind<bool>("General", "Enable Bandit Changes", true, "Toggle bandit changes on/off");
			enableEngineerChanges = SPConfig.Bind<bool>("General", "Enable Engineer Changes", true, "Toggle engineer changes on/off");
			enableMercChanges = SPConfig.Bind<bool>("General", "Enable Mercenary Changes", true, "Toggle mercenary changes on/off");
			enableREXChanges = SPConfig.Bind<bool>("General", "Enable REX Changes", true, "Toggle REX changes on/off");
			enableRunnerChanges = SPConfig.Bind<bool>("General", "Enable Railgunner Changes", true, "Toggle Railgunner changes on/off");
			enableAcridChanges = SPConfig.Bind<bool>("General", "Enable Acrid Changes", true, "Toggle Acrid changes on/off");
			enableCaptainChanges = SPConfig.Bind<bool>("General", "Enable Captain Changes", true, "Toggle Captain changes on/off");
			enableVoidFiendChanges = SPConfig.Bind<bool>("General", "Enable Void Fiend Changes", true, "Toggle Void Fiend changes on/off");
			enableArtificerChanges = SPConfig.Bind<bool>("General", "Enable Artificer Changes", true, "Toggle Artificer changes on/off");
			enableLoaderChanges = SPConfig.Bind<bool>("General", "Enable Loader Changes", true, "Toggle Loader changes on/off");
			if (enableAccelerationChanges.Value)
			{
				arti.GetComponent<CharacterBody>().baseAcceleration = 80f;
				mult.GetComponent<CharacterBody>().baseAcceleration = 80f;
			}
			if (enableCommandoChanges.Value)
			{
				new CommandoChanges();
			}
			if (enableHuntressChanges.Value)
			{
				new HuntressChanges();
			}
			if (enableBanditChanges.Value)
			{
				new BanditChanges();
			}
			if (enableEngineerChanges.Value)
			{
				new EngineerChanges();
			}
			if (enableMercChanges.Value)
			{
				new MercenaryChanges();
			}
			if (enableREXChanges.Value)
			{
				new REXChanges();
			}
			if (enableRunnerChanges.Value)
			{
				new RailgunnerChanges();
			}
			if (enableCaptainChanges.Value)
			{
				new CaptainChanges();
			}
			if (enableVoidFiendChanges.Value)
			{
				new VoidFiendChanges();
			}
			if (enableLoaderChanges.Value)
			{
				new LoaderChanges();
			}
		}

		public static void ChangeEntityStateValue(string entityStateConfiguration, string fieldName, string newValue)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			EntityStateConfiguration val = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)entityStateConfiguration).WaitForCompletion();
			for (int i = 0; i < val.serializedFieldsCollection.serializedFields.Length; i++)
			{
				if (val.serializedFieldsCollection.serializedFields[i].fieldName == fieldName)
				{
					val.serializedFieldsCollection.serializedFields[i].fieldValue.stringValue = newValue;
				}
			}
		}

		public static void ChangeEntityStateValueO(string entityStateConfiguration, string fieldName, Object newValue)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			EntityStateConfiguration val = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)entityStateConfiguration).WaitForCompletion();
			for (int i = 0; i < val.serializedFieldsCollection.serializedFields.Length; i++)
			{
				if (val.serializedFieldsCollection.serializedFields[i].fieldName == fieldName)
				{
					val.serializedFieldsCollection.serializedFields[i].fieldValue.objectValue = newValue;
				}
			}
		}
	}
}
namespace SurvivorsPlus.VoidFiend
{
	public class VoidFiendChanges
	{
		public VoidFiendChanges()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Expected O, but got Unknown
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Expected O, but got Unknown
			RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
			VoidSurvivorController.OnEnable += new hook_OnEnable(ChangeValues);
			GlobalEventManager.OnCharacterDeath += new hook_OnCharacterDeath(ExtraCorruptionOnKill);
			CorruptionTransitionBase.OnEnter += new hook_OnEnter(ReduceCorruptionAnim);
		}

		private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
		{
			if (Object.op_Implicit((Object)(object)sender) && sender.HasBuff(Buffs.VoidSurvivorCorruptMode))
			{
				args.armorAdd -= 100f;
			}
		}

		private void ReduceCorruptionAnim(orig_OnEnter orig, CorruptionTransitionBase self)
		{
			if (self is EnterCorruptionTransition)
			{
				self.duration = 0.75f;
			}
			orig.Invoke(self);
		}

		private void ChangeValues(orig_OnEnable orig, VoidSurvivorController self)
		{
			self.corruptionPerCrit = 0f;
			self.corruptionForFullHeal = 0f;
			self.corruptionFractionPerSecondWhileCorrupted = -1f / 30f;
			self.corruptionPerSecondInCombat = 1f;
			self.corruptionPerSecondOutOfCombat = 0f;
			self.corruptionForFullDamage = 0f;
			orig.Invoke(self);
		}

		private void ExtraCorruptionOnKill(orig_OnCharacterDeath orig, GlobalEventManager self, DamageReport damageReport)
		{
			orig.Invoke(self, damageReport);
			if (Object.op_Implicit((Object)(object)damageReport.attackerBody) && Object.op_Implicit((Object)(object)((Component)damageReport.attackerBody).GetComponent<VoidSurvivorController>()) && !damageReport.attackerBody.HasBuff(Buffs.VoidSurvivorCorruptMode))
			{
				((Component)damageReport.attackerBody).GetComponent<VoidSurvivorController>().AddCorruption(2f);
			}
		}
	}
}
namespace SurvivorsPlus.REX
{
	public class REXChanges
	{
		public static GameObject syringe = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Treebot/SyringeProjectile.prefab").WaitForCompletion();

		public REXChanges()
		{
			syringe.GetComponent<ProjectileController>().procCoefficient = 0.8f;
		}
	}
}
namespace SurvivorsPlus.Railgunner
{
	public class RailgunnerChanges
	{
		private GameObject railgunner = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerBody.prefab").WaitForCompletion();

		private GameObject polarMine = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerMineAltDetonated.prefab").WaitForCompletion();

		private SkillDef badPrimary = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyFirePistol.asset").WaitForCompletion();

		private SkillDef snipeLight = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyFireSnipeLight.asset").WaitForCompletion();

		private SkillDef snipeHeavy = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyScopeHeavy.asset").WaitForCompletion();

		private SkillFamily utilityFamily = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyUtilityFamily.asset").WaitForCompletion();

		private SkillFamily specialFamily = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/DLC1/Railgunner/RailgunnerBodySpecialFamily.asset").WaitForCompletion();

		public RailgunnerChanges()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: 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_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_025a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0264: Expected O, but got Unknown
			//IL_026b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0275: Expected O, but got Unknown
			//IL_027c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0286: Expected O, but got Unknown
			//IL_028d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0297: Expected O, but got Unknown
			//IL_029e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a8: Expected O, but got Unknown
			//IL_02af: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b9: Expected O, but got Unknown
			SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Backpack.Offline.asset", "baseDuration", "5");
			SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeLight.asset", "critDamageMultiplier", "0");
			SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeLight.asset", "damageCoefficient", "3");
			SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeHeavy.asset", "damageCoefficient", "6");
			SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeSuper.asset", "damageCoefficient", "24");
			SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeCryo.asset", "damageCoefficient", "12");
			railgunner.AddComponent<WeakspotController>();
			polarMine.GetComponent<SlowDownProjectiles>().slowDownCoefficient = 0.01f;
			SkillLocator component = railgunner.GetComponent<SkillLocator>();
			GenericSkill[] components = railgunner.GetComponents<GenericSkill>();
			foreach (GenericSkill val in components)
			{
				if (!val.skillName.Contains("Passive"))
				{
					Object.Destroy((Object)(object)val);
				}
			}
			FamilyChanges();
			component.primary.skillFamily.variants[0].skillDef.skillNameToken = "HH44 Rounds";
			component.primary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Fire a light projectile for <style=cIsDamage>300% damage</style>.";
			component.secondary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Activate your <style=cIsUtility>long-range scope</style>, highlighting <style=cIsDamage>Weak Points</style> and transforming your weapon into a piercing <style=cIsDamage>600% damage</style> railgun.";
			component.special.skillFamily.variants[0].skillDef.skillDescriptionToken = "Fire a <style=cIsDamage>piercing</style> round for <style=cIsDamage>2400% damage</style> and <style=cIsDamage>150% Weak Point damage</style>. Afterwards, <style=cIsHealth>all your weapons are disabled</style> for <style=cIsHealth>5</style> seconds.";
			component.special.skillFamily.variants[1].skillDef.skillDescriptionToken = "<style=cIsUtility>Freezing</style>. Fire <style=cIsDamage>piercing</style> round for <style=cIsDamage>1200% damage</style>.";
			CharacterBody.RecalculateStats += new Manipulator(DoubleLope);
			CharacterBody.RecalculateStats += new Manipulator(DoubleCritMultiplier);
			BaseFireSnipe.OnEnter += new hook_OnEnter(AddReload);
			BaseFireSnipe.ModifyBullet += new hook_ModifyBullet(AlterBullet);
			HurtBox.OnEnable += new hook_OnEnable(ReduceWeakpointSize);
			Boosted.OnEnter += new hook_OnEnter(ReduceBoostBonus);
		}

		private void ReduceBoostBonus(orig_OnEnter orig, Boosted self)
		{
			self.bonusDamageCoefficient = 1.5f;
			orig.Invoke(self);
		}

		private void ReduceWeakpointSize(orig_OnEnable orig, HurtBox self)
		{
			orig.Invoke(self);
			HurtBox.sniperTargetRadius = 0.75f;
		}

		private void DoubleLope(ILContext il)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.GotoNext((MoveType)2, new Func<Instruction, bool>[2]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 2f),
				(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 1f)
			});
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<float, CharacterBody, float>>((Func<float, CharacterBody, float>)((float num, CharacterBody body) => (Object.op_Implicit((Object)(object)body.inventory) && body.inventory.GetItemCount(Items.ConvertCritChanceToCritDamage) > 0) ? 2f : num));
		}

		private void DoubleCritMultiplier(ILContext il)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			ILCursor val = new ILCursor(il);
			int num = default(int);
			val.GotoNext((MoveType)0, new Func<Instruction, bool>[3]
			{
				(Instruction x) => ILPatternMatchingExt.MatchCall<CharacterBody>(x, "get_critMultiplier"),
				(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref num),
				(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 0.01f)
			});
			val.Index += 2;
			val.Next.Operand = 0.02f;
		}

		private void AddReload(orig_OnEnter orig, BaseFireSnipe self)
		{
			if (self is FireSnipeLight)
			{
				self.useSecondaryStocks = true;
				self.queueReload = true;
			}
			orig.Invoke(self);
		}

		private void AlterBullet(orig_ModifyBullet orig, BaseFireSnipe self, BulletAttack bulletAttack)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			if (self is FireSnipeLight)
			{
				bulletAttack.sniper = true;
				bulletAttack.falloffModel = (FalloffModel)0;
				EntityStateMachine val = EntityStateMachine.FindByCustomName(((EntityState)self).gameObject, "Reload");
				if (Object.op_Implicit((Object)(object)val))
				{
					EntityState state = val.state;
					Boosted val2 = (Boosted)(object)((state is Boosted) ? state : null);
					if (val2 != null)
					{
						bulletAttack.damage += val2.GetBonusDamage() / 2f;
						val2.ConsumeBoost(self.queueReload);
					}
					else if (self.queueReload)
					{
						EntityState state2 = val.state;
						Waiting val3 = (Waiting)(object)((state2 is Waiting) ? state2 : null);
						if (val3 != null)
						{
							val3.QueueReload();
						}
					}
				}
				EntityStateMachine val4 = EntityStateMachine.FindByCustomName(((EntityState)self).gameObject, "Backpack");
				EntityState val5 = self.InstantiateBackpackState();
				if (Object.op_Implicit((Object)(object)val4) && val5 != null)
				{
					val4.SetNextState(val5);
				}
			}
			else
			{
				orig.Invoke(self, bulletAttack);
			}
		}

		private void FamilyChanges()
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			SkillLocator component = railgunner.GetComponent<SkillLocator>();
			GenericSkill val = railgunner.AddComponent<GenericSkill>();
			val.skillName = "RailgunnerPrimary";
			SkillFamily val2 = ScriptableObject.CreateInstance<SkillFamily>();
			((Object)val2).name = "RailgunnerPrimaryFamily";
			val2.variants = (Variant[])(object)new Variant[2]
			{
				new Variant
				{
					skillDef = snipeLight
				},
				new Variant
				{
					skillDef = badPrimary
				}
			};
			val._skillFamily = val2;
			ContentAddition.AddSkillFamily(val2);
			component.primary = val;
			GenericSkill val3 = railgunner.AddComponent<GenericSkill>();
			val.skillName = "RailgunnerSecondary";
			SkillFamily val4 = ScriptableObject.CreateInstance<SkillFamily>();
			((Object)val4).name = "RailgunnerSecondaryFamily";
			val4.variants = (Variant[])(object)new Variant[1]
			{
				new Variant
				{
					skillDef = snipeHeavy
				}
			};
			val3._skillFamily = val4;
			ContentAddition.AddSkillFamily(val4);
			component.secondary = val3;
			GenericSkill val5 = railgunner.AddComponent<GenericSkill>();
			val5.skillName = "RailgunnerUtility";
			val5._skillFamily = utilityFamily;
			component.utility = val5;
			GenericSkill val6 = railgunner.AddComponent<GenericSkill>();
			val6.skillName = "RailgunnerSpecial";
			val6._skillFamily = specialFamily;
			component.special = val6;
		}
	}
	public class WeakspotController : MonoBehaviour
	{
		public GameObject scopeOverlayPrefab = ((Component)Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerScopeHeavyOverlay.prefab").WaitForCompletion().transform.GetChild(0)).gameObject;

		private OverlayController overlayController;

		public void Start()
		{
			//IL_0009: 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)
			overlayController = HudOverlayManager.AddOverlay(((Component)this).gameObject, new OverlayCreationParams
			{
				prefab = scopeOverlayPrefab,
				childLocatorEntry = "ScopeContainer"
			});
		}

		public void OnDisable()
		{
			RemoveOverlay(0f);
		}

		protected void RemoveOverlay(float transitionDuration)
		{
			if (overlayController != null)
			{
				HudOverlayManager.RemoveOverlay(overlayController);
				overlayController = null;
			}
		}
	}
}
namespace SurvivorsPlus.Mercenary
{
	public class EvisDashNux : BaseState
	{
		private Transform modelTransform;

		public static GameObject blinkPrefab;

		private float stopwatch;

		private Vector3 dashVector = Vector3.zero;

		public static float smallHopVelocity;

		public static float dashPrepDuration;

		public static float dashDuration = 0.3f;

		public static float speedCoefficient = 25f;

		public static string beginSoundString;

		public static string endSoundString;

		public static float overlapSphereRadius;

		public static float lollypopFactor;

		private Animator animator;

		private CharacterModel characterModel;

		private HurtBoxGroup hurtboxGroup;

		private bool isDashing;

		private AimRequest aimRequest;

		public override void OnEnter()
		{
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			Util.PlaySound(EvisDash.beginSoundString, ((EntityState)this).gameObject);
			modelTransform = ((EntityState)this).GetModelTransform();
			if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams))
			{
				aimRequest = ((EntityState)this).cameraTargetParams.RequestAimType((AimType)2);
			}
			if (Object.op_Implicit((Object)(object)modelTransform))
			{
				animator = ((Component)modelTransform).GetComponent<Animator>();
				characterModel = ((Component)modelTransform).GetComponent<CharacterModel>();
			}
			if (((EntityState)this).isAuthority)
			{
				((BaseState)this).SmallHop(((EntityState)this).characterMotor, EvisDash.smallHopVelocity);
			}
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddBuff(Buffs.HiddenInvincibility);
			}
			((EntityState)this).PlayAnimation("FullBody, Override", "EvisPrep", "EvisPrep.playbackRate", EvisDash.dashPrepDuration);
			dashVector = ((EntityState)this).inputBank.aimDirection;
			((EntityState)this).characterDirection.forward = dashVector;
		}

		private void CreateBlinkEffect(Vector3 origin)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: 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_001b: 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: Expected O, but got Unknown
			EffectManager.SpawnEffect(EvisDash.blinkPrefab, new EffectData
			{
				rotation = Util.QuaternionSafeLookRotation(dashVector),
				origin = origin
			}, false);
		}

		public override void FixedUpdate()
		{
			//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_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0201: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).FixedUpdate();
			stopwatch += Time.fixedDeltaTime;
			if ((double)stopwatch > (double)EvisDash.dashPrepDuration && !isDashing)
			{
				isDashing = true;
				dashVector = ((EntityState)this).inputBank.aimDirection;
				CreateBlinkEffect(Util.GetCorePosition(((EntityState)this).gameObject));
				((EntityState)this).PlayCrossfade("FullBody, Override", "EvisLoop", 0.1f);
				if (Object.op_Implicit((Object)(object)modelTransform))
				{
					TemporaryOverlay obj = ((Component)modelTransform).gameObject.AddComponent<TemporaryOverlay>();
					obj.duration = 0.6f;
					obj.animateShaderAlpha = true;
					obj.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
					obj.destroyComponentOnEnd = true;
					obj.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matHuntressFlashBright");
					obj.AddToCharacerModel(((Component)modelTransform).GetComponent<CharacterModel>());
					TemporaryOverlay obj2 = ((Component)modelTransform).gameObject.AddComponent<TemporaryOverlay>();
					obj2.duration = 0.7f;
					obj2.animateShaderAlpha = true;
					obj2.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
					obj2.destroyComponentOnEnd = true;
					obj2.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matHuntressFlashExpanded");
					obj2.AddToCharacerModel(((Component)modelTransform).GetComponent<CharacterModel>());
				}
			}
			bool flag = (double)stopwatch >= (double)EvisDash.dashDuration + (double)EvisDash.dashPrepDuration;
			if (isDashing)
			{
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
				{
					CharacterMotor characterMotor = ((EntityState)this).characterMotor;
					characterMotor.rootMotion += dashVector * (base.moveSpeedStat * EvisDash.speedCoefficient * Time.fixedDeltaTime);
				}
				if (((EntityState)this).isAuthority)
				{
					Collider[] array = Physics.OverlapSphere(((EntityState)this).transform.position, ((EntityState)this).characterBody.radius + EvisDash.overlapSphereRadius * (flag ? EvisDash.lollypopFactor : 1f), LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.entityPrecise)).mask));
					for (int i = 0; i < array.Length; i++)
					{
						HurtBox component = ((Component)array[i]).GetComponent<HurtBox>();
						if (Object.op_Implicit((Object)(object)component) && (Object)(object)component.healthComponent != (Object)(object)((EntityState)this).healthComponent)
						{
							((EntityState)this).outer.SetNextState((EntityState)(object)new EvisNux());
							return;
						}
					}
				}
			}
			if (flag && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override void OnExit()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			Util.PlaySound(EvisDash.endSoundString, ((EntityState)this).gameObject);
			CharacterMotor characterMotor = ((EntityState)this).characterMotor;
			characterMotor.velocity *= 0.1f;
			((BaseState)this).SmallHop(((EntityState)this).characterMotor, EvisDash.smallHopVelocity);
			AimRequest obj = aimRequest;
			if (obj != null)
			{
				obj.Dispose();
			}
			((EntityState)this).PlayAnimation("FullBody, Override", "EvisLoopExit");
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.RemoveBuff(Buffs.HiddenInvincibility);
			}
			((EntityState)this).OnExit();
		}
	}
	public class EvisNux : BaseState
	{
		private Transform modelTransform;

		public static GameObject blinkPrefab;

		public static float duration = 2f;

		public static float damageCoefficient;

		public static float damageFrequency;

		public static float procCoefficient;

		public static string beginSoundString;

		public static string endSoundString;

		public static float maxRadius;

		public static GameObject hitEffectPrefab;

		public static string slashSoundString;

		public static string impactSoundString;

		public static string dashSoundString;

		public static float slashPitch;

		public static float smallHopVelocity;

		public static float lingeringInvincibilityDuration;

		private CharacterModel characterModel;

		private float stopwatch;

		private float attackStopwatch;

		private bool crit;

		private static float minimumDuration = 0.5f;

		private AimRequest aimRequest;

		private int hitCount;

		public override void OnEnter()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			CreateBlinkEffect(Util.GetCorePosition(((EntityState)this).gameObject));
			Util.PlayAttackSpeedSound(Evis.beginSoundString, ((EntityState)this).gameObject, 1.2f);
			crit = Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master);
			modelTransform = ((EntityState)this).GetModelTransform();
			if (Object.op_Implicit((Object)(object)modelTransform))
			{
				characterModel = ((Component)modelTransform).GetComponent<CharacterModel>();
			}
			if (Object.op_Implicit((Object)(object)characterModel))
			{
				CharacterModel obj = characterModel;
				obj.invisibilityCount++;
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams))
			{
				aimRequest = ((EntityState)this).cameraTargetParams.RequestAimType((AimType)2);
			}
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddBuff(Buffs.HiddenInvincibility);
			}
		}

		public override void FixedUpdate()
		{
			//IL_0274: Unknown result type (might be due to invalid IL or missing references)
			//IL_0279: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: 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_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: 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_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Expected O, but got Unknown
			//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).FixedUpdate();
			stopwatch += Time.fixedDeltaTime;
			attackStopwatch += Time.fixedDeltaTime;
			float num = 1f / Evis.damageFrequency / base.attackSpeedStat;
			if ((double)attackStopwatch >= (double)num)
			{
				hitCount++;
				attackStopwatch -= num;
				HurtBox val = SearchForTarget();
				if (Object.op_Implicit((Object)(object)val))
				{
					Util.PlayAttackSpeedSound(Evis.slashSoundString, ((EntityState)this).gameObject, Evis.slashPitch);
					Util.PlaySound(Evis.dashSoundString, ((EntityState)this).gameObject);
					Util.PlaySound(Evis.impactSoundString, ((EntityState)this).gameObject);
					HurtBoxGroup hurtBoxGroup = val.hurtBoxGroup;
					HurtBox val2 = hurtBoxGroup.hurtBoxes[Random.Range(0, hurtBoxGroup.hurtBoxes.Length - 1)];
					if (Object.op_Implicit((Object)(object)val2))
					{
						Vector3 position = ((Component)val2).transform.position;
						Vector2 insideUnitCircle = Random.insideUnitCircle;
						Vector2 normalized = ((Vector2)(ref insideUnitCircle)).normalized;
						Vector3 val3 = default(Vector3);
						((Vector3)(ref val3))..ctor(normalized.x, 0f, normalized.y);
						EffectManager.SimpleImpactEffect(Evis.hitEffectPrefab, position, val3, false);
						Transform transform = ((Component)val.hurtBoxGroup).transform;
						TemporaryOverlay obj = ((Component)transform).gameObject.AddComponent<TemporaryOverlay>();
						obj.duration = num;
						obj.animateShaderAlpha = true;
						obj.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
						obj.destroyComponentOnEnd = true;
						obj.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matMercEvisTarget");
						obj.AddToCharacerModel(((Component)transform).GetComponent<CharacterModel>());
						if (NetworkServer.active)
						{
							DamageInfo val4 = new DamageInfo();
							val4.damage = 1.5f * base.damageStat;
							val4.attacker = ((EntityState)this).gameObject;
							val4.procCoefficient = Evis.procCoefficient;
							val4.position = ((Component)val2).transform.position;
							val4.crit = crit;
							if (hitCount == 7)
							{
								val4.damageType = (DamageType)(val4.damageType | 0x800000);
							}
							val2.healthComponent.TakeDamage(val4);
							GlobalEventManager.instance.OnHitEnemy(val4, ((Component)val2.healthComponent).gameObject);
							GlobalEventManager.instance.OnHitAll(val4, ((Component)val2.healthComponent).gameObject);
						}
					}
				}
				else if (((EntityState)this).isAuthority && (double)stopwatch > (double)Evis.minimumDuration)
				{
					((EntityState)this).outer.SetNextStateToMain();
				}
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
			{
				((EntityState)this).characterMotor.velocity = Vector3.zero;
			}
			if (!((double)stopwatch < (double)Evis.duration) && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		private HurtBox SearchForTarget()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: 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_0017: 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_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: 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)
			BullseyeSearch val = new BullseyeSearch
			{
				searchOrigin = ((EntityState)this).transform.position,
				searchDirection = Random.onUnitSphere,
				maxDistanceFilter = Evis.maxRadius,
				teamMaskFilter = TeamMask.GetUnprotectedTeams(((BaseState)this).GetTeam()),
				sortMode = (SortMode)1
			};
			val.RefreshCandidates();
			val.FilterOutGameObject(((EntityState)this).gameObject);
			return val.GetResults().FirstOrDefault();
		}

		private void CreateBlinkEffect(Vector3 origin)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			EffectManager.SpawnEffect(Evis.blinkPrefab, new EffectData
			{
				rotation = Util.QuaternionSafeLookRotation(Vector3.up),
				origin = origin
			}, false);
		}

		public override void OnExit()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			Util.PlaySound(Evis.endSoundString, ((EntityState)this).gameObject);
			CreateBlinkEffect(Util.GetCorePosition(((EntityState)this).gameObject));
			modelTransform = ((EntityState)this).GetModelTransform();
			if (Object.op_Implicit((Object)(object)modelTransform))
			{
				TemporaryOverlay obj = ((Component)modelTransform).gameObject.AddComponent<TemporaryOverlay>();
				obj.duration = 0.6f;
				obj.animateShaderAlpha = true;
				obj.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
				obj.destroyComponentOnEnd = true;
				obj.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matMercEvisTarget");
				obj.AddToCharacerModel(((Component)modelTransform).GetComponent<CharacterModel>());
				TemporaryOverlay obj2 = ((Component)modelTransform).gameObject.AddComponent<TemporaryOverlay>();
				obj2.duration = 0.7f;
				obj2.animateShaderAlpha = true;
				obj2.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
				obj2.destroyComponentOnEnd = true;
				obj2.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matHuntressFlashExpanded");
				obj2.AddToCharacerModel(((Component)modelTransform).GetComponent<CharacterModel>());
			}
			if (Object.op_Implicit((Object)(object)characterModel))
			{
				CharacterModel obj3 = characterModel;
				obj3.invisibilityCount--;
			}
			AimRequest obj4 = aimRequest;
			if (obj4 != null)
			{
				obj4.Dispose();
			}
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.RemoveBuff(Buffs.HiddenInvincibility);
				((EntityState)this).characterBody.AddTimedBuff(Buffs.HiddenInvincibility, Evis.lingeringInvincibilityDuration);
			}
			Util.PlaySound(Evis.endSoundString, ((EntityState)this).gameObject);
			((BaseState)this).SmallHop(((EntityState)this).characterMotor, Evis.smallHopVelocity);
			((EntityState)this).OnExit();
		}
	}
	public class MercenaryChanges
	{
		private GameObject merc = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Merc/MercBody.prefab").WaitForCompletion();

		private GameObject evisOverlapProjectile = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Merc/EvisOverlapProjectile.prefab").WaitForCompletion();

		public MercenaryChanges()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			Object.Destroy((Object)(object)evisOverlapProjectile.GetComponent<DelayedEvent>());
			bool flag = default(bool);
			ContentAddition.AddEntityState<EvisDashNux>(ref flag);
			ContentAddition.AddEntityState<EvisNux>(ref flag);
			SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Merc/EntityStates.Merc.Assaulter2.asset", "damageCoefficient", "4");
			SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Merc/EntityStates.Merc.FocusedAssaultDash.asset", "delayedDamageCoefficient", "8");
			CharacterBody component = merc.GetComponent<CharacterBody>();
			component.baseRegen = 2.5f;
			component.levelRegen = 0.5f;
			SkillLocator component2 = merc.GetComponent<SkillLocator>();
			component2.utility.skillFamily.variants[0].skillDef.skillDescriptionToken = "<style=cIsDamage>Stunning</style>. Dash forward, dealing <style=cIsDamage>400% damage</style>. If you hit an enemy, <style=cIsDamage>you can dash again</style>, up to <style=cIsDamage>3</style> total.";
			component2.utility.skillFamily.variants[1].skillDef.skillDescriptionToken = "<style=cIsDamage>Stunning</style>. Dash forward, dealing <style=cIsDamage>800% damage</style> and <style=cIsUtility>Exposing</style> enemies after<style=cIsUtility> 1 second</style>.";
			component2.special.skillFamily.variants[0].skillDef.skillDescriptionToken = "Target a nearby enemy, attacking them for <style=cIsDamage>150% damage</style> repeatedly. <style=cIsUtility>Exposing</style> on the final hit. <style=cIsUtility>You cannot be hit for the duration</style>.";
			component2.special.skillFamily.variants[0].skillDef.activationState = new SerializableEntityStateType(typeof(EvisDashNux));
		}
	}
}
namespace SurvivorsPlus.Loader
{
	public class LoaderChanges
	{
		private GameObject loader = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Loader/LoaderBody.prefab").WaitForCompletion();

		public LoaderChanges()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody component = loader.GetComponent<CharacterBody>();
			component.baseMaxHealth = 110f;
			component.levelMaxHealth = 33f;
			component.baseArmor = 10f;
		}
	}
}
namespace SurvivorsPlus.Huntress
{
	public class HuntressChanges
	{
		public ModdedDamageType huntressSlow;

		private GameObject arrowRainProjectile = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Huntress/HuntressArrowRain.prefab").WaitForCompletion();

		private GameObject huntress = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Huntress/HuntressBody.prefab").WaitForCompletion();

		public HuntressChanges()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Expected O, but got Unknown
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Expected O, but got Unknown
			huntressSlow = DamageAPI.ReserveDamageType();
			SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Huntress/EntityStates.Huntress.HuntressWeapon.FireFlurrySeekingArrow.asset", "orbProcCoefficient", "0.8");
			SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Huntress/EntityStates.Huntress.HuntressWeapon.FireFlurrySeekingArrow.asset", "baseDuration", "1");
			SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Huntress/EntityStates.Huntress.ArrowRain.asset", "damageCoefficient", "6");
			arrowRainProjectile.GetComponent<ProjectileDotZone>().overlapProcCoefficient = 0.6f;
			arrowRainProjectile.GetComponent<ProjectileDamage>().damageType = (DamageType)0;
			arrowRainProjectile.AddComponent<ModdedDamageTypeHolderComponent>().Add(huntressSlow);
			SkillLocator component = huntress.GetComponent<SkillLocator>();
			component.utility.skillFamily.variants[0].skillDef.baseRechargeInterval = 6f;
			SkillDef skillDef = component.utility.skillFamily.variants[1].skillDef;
			skillDef.baseMaxStock = 1;
			skillDef.baseRechargeInterval = 3f;
			skillDef.skillDescriptionToken = "<style=cIsUtility>Agile</style>. <style=cIsUtility>Disappear</style> and <style=cIsUtility>teleport</style> a short distance.";
			component.secondary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Throw a seeking glaive that bounces up to <style=cIsDamage>6</style> times for <style=cIsDamage>400%</style> damage.";
			component.special.skillFamily.variants[0].skillDef.skillDescriptionToken = "<style=cIsUtility>Teleport</style> into the sky. Target an area to rain arrows, <style=cIsUtility>slowing</style> all enemies and dealing <style=cIsDamage>450% damage per second</style>.";
			HealthComponent.SendDamageDealt += new hook_SendDamageDealt(ApplyNewDamageType);
			ArrowRain.UpdateAreaIndicator += new hook_UpdateAreaIndicator(ChangeAimLayer);
		}

		private void ApplyNewDamageType(orig_SendDamageDealt orig, DamageReport damageReport)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			if (DamageAPI.HasModdedDamageType(damageReport.damageInfo, huntressSlow) && Object.op_Implicit((Object)(object)damageReport.victimBody))
			{
				damageReport.victimBody.AddTimedBuff(Buffs.Slow80, 1f);
			}
			orig.Invoke(damageReport);
		}

		private void ChangeAimLayer(orig_UpdateAreaIndicator orig, ArrowRain self)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)self.areaIndicatorInstance))
			{
				float num = 1000f;
				RaycastHit val = default(RaycastHit);
				if (Physics.Raycast(((BaseState)self).GetAimRay(), ref val, num, LayerMask.op_Implicit(CommonMasks.bullet)))
				{
					self.areaIndicatorInstance.transform.position = ((RaycastHit)(ref val)).point;
					self.areaIndicatorInstance.transform.up = ((RaycastHit)(ref val)).normal;
				}
			}
		}
	}
}
namespace SurvivorsPlus.Engineer
{
	public class BetterFireBeam : BaseState
	{
		public GameObject effectPrefab;

		public GameObject hitEffectPrefab = EngineerChanges.hitEffect;

		public GameObject laserPrefab = EngineerChanges.laser;

		public string muzzleString = "Muzzle";

		public string attackSoundString = "";

		public float damageCoefficient = 2f;

		public float procCoefficient = 3f;

		public float force;

		public float minSpread;

		public float maxSpread;

		public int bulletCount = 1;

		public float fireFrequency = 5f;

		public float maxDistance = 50f;

		private float fireTimer;

		private Ray laserRay;

		private Transform modelTransform;

		private GameObject laserEffectInstance;

		private Transform laserEffectInstanceEndTransform;

		public int bulletCountCurrent = 1;

		public override void OnEnter()
		{
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			fireTimer = 0f;
			modelTransform = ((EntityState)this).GetModelTransform();
			if (!Object.op_Implicit((Object)(object)modelTransform))
			{
				return;
			}
			ChildLocator component = ((Component)modelTransform).GetComponent<ChildLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				return;
			}
			Transform val = component.FindChild(muzzleString);
			if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)laserPrefab))
			{
				if (((Component)val).transform.childCount > 0)
				{
					laserEffectInstance = ((Component)((Component)val).transform.GetChild(0)).gameObject;
					laserEffectInstanceEndTransform = laserEffectInstance.GetComponent<ChildLocator>().FindChild("LaserEnd");
				}
				if (!Object.op_Implicit((Object)(object)laserEffectInstance))
				{
					laserEffectInstance = Object.Instantiate<GameObject>(laserPrefab, val.position, val.rotation);
					laserEffectInstance.transform.parent = val;
					laserEffectInstanceEndTransform = laserEffectInstance.GetComponent<ChildLocator>().FindChild("LaserEnd");
				}
			}
		}

		public override void FixedUpdate()
		{
			//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_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).FixedUpdate();
			laserRay = GetLaserRay();
			fireTimer += Time.fixedDeltaTime;
			if ((double)fireTimer > (double)(1f / (fireFrequency * ((EntityState)this).characterBody.attackSpeed)))
			{
				FireBullet(modelTransform, laserRay, muzzleString);
				fireTimer = 0f;
			}
			if (Object.op_Implicit((Object)(object)laserEffectInstance) && Object.op_Implicit((Object)(object)laserEffectInstanceEndTransform))
			{
				laserEffectInstanceEndTransform.position = GetBeamEndPoint();
			}
			if (((EntityState)this).isAuthority && fireTimer == 0f)
			{
				((EntityState)this).outer.SetNextState(GetNextState());
			}
		}

		protected Vector3 GetBeamEndPoint()
		{
			//IL_000c: 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_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			Vector3 point = ((Ray)(ref laserRay)).GetPoint(maxDistance);
			GameObject gameObject = ((EntityState)this).gameObject;
			Ray val = laserRay;
			double num = maxDistance;
			LayerIndex val2 = LayerIndex.world;
			int num2 = LayerMask.op_Implicit(((LayerIndex)(ref val2)).mask);
			val2 = LayerIndex.entityPrecise;
			int num3 = LayerMask.op_Implicit(((LayerIndex)(ref val2)).mask);
			LayerMask val3 = LayerMask.op_Implicit(num2 | num3);
			RaycastHit val4 = default(RaycastHit);
			if (Util.CharacterRaycast(gameObject, val, ref val4, (float)num, val3, (QueryTriggerInteraction)0))
			{
				point = ((RaycastHit)(ref val4)).point;
			}
			return point;
		}

		protected virtual EntityState GetNextState()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return EntityStateCatalog.InstantiateState(((EntityState)this).outer.mainStateType);
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)1;
		}

		public virtual void ModifyBullet(BulletAttack bulletAttack)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			bulletAttack.damageType = (DamageType)(bulletAttack.damageType | 8);
		}

		public virtual bool ShouldFireLaser()
		{
			if (Object.op_Implicit((Object)(object)((EntityState)this).inputBank))
			{
				return ((EntityState)this).inputBank.skill1.down;
			}
			return false;
		}

		public virtual Ray GetLaserRay()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return ((BaseState)this).GetAimRay();
		}

		private void FireBullet(Transform modelTransform, Ray laserRay, string targetMuzzle)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected O, but got Unknown
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)effectPrefab))
			{
				EffectManager.SimpleMuzzleFlash(effectPrefab, ((EntityState)this).gameObject, targetMuzzle, false);
			}
			if (((EntityState)this).isAuthority)
			{
				BulletAttack val = new BulletAttack();
				val.owner = ((EntityState)this).gameObject;
				val.weapon = ((EntityState)this).gameObject;
				val.origin = ((Ray)(ref laserRay)).origin;
				val.aimVector = ((Ray)(ref laserRay)).direction;
				val.minSpread = minSpread;
				val.maxSpread = maxSpread;
				val.bulletCount = 1u;
				val.damage = damageCoefficient * base.damageStat / fireFrequency;
				val.procCoefficient = procCoefficient / fireFrequency;
				val.force = force;
				val.muzzleName = targetMuzzle;
				val.hitEffectPrefab = hitEffectPrefab;
				val.isCrit = Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master);
				val.HitEffectNormal = false;
				val.radius = 0f;
				val.maxDistance = maxDistance;
				ModifyBullet(val);
				val.Fire();
			}
		}
	}
	public class EngineerChanges
	{
		public static GameObject hitEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/Hitspark1.prefab").WaitForCompletion();

		public static GameObject laser = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/LaserEngiTurret.prefab").WaitForCompletion();

		private GameObject engi = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiBody.prefab").WaitForCompletion();

		private GameObject engiWalkerTurret = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiWalkerTurretBody.prefab").WaitForCompletion();

		private GameObject engiWalkerTurretMaster = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiWalkerTurretMaster.prefab").WaitForCompletion();

		public EngineerChanges()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			//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_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e3: Expected O, but got Unknown
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f4: Expected O, but got Unknown
			bool flag = default(bool);
			ContentAddition.AddEntityState<BetterFireBeam>(ref flag);
			SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Engi/EntityStates.EngiTurret.EngiTurretWeapon.FireBeam.asset", "maxDistance", "50");
			SkillLocator component = engi.GetComponent<SkillLocator>();
			SkillDef skillDef = component.primary.skillFamily.variants[0].skillDef;
			skillDef.skillDescriptionToken = "Fire <style=cIsDamage>3</style> grenades that deal <style=cIsDamage>100% damage</style> each.";
			skillDef.activationState = new SerializableEntityStateType(typeof(FireGrenades));
			SkillDef skillDef2 = component.secondary.skillFamily.variants[0].skillDef;
			skillDef2.skillDescriptionToken = "Place a large blast radius mine that deals <style=cIsDamage>deal 600% damage</style> each. Can place up to 4.";
			skillDef2.baseRechargeInterval = 5f;
			engiWalkerTurret.AddComponent<TurretBeamRemover>();
			engiWalkerTurret.GetComponent<SkillLocator>().primary.skillFamily.variants[0].skillDef.activationState = new SerializableEntityStateType(typeof(BetterFireBeam));
			AISkillDriver[] array = (from x in engiWalkerTurretMaster.GetComponents<AISkillDriver>()
				where x.customName.Contains("ReturnToLeader")
				select x).ToArray();
			foreach (AISkillDriver val in array)
			{
				if (val.maxDistance == 110f)
				{
					val.maxDistance = 55f;
					val.shouldSprint = true;
				}
			}
			AISkillDriver obj = (from x in engiWalkerTurretMaster.GetComponents<AISkillDriver>()
				where x.customName.Contains("ChaseAndFireAtEnemy")
				select x).First();
			obj.maxDistance = 50f;
			obj.shouldSprint = true;
			BaseMineArmingState.OnEnter += new hook_OnEnter(BaseMineArmingState_OnEnter);
			FireGrenades.OnEnter += new hook_OnEnter(FireGrenades_OnEnter);
		}

		private void BaseMineArmingState_OnEnter(orig_OnEnter orig, BaseMineArmingState self)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			orig.Invoke(self);
			if (self is MineArmingFull)
			{
				self.damageScale = 2f;
			}
			if (self is MineArmingWeak)
			{
				((EntityState)self).outer.SetState((EntityState)new MineArmingFull());
			}
		}

		private void FireGrenades_OnEnter(orig_OnEnter orig, FireGrenades self)
		{
			FireGrenades.baseDuration = 1f;
			self.grenadeCountMax = 3;
			orig.Invoke(self);
		}
	}
	public class TurretBeamRemover : MonoBehaviour
	{
		private GameObject muzzle;

		private InputBankTest inputBank;

		private void Start()
		{
			muzzle = ((Component)((Component)((Component)this).GetComponent<CharacterBody>().modelLocator.modelTransform).GetComponent<ChildLocator>().FindChild("Muzzle")).gameObject;
			inputBank = ((Component)this).GetComponent<CharacterBody>().inputBank;
		}

		private void FixedUpdate()
		{
			if (muzzle.transform.childCount > 0 && !inputBank.skill1.down)
			{
				Object.Destroy((Object)(object)((Component)muzzle.transform.GetChild(0)).gameObject);
			}
		}
	}
}
namespace SurvivorsPlus.Commando
{
	public class BetterSuppressiveFire : BaseState
	{
		public static GameObject effectPrefab = FireBarrage.effectPrefab;

		public static GameObject hitEffectPrefab = FireBarrage.hitEffectPrefab;

		public static GameObject tracerEffectPrefab = FireBarrage.tracerEffectPrefab;

		public static float damageCoefficient = 2f;

		public static float force = FireSweepBarrage.force;

		public static float minSpread = FireBarrage.minSpread;

		public static float maxSpread = FireBarrage.maxSpread;

		public static float baseDurationBetweenShots = 1f;

		public static float totalDuration = 2f;

		public static float bulletRadius = 1.5f;

		public static int baseBulletCount = FireBarrage.baseBulletCount;

		public static string fireBarrageSoundString = FireBarrage.fireBarrageSoundString;

		public static float recoilAmplitude = FireBarrage.recoilAmplitude;

		public static float spreadBloomValue = FireBarrage.spreadBloomValue;

		private int totalBulletsFired;

		private int bulletCount;

		public float stopwatchBetweenShots;

		private Animator modelAnimator;

		private Transform modelTransform;

		private float duration;

		private float durationBetweenShots;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			((EntityState)this).characterBody.SetSpreadBloom(0.2f, false);
			durationBetweenShots = FireBarrage.baseDurationBetweenShots / base.attackSpeedStat;
			bulletCount = (int)((double)FireBarrage.baseBulletCount * (double)base.attackSpeedStat);
			duration = durationBetweenShots * (float)bulletCount;
			modelAnimator = ((EntityState)this).GetModelAnimator();
			modelTransform = ((EntityState)this).GetModelTransform();
			((EntityState)this).PlayCrossfade("Gesture, Additive", "FireBarrage", "FireBarrage.playbackRate", duration, 0.2f);
			((EntityState)this).PlayCrossfade("Gesture, Override", "FireBarrage", "FireBarrage.playbackRate", duration, 0.2f);
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
			{
				((EntityState)this).characterBody.SetAimTimer(2f);
			}
			FireBullet();
		}

		private void FireBullet()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//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_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: 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_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: 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_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			Ray aimRay = ((BaseState)this).GetAimRay();
			string text = "MuzzleRight";
			if (Object.op_Implicit((Object)(object)modelAnimator))
			{
				if (Object.op_Implicit((Object)(object)effectPrefab))
				{
					EffectManager.SimpleMuzzleFlash(effectPrefab, ((EntityState)this).gameObject, text, false);
				}
				((EntityState)this).PlayAnimation("Gesture Additive, Right", "FirePistol, Right");
			}
			((BaseState)this).AddRecoil(-0.8f * recoilAmplitude, -1f * recoilAmplitude, -0.1f * recoilAmplitude, 0.15f * recoilAmplitude);
			if (((EntityState)this).isAuthority)
			{
				new BulletAttack
				{
					owner = ((EntityState)this).gameObject,
					weapon = ((EntityState)this).gameObject,
					origin = ((Ray)(ref aimRay)).origin,
					aimVector = ((Ray)(ref aimRay)).direction,
					minSpread = minSpread,
					maxSpread = maxSpread,
					bulletCount = 1u,
					falloffModel = (FalloffModel)0,
					damage = damageCoefficient * base.damageStat,
					force = force,
					tracerEffectPrefab = tracerEffectPrefab,
					muzzleName = text,
					hitEffectPrefab = hitEffectPrefab,
					isCrit = Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master),
					radius = bulletRadius,
					smartCollision = true,
					damageType = (DamageType)0,
					procCoefficient = 2f
				}.Fire();
			}
			((EntityState)this).characterBody.AddSpreadBloom(spreadBloomValue);
			totalBulletsFired++;
			Util.PlaySound(fireBarrageSoundString, ((EntityState)this).gameObject);
		}

		public override void OnExit()
		{
			((EntityState)this).OnExit();
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			stopwatchBetweenShots += Time.fixedDeltaTime;
			if ((double)stopwatchBetweenShots >= (double)durationBetweenShots && totalBulletsFired < bulletCount)
			{
				stopwatchBetweenShots -= durationBetweenShots;
				FireBullet();
			}
			if (totalBulletsFired == bulletCount && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)1;
		}
	}
	public class CommandoChanges
	{
		private GameObject commando = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/CommandoBody.prefab").WaitForCompletion();

		public CommandoChanges()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Expected O, but got Unknown
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Expected O, but got Unknown
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Expected O, but got Unknown
			SkillLocator component = commando.GetComponent<SkillLocator>();
			component.secondary.skillFamily.variants[1].skillDef.skillDescriptionToken = "Fire two close-range blasts that deal <style=cIsDamage>12x200% damage</style> total.";
			component.secondary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Fire a <style=cIsUtility>piercing</style> bullet for <style=cIsDamage>400% damage</style>. Deals <style=cIsDamage>40%</style> more damage every time it passes through an enemy.";
			SkillDef skillDef = component.utility.skillFamily.variants[0].skillDef;
			skillDef.cancelSprintingOnActivation = false;
			skillDef.skillDescriptionToken = "<style=cIsUtility>Roll</style> forward a short distance. You are <style=cIsDamage>invincible</style> during the roll.";
			SkillDef skillDef2 = component.special.skillFamily.variants[0].skillDef;
			skillDef2.skillDescriptionToken = "Fire a barrage of high impact rounds that deal <style=cIsDamage>200% damage</style> with <style=cIsUtility>double the proc coefficient</style>.";
			skillDef2.activationState = new SerializableEntityStateType(typeof(BetterSuppressiveFire));
			skillDef2.baseRechargeInterval = 6f;
			GenericProjectileBaseState.OnEnter += new hook_OnEnter(AlterFMJ);
			DodgeState.OnEnter += new hook_OnEnter(AddInvincibility);
			DodgeState.OnExit += new hook_OnExit(RemoveInvincibility);
		}

		private void AlterFMJ(orig_OnEnter orig, GenericProjectileBaseState self)
		{
			if (self is FireFMJ)
			{
				self.damageCoefficient = 4f;
			}
			orig.Invoke(self);
		}

		private void AddInvincibility(orig_OnEnter orig, DodgeState self)
		{
			self.initialSpeedCoefficient = 4f;
			self.finalSpeedCoefficient = 2f;
			((EntityState)self).characterBody.AddBuff(Buffs.HiddenInvincibility);
			orig.Invoke(self);
		}

		private void RemoveInvincibility(orig_OnExit orig, DodgeState self)
		{
			orig.Invoke(self);
			((EntityState)self).characterBody.RemoveBuff(Buffs.HiddenInvincibility);
		}
	}
}
namespace SurvivorsPlus.Captain
{
	public class CaptainChanges
	{
		private GameObject captain = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Captain/CaptainBody.prefab").WaitForCompletion();

		public CaptainChanges()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			captain.GetComponent<SkillLocator>().primary.skillFamily.variants[0].skillDef.activationState = new SerializableEntityStateType(typeof(FireCaptainShotgun));
			DefenseMatrixOn.DeleteNearbyProjectile += new hook_DeleteNearbyProjectile(MicrobotEdit);
		}

		private void FamilyChanges()
		{
			SkillLocator component = captain.GetComponent<SkillLocator>();
			GenericSkill val = captain.AddComponent<GenericSkill>();
			val.skillName = "captainPrimary";
			SkillFamily val2 = ScriptableObject.CreateInstance<SkillFamily>();
			((Object)val2).name = "captainPrimaryFamily";
			val._skillFamily = val2;
			ContentAddition.AddSkillFamily(val2);
			component.primary = val;
			GenericSkill val3 = captain.AddComponent<GenericSkill>();
			val.skillName = "captainSecondary";
			SkillFamily val4 = ScriptableObject.CreateInstance<SkillFamily>();
			((Object)val4).name = "captainSecondaryFamily";
			val3._skillFamily = val4;
			ContentAddition.AddSkillFamily(val4);
			component.secondary = val3;
			GenericSkill val5 = captain.AddComponent<GenericSkill>();
			val5.skillName = "captainUtility";
			component.utility = val5;
			GenericSkill val6 = captain.AddComponent<GenericSkill>();
			val6.skillName = "captainSpecial";
			component.special = val6;
		}

		private bool MicrobotEdit(orig_DeleteNearbyProjectile orig, DefenseMatrixOn self)
		{
			//IL_001a: 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_001f: 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_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: 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_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Expected O, but got Unknown
			Vector3 val = (Object.op_Implicit((Object)(object)((BaseBodyAttachmentState)self).attachedBody) ? ((BaseBodyAttachmentState)self).attachedBody.corePosition : Vector3.zero);
			TeamIndex val2 = (TeamIndex)((!Object.op_Implicit((Object)(object)((BaseBodyAttachmentState)self).attachedBody)) ? (-1) : ((int)((BaseBodyAttachmentState)self).attachedBody.teamComponent.teamIndex));
			float num = DefenseMatrixOn.projectileEraserRadius * DefenseMatrixOn.projectileEraserRadius;
			int num2 = 0;
			int itemStack = self.GetItemStack();
			bool result = false;
			List<ProjectileController> instancesList = InstanceTracker.GetInstancesList<ProjectileController>();
			List<ProjectileController> list = new List<ProjectileController>();
			int i = 0;
			for (int count = instancesList.Count; i < count; i++)
			{
				if (num2 >= itemStack)
				{
					break;
				}
				ProjectileController val3 = instancesList[i];
				if (val3.cannotBeDeleted || val3.teamFilter.teamIndex == val2)
				{
					continue;
				}
				Vector3 val4 = ((Component)val3).transform.position - val;
				if (((Vector3)(ref val4)).sqrMagnitude < num)
				{
					bool flag = true;
					ProjectileSimple component = ((Component)val3).gameObject.GetComponent<ProjectileSimple>();
					ProjectileCharacterController component2 = ((Component)val3).gameObject.GetComponent<ProjectileCharacterController>();
					if ((!Object.op_Implicit((Object)(object)component) || (Object.op_Implicit((Object)(object)component) && component.desiredForwardSpeed == 0f)) && !Object.op_Implicit((Object)(object)component2))
					{
						flag = false;
					}
					if (flag)
					{
						list.Add(val3);
						num2++;
					}
				}
			}
			int j = 0;
			for (int count2 = list.Count; j < count2; j++)
			{
				ProjectileController val5 = list[j];
				if (Object.op_Implicit((Object)(object)val5))
				{
					result = true;
					Vector3 position = ((Component)val5).transform.position;
					Vector3 start = val;
					if (Object.op_Implicit((Object)(object)DefenseMatrixOn.tracerEffectPrefab))
					{
						EffectData val6 = new EffectData
						{
							origin = position,
							start = start
						};
						EffectManager.SpawnEffect(DefenseMatrixOn.tracerEffectPrefab, val6, true);
					}
					EntityState.Destroy((Object)(object)((Component)val5).gameObject);
				}
			}
			return result;
		}
	}
}
namespace SurvivorsPlus.Bandit
{
	public class BanditChanges
	{
		public ModdedDamageType banditOpenWound;

		public ModdedDamageType banditDoubleHemorrhage;

		private GameObject lightsOutEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/Bandit2ResetEffect.prefab").WaitForCompletion();

		private GameObject bandit = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/Bandit2Body.prefab").WaitForCompletion();

		private Material bloodMat = Addressables.LoadAssetAsync<Material>((object)"RoR2/Base/Common/VFX/matBloodHumanLarge.mat").WaitForCompletion();

		private DotIndex emptyDotIdx;

		public BanditChanges()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Expected O, but got Unknown
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Expected O, but got Unknown
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Expected O, but got Unknown
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Expected O, but got Unknown
			//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Expected O, but got Unknown
			//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cd: Expected O, but got Unknown
			((Renderer)((Component)lightsOutEffect.transform.GetChild(0)).GetComponent<ParticleSystemRenderer>()).sharedMaterial = bloodMat;
			((Renderer)((Component)lightsOutEffect.transform.GetChild(1)).GetComponent<ParticleSystemRenderer>()).sharedMaterial = bloodMat;
			((Renderer)((Component)lightsOutEffect.transform.GetChild(2)).GetComponent<ParticleSystemRenderer>()).sharedMaterial = bloodMat;
			SkillLocator component = bandit.GetComponent<SkillLocator>();
			component.utility.skillFamily.variants[0].skillDef.beginSkillCooldownOnSkillEnd = true;
			component.secondary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Lunge and slash for <style=cIsDamage>360% damage</style>. Critical Strikes also cause <style=cIsHealth>2 Hemorrhage stacks</style>.";
			SkillDef skillDef = component.special.skillFamily.variants[0].skillDef;
			skillDef.skillNameToken = "Open Wound";
			skillDef.skillDescriptionToken = "<style=cIsDamage>Slayer</style>. Fire a revolver shot for <style=cIsDamage>600% damage</style>. Clears all stacks of <style=cIsHealth>Hemorrhage, dealing remaining damage immediately</style>.";
			skillDef.baseRechargeInterval = 6f;
			banditDoubleHemorrhage = DamageAPI.ReserveDamageType();
			banditOpenWound = DamageAPI.ReserveDamageType();
			CustomDotBehaviour val = new CustomDotBehaviour(OpenWoundBehavior);
			emptyDotIdx = DotAPI.RegisterDotDef(0f, 0f, (DamageColorIndex)0, (BuffDef)null, val, (CustomDotVisual)null);
			HealthComponent.SendDamageDealt += new hook_SendDamageDealt(ApplyNewDamageTypes);
			FireShotgun2.FireBullet += new hook_FireBullet(ModifyFire);
			SlashBlade.AuthorityModifyOverlapAttack += new hook_AuthorityModifyOverlapAttack(IncreaseHemorrhageStacks);
			Bandit2FirePrimaryBase.OnEnter += new hook_OnEnter(ReduceRecoil);
			FireSidearmResetRevolver.ModifyBullet += new hook_ModifyBullet(AddOpenWound);
		}

		private void AddOpenWound(orig_ModifyBullet orig, FireSidearmResetRevolver self, BulletAttack bulletAttack)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			DamageAPI.AddModdedDamageType(bulletAttack, banditOpenWound);
			orig.Invoke(self, bulletAttack);
		}

		private void OpenWoundBehavior(DotController self, DotStack dotStack)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Invalid comparison between Unknown and I4
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Expected O, but got Unknown
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: 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_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: 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_015e: Expected O, but got Unknown
			if (dotStack.dotIndex != emptyDotIdx || !Object.op_Implicit((Object)(object)self.victimBody) || !Object.op_Implicit((Object)(object)self.victimBody.healthComponent))
			{
				return;
			}
			int i = 0;
			int count = self.dotStackList.Count;
			float num = 0f;
			for (; i < count; i++)
			{
				if ((int)self.dotStackList[i].dotIndex == 6)
				{
					float num2 = self.dotStackList[i].timer / 0.25f;
					float damage = self.dotStackList[i].damage;
					num += damage * num2;
					self.dotStackList[i].timer = 0f;
				}
			}
			if (num > 0f)
			{
				DamageInfo val = new DamageInfo();
				val.damage = num;
				val.position = self.victimBody.corePosition;
				val.force = Vector3.zero;
				val.crit = false;
				val.procChainMask = default(ProcChainMask);
				val.procCoefficient = 1f;
				val.damageColorIndex = (DamageColorIndex)8;
				val.damageType = (DamageType)0;
				self.victimBody.healthComponent.TakeDamage(val);
				EffectManager.SpawnEffect(lightsOutEffect, new EffectData
				{
					origin = self.victimBody.corePosition,
					scale = self.victimBody.radius
				}, true);
			}
		}

		private void ModifyFire(orig_FireBullet orig, FireShotgun2 self, Ray aimRay)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: 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_00b9: 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_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: 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)
			((BaseState)self).StartAimMode(aimRay, 3f, false);
			((GenericBulletBaseState)self).DoFireEffects();
			((GenericBulletBaseState)self).PlayFireAnimation();
			((BaseState)self).AddRecoil(-1f * ((GenericBulletBaseState)self).recoilAmplitudeY, -1.5f * ((GenericBulletBaseState)self).recoilAmplitudeY, -1f * ((GenericBulletBaseState)self).recoilAmplitudeX, 1f * ((GenericBulletBaseState)self).recoilAmplitudeX);
			if (((EntityState)self).isAuthority)
			{
				Vector3 val = Vector3.Cross(((Ray)(ref aimRay)).direction, Vector3.up);
				float num = 5f;
				Ray val5 = default(Ray);
				for (int i = 0; i < ((GenericBulletBaseState)self).bulletCount; i++)
				{
					float num2 = Random.Range((0f - num) / 2f, num / 2f);
					float num3 = Random.Range((0f - num) / 2f, num / 2f);
					Quaternion val2 = Quaternion.AngleAxis(num2, Vector3.up);
					Quaternion val3 = Quaternion.AngleAxis(num3, val);
					Vector3 val4 = val2 * val3 * ((Ray)(ref aimRay)).direction;
					((Ray)(ref val5))..ctor(((Ray)(ref aimRay)).origin, val4);
					BulletAttack val6 = ((GenericBulletBaseState)self).GenerateBulletAttack(val5);
					((GenericBulletBaseState)self).ModifyBullet(val6);
					val6.Fire();
				}
			}
		}

		private void IncreaseHemorrhageStacks(orig_AuthorityModifyOverlapAttack orig, SlashBlade self, OverlapAttack overlapAttack)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			DamageAPI.AddModdedDamageType(overlapAttack, banditDoubleHemorrhage);
			orig.Invoke(self, overlapAttack);
		}

		private void ApplyNewDamageTypes(orig_SendDamageDealt orig, DamageReport damageReport)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			if (DamageAPI.HasModdedDamageType(damageReport.damageInfo, banditOpenWound) && Object.op_Implicit((Object)(object)damageReport.victimBody))
			{
				DotController.InflictDot(((Component)damageReport.victimBody).gameObject, damageReport.attacker, emptyDotIdx, 0f, 1f, (uint?)null);
			}
			if (DamageAPI.HasModdedDamageType(damageReport.damageInfo, banditDoubleHemorrhage) && damageReport.damageInfo.crit && Object.op_Implicit((Object)(object)damageReport.victimBody))
			{
				DotController.InflictDot(((Component)damageReport.victimBody).gameObject, damageReport.attacker, (DotIndex)6, 8f, 1f, (uint?)null);
			}
			orig.Invoke(damageReport);
		}

		private void ReduceRecoil(orig_OnEnter orig, Bandit2FirePrimaryBase self)
		{
			if (self is Bandit2FireRifle)
			{
				((GenericBulletBaseState)self).spreadBloomValue = 0.65f;
				((GenericBulletBaseState)self).spreadYawScale = 0.25f;
				((GenericBulletBaseState)self).spreadPitchScale = 0.3f;
			}
			orig.Invoke(self);
		}
	}
}