Decompiled source of Yuumi v1.0.2

Yuumi.dll

Decompiled 3 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using EntityStates;
using EntityStates.Merc;
using JetBrains.Annotations;
using KinematicCharacterController;
using On.RoR2.Projectile;
using R2API;
using R2API.Utils;
using RoR2;
using RoR2.Audio;
using RoR2.Projectile;
using RoR2.Skills;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("Yuumi")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Yuumi")]
[assembly: AssemblyTitle("Yuumi")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Yuumi;

internal class Assets
{
	public static AssetBundle MainAssetBundle;

	public static void PopulateAssets()
	{
		if ((Object)(object)MainAssetBundle == (Object)null)
		{
			using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Yuumi.yuumiassets");
			MainAssetBundle = AssetBundle.LoadFromStream(stream);
		}
		using Stream stream2 = Assembly.GetExecutingAssembly().GetManifestResourceStream("Yuumi.Yuumi.bnk");
		byte[] array = new byte[stream2.Length];
		stream2.Read(array, 0, array.Length);
		SoundBanks.Add(array);
	}
}
internal class YuumiSkillDef : SkillDef
{
	private class InstanceData : BaseSkillInstanceData
	{
		public AttachBehaviour behaviour;
	}

	public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot)
	{
		return (BaseSkillInstanceData)(object)new InstanceData
		{
			behaviour = ((Component)skillSlot).GetComponent<AttachBehaviour>()
		};
	}

	internal static bool IsExecutable([NotNull] GenericSkill skillSlot)
	{
		AttachBehaviour behaviour = ((InstanceData)(object)skillSlot.skillInstanceData).behaviour;
		SkillLocator component = ((Component)skillSlot).GetComponent<SkillLocator>();
		if (component.GetSkillSlotIndex(skillSlot) == 0)
		{
			return behaviour.canExecutePrimary;
		}
		return behaviour.canExecute;
	}

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

	public override bool IsReady([NotNull] GenericSkill skillSlot)
	{
		return ((SkillDef)this).IsReady(skillSlot) && IsExecutable(skillSlot);
	}
}
internal static class BullseyeBossFilter
{
	public static void FilterOutEnemies(this BullseyeSearch b, TeamIndex teamIndex)
	{
		//IL_0007: 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)
		b.candidatesEnumerable = b.candidatesEnumerable.Where((CandidateInfo v) => v.hurtBox.healthComponent.body.teamComponent.teamIndex == teamIndex);
	}
}
internal class AttachBehaviour : HuntressTracker
{
	internal static SkillDef primaryOverride;

	private CharacterBody attachedBody;

	public bool enable = true;

	public bool canExecute = true;

	public bool canExecutePrimary = true;

	private float stopwatch;

	private GameObject attachment;

	private Inventory inventory;

	private Inventory yuumiInventory;

	public AimRequest aimRequest;

	private List<ItemIndex> itemBlacklist;

	public CharacterBody AttachedBody => Object.op_Implicit((Object)(object)attachedBody) ? attachedBody : null;

	public Transform attachmentPosition => Object.op_Implicit((Object)(object)attachment) ? attachment.GetComponent<ChildLocator>().FindChild("position") : null;

	public bool isAttached => Object.op_Implicit((Object)(object)attachedBody);

	public HurtBox target => Object.op_Implicit((Object)(object)base.trackingTarget) ? base.trackingTarget : null;

	private void Awake()
	{
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_001e: Expected O, but got Unknown
		//IL_0037: 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_0059: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
		((HuntressTracker)this).Awake();
		base.indicator = new Indicator(((Component)this).gameObject, Prefabs.yuumiIndicator);
		base.indicator.active = true;
		itemBlacklist = new List<ItemIndex>
		{
			Items.HealingPotion.itemIndex,
			Items.BearVoid.itemIndex,
			Items.ExtraLife.itemIndex,
			Items.ExtraLifeConsumed.itemIndex,
			Items.FragileDamageBonusConsumed.itemIndex,
			Items.HealingPotionConsumed.itemIndex,
			Items.RegeneratingScrapConsumed.itemIndex,
			Items.ExtraLifeVoid.itemIndex,
			Items.ExtraLifeVoidConsumed.itemIndex
		};
	}

	private void OnEnable()
	{
		base.trackerUpdateFrequency = 10f;
		base.maxTrackingDistance = 100f;
	}

	public void Detach(CharacterBody newBody = null)
	{
		if (Object.op_Implicit((Object)(object)base.characterBody) && Object.op_Implicit((Object)(object)base.characterBody.skillLocator) && base.characterBody.skillLocator.primary.HasSkillOverrideOfPriority((SkillOverridePriority)4))
		{
			base.characterBody.skillLocator.primary.UnsetSkillOverride((object)this, primaryOverride, (SkillOverridePriority)4);
		}
		attachedBody = newBody;
		RemoveItems();
	}

	public void Attach()
	{
		//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_019c: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)base.characterBody) && Object.op_Implicit((Object)(object)base.characterBody.skillLocator))
		{
			base.characterBody.skillLocator.primary.SetSkillOverride((object)this, primaryOverride, (SkillOverridePriority)4);
		}
		if (!Object.op_Implicit((Object)(object)attachment))
		{
			attachment = Object.Instantiate<GameObject>(Prefabs.attachAttachment, target.healthComponent.body.transform);
		}
		else
		{
			attachment.transform.SetParent(target.healthComponent.body.transform);
		}
		attachment.transform.localPosition = ((Component)target.healthComponent.body.mainHurtBox).transform.localPosition;
		attachment.GetComponent<ChildLocator>().FindChild("position").localPosition = new Vector3(target.healthComponent.body.radius * 2f, 0f, 0f);
		attachedBody = target.healthComponent.body;
		if (!attachedBody.isPlayerControlled || MainPlugin.giveItemsToPlayers.Value)
		{
			inventory = (Object.op_Implicit((Object)(object)attachedBody.inventory) ? attachedBody.inventory : null);
			if (Object.op_Implicit((Object)(object)yuumiInventory) && NetworkServer.active)
			{
				for (int i = 0; i < yuumiInventory.itemStacks.Length; i++)
				{
					ItemIndex val = (ItemIndex)i;
					if (!itemBlacklist.Contains(val))
					{
						inventory.GiveItem(val, yuumiInventory.GetItemCount(val));
					}
				}
			}
		}
		canExecute = false;
	}

	private void FixedUpdate()
	{
		//IL_00a7: 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_00d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_016f: Unknown result type (might be due to invalid IL or missing references)
		((HuntressTracker)this).FixedUpdate();
		if (!Object.op_Implicit((Object)(object)yuumiInventory) && Object.op_Implicit((Object)(object)base.characterBody) && Object.op_Implicit((Object)(object)base.characterBody.inventory))
		{
			yuumiInventory = base.characterBody.inventory;
		}
		base.trackerUpdateStopwatch = 0f;
		if (!base.indicator.active)
		{
			return;
		}
		stopwatch += Time.fixedDeltaTime;
		if (stopwatch >= 0.1f)
		{
			stopwatch = 0f;
			Ray val = default(Ray);
			((Ray)(ref val))..ctor(base.inputBank.aimOrigin, base.inputBank.aimDirection);
			base.search.filterByLoS = true;
			base.search.searchOrigin = ((Ray)(ref val)).origin;
			base.search.searchDirection = ((Ray)(ref val)).direction;
			base.search.sortMode = (SortMode)1;
			base.search.maxDistanceFilter = base.maxTrackingDistance;
			base.search.maxAngleFilter = base.maxTrackingAngle;
			base.search.RefreshCandidates();
			base.search.FilterOutGameObject(((Component)this).gameObject);
			if (Object.op_Implicit((Object)(object)attachedBody))
			{
				base.search.FilterOutGameObject(((Component)attachedBody).gameObject);
			}
			base.search.FilterOutEnemies(base.teamComponent.teamIndex);
			base.trackingTarget = base.search.GetResults().FirstOrDefault();
			base.indicator.targetTransform = (Object.op_Implicit((Object)(object)base.trackingTarget) ? ((Component)base.trackingTarget).transform : null);
		}
	}

	public void RemoveItems()
	{
		//IL_002e: 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_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		if (!Object.op_Implicit((Object)(object)inventory) || !Object.op_Implicit((Object)(object)yuumiInventory) || !NetworkServer.active)
		{
			return;
		}
		for (int i = 0; i < inventory.itemStacks.Length; i++)
		{
			ItemIndex val = (ItemIndex)i;
			if (!itemBlacklist.Contains(val))
			{
				inventory.RemoveItem(val, yuumiInventory.GetItemCount(val));
			}
		}
	}

	private void OnDisable()
	{
		if (Object.op_Implicit((Object)(object)attachment))
		{
			Object.Destroy((Object)(object)attachment);
		}
		RemoveItems();
	}
}
internal class YuumiDisplayBehaviour : MonoBehaviour
{
	private uint ID;

	private void OnEnable()
	{
		ID = AkSoundEngine.PostEvent(Sounds.Play_Yuumi_Respawn, ((Component)this).gameObject);
	}

	private void OnDisable()
	{
		AkSoundEngine.StopPlayingID(ID);
	}
}
internal class Hook
{
	internal static void Hooks()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Expected O, but got Unknown
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0036: Expected O, but got Unknown
		RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
		ProjectileController.IgnoreCollisionsWithOwner += new hook_IgnoreCollisionsWithOwner(ProjectileController_IgnoreCollisionsWithOwner);
		ProjectileSingleTargetImpact.OnProjectileImpact += new hook_OnProjectileImpact(ProjectileSingleTargetImpact_OnProjectileImpact);
	}

	private static void ProjectileSingleTargetImpact_OnProjectileImpact(orig_OnProjectileImpact orig, ProjectileSingleTargetImpact self, ProjectileImpactInfo impactInfo)
	{
		//IL_0013: 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_0026: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)self.impactEffect == (Object)(object)Prefabs.projectileHitEffect && Object.op_Implicit((Object)(object)impactInfo.collider))
		{
			HurtBox component = ((Component)impactInfo.collider).GetComponent<HurtBox>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				self.impactEffect = Prefabs.projectileHitEffectWeak;
			}
		}
		orig.Invoke(self, impactInfo);
	}

	private static void ProjectileController_IgnoreCollisionsWithOwner(orig_IgnoreCollisionsWithOwner orig, ProjectileController self, bool shouldIgnore)
	{
		if (Object.op_Implicit((Object)(object)self.owner) && Object.op_Implicit((Object)(object)self.owner.GetComponent<AttachBehaviour>()))
		{
			AttachBehaviour component = self.owner.GetComponent<AttachBehaviour>();
			if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.AttachedBody))
			{
				ModelLocator component2 = ((Component)component.AttachedBody).GetComponent<ModelLocator>();
				if (!Object.op_Implicit((Object)(object)component2))
				{
					return;
				}
				Transform modelTransform = component2.modelTransform;
				if (!Object.op_Implicit((Object)(object)modelTransform))
				{
					return;
				}
				HurtBoxGroup component3 = ((Component)modelTransform).GetComponent<HurtBoxGroup>();
				if (!Object.op_Implicit((Object)(object)component3))
				{
					return;
				}
				HurtBox[] hurtBoxes = component3.hurtBoxes;
				for (int i = 0; i < hurtBoxes.Length; i++)
				{
					List<Collider> gameObjectComponents = GetComponentsCache<Collider>.GetGameObjectComponents(((Component)hurtBoxes[i]).gameObject);
					int j = 0;
					for (int count = gameObjectComponents.Count; j < count; j++)
					{
						Collider val = gameObjectComponents[j];
						for (int k = 0; k < self.myColliders.Length; k++)
						{
							Collider val2 = self.myColliders[k];
							Physics.IgnoreCollision(val, val2, shouldIgnore);
						}
					}
					GetComponentsCache<Collider>.ReturnBuffer(gameObjectComponents);
				}
			}
		}
		orig.Invoke(self, shouldIgnore);
	}

	private static void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
	{
		if (sender.HasBuff(Prefabs.zoom))
		{
			args.moveSpeedMultAdd += 0.5f;
		}
		if (sender.HasBuff(Prefabs.zoomies))
		{
			args.moveSpeedMultAdd += 0.4f;
			args.attackSpeedMultAdd += 0.35f;
		}
	}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.Dragonyck.Yuumi", "Yuumi", "1.0.1")]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
