Decompiled source of ChirrAltSkills v0.0.2

ChirrAltSkills.dll

Decompiled 4 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using AncientScepter;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using ChirrAltSkills;
using ChirrAltSkills.Chirr;
using ChirrAltSkills.Chirr.SkillDefs;
using ChirrAltSkills.Chirr.SkillDefs.Passive;
using ChirrAltSkills.Chirr.SkillDefs.Special;
using ChirrAltSkills.Chirr.SkillDefs.TargetableSkillDef;
using ChirrAltSkills.Chirr.States;
using ChirrAltSkills.Chirr.States.CharacterMains;
using ChirrAltSkills.Chirr.States.Primary;
using ChirrAltSkills.Chirr.States.Special;
using DiggerPlugin;
using EntityStates;
using EntityStates.Commando.CommandoWeapon;
using EntityStates.GummyClone;
using EntityStates.Mage;
using EntityStates.SS2UStates.Chirr;
using HG;
using HG.Reflection;
using JetBrains.Annotations;
using On.RoR2;
using R2API;
using R2API.Networking;
using R2API.Networking.Interfaces;
using RoR2;
using RoR2.Skills;
using Starstorm2Unofficial.Survivors.Chirr;
using Starstorm2Unofficial.Survivors.Chirr.Components;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: OptIn]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("ChirrAltSkills")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+459ca2f2a3065e0b85241076a402e1d93d2f9aa0")]
[assembly: AssemblyProduct("ChirrAltSkills")]
[assembly: AssemblyTitle("ChirrAltSkills")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
internal static class ChirrSetupHelpers
{
	public static void AddToSkillFamily(SkillDef skillDef, SkillFamily skillFamily, UnlockableDef unlockableDef = null)
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Expected O, but got Unknown
		ref Variant[] variants = ref skillFamily.variants;
		Variant val = new Variant
		{
			skillDef = skillDef
		};
		((Variant)(ref val)).viewableNode = new Node(skillDef.skillNameToken, false, (Node)null);
		val.unlockableDef = unlockableDef;
		ArrayUtils.ArrayAppend<Variant>(ref variants, ref val);
	}

	public static void CopySkillDefFields(SkillDef parent, SkillDef child, bool copyIdentifiers)
	{
		//IL_007c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_0100: Unknown result type (might be due to invalid IL or missing references)
		//IL_0105: Unknown result type (might be due to invalid IL or missing references)
		if (!Object.op_Implicit((Object)(object)parent) && Object.op_Implicit((Object)(object)child))
		{
			Debug.LogError((object)("Attempted to call CopySkillDefFields with no parent! Child: " + child.skillName));
		}
		if (!Object.op_Implicit((Object)(object)child) && Object.op_Implicit((Object)(object)parent))
		{
			Debug.LogError((object)("Attempted to call CopySkillDefFields with no child! Parent: " + parent.skillName));
		}
		if (!Object.op_Implicit((Object)(object)child) && !Object.op_Implicit((Object)(object)parent))
		{
			Debug.LogError((object)"Attempted to call CopySkillDefFields with no child or parent!!!");
		}
		child.activationState = parent.activationState;
		child.activationStateMachineName = parent.activationStateMachineName;
		child.baseMaxStock = parent.baseMaxStock;
		child.baseRechargeInterval = parent.baseRechargeInterval;
		child.beginSkillCooldownOnSkillEnd = parent.beginSkillCooldownOnSkillEnd;
		child.canceledFromSprinting = parent.canceledFromSprinting;
		child.cancelSprintingOnActivation = parent.cancelSprintingOnActivation;
		child.dontAllowPastMaxStocks = parent.dontAllowPastMaxStocks;
		child.forceSprintDuringState = parent.forceSprintDuringState;
		child.fullRestockOnAssign = parent.fullRestockOnAssign;
		child.icon = parent.icon;
		child.interruptPriority = parent.interruptPriority;
		child.isCombatSkill = parent.isCombatSkill;
		child.keywordTokens = parent.keywordTokens;
		child.mustKeyPress = parent.mustKeyPress;
		child.rechargeStock = parent.rechargeStock;
		child.requiredStock = parent.requiredStock;
		child.resetCooldownTimerOnUse = parent.resetCooldownTimerOnUse;
		if (copyIdentifiers)
		{
			child.skillDescriptionToken = parent.skillDescriptionToken;
			child.skillName = parent.skillName;
			child.skillNameToken = parent.skillNameToken;
		}
		child.stockToConsume = parent.stockToConsume;
	}

	public static T CreateSkillDef<T>(string token, bool setDefaultStateToIdle = true) where T : AssignableSkillDef
	{
		//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)
		Debug.Log((object)token);
		T val = ScriptableObject.CreateInstance<T>();
		((SkillDef)val).skillName = token;
		((Object)val).name = token;
		((SkillDef)val).skillNameToken = token + "_NAME";
		((SkillDef)val).skillDescriptionToken = token + "_DESC";
		if (setDefaultStateToIdle)
		{
			((SkillDef)val).activationState = new SerializableEntityStateType(typeof(Idle));
		}
		return val;
	}

	public static ChirrTargetableSkillDef CreateTargetableSkillDef(string token)
	{
		return CreateSkillDef(token) as ChirrTargetableSkillDef;
	}

	public static SkillDef CreateSkillDef(string token)
	{
		SkillDef val = ScriptableObject.CreateInstance<SkillDef>();
		val.skillName = token;
		((Object)val).name = token;
		val.skillNameToken = token + "_NAME";
		val.skillDescriptionToken = token + "_DESC";
		return val;
	}

	public static SkillDef CreateSkillDef(string token, SkillFamily family, UnlockableDef unlockableDef = null)
	{
		SkillDef val = CreateSkillDef(token);
		AddToSkillFamily(val, family, unlockableDef);
		return val;
	}
}
namespace ChirrAltSkills
{
	public static class Assets
	{
		public static class ChirrAssets
		{
			public static Sprite passiveStageBuffIcon;

			public static Sprite passiveSnackiesPerStageIcon;

			public static Sprite passiveBunnyIcon;

			public static Sprite passiveSoulmateIcon;

			public static Sprite passiveDiggerIcon;

			public static Sprite primaryLeafBladeIcon;

			public static Sprite secondaryHeadbuttWeakenIcon;

			public static Sprite specialTFIcon;

			public static Sprite specialTransformScepterIcon;

			public static Sprite specialEatIcon;

			public static Sprite specialEatScepterIcon;

			public static Sprite buffIndulgenceIcon;

			public static Sprite buffSnackiesIcon;

			public static Sprite buffSoulmateIcon;

			public static Sprite buffAdrenalineIcon;

			public static Sprite buffHoverDurationIcon;

			public static Sprite buffBunnyJumpIcon;

			public static Sprite LoadSprite(string path)
			{
				return mainAssetBundle.LoadAsset<Sprite>(path);
			}

			public static void Init()
			{
				passiveStageBuffIcon = LoadSprite("PassiveStageBuffIcon");
				passiveSnackiesPerStageIcon = LoadSprite("PassiveSnackiesPerStageIcon");
				passiveBunnyIcon = LoadSprite("PassiveBunnyIcon");
				passiveSoulmateIcon = LoadSprite("PassiveSoulmateIcon");
				passiveDiggerIcon = LoadSprite("PassiveDiggerIcon");
				specialTFIcon = LoadSprite("SpecialTransformEnemyIcon");
				specialTransformScepterIcon = LoadSprite("SpecialTransformEnemyScepterIcon");
				specialEatIcon = LoadSprite("SpecialEatEnemyIcon");
				specialEatScepterIcon = LoadSprite("SpecialEatEnemyScepterIcon");
				buffSnackiesIcon = LoadSprite("BuffSnackiesIcon");
				buffIndulgenceIcon = buffSnackiesIcon;
				buffSoulmateIcon = LoadSprite("BuffSoulmateIcon");
				buffAdrenalineIcon = LoadSprite("BuffAdrenalineIcon");
				buffHoverDurationIcon = LoadSprite("BuffHoverDurationIcon");
				buffBunnyJumpIcon = LoadSprite("BuffBunnyJumpIcon");
			}
		}

		public static AssetBundle mainAssetBundle;

		public const string bundleName = "chirraltskillsassetbundle";

		public static string AssetBundlePath => Path.Combine(Path.GetDirectoryName(CASPlugin.PInfo.Location), "chirraltskillsassetbundle");

		public static T LoadAddressable<T>(string path)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			return Addressables.LoadAssetAsync<T>((object)path).WaitForCompletion();
		}

		public static void Init()
		{
			PopulateAssets();
			ChirrAssets.Init();
		}

