JhinMod.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EmotesAPI;
using EntityStates;
using EntityStates.Commando;
using EntityStates.Commando.CommandoWeapon;
using EntityStates.GlobalSkills.LunarDetonator;
using EntityStates.GlobalSkills.LunarNeedle;
using EntityStates.Mage.Weapon;
using EntityStates.Railgunner.Scope;
using HG;
using HG.BlendableTypes;
using JetBrains.Annotations;
using JhinMod.Content;
using JhinMod.Content.Components;
using JhinMod.Content.UI;
using JhinMod.Modules;
using JhinMod.Modules.Characters;
using JhinMod.Modules.CustomProjectiles;
using JhinMod.Modules.SkillDefs;
using JhinMod.Modules.Survivors;
using JhinMod.SkillStates;
using JhinMod.SkillStates.BaseStates;
using JhinMod.SkillStates.Henry;
using On.EntityStates;
using On.EntityStates.GlobalSkills.LunarDetonator;
using On.EntityStates.Mage.Weapon;
using On.RoR2;
using On.RoR2.SurvivorMannequins;
using On.RoR2.UI;
using R2API;
using R2API.Utils;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Achievements;
using RoR2.Audio;
using RoR2.ContentManagement;
using RoR2.Orbs;
using RoR2.Projectile;
using RoR2.Skills;
using RoR2.SurvivorMannequins;
using RoR2.UI;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using UnityEngine.Rendering;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("JhinMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("JhinMod")]
[assembly: AssemblyTitle("JhinMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: UnverifiableCode]
public class ProjectMaskGlitchFX : MonoBehaviour
{
	[SerializeField]
	public MeshRenderer maskRenderer;

	public float minimumStableTime = 2f;

	public float maximumStableTime = 15f;

	public float timeBetweenAttempts = 0.2f;

	public float maskFrameHoldMin = 0.1f;

	public float maskFrameHoldMax = 0.3f;

	public float maskFrameHoldTime = 0.2f;

	public float glitchFrameHoldMin = 0.1f;

	public float glitchFrameHoldMax = 0.3f;

	public float glitchFrameHoldTime = 0.2f;

	public float timeSinceTry;

	public float timeSinceMask;

	public float timeSinceGlitch;

	public float maskGlitchChance = 5f;

	public float maskGlitchMultipleChance = 30f;

	public int maskFrame = 0;

	public int glitchActive = 0;

	public List<int> possibleMaskFrames = new List<int> { 1, 2, 3 };

	private void Awake()
	{
	}

	private void Start()
	{
	}

	private void Update()
	{
		timeSinceTry += Time.deltaTime;
		timeSinceMask += Time.deltaTime;
		timeSinceGlitch += Time.deltaTime;
		if (!(timeSinceTry < timeBetweenAttempts))
		{
			if (maskFrame != 0 && timeSinceMask > maskFrameHoldTime)
			{
				RollMask(maskGlitchMultipleChance, maskFrame);
			}
			if (timeSinceMask > minimumStableTime && timeSinceMask > maskFrameHoldTime)
			{
				RollMask(maskGlitchChance);
			}
			if (glitchActive != 0 && timeSinceGlitch > glitchFrameHoldTime)
			{
				RollGlitchOverlay(maskGlitchMultipleChance);
			}
			if (timeSinceGlitch > minimumStableTime && timeSinceGlitch > glitchFrameHoldTime)
			{
				RollGlitchOverlay(maskGlitchChance);
			}
			timeSinceTry = 0f;
		}
	}

	public void RollMask(float chance, int avoidFrame = 0)
	{
		int num = Random.Range(0, 100);
		if ((float)num <= chance)
		{
			List<int> list = new List<int>(possibleMaskFrames);
			if (avoidFrame != 0)
			{
				list.Remove(avoidFrame);
			}
			int count = list.Count;
			int index = Random.Range(0, count);
			maskFrame = list[index];
			maskFrameHoldTime = Random.Range(maskFrameHoldMin, maskFrameHoldMax);
			timeSinceMask = 0f;
		}
		else
		{
			maskFrame = 0;
		}
		((Renderer)maskRenderer).materials[0].SetInt("_MaskFrame", maskFrame);
	}

	public void RollGlitchOverlay(float chance)
	{
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		int num = Random.Range(0, 100);
		if ((float)num <= chance)
		{
			glitchActive = 1;
			float num2 = Random.Range(0f, 1f);
			float num3 = Random.Range(0f, 1f);
			((Renderer)maskRenderer).materials[0].SetVector("_GlitchOffset", Vector4.op_Implicit(new Vector2(num2, num3)));
			glitchFrameHoldTime = Random.Range(glitchFrameHoldMin, glitchFrameHoldMax);
			timeSinceGlitch = 0f;
		}
		else
		{
			glitchActive = 0;
		}
		((Renderer)maskRenderer).materials[0].SetInt("_GlitchActive", glitchActive);
	}
}
namespace JhinMod
{
	[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.seroronin.JhinMod", "JhinMod", "1.4.1")]
	[R2APISubmoduleDependency(new string[] { "PrefabAPI", "LanguageAPI", "SoundAPI", "UnlockableAPI" })]
	public class JhinPlugin : BaseUnityPlugin
	{
		public const string MODUID = "com.seroronin.JhinMod";

		public const string MODNAME = "JhinMod";

		public const string MODVERSION = "1.4.1";

		public const string DEVELOPER_PREFIX = "SERORONIN";

		public static JhinPlugin instance;

		public bool emoteSetup;

		public bool CustomEmotesActive;

		public static Dictionary<Transform, GameObject> playerLobbyModelFX = new Dictionary<Transform, GameObject>();

		private JhinAmmoUI ammoUI;

		private void Awake()
		{
			instance = this;
			Log.Init(((BaseUnityPlugin)this).Logger);
			Asset.Initialize();
			Config.ReadConfig();
			if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"))
			{
				Config.CreateRiskofOptionsCompat();
			}
			if (Chainloader.PluginInfos.ContainsKey("com.weliveinasociety.CustomEmotesAPI"))
			{
				Log.Warning("EMOTES ACTIVE");
				CustomEmotesActive = true;
			}
			else
			{
				Log.Warning("EMOTES INACTIVE");
			}
			States.RegisterStates();
			Buffs.RegisterBuffs();
			Projectiles.RegisterProjectiles();
			Tokens.AddTokens();
			ItemDisplays.PopulateDisplays();
			new JhinSurvivor().Initialize();
			new ContentPacks().Initialize();
			Hook();
		}

		public void OnDestroy()
		{
			try
			{
				UnHooks();
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)(ex.Message + " - " + ex.StackTrace));
			}
		}

		private void Hook()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Expected O, but got Unknown
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Expected O, but got Unknown
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Expected O, but got Unknown
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Expected O, but got Unknown
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Expected O, but got Unknown
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Expected O, but got Unknown
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Expected O, but got Unknown
			SurvivorMannequinSlotController.ApplyLoadoutToMannequinInstance += new hook_ApplyLoadoutToMannequinInstance(SurvivorMannequinSlotController_ApplyLoadoutToMannequinInstance);
			GlobalEventManager.OnHitEnemy += new hook_OnHitEnemy(GlobalEventManager_OnHitEnemy);
			HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_OnTakeDamage);
			CharacterBody.RecalculateStats += new hook_RecalculateStats(CharacterBody_RecalculateStats);
			HUD.Awake += new hook_Awake(HUD_Awake);
			HUD.onHudTargetChangedGlobal += HUD_onHudTargetChangedGlobal;
			BaseChargeBombState.OnEnter += new hook_OnEnter(SlicingMaelstrom_Charge_OnEnter);
			BaseChargeBombState.OnExit += new hook_OnExit(SlicingMaelstrom_Charge_OnExit);
			GhostUtilitySkillState.OnEnter += new hook_OnEnter(Shadowfade_OnEnter);
			GhostUtilitySkillState.OnExit += new hook_OnExit(Shadowfade_OnExit);
			Detonate.OnEnter += new hook_OnEnter(Ruin_OnEnter);
			FrozenState.OnEnter += new hook_OnEnter(FrozenState_OnEnter);
			FrozenState.OnExit += new hook_OnExit(FrozenState_OnExit);
			if (CustomEmotesActive)
			{
				CustomEmotesAPISupport.HookCustomEmoteAPI();
				CustomEmotesAPI.CreateNameTokenSpritePair("SERORONIN_JHIN_BODY_NAME", Asset.mainAssetBundle.LoadAsset<Sprite>("texCustomEmotes_JhinIcon"));
			}
		}

		private void UnHooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Expected O, but got Unknown
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Expected O, but got Unknown
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Expected O, but got Unknown
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Expected O, but got Unknown
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Expected O, but got Unknown
			SurvivorMannequinSlotController.ApplyLoadoutToMannequinInstance -= new hook_ApplyLoadoutToMannequinInstance(SurvivorMannequinSlotController_ApplyLoadoutToMannequinInstance);
			GlobalEventManager.OnHitEnemy -= new hook_OnHitEnemy(GlobalEventManager_OnHitEnemy);
			CharacterBody.RecalculateStats -= new hook_RecalculateStats(CharacterBody_RecalculateStats);
			HUD.Awake -= new hook_Awake(HUD_Awake);
			HUD.onHudTargetChangedGlobal -= HUD_onHudTargetChangedGlobal;
			BaseChargeBombState.OnEnter -= new hook_OnEnter(SlicingMaelstrom_Charge_OnEnter);
			BaseChargeBombState.OnExit -= new hook_OnExit(SlicingMaelstrom_Charge_OnExit);
			GhostUtilitySkillState.OnEnter -= new hook_OnEnter(Shadowfade_OnEnter);
			GhostUtilitySkillState.OnExit -= new hook_OnExit(Shadowfade_OnExit);
			Detonate.OnEnter -= new hook_OnEnter(Ruin_OnEnter);
			FrozenState.OnEnter -= new hook_OnEnter(FrozenState_OnEnter);
			FrozenState.OnExit -= new hook_OnExit(FrozenState_OnExit);
			if (CustomEmotesActive)
			{
				CustomEmotesAPISupport.UnhookCustomEmoteAPI();
			}
		}

		private void SurvivorMannequinSlotController_ApplyLoadoutToMannequinInstance(orig_ApplyLoadoutToMannequinInstance orig, SurvivorMannequinSlotController self)
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self);
			if (!Object.op_Implicit((Object)(object)self.mannequinInstanceTransform))
			{
				return;
			}
			Transform mannequinInstanceTransform = self.mannequinInstanceTransform;
			BodyIndex bodyIndexFromSurvivorIndex = SurvivorCatalog.GetBodyIndexFromSurvivorIndex(self.currentSurvivorDef.survivorIndex);
			int skinIndex = (int)self.currentLoadout.bodyLoadoutManager.GetSkinIndex(bodyIndexFromSurvivorIndex);
			if (!((Object)((Component)mannequinInstanceTransform).gameObject).name.Contains("JhinDisplay"))
			{
				return;
			}
			if (playerLobbyModelFX.ContainsKey(self.mannequinInstanceTransform) && (Object)(object)playerLobbyModelFX[self.mannequinInstanceTransform] != (Object)null)
			{
				Object.Destroy((Object)(object)playerLobbyModelFX[self.mannequinInstanceTransform]);
				playerLobbyModelFX.Remove(self.mannequinInstanceTransform);
			}
			if (!playerLobbyModelFX.ContainsKey(self.mannequinInstanceTransform))
			{
				GameObject vFXDynamic = Helpers.GetVFXDynamic("ModelFX", skinIndex);
				if ((Object)(object)vFXDynamic != (Object)null)
				{
					GameObject val = Object.Instantiate<GameObject>(vFXDynamic, self.mannequinInstanceTransform);
					BindPairLocator component = val.GetComponent<BindPairLocator>();
					component.target = ((Component)self.mannequinInstanceTransform).gameObject;
					component.BindPairs();
					playerLobbyModelFX[self.mannequinInstanceTransform] = val;
				}
			}
		}

		private void GlobalEventManager_OnHitEnemy(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
		{
			orig.Invoke(self, damageInfo, victim);
			if (damageInfo.crit && Object.op_Implicit((Object)(object)damageInfo.attacker) && !damageInfo.rejected)
			{
				CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
				if (Object.op_Implicit((Object)(object)component) && component.baseNameToken == "SERORONIN_JHIN_BODY_NAME" && NetworkServer.active)
				{
					component.AddTimedBuff(Buffs.jhinCritMovespeedBuff, Config.passiveBuffDuration.Value);
				}
			}
		}

		private void HealthComponent_OnTakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo info)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			if (DamageAPI.HasModdedDamageType(info, Buffs.JhinMarkDamage) && NetworkServer.active)
			{
				self.body.AddTimedBuff(Buffs.jhinMarkDebuff, Config.utilityMarkDuration.Value);
			}
			if (self.body.HasBuff(Buffs.jhinMarkDebuff) && DamageAPI.HasModdedDamageType(info, Buffs.JhinConsumeMarkDamage) && NetworkServer.active)
			{
				self.body.ClearTimedBuffs(Buffs.jhinMarkDebuff);
				self.body.AddTimedBuff(Buffs.Nullified, Config.utilityRootDuration.Value);
			}
			orig.Invoke(self, info);
		}

		private void CharacterBody_RecalculateStats(orig_RecalculateStats orig, CharacterBody self)
		{
			orig.Invoke(self);
			if (Object.op_Implicit((Object)(object)self) && self.baseNameToken == "SERORONIN_JHIN_BODY_NAME")
			{
				float damage = self.damage;
				float attackSpeed = self.attackSpeed;
				float moveSpeed = self.moveSpeed;
				float num = self.baseAttackSpeed + self.levelAttackSpeed * self.level;
				float attakSpeedBonus = Mathf.Max(attackSpeed - num, 0f);
				float num2 = CalculateDamageBonus(damage, attakSpeedBonus, num);
				JhinStateController component = ((Component)self).GetComponent<JhinStateController>();
				if (Object.op_Implicit((Object)(object)component))
				{
					component.preModAtkSpeed = attackSpeed;
				}
				self.damage += num2;
				self.attackSpeed = num;
				if (self.HasBuff(Buffs.jhinCritMovespeedBuff))
				{
					float num3 = CalculateMovespeedBonus(moveSpeed, attakSpeedBonus, num);
					self.moveSpeed += num3;
				}
			}
		}

		public float CalculateDamageBonus(float damage, float attakSpeedBonus, float attackSpeedLocked)
		{
			float value = Config.passiveDamageConversion.Value;
			float num = attakSpeedBonus / attackSpeedLocked;
			return damage * (value * num);
		}

		public float CalculateMovespeedBonus(float movespeed, float attakSpeedBonus, float attackSpeedLocked)
		{
			float value = Config.passiveMovespeedConversion.Value;
			float num = attakSpeedBonus / attackSpeedLocked;
			return movespeed * (0.1f + value * num);
		}

		private void SlicingMaelstrom_Charge_OnEnter(orig_OnEnter orig, BaseChargeBombState self)
		{
			orig.Invoke(self);
			if (self is ChargeLunarSecondary)
			{
				JhinStateController component = ((EntityState)self).GetComponent<JhinStateController>();
				if (Object.op_Implicit((Object)(object)component))
				{
					component.PauseReload();
				}
			}
		}

		private void SlicingMaelstrom_Charge_OnExit(orig_OnExit orig, BaseChargeBombState self)
		{
			orig.Invoke(self);
			if (self is ChargeLunarSecondary)
			{
				JhinStateController component = ((EntityState)self).GetComponent<JhinStateController>();
				if (Object.op_Implicit((Object)(object)component))
				{
					component.StopReload();
				}
			}
		}

		private void Shadowfade_OnEnter(orig_OnEnter orig, GhostUtilitySkillState self)
		{
			JhinStateController component = ((EntityState)self).GetComponent<JhinStateController>();
			if ((Object)(object)component != (Object)null)
			{
				if (component.ammoCount != 0)
				{
					component.PauseReload();
				}
				GameObject modelFX = component.modelFX;
				if (Object.op_Implicit((Object)(object)modelFX))
				{
					modelFX.SetActive(false);
				}
				GameObject ultFX = component.ultFX;
				if (Object.op_Implicit((Object)(object)ultFX))
				{
					ultFX.SetActive(false);
				}
			}
			orig.Invoke(self);
		}

		private void Shadowfade_OnExit(orig_OnExit orig, GhostUtilitySkillState self)
		{
			JhinStateController component = ((EntityState)self).GetComponent<JhinStateController>();
			if ((Object)(object)component != (Object)null)
			{
				if (component.ammoCount != 0)
				{
					component.StopReload();
				}
				GameObject modelFX = component.modelFX;
				if (Object.op_Implicit((Object)(object)modelFX))
				{
					modelFX.SetActive(true);
				}
				GameObject ultFX = component.ultFX;
				if (Object.op_Implicit((Object)(object)ultFX))
				{
					ultFX.SetActive(true);
				}
			}
			orig.Invoke(self);
		}

		private void Ruin_OnEnter(orig_OnEnter orig, Detonate self)
		{
			JhinStateController component = ((EntityState)self).GetComponent<JhinStateController>();
			if ((Object)(object)component != (Object)null && component.ammoCount != 0)
			{
				component.StopReload();
			}
			orig.Invoke(self);
		}

		public void FrozenState_OnEnter(orig_OnEnter orig, FrozenState self)
		{
			orig.Invoke(self);
			JhinStateController component = ((EntityState)self).GetComponent<JhinStateController>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.PauseReload();
			}
		}

		public void FrozenState_OnExit(orig_OnExit orig, FrozenState self)
		{
			JhinStateController component = ((EntityState)self).GetComponent<JhinStateController>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.StopReload();
			}
			orig.Invoke(self);
		}

		private void CreateAmmoUI(HUD hud)
		{
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: 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_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)ammoUI) && (Object)(object)hud != (Object)null && (Object)(object)hud.mainUIPanel != (Object)null)
			{
				ammoUI = hud.mainUIPanel.GetComponentInChildren<JhinAmmoUI>();
				if (!Object.op_Implicit((Object)(object)ammoUI))
				{
					GameObject val = Object.Instantiate<GameObject>(Asset.mainAssetBundle.LoadAsset<GameObject>("JhinAmmoUI"));
					ammoUI = val.AddComponent<JhinAmmoUI>();
					val.transform.SetParent(hud.mainUIPanel.transform);
					RectTransform component = val.GetComponent<RectTransform>();
					component.anchorMin = new Vector2(0.5f, 0.5f);
					component.anchorMax = new Vector2(0.5f, 0.5f);
					component.pivot = new Vector2(0.5f, 0.5f);
					component.sizeDelta = new Vector2(1f, 1f);
					component.anchoredPosition = new Vector2(530f, -355f);
					((Transform)component).localRotation = Quaternion.Euler(0f, 0f, 0f);
					((Transform)component).localScale = new Vector3(0.2f, 0.2f, 0.2f);
					val.gameObject.SetActive(false);
				}
			}
		}

		private void HUD_Awake(orig_Awake orig, HUD self)
		{
			CreateAmmoUI(self);
			orig.Invoke(self);
		}

		private void HUD_onHudTargetChangedGlobal(HUD obj)
		{
			if (Object.op_Implicit((Object)(object)obj) && Object.op_Implicit((Object)(object)obj.targetBodyObject) && Object.op_Implicit((Object)(object)ammoUI))
			{
				JhinStateController component = obj.targetBodyObject.GetComponent<JhinStateController>();
				SkillLocator component2 = obj.targetBodyObject.GetComponent<SkillLocator>();
				EntityStateMachine entityStateMachine = Helpers.GetEntityStateMachine(obj.targetBodyObject, "WeaponMode");
				if (Object.op_Implicit((Object)(object)component))
				{
					((Component)ammoUI).gameObject.SetActive(true);
					ammoUI.ammoComponent = component;
					ammoUI.skillLocator = component2;
					ammoUI.ultActiveStateMachine = entityStateMachine;
				}
				else
				{
					((Component)ammoUI).gameObject.SetActive(false);
					ammoUI.ammoComponent = null;
					ammoUI.skillLocator = null;
					ammoUI.ultActiveStateMachine = null;
				}
			}
		}
	}
	internal static class Log
	{
		internal static ManualLogSource _logSource;

		internal static void Init(ManualLogSource logSource)
		{
			_logSource = logSource;
		}

		internal static void Debug(object data)
		{
			_logSource.LogDebug(data);
		}

		internal static void Error(object data)
		{
			_logSource.LogError(data);
		}

		internal static void Fatal(object data)
		{
			_logSource.LogFatal(data);
		}

		internal static void Info(object data)
		{
			_logSource.LogInfo(data);
		}

		internal static void Message(object data)
		{
			_logSource.LogMessage(data);
		}

		internal static void Warning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
}
namespace JhinMod.SkillStates
{
	public class CurtainCall : BaseSkillState
	{
		public float duration = 10f;