public class MainPlugin : BaseUnityPlugin
{
	public const string MODUID = "com.Dragonyck.Yuumi";

	public const string MODNAME = "Yuumi";

	public const string VERSION = "1.0.1";

	public const string SURVIVORNAME = "Yuumi";

	public const string SURVIVORNAMEKEY = "YUUMI";

	public static GameObject characterPrefab;

	private static readonly Color characterColor = new Color(0.35294f, 0.42745f, 0.83922f);

	public static ConfigEntry<bool> giveItemsToPlayers;

	private void Awake()
	{
		//IL_0011: 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_002c: Expected O, but got Unknown
		//IL_002c: Expected O, but got Unknown
		giveItemsToPlayers = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("Give Items To Attached Players", "Enable"), false, new ConfigDescription("This mechanic can be easily exploitable, so it's disabled by default.", (AcceptableValueBase)null, Array.Empty<object>()));
		Assets.PopulateAssets();
		Prefabs.CreatePrefabs();
		CreatePrefab();
		RegisterStates();
		RegisterCharacter();
		Hook.Hooks();
	}

	internal static void CreatePrefab()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Expected O, but got Unknown
		//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_0126: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Expected O, but got Unknown
		//IL_0153: Unknown result type (might be due to invalid IL or missing references)
		//IL_0164: Unknown result type (might be due to invalid IL or missing references)
		//IL_0175: Unknown result type (might be due to invalid IL or missing references)
		//IL_0198: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01da: Unknown result type (might be due to invalid IL or missing references)
		//IL_01df: Unknown result type (might be due to invalid IL or missing references)
		//IL_0257: Unknown result type (might be due to invalid IL or missing references)
		//IL_0388: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_042b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0430: Unknown result type (might be due to invalid IL or missing references)
		//IL_045d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0462: Unknown result type (might be due to invalid IL or missing references)
		//IL_04eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_051b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0528: Unknown result type (might be due to invalid IL or missing references)
		//IL_063b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0658: Unknown result type (might be due to invalid IL or missing references)
		//IL_0675: Unknown result type (might be due to invalid IL or missing references)
		//IL_0692: Unknown result type (might be due to invalid IL or missing references)
		//IL_06af: Unknown result type (might be due to invalid IL or missing references)
		//IL_06cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_06e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_08de: Unknown result type (might be due to invalid IL or missing references)
		//IL_08f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_08fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0902: Unknown result type (might be due to invalid IL or missing references)
		//IL_0960: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a1c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a21: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a4f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a54: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a7d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a82: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a93: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a98: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/CommandoBody.prefab").WaitForCompletion();
		characterPrefab = PrefabAPI.InstantiateClone(val, "YuumiBody", true);
		characterPrefab.GetComponent<NetworkIdentity>().localPlayerAuthority = true;
		characterPrefab.AddComponent<AttachBehaviour>();
		Object.Destroy((Object)(object)((Component)characterPrefab.transform.Find("ModelBase")).gameObject);
		Object.Destroy((Object)(object)((Component)characterPrefab.transform.Find("CameraPivot")).gameObject);
		Object.Destroy((Object)(object)((Component)characterPrefab.transform.Find("AimOrigin")).gameObject);
		GameObject val2 = Assets.MainAssetBundle.LoadAsset<GameObject>("yuumi");
		GameObject val3 = new GameObject("ModelBase");
		val3.transform.parent = characterPrefab.transform;
		val3.transform.localPosition = new Vector3(0f, -0.7f, 0f);
		val3.transform.localRotation = Quaternion.identity;
		val3.transform.localScale = new Vector3(1f, 1f, 1f);
		GameObject val4 = new GameObject("AimOrigin");
		val4.transform.parent = val3.transform;
		val4.transform.localPosition = new Vector3(0f, 1f, 0f);
		val4.transform.localRotation = Quaternion.identity;
		val4.transform.localScale = Vector3.one;
		Transform transform = val2.transform;
		transform.parent = val3.transform;
		transform.localPosition = Vector3.zero;
		transform.localScale = new Vector3(1f, 1f, 1f);
		transform.localRotation = Quaternion.identity;
		CharacterDirection component = characterPrefab.GetComponent<CharacterDirection>();
		component.moveVector = Vector3.zero;
		component.targetTransform = val3.transform;
		component.overrideAnimatorForwardTransform = null;
		component.rootMotionAccumulator = null;
		component.modelAnimator = val2.GetComponentInChildren<Animator>();
		component.driveFromRootRotation = false;
		component.turnSpeed = 720f;
		CharacterBody component2 = characterPrefab.GetComponent<CharacterBody>();
		((Object)component2).name = "YuumiBody";
		component2.baseNameToken = "YUUMI_NAME";
		component2.subtitleNameToken = "YUUMI_SUBTITLE";
		component2.bodyFlags = (BodyFlags)17;
		component2.rootMotionInMainState = false;
		component2.mainRootSpeed = 0f;
		component2.baseMaxHealth = 100f;
		component2.levelMaxHealth = 35f;
		component2.baseRegen = 1f;
		component2.levelRegen = 0.33f;
		component2.baseMaxShield = 0f;
		component2.levelMaxShield = 0f;
		component2.baseMoveSpeed = 7f;
		component2.levelMoveSpeed = 0f;
		component2.baseAcceleration = 110f;
		component2.baseJumpPower = 15f;
		component2.levelJumpPower = 0f;
		component2.baseDamage = 12f;
		component2.levelDamage = 2.4f;
		component2.baseAttackSpeed = 1f;
		component2.levelAttackSpeed = 0f;
		component2.baseCrit = 1f;
		component2.levelCrit = 0f;
		component2.baseArmor = 0f;
		component2.levelArmor = 0f;
		component2.baseJumpCount = 1;
		component2.sprintingSpeedMultiplier = 1.45f;
		component2.wasLucky = false;
		component2.hideCrosshair = false;
		component2.aimOriginTransform = val4.transform;
		component2.hullClassification = (HullClassification)0;
		component2.portraitIcon = (Texture)(object)Assets.MainAssetBundle.LoadAsset<Sprite>("portrait").texture;
		component2.isChampion = false;
		component2.currentVehicle = null;
		component2.skinIndex = 0u;
		component2.bodyColor = characterColor;
		CharacterMotor component3 = characterPrefab.GetComponent<CharacterMotor>();
		component3.walkSpeedPenaltyCoefficient = 1f;
		component3.characterDirection = component;
		component3.muteWalkMotion = false;
		component3.mass = 160f;
		component3.airControl = 0.25f;
		component3.disableAirControlUntilCollision = false;
		component3.generateParametersOnAwake = true;
		InputBankTest component4 = characterPrefab.GetComponent<InputBankTest>();
		component4.moveVector = Vector3.zero;
		CameraTargetParams component5 = characterPrefab.GetComponent<CameraTargetParams>();
		component5.cameraParams = val.GetComponent<CameraTargetParams>().cameraParams;
		component5.cameraPivotTransform = null;
		component5.recoil = Vector2.zero;
		component5.dontRaycastToPivot = false;
		ModelLocator component6 = characterPrefab.GetComponent<ModelLocator>();
		component6.modelTransform = transform;
		component6.modelBaseTransform = val3.transform;
		component6.dontReleaseModelOnDeath = false;
		component6.autoUpdateModelTransform = true;
		component6.dontDetatchFromParent = false;
		component6.noCorpse = false;
		component6.normalizeToFloor = false;
		component6.preserveModel = false;
		ChildLocator component7 = val2.GetComponent<ChildLocator>();
		CharacterModel val5 = val2.AddComponent<CharacterModel>();
		SkinnedMeshRenderer[] componentsInChildren = val2.GetComponentsInChildren<SkinnedMeshRenderer>();
		List<RendererInfo> list = new List<RendererInfo>();
		for (int i = 0; i < componentsInChildren.Length; i++)
		{
			list.Add(new RendererInfo
			{
				renderer = (Renderer)(object)componentsInChildren[i],
				defaultMaterial = Utils.InstantiateMaterial(((Renderer)componentsInChildren[i]).material.mainTexture),
				defaultShadowCastingMode = (ShadowCastingMode)1,
				ignoreOverlays = false
			});
		}
		RendererInfo[] array = list.ToArray();
		val5.body = component2;
		val5.baseRendererInfos = array;
		val5.autoPopulateLightInfos = true;
		val5.invisibilityCount = 0;
		val5.temporaryOverlays = new List<TemporaryOverlay>();
		Reflection.SetFieldValue<SkinnedMeshRenderer>((object)val5, "mainSkinnedMeshRenderer", componentsInChildren[0]);
		GameObject gameObject = ((Component)transform).gameObject;
		CharacterModel component8 = gameObject.GetComponent<CharacterModel>();
		ModelSkinController val6 = gameObject.AddComponent<ModelSkinController>();
		ChildLocator component9 = gameObject.GetComponent<ChildLocator>();
		LanguageAPI.Add("YUUMIBODY_DEFAULT_SKIN_NAME", "Default");
		LanguageAPI.Add("YUUMIBODY_SKIN01_NAME", "Battle Principal");
		LanguageAPI.Add("YUUMIBODY_SKIN02_NAME", "Heartseeker");
		LanguageAPI.Add("YUUMIBODY_SKIN03_NAME", "Yuubee");
		LanguageAPI.Add("YUUMIBODY_SKIN04_NAME", "Bewitching");
		LanguageAPI.Add("YUUMIBODY_SKIN05_NAME", "EDG");
		LanguageAPI.Add("YUUMIBODY_SKIN06_NAME", "Shiba");
		val6.skins = (SkinDef[])(object)new SkinDef[7]
		{
			LoadoutAPI.CreateNewSkinDef(Utils.CreateNewSkinDefInfo(componentsInChildren, gameObject, "YUUMIBODY_DEFAULT_SKIN_NAME", "base", array)),
			LoadoutAPI.CreateNewSkinDef(Utils.CreateNewSkinDefInfo(componentsInChildren, gameObject, "YUUMIBODY_SKIN01_NAME", "skin01", array)),
			LoadoutAPI.CreateNewSkinDef(Utils.CreateNewSkinDefInfo(componentsInChildren, gameObject, "YUUMIBODY_SKIN02_NAME", "skin02", array)),
			LoadoutAPI.CreateNewSkinDef(Utils.CreateNewSkinDefInfo(componentsInChildren, gameObject, "YUUMIBODY_SKIN03_NAME", "skin03", array)),
			LoadoutAPI.CreateNewSkinDef(Utils.CreateNewSkinDefInfo(componentsInChildren, gameObject, "YUUMIBODY_SKIN04_NAME", "skin04", array)),
			LoadoutAPI.CreateNewSkinDef(Utils.CreateNewSkinDefInfo(componentsInChildren, gameObject, "YUUMIBODY_SKIN05_NAME", "skin05", array)),
			LoadoutAPI.CreateNewSkinDef(Utils.CreateNewSkinDefInfo(componentsInChildren, gameObject, "YUUMIBODY_SKIN06_NAME", "skin06", array))
		};
		HealthComponent component10 = characterPrefab.GetComponent<HealthComponent>();
		component10.health = component2.baseMaxHealth;
		component10.shield = 0f;
		component10.barrier = 0f;
		component10.magnetiCharge = 0f;
		component10.body = null;
		component10.dontShowHealthbar = false;
		component10.globalDeathEventChanceCoefficient = 1f;
		characterPrefab.GetComponent<Interactor>().maxInteractionDistance = 3f;
		characterPrefab.GetComponent<InteractionDriver>().highlightInteractor = true;
		SfxLocator component11 = characterPrefab.GetComponent<SfxLocator>();
		component11.deathSound = "Play_ui_player_death";
		component11.barkSound = "";
		component11.openSound = "";
		component11.landingSound = "";
		component11.fallDamageSound = "Play_char_land_fall_damage";
		component11.aliveLoopStart = "";
		component11.aliveLoopStop = "";
		Rigidbody component12 = characterPrefab.GetComponent<Rigidbody>();
		component12.mass = 100f;
		component12.drag = 0f;
		component12.angularDrag = 0f;
		component12.useGravity = false;
		component12.isKinematic = true;
		component12.interpolation = (RigidbodyInterpolation)0;
		component12.collisionDetectionMode = (CollisionDetectionMode)0;
		component12.constraints = (RigidbodyConstraints)0;
		CapsuleCollider component13 = ((Component)component7.FindChild("collider")).GetComponent<CapsuleCollider>();
		((Collider)component13).isTrigger = false;
		((Collider)component13).material = null;
		KinematicCharacterMotor component14 = characterPrefab.GetComponent<KinematicCharacterMotor>();
		component14.CharacterController = (BaseCharacterController)(object)component3;
		component14.Capsule = component13;
		component14.Rigidbody = component12;
		component14.DetectDiscreteCollisions = false;
		component14.GroundDetectionExtraDistance = 0f;
		component14.MaxStepHeight = 0.2f;
		component14.MinRequiredStepDepth = 0.1f;
		component14.MaxStableSlopeAngle = 55f;
		component14.MaxStableDistanceFromLedge = 0.5f;
		component14.PreventSnappingOnLedges = false;
		component14.MaxStableDenivelationAngle = 55f;
		component14.RigidbodyInteractionType = (RigidbodyInteractionType)0;
		component14.PreserveAttachedRigidbodyMomentum = true;
		component14.HasPlanarConstraint = false;
		component14.PlanarConstraintAxis = Vector3.up;
		component14.StepHandling = (StepHandlingMethod)0;
		component14.LedgeHandling = true;
		component14.InteractiveRigidbodyHandling = true;
		component14.SafeMovement = false;
		HurtBoxGroup val7 = val2.AddComponent<HurtBoxGroup>();
		HurtBox val8 = ((Component)component13).gameObject.AddComponent<HurtBox>();
		((Component)val8).gameObject.layer = LayerIndex.entityPrecise.intVal;
		val8.healthComponent = component10;
		val8.isBullseye = true;
		val8.damageModifier = (DamageModifier)0;
		val8.hurtBoxGroup = val7;
		val8.indexInGroup = 0;
		val7.hurtBoxes = (HurtBox[])(object)new HurtBox[1] { val8 };
		val7.mainHurtBox = val8;
		val7.bullseyeCount = 1;
		AimAnimator val9 = val2.AddComponent<AimAnimator>();
		val9.inputBank = component4;
		val9.directionComponent = component;
		val9.pitchRangeMax = 55f;
		val9.pitchRangeMin = -50f;
		val9.yawRangeMin = -44f;
		val9.yawRangeMax = 44f;
		val9.pitchGiveupRange = 30f;
		val9.yawGiveupRange = 10f;
		val9.giveupDuration = 8f;
		EntityStateMachine component15 = ((Component)component2).GetComponent<EntityStateMachine>();
		component15.mainStateType = new SerializableEntityStateType(typeof(CharacterMain));
		CharacterDeathBehavior component16 = characterPrefab.GetComponent<CharacterDeathBehavior>();
		component16.deathStateMachine = characterPrefab.GetComponent<EntityStateMachine>();
		component16.deathState = new SerializableEntityStateType(typeof(GenericCharacterDeath));
		EntityStateMachine val10 = characterPrefab.AddComponent<EntityStateMachine>();
		val10.customName = "Attach";
		val10.initialStateType = new SerializableEntityStateType(typeof(Idle));
		val10.mainStateType = new SerializableEntityStateType(typeof(Idle));
		NetworkStateMachine component17 = ((Component)component2).GetComponent<NetworkStateMachine>();
		List<EntityStateMachine> list2 = component17.stateMachines.ToList();
		list2.Add(val10);
		component17.stateMachines = list2.ToArray();
		ContentAddition.AddBody(characterPrefab);
	}

	private void RegisterCharacter()
	{
		//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_012a: Unknown result type (might be due to invalid IL or missing references)
		//IL_012f: Unknown result type (might be due to invalid IL or missing references)
		string text = "<style=cSub>\r\n\r\n< ! > " + Environment.NewLine + "<style=cSub>\r\n\r\n< ! > " + Environment.NewLine + "<style=cSub>\r\n\r\n< ! > " + Environment.NewLine + "<style=cSub>\r\n\r\n< ! > ";
		string text2 = "..and so she left, still looking for her master.";
		string text3 = "..and so she vanished, off to wait for another gray screen.";
		LanguageAPI.Add("YUUMI_NAME", "Yuumi");
		LanguageAPI.Add("YUUMI_DESCRIPTION", text);
		LanguageAPI.Add("YUUMI_SUBTITLE", "");
		LanguageAPI.Add("YUUMI_OUTRO", text2);
		LanguageAPI.Add("YUUMI_FAIL", text3);
		SurvivorDef val = ScriptableObject.CreateInstance<SurvivorDef>();
		val.cachedName = "YUUMI_NAME";
		val.unlockableDef = null;
		val.descriptionToken = "YUUMI_DESCRIPTION";
		val.primaryColor = characterColor;
		val.bodyPrefab = characterPrefab;
		val.displayPrefab = Utils.NewDisplayModel(((Component)characterPrefab.GetComponent<ModelLocator>().modelBaseTransform).gameObject, "YuumiDisplay");
		val.outroFlavorToken = "YUUMI_OUTRO";
		val.desiredSortPosition = 16f;
		val.mainEndingEscapeFailureFlavorToken = "YUUMI_FAIL";
		ContentAddition.AddSurvivorDef(val);
		SkillSetup();
		GameObject val2 = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/CommandoMonsterMaster.prefab").WaitForCompletion(), "YuumiMaster", true);
		ContentAddition.AddMaster(val2);
		CharacterMaster component = val2.GetComponent<CharacterMaster>();
		component.bodyPrefab = characterPrefab;
	}

	private void RegisterStates()
	{
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0033: 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_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: 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_0063: Unknown result type (might be due to invalid IL or missing references)
		bool flag = default(bool);
		ContentAddition.AddEntityState<Primary>(ref flag);
		ContentAddition.AddEntityState<Secondary>(ref flag);
		ContentAddition.AddEntityState<SecondaryBuff>(ref flag);
		ContentAddition.AddEntityState<SecondaryAlt>(ref flag);
		ContentAddition.AddEntityState<Utility>(ref flag);
		ContentAddition.AddEntityState<UtilityDash>(ref flag);
		ContentAddition.AddEntityState<UtilityEnd>(ref flag);
		ContentAddition.AddEntityState<DashTowardsBody>(ref flag);
		ContentAddition.AddEntityState<Special>(ref flag);
		ContentAddition.AddEntityState<SpecialAlt>(ref flag);
		ContentAddition.AddEntityState<CharacterMain>(ref flag);
		ContentAddition.AddEntityState<AttachState>(ref flag);
		ContentAddition.AddEntityState<Cancel>(ref flag);
	}

	private void SkillSetup()
	{
		GenericSkill[] componentsInChildren = characterPrefab.GetComponentsInChildren<GenericSkill>();
		foreach (GenericSkill val in componentsInChildren)
		{
			Object.DestroyImmediate((Object)(object)val);
		}
		PassiveSetup();
		PrimarySetup();
		SecondarySetup();
		UtilitySetup();
		SpecialSetup();
	}

	private void PassiveSetup()
	{
		SkillLocator component = characterPrefab.GetComponent<SkillLocator>();
		LanguageAPI.Add("YUUMI_PASSIVE_NAME", "Book of Thresholds");
		LanguageAPI.Add("YUUMI_PASSIVE_DESCRIPTION", "Book protects Yuumi from high heights, granting her <style=cIsUtility>immunity</style> to fall damage.");
		component.passiveSkill.enabled = false;
		component.passiveSkill.skillNameToken = "YUUMI_PASSIVE_NAME";
		component.passiveSkill.skillDescriptionToken = "YUUMI_PASSIVE_DESCRIPTION";
		component.passiveSkill.icon = Assets.MainAssetBundle.LoadAsset<Sprite>("yuumiw2");
	}

	private void PrimarySetup()
	{
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0150: Unknown result type (might be due to invalid IL or missing references)
		//IL_0168: Unknown result type (might be due to invalid IL or missing references)
		//IL_0172: Expected O, but got Unknown
		//IL_0173: Unknown result type (might be due to invalid IL or missing references)
		//IL_0175: Unknown result type (might be due to invalid IL or missing references)
		//IL_019a: Unknown result type (might be due to invalid IL or missing references)
		//IL_019f: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
		SkillLocator component = characterPrefab.GetComponent<SkillLocator>();
		LanguageAPI.Add("YUUMI_M1", "Zooming Projectile");
		LanguageAPI.Add("YUUMI_M1_DESCRIPTION", "Yuumi fires a quick missile for <style=cIsDamage>150% damage</style>.");
		LanguageAPI.Add("YUUMI_M1ALT", "Prowling Projectile");
		LanguageAPI.Add("YUUMI_M1ALT_DESCRIPTION", "Yuumi fires an errant a quick missile for <style=cIsDamage>600% damage</style>.");
		YuumiSkillDef yuumiSkillDef = ScriptableObject.CreateInstance<YuumiSkillDef>();
		((SkillDef)yuumiSkillDef).activationState = new SerializableEntityStateType(typeof(Primary));
		((SkillDef)yuumiSkillDef).activationStateMachineName = "Weapon";
		((SkillDef)yuumiSkillDef).baseMaxStock = 0;
		((SkillDef)yuumiSkillDef).baseRechargeInterval = 0f;
		((SkillDef)yuumiSkillDef).beginSkillCooldownOnSkillEnd = true;
		((SkillDef)yuumiSkillDef).canceledFromSprinting = false;
		((SkillDef)yuumiSkillDef).fullRestockOnAssign = true;
		((SkillDef)yuumiSkillDef).interruptPriority = (InterruptPriority)0;
		((SkillDef)yuumiSkillDef).isCombatSkill = true;
		((SkillDef)yuumiSkillDef).mustKeyPress = false;
		((SkillDef)yuumiSkillDef).cancelSprintingOnActivation = true;
		((SkillDef)yuumiSkillDef).rechargeStock = 0;
		((SkillDef)yuumiSkillDef).requiredStock = 0;
		((SkillDef)yuumiSkillDef).stockToConsume = 0;
		((SkillDef)yuumiSkillDef).icon = Assets.MainAssetBundle.LoadAsset<Sprite>("yuumiq");
		((SkillDef)yuumiSkillDef).skillDescriptionToken = "YUUMI_M1_DESCRIPTION";
		((SkillDef)yuumiSkillDef).skillName = "YUUMI_M1";
		((SkillDef)yuumiSkillDef).skillNameToken = "YUUMI_M1";
		ContentAddition.AddSkillDef((SkillDef)(object)yuumiSkillDef);
		component.primary = characterPrefab.AddComponent<GenericSkill>();
		SkillFamily val = ScriptableObject.CreateInstance<SkillFamily>();
		val.variants = (Variant[])(object)new Variant[1];
		Reflection.SetFieldValue<SkillFamily>((object)component.primary, "_skillFamily", val);
		SkillFamily skillFamily = component.primary.skillFamily;
		Variant[] variants = skillFamily.variants;
		Variant val2 = new Variant
		{
			skillDef = (SkillDef)(object)yuumiSkillDef
		};
		((Variant)(ref val2)).viewableNode = new Node(((SkillDef)yuumiSkillDef).skillNameToken, false, (Node)null);
		variants[0] = val2;
		ContentAddition.AddSkillFamily(skillFamily);
		AttachBehaviour.primaryOverride = (SkillDef)(object)ScriptableObject.CreateInstance<YuumiSkillDef>();
		AttachBehaviour.primaryOverride.activationState = new SerializableEntityStateType(typeof(Primary));
		AttachBehaviour.primaryOverride.activationStateMachineName = "Weapon";
		AttachBehaviour.primaryOverride.baseMaxStock = 1;
		AttachBehaviour.primaryOverride.baseRechargeInterval = 3f;
		AttachBehaviour.primaryOverride.beginSkillCooldownOnSkillEnd = false;
		AttachBehaviour.primaryOverride.canceledFromSprinting = false;
		AttachBehaviour.primaryOverride.fullRestockOnAssign = true;
		AttachBehaviour.primaryOverride.interruptPriority = (InterruptPriority)0;
		AttachBehaviour.primaryOverride.isCombatSkill = true;
		AttachBehaviour.primaryOverride.mustKeyPress = false;
		AttachBehaviour.primaryOverride.cancelSprintingOnActivation = true;
		AttachBehaviour.primaryOverride.rechargeStock = 1;
		AttachBehaviour.primaryOverride.requiredStock = 1;
		AttachBehaviour.primaryOverride.stockToConsume = 1;
		AttachBehaviour.primaryOverride.icon = Assets.MainAssetBundle.LoadAsset<Sprite>("yuumiq2");
		AttachBehaviour.primaryOverride.skillDescriptionToken = "YUUMI_M1ALT_DESCRIPTION";
		AttachBehaviour.primaryOverride.skillName = "YUUMI_M1ALT";
		AttachBehaviour.primaryOverride.skillNameToken = "YUUMI_M1ALT";
		ContentAddition.AddSkillDef(AttachBehaviour.primaryOverride);
	}

	private void SecondarySetup()
	{
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0150: Unknown result type (might be due to invalid IL or missing references)
		//IL_0168: Unknown result type (might be due to invalid IL or missing references)
		//IL_0172: Expected O, but got Unknown
		//IL_0173: Unknown result type (might be due to invalid IL or missing references)
		//IL_0175: Unknown result type (might be due to invalid IL or missing references)
		//IL_0192: Unknown result type (might be due to invalid IL or missing references)
		//IL_0197: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0264: Unknown result type (might be due to invalid IL or missing references)
		//IL_0284: Unknown result type (might be due to invalid IL or missing references)
		//IL_028e: Expected O, but got Unknown
		//IL_028f: 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)
		SkillLocator component = characterPrefab.GetComponent<SkillLocator>();
		LanguageAPI.Add("YUUMI_M2", "Zoomies");
		LanguageAPI.Add("YUUMI_M2_DESCRIPTION", "Yuumi grants a temporary <style=cIsDamage>barrier</style> of <style=cIsHealth>20% health</style>, <style=cIsDamage>35% attack speed</style> and <style=cIsDamage>40% movement speed</style>. While attached, the buffs are granted to the ally instead.");
		LanguageAPI.Add("YUUMI_M2ALT", "Best Friend");
		LanguageAPI.Add("YUUMI_M2ALT_DESCRIPTION", "Yuumi <style=cIsHealing>heals</style> for <style=cIsHealth>20% health</style> and gains <style=cIsDamage>50% movement speed</style>. While attached, the buffs are granted to the ally instead.");
		YuumiSkillDef yuumiSkillDef = ScriptableObject.CreateInstance<YuumiSkillDef>();
		((SkillDef)yuumiSkillDef).activationState = new SerializableEntityStateType(typeof(Secondary));
		((SkillDef)yuumiSkillDef).activationStateMachineName = "Slide";
		((SkillDef)yuumiSkillDef).baseMaxStock = 1;
		((SkillDef)yuumiSkillDef).baseRechargeInterval = 5f;
		((SkillDef)yuumiSkillDef).beginSkillCooldownOnSkillEnd = true;
		((SkillDef)yuumiSkillDef).canceledFromSprinting = false;
		((SkillDef)yuumiSkillDef).fullRestockOnAssign = false;
		((SkillDef)yuumiSkillDef).interruptPriority = (InterruptPriority)0;
		((SkillDef)yuumiSkillDef).isCombatSkill = false;
		((SkillDef)yuumiSkillDef).mustKeyPress = true;
		((SkillDef)yuumiSkillDef).cancelSprintingOnActivation = false;
		((SkillDef)yuumiSkillDef).rechargeStock = 1;
		((SkillDef)yuumiSkillDef).requiredStock = 1;
		((SkillDef)yuumiSkillDef).stockToConsume = 1;
		((SkillDef)yuumiSkillDef).icon = Assets.MainAssetBundle.LoadAsset<Sprite>("yuumip");
		((SkillDef)yuumiSkillDef).skillDescriptionToken = "YUUMI_M2_DESCRIPTION";
		((SkillDef)yuumiSkillDef).skillName = "YUUMI_M2";
		((SkillDef)yuumiSkillDef).skillNameToken = "YUUMI_M2";
		ContentAddition.AddSkillDef((SkillDef)(object)yuumiSkillDef);
		component.secondary = characterPrefab.AddComponent<GenericSkill>();
		SkillFamily val = ScriptableObject.CreateInstance<SkillFamily>();
		val.variants = (Variant[])(object)new Variant[1];
		Reflection.SetFieldValue<SkillFamily>((object)component.secondary, "_skillFamily", val);
		SkillFamily skillFamily = component.secondary.skillFamily;
		Variant[] variants = skillFamily.variants;
		Variant val2 = new Variant
		{
			skillDef = (SkillDef)(object)yuumiSkillDef
		};
		((Variant)(ref val2)).viewableNode = new Node(((SkillDef)yuumiSkillDef).skillNameToken, false, (Node)null);
		variants[0] = val2;
		ContentAddition.AddSkillFamily(skillFamily);
		yuumiSkillDef = ScriptableObject.CreateInstance<YuumiSkillDef>();
		((SkillDef)yuumiSkillDef).activationState = new SerializableEntityStateType(typeof(SecondaryAlt));
		((SkillDef)yuumiSkillDef).activationStateMachineName = "Slide";
		((SkillDef)yuumiSkillDef).baseMaxStock = 1;
		((SkillDef)yuumiSkillDef).baseRechargeInterval = 5f;
		((SkillDef)yuumiSkillDef).beginSkillCooldownOnSkillEnd = true;
		((SkillDef)yuumiSkillDef).canceledFromSprinting = false;
		((SkillDef)yuumiSkillDef).fullRestockOnAssign = false;
		((SkillDef)yuumiSkillDef).interruptPriority = (InterruptPriority)0;
		((SkillDef)yuumiSkillDef).isCombatSkill = true;
		((SkillDef)yuumiSkillDef).mustKeyPress = true;
		((SkillDef)yuumiSkillDef).cancelSprintingOnActivation = false;
		((SkillDef)yuumiSkillDef).rechargeStock = 1;
		((SkillDef)yuumiSkillDef).requiredStock = 1;
		((SkillDef)yuumiSkillDef).stockToConsume = 1;
		((SkillDef)yuumiSkillDef).icon = Assets.MainAssetBundle.LoadAsset<Sprite>("Yuumi_Zoomies_old");
		((SkillDef)yuumiSkillDef).skillDescriptionToken = "YUUMI_M2ALT_DESCRIPTION";
		((SkillDef)yuumiSkillDef).skillName = "YUUMI_M2ALT";
		((SkillDef)yuumiSkillDef).skillNameToken = "YUUMI_M2ALT";
		ContentAddition.AddSkillDef((SkillDef)(object)yuumiSkillDef);
		Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
		Variant[] variants2 = skillFamily.variants;
		int num = skillFamily.variants.Length - 1;
		val2 = new Variant
		{
			skillDef = (SkillDef)(object)yuumiSkillDef,
			unlockableDef = null
		};
		((Variant)(ref val2)).viewableNode = new Node(((SkillDef)yuumiSkillDef).skillNameToken, false, (Node)null);
		variants2[num] = val2;
	}

	private void UtilitySetup()
	{
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: 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_0148: Unknown result type (might be due to invalid IL or missing references)
		//IL_0152: Expected O, but got Unknown
		//IL_0153: Unknown result type (might be due to invalid IL or missing references)
		//IL_0155: Unknown result type (might be due to invalid IL or missing references)
		SkillLocator component = characterPrefab.GetComponent<SkillLocator>();
		LanguageAPI.Add("YUUMI_UTIL", "You and Me!");
		LanguageAPI.Add("YUUMI_UTIL_DESCRIPTION", "Yuumi <style=cIsUtility>attaches</style> to the targetted ally, granting her items while attached to <style=cIsDamage>NPC's</style>. If there are no targetted allies, Yuumi dashes forward instead.");
		YuumiSkillDef yuumiSkillDef = ScriptableObject.CreateInstance<YuumiSkillDef>();
		((SkillDef)yuumiSkillDef).activationState = new SerializableEntityStateType(typeof(Utility));
		((SkillDef)yuumiSkillDef).activationStateMachineName = "Attach";
		((SkillDef)yuumiSkillDef).baseMaxStock = 1;
		((SkillDef)yuumiSkillDef).baseRechargeInterval = 5f;
		((SkillDef)yuumiSkillDef).beginSkillCooldownOnSkillEnd = true;
		((SkillDef)yuumiSkillDef).canceledFromSprinting = false;
		((SkillDef)yuumiSkillDef).fullRestockOnAssign = false;
		((SkillDef)yuumiSkillDef).interruptPriority = (InterruptPriority)0;
		((SkillDef)yuumiSkillDef).isCombatSkill = false;
		((SkillDef)yuumiSkillDef).mustKeyPress = true;
		((SkillDef)yuumiSkillDef).cancelSprintingOnActivation = false;
		((SkillDef)yuumiSkillDef).rechargeStock = 1;
		((SkillDef)yuumiSkillDef).requiredStock = 1;
		((SkillDef)yuumiSkillDef).stockToConsume = 1;
		((SkillDef)yuumiSkillDef).icon = Assets.MainAssetBundle.LoadAsset<Sprite>("yuumiw");
		((SkillDef)yuumiSkillDef).skillDescriptionToken = "YUUMI_UTIL_DESCRIPTION";
		((SkillDef)yuumiSkillDef).skillName = "YUUMI_UTIL";
		((SkillDef)yuumiSkillDef).skillNameToken = "YUUMI_UTIL";
		ContentAddition.AddSkillDef((SkillDef)(object)yuumiSkillDef);
		component.utility = characterPrefab.AddComponent<GenericSkill>();
		SkillFamily val = ScriptableObject.CreateInstance<SkillFamily>();
		val.variants = (Variant[])(object)new Variant[1];
		Reflection.SetFieldValue<SkillFamily>((object)component.utility, "_skillFamily", val);
		SkillFamily skillFamily = component.utility.skillFamily;
		Variant[] variants = skillFamily.variants;
		Variant val2 = new Variant
		{
			skillDef = (SkillDef)(object)yuumiSkillDef
		};
		((Variant)(ref val2)).viewableNode = new Node(((SkillDef)yuumiSkillDef).skillNameToken, false, (Node)null);
		variants[0] = val2;
		ContentAddition.AddSkillFamily(skillFamily);
	}

	private void SpecialSetup()
	{
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0150: Unknown result type (might be due to invalid IL or missing references)
		//IL_0168: Unknown result type (might be due to invalid IL or missing references)
		//IL_0172: Expected O, but got Unknown
		//IL_0173: Unknown result type (might be due to invalid IL or missing references)
		//IL_0175: Unknown result type (might be due to invalid IL or missing references)
		//IL_0192: Unknown result type (might be due to invalid IL or missing references)
		//IL_0197: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0264: Unknown result type (might be due to invalid IL or missing references)
		//IL_0284: Unknown result type (might be due to invalid IL or missing references)
		//IL_028e: Expected O, but got Unknown
		//IL_028f: 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)
		SkillLocator component = characterPrefab.GetComponent<SkillLocator>();
		LanguageAPI.Add("YUUMI_SPEC", "Final Chapter");
		LanguageAPI.Add("YUUMI_SPEC_DESCRIPTION", "Yuumi and Book channel for <style=cIsUtility>3.5s</style> to barrage 7 waves in the target direction that each deal <style=cIsDamage>200% damage</style> to enemies hit.");
		LanguageAPI.Add("YUUMI_SPECALT", "Final Paw");
		LanguageAPI.Add("YUUMI_SPECALT_DESCRIPTION", "Yuumi and Book channel for <style=cIsUtility>3.5s</style>, launching 5 waves in the target direction that each deal <style=cIsDamage>280% damage</style> and <style=cIsDamage>slows</style> enemies hit.");
		YuumiSkillDef yuumiSkillDef = ScriptableObject.CreateInstance<YuumiSkillDef>();
		((SkillDef)yuumiSkillDef).activationState = new SerializableEntityStateType(typeof(Special));
		((SkillDef)yuumiSkillDef).activationStateMachineName = "Attach";
		((SkillDef)yuumiSkillDef).baseMaxStock = 1;
		((SkillDef)yuumiSkillDef).baseRechargeInterval = 8f;
		((SkillDef)yuumiSkillDef).beginSkillCooldownOnSkillEnd = true;
		((SkillDef)yuumiSkillDef).canceledFromSprinting = false;
		((SkillDef)yuumiSkillDef).fullRestockOnAssign = false;
		((SkillDef)yuumiSkillDef).interruptPriority = (InterruptPriority)0;
		((SkillDef)yuumiSkillDef).isCombatSkill = true;
		((SkillDef)yuumiSkillDef).mustKeyPress = true;
		((SkillDef)yuumiSkillDef).cancelSprintingOnActivation = false;
		((SkillDef)yuumiSkillDef).rechargeStock = 1;
		((SkillDef)yuumiSkillDef).requiredStock = 1;
		((SkillDef)yuumiSkillDef).stockToConsume = 1;
		((SkillDef)yuumiSkillDef).icon = Assets.MainAssetBundle.LoadAsset<Sprite>("yuumir");
		((SkillDef)yuumiSkillDef).skillDescriptionToken = "YUUMI_SPEC_DESCRIPTION";
		((SkillDef)yuumiSkillDef).skillName = "YUUMI_SPEC";
		((SkillDef)yuumiSkillDef).skillNameToken = "YUUMI_SPEC";
		ContentAddition.AddSkillDef((SkillDef)(object)yuumiSkillDef);
		component.special = characterPrefab.AddComponent<GenericSkill>();
		SkillFamily val = ScriptableObject.CreateInstance<SkillFamily>();
		val.variants = (Variant[])(object)new Variant[1];
		Reflection.SetFieldValue<SkillFamily>((object)component.special, "_skillFamily", val);
		SkillFamily skillFamily = component.special.skillFamily;
		Variant[] variants = skillFamily.variants;
		Variant val2 = new Variant
		{
			skillDef = (SkillDef)(object)yuumiSkillDef
		};
		((Variant)(ref val2)).viewableNode = new Node(((SkillDef)yuumiSkillDef).skillNameToken, false, (Node)null);
		variants[0] = val2;
		ContentAddition.AddSkillFamily(skillFamily);
		yuumiSkillDef = ScriptableObject.CreateInstance<YuumiSkillDef>();
		((SkillDef)yuumiSkillDef).activationState = new SerializableEntityStateType(typeof(SpecialAlt));
		((SkillDef)yuumiSkillDef).activationStateMachineName = "Slide";
		((SkillDef)yuumiSkillDef).baseMaxStock = 1;
		((SkillDef)yuumiSkillDef).baseRechargeInterval = 8f;
		((SkillDef)yuumiSkillDef).beginSkillCooldownOnSkillEnd = true;
		((SkillDef)yuumiSkillDef).canceledFromSprinting = false;
		((SkillDef)yuumiSkillDef).fullRestockOnAssign = false;
		((SkillDef)yuumiSkillDef).interruptPriority = (InterruptPriority)0;
		((SkillDef)yuumiSkillDef).isCombatSkill = true;
		((SkillDef)yuumiSkillDef).mustKeyPress = true;
		((SkillDef)yuumiSkillDef).cancelSprintingOnActivation = false;
		((SkillDef)yuumiSkillDef).rechargeStock = 1;
		((SkillDef)yuumiSkillDef).requiredStock = 1;
		((SkillDef)yuumiSkillDef).stockToConsume = 1;
		((SkillDef)yuumiSkillDef).icon = Assets.MainAssetBundle.LoadAsset<Sprite>("yuumip2");
		((SkillDef)yuumiSkillDef).skillDescriptionToken = "YUUMI_SPECALT_DESCRIPTION";
		((SkillDef)yuumiSkillDef).skillName = "YUUMI_SPECALT";
		((SkillDef)yuumiSkillDef).skillNameToken = "YUUMI_SPECALT";
		ContentAddition.AddSkillDef((SkillDef)(object)yuumiSkillDef);
		Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
		Variant[] variants2 = skillFamily.variants;
		int num = skillFamily.variants.Length - 1;
		val2 = new Variant
		{
			skillDef = (SkillDef)(object)yuumiSkillDef,
			unlockableDef = null
		};
		((Variant)(ref val2)).viewableNode = new Node(((SkillDef)yuumiSkillDef).skillNameToken, false, (Node)null);
		variants2[num] = val2;
	}
}
internal class Prefabs
{
	internal static GameObject ultHitEffect;

