Decompiled source of Alien Hominid v1.2.3

plugins/AliemMod.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using Aetherium.Items;
using AliemMod.Components;
using AliemMod.Components.Bundled;
using AliemMod.Content;
using AliemMod.Content.Achievements;
using AliemMod.Content.Orbs;
using AliemMod.Content.SkillDefs;
using AliemMod.Content.Survivors;
using AliemMod.Modules;
using AliemMod.Modules.Characters;
using AncientScepter;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EmotesAPI;
using EntityStates;
using EntityStates.AI.Walker;
using EntityStates.Commando.CommandoWeapon;
using EntityStates.Croco;
using EntityStates.GlobalSkills.LunarNeedle;
using EntityStates.Treebot;
using HG;
using HG.BlendableTypes;
using IL.RoR2;
using IL.RoR2.Orbs;
using JetBrains.Annotations;
using KinematicCharacterController;
using ModdedEntityStates.Aliem;
using ModdedEntityStates.Aliem.AI;
using Modules;
using Modules.Achievements;
using Modules.Survivors;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.RoR2;
using On.RoR2.SurvivorMannequins;
using R2API;
using R2API.Utils;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Achievements;
using RoR2.Audio;
using RoR2.CharacterAI;
using RoR2.ContentManagement;
using RoR2.Orbs;
using RoR2.Projectile;
using RoR2.Skills;
using RoR2.SurvivorMannequins;
using ShaderSwapper;
using TILER2;
using ThinkInvisible.TinkersSatchel;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("AliemMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+1bbf8a7cc5ab9a6b3cb21e28886374e70d34fb19")]
[assembly: AssemblyProduct("AliemMod")]
[assembly: AssemblyTitle("AliemMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.TheTimeSweeper.Aliem", "Aliem", "1.2.2")]
public class AliemPlugin : BaseUnityPlugin
{
	public const string MODUID = "com.TheTimeSweeper.Aliem";

	public const string MODNAME = "Aliem";

	public const string MODVERSION = "1.2.2";

	public const string DEV_PREFIX = "HABIBI";

	public static AliemPlugin instance;

	public static ManualLogSource Log;

	private void Start()
	{
		((BaseUnityPlugin)this).Logger.LogInfo((object)"[Initializing Aliem]");
		instance = this;
		Log = ((BaseUnityPlugin)this).Logger;
		Config.MyConfig = ((BaseUnityPlugin)this).Config;
		DamageTypes.RegisterDamageTypes();
		AliemConfig.ReadConfig();
		if (AliemConfig.Debug.Value)
		{
			((Component)this).gameObject.AddComponent<TestValueManager>();
		}
		AliemAssets.Initialize();
		Projectiles.Init();
		States.Init();
		Compat.Initialize();
		Tokens.AddTokens();
		Language.Init();
		Language.PrintOutput("aliem.txt");
		ItemDisplays.PopulateDisplays();
		Buffs.RegisterBuffs();
		Dots.RegisterDots();
		new ContentPacks().Initialize();
		new AliemSurvivor().Initialize();
		new AliemPoolManager(((Component)this).transform);
		((BaseUnityPlugin)this).Logger.LogInfo((object)"[Initialized]");
	}
}
public class TestValueManager : MonoBehaviour
{
	private float _tim;

	private float _holdTime = 0.4f;

	public static float value1 = -60f;

	public static float value2 = 25f;

	private bool _testingEnabled => false;

	private void Update()
	{
		if (_testingEnabled && Input.GetKey((KeyCode)308))
		{
			manageTestValue(ref value1, "pitch", (KeyCode)263, (KeyCode)260, 10f);
			manageTestValue(ref value2, "forwardSpeed", (KeyCode)264, (KeyCode)261, 1f);
		}
	}

	private void manageTestValue(ref float value, string valueName, KeyCode upKey, KeyCode downKey, float incrementAmount)
	{
		//IL_0001: 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_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_003e: 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_004f: 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)
		if (Input.GetKeyDown(upKey))
		{
			value = setTestValue(value + incrementAmount, valueName);
		}
		if (Input.GetKeyDown(downKey))
		{
			value = setTestValue(value - incrementAmount, valueName);
		}
		if (Input.GetKey(upKey) || Input.GetKey(downKey))
		{
			float num = incrementAmount * (float)(Input.GetKey(upKey) ? 1 : (-1));
			_tim += Time.deltaTime;
			if (_tim > _holdTime)
			{
				_tim = _holdTime - 0.02f;
				value = setTestValue(value + num, valueName);
			}
		}
		if (Input.GetKeyUp(upKey) || Input.GetKeyUp(downKey))
		{
			_tim = 0f;
		}
	}

	private float setTestValue(float value, string print)
	{
		Helpers.LogWarning(print + ": " + value.ToString("0.000"));
		return value;
	}
}
internal static class Helpers
{
	public const string agilePrefix = "<style=cIsUtility>Agile.</style> ";

	public static bool verbose;

	public static string DamageText(string text)
	{
		return "<style=cIsDamage>" + text + "</style>";
	}

	public static string DamageValueText(float value)
	{
		return $"<style=cIsDamage>{value * 100f}% damage</style>";
	}

	public static string DamageRangeText(float value1, float value2)
	{
		return $"<style=cIsDamage>{value1 * 100f}%-{value2 * 100f}% damage</style>";
	}

	public static string UtilityText(string text)
	{
		return "<style=cIsUtility>" + text + "</style>";
	}

	public static string RedText(string text)
	{
		return HealthText(text);
	}

	public static string HealthText(string text)
	{
		return "<style=cIsHealth>" + text + "</style>";
	}

	internal static string KeywordText(string keyword, string sub)
	{
		return "<style=cKeywordName>" + keyword + "</style><style=cSub>" + sub + "</style>";
	}

	public static string ScepterDescription(string desc)
	{
		return "\n<color=#d299ff>SCEPTER: " + desc + "</color>";
	}

	public static T[] Append<T>(ref T[] array, List<T> list)
	{
		int num = array.Length;
		int count = list.Count;
		Array.Resize(ref array, num + count);
		list.CopyTo(array, num);
		return array;
	}

	public static Func<T[], T[]> AppendDel<T>(List<T> list)
	{
		return (T[] r) => Append(ref r, list);
	}

	public static void LogVerbose(object message, bool chat = false)
	{
		if (AliemConfig.Debug.Value && verbose)
		{
			AliemPlugin.Log.LogMessage(message);
			if (chat)
			{
				Chat.AddMessage(message.ToString());
			}
		}
	}

	public static void LogWarning(object message, bool chat = false)
	{
		if (AliemConfig.Debug.Value)
		{
			AliemPlugin.Log.LogWarning(message);
			if (chat)
			{
				Chat.AddMessage(message.ToString());
			}
		}
	}

	public static List<TeamComponent> GatherEnemies(TeamIndex allyIndex, params TeamIndex[] ignore)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Invalid comparison between Unknown and I4
		//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_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: 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)
		List<TeamComponent> list = new List<TeamComponent>();
		bool flag = (int)FriendlyFireManager.friendlyFireMode > 0;
		IEnumerable<TeamIndex> enumerable = ((TeamIndex[])Enum.GetValues(typeof(TeamIndex))).Except(ignore);
		foreach (TeamIndex item in enumerable)
		{
			if (flag || allyIndex != item)
			{
				list.AddRange(TeamComponent.GetTeamMembers(item));
			}
		}
		return list;
	}
}
public static class ArrayHelper
{
	public static T[] Append<T>(ref T[] array, List<T> list)
	{
		int num = array.Length;
		int count = list.Count;
		Array.Resize(ref array, num + count);
		list.CopyTo(array, num);
		return array;
	}

	public static Func<T[], T[]> AppendDel<T>(List<T> list)
	{
		return (T[] r) => Append(ref r, list);
	}
}
internal class SkillDefInfo
{
	public string skillName;

	public string skillNameToken;

	public string skillDescriptionToken;

	public string[] keywordTokens = new string[0];

	public Sprite skillIcon;

	public SerializableEntityStateType activationState;

	public InterruptPriority interruptPriority;

	public string activationStateMachineName;

	public int baseMaxStock = 1;

	public float baseRechargeInterval;

	public int rechargeStock = 1;

	public int requiredStock = 1;

	public int stockToConsume = 1;

	public bool resetCooldownTimerOnUse = false;

	public bool fullRestockOnAssign = true;

	public bool dontAllowPastMaxStocks = false;

	public bool beginSkillCooldownOnSkillEnd = false;

	public bool mustKeyPress = false;

	public bool isCombatSkill = true;

	public bool canceledFromSprinting = false;

	public bool cancelSprintingOnActivation = true;

	public bool forceSprintDuringState = false;

	public SkillDefInfo()
	{
	}

	public SkillDefInfo(string skillName, string skillNameToken, string skillDescriptionToken, Sprite skillIcon, SerializableEntityStateType activationState, string activationStateMachineName, InterruptPriority interruptPriority, bool isCombatSkill, float baseRechargeInterval)
	{
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Unknown result type (might be due to invalid IL or missing references)
		this.skillName = skillName;
		this.skillNameToken = skillNameToken;
		this.skillDescriptionToken = skillDescriptionToken;
		this.skillIcon = skillIcon;
		this.activationState = activationState;
		this.activationStateMachineName = activationStateMachineName;
		this.interruptPriority = interruptPriority;
		this.isCombatSkill = isCombatSkill;
		this.baseRechargeInterval = baseRechargeInterval;
	}

	public SkillDefInfo(string skillName, string skillNameToken, string skillDescriptionToken, Sprite skillIcon, SerializableEntityStateType activationState, string activationStateMachineName = "Weapon", bool agile = false)
	{
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: 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)
		this.skillName = skillName;
		this.skillNameToken = skillNameToken;
		this.skillDescriptionToken = skillDescriptionToken;
		this.skillIcon = skillIcon;
		this.activationState = activationState;
		this.activationStateMachineName = activationStateMachineName;
		interruptPriority = (InterruptPriority)0;
		isCombatSkill = true;
		baseRechargeInterval = 0f;
		requiredStock = 0;
		stockToConsume = 0;
		cancelSprintingOnActivation = !agile;
		if (agile)
		{
			keywordTokens = new string[1] { "KEYWORD_AGILE" };
		}
	}
}
namespace Modules
{
	public class MemeCompat
	{
		public static void init()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			SurvivorCatalog.Init += new hook_Init(SurvivorCatalog_Init);
		}