		public static void PopulateAssets()
		{
			mainAssetBundle = AssetBundle.LoadFromFile(AssetBundlePath);
		}
	}
	public class AssignableSkillDef : SkillDef
	{
		public Func<GenericSkill, BaseSkillInstanceData> onAssign;

		public Action<GenericSkill> onUnassign;

		public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot)
		{
			return onAssign?.Invoke(skillSlot);
		}

		public override void OnUnassigned(GenericSkill skillSlot)
		{
			((SkillDef)this).OnUnassigned(skillSlot);
			onUnassign?.Invoke(skillSlot);
		}
	}
	internal class Buffs
	{
		public static BuffDef indulgenceBuff;

		public static BuffDef snackiesBuff;

		public static BuffDef soulmateBuff;

		public static BuffDef adrenalineBuff;

		public static BuffDef hoverDurationIndicatorBuff;

		public static BuffDef bunnyJumpBuff;

		public static void Init()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			CreateBuffs();
			RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
		}

		private static void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
		{
			int buffCount = sender.GetBuffCount(snackiesBuff);
			int buffCount2 = sender.GetBuffCount(indulgenceBuff);
			int num = buffCount + buffCount2;
			if (num > 0)
			{
				args.armorAdd += 0.005f * (float)num;
				args.attackSpeedMultAdd -= 0.003f * (float)num;
				args.baseHealthAdd += (float)(15 * num);
				args.jumpPowerMultAdd -= 0.001f * (float)num;
				args.moveSpeedReductionMultAdd += 0.005f * (float)num;
				sender.characterMotor.mass = ChirrSetup.cachedMass + ChirrSetup.cachedMass / 10f * (float)num;
			}
			int buffCount3 = sender.GetBuffCount(soulmateBuff);
			if (buffCount3 > 0)
			{
				args.armorAdd += 5f * (float)buffCount3;
				args.baseRegenAdd += 0.5f * (float)buffCount3;
				args.healthMultAdd += 0.1f * (float)buffCount3;
			}
			int buffCount4 = sender.GetBuffCount(bunnyJumpBuff);
			if (buffCount4 > 0)
			{
				args.jumpPowerMultAdd += 0.1f * (float)buffCount4;
			}
		}

		public static void CreateBuffs()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Unknown result type (might be due to invalid IL or missing references)
			//IL_0222: Expected O, but got Unknown
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Expected O, but got Unknown
			//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_02d0: 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)
			snackiesBuff = ScriptableObject.CreateInstance<BuffDef>();
			((Object)snackiesBuff).name = "DCSS2UChirrSnackies";
			snackiesBuff.buffColor = new Color(0.98f, 0.376f, 0f);
			snackiesBuff.canStack = true;
			snackiesBuff.iconSprite = Assets.ChirrAssets.buffSnackiesIcon;
			snackiesBuff.isCooldown = false;
			snackiesBuff.isDebuff = false;
			snackiesBuff.isHidden = false;
			ContentAddition.AddBuffDef(snackiesBuff);
			indulgenceBuff = ScriptableObject.CreateInstance<BuffDef>();
			((Object)indulgenceBuff).name = "DCSS2UChirrIndulgence";
			indulgenceBuff.buffColor = new Color(0.69f, 0.104f, 0.104f);
			indulgenceBuff.iconSprite = Assets.ChirrAssets.buffIndulgenceIcon;
			indulgenceBuff.canStack = true;
			indulgenceBuff.isCooldown = false;
			indulgenceBuff.isDebuff = false;
			indulgenceBuff.isHidden = false;
			ContentAddition.AddBuffDef(indulgenceBuff);
			soulmateBuff = ScriptableObject.CreateInstance<BuffDef>();
			((Object)soulmateBuff).name = "DCSS2UChirrComfortingPresence";
			soulmateBuff.buffColor = new Color(0.351f, 0.77f, 0.246f);
			soulmateBuff.iconSprite = Assets.ChirrAssets.buffSoulmateIcon;
			soulmateBuff.canStack = true;
			soulmateBuff.isCooldown = false;
			soulmateBuff.isDebuff = false;
			soulmateBuff.isHidden = false;
			ContentAddition.AddBuffDef(soulmateBuff);
			if (CASPlugin.modloaded_Digger)
			{
				BuffCatalog.Init += new hook_Init(GetDiggerGoldRush);
			}
			else
			{
				adrenalineBuff = ScriptableObject.CreateInstance<BuffDef>();
				((Object)adrenalineBuff).name = "DCSS2UChirrAdrenaline";
				adrenalineBuff.buffColor = new Color(0.753f, 0.77f, 0.246f);
				adrenalineBuff.iconSprite = Assets.ChirrAssets.buffAdrenalineIcon;
				adrenalineBuff.canStack = true;
				adrenalineBuff.isCooldown = false;
				adrenalineBuff.isDebuff = false;
				adrenalineBuff.isHidden = false;
				RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(ChirrGoldRushRecalcStats);
			}
			hoverDurationIndicatorBuff = ScriptableObject.CreateInstance<BuffDef>();
			((Object)hoverDurationIndicatorBuff).name = "DCSS2UChirrHoverDurationRemaining";
			hoverDurationIndicatorBuff.buffColor = new Color(0.351f, 0.77f, 0.246f);
			hoverDurationIndicatorBuff.iconSprite = Assets.ChirrAssets.buffHoverDurationIcon;
			hoverDurationIndicatorBuff.canStack = true;
			hoverDurationIndicatorBuff.isCooldown = false;
			hoverDurationIndicatorBuff.isDebuff = false;
			hoverDurationIndicatorBuff.isHidden = false;
			ContentAddition.AddBuffDef(hoverDurationIndicatorBuff);
			bunnyJumpBuff = ScriptableObject.CreateInstance<BuffDef>();
			((Object)bunnyJumpBuff).name = "DCSS2UChirrBunnyJumpBoost";
			bunnyJumpBuff.buffColor = new Color(0.351f, 0.77f, 0.246f);
			bunnyJumpBuff.iconSprite = Assets.ChirrAssets.buffBunnyJumpIcon;
			bunnyJumpBuff.canStack = true;
			bunnyJumpBuff.isCooldown = false;
			bunnyJumpBuff.isDebuff = false;
			bunnyJumpBuff.isHidden = false;
			ContentAddition.AddBuffDef(bunnyJumpBuff);
		}

		private static void ChirrGoldRushRecalcStats(CharacterBody sender, StatHookEventArgs args)
		{
			int buffCount = sender.GetBuffCount(adrenalineBuff);
			if (buffCount > 0)
			{
				args.attackSpeedMultAdd += 0.1f * (float)buffCount;
				args.baseMoveSpeedAdd += 0.15f * (float)buffCount;
				args.baseRegenAdd += 0.25f * (float)buffCount;
			}
		}

		private static void GetDiggerGoldRush(orig_Init orig)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke();
			adrenalineBuff = BuffCatalog.GetBuffDef(BuffCatalog.FindBuffIndex("GoldRush"));
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.DestroyedClone.ChirrAltSkills", "ChirrSS2U Alt Skills", "0.0.2")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class CASPlugin : BaseUnityPlugin
	{
		internal static ManualLogSource _logger;

		internal static ConfigFile _config;

		internal const string LastDllVersion = "0.16.4";

		public static bool modloaded_Digger;

		public static bool modloaded_ClassicItems;

		public static bool modloaded_Scepter;

		public static PluginInfo PInfo { get; set; }

		public void Awake()
		{
			PInfo = ((BaseUnityPlugin)this).Info;
			_logger = ((BaseUnityPlugin)this).Logger;
			_config = ((BaseUnityPlugin)this).Config;
			modloaded_Digger = Chainloader.PluginInfos.ContainsKey("com.rob.DiggerUnearthed");
			modloaded_ClassicItems = Chainloader.PluginInfos.ContainsKey("com.ThinkInvisible.ClassicItems");
			modloaded_Scepter = Chainloader.PluginInfos.ContainsKey("com.DestroyedClone.AncientScepter");
			ConfigSetup.Init();
			Assets.Init();
			Buffs.Init();
			DamageTypes.Init();
			ChirrSetup.Init();
			ChirrCommands.AddChatCommands();
			Networking.Init();
		}
	}
	internal class ConfigSetup
	{
		public static ConfigEntry<bool> cfgEnablePassiveStageBuff;

		public static ConfigEntry<bool> cfgEnablePassiveSnackies;

		public static ConfigEntry<bool> cfgEnablePassiveBunny;

		public static ConfigEntry<bool> cfgEnablePassiveSoulmate;

		public static ConfigEntry<bool> cfgEnablePassiveDigger;

		public static ConfigEntry<bool> cfgEnablePrimaryDoubleTap;

		public static ConfigEntry<bool> cfgEnableSpecialTransform;

		public static ConfigEntry<bool> cfgEnableSpecialEat;

		private const string desc = "Enable this skill for usage.";

		public static void Init()
		{
			cfgEnablePassiveStageBuff = CASPlugin._config.Bind<bool>("Passive", "Stage Buff", true, "Enable this skill for usage.");
			cfgEnablePassiveSnackies = CASPlugin._config.Bind<bool>("Passive", "Snackies", true, "Enable this skill for usage.");
			cfgEnablePassiveBunny = CASPlugin._config.Bind<bool>("Passive", "Bunny", true, "Enable this skill for usage.");
			cfgEnablePassiveSoulmate = CASPlugin._config.Bind<bool>("Passive", "Soulmate", true, "Enable this skill for usage.");
			cfgEnablePassiveDigger = CASPlugin._config.Bind<bool>("Passive", "Digger", true, "Enable this skill for usage.");
			cfgEnablePrimaryDoubleTap = CASPlugin._config.Bind<bool>("Primary", "Double Tap", true, "Enable this skill for usage.");
			cfgEnableSpecialTransform = CASPlugin._config.Bind<bool>("Special", "Transform", true, "Enable this skill for usage.");
			cfgEnableSpecialEat = CASPlugin._config.Bind<bool>("Special", "Eat", true, "Enable this skill for usage.");
		}
	}
	internal class DamageTypes
	{
		public static ModdedDamageType chirrChompDT;

		public static void Init()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			chirrChompDT = DamageAPI.ReserveDamageType();
			GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal;
		}

		private static void GlobalEventManager_onCharacterDeathGlobal(DamageReport dr)
		{
			//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_002d: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)dr.attacker) && dr.attackerBodyIndex == ChirrCore.bodyIndex && DamageAPI.HasModdedDamageType(dr.damageInfo, chirrChompDT))
			{
				EatEnemy(dr);
			}
		}

		private static void EatEnemy(DamageReport damageReport)
		{
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Expected O, but got Unknown
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			float num = damageReport.combinedHealthBeforeDamage / damageReport.victimBody.healthComponent.fullCombinedHealth;
			float num2 = num * 100f;
			float num3 = 10f + 1f * num2 * 0.5f;
			int num4 = Mathf.CeilToInt(num2 * 0.5f);
			for (int i = 0; i < num4; i++)
			{
				damageReport.attackerBody.AddTimedBuff(Buffs.snackiesBuff, num3);
			}
			int buffCount = damageReport.victimBody.GetBuffCount(Buffs.snackiesBuff);
			buffCount += damageReport.victimBody.GetBuffCount(Buffs.indulgenceBuff);
			float num5 = 10f;
			for (int j = 0; j < buffCount; j++)
			{
				damageReport.attackerBody.AddTimedBuff(Buffs.snackiesBuff, num5);
			}
			EffectData val = new EffectData
			{
				origin = damageReport.attackerBody.corePosition
			};
			val.SetNetworkedObjectReference(damageReport.attacker);
			EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/FruitHealEffect"), val, true);
			damageReport.attackerBody.healthComponent.HealFraction(num, default(ProcChainMask));
		}
	}
	public class Networking
	{
		public class SendToClient_ChirrStatInfo : INetMessage, ISerializableObject
		{
			public NetworkInstanceId targetNetId;

			private const string formatToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_1";

			private const string armorToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ARMOR";

			public float armor;

			private const string attackspeedToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ATTACKSPEED";

			public float attackspeed;

			private const string movespeedToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_MOVESPEED";

			public float movespeed;

			private const string regenToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_REGEN";

			public float regen;

			private const string hoverToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_HOVER";

			public float hover;

			public SendToClient_ChirrStatInfo()
			{
			}

			public SendToClient_ChirrStatInfo(NetworkInstanceId targetNetId, float armor, float movespeed, float attackspeed, float regen, float hover)
			{
				//IL_0009: Unknown result type (might be due to invalid IL or missing references)
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				this.targetNetId = targetNetId;
				this.armor = armor;
				this.movespeed = movespeed;
				this.attackspeed = attackspeed;
				this.regen = regen;
				this.hover = hover;
			}

			public void Deserialize(NetworkReader reader)
			{
				//IL_0003: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				targetNetId = reader.ReadNetworkId();
				armor = reader.ReadSingle();
				movespeed = reader.ReadSingle();
				attackspeed = reader.ReadSingle();
				regen = reader.ReadSingle();
				hover = reader.ReadSingle();
			}

			public void OnReceived()
			{
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				if (!(((NetworkBehaviour)LocalUserManager.GetFirstLocalUser().currentNetworkUser).netId != targetNetId))
				{
					string stringFormatted = Language.GetStringFormatted("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_1", new object[10]
					{
						Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ARMOR"),
						armor.ToString(),
						Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ATTACKSPEED"),
						$"{attackspeed:P}",
						Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_MOVESPEED"),
						$"{movespeed:P}",
						Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_REGEN"),
						regen.ToString(),
						Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_HOVER"),
						$"{hover:P}"
					});
					Chat.AddMessage(stringFormatted);
				}
			}

			public void Serialize(NetworkWriter writer)
			{
				//IL_0003: Unknown result type (might be due to invalid IL or missing references)
				writer.Write(targetNetId);
				writer.Write(armor);
				writer.Write(attackspeed);
				writer.Write(movespeed);
				writer.Write(regen);
				writer.Write(hover);
			}
		}

		public class SendToAllSimpleChatMessage : INetMessage, ISerializableObject
		{
			public string formatToken;

			public string paramTokens;

			public SendToAllSimpleChatMessage()
			{
			}

			public SendToAllSimpleChatMessage(string formatToken, string paramTokens)
			{
				this.formatToken = formatToken;
				this.paramTokens = paramTokens;
			}

			public void Deserialize(NetworkReader reader)
			{
				formatToken = reader.ReadString();
				paramTokens = reader.ReadString();
			}

			public void OnReceived()
			{
				List<string> list = new List<string>();
				string[] array = paramTokens.Split(new char[1] { ',' });
				foreach (string text in array)
				{
					list.Add(Language.GetString(text));
				}
				Chat.AddMessage(Language.GetStringFormatted(formatToken, new object[1] { list }));
			}

			public void Serialize(NetworkWriter writer)
			{
				writer.Write(formatToken);
				writer.Write(paramTokens);
			}
		}

		public static void Init()
		{
			NetworkingAPI.RegisterMessageType<SendToClient_ChirrStatInfo>();
		}
	}
}
namespace ChirrAltSkills.Chirr
{
	internal class ChirrCommands
	{
		public static void AddChatCommands()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			Chat.SendBroadcastChat_ChatMessageBase += new hook_SendBroadcastChat_ChatMessageBase(ActivateChatCommand);
		}