		private JhinStateController jhinStateController;

		private EntityStateMachine ultStateMachine;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			jhinStateController = ((EntityState)this).GetComponent<JhinStateController>();
			ultStateMachine = Helpers.GetEntityStateMachine(((EntityState)this).gameObject, "WeaponMode");
			jhinStateController.StopReload(interrupt: true);
			jhinStateController.Reload(full: true);
			jhinStateController.isUlting = true;
			Helpers.PlaySound("UltCast", ((EntityState)this).gameObject);
			Helpers.PlaySound("UltMusic", ((EntityState)this).gameObject);
			ultStateMachine.SetNextState((EntityState)(object)new JhinWeaponUltActiveState());
		}

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

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (((EntityState)this).isAuthority && jhinStateController.isUlting && !(((EntityState)this).fixedAge > duration))
			{
			}
		}

		protected virtual BaseWindDown GetNextState()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			return new BaseWindDown();
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)5;
		}
	}
	public class CurtainCallCancel : BaseSkillState
	{
		public float duration = 1f;

		private JhinStateController jhinStateController;

		private EntityStateMachine ultStateMachine;

		private bool wantsCancel;

		public override void OnEnter()
		{
			jhinStateController = ((EntityState)this).GetComponent<JhinStateController>();
			ultStateMachine = Helpers.GetEntityStateMachine(((EntityState)this).gameObject, "WeaponMode");
			if (ultStateMachine.state is JhinWeaponUltActiveState)
			{
				JhinWeaponUltActiveState jhinWeaponUltActiveState = ultStateMachine.state as JhinWeaponUltActiveState;
				jhinWeaponUltActiveState.duration = ((EntityState)jhinWeaponUltActiveState).fixedAge + jhinWeaponUltActiveState.exitDuration + 0.25f;
			}
		}

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

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

		protected virtual BaseWindDown GetNextState()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			return new BaseWindDown();
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)5;
		}
	}
	public class CurtainCallShoot : BaseSkillState
	{
		public static float damageCoefficient = Config.specialDamageCoefficient.Value;

		public static float procCoefficient = 1f;

		public static float baseDuration = 0.6f;

		public static float force = 800f;

		public static float recoil = 3f;

		public static float range = 256f;

		public static float projectileSpeed = 200f;

		public static GameObject tracerEffectPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/Tracers/TracerGoldGat");

		private float duration;

		private float fireTime;

		private bool hasFired;

		private string muzzleString;

		public JhinStateController jhinStateController;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			jhinStateController = ((EntityState)this).GetComponent<JhinStateController>();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			fireTime = 0.2f * duration;
			((EntityState)this).characterBody.SetAimTimer(2f);
			muzzleString = "Muzzle";
			Helpers.PlaySound("UltLoadShot", ((EntityState)this).gameObject);
			if ((Object)(object)jhinStateController.ultFX != (Object)null)
			{
				Animator component = jhinStateController.ultFX.GetComponent<Animator>();
				if (Object.op_Implicit((Object)(object)component))
				{
					EntityState.PlayAnimationOnAnimator(component, "Base Layer", "Fire");
				}
			}
			((EntityState)this).PlayAnimation("UpperBody, Override", "CurtainCallAttack");
		}

		public virtual bool CheckCrit()
		{
			return ((BaseState)this).RollCrit();
		}

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

		private void Fire()
		{
			//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_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: 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_0149: 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_0161: Unknown result type (might be due to invalid IL or missing references)
			if (!hasFired)
			{
				hasFired = true;
				GameObject ultMissilePrefab = Projectiles.ultMissilePrefab;
				((EntityState)this).characterBody.AddSpreadBloom(1.5f);
				EffectManager.SimpleMuzzleFlash(FirePistol2.muzzleEffectPrefab, ((EntityState)this).gameObject, muzzleString, false);
				Helpers.PlaySound("UltFire", ((EntityState)this).gameObject);
				if (((EntityState)this).isAuthority)
				{
					Ray aimRay = ((BaseState)this).GetAimRay();
					((BaseState)this).AddRecoil(-1f * recoil, -2f * recoil, -0.5f * recoil, 0.5f * recoil);
					FireProjectileInfo val = default(FireProjectileInfo);
					val.projectilePrefab = ultMissilePrefab;
					val.position = ((Ray)(ref aimRay)).origin;
					val.rotation = Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction);
					val.owner = ((EntityState)this).gameObject;
					val.damage = ((EntityState)this).characterBody.damage * damageCoefficient;
					val.force = force;
					val.crit = CheckCrit();
					val.damageColorIndex = (DamageColorIndex)0;
					val.target = null;
					((FireProjectileInfo)(ref val)).speedOverride = projectileSpeed;
					((FireProjectileInfo)(ref val)).fuseOverride = -1f;
					val.damageTypeOverride = DamageTypeCombo.op_Implicit((DamageType)0);
					FireProjectileInfo val2 = val;
					ProjectileManager.instance.FireProjectile(val2);
				}
				jhinStateController.TakeAmmo(1);
			}
		}

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)2;
		}
	}
	public class CurtainCallShootCrit : CurtainCallShoot
	{
		public override bool CheckCrit()
		{
			return true;
		}

		public override void OnExit()
		{
			jhinStateController.ultHasFiredLastShot = true;
			base.OnExit();
		}
	}
	public class DancingGrenade : BaseState
	{
		public static float baseDuration = 1f;

		public static float baseDelay = 0.25f;

		public static float projectileProcCoefficient = 1f;

		public static float projectileTravelSpeed = 40f;

		public static float projectileBounceRange = 25f;

		public static int maxBounceCount = 3;

		public static string attackSoundString;

		public float damageCoefficient;

		public float damageCoefficientOnBounceKill;

		private float duration;

		private float stopwatch;

		private Transform modelTransform;

		private JhinTracker tracker;

		private ChildLocator childLocator;

		private JhinStateController jhinStateController;

		private bool hasTriedToFire;

		private bool hasFired;

		private HurtBox initialOrbTarget;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			stopwatch = 0f;
			duration = baseDuration;
			damageCoefficient = Config.secondaryDamageCoefficient.Value;
			damageCoefficientOnBounceKill = Config.secondaryDamageBounceCoefficient.Value;
			modelTransform = ((EntityState)this).GetModelTransform();
			tracker = ((EntityState)this).GetComponent<JhinTracker>();
			childLocator = ((Component)modelTransform).GetComponent<ChildLocator>();
			jhinStateController = ((EntityState)this).GetComponent<JhinStateController>();
			jhinStateController.isAttacking = false;
			if (Object.op_Implicit((Object)(object)tracker) && ((EntityState)this).isAuthority)
			{
				initialOrbTarget = tracker.GetTrackingTarget();
			}
			if (jhinStateController.ammoCount != 0)
			{
				jhinStateController.StopReload(interrupt: true);
			}
			((EntityState)this).PlayAnimation("UpperBody, Override", "DancingGrenade");
			Helpers.PlaySound("QCast", ((EntityState)this).gameObject);
		}

		public override void OnExit()
		{
			((EntityState)this).OnExit();
			if (!hasFired && NetworkServer.active)
			{
				((EntityState)this).skillLocator.secondary.AddOneStock();
			}
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			stopwatch += Time.fixedDeltaTime;
			if (!hasTriedToFire && !hasFired && stopwatch > baseDelay)
			{
				FireOrbDancingGrenade();
			}
			if (stopwatch >= duration && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		private void FireOrbDancingGrenade()
		{
			//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_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			if (NetworkServer.active && !hasTriedToFire)
			{
				hasTriedToFire = true;
				ProjectileDancingGrenade projectileDancingGrenade = new ProjectileDancingGrenade();
				((LightningOrb)projectileDancingGrenade).targetsToFindPerBounce = 1;
				((LightningOrb)projectileDancingGrenade).damageValue = ((EntityState)this).characterBody.damage * damageCoefficient;
				((LightningOrb)projectileDancingGrenade).isCrit = Util.CheckRoll(((EntityState)this).characterBody.crit, ((EntityState)this).characterBody.master);
				((LightningOrb)projectileDancingGrenade).teamIndex = TeamComponent.GetObjectTeam(((EntityState)this).gameObject);
				((LightningOrb)projectileDancingGrenade).attacker = ((EntityState)this).gameObject;
				((LightningOrb)projectileDancingGrenade).procCoefficient = projectileProcCoefficient;
				((LightningOrb)projectileDancingGrenade).bouncesRemaining = maxBounceCount;
				((LightningOrb)projectileDancingGrenade).speed = projectileTravelSpeed;
				((LightningOrb)projectileDancingGrenade).bouncedObjects = new List<HealthComponent>();
				projectileDancingGrenade.deadObjects = new List<HealthComponent>();
				((LightningOrb)projectileDancingGrenade).range = projectileBounceRange;
				projectileDancingGrenade.damageCoefficientOnBounceKill = damageCoefficientOnBounceKill;
				HurtBox val = initialOrbTarget;
				if (Object.op_Implicit((Object)(object)val))
				{
					hasFired = true;
					Transform val2 = childLocator.FindChild("ShoulderR");
					((Orb)projectileDancingGrenade).origin = val2.position;
					((Orb)projectileDancingGrenade).target = val;
					OrbManager.instance.AddOrb((Orb)(object)projectileDancingGrenade);
				}
				Helpers.PlaySound("QFire", ((EntityState)this).gameObject);
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)2;
		}

		public override void OnSerialize(NetworkWriter writer)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			NetworkExtensions.Write(writer, HurtBoxReference.FromHurtBox(initialOrbTarget));
		}

		public override void OnDeserialize(NetworkReader reader)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			HurtBoxReference val = NetworkExtensions.ReadHurtBoxReference(reader);
			initialOrbTarget = ((HurtBoxReference)(ref val)).ResolveHurtBox();
		}
	}
	public class DeadlyFlourish : BaseSkillState
	{
		public static float damageCoefficient = Config.utilityDamageCoefficient.Value;

		public static float procCoefficient = 1f;

		public static float baseDuration = 1.15f;

		public static float baseFireDelay = 0.75f;

		public static float force = 800f;

		public static float recoil = 3f;

		public static float range = 256f;

		public static GameObject tracerEffectPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/Tracers/TracerGoldGat");

		private float duration;

		private float fireTime;

		private bool hasFired;

		private string muzzleString;

		private JhinStateController jhinStateController;

		public override void OnEnter()
		{
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			jhinStateController = ((EntityState)this).GetComponent<JhinStateController>();
			jhinStateController.isAttacking = false;
			if (jhinStateController.ammoCount != 0)
			{
				jhinStateController.StopReload(interrupt: true, 2f);
			}
			duration = baseDuration;
			fireTime = baseFireDelay;
			((BaseState)this).StartAimMode(duration, true);
			muzzleString = "Muzzle";
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
			{
				((EntityState)this).characterDirection.moveVector = ((EntityState)this).characterDirection.forward;
			}
			Helpers.PlaySound("WCast", ((EntityState)this).gameObject);
			((EntityState)this).PlayAnimation("FullBody, Override", "DeadlyFlourish");
		}

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

		private void Fire()
		{
			//IL_0051: 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_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: 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_00e6: 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_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: 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_0119: 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_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: 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_0164: 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_017c: 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_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: 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_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f9: Expected O, but got Unknown
			//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0201: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Expected O, but got Unknown
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			if (!hasFired)
			{
				hasFired = true;
				((EntityState)this).characterBody.AddSpreadBloom(1.5f);
				EffectManager.SimpleMuzzleFlash(FirePistol2.muzzleEffectPrefab, ((EntityState)this).gameObject, muzzleString, false);
				if (((EntityState)this).isAuthority)
				{
					Ray aimRay = ((BaseState)this).GetAimRay();
					((BaseState)this).AddRecoil(-1f * recoil, -2f * recoil, -0.5f * recoil, 0.5f * recoil);
					Helpers.PlayVFXDynamic("DeadlyFlourishBeam", ((EntityState)this).gameObject, muzzleString, useAim: true, aimRay);
					Helpers.PlayVFXDynamic("DeadlyFlourishMuzzle", ((EntityState)this).gameObject, muzzleString, useAim: true, aimRay);
					new BulletAttack
					{
						bulletCount = 1u,
						aimVector = ((Ray)(ref aimRay)).direction,
						origin = ((Ray)(ref aimRay)).origin,
						damage = damageCoefficient * ((BaseState)this).damageStat,
						damageColorIndex = (DamageColorIndex)0,
						damageType = DamageTypeCombo.op_Implicit((DamageType)32),
						falloffModel = (FalloffModel)0,
						maxDistance = range,
						force = force,
						hitMask = CommonMasks.bullet,
						minSpread = 0f,
						maxSpread = 0f,
						isCrit = ((BaseState)this).RollCrit(),
						owner = ((EntityState)this).gameObject,
						muzzleName = muzzleString,
						smartCollision = false,
						procChainMask = default(ProcChainMask),
						procCoefficient = procCoefficient,
						radius = 1f,
						sniper = false,
						stopperMask = LayerMask.op_Implicit(0),
						weapon = null,
						tracerEffectPrefab = tracerEffectPrefab,
						spreadPitchScale = 0f,
						spreadYawScale = 0f,
						queryTriggerInteraction = (QueryTriggerInteraction)0,
						hitCallback = new HitCallback(BulletHitCallback),
						modifyOutgoingDamageCallback = new ModifyOutgoingDamageCallback(ModifyDamage),
						hitEffectPrefab = FirePistol2.hitEffectPrefab
					}.Fire();
				}
			}
		}

		private bool BulletHitCallback(BulletAttack bulletAttack, ref BulletHit hitInfo)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			bool result = BulletAttack.defaultHitCallback.Invoke(bulletAttack, ref hitInfo);
			HealthComponent val = (Object.op_Implicit((Object)(object)hitInfo.hitHurtBox) ? hitInfo.hitHurtBox.healthComponent : null);
			if (Object.op_Implicit((Object)(object)val) && hitInfo.hitHurtBox.teamIndex != ((EntityState)this).teamComponent.teamIndex)
			{
				((EntityState)this).characterBody.AddTimedBuff(Buffs.jhinCritMovespeedBuff, Config.passiveBuffDuration.Value * Config.utilityBuffMultiplier.Value);
			}
			return result;
		}

		private void ModifyDamage(BulletAttack _bulletAttack, ref BulletHit hitInfo, DamageInfo damageInfo)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			DamageAPI.AddModdedDamageType(damageInfo, Buffs.JhinConsumeMarkDamage);
		}

		public override void FixedUpdate()
		{
			//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)
			((EntityState)this).FixedUpdate();
			if (!hasFired)
			{
				AimAnimator aimAnimator = ((EntityState)this).GetAimAnimator();
				if (Object.op_Implicit((Object)(object)aimAnimator))
				{
					aimAnimator.AimImmediate();
				}
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Object.op_Implicit((Object)(object)((EntityState)this).inputBank))
				{
					((EntityState)this).characterDirection.moveVector = ((EntityState)this).inputBank.aimDirection;
				}
			}
			HandleMovements();
			if (((EntityState)this).fixedAge >= fireTime)
			{
				Fire();
			}
			if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public virtual void HandleMovements()
		{
			//IL_0035: 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)
			if (!((EntityState)this).characterMotor.isGrounded)
			{
				((EntityState)this).characterMotor.moveDirection = ((EntityState)this).inputBank.moveVector;
			}
			else
			{
				((EntityState)this).characterMotor.moveDirection = Vector3.zero;
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)2;
		}
	}
	public class WhisperPrimary : BaseSkillState
	{
		public static float damageCoefficient = Config.primaryDamageCoefficient.Value;

		public static float procCoefficient = 1f;

		public static float baseDuration = 2.57f;

		public static float baseFireDelayPercent = 0.1f;

		public static float force = 800f;

		public static float recoil = 3f;

		public static float range = 256f;

		public static GameObject tracerEffectPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/Tracers/TracerGoldGat");

		private JhinStateController jhinStateController;

		private float duration;

		private float durationAnimation;

		private float fireTime;

		private bool hasFired;

		private bool isCrit;

		private string muzzleString;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			jhinStateController = ((EntityState)this).GetComponent<JhinStateController>();
			jhinStateController.timeSinceFire = 0f;
			jhinStateController.isAttacking = true;
			jhinStateController.ResetReload();
			Helpers.StopSound("PassiveCritSpin", ((EntityState)this).gameObject, null, "Jhin");
			Helpers.StopSound("PassiveCritMusic", ((EntityState)this).gameObject, null, "Jhin");
			((EntityState)this).characterBody.SetAimTimer(3f);
			int num = jhinStateController.ammoMax - (jhinStateController.ammoCount - 1);
			durationAnimation = baseDuration * (((EntityState)this).characterBody.baseAttackSpeed / ((EntityState)this).characterBody.attackSpeed);
			duration = 1f / ((EntityState)this).characterBody.attackSpeed;
			fireTime = baseFireDelayPercent * durationAnimation;
			muzzleString = "Muzzle";
			isCrit = ((BaseState)this).RollCrit();
			if (Config.primaryInstantShot.Value && num != 4)
			{
				fireTime = 0f;
			}
			else
			{
				Helpers.PlaySound((num == 4) ? "PassiveCritCast" : (isCrit ? "AttackCastCrit" : $"AttackCast{num}"), ((EntityState)this).gameObject, null, "", defaultToBase: true, "AttackCast1");
			}
			PlayFireAnimation();
		}

		public void PlayFireAnimation()
		{
			int num = jhinStateController.ammoMax - (jhinStateController.ammoCount - 1);
			Animator modelAnimator = ((EntityState)this).GetModelAnimator();
			float num2 = baseDuration / durationAnimation;
			float cycleOffset = (Config.primaryInstantShot.Value ? (5f / 32f * num2) : 0f);
			if (num == 4)
			{
				int layerIndex = modelAnimator.GetLayerIndex("UpperBody, Override");
				modelAnimator.SetLayerWeight(layerIndex, 0f);
				((EntityState)this).PlayAnimation("FullBody Passive Crit, Override", "AttackPassiveCrit", "ShootGun.playbackRate", durationAnimation, 0f);
			}
			else
			{
				PlayAnimationOnAnimatorCustom(modelAnimator, "UpperBody, Override", isCrit ? "AttackCrit" : $"Attack{num}", "ShootGun.playbackRate", durationAnimation, cycleOffset);
			}
		}

		protected static void PlayAnimationOnAnimatorCustom(Animator modelAnimator, string layerName, string animationStateName, string playbackRateParam, float duration, float cycleOffset)
		{
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			modelAnimator.speed = 1f;
			modelAnimator.Update(0f);
			int layerIndex = modelAnimator.GetLayerIndex(layerName);
			if (layerIndex >= 0)
			{
				modelAnimator.SetFloat(playbackRateParam, 1f);
				modelAnimator.PlayInFixedTime(animationStateName, layerIndex, cycleOffset);
				modelAnimator.Update(0f);
				AnimatorStateInfo currentAnimatorStateInfo = modelAnimator.GetCurrentAnimatorStateInfo(layerIndex);
				float length = ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).length;
				modelAnimator.SetFloat(playbackRateParam, length / duration);
			}
		}

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

		private void Fire()
		{
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: 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)
			if (!hasFired)
			{
				hasFired = true;
				if (jhinStateController.ammoCount == 1)
				{
					isCrit = true;
					Animator modelAnimator = ((EntityState)this).GetModelAnimator();
					int layerIndex = modelAnimator.GetLayerIndex("UpperBody, Override");
					modelAnimator.SetLayerWeight(layerIndex, 1f);
				}
				((EntityState)this).characterBody.SetAimTimer(duration * 2f);
				((EntityState)this).characterBody.AddSpreadBloom(1.5f);
				DoFireEffects();
				((BaseState)this).AddRecoil(-1f * recoil, -2f * recoil, -0.5f * recoil, 0.5f * recoil);
				if (((EntityState)this).isAuthority)
				{
					Ray aimRay = ((BaseState)this).GetAimRay();
					BulletAttack val = GenerateBulletAttack(aimRay);
					val.Fire();
					OnFireBulletAuthority(aimRay);
				}
				jhinStateController.TakeAmmo(1);
				jhinStateController.isAttacking = false;
			}
		}

		protected BulletAttack GenerateBulletAttack(Ray aimRay)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: 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_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: 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_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: 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_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: 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_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: 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_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: 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_0122: Expected O, but got Unknown
			//IL_0122: 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_0134: Expected O, but got Unknown
			//IL_0135: Expected O, but got Unknown
			return new BulletAttack
			{
				aimVector = ((Ray)(ref aimRay)).direction,
				origin = ((Ray)(ref aimRay)).origin,
				owner = ((EntityState)this).gameObject,
				weapon = null,
				bulletCount = 1u,
				damage = ((BaseState)this).damageStat * damageCoefficient,
				damageColorIndex = (DamageColorIndex)0,
				damageType = DamageTypeCombo.op_Implicit((DamageType)0),
				falloffModel = (FalloffModel)1,
				force = force,
				HitEffectNormal = false,
				procChainMask = default(ProcChainMask),
				procCoefficient = CalculateProcCoefficient(),
				maxDistance = range,
				radius = 0.25f,
				isCrit = isCrit,
				muzzleName = muzzleString,
				minSpread = 0f,
				maxSpread = 0f,
				hitEffectPrefab = FirePistol2.hitEffectPrefab,
				smartCollision = false,
				sniper = false,
				spreadPitchScale = 0f,
				spreadYawScale = 0f,
				tracerEffectPrefab = tracerEffectPrefab,
				hitCallback = new HitCallback(BulletHitCallback),
				modifyOutgoingDamageCallback = new ModifyOutgoingDamageCallback(ModifyDamage)
			};
		}

		public virtual float CalculateProcCoefficient()
		{
			float num = procCoefficient;
			JhinStateController component = ((EntityState)this).GetComponent<JhinStateController>();
			CharacterBody component2 = ((EntityState)this).GetComponent<CharacterBody>();
			if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component2))
			{
				num *= component.preModAtkSpeed / (component2.baseAttackSpeed + component2.levelAttackSpeed * (component2.level - 1f));
			}
			return num;
		}

		public virtual bool CreateTracer(string tracerName, Ray aimRay, string fallback = "")
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: 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_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: 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_0160: 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_016e: 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_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Expected O, but got Unknown
			LayerMask defaultHitMask = BulletAttack.defaultHitMask;
			RaycastHit val = default(RaycastHit);
			Physics.SphereCast(((Ray)(ref aimRay)).origin, 0.25f, ((Ray)(ref aimRay)).direction, ref val, range, LayerMask.op_Implicit(defaultHitMask), (QueryTriggerInteraction)1);
			GameObject vFXDynamic = Helpers.GetVFXDynamic(tracerName, ((EntityState)this).gameObject);
			if ((Object)(object)vFXDynamic == (Object)null)
			{
				vFXDynamic = Helpers.GetVFXDynamic(fallback, ((EntityState)this).gameObject);
			}
			if ((Object)(object)vFXDynamic != (Object)null)
			{
				CustomTracer component = vFXDynamic.GetComponent<CustomTracer>();
				component.origin = ((Ray)(ref aimRay)).origin;
				component.target = (((Object)(object)((RaycastHit)(ref val)).collider != (Object)null) ? ((RaycastHit)(ref val)).point : (((Ray)(ref aimRay)).origin + ((Ray)(ref aimRay)).direction * range));
				component.projectileSpeed = 250f;
				component.maxDistance = (((Object)(object)((RaycastHit)(ref val)).collider != (Object)null) ? ((RaycastHit)(ref val)).distance : range);
				ModelLocator component2 = ((EntityState)this).gameObject.GetComponent<ModelLocator>();
				if (Object.op_Implicit((Object)(object)component2) && Object.op_Implicit((Object)(object)component2.modelTransform))
				{
					ChildLocator component3 = ((Component)component2.modelTransform).GetComponent<ChildLocator>();
					if (Object.op_Implicit((Object)(object)component3))
					{
						int num = component3.FindChildIndex(muzzleString);
						Transform val2 = component3.FindChild(num);
						if (Object.op_Implicit((Object)(object)val2))
						{
							EffectData val3 = new EffectData
							{
								origin = val2.position,
								rotation = Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction)
							};
							val3.SetChildLocatorTransformReference(((EntityState)this).gameObject, num);
							EffectManager.SpawnEffect(vFXDynamic, val3, false);
						}
					}
				}
				component.isActive = true;
				return true;
			}
			return false;
		}

		protected virtual void DoFireEffects()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: 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)
			int num = jhinStateController.ammoMax - (jhinStateController.ammoCount - 1);
			Ray aimRay = ((BaseState)this).GetAimRay();
			Helpers.PlaySound((num == 4) ? "PassiveCritFire" : (isCrit ? "AttackCritFire" : $"AttackFire{num}"), ((EntityState)this).gameObject, null, "", defaultToBase: true, "AttackFire1");
			Helpers.PlayVFXDynamic((num == 4) ? "MuzzleFlashFourth" : "MuzzleFlash", ((EntityState)this).gameObject, muzzleString, useAim: true, aimRay, null, transmit: false, defaultToBase: true, "MuzzleFlash");
			CreateTracer((num == 4) ? "TracerFourth" : "Tracer", aimRay, "Tracer");
		}

		protected virtual void OnFireBulletAuthority(Ray aimRay)
		{
		}

		private bool BulletHitCallback(BulletAttack bulletAttack, ref BulletHit hitInfo)
		{
			bool result = BulletAttack.defaultHitCallback.Invoke(bulletAttack, ref hitInfo);
			HealthComponent val = (Object.op_Implicit((Object)(object)hitInfo.hitHurtBox) ? hitInfo.hitHurtBox.healthComponent : null);
			return result;
		}

		private void ModifyDamage(BulletAttack _bulletAttack, ref BulletHit hitInfo, DamageInfo damageInfo)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			SkillLocator component = ((EntityState)this).GetComponent<SkillLocator>();
			if (Object.op_Implicit((Object)(object)component) && component.utility.cooldownRemaining < 4f)
			{
				DamageAPI.AddModdedDamageType(damageInfo, Buffs.JhinMarkDamage);
			}
			int num = jhinStateController.ammoMax - (jhinStateController.ammoCount - 1);
			HealthComponent val = (Object.op_Implicit((Object)(object)hitInfo.hitHurtBox) ? hitInfo.hitHurtBox.healthComponent : null);
			if (Object.op_Implicit((Object)(object)val) && hitInfo.hitHurtBox.teamIndex != ((EntityState)this).teamComponent.teamIndex && num == 4)
			{
				float num2 = val.missingCombinedHealth * Config.primaryExecuteMissingHealthPercentage.Value;
				float val2 = damageInfo.damage * Config.primaryExecuteDamageCap.Value;
				if (Config.primaryExecuteDamageCap.Value != 0f)
				{
					damageInfo.damage += Math.Min(num2, val2);
				}
				else
				{
					damageInfo.damage += num2;
				}
			}
		}

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)2;
		}
	}
	public class WhisperReload : BaseState
	{
		private JhinStateController jhinStateController;

		public float duration;

		private bool hasReloaded;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			jhinStateController = ((EntityState)this).GetComponent<JhinStateController>();
			duration = jhinStateController.reloadTime;
			bool flag = jhinStateController.ammoCount == 0 && jhinStateController.timeSinceFire < 0.5f;
			((EntityState)this).PlayCrossfade("UpperBody, Override", flag ? "Reload_FromFireEmpty" : "Reload", "", duration, 0.2f);
			Helpers.PlaySound(flag ? "ReloadEmpty" : "Reload", ((EntityState)this).gameObject);
			Helpers.StopSound("PassiveCritSpin", ((EntityState)this).gameObject);
			Helpers.StopSound("PassiveCritMusic", ((EntityState)this).gameObject);
		}

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

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

		private void PerformReload()
		{
			if (!hasReloaded)
			{
				hasReloaded = true;
				jhinStateController.Reload(full: true);
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)0;
		}
	}
}
namespace JhinMod.SkillStates.Henry
{
	public class Roll : BaseSkillState
	{
		public static float duration = 0.5f;

