Decompiled source of dgoslings Samus Mod v2.2.3

SamusMod.dll

Decompiled 3 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.InteropServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EmotesAPI;
using EntityStates;
using MonoMod.RuntimeDetour.HookGen;
using On.RoR2;
using On.RoR2.UI;
using R2API;
using R2API.ScriptableObjects;
using R2API.Utils;
using Rewired;
using Rewired.Data;
using Rewired.Data.Mapping;
using RoR2;
using RoR2.ContentManagement;
using RoR2.PostProcessing;
using RoR2.Projectile;
using RoR2.Skills;
using RoR2.UI;
using SamusMod.Misc;
using SamusMod.Modules;
using SamusMod.SkillStates.BaseStates;
using TMPro;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using VRAPI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
namespace SamusMod
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.dgosling.Samus", "Samus", "2.2.3")]
	public class SamusPlugin : BaseUnityPlugin
	{
		public const string MODUID = "com.dgosling.Samus";

		public const string MODNAME = "Samus";

		public const string MODVERSION = "2.2.3";

		public const string developerPrefix = "DG";

		public static bool debug;

		public static bool cancel;

		public static float jumps;

		public static SamusPlugin instance;

		public static ManualLogSource logger
		{
			get
			{
				SamusPlugin samusPlugin = instance;
				if (samusPlugin == null)
				{
					return null;
				}
				return ((BaseUnityPlugin)samusPlugin).Logger;
			}
		}

		private void Awake()
		{
			instance = this;
			Config.ReadConfig();
			Assets.Init();
			if (!cancel)
			{
				Shaders.init();
				Tokens.Init();
				Prefabs.Init();
				Buffs.Init();
				Unlockables.Init();
				ExtraInputs.AddActionsToInputCatalog();
				HookEndpointManager.Add((MethodBase)typeof(UserData).GetMethod("wVZZKoPFwEvodLvLcYNvVAPKpUj", BindingFlags.Instance | BindingFlags.NonPublic), (Delegate)new Action<Action<UserData>, UserData>(ExtraInputs.AddCustomActions));
				if (debug)
				{
					Helpers.AwakeDebug();
				}
				ContentPackProvider.Initialize();
				Hook();
			}
		}

		private void Start()
		{
			if (debug)
			{
				Helpers.StartDebug();
			}
		}

		private void Hook()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Expected O, but got Unknown
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Expected O, but got Unknown
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Expected O, but got Unknown
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Expected O, but got Unknown
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Expected O, but got Unknown
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Expected O, but got Unknown
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Expected O, but got Unknown
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Expected O, but got Unknown
			CharacterBody.FixedUpdate += new hook_FixedUpdate(CharacterBody_FixedUpdate);
			DamageTrail.DoDamage += new hook_DoDamage(DamageTrail_DoDamage);
			CharacterBody.RecalculateStats += new hook_RecalculateStats(CharacterBody_RecalculateStats);
			DotController.InflictDot_GameObject_GameObject_DotIndex_float_float_Nullable1 += new hook_InflictDot_GameObject_GameObject_DotIndex_float_float_Nullable1(DotController_InflictDot_GameObject_GameObject_DotIndex_float_float_Nullable1);
			HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_TakeDamage);
			CharacterMotor.FixedUpdate += new hook_FixedUpdate(CharacterMotor_FixedUpdate);
			CharacterMotor.OnLanded += new hook_OnLanded(CharacterMotor_OnLanded);
			CharacterMaster.OnBodyDamaged += new hook_OnBodyDamaged(CharacterMaster_OnBodyDamaged);
			UserProfile.LoadDefaultProfile += new hook_LoadDefaultProfile(ExtraInputs.OnLoadDefaultProfile);
			SaveSystem.LoadUserProfiles += new hook_LoadUserProfiles(ExtraInputs.OnLoadUserProfiles);
			SettingsPanelController.Start += new hook_Start(SettingsPanelControllerStart);
			if (EmoteAPICompatibility.enabled)
			{
				SurvivorCatalog.Init += new hook_Init(EmoteAPICompatibility.SurvivorCatalog_Init);
			}
		}

		private void CharacterBody_RecalculateStats(orig_RecalculateStats orig, CharacterBody self)
		{
			orig.Invoke(self);
			if (Object.op_Implicit((Object)(object)self) && Object.op_Implicit((Object)(object)self.inventory) && Object.op_Implicit((Object)(object)self.skillLocator) && self.baseNameToken == "DG_SAMUS_NAME")
			{
				SkillLocator skillLocator = self.skillLocator;
				if (Object.op_Implicit((Object)(object)skillLocator.secondary) && !BaseSamus.morphBall)
				{
					int num = skillLocator.secondary.bonusStockFromBody - self.inventory.GetItemCount(Items.SecondarySkillMagazine);
					int itemCount = self.inventory.GetItemCount(Items.SecondarySkillMagazine);
					skillLocator.secondary.SetBonusStockFromBody(itemCount * 5 + num);
				}
			}
		}

		private void GenericSkill_SetBonusStockFromBody(orig_SetBonusStockFromBody orig, GenericSkill self, int newBonusStockFromBody)
		{
			if (!Object.op_Implicit((Object)(object)self))
			{
				return;
			}
			if ((Object)(object)self.characterBody.skillLocator.secondary == (Object)(object)self && self.characterBody.baseNameToken == "DG_SAMUS_NAME")
			{
				if (!BaseSamus.morphBall)
				{
					newBonusStockFromBody *= 5;
					orig.Invoke(self, newBonusStockFromBody);
				}
				else if (BaseSamus.morphBall)
				{
					newBonusStockFromBody = Mathf.FloorToInt((float)(self.characterBody.skillLocator.primary.maxStock / 3)) - 1;
					orig.Invoke(self, newBonusStockFromBody);
				}
			}
			else
			{
				orig.Invoke(self, newBonusStockFromBody);
			}
		}

		private void DotController_InflictDot_GameObject_GameObject_DotIndex_float_float_Nullable1(orig_InflictDot_GameObject_GameObject_DotIndex_float_float_Nullable1 orig, GameObject victimObject, GameObject attackerObject, DotIndex dotIndex, float duration, float damageMultiplier, uint? maxStacksFromAttacker)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Invalid comparison between Unknown and I4
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			if ((victimObject.gameObject.GetComponent<CharacterBody>().baseNameToken == "DG_SAMUS_NAME" || attackerObject.gameObject.GetComponent<CharacterBody>().baseNameToken == "DG_SAMUS_NAME") && (int)dotIndex == 3)
			{
				duration = 0f;
				damageMultiplier = 0f;
			}
			orig.Invoke(victimObject, attackerObject, dotIndex, duration, damageMultiplier, maxStacksFromAttacker);
		}

		private void CustomBind()
		{
		}

		internal static void SettingsPanelControllerStart(orig_Start orig, SettingsPanelController self)
		{
			orig.Invoke(self);
			if (((Object)self).name == "SettingsSubPanel, Controls (M&KB)" || ((Object)self).name == "SettingsSubPanel, Controls (Gamepad)")
			{
				Transform buttonToCopy = ((Component)self).transform.Find("Scroll View/Viewport/VerticalLayout/SettingsEntryButton, Binding (Jump)");
				uiHooks.AddActionBindingToSettings(RewiredAction.autoFire.Name, buttonToCopy);
			}
		}

		private void CharacterMaster_OnBodyDamaged(orig_OnBodyDamaged orig, CharacterMaster self, DamageReport damageReport)
		{
			if (Object.op_Implicit((Object)(object)self))
			{
				if (self.GetBody().baseNameToken == "DG_SAMUS_NAME")
				{
					Util.PlaySound("Hurt", self.GetBodyObject());
				}
				orig.Invoke(self, damageReport);
			}
		}

		private void CharacterMotor_OnLanded(orig_OnLanded orig, CharacterMotor self)
		{
			if (Object.op_Implicit((Object)(object)self))
			{
				if (self.body.baseNameToken == "DG_SAMUS_NAME" && jumps > 0f)
				{
					jumps = 0f;
				}
				orig.Invoke(self);
			}
		}

		private void CharacterMotor_FixedUpdate(orig_FixedUpdate orig, CharacterMotor self)
		{
			if (!Object.op_Implicit((Object)(object)self))
			{
				return;
			}
			if (self.body.baseNameToken == "DG_SAMUS_NAME")
			{
				if (self.jumpCount == 1 && jumps == 0f)
				{
					jumps = 1f;
					Util.PlaySound("Jump", ((Component)self).gameObject);
				}
				else if (self.jumpCount >= 2 && jumps + 1f == (float)self.jumpCount)
				{
					jumps += 1f;
					Util.PlaySound("DJump", ((Component)self).gameObject);
				}
			}
			orig.Invoke(self);
		}

		private void HealthComponent_TakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo)
		{
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)self != (Object)null && (Object)(object)damageInfo.inflictor != (Object)null && (Object)(object)self.body != (Object)null && self.body.baseNameToken == "DG_SAMUS_NAME" && (((Object)damageInfo.inflictor).name == "bombExplosion(Clone)" || ((Object)damageInfo.inflictor).name == "SamusMorphBomb(Clone)"))
			{
				damageInfo.damage = 0f;
				if (self.body.characterMotor.isGrounded || self.body.characterMotor.velocity.y > -10f)
				{
					damageInfo.force = new Vector3(0f, 1200f, 0f);
				}
				else
				{
					damageInfo.force = new Vector3(0f, 3000f, 0f);
				}
			}
			orig.Invoke(self, damageInfo);
		}

		private void DamageTrail_DoDamage(orig_DoDamage orig, DamageTrail self)
		{
			if (Object.op_Implicit((Object)(object)self) && ((Object)self.segmentPrefab).name == "FireTrailSegment")
			{
				self.damagePerSecond = 0f;
				AkSoundEngine.StopPlayingID(3193947170u);
			}
			orig.Invoke(self);
		}

		private void CharacterBody_FixedUpdate(orig_FixedUpdate orig, CharacterBody self)
		{
			if (Object.op_Implicit((Object)(object)self) && Object.op_Implicit((Object)(object)self.skillLocator.secondary) && Object.op_Implicit((Object)(object)self.skillLocator.special) && self.baseNameToken == "DG_SAMUS_NAME" && !BaseSamus.morphBall)
			{
				if (self.skillLocator.secondary.stock >= 5)
				{
					self.skillLocator.special.stock = 1;
				}
				else
				{
					self.skillLocator.special.RemoveAllStocks();
				}
			}
			orig.Invoke(self);
		}
	}
}
namespace SamusMod.SkillStates.Samus
{
	public class AutoFireBeam : BaseSkillState
	{
		private GameObject projectilePrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/Tracers/TracerNoSmoke");