		private static void SurvivorCatalog_Init(orig_Init orig)
		{
			GameObject val = AliemAssets.LoadAsset<GameObject>("Aliem_Meme");
			CustomEmotesAPI.ImportArmature(AliemSurvivor.instance.bodyPrefab, val, false, 0, true);
			orig.Invoke();
		}
	}
}
namespace Modules.Survivors
{
	public abstract class SurvivorBase : CharacterBase
	{
		public abstract string survivorTokenPrefix { get; }

		public abstract UnlockableDef characterUnlockableDef { get; }

		public virtual ConfigEntry<bool> characterEnabledConfig { get; }

		public virtual GameObject displayPrefab { get; set; }

		public override void InitializeCharacter()
		{
			if (characterEnabledConfig == null || characterEnabledConfig.Value)
			{
				InitializeUnlockables();
				base.InitializeCharacter();
				InitializeAI();
				InitializeSurvivor();
			}
		}

		protected override void InitializeCharacterBodyAndModel()
		{
			base.InitializeCharacterBodyAndModel();
			InitializeDisplayPrefab();
		}

		protected virtual void InitializeDisplayPrefab()
		{
			displayPrefab = Prefabs.CreateDisplayPrefab(bodyName + "Display", bodyPrefab, bodyInfo);
		}

		public virtual void InitializeUnlockables()
		{
		}

		public virtual void InitializeAI()
		{
			Prefabs.CreateGenericDoppelganger(bodyPrefab, bodyName + "MonsterMaster", "Merc");
		}

		protected virtual void InitializeSurvivor()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			RegisterNewSurvivor(bodyPrefab, displayPrefab, Color.grey, survivorTokenPrefix, characterUnlockableDef, bodyInfo.sortPosition);
		}

		public static void RegisterNewSurvivor(GameObject bodyPrefab, GameObject displayPrefab, Color charColor, string tokenPrefix)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			RegisterNewSurvivor(bodyPrefab, displayPrefab, charColor, tokenPrefix, null, 100f);
		}

		public static void RegisterNewSurvivor(GameObject bodyPrefab, GameObject displayPrefab, Color charColor, string tokenPrefix, float sortPosition)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			RegisterNewSurvivor(bodyPrefab, displayPrefab, charColor, tokenPrefix, null, sortPosition);
		}

		public static void RegisterNewSurvivor(GameObject bodyPrefab, GameObject displayPrefab, Color charColor, string tokenPrefix, UnlockableDef unlockableDef)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			RegisterNewSurvivor(bodyPrefab, displayPrefab, charColor, tokenPrefix, unlockableDef, 100f);
		}

		public static void RegisterNewSurvivor(GameObject bodyPrefab, GameObject displayPrefab, Color charColor, string tokenPrefix, UnlockableDef unlockableDef, float sortPosition)
		{
			//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)
			SurvivorDef val = ScriptableObject.CreateInstance<SurvivorDef>();
			val.bodyPrefab = bodyPrefab;
			val.displayPrefab = displayPrefab;
			val.primaryColor = charColor;
			val.cachedName = ((Object)bodyPrefab).name.Replace("Body", "");
			val.displayNameToken = tokenPrefix + "NAME";
			val.descriptionToken = tokenPrefix + "DESCRIPTION";
			val.outroFlavorToken = tokenPrefix + "OUTRO_FLAVOR";
			val.mainEndingEscapeFailureFlavorToken = tokenPrefix + "OUTRO_FAILURE";
			val.desiredSortPosition = sortPosition;
			val.unlockableDef = unlockableDef;
			Content.AddSurvivorDef(val);
		}

		protected virtual void AddCssPreviewSkill(int indexFromEditor, SkillFamily skillFamily, SkillDef skillDef)
		{
			CharacterSelectSurvivorPreviewDisplayController component = displayPrefab.GetComponent<CharacterSelectSurvivorPreviewDisplayController>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				Debug.LogError((object)"trying to add skillChangeResponse to null CharacterSelectSurvivorPreviewDisplayController.\nMake sure you created a CharacterSelectSurvivorPreviewDisplayController on your Display prefab in editor");
				return;
			}
			component.skillChangeResponses[indexFromEditor].triggerSkillFamily = skillFamily;
			component.skillChangeResponses[indexFromEditor].triggerSkill = skillDef;
		}

		protected virtual void AddCssPreviewSkin(int indexFromEditor, SkinDef skinDef)
		{
			CharacterSelectSurvivorPreviewDisplayController component = displayPrefab.GetComponent<CharacterSelectSurvivorPreviewDisplayController>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				Debug.LogError((object)"trying to add skinChangeResponse to null CharacterSelectSurvivorPreviewDisplayController.\nMake sure you created a CharacterSelectSurvivorPreviewDisplayController on your Display prefab in editor");
			}
			else
			{
				component.skinChangeResponses[indexFromEditor].triggerSkin = skinDef;
			}
		}

		protected virtual void FinalizeCSSPreviewDisplayController()
		{
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)displayPrefab))
			{
				return;
			}
			CharacterSelectSurvivorPreviewDisplayController component = displayPrefab.GetComponent<CharacterSelectSurvivorPreviewDisplayController>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				return;
			}
			component.bodyPrefab = bodyPrefab;
			List<SkillChangeResponse> list = new List<SkillChangeResponse>();
			for (int i = 0; i < component.skillChangeResponses.Length; i++)
			{
				if ((Object)(object)component.skillChangeResponses[i].triggerSkillFamily != (Object)null)
				{
					list.Add(component.skillChangeResponses[i]);
				}
			}
			component.skillChangeResponses = list.ToArray();
		}
	}
}
namespace Modules.Achievements
{
	public abstract class BaseMasteryAchievement : BaseAchievement
	{
		public abstract string RequiredCharacterBody { get; }

		public abstract float RequiredDifficultyCoefficient { get; }

		public override BodyIndex LookUpRequiredBodyIndex()
		{
			//IL_0007: 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_000f: Unknown result type (might be due to invalid IL or missing references)
			return BodyCatalog.FindBodyIndex(RequiredCharacterBody);
		}

		public override void OnBodyRequirementMet()
		{
			((BaseAchievement)this).OnBodyRequirementMet();
			Run.onClientGameOverGlobal += OnClientGameOverGlobal;
		}

		public override void OnBodyRequirementBroken()
		{
			Run.onClientGameOverGlobal -= OnClientGameOverGlobal;
			((BaseAchievement)this).OnBodyRequirementBroken();
		}

		private void OnClientGameOverGlobal(Run run, RunReport runReport)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Invalid comparison between Unknown and I4
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Invalid comparison between Unknown and I4
			if (!Object.op_Implicit((Object)(object)runReport.gameEnding) || !runReport.gameEnding.isWin)
			{
				return;
			}
			DifficultyIndex val = runReport.ruleBook.FindDifficulty();
			DifficultyDef difficultyDef = DifficultyCatalog.GetDifficultyDef(val);
			if (difficultyDef != null)
			{
				bool flag = difficultyDef.countsAsHardMode && difficultyDef.scalingValue >= RequiredDifficultyCoefficient;
				bool flag2 = difficultyDef.nameToken == "INFERNO_NAME";
				bool flag3 = (int)val >= 3 && (int)val <= 10;
				if (flag || flag2 || flag3)
				{
					((BaseAchievement)this).Grant();
				}
			}
		}
	}
}
namespace ModdedEntityStates
{
	public abstract class BaseMeleeAttack : BaseSkillState, IStepSetter
	{
		public int swingIndex;

		protected string hitboxGroupName = "SwordGroup";

		protected DamageType damageType = (DamageType)0;

		protected float damageCoefficient = 3.5f;

		protected float procCoefficient = 1f;

		protected float pushForce = 300f;

		protected Vector3 bonusForce = Vector3.zero;

		protected float baseDuration = 1f;

		protected float attackStartPercentTime = 0.2f;

		protected float attackEndPercentTime = 0.4f;

		protected float earlyExitPercentTime = 0.4f;

		protected float hitStopDuration = 0.012f;

		protected float attackRecoil = 0.75f;

		protected float hitHopVelocity = 4f;

		protected string swingSoundString = "";

		protected string hitSoundString = "";

		protected string muzzleString = "SwingCenter";

		protected string playbackRateParam = "Slash.playbackRate";

		protected GameObject swingEffectPrefab;

		protected GameObject hitEffectPrefab;

		protected NetworkSoundEventIndex impactSound = (NetworkSoundEventIndex)(-1);

		public float duration = 1f;

		private bool hasFired;

		private float hitPauseTimer;

		private OverlapAttack attack;

		protected bool inHitPause;

		private bool hasHopped;

		protected float stopwatch;

		protected Animator animator;

		private HitStopCachedState hitStopCachedState;

		private Vector3 storedVelocity;

		private GameObject swingEffectInstance;

		public override void OnEnter()
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Expected O, but got Unknown
			//IL_0054: 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_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: 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_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			animator = ((EntityState)this).GetModelAnimator();
			((BaseState)this).StartAimMode(0.5f + duration, false);
			PlayAttackAnimation();
			attack = new OverlapAttack();
			attack.damageType = DamageTypeCombo.op_Implicit(damageType);
			attack.attacker = ((EntityState)this).gameObject;
			attack.inflictor = ((EntityState)this).gameObject;
			attack.teamIndex = ((BaseState)this).GetTeam();
			attack.damage = damageCoefficient * ((BaseState)this).damageStat;
			attack.procCoefficient = procCoefficient;
			attack.hitEffectPrefab = hitEffectPrefab;
			attack.forceVector = bonusForce;
			attack.pushAwayForce = pushForce;
			attack.hitBoxGroup = ((BaseState)this).FindHitBoxGroup(hitboxGroupName);
			attack.isCrit = ((BaseState)this).RollCrit();
			attack.impactSound = impactSound;
		}

		protected virtual void PlayAttackAnimation()
		{
			((EntityState)this).PlayCrossfade("Gesture, Override", "Slash" + (1 + swingIndex), playbackRateParam, duration, 0.05f);
		}