	internal static GameObject attackHitEffect;

	internal static GameObject projectileHitEffect;

	internal static GameObject yuumiAttackProjectile;

	internal static GameObject yuumiAttackProjectileGhost;

	internal static GameObject yuumiProwlingProjectile;

	internal static GameObject yuumiProwlingProjectileGhost;

	internal static GameObject yuumiUltProjectile;

	internal static GameObject yuumiUltProjectileGhost;

	internal static GameObject yuumiUltIndicator;

	internal static GameObject yuumiHealEffect;

	internal static GameObject yuumiShieldEffect;

	internal static GameObject AttachEffect;

	internal static GameObject attachAttachment;

	internal static GameObject DashTrailEffect;

	internal static GameObject DashTrailEffectQuick;

	internal static GameObject projectileHitEffectWeak;

	internal static GameObject yuumiIndicator;

	internal static LoopSoundDef projectileLoopDef;

	internal static BuffDef zoom;

	internal static BuffDef zoomies;

	internal static void CreatePrefabs()
	{
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: 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)
		//IL_00af: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0282: Unknown result type (might be due to invalid IL or missing references)
		//IL_0287: Unknown result type (might be due to invalid IL or missing references)
		//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0330: Unknown result type (might be due to invalid IL or missing references)
		//IL_0335: Unknown result type (might be due to invalid IL or missing references)
		//IL_0394: Unknown result type (might be due to invalid IL or missing references)
		//IL_0399: Unknown result type (might be due to invalid IL or missing references)
		//IL_044b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0450: Unknown result type (might be due to invalid IL or missing references)
		//IL_0585: Unknown result type (might be due to invalid IL or missing references)
		//IL_058a: Unknown result type (might be due to invalid IL or missing references)
		//IL_05f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0611: Unknown result type (might be due to invalid IL or missing references)
		//IL_065f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0664: Unknown result type (might be due to invalid IL or missing references)
		//IL_012f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0141: Unknown result type (might be due to invalid IL or missing references)
		//IL_014b: Unknown result type (might be due to invalid IL or missing references)
		//IL_016c: Unknown result type (might be due to invalid IL or missing references)
		projectileLoopDef = ScriptableObject.CreateInstance<LoopSoundDef>();
		projectileLoopDef.startSoundName = "Play_Yuumi_Projectile_Mis";
		zoom = ScriptableObject.CreateInstance<BuffDef>();
		zoom.iconSprite = Assets.MainAssetBundle.LoadAsset<Sprite>("yuumip2");
		zoom.canStack = false;
		zoom.buffColor = Color.white;
		ContentAddition.AddBuffDef(zoom);
		zoomies = ScriptableObject.CreateInstance<BuffDef>();
		zoomies.iconSprite = Assets.MainAssetBundle.LoadAsset<Sprite>("yuumip2");
		zoomies.canStack = false;
		zoomies.buffColor = Color.white;
		ContentAddition.AddBuffDef(zoomies);
		yuumiIndicator = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Huntress/HuntressTrackingIndicator.prefab").WaitForCompletion(), "YuumiIndicator", false);
		SpriteRenderer[] componentsInChildren = yuumiIndicator.GetComponentsInChildren<SpriteRenderer>();
		foreach (SpriteRenderer val in componentsInChildren)
		{
			val.color = Color.clear;
			if (((Component)val).transform.parent.GetSiblingIndex() == 0)
			{
				val.sprite = Assets.MainAssetBundle.LoadAsset<Sprite>("indicator2");
				((Component)val).transform.localPosition = Vector3.zero;
				((Component)val).transform.localScale = Vector3.one * 0.1f;
				val.color = new Color(1f, 1f, 1f, 0.21569f);
			}
		}
		DashTrailEffect = PrefabAPI.InstantiateClone(Assets.MainAssetBundle.LoadAsset<GameObject>("DashTrailEffect"), "YuumiAttachTrailEffect", false);
		Utils.RegisterEffect(DashTrailEffect, 1.2f);
		DashTrailEffectQuick = PrefabAPI.InstantiateClone(Assets.MainAssetBundle.LoadAsset<GameObject>("DashTrailEffect"), "YuumiDashrailEffectQuick", false);
		Utils.RegisterEffect(DashTrailEffectQuick, 0.55f);
		AttachEffect = PrefabAPI.InstantiateClone(Assets.MainAssetBundle.LoadAsset<GameObject>("AttachEffect"), "YuumiAttachEffect", false);
		AttachEffect.AddComponent<DestroyOnTimer>().duration = 2f;
		yuumiHealEffect = PrefabAPI.InstantiateClone(Assets.MainAssetBundle.LoadAsset<GameObject>("HealEffect"), "YuumiHealEffect", false);
		yuumiShieldEffect = PrefabAPI.InstantiateClone(Assets.MainAssetBundle.LoadAsset<GameObject>("ShieldEffect"), "YuumiShieldEffect", false);
		yuumiUltIndicator = Assets.MainAssetBundle.LoadAsset<GameObject>("UltIndicator");
		ultHitEffect = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Treebot/OmniImpactVFXSlashSyringe.prefab").WaitForCompletion(), "YuumiUltHitEffect", false);
		Utils.RegisterEffect(ultHitEffect, 1f, "Play_Yuumi_R_Hit");
		projectileHitEffect = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/OmniImpactVFXSlash.prefab").WaitForCompletion(), "YuumiProjectileHitEffect", false);
		Utils.RegisterEffect(projectileHitEffect, 1f, "Play_Yuumi_Projectile_Hit");
		projectileHitEffectWeak = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/OmniImpactVFXSlash.prefab").WaitForCompletion(), "YuumiProjectileHitEffectWeak", false);
		Utils.RegisterEffect(projectileHitEffectWeak, 1f, "Play_Yuumi_Projectile_Hit_Weak");
		attackHitEffect = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/OmniImpactVFX.prefab").WaitForCompletion(), "YuumiAttackHitEffect", false);
		Utils.RegisterEffect(attackHitEffect, 1f, "Play_Yuumi_Attack_Hit");
		yuumiAttackProjectileGhost = PrefabAPI.InstantiateClone(Assets.MainAssetBundle.LoadAsset<GameObject>("BasicProjectile"), "YuumiBasicProjectileGhost", false);
		yuumiAttackProjectileGhost.AddComponent<ProjectileGhostController>();
		yuumiAttackProjectile = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerPistolProjectile.prefab").WaitForCompletion(), "YuumiAttackProjectile", true);
		yuumiAttackProjectile.GetComponent<ProjectileController>().ghostPrefab = yuumiAttackProjectileGhost;
		yuumiAttackProjectile.GetComponent<ProjectileSimple>().lifetime = 1f;
		Object.Destroy((Object)(object)yuumiAttackProjectile.GetComponent<ProjectileDirectionalTargetFinder>());
		yuumiAttackProjectile.GetComponent<ProjectileSimple>().desiredForwardSpeed = 80f;
		yuumiAttackProjectile.GetComponent<ProjectileSingleTargetImpact>().impactEffect = attackHitEffect;
		ContentAddition.AddProjectile(yuumiAttackProjectile);
		yuumiProwlingProjectileGhost = PrefabAPI.InstantiateClone(Assets.MainAssetBundle.LoadAsset<GameObject>("ProwlingProjectile"), "YuumiProwlingProjectileGhost", false);
		yuumiProwlingProjectileGhost.AddComponent<ProjectileGhostController>();
		yuumiProwlingProjectile = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerPistolProjectile.prefab").WaitForCompletion(), "YuumiProwlingProjectile", true);
		ProjectileController component = yuumiProwlingProjectile.GetComponent<ProjectileController>();
		component.ghostPrefab = yuumiProwlingProjectileGhost;
		yuumiProwlingProjectile.GetComponent<ProjectileSteerTowardTarget>().rotationSpeed = 90f;
		yuumiProwlingProjectile.GetComponent<ProjectileDirectionalTargetFinder>().lookRange = 25f;
		yuumiProwlingProjectile.GetComponent<ProjectileDirectionalTargetFinder>().lookCone = 20f;
		yuumiProwlingProjectile.GetComponent<ProjectileSimple>().lifetime = 1.4f;
		yuumiProwlingProjectile.GetComponent<ProjectileSimple>().desiredForwardSpeed = 80f;
		yuumiProwlingProjectile.GetComponent<ProjectileSingleTargetImpact>().impactEffect = projectileHitEffect;
		ContentAddition.AddProjectile(yuumiProwlingProjectile);
		yuumiUltProjectileGhost = PrefabAPI.InstantiateClone(Assets.MainAssetBundle.LoadAsset<GameObject>("UltProjectile"), "YuumiUltProjectile", false);
		ObjectScaleCurve val2 = ((Component)((Component)yuumiUltProjectileGhost.transform).GetComponent<ChildLocator>().FindChild("trail")).gameObject.AddComponent<ObjectScaleCurve>();
		val2.timeMax = 0.23f;
		val2.useOverallCurveOnly = true;
		val2.overallCurve = AnimationCurve.Linear(0f, 0f, 1f, 1f);
		yuumiUltProjectileGhost.AddComponent<ProjectileGhostController>();
		yuumiUltProjectile = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/FMJRamping.prefab").WaitForCompletion(), "YuumiUltProjectile", true);
		yuumiUltProjectile.GetComponent<ProjectileController>().ghostPrefab = yuumiUltProjectileGhost;
		yuumiUltProjectile.GetComponent<ProjectileSimple>().lifetime = 0.6f;
		Transform transform = ((Component)yuumiUltProjectile.GetComponent<HitBoxGroup>().hitBoxes[0]).gameObject.transform;
		transform.localScale = new Vector3(8f, 4f, 22f);
		transform.localPosition = new Vector3(0f, 0f, -8f);
		yuumiUltProjectile.GetComponent<ProjectileOverlapAttack>().impactEffect = ultHitEffect;
		ContentAddition.AddProjectile(yuumiUltProjectile);
		attachAttachment = Assets.MainAssetBundle.LoadAsset<GameObject>("attachment");
		((Renderer)attachAttachment.GetComponentInChildren<MeshRenderer>(true)).material = Addressables.LoadAssetAsync<Material>((object)"RoR2/DLC1/EliteEarth/matAffixEarthSphereIndicator.mat").WaitForCompletion();
	}
}
internal class CharacterMain : GenericCharacterMain
{
}
internal class MeleeSkillState : BaseSkillState
{
	internal float hitPauseDuration;