		[SerializeField]
		public GameObject muzzleFlashPrefab;

		[SerializeField]
		public GameObject hitEffectPrefab;

		[SerializeField]
		public float baseDuration;

		private float duration;

		private float force = 5f;

		private string muzzleName = "gunCon";

		private Ray aimRay;

		private float timer;

		public override void OnEnter()
		{
			//IL_001b: 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)
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			aimRay = ((BaseState)this).GetAimRay();
		}

		private void Fire()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: 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_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			if (((EntityState)this).isAuthority)
			{
				if (Utils.IsUsingMotionControls(((EntityState)this).characterBody))
				{
					aimRay = MotionControls.dominantHand.aimRay;
					EntityState.PlayAnimationOnAnimator(MotionControls.dominantHand.animator, "Base Layer", "shoot", "Shoot.playbackRate", 0.1f);
				}
				else
				{
					((EntityState)this).PlayAnimation("Gesture, Override", "Beam", "Charge.playbackRate", 0.05f);
				}
				if (Object.op_Implicit((Object)(object)muzzleFlashPrefab))
				{
					EffectManager.SimpleMuzzleFlash(muzzleFlashPrefab, ((EntityState)this).gameObject, muzzleName, false);
				}
				float num = 0.1f * force;
				if (Utils.IsUsingMotionControls(((EntityState)this).characterBody))
				{
					Util.PlayAttackSpeedSound("beam", ((Component)MotionControls.dominantHand.muzzle).gameObject, ((BaseState)this).attackSpeedStat);
				}
				else
				{
					Util.PlayAttackSpeedSound("beam", ((EntityState)this).gameObject, ((BaseState)this).attackSpeedStat);
				}
				new BulletAttack
				{
					owner = ((EntityState)this).gameObject,
					weapon = ((EntityState)this).gameObject,
					origin = ((Ray)(ref aimRay)).origin,
					aimVector = ((Ray)(ref aimRay)).direction,
					minSpread = 0f,
					maxSpread = 0f,
					damage = ((BaseState)this).damageStat * Config.pBeamMult,
					force = num,
					tracerEffectPrefab = projectilePrefab,
					muzzleName = muzzleName,
					hitEffectPrefab = hitEffectPrefab,
					isCrit = ((BaseState)this).RollCrit(),
					radius = 0.1f,
					smartCollision = true
				}.Fire();
			}
		}