		public override void OnExit()
		{
			if (inHitPause)
			{
				RemoveHitstop();
			}
			if (Object.op_Implicit((Object)(object)swingEffectInstance))
			{
				EntityState.Destroy((Object)(object)swingEffectInstance);
			}
			((EntityState)this).OnExit();
		}

		protected virtual void PlaySwingEffect()
		{
			Transform val = ((BaseState)this).FindModelChild(muzzleString);
			if (Object.op_Implicit((Object)(object)val))
			{
				swingEffectInstance = Object.Instantiate<GameObject>(swingEffectPrefab, val);
			}
		}

		protected virtual void OnHitEnemyAuthority()
		{
			Util.PlaySound(hitSoundString, ((EntityState)this).gameObject);
			if (!hasHopped)
			{
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && !((EntityState)this).characterMotor.isGrounded && hitHopVelocity > 0f)
				{
					((BaseState)this).SmallHop(((EntityState)this).characterMotor, hitHopVelocity);
				}
				hasHopped = true;
			}
			ApplyHitstop();
		}

		protected void ApplyHitstop()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			if (!inHitPause && hitStopDuration > 0f)
			{
				storedVelocity = ((EntityState)this).characterMotor.velocity;
				hitStopCachedState = ((BaseState)this).CreateHitStopCachedState(((EntityState)this).characterMotor, animator, playbackRateParam);
				hitPauseTimer = hitStopDuration / ((BaseState)this).attackSpeedStat;
				inHitPause = true;
			}
		}

		private void FireAttack()
		{
			if (((EntityState)this).isAuthority && attack.Fire((List<HurtBox>)null))
			{
				OnHitEnemyAuthority();
			}
		}

		private void EnterAttack()
		{
			hasFired = true;
			Util.PlayAttackSpeedSound(swingSoundString, ((EntityState)this).gameObject, ((BaseState)this).attackSpeedStat);
			PlaySwingEffect();
			if (((EntityState)this).isAuthority)
			{
				((BaseState)this).AddRecoil(-1f * attackRecoil, -2f * attackRecoil, -0.5f * attackRecoil, 0.5f * attackRecoil);
			}
		}

		public override void FixedUpdate()
		{
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).FixedUpdate();
			hitPauseTimer -= Time.deltaTime;
			if (hitPauseTimer <= 0f && inHitPause)
			{
				RemoveHitstop();
			}
			if (!inHitPause)
			{
				stopwatch += Time.deltaTime;
			}
			else
			{
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
				{
					((EntityState)this).characterMotor.velocity = Vector3.zero;
				}
				if (Object.op_Implicit((Object)(object)animator))
				{
					animator.SetFloat(playbackRateParam, 0f);
				}
			}
			bool flag = stopwatch >= duration * attackStartPercentTime;
			bool flag2 = stopwatch >= duration * attackEndPercentTime;
			if ((flag && !flag2) || (flag && flag2 && !hasFired))
			{
				if (!hasFired)
				{
					EnterAttack();
				}
				FireAttack();
			}
			if (stopwatch >= duration && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		private void RemoveHitstop()
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).ConsumeHitStopCachedState(hitStopCachedState, ((EntityState)this).characterMotor, animator);
			inHitPause = false;
			((EntityState)this).characterMotor.velocity = storedVelocity;
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0023: 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_0026: Unknown result type (might be due to invalid IL or missing references)
			if (stopwatch >= duration * earlyExitPercentTime)
			{
				return (InterruptPriority)0;
			}
			return (InterruptPriority)1;
		}

		public override void OnSerialize(NetworkWriter writer)
		{
			((BaseSkillState)this).OnSerialize(writer);
			writer.Write(swingIndex);
		}

		public override void OnDeserialize(NetworkReader reader)
		{
			((BaseSkillState)this).OnDeserialize(reader);
			swingIndex = reader.ReadInt32();
		}

		public void SetStep(int i)
		{
			swingIndex = i;
		}
	}
	public class BaseMeleeAttackButEpic : BaseSkillState
	{
		public int swingIndex;

		protected string hitboxName = "Sword";

		protected DamageType damageType = (DamageType)0;

		protected float damageCoefficient = 3.5f;

		protected float procCoefficient = 1f;

		protected float pushForce = 300f;

		protected Vector3 bonusForce = Vector3.zero;

		protected float baseDuration = 1f;

		protected float attackStartTime = 0.2f;

		protected float attackEndTime = 0.4f;

		protected float baseEarlyExitTime = 0.4f;

		protected float hitStopDuration = 0.012f;

		protected float attackRecoil = 0.75f;

		protected float hitHopVelocity = 4f;

		protected bool cancelled = false;

		protected bool keypress;

		protected string swingSoundString = "";

		protected string hitSoundString = "";

		protected string muzzleString = "SwingCenter";

		protected string hitstopAnimationParameter;

		protected GameObject swingEffectPrefab;

		protected GameObject hitEffectPrefab;

		protected NetworkSoundEventIndex impactSound;

		private float earlyExitTime;

		protected float duration;

		private bool hasFired;

		private float hitPauseTimer;

		private OverlapAttack attack;

		protected bool inHitPause;

		private bool hasHopped;

		protected float stopwatch;

		protected Animator animator;

		private HitStopCachedState hitStopCachedState;

		private Vector3 storedVelocity;

		protected bool rolledCrit;

		public override void OnEnter()
		{
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Expected O, but got Unknown
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: 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)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			earlyExitTime = baseEarlyExitTime * duration;
			hasFired = false;
			animator = ((EntityState)this).GetModelAnimator();
			((BaseState)this).StartAimMode(0.5f + duration, false);
			((EntityState)this).characterBody.outOfCombatStopwatch = 0f;
			animator.SetBool("attacking", true);
			rolledCrit = ((BaseState)this).RollCrit();
			HitBoxGroup hitBoxGroup = null;
			Transform modelTransform = ((EntityState)this).GetModelTransform();
			if (Object.op_Implicit((Object)(object)modelTransform))
			{
				hitBoxGroup = Array.Find(((Component)modelTransform).GetComponents<HitBoxGroup>(), (HitBoxGroup element) => element.groupName == hitboxName);
			}
			PlayAttackAnimation();
			attack = new OverlapAttack();
			attack.damageType = DamageTypeCombo.op_Implicit(damageType);
			attack.attacker = ((EntityState)this).gameObject;
			attack.inflictor = ((EntityState)this).gameObject;
			attack.teamIndex = ((BaseState)this).GetTeam();
			attack.damage = damageCoefficient * ((BaseState)this).damageStat;
			attack.procCoefficient = procCoefficient;
			attack.hitEffectPrefab = hitEffectPrefab;
			attack.forceVector = bonusForce;
			attack.pushAwayForce = pushForce;
			attack.hitBoxGroup = hitBoxGroup;
			attack.isCrit = rolledCrit;
			attack.impactSound = impactSound;
		}

		protected virtual void PlayAttackAnimation()
		{
			((EntityState)this).PlayCrossfade("Gesture, Override", "Slash" + (1 + swingIndex), "Slash.playbackRate", duration, 0.05f);
		}

		public override void OnExit()
		{
			((EntityState)this).OnExit();
			animator.SetBool("attacking", false);
		}

		protected virtual void PlaySwingEffect()
		{
			EffectManager.SimpleMuzzleFlash(swingEffectPrefab, ((EntityState)this).gameObject, muzzleString, true);
		}

		protected virtual void OnHitEnemyAuthority()
		{
			OnHitEnemyAuthority(null);
		}

		protected virtual void OnHitEnemyAuthority(List<HurtBox> hits)
		{
			Util.PlaySound(hitSoundString, ((EntityState)this).gameObject);
			if (!hasHopped)
			{
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && !((EntityState)this).characterMotor.isGrounded && hitHopVelocity > 0f)
				{
					((BaseState)this).SmallHop(((EntityState)this).characterMotor, hitHopVelocity);
				}
				hasHopped = true;
			}
			ApplyHitstop();
		}

		protected void ApplyHitstop()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			if (!inHitPause && hitStopDuration > 0f)
			{
				storedVelocity = ((EntityState)this).characterMotor.velocity;
				hitStopCachedState = ((BaseState)this).CreateHitStopCachedState(((EntityState)this).characterMotor, animator, hitstopAnimationParameter);
				hitPauseTimer = hitStopDuration / ((BaseState)this).attackSpeedStat;
				inHitPause = true;
			}
		}

		protected virtual void FireAttack()
		{
			if (!hasFired)
			{
				hasFired = true;
				Util.PlayAttackSpeedSound(swingSoundString, ((EntityState)this).gameObject, ((BaseState)this).attackSpeedStat);
				if (((EntityState)this).isAuthority)
				{
					PlaySwingEffect();
					((BaseState)this).AddRecoil(-1f * attackRecoil, -2f * attackRecoil, -0.5f * attackRecoil, 0.5f * attackRecoil);
				}
			}
			if (((EntityState)this).isAuthority && attack.Fire((List<HurtBox>)null))
			{
				OnHitEnemyAuthority();
			}
		}

		protected virtual void SetNextState()
		{
			int num = ((swingIndex == 0) ? 1 : 0);
			((EntityState)this).outer.SetNextState((EntityState)(object)new BaseMeleeAttackButEpic
			{
				swingIndex = num
			});
		}

		public override void FixedUpdate()
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: 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_00a7: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).FixedUpdate();
			hitPauseTimer -= Time.deltaTime;
			if (hitPauseTimer <= 0f && inHitPause)
			{
				((BaseState)this).ConsumeHitStopCachedState(hitStopCachedState, ((EntityState)this).characterMotor, animator);
				inHitPause = false;
				((EntityState)this).characterMotor.velocity = storedVelocity;
			}
			if (!inHitPause)
			{
				stopwatch += Time.deltaTime;
			}
			else
			{
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
				{
					((EntityState)this).characterMotor.velocity = Vector3.zero;
				}
				if (Object.op_Implicit((Object)(object)animator))
				{
					animator.SetFloat("Swing.playbackRate", 0f);
				}
			}
			bool flag = stopwatch >= duration * attackStartTime;
			bool flag2 = stopwatch >= duration * attackEndTime;
			if ((flag && !flag2) || (flag && flag2 && !hasFired))
			{
				if (!hasFired)
				{
					OnFireAttackEnter();
				}
				FireAttack();
			}
			if (stopwatch >= duration && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		protected virtual void OnFireAttackEnter()
		{
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0013: 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)
			return (InterruptPriority)((!(((EntityState)this).fixedAge > earlyExitTime)) ? 1 : 0);
		}

		public override void OnSerialize(NetworkWriter writer)
		{
			((BaseSkillState)this).OnSerialize(writer);
			writer.Write(swingIndex);
		}

		public override void OnDeserialize(NetworkReader reader)
		{
			((BaseSkillState)this).OnDeserialize(reader);
			swingIndex = reader.ReadInt32();
		}
	}
	public abstract class BaseTimedSkillState : BaseSkillState
	{
		protected float duration;

		protected float castStartTime;

		protected float castEndTime;

		protected bool hasFired;

		protected bool isFiring;

		protected bool hasExited;

		public abstract float TimedBaseDuration { get; }

		public abstract float TimedBaseCastStartPercentTime { get; }

		public virtual float TimedBaseCastEndPercentTime => 1f;

		public override void OnEnter()
		{
			InitDurationValues();
			((BaseState)this).OnEnter();
		}

		protected virtual void InitDurationValues()
		{
			duration = TimedBaseDuration / ((BaseState)this).attackSpeedStat;
			castStartTime = TimedBaseCastStartPercentTime * duration;
			castEndTime = TimedBaseCastEndPercentTime * duration;
		}

		protected virtual void OnCastEnter()
		{
		}

		protected virtual void OnCastFixedUpdate()
		{
		}

		protected virtual void OnCastUpdate()
		{
		}

		protected virtual void OnCastExit()
		{
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			bool flag = ((EntityState)this).fixedAge >= castStartTime;
			bool flag2 = ((EntityState)this).fixedAge >= castEndTime;
			isFiring = false;
			if ((flag && !flag2) || (flag && flag2 && !hasFired))
			{
				isFiring = true;
				OnCastFixedUpdate();
				if (!hasFired)
				{
					OnCastEnter();
					hasFired = true;
				}
			}
			if (flag2 && !hasExited)
			{
				hasExited = true;
				OnCastExit();
			}
			if (((EntityState)this).fixedAge > duration)
			{
				SetNextState();
			}
		}

		protected virtual void SetNextState()
		{
			((EntityState)this).outer.SetNextStateToMain();
		}

		public override void Update()
		{
			((EntityState)this).Update();
			if (isFiring)
			{
				OnCastUpdate();
			}
		}
	}
	public class ExampleTimedSkillState : BaseTimedSkillState
	{
		public override float TimedBaseDuration => 1.5f;

		public override float TimedBaseCastStartPercentTime => 0.2f;

		public override float TimedBaseCastEndPercentTime => 0.9f;

		protected override void OnCastEnter()
		{
		}

		protected override void OnCastFixedUpdate()
		{
		}

		protected override void OnCastExit()
		{
		}
	}
	public class ExampleDelayedSkillState : BaseTimedSkillState
	{
		public override float TimedBaseDuration => 1.5f;

		public override float TimedBaseCastStartPercentTime => 0.2f;

		protected override void OnCastEnter()
		{
		}
	}
	public class WindDownState : BaseSkillState
	{
		public float windDownTime = 0.5f;

		private float _windDownTime;

		public WindDownState(float windDownTime_)
		{
			windDownTime = windDownTime_;
		}

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			_windDownTime = windDownTime / ((BaseState)this).attackSpeedStat;
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (((EntityState)this).fixedAge > _windDownTime)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: 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)
			return (InterruptPriority)1;
		}
	}
}
namespace ModdedEntityStates.Aliem
{
	public class AliemCharacterMain : GenericCharacterMain
	{
		public bool wasRiding = false;