	internal float hopVelocity = Assaulter.smallHopVelocity;

	internal string animParameter = "";

	internal float hitPauseTimer;

	internal bool isInHitPause;

	internal HitStopCachedState hitStopCachedState;

	internal Animator animator;

	internal float stopwatch;

	internal OverlapAttack attack;

	internal bool hitCallback;

	internal float damage;

	internal GameObject hitEffectPrefab;

	internal HitBoxGroup hitBoxGroup;

	internal DamageType damageType = (DamageType)0;

	internal DamageColorIndex damageColor = (DamageColorIndex)0;

	internal Vector3 forceVector = Vector3.back * 100f;

	internal float attackStopwatch;

	public override void OnEnter()
	{
		((BaseState)this).OnEnter();
		animator = ((EntityState)this).GetModelAnimator();
		isInHitPause = false;
		hitPauseDuration = GroundLight.hitPauseDuration / ((BaseState)this).attackSpeedStat;
	}

	internal OverlapAttack NewOverlapAttack()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		//IL_000d: 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_0066: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_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)
		OverlapAttack val = new OverlapAttack();
		val.procChainMask = default(ProcChainMask);
		val.procCoefficient = 1f;
		val.attacker = ((EntityState)this).gameObject;
		val.inflictor = ((EntityState)this).gameObject;
		val.teamIndex = ((EntityState)this).characterBody.teamComponent.teamIndex;
		val.damage = ((EntityState)this).characterBody.damage * damage;
		val.forceVector = forceVector;
		val.hitEffectPrefab = hitEffectPrefab;
		val.isCrit = ((EntityState)this).characterBody.RollCrit();
		val.damageColorIndex = damageColor;
		val.damageType = damageType;
		val.maximumOverlapTargets = 100;
		val.hitBoxGroup = hitBoxGroup;
		return val;
	}

	public override void FixedUpdate()
	{
		//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_007c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		((EntityState)this).FixedUpdate();
		hitPauseTimer -= Time.fixedDeltaTime;
		if (hitCallback && !isInHitPause)
		{
			if (!((BaseState)this).isGrounded)
			{
				((BaseState)this).SmallHop(((EntityState)this).characterMotor, hopVelocity);
			}
			if (!Utility.IsNullOrWhiteSpace(animParameter))
			{
				hitStopCachedState = ((BaseState)this).CreateHitStopCachedState(((EntityState)this).characterMotor, animator, animParameter);
			}
			hitPauseTimer = hitPauseDuration / ((BaseState)this).attackSpeedStat;
			isInHitPause = true;
		}
		if (!Utility.IsNullOrWhiteSpace(animParameter) && hitPauseTimer <= 0f && isInHitPause)
		{
			((BaseState)this).ConsumeHitStopCachedState(hitStopCachedState, ((EntityState)this).characterMotor, animator);
			isInHitPause = false;
		}
		if (!isInHitPause)
		{
			attackStopwatch += Time.fixedDeltaTime;
			stopwatch += Time.fixedDeltaTime;
			if (Object.op_Implicit((Object)(object)animator))
			{
				animator.speed = 1f;
			}
		}
		else if (Object.op_Implicit((Object)(object)animator))
		{
			animator.speed = 0f;
		}
	}
}
internal class Primary : YuumiState
{
	private float duration;

