Decompiled source of Seamstress v0.5.1

plugins/SeamstressMod.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.AI.Walker;
using EntityStates.ImpBossMonster;
using EntityStates.ImpMonster;
using HG;
using HG.BlendableTypes;
using JetBrains.Annotations;
using KinematicCharacterController;
using On.RoR2;
using On.RoR2.UI;
using R2API;
using R2API.Networking;
using R2API.Networking.Interfaces;
using R2API.Utils;
using RoR2;
using RoR2.Achievements;
using RoR2.Audio;
using RoR2.CameraModes;
using RoR2.CharacterAI;
using RoR2.ContentManagement;
using RoR2.Projectile;
using RoR2.Skills;
using RoR2.UI;
using SeamstressMod.Modules;
using SeamstressMod.Modules.Achievements;
using SeamstressMod.Modules.BaseStates;
using SeamstressMod.Modules.Characters;
using SeamstressMod.Seamstress;
using SeamstressMod.Seamstress.Components;
using SeamstressMod.Seamstress.Content;
using SeamstressMod.Seamstress.SkillStates;
using ThreeEyedGames;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.Rendering;
using UnityEngine.UI;

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: CompilationRelaxations(8)]
[assembly: AssemblyCompany("SeamstressMod")]
[assembly: AssemblyProduct("SeamstressMod")]
[assembly: AssemblyTitle("SeamstressMod")]
[assembly: AssemblyInformationalVersion("1.0.0+e81f4d83333ecc2ccd5ac38df7d7ebbbf9d8a152")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace SeamstressMod
{
	internal static class Log
	{
		internal static ManualLogSource _logSource;

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

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

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

		internal static void ErrorAssetBundle(string assetName, string bundleName)
		{
			Error("failed to load asset, " + assetName + ", because it does not exist in asset bundle, " + bundleName);
		}

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

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

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

		internal static void Warning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.kenko.Seamstress", "Seamstress", "1.0.0")]
	public class SeamstressPlugin : BaseUnityPlugin
	{
		public const string MODUID = "com.kenko.Seamstress";

		public const string MODNAME = "Seamstress";

		public const string MODVERSION = "1.0.0";

		public const string DEVELOPER_PREFIX = "KENKO";

		public static SeamstressPlugin instance;

		private void Awake()
		{
			instance = this;
			NetworkingAPI.RegisterMessageType<SyncHunger>();
			Log.Init(((BaseUnityPlugin)this).Logger);
			Language.Init();
			new SeamstressSurvivor().Initialize();
			new ContentPacks().Initialize();
		}
	}
}
namespace SeamstressMod.Seamstress
{
	public class SeamstressSurvivor : SurvivorBase<SeamstressSurvivor>
	{
		public const string SEAMSTRESS_PREFIX = "KENKO_SEAMSTRESS_";

		internal static GameObject characterPrefab;

		public static SkillDef snapBackSkillDef;

		public override string assetBundleName => "seamstressassets";

		public override string bodyName => "SeamstressBody";

		public override string masterName => "SeamstressMonsterMaster";

		public override string modelPrefabName => "mdlSeamstress";

		public override string displayPrefabName => "SeamstressDisplay";

		public override string survivorTokenPrefix => "KENKO_SEAMSTRESS_";

		public override BodyInfo bodyInfo
		{
			get
			{
				//IL_004e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0053: Unknown result type (might be due to invalid IL or missing references)
				//IL_0085: Unknown result type (might be due to invalid IL or missing references)
				//IL_008a: Unknown result type (might be due to invalid IL or missing references)
				BodyInfo bodyInfo = new BodyInfo();
				bodyInfo.bodyName = bodyName;
				bodyInfo.bodyNameToken = "KENKO_SEAMSTRESS_NAME";
				bodyInfo.subtitleNameToken = "KENKO_SEAMSTRESS_SUBTITLE";
				bodyInfo.characterPortrait = assetBundle.LoadAsset<Texture>("ravenIcon");
				bodyInfo.bodyColor = new Color(31f / 51f, 11f / 51f, 11f / 51f);
				bodyInfo.sortPosition = 100f;
				bodyInfo.crosshair = Assets.LoadCrosshair("SimpleDot");
				bodyInfo.podPrefab = null;
				bodyInfo.initialStateType = new SerializableEntityStateType(typeof(SeamstressSpawnState));
				bodyInfo.maxHealth = 160f;
				bodyInfo.healthRegen = 1f;
				bodyInfo.armor = 0f;
				bodyInfo.damage = 8f;
				bodyInfo.damageGrowth = 0f;
				bodyInfo.healthGrowth = 48f;
				bodyInfo.jumpCount = 1;
				return bodyInfo;
			}
		}

		public override CustomRendererInfo[] customRendererInfos => new CustomRendererInfo[2]
		{
			new CustomRendererInfo
			{
				childName = "Model",
				material = assetBundle.LoadMaterial("matSeamstress")
			},
			new CustomRendererInfo
			{
				childName = "ScissorModel",
				material = assetBundle.LoadMaterial("matSeamstress")
			}
		};

		public override UnlockableDef characterUnlockableDef => SeamstressUnlockables.characterUnlockableDef;

		public override ItemDisplaysBase itemDisplays => new SeamstressItemDisplays();

		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; }

		public override void Initialize()
		{
			base.Initialize();
		}

		public override void InitializeCharacter()
		{
			SeamstressUnlockables.Init();
			SeamstressCrosshair.Init(assetBundle);
			base.InitializeCharacter();
			DamageTypes.Init();
			SeamstressConfig.Init();
			SeamstressStates.Init();
			SeamstressTokens.Init();
			SeamstressAssets.Init(assetBundle);
			SeamstressBuffs.Init(assetBundle);
			Dots.Init();
			InitializeEntityStateMachines();
			InitializeSkills();
			InitializeSkins();
			InitializeCharacterMaster();
			AdditionalBodySetup();
			characterPrefab = bodyPrefab;
			AddHooks();
		}

		private void AdditionalBodySetup()
		{
			//IL_0047: 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_0062: Expected O, but got Unknown
			//IL_0062: Expected O, but got Unknown
			//IL_006f: 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_008a: Expected O, but got Unknown
			//IL_008a: Expected O, but got Unknown
			AddHitboxes();
			bodyPrefab.AddComponent<SeamstressController>();
			bodyPrefab.AddComponent<ScissorController>();
			bodyPrefab.AddComponent<NeedleController>();
			bodyPrefab.AddComponent<Tracker>();
			TempVisualEffectAPI.AddTemporaryVisualEffect(SeamstressAssets.sewnCdEffect, new EffectRadius(pee), new EffectCondition(tempAdd), "");
			TempVisualEffectAPI.AddTemporaryVisualEffect(SeamstressAssets.sewnEffect, new EffectRadius(pee), new EffectCondition(tempAdd2), "");
			static float pee(CharacterBody body)
			{
				return 2f * body.radius;
			}
			static bool tempAdd(CharacterBody body)
			{
				return body.HasBuff(SeamstressBuffs.manipulatedCd);
			}
			static bool tempAdd2(CharacterBody body)
			{
				return body.HasBuff(SeamstressBuffs.manipulated);
			}
		}

		public void AddHitboxes()
		{
			Prefabs.SetupHitBoxGroup(characterModelObject, "Sword", "SwordHitbox");
			Prefabs.SetupHitBoxGroup(characterModelObject, "SwordBig", "SwordHitboxBig");
			Prefabs.SetupHitBoxGroup(characterModelObject, "Weave", "WeaveHitbox");
			Prefabs.SetupHitBoxGroup(characterModelObject, "WeaveBig", "WeaveHitboxBig");
			Prefabs.SetupHitBoxGroup(characterModelObject, "Right", "RightScissorHitbox");
			Prefabs.SetupHitBoxGroup(characterModelObject, "Left", "LeftScissorHitbox");
		}

		public override void InitializeEntityStateMachines()
		{
			//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_0083: 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_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_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			bodyPrefab.GetComponent<CharacterBody>().preferredInitialStateType = new SerializableEntityStateType(typeof(SeamstressSpawnState));
			EntityStateMachine[] components = bodyPrefab.GetComponents<EntityStateMachine>();
			foreach (EntityStateMachine val in components)
			{
				if (val.customName == "Body")
				{
					val.mainStateType = new SerializableEntityStateType(typeof(MainState));
				}
			}
			EntityStateMachine val2 = bodyPrefab.AddComponent<EntityStateMachine>();
			val2.initialStateType = new SerializableEntityStateType(typeof(SeamstressJump));
			val2.mainStateType = new SerializableEntityStateType(typeof(SeamstressJump));
			val2.customName = "Passive";
			Prefabs.AddEntityStateMachine(bodyPrefab, "Weapon");
			Prefabs.AddEntityStateMachine(bodyPrefab, "Weapon2");
		}

		public override void InitializeSkills()
		{
			bodyPrefab.AddComponent<SeamstressPassive>();
			Skills.CreateSkillFamilies(bodyPrefab);
			AddPassiveSkills();
			AddPrimarySkills();
			AddSecondarySkills();
			AddUtilitySkills();
			AddSpecialSkills();
		}

		private void AddPassiveSkills()
		{
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
			SeamstressPassive component = bodyPrefab.GetComponent<SeamstressPassive>();
			SkillLocator component2 = bodyPrefab.GetComponent<SkillLocator>();
			component2.passiveSkill.enabled = false;
			component.blinkPassive = Skills.CreateSkillDef(new SkillDefInfo
			{
				skillName = "KENKO_SEAMSTRESS_PASSIVE_NAME",
				skillNameToken = "KENKO_SEAMSTRESS_PASSIVE_NAME",
				skillDescriptionToken = "KENKO_SEAMSTRESS_PASSIVE_DESCRIPTION",
				skillIcon = assetBundle.LoadAsset<Sprite>("texItHungersIcon"),
				keywordTokens = new string[2]
				{
					Tokens.insatiableKeyword,
					Tokens.whatCountsAsHealth
				},
				activationState = new SerializableEntityStateType(typeof(Idle)),
				activationStateMachineName = "",
				baseMaxStock = 1,
				baseRechargeInterval = 0f,
				beginSkillCooldownOnSkillEnd = false,
				canceledFromSprinting = false,
				forceSprintDuringState = false,
				fullRestockOnAssign = true,
				interruptPriority = (InterruptPriority)0,
				resetCooldownTimerOnUse = false,
				isCombatSkill = false,
				mustKeyPress = false,
				cancelSprintingOnActivation = false,
				rechargeStock = 1,
				requiredStock = 2,
				stockToConsume = 1
			});
			Skills.AddPassiveSkills(component.passiveSkillSlot.skillFamily, component.blinkPassive);
			component.impGauge = Skills.CreateSkillDef(new SkillDefInfo
			{
				skillName = "KENKO_SEAMSTRESS_NEEDLE_NAME",
				skillNameToken = "KENKO_SEAMSTRESS_NEEDLE_NAME",
				skillDescriptionToken = "KENKO_SEAMSTRESS_NEEDLE_DESCRIPTION",
				skillIcon = assetBundle.LoadAsset<Sprite>("texImpTouchedIcon"),
				keywordTokens = new string[1] { Tokens.needleKeyword },
				activationState = new SerializableEntityStateType(typeof(Idle)),
				activationStateMachineName = "",
				baseMaxStock = 1,
				baseRechargeInterval = 0f,
				beginSkillCooldownOnSkillEnd = false,
				canceledFromSprinting = false,
				forceSprintDuringState = false,
				fullRestockOnAssign = true,
				interruptPriority = (InterruptPriority)0,
				resetCooldownTimerOnUse = false,
				isCombatSkill = false,
				mustKeyPress = false,
				cancelSprintingOnActivation = false,
				rechargeStock = 1,
				requiredStock = 2,
				stockToConsume = 1
			});
			Skills.AddPassiveSkills(component.impGaugeSkillSlot.skillFamily, component.impGauge);
		}

		private void AddPrimarySkills()
		{
			//IL_002a: 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)
			SteppedSkillDef val = Skills.CreateSkillDef<SteppedSkillDef>(new SkillDefInfo("Trim", "KENKO_SEAMSTRESS_PRIMARY_TRIM_NAME", "KENKO_SEAMSTRESS_PRIMARY_TRIM_DESCRIPTION", assetBundle.LoadAsset<Sprite>("texFlurryIcon"), new SerializableEntityStateType(typeof(Trim))));
			val.stepCount = 3;
			val.stepGraceDuration = 1f;
			Skills.AddPrimarySkills(bodyPrefab, (SkillDef)val);
			SteppedSkillDef val2 = Skills.CreateSkillDef<SteppedSkillDef>(new SkillDefInfo("Flurry", "KENKO_SEAMSTRESS_PRIMARY_FLURRY_NAME", "KENKO_SEAMSTRESS_PRIMARY_FLURRY_DESCRIPTION", assetBundle.LoadAsset<Sprite>("texFlurryIcon"), new SerializableEntityStateType(typeof(Flurry))));
			val2.stepCount = 2;
			val2.stepGraceDuration = 1f;
			Skills.AddPrimarySkills(bodyPrefab, (SkillDef)val2);
		}

		private void AddSecondarySkills()
		{
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			SkillDefInfo skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "Clip";
			skillDefInfo.skillNameToken = "KENKO_SEAMSTRESS_SECONDARY_CLIP_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SEAMSTRESS_SECONDARY_CLIP_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[2]
			{
				Tokens.sentienceRangeKeyword,
				Tokens.needleKeyword
			};
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texClipIcon");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(Clip));
			skillDefInfo.activationStateMachineName = "Weapon";
			skillDefInfo.interruptPriority = (InterruptPriority)1;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.baseRechargeInterval = 6f;
			skillDefInfo.rechargeStock = 1;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 1;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = false;
			skillDefInfo.dontAllowPastMaxStocks = false;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.mustKeyPress = true;
			skillDefInfo.isCombatSkill = true;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = true;
			skillDefInfo.forceSprintDuringState = false;
			SkillDef val = Skills.CreateSkillDef(skillDefInfo);
			Skills.AddSecondarySkills(bodyPrefab, val);
			skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "PlanarManipulation";
			skillDefInfo.skillNameToken = "KENKO_SEAMSTRESS_SECONDARY_PLANMAN_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SEAMSTRESS_SECONDARY_PLANMAN_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[1] { Tokens.manipulateKeyword };
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texPlanarManipulationIcon");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(Telekinesis));
			skillDefInfo.activationStateMachineName = "Weapon2";
			skillDefInfo.interruptPriority = (InterruptPriority)1;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.baseRechargeInterval = 0.5f;
			skillDefInfo.rechargeStock = 1;
			skillDefInfo.requiredStock = 0;
			skillDefInfo.stockToConsume = 0;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = false;
			skillDefInfo.dontAllowPastMaxStocks = false;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.mustKeyPress = true;
			skillDefInfo.isCombatSkill = true;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = false;
			skillDefInfo.forceSprintDuringState = false;
			TrackingSkillDef trackingSkillDef = Skills.CreateSkillDef<TrackingSkillDef>(skillDefInfo);
			Skills.AddSecondarySkills(bodyPrefab, trackingSkillDef);
		}

		private void AddUtilitySkills()
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			//IL_0258: Unknown result type (might be due to invalid IL or missing references)
			//IL_026a: Unknown result type (might be due to invalid IL or missing references)
			SkillDefInfo skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "HeartDashSeamstress";
			skillDefInfo.skillNameToken = "KENKO_SEAMSTRESS_UTILITY_HEARTDASH_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SEAMSTRESS_UTILITY_HEARTDASH_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[1] { Tokens.insatiableKeyword };
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texGlimpseOfCorruptionIcon");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(HealthCostDash));
			skillDefInfo.activationStateMachineName = "Weapon";
			skillDefInfo.interruptPriority = (InterruptPriority)1;
			skillDefInfo.baseRechargeInterval = 8f;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.rechargeStock = 1;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 1;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = false;
			skillDefInfo.dontAllowPastMaxStocks = false;
			skillDefInfo.mustKeyPress = true;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.isCombatSkill = true;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = false;
			skillDefInfo.forceSprintDuringState = false;
			SkillDef val = Skills.CreateSkillDef(skillDefInfo);
			Skills.AddUtilitySkills(bodyPrefab, val);
			skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "ParrySeamstress";
			skillDefInfo.skillNameToken = "KENKO_SEAMSTRESS_UTILITY_PARRY_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SEAMSTRESS_UTILITY_PARRY_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[2]
			{
				Tokens.sentienceRangeKeyword,
				Tokens.insatiableKeyword
			};
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texGlimpseOfPurityIcon");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(Parry));
			skillDefInfo.activationStateMachineName = "Weapon";
			skillDefInfo.interruptPriority = (InterruptPriority)2;
			skillDefInfo.baseRechargeInterval = 8f;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.rechargeStock = 1;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 1;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = true;
			skillDefInfo.dontAllowPastMaxStocks = false;
			skillDefInfo.mustKeyPress = true;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.isCombatSkill = true;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = true;
			skillDefInfo.forceSprintDuringState = false;
			SkillDef val2 = Skills.CreateSkillDef(skillDefInfo);
			Skills.AddUtilitySkills(bodyPrefab, val2);
			skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "SnapBack";
			skillDefInfo.skillNameToken = "SnapBack";
			skillDefInfo.skillDescriptionToken = "Snapback to core";
			skillDefInfo.keywordTokens = new string[0];
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texImpTouchedIcon");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(Snapback));
			skillDefInfo.activationStateMachineName = "Body";
			skillDefInfo.interruptPriority = (InterruptPriority)3;
			skillDefInfo.baseRechargeInterval = 0f;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.rechargeStock = 0;
			skillDefInfo.requiredStock = 0;
			skillDefInfo.stockToConsume = 0;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = true;
			skillDefInfo.dontAllowPastMaxStocks = true;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.mustKeyPress = true;
			skillDefInfo.isCombatSkill = false;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = false;
			skillDefInfo.forceSprintDuringState = false;
			snapBackSkillDef = Skills.CreateSkillDef(skillDefInfo);
		}

		private void AddSpecialSkills()
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			SkillDefInfo skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "FireSeamstress";
			skillDefInfo.skillNameToken = "KENKO_SEAMSTRESS_SPECIAL_FIRE_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SEAMSTRESS_SPECIAL_FIRE_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[1] { Tokens.sentienceKeyword };
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texSkewerIcon");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(FireScissor));
			skillDefInfo.activationStateMachineName = "Weapon";
			skillDefInfo.interruptPriority = (InterruptPriority)1;
			skillDefInfo.baseRechargeInterval = 16f;
			skillDefInfo.baseMaxStock = 2;
			skillDefInfo.rechargeStock = 2;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 1;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = false;
			skillDefInfo.dontAllowPastMaxStocks = true;
			skillDefInfo.mustKeyPress = true;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.isCombatSkill = true;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = true;
			skillDefInfo.forceSprintDuringState = false;
			SkillDef val = Skills.CreateSkillDef(skillDefInfo);
			Skills.AddSpecialSkills(bodyPrefab, val);
		}

		public override void InitializeSkins()
		{
			ModelSkinController val = ((Component)prefabCharacterModel).gameObject.AddComponent<ModelSkinController>();
			ChildLocator component = ((Component)prefabCharacterModel).GetComponent<ChildLocator>();
			RendererInfo[] baseRendererInfos = prefabCharacterModel.baseRendererInfos;
			List<SkinDef> list = new List<SkinDef>();
			SkinDef val2 = Skins.CreateSkinDef("DEFAULT_SKIN", assetBundle.LoadAsset<Sprite>("texMainSkin"), baseRendererInfos, ((Component)prefabCharacterModel).gameObject);
			val2.meshReplacements = Skins.getMeshReplacements(assetBundle, baseRendererInfos, "meshSeamstress", "meshScissors");
			list.Add(val2);
			SkinDef val3 = Skins.CreateSkinDef("KENKO_SEAMSTRESS_MASTERY_SKIN_NAME", assetBundle.LoadAsset<Sprite>("texVergilAchievement"), baseRendererInfos, ((Component)prefabCharacterModel).gameObject);
			val3.meshReplacements = Skins.getMeshReplacements(assetBundle, baseRendererInfos, "meshPrincess", "meshPrincessSword");
			val3.rendererInfos[0].defaultMaterial = assetBundle.LoadMaterial("matPrincessBlue");
			val3.rendererInfos[1].defaultMaterial = assetBundle.LoadMaterial("matPrincessSword");
			SkinDef val4 = Skins.CreateSkinDef("KENKO_SEAMSTRESS_MASTERY_SKIN_NAME", assetBundle.LoadAsset<Sprite>("texDanteAchievement"), baseRendererInfos, ((Component)prefabCharacterModel).gameObject);
			val4.meshReplacements = Skins.getMeshReplacements(assetBundle, baseRendererInfos, "meshPrincess", "meshPrincessSword");
			val4.rendererInfos[0].defaultMaterial = assetBundle.LoadMaterial("matPrincessRed");
			val4.rendererInfos[1].defaultMaterial = assetBundle.LoadMaterial("matPrincessSwordAlt");
			SkinDef val5 = Skins.CreateSkinDef("KENKO_SEAMSTRESS_MASTERY_SKIN_NAME", assetBundle.LoadAsset<Sprite>("texDanteAchievement"), baseRendererInfos, ((Component)prefabCharacterModel).gameObject);
			val5.meshReplacements = Skins.getMeshReplacements(assetBundle, baseRendererInfos, "RavenBody", "ShadowClaws");
			val5.rendererInfos[0].defaultMaterial = assetBundle.LoadMaterial("matRaven");
			val5.rendererInfos[1].defaultMaterial = assetBundle.LoadMaterial("matHands");
			SkinDef val6 = Skins.CreateSkinDef("KENKO_SEAMSTRESS_MASTERY_SKIN_NAME", assetBundle.LoadAsset<Sprite>("texDanteAchievement"), baseRendererInfos, ((Component)prefabCharacterModel).gameObject);
			val6.meshReplacements = Skins.getMeshReplacements(assetBundle, baseRendererInfos, "RavenBodyAlt", "ShadowClaws");
			val6.rendererInfos[0].defaultMaterial = assetBundle.LoadMaterial("matRavenAlt");
			val6.rendererInfos[1].defaultMaterial = assetBundle.LoadMaterial("matHands");
			list.Add(val3);
			list.Add(val4);
			list.Add(val5);
			list.Add(val6);
			val.skins = list.ToArray();
		}

		public override void InitializeCharacterMaster()
		{
			SeamstressAI.Init(bodyPrefab, masterName);
		}

		private void AddHooks()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			HUD.onHudTargetChangedGlobal += HUDSetup;
			HealthComponent.Heal += new hook_Heal(HealthComponent_Heal);
			CharacterModel.UpdateOverlays += new hook_UpdateOverlays(CharacterModel_UpdateOverlays);
			HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_TakeDamage);
			CharacterBody.RecalculateStats += new hook_RecalculateStats(CharacterBody_RecalculateStats);
			LoadoutPanelController.Rebuild += new hook_Rebuild(LoadoutPanelController_Rebuild);
		}

		private static void LoadoutPanelController_Rebuild(orig_Rebuild orig, LoadoutPanelController self)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self);
			if (self.currentDisplayData.bodyIndex != BodyCatalog.FindBodyIndex("SeamstressBody"))
			{
				return;
			}
			LanguageTextMeshController[] componentsInChildren = ((Component)self).gameObject.GetComponentsInChildren<LanguageTextMeshController>();
			foreach (LanguageTextMeshController val in componentsInChildren)
			{
				if (Object.op_Implicit((Object)(object)val) && val.token == "LOADOUT_SKILL_MISC")
				{
					val.token = "Passive";
				}
			}
		}

		private void HealthComponent_TakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo)
		{
			//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)
			if (!NetworkServer.active)
			{
				return;
			}
			CharacterBody body = self.body;
			if (Object.op_Implicit((Object)(object)body) && body.baseNameToken == "KENKO_SEAMSTRESS_NAME")
			{
				if (body.HasBuff(SeamstressBuffs.parryStart) && damageInfo.damage > 0f)
				{
					body.RemoveBuff(SeamstressBuffs.parryStart);
					if (!body.HasBuff(SeamstressBuffs.parrySuccess))
					{
						body.AddBuff(SeamstressBuffs.parrySuccess);
					}
					body.AddTimedBuff(Buffs.Immune, 0.9f);
					return;
				}
				if (body.HasBuff(SeamstressBuffs.instatiable) && damageInfo.dotIndex != Dots.SeamstressBleed)
				{
					SeamstressController component = ((Component)body).gameObject.GetComponent<SeamstressController>();
					if (Object.op_Implicit((Object)(object)component))
					{
						component.FillHunger(0f - damageInfo.damage);
						if (component.fiendMeter - damageInfo.damage <= 0f && (Object)(object)body.skillLocator.utility.skillDef == (Object)(object)snapBackSkillDef)
						{
							body.skillLocator.utility.ExecuteIfReady();
						}
						return;
					}
				}
			}
			orig.Invoke(self, damageInfo);
			if (Object.op_Implicit((Object)(object)body) && body.baseNameToken == "KENKO_SEAMSTRESS_NAME")
			{
				body.RecalculateStats();
			}
		}

		private void CharacterModel_UpdateOverlays(orig_UpdateOverlays orig, CharacterModel self)
		{
			orig.Invoke(self);
			if (!Object.op_Implicit((Object)(object)self) || !Object.op_Implicit((Object)(object)self.body) || self.body.baseNameToken != "KENKO_SEAMSTRESS_NAME")
			{
				return;
			}
			SeamstressController component = ((Component)self.body).GetComponent<SeamstressController>();
			if (self.body.HasBuff(SeamstressBuffs.instatiable) && !component.inInsatiable)
			{
				TemporaryOverlay val = ((Component)self).gameObject.AddComponent<TemporaryOverlay>();
				val.duration = 6f;
				val.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0.4f);
				val.animateShaderAlpha = true;
				val.destroyComponentOnEnd = true;
				val.originalMaterial = SeamstressAssets.insatiableOverlayMat;
				val.AddToCharacerModel(self);
				component.inInsatiable = true;
			}
			else if (!self.body.HasBuff(SeamstressBuffs.instatiable) && component.inInsatiable)
			{
				component.inInsatiable = false;
				if ((Object)(object)((Component)self).gameObject.GetComponent<TemporaryOverlay>() != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)self).gameObject.GetComponent<TemporaryOverlay>());
				}
			}
			if (self.body.HasBuff(SeamstressBuffs.parryStart))
			{
				TemporaryOverlay val2 = ((Component)self).gameObject.AddComponent<TemporaryOverlay>();
				val2.duration = 0.4f;
				val2.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
				val2.animateShaderAlpha = true;
				val2.destroyComponentOnEnd = true;
				val2.originalMaterial = SeamstressAssets.parryMat;
				val2.AddToCharacerModel(self);
			}
		}

		private float HealthComponent_Heal(orig_Heal orig, HealthComponent self, float amount, ProcChainMask procChainMask, bool nonRegen = true)
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)self) && self.body.HasBuff(SeamstressBuffs.instatiable) && self.body.baseNameToken == "KENKO_SEAMSTRESS_NAME")
			{
				amount *= 0.001f;
			}
			float num = orig.Invoke(self, amount, procChainMask, nonRegen);
			SeamstressController seamstressController = default(SeamstressController);
			if (self.body.baseNameToken == "KENKO_SEAMSTRESS_NAME" && ((Component)self.body).TryGetComponent<SeamstressController>(ref seamstressController) && self.body.HasBuff(SeamstressBuffs.instatiable))
			{
				if (self.health >= self.fullHealth)
				{
					seamstressController.FillHunger(amount / 0.001f * 0.999f);
				}
				else
				{
					seamstressController.FillHunger(num / 0.001f * 0.999f);
				}
			}
			return num;
		}

		private void CharacterBody_RecalculateStats(orig_RecalculateStats orig, CharacterBody self)
		{
			orig.Invoke(self);
			if (!Object.op_Implicit((Object)(object)self) || self.baseNameToken != "KENKO_SEAMSTRESS_NAME")
			{
				return;
			}
			SeamstressController component = ((Component)self).GetComponent<SeamstressController>();
			HealthComponent component2 = ((Component)self).GetComponent<HealthComponent>();
			SkillLocator component3 = ((Component)self).GetComponent<SkillLocator>();
			if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component2) && Object.op_Implicit((Object)(object)component3))
			{
				component.maxHunger = component2.fullHealth * 2f;
				float num = component2.fullHealth + (component2.fullShield + component2.barrier) / 2f + component.fiendMeter / 8f - component2.health;
				float num2 = component2.fullHealth * 0.66f;
				if (component.inInsatiable && component3.utility.skillNameToken == "KENKO_SEAMSTRESS_UTILITY_PARRY_NAME")
				{
					self.baseDamage = 8f + num2 * 0.05f + num * 0.05f;
				}
				else
				{
					self.baseDamage = 8f + num * 0.05f;
				}
				if (component.fiendMeter > 0f)
				{
					self.moveSpeed += 2f * Util.Remap(component.fiendMeter, 0f, component.maxHunger, 0f, 2f);
					self.attackSpeed += 0.1f * Util.Remap(component.fiendMeter, 0f, component.maxHunger, 0f, 2f);
				}
			}
			if (!self.HasBuff(SeamstressBuffs.scissorLeftBuff))
			{
				self.attackSpeed += 0.1f;
				self.moveSpeed += 1f;
			}
			if (!self.HasBuff(SeamstressBuffs.scissorRightBuff))
			{
				self.attackSpeed += 0.1f;
				self.moveSpeed += 1f;
			}
			if (Object.op_Implicit((Object)(object)self.inventory) && self.inventory.GetItemCount(Items.EquipmentMagazineVoid) != 0)
			{
				self.attackSpeed += 0.1f * (float)self.inventory.GetItemCount(Items.EquipmentMagazineVoid);
				self.moveSpeed += 1f * (float)self.inventory.GetItemCount(Items.EquipmentMagazineVoid);
			}
		}

		internal static void HUDSetup(HUD hud)
		{
			//IL_0215: 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_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0263: Unknown result type (might be due to invalid IL or missing references)
			//IL_0268: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0284: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)hud.targetBodyObject) && (Object)(object)hud.targetMaster.bodyPrefab == (Object)(object)characterPrefab && ((NetworkBehaviour)hud.targetMaster).hasAuthority)
			{
				Transform val = ((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("SpringCanvas")
					.Find("BottomLeftCluster")
					.Find("BarRoots")
					.Find("LevelDisplayCluster");
				if (!Object.op_Implicit((Object)(object)((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("SpringCanvas")
					.Find("BottomLeftCluster")
					.Find("ImpGauge")))
				{
					GameObject val2 = Object.Instantiate<GameObject>(((Component)val).gameObject, ((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("SpringCanvas")
						.Find("BottomLeftCluster"));
					((Object)val2).name = "ImpGauge";
					Object.DestroyImmediate((Object)(object)((Component)val2.transform.GetChild(0)).gameObject);
					Object.Destroy((Object)(object)val2.GetComponentInChildren<LevelText>());
					Object.Destroy((Object)(object)val2.GetComponentInChildren<ExpBar>());
					ImpGauge impGauge = val2.AddComponent<ImpGauge>();
					impGauge.targetHUD = hud;
					impGauge.fillRectTransform = ((Component)val2.transform.Find("ExpBarRoot").GetChild(0).GetChild(0)).GetComponent<RectTransform>();
					((Component)val2.transform.Find("LevelDisplayRoot").Find("ValueText")).gameObject.SetActive(false);
					((Component)val2.transform.Find("LevelDisplayRoot").Find("PrefixText")).gameObject.SetActive(false);
					((Behaviour)((Component)val2.transform.Find("ExpBarRoot").GetChild(0)).GetComponent<Image>()).enabled = true;
					((Component)val2.transform.Find("LevelDisplayRoot")).GetComponent<RectTransform>().anchoredPosition = new Vector2(-12f, 0f);
					RectTransform component = val2.GetComponent<RectTransform>();
					component.anchorMax = new Vector2(1f, 1f);
					component.sizeDelta = new Vector2(1f, 1f);
					((Transform)component).localPosition = Vector2.op_Implicit(new Vector2(740f, 430f));
					((Transform)component).localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
				}
				if (!Object.op_Implicit((Object)(object)((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("CrosshairCanvas")
					.Find("SeamstressCrosshair")))
				{
					GameObject val3 = Object.Instantiate<GameObject>(SeamstressCrosshair.seamstressCrosshair, ((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("CrosshairCanvas"));
					((Object)val3).name = "SeamstressCrosshair";
					val3.gameObject.GetComponent<HudElement>().targetBodyObject = hud.targetBodyObject;
					val3.gameObject.GetComponent<HudElement>().targetCharacterBody = hud.targetBodyObject.GetComponent<CharacterBody>();
				}
			}
		}
	}
}
namespace SeamstressMod.Seamstress.SkillStates
{
	public class Clip : BaseSeamstressSkillState
	{
		public static GameObject clawSlash = SeamstressAssets.clawSlashEffect;

		public static GameObject hitEffectPrefab = SeamstressAssets.scissorsHitImpactEffect;

		public static GameObject swingEffectPrefab = SeamstressAssets.scissorsComboSlashEffect;

		public static GameObject wideEffectPrefab = SeamstressAssets.wideSlashEffect;

		protected Animator animator;

		private OverlapAttack overlapAttack;

		private DamageType damageType = (DamageType)0;

		private ModdedDamageType moddedDamageType3 = DamageTypes.Empty;

		private ModdedDamageType moddedDamageType2 = DamageTypes.ClipLifeSteal;

		private ModdedDamageType moddedDamageType = DamageTypes.CutDamage;

		private float damageCoefficient = 1f;

		private float procCoefficient = 1f;

		private float pushForce = 0f;

		private Vector3 bonusForce = Vector3.zero;

		protected float stopwatch;

		private HitStopCachedState hitStopCachedState;

		private float hitPauseTimer;

		protected float hitStopDuration = 0.04f;

		private bool hasHopped;

		protected bool inHitPause;

		protected string playbackRateParam = "Slash.playbackRate";

		protected string hitBoxString = "SwordBig";

		private int snips;

		private int alternateSwings = 0;

		private float baseDuration = 0.75f;

		private float duration;

		private float firstSnip;

		private float secondSnip;

		private float snipInterval;

		private float lastSnip;

		private bool hasFired;

		private bool hasFired2;

		private bool noScissors;

		private bool inAir;

		private Vector3 storedVelocity;

		public override void OnEnter()
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			base.OnEnter();
			baseDuration = 0.75f - 0.5f * (0.5f * (seamCom.fiendMeter / (((EntityState)this).healthComponent.fullHealth * 2f)));
			snips = needleCount;
			if (!scissorRight || !scissorLeft)
			{
				moddedDamageType3 = DamageTypes.NoScissors;
				noScissors = true;
			}
			if (noScissors)
			{
				hitBoxString = "Sword";
			}
			animator = ((EntityState)this).GetModelAnimator();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			firstSnip = duration * 0.2f;
			secondSnip = duration * 0.4f;
			snipInterval = 0f;
			lastSnip = duration - firstSnip;
			if (!((EntityState)this).characterMotor.isGrounded)
			{
				inAir = true;
			}
			((BaseState)this).StartAimMode(duration, false);
			PlayAttackAnimation();
			if (inAir)
			{
				((BaseState)this).SmallHop(((EntityState)this).characterMotor, 6f);
			}
		}

		public override void FixedUpdate()
		{
			//IL_00ed: 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_007c: 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_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_00cb: 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)
			base.FixedUpdate();
			hitPauseTimer -= Time.fixedDeltaTime;
			if (hitPauseTimer <= 0f && inHitPause)
			{
				RemoveHitstop();
			}
			if (!inHitPause)
			{
				stopwatch += Time.fixedDeltaTime;
				if (inAir && ((EntityState)this).isAuthority)
				{
					Vector3 velocity = ((EntityState)this).characterDirection.forward * ((BaseState)this).moveSpeedStat * Mathf.Lerp(3f, 1f, ((EntityState)this).age / duration);
					velocity.y = ((EntityState)this).characterMotor.velocity.y;
					((EntityState)this).characterMotor.velocity = velocity;
				}
			}
			else
			{
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
				{
					((EntityState)this).characterMotor.velocity = Vector3.zero;
				}
				if (Object.op_Implicit((Object)(object)animator))
				{
					animator.SetFloat(playbackRateParam, 0f);
				}
			}
			if (stopwatch >= firstSnip && !hasFired)
			{
				hasFired = true;
				EnterAttack();
				FireAttack();
			}
			if (stopwatch >= secondSnip + snipInterval && snipInterval <= secondSnip && snips > 0)
			{
				EnterAttack();
				FireAttack();
				snips--;
				snipInterval += secondSnip / 5f;
				Util.PlaySound("Play_bandit2_m2_alt_throw", ((EntityState)this).gameObject);
				if (NetworkServer.active)
				{
					((EntityState)this).characterBody.RemoveBuff(SeamstressBuffs.needles);
				}
			}
			if (stopwatch >= lastSnip && !hasFired2)
			{
				hasFired2 = true;
				EnterAttack();
				FireAttack();
			}
			if (stopwatch >= duration && snips == 0 && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

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

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

		protected virtual void OnHitEnemyAuthority()
		{
			if (!hasHopped)
			{
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && !((EntityState)this).characterMotor.isGrounded)
				{
					((BaseState)this).SmallHop(((EntityState)this).characterMotor, 4f);
				}
				hasHopped = true;
			}
			ApplyHitstop();
		}

		private void EnterAttack()
		{
			if (noScissors)
			{
				Util.PlayAttackSpeedSound("Play_imp_attack", ((EntityState)this).gameObject, ((BaseState)this).attackSpeedStat);
			}
			else
			{
				Util.PlayAttackSpeedSound("Play_bandit2_m2_impact", ((EntityState)this).gameObject, ((BaseState)this).attackSpeedStat);
			}
		}

		protected virtual void PlaySwingEffect()
		{
			if (!Object.op_Implicit((Object)(object)clawSlash))
			{
				Log.Error("Error, no effect?");
				return;
			}
			Transform val = ((BaseState)this).FindModelChild("SwingCenter");
			Transform val2 = ((BaseState)this).FindModelChild("SwingRightSmall");
			Transform val3 = ((BaseState)this).FindModelChild("SwingLeftSmall");
			Transform val4 = ((BaseState)this).FindModelChild("SwingCharAirCenter");
			Transform val5 = ((BaseState)this).FindModelChild("SwingCharAirCenter2");
			if (!Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)val2) || !Object.op_Implicit((Object)(object)val3) || !Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)val4) || !Object.op_Implicit((Object)(object)val5))
			{
				return;
			}
			if (noScissors)
			{
				if (hasFired && !hasFired2)
				{
					if (alternateSwings == 0)
					{
						Object.Instantiate<GameObject>(clawSlash, val2);
						alternateSwings = 1;
					}
					else if (alternateSwings == 1)
					{
						Object.Instantiate<GameObject>(clawSlash, val3);
						alternateSwings = 0;
					}
				}
				else if (hasFired2)
				{
					Object.Instantiate<GameObject>(clawSlash, val3);
				}
			}
			else if (inAir)
			{
				if (hasFired && !hasFired2)
				{
					if (alternateSwings == 0)
					{
						Object.Instantiate<GameObject>(wideEffectPrefab, val5);
						alternateSwings = 1;
					}
					else if (alternateSwings == 1)
					{
						Object.Instantiate<GameObject>(wideEffectPrefab, val4);
						alternateSwings = 0;
					}
				}
				else if (hasFired2)
				{
					Object.Instantiate<GameObject>(wideEffectPrefab, val4);
				}
			}
			else
			{
				Object.Instantiate<GameObject>(swingEffectPrefab, val);
			}
		}

		protected virtual void FireAttack()
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			hasHopped = false;
			overlapAttack = new OverlapAttack();
			overlapAttack.damageType = damageType;
			if (insatiable)
			{
				DamageAPI.AddModdedDamageType(overlapAttack, moddedDamageType2);
				DamageAPI.AddModdedDamageType(overlapAttack, moddedDamageType);
			}
			DamageAPI.AddModdedDamageType(overlapAttack, DamageTypes.ClipLifeSteal);
			DamageAPI.AddModdedDamageType(overlapAttack, moddedDamageType3);
			overlapAttack.attacker = ((EntityState)this).gameObject;
			overlapAttack.inflictor = ((EntityState)this).gameObject;
			overlapAttack.teamIndex = ((BaseState)this).GetTeam();
			overlapAttack.damage = damageCoefficient * ((BaseState)this).damageStat;
			overlapAttack.procCoefficient = procCoefficient;
			overlapAttack.hitEffectPrefab = hitEffectPrefab;
			overlapAttack.forceVector = bonusForce;
			overlapAttack.pushAwayForce = pushForce;
			overlapAttack.hitBoxGroup = ((BaseState)this).FindHitBoxGroup(hitBoxString);
			overlapAttack.isCrit = ((BaseState)this).RollCrit();
			if (((EntityState)this).isAuthority)
			{
				Ray aimRay = ((BaseState)this).GetAimRay();
				Vector3 direction = ((Ray)(ref aimRay)).direction;
				direction.y = Mathf.Max(direction.y, direction.y * 0.5f);
				((BaseState)this).FindModelChild("SwingPivot").rotation = Util.QuaternionSafeLookRotation(direction);
				if (overlapAttack.Fire((List<HurtBox>)null))
				{
					OnHitEnemyAuthority();
				}
			}
			PlaySwingEffect();
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			if (stopwatch >= duration)
			{
				return (InterruptPriority)0;
			}
			return (InterruptPriority)2;
		}

		private void PlayAttackAnimation()
		{
			((EntityState)this).PlayCrossfade("Gesture, Override", "Slash1", "Slash.playbackRate", duration, 0.1f * duration);
		}

		public override void OnExit()
		{
			((EntityState)this).OnExit();
		}
	}
	public class FireScissor : BaseSeamstressSkillState
	{
		public static float baseDuration = 0.5f;

		public static float damageCoefficient = 4f;

		public static float procCoefficient = 1f;

		public static GameObject scissorFiringPrefab = SeamstressAssets.impDashEffect;

		public static string attackSoundString = "Play_imp_overlord_attack1_throw";

		private GameObject projectilePrefab;

		private Animator modelAnimator;

		private float duration;

		private int chosenAnim = 2;

		private bool hasFired;

		private Ray aimRay;

		private string fireString;

		public override void OnEnter()
		{
			//IL_003e: 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_004a: Unknown result type (might be due to invalid IL or missing references)
			base.OnEnter();
			Util.PlaySound("Play_item_lunar_specialReplace_explode", ((EntityState)this).gameObject);
			((Component)((EntityState)this).characterBody).GetComponent<ScissorController>().isRight = true;
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			aimRay = ((BaseState)this).GetAimRay();
			((BaseState)this).StartAimMode(aimRay, 2f, false);
			modelAnimator = ((EntityState)this).GetModelAnimator();
			if (Object.op_Implicit((Object)(object)modelAnimator))
			{
				((EntityState)this).PlayAnimation("Gesture, Override", "ThrowBomb", "ThrowBomb.playbackRate", duration);
			}
			if (scissorRight && scissorLeft)
			{
				chosenAnim = 2;
			}
			else if (scissorRight && !scissorLeft)
			{
				chosenAnim = 1;
			}
			else if (scissorLeft && !scissorRight)
			{
				chosenAnim = 2;
			}
			else
			{
				chosenAnim = 2;
			}
		}

		public override void OnExit()
		{
			RefreshState();
			if (!scissorLeft && !scissorRight)
			{
				((Component)((EntityState)this).characterBody).GetComponent<SeamstressController>().ReactivateScissor("meshScissors", activate: false);
			}
			((EntityState)this).OnExit();
		}

		public override void FixedUpdate()
		{
			//IL_0098: 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_00a6: Unknown result type (might be due to invalid IL or missing references)
			base.FixedUpdate();
			if (Object.op_Implicit((Object)(object)modelAnimator) && !hasFired)
			{
				if (chosenAnim == 2)
				{
					projectilePrefab = SeamstressAssets.scissorLPrefab;
					fireString = "SwingRightSmall";
				}
				else
				{
					projectilePrefab = SeamstressAssets.scissorRPrefab;
					fireString = "SwingLeftSmall";
				}
				if (insatiable)
				{
					projectilePrefab.GetComponent<ModdedDamageTypeHolderComponent>().Add(DamageTypes.CutDamage);
				}
				else
				{
					projectilePrefab.GetComponent<ModdedDamageTypeHolderComponent>().Remove(DamageTypes.CutDamage);
				}
				Fire(aimRay, fireString);
				hasFired = true;
			}
			if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		private void Fire(Ray aimRay, string muzzleName)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Expected O, but got Unknown
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: 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)
			Util.PlaySound(attackSoundString, ((EntityState)this).gameObject);
			Transform val = ((BaseState)this).FindModelChild(muzzleName);
			if (Object.op_Implicit((Object)(object)val))
			{
				EffectData val2 = new EffectData();
				val2.rotation = Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction);
				val2.origin = val.position;
				val2.scale = 0.5f;
				EffectManager.SpawnEffect(scissorFiringPrefab, val2, false);
			}
			if (((EntityState)this).isAuthority)
			{
				ProjectileManager.instance.FireProjectile(projectilePrefab, ((Ray)(ref aimRay)).origin, Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction), ((EntityState)this).gameObject, ((BaseState)this).damageStat * damageCoefficient, 0f, Util.CheckRoll(((BaseState)this).critStat, ((EntityState)this).characterBody.master), (DamageColorIndex)0, (GameObject)null, -1f);
			}
		}

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

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

		public override void OnDeserialize(NetworkReader reader)
		{
			((BaseSkillState)this).OnDeserialize(reader);
			chosenAnim = reader.ReadChar();
		}
	}
	public class Flurry : BaseMeleeAttack
	{
		public override void OnEnter()
		{
			//IL_0015: 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_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0206: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
			RefreshState();
			hitboxGroupName = "Sword";
			damageType = (DamageType)0;
			damageTotal = 1.2f;
			procCoefficient = 1f;
			pushForce = 300f;
			bonusForce = Vector3.zero;
			baseDuration = 1.1f - 1.1f * (0.5f * (seamCom.fiendMeter / (((EntityState)this).healthComponent.fullHealth * 2f)));
			baseScissorDuration = 2f - 2f * (0.5f * (seamCom.fiendMeter / (((EntityState)this).healthComponent.fullHealth * 2f)));
			attackStartPercentTime = 0.2f;
			attackEndPercentTime = 0.4f;
			earlyExitPercentTime = 0.5f;
			hitStopDuration = 0.05f;
			attackRecoil = 2f / ((BaseState)this).attackSpeedStat;
			hitHopVelocity = 3.5f;
			swingSoundString = "Play_acrid_m1_slash";
			hitSoundString = "";
			hitEffectPrefab = SeamstressAssets.scissorsHitImpactEffect;
			swingEffectPrefab = SeamstressAssets.clawSlashEffect;
			bonusSwingEffectPrefab = SeamstressAssets.scissorsSlashEffect;
			muzzleString = ((swingIndex % 2 == 0) ? "SwingLeftSmall" : "SwingRightSmall");
			buffer = false;
			if (insatiable)
			{
				moddedDamageTypeHolder.Add(DamageTypes.CutDamage);
				moddedDamageTypeHolder.Add(DamageTypes.InsatiableLifeSteal);
			}
			scissorHit = true;
			if (muzzleString == "SwingLeftSmall" && !scissorLeft)
			{
				moddedDamageTypeHolder.Add(DamageTypes.NoScissors);
				scissorHit = false;
			}
			if (muzzleString == "SwingRightSmall" && !scissorRight)
			{
				moddedDamageTypeHolder.Add(DamageTypes.NoScissors);
				scissorHit = false;
			}
			impactSound = SeamstressAssets.scissorsHitSoundEvent.index;
			base.OnEnter();
		}

		public override void FixedUpdate()
		{
			base.FixedUpdate();
		}

		protected override void FireAttack()
		{
			//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_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_001d: 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_0044: 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)
			if (((EntityState)this).isAuthority)
			{
				Ray aimRay = ((BaseState)this).GetAimRay();
				Vector3 direction = ((Ray)(ref aimRay)).direction;
				direction.y = Mathf.Max(direction.y, direction.y * 0.5f);
				((BaseState)this).FindModelChild("SwingPivot").rotation = Util.QuaternionSafeLookRotation(direction);
				if (attack.Fire((List<HurtBox>)null))
				{
					OnHitEnemyAuthority();
				}
			}
		}

		protected override void PlayAttackAnimation()
		{
			((EntityState)this).PlayCrossfade("Gesture, Override", (swingIndex % 2 == 0) ? "Slash1" : "Slash2", "Slash.playbackRate", duration, 0.1f * duration);
		}

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

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

		public override void OnExit()
		{
			base.OnExit();
		}
	}
	public class HealthCostDash : BaseSeamstressSkillState
	{
		public static float baseDuration = 0.3f;

		public static float dashPower = 6f;

		public static float damageCoefficient = 4f;

		public static GameObject uppercutEffect = SeamstressAssets.uppercutEffect;

		public static GameObject projectilePrefab = SeamstressAssets.heartPrefab;

		private Vector3 dashVector;

		private OverlapAttack attack;

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

		protected string hitBoxString = "Sword";

		private bool hasHit;

		public override void OnEnter()
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Expected O, but got Unknown
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: 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_01df: Expected O, but got Unknown
			//IL_0230: Unknown result type (might be due to invalid IL or missing references)
			//IL_0236: Unknown result type (might be due to invalid IL or missing references)
			//IL_024d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0252: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0280: Unknown result type (might be due to invalid IL or missing references)
			//IL_0285: Unknown result type (might be due to invalid IL or missing references)
			//IL_0286: Unknown result type (might be due to invalid IL or missing references)
			//IL_0287: Unknown result type (might be due to invalid IL or missing references)
			//IL_0298: 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_02c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02da: Unknown result type (might be due to invalid IL or missing references)
			//IL_02df: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ea: Expected O, but got Unknown
			//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0307: Unknown result type (might be due to invalid IL or missing references)
			//IL_030c: 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_0315: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0361: Unknown result type (might be due to invalid IL or missing references)
			base.OnEnter();
			dashVector = ((EntityState)this).inputBank.aimDirection;
			((EntityState)this).characterMotor.disableAirControlUntilCollision = false;
			Transform modelTransform = ((EntityState)this).GetModelTransform();
			Animator component = ((Component)modelTransform).GetComponent<Animator>();
			if (Object.op_Implicit((Object)(object)modelTransform) && Object.op_Implicit((Object)(object)SeamstressAssets.destealthMaterial))
			{
				TemporaryOverlay val = ((Component)component).gameObject.AddComponent<TemporaryOverlay>();
				val.duration = 1f;
				val.destroyComponentOnEnd = true;
				val.originalMaterial = SeamstressAssets.destealthMaterial;
				val.inspectorCharacterModel = ((Component)component).gameObject.GetComponent<CharacterModel>();
				val.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
				val.animateShaderAlpha = true;
			}
			attack = new OverlapAttack();
			attack.attacker = ((EntityState)this).gameObject;
			attack.inflictor = ((EntityState)this).gameObject;
			attack.damageType = (DamageType)32;
			attack.procCoefficient = 1f;
			attack.teamIndex = ((BaseState)this).GetTeam();
			attack.isCrit = ((BaseState)this).RollCrit();
			attack.forceVector = Vector3.up * 3000f;
			attack.damage = damageCoefficient * ((BaseState)this).damageStat;
			attack.hitBoxGroup = ((BaseState)this).FindHitBoxGroup(hitBoxString);
			attack.hitEffectPrefab = SeamstressAssets.scissorsHitImpactEffect;
			if (insatiable)
			{
				DamageAPI.AddModdedDamageType(attack, DamageTypes.CutDamage);
				DamageAPI.AddModdedDamageType(attack, DamageTypes.InsatiableLifeSteal);
			}
			EffectData val2 = new EffectData
			{
				origin = ((EntityState)this).characterBody.corePosition,
				rotation = Util.QuaternionSafeLookRotation(dashVector),
				scale = 3f
			};
			EffectManager.SpawnEffect(SeamstressAssets.impDashEffect, val2, false);
			EffectManager.SpawnEffect(SeamstressAssets.smallBlinkEffect, val2, false);
			((EntityState)this).PlayAnimation("FullBody, Override", "Roll", "Roll.playbackRate", baseDuration);
			((EntityState)this).characterMotor.velocity.y = 0f;
			CharacterMotor characterMotor = ((EntityState)this).characterMotor;
			characterMotor.velocity += dashVector * (dashPower * (((BaseState)this).moveSpeedStat + 1f));
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddBuff(Buffs.HiddenInvincibility);
			}
			Vector3 val3 = ((EntityState)this).transform.localPosition;
			RaycastHit val4 = default(RaycastHit);
			if (Physics.Raycast(val3, Vector3.one, ref val4, 10f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask)))
			{
				val3 = ((RaycastHit)(ref val4)).point;
			}
			EffectManager.SpawnEffect(SeamstressAssets.bloodSplatterEffect, new EffectData
			{
				origin = val3,
				rotation = Quaternion.identity,
				color = Color32.op_Implicit(SeamstressAssets.coolRed)
			}, false);
			seamCom.snapBackPosition = ((EntityState)this).characterBody.corePosition;
			Vector3 corePosition = ((EntityState)this).characterBody.corePosition;
			GameObject val5 = Object.Instantiate<GameObject>(projectilePrefab, corePosition, Quaternion.identity);
			ProjectileController component2 = val5.GetComponent<ProjectileController>();
			if (Object.op_Implicit((Object)(object)component2))
			{
				component2.owner = ((EntityState)this).gameObject;
				component2.Networkowner = ((EntityState)this).gameObject;
			}
			val5.GetComponent<TeamFilter>().teamIndex = ((EntityState)this).GetComponent<TeamComponent>().teamIndex;
		}

		public override void FixedUpdate()
		{
			//IL_001d: 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_00c1: 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_00d3: 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_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Expected O, but got Unknown
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			base.FixedUpdate();
			if (!((EntityState)this).isAuthority)
			{
				return;
			}
			((EntityState)this).characterDirection.forward = dashVector;
			((EntityState)this).characterBody.isSprinting = true;
			if (attack.Fire(victimsStruck))
			{
				hasHit = true;
				Transform val = ((BaseState)this).FindModelChild("UpperCut");
				if (Object.op_Implicit((Object)(object)val))
				{
					Object.Instantiate<GameObject>(uppercutEffect, val);
				}
				((EntityState)this).characterMotor.velocity = Vector3.zero;
				((BaseState)this).SmallHop(((EntityState)this).characterMotor, 4f);
				((EntityState)this).outer.SetNextStateToMain();
			}
			if (((EntityState)this).fixedAge >= baseDuration)
			{
				EffectData val2 = new EffectData
				{
					origin = ((EntityState)this).characterBody.corePosition,
					rotation = Util.QuaternionSafeLookRotation(dashVector),
					scale = 3f
				};
				EffectManager.SpawnEffect(SeamstressAssets.impDashEffect, val2, false);
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override void OnExit()
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			if (NetworkServer.active && Object.op_Implicit((Object)(object)((EntityState)this).healthComponent))
			{
				seamCom.inInsatiable = false;
				DotController.InflictDot(((Component)((EntityState)this).characterBody).gameObject, ((Component)((EntityState)this).characterBody).gameObject, Dots.SeamstressBleed, 6f, 1f, (uint?)1u);
			}
			if (!hasHit)
			{
				CharacterMotor characterMotor = ((EntityState)this).characterMotor;
				characterMotor.velocity *= 0.2f;
			}
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.RemoveBuff(Buffs.HiddenInvincibility);
				((EntityState)this).characterBody.AddTimedBuff(Buffs.HiddenInvincibility, 0.2f);
			}
			((EntityState)this).skillLocator.utility.SetSkillOverride((object)((EntityState)this).gameObject, SeamstressSurvivor.snapBackSkillDef, (SkillOverridePriority)4);
			((EntityState)this).OnExit();
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)3;
		}
	}
	public class HeartSpawnState : BaseState
	{
		public static float duration = 0.01f;

		public static string enterSoundString = "Play_bleedOnCritAndExplode_impact";

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			Util.PlaySound(enterSoundString, ((EntityState)this).gameObject);
			((Component)((BaseState)this).FindModelChild("ChargeUpFX")).gameObject.SetActive(true);
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (((EntityState)this).fixedAge >= duration)
			{
				((EntityState)this).outer.SetNextState((EntityState)(object)new HeartStandBy());
			}
		}
	}
	public class HeartStandBy : BaseState
	{
		public static GameObject chain = SeamstressAssets.chainToHeart;

		public static AnimationCurve yankSuitabilityCurve;

		private CharacterBody ownerBody;

		private SeamstressController seamCom;

		private GameObject owner;

		private TeamIndex teamIndex = (TeamIndex)(-1);

		private float snapBackDelay;

		private bool hasFired;

		private bool splat;

		private bool ownerIsEmpowered;

		public override void OnEnter()
		{
			//IL_0034: 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)
			((BaseState)this).OnEnter();
			splat = false;
			ProjectileController component = ((EntityState)this).GetComponent<ProjectileController>();
			if (Object.op_Implicit((Object)(object)component))
			{
				owner = component.owner;
				teamIndex = component.teamFilter.teamIndex;
			}
			((EntityState)this).PlayAnimation("Base", "SpawnToIdle");
			Util.PlaySound("Play_treeBot_R_yank", owner);
			seamCom = owner.GetComponent<SeamstressController>();
			ownerBody = owner.GetComponent<CharacterBody>();
			((Behaviour)chain.GetComponent<DestroyOnCondition>()).enabled = true;
			chain.GetComponent<DestroyOnCondition>().seamCom = seamCom;
		}

		public override void FixedUpdate()
		{
			//IL_0087: 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_009c: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).FixedUpdate();
			ownerIsEmpowered = ownerBody.HasBuff(SeamstressBuffs.instatiable);
			if (ownerIsEmpowered && !hasFired)
			{
				ChainUpdate(6f);
				hasFired = true;
			}
			if (!ownerIsEmpowered && ((EntityState)this).fixedAge > 1f)
			{
				if (!splat)
				{
					splat = true;
					Vector3 val = ownerBody.corePosition - ((EntityState)this).transform.position;
					snapBackDelay = ((Vector3)(ref val)).magnitude / 10f;
					snapBackDelay = Mathf.Clamp(snapBackDelay, 0.2f, 1f);
					((Behaviour)chain.GetComponent<DestroyOnCondition>()).enabled = false;
					ChainUpdate(snapBackDelay);
				}
				snapBackDelay -= Time.fixedDeltaTime;
				if (snapBackDelay <= 0.2f)
				{
					EntityState.Destroy((Object)(object)((EntityState)this).gameObject);
				}
			}
		}

		private void ChainUpdate(float num)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_001d: 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_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			Vector3 position = ((EntityState)this).transform.position;
			EffectData val = new EffectData
			{
				scale = 1f,
				origin = position,
				genericFloat = num
			};
			val.SetHurtBoxReference(owner);
			EffectManager.SpawnEffect(chain, val, false);
		}

		public override void OnExit()
		{
			if ((Object)(object)ownerBody != (Object)null)
			{
				ownerBody = null;
			}
			((EntityState)this).OnExit();
		}
	}
	public class MainState : GenericCharacterMain
	{
		private Animator animator;

		private SeamstressController seamCom;

		public override void OnEnter()
		{
			((GenericCharacterMain)this).OnEnter();
			animator = ((BaseCharacterMain)this).modelAnimator;
			seamCom = ((EntityState)this).GetComponent<SeamstressController>();
		}

		public override void ProcessJump()
		{
			//IL_0203: Unknown result type (might be due to invalid IL or missing references)
			//IL_0208: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0220: Expected O, but got Unknown
			//IL_0243: 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_024f: Unknown result type (might be due to invalid IL or missing references)
			//IL_025a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0271: Expected O, but got Unknown
			//IL_0285: 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)
			//IL_0291: Unknown result type (might be due to invalid IL or missing references)
			//IL_029c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Expected O, but got Unknown
			if (!((BaseCharacterMain)this).hasCharacterMotor || !seamCom.blinkReady)
			{
				return;
			}
			bool flag = false;
			bool flag2 = false;
			if (!base.jumpInputReceived || !Object.op_Implicit((Object)(object)((EntityState)this).characterBody) || ((EntityState)this).characterMotor.jumpCount >= ((EntityState)this).characterBody.maxJumpCount)
			{
				return;
			}
			int itemCount = ((EntityState)this).characterBody.inventory.GetItemCount(Items.JumpBoost);
			float num = 1f;
			float num2 = 1f;
			if (((EntityState)this).characterMotor.jumpCount >= ((EntityState)this).characterBody.baseJumpCount)
			{
				flag = true;
				num = 1.5f;
				num2 = 1.5f;
			}
			else if (itemCount > 0 && ((EntityState)this).characterBody.isSprinting)
			{
				float num3 = ((EntityState)this).characterBody.acceleration * ((EntityState)this).characterMotor.airControl;
				if (((EntityState)this).characterBody.moveSpeed > 0f && num3 > 0f)
				{
					flag2 = true;
					float num4 = Mathf.Sqrt(10f * (float)itemCount / num3);
					float num5 = ((EntityState)this).characterBody.moveSpeed / num3;
					num = (num4 + num5) / num5;
				}
			}
			GenericCharacterMain.ApplyJumpVelocity(((EntityState)this).characterMotor, ((EntityState)this).characterBody, num, num2, false);
			CharacterMotor characterMotor = ((EntityState)this).characterMotor;
			characterMotor.jumpCount++;
			if (((BaseCharacterMain)this).hasModelAnimator)
			{
				int layerIndex = ((BaseCharacterMain)this).modelAnimator.GetLayerIndex("Body");
				if (layerIndex >= 0)
				{
					if (((EntityState)this).characterMotor.jumpCount == 0)
					{
						((BaseCharacterMain)this).modelAnimator.CrossFadeInFixedTime("Jump", ((BaseCharacterMain)this).smoothingParameters.intoJumpTransitionTime, layerIndex);
					}
					else
					{
						((BaseCharacterMain)this).modelAnimator.CrossFadeInFixedTime("BonusJump", ((BaseCharacterMain)this).smoothingParameters.intoJumpTransitionTime, layerIndex);
					}
				}
			}
			if (flag)
			{
				EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/FeatherEffect"), new EffectData
				{
					origin = ((EntityState)this).characterBody.footPosition
				}, false);
			}
			else if (((EntityState)this).characterMotor.jumpCount > 0)
			{
				EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/ImpactEffects/CharacterLandImpact"), new EffectData
				{
					origin = ((EntityState)this).characterBody.footPosition,
					scale = ((EntityState)this).characterBody.radius
				}, false);
			}
			if (flag2)
			{
				EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/BoostJumpEffect"), new EffectData
				{
					origin = ((EntityState)this).characterBody.footPosition,
					rotation = Util.QuaternionSafeLookRotation(((EntityState)this).characterMotor.velocity)
				}, false);
			}
		}
	}
	public class Parry : BaseSeamstressSkillState
	{
		public static NetworkSoundEventDef parrySoundDef = SeamstressAssets.parrySuccessSoundEvent;

		private GameObject blinkPrefab;

		public static string enterSoundString = "Play_bandit2_m2_impact";

		public static float duration = 0.4f;

		public static float attackDelay = 0.4f;

		public static float invulnDuration = 0.5f;

		public override void OnEnter()
		{
			base.OnEnter();
			Util.PlaySound(enterSoundString, ((EntityState)this).gameObject);
			if (NetworkServer.active)
			{
				CleanBuffsServer();
				((EntityState)this).characterBody.AddBuff(SeamstressBuffs.parryStart);
			}
			((EntityState)this).PlayAnimation("FullBody, Override", "Roll", "Roll.playbackRate", duration);
		}

		public override void FixedUpdate()
		{
			base.FixedUpdate();
			bool flag = ((EntityState)this).characterBody.HasBuff(SeamstressBuffs.parrySuccess);
			if (((EntityState)this).isAuthority && ((EntityState)this).fixedAge >= duration && flag)
			{
				blinkPrefab = SeamstressAssets.blinkEffect;
				DoAttackServer();
				((EntityState)this).outer.SetNextState((EntityState)(object)new ParryDash());
			}
			else if (((EntityState)this).isAuthority && ((EntityState)this).fixedAge >= duration && !flag)
			{
				GenericSkill utility = ((EntityState)this).skillLocator.utility;
				utility.rechargeStopwatch += 0.5f * ((EntityState)this).skillLocator.utility.cooldownRemaining;
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

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

		private void CleanBuffsServer()
		{
			if (NetworkServer.active)
			{
				if (((EntityState)this).characterBody.HasBuff(SeamstressBuffs.parryStart))
				{
					((EntityState)this).characterBody.RemoveBuff(SeamstressBuffs.parryStart);
				}
				if (((EntityState)this).characterBody.HasBuff(SeamstressBuffs.parrySuccess))
				{
					((EntityState)this).characterBody.RemoveBuff(SeamstressBuffs.parrySuccess);
				}
			}
		}

		private void DoAttackServer()
		{
			//IL_0055: 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)
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddTimedBuff(SeamstressBuffs.instatiable, 6f, 1);
				SeamstressController component = ((Component)((EntityState)this).characterBody).GetComponent<SeamstressController>();
				component.inInsatiable = false;
				CleanBuffsServer();
				if (Object.op_Implicit((Object)(object)parrySoundDef))
				{
					EffectManager.SimpleSoundEffect(parrySoundDef.index, ((EntityState)this).characterBody.corePosition, false);
				}
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)6;
		}
	}
	public class ParryDash : BaseSeamstressSkillState
	{
		public static GameObject hitEffectPrefab = SeamstressAssets.scissorsHitImpactEffect;

		public static float speedCoefficient = 100f;

		public static float damageCoefficient = 4f;

		public static float hitPauseDuration = 0.075f;

		private Vector3 dashVector;

		private OverlapAttack overlapAttack;

		private ChildLocator childLocator;

		private Transform modelTransform;

		private AimRequest aimRequest;

		private float stopwatch;

		private float dashDuration;

		private bool isDashing;

		private bool inHitPause;

		private float hitPauseTimer;

		private bool noScissors;

		private string hitSound;

		private string hitBox;

		public bool hasHit { get; private set; }

		public override void OnEnter()
		{
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			inDash = true;
			dashDuration = 0.3f;
			base.OnEnter();
			RefreshState();
			modelTransform = ((EntityState)this).GetModelTransform();
			childLocator = ((Component)modelTransform).GetComponent<ChildLocator>();
			if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams))
			{
				aimRequest = ((EntityState)this).cameraTargetParams.RequestAimType((AimType)2);
			}
			dashVector = ((EntityState)this).inputBank.aimDirection;
			if (!scissorRight && !scissorLeft)
			{
				noScissors = true;
			}
			if (noScissors)
			{
				hitBox = "Weave";
			}
			else
			{
				hitBox = "WeaveBig";
			}
			overlapAttack = ((BaseState)this).InitMeleeOverlap(0f, hitEffectPrefab, modelTransform, hitBox);
			DamageAPI.AddModdedDamageType(overlapAttack, DamageTypes.PullDamage);
			overlapAttack.damageType = (DamageType)32;
			Util.PlaySound("Play_imp_overlord_attack2_tell", ((EntityState)this).gameObject);
			hitSound = "Play_imp_overlord_impact";
			((EntityState)this).PlayAnimation("FullBody, Override", "Roll", "Roll.playbackRate", dashDuration);
		}

		public override void FixedUpdate()
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			base.FixedUpdate();
			((EntityState)this).characterDirection.forward = dashVector;
			if (!isDashing)
			{
				isDashing = true;
				dashVector = ((EntityState)this).inputBank.aimDirection;
				seamCom.heldDashVector = dashVector;
				seamCom.heldOrigin = Util.GetCorePosition(((EntityState)this).gameObject);
				((EntityState)this).gameObject.layer = LayerIndex.fakeActor.intVal;
				((BaseCharacterController)((EntityState)this).characterMotor).Motor.RebuildCollidableLayers();
			}
			if (!isDashing)
			{
				stopwatch += Time.fixedDeltaTime;
			}
			else if (((EntityState)this).isAuthority)
			{
				if (!inHitPause)
				{
					bool flag = overlapAttack.Fire((List<HurtBox>)null);
					stopwatch += Time.fixedDeltaTime;
					if (flag)
					{
						if (!hasHit)
						{
							Util.PlaySound(hitSound, ((EntityState)this).gameObject);
							hasHit = true;
							dashDuration *= 0.75f;
						}
						inHitPause = true;
						hitPauseTimer = hitPauseDuration / ((BaseState)this).attackSpeedStat;
					}
					CharacterMotor characterMotor = ((EntityState)this).characterMotor;
					characterMotor.rootMotion += dashVector * speedCoefficient * Time.fixedDeltaTime;
				}
				else
				{
					hitPauseTimer -= Time.fixedDeltaTime;
					if (hitPauseTimer < 0f)
					{
						inHitPause = false;
					}
				}
			}
			if (stopwatch >= dashDuration / ((BaseState)this).attackSpeedStat && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override void OnExit()
		{
			//IL_0080: 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_008f: Unknown result type (might be due to invalid IL or missing references)
			seamCom.StartDashEffectTimer();
			((EntityState)this).gameObject.layer = LayerIndex.defaultLayer.intVal;
			((BaseCharacterController)((EntityState)this).characterMotor).Motor.RebuildCollidableLayers();
			if (!insatiable)
			{
				Util.PlaySound("Play_item_proc_whip", ((EntityState)this).gameObject);
			}
			if (((EntityState)this).isAuthority)
			{
				((EntityState)this).characterMotor.disableAirControlUntilCollision = false;
				((EntityState)this).characterMotor.airControl = 0.25f;
				CharacterMotor characterMotor = ((EntityState)this).characterMotor;
				characterMotor.velocity *= 0.3f;
				((BaseState)this).SmallHop(((EntityState)this).characterMotor, 3f);
			}
			AimRequest obj = aimRequest;
			if (obj != null)
			{
				obj.Dispose();
			}
			inDash = false;
			RefreshState();
			((EntityState)this).OnExit();
		}

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

		public override void OnDeserialize(NetworkReader reader)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			((BaseSkillState)this).OnDeserialize(reader);
			dashVector = reader.ReadVector3();
		}

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

		protected GameObject dashPrefab = SeamstressAssets.impDashEffect;

		protected GameObject blinkPrefab = SeamstressAssets.smallBlinkEffect;

		protected AimRequest request;

		protected Vector3 blinkVector;

		public static float duration = 0.2f;

		protected float speedCoefficient;

		public static string beginSoundString = "Play_imp_attack_blink";

		protected CharacterModel characterModel;

		protected HurtBoxGroup hurtboxGroup;

		public bool split;

		protected Animator animator;

		public override void OnEnter()
		{
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			base.OnEnter();
			Util.PlaySound(beginSoundString, ((EntityState)this).gameObject);
			((EntityState)this).PlayAnimation("FullBody, Override", "Roll", "Roll.playbackRate", duration);
			modelTransform = ((EntityState)this).GetModelTransform();
			if (Object.op_Implicit((Object)(object)modelTransform))
			{
				characterModel = ((Component)modelTransform).GetComponent<CharacterModel>();
				hurtboxGroup = ((Component)modelTransform).GetComponent<HurtBoxGroup>();
				animator = ((Component)modelTransform).GetComponent<Animator>();
			}
			if (Object.op_Implicit((Object)(object)characterModel))
			{
				CharacterModel obj = characterModel;
				obj.invisibilityCount++;
			}
			if (Object.op_Implicit((Object)(object)hurtboxGroup))
			{
				HurtBoxGroup val = hurtboxGroup;
				int hurtBoxesDeactivatorCounter = val.hurtBoxesDeactivatorCounter + 1;
				val.hurtBoxesDeactivatorCounter = hurtBoxesDeactivatorCounter;
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams))
			{
				request = ((EntityState)this).cameraTargetParams.RequestAimType((AimType)2);
			}
			blinkVector = GetBlinkVector();
			if (((Vector3)(ref blinkVector)).sqrMagnitude < Mathf.Epsilon)
			{
				blinkVector = ((EntityState)this).inputBank.aimDirection;
			}
			if (((EntityState)this).characterMotor.isGrounded)
			{
				((EntityState)this).characterMotor.velocity = Vector3.zero;
			}
			((EntityState)this).characterDirection.moveVector = blinkVector;
			CreateBlinkEffect(((EntityState)this).characterBody.corePosition, first: true);
			speedCoefficient = 0.3f * ((EntityState)this).characterBody.jumpPower * Mathf.Clamp(((EntityState)this).characterBody.moveSpeed, 1f, 5f);
			((EntityState)this).gameObject.layer = LayerIndex.fakeActor.intVal;
			((BaseCharacterController)((EntityState)this).characterMotor).Motor.RebuildCollidableLayers();
		}

		protected virtual Vector3 GetBlinkVector()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: 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_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: 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_0062: 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_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_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			Vector3 aimDirection = ((EntityState)this).inputBank.aimDirection;
			aimDirection.y = 0f;
			Vector3 val = -Vector3.Cross(Vector3.up, aimDirection);
			float num = Vector3.Angle(((EntityState)this).inputBank.aimDirection, aimDirection);
			if (((EntityState)this).inputBank.aimDirection.y < 0f)
			{
				num = 0f - num;
			}
			return Vector3.Normalize(Quaternion.AngleAxis(num, val) * ((EntityState)this).inputBank.moveVector);
		}

		protected void CreateBlinkEffect(Vector3 origin, bool first)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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)
			if (Object.op_Implicit((Object)(object)blinkPrefab))
			{
				EffectData val = new EffectData();
				val.rotation = Util.QuaternionSafeLookRotation(blinkVector);
				val.origin = origin;
				val.scale = 0.15f;
				EffectManager.SpawnEffect(blinkPrefab, val, false);
				val.scale = 3f;
				if (!first)
				{
					EffectManager.SpawnEffect(dashPrefab, val, false);
				}
			}
		}

		public override void FixedUpdate()
		{
			//IL_0048: 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_0058: Unknown result type (might be due to invalid IL or missing references)
			base.FixedUpdate();
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection) && ((EntityState)this).isAuthority)
			{
				((BaseCharacterController)((EntityState)this).characterMotor).Motor.ForceUnground();
				((EntityState)this).characterMotor.velocity = blinkVector * speedCoefficient;
			}
			if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override void OnExit()
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).gameObject.layer = LayerIndex.defaultLayer.intVal;
			((BaseCharacterController)((EntityState)this).characterMotor).Motor.RebuildCollidableLayers();
			if (!((EntityState)this).outer.destroying)
			{
				CreateBlinkEffect(((EntityState)this).characterBody.corePosition, first: false);
				modelTransform = ((EntityState)this).GetModelTransform();
				if (Object.op_Implicit((Object)(object)modelTransform) && Object.op_Implicit((Object)(object)SeamstressAssets.destealthMaterial))
				{
					TemporaryOverlay val = ((Component)animator).gameObject.AddComponent<TemporaryOverlay>();
					val.duration = 1f;
					val.destroyComponentOnEnd = true;
					val.originalMaterial = SeamstressAssets.destealthMaterial;
					val.inspectorCharacterModel = ((Component)animator).gameObject.GetComponent<CharacterModel>();
					val.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
					val.animateShaderAlpha = true;
				}
				if (Object.op_Implicit((Object)(object)characterModel))
				{
					CharacterModel obj = characterModel;
					obj.invisibilityCount--;
				}
				if (Object.op_Implicit((Object)(object)hurtboxGroup))
				{
					HurtBoxGroup val2 = hurtboxGroup;
					int hurtBoxesDeactivatorCounter = val2.hurtBoxesDeactivatorCounter - 1;
					val2.hurtBoxesDeactivatorCounter = hurtBoxesDeactivatorCounter;
				}
				if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams))
				{
					request.Dispose();
				}
			}
			((EntityState)this).OnExit();
		}

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

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

		public override void OnDeserialize(NetworkReader reader)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			((BaseSkillState)this).OnDeserialize(reader);
			blinkVector = reader.ReadVector3();
		}
	}
	public class SeamstressBlinkUp : SeamstressBlink
	{
		public override void OnEnter()
		{
			//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)
			base.OnEnter();
			speedCoefficient = 0.3f * ((EntityState)this).characterBody.jumpPower * 3f;
			blinkVector = Vector3.up;
		}

		public override void FixedUpdate()
		{
			base.FixedUpdate();
		}

		public override void OnExit()
		{
			base.OnExit();
		}

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

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

		public override void OnDeserialize(NetworkReader reader)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			base.OnDeserialize(reader);
			blinkVector = reader.ReadVector3();
		}
	}
	public class SeamstressJump : BaseSeamstressState
	{
		public float minSpread;

		public float maxSpread;

		public float projectilePitchBonus;

		private Ray aimRay;

		private GameObject projectilePrefab;

		public override void OnEnter()
		{
			base.OnEnter();
		}

		public override void FixedUpdate()
		{
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Unknown result type (might be due to invalid IL or missing refer