		public override void OnEnter()
		{
			((GenericCharacterMain)this).OnEnter();
			if (Input.GetKey((KeyCode)103))
			{
				Animator modelAnimator = ((EntityState)this).GetModelAnimator();
				Helpers.LogWarning(modelAnimator.GetLayerWeight(modelAnimator.GetLayerIndex("Flinch")));
			}
			if (wasRiding && ((EntityState)this).isAuthority)
			{
				GenericCharacterMain.ApplyJumpVelocity(((EntityState)this).characterMotor, ((EntityState)this).characterBody, 1f, 1f, false);
			}
		}
	}
	public class ChargeBBGun : BaseChargingState
	{
		public override float BaseMaxChargeDuration => 3f;

		public virtual float MinDamageCoefficient => AliemConfig.M1_BBGunCharged_Damage_Min.Value;

		public virtual float MaxDamageCoefficient => AliemConfig.M1_BBGunCharged_Damage_Max.Value;

		protected override void StartNextState(float chargeCoefficient)
		{
			((EntityState)this).outer.SetNextState((EntityState)(object)new FireBBGunCharged(GetChargedValue(MinDamageCoefficient, MaxDamageCoefficient))
			{
				isOffHanded = base.isOffHanded
			});
		}
	}
	public class FireBBGun : BaseSkillState, IOffHandable, IChannelingSkill
	{
		public float baseDamageCoefficient = AliemConfig.M1_BBGun_Damage.Value;

		public float maxSpread = AliemConfig.M1_BBGun_Spread.Value;

		public float spreadYawScale = AliemConfig.bbgunSpreadYaw.Value;

		public float baseFireInterval = AliemConfig.M1_BBGun_Interval.Value * 0.02f;

		public int bsPerFrame = AliemConfig.bbgunBaseBs.Value;

		private Ray _currentRay;

		private bool _currentCrit;

		private float _updateRayInterval = 0.2f;

		private Transform _muzzleTransform;

		private float _fireTim = 0f;

		private float _rayTim = 0f;

		private float _interval;

		public float range => AliemConfig.BBGunRange.Value;

		public string muzzleString => isOffHanded ? "BlasterMuzzle.R" : "BlasterMuzzle";

		public bool isOffHanded { get; set; }

		public void StopChanneling()
		{
			if (((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			_muzzleTransform = ((BaseState)this).FindModelChild(muzzleString);
			_interval = baseFireInterval * (float)bsPerFrame / ((BaseState)this).attackSpeedStat;
			((EntityState)this).PlayAnimation("Gesture, Override", "ShootLoop", "ShootGun.playbackRate", _interval * 58.82f, 0f);
			((EntityState)this).PlayAnimation(isOffHanded ? "RightArm, Over" : "LeftArm, Over", "ShootLoop");
			((EntityState)this).PlayAnimation(isOffHanded ? "LeftArm, Under" : "RightArm, Under", "ShootLoop");
		}

		public override void FixedUpdate()
		{
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).FixedUpdate();
			_rayTim -= Time.deltaTime;
			_fireTim -= Time.deltaTime;
			if (_rayTim <= 0f)
			{
				_rayTim += _updateRayInterval;
				onRayUpdate();
			}
			int num = 0;
			while (_fireTim <= 0f)
			{
				num += bsPerFrame;
				_fireTim += _interval;
			}
			if (num > 0)
			{
				FireBs(num, ((Ray)(ref _currentRay)).direction);
				((EntityState)this).characterBody.OnSkillActivated(((BaseSkillState)this).activatorSkillSlot);
			}
		}

		private void onRayUpdate()
		{
			//IL_0003: 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)
			_currentRay = ((BaseState)this).GetAimRay();
			_currentCrit = ((BaseState)this).RollCrit();
			_interval = baseFireInterval * (float)bsPerFrame / ((EntityState)this).characterBody.attackSpeed;
			((BaseState)this).StartAimMode(2f, false);
		}

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

		public void PlayAnimation(float duration)
		{
			((EntityState)this).PlayAnimation("Gesture, Override", "ShootGun", "ShootGun.playbackRate", duration, 0f);
			((EntityState)this).PlayAnimation(isOffHanded ? "RightArm, Over" : "LeftArm, Over", "ShootGun");
			((EntityState)this).PlayAnimation(isOffHanded ? "LeftArm, Under" : "RightArm, Under", "ShootGun");
		}

		private ButtonState GetSkillButton()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: 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_0024: Unknown result type (might be due to invalid IL or missing references)
			return isOffHanded ? ((EntityState)this).inputBank.skill2 : ((EntityState)this).inputBank.skill1;
		}

		private void FireBs(int BCount, Vector3 aimVector)
		{
			//IL_0012: 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_0018: 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_001a: 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_0059: 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)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: 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_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: 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_00d6: 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_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: 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)
			Util.PlaySound("Play_AliemBB", ((EntityState)this).gameObject);
			Vector3 up = Vector3.up;
			Vector3 val = Vector3.Cross(up, aimVector);
			int num = 0;
			for (int i = 0; i < BCount; i++)
			{
				float num2 = Random.Range(0f, maxSpread);
				float num3 = Random.Range(0f, 360f);
				Vector3 val2 = Quaternion.Euler(0f, 0f, num3) * (Quaternion.Euler(num2, 0f, 0f) * Vector3.forward);
				float y = val2.y;
				val2.y = 0f;
				float num4 = (Mathf.Atan2(val2.z, val2.x) * 57.29578f - 90f) * spreadYawScale;
				float num5 = Mathf.Atan2(y, ((Vector3)(ref val2)).magnitude) * 57.29578f;
				FireSingleB(Quaternion.AngleAxis(num4, up) * (Quaternion.AngleAxis(num5, val) * aimVector));
			}
		}

		private void FireSingleB(Vector3 aimVector)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: 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_004d: 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_0079: 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_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			Vector3 hitPoint;
			HurtBox val = BootlegCharacterRaycastSingle(((EntityState)this).gameObject, new Ray(((Ray)(ref _currentRay)).origin, aimVector), out hitPoint, range, BulletAttack.defaultStopperMask, (QueryTriggerInteraction)0);
			BBOrb bBOrb = (Object.op_Implicit((Object)(object)val) ? AliemPoolManager.instance.RentBBOrb() : AliemPoolManager.instance.RentBBOrbMissed());
			bBOrb.targetPosition = hitPoint;
			bBOrb.speed = Random.Range(AliemConfig.bbgunMinSpeed.Value, AliemConfig.bbgunMaxSpeed.Value);
			bBOrb.attackOrigin = ((Ray)(ref _currentRay)).origin;
			bBOrb.damageValue = ((BaseState)this).damageStat * baseDamageCoefficient;
			bBOrb.attacker = ((EntityState)this).gameObject;
			bBOrb.isCrit = _currentCrit;
			((Orb)bBOrb).origin = _muzzleTransform.position;
			((Orb)bBOrb).target = val;
			OrbManager.instance.AddOrb((Orb)(object)bBOrb);
		}