		private static void ActivateChatCommand(orig_SendBroadcastChat_ChatMessageBase orig, ChatMessageBase message)
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			UserChatMessage val = (UserChatMessage)(object)((message is UserChatMessage) ? message : null);
			if (val != null && !(val.text.ToLower() != "/chirrstage"))
			{
				ChirrStageBuffInfo.GetCurrentStageBuffInfo().SendChatChangeMessage(((NetworkBehaviour)val.sender.GetComponent<NetworkUser>()).netId);
				val.text += " [!]";
				orig.Invoke(message);
			}
		}

		[ConCommand(/*Could not decode attribute arguments.*/)]
		private static void CCPrintStageBuffInfo(ConCommandArgs _)
		{
			if (!Object.op_Implicit((Object)(object)Run.instance))
			{
				Debug.LogWarning((object)"Can't run cas_printstagebuff without being in a run!");
			}
			else
			{
				ChirrStageBuffInfo.GetCurrentStageBuffInfo().LogChangeMessage();
			}
		}
	}
	public class ChirrSetup
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static hook_Init <>9__20_0;

			internal void <Init>b__20_0(orig_Init orig)
			{
				//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)
				orig.Invoke();
				commandoBodyIndex = BodyCatalog.FindBodyIndex("CommandoBody");
			}
		}

		public static float cachedMass;

		public static GameObject bodyPrefab;

		public static SkillLocator skillLocator;

		public static EntityStateMachine passiveESM;

		public static GenericSkill passiveSkill;

		public static SkillFamily passiveSkillFamily;

		public static PassiveStageBuffSD passiveStageBuffSD;

		public static PassiveSnackiesPerStageSD passiveSnackiesSD;

		public static PassiveBunnySD passiveBunnySD;

		public static PassiveSoulmateSD passiveSoulmateSD;

		public static PassiveDiggerSD passiveDiggerSD;

		public static PassiveTakeFlightSD passiveDefaultSD;

		public static SteppedSkillDef primaryDoubleTapSD;

		public static TransformEnemySD specialTransformSD;

		public static TransformEnemyScepterSD specialTransformScepterSD;

		public static EatEnemySD specialEatSD;

		public static EatEnemyScepterSD specialEatScepterSD;

		public static List<CharacterBody> chirrSoulmates = new List<CharacterBody>();

		public static List<CharacterBody> commandoSoulmates = new List<CharacterBody>();

		public static BodyIndex commandoBodyIndex;

		public static void Init()
		{
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Expected O, but got Unknown
			bodyPrefab = ChirrCore.chirrPrefab;
			cachedMass = bodyPrefab.GetComponent<CharacterMotor>().mass;
			skillLocator = bodyPrefab.GetComponent<SkillLocator>();
			ChirrTracker chirrTracker = bodyPrefab.AddComponent<ChirrTracker>();
			((Behaviour)chirrTracker).enabled = false;
			RevertBaseChanges();
			SetupPassive();
			SetupPrimary();
			SetupSpecial();
			CharacterBody.onBodyStartGlobal += CharacterBody_onBodyStartGlobal;
			GlobalEventManager.onCharacterDeathGlobal += Server_onCharacterDeath;
			Run.onServerGameOver += Run_ResetSoulmates;
			Stage.onServerStageComplete += Stage_ResetSoulmates;
			object obj = <>c.<>9__20_0;
			if (obj == null)
			{
				hook_Init val = delegate(orig_Init orig)
				{
					//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)
					orig.Invoke();
					commandoBodyIndex = BodyCatalog.FindBodyIndex("CommandoBody");
				};
				<>c.<>9__20_0 = val;
				obj = (object)val;
			}
			BodyCatalog.Init += (hook_Init)obj;
			ChirrStageBuffInfo.Init();
			if (CASPlugin.modloaded_Scepter)
			{
				ScepterSetup();
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		private static void ScepterSetup()
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			bool flag = default(bool);
			ContentAddition.AddEntityState<TransformEnemyScepterES>(ref flag);
			specialTransformScepterSD = ChirrSetupHelpers.CreateSkillDef<TransformEnemyScepterSD>("DESCLONE_SS2UCHIRR_TRANSFORM_SCEPTER");
			ChirrSetupHelpers.CopySkillDefFields((SkillDef)(object)specialTransformSD, (SkillDef)(object)specialTransformScepterSD, copyIdentifiers: false);
			((SkillDef)specialTransformScepterSD).activationState = new SerializableEntityStateType(typeof(TransformEnemyScepterES));
			((SkillDef)specialTransformScepterSD).icon = Assets.ChirrAssets.specialTransformScepterIcon;
			ContentAddition.AddSkillDef((SkillDef)(object)specialTransformScepterSD);
			ContentAddition.AddEntityState<EatEnemyScepterES>(ref flag);
			specialEatScepterSD = ChirrSetupHelpers.CreateSkillDef<EatEnemyScepterSD>("DESCLONE_SS2UCHIRR_EAT_SCEPTER");
			ChirrSetupHelpers.CopySkillDefFields((SkillDef)(object)specialEatSD, (SkillDef)(object)specialEatScepterSD, copyIdentifiers: false);
			((SkillDef)specialEatScepterSD).activationState = new SerializableEntityStateType(typeof(EatEnemyScepterES));
			((SkillDef)specialEatScepterSD).icon = Assets.ChirrAssets.specialEatScepterIcon;
			((SkillDef)specialEatScepterSD).keywordTokens = new string[1] { "DESCLONE_SS2UCHIRR_SNACKIES_KEYWORD" };
			ContentAddition.AddSkillDef((SkillDef)(object)specialEatScepterSD);
			ItemBase<AncientScepterItem>.instance.RegisterScepterSkill((SkillDef)(object)specialTransformScepterSD, "SS2UChirrBody", (SkillDef)(object)specialTransformSD);
			ItemBase<AncientScepterItem>.instance.RegisterScepterSkill((SkillDef)(object)specialEatScepterSD, "SS2UChirrBody", (SkillDef)(object)specialEatSD);
		}

		private static void RevertBaseChanges()
		{
			//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)
			bodyPrefab.GetComponent<CharacterBody>().baseJumpPower = 15f;
			EntityStateMachine[] components = bodyPrefab.GetComponents<EntityStateMachine>();
			EntityStateMachine[] array = components;
			foreach (EntityStateMachine val in array)
			{
				if (val.customName == "Body")
				{
					val.mainStateType = new SerializableEntityStateType(typeof(ChirrCharMainVariableFly));
					break;
				}
			}
		}

		private static void ResetSoulmates()
		{
			chirrSoulmates.Clear();
			commandoSoulmates.Clear();
		}

		private static void Stage_ResetSoulmates(Stage obj)
		{
			ResetSoulmates();
		}

		private static void Run_ResetSoulmates(Run arg1, GameEndingDef arg2)
		{
			ResetSoulmates();
		}

		private static void Server_onCharacterDeath(DamageReport obj)
		{
			//IL_0037: 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_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkServer.active || obj == null || !Object.op_Implicit((Object)(object)obj.victim))
			{
				return;
			}
			if (obj.victimBodyIndex == BodyCatalog.FindBodyIndex("CommandoBody"))
			{
				foreach (CharacterBody chirrSoulmate in chirrSoulmates)
				{
					if (Object.op_Implicit((Object)(object)chirrSoulmate))
					{
						float num = 15f;
						for (int i = 0; i < 5; i++)
						{
							chirrSoulmate.AddTimedBuff(Buffs.BeetleJuice, num);
						}
					}
				}
				commandoSoulmates.Remove(obj.victimBody);
			}
			else if (obj.victimBodyIndex == ChirrCore.bodyIndex)
			{
				chirrSoulmates.Remove(obj.victimBody);
			}
		}

		private static void CharacterBody_onBodyStartGlobal(CharacterBody body)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			if (NetworkServer.active && Object.op_Implicit((Object)(object)body) && Object.op_Implicit((Object)(object)body.master) && body.bodyIndex == commandoBodyIndex && !commandoSoulmates.Contains(body))
			{
				commandoSoulmates.Add(body);
			}
		}

		private static void SetupPassive()
		{
			//IL_0004: 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_008d: 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_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			bool flag = default(bool);
			ContentAddition.AddEntityState<ChirrCharMainVariableFly>(ref flag);
			ContentAddition.AddEntityState<VariableHoverOn>(ref flag);
			passiveSkill = bodyPrefab.AddComponent<GenericSkill>();
			passiveSkillFamily = ScriptableObject.CreateInstance<SkillFamily>();
			((Object)passiveSkillFamily).name = "DCSS2UChirrPassive";
			passiveSkill._skillFamily = passiveSkillFamily;
			ContentAddition.AddSkillFamily(passiveSkillFamily);
			NetworkStateMachine component = bodyPrefab.GetComponent<NetworkStateMachine>();
			passiveESM = bodyPrefab.AddComponent<EntityStateMachine>();
			passiveESM.customName = "Passive";
			passiveESM.initialStateType = new SerializableEntityStateType(typeof(Idle));
			passiveESM.mainStateType = new SerializableEntityStateType(typeof(Idle));
			ArrayUtils.ArrayAppend<EntityStateMachine>(ref component.stateMachines, ref passiveESM);
			passiveDefaultSD = ChirrSetupHelpers.CreateSkillDef<PassiveTakeFlightSD>("DESCLONE_SS2UCHIRR_PASSIVE_TAKEFLIGHT");
			((SkillDef)passiveDefaultSD).skillNameToken = skillLocator.passiveSkill.skillNameToken;
			((SkillDef)passiveDefaultSD).skillName = ((SkillDef)passiveDefaultSD).skillNameToken;
			((SkillDef)passiveDefaultSD).skillDescriptionToken = skillLocator.passiveSkill.skillDescriptionToken;
			((SkillDef)passiveDefaultSD).icon = skillLocator.passiveSkill.icon;
			skillLocator.passiveSkill.enabled = false;
			AddPassive((SkillDef)(object)passiveDefaultSD);
			if (ConfigSetup.cfgEnablePassiveStageBuff.Value)
			{
				passiveStageBuffSD = ChirrSetupHelpers.CreateSkillDef<PassiveStageBuffSD>("DESCLONE_SS2UCHIRR_PASSIVE_STAGEBUFF");
				((SkillDef)passiveStageBuffSD).icon = Assets.ChirrAssets.passiveStageBuffIcon;
				AddPassive((SkillDef)(object)passiveStageBuffSD);
			}
			if (ConfigSetup.cfgEnablePassiveSnackies.Value)
			{
				passiveSnackiesSD = ChirrSetupHelpers.CreateSkillDef<PassiveSnackiesPerStageSD>("DESCLONE_SS2UCHIRR_PASSIVE_SNACKIESPERSTAGE");
				((SkillDef)passiveSnackiesSD).icon = Assets.ChirrAssets.passiveSnackiesPerStageIcon;
				((SkillDef)passiveSnackiesSD).keywordTokens = new string[1] { "DESCLONE_SS2UCHIRR_SNACKIES_KEYWORD" };
				AddPassive((SkillDef)(object)passiveSnackiesSD);
			}
			if (ConfigSetup.cfgEnablePassiveBunny.Value)
			{
				passiveBunnySD = ChirrSetupHelpers.CreateSkillDef<PassiveBunnySD>("DESCLONE_SS2UCHIRR_PASSIVE_BUNNY");
				((SkillDef)passiveBunnySD).icon = Assets.ChirrAssets.passiveBunnyIcon;
				AddPassive((SkillDef)(object)passiveBunnySD);
			}
			if (ConfigSetup.cfgEnablePassiveSoulmate.Value)
			{
				passiveSoulmateSD = ChirrSetupHelpers.CreateSkillDef<PassiveSoulmateSD>("DESCLONE_SS2UCHIRR_PASSIVE_SOULMATE");
				((SkillDef)passiveSoulmateSD).icon = Assets.ChirrAssets.passiveSoulmateIcon;
				AddPassive((SkillDef)(object)passiveSoulmateSD);
			}
			if (ConfigSetup.cfgEnablePassiveDigger.Value)
			{
				passiveDiggerSD = ChirrSetupHelpers.CreateSkillDef<PassiveDiggerSD>("DESCLONE_SS2UCHIRR_PASSIVE_DIGGER");
				((SkillDef)passiveDiggerSD).icon = Assets.ChirrAssets.passiveDiggerIcon;
				AddPassive((SkillDef)(object)passiveDiggerSD);
			}
			static void AddPassive(SkillDef skillDef)
			{
				//IL_0018: 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_003a: Expected O, but got Unknown
				skillDef.activationStateMachineName = "Passive";
				ref Variant[] variants = ref passiveSkillFamily.variants;
				Variant val = new Variant
				{
					skillDef = skillDef
				};
				((Variant)(ref val)).viewableNode = new Node(skillDef.skillNameToken, false, (Node)null);
				val.unlockableDef = null;
				ArrayUtils.ArrayAppend<Variant>(ref variants, ref val);
				ContentAddition.AddSkillDef(skillDef);
			}
		}

		private static void SetupPrimary()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			SkillFamily skillFamily = skillLocator.primary.skillFamily;
			if (ConfigSetup.cfgEnablePrimaryDoubleTap.Value)
			{
				bool flag = default(bool);
				ContentAddition.AddEntityState<FireDoubleTapES>(ref flag);
				primaryDoubleTapSD = ScriptableObject.CreateInstance<SteppedSkillDef>();
				((SkillDef)primaryDoubleTapSD).skillName = "DESCLONE_SS2UCHIRR_PRIMARY_DOUBLETAP";
				((Object)primaryDoubleTapSD).name = "DESCLONE_SS2UCHIRR_PRIMARY_DOUBLETAP";
				((SkillDef)primaryDoubleTapSD).skillNameToken = "DESCLONE_SS2UCHIRR_PRIMARY_DOUBLETAP_NAME";
				((SkillDef)primaryDoubleTapSD).skillDescriptionToken = "DESCLONE_SS2UCHIRR_PRIMARY_DOUBLETAP_DESC";
				ChirrSetupHelpers.CopySkillDefFields(skillFamily.variants[0].skillDef, (SkillDef)(object)primaryDoubleTapSD, copyIdentifiers: false);
				((SkillDef)primaryDoubleTapSD).icon = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Commando/CommandoBodyFirePistol.asset").WaitForCompletion().icon;
				((SkillDef)primaryDoubleTapSD).activationState = new SerializableEntityStateType(typeof(FireDoubleTapES));
				((SkillDef)primaryDoubleTapSD).skillDescriptionToken = "COMMANDO_PRIMARY_DESCRIPTION";
				primaryDoubleTapSD.stepCount = 2;
				primaryDoubleTapSD.stepGraceDuration = 0.1f;
				ContentAddition.AddSkillDef((SkillDef)(object)primaryDoubleTapSD);
				ChirrSetupHelpers.AddToSkillFamily((SkillDef)(object)primaryDoubleTapSD, skillFamily);
			}
		}

		private static void SetupSpecial()
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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_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)
			SkillDef skillDef = skillLocator.special.skillFamily.variants[0].skillDef;
			bool flag = default(bool);
			if (ConfigSetup.cfgEnableSpecialTransform.Value)
			{
				ContentAddition.AddEntityState<TransformEnemyES>(ref flag);
				specialTransformSD = ChirrSetupHelpers.CreateSkillDef<TransformEnemySD>("DESCLONE_SS2UCHIRR_TRANSFORM");
				ChirrSetupHelpers.CopySkillDefFields(skillDef, (SkillDef)(object)specialTransformSD, copyIdentifiers: false);
				((SkillDef)specialTransformSD).activationState = new SerializableEntityStateType(typeof(TransformEnemyES));
				((SkillDef)specialTransformSD).icon = Assets.ChirrAssets.specialTFIcon;
				ContentAddition.AddSkillDef((SkillDef)(object)specialTransformSD);
				ChirrSetupHelpers.AddToSkillFamily((SkillDef)(object)specialTransformSD, skillLocator.special.skillFamily);
			}
			if (ConfigSetup.cfgEnableSpecialEat.Value)
			{
				ContentAddition.AddEntityState<EatEnemyES>(ref flag);
				specialEatSD = ChirrSetupHelpers.CreateSkillDef<EatEnemySD>("DESCLONE_SS2UCHIRR_EAT");
				ChirrSetupHelpers.CopySkillDefFields(skillDef, (SkillDef)(object)specialEatSD, copyIdentifiers: false);
				((SkillDef)specialEatSD).activationState = new SerializableEntityStateType(typeof(EatEnemyES));
				((SkillDef)specialEatSD).icon = Assets.ChirrAssets.specialEatIcon;
				((SkillDef)specialEatSD).keywordTokens = new string[1] { "DESCLONE_SS2UCHIRR_SNACKIES_KEYWORD" };
				ContentAddition.AddSkillDef((SkillDef)(object)specialEatSD);
				ChirrSetupHelpers.AddToSkillFamily((SkillDef)(object)specialEatSD, skillLocator.special.skillFamily);
			}
		}
	}
	internal class ChirrStageBuffInfo
	{
		internal struct StageBuffInfo
		{
			public string[] stageIds;

			public float armor;

			public const float minArmor = 2f;

			public const float medArmor = 4f;

			public const float maxArmor = 6f;

			public float movespeed;

			public const float minMS = 0.1f;

			public const float medMS = 0.3f;

			public const float maxMS = 0.5f;

			public float attackspeed;

			public const float minAS = 0.1f;

			public const float medAS = 0.3f;

			public const float maxAS = 0.5f;

			public float regen;

			public const float minRegen = 0.2f;

			public const float medRegen = 0.4f;

			public const float maxRegen = 0.6f;

			public float hover;

			public const float minHover = 0.25f;

			public const float medHover = 0.5f;

			public const float maxHover = 1f;

			public const int moveSpeedMaxStagesCleared = 10;

			public const float stageMultiplierStagesCleared = 0.2f;

			public void GetResultingStatChanges(out float armorMult, out float asMult, out float msMult, out float regenMult, out string currentStageToken)
			{
				int num = Mathf.Max(0, Run.instance.stageClearCount);
				float num2 = 1f + (float)num * 0.2f;
				float num3 = 1f + (float)Mathf.Min(20, num) * 0.2f;
				armorMult = armor * num2;
				asMult = attackspeed * num2;
				msMult = movespeed * num3;
				regenMult = regen * num2;
				currentStageToken = SceneCatalog.GetSceneDefForCurrentScene().nameToken;
			}

			public void Apply(CharacterBody characterBody)
			{
				GetResultingStatChanges(out var armorMult, out var asMult, out var msMult, out var regenMult, out var _);
				characterBody.baseArmor += armorMult;
				characterBody.baseAttackSpeed += asMult;
				characterBody.baseMoveSpeed += msMult;
				characterBody.baseRegen += regenMult;
				characterBody.MarkAllStatsDirty();
			}

			public void SendChatAnnouncementMessage(CharacterBody characterBody)
			{
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0015: Expected O, but got Unknown
				if (NetworkServer.active)
				{
					SubjectFormatChatMessage val = new SubjectFormatChatMessage();
					((SubjectChatMessage)val).baseToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_0";
					((SubjectChatMessage)val).subjectCharacterBodyGameObject = ((Component)characterBody).gameObject;
					val.paramTokens = new string[1] { SceneCatalog.GetSceneDefForCurrentScene().nameToken };
					Chat.SendBroadcastChat((ChatMessageBase)(object)val);
				}
			}

			public string GetChangeMessage()
			{
				GetResultingStatChanges(out var armorMult, out var asMult, out var msMult, out var regenMult, out var _);
				return Language.GetStringFormatted("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_1", new object[10]
				{
					g("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ARMOR"),
					armorMult,
					g("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_MOVESPEED"),
					$"{asMult:P}",
					g("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ATTACKSPEED"),
					$"{msMult:P}",
					g("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_REGEN"),
					regenMult,
					g("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_HOVER"),
					$"{hover:P}"
				});
				static string g(string token)
				{
					return Language.GetString(token);
				}
			}

			public void SendChatChangeMessage(NetworkInstanceId targetNetId)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				if (NetworkServer.active)
				{
					GetResultingStatChanges(out var armorMult, out var asMult, out var msMult, out var regenMult, out var _);
					NetMessageExtensions.Send((INetMessage)(object)new Networking.SendToClient_ChirrStatInfo(targetNetId, armorMult, asMult, msMult, regenMult, hover), (NetworkDestination)1);
				}
			}

			public void LogChangeMessage()
			{
				GetResultingStatChanges(out var armorMult, out var asMult, out var msMult, out var regenMult, out var _);
				string[] array = new string[10]
				{
					Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ARMOR"),
					armorMult.ToString(),
					Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_MOVESPEED"),
					$"{asMult:P}",
					Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ATTACKSPEED"),
					$"{msMult:P}",
					Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_REGEN"),
					regenMult.ToString(),
					Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_HOVER"),
					$"{hover:P}"
				};
				object[] array2 = array;
				Debug.Log((object)Language.GetStringFormatted("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_1", array2));
			}
		}

		public static StageBuffInfo defaultInfo = new StageBuffInfo
		{
			stageIds = new string[0],
			armor = 2f,
			movespeed = 0.1f,
			attackspeed = 0.1f,
			regen = 0.2f,
			hover = 0.5f
		};

		public static StageBuffInfo blackbeachInfo = new StageBuffInfo
		{
			stageIds = new string[3] { "blackbeach", "blackbeach2", "itblackbeach" },
			armor = 2f,
			movespeed = 0.1f,
			attackspeed = 0.1f,
			regen = 0.4f,
			hover = 1f
		};

		public static StageBuffInfo golemplainsInfo = new StageBuffInfo
		{
			stageIds = new string[3] { "golemplains", "golemplains2", "itgolemplains" },
			armor = 4f,
			movespeed = 0.3f,
			attackspeed = 0.1f,
			regen = 0.4f,
			hover = 1f
		};

		public static StageBuffInfo snowyforestInfo = new StageBuffInfo
		{
			stageIds = new string[1] { "snowyforest" },
			armor = 4f,
			movespeed = 0.1f,
			attackspeed = 0.1f,
			regen = 0.2f,
			hover = 1f
		};

		public static StageBuffInfo goolakeInfo = new StageBuffInfo
		{
			stageIds = new string[2] { "goolake", "itgoolake" },
			armor = 6f,
			movespeed = 0.1f,
			attackspeed = 0.1f,
			regen = 0.2f,
			hover = 0.25f
		};

		public static StageBuffInfo foggyswampInfo = new StageBuffInfo
		{
			stageIds = new string[1] { "foggyswamp" },
			armor = 4f,
			movespeed = 0.1f,
			attackspeed = 0.1f,
			regen = 0.6f,
			hover = 0.5f
		};

		public static StageBuffInfo ancientloftInfo = new StageBuffInfo
		{
			stageIds = new string[2] { "ancientloft", "itancientloft" },
			armor = 6f,
			movespeed = 0.1f,
			attackspeed = 0.1f,
			regen = 0.2f,
			hover = 0.25f
		};

		public static StageBuffInfo frozenwallInfo = new StageBuffInfo
		{
			stageIds = new string[2] { "frozenwall", "itfrozenwall" },
			armor = 4f,
			movespeed = 0.1f,
			attackspeed = 0.1f,
			regen = 0.2f,
			hover = 0.5f
		};

		public static StageBuffInfo wispgraveyardInfo = new StageBuffInfo
		{
			stageIds = new string[1] { "wispgraveyard" },
			armor = 4f,
			movespeed = 0.5f,
			attackspeed = 0.3f,
			regen = 0.4f,
			hover = 1f
		};

		public static StageBuffInfo sulfurpoolsInfo = new StageBuffInfo
		{
			stageIds = new string[1] { "sulfurpools" },
			armor = 6f,
			movespeed = 0.1f,
			attackspeed = 0.1f,
			regen = 0.2f,
			hover = 0.25f
		};

		public static StageBuffInfo dampcaveInfo = new StageBuffInfo
		{
			stageIds = new string[2] { "dampcavesimple", "itdampcave" },
			armor = 2f,
			movespeed = 0.3f,
			attackspeed = 0.1f,
			regen = 0.2f,
			hover = 0.5f
		};

		public static StageBuffInfo shipgraveyardInfo = new StageBuffInfo
		{
			stageIds = new string[1] { "shipgraveyard" },
			armor = 2f,
			movespeed = 0.5f,
			attackspeed = 0.1f,
			regen = 0.6f,
			hover = 1f
		};

		public static StageBuffInfo rootjungleInfo = new StageBuffInfo
		{
			stageIds = new string[1] { "rootjungle" },
			armor = 2f,
			movespeed = 0.5f,
			attackspeed = 0.1f,
			regen = 0.6f,
			hover = 1f
		};

		public static StageBuffInfo skymeadowInfo = new StageBuffInfo
		{
			stageIds = new string[2] { "skymeadow", "itskymeadow" },
			armor = 2f,
			movespeed = 0.5f,
			attackspeed = 0.1f,
			regen = 0.6f,
			hover = 1f
		};

		public static StageBuffInfo bossInfo = new StageBuffInfo
		{
			stageIds = new string[8] { "moon", "moon2", "itmoon", "limbo", "artifactworld", "goldshores", "voidraid", "arena" },
			armor = 6f,
			movespeed = 0.5f,
			attackspeed = 0.5f,
			regen = 0.6f,
			hover = 1f
		};

		public static StageBuffInfo bazaarInfo = new StageBuffInfo
		{
			stageIds = new string[1] { "bazaar" }
		};

		public static StageBuffInfo voidstageInfo = new StageBuffInfo
		{
			stageIds = new string[1] { "voidstage" },
			armor = 4f,
			movespeed = 0.3f,
			attackspeed = 0.3f,
			regen = 0.4f,
			hover = 0.5f
		};

		public static StageBuffInfo[] stageBuffInfos = new StageBuffInfo[16]
		{
			blackbeachInfo, golemplainsInfo, snowyforestInfo, goolakeInfo, foggyswampInfo, ancientloftInfo, frozenwallInfo, wispgraveyardInfo, sulfurpoolsInfo, dampcaveInfo,
			shipgraveyardInfo, rootjungleInfo, skymeadowInfo, bazaarInfo, voidstageInfo, bossInfo
		};

		public static Dictionary<string, StageBuffInfo> stageBuffInfoDict = new Dictionary<string, StageBuffInfo>();

		public static float GetStageHoverMultiplier()
		{
			return GetCurrentStageBuffInfo().hover;
		}

		public static StageBuffInfo GetCurrentStageBuffInfo()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			Scene activeScene = SceneManager.GetActiveScene();
			return GetStageBuffInfo(((Scene)(ref activeScene)).name);
		}

		public static void Init()
		{
			GenerateDictionary();
		}

		public static void GenerateDictionary()
		{
			StageBuffInfo[] array = stageBuffInfos;
			for (int i = 0; i < array.Length; i++)
			{
				StageBuffInfo value = array[i];
				string[] stageIds = value.stageIds;
				foreach (string key in stageIds)
				{
					stageBuffInfoDict.Add(key, value);
				}
			}
		}

		public static StageBuffInfo GetStageBuffInfo(string stageName)
		{
			StageBuffInfo value;
			return stageBuffInfoDict.TryGetValue(stageName, out value) ? value : defaultInfo;
		}
	}
	public class SoulmateChirrBuffer : MonoBehaviour
	{
		public CharacterBody body;

		public float stopwatch = 0f;

		public float timer = 4f;

		public void FixedUpdate()
		{
			stopwatch -= Time.fixedDeltaTime;
			if (!(stopwatch <= 0f))
			{
				return;
			}
			stopwatch = timer;
			int buffCount = body.GetBuffCount(Buffs.soulmateBuff);
			int num = ChirrSetup.commandoSoulmates.Count - buffCount;
			if (num > 0)
			{
				for (int i = 0; i < num; i++)
				{
					body.AddBuff(Buffs.soulmateBuff);
				}
			}
			else if (num < 0)
			{
				for (int j = 0; j < -num; j++)
				{
					body.RemoveBuff(Buffs.soulmateBuff);
				}
			}
		}

		public void OnDestroy()
		{
			while (body.HasBuff(Buffs.soulmateBuff))
			{
				body.RemoveBuff(Buffs.soulmateBuff);
			}
		}
	}
}
namespace ChirrAltSkills.Chirr.States
{
	internal class VariableHoverOn : JetpackOn
	{
		public float hoverVelocityMultiplier = 1f;