	private float baseDuration = 0.45f;

	private float minFireDuration;

	private float baseFireDuration = 0.15f;

	private GameObject projectilePrefab;

	private float damageCoefficient = 1.5f;

	private string anim;

	private bool fired;

	public override void OnEnter()
	{
		base.OnEnter();
		((BaseState)this).StartAimMode(2f, false);
		duration = baseDuration / ((BaseState)this).attackSpeedStat;
		minFireDuration = baseFireDuration / ((BaseState)this).attackSpeedStat;
		anim = "Attack";
		projectilePrefab = Prefabs.yuumiAttackProjectile;
		if (Object.op_Implicit((Object)(object)attachedBody))
		{
			anim = "Attack";
			projectilePrefab = Prefabs.yuumiProwlingProjectile;
			damageCoefficient = 6f;
			AkSoundEngine.PostEvent(Sounds.Play_Yuumi_Projectile_Cast, ((EntityState)this).gameObject);
		}
		else
		{
			AkSoundEngine.PostEvent(Sounds.Play_Yuumi_Attack_Cast, ((EntityState)this).gameObject);
		}
		((EntityState)this).PlayAnimation("FullBody, Override", anim, "M1", duration);
	}

	public override void FixedUpdate()
	{
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: 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_00bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_010c: Unknown result type (might be due to invalid IL or missing references)
		//IL_010e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0115: Unknown result type (might be due to invalid IL or missing references)
		((EntityState)this).FixedUpdate();
		if (((EntityState)this).fixedAge >= minFireDuration && !fired)
		{
			fired = true;
			Ray aimRay = ((BaseState)this).GetAimRay();
			EffectManager.SimpleMuzzleFlash(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/Muzzleflash1.prefab").WaitForCompletion(), ((EntityState)this).gameObject, "pawMuzzle", false);
			if (((EntityState)this).isAuthority)
			{
				FireProjectileInfo val = default(FireProjectileInfo);
				val.crit = ((BaseState)this).RollCrit();
				val.damage = ((EntityState)this).characterBody.damage * damageCoefficient;
				val.damageColorIndex = (DamageColorIndex)0;
				val.force = 500f;
				val.owner = ((EntityState)this).gameObject;
				val.position = ((Ray)(ref aimRay)).origin;
				val.procChainMask = default(ProcChainMask);
				val.projectilePrefab = projectilePrefab;
				val.rotation = Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction);
				val.useFuseOverride = false;
				val.useSpeedOverride = false;
				val.target = null;
				FireProjectileInfo val2 = val;
				ProjectileManager.instance.FireProjectile(val2);
			}
		}
		if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
		{
			((EntityState)this).outer.SetNextStateToMain();
		}
	}

	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 SecondaryBuff : YuumiState
{
	private float duration;

	private float baseDuration = 0.65f;

	public BuffDef buff;

	public override void OnEnter()
	{
		base.OnEnter();
		duration = baseDuration / ((BaseState)this).attackSpeedStat;
		string text = "HealDetached";
		if (Object.op_Implicit((Object)(object)attachedBody))
		{
			text = "HealAttached";
			if (NetworkServer.active)
			{
				attachedBody.AddTimedBuff(buff, 5f);
			}
		}
		else if (NetworkServer.active)
		{
			((EntityState)this).characterBody.AddTimedBuff(buff, 5f);
		}
		((EntityState)this).PlayAnimation("FullBody, Override", text, "M2", duration);
		AkSoundEngine.PostEvent(Sounds.Play_Yuumi_Heal, ((EntityState)this).gameObject);
	}

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

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

	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;
	}
}
internal class Secondary : SecondaryBuff
{
	public override void OnEnter()
	{
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		buff = Prefabs.zoomies;
		base.OnEnter();
		Transform val = null;
		Vector3 zero = Vector3.zero;
		if (Object.op_Implicit((Object)(object)attachedBody))
		{
			val = attachedBody.transform;
			zero = attachedBody.corePosition;
		}
		else
		{
			val = ((EntityState)this).transform;
			zero = ((EntityState)this).characterBody.corePosition;
		}
		GameObject val2 = Object.Instantiate<GameObject>(Prefabs.yuumiShieldEffect, val.position, Quaternion.identity, (Transform)null);
		val2.transform.localPosition = zero;
		val2.transform.SetParent(val);
		Object.Destroy((Object)(object)val2, 2f);
		float num = ((EntityState)this).healthComponent.fullHealth * 0.2f;
		if (NetworkServer.active)
		{
			if (Object.op_Implicit((Object)(object)attachedBody))
			{
				attachedBody.healthComponent.AddBarrier(attachedBody.healthComponent.fullHealth * 0.2f);
			}
			else
			{
				((EntityState)this).healthComponent.AddBarrier(num);
			}
		}
	}

	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;
	}
}
internal class SecondaryAlt : SecondaryBuff
{
	public override void OnEnter()
	{
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
		buff = Prefabs.zoom;
		base.OnEnter();
		Transform val = null;
		val = ((!Object.op_Implicit((Object)(object)attachedBody)) ? ((EntityState)this).transform : attachedBody.transform);
		GameObject val2 = Object.Instantiate<GameObject>(Prefabs.yuumiHealEffect, val.position, Quaternion.identity, (Transform)null);
		val2.transform.SetParent(val);
		val2.transform.localPosition = Vector3.zero;
		Object.Destroy((Object)(object)val2, 2f);
		float num = ((EntityState)this).healthComponent.fullHealth * 0.2f;
		if (NetworkServer.active)
		{
			if (Object.op_Implicit((Object)(object)attachedBody))
			{
				attachedBody.healthComponent.Heal(attachedBody.healthComponent.fullHealth * 0.2f, default(ProcChainMask), true);
			}
			else
			{
				((EntityState)this).healthComponent.Heal(num, default(ProcChainMask), true);
			}
		}
	}