		public static float initialSpeedCoefficient = 5f;

		public static float finalSpeedCoefficient = 2.5f;

		public static string dodgeSoundString = "JhinRoll";

		public static float dodgeFOV = DodgeState.dodgeFOV;

		private float rollSpeed;

		private Vector3 forwardDirection;

		private Animator animator;

		private Vector3 previousPosition;

		public override void OnEnter()
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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_009d: 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_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: 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_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: 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_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//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_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			animator = ((EntityState)this).GetModelAnimator();
			if (((EntityState)this).isAuthority && Object.op_Implicit((Object)(object)((EntityState)this).inputBank) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
			{
				Vector3 val = ((((EntityState)this).inputBank.moveVector == Vector3.zero) ? ((EntityState)this).characterDirection.forward : ((EntityState)this).inputBank.moveVector);
				forwardDirection = ((Vector3)(ref val)).normalized;
			}
			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);
			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;
			}
			Vector3 val4 = (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) ? ((EntityState)this).characterMotor.velocity : Vector3.zero);
			previousPosition = ((EntityState)this).transform.position - val4;
			((EntityState)this).PlayAnimation("FullBody, Override", "Roll", "Roll.playbackRate", duration, 0f);
			Util.PlaySound(dodgeSoundString, ((EntityState)this).gameObject);
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddTimedBuff(Buffs.armorBuff, 3f * duration);
				((EntityState)this).characterBody.AddTimedBuff(Buffs.HiddenInvincibility, 0.5f * duration);
			}
		}

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

		public override void FixedUpdate()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: 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_010a: 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_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).FixedUpdate();
			RecalculateRollSpeed();
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
			{
				((EntityState)this).characterDirection.forward = forwardDirection;
			}
			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 num = Mathf.Max(Vector3.Dot(val2, forwardDirection), 0f);
				val2 = forwardDirection * num;
				val2.y = 0f;
				((EntityState)this).characterMotor.velocity = val2;
			}
			previousPosition = ((EntityState)this).transform.position;
			if (((EntityState)this).isAuthority && ((EntityState)this).fixedAge >= duration)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override void OnExit()
		{
			if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams))
			{
				((EntityState)this).cameraTargetParams.fovOverride = -1f;
			}
			((EntityState)this).OnExit();
			((EntityState)this).characterMotor.disableAirControlUntilCollision = false;
		}

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

		public override void OnDeserialize(NetworkReader reader)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			((BaseSkillState)this).OnDeserialize(reader);
			forwardDirection = reader.ReadVector3();
		}
	}
	public class Shoot : BaseSkillState
	{
		public static float damageCoefficient = 4.2f;

		public static float procCoefficient = 1f;

		public static float baseDuration = 0.6f;

		public static float force = 800f;

		public static float recoil = 3f;

		public static float range = 256f;

		public static GameObject tracerEffectPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/Tracers/TracerGoldGat");

		private float duration;

		private float fireTime;

		private bool hasFired;

		private string muzzleString;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			duration = DeadlyFlourish.baseDuration / ((BaseState)this).attackSpeedStat;
			fireTime = 0.2f * duration;
			((EntityState)this).characterBody.SetAimTimer(2f);
			muzzleString = "Muzzle";
			((EntityState)this).PlayAnimation("UpperBody, Override", "Attack", "ShootGun.playbackRate", 1.8f, 0f);
		}

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

		private void Fire()
		{
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: 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_00a7: 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_00b5: 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_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00e7: 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_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: 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_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: 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_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: 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_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			if (!hasFired)
			{
				hasFired = true;
				((EntityState)this).characterBody.AddSpreadBloom(1.5f);
				EffectManager.SimpleMuzzleFlash(FirePistol2.muzzleEffectPrefab, ((EntityState)this).gameObject, muzzleString, false);
				Util.PlaySound("Play_Seroronin_Jhin_AttackCast", ((EntityState)this).gameObject);
				if (((EntityState)this).isAuthority)
				{
					Ray aimRay = ((BaseState)this).GetAimRay();
					((BaseState)this).AddRecoil(-1f * recoil, -2f * recoil, -0.5f * recoil, 0.5f * recoil);
					new BulletAttack
					{
						bulletCount = 1u,
						aimVector = ((Ray)(ref aimRay)).direction,
						origin = ((Ray)(ref aimRay)).origin,
						damage = damageCoefficient * ((BaseState)this).damageStat,
						damageColorIndex = (DamageColorIndex)0,
						damageType = DamageTypeCombo.op_Implicit((DamageType)0),
						falloffModel = (FalloffModel)1,
						maxDistance = range,
						force = force,
						hitMask = CommonMasks.bullet,
						minSpread = 0f,
						maxSpread = 0f,
						isCrit = ((BaseState)this).RollCrit(),
						owner = ((EntityState)this).gameObject,
						muzzleName = muzzleString,
						smartCollision = false,
						procChainMask = default(ProcChainMask),
						procCoefficient = procCoefficient,
						radius = 0.75f,
						sniper = false,
						stopperMask = CommonMasks.bullet,
						weapon = null,
						tracerEffectPrefab = tracerEffectPrefab,
						spreadPitchScale = 0f,
						spreadYawScale = 0f,
						queryTriggerInteraction = (QueryTriggerInteraction)0,
						hitEffectPrefab = FirePistol2.hitEffectPrefab
					}.Fire();
				}
			}
		}

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)2;
		}
	}
	public class SlashCombo : BaseMeleeAttack
	{
		public override void OnEnter()
		{
			//IL_000e: 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_00da: 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)
			hitboxName = "Sword";
			damageType = (DamageType)0;
			damageCoefficient = 2.8f;
			procCoefficient = 1f;
			pushForce = 300f;
			bonusForce = Vector3.zero;
			baseDuration = 1f;
			attackStartTime = 0.2f;
			attackEndTime = 0.4f;
			baseEarlyExitTime = 0.4f;
			hitStopDuration = 0.012f;
			attackRecoil = 0.5f;
			hitHopVelocity = 4f;
			swingSoundString = "JhinSwordSwing";
			hitSoundString = "";
			muzzleString = ((swingIndex % 2 == 0) ? "SwingLeft" : "SwingRight");
			swingEffectPrefab = Asset.swordSwingEffect;
			hitEffectPrefab = Asset.swordHitImpactEffect;
			impactSound = Asset.swordHitSoundEvent.index;
			base.OnEnter();
		}

		protected override void PlayAttackAnimation()
		{
			base.PlayAttackAnimation();
		}

		protected override void PlaySwingEffect()
		{
			base.PlaySwingEffect();
		}

		protected override void OnHitEnemyAuthority()
		{
			base.OnHitEnemyAuthority();
		}

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

		public override void OnExit()
		{
			base.OnExit();
		}
	}
	public class ThrowBomb : GenericProjectileBaseState
	{
		public static float BaseDuration = 0.65f;

		public static float BaseDelayDuration = 0.35f * BaseDuration;

		public static float DamageCoefficient = 1.6f;

		public override void OnEnter()
		{
			base.projectilePrefab = Projectiles.bombPrefab;
			base.attackSoundString = "JhinBombThrow";
			base.baseDuration = BaseDuration;
			base.baseDelayBeforeFiringProjectile = BaseDelayDuration;
			base.damageCoefficient = DamageCoefficient;
			base.force = 80f;
			base.recoilAmplitude = 0.1f;
			base.bloom = 10f;
			((GenericProjectileBaseState)this).OnEnter();
		}

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)1;
		}

		public override void PlayAnimation(float duration)
		{
			if (Object.op_Implicit((Object)(object)((EntityState)this).GetModelAnimator()))
			{
				((EntityState)this).PlayAnimation("Gesture, Override", "ThrowBomb", "ThrowBomb.playbackRate", base.duration, 0f);
			}
		}
	}
}
namespace JhinMod.SkillStates.BaseStates
{
	internal class AnimatedDeathState : GenericCharacterDeath
	{
		public override void FixedUpdate()
		{
			((GenericCharacterDeath)this).FixedUpdate();
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)7;
		}