		public float hoverAccelerationMultiplier = 1f;

		public override void OnEnter()
		{
			((JetpackOn)this).OnEnter();
			JetpackOn.hoverAcceleration *= hoverAccelerationMultiplier;
		}

		public override void FixedUpdate()
		{
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			((JetpackOn)this).FixedUpdate();
			if (((EntityState)this).isAuthority)
			{
				float y = ((EntityState)this).characterMotor.velocity.y;
				y = Mathf.MoveTowards(y, JetpackOn.hoverVelocity, JetpackOn.hoverAcceleration * Time.fixedDeltaTime);
				((EntityState)this).characterMotor.velocity = new Vector3(((EntityState)this).characterMotor.velocity.x, y, ((EntityState)this).characterMotor.velocity.z);
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody) && !((EntityState)this).characterBody.isSprinting && Object.op_Implicit((Object)(object)((EntityState)this).inputBank))
			{
				Ray aimRay = ((BaseState)this).GetAimRay();
				Vector2 val = default(Vector2);
				((Vector2)(ref val))..ctor(((EntityState)this).inputBank.moveVector.x, ((EntityState)this).inputBank.moveVector.z);
				Vector2 val2 = default(Vector2);
				((Vector2)(ref val2))..ctor(((Ray)(ref aimRay)).direction.x, ((Ray)(ref aimRay)).direction.z);
				float num = Vector2.Angle(val, val2);
				if (num <= 90f)
				{
					((EntityState)this).characterBody.isSprinting = true;
				}
			}
		}
	}
}
namespace ChirrAltSkills.Chirr.States.Special
{
	internal class EatEnemyES : BaseState
	{
		public const float baseBuffDuration = 10f;