	public override InterruptPriority GetMinimumInterruptPriority()
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		return (InterruptPriority)1;
	}
}
internal class Special : YuumiState
{
	private float duration;

	public float baseDuration = 3.5f;

	public int waveCount = 7;

	private int firedCount = 0;

	private float stopwatch;

	public GameObject projectilePrefab = Prefabs.yuumiUltProjectile;

	public DamageType damageType = (DamageType)0;

	public float damageCoefficient = 2f;

	private Vector3 direction;

	private Transform childTransform;

	private GameObject indicator;

	private Transform indicatorChild;

	public override void OnEnter()
	{
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_0085: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		base.OnEnter();
		indicator = Object.Instantiate<GameObject>(Prefabs.yuumiUltIndicator, ((EntityState)this).transform);
		indicator.transform.localPosition = Vector3.zero;
		indicatorChild = indicator.transform.GetChild(0);
		((BaseState)this).StartAimMode(duration, false);
		duration = baseDuration / Mathf.Clamp(((BaseState)this).attackSpeedStat, 1f, 16f);
		Ray aimRay = ((BaseState)this).GetAimRay();
		direction = ((Ray)(ref aimRay)).direction;
		childTransform = ((BaseState)this).FindModelChild("pawMuzzle");
		Fire();
		((EntityState)this).PlayAnimation("FullBody, Override", "Ult", "Special", 0.45f);
		AkSoundEngine.PostEvent(Sounds.Play_Yuumi_R_Cast, ((EntityState)this).gameObject);
		behaviour.canExecutePrimary = false;
		CameraZoomOut();
	}