		public override void OnEnter()
		{
			((GenericCharacterDeath)this).OnEnter();
			Helpers.PlaySound("DeathSFX", ((EntityState)this).gameObject);
			Animator modelAnimator = ((EntityState)this).GetModelAnimator();
			if (Object.op_Implicit((Object)(object)modelAnimator))
			{
				modelAnimator.CrossFadeInFixedTime("Death", 0.1f);
			}
		}

		public override void OnExit()
		{
			((GenericCharacterDeath)this).OnExit();
		}
	}
	public class BaseMeleeAttack : BaseSkillState
	{
		public int swingIndex;

		protected string hitboxName = "Sword";

		protected DamageType damageType = (DamageType)0;

		protected float damageCoefficient = 3.5f;

		protected float procCoefficient = 1f;

		protected float pushForce = 300f;

		protected Vector3 bonusForce = Vector3.zero;

		protected float baseDuration = 1f;

		protected float attackStartTime = 0.2f;

		protected float attackEndTime = 0.4f;

		protected float baseEarlyExitTime = 0.4f;

		protected float hitStopDuration = 0.012f;

		protected float attackRecoil = 0.75f;

		protected float hitHopVelocity = 4f;

		protected bool cancelled = false;

		protected string swingSoundString = "";

		protected string hitSoundString = "";

		protected string muzzleString = "SwingCenter";

		protected GameObject swingEffectPrefab;

		protected GameObject hitEffectPrefab;

		protected NetworkSoundEventIndex impactSound;

		private float earlyExitTime;

		public float duration;

		private bool hasFired;

		private float hitPauseTimer;

		private OverlapAttack attack;

		protected bool inHitPause;

		private bool hasHopped;

		protected float stopwatch;

		protected Animator animator;

		private HitStopCachedState hitStopCachedState;

		private Vector3 storedVelocity;

		public override void OnEnter()
		{
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Expected O, but got Unknown
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			earlyExitTime = baseEarlyExitTime / ((BaseState)this).attackSpeedStat;
			hasFired = false;
			animator = ((EntityState)this).GetModelAnimator();
			((BaseState)this).StartAimMode(0.5f + duration, false);
			((EntityState)this).characterBody.outOfCombatStopwatch = 0f;
			animator.SetBool("attacking", true);
			HitBoxGroup hitBoxGroup = null;
			Transform modelTransform = ((EntityState)this).GetModelTransform();
			if (Object.op_Implicit((Object)(object)modelTransform))
			{
				hitBoxGroup = Array.Find(((Component)modelTransform).GetComponents<HitBoxGroup>(), (HitBoxGroup element) => element.groupName == hitboxName);
			}
			PlayAttackAnimation();
			attack = new OverlapAttack();
			attack.damageType = DamageTypeCombo.op_Implicit(damageType);
			attack.attacker = ((EntityState)this).gameObject;
			attack.inflictor = ((EntityState)this).gameObject;
			attack.teamIndex = ((BaseState)this).GetTeam();
			attack.damage = damageCoefficient * ((BaseState)this).damageStat;
			attack.procCoefficient = procCoefficient;
			attack.hitEffectPrefab = hitEffectPrefab;
			attack.forceVector = bonusForce;
			attack.pushAwayForce = pushForce;
			attack.hitBoxGroup = hitBoxGroup;
			attack.isCrit = ((BaseState)this).RollCrit();
			attack.impactSound = impactSound;
		}

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

		public override void OnExit()
		{
			if (!hasFired && !cancelled)
			{
				FireAttack();
			}
			((EntityState)this).OnExit();
			animator.SetBool("attacking", false);
		}

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

		protected virtual void OnHitEnemyAuthority()
		{
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			Util.PlaySound(hitSoundString, ((EntityState)this).gameObject);
			if (!hasHopped)
			{
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && !((EntityState)this).characterMotor.isGrounded && hitHopVelocity > 0f)
				{
					((BaseState)this).SmallHop(((EntityState)this).characterMotor, hitHopVelocity);
				}
				hasHopped = true;
			}
			if (!inHitPause && hitStopDuration > 0f)
			{
				storedVelocity = ((EntityState)this).characterMotor.velocity;
				hitStopCachedState = ((BaseState)this).CreateHitStopCachedState(((EntityState)this).characterMotor, animator, "Slash.playbackRate");
				hitPauseTimer = hitStopDuration / ((BaseState)this).attackSpeedStat;
				inHitPause = true;
			}
		}

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

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

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)1;
		}

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

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

		public static float TimedBaseCastStartTime;

		public static float TimedBaseCastEndTime;

		protected float duration;

		protected float castStartTime;

		protected float castEndTime;

		protected bool hasFired;

		protected bool isFiring;

		protected bool hasExited;

		protected virtual void InitDurationValues(float baseDuration, float baseCastStartTime, float baseCastEndTime = 1f)
		{
			TimedBaseDuration = baseDuration;
			TimedBaseCastStartTime = baseCastStartTime;
			TimedBaseCastEndTime = baseCastEndTime;
			duration = TimedBaseDuration / ((BaseState)this).attackSpeedStat;
			castStartTime = baseCastStartTime * duration;
			castEndTime = baseCastEndTime * duration;
		}

		protected virtual void OnCastEnter()
		{
		}

		protected virtual void OnCastFixedUpdate()
		{
		}

		protected virtual void OnCastUpdate()
		{
		}

		protected virtual void OnCastExit()
		{
		}

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

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

		public static float SkillStartTime = 0.2f;

		public static float SkillEndTime = 0.9f;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			InitDurationValues(SkillBaseDuration, SkillStartTime, SkillEndTime);
		}

		protected override void OnCastEnter()
		{
		}

		protected override void OnCastFixedUpdate()
		{
		}

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

		public static float SkillStartTime = 0.2f;

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

		protected override void OnCastEnter()
		{
		}
	}
	public class JhinWeaponMainState : BaseState
	{
		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
		}

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

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
		}
	}
	public class JhinWeaponPassiveCritReadyState : BaseState
	{
		[SerializeField]
		public SkillDef primaryOverrideSkillDef;

		protected JhinStateController jhinStateController;

		protected Animator animatorComponent;

		public override void OnEnter()
		{
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			jhinStateController = ((EntityState)this).GetComponent<JhinStateController>();
			animatorComponent = ((EntityState)this).GetModelAnimator();
			string text = "SERORONIN_JHIN_BODY_";
			primaryOverrideSkillDef = (SkillDef)(object)Skills.CreateSkillDef<JhinAmmoSkillDef>(new SkillDefInfo
			{
				skillName = text + "PRIMARY_WHISPER_NAME",
				skillNameToken = text + "PRIMARY_WHISPER_NAME",
				skillDescriptionToken = text + "PRIMARY_WHISPER_CRIT_DESCRIPTION",
				skillIcon = Asset.mainAssetBundle.LoadAsset<Sprite>("texPrimaryCritIcon"),
				activationState = new SerializableEntityStateType(typeof(WhisperPrimary)),
				activationStateMachineName = "Weapon",
				interruptPriority = (InterruptPriority)0,
				isCombatSkill = true,
				baseRechargeInterval = 0f,
				requiredStock = 0,
				stockToConsume = 0,
				cancelSprintingOnActivation = false,
				keywordTokens = new string[2] { "KEYWORD_AGILE", "KEYWORD_EXECUTING" }
			});
			Helpers.PlaySound("PassiveCritSpin", ((EntityState)this).gameObject);
			Helpers.PlaySound("PassiveCritMusic", ((EntityState)this).gameObject);
			if (Object.op_Implicit((Object)(object)animatorComponent))
			{
				int layerIndex = animatorComponent.GetLayerIndex("UpperBody Idle, Override");
				animatorComponent.SetLayerWeight(layerIndex, 1f);
			}
			if (((EntityState)this).isAuthority && Object.op_Implicit((Object)(object)((EntityState)this).skillLocator))
			{
				((EntityState)this).skillLocator.primary.SetSkillOverride((object)this, primaryOverrideSkillDef, (SkillOverridePriority)2);
			}
		}

		public override void OnExit()
		{
			Helpers.StopSound("PassiveCritSpin", ((EntityState)this).gameObject);
			Helpers.StopSound("PassiveCritMusic", ((EntityState)this).gameObject);
			if (Object.op_Implicit((Object)(object)animatorComponent))
			{
				int layerIndex = animatorComponent.GetLayerIndex("UpperBody Idle, Override");
				animatorComponent.SetLayerWeight(layerIndex, 0f);
			}
			if (((EntityState)this).isAuthority && Object.op_Implicit((Object)(object)((EntityState)this).skillLocator))
			{
				((EntityState)this).skillLocator.primary.UnsetSkillOverride((object)this, primaryOverrideSkillDef, (SkillOverridePriority)2);
			}
			((EntityState)this).OnExit();
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)0;
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
		}
	}
	public class JhinWeaponUltActiveState : BaseState
	{
		public float baseDuration = 10f;

		public float duration = 10f;

		public bool startedExit = false;

		public bool startedExitEffects = false;

		public float exitDuration = 0.5f;

		[SerializeField]
		public SkillDef primaryOverrideSkillDef;

		public SkillDef primaryOverrideCritSkillDef;

		public SkillDef specialCancelSkillDef;

		protected JhinStateController jhinStateController;

		protected Animator animatorComponent;

		public override void OnEnter()
		{
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: 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_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_024a: 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_0294: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			jhinStateController = ((EntityState)this).GetComponent<JhinStateController>();
			animatorComponent = ((EntityState)this).GetModelAnimator();
			string text = "SERORONIN";
			primaryOverrideSkillDef = Skills.CreateSkillDef(new SkillDefInfo
			{
				skillName = text + "_JHIN_BODY_SPECIAL_ULT_NAME",
				skillNameToken = text + "_JHIN_BODY_SPECIAL_ULT_NAME",
				skillDescriptionToken = text + "_JHIN_BODY_SPECIAL_ULT_SHOT_DESCRIPTION",
				skillIcon = Asset.mainAssetBundle.LoadAsset<Sprite>("texSpecialShotIcon"),
				activationState = new SerializableEntityStateType(typeof(CurtainCallShoot)),
				activationStateMachineName = "Weapon",
				baseMaxStock = 1,
				baseRechargeInterval = Config.specialCD.Value,
				beginSkillCooldownOnSkillEnd = false,
				canceledFromSprinting = false,
				forceSprintDuringState = false,
				fullRestockOnAssign = true,
				interruptPriority = (InterruptPriority)0,
				resetCooldownTimerOnUse = false,
				isCombatSkill = true,
				mustKeyPress = true,
				cancelSprintingOnActivation = true,
				rechargeStock = 0,
				requiredStock = 0,
				stockToConsume = 0
			});
			primaryOverrideCritSkillDef = Skills.CreateSkillDef(new SkillDefInfo
			{
				skillName = text + "_JHIN_BODY_SPECIAL_ULT_NAME",
				skillNameToken = text + "_JHIN_BODY_SPECIAL_UL