		public const float stackBuffDuration = 1f;

		public const float damageCoefficient = 5f;

		public const float stacksPerHealthPercentage = 0.5f;

		public const float secondsPerHealthPercentage = 0.5f;

		private ChirrTracker chirrTracker;

		private readonly float duration = 0.25f;

		public virtual bool AllowBoss => false;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			chirrTracker = ((EntityState)this).GetComponent<ChirrTracker>();
			Util.PlaySound("SS2UChirrSpecial", ((EntityState)this).gameObject);
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
			{
				((EntityState)this).characterBody.SetAimTimer(duration + 1f);
			}
			if (NetworkServer.active)
			{
				ChompEnemy(chirrTracker.GetTrackingTarget().healthComponent);
			}
		}

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

		public void ChompEnemy(HealthComponent enemyHC)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: 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_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Expected O, but got Unknown
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			DamageInfo val = new DamageInfo
			{
				attacker = ((EntityState)this).gameObject,
				inflictor = ((EntityState)this).gameObject,
				crit = ((EntityState)this).characterBody.RollCrit(),
				damage = ((EntityState)this).characterBody.damage * 5f,
				damageType = (DamageType)0,
				damageColorIndex = (DamageColorIndex)5,
				position = enemyHC.body.corePosition,
				procCoefficient = 0.1f
			};
			DamageAPI.AddModdedDamageType(val, DamageTypes.chirrChompDT);
			enemyHC.TakeDamage(val);
		}

		public override void OnExit()
		{
			((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)2;
		}
	}
	internal class EatEnemyScepterES : EatEnemyES
	{
		public override bool AllowBoss => true;
	}
	internal class TransformEnemyES : BaseState
	{
		private ChirrTracker chirrTracker;

		private readonly float duration = 0.25f;

		public virtual bool AllowBoss => false;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			chirrTracker = ((EntityState)this).GetComponent<ChirrTracker>();
			Util.PlaySound("SS2UChirrSpecial", ((EntityState)this).gameObject);
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
			{
				((EntityState)this).characterBody.SetAimTimer(duration + 1f);
			}
			if (NetworkServer.active)
			{
				TransformEnemy(chirrTracker.GetTrackingTarget().healthComponent);
			}
		}

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

		public void TransformEnemy(HealthComponent enemyHC)
		{
			//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_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_0037: 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_006c: Expected O, but got Unknown
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: 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_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Expected O, but got Unknown
			Vector3 footPosition = enemyHC.body.footPosition;
			MasterCopySpawnCard val = MasterCopySpawnCard.FromMaster(((EntityState)this).characterBody.master, false, false, (Action<CharacterMaster>)null);
			MonsterSpawnDistance val2 = (MonsterSpawnDistance)1;
			DirectorPlacementRule val3 = new DirectorPlacementRule
			{
				placementMode = (PlacementMode)0,
				position = footPosition
			};
			DirectorCore.GetMonsterSpawnDistance(val2, ref val3.minDistance, ref val3.maxDistance);
			DirectorSpawnRequest val4 = new DirectorSpawnRequest((SpawnCard)(object)val, val3, new Xoroshiro128Plus(Run.instance.seed + (ulong)Run.instance.fixedTime))
			{
				teamIndexOverride = ((EntityState)this).characterBody.master.teamIndex,
				ignoreTeamMemberLimit = true,
				summonerBodyObject = ((Component)((EntityState)this).characterBody).gameObject
			};
			DirectorSpawnRequest val5 = val4;
			val5.onSpawnedServer = (Action<SpawnResult>)Delegate.Combine(val5.onSpawnedServer, (Action<SpawnResult>)delegate(SpawnResult result)
			{
				//IL_0001: 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_003b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0045: Expected O, but got Unknown
				//IL_0024: Unknown result type (might be due to invalid IL or missing references)
				//IL_008f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0094: Unknown result type (might be due to invalid IL or missing references)
				//IL_0096: Unknown result type (might be due to invalid IL or missing references)
				//IL_0099: Invalid comparison between Unknown and I4
				//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
				//IL_0141: Unknown result type (might be due to invalid IL or missing references)
				//IL_014b: Expected O, but got Unknown
				CharacterMaster component = result.spawnedInstance.GetComponent<CharacterMaster>();
				Deployable val7 = result.spawnedInstance.AddComponent<Deployable>();
				val7.onUndeploy = (UnityEvent)(((object)val7.onUndeploy) ?? ((object)new UnityEvent()));
				val7.onUndeploy.AddListener(new UnityAction(component.TrueKill));
				component.inventory.CopyItemsFrom(((EntityState)this).characterBody.inventory);
				component.inventory.CopyEquipmentFrom(((EntityState)this).characterBody.inventory);
				foreach (string item in ChirrFriendController.itemCopyBlacklist)
				{
					ItemIndex val8 = ItemCatalog.FindItemIndex(item);
					if ((int)val8 != -1)
					{
						component.inventory.RemoveItem(val8, component.inventory.GetItemCount(val8));
					}
				}
				float lifeTimer = (AllowBoss ? 20f : 10f);
				ComponentHelpers.AddComponent<MasterSuicideOnTimer>((MonoBehaviour)(object)component).lifeTimer = lifeTimer;
				GameObject bodyObject = component.GetBodyObject();
				if (Object.op_Implicit((Object)(object)bodyObject))
				{
					EntityStateMachine[] components = bodyObject.GetComponents<EntityStateMachine>();
					foreach (EntityStateMachine val9 in components)
					{
						if (val9.customName == "Body")
						{
							val9.SetState((EntityState)new GummyCloneSpawnState());
							break;
						}
					}
				}
			});
			GameObject val6 = DirectorCore.instance.TrySpawnObject(val4);
			Object.Destroy((Object)(object)val);
			enemyHC.Suicide(((Component)((EntityState)this).characterBody).gameObject, (GameObject)null, (DamageType)0);
		}
	}
	internal class TransformEnemyScepterES : TransformEnemyES
	{
		public override bool AllowBoss => true;
	}
}
namespace ChirrAltSkills.Chirr.States.Primary
{
	public class FireDoubleTapES : BaseSkillState, IStepSetter
	{
		private int pistol;

		private Ray aimRay;

		private float duration;

		void IStepSetter.SetStep(int i)
		{
			pistol = i;
		}

		private void FireBullet(string targetMuzzle)
		{
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: 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_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: 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)
			Util.PlaySound(FirePistol2.firePistolSoundString, ((EntityState)this).gameObject);
			if (Object.op_Implicit((Object)(object)ChirrPrimary.muzzleflashEffectPrefab))
			{
				EffectManager.SimpleMuzzleFlash(ChirrPrimary.muzzleflashEffectPrefab, ((EntityState)this).gameObject, targetMuzzle, false);
			}
			((BaseState)this).AddRecoil(-0.4f * FirePistol2.recoilAmplitude, -0.8f * FirePistol2.recoilAmplitude, -0.3f * FirePistol2.recoilAmplitude, 0.3f * FirePistol2.recoilAmplitude);
			if (((EntityState)this).isAuthority)
			{
				new BulletAttack
				{
					owner = ((EntityState)this).gameObject,
					weapon = ((EntityState)this).gameObject,
					origin = ((Ray)(ref aimRay)).origin,
					aimVector = ((Ray)(ref aimRay)).direction,
					minSpread = 0f,
					maxSpread = ((EntityState)this).characterBody.spreadBloomAngle,
					damage = FirePistol2.damageCoefficient * ((BaseState)this).damageStat,
					force = FirePistol2.force,
					tracerEffectPrefab = FirePistol2.tracerEffectPrefab,
					muzzleName = targetMuzzle,
					hitEffectPrefab = FirePistol2.hitEffectPrefab,
					isCrit = Util.CheckRoll(((BaseState)this).critStat, ((EntityState)this).characterBody.master),
					radius = 0.1f,
					smartCollision = true
				}.Fire();
			}
			((EntityState)this).characterBody.AddSpreadBloom(FirePistol2.spreadBloomValue);
		}

		public override void OnEnter()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			duration = FirePistol2.baseDuration / ((BaseState)this).attackSpeedStat;
			aimRay = ((BaseState)this).GetAimRay();
			((BaseState)this).StartAimMode(aimRay, 3f, false);
			((EntityState)this).PlayCrossfade("Gesture, Override", "Primary", "Primary.playbackRate", duration, 0.1f);
			((EntityState)this).PlayCrossfade("Gesture, Additive", "Primary", "Primary.playbackRate", duration, 0.1f);
			if (pistol % 2 == 0)
			{
				FireBullet("MuzzleWingL");
			}
			else
			{
				FireBullet("MuzzleWingR");
			}
		}

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)1;
		}
	}
}
namespace ChirrAltSkills.Chirr.States.CharacterMains
{
	internal class ChirrCharMainVariableFly : ChirrMain
	{
		private float hoverVelocityMultiplier = 1f;

		private float hoverAccelerationMultiplier = 1f;

		private bool canHover = true;

		private bool hoverHasDuration = false;

		private float hoverDuration = -1f;

		private float hoverStopwatch = 0f;

		private bool hoverOnCooldown = false;

		public bool isBunny = false;

		private static BuffDef IndicatorBuff => Buffs.hoverDurationIndicatorBuff;

		public void ChangeHoverMultiplier(float hoverVelocityMultiplier, float hoverAccelerationMultiplier)
		{
			this.hoverVelocityMultiplier = hoverVelocityMultiplier;
			this.hoverAccelerationMultiplier = hoverAccelerationMultiplier;
			if (hoverAccelerationMultiplier < 0f)
			{
				canHover = false;
			}
		}

		public void ChangeMainBasedOnSkillDef()
		{
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Expected O, but got Unknown
			GenericSkill[] components = ((EntityState)this).gameObject.GetComponents<GenericSkill>();
			foreach (GenericSkill val in components)
			{
				if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)val.skillFamily) && !(((Object)val.skillFamily).name != "DCSS2UChirrPassive"))
				{
					if ((Object)(object)val.skillDef == (Object)(object)ChirrSetup.passiveStageBuffSD)
					{
						float stageHoverMultiplier = ChirrStageBuffInfo.GetStageHoverMultiplier();
						float num = Mathf.Max(1f, 1f / stageHoverMultiplier);
						ChangeHoverMultiplier(1f, num);
					}
					else if ((Object)(object)val.skillDef == (Object)(object)ChirrSetup.passiveBunnySD)
					{
						isBunny = true;
						hoverHasDuration = true;
						hoverDuration = 2f;
					}
					else if ((Object)(object)val.skillDef == (Object)(object)ChirrSetup.passiveDiggerSD)
					{
						hoverHasDuration = true;
						hoverDuration = 5f;
					}
					break;
				}
			}
			if (hoverHasDuration)
			{
				((EntityState)this).characterMotor.onHitGroundServer += new HitGroundDelegate(ClearIndicatorBuffOnLandingServer);
			}
		}

		private void ClearIndicatorBuffOnLandingServer(ref HitGroundInfo hitGroundInfo)
		{
			((EntityState)this).characterBody.ClearTimedBuffs(IndicatorBuff);
		}

		public override void OnEnter()
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Expected O, but got Unknown
			((ChirrMain)this).OnEnter();
			ChangeMainBasedOnSkillDef();
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && hoverHasDuration)
			{
				((EntityState)this).characterMotor.onHitGroundAuthority += new HitGroundDelegate(ResetHoverCooldown);
			}
			SkillDef skillDef = ((EntityState)this).skillLocator.special.skillDef;
			if ((Object)(object)skillDef == (Object)(object)ChirrSetup.specialEatSD)
			{
				base.friendController.maxTrackingDistance = 0f;
			}
			else if ((Object)(object)skillDef == (Object)(object)ChirrSetup.specialTransformSD)
			{
				base.friendController.maxTrackingDistance = 0f;
			}
		}

		private void ResetHoverCooldown(ref HitGroundInfo hitGroundInfo)
		{
			hoverStopwatch = hoverDuration;
			hoverOnCooldown = false;
			if (NetworkServer.active)
			{
				while (((EntityState)this).characterBody.HasBuff(IndicatorBuff))
				{
					((EntityState)this).characterBody.RemoveBuff(IndicatorBuff);
				}
			}
		}

		public void GenericCharacterMain_ProcessJump()
		{
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_0215: Expected O, but got Unknown
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0244: 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_0266: Expected O, but got Unknown
			//IL_027a: 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_0286: 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_0298: Unknown result type (might be due to invalid IL or missing references)
			//IL_029d: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ad: Expected O, but got Unknown
			if (!((BaseCharacterMain)this).hasCharacterMotor)
			{
				return;
			}
			bool flag = false;
			bool flag2 = false;
			if (!((GenericCharacterMain)this).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 ((float)itemCount > 0f && ((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);
			if (((BaseCharacterMain)this).hasModelAnimator)
			{
				int layerIndex = ((BaseCharacterMain)this).modelAnimator.GetLayerIndex("Body");
				if (layerIndex >= 0)
				{
					if (((EntityState)this).characterMotor.jumpCount == 0 || ((EntityState)this).characterBody.baseJumpCount == 1)
					{
						((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
				}, true);
			}
			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
				}, true);
			}
			if (flag2)
			{
				EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/BoostJumpEffect"), new EffectData
				{
					origin = ((EntityState)this).characterBody.footPosition,
					rotation = Util.QuaternionSafeLookRotation(((EntityState)this).characterMotor.velocity)
				}, true);
			}
			CharacterMotor characterMotor = ((EntityState)this).characterMotor;
			characterMotor.jumpCount++;
		}

		public override void ProcessJump()
		{
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Expected O, but got Unknown
			GenericCharacterMain_ProcessJump();
			base.inJetpackState = ((object)base.jetpackStateMachine.state).GetType() == typeof(VariableHoverOn);
			if (!((BaseCharacterMain)this).hasCharacterMotor || !((BaseCharacterMain)this).hasInputBank || !((EntityState)this).isAuthority)
			{
				return;
			}
			bool flag = ((EntityState)this).inputBank.jump.down && ((EntityState)this).characterMotor.velocity.y < 0f && !((EntityState)this).characterMotor.isGrounded;
			if (canHover && flag && !base.inJetpackState && (!hoverHasDuration || !hoverOnCooldown))
			{
				base.jetpackStateMachine.SetNextState((EntityState)(object)new VariableHoverOn
				{
					hoverVelocityMultiplier = hoverVelocityMultiplier,
					hoverAccelerationMultiplier = hoverAccelerationMultiplier
				});
				for (int i = 0; (float)i < hoverDuration + 1f; i++)
				{
					((EntityState)this).characterBody.AddTimedBuffAuthority(IndicatorBuff.buffIndex, hoverDuration - (float)i);
				}
			}
			if (base.inJetpackState && (!flag || !canHover || hoverOnCooldown))
			{
				base.jetpackStateMachine.SetNextState((EntityState)new Idle());
			}
		}

		public override void FixedUpdate()
		{
			((ChirrMain)this).FixedUpdate();
			base.inJetpackState = Object.op_Implicit((Object)(object)base.jetpackStateMachine) && ((object)base.jetpackStateMachine.state).GetType() == typeof(VariableHoverOn);
			if (hoverHasDuration && base.inJetpackState && !hoverOnCooldown)
			{
				hoverStopwatch -= Time.fixedDeltaTime;
				hoverOnCooldown = hoverStopwatch <= 0f;
			}
		}

		public override void OnExit()
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Expected O, but got Unknown
			if (NetworkServer.active)
			{
				while (((EntityState)this).characterBody.HasBuff(IndicatorBuff))
				{
					((EntityState)this).characterBody.RemoveBuff(IndicatorBuff);
				}
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && hoverHasDuration)
			{
				((EntityState)this).characterMotor.onHitGroundAuthority -= new HitGroundDelegate(ResetHoverCooldown);
			}
			((ChirrMain)this).OnExit();
		}
	}
}
namespace ChirrAltSkills.Chirr.SkillDefs
{
	public class DiggerCloneComponent : MonoBehaviour
	{
		private float adrenalineGainBuffer;

		private float adrenalineCap;

		private int moneyTracker;

		private float residue;

		private int buffCounter;

		public CharacterBody characterBody;

		public void Awake()
		{
			characterBody = ((Component)this).GetComponent<CharacterBody>();
		}

		public void Start()
		{
			adrenalineGainBuffer = 0.3f;
			moneyTracker = (int)characterBody.master.money;
			adrenalineCap = (CASPlugin.modloaded_Digger ? GetModdedAdrenalineCap() : 49f);
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		public float GetModdedAdrenalineCap()
		{
			return DiggerPlugin.adrenalineCap;
		}

		public void FixedUpdate()
		{
			adrenalineGainBuffer -= Time.fixedDeltaTime;
			if (adrenalineGainBuffer <= 0f && NetworkServer.active)
			{
				UpdatePassiveBuff();
			}
			else
			{
				buffCounter = characterBody.GetBuffCount(Buffs.adrenalineBuff);
			}
		}

		private void UpdatePassiveBuff()
		{
			int buffCount = characterBody.GetBuffCount(Buffs.adrenalineBuff);
			int money = (int)characterBody.master.money;
			if (moneyTracker < money)
			{
				RefreshExistingStacks(buffCount);
				GiveNewStacks(money);
			}
			moneyTracker = money;
			HandleStackDecay(buffCount);
		}

		private void RefreshExistingStacks(int currentCount)
		{
			characterBody.ClearTimedBuffs(Buffs.adrenalineBuff);
			for (int i = 0; i < currentCount; i++)
			{
				if ((float)characterBody.GetBuffCount(Buffs.adrenalineBuff) <= adrenalineCap)
				{
					characterBody.AddTimedBuff(Buffs.adrenalineBuff, 5f);
				}
			}
		}

		private void GiveNewStacks(int newMoney)
		{
			float num = (float)(newMoney - moneyTracker) / Mathf.Pow(Run.instance.difficultyCoefficient, 1.25f);
			residue = (num + residue) % 5f;
			float num2 = (num + residue) / 5f;
			for (int i = 1; (float)i <= num2; i++)
			{
				if ((float)characterBody.GetBuffCount(Buffs.adrenalineBuff) <= adrenalineCap)
				{
					characterBody.AddTimedBuff(Buffs.adrenalineBuff, 5f);
				}
			}
		}

		private void HandleStackDecay(int currentCount)
		{
			if (buffCounter != 0 && currentCount == 0)
			{
				for (int i = 1; (double)i < (double)buffCounter * 0.5; i++)
				{
					if ((float)characterBody.GetBuffCount(Buffs.adrenalineBuff) <= adrenalineCap)
					{
						characterBody.AddTimedBuff(Buffs.adrenalineBuff, 1f);
					}
				}
			}
			buffCounter = characterBody.GetBuffCount(Buffs.adrenalineBuff);
		}

		private void OnDestroy()
		{
			characterBody.ClearTimedBuffs(Buffs.adrenalineBuff);
		}
	}
	public class PassiveDiggerSD : AssignableSkillDef
	{
		protected class InstanceData : BaseSkillInstanceData
		{
			public DiggerCloneComponent diggerComponent;
		}

		public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot)
		{
			if (!NetworkServer.active)
			{
				return base.OnAssigned(skillSlot);
			}
			DiggerCloneComponent diggerCloneComponent = ((Component)skillSlot.characterBody).GetComponent<DiggerCloneComponent>();
			if (!Object.op_Implicit((Object)(object)diggerCloneComponent))
			{
				diggerCloneComponent = ComponentHelpers.AddComponent<DiggerCloneComponent>((MonoBehaviour)(object)skillSlot.characterBody);
			}
			return (BaseSkillInstanceData)(object)new InstanceData
			{
				diggerComponent = diggerCloneComponent
			};
		}

		public override void OnUnassigned(GenericSkill skillSlot)
		{
			if (NetworkServer.active)
			{
				Object.Destroy((Object)(object)((InstanceData)(object)skillSlot.skillInstanceData).diggerComponent);
			}
			base.OnUnassigned(skillSlot);
		}
	}
	public class PassiveSnackiesPerStageSD : AssignableSkillDef
	{
		public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot)
		{
			if (NetworkServer.active)
			{
				int num = Mathf.Abs(Run.instance.stageClearCount);
				int num2 = 2 + num * 2;
				for (int i = 0; i < num2; i++)
				{
					skillSlot.characterBody.AddBuff(Buffs.indulgenceBuff);
				}
			}
			return base.OnAssigned(skillSlot);
		}

		public override void OnUnassigned(GenericSkill skillSlot)
		{
			if (NetworkServer.active)
			{
				while (skillSlot.characterBody.HasBuff(Buffs.indulgenceBuff))
				{
					skillSlot.characterBody.RemoveBuff(Buffs.indulgenceBuff);
				}
			}
			base.OnUnassigned(skillSlot);
		}
	}
	public class PassiveSoulmateSD : AssignableSkillDef
	{
		public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot)
		{
			if (NetworkServer.active && !ChirrSetup.chirrSoulmates.Contains(skillSlot.characterBody))
			{
				ChirrSetup.chirrSoulmates.Add(skillSlot.characterBody);
				ComponentHelpers.AddComponent<SoulmateChirrBuffer>((MonoBehaviour)(object)skillSlot.characterBody).body = skillSlot.characterBody;
			}
			return base.OnAssigned(skillSlot);
		}

		public override void OnUnassigned(GenericSkill skillSlot)
		{
			if (NetworkServer.active && ChirrSetup.chirrSoulmates.Contains(skillSlot.characterBody))
			{
				ChirrSetup.chirrSoulmates.Remove(skillSlot.characterBody);
				SoulmateChirrBuffer component = ((Component)skillSlot.characterBody).GetComponent<SoulmateChirrBuffer>();
				if (Object.op_Implicit((Object)(object)component))
				{
					Object.Destroy((Object)(object)component);
				}
			}
			base.OnUnassigned(skillSlot);
		}
	}
	public class PassiveStageBuffSD : AssignableSkillDef
	{
		public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			Scene activeScene = SceneManager.GetActiveScene();
			ChirrStageBuffInfo.StageBuffInfo stageBuffInfo = ChirrStageBuffInfo.GetStageBuffInfo(((Scene)(ref activeScene)).name);
			stageBuffInfo.Apply(skillSlot.characterBody);
			stageBuffInfo.SendChatAnnouncementMessage(skillSlot.characterBody);
			return base.OnAssigned(skillSlot);
		}
	}
}
namespace ChirrAltSkills.Chirr.SkillDefs.TargetableSkillDef
{
	public class ChirrTargetableSkillDef : AssignableSkillDef
	{
		protected class InstanceData : BaseSkillInstanceData
		{
			public ChirrTracker chirrTracker;

			public bool healthThreshold = false;

			public float healthThresholdPercentage;
		}

		public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot)
		{
			ChirrTracker component = ((Component)skillSlot).GetComponent<ChirrTracker>();
			((Behaviour)component).enabled = true;
			return (BaseSkillInstanceData)(object)new InstanceData
			{
				chirrTracker = component
			};
		}

		public override void OnUnassigned(GenericSkill skillSlot)
		{
			((Behaviour)((InstanceData)(object)skillSlot.skillInstanceData).chirrTracker).enabled = false;
			base.OnUnassigned(skillSlot);
		}

		private static bool HasTarget([NotNull] GenericSkill skillSlot)
		{
			ChirrTracker chirrTracker = ((InstanceData)(object)skillSlot.skillInstanceData).chirrTracker;
			return Object.op_Implicit((Object)(object)(((Object)(object)chirrTracker != (Object)null) ? chirrTracker.GetTrackingTarget() : null));
		}

		public override bool CanExecute([NotNull] GenericSkill skillSlot)
		{
			return HasTarget(skillSlot) && ((SkillDef)this).CanExecute(skillSlot);
		}

		public override bool IsReady([NotNull] GenericSkill skillSlot)
		{
			return ((SkillDef)this).IsReady(skillSlot) && HasTarget(skillSlot);
		}
	}
	[RequireComponent(typeof(InputBankTest))]
	[RequireComponent(typeof(CharacterBody))]
	[RequireComponent(typeof(TeamComponent))]
	public class ChirrTracker : MonoBehaviour
	{
		public float maxTrackingDistanceCalculated = 5f;

		public float maxTrackingDistance = 5f;

		public const float maxTrackingDistancePerStack = 1f;

		public const float maxTrackingAngle = 20f;

		public float trackerUpdateFrequency = 10f;

		private HurtBox trackingTarget;

		private CharacterBody characterBody;

		private TeamComponent teamComponent;

		private InputBankTest inputBank;

		private float trackerUpdateStopwatch;

		private Indicator indicator;

		private readonly BullseyeSearch search = new BullseyeSearch();

		public bool targetNeedsHealthThreshold = false;

		public float targetHealthThresholdPercentage = 1f;

		public bool targetCanBeBoss = false;

		public bool targetCanBeNonMaster = false;

		private void Awake()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			indicator = new Indicator(((Component)this).gameObject, LegacyResourcesAPI.Load<GameObject>("Prefabs/HuntressTrackingIndicator"));
		}

		private void Start()
		{
			characterBody = ((Component)this).GetComponent<CharacterBody>();
			inputBank = ((Component)this).GetComponent<InputBankTest>();
			teamComponent = ((Component)this).GetComponent<TeamComponent>();
		}

		public HurtBox GetTrackingTarget()
		{
			return trackingTarget;
		}

		private void OnEnable()
		{
			indicator.active = true;
		}

		private void OnDisable()
		{
			indicator.active = false;
		}

		private void FixedUpdate()
		{
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			trackerUpdateStopwatch += Time.fixedDeltaTime;
			if (trackerUpdateStopwatch >= 1f / trackerUpdateFrequency)
			{
				ModifyRange();
				trackerUpdateStopwatch -= 1f / trackerUpdateFrequency;
				Ray aimRay = default(Ray);
				((Ray)(ref aimRay))..ctor(inputBank.aimOrigin, inputBank.aimDirection);
				SearchForTarget(aimRay);
				indicator.targetTransform = (Object.op_Implicit((Object)(object)trackingTarget) ? ((Component)trackingTarget).transform : null);
			}
		}

		private void ModifyRange()
		{
			int buffCount = characterBody.GetBuffCount(Buffs.snackiesBuff);
			maxTrackingDistanceCalculated = maxTrackingDistance + 1f * (float)buffCount;
		}

		private bool CanTargetBoss(HurtBox hurtBox)
		{
			return targetCanBeBoss || !hurtBox.healthComponent.body.isBoss;
		}

		private bool CanTargetMaster(HurtBox hurtBox)
		{
			return targetCanBeNonMaster || !Object.op_Implicit((Object)(object)hurtBox.healthComponent.body.master);
		}

		private bool CanTargetHealthPercentage(HurtBox hurtBox)
		{
			return !targetNeedsHealthThreshold || hurtBox.healthComponent.combinedHealthFraction <= targetHealthThresholdPercentage;
		}

		private void SearchForTarget(Ray aimRay)
		{
			//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_0017: 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_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)
			search.teamMaskFilter = TeamMask.GetUnprotectedTeams(teamComponent.teamIndex);
			search.filterByLoS = true;
			search.searchOrigin = ((Ray)(ref aimRay)).origin;
			search.searchDirection = ((Ray)(ref aimRay)).direction;
			search.sortMode = (SortMode)1;
			search.maxDistanceFilter = maxTrackingDistanceCalculated;
			search.maxAngleFilter = 20f;
			search.RefreshCandidates();
			search.FilterOutGameObject(((Component)this).gameObject);
			IEnumerable<HurtBox> results = search.GetResults();
			bool flag = false;
			foreach (HurtBox item in results)
			{
				if (!Object.op_Implicit((Object)(object)item.healthComponent) || !item.healthComponent.alive || !Object.op_Implicit((Object)(object)item.healthComponent.body) || !CanTargetHealthPercentage(item) || !CanTargetMaster(item) || !CanTargetBoss(item))
				{
					continue;
				}
				trackingTarget = item;
				flag = true;
				break;
			}
			if (!flag)
			{
				trackingTarget = null;
			}
		}
	}
}
namespace ChirrAltSkills.Chirr.SkillDefs.Special
{
	public class EatEnemyScepterSD : ChirrTargetableSkillDef
	{
		public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot)
		{
			BaseSkillInstanceData val = base.OnAssigned(skillSlot);
			ChirrTracker chirrTracker = ((InstanceData)(object)val).chirrTracker;
			chirrTracker.maxTrackingDistance = 10f;
			chirrTracker.targetNeedsHealthThreshold = false;
			chirrTracker.targetCanBeNonMaster = true;
			chirrTracker.targetCanBeBoss = true;
			return val;
		}
	}
	public class EatEnemySD : ChirrTargetableSkillDef
	{
		public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot)
		{
			BaseSkillInstanceData val = base.OnAssigned(skillSlot);
			ChirrTracker chirrTracker = ((InstanceData)(object)val).chirrTracker;
			chirrTracker.maxTrackingDistance = 5f;
			chirrTracker.targetNeedsHealthThreshold = false;
			chirrTracker.targetCanBeNonMaster = true;
			chirrTracker.targetCanBeBoss = false;
			return val;
		}
	}
	internal class EatRadiusBehavior : MonoBehaviour
	{
		private CharacterBody characterBody;

		private readonly float updateFrequency = 0.5f;

		private float stopwatch = 0f;

		private GameObject indicator;

		private bool indicatorEnabled
		{
			get
			{
				return Object.op_Implicit((Object)(object)indicator);
			}
			set
			{
				//IL_002a: Unknown result type (might be due to invalid IL or missing references)
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				if (indicatorEnabled != value)
				{
					if (value)
					{
						GameObject val = LegacyResourcesAPI.Load<GameObject>("Prefabs/NetworkedObjects/NearbyDamageBonusIndicator");
						indicator = Object.Instantiate<GameObject>(val, characterBody.corePosition, Quaternion.identity);
						indicator.GetComponent<NetworkedBodyAttachment>().AttachToGameObjectAndSpawn(((Component)this).gameObject, (string)null);
					}
					else
					{
						Object.Destroy((Object)(object)indicator);
						indicator = null;
					}
				}
			}
		}

		private void Awake()
		{
			characterBody = ((Component)this).gameObject.GetComponent<CharacterBody>();
		}

		private void OnEnable()
		{
			indicatorEnabled = true;
		}

		private void OnDisable()
		{
			indicatorEnabled = false;
		}

		private void FixedUpdate()
		{
		}
	}
	public class TransformEnemyScepterSD : ChirrTargetableSkillDef
	{
		public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot)
		{
			BaseSkillInstanceData val = base.OnAssigned(skillSlot);
			ChirrTracker chirrTracker = ((InstanceData)(object)val).chirrTracker;
			chirrTracker.maxTrackingDistance = 10f;
			chirrTracker.targetCanBeBoss = false;
			chirrTracker.targetCanBeNonMaster = true;
			chirrTracker.targetNeedsHealthThreshold = true;
			chirrTracker.targetHealthThresholdPercentage = 0.5f;
			return val;
		}
	}
	public class TransformEnemySD : ChirrTargetableSkillDef
	{
		public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot)
		{
			BaseSkillInstanceData val = base.OnAssigned(skillSlot);
			ChirrTracker chirrTracker = ((InstanceData)(object)val).chirrTracker;
			chirrTracker.maxTrackingDistance = 5f;
			chirrTracker.targetCanBeBoss = true;
			chirrTracker.targetCanBeNonMaster = true;
			chirrTracker.targetNeedsHealthThreshold = true;
			chirrTracker.targetHealthThresholdPercentage = 0.5f;
			return val;
		}
	}
}
namespace ChirrAltSkills.Chirr.SkillDefs.Passive
{
	public class PassiveBunnySD : AssignableSkillDef
	{
		public class InstanceData : BaseSkillInstanceData
		{
			public GenericSkill skillSlot;

			public void BunnyBoostOnLand_Server(ref HitGroundInfo _)
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				skillSlot.characterBody.AddTimedBuffAuthority(Buffs.bunnyJumpBuff.buffIndex, 10f);
			}
		}

		public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot)
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Expected O, but got Unknown
			InstanceData instanceData = new InstanceData
			{
				skillSlot = skillSlot
			};
			CharacterBody characterBody = skillSlot.characterBody;
			characterBody.baseJumpCount += 2;
			CharacterBody characterBody2 = skillSlot.characterBody;
			characterBody2.baseJumpPower -= 3.75f;
			CharacterBody characterBody3 = skillSlot.characterBody;
			characterBody3.bodyFlags = (BodyFlags)(characterBody3.bodyFlags | 1);
			skillSlot.characterBody.MarkAllStatsDirty();
			skillSlot.characterBody.characterMotor.onHitGroundAuthority += new HitGroundDelegate(instanceData.BunnyBoostOnLand_Server);
			return (BaseSkillInstanceData)(object)instanceData;
		}

		public override void OnUnassigned(GenericSkill skillSlot)
		{
			//IL_0066: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Expected O, but got Unknown
			CharacterBody characterBody = skillSlot.characterBody;
			characterBody.baseJumpCount -= 2;
			CharacterBody characterBody2 = skillSlot.characterBody;
			characterBody2.baseJumpPower += 3.75f;
			if (NetworkServer.active)
			{
				while (skillSlot.characterBody.HasBuff(Buffs.bunnyJumpBuff))
				{
					skillSlot.characterBody.RemoveBuff(Buffs.bunnyJumpBuff);
				}
			}
			CharacterBody characterBody3 = skillSlot.characterBody;
			characterBody3.bodyFlags = (BodyFlags)(characterBody3.bodyFlags & -2);
			skillSlot.characterBody.MarkAllStatsDirty();
			skillSlot.characterBody.characterMotor.onHitGroundAuthority -= new HitGroundDelegate(((InstanceData)(object)skillSlot.skillInstanceData).BunnyBoostOnLand_Server);
			base.OnUnassigned(skillSlot);
		}
	}
	public class PassiveTakeFlightSD : AssignableSkillDef
	{
		public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot)
		{
			skillSlot.characterBody.baseJumpPower = 22.5f;
			return base.OnAssigned(skillSlot);
		}

		public override void OnUnassigned(GenericSkill skillSlot)
		{
			skillSlot.characterBody.baseJumpPower = 15f;
			base.OnUnassigned(skillSlot);
		}
	}
}