		public override void FixedUpdate()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).FixedUpdate();
			aimRay = ((BaseState)this).GetAimRay();
			timer += Time.fixedDeltaTime;
			if (timer >= duration)
			{
				timer = 0f;
				Fire();
			}
			if (((EntityState)this).isAuthority && !((BaseSkillState)this).IsKeyDownAuthority())
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)2;
		}
	}
	public class ChargeBeam : ChargeBeamBase
	{
		private GameObject chargeEffect;

		private Vector3 originalScale;

		public Vector3 newSize;

		public override void OnEnter()
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			crosshairOverridePrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/Crosshair/ToolbotGrenadeLauncherCrosshair");
			maxBloomRadius = 0.1f;
			minBloomRadius = 1f;
			originalScale = chargeEffectPrefab.transform.localScale;
			base.OnEnter();
			ChildLocator modelChildLocator = ((EntityState)this).GetModelChildLocator();
			if (Object.op_Implicit((Object)(object)modelChildLocator))
			{
				chargeEffect = ((Component)modelChildLocator.FindChild("chargeEffect")).gameObject;
				chargeEffect.SetActive(false);
			}
		}

		public override void FixedUpdate()
		{
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: 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_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			base.FixedUpdate();
			if (!chargeEffect.activeSelf && calcCharge() > 0.15f)
			{
				chargeEffect.SetActive(true);
			}
			if (!Utils.IsUsingMotionControls(((EntityState)this).characterBody))
			{
				newSize = new Vector3(calcCharge() * 10f, calcCharge() * 10f, calcCharge() * 10f);
			}
			else
			{
				newSize = new Vector3(calcCharge() / 2f, calcCharge() / 2f, calcCharge() / 2f);
			}
			base.chargeEffectInstance.transform.localScale = newSize;
		}

		public override void OnExit()
		{
			base.OnExit();
			if (Object.op_Implicit((Object)(object)chargeEffect))
			{
				chargeEffect.SetActive(false);
			}
		}

		public override BaseFireBeam GetNextBase()
		{
			return new FireBeam();
		}
	}
	public class ExitMorphBall : BaseSkillState
	{
		private static float baseDuration = 0.42f;

		private float duration;

		private ChildLocator childLocator;

		private GameObject ball;

		[SerializeField]
		public SkillDef bomb;

		[SerializeField]
		public SkillDef exitMorph;

		private static float recharge;

		private static int pstock;

		public static float BaseDuration
		{
			get
			{
				return baseDuration;
			}
			set
			{
				baseDuration = value;
			}
		}

		public static float Recharge
		{
			get
			{
				return recharge;
			}
			set
			{
				recharge = value;
			}
		}

		public static int Pstock
		{
			get
			{
				return pstock;
			}
			set
			{
				pstock = value;
			}
		}

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			duration = BaseDuration / ((BaseState)this).attackSpeedStat;
			childLocator = ((EntityState)this).GetModelChildLocator();
			ball = ((Component)childLocator.FindChild("Ball2")).gameObject;
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.RemoveBuff(Buffs.ArmorBoost);
			}
			Collider component = ball.GetComponent<Collider>();
			ball.GetComponent<Rigidbody>();
			component.enabled = false;
			((Component)childLocator.FindChild("Ball2")).gameObject.SetActive(false);
			((Component)childLocator.FindChild("Body")).gameObject.SetActive(true);
			((EntityState)this).PlayAnimation("Body", "transformOut", "Roll.playbackRate", duration);
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (!(((EntityState)this).fixedAge < duration) && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override void OnExit()
		{
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).OnExit();
			((EntityState)this).characterBody.baseMoveSpeed = morphBallEnter.NormalSpeed;
			((EntityState)this).characterBody.baseJumpCount = morphBallEnter.NormalJumps;
			((EntityState)this).characterBody.sprintingSpeedMultiplier = morphBallEnter.NormalSprint;
			((EntityState)this).characterBody.RecalculateStats();
			((EntityState)this).skillLocator.primary.UnsetSkillOverride((object)((EntityState)this).skillLocator.primary, bomb, (SkillOverridePriority)4);
			((EntityState)this).skillLocator.utility.UnsetSkillOverride((object)((EntityState)this).skillLocator.utility, exitMorph, (SkillOverridePriority)4);
			((EntityState)this).skillLocator.secondary = BaseSamus.MissileSkill;
			if (Utils.IsUsingMotionControls(((EntityState)this).characterBody))
			{
				SkinnedMeshRenderer[] dsMR = morphBallEnter.DsMR;
				for (int i = 0; i < dsMR.Length; i++)
				{
					((Renderer)dsMR[i]).enabled = true;
				}
				dsMR = morphBallEnter.NDsMR;
				for (int i = 0; i < dsMR.Length; i++)
				{
					((Renderer)dsMR[i]).enabled = true;
				}
				morphBallEnter.VRCamera.localPosition = morphBallEnter.CameraPOS;
			}
			BaseSamus.morphBall = false;
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)4;
		}
	}
	public class FireBeam : BaseFireBeam
	{
		public Vector3 sizes;

		public override void OnEnter()
		{
			baseDuration = 0.05f;
			force = 5f;
			maxDamageCoefficient = StaticValues.cshootDamageCoefficient;
			minDamageCoefficient = StaticValues.shootDamageCoefficient;
			selfForce = 0f;
			speed = 200f;
			ResizeProjectile();
			tracerPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/Tracers/TracerNoSmoke");
			muzzleName = "gunCon";
			if (charge <= 0.4f)
			{
				projSound = "cShoot25";
			}
			else if (charge <= 0.7f)
			{
				projSound = "cShoot50";
			}
			else if (charge <= 0.9f)
			{
				projSound = "cShoot75";
			}
			else
			{
				projSound = "cShoot100";
			}
			tracerSound = "beam";
			base.OnEnter();
		}

		public override void OnExit()
		{
			//IL_000b: 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)
			projectilePrefab.transform.localScale = Vector3.one;
			projectilePrefab.GetComponent<ProjectileController>().ghostPrefab.transform.localScale = Vector3.one;
			projectilePrefab.GetComponent<SphereCollider>().radius = 0.6f;
			base.OnExit();
		}
	}
	public class Missile : BaseMissile
	{
		public override void OnEnter()
		{
			baseDuration = 0.1f;
			damageCoef = StaticValues.missileDamageCoefficient;
			recoil = 0.5f;
			smissleObject = null;
			Sound = "Missile";
			sMissile = false;
			base.OnEnter();
		}
	}
	public class MorphBallBomb : BaseSkillState
	{
		public float baseDuration = 0.1f;

		public string bombSound;

		[SerializeField]
		public GameObject projectilePrefab;

		private bool hasFired;

		private ChildLocator childLocator;

		public float damageCoef = 3f * Config.pBombMult;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			bombSound = "morphBomb";
			childLocator = ((EntityState)this).GetModelChildLocator();
			hasFired = false;
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (!hasFired)
			{
				Fire();
			}
			if (!(((EntityState)this).fixedAge < baseDuration) && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		private void Fire()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: 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_005c: 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_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_00a1: 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_00a8: Unknown result type (might be due to invalid IL or missing references)
			if (((EntityState)this).isAuthority)
			{
				Ray aimRay = ((BaseState)this).GetAimRay();
				if ((Object)(object)projectilePrefab != (Object)null)
				{
					FireProjectileInfo val = default(FireProjectileInfo);
					val.projectilePrefab = projectilePrefab;
					val.owner = ((EntityState)this).gameObject;
					val.position = ((EntityState)this).GetModelChildLocator().FindChild("Ball2").position;
					val.rotation = Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction);
					val.damage = damageCoef * ((BaseState)this).damageStat;
					val.force = 0f;
					val.crit = ((BaseState)this).RollCrit();
					FireProjectileInfo val2 = val;
					ProjectileManager.instance.FireProjectile(val2);
					hasFired = true;
				}
			}
		}

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)4;
		}
	}
	public class MorphBallPBomb : BaseSkillState
	{
		public float baseDuration = 0.5f;

		public string bombSound;

		[SerializeField]
		public GameObject projectilePrefab;

		private bool hasFired;

		private ChildLocator childLocator;

		public float damageCoef = 10f * Config.pPowerBombMult;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			bombSound = "Powerbomb";
			childLocator = ((EntityState)this).GetModelChildLocator();
			hasFired = false;
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (!hasFired)
			{
				Fire();
			}
			if (!(((EntityState)this).fixedAge < baseDuration) && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		private void Fire()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: 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_005c: 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_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_00a1: 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_00a8: Unknown result type (might be due to invalid IL or missing references)
			if (((EntityState)this).isAuthority)
			{
				Ray aimRay = ((BaseState)this).GetAimRay();
				if ((Object)(object)projectilePrefab != (Object)null)
				{
					FireProjectileInfo val = default(FireProjectileInfo);
					val.projectilePrefab = projectilePrefab;
					val.owner = ((EntityState)this).gameObject;
					val.position = ((EntityState)this).GetModelChildLocator().FindChild("Ball2").position;
					val.rotation = Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction);
					val.damage = damageCoef * ((BaseState)this).damageStat;
					val.force = 0f;
					val.crit = ((BaseState)this).RollCrit();
					FireProjectileInfo val2 = val;
					ProjectileManager.instance.FireProjectile(val2);
					hasFired = true;
				}
			}
		}

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)4;
		}
	}
	public class Roll : BaseState
	{
		public float duration;

		private float initialSpeedCoefficient;

		private float finalSpeedCoefficient;

		public string dodgeSoundString;

		public string bombSoundString;

		[SerializeField]
		public GameObject projectilePrefab;

		public float damageCoefficient;

		public float dodgeFOV;

		private float rollSpeed;

		private Vector3 forwardDirection;

		private Animator animator;

		private Vector3 previousPosition;

		private bool hasFired;

		public SkinnedMeshRenderer[] DmeshRenderers;

		public SkinnedMeshRenderer[] NDmeshRenderers;

		private bool vrCheck;

		public override void OnEnter()
		{
			//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ec: 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_011a: 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_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0304: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0309: Unknown result type (might be due to invalid IL or missing references)
			//IL_030e: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			duration = 0.8f;
			dodgeFOV = 110f;
			bombSoundString = "Bomb";
			dodgeSoundString = "Roll";
			if (VR.enabled)
			{
				DmeshRenderers = ((Component)MotionControls.dominantHand.transform).gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
				NDmeshRenderers = ((Component)MotionControls.nonDominantHand.transform).gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
			}
			damageCoefficient = StaticValues.dashDamageCoefficient;
			initialSpeedCoefficient = StaticValues.rollSpeedCoefficientIni;
			finalSpeedCoefficient = StaticValues.rollSpeedCoefficientFin;
			if (dodgeSoundString != null)
			{
				Util.PlaySound(dodgeSoundString, ((EntityState)this).gameObject);
			}
			animator = ((EntityState)this).GetModelAnimator();
			((Component)animator).GetComponent<ChildLocator>();
			if (((EntityState)this).isAuthority && Object.op_Implicit((Object)(object)((EntityState)this).inputBank) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection) && !Utils.IsUsingMotionControls(((EntityState)this).characterBody))
			{
				Vector3 val = ((((EntityState)this).inputBank.moveVector == Vector3.zero) ? ((EntityState)this).characterDirection.forward : ((EntityState)this).inputBank.moveVector);
				forwardDirection = ((Vector3)(ref val)).normalized;
			}
			else if (((EntityState)this).isAuthority && Utils.IsUsingMotionControls(((EntityState)this).characterBody))
			{
				forwardDirection = ((Component)Camera.main).transform.forward;
				vrCheck = true;
				SkinnedMeshRenderer[] dmeshRenderers = DmeshRenderers;
				for (int i = 0; i < dmeshRenderers.Length; i++)
				{
					((Renderer)dmeshRenderers[i]).enabled = false;
				}
				dmeshRenderers = NDmeshRenderers;
				for (int i = 0; i < dmeshRenderers.Length; i++)
				{
					((Renderer)dmeshRenderers[i]).enabled = false;
				}
			}
			Vector3 val2 = (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection) ? ((EntityState)this).characterDirection.forward : forwardDirection);
			Vector3 val3 = Vector3.Cross(Vector3.up, val2);
			float num = Vector3.Dot(forwardDirection, val2);
			float num2 = Vector3.Dot(forwardDirection, val3);
			animator.SetFloat("forwardSpeed", num, 0.1f, Time.fixedDeltaTime);
			animator.SetFloat("rightSpeed", num2, 0.1f, Time.fixedDeltaTime);
			if (Mathf.Abs(num) > Mathf.Abs(num2))
			{
				((EntityState)this).PlayAnimation("Body", (num > 0f) ? "Roll" : "Roll", "Roll.playbackRate", duration);
			}
			else
			{
				((EntityState)this).PlayAnimation("Body", (num2 > 0f) ? "Roll" : "Roll", "Roll.playbackRate", duration);
			}
			RecalculateRollSpeed();
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
			{
				((EntityState)this).characterMotor.velocity.y = 0f;
				((EntityState)this).characterMotor.velocity = forwardDirection * rollSpeed;
			}
			previousPosition = ((EntityState)this).transform.position - (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) ? ((EntityState)this).characterMotor.velocity : Vector3.zero);
		}

		private void RecalculateRollSpeed()
		{
			rollSpeed = base.moveSpeedStat * Mathf.Lerp(initialSpeedCoefficient, finalSpeedCoefficient, ((EntityState)this).fixedAge / duration);
		}

		public override void FixedUpdate()
		{
			//IL_0069: 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_007c: 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_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: 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)
			((EntityState)this).FixedUpdate();
			RecalculateRollSpeed();
			if (((EntityState)this).fixedAge >= duration / 2f && !hasFired)
			{
				Fire();
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams))
			{
				((EntityState)this).cameraTargetParams.fovOverride = Mathf.Lerp(dodgeFOV, 60f, ((EntityState)this).fixedAge / duration);
			}
			Vector3 val = ((EntityState)this).transform.position - previousPosition;
			Vector3 normalized = ((Vector3)(ref val)).normalized;
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection) && normalized != Vector3.zero)
			{
				Vector3 val2 = normalized * rollSpeed;
				float y = val2.y;
				val2.y = 0f;
				Vector3 velocity = forwardDirection * Mathf.Max(Vector3.Dot(val2, forwardDirection), 0f);
				velocity.y += Mathf.Max(y, 0f);
				((EntityState)this).characterMotor.velocity = velocity;
			}
			previousPosition = ((EntityState)this).transform.position;
			if (!(((EntityState)this).fixedAge < duration) && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		private void Fire()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//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_0057: 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_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: 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)
			if (!((EntityState)this).isAuthority)
			{
				return;
			}
			Ray aimRay = ((BaseState)this).GetAimRay();
			if ((Object)(object)projectilePrefab != (Object)null)
			{
				FireProjectileInfo val = default(FireProjectileInfo);
				val.projectilePrefab = projectilePrefab;
				val.owner = ((EntityState)this).gameObject;
				val.position = ((Ray)(ref aimRay)).origin;
				val.rotation = Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction);
				val.damage = damageCoefficient * base.damageStat;
				val.force = 0f;
				val.crit = ((BaseState)this).RollCrit();
				FireProjectileInfo val2 = val;
				if (bombSoundString != null)
				{
					Util.PlaySound(bombSoundString, ((EntityState)this).gameObject);
				}
				ProjectileManager.instance.FireProjectile(val2);
				hasFired = true;
			}
		}

		public override void OnExit()
		{
			((Component)animator).GetComponent<ChildLocator>();
			if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams))
			{
				((EntityState)this).cameraTargetParams.fovOverride = -1f;
			}
			if (hasFired)
			{
				hasFired = false;
			}
			if (Utils.IsUsingMotionControls(((EntityState)this).characterBody) && vrCheck)
			{
				SkinnedMeshRenderer[] dmeshRenderers = DmeshRenderers;
				for (int i = 0; i < dmeshRenderers.Length; i++)
				{
					((Renderer)dmeshRenderers[i]).enabled = true;
				}
				dmeshRenderers = NDmeshRenderers;
				for (int i = 0; i < dmeshRenderers.Length; i++)
				{
					((Renderer)dmeshRenderers[i]).enabled = true;
				}
			}
			((EntityState)this).OnExit();
		}

		public override void OnSerialize(NetworkWriter writer)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).OnSerialize(writer);
			writer.Write(forwardDirection);
		}

		public override void OnDeserialize(NetworkReader reader)
		{
			//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)
			((EntityState)this).OnDeserialize(reader);
			forwardDirection = reader.ReadVector3();
		}
	}
	public class SMissile : BaseMissile
	{
		public override void OnEnter()
		{
			damageCoef = StaticValues.smissileDamageCoefficient;
			baseDuration = 0.1f;
			recoil = 0.5f;
			Sound = "SMissile";
			sMissile = true;
			base.OnEnter();
		}

		public override void OnExit()
		{
			((EntityState)this).skillLocator.secondary.DeductStock(5);
			((EntityState)this).skillLocator.secondary.RecalculateMaxStock();
			base.OnExit();
		}
	}
	public class morphBallEnter : BaseSkillState
	{
		private ChildLocator ChildLocator;

		public float speedMult = 1.2f;

		public float baseDuration = 0.42f;

		private float duration;

		private GameObject ball;

		private GameObject armature;

		private GameObject mesh;

		private GameObject bone;

		private static float normalSpeed;

		private Transform tran;

		private float velx;

		private float vely;

		private float velz;

		private static int normalJumps;

		private static float normalSprint;

		[SerializeField]
		public SkillDef bomb;

		[SerializeField]
		public SkillDef powerBomb;

		[SerializeField]
		public SkillDef exitMorph;

		private static SkinnedMeshRenderer[] nDsMR;

		private static Vector3 cameraPOS;

		private static Transform vRCamera;

		private static Animator vR;

		private static SkinnedMeshRenderer[] dsMR;

		public static int NormalJumps
		{
			get
			{
				return normalJumps;
			}
			set
			{
				normalJumps = value;
			}
		}

		public static float NormalSprint
		{
			get
			{
				return normalSprint;
			}
			set
			{
				normalSprint = value;
			}
		}

		public static SkinnedMeshRenderer[] DsMR
		{
			get
			{
				return dsMR;
			}
			set
			{
				dsMR = value;
			}
		}

		public static SkinnedMeshRenderer[] NDsMR
		{
			get
			{
				return nDsMR;
			}
			set
			{
				nDsMR = value;
			}
		}

		public static Vector3 CameraPOS
		{
			get
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				return cameraPOS;
			}
			set
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				cameraPOS = value;
			}
		}

		public static Transform VRCamera
		{
			get
			{
				return vRCamera;
			}
			set
			{
				vRCamera = value;
			}
		}

		public static Animator VR
		{
			get
			{
				return vR;
			}
			set
			{
				vR = value;
			}
		}

		public static float NormalSpeed
		{
			get
			{
				return normalSpeed;
			}
			set
			{
				normalSpeed = value;
			}
		}

		public override void OnEnter()
		{
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			((EntityState)this).skillLocator.primary.SetSkillOverride((object)((EntityState)this).skillLocator.primary, bomb, (SkillOverridePriority)4);
			((EntityState)this).skillLocator.utility.SetSkillOverride((object)((EntityState)this).skillLocator.utility, exitMorph, (SkillOverridePriority)4);
			((EntityState)this).skillLocator.secondary = BaseSamus.PowerBallskill;
			ChildLocator = ((EntityState)this).GetModelChildLocator();
			ball = ((Component)ChildLocator.FindChild("Ball2")).gameObject;
			armature = ((Component)ChildLocator.FindChild("armature")).gameObject;
			mesh = ((Component)ChildLocator.FindChild("Body")).gameObject;
			bone = ((Component)ChildLocator.FindChild("Ball2Bone")).gameObject;
			if (Utils.IsUsingMotionControls(((EntityState)this).characterBody))
			{
				VR = MotionControls.dominantHand.animator;
				VRCamera = ((EntityState)this).characterBody.transform.Find("VRCamera");
				DsMR = ((Component)MotionControls.dominantHand.transform).gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
				NDsMR = ((Component)MotionControls.nonDominantHand.transform).gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
				VRStuff.SamusHUD.inMorphBall = true;
				SkinnedMeshRenderer[] array = DsMR;
				for (int i = 0; i < array.Length; i++)
				{
					((Renderer)array[i]).enabled = false;
				}
				array = NDsMR;
				for (int i = 0; i < array.Length; i++)
				{
					((Renderer)array[i]).enabled = false;
				}
				CameraPOS = VRCamera.localPosition;
				VRCamera.Translate(0f, -0.5f, 0f);
			}
			((EntityState)this).PlayAnimation("Body", "transformIn", "Roll.playbackRate", duration);
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (!(((EntityState)this).fixedAge < duration) && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override void OnExit()
		{
			((EntityState)this).OnExit();
			ball.GetComponent<Rigidbody>().constraints = (RigidbodyConstraints)94;
			ball.GetComponent<Rigidbody>().detectCollisions = false;
			NormalSpeed = ((EntityState)this).characterBody.baseMoveSpeed;
			((EntityState)this).characterBody.baseMoveSpeed = NormalSpeed * 2f;
			NormalJumps = ((EntityState)this).characterBody.baseJumpCount;
			((EntityState)this).characterBody.baseJumpCount = 0;
			NormalSprint = ((EntityState)this).characterBody.sprintingSpeedMultiplier;
			((EntityState)this).characterBody.sprintingSpeedMultiplier = 1.2f;
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddBuff(Buffs.ArmorBoost);
			}
			ball.SetActive(true);
			mesh.SetActive(false);
			BaseSamus.morphBall = true;
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)4;
		}
	}
	public class trackingMissile : BaseMissile
	{
		protected SamusTracker SamusTracker;

		public override void OnEnter()
		{
			SamusTracker = ((EntityState)this).gameObject.GetComponent<SamusTracker>();
			target = SamusTracker.GetTrackingTarget();
			baseDuration = 0.1f;
			damageCoef = StaticValues.missileDamageCoefficient;
			recoil = 0.5f;
			smissleObject = null;
			Sound = "Missile";
			sMissile = false;
			base.OnEnter();
		}
	}
}
namespace SamusMod.SkillStates.BaseStates
{
	public class BaseFireBeam : BaseSkillState
	{
		[SerializeField]
		public GameObject projectilePrefab;