	public override void Update()
	{
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//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_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		((EntityState)this).Update();
		if (Object.op_Implicit((Object)(object)indicatorChild))
		{
			Quaternion val = Quaternion.LookRotation(((EntityState)this).inputBank.aimDirection, Vector3.up);
			Vector3 eulerAngles = ((Quaternion)(ref val)).eulerAngles;
			indicatorChild.localRotation = Quaternion.Euler(0f, eulerAngles.y, 0f);
		}
	}

	public override void FixedUpdate()
	{
		((EntityState)this).FixedUpdate();
		UpdateDirection();
		stopwatch += Time.fixedDeltaTime;
		if (stopwatch >= duration / (float)waveCount && firedCount < waveCount)
		{
			stopwatch = 0f;
			Fire();
		}
		if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
		{
			((EntityState)this).outer.SetNextStateToMain();
		}
	}

	protected virtual void UpdateDirection()
	{
		//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)
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: 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_0049: 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_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		Ray aimRay = ((BaseState)this).GetAimRay();
		direction = ((Ray)(ref aimRay)).direction;
		Vector2 val = Util.Vector3XZToVector2XY(((EntityState)this).inputBank.aimDirection);
		if (val != Vector2.zero)
		{
			((Vector2)(ref val)).Normalize();
			Vector3 val2 = new Vector3(val.x, 0f, val.y);
			Vector3 normalized = ((Vector3)(ref val2)).normalized;
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
			{
				((EntityState)this).characterDirection.moveVector = normalized;
			}
		}
	}

