Decompiled source of JJBA Kira v1.0.1

plugins/JJBAKira.dll

Decompiled 8 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
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.Configuration;
using EntityStates;
using EntityStates.Commando;
using JJBAMod.Modules;
using JJBAMod.Modules.Achievements;
using JJBAMod.Modules.BaseStates;
using JJBAMod.Modules.Characters;
using JJBAMod.Modules.Stands;
using JJBAMod.Survivors.Kira.Components;
using JJBAMod.Survivors.Kira.SkillStates;
using R2API;
using R2API.Utils;
using RoR2;
using RoR2.CharacterAI;
using RoR2.Projectile;
using RoR2.Skills;
using RoR2.WwiseUtils;
using TMPro;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("JJBAKira")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("JJBAKira")]
[assembly: AssemblyTitle("JJBAKira")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace JJBAMod.Survivors.Kira
{
	public class BitesTheDustSkillDef : StandSkillDef
	{
		protected override bool StandAvailable(GenericSkill skillSlot)
		{
			CharacterBody characterBody = skillSlot.characterBody;
			StandUser val = (Object.op_Implicit((Object)(object)characterBody) ? ((Component)characterBody).GetComponent<StandUser>() : null);
			KiraBitesTheDust kiraBitesTheDust = (Object.op_Implicit((Object)(object)characterBody) ? ((Component)characterBody).GetComponent<KiraBitesTheDust>() : null);
			if (Object.op_Implicit((Object)(object)kiraBitesTheDust) && kiraBitesTheDust.HasSave)
			{
				return true;
			}
			if (!Object.op_Implicit((Object)(object)val))
			{
				return true;
			}
			if (!val.IsBroken && !val.IsSealed)
			{
				return val.GaugeFraction >= 0.4f;
			}
			return false;
		}
	}
	public class FirstBombSkillDef : StandSkillDef
	{
		protected override bool StandAvailable(GenericSkill skillSlot)
		{
			CharacterBody characterBody = skillSlot.characterBody;
			StandUser val = (Object.op_Implicit((Object)(object)characterBody) ? ((Component)characterBody).GetComponent<StandUser>() : null);
			KiraBombTracker kiraBombTracker = (Object.op_Implicit((Object)(object)characterBody) ? ((Component)characterBody).GetComponent<KiraBombTracker>() : null);
			if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)kiraBombTracker) && kiraBombTracker.HasTarget)
			{
				if (!val.IsBroken)
				{
					return !val.IsSealed;
				}
				return false;
			}
			return ((StandSkillDef)this).StandAvailable(skillSlot);
		}
	}
	public static class KiraAI
	{
		public static void Init(GameObject bodyPrefab, string masterName)
		{
			//IL_0035: 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_00cb: 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_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: 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_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0230: Unknown result type (might be due to invalid IL or missing references)
			//IL_0248: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0313: Unknown result type (might be due to invalid IL or missing references)
			//IL_0325: Unknown result type (might be due to invalid IL or missing references)
			//IL_032b: Unknown result type (might be due to invalid IL or missing references)
			GameObject obj = Prefabs.CreateBlankMasterPrefab(bodyPrefab, masterName);
			BaseAI component = obj.GetComponent<BaseAI>();
			component.aimVectorDampTime = 0.1f;
			component.aimVectorMaxSpeed = 360f;
			AISkillDriver obj2 = obj.AddComponent<AISkillDriver>();
			obj2.customName = "Use Primary Swing";
			obj2.skillSlot = (SkillSlot)0;
			obj2.requiredSkill = null;
			obj2.requireSkillReady = false;
			obj2.requireEquipmentReady = false;
			obj2.minUserHealthFraction = float.NegativeInfinity;
			obj2.maxUserHealthFraction = float.PositiveInfinity;
			obj2.minTargetHealthFraction = float.NegativeInfinity;
			obj2.maxTargetHealthFraction = float.PositiveInfinity;
			obj2.minDistance = 0f;
			obj2.maxDistance = 8f;
			obj2.selectionRequiresTargetLoS = false;
			obj2.selectionRequiresOnGround = false;
			obj2.selectionRequiresAimTarget = false;
			obj2.maxTimesSelected = -1;
			obj2.moveTargetType = (TargetType)0;
			obj2.activationRequiresTargetLoS = false;
			obj2.activationRequiresAimTargetLoS = false;
			obj2.activationRequiresAimConfirmation = false;
			obj2.movementType = (MovementType)1;
			obj2.moveInputScale = 1f;
			obj2.aimType = (AimType)1;
			obj2.ignoreNodeGraph = false;
			obj2.shouldSprint = false;
			obj2.shouldFireEquipment = false;
			obj2.buttonPressType = (ButtonPressType)0;
			obj2.driverUpdateTimerOverride = -1f;
			obj2.resetCurrentEnemyOnNextDriverSelection = false;
			obj2.noRepeat = false;
			obj2.nextHighPriorityOverride = null;
			AISkillDriver obj3 = obj.AddComponent<AISkillDriver>();
			obj3.customName = "Use Secondary First Bomb";
			obj3.skillSlot = (SkillSlot)1;
			obj3.requireSkillReady = true;
			obj3.minDistance = 0f;
			obj3.maxDistance = 8f;
			obj3.selectionRequiresTargetLoS = false;
			obj3.selectionRequiresOnGround = false;
			obj3.selectionRequiresAimTarget = false;
			obj3.maxTimesSelected = -1;
			obj3.moveTargetType = (TargetType)0;
			obj3.activationRequiresTargetLoS = false;
			obj3.activationRequiresAimTargetLoS = false;
			obj3.activationRequiresAimConfirmation = true;
			obj3.movementType = (MovementType)1;
			obj3.moveInputScale = 1f;
			obj3.aimType = (AimType)1;
			obj3.buttonPressType = (ButtonPressType)0;
			AISkillDriver obj4 = obj.AddComponent<AISkillDriver>();
			obj4.customName = "Use Utility Bomb Dash";
			obj4.skillSlot = (SkillSlot)2;
			obj4.requireSkillReady = true;
			obj4.minDistance = 8f;
			obj4.maxDistance = 20f;
			obj4.selectionRequiresTargetLoS = true;
			obj4.selectionRequiresOnGround = false;
			obj4.selectionRequiresAimTarget = false;
			obj4.maxTimesSelected = -1;
			obj4.moveTargetType = (TargetType)0;
			obj4.activationRequiresTargetLoS = false;
			obj4.activationRequiresAimTargetLoS = false;
			obj4.activationRequiresAimConfirmation = false;
			obj4.movementType = (MovementType)2;
			obj4.moveInputScale = 1f;
			obj4.aimType = (AimType)1;
			obj4.buttonPressType = (ButtonPressType)0;
			AISkillDriver obj5 = obj.AddComponent<AISkillDriver>();
			obj5.customName = "Use Special Sheer Heart Attack";
			obj5.skillSlot = (SkillSlot)3;
			obj5.requireSkillReady = true;
			obj5.minDistance = 0f;
			obj5.maxDistance = 20f;
			obj5.selectionRequiresTargetLoS = false;
			obj5.selectionRequiresOnGround = false;
			obj5.selectionRequiresAimTarget = false;
			obj5.maxTimesSelected = -1;
			obj5.moveTargetType = (TargetType)0;
			obj5.activationRequiresTargetLoS = false;
			obj5.activationRequiresAimTargetLoS = false;
			obj5.activationRequiresAimConfirmation = false;
			obj5.movementType = (MovementType)1;
			obj5.moveInputScale = 1f;
			obj5.aimType = (AimType)1;
			obj5.buttonPressType = (ButtonPressType)0;
			AISkillDriver obj6 = obj.AddComponent<AISkillDriver>();
			obj6.customName = "Chase";
			obj6.skillSlot = (SkillSlot)(-1);
			obj6.requireSkillReady = false;
			obj6.minDistance = 0f;
			obj6.maxDistance = float.PositiveInfinity;
			obj6.moveTargetType = (TargetType)0;
			obj6.activationRequiresTargetLoS = false;
			obj6.activationRequiresAimTargetLoS = false;
			obj6.activationRequiresAimConfirmation = false;
			obj6.movementType = (MovementType)1;
			obj6.moveInputScale = 1f;
			obj6.aimType = (AimType)1;
			obj6.buttonPressType = (ButtonPressType)0;
		}
	}
	public static class KiraAssets
	{
		public static GameObject punchSwingEffect;

		public static GameObject punchHitImpactEffect;

		public static GameObject bombExplosionEffect;

		public static GameObject bitesTheDustExplosionEffect;

		public static Texture2D bitesTheDustAuraTexture;

		public static Texture2D bitesTheDustSwirlTexture;

		public static NetworkSoundEventDef[] standPunchHitSoundEvents;

		public static NetworkSoundEventDef kiraPunchHitSoundEvent;

		public static NetworkSoundEventDef touchHitSoundEvent;

		public static GameObject killerQueenModel;

		public static GameObject sheerHeartAttackProjectilePrefab;

		public static ModdedDamageType bombMarkDamageType;

		public static ModdedDamageType bombDetonateDamageType;

		private static AssetBundle _assetBundle;

		public static void Init(AssetBundle assetBundle)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			_assetBundle = assetBundle;
			bombMarkDamageType = DamageAPI.ReserveDamageType();
			bombDetonateDamageType = DamageAPI.ReserveDamageType();
			standPunchHitSoundEvents = (NetworkSoundEventDef[])(object)new NetworkSoundEventDef[KiraSounds.standPunchHits.Length];
			for (int i = 0; i < standPunchHitSoundEvents.Length; i++)
			{
				standPunchHitSoundEvents[i] = Content.CreateAndAddNetworkSoundEventDef(KiraSounds.standPunchHits[i]);
			}
			kiraPunchHitSoundEvent = Content.CreateAndAddNetworkSoundEventDef("Play_bandit2_m2_impact");
			touchHitSoundEvent = Content.CreateAndAddNetworkSoundEventDef("Play_JJBA_TouchHit");
			BitesTheDustCinematic.LoadTrack(_assetBundle.LoadAsset<TextAsset>("KiraBitesTheDustCamera"));
			killerQueenModel = _assetBundle.LoadAsset<GameObject>("mdlKillerQueen");
			Asset.ConvertAllRenderersToHopooShader(killerQueenModel);
			CreateEffects();
			CreateProjectiles();
		}

		private static void CreateEffects()
		{
			CreateBombExplosionEffect();
			CreateBitesTheDustEffects();
			punchSwingEffect = SharedEffects.punchSwingEffect;
			punchHitImpactEffect = SharedEffects.punchHitImpactEffect;
		}

		private static void CreateBitesTheDustEffects()
		{
			bitesTheDustAuraTexture = _assetBundle.LoadAsset<Texture2D>("texBitesTheDustAura");
			bitesTheDustSwirlTexture = _assetBundle.LoadAsset<Texture2D>("texBitesTheDustSwirl");
			bitesTheDustExplosionEffect = SharedEffects.bitesTheDustExplosionEffect;
		}

		private static void CreateBombExplosionEffect()
		{
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			bombExplosionEffect = Asset.LoadEffect(_assetBundle, "BombExplosionEffect", "Play_engi_M2_explo", false);
			if (Object.op_Implicit((Object)(object)bombExplosionEffect))
			{
				ShakeEmitter obj = bombExplosionEffect.AddComponent<ShakeEmitter>();
				obj.amplitudeTimeDecay = true;
				obj.duration = 0.5f;
				obj.radius = 200f;
				obj.scaleShakeRadiusWithLocalScale = false;
				obj.wave = new Wave
				{
					amplitude = 1f,
					frequency = 40f,
					cycleOffset = 0f
				};
			}
		}

		private static void CreateProjectiles()
		{
			CreateSheerHeartAttackProjectile();
			Content.AddProjectilePrefab(sheerHeartAttackProjectilePrefab);
		}

		private static void CreateSheerHeartAttackProjectile()
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			sheerHeartAttackProjectilePrefab = Asset.CloneProjectilePrefab("CommandoGrenadeProjectile", "KiraSheerHeartAttackProjectile");
			Object.Destroy((Object)(object)sheerHeartAttackProjectilePrefab.GetComponent<ProjectileImpactExplosion>());
			ProjectileImpactExplosion obj = sheerHeartAttackProjectilePrefab.AddComponent<ProjectileImpactExplosion>();
			((ProjectileExplosion)obj).blastRadius = 12f;
			((ProjectileExplosion)obj).blastDamageCoefficient = 1f;
			((ProjectileExplosion)obj).falloffModel = (FalloffModel)0;
			obj.destroyOnEnemy = true;
			obj.destroyOnWorld = false;
			obj.timerAfterImpact = false;
			obj.lifetime = 10f;
			obj.impactEffect = bombExplosionEffect;
			obj.lifetimeExpiredSound = Content.CreateAndAddNetworkSoundEventDef("Play_engi_M2_explo");
			Rigidbody component = sheerHeartAttackProjectilePrefab.GetComponent<Rigidbody>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.useGravity = false;
			}
			ProjectileSimple val = sheerHeartAttackProjectilePrefab.GetComponent<ProjectileSimple>();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = sheerHeartAttackProjectilePrefab.AddComponent<ProjectileSimple>();
			}
			val.desiredForwardSpeed = 45f;
			val.updateAfterFiring = true;
			val.lifetime = 11f;
			if (!Object.op_Implicit((Object)(object)sheerHeartAttackProjectilePrefab.GetComponent<ProjectileTargetComponent>()))
			{
				sheerHeartAttackProjectilePrefab.AddComponent<ProjectileTargetComponent>();
			}
			ProjectileSphereTargetFinder obj2 = sheerHeartAttackProjectilePrefab.AddComponent<ProjectileSphereTargetFinder>();
			obj2.lookRange = 50f;
			obj2.targetSearchInterval = 0.25f;
			obj2.onlySearchIfNoTarget = true;
			obj2.allowTargetLoss = true;
			obj2.testLoS = false;
			ProjectileSteerTowardTarget obj3 = sheerHeartAttackProjectilePrefab.AddComponent<ProjectileSteerTowardTarget>();
			obj3.rotationSpeed = 480f;
			obj3.yAxisOnly = false;
			ProjectileController component2 = sheerHeartAttackProjectilePrefab.GetComponent<ProjectileController>();
			string text = (_assetBundle.Contains("KiraSheerHeartAttackGhost") ? "KiraSheerHeartAttackGhost" : "HenryBombGhost");
			if ((Object)(object)_assetBundle.LoadAsset<GameObject>(text) != (Object)null)
			{
				component2.ghostPrefab = Asset.CreateProjectileGhostPrefab(_assetBundle, text);
			}
			component2.startSound = "";
		}
	}
	public static class KiraBuffs
	{
		public static BuffDef armorBuff;

		public static BuffDef bombMarkDebuff;

		public static BuffDef bitesTheDustSaveBuff;

		public static BuffDef bitesTheDustMarkDebuff;

		public static void Init(AssetBundle assetBundle)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			armorBuff = Content.CreateAndAddBuff("KiraArmorBuff", LegacyResourcesAPI.Load<BuffDef>("BuffDefs/HiddenInvincibility").iconSprite, Color.white, false, false);
			BuffDef val = LegacyResourcesAPI.Load<BuffDef>("BuffDefs/DeathMark");
			bombMarkDebuff = Content.CreateAndAddBuff("KiraBombMarkDebuff", Object.op_Implicit((Object)(object)val) ? val.iconSprite : null, new Color(0.9f, 0.45f, 0.75f), false, true);
			Sprite val2 = assetBundle.LoadAsset<Sprite>("texKiraUltimate");
			bitesTheDustMarkDebuff = Content.CreateAndAddBuff("KiraBitesTheDustMarkDebuff", Object.op_Implicit((Object)(object)val2) ? val2 : (Object.op_Implicit((Object)(object)val) ? val.iconSprite : null), new Color(1f, 0.55f, 0.9f), false, true);
			BuffDef val3 = LegacyResourcesAPI.Load<BuffDef>("BuffDefs/Cloak");
			bitesTheDustSaveBuff = Content.CreateAndAddBuff("KiraBitesTheDustSaveBuff", Object.op_Implicit((Object)(object)val3) ? val3.iconSprite : null, new Color(0.95f, 0.55f, 0.85f), false, false);
		}
	}
	public static class KiraConfig
	{
		public static ConfigEntry<bool> someConfigBool;

		public static ConfigEntry<float> someConfigFloat;

		public static ConfigEntry<float> someConfigFloatWithCustomRange;

		public static void Init()
		{
			someConfigBool = Config.BindAndOptions<bool>("Kira", "someConfigBool", true, "this creates a bool config, and a checkbox option in risk of options", false);
			someConfigFloat = Config.BindAndOptions<float>("Kira", "someConfigfloat", 5f, "", false);
			someConfigFloatWithCustomRange = Config.BindAndOptions<float>("Kira", "someConfigfloat2", 5f, 0f, 50f, "if a custom range is not passed in, a float will default to a slider with range 0-20. risk of options only has sliders", false);
		}
	}
	public static class KiraSounds
	{
		public static readonly string[] soundbanks = new string[5] { "char_loader", "char_Commando", "char_Engi", "char_bandit2", "char_Merc" };

		public static readonly string[] standPunchSwings = new string[3] { "Play_JJBA_StandSwing1", "Play_JJBA_StandSwing2", "Play_JJBA_StandSwing3" };

		public static readonly string[] standPunchHits = new string[3] { "Play_JJBA_StandHit1", "Play_JJBA_StandHit2", "Play_JJBA_StandHit3" };

		public static readonly string[] kiraPunchSwings = new string[3] { "Play_Kira_Swing1", "Play_Kira_Swing2", "Play_Kira_Swing3" };

		public const string kiraPunchHit = "Play_bandit2_m2_impact";

		private static readonly string[][] punchShouts = new string[3][]
		{
			new string[2] { "Play_Kira_Shout1_1", "Play_Kira_Shout1_2" },
			new string[2] { "Play_Kira_Shout2_1", "Play_Kira_Shout2_2" },
			new string[2] { "Play_Kira_Shout3_1", "Play_Kira_Shout3_2" }
		};

		public const string touchSwing = "Play_JJBA_TouchSwing";

		public const string touchHit = "Play_JJBA_TouchHit";

		public const string detonateClick = "Play_JJBA_DetonateClick";

		private static readonly string[] detonateLines = new string[3] { "Play_Kira_Detonate1", "Play_Kira_Detonate2", "Play_Kira_Detonate3" };

		public const string explosion = "Play_engi_M2_explo";

		public const string bombDashLaunch = "Play_Kira_BombDash";

		public const string bombDashExplosion = "Play_commando_M2_grenade_explo";

		public const string sheerHeartAttackLaunch = "Play_JJBA_SheerHeartAttack";

		public const string sheerHeartAttackLine = "Play_Kira_SheerHeartAttack";

		public const string bitesTheDustSave = "Play_Kira_StandOff";

		public const string bitesTheDustCutIn = "Play_JJBA_BitesTheDustCutIn";

		public const string bitesTheDustPose = "Play_JJBA_BitesTheDustPose";

		public const string bitesTheDustRollBack = "Play_JJBA_BitesTheDustRollBack";

		public static string PunchShout(int step)
		{
			return Pick(punchShouts[step % punchShouts.Length]);
		}

		public static string DetonateLine()
		{
			return Pick(detonateLines);
		}

		private static string Pick(string[] options)
		{
			return options[Random.Range(0, options.Length)];
		}
	}
	public static class KiraStates
	{
		public static void Init()
		{
			Content.AddEntityState(typeof(KillerQueenPunch));
			Content.AddEntityState(typeof(StrayCat));
			Content.AddEntityState(typeof(FirstBomb));
			Content.AddEntityState(typeof(FirstBombTouch));
			Content.AddEntityState(typeof(FirstBombDetonate));
			Content.AddEntityState(typeof(BombDash));
			Content.AddEntityState(typeof(SheerHeartAttack));
			Content.AddEntityState(typeof(BitesTheDust));
			Content.AddEntityState(typeof(BitesTheDustSave));
			Content.AddEntityState(typeof(BitesTheDustCutscene));
		}
	}
	public static class KiraStaticValues
	{
		public const float punchDamageCoefficient = 2.4f;

		public const float punchLockOnRange = 14f;

		public const float kiraPunchDamageCoefficient = 1.2f;

		public const float touchDamageCoefficient = 1.5f;

		public const float detonateDamageCoefficient = 9f;

		public const float detonateRadius = 9f;

		public const float bombMarkDuration = 15f;

		public const float bombDashDamageCoefficient = 3f;

		public const float bombDashRadius = 7f;

		public const float sheerHeartAttackDamageCoefficient = 14f;

		public const float sheerHeartAttackRadius = 12f;

		public const float sheerHeartAttackSpeed = 45f;

		public const float bitesTheDustTimer = 10f;

		public const float bitesTheDustCooldown = 45f;

		public const float bitesTheDustDamageCoefficient = 25f;

		public const float bitesTheDustMinMeter = 0.4f;

		public const float bitesTheDustRadius = 35f;

		public const float bitesTheDustExplosionRadius = 7f;

		public const float bitesTheDustExplosionInterval = 0.06f;

		public const int bitesTheDustMaxTargets = 40;

		public const float punchStandCost = 4f;

		public const float touchStandCost = 15f;

		public const float bombDashStandCost = 20f;

		public const float sheerHeartAttackStandCost = 30f;
	}
	public static class KiraTokens
	{
		public static void Init()
		{
			AddKiraTokens();
		}

		public static void AddKiraTokens()
		{
			string text = "KAVAHN_KIRA_";
			string text2 = "Yoshikage Kira wants nothing more than a quiet life, and Killer Queen will turn anything that threatens it into a bomb.<color=#CCD3E0>" + Environment.NewLine + Environment.NewLine + "< ! > Killer Queen fights on the stand meter. Let it rest between fights: a broken stand leaves Kira slow, fragile and swinging his own fists." + Environment.NewLine + Environment.NewLine + "< ! > While Killer Queen is out it takes half the hits meant for Kira, so keep an eye on the meter when you're being swarmed." + Environment.NewLine + Environment.NewLine + "< ! > Plant First Bomb on the biggest threat, then detonate it when its friends gather around." + Environment.NewLine + Environment.NewLine + "< ! > Bomb Dash damages anything Kira leaves behind, so use it to escape and punish at once." + Environment.NewLine + Environment.NewLine + "< ! > Sheer Heart Attack chases enemies on its own. Send it out and keep fighting." + Environment.NewLine + Environment.NewLine;
			string text3 = "...and so he left, finally able to sleep soundly at night.";
			string text4 = "...and so he vanished, his quiet life lost forever.";
			Language.Add(text + "NAME", "Yoshikage Kira");
			Language.Add(text + "DESCRIPTION", text2);
			Language.Add(text + "SUBTITLE", "Killer Queen");
			Language.Add(text + "STAND_NAME", "KILLER QUEEN");
			Language.Add(text + "LORE", "My name is Yoshikage Kira. I'm 33 years old. All I want is to live a quiet life.");
			Language.Add(text + "OUTRO_FLAVOR", text3);
			Language.Add(text + "OUTRO_FAILURE", text4);
			Language.Add(text + "MASTERY_SKIN_NAME", "Kosaku Kawajiri");
			Language.Add(text + "PASSIVE_NAME", "Stand: Killer Queen");
			Language.Add(text + "PASSIVE_DESCRIPTION", "Killer Queen's attacks spend its <style=cIsUtility>stand meter</style>. While it's out, it takes <style=cIsHealing>half the damage</style> aimed at Kira. If the meter runs dry, the stand <style=cDeath>breaks</style>.");
			Language.Add(text + "PRIMARY_PUNCH_NAME", "Killer Queen");
			Language.Add(text + "PRIMARY_PUNCH_DESCRIPTION", "<style=cIsUtility>Agile.</style>" + $"<style=cIsUtility>Lock on</style> to an enemy within {14f}m. Killer Queen <style=cIsUtility>dashes</style> to it and punches for <style=cIsDamage>{240.00002f}% damage</style>. Without his stand, Kira punches for <style=cIsDamage>{120.00001f}% damage</style> instead.");
			Language.Add(text + "SECONDARY_FIRSTBOMB_NAME", "First Bomb");
			Language.Add(text + "SECONDARY_FIRSTBOMB_DESCRIPTION", $"Send Killer Queen flying. The first enemy he touches takes <style=cIsDamage>{150f}% damage</style> and becomes a bomb. " + $"Activate again to <style=cIsDamage>detonate</style> it for <style=cIsDamage>{900f}% damage</style> in a {9f}m radius. Only one bomb can be planted at a time.");
			Language.Add(text + "UTILITY_BOMBDASH_NAME", "Bomb Dash");
			Language.Add(text + "UTILITY_BOMBDASH_DESCRIPTION", $"Blow up the ground behind you for <style=cIsDamage>{300f}% damage</style> and <style=cIsUtility>dash</style> forward, gaining <style=cIsUtility>300 armor</style>.");
			Language.Add(text + "SPECIAL_SHEERHEARTATTACK_NAME", "Sheer Heart Attack");
			Language.Add(text + "SPECIAL_SHEERHEARTATTACK_DESCRIPTION", $"Send out a bomb that <style=cIsUtility>homes in</style> on enemies and explodes for <style=cIsDamage>{1400f}% damage</style>.");
			Language.Add(text + "STANDSPECIAL_NAME", "Stray Cat");
			Language.Add(text + "STANDSPECIAL_DESCRIPTION", $"<style=cIsUtility>Stand special.</style> Killer Queen launches <style=cIsDamage>{5}</style> drifting <style=cIsDamage>air bombs</style>, each exploding on contact for <style=cIsDamage>{400f}% damage</style>.");
			Language.Add(text + "SPECIAL_BITESTHEDUST_NAME", "Bites the Dust");
			Language.Add(text + "SPECIAL_BITESTHEDUST_DESCRIPTION", $"<style=cIsUtility>Ultimate.</style> <style=cIsUtility>Save</style> this moment and seal Killer Queen away: for {10f}s you can only fight on your own. " + "Then time is forced to roll back (or activate again to roll it back early): return to where you saved with at least the health you had, " + $"and everyone you hit since, and every enemy within {35f}m, <style=cIsDamage>explodes for up to {2500f}% damage</style>. " + $"Burns the whole stand meter and needs at least {40f}% of it to start; the fuller it is when time rolls back, the bigger the explosions.");
			Language.Add(text + "BITESTHEDUST_SEAL", "BITES THE DUST");
			Language.Add(text + "BITESTHEDUST_TITLE", "KILLER QUEEN · DAISAN NO BAKUDAN · BITES THE DUST");
			Language.Add(Tokens.GetAchievementNameToken("KAVAHN_KIRA_masteryAchievement"), "Yoshikage Kira: Mastery");
			Language.Add(Tokens.GetAchievementDescriptionToken("KAVAHN_KIRA_masteryAchievement"), "As Yoshikage Kira, beat the game or obliterate on Monsoon.");
		}
	}
	public static class KiraUnlockables
	{
		public static UnlockableDef characterUnlockableDef;

		public static UnlockableDef masterySkinUnlockableDef;

		public static void Init()
		{
			masterySkinUnlockableDef = Content.CreateAndAddUnlockbleDef("KAVAHN_KIRA_masteryUnlockable", Tokens.GetAchievementNameToken("KAVAHN_KIRA_masteryAchievement"), ((CharacterBase<KiraSurvivor>)(object)CharacterBase<KiraSurvivor>.instance).assetBundle.LoadAsset<Sprite>("texMasteryAchievement"));
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.kavahn.JJBAKira", "JJBAKira", "1.0.1")]
	public class KiraPlugin : BaseUnityPlugin
	{
		private void Awake()
		{
			string? directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
			Asset.AddBundleFolder(directoryName);
			SoundBanks.Add(directoryName, "JJBAKira.bnk");
			JJBAPlugin.Safely((Action)delegate
			{
				((CharacterBase<KiraSurvivor>)(object)new KiraSurvivor()).Initialize();
			});
		}
	}
	public class KiraSurvivor : SurvivorBase<KiraSurvivor>
	{
		public const string KIRA_PREFIX = "KAVAHN_KIRA_";

		public const float modelScale = 1.34f;

		private static readonly Dictionary<GameObject, CharacterBody> bombMarkedTargets = new Dictionary<GameObject, CharacterBody>();

		public override string assetBundleName => "jjbakira";

		public override string bodyName => "KavahnKiraBody";

		public override string masterName => "KavahnKiraMonsterMaster";

		public override string modelPrefabName
		{
			get
			{
				if (!HasKiraModel)
				{
					return "mdlHenry";
				}
				return "mdlKira";
			}
		}

		public override string displayPrefabName
		{
			get
			{
				if (!HasKiraModel)
				{
					return "HenryDisplay";
				}
				return "KiraDisplay";
			}
		}

		private bool HasKiraModel
		{
			get
			{
				if (Object.op_Implicit((Object)(object)((CharacterBase<KiraSurvivor>)(object)this).assetBundle))
				{
					return ((CharacterBase<KiraSurvivor>)(object)this).assetBundle.Contains("mdlKira");
				}
				return false;
			}
		}

		public override string survivorTokenPrefix => "KAVAHN_KIRA_";

		public override BodyInfo bodyInfo => new BodyInfo
		{
			bodyName = ((CharacterBase<KiraSurvivor>)(object)this).bodyName,
			bodyNameToken = "KAVAHN_KIRA_NAME",
			subtitleNameToken = "KAVAHN_KIRA_SUBTITLE",
			characterPortrait = Icon<Texture>("texKiraIcon", "texHenryIcon"),
			bodyColor = new Color(0.6f, 0.35f, 0.65f),
			sortPosition = 100f,
			crosshair = Asset.LoadCrosshair("Standard"),
			podPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/NetworkedObjects/SurvivorPod"),
			maxHealth = 110f,
			healthRegen = 1.5f,
			armor = 0f,
			jumpCount = 1,
			cameraParamsVerticalOffset = 1.75f,
			cameraParamsDepth = -12f
		};

		public override CustomRendererInfo[] customRendererInfos
		{
			get
			{
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				//IL_0037: Expected O, but got Unknown
				//IL_0039: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				//IL_004a: Expected O, but got Unknown
				//IL_004c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0051: Unknown result type (might be due to invalid IL or missing references)
				//IL_005d: Expected O, but got Unknown
				//IL_009c: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bc: 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_00ce: Expected O, but got Unknown
				if (!HasKiraModel)
				{
					return (CustomRendererInfo[])(object)new CustomRendererInfo[3]
					{
						new CustomRendererInfo
						{
							childName = "SwordModel",
							material = Materials.LoadMaterial(((CharacterBase<KiraSurvivor>)(object)this).assetBundle, "matHenry")
						},
						new CustomRendererInfo
						{
							childName = "GunModel"
						},
						new CustomRendererInfo
						{
							childName = "Model"
						}
					};
				}
				ChildLocator val = (Object.op_Implicit((Object)(object)((CharacterBase<KiraSurvivor>)(object)this).characterModelObject) ? ((CharacterBase<KiraSurvivor>)(object)this).characterModelObject.GetComponent<ChildLocator>() : null);
				if (!Object.op_Implicit((Object)(object)val))
				{
					return (CustomRendererInfo[])(object)new CustomRendererInfo[0];
				}
				List<CustomRendererInfo> list = new List<CustomRendererInfo>();
				NameTransformPair[] transformPairs = val.transformPairs;
				foreach (NameTransformPair val2 in transformPairs)
				{
					if (val2.name.StartsWith("Mesh"))
					{
						list.Add(new CustomRendererInfo
						{
							childName = val2.name
						});
					}
				}
				return list.ToArray();
			}
		}

		public override UnlockableDef characterUnlockableDef => KiraUnlockables.characterUnlockableDef;

		public override ItemDisplaysBase itemDisplays => null;

		public override AssetBundle assetBundle { get; protected set; }

		public override GameObject bodyPrefab { get; protected set; }

		public override CharacterBody prefabCharacterBody { get; protected set; }

		public override GameObject characterModelObject { get; protected set; }

		public override CharacterModel prefabCharacterModel { get; protected set; }

		public override GameObject displayPrefab { get; protected set; }

		private T Icon<T>(string name, string fallback) where T : Object
		{
			T val = ((CharacterBase<KiraSurvivor>)(object)this).assetBundle.LoadAsset<T>(name);
			if (!Object.op_Implicit((Object)(object)val))
			{
				return ((CharacterBase<KiraSurvivor>)(object)this).assetBundle.LoadAsset<T>(fallback);
			}
			return val;
		}

		public override void Initialize()
		{
			((CharacterBase<KiraSurvivor>)(object)this).Initialize();
		}

		public override void InitializeCharacter()
		{
			KiraUnlockables.Init();
			base.InitializeCharacter();
			KiraConfig.Init();
			KiraStates.Init();
			KiraTokens.Init();
			KiraAssets.Init(((CharacterBase<KiraSurvivor>)(object)this).assetBundle);
			StrayCat.CreateProjectile();
			KiraBuffs.Init(((CharacterBase<KiraSurvivor>)(object)this).assetBundle);
			((CharacterBase<KiraSurvivor>)(object)this).InitializeEntityStateMachines();
			((CharacterBase<KiraSurvivor>)(object)this).InitializeSkills();
			((CharacterBase<KiraSurvivor>)(object)this).InitializeSkins();
			((CharacterBase<KiraSurvivor>)(object)this).InitializeCharacterMaster();
			AdditionalBodySetup();
			AddHooks();
		}

		private void AdditionalBodySetup()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			Transform transform = ((CharacterBase<KiraSurvivor>)(object)this).characterModelObject.transform;
			transform.localScale *= 1.34f;
			if (Object.op_Implicit((Object)(object)((SurvivorBase<KiraSurvivor>)this).displayPrefab))
			{
				Transform transform2 = ((SurvivorBase<KiraSurvivor>)this).displayPrefab.transform;
				transform2.localScale *= 1.34f;
			}
			AddHitboxes();
			((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab.AddComponent<KiraBombTracker>();
			if (!Object.op_Implicit((Object)(object)((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab.GetComponent<AkGameObj>()))
			{
				((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab.AddComponent<AkGameObj>();
			}
			((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab.AddComponent<KiraBitesTheDust>().skill = ((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab.GetComponent<ExtraSkillSlot>().skill;
			AddStand();
			((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab.AddComponent<StandTracker>().maxTrackingDistance = 14f;
			GameObject[] array = (GameObject[])(object)new GameObject[2]
			{
				((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab,
				((SurvivorBase<KiraSurvivor>)this).displayPrefab
			};
			foreach (GameObject val in array)
			{
				if (Object.op_Implicit((Object)(object)val))
				{
					val.AddComponent<SoundbankLoader>().soundbankStrings = KiraSounds.soundbanks;
				}
			}
		}

		private void AddStand()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: 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_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)
			//IL_00c2: Expected O, but got Unknown
			GameObject killerQueenModel = KiraAssets.killerQueenModel;
			Stands.AddStandUser(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, ((CharacterBase<KiraSurvivor>)(object)this).bodyName, new StandDefinition
			{
				standNameToken = "KAVAHN_KIRA_STAND_NAME",
				color = new Color(0.86f, 0.45f, 0.72f),
				standModelPrefab = killerQueenModel,
				modelScale = 1.29f,
				actionModelScale = 1.5f,
				standOffset = new Vector3(0.7f, 0f, -1f),
				standoffFromTarget = 1.3f,
				hitboxCenter = new Vector3(0f, 0f, 1.2f),
				hitboxSize = new Vector3(3.3f, 3.3f, 3.5f),
				maxGauge = 130f
			});
		}

		public void AddHitboxes()
		{
			Prefabs.SetupHitBoxGroup(((CharacterBase<KiraSurvivor>)(object)this).characterModelObject, "SwordGroup", new string[1] { "SwordHitbox" });
		}

		public override void InitializeEntityStateMachines()
		{
			Prefabs.ClearEntityStateMachines(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab);
			Prefabs.AddMainEntityStateMachine(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, "Body", typeof(GenericCharacterMain), typeof(SpawnTeleporterState));
			Prefabs.AddEntityStateMachine(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, "Weapon", (Type)null, (Type)null, true, true);
			Prefabs.AddEntityStateMachine(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, "Weapon2", (Type)null, (Type)null, true, true);
		}

		public override void InitializeSkills()
		{
			Skills.ClearGenericSkills(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab);
			AddPassiveSkill();
			AddPrimarySkills();
			AddSecondarySkills();
			AddUtiitySkills();
			AddSpecialSkills();
		}

		private void AddPassiveSkill()
		{
			//IL_000d: 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_0057: Unknown result type (might be due to invalid IL or missing references)
			((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab.GetComponent<SkillLocator>().passiveSkill = new PassiveSkill
			{
				enabled = true,
				skillNameToken = "KAVAHN_KIRA_PASSIVE_NAME",
				skillDescriptionToken = "KAVAHN_KIRA_PASSIVE_DESCRIPTION",
				keywordToken = "KEYWORD_JJBA_STAND",
				icon = Icon<Sprite>("texKiraPassive", "texPassiveIcon")
			};
		}

		private void AddPrimarySkills()
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Expected O, but got Unknown
			Skills.CreateGenericSkillWithSkillFamily(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, (SkillSlot)0, false);
			SteppedSkillDef val = Skills.CreateSkillDef<SteppedSkillDef>(new SkillDefInfo("KiraKillerQueen", "KAVAHN_KIRA_PRIMARY_PUNCH_NAME", "KAVAHN_KIRA_PRIMARY_PUNCH_DESCRIPTION", Icon<Sprite>("texKiraPrimary", "texPrimaryIcon"), new SerializableEntityStateType(typeof(KillerQueenPunch)), "Weapon", true));
			val.stepCount = 3;
			val.stepGraceDuration = 0.5f;
			Skills.AddPrimarySkills(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, (SkillDef[])(object)new SkillDef[1] { (SkillDef)val });
		}

		private void AddSecondarySkills()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			Skills.CreateGenericSkillWithSkillFamily(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, (SkillSlot)1, false);
			SkillDefInfo val = new SkillDefInfo();
			val.skillName = "KiraFirstBomb";
			val.skillNameToken = "KAVAHN_KIRA_SECONDARY_FIRSTBOMB_NAME";
			val.skillDescriptionToken = "KAVAHN_KIRA_SECONDARY_FIRSTBOMB_DESCRIPTION";
			val.keywordTokens = new string[1] { "KEYWORD_JJBA_STAND" };
			val.skillIcon = Icon<Sprite>("texKiraSecondary", "texSecondaryIcon");
			val.activationState = new SerializableEntityStateType(typeof(FirstBomb));
			val.activationStateMachineName = "Weapon2";
			val.interruptPriority = (InterruptPriority)1;
			val.baseRechargeInterval = 6f;
			val.baseMaxStock = 1;
			val.rechargeStock = 1;
			val.requiredStock = 1;
			val.stockToConsume = 1;
			val.resetCooldownTimerOnUse = false;
			val.fullRestockOnAssign = true;
			val.dontAllowPastMaxStocks = false;
			val.mustKeyPress = true;
			val.beginSkillCooldownOnSkillEnd = false;
			val.isCombatSkill = true;
			val.canceledFromSprinting = false;
			val.cancelSprintingOnActivation = true;
			val.forceSprintDuringState = false;
			FirstBombSkillDef firstBombSkillDef = Skills.CreateSkillDef<FirstBombSkillDef>(val);
			((StandSkillDef)firstBombSkillDef).standCost = 15f;
			Skills.AddSecondarySkills(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, (SkillDef[])(object)new SkillDef[1] { (SkillDef)firstBombSkillDef });
		}

		private void AddUtiitySkills()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			Skills.CreateGenericSkillWithSkillFamily(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, (SkillSlot)2, false);
			SkillDefInfo val = new SkillDefInfo();
			val.skillName = "KiraBombDash";
			val.skillNameToken = "KAVAHN_KIRA_UTILITY_BOMBDASH_NAME";
			val.skillDescriptionToken = "KAVAHN_KIRA_UTILITY_BOMBDASH_DESCRIPTION";
			val.keywordTokens = new string[1] { "KEYWORD_JJBA_STAND" };
			val.skillIcon = Icon<Sprite>("texKiraUtility", "texUtilityIcon");
			val.activationState = new SerializableEntityStateType(typeof(BombDash));
			val.activationStateMachineName = "Body";
			val.interruptPriority = (InterruptPriority)2;
			val.baseRechargeInterval = 5f;
			val.baseMaxStock = 1;
			val.rechargeStock = 1;
			val.requiredStock = 1;
			val.stockToConsume = 1;
			val.resetCooldownTimerOnUse = false;
			val.fullRestockOnAssign = true;
			val.dontAllowPastMaxStocks = false;
			val.mustKeyPress = false;
			val.beginSkillCooldownOnSkillEnd = false;
			val.isCombatSkill = true;
			val.canceledFromSprinting = false;
			val.cancelSprintingOnActivation = false;
			val.forceSprintDuringState = true;
			StandSkillDef val2 = Skills.CreateSkillDef<StandSkillDef>(val);
			val2.standCost = 20f;
			Skills.AddUtilitySkills(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, (SkillDef[])(object)new SkillDef[1] { (SkillDef)val2 });
		}

		private void AddSpecialSkills()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			//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_008a: 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_00cd: Expected O, but got Unknown
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: 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: Expected O, but got Unknown
			//IL_021b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0220: Unknown result type (might be due to invalid IL or missing references)
			//IL_0234: Unknown result type (might be due to invalid IL or missing references)
			Skills.CreateGenericSkillWithSkillFamily(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, (SkillSlot)3, false);
			SkillDefInfo val = new SkillDefInfo();
			val.skillName = "KiraSheerHeartAttack";
			val.skillNameToken = "KAVAHN_KIRA_SPECIAL_SHEERHEARTATTACK_NAME";
			val.skillDescriptionToken = "KAVAHN_KIRA_SPECIAL_SHEERHEARTATTACK_DESCRIPTION";
			val.keywordTokens = new string[1] { "KEYWORD_JJBA_STAND" };
			val.skillIcon = Icon<Sprite>("texKiraSpecial", "texSpecialIcon");
			val.activationState = new SerializableEntityStateType(typeof(SheerHeartAttack));
			val.activationStateMachineName = "Weapon2";
			val.interruptPriority = (InterruptPriority)1;
			val.baseMaxStock = 1;
			val.baseRechargeInterval = 12f;
			val.isCombatSkill = true;
			val.mustKeyPress = false;
			StandSkillDef val2 = Skills.CreateSkillDef<StandSkillDef>(val);
			val2.standCost = 30f;
			val = new SkillDefInfo();
			val.skillName = "KiraBitesTheDust";
			val.skillNameToken = "KAVAHN_KIRA_SPECIAL_BITESTHEDUST_NAME";
			val.skillDescriptionToken = "KAVAHN_KIRA_SPECIAL_BITESTHEDUST_DESCRIPTION";
			val.keywordTokens = new string[1] { "KEYWORD_JJBA_STAND" };
			val.skillIcon = Icon<Sprite>("texKiraUltimate", "texSpecialIcon");
			val.activationState = new SerializableEntityStateType(typeof(BitesTheDust));
			val.activationStateMachineName = "Weapon2";
			val.interruptPriority = (InterruptPriority)1;
			val.baseRechargeInterval = 45f;
			val.baseMaxStock = 1;
			val.rechargeStock = 1;
			val.requiredStock = 1;
			val.stockToConsume = 1;
			val.fullRestockOnAssign = true;
			val.mustKeyPress = true;
			val.beginSkillCooldownOnSkillEnd = false;
			val.isCombatSkill = true;
			val.cancelSprintingOnActivation = false;
			BitesTheDustSkillDef bitesTheDustSkillDef = Skills.CreateSkillDef<BitesTheDustSkillDef>(val);
			Skills.AddSpecialSkills(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, (SkillDef[])(object)new SkillDef[1] { (SkillDef)val2 });
			val = new SkillDefInfo();
			val.skillName = "KiraStrayCat";
			val.skillNameToken = "KAVAHN_KIRA_STANDSPECIAL_NAME";
			val.skillDescriptionToken = "KAVAHN_KIRA_STANDSPECIAL_DESCRIPTION";
			val.keywordTokens = new string[1] { "KEYWORD_JJBA_STAND" };
			val.skillIcon = Icon<Sprite>("texKiraStandSpecial", "texKiraSpecial");
			val.activationState = new SerializableEntityStateType(typeof(StrayCat));
			val.activationStateMachineName = "Weapon2";
			val.interruptPriority = (InterruptPriority)1;
			val.baseRechargeInterval = 10f;
			val.baseMaxStock = 1;
			val.fullRestockOnAssign = true;
			val.mustKeyPress = true;
			val.isCombatSkill = true;
			val.cancelSprintingOnActivation = true;
			StandSkillDef val3 = Skills.CreateSkillDef<StandSkillDef>(val);
			val3.standCost = 25f;
			ExtraSkills.AddStandSpecial(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, (SkillDef)(object)val3);
			GenericSkill val4 = Skills.CreateGenericSkillWithSkillFamily(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, "BitesTheDust", "Ultimate", false);
			Skills.AddSkillToFamily(val4.skillFamily, (SkillDef)(object)bitesTheDustSkillDef, (UnlockableDef)null);
			ExtraSkills.Slots(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab).skill = val4;
		}

		public override void InitializeSkins()
		{
			ModelSkinController obj = ((Component)((CharacterBase<KiraSurvivor>)(object)this).prefabCharacterModel).gameObject.AddComponent<ModelSkinController>();
			((Component)((CharacterBase<KiraSurvivor>)(object)this).prefabCharacterModel).GetComponent<ChildLocator>();
			RendererInfo[] baseRendererInfos = ((CharacterBase<KiraSurvivor>)(object)this).prefabCharacterModel.baseRendererInfos;
			List<SkinDef> list = new List<SkinDef>();
			SkinDef item = Skins.CreateSkinDef("DEFAULT_SKIN", Icon<Sprite>("texKiraSkin", "texMainSkin"), baseRendererInfos, ((Component)((CharacterBase<KiraSurvivor>)(object)this).prefabCharacterModel).gameObject, (UnlockableDef)null);
			list.Add(item);
			obj.skins = list.ToArray();
		}

		public override void InitializeCharacterMaster()
		{
			KiraAI.Init(((CharacterBase<KiraSurvivor>)(object)this).bodyPrefab, ((SurvivorBase<KiraSurvivor>)this).masterName);
		}

		private void AddHooks()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
			GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
		}

		private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
		{
			if (sender.HasBuff(KiraBuffs.armorBuff))
			{
				args.armorAdd += 300f;
			}
		}

		private void GlobalEventManager_onServerDamageDealt(DamageReport report)
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody victimBody = report.victimBody;
			GameObject attacker = report.attacker;
			if (!Object.op_Implicit((Object)(object)victimBody) || !Object.op_Implicit((Object)(object)attacker))
			{
				return;
			}
			KiraBitesTheDust component = attacker.GetComponent<KiraBitesTheDust>();
			if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)report.victim))
			{
				component.ServerRecordHit(report.victim);
			}
			if (DamageAPI.HasModdedDamageType(report.damageInfo, KiraAssets.bombMarkDamageType) && report.victim.alive)
			{
				if (bombMarkedTargets.TryGetValue(attacker, out var value) && Object.op_Implicit((Object)(object)value) && (Object)(object)value != (Object)(object)victimBody)
				{
					value.ClearTimedBuffs(KiraBuffs.bombMarkDebuff);
				}
				victimBody.ClearTimedBuffs(KiraBuffs.bombMarkDebuff);
				victimBody.AddTimedBuff(KiraBuffs.bombMarkDebuff, 15f);
				bombMarkedTargets[attacker] = victimBody;
				KiraBombTracker component2 = attacker.GetComponent<KiraBombTracker>();
				if (Object.op_Implicit((Object)(object)component2))
				{
					component2.ServerSetTarget(report.victim);
				}
			}
			if (DamageAPI.HasModdedDamageType(report.damageInfo, KiraAssets.bombDetonateDamageType))
			{
				if (bombMarkedTargets.TryGetValue(attacker, out var value2) && Object.op_Implicit((Object)(object)value2))
				{
					value2.ClearTimedBuffs(KiraBuffs.bombMarkDebuff);
				}
				bombMarkedTargets.Remove(attacker);
				KiraBombTracker component3 = attacker.GetComponent<KiraBombTracker>();
				if (Object.op_Implicit((Object)(object)component3))
				{
					component3.ServerClearTarget();
				}
			}
		}
	}
}
namespace JJBAMod.Survivors.Kira.SkillStates
{
	public class BitesTheDust : BaseSkillState
	{
		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			if (!((EntityState)this).isAuthority)
			{
				return;
			}
			KiraBitesTheDust component = ((EntityState)this).GetComponent<KiraBitesTheDust>();
			if (Object.op_Implicit((Object)(object)component) && component.HasSave)
			{
				component.AuthorityRollBack(fromSkill: true);
				((EntityState)this).outer.SetNextStateToMain();
				return;
			}
			if (Object.op_Implicit((Object)(object)((BaseSkillState)this).activatorSkillSlot))
			{
				((BaseSkillState)this).activatorSkillSlot.AddOneStock();
			}
			((EntityState)this).outer.SetNextState((EntityState)(object)new BitesTheDustSave());
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)1;
		}
	}
	public class BitesTheDustCutscene : BaseState
	{
		private const float clipFps = 30f;

		public static float cutSpeed = 1f;

		public static float poseSpeed = 1f;

		private const float cutFrames = 161f;

		private const float poseClipFrames = 411f;

		private const float poseFirstFrame = 291f;

		private const float poseLastFrame = 375f;

		private const float poseCameraFirstFrame = 195f;

		public static float endDuration = 0.7f;

		private float cutDuration;

		private float poseDuration;

		private float rollBackTime;

		private bool posing;

		private bool rolledBack;

		private float meterFraction;

		private StandUser standUser;

		private KiraBitesTheDust bitesTheDust;

		private BitesTheDustCinematic cinematic;

		private CharacterModel characterModel;

		private static readonly FieldInfo disableFadeField = typeof(CharacterModel).GetField("disableFade", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

		private bool modelFadeWasDisabled;

		private float TotalDuration => rollBackTime + endDuration;

		public override void OnEnter()
		{
			//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_00d9: 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_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: 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_0125: 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_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: 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_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_026f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0267: Unknown result type (might be due to invalid IL or missing references)
			//IL_0274: Unknown result type (might be due to invalid IL or missing references)
			//IL_0275: Unknown result type (might be due to invalid IL or missing references)
			//IL_028a: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			cutDuration = 5.366667f / cutSpeed;
			poseDuration = 2.8f / poseSpeed;
			rollBackTime = cutDuration + poseDuration;
			standUser = ((EntityState)this).GetComponent<StandUser>();
			bitesTheDust = ((EntityState)this).GetComponent<KiraBitesTheDust>();
			if (Object.op_Implicit((Object)(object)bitesTheDust))
			{
				bitesTheDust.OnRollBackStarted();
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
			{
				((EntityState)this).characterMotor.velocity = Vector3.zero;
			}
			((EntityState)this).PlayAnimation("FullBody, Override", "BitesTheDustCut", "ShootGun.playbackRate", cutDuration, 0f);
			Util.PlaySound("Play_JJBA_BitesTheDustCutIn", ((EntityState)this).gameObject);
			Vector3 val = (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection) ? ((EntityState)this).characterDirection.forward : ((EntityState)this).transform.forward);
			val.y = 0f;
			val = ((((Vector3)(ref val)).sqrMagnitude > 0.0001f) ? ((Vector3)(ref val)).normalized : Vector3.forward);
			if (Object.op_Implicit((Object)(object)standUser))
			{
				standUser.UseStand(0f);
				Vector3 val2 = -val + Vector3.Cross(Vector3.up, val) * 0.7f;
				standUser.BeginAction(val2, 1.2f, TotalDuration);
				standUser.PlayStandAnimation("BitesTheDustStart", 0.05f);
			}
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddTimedBuff(Buffs.HiddenInvincibility, TotalDuration + 0.5f);
				meterFraction = (Object.op_Implicit((Object)(object)standUser) ? standUser.DrainAll() : 1f);
				if (Object.op_Implicit((Object)(object)bitesTheDust))
				{
					bitesTheDust.ServerFreeze(((EntityState)this).characterBody.footPosition, TotalDuration + 0.3f);
				}
			}
			Transform modelTransform = ((EntityState)this).GetModelTransform();
			characterModel = (Object.op_Implicit((Object)(object)modelTransform) ? ((Component)modelTransform).GetComponent<CharacterModel>() : null);
			if (Object.op_Implicit((Object)(object)characterModel) && disableFadeField != null)
			{
				modelFadeWasDisabled = (bool)disableFadeField.GetValue(characterModel);
				disableFadeField.SetValue(characterModel, true);
			}
			cinematic = BitesTheDustCinematic.Begin(((EntityState)this).characterBody, Object.op_Implicit((Object)(object)modelTransform) ? modelTransform.position : ((EntityState)this).characterBody.footPosition, Quaternion.LookRotation(val), Object.op_Implicit((Object)(object)modelTransform) ? modelTransform.lossyScale.y : 1f, new BitesTheDustCinematic.Shot[2]
			{
				new BitesTheDustCinematic.Shot
				{
					segment = "cut",
					duration = cutDuration,
					firstFrame = 0f,
					frameCount = 161f
				},
				new BitesTheDustCinematic.Shot
				{
					segment = "pose",
					duration = poseDuration,
					firstFrame = 96f,
					frameCount = 84f
				}
			});
		}

		public override void FixedUpdate()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).FixedUpdate();
			if (((EntityState)this).isAuthority && Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && !rolledBack)
			{
				((EntityState)this).characterMotor.velocity = Vector3.zero;
			}
			if (!posing && ((EntityState)this).fixedAge >= cutDuration)
			{
				posing = true;
				Animator modelAnimator = ((EntityState)this).GetModelAnimator();
				if (Object.op_Implicit((Object)(object)modelAnimator))
				{
					modelAnimator.SetFloat("ShootGun.playbackRate", poseSpeed);
					modelAnimator.Play("BitesTheDustPose", modelAnimator.GetLayerIndex("FullBody, Override"), 0.7080292f);
				}
				Util.PlaySound("Play_JJBA_BitesTheDustPose", ((EntityState)this).gameObject);
			}
			if (!rolledBack && ((EntityState)this).fixedAge >= rollBackTime)
			{
				RollBack();
			}
			if (((EntityState)this).isAuthority && ((EntityState)this).fixedAge >= TotalDuration)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		private void RollBack()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			rolledBack = true;
			Vector3 footPosition = ((EntityState)this).characterBody.footPosition;
			if (((EntityState)this).isAuthority && Object.op_Implicit((Object)(object)bitesTheDust))
			{
				TeleportHelper.TeleportBody(((EntityState)this).characterBody, bitesTheDust.savedFootPosition);
			}
			if (NetworkServer.active && Object.op_Implicit((Object)(object)bitesTheDust))
			{
				bitesTheDust.ServerRollBack();
				float damageCoefficient = 25f * Mathf.Max(meterFraction, 0.4f);
				bitesTheDust.ServerDetonate(footPosition, damageCoefficient, ((BaseState)this).RollCrit());
			}
			((EntityState)this).PlayAnimation("FullBody, Override", "BitesTheDustEnd", "ShootGun.playbackRate", endDuration, 0f);
			Util.PlaySound("Play_JJBA_BitesTheDustRollBack", ((EntityState)this).gameObject);
			if (Object.op_Implicit((Object)(object)standUser))
			{
				standUser.PlayStandAnimation("BitesTheDustEnd", 0.05f);
			}
			if (Object.op_Implicit((Object)(object)cinematic))
			{
				cinematic.RollBack();
			}
		}

		public override void OnExit()
		{
			if (Object.op_Implicit((Object)(object)cinematic))
			{
				cinematic.End();
			}
			if (Object.op_Implicit((Object)(object)characterModel) && disableFadeField != null)
			{
				disableFadeField.SetValue(characterModel, modelFadeWasDisabled);
			}
			if (!rolledBack)
			{
				((EntityState)this).PlayAnimation("FullBody, Override", "BufferEmpty");
			}
			((EntityState)this).OnExit();
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)9;
		}
	}
	public class BitesTheDustSave : BaseSkillState
	{
		public static float baseDuration = 0.6f;

		private float duration;

		public override void OnEnter()
		{
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			duration = baseDuration;
			KiraBitesTheDust component = ((EntityState)this).GetComponent<KiraBitesTheDust>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.Save();
			}
			((EntityState)this).PlayAnimation("Gesture, Override", "BitesTheDustSave", "ShootGun.playbackRate", duration, 0f);
			Util.PlaySound("Play_Kira_StandOff", ((EntityState)this).gameObject);
			StandUser component2 = ((EntityState)this).GetComponent<StandUser>();
			if (Object.op_Implicit((Object)(object)component2))
			{
				component2.UseStand(0f);
				Ray aimRay = ((BaseState)this).GetAimRay();
				component2.BeginAction(((Ray)(ref aimRay)).direction, 1f, duration);
				component2.PlayStandAnimation("BitesTheDustStart", 0.05f);
			}
		}

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)1;
		}
	}
	public class BombDash : BaseSkillState
	{
		public static float duration = 0.5f;

		public static float initialSpeedCoefficient = 6f;

		public static float finalSpeedCoefficient = 2.5f;

		public static string dodgeSoundString = "Play_Kira_BombDash";

		public static float dodgeFOV = DodgeState.dodgeFOV;

		private float dashSpeed;

		private Vector3 forwardDirection;

		private Vector3 previousPosition;

		public override void OnEnter()
		{
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			((BaseState)this).OnEnter();
			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;
			}
			RecalculateDashSpeed();
			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 * dashSpeed;
			}
			Vector3 val2 = (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) ? ((EntityState)this).characterMotor.velocity : Vector3.zero);
			previousPosition = ((EntityState)this).transform.position - val2;
			((EntityState)this).PlayAnimation("FullBody, Override", "Roll", "Roll.playbackRate", duration, 0f);
			Util.PlaySound(dodgeSoundString, ((EntityState)this).gameObject);
			Util.PlaySound("Play_commando_M2_grenade_explo", ((EntityState)this).gameObject);
			StandUser component = ((EntityState)this).GetComponent<StandUser>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.EndAction();
				component.UseStand(20f);
				component.PlayStandAnimation("Detonate", 0.05f);
			}
			if (((EntityState)this).isAuthority)
			{
				Explode();
			}
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddTimedBuff(KiraBuffs.armorBuff, 3f * duration);
				((EntityState)this).characterBody.AddTimedBuff(Buffs.HiddenInvincibility, 0.5f * duration);
			}
		}

		private void Explode()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: 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_006e: 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_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			//IL_0098: 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_00a2: 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_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: 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_00dd: Expected O, but got Unknown
			Vector3 val = ((EntityState)this).characterBody.footPosition - forwardDirection * 1.5f;
			new BlastAttack
			{
				attacker = ((EntityState)this).gameObject,
				inflictor = ((EntityState)this).gameObject,
				teamIndex = ((BaseState)this).GetTeam(),
				position = val,
				radius = 7f,
				baseDamage = 3f * ((BaseState)this).damageStat,
				baseForce = 800f,
				crit = ((BaseState)this).RollCrit(),
				procCoefficient = 1f,
				falloffModel = (FalloffModel)0,
				damageType = DamageTypeCombo.GenericUtility,
				attackerFiltering = (AttackerFiltering)2
			}.Fire();
			if (Object.op_Implicit((Object)(object)KiraAssets.bombExplosionEffect))
			{
				EffectManager.SpawnEffect(KiraAssets.bombExplosionEffect, new EffectData
				{
					origin = val,
					scale = 7f
				}, true);
			}
		}

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

		public override void FixedUpdate()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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_0073: 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_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: 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_0097: 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_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: 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)
			((EntityState)this).FixedUpdate();
			RecalculateDashSpeed();
			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 * dashSpeed;
				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_0009: 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_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			((BaseSkillState)this).OnDeserialize(reader);
			forwardDirection = reader.ReadVector3();
		}
	}
	public class FirstBomb : BaseSkillState
	{
		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			if (!((EntityState)this).isAuthority)
			{
				return;
			}
			KiraBombTracker component = ((EntityState)this).GetComponent<KiraBombTracker>();
			if (Object.op_Implicit((Object)(object)component) && component.HasTarget)
			{
				((EntityState)this).outer.SetNextState((EntityState)(object)new FirstBombDetonate());
				return;
			}
			if (Object.op_Implicit((Object)(object)((BaseSkillState)this).activatorSkillSlot))
			{
				((BaseSkillState)this).activatorSkillSlot.AddOneStock();
			}
			((EntityState)this).outer.SetNextState((EntityState)(object)new FirstBombTouch());
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)1;
		}
	}
	public class FirstBombDetonate : BaseSkillState
	{
		public static float baseDuration = 0.35f;

		private float duration;

		public override void OnEnter()
		{
			//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)
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			((EntityState)this).PlayAnimation("Gesture, Override", "Detonate", "ShootGun.playbackRate", duration, 0f);
			Util.PlaySound("Play_JJBA_DetonateClick", ((EntityState)this).gameObject);
			Util.PlaySound(KiraSounds.DetonateLine(), ((EntityState)this).gameObject);
			StandUser component = ((EntityState)this).GetComponent<StandUser>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.UseStand(0f);
				Ray aimRay = ((BaseState)this).GetAimRay();
				component.BeginAction(((Ray)(ref aimRay)).direction, 0.8f, duration);
				component.PlayStandAnimation("Detonate", 0.05f);
			}
			if (((EntityState)this).isAuthority)
			{
				KiraBombTracker component2 = ((EntityState)this).GetComponent<KiraBombTracker>();
				HealthComponent val = (Object.op_Implicit((Object)(object)component2) ? component2.Target : null);
				if (Object.op_Implicit((Object)(object)component2))
				{
					component2.ClearTarget();
				}
				if (Object.op_Implicit((Object)(object)val))
				{
					Detonate(val);
				}
			}
		}

		private void Detonate(HealthComponent target)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: 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_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Expected O, but got Unknown
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Expected O, but got Unknown
			Vector3 val = (Object.op_Implicit((Object)(object)target.body) ? target.body.corePosition : ((Component)target).transform.position);
			BlastAttack val2 = new BlastAttack
			{
				attacker = ((EntityState)this).gameObject,
				inflictor = ((EntityState)this).gameObject,
				teamIndex = ((BaseState)this).GetTeam(),
				position = val,
				radius = 9f,
				baseDamage = 9f * ((BaseState)this).damageStat,
				baseForce = 1000f,
				bonusForce = Vector3.up * 600f,
				crit = ((BaseState)this).RollCrit(),
				procCoefficient = 1f,
				falloffModel = (FalloffModel)0,
				damageType = DamageTypeCombo.GenericSecondary,
				damageColorIndex = (DamageColorIndex)0,
				attackerFiltering = (AttackerFiltering)2
			};
			DamageAPI.AddModdedDamageType(val2, KiraAssets.bombDetonateDamageType);
			val2.Fire();
			if (Object.op_Implicit((Object)(object)KiraAssets.bombExplosionEffect))
			{
				EffectManager.SpawnEffect(KiraAssets.bombExplosionEffect, new EffectData
				{
					origin = val,
					scale = 9f
				}, true);
			}
		}

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			return (InterruptPriority)2;
		}
	}
	public class FirstBombTouch : BaseMeleeAttack
	{
		public static float standReach = 4f;

		private Vector3 touchDirection;

		private HurtBoxReference lockedTarget;

		private StandUser standUser;

		public override void OnEnter()
		{
			//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_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: 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)
			//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
			standUser = ((EntityState)this).GetComponent<StandUser>();
			if (((EntityState)this).isAuthority)
			{
				Ray aimRay = ((BaseState)this).GetAimRay();
				touchDirection = ((Ray)(ref aimRay)).direction;
				StandTracker val = StandTracker.Of(((EntityState)this).gameObject);
				lockedTarget = HurtBoxReference.FromHurtBox(Object.op_Implicit((Object)(object)val) ? val.GetTrackingTarget() : null);
			}
			base.hitboxGroupName = "SwordGroup";
			base.damageType = DamageTypeCombo.GenericSecondary;
			base.damageCoefficient = 1.5f;
			base.procCoefficient = 1f;
			base.pushForce = 0f;
			base.bonusForce = Vector3.zero;
			base.baseDuration = 0.5f;
			base.attackStartPercentTime = 0.3f;
			base.attackEndPercentTime = 0.55f;
			base.earlyExitPercentTime = 0.6f;
			base.hitStopDuration = 0f;
			base.aimUser = false;
			base.attackRecoil = 0.3f;
			base.hitHopVelocity = 0f;
			base.swingSoundString = "Play_JJBA_TouchSwing";
			base.muzzleString = "SwingRight";
			base.playbackRateParam = "Slash.playbackRate";
			base.swingEffectPrefab = KiraAssets.punchSwingEffect;
			base.hitEffectPrefab = KiraAssets.punchHitImpactEffect;
			base.impactSound = KiraAssets.touchHitSoundEvent.index;
			if (Object.op_Implicit((Object)(object)standUser))
			{
				standUser.UseStand(15f);
			}
			if (Object.op_Implicit((Object)(object)standUser))
			{
				base.swingSoundSource = standUser.StandObject;
			}
			((BaseMeleeAttack)this).OnEnter();
			if (Object.op_Implicit((Object)(object)standUser))
			{
				HurtBox val2 = ((HurtBoxReference)(ref lockedTarget)).ResolveHurtBox();
				if (Object.op_Implicit((Object)(object)val2))
				{
					standUser.BeginTargetedAction(val2, base.duration, base.attackStartPercentTime * base.duration);
				}
				else
				{
					standUser.BeginAction(touchDirection, standReach, base.duration);
				}
				standUser.PlayStandAnimation("Touch", 0.05f);
			}
		}

		protected override void ModifyOverlapAttack(OverlapAttack attack)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			((BaseMeleeAttack)this).ModifyOverlapAttack(attack);
			DamageAPI.AddModdedDamageType(attack, KiraAssets.bombMarkDamageType);
			if (Object.op_Implicit((Object)(object)standUser) && Object.op_Implicit((Object)(object)standUser.hitBoxGroup))
			{
				attack.hitBoxGroup = standUser.hitBoxGroup;
			}
		}

		protected override void PlaySwingEffect()
		{
		}

		protected override void PlayAttackAnimation()
		{
			((EntityState)this).PlayCrossfade("Gesture, Override", "StandTouch", base.playbackRateParam, base.duration, 0.1f * base.duration);
		}

		public override void OnSerialize(NetworkWriter writer)
		{
			//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)
			((BaseMeleeAttack)this).OnSerialize(writer);
			writer.Write(touchDirection);
			NetworkExtensions.Write(writer, lockedTarget);
		}

		public override void OnDeserialize(NetworkReader reader)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			((BaseMeleeAttack)this).OnDeserialize(reader);
			touchDirection = reader.ReadVector3();
			lockedTarget = NetworkExtensions.ReadHurtBoxReference(reader);
		}
	}
	public class KillerQueenPunch : BaseMeleeAttack
	{
		private bool useStand;

		private Vector3 punchDirection;

		private HurtBoxReference lockedTarget;

		private StandUser standUser;

		public override void OnEnter()
		{
			//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_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_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0230: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_029e: Unknown result type (might be due to invalid IL or missing references)
			standUser = ((EntityState)this).GetComponent<StandUser>();
			float num = 4f / Mathf.Max(((EntityState)this).characterBody.attackSpeed, 0.1f);
			if (((EntityState)this).isAuthority)
			{
				Ray aimRay = ((BaseState)this).GetAimRay();
				punchDirection = ((Ray)(ref aimRay)).direction;
				StandTracker val = ((Object.op_Implicit((Object)(object)standUser) && standUser.CanUseStand(num)) ? StandTracker.Of(((EntityState)this).gameObject) : null);
				HurtBox val2 = (Object.op_Implicit((Object)(object)val) ? val.GetTrackingTarget() : null);
				useStand = Object.op_Implicit((Object)(object)val2);
				lockedTarget = HurtBoxReference.FromHurtBox(val2);
			}
			base.hitboxGroupName = "SwordGroup";
			base.damageType = DamageTypeCombo.GenericPrimary;
			base.procCoefficient = 1f;
			base.bonusForce = Vector3.zero;
			base.attackStartPercentTime = 0.2f;
			base.attackEndPercentTime = 0.4f;
			base.earlyExitPercentTime = 0.55f;
			base.attackRecoil = 0.5f;
			base.hitSoundString = "";
			base.muzzleString = ((base.swingIndex % 2 == 0) ? "SwingLeft" : "SwingRight");
			base.playbackRateParam = "Slash.playbackRate";
			base.swingEffectPrefab = KiraAssets.punchSwingEffect;
			base.hitEffectPrefab = KiraAssets.punchHitImpactEffect;
			if (useStand)
			{
				base.damageCoefficient = 2.4f;
				base.hitStopDuration = 0f;
				base.aimUser = false;
				base.pushForce = 300f;
				base.baseDuration = 0.75f;
				base.hitHopVelocity = 0f;
				base.swingSoundString = KiraSounds.standPunchSwings[base.swingIndex % KiraSounds.standPunchSwings.Length];
				base.swingSoundSource = standUser.StandObject;
				base.impactSound = KiraAssets.standPunchHitSoundEvents[base.swingIndex % KiraAssets.standPunchHitSoundEvents.Length].index;
				standUser.UseStand(num);
			}
			else
			{
				base.damageCoefficient = 1.2f;
				base.hitStopDuration = 0.012f;
				base.pushForce = 150f;
				base.baseDuration = 0.9f;
				base.hitHopVelocity = 4f;
				base.swingSoundString = KiraSounds.kiraPunchSwings[base.swingIndex % KiraSounds.kiraPunchSwings.Length];
				base.impactSound = KiraAssets.kiraPunchHitSoundEvent.index;
			}
			((BaseMeleeAttack)this).OnEnter();
			Util.PlaySound(KiraSounds.PunchShout(base.swingIndex), ((EntityState)this).gameObject);
			if (useStand)
			{
				HurtBox val3 = ((HurtBoxReference)(ref lockedTarget)).ResolveHurtBox();
				if (Object.op_Implicit((Object)(object)val3))
				{
					standUser.BeginTargetedAction(val3, base.duration, base.attackStartPercentTime * base.duration);
				}
				else
				{
					standUser.BeginAction(punchDirection, 1.6f, base.duration);
				}
				standUser.PlayStandAnimation("Punch" + (1 + base.swingIndex), 0.05f);
			}
		}

		protected override void ModifyOverlapAttack(OverlapAttack attack)
		{
			((BaseMeleeAttack)this).ModifyOverlapAttack(attack);
			if (useStand && Object.op_Implicit((Object)(object)standUser) && Object.op_Implicit((Object)(object)standUser.hitBoxGroup))
			{
				attack.hitBoxGroup = standUser.hitBoxGroup;
			}
		}

		protected override void PlaySwingEffect()
		{
			if (!useStand)
			{
				((BaseMeleeAttack)this).PlaySwingEffect();
			}
		}

		protected override void PlayAttackAnimation()
		{
			if (useStand)
			{
				((EntityState)this).PlayCrossfade("Gesture, Override", "StandPunch" + (1 + base.swingIndex), base.playbackRateParam, base.duration, 0.1f * base.duration);
			}
			else
			{
				((EntityState)this).PlayCrossfade("Gesture, Override", "Slash" + (1 + base.swingIndex), base.playbackRateParam, base.duration, 0.1f * base.duration);
			}
		}

		public override void OnSerialize(NetworkWriter writer)
		{
			//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)
			((BaseMeleeAttack)this).OnSerialize(writer);
			writer.Write(useStand);
			writer.Write(punchDirection);
			NetworkExtensions.Write(writer, lockedTarget);
		}

		public override void OnDeserialize(NetworkReader reader)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			((BaseMeleeAttack)this).OnDeserialize(reader);
			useStand = reader.ReadBoolean();
			punchDirection = reader.ReadVector3();
			lockedTarget = NetworkExtensions.ReadHurtBoxReference(reader);
		}
	}
	public class SheerHeartAttack : GenericProjectileBaseState
	{
		public static float standReach = 1.2f;

		private Vector3 launchDirection;

		private StandUser standUser;

		public static float BaseDuration = 0.65f;

		public static float BaseDelayDuration = 0f;

		public override void OnEnter()
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00c8: Unknown result type (might be due to invalid IL or missing references)
			base.projectilePrefab = KiraAssets.sheerHeartAttackProjectilePrefab;
			base.attackSoundString = "Play_JJBA_SheerHeartAttack";
			Util.PlaySound("Play_Kira_SheerHeartAttack", ((EntityState)this).gameObject);
			standUser = ((EntityState)this).GetComponent<StandUser>();
			if (((EntityState)this).isAuthority)
			{
				Ray aimRay = ((BaseState)this).GetAimRay();
				launchDirection = ((Ray)(ref aimRay)).direction;
			}
			if (Object.op_Implicit((Object)(object)standUser))
			{
				standUser.UseStand(30f);
			}
			base.baseDuration = BaseDuration;
			base.baseDelayBeforeFiringProjectile = BaseDelayDuration;
			base.damageCoefficient = 14f;
			base.force = 80f;
			base.recoilAmplitude = 0.1f;
			base.bloom = 10f;
			((GenericProjectileBaseState)this).OnEnter();
			if (Object.op_Implicit((Object)(object)standUser))
			{
				standUser.BeginAction(launchDirection, standReach, base.duration);
				standUser.PlayStandAnimation("SheerHeartAttack", 0.05f);
			}
		}

		public override void ModifyProjectileInfo(ref FireProjectileInfo fireProjectileInfo)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			((GenericProjectileBaseState)this).ModifyProjectileInfo(ref fireProjectileInfo);
			fireProjectileInfo.damageTypeOverride = DamageTypeCombo.GenericSpecial;
			if (Object.op_Implicit((Object)(object)standUser))
			{
				fireProjectileInfo.position = standUser.ActionPoint;
			}
		}

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

		public override void OnDeserialize(NetworkReader reader)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).OnDeserialize(reader);
			launchDirection = reader.ReadVector3();
		}

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

		public override void PlayAnimation(float duration)
		{
			if (Object.op_Implicit((Object)(object)((EntityState)this).GetModelAnimator()))
			{
				((EntityState)this).PlayAnimation("Gesture, Override", "SummonSheerHeartAttack", "ThrowBomb.playbackRate", base.duration, 0f);
			}
		}
	}
	public class StrayCat : BaseSkillState
	{
		public const int bubbles = 5;

		public const float damageCoefficient = 4f;

		public const float speed = 16f;

		public const float blastRadius = 7f;

		public const float standCost = 25f;

		public static GameObject bubblePrefab;

		public static float baseDuration = 0.7f;

		private float duration;

		private bool fired;

		public static void CreateProjectile()
		{
			bubblePrefab = Asset.CloneProjectilePrefab("CommandoGrenadeProjectile", "KiraStrayCatBubble");
			ApplyTorqueOnStart component = bubblePrefab.GetComponent<ApplyTorqueOnStart>();
			if (Object.op_Implicit((Object)(object)component))
			{
				Object.DestroyImmediate((Object)(object)component);
			}
			Rigidbody component2 = bubblePrefab.GetComponent<Rigidbody>();
			if (Object.op_Implicit((Object)(object)component2))
			{
				component2.useGravity = false;
				component2.collisionDetectionMode = (CollisionDetectionMode)2;
			}
			ProjectileSimple val = bubblePrefab.GetComponent<ProjectileSimple>();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = bubblePrefab.AddComponent<ProjectileSimple>();
			}
			val.desiredForwardSpeed = 16f;
			val.updateAfterFiring = true;
			val.lifetime = 6f;
			ProjectileImpactExplosion component3 = bubblePrefab.GetComponent<ProjectileImpactExplosion>();
			if (Object.op_Implicit((Object)(object)component3))
			{
				((ProjectileExplosion)component3).blastRadius = 7f;
				((ProjectileExplosion)component3).blastDamageCoefficient = 1f;
				component3.destroyOnEnemy = true;
				component3.destroyOnWorld = true;
				component3.lifetime = 6f;
				component3.timerAfterImpact = false;
				component3.impactEffect = (Object.op_Implicit((Object)(object)KiraAssets.bombExplosionEffect) ? KiraAssets.bombExplosionEffect : component3.impactEffect);
			}
			bubblePrefab.AddComponent<KnifeCollisionGuard>();
			ProjectileController component4 = bubblePrefab.GetComponent<ProjectileController>();
			component4.startSound = "";
			component4.procCoefficient = 1f;
			GameObject val2 = LegacyResourcesAPI.Load<GameObject>("Prefabs/ProjectileGhosts/MageIceBombGhost");
			if (Object.op_Implicit((Object)(object)val2))
			{
				component4.ghostPrefab = val2;
			}
			Content.AddProjectilePrefab(bubblePrefab);
		}

		public override void OnEnter()
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			((BaseState)this).StartAimMode(duration + 1f, false);
			((EntityState)this).PlayAnimation("Gesture, Override", "ThrowBomb", "ThrowBomb.playbackRate", duration, 0f);
			StandUser component = ((EntityState)this).GetComponent<StandUser>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.UseStand(25f);
				Ray aimRay = ((BaseState)this).GetAimRay();
				component.BeginAction(((Ray)(ref aimRay)).direction, 1.5f, duration);
				component.PlayStandAnimation("StrayCat", 0.05f);
			}
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (!fired && ((EntityState)this).fixedAge >= duration * 0.45f)
			{
				fired = true;
				Util.PlaySound("Play_Kira_Swing2", ((EntityState)this).gameObject);
				if (((EntityState)this).isAuthority && Object.op_Implicit((Object)(object)bubblePrefab))
				{
					Fire();
				}
			}
			if (((EntityState)this).isAuthority && ((EntityState)this).fixedAge >= duration)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		private void Fire()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: 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_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: 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_00a9: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: 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_00c9: 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_0134: Unknown result type (might be due to invalid IL or missing references)
			StandUser component = ((EntityState)this).GetComponent<StandUser>();
			Ray aimRay = ((BaseState)this).GetAimRay();
			Vector3 val = (Object.op_Implicit((Object)(object)component) ? component.StandPosition : ((EntityState)this).characterBody.corePosition);
			for (int i = 0; i < 5; i++)
			{
				float num = Mathf.Lerp(-22f, 22f, (float)i / 4f);
				float num2 = Random.Range(-6f, 6f);
				Vector3 val2 = Quaternion.AngleAxis(num, Vecto