		[SerializeField]
		public GameObject muzzleflashEffectPrefab;

		public float baseDuration;

		public float minDamageCoefficient;

		public float maxDamageCoefficient;

		public float force;

		public string muzzleName;

		public GameObject tracerPrefab;

		[SerializeField]
		public GameObject bulletHitEffect;

		private float duration;

		public float selfForce;

		public float charge;

		public float speed;

		private GameObject guncon;

		public Vector3 size;

		public string tracerSound;

		public string projSound;

		public Vector3 csize;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			Transform val = ((EntityState)this).GetModelChildLocator().FindChild("gunCon");
			guncon = ((Component)val).gameObject;
			if (Utils.IsUsingMotionControls(((EntityState)this).characterBody))
			{
				Animator animator = MotionControls.dominantHand.animator;
				if (charge <= 0.15f)
				{
					EntityState.PlayAnimationOnAnimator(animator, "Base Layer", "shoot", "Shoot.playbackRate", duration * 2f);
				}
				else if (charge > 0.15f)
				{
					EntityState.PlayAnimationOnAnimator(animator, "Base Layer", "chargeShoot", "Charge.playbackRate", ((BaseState)this).attackSpeedStat * 0.4585f);
				}
			}
			else if (charge == 1f)
			{
				((EntityState)this).PlayAnimation("Gesture, Override", "chargeMaxShoot", "Charge.playbackRate", duration);
			}
			else
			{
				((EntityState)this).PlayAnimation("Gesture, Override", "Beam", "Charge.playbackRate", duration);
			}
			if (Object.op_Implicit((Object)(object)muzzleflashEffectPrefab))
			{
				EffectManager.SimpleMuzzleFlash(muzzleflashEffectPrefab, ((EntityState)this).gameObject, "gunCon", false);
			}
			Fire();
		}