	private void Fire()
	{
		//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_006f: 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_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f4: 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_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_011b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Unknown result type (might be due to invalid IL or missing references)
		//IL_013d: Unknown result type (might be due to invalid IL or missing references)
		//IL_013e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0144: Unknown result type (might be due to invalid IL or missing references)
		firedCount++;
		((EntityState)this).PlayAnimation("Ult, Override", "UltFire", "Special", 0.4f);
		EffectManager.SimpleMuzzleFlash(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/Muzzleflash1.prefab").WaitForCompletion(), ((EntityState)this).gameObject, "bookMuzzle", false);
		AkSoundEngine.PostEvent(Sounds.Play_Yuumi_R_MisCast, ((EntityState)this).gameObject);
		if (((EntityState)this).isAuthority)
		{
			FireProjectileInfo val = default(FireProjectileInfo);
			val.crit = ((BaseState)this).RollCrit();
			val.damage = ((EntityState)this).characterBody.damage * damageCoefficient;
			val.damageTypeOverride = damageType;
			val.damageColorIndex = (DamageColorIndex)0;
			val.force = 500f;
			val.owner = ((EntityState)this).gameObject;
			Ray aimRay = ((BaseState)this).GetAimRay();
			val.position = ((Ray)(ref aimRay)).origin + direction * 8f;
			val.procChainMask = default(ProcChainMask);
			val.projectilePrefab = projectilePrefab;
			val.rotation = Util.QuaternionSafeLookRotation(direction);
			val.useFuseOverride = false;
			val.useSpeedOverride = false;
			val.target = null;
			FireProjectileInfo val2 = val;
			ProjectileManager.instance.FireProjectile(val2);
		}
	}

	public override void OnExit()
	{
		((EntityState)this).OnExit();
		CameraZoomIn();
		behaviour.canExecutePrimary = true;
		if (Object.op_Implicit((Object)(object)indicator))
		{
			EntityState.Destroy((Object)(object)indicator);
		}
		((EntityState)this).GetModelAnimator().SetTrigger("ultOver");
	}

	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;
	}
}
internal class SpecialAlt : Special
{
	protected override void UpdateDirection()
	{
	}

	public override void OnEnter()
	{
		//IL_000a: Unknown result type (might be due to invalid IL or missing references)
		waveCount = 5;
		damageType = (DamageType)8;
		damageCoefficient = 2.8f;
		base.OnEnter();
	}

	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;
	}
}
internal class Utility : YuumiState
{
	public override void OnEnter()
	{
		base.OnEnter();
		if (((!Object.op_Implicit((Object)(object)behaviour.target) && !behaviour.isAttached) || !((EntityState)this).characterBody.isPlayerControlled) && ((EntityState)this).isAuthority)
		{
			((EntityState)this).outer.SetNextState((EntityState)(object)new UtilityDash());
		}
		else if (Object.op_Implicit((Object)(object)attachedBody))
		{
			if (!Object.op_Implicit((Object)(object)behaviour.target))
			{
				AkSoundEngine.PostEvent(Sounds.Play_Yuumi_Detach, ((EntityState)this).gameObject);
				behaviour.Detach();
				if (((EntityState)this).isAuthority)
				{
					((EntityState)this).GetComponent<EntityStateMachine>().SetNextStateToMain();
					((EntityState)this).outer.SetNextState((EntityState)(object)new UtilityEnd());
				}
			}
			else if ((Object)(object)behaviour.target.healthComponent.body != (Object)(object)attachedBody)
			{
				EntityStateMachine component = ((EntityState)this).GetComponent<EntityStateMachine>();
				if (Object.op_Implicit((Object)(object)component) && component.state is AttachState attachState)
				{
					attachState.setPos = false;
				}
				behaviour.Detach(behaviour.target.healthComponent.body);
				Attach();
			}
		}
		else
		{
			Attach();
		}
	}

	private void Attach()
	{
		behaviour.Attach();
		if (((EntityState)this).isAuthority)
		{
			((EntityState)this).outer.SetNextState((EntityState)(object)new DashTowardsBody());
		}
	}

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

	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)1;
	}
}
internal class UtilityDash : YuumiState
{
	private Vector3 direction;

	public float duration = 0.25f;

	private AnimationCurve curve = AnimationCurve.EaseInOut(0f, 0f, 1f, 1f);

	private float speed = 12f;

	public override void OnEnter()
	{
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		//IL_0098: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: 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)
		base.OnEnter();
		((EntityState)this).PlayAnimation("FullBody, Override", "Attach", "Utility", duration);
		CharacterBody component = ((EntityState)this).GetComponent<CharacterBody>();
		if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.currentVehicle) && NetworkServer.active)
		{
			component.currentVehicle.EjectPassenger();
		}
		if (!((BaseState)this).isGrounded)
		{
			((BaseState)this).SmallHop(((EntityState)this).characterMotor, 5f);
		}
		AkSoundEngine.PostEvent(Sounds.Play_Yuumi_Attach_Cast, ((EntityState)this).gameObject);
		Vector3 val = ((((EntityState)this).inputBank.moveVector == Vector3.zero) ? ((EntityState)this).characterDirection.forward : ((EntityState)this).inputBank.moveVector);
		direction = ((Vector3)(ref val)).normalized;
		EffectManager.SimpleMuzzleFlash(Prefabs.DashTrailEffectQuick, ((EntityState)this).gameObject, "neck", false);
	}

	public override void FixedUpdate()
	{
		//IL_005c: 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_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		((EntityState)this).FixedUpdate();
		((EntityState)this).characterBody.isSprinting = true;
		if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
		{
			float num = curve.Evaluate(((EntityState)this).fixedAge / duration) * speed;
			CharacterMotor characterMotor = ((EntityState)this).characterMotor;
			characterMotor.rootMotion += direction * (((BaseState)this).moveSpeedStat * num * Time.fixedDeltaTime);
		}
		if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
		{
			((EntityState)this).outer.SetNextStateToMain();
		}
	}

	public override void OnExit()
	{
		((EntityState)this).OnExit();
		((EntityState)this).GetModelAnimator().SetTrigger("dashSkip");
	}

	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;
	}
}
internal class DashTowardsBody : YuumiState
{
	private Transform position;

	private float speed = 15f;

	private bool isAttached;

	private EntityStateMachine stateMachine;

	private AttachState state;

	public override void OnEnter()
	{
		base.OnEnter();
		stateMachine = ((EntityState)this).GetComponent<EntityStateMachine>();
		if (Object.op_Implicit((Object)(object)stateMachine) && (state = stateMachine.state as AttachState) != null)
		{
			isAttached = true;
			state.setPos = false;
		}
		EffectManager.SimpleMuzzleFlash(Prefabs.DashTrailEffect, ((EntityState)this).gameObject, "neck", false);
		((EntityState)this).skillLocator.utility.RunRecharge(4.5f);
		AkSoundEngine.PostEvent(Sounds.Play_Yuumi_Attach_Cast, ((EntityState)this).gameObject);
		((EntityState)this).PlayAnimation("FullBody, Override", "Attach", "Utility", 0.4f);
		position = behaviour.attachmentPosition;
		((BaseCharacterController)((EntityState)this).characterMotor).Motor.ForceUnground();
		((BaseState)this).SmallHop(((EntityState)this).characterMotor, 100f);
		CameraZoomOut();
	}

	private Vector3 direction()
	{
		//IL_0007: 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_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = position.position - ((EntityState)this).transform.position;
		return ((Vector3)(ref val)).normalized;
	}

	public override void FixedUpdate()
	{
		//IL_002e: 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_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_009e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: 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_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_00de: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
		((EntityState)this).FixedUpdate();
		if (Object.op_Implicit((Object)(object)position))
		{
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Vector3.Distance(((EntityState)this).transform.position, position.position) > 5f)
			{
				Vector3 val = direction();
				((EntityState)this).characterMotor.velocity = Vector3.zero;
				CharacterMotor characterMotor = ((EntityState)this).characterMotor;
				characterMotor.rootMotion += val * ((BaseState)this).moveSpeedStat * speed * Time.fixedDeltaTime;
				Vector2 val2 = Util.Vector3XZToVector2XY(val);
				if (val2 != Vector2.zero)
				{
					((Vector2)(ref val2)).Normalize();
					Vector3 val3 = new Vector3(val2.x, 0f, val2.y);
					Vector3 normalized = ((Vector3)(ref val3)).normalized;
					if (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
					{
						((EntityState)this).characterDirection.moveVector = normalized;
					}
				}
				return;
			}
			if (isAttached && state != null)
			{
				state.setPos = true;
			}
			if (((EntityState)this).isAuthority)
			{
				if (!isAttached)
				{
					stateMachine.SetNextState((EntityState)(object)new AttachState());
				}
				((EntityState)this).outer.SetNextState((EntityState)(object)new UtilityEnd());
			}
		}
		else if (((EntityState)this).fixedAge >= 0.5f && ((EntityState)this).isAuthority)
		{
			((EntityState)this).outer.SetNextState((EntityState)(object)new UtilityEnd());
		}
	}

	public override void OnExit()
	{
		((EntityState)this).OnExit();
		behaviour.canExecute = true;
		((EntityState)this).GetModelAnimator().SetTrigger("attachOver");
	}

	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;
	}
}
internal class UtilityEnd : YuumiState
{
	private float duration = 0.5f;

	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;
	}
}
internal class AttachState : GenericCharacterMain
{
	private AttachBehaviour behaviour;

	private Transform position;

	public bool setPos = true;

	public override void OnEnter()
	{
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		((GenericCharacterMain)this).OnEnter();
		AkSoundEngine.PostEvent(Sounds.Play_Yuumi_Attach, ((EntityState)this).gameObject);
		((BaseCharacterMain)this).modelAnimator.SetBool("attached", true);
		((BaseCharacterMain)this).modelAnimator.SetBool("isSprinting", false);
		((BaseCharacterMain)this).modelAnimator.SetBool("isMoving", false);
		((EntityState)this).PlayAnimation("Gesture, Override", "Idle");
		behaviour = ((EntityState)this).GetComponent<AttachBehaviour>();
		if (Object.op_Implicit((Object)(object)behaviour) && behaviour.isAttached)
		{
			behaviour.canExecute = true;
			position = behaviour.attachmentPosition;
			Object.Instantiate<GameObject>(Prefabs.AttachEffect, behaviour.AttachedBody.transform).transform.localPosition = Vector3.zero;
			behaviour.aimRequest.Dispose();
		}
		((EntityState)this).gameObject.layer = LayerIndex.fakeActor.intVal;
		int hurtBoxesDeactivatorCounter = ((EntityState)this).characterBody.mainHurtBox.hurtBoxGroup.hurtBoxesDeactivatorCounter + 1;
		((EntityState)this).characterBody.mainHurtBox.hurtBoxGroup.hurtBoxesDeactivatorCounter = hurtBoxesDeactivatorCounter;
	}

	public override void UpdateAnimationParameters()
	{
	}

	public override void ProcessJump()
	{
	}

	public override void HandleMovements()
	{
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0065: Unknown result type (might be due to invalid IL or missing ref