		private HurtBox BootlegCharacterRaycastSingle(GameObject bodyObject, Ray ray, out Vector3 hitPoint, float maxDistance, LayerMask layerMask, QueryTriggerInteraction queryTriggerInteraction)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: 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_0020: Unknown result type (might be due to invalid IL or missing references)
			RaycastHit[] hits = Physics.SphereCastAll(ray, (float)AliemConfig.bbgunRadius.Value, maxDistance, LayerMask.op_Implicit(layerMask), queryTriggerInteraction);
			return CopyPasteCodeJustToAvoidOneGetComponent(bodyObject, ray, maxDistance, hits, out hitPoint);
		}

		private HurtBox CopyPasteCodeJustToAvoidOneGetComponent(GameObject bodyObject, Ray ray, float maxDistance, RaycastHit[] hits, out Vector3 hitPoint)
		{
			//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_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: 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)
			int num = -1;
			float num2 = float.PositiveInfinity;
			float num3 = 0f;
			HurtBox val = null;
			HurtBox result = null;
			for (int i = 0; i < hits.Length; i++)
			{
				float distance = ((RaycastHit)(ref hits[i])).distance;
				if (distance > num3)
				{
					num3 = distance;
				}
				if (!(distance < num2))
				{
					continue;
				}
				val = ((Component)((RaycastHit)(ref hits[i])).collider).GetComponent<HurtBox>();
				if (Object.op_Implicit((Object)(object)val))
				{
					HealthComponent healthComponent = val.healthComponent;
					if (Object.op_Implicit((Object)(object)healthComponent))
					{
						if (!FriendlyFireManager.ShouldDirectHitProceed(healthComponent, ((EntityState)this).teamComponent.teamIndex))
						{
							continue;
						}
						num = i;
						result = val;
						if (distance == 0f)
						{
							hitPoint = ((Ray)(ref ray)).origin;
							return result;
						}
					}
				}
				num2 = distance;
			}
			if (num == -1)
			{
				maxDistance = ((num3 == 0f) ? maxDistance : num3);
				hitPoint = ((Ray)(ref ray)).origin + ((Ray)(ref ray)).direction * maxDistance;
				return null;
			}
			hitPoint = ((RaycastHit)(ref hits[num])).point;
			return result;
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: 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)
			return (InterruptPriority)1;
		}
	}
	public class FireBBGunCharged : RayGunFire
	{
		private float _chargedDamageCoefficient;

		private string _chargedShootSound = "Play_AliemBBCharged";

		public override float BaseDuration => 0.5f;

		public override float BaseDamageCoefficient => _chargedDamageCoefficient;

		public override string soundString => _chargedShootSound;

		public override GameObject projectile => Projectiles.BBGunProjectilePrefabBig;

		public FireBBGunCharged()
		{
			_chargedDamageCoefficient = AliemConfig.M1_BBGunCharged_Damage_Max.Value;
		}

		public FireBBGunCharged(float dam_)
		{
			_chargedDamageCoefficient = dam_;
		}

		public override void PlayAnimation(float duration)
		{
			((EntityState)this).PlayAnimation("Gesture, Override", "ShootGunBig", "ShootGun.playbackRate", duration * 3f, 0f);
			((EntityState)this).PlayAnimation(base.isOffHanded ? "RightArm, Over" : "LeftArm, Over", "ShootGunBig");
			((EntityState)this).PlayAnimation(base.isOffHanded ? "LeftArm, Under" : "RightArm, Under", "ShootGunBig");
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: 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)
			return (InterruptPriority)1;
		}
	}
	public class InputBBGun : MashAndHoldInputs
	{
		protected override EntityState newMashState
		{
			get
			{
				FireBBGun fireBBGun = new FireBBGun();
				((BaseSkillState)fireBBGun).activatorSkillSlot = ((BaseSkillState)this).activatorSkillSlot;
				return (EntityState)(object)fireBBGun;
			}
		}

		protected override EntityState newHoldState
		{
			get
			{
				ChargeBBGun chargeBBGun = new ChargeBBGun();
				((BaseSkillState)chargeBBGun).activatorSkillSlot = ((BaseSkillState)this).activatorSkillSlot;
				return (EntityState)(object)chargeBBGun;
			}
		}

		protected override InterruptPriority holdInterruptPriority => (InterruptPriority)1;
	}
	public class ChargedLunarNeedleFire : RayGunChargedFire
	{
		public override GameObject projectile => AliemAssets.LunarChargedProjectile;

		public override void OnEnter()
		{
			base.OnEnter();
			EffectManager.SimpleMuzzleFlash(FireLunarNeedle.muzzleFlashEffectPrefab, ((EntityState)this).gameObject, "Head", false);
			Util.PlaySound("Play_item_lunar_use_utilityReplacement_end", ((EntityState)this).gameObject);
		}

		protected override void ModifyState()
		{
			base.ModifyState();
			((GenericProjectileBaseState)this).force = 0f;
			((GenericProjectileBaseState)this).damageCoefficient = 0.05f;
			((GenericProjectileBaseState)this).attackSoundString = FireLunarNeedle.fireSound;
		}
	}
	internal class ChargeRifle : BaseChargingState
	{
		public override float BaseMaxChargeDuration => 3f;

		public virtual int MinBullets => AliemConfig.M1_MachineGunCharged_Bullets_Min.Value;

		public virtual int MaxBullets => AliemConfig.M1_MachineGunCharged_Bullets_Max.Value;

		protected override void StartNextState(float chargeCoefficient)
		{
			((EntityState)this).outer.SetNextState((EntityState)(object)new ShootRifleCharged(Mathf.RoundToInt(GetChargedValue(MinBullets, MaxBullets)))
			{
				isOffHanded = base.isOffHanded
			});
		}
	}
	public class InputRifle : MashAndHoldInputs
	{
		protected override EntityState newMashState => (EntityState)(object)new ShootRifleUncharged();

		protected override EntityState newHoldState
		{
			get
			{
				ChargeRifle chargeRifle = new ChargeRifle();
				((BaseSkillState)chargeRifle).activatorSkillSlot = ((BaseSkillState)this).activatorSkillSlot;
				return (EntityState)(object)chargeRifle;
			}
		}
	}
	public class ShootRifleCharged : BaseShootBullet
	{
		private float _interval;

		private float _shootTimer;

		private int _shotsFired;

		private int _chargedBullets;

		private float _currentBloom;

		public override float damageCoefficient => AliemConfig.M1_MachineGunCharged_Damage.Value;

		public override float baseDuration => baseInterval * (float)bullets;

		public override float procCoefficient => 0.7f;

		public override float force => 200f;

		public override float recoil => 1f;

		public override float bloom => 0f;

		public override float range => 256f;

		public override float radius => 1.6f;

		public override float minSpread => 0f;

		public override float spread => AliemConfig.M1_MachineGunCharged_Spread.Value * ((EntityState)this).characterBody.spreadBloomAngle;

		public override LayerMask stopperMask => ((LayerIndex)(ref LayerIndex.world)).mask;

		public override GameObject tracerEffectPrefab => AliemAssets.rifleTracerBig;

		public override string muzzleString => base.isOffHanded ? "BlasterMuzzle.R" : "BlasterMuzzle";

		public virtual float baseInterval => AliemConfig.M1_MachineGunCharged_Interval.Value;

		public new virtual int bullets => _chargedBullets;

		private float _bloomIncrement => 0.5f;

		public ShootRifleCharged()
		{
			_chargedBullets = AliemConfig.M1_MachineGunCharged_Bullets_Max.Value;
		}

		public ShootRifleCharged(int bullets)
		{
			_chargedBullets = bullets;
		}

		public override void OnEnter()
		{
			base.OnEnter();
			_interval = baseInterval / ((BaseState)this).attackSpeedStat;
		}

		public override void FixedUpdate()
		{
			base.FixedUpdate();
			_shootTimer -= Time.deltaTime;
			while (_shootTimer <= 0f && _shotsFired < bullets)
			{
				((EntityState)this).characterBody.SetSpreadBloom(_currentBloom, false);
				_currentBloom += _bloomIncrement;
				Fire();
				_shootTimer += _interval;
				_shotsFired++;
			}
		}

		protected override void ModifyBullet(BulletAttack bulletAttack)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			DamageAPI.AddModdedDamageType(bulletAttack, DamageTypes.FuckinChargedKillAchievementTracking);
		}

		protected override void playShootAnimation()
		{
			Util.PlaySound("Play_AliemRifleCharged", ((EntityState)this).gameObject);
			((EntityState)this).PlayAnimation("Gesture, Override", "ShootGunBig", "ShootGun.playbackRate", _interval * 5f, 0f);
			((EntityState)this).PlayAnimation(base.isOffHanded ? "RightArm, Over" : "LeftArm, Over", "ShootGunBig");
			((EntityState)this).PlayAnimation(base.isOffHanded ? "LeftArm, Under" : "RightArm, Under", "ShootGunBig");
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: 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)
			return (InterruptPriority)2;
		}
	}
	public class ShootRifleUncharged : BaseShootBullet
	{
		public override float damageCoefficient => AliemConfig.M1_MachineGun_Damage.Value;

		public override float baseDuration => AliemConfig.M1_MachineGun_Duration.Value;

		public override float force => 100f;

		public override float bloom => 0.5f;

		public override float range => 256f;

		public override float radius => 0.4f;

		public override float spread => 0f;

		public override FalloffModel falloff => (FalloffModel)(AliemConfig.M1_MachineGun_Falloff.Value ? 1 : 0);

		public override GameObject tracerEffectPrefab => AliemAssets.rifleTracer;

		public override void OnEnter()
		{
			base.OnEnter();
			Fire();
		}
	}
	public class AliemBurrow : BaseCharacterMain
	{
		private int inputButton = 2;

		public static float MaxBurrowTime = 1.4f;

		public SprintEffectController sprintEffectController;

		private float minBurrowTime = 0.1f;

		private ButtonState inputButtonState => (ButtonState)(inputButton switch
		{
			1 => ((EntityState)this).inputBank.skill1, 
			3 => ((EntityState)this).inputBank.skill3, 
			4 => ((EntityState)this).inputBank.skill4, 
			_ => ((EntityState)this).inputBank.skill2, 
		});

		public static event Action<int> onBurrowPopOutMultiHit;

		public AliemBurrow()
		{
		}

		public AliemBurrow(int inputButtonState)
		{
			inputButton = inputButtonState;
		}

		public override void OnEnter()
		{
			((BaseCharacterMain)this).OnEnter();
			((EntityState)this).PlayCrossfade("FullBody, Override", "Burrow", 0.1f);
			Util.PlaySound(BurrowIn.burrowInSoundString, ((EntityState)this).gameObject);
			GameObject obj = ((EntityState)this).GetModelChildLocator().FindChildGameObject("Burrow");
			if (obj != null)
			{
				obj.SetActive(true);
			}
		}

		public override void FixedUpdate()
		{
			//IL_0049: 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_007c: Unknown result type (might be due to invalid IL or missing references)
			((BaseCharacterMain)this).FixedUpdate();
			((EntityState)this).characterBody.isSprinting = true;
			((BaseState)this).StartAimMode(2f, false);
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && ((EntityState)this).isAuthority)
			{
				((EntityState)this).characterMotor.moveDirection = ((EntityState)this).inputBank.moveVector * 2.6f;
			}
			if (((EntityState)this).fixedAge > minBurrowTime && ((EntityState)this).isAuthority && (!inputButtonState.down || !((BaseState)this).isGrounded || ((EntityState)this).fixedAge > MaxBurrowTime))
			{
				((EntityState)this).outer.SetState((EntityState)(object)new AliemCharacterMain
				{
					wasRiding = true
				});
			}
		}

		public override void OnExit()
		{
			//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_005e: 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_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)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Expected O, but got Unknown
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: 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_00e7: 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_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: 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_00fb: 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_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Expected O, but got Unknown
			//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)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			((BaseCharacterMain)this).OnExit();
			GameObject val = ((EntityState)this).GetModelChildLocator().FindChildGameObject("Burrow");
			if (val != null)
			{
				val.SetActive(false);
			}
			((EntityState)this).PlayCrossfade("FullBody, Override", "UnBurrow", 0.1f);
			Util.PlaySound("Play_DigPopOut_AHI", ((EntityState)this).gameObject);
			EffectManager.SpawnEffect(AliemAssets.burrowPopOutEffect, new EffectData
			{
				origin = val.transform.position,
				rotation = Util.QuaternionSafeLookRotation(Vector3.up)
			}, false);
			if (((EntityState)this).isAuthority)
			{
				BlastAttack val2 = new BlastAttack
				{
					attacker = ((EntityState)this).gameObject,
					baseDamage = ((BaseState)this).damageStat * AliemConfig.M3_Burrow_PopOutDamage.Value,
					baseForce = 0f,
					bonusForce = Vector3.up * AliemConfig.M3_Burrow_PopOutForce.Value,
					crit = ((BaseState)this).RollCrit(),
					damageType = DamageTypeCombo.op_Implicit((DamageType)32),
					falloffModel = (FalloffModel)0,
					procCoefficient = 1f,
					radius = 4f,
					position = ((EntityState)this).transform.position,
					attackerFiltering = (AttackerFiltering)2,
					teamIndex = ((EntityState)this).teamComponent.teamIndex
				};
				Result val3 = val2.Fire();
				AliemBurrow.onBurrowPopOutMultiHit?.Invoke(val3.hitCount);
			}
		}
	}
	public class AliemLeapM2 : AliemLeap
	{
		protected override int inputButton => 2;
	}
	public class AliemLeapM3 : AliemLeap
	{
		protected override int inputButton => 3;
	}
	public class AliemLeap : GenericCharacterMain
	{
		private OverlapAttack overlapAttack;

		private bool hitSomething;

		private int hitSomethingFrames;

		private float previousAirControl;

		private BullseyeSearch bullseyeSearch;

		private List<HurtBox> overlapAttackHits = new List<HurtBox>();

		protected virtual int inputButton => 2;

		private ButtonState inputButtonState => (ButtonState)(inputButton switch
		{
			1 => ((EntityState)this).inputBank.skill1, 
			3 => ((EntityState)this).inputBank.skill3, 
			4 => ((EntityState)this).inputBank.skill4, 
			_ => ((EntityState)this).inputBank.skill2, 
		});

		public static float DamageCoefficient => AliemConfig.M3_Leap_ImpactDamage.Value;

		public override void OnEnter()
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Expected O, but got Unknown
			//IL_0054: 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_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: 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_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Expected O, but got Unknown
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: 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_01dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: 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_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Expected O, but got Unknown
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: 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_016b: 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_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b9: 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_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			((GenericCharacterMain)this).OnEnter();
			bullseyeSearch = new BullseyeSearch();
			HitBoxGroup hitBoxGroup = null;
			Transform modelTransform = ((EntityState)this).GetModelTransform();
			if (Object.op_Implicit((Object)(object)modelTransform))
			{
				hitBoxGroup = Array.Find(((Component)modelTransform).GetComponents<HitBoxGroup>(), (HitBoxGroup hitboxGroup) => hitboxGroup.groupName == "Leap");
			}
			overlapAttack = new OverlapAttack
			{
				attacker = ((EntityState)this).gameObject,
				inflictor = ((EntityState)this).gameObject,
				teamIndex = ((BaseState)this).GetTeam(),
				damage = DamageCoefficient * ((BaseState)this).damageStat,
				isCrit = ((BaseState)this).RollCrit(),
				hitBoxGroup = hitBoxGroup,
				hitEffectPrefab = AliemAssets.nemforcerImpactEffect
			};
			((EntityState)this).GetModelAnimator().SetFloat("aimYawCycle", 0.5f);
			((EntityState)this).GetModelAnimator().SetFloat("aimPitchCycle", 0.5f);
			previousAirControl = ((EntityState)this).characterMotor.airControl;
			((EntityState)this).characterMotor.airControl = BaseLeap.airControl;
			Ray aimRay = ((BaseState)this).GetAimRay();
			Vector3 direction = ((Ray)(ref aimRay)).direction;
			if (((EntityState)this).isAuthority)
			{
				Vector3 val = ((Vector3)(ref direction)).normalized * BaseLeap.aimVelocity * ((BaseState)this).moveSpeedStat * (((EntityState)this).characterBody.isSprinting ? 1f : ((EntityState)this).characterBody.sprintingSpeedMultiplier);
				Vector3 val2 = Vector3.up * BaseLeap.upwardVelocity;
				Vector3 val3 = new Vector3(direction.x, 0f, direction.z);
				Vector3 val4 = ((Vector3)(ref val3)).normalized * BaseLeap.forwardVelocity;
				((BaseCharacterController)((EntityState)this).characterMotor).Motor.ForceUnground(0.1f);
				((EntityState)this).characterMotor.velocity = val + val2 + val4;
			}
			CharacterBody characterBody = ((EntityState)this).characterBody;
			characterBody.bodyFlags = (BodyFlags)(characterBody.bodyFlags | 1);
			((EntityState)this).PlayCrossfade("FullBody, Underride", "Dive", 0.1f);
			Util.PlaySound(BaseLeap.leapSoundString, ((EntityState)this).gameObject);
			((EntityState)this).characterDirection.moveVector = direction;
			if (((EntityState)this).isAuthority)
			{
				((EntityState)this).characterMotor.onMovementHit += new MovementHitDelegate(OnMovementHit);
			}
			Util.PlaySound(BaseLeap.soundLoopStartEvent, ((EntityState)this).gameObject);
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddBuff(Buffs.diveBuff);
			}
		}

		private void OnMovementHit(ref MovementHitInfo movementHitInfo)
		{
			hitSomething = true;
		}

		public override void FixedUpdate()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			((GenericCharacterMain)this).FixedUpdate();
			((EntityState)this).characterBody.isSprinting = true;
			((EntityState)this).characterDirection.moveVector = ((EntityState)this).characterMotor.velocity;
			if (!((EntityState)this).isAuthority || !Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
			{
				return;
			}
			((EntityState)this).characterMotor.moveDirection = ((EntityState)this).inputBank.moveVector;
			CharacterBody val = FireOverlap();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = FindBodyToRide();
			}
			AliemRidingColliderHolderThatsIt aliemRidingColliderHolderThatsIt = default(AliemRidingColliderHolderThatsIt);
			if (Object.op_Implicit((Object)(object)val) && ((Component)val).TryGetComponent<AliemRidingColliderHolderThatsIt>(ref aliemRidingColliderHolderThatsIt) && (Object)(object)aliemRidingColliderHolderThatsIt.riddenCollider != (Object)null)
			{
				val = null;
			}
			if ((Object)(object)val != (Object)null && (inputButtonState.down || AliemConfig.M3_Leap_AlwaysRide.Value))
			{
				((EntityState)this).outer.SetNextState((EntityState)(object)new AliemRidingState
				{
					inputButton = inputButton,
					riddenBody = val
				});
				return;
			}
			if (((BaseCharacterController)((EntityState)this).characterMotor).Motor.GroundingStatus.IsStableOnGround && !((BaseCharacterController)((EntityState)this).characterMotor).Motor.LastGroundingStatus.IsStableOnGround)
			{
				if (inputButtonState.down)
				{
					((EntityState)this).outer.SetState((EntityState)(object)new AliemBurrow(inputButton));
				}
				else
				{
					((EntityState)this).outer.SetNextStateToMain();
				}
				return;
			}
			if (hitSomething)
			{
				hitSomethingFrames++;
			}
			if (((EntityState)this).fixedAge >= BaseLeap.minimumDuration && hitSomethingFrames > 1)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override void ProcessJump()
		{
			if (base.jumpInputReceived)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
			((GenericCharacterMain)this).ProcessJump();
		}

		private CharacterBody FindBodyToRide()
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: 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_0030: 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_0071: Unknown result type (might be due to invalid IL or missing references)
			Ray val = default(Ray);
			((Ray)(ref val))..ctor(((EntityState)this).characterBody.corePosition, Vector3.forward);
			RaycastHit val2 = default(RaycastHit);
			if (Util.CharacterSpherecast(((EntityState)this).gameObject, val, 1.51f, ref val2, 0f, ((LayerIndex)(ref LayerIndex.entityPrecise)).mask, (QueryTriggerInteraction)0))
			{
				HealthComponent healthComponent = ((Component)((RaycastHit)(ref val2)).collider).GetComponent<HurtBox>().healthComponent;
				if ((Object)(object)healthComponent != (Object)null && healthComponent.body.teamComponent.teamIndex == ((EntityState)this).teamComponent.teamIndex)
				{
					return healthComponent.body;
				}
			}
			return null;
		}

		private CharacterBody FireOverlap()
		{
			overlapAttackHits.Clear();
			if (overlapAttack.Fire(overlapAttackHits) && overlapAttackHits.Count > 0)
			{
				return overlapAttackHits[0].healthComponent?.body;
			}
			return null;
		}

		public override void OnExit()
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Expected O, but got Unknown
			Util.PlaySound(BaseLeap.soundLoopStopEvent, ((EntityState)this).gameObject);
			if (((EntityState)this).isAuthority)
			{
				((EntityState)this).characterMotor.onMovementHit -= new MovementHitDelegate(OnMovementHit);
			}
			((EntityState)this).PlayAnimation("FullBody, Underride", "DiveRecover");
			CharacterBody characterBody = ((EntityState)this).characterBody;
			characterBody.bodyFlags = (BodyFlags)(characterBody.bodyFlags & -2);
			((EntityState)this).characterMotor.airControl = previousAirControl;
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.RemoveBuff(Buffs.diveBuff);
			}
			((GenericCharacterMain)this).OnExit();
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: 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)
			return (InterruptPriority)2;
		}
	}
	public class AliemRidingChomp : BaseSkillState
	{
		public Collider riddenCollider;

		private float baseDuration = 0.3f;

		private float chompPercentTime = 1f;

		private float duration;

		private bool hasCasted;

		private bool hasHealed;

		public static float ChompDamageCoefficient => AliemConfig.M3_Chomp_Damage.Value;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			((EntityState)this).PlayCrossfade("FullBody, Override", "RidingChomp", "Chomp.playbackRate", duration * 2f, 0.1f);
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (((EntityState)this).fixedAge > duration * chompPercentTime && !hasCasted)
			{
				hasCasted = true;
				OnCastEnter();
			}
			if (((EntityState)this).fixedAge > duration && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		protected void OnCastEnter()
		{
			//IL_0049: 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_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: 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_0099: 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_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: 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_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_00ce: 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)
			//IL_00d9: Expected O, but got Unknown
			//IL_00da: 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)
			Util.PlayAttackSpeedSound("Play_Chomp", ((EntityState)this).gameObject, ((BaseState)this).attackSpeedStat);
			Transform transform = ((Component)((EntityState)this).GetComponent<AliemRidingColliderHolderThatsIt>().riddenCollider).transform;
			if ((Object)(object)transform == (Object)null)
			{
				transform = ((EntityState)this).transform;
			}
			if (((EntityState)this).isAuthority)
			{
				BlastAttack val = new BlastAttack
				{
					attacker = ((EntityState)this).gameObject,
					baseDamage = ((BaseState)this).damageStat * ChompDamageCoefficient,
					damageType = DamageTypeCombo.op_Implicit((DamageType)(AliemConfig.M3_Chomp_Slayer.Value ? 524288 : 0)),
					crit = ((BaseState)this).RollCrit(),
					falloffModel = (FalloffModel)0,
					procCoefficient = 1f,
					radius = 2f,
					position = transform.position,
					attackerFiltering = (AttackerFiltering)2,
					teamIndex = ((EntityState)this).teamComponent.teamIndex
				};
				DamageAPI.AddModdedDamageType(val, DamageTypes.Decapitating);
				val.Fire();
			}
			FuckinHealInMultiplayerPlease(transform);
		}

		private void FuckinHealInMultiplayerPlease(Transform ridePoint)
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Expected O, but got Unknown
			//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)
			hasHealed = true;
			if (NetworkServer.active)
			{
				float num = ((EntityState)this).characterBody.maxHealth - (AliemConfig.M3_Chomp_HealMissing.Value ? ((EntityState)this).healthComponent.health : 0f);
				num *= AliemConfig.M3_Chomp_Healing.Value;
				HealOrb val = new HealOrb();
				((Orb)val).origin = ridePoint.position;
				((Orb)val).target = ((EntityState)this).characterBody.mainHurtBox;
				val.healValue = num;
				val.overrideDuration = 0.1f;
				OrbManager.instance.AddOrb((Orb)(object)val);
			}
		}

		public override void OnExit()
		{
			((EntityState)this).OnExit();
			EntityStateMachine.FindByCustomName(((EntityState)this).gameObject, "Body").SetInterruptState((EntityState)(object)new EndRidingState(), (InterruptPriority)2);
			if (!hasHealed)
			{
				FuckinHealInMultiplayerPlease(((EntityState)this).transform);
				Helpers.LogWarning("you mother fucking fucker i caught you bitch", chat: true);
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: 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)
			return (InterruptPriority)2;
		}
	}
	public class AliemRidingState : BaseRidingState
	{
		public int inputButton;

		private GenericSkill _originalSkill;

		private GenericSkill inputGenericSkill
		{
			get
			{
				return (GenericSkill)(inputButton switch
				{
					1 => ((EntityState)this).skillLocator.primary, 
					3 => ((EntityState)this).skillLocator.utility, 
					4 => ((EntityState)this).skillLocator.special, 
					_ => ((EntityState)this).skillLocator.secondary, 
				});
			}
			set
			{
				switch (inputButton)
				{
				case 1:
					((EntityState)this).skillLocator.primary = value;
					break;
				default:
					((EntityState)this).skillLocator.secondary = value;
					break;
				case 3:
					((EntityState)this).skillLocator.utility = value;
					break;
				case 4:
					((EntityState)this).skillLocator.special = value;
					break;
				}
			}
		}

		public override void OnEnter()
		{
			base.OnEnter();
			((EntityState)this).PlayAnimation("FullBody, Underride", "RidingClimb", "RidincClimb.playbackRate", 0.4f, 0f);
			_originalSkill = inputGenericSkill;
			inputGenericSkill = ((EntityState)this).skillLocator.FindSkill("LOADOUT_SKILL_RIDING");
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddBuff(Buffs.ridingBuff);
			}
		}

		public override void FixedUpdate()
		{
			base.FixedUpdate();
			if (((EntityState)this).isAuthority && ((ButtonState)(ref ((EntityState)this).inputBank.jump)).justPressed)
			{
				((EntityState)this).outer.SetState((EntityState)(object)new EndRidingState());
			}
		}

		public override void OnExit()
		{
			base.OnExit();
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.RemoveBuff(Buffs.ridingBuff);
			}
			inputGenericSkill = _originalSkill;
		}
	}
	public class BaseRidingState : GenericCharacterMain
	{
		public CharacterBody riddenBody;

		public Collider riddenCollider;

		private GameObject _anchor;

		private Vector3 _initialPosition;

		private Vector3 _lastPosition;

		private Quaternion _lastRotation;

		private Transform _modelTransform;

		public override void OnEnter()
		{
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: 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_00b7: Expected O, but got Unknown
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: Unknown result type (might be due to invalid IL or missing references)
			//IL_022d: Unknown result type (might be due to invalid IL or missing references)
			//IL_023f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Unknown result type (might be due to invalid IL or missing references)
			//IL_024b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_025c: Unknown result type (might be due to invalid IL or missing references)
			((GenericCharacterMain)this).OnEnter();
			if (Object.op_Implicit((Object)(object)riddenBody) && NetworkServer.active)
			{
				riddenBody.AddBuff(Buffs.riddenBuff);
			}
			riddenCollider = findHighestHurtbox();
			if ((Object)(object)riddenCollider == (Object)null)
			{
				((EntityState)this).outer.SetNextStateToMain();
				return;
			}
			((EntityState)this).GetComponent<AliemRidingColliderHolderThatsIt>().riddenCollider = riddenCollider;
			Bounds bounds = riddenCollider.bounds;
			Vector3 center = ((Bounds)(ref bounds)).center;
			bounds = riddenCollider.bounds;
			center.y = ((Bounds)(ref bounds)).max.y;
			_anchor = new GameObject("aliemAnchor");
			_anchor.transform.SetParent(((Component)riddenCollider).transform);
			_anchor.transform.position = center;
			if ((Object)(object)riddenBody.modelLocator != (Object)null && (Object)(object)riddenBody.modelLocator.modelTransform != (Object)null)
			{
				_anchor.transform.rotation = riddenBody.modelLocator.modelTransform.rotation;
			}
			else
			{
				_anchor.transform.rotation = ((Component)riddenBody).gameObject.transform.rotation;
			}
			if (AliemConfig.M3_Leap_RidingControl.Value && Object.op_Implicit((Object)(object)riddenBody) && Object.op_Implicit((Object)(object)riddenBody.master) && riddenBody.master.aiComponents.Length != 0 && Object.op_Implicit((Object)(object)riddenBody.master.aiComponents[0]))
			{
				riddenBody.master.aiComponents[0].stateMachine.SetNextState((EntityState)(object)new OverrideAICombat
				{
					overridor = ((EntityState)this).inputBank
				});
			}
			((EntityState)this).gameObject.layer = LayerIndex.fakeActor.intVal;
			_modelTransform = ((EntityState)this).GetModelTransform();
			_initialPosition = (Object.op_Implicit((Object)(object)_modelTransform) ? _modelTransform.position : ((EntityState)this).transform.position);
			_lastPosition = _initialPosition;
			_lastRotation = ((EntityState)this).transform.rotation;
			((Behaviour)((EntityState)this).modelLocator).enabled = false;
		}

		private Collider findHighestHurtbox()
		{
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)riddenBody.hurtBoxGroup == (Object)null)
			{
				return null;
			}
			HurtBox[] hurtBoxes = riddenBody.hurtBoxGroup.hurtBoxes;
			HurtBox val = null;
			foreach (HurtBox val2 in hurtBoxes)
			{
				if (!((Object)(object)val2 == (Object)null))
				{
					if ((Object)(object)val == (Object)null)
					{
						val = val2;
					}
					else if (((Component)val2).transform.position.y > ((Component)val).transform.position.y)
					{
						val = val2;
					}
				}
			}
			return (val != null) ? val.collider : null;
		}

		public override void Update()
		{
			((GenericCharacterMain)this).Update();
			if ((Object)(object)riddenCollider != (Object)null && (Object)(object)_anchor != (Object)null)
			{
				UpdateRidingPosition();
			}
		}

		public override void FixedUpdate()
		{
			//IL_0041: 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_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			((GenericCharacterMain)this).FixedUpdate();
			if (riddenBody.healthComponent.alive)
			{
				if (((EntityState)this).isAuthority && Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
				{
					((EntityState)this).characterMotor.moveDirection = Vector3.zero;
					((EntityState)this).characterMotor.velocity = Vector3.zero;
					((EntityState)this).characterMotor.rootMotion = Vector3.zero;
					if ((Object)(object)riddenCollider != (Object)null && (Object)(object)_anchor != (Object)null)
					{
						UpdateRidingPosition(fixedUpdate: true);
					}
					else
					{
						((EntityState)this).outer.SetNextStateToMain();
					}
				}
			}
			else
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		private void UpdateRidingPosition(bool fixedUpdate = false)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: 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_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: 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)
			//IL_00bf: 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_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: 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_00b6: 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)
			Vector3 val = Vector3.Lerp(_initialPosition, _anchor.transform.position, ((EntityState)this).fixedAge * 3f);
			val = Vector3.Lerp(_lastPosition, val, 0.5f);
			((BaseCharacterController)((EntityState)this).characterMotor).Motor.SetPosition(val, true);
			if (Object.op_Implicit((Object)(object)_modelTransform))
			{
				_modelTransform.position = val;
				Quaternion val2 = Quaternion.Lerp(_lastRotation, _anchor.transform.rotation, 0.1f);
				_modelTransform.rotation = val2;
				((EntityState)this).characterDirection.forward = _anchor.transform.forward;
				_lastRotation = val2;
			}
			_lastPosition = val;
		}

		public override void OnExit()
		{
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Expected O, but got Unknown
			((GenericCharacterMain)this).OnExit();
			if (Object.op_Implicit((Object)(object)riddenBody) && NetworkServer.active)
			{
				riddenBody.RemoveBuff(Buffs.riddenBuff);
			}
			if (AliemConfig.M3_Leap_RidingControl.Value && Object.op_Implicit((Object)(object)riddenBody) && Object.op_Implicit((Object)(object)riddenBody.master) && riddenBody.master.aiComponents.Length != 0 && Object.op_Implicit((Object)(object)riddenBody.master.aiComponents[0]))
			{
				riddenBody.master.aiComponents[0].stateMachine.SetNextState((EntityState)new Combat());
			}
			((EntityState)this).GetComponent<AliemRidingColliderHolderThatsIt>().riddenCollider = null;
			((EntityState)this).gameObject.layer = LayerIndex.defaultLayer.intVal;
			Object.Destroy((Object)(object)_anchor);
			((EntityState)this).PlayAnimation("FullBody, Underride", "BufferEmpty");
			((Behaviour)((EntityState)this).modelLocator).enabled = true;
		}

		public override void OnSerialize(NetworkWriter writer)
		{
			((EntityState)this).OnSerialize(writer);
			if (Object.op_Implicit((Object)(object)riddenBody))
			{
				writer.Write(((Component)riddenBody).gameObject);
			}
		}

		public override void OnDeserialize(NetworkReader reader)
		{
			((EntityState)this).OnDeserialize(reader);
			GameObject val = reader.ReadGameObject();
			if (Object.op_Implicit((Object)(object)val))
			{
				riddenBody = val.GetComponent<CharacterBody>();
			}
		}
	}
	public class EndRidingState : BaseState
	{
		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			((EntityState)this).PlayAnimation("FullBody, Underride", "BufferEmpty");
			((EntityState)this).outer.SetState((EntityState)(object)new AliemCharacterMain
			{
				wasRiding = true
			});
		}
	}
	public class ChargeRayGun : BaseChargingState
	{
		public override float BaseMaxChargeDuration => 3f;

		public virtual float MinDamageCoefficient => AliemConfig.M1_RayGunCharged_Damage_Min.Value;

		public virtual float MaxDamageCoefficient => AliemConfig.M1_RayGunCharged_Damage_Max.Value;

		protected override void StartNextState(float chargeCoefficient)
		{
			string shootSound_ = ((chargeCoefficient >= 1f) ? "Play_RayGunBigClassic" : "Play_RayGunBigClassic");
			((EntityState)this).outer.SetNextState((EntityState)(object)new RayGunChargedFire(GetChargedValue(MinDamageCoefficient, MaxDamageCoefficient), shootSound_)
			{
				isOffHanded = base.isOffHanded
			});
		}
	}
	public class CloseRangeKnife : BaseMeleeAttack
	{
		public override void OnEnter()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: 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)
			hitboxGroupName = "Knife";
			damageType = (DamageType)0;
			damageCoefficient = AliemConfig.M1_RayGun_Damage.Value * AliemConfig.M1_RayGun_CloseRangeKnife_Damage_Multiplier.Value;
			procCoefficient = 1f;
			pushForce = 300f;
			bonusForce = Vector3.zero;
			baseDuration = AliemConfig.M1_RayGun_CloseRangeKnife_Duration.Value;
			attackStartPercentTime = 0f;
			attackEndPercentTime = 0.5f;
			earlyExitPercentTime = 0.73f;
			hitStopDuration = 0.06f;
			attackRecoil = 0.5f;
			hitHopVelocity = 3f;
			swingSoundString = "";
			hitSoundString = "";
			muzzleString = "KnifeHitbox";
			playbackRateParam = "ShootGun.playbackRate";
			swingEffectPrefab = AliemAssets.knifeSwingEffect;
			hitEffectPrefab = AliemAssets.knifeImpactEffect;
			base.OnEnter();
		}

		protected override void PlayAttackAnimation()
		{
			((EntityState)this).PlayAnimation("Gesture, Override", "Knife", "ShootGun.playbackRate", duration, 0f);
		}
	}
	public class InputRayGun : MashAndHoldInputs
	{
		protected override EntityState initialMashState => (EntityState)(object)new RayGunFireUncharged();

		protected override EntityState newMashState => (EntityState)(object)new RayGunFireUncharged();

		protected override InterruptPriority mashInterruptPriority => (InterruptPriority)0;

		protected override EntityState newHoldState
		{
			get
			{
				ChargeRayGun chargeRayGun = new ChargeRayGun();
				((BaseSkillState)chargeRayGun).activatorSkillSlot = ((BaseSkillState)this).activatorSkillSlot;
				return (EntityState)(object)chargeRayGun;
			}
		}

		protected override InterruptPriority holdInterruptPriority => (InterruptPriority)0;

		protected override bool RepeatHoldState => false;
	}
	public class RayGunChargedFire : RayGunFire
	{
		private float _chargedDamageCoefficient;

		private string _chargedShootSound = "Play_RayGunBigClassic";

		public override float BaseDuration => 0.5f;

		public override float BaseDamageCoefficient => _chargedDamageCoefficient;

		public override string soundString => _chargedShootSound;

		public override GameObject projectile => Projectiles.RayGunProjectilePrefabBig;

		public RayGunChargedFire()
		{
			_chargedDamageCoefficient = AliemConfig.M1_RayGunCharged_Damage_Max.Value;
		}

		public RayGunChargedFire(float dam_, string shootSound_)
		{
			_chargedDamageCoefficient = dam_;
			_chargedShootSound = shootSound_;
		}

		public override void PlayAnimation(float duration)
		{
			((EntityState)this).PlayAnimation("Gesture, Override", "ShootGunBig", "ShootGun.playbackRate", duration * 3f, 0f);
			((EntityState)this).PlayAnimation(base.isOffHanded ? "RightArm, Over" : "LeftArm, Over", "ShootGunBig");
			((EntityState)this).PlayAnimation(base.isOffHanded ? "LeftArm, Under" : "RightArm, Under", "ShootGunBig");
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: 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)
			return (InterruptPriority)1;
		}
	}
	public class RayGunFire : GenericProjectileBaseState, IOffHandable
	{
		public static float ProjectilePitch = 0f;

		public static float ProjectileForce = 80f;

		public static float RayGunDamageCoefficient => AliemConfig.M1_RayGun_Damage.Value;

		public virtual float BaseDuration => AliemConfig.M1_RayGun_Duration.Value;

		public virtual float BaseDelayDuration => 0f;

		public virtual float BaseDamageCoefficient => RayGunDamageCoefficient;

		public virtual string muzzleString => isOffHanded ? "BlasterMuzzle.R" : "BlasterMuzzle";

		public virtual GameObject projectile => Projectiles.RayGunProjectilePrefab;

		public virtual string soundString => AliemConfig.M1_RayGun_Sound_Alt.Value ? "Play_INV_RayGun" : "Play_RayGun";

		public bool isOffHanded { get; set; }

		public virtual GameObject muzzleEffectPrefab => FirePistol2.muzzleEffectPrefab;

		public override void OnEnter()
		{
			base.projectilePrefab = projectile;
			base.baseDuration = BaseDuration;
			base.baseDelayBeforeFiringProjectile = BaseDelayDuration;
			base.targetMuzzle = muzzleString;
			base.effectPrefab = muzzleEffectPrefab;
			base.damageCoefficient = BaseDamageCoefficient;
			base.force = ProjectileForce;
			base.recoilAmplitude = 0.1f;
			base.bloom = 10f;
			base.attackSoundString = soundString;
			ModifyState();
			((GenericProjectileBaseState)this).OnEnter();
		}

		protected virtual void ModifyState()
		{
		}

		public override void FixedUpdate()
		{
			((GenericProjectileBaseState)this).FixedUpdate();
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: 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)
			return (InterruptPriority)1;
		}

		public override void PlayAnimation(float duration)
		{
			((EntityState)this).PlayAnimation("Gesture, Override", "ShootGun", "ShootGun.playbackRate", duration, 0f);
			((EntityState)this).PlayAnimation(isOffHanded ? "RightArm, Over" : "LeftArm, Over", "ShootGun");
			((EntityState)this).PlayAnimation(isOffHanded ? "LeftArm, Under" : "RightArm, Under", "ShootGun");
		}

		public override void OnSerialize(NetworkWriter writer)
		{
			((EntityState)this).OnSerialize(writer);
			writer.Write(isOffHanded);
		}

		public override void OnDeserialize(NetworkReader reader)