		public virtual void ResizeProjectile()
		{
			//IL_0016: 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_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_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)
			projectilePrefab.transform.localScale = projectilePrefab.transform.localScale * charge + new Vector3(0.1f, 0.1f, 0.1f);
			ProjectileController component = projectilePrefab.GetComponent<ProjectileController>();
			component.ghostPrefab.transform.localScale = component.ghostPrefab.transform.localScale * charge;
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (((EntityState)this).isAuthority && ((EntityState)this).fixedAge >= duration)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

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

		private void Fire()
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Unknown result type (might be due to invalid IL or missing references)
			//IL_021d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0229: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0242: Unknown result type (might be due to invalid IL or missing references)
			//IL_0245: Unknown result type (might be due to invalid IL or missing references)
			//IL_024f: Unknown result type (might be due to invalid IL or missing references)
			//IL_025a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0265: Unknown result type (might be due to invalid IL or missing references)
			//IL_0277: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Unknown result type (might be due to invalid IL or missing references)
			//IL_028b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0297: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02af: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ba: 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_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: 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_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			if (!((EntityState)this).isAuthority)
			{
				return;
			}
			if (charge <= 0.15f)
			{
				SphereCollider[] componentsInChildren = projectilePrefab.GetComponentsInChildren<SphereCollider>();
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					_ = componentsInChildren[i].radius;
				}
				charge = 0.1f;
			}
			Ray aimRay = ((BaseState)this).GetAimRay();
			if (Utils.IsUsingMotionControls(((EntityState)this).characterBody))
			{
				aimRay = MotionControls.dominantHand.aimRay;
			}
			_ = (Object)(object)projectilePrefab != (Object)null;
			if ((Object)(object)projectilePrefab != (Object)null && charge > 0.15f)
			{
				float num = Util.Remap(charge, 0f, 1f, minDamageCoefficient, maxDamageCoefficient);
				float num2 = charge * force;
				if (Utils.IsUsingMotionControls(((EntityState)this).characterBody))
				{
					Util.PlaySound(projSound, ((Component)MotionControls.dominantHand.muzzle).gameObject);
				}
				else
				{
					Util.PlaySound(projSound, ((EntityState)this).gameObject);
				}
				projectilePrefab.GetComponent<colision_test>().inTransform = guncon.transform;
				FireProjectileInfo val = default(FireProjectileInfo);
				val.projectilePrefab = projectilePrefab;
				val.position = ((Ray)(ref aimRay)).origin;
				val.rotation = Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction);
				val.owner = ((EntityState)this).gameObject;
				val.damage = ((BaseState)this).damageStat * num;
				val.force = num2;
				val.crit = ((BaseState)this).RollCrit();
				((FireProjectileInfo)(ref val)).speedOverride = speed;
				FireProjectileInfo val2 = val;
				ProjectileManager.instance.FireProjectile(val2);
			}
			else if (((EntityState)this).isAuthority)
			{
				Util.Remap(0.1f, 0.1f, 1f, minDamageCoefficient, maxDamageCoefficient);
				float num3 = charge * force;
				if (Utils.IsUsingMotionControls(((EntityState)this).characterBody))
				{
					Util.PlaySound(projSound, ((Component)MotionControls.dominantHand.muzzle).gameObject);
				}
				else
				{
					Util.PlaySound(tracerSound, ((EntityState)this).gameObject);
				}
				new BulletAttack
				{
					owner = ((EntityState)this).gameObject,
					weapon = ((EntityState)this).gameObject,
					origin = ((Ray)(ref aimRay)).origin,
					aimVector = ((Ray)(ref aimRay)).direction,
					minSpread = 0f,
					maxSpread = 0f,
					damage = ((BaseState)this).damageStat * Config.pBeamMult,
					force = num3,
					tracerEffectPrefab = tracerPrefab,
					muzzleName = muzzleName,
					hitEffectPrefab = bulletHitEffect,
					isCrit = ((BaseState)this).RollCrit(),
					radius = 0.1f,
					smartCollision = true
				}.Fire();
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)2;
		}
	}
	public class BaseMissile : BaseSkillState
	{
		public float damageCoef;

		public float baseDuration;

		public float recoil;

		[SerializeField]
		public GameObject projectilePrefab;

		[SerializeField]
		public GameObject muzzleEffectPrefab;

		[SerializeField]
		public GameObject smissleObject;

		public GameObject sMissileExtraMissiles;

		protected static int secStock;

		public bool sMissile;

		public string Sound;

		private float duration;

		private float fireDuration;

		private bool hasFired;

		private Animator animator;

		private string muzzleString;

		private Transform muzzleTransform;

		public HurtBox target;

		private Ray gunRay;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			sMissileExtraMissiles = (((Object)(object)smissleObject != (Object)null) ? smissleObject : null);
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			fireDuration = 0.5f * duration;
			((EntityState)this).characterBody.SetAimTimer(2f);
			animator = ((EntityState)this).GetModelAnimator();
			muzzleString = "gunCon";
			((EntityState)this).PlayAnimation("Gesture, Override", "Missile", "Missile.playbackRate", duration);
			secStock = ((EntityState)this).skillLocator.secondary.stock;
			muzzleTransform = ((EntityState)this).GetModelChildLocator().FindChild(muzzleString);
		}

		public override void OnExit()
		{
			if (Utils.IsUsingMotionControls(((EntityState)this).characterBody))
			{
				VRStuff.SamusHUD.setMissileActive(active: true);
			}
			((EntityState)this).OnExit();
		}

		private void fireMissile()
		{
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: 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_0094: 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_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: 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_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			if (!hasFired)
			{
				hasFired = true;
				if (Utils.IsUsingMotionControls(((EntityState)this).characterBody))
				{
					Util.PlaySound(Sound, ((Component)MotionControls.dominantHand.muzzle).gameObject);
				}
				else
				{
					Util.PlaySound(Sound, ((EntityState)this).gameObject);
				}
				((EntityState)this).characterBody.AddSpreadBloom(0.75f);
				Ray aimRay = ((BaseState)this).GetAimRay();
				gunRay = new Ray(muzzleTransform.position, ((Ray)(ref aimRay)).direction);
				if (Utils.IsUsingMotionControls(((EntityState)this).characterBody))
				{
					aimRay = MotionControls.dominantHand.aimRay;
				}
				if ((Object)(object)muzzleEffectPrefab != (Object)null)
				{
					EffectManager.SimpleMuzzleFlash(muzzleEffectPrefab, ((EntityState)this).gameObject, muzzleString, false);
				}
				if (((EntityState)this).isAuthority && (Object)(object)target != (Object)null)
				{
					MissileUtils.FireMissile(((Ray)(ref gunRay)).origin, ((EntityState)this).characterBody, default(ProcChainMask), ((Component)target).gameObject, damageCoef * ((BaseState)this).damageStat, ((BaseState)this).RollCrit(), projectilePrefab, (DamageColorIndex)0, ((Ray)(ref gunRay)).direction + Random.insideUnitSphere * 0.1f, 100f, true);
				}
				else if (((EntityState)this).isAuthority && (Object)(object)target == (Object)null && !sMissile)
				{
					MissileUtils.FireMissile(((Ray)(ref gunRay)).origin, ((EntityState)this).characterBody, default(ProcChainMask), (GameObject)null, damageCoef * ((BaseState)this).damageStat, ((BaseState)this).RollCrit(), projectilePrefab, (DamageColorIndex)0, ((Ray)(ref gunRay)).direction + Random.insideUnitSphere * 0.25f, 100f, true);
				}
				else if (((EntityState)this).isAuthority && (Object)(object)target == (Object)null && sMissile)
				{
					SuperMissileICBMLaunch(((Ray)(ref gunRay)).origin, ((EntityState)this).characterBody, default(ProcChainMask), null, damageCoef * ((BaseState)this).damageStat, ((BaseState)this).RollCrit(), projectilePrefab, (DamageColorIndex)0);
				}
			}
		}

		private void SuperMissileICBMLaunch(Vector3 position, CharacterBody attacker, ProcChainMask procChainMask, GameObject victim, float missileDamage, bool isCrit, GameObject projectilePrefab, DamageColorIndex damageColorIndex)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: 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_0019: 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_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: 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_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: 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_00a0: 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_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: 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_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: 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_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: 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_012e: 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_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = Vector3.up + Random.insideUnitSphere * 0.1f;
			float force = 200f;
			Inventory inventory = ((EntityState)this).characterBody.inventory;
			int num = ((inventory != null) ? inventory.GetItemCount(Items.MoreMissile) : 0);
			float num2 = Mathf.Max(1f, 1f + 0.5f * (float)(num - 1));
			InputBankTest inputBank = ((EntityState)this).inputBank;
			ProcChainMask procChainMask2 = procChainMask;
			if (true)
			{
				((ProcChainMask)(ref procChainMask2)).AddProc((ProcType)1);
			}
			FireProjectileInfo val2 = default(FireProjectileInfo);
			val2.projectilePrefab = projectilePrefab;
			val2.position = position;
			val2.rotation = Util.QuaternionSafeLookRotation(((Ray)(ref gunRay)).direction);
			val2.procChainMask = procChainMask2;
			val2.target = victim;
			val2.owner = ((Component)attacker).gameObject;
			val2.damage = missileDamage * num2;
			val2.crit = isCrit;
			val2.force = force;
			val2.damageColorIndex = damageColorIndex;
			FireProjectileInfo val3 = val2;
			ProjectileManager.instance.FireProjectile(val3);
			if (num > 0)
			{
				Vector3 val4 = (Object.op_Implicit((Object)(object)inputBank) ? inputBank.aimDirection : attacker.transform.position);
				FireProjectileInfo val5 = val3;
				val5.rotation = Util.QuaternionSafeLookRotation(Quaternion.AngleAxis(45f, val4) * val);
				val5.projectilePrefab = sMissileExtraMissiles;
				val5.damage = StaticValues.missileDamageCoefficient * ((BaseState)this).damageStat;
				FireProjectileInfo val6 = val3;
				val6.rotation = Util.QuaternionSafeLookRotation(Quaternion.AngleAxis(-45f, val4) * val);
				val6.projectilePrefab = sMissileExtraMissiles;
				val6.damage = StaticValues.missileDamageCoefficient * ((BaseState)this).damageStat;
				ProjectileManager.instance.FireProjectile(val5);
				ProjectileManager.instance.FireProjectile(val6);
			}
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (((EntityState)this).fixedAge >= fireDuration)
			{
				fireMissile();
			}
			if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

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

		public void calculateSMissiles()
		{
			int maxStock = 0;
			if (secStock % 5 == 0)
			{
				maxStock = secStock / 5;
			}
			else if (secStock / 5 > 1)
			{
				maxStock = secStock / 5;
			}
			else if (secStock < 1)
			{
				maxStock = 0;
			}
			((EntityState)this).skillLocator.special.maxStock = maxStock;
		}
	}
	public class BaseMorphBall : BaseSkillState
	{
		private ChildLocator ChildLocator;

		private bool onEnter;

		[SerializeField]
		public float speedMult = 1.2f;

		private GameObject ball;

		private GameObject armature;

		private GameObject mesh;

		private GameObject bone;

		private float normalSpeed;

		private Transform tran;

		private float velx;

		private float vely;

		private float velz;

		[SerializeField]
		public SkillDef bomb;

		[SerializeField]
		public SkillDef powerBomb;

		[SerializeField]
		public SkillDef exitMorph;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			onEnter = true;
			((EntityState)this).skillLocator.utility.SetSkillOverride((object)((EntityState)this).skillLocator.utility, exitMorph, (SkillOverridePriority)4);
			ChildLocator = ((EntityState)this).GetModelChildLocator();
			((Component)((EntityState)this).characterBody).gameObject.GetComponent<Collider>().enabled = false;
			ball = ((Component)ChildLocator.FindChild("Ball2")).gameObject;
			armature = ((Component)ChildLocator.FindChild("armature")).gameObject;
			mesh = ((Component)ChildLocator.FindChild("Body")).gameObject;
			bone = ((Component)ChildLocator.FindChild("Ball2Bone")).gameObject;
			ball.GetComponent<Rigidbody>().constraints = (RigidbodyConstraints)14;
			normalSpeed = ((BaseState)this).moveSpeedStat;
			((BaseState)this).moveSpeedStat = normalSpeed * 2f;
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddBuff(Buffs.ArmorBoost);
			}
			ball.SetActive(true);
			armature.SetActive(false);
			mesh.SetActive(false);
		}

		private Vector3 IdealVelocity()
		{
			//IL_0006: 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_0021: Unknown result type (might be due to invalid IL or missing references)
			return ((EntityState)this).characterDirection.forward * ((EntityState)this).characterBody.moveSpeed * speedMult;
		}

		public override void FixedUpdate()
		{
			//IL_0075: 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)
			((EntityState)this).FixedUpdate();
			if (((EntityState)this).fixedAge >= 0.5f && onEnter)
			{
				onEnter = false;
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).inputBank) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
			{
				Collider component = ball.GetComponent<Collider>();
				Rigidbody component2 = ball.GetComponent<Rigidbody>();
				component.enabled = true;
				component2.isKinematic = false;
				component2.interpolation = (RigidbodyInterpolation)1;
				component2.collisionDetectionMode = (CollisionDetectionMode)1;
				component2.AddForce(((EntityState)this).characterMotor.velocity * 100f, (ForceMode)0);
			}
		}

		public override void Update()
		{
			((EntityState)this).Update();
			velx = ((EntityState)this).characterMotor.velocity.x;
			vely = ((EntityState)this).characterMotor.velocity.y;
			velz = ((EntityState)this).characterMotor.velocity.z;
		}

		public override void OnExit()
		{
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.RemoveBuff(Buffs.ArmorBoost);
			}
			((Component)((EntityState)this).characterBody).gameObject.GetComponent<Collider>().enabled = true;
			Collider component = ball.GetComponent<Collider>();
			Rigidbody component2 = ball.GetComponent<Rigidbody>();
			component.enabled = false;
			component2.isKinematic = true;
			component2.interpolation = (RigidbodyInterpolation)0;
			component2.collisionDetectionMode = (CollisionDetectionMode)0;
			((Component)ChildLocator.FindChild("Ball2")).gameObject.SetActive(false);
			((Component)ChildLocator.FindChild("armature")).gameObject.SetActive(true);
			((Component)ChildLocator.FindChild("Body")).gameObject.SetActive(true);
			((EntityState)this).OnExit();
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)2;
		}
	}
	public class BaseSamus : GenericCharacterMain
	{
		private ChildLocator ChildLocator;

		private Animator Animator;

		private static bool noPowerBomb;

		private bool filled;

		private Collision collision;

		private Collider collider;

		private GameObject ball;

		private Rigidbody BallRigidBody;

		private Vector3 velocity;

		private Vector3 direction;

		public Vector3 camera;

		private float horizontalInput;

		private Vector3 forwardDir;

		private static float stopwatch;

		private static float stopwatch2;

		private static float cacheStopwatch;

		private static float cacheStopwatch2;

		private static float maxStopwatch;

		private static float maxStopwatch2;

		private static bool powerBombInit;

		private static bool vrCheck;

		private static CharacterBody body;

		[SerializeField]
		public SkillDef morphBallRef;

		[SerializeField]
		public SkillDef autoFireSkill;

		private static GenericSkill powerBallskill;

		private static GenericSkill missileSkill;

		private bool effectiveAuth;

		private PlayerCharacterMasterController PlayerCharacterMasterController;

		private Player player;

		public static bool morphBall { get; set; }

		public static CharacterBody Body
		{
			get
			{
				return body;
			}
			set
			{
				body = value;
			}
		}

		public static bool VrCheck
		{
			get
			{
				return vrCheck;
			}
			set
			{
				vrCheck = value;
			}
		}

		public static float Stopwatch
		{
			get
			{
				return stopwatch;
			}
			set
			{
				stopwatch = value;
			}
		}

		public static float Stopwatch2
		{
			get
			{
				return stopwatch2;
			}
			set
			{
				stopwatch2 = value;
			}
		}

		public static bool PowerBombInit
		{
			get
			{
				return powerBombInit;
			}
			set
			{
				powerBombInit = value;
			}
		}

		public static GenericSkill PowerBallskill
		{
			get
			{
				return powerBallskill;
			}
			set
			{
				powerBallskill = value;
			}
		}

		public static GenericSkill MissileSkill
		{
			get
			{
				return missileSkill;
			}
			set
			{
				missileSkill = value;
			}
		}

		public override void OnEnter()
		{
			ChildLocator = ((EntityState)this).GetModelChildLocator();
			ball = ((Component)ChildLocator.FindChild("Ball2")).gameObject;
			collider = ball.GetComponent<Collider>();
			BallRigidBody = ball.GetComponent<Rigidbody>();
			PlayerCharacterMasterController = ((EntityState)this).characterBody.master.playerCharacterMasterController;
			LocalUser val = default(LocalUser);
			CameraRigController val2 = default(CameraRigController);
			PlayerCharacterMasterController.CanSendBodyInput(PlayerCharacterMasterController.networkUser, ref val, ref player, ref val2);
			if ((Object)(object)((EntityState)this).skillLocator.utility.skillDef == (Object)(object)morphBallRef)
			{
				MissileSkill = ((EntityState)this).skillLocator.FindSkillByFamilyName("SamusSecondary");
				powerBallskill = ((EntityState)this).skillLocator.FindSkillByFamilyName("SamusSecondary2");
			}
			else
			{
				((Behaviour)((EntityState)this).skillLocator.FindSkillByFamilyName("SamusSecondary2")).enabled = false;
			}
			Stopwatch = 0f;
			Stopwatch2 = 0f;
			powerBombInit = false;
			Body = ((EntityState)this).characterBody;
			if (VR.enabled)
			{
				VrCheck = Utils.IsUsingMotionControls(Body);
				if (VrCheck)
				{
					VRStuff.setupVR(Body);
					Camera.main.nearClipPlane = 0.05f;
					((Component)ChildLocator.FindChild("chargeEffect")).gameObject.SetActive(false);
					if (Config.enableHud.Value)
					{
						VRStuff.SamusHUD.initSamusHUD(Body);
					}
				}
			}
			((GenericCharacterMain)this).OnEnter();
		}

		public override void Update()
		{
			((GenericCharacterMain)this).Update();
			if ((Object)(object)DotController.FindDotController(((EntityState)this).gameObject) != (Object)null)
			{
				DotController val = DotController.FindDotController(((EntityState)this).gameObject);
				switch (val.activeDotFlags)
				{
				case 3u:
					val.RemoveDotStackAtServer(3);
					break;
				case 1u:
					val.RemoveDotStackAtServer(1);
					break;
				case 2u:
					val.RemoveDotStackAtServer(2);
					break;
				}
			}
			if (effectiveAuth && !morphBall && player.GetButtonDown(RewiredAction.autoFire.ActionId))
			{
				if ((Object)(object)((EntityState)this).skillLocator.primary.skillDef == (Object)(object)autoFireSkill)
				{
					((EntityState)this).skillLocator.primary.UnsetSkillOverride((object)((EntityState)this).skillLocator.primary, autoFireSkill, (SkillOverridePriority)4);
				}
				else
				{
					((EntityState)this).skillLocator.primary.SetSkillOverride((object)((EntityState)this).skillLocator.primary, autoFireSkill, (SkillOverridePriority)4);
				}
			}
		}

		public override void FixedUpdate()
		{
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: 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_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//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_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: 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_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0442: Unknown result type (might be due to invalid IL or missing references)
			//IL_0447: Unknown result type (might be due to invalid IL or missing references)
			//IL_045e: Unknown result type (might be due to invalid IL or missing references)
			((GenericCharacterMain)this).FixedUpdate();
			effectiveAuth = ((EntityState)this).characterBody.master.hasEffectiveAuthority;
			if (Object.op_Implicit((Object)(object)Animator))
			{
				Animator.SetFloat("sprintValue", (float)(((EntityState)this).characterBody.isSprinting ? (-1) : 0), 0.2f, Time.fixedDeltaTime);
				Animator.SetBool("inCombat", !((EntityState)this).characterBody.outOfCombat || !((EntityState)this).characterBody.outOfDanger);
			}
			if (!((EntityState)this).healthComponent.alive)
			{
				EntityState.Destroy((Object)(object)VRStuff.hudHandle);
			}
			if (((EntityState)this).healthComponent.isInFrozenState && ChildLocator.FindChild("Ball").localScale != new Vector3(0.5f, 0.5f, 0.5f))
			{
				ChildLocator.FindChild("Ball").localScale = new Vector3(0.5f, 0.5f, 0.5f);
			}
			if (stopwatch2 < maxStopwatch2)
			{
				stopwatch2 += Time.fixedDeltaTime;
			}
			if (!morphBall)
			{
				return;
			}
			if (stopwatch < maxStopwatch)
			{
				stopwatch += Time.fixedDeltaTime;
			}
			velocity = ((EntityState)this).characterMotor.velocity;
			direction = ((EntityState)this).inputBank.moveVector;
			Quaternion rotation = ((EntityState)this).cameraTargetParams.cameraPivotTransform.rotation;
			camera = ((Quaternion)(ref rotation)).eulerAngles;
			Vector3.Scale(velocity, direction);
			collider.enabled = true;
			BallRigidBody.isKinematic = false;
			BallRigidBody.interpolation = (RigidbodyInterpolation)1;
			BallRigidBody.collisionDetectionMode = (CollisionDetectionMode)1;
			float num;
			if (((EntityState)this).characterBody.isSprinting)
			{
				num = ((velocity.x < 0f && velocity.z < 0f) ? (0f - velocity.x + (0f - velocity.z)) : ((velocity.x < 0f && velocity.z > 0f) ? (0f - velocity.x + velocity.z) : ((velocity.x > 0f && velocity.z < 0f) ? (velocity.x + (0f - velocity.z)) : ((!(velocity.x > 0f) || !(velocity.z > 0f)) ? (velocity.x + velocity.z) : (velocity.x + velocity.z)))));
				if (num > 16.8f || num < -16.8f)
				{
					num = 16.8f;
				}
			}
			else
			{
				num = ((velocity.x < 0f && velocity.z < 0f) ? (0f - velocity.x + (0f - velocity.z)) : ((velocity.x < 0f && velocity.z > 0f) ? (0f - velocity.x + velocity.z) : ((velocity.x > 0f && velocity.z < 0f) ? (velocity.x + (0f - velocity.z)) : ((!(velocity.x > 0f) || !(velocity.z > 0f)) ? (velocity.x + velocity.z) : (velocity.x + velocity.z)))));
				if (num > 14f || num < -14f)
				{
					num = 14f;
				}
			}
			if (((EntityState)this).characterMotor.velocity != Vector3.zero)
			{
				ball.transform.Rotate(Vector3.up, 0f - num);
			}
		}

		private void DotController_onDotInflictedServerGlobal(DotController dotController, ref InflictDotInfo inflictDotInfo)
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Invalid comparison between Unknown and I4
			if ((inflictDotInfo.victimObject.gameObject.GetComponent<CharacterBody>().baseNameToken == "DG_SAMUS_NAME" || inflictDotInfo.attackerObject.gameObject.GetComponent<CharacterBody>().baseNameToken == "DG_SAMUS_NAME") && (int)inflictDotInfo.dotIndex == 3)
			{
				inflictDotInfo.duration = 0f;
				inflictDotInfo.damageMultiplier = 0f;
			}
		}

		public override void OnExit()
		{
			((GenericCharacterMain)this).OnExit();
			EntityState.Destroy((Object)(object)VRStuff.hudHandle);
		}
	}
	public class ChargeBeamBase : BaseSkillState
	{
		[SerializeField]
		public GameObject chargeEffectPrefab;

		[SerializeField]
		public string chargeSoundString;

		[SerializeField]
		public GameObject chargeMuzzle;

		public float baseDuration = 1.15f;

		[SerializeField]
		public float minBloomRadius;

		[SerializeField]
		public float maxBloomRadius;

		public GameObject crosshairOverridePrefab;

		protected static readonly float minChargeDuration;

		protected static Vector3 size;

		private GameObject defaultCrosshairPrefab;

		private uint loopSoundInstanceId;

		private OverrideRequest crosshairOverrideRequest;

		private bool isPlayingSound;

		private float duration { get; set; }

		private Animator animator { get; set; }

		private ChildLocator childLocator { get; set; }

		[SerializeField]
		public GameObject chargeEffectInstance { get; set; }

		public virtual BaseFireBeam GetNextBase()
		{
			return new BaseFireBeam();
		}

		public override void OnEnter()
		{
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			animator = ((EntityState)this).GetModelAnimator();
			childLocator = ((EntityState)this).GetModelChildLocator();
			Transform val = childLocator.FindChild("gunCon");
			crosshairOverrideRequest = CrosshairUtils.RequestOverrideForBody(((EntityState)this).characterBody, crosshairOverridePrefab, (OverridePriority)1);
			if (!Utils.IsUsingMotionControls(((EntityState)this).characterBody))
			{
				if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)chargeEffectPrefab))
				{
					chargeEffectInstance = Object.Instantiate<GameObject>(chargeEffectPrefab, val.position, val.rotation);
					chargeEffectInstance.transform.parent = val;
				}
			}
			else
			{
				chargeEffectInstance = Object.Instantiate<GameObject>(chargeEffectPrefab, val);
				chargeEffectInstance.transform.Rotate(90f, 0f, 0f);
			}
			((EntityState)this).PlayAnimation("Gesture, Override", "chargeLoop", "Charge.playbackRate", duration);
			defaultCrosshairPrefab = ((EntityState)this).characterBody.defaultCrosshairPrefab;
			((BaseState)this).StartAimMode(duration + 2f, false);
		}

		public override void OnExit()
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			OverrideRequest obj = crosshairOverrideRequest;
			if (obj != null)
			{
				obj.Dispose();
			}
			AkSoundEngine.StopPlayingID(loopSoundInstanceId);
			if (!((EntityState)this).outer.destroying)
			{
				((EntityState)this).PlayAnimation("Gesture, Override", "BufferEmpty");
			}
			size = chargeEffectInstance.transform.localScale;
			EntityState.Destroy((Object)(object)chargeEffectInstance);
			((EntityState)this).OnExit();
		}

		protected virtual float calcCharge()
		{
			if (((EntityState)this).age <= Time.fixedDeltaTime)
			{
				return Mathf.Clamp01(Time.fixedDeltaTime / duration);
			}
			return Mathf.Clamp01(((EntityState)this).fixedAge / duration);
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			float charge = calcCharge();
			TryNextState(charge);
		}

		public override void Update()
		{
			((EntityState)this).Update();
			float charge = calcCharge();
			TryNextState(charge);
			((EntityState)this).characterBody.SetSpreadBloom(Util.Remap(calcCharge(), 0f, 1f, minBloomRadius, maxBloomRadius), true);
		}

		private void TryNextState(float charge)
		{
			if (((EntityState)this).isAuthority && !isPlayingSound && (double)charge > 0.15)
			{
				if (Utils.IsUsingMotionControls(((EntityState)this).characterBody))
				{
					loopSoundInstanceId = Util.PlayAttackSpeedSound(chargeSoundString, ((Component)MotionControls.dominantHand.muzzle).gameObject, duration - 0.15f);
				}
				else
				{
					loopSoundInstanceId = Util.PlayAttackSpeedSound(chargeSoundString, ((EntityState)this).gameObject, duration - 0.15f);
				}
				isPlayingSound = true;
			}
			if (((EntityState)this).isAuthority && !((BaseSkillState)this).IsKeyDownAuthority() && ((EntityState)this).age >= minChargeDuration)
			{
				BaseFireBeam nextBase = GetNextBase();
				nextBase.charge = charge;
				((EntityState)this).outer.SetNextState((EntityState)(object)nextBase);
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)2;
		}
	}
	public class DeathState : GenericCharacterDeath
	{
		private Vector3 previousPosition;

		private float upSpeedVelocity;

		private float upSpeed;

		private Animator modelAnimator;

		public override bool shouldAutoDestroy => false;

		public override void OnEnter()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			((GenericCharacterDeath)this).OnEnter();
			Vector3 val = Vector3.up * 3f;
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
			{
				val += ((EntityState)this).characterMotor.velocity;
				((Behaviour)((EntityState)this).characterMotor).enabled = false;
			}
			if (Object.op_Implicit((Object)(object)((GenericCharacterDeath)this).cachedModelTransform))
			{
				RagdollController component = ((Component)((GenericCharacterDeath)this).cachedModelTransform).GetComponent<RagdollController>();
				if (Object.op_Implicit((Object)(object)component))
				{
					component.BeginRagdoll(val);
				}
			}
		}

		public override void PlayDeathAnimation(float crossfadeDuration = 0.1f)
		{
		}

		public override void FixedUpdate()
		{
			((GenericCharacterDeath)this).FixedUpdate();
			if (NetworkServer.active && ((EntityState)this).fixedAge > 4f)
			{
				EntityState.Destroy((Object)(object)((EntityState)this).gameObject);
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)6;
		}
	}
	public class SpawnState : BaseState
	{
		[SerializeField]
		public float duration;

		private Transform modelTransform;

		private Animator animator;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			animator = ((EntityState)this).GetModelAnimator();
			modelTransform = ((EntityState)this).GetModelTransform();
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddBuff(Buffs.HiddenInvincibility);
			}
			((EntityState)this).PlayAnimation("Body", "Spawn", "Spawn.playbackRate", duration);
			if (Object.op_Implicit((Object)(object)animator))
			{
				animator.SetFloat(AnimationParameters.aimWeight, 0f);
			}
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (Object.op_Implicit((Object)(object)animator))
			{
				animator.SetBool("inCombat", true);
			}
			if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override void OnExit()
		{
			((EntityState)this).OnExit();
			if (Object.op_Implicit((Object)(object)animator))
			{
				animator.SetFloat(AnimationParameters.aimWeight, 1f);
			}
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.RemoveBuff(Buffs.HiddenInvincibility);
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)6;
		}
	}
}
namespace SamusMod.Misc
{
	internal enum EHudState
	{
		Combat,
		Ball,
		None
	}
	internal class SamusHUD : MonoBehaviour
	{
		private GameObject baseHUD;

		private GameObject damageLight;

		private GameObject camFilter;

		[SerializeField]
		private hudHealthInterface energyIntf;

		[SerializeField]
		private hudThreat threatIntf;

		[SerializeField]
		private hudMissiles missileIntf;

		[SerializeField]
		private hudDeco decoIntf;

		[SerializeField]
		private hudHelmet helmetIntf;

		[SerializeField]
		private hudBall ballIntf;

		public hudBossEnergy bossEnergyIntf;

		private hudColors hudcolors;

		private hudColors combatHudColors;

		private hudColors ballHudColors;

		private hudColors.EnergyBarColors energyBar;

		private hudColors.EnergyBarColors combatEnergyBar;

		private hudColors.EnergyBarColors ballEnergyBar;

		private float tempHealth;

		private float cachedBossHealth;

		public bool currInit;

		private EHudState curState;

		private bool envDamage;

		private float bossAlpha = 1f;

		private List<Color> frameColorTest;

		private List<Color> baseFrame;

		private float playerHealth;

		private float maxPlayerHealth = 100f;

		private uint totalEnergyTanks = 6u;

		private uint missileAmount;

		private uint missileCapacity;

		private uint rendertimings;

		private uint filledEnergyTanks;

		private bool energyLow;

		private bool missileActive;

		private Material localMat;

		private List<Text> texts;

		private float hudDamagePracticalsInit;

		private float hudDamagePracticals;

		private float hudDamagePracticalsGain;

		private float damageTime;

		private float damageLightPulser;

		private float damageFilterAmt;

		private float damageFilterAmtInit = 1f;

		private float damageFilterAmtGain;

		private float energyLowTimer;

		private float energyLowPulse;

		private float missileActiveTimer;

		private bool wasDamaged;

		public static float DamageAm;

		public bool inMorphBall;

		private bool allInit;

		private hudTimer timer;

		private float timerV;

		private CharacterBody character;

		public GameObject bossHealthBarRoot;

		private BossGroup bossInfo;

		private Material damageMat;

		private static uint[] playingIds = new uint[50];

		private void OnDestroy()
		{
			bossEnergyIntf.reset();
		}

		private void Start()
		{
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Expected O, but got Unknown
			//IL_0127: 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_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c8: 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)
			baseHUD = ((Component)this).gameObject;
			decoIntf.SetSize();
			helmetIntf.SetSize();
			combatHudColors = new hudColors(combatVisor: true);
			combatEnergyBar = combatHudColors.GetEnergyBarColors(combatMode: true);
			ballHudColors = new hudColors(combatVisor: false);
			ballEnergyBar = ballHudColors.GetEnergyBarColors(combatMode: false);
			timer = new hudTimer();
			texts = new List<Text>();
			Transform[] componentsInChildren = ((Component)((Component)this).gameObject.transform).GetComponentsInChildren<Transform>(true);
			foreach (Transform val in componentsInChildren)
			{
				if ((Object)(object)((Component)val).gameObject.GetComponent<Text>() != (Object)null)
				{
					texts.Add(((Component)val).gameObject.GetComponent<Text>());
				}
			}
			foreach (Text text in texts)
			{
				localMat = new Material(((Graphic)text).material);
				((Graphic)text).material = localMat;
			}
			baseFrame = new List<Color>
			{
				new Color(0.156863f, 0.156863f, 0.156863f),
				new Color(0.4f, 0.4f, 0.4f),
				new Color(0.8f, 0.8f, 0.8f)
			};
			Color val2 = default(Color);
			((Color)(ref val2))..ctor(0.294118f, 0.494118f, 0.639216f, 32f / 51f);
			frameColorTest = new List<Color>
			{
				baseFrame[0] * val2,
				baseFrame[1] * val2,
				baseFrame[2] * val2
			};
			updateHudState();
		}

		private void FixedUpdate()
		{
			timerV = timer.solveFTimer();
			if (missileActive)
			{
				missActiveTimer();
			}
			updateHudState();
			if (!allInit)
			{
				checkInits(Time.fixedDeltaTime);
			}
			HUDUpdate(Time.fixedDeltaTime, HudVis: true);
		}

		private void checkInits(float dt)
		{
			int num = 4;
			if (!hudcolors.init)
			{
				updateHudState();
				num--;
			}
			if (!energyIntf.initHealth)
			{
				UpdateEnergy(dt, init: true);
				num--;
			}
			if (!bossEnergyIntf.bossIni)
			{
				bossEnergyIntf.SetBossParams(Visible: false, "", "", 0f, 0f, hudcolors, energyBar);
				num--;
			}
			if (!ballIntf.ballini)
			{
				UpdateBallMode(init: true);
				num--;
			}
			if (num == 4)
			{
				allInit = true;
			}
		}

		private void updateHudState()
		{
			if (character.skillLocator.utility.skillNameToken == "DG_SAMUS_UTILITY_DASH_NAME")
			{
				curState = EHudState.Combat;
				hudcolors = combatHudColors;
				energyBar = combatEnergyBar;
				return;
			}
			inMorphBall = BaseSamus.morphBall;
			if (inMorphBall)
			{
				curState = EHudState.Ball;
			}
			else
			{
				curState = EHudState.Combat;
			}
			switch (curState)
			{
			case EHudState.Combat:
				hudcolors = combatHudColors;
				energyBar = combatEnergyBar;
				break;
			case EHudState.Ball:
				hudcolors = ballHudColors;
				energyBar = ballEnergyBar;
				break;
			case EHudState.None:
				break;
			}
		}

		private void UpdateEnergy(float dt, bool init)
		{
			float num = Mathf.Max(0f, Mathf.Ceil(character.healthComponent.combinedHealth));
			float num2 = Mathf.Ceil(character.healthComponent.fullCombinedHealth);
			uint num3 = 6u;
			uint num4 = 0u;
			num4 = (uint)character.inventory.GetItemCount(Items.ExtraLife);
			if (!init)
			{
				energyLow = isEnergyLow();
			}
			if (init || num != playerHealth || num3 != totalEnergyTanks || num2 != maxPlayerHealth || num4 != filledEnergyTanks)
			{
				if (energyIntf.checkEnergyBarIsActive(init))
				{
					if (init)
					{
						energyIntf.initValues(hudTypes.combat, num, num2, (int)num3, (int)num4, character.healthComponent, EnergyLow: false);
					}
					energyIntf.SetCurrEnergy(num, num2, wrapped: false);
					energyIntf.SetEnergyLow(energyLow);
				}
				playerHealth = num;
				maxPlayerHealth = num2;
				filledEnergyTanks = num4;
			}
			if (Object.op_Implicit((Object)(object)bossEnergyIntf))
			{
				bossInfo = bossHealthBarRoot.GetComponent<HUDBossHealthBarController>().currentBossGroup;
				if ((Object)(object)bossInfo != (Object)null && bossEnergyIntf.loaded)
				{
					bossAlpha = ((bossEnergyIntf.GetCurrentHealth() > 0f) ? 1 : 0);
					HUDBossHealthBarController component = bossHealthBarRoot.GetComponent<HUDBossHealthBarController>();
					string parsedText = ((TMP_Text)component.bossNameLabel).GetParsedText();
					string parsedText2 = ((TMP_Text)component.bossSubtitleLabel).GetParsedText();
					((Behaviour)bossHealthBarRoot.GetComponent<Canvas>()).enabled = false;
					bossEnergyIntf.SetBossParams(Visible: true, parsedText, parsedText2, bossInfo.totalObservedHealth, bossInfo.totalMaxObservedMaxHealth, hudcolors, energyBar);
				}
				else
				{
					bossEnergyIntf.SetBossParams(Visible: false, "", "", 0f, 0f, hudcolors, energyBar);
				}
			}
		}

		private void UpdateMissile(float dt, bool init)
		{
			uint stock = (uint)character.skillLocator.secondary.stock;
			uint maxStock = (uint)character.skillLocator.secondary.maxStock;
			int num = character.skillLocator.secondary.stock / 5;
			bool isMissilesActive = missileIntf.GetIsMissilesActive();
			if (missileIntf.isActive(init))
			{
				missileIntf.setHasAlt(num >= 1);
			}
			if (init)
			{
				missileIntf.missInit((int)maxStock, (int)stock, MissilesActive: false, character.skillLocator);
			}
			if (stock == missileAmount && missileActive == isMissilesActive && maxStock == missileCapacity)
			{
				return;
			}
			if (missileIntf.isActive(init))
			{
				if (maxStock != missileCapacity)
				{
					missileIntf.SetMissileCapacity((int)maxStock);
				}
				if (stock != missileAmount)
				{
					missileIntf.SetNumMissiles((int)stock);
				}
				if (missileActive != isMissilesActive)
				{
					missileIntf.SetIsMissilesActive(isMissilesActive);
				}
			}
			missileAmount = stock;
			missileActive = isMissilesActive;
			missileCapacity = maxStock;
		}

		private void UpdateThreatAssessment(float dt)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: 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_009e: 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_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Invalid comparison between Unknown and I4
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Invalid comparison between Unknown and I4
			float num = 1000f;
			float num2 = 100f;
			float num3 = float.PositiveInfinity;
			Collider[] array = Physics.OverlapSphere(character.transform.position, 100f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.entityPrecise)).mask));
			Collider[] array2 = Physics.OverlapSphere(character.transform.position, 25f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.projectile)).mask));
			if (array.Length > 30 || array2.Length > 30)
			{
				num = 0f;
			}
			else
			{
				Collider[] array3 = array;
				foreach (Collider val in array3)
				{
					float num4 = Vector3.Distance(character.transform.position, ((Component)val).transform.position);
					if (!(num4 < num3))
					{
						continue;
					}
					HurtBox component = ((Component)val).GetComponent<HurtBox>();
					if (!Object.op_Implicit((Object)(object)component))
					{
						continue;
					}
					HealthComponent healthComponent = component.healthComponent;
					if (!Object.op_Implicit((Object)(object)healthComponent) || (!((Object)(object)((Component)healthComponent).gameObject == (Object)(object)((Component)character).gameObject) && (int)healthComponent.body.teamComponent.teamIndex > 1))
					{
						if (num4 == 0f)
						{
							num = 0f;
							break;
						}
						num3 = num4;
					}
				}
				if (num != 0f)
				{
					array3 = array2;
					foreach (Collider val2 in array3)
					{
						float num5 = Vector3.Distance(character.transform.position, ((Component)val2).transform.position);
						if (!(num5 < num3))
						{
							continue;
						}
						ProjectileController componentInChildren = ((Component)((Component)val2).transform.root).GetComponentInChildren<ProjectileController>();
						if (!Object.op_Implicit((Object)(object)componentInChildren) || ((int)componentInChildren.teamFilter.teamIndex > 1 && !((Object)(object)componentInChildren.owner == (Object)(object)((Component)character).gameObject)))
						{
							if (num5 == 0f)
							{
								num = 0f;
								break;
							}
							num3 = num5;
						}
					}
				}
				num = (float.IsPositiveInfinity(num3) ? num2 : num3);
			}
			if (threatIntf.isActive(init: false))
			{
				threatIntf.SetThreatDistance(num);
			}
		}

		private void UpdateEnergyLow(float dt)
		{
			_ = energyLowTimer;
			energyLowTimer = Mathf.Abs(fmod(GetSecondsMod900(), 0.5f));
			if (energyLowTimer < 0.25f)
			{
				energyLowPulse = energyLowTimer / 0.25f;
			}
			else
			{
				energyLowPulse = (0.5f - energyLowTimer) / 0.25f;
			}
			if (energyLow)
			{
				playSound(1631926714u, ((Component)this).gameObject);
			}
		}

		private void InitializeDamageLight()
		{
			GameObject gameObject = ((Component)((Component)((Component)this).gameObject.transform.parent).GetComponentInChildren<HUD>()).gameObject;
			damageMat = ((Component)gameObject.GetComponent<CameraRigController>()).GetComponentInChildren<ScreenDamage>().mat;
		}

		private void UpdateBallMode(bool init)
		{
			if (ballIntf.isActive(init) && inMorphBall)
			{
				uint stock = (uint)character.skillLocator.secondary.stock;
				uint maxStock = (uint)chara