Decompiled source of Skillsmas v1.3.8

plugins/Skillsmas.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.Bandit2;
using EntityStates.Bandit2.Weapon;
using EntityStates.Captain.Weapon;
using EntityStates.CaptainDefenseMatrixItem;
using EntityStates.Commando;
using EntityStates.Commando.CommandoWeapon;
using EntityStates.Croco;
using EntityStates.Huntress.HuntressWeapon;
using EntityStates.Loader;
using EntityStates.Mage.Weapon;
using EntityStates.Merc;
using EntityStates.Merc.Weapon;
using EntityStates.Toolbot;
using HG;
using HG.BlendableTypes;
using HG.Reflection;
using IL.RoR2.Projectile;
using JetBrains.Annotations;
using KinematicCharacterController;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using MysticsRisky2Utils;
using MysticsRisky2Utils.BaseAssetTypes;
using MysticsRisky2Utils.ContentManagement;
using MysticsRisky2Utils.MonoBehaviours;
using MysticsRisky2Utils.SoftDependencies;
using On.EntityStates.Captain.Weapon;
using On.EntityStates.CaptainDefenseMatrixItem;
using On.EntityStates.Commando;
using On.EntityStates.Huntress.HuntressWeapon;
using On.RoR2;
using R2API;
using R2API.Networking;
using R2API.Networking.Interfaces;
using R2API.Utils;
using RoR2;
using RoR2.Audio;
using RoR2.ContentManagement;
using RoR2.Items;
using RoR2.Navigation;
using RoR2.Orbs;
using RoR2.Projectile;
using RoR2.Skills;
using RoR2.UI;
using Skillsmas.DamageTypes;
using Skillsmas.Skills;
using Skillsmas.Skills.Bandit;
using Skillsmas.Skills.Captain;
using Skillsmas.Skills.Loader;
using Skillsmas.Skills.Toolbot;
using Skillsmas.SoftDependencies;
using TMPro;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using UnityEngine.Rendering.PostProcessing;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: OptIn]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Skillsmas")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+b07ddd8f4e5dd141de7c21c74a1677b120f139cd")]
[assembly: AssemblyProduct("Skillsmas")]
[assembly: AssemblyTitle("Skillsmas")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Skillsmas
{
	public abstract class BaseGenericLoadable : BaseLoadableAsset
	{
	}
	public static class SkillsmasUtils
	{
		public static CameraRigController FindCameraRigController(GameObject viewer)
		{
			foreach (CameraRigController readOnlyInstances in CameraRigController.readOnlyInstancesList)
			{
				if ((Object)(object)readOnlyInstances.target == (Object)(object)viewer && (Object)(object)readOnlyInstances._localUserViewer.cachedBodyObject == (Object)(object)viewer && !readOnlyInstances.hasOverride)
				{
					return readOnlyInstances;
				}
			}
			return null;
		}

		public static void UncorrectAimRay(GameObject viewer, ref Ray aimRay, float finalPointDistance = 1000f)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: 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_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_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: 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_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			CameraRigController val = FindCameraRigController(viewer);
			if (Object.op_Implicit((Object)(object)val))
			{
				Vector3 position = val.currentCameraState.position;
				float num = finalPointDistance;
				Vector3 val2 = position - ((Ray)(ref aimRay)).origin;
				finalPointDistance = num + ((Vector3)(ref val2)).magnitude;
				position += finalPointDistance * (val.currentCameraState.rotation * Vector3.forward);
				val2 = position - ((Ray)(ref aimRay)).origin;
				((Ray)(ref aimRay)).direction = ((Vector3)(ref val2)).normalized;
			}
		}
	}
	public class SkillsmasProjectileProximityDetonator : MonoBehaviour
	{
		public TeamFilter myTeamFilter;

		public ProjectileExplosion projectileExplosion;

		public GameObject objectToDestroy;

		public void OnTriggerEnter(Collider collider)
		{
			//IL_005b: 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)
			if (!NetworkServer.active || !Object.op_Implicit((Object)(object)collider))
			{
				return;
			}
			HurtBox component = ((Component)collider).GetComponent<HurtBox>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				return;
			}
			HealthComponent healthComponent = component.healthComponent;
			if (!Object.op_Implicit((Object)(object)healthComponent))
			{
				return;
			}
			TeamComponent component2 = ((Component)healthComponent).GetComponent<TeamComponent>();
			if (!Object.op_Implicit((Object)(object)component2) || component2.teamIndex != myTeamFilter.teamIndex)
			{
				if (Object.op_Implicit((Object)(object)projectileExplosion))
				{
					projectileExplosion.SetAlive(false);
				}
				if (Object.op_Implicit((Object)(object)objectToDestroy))
				{
					Object.Destroy((Object)(object)objectToDestroy);
				}
			}
		}
	}
	public class SkillsmasProjectileEnhanceZone : MonoBehaviour
	{
		public TeamFilter teamFilter;

		public List<Rigidbody> ignoredProjectiles;

		public List<DamageType> enhancementDamageTypes = new List<DamageType>();

		public void Start()
		{
			ignoredProjectiles = new List<Rigidbody>();
		}

		public void OnTriggerEnter(Collider other)
		{
			//IL_0018: 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_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_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//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_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			TeamFilter component = ((Component)other).GetComponent<TeamFilter>();
			Rigidbody component2 = ((Component)other).GetComponent<Rigidbody>();
			if (!Object.op_Implicit((Object)(object)component2) || component.teamIndex != teamFilter.teamIndex || ignoredProjectiles.Contains(component2))
			{
				return;
			}
			ignoredProjectiles.Add(component2);
			if (enhancementDamageTypes.Count <= 0)
			{
				return;
			}
			ProjectileDamage component3 = ((Component)other).GetComponent<ProjectileDamage>();
			ProjectileOverlapAttack component4 = ((Component)other).GetComponent<ProjectileOverlapAttack>();
			ProjectileDotZone component5 = ((Component)other).GetComponent<ProjectileDotZone>();
			foreach (DamageType enhancementDamageType in enhancementDamageTypes)
			{
				if (Object.op_Implicit((Object)(object)component3))
				{
					component3.damageType |= DamageTypeCombo.op_Implicit(enhancementDamageType);
				}
				if (Object.op_Implicit((Object)(object)component4))
				{
					OverlapAttack attack = component4.attack;
					attack.damageType |= DamageTypeCombo.op_Implicit(enhancementDamageType);
				}
				if (Object.op_Implicit((Object)(object)component5))
				{
					OverlapAttack attack2 = component5.attack;
					attack2.damageType |= DamageTypeCombo.op_Implicit(enhancementDamageType);
				}
			}
		}
	}
	public class SkillsmasProjectileHealOwnerOnDamageInflicted : MonoBehaviour, IOnDamageInflictedServerReceiver
	{
		public ProjectileController projectileController;

		public float flatHealing;

		public float fractionalHealing;

		public float healingFromDamageDealt;

		public int maxInstancesOfHealing = -1;

		public int instancesOfHealing = 0;

		public void Awake()
		{
			projectileController = ((Component)this).GetComponent<ProjectileController>();
		}

		public void OnDamageInflictedServer(DamageReport damageReport)
		{
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: 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_00b7: Expected O, but got Unknown
			if ((maxInstancesOfHealing == -1 || instancesOfHealing < maxInstancesOfHealing) && Object.op_Implicit((Object)(object)projectileController.owner))
			{
				HealthComponent component = projectileController.owner.GetComponent<HealthComponent>();
				if (Object.op_Implicit((Object)(object)component))
				{
					HealOrb val = new HealOrb
					{
						origin = ((Component)this).transform.position,
						target = component.body.mainHurtBox,
						healValue = flatHealing + component.fullHealth * fractionalHealing + healingFromDamageDealt * damageReport.damageDealt,
						overrideDuration = 0.3f
					};
					OrbManager.instance.AddOrb((Orb)(object)val);
					instancesOfHealing++;
				}
			}
		}
	}
	public class SkillsmasProjectileSoundAdder : MonoBehaviour
	{
		public ProjectileOverlapAttack projectileOverlapAttack;

		public NetworkSoundEventDef impactSoundEventDef;

		public void Start()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)projectileOverlapAttack))
			{
				projectileOverlapAttack.attack.impactSound = impactSoundEventDef.index;
			}
		}
	}
	public class SkillsmasAlignToRigidbodyVelocity : MonoBehaviour
	{
		public Rigidbody rigidbody;

		public float minimumVelocitySqrMagnitude = 1f;

		public ProjectileStickOnImpact projectileStickOnImpact;

		public void Awake()
		{
			rigidbody = ((Component)this).GetComponent<Rigidbody>();
			projectileStickOnImpact = ((Component)this).GetComponent<ProjectileStickOnImpact>();
		}

		public void LateUpdate()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)rigidbody))
			{
				Vector3 velocity = rigidbody.velocity;
				if (((Vector3)(ref velocity)).sqrMagnitude >= minimumVelocitySqrMagnitude && (!Object.op_Implicit((Object)(object)projectileStickOnImpact) || !projectileStickOnImpact.stuck))
				{
					Transform transform = ((Component)this).transform;
					velocity = rigidbody.velocity;
					transform.forward = ((Vector3)(ref velocity)).normalized;
				}
			}
		}
	}
	public class PrepCustomWall : BaseState
	{
		public float baseDuration = 0.5f;

		public GameObject areaIndicatorPrefab;

		public GameObject muzzleflashEffect;

		public GameObject goodCrosshairPrefab;

		public GameObject badCrosshairPrefab;

		public string prepWallSoundString = "Play_mage_shift_start";

		public string fireSoundString = "Play_mage_shift_stop";

		public float maxDistance = 600f;

		public float maxSlopeAngle = 70f;

		public float duration;

		public bool goodPlacement;

		public GameObject areaIndicatorInstance;

		public OverrideRequest crosshairOverrideRequest;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			duration = baseDuration / base.attackSpeedStat;
			((EntityState)this).characterBody.SetAimTimer(duration + 2f);
			((EntityState)this).PlayAnimation("Gesture, Additive", "PrepWall", "PrepWall.playbackRate", duration, 0f);
			Util.PlaySound(prepWallSoundString, ((EntityState)this).gameObject);
			areaIndicatorInstance = Object.Instantiate<GameObject>(areaIndicatorPrefab);
			UpdateAreaIndicator();
		}

		private void UpdateAreaIndicator()
		{
			//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_0036: 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_0053: 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_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			bool flag = goodPlacement;
			goodPlacement = false;
			areaIndicatorInstance.SetActive(true);
			if (Object.op_Implicit((Object)(object)areaIndicatorInstance))
			{
				Ray aimRay = ((BaseState)this).GetAimRay();
				float num = default(float);
				RaycastHit val = default(RaycastHit);
				if (Physics.Raycast(CameraRigController.ModifyAimRayIfApplicable(aimRay, ((EntityState)this).gameObject, ref num), ref val, maxDistance + num, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask)))
				{
					areaIndicatorInstance.transform.position = ((RaycastHit)(ref val)).point;
					areaIndicatorInstance.transform.up = ((RaycastHit)(ref val)).normal;
					areaIndicatorInstance.transform.forward = -((Ray)(ref aimRay)).direction;
					goodPlacement = Vector3.Angle(Vector3.up, ((RaycastHit)(ref val)).normal) < maxSlopeAngle;
				}
				if (flag != goodPlacement || crosshairOverrideRequest == null)
				{
					if (crosshairOverrideRequest != null)
					{
						crosshairOverrideRequest.Dispose();
					}
					GameObject val2 = (goodPlacement ? goodCrosshairPrefab : badCrosshairPrefab);
					crosshairOverrideRequest = CrosshairUtils.RequestOverrideForBody(((EntityState)this).characterBody, val2, (OverridePriority)1);
				}
			}
			areaIndicatorInstance.SetActive(goodPlacement);
		}

		public override void Update()
		{
			((EntityState)this).Update();
			UpdateAreaIndicator();
		}

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

		public virtual void CreateWall(Vector3 position, Quaternion rotation)
		{
		}

		public override void OnExit()
		{
			//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_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			if (!((EntityState)this).outer.destroying)
			{
				if (goodPlacement)
				{
					((EntityState)this).PlayAnimation("Gesture, Additive", "FireWall");
					Util.PlaySound(fireSoundString, ((EntityState)this).gameObject);
					if (Object.op_Implicit((Object)(object)areaIndicatorInstance))
					{
						if (((EntityState)this).isAuthority)
						{
							EffectManager.SimpleMuzzleFlash(muzzleflashEffect, ((EntityState)this).gameObject, "MuzzleLeft", true);
							EffectManager.SimpleMuzzleFlash(muzzleflashEffect, ((EntityState)this).gameObject, "MuzzleRight", true);
						}
						Vector3 forward = areaIndicatorInstance.transform.forward;
						forward.y = 0f;
						((Vector3)(ref forward)).Normalize();
						Vector3 val = Vector3.Cross(Vector3.up, forward);
						CreateWall(areaIndicatorInstance.transform.position, Util.QuaternionSafeLookRotation(val));
						if (SkillsmasPlugin.artificerExtendedEnabled)
						{
							ArtificerExtendedSupport.TriggerAltPassiveSkillCast(((Component)((EntityState)this).outer).gameObject);
						}
					}
				}
				else
				{
					((EntityState)this).skillLocator.utility.AddOneStock();
					((EntityState)this).PlayCrossfade("Gesture, Additive", "BufferEmpty", 0.2f);
				}
			}
			EntityState.Destroy((Object)(object)areaIndicatorInstance.gameObject);
			if (crosshairOverrideRequest != null)
			{
				crosshairOverrideRequest.Dispose();
			}
			((EntityState)this).OnExit();
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)3;
		}
	}
	public static class ExtensionMethods
	{
		public static void LoadConfiguration(this EntityState entityState, Type type)
		{
			if (EntityStateCatalog.instanceFieldInitializers.TryGetValue(type, out var value))
			{
				value(entityState);
			}
		}
	}
	[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.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.themysticsword.skillsmas", "Skillsmas", "1.3.8")]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	public class SkillsmasPlugin : BaseUnityPlugin
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static CollectContentPackProvidersDelegate <>9__13_0;

			internal void <Awake>b__13_0(AddContentPackProviderDelegate addContentPackProvider)
			{
				addContentPackProvider.Invoke((IContentPackProvider)(object)new SkillsmasContent());
			}
		}

		public const string PluginGUID = "com.themysticsword.skillsmas";

		public const string PluginName = "Skillsmas";

		public const string PluginVersion = "1.3.8";

		public static Assembly executingAssembly;

		internal static Type declaringType;

		internal static PluginInfo pluginInfo;

		internal static ManualLogSource logger;

		internal static ConfigFile config;

		internal static ConfigurableValue<bool> ignoreBalanceConfig;

		internal static bool artificerExtendedEnabled;

		private static AssetBundle _assetBundle;

		public static AssetBundle AssetBundle
		{
			get
			{
				if ((Object)(object)_assetBundle == (Object)null)
				{
					_assetBundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(pluginInfo.Location), "skillsmasassetbundle"));
				}
				return _assetBundle;
			}
		}

		public void Awake()
		{
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Expected O, but got Unknown
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b7: Expected O, but got Unknown
			pluginInfo = ((BaseUnityPlugin)this).Info;
			logger = ((BaseUnityPlugin)this).Logger;
			config = ((BaseUnityPlugin)this).Config;
			executingAssembly = Assembly.GetExecutingAssembly();
			declaringType = MethodBase.GetCurrentMethod().DeclaringType;
			ConfigEntry<bool> val = config.Bind<bool>("General", "Ignore Balance Changes", true, "Old value that has no effect anymore. Will be removed in the future. Use the Ignore Balance Changes option in the ! General ! section instead.");
			ignoreBalanceConfig = ConfigurableValue.CreateBool("com.themysticsword.skillsmas", "Skillsmas", config, "! General !", "Ignore Balance Changes", val.Value, "If true, most of the balance-related number values won't be changed by configs, and will use recommended default values.", (List<string>)null, (ConfigEntry<bool>)null, false, (Action<bool>)null);
			if (RiskOfOptionsDependency.enabled)
			{
				Sprite val2 = null;
				string path = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "icon.png");
				if (File.Exists(path))
				{
					Texture2D val3 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val3, File.ReadAllBytes(path));
					val2 = Sprite.Create(val3, new Rect(0f, 0f, (float)((Texture)val3).width, (float)((Texture)val3).height), new Vector2(0f, 0f), 100f);
				}
				RiskOfOptionsDependency.RegisterModInfo("com.themysticsword.skillsmas", "Skillsmas", "Adds new skills. Has nothing to do with Christmas. Sorry.", val2);
			}
			if (Chainloader.PluginInfos.ContainsKey("com.Borbo.ArtificerExtended"))
			{
			}
			ContentLoadHelper.PluginAwakeLoad<BaseGenericLoadable>(executingAssembly);
			ContentLoadHelper.PluginAwakeLoad<BaseItem>(executingAssembly);
			ContentLoadHelper.PluginAwakeLoad<BaseEquipment>(executingAssembly);
			ContentLoadHelper.PluginAwakeLoad<BaseBuff>(executingAssembly);
			ContentLoadHelper.PluginAwakeLoad<BaseInteractable>(executingAssembly);
			ContentLoadHelper.PluginAwakeLoad<BaseCharacterBody>(executingAssembly);
			ContentLoadHelper.PluginAwakeLoad<BaseCharacterMaster>(executingAssembly);
			ContentLoadHelper.PluginAwakeLoad<BaseSkill>(executingAssembly);
			object obj = <>c.<>9__13_0;
			if (obj == null)
			{
				CollectContentPackProvidersDelegate val4 = delegate(AddContentPackProviderDelegate addContentPackProvider)
				{
					addContentPackProvider.Invoke((IContentPackProvider)(object)new SkillsmasContent());
				};
				<>c.<>9__13_0 = val4;
				obj = (object)val4;
			}
			ContentManager.collectContentPackProviders += (CollectContentPackProvidersDelegate)obj;
		}
	}
	public class SkillsmasContent : IContentPackProvider
	{
		public static class Resources
		{
			public static List<GameObject> bodyPrefabs = new List<GameObject>();

			public static List<GameObject> masterPrefabs = new List<GameObject>();

			public static List<GameObject> projectilePrefabs = new List<GameObject>();

			public static List<GameObject> effectPrefabs = new List<GameObject>();

			public static List<GameObject> gameModePrefabs = new List<GameObject>();

			public static List<GameObject> networkedObjectPrefabs = new List<GameObject>();

			public static List<NetworkSoundEventDef> networkSoundEventDefs = new List<NetworkSoundEventDef>();

			public static List<UnlockableDef> unlockableDefs = new List<UnlockableDef>();

			public static List<Type> entityStateTypes = new List<Type>();

			public static List<SkillDef> skillDefs = new List<SkillDef>();

			public static List<SkillFamily> skillFamilies = new List<SkillFamily>();

			public static List<SceneDef> sceneDefs = new List<SceneDef>();

			public static List<GameEndingDef> gameEndingDefs = new List<GameEndingDef>();
		}

		public static class Items
		{
			public static ItemDef Skillsmas_TemporaryMicrobots;
		}

		public static class Buffs
		{
			public static BuffDef Skillsmas_StopBarrierDecay;

			public static BuffDef Skillsmas_ChainKillActive;

			public static BuffDef Skillsmas_EnemyMark;

			public static BuffDef Skillsmas_MarkedEnemyHit;

			public static BuffDef Skillsmas_MarkedEnemyKill;

			public static BuffDef Skillsmas_ChainKillBonusDamage;

			public static BuffDef Skillsmas_ToolbotUpdated;

			public static BuffDef Skillsmas_Harden;
		}

		private ContentPack contentPack = new ContentPack();

		public string identifier => "Skillsmas";

		public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args)
		{
			contentPack.identifier = identifier;
			ContentLoadHelper contentLoadHelper = new ContentLoadHelper();
			Action[] loadDispatchers = new Action[8]
			{
				delegate
				{
					contentLoadHelper.DispatchLoad<object>(SkillsmasPlugin.executingAssembly, typeof(BaseGenericLoadable), (Action<object[]>)null);
				},
				delegate
				{
					contentLoadHelper.DispatchLoad<ItemDef>(SkillsmasPlugin.executingAssembly, typeof(BaseItem), (Action<ItemDef[]>)delegate(ItemDef[] x)
					{
						contentPack.itemDefs.Add(x);
					});
				},
				delegate
				{
					contentLoadHelper.DispatchLoad<EquipmentDef>(SkillsmasPlugin.executingAssembly, typeof(BaseEquipment), (Action<EquipmentDef[]>)delegate(EquipmentDef[] x)
					{
						contentPack.equipmentDefs.Add(x);
					});
				},
				delegate
				{
					contentLoadHelper.DispatchLoad<BuffDef>(SkillsmasPlugin.executingAssembly, typeof(BaseBuff), (Action<BuffDef[]>)delegate(BuffDef[] x)
					{
						contentPack.buffDefs.Add(x);
					});
				},
				delegate
				{
					contentLoadHelper.DispatchLoad<GameObject>(SkillsmasPlugin.executingAssembly, typeof(BaseInteractable), (Action<GameObject[]>)null);
				},
				delegate
				{
					contentLoadHelper.DispatchLoad<GameObject>(SkillsmasPlugin.executingAssembly, typeof(BaseCharacterBody), (Action<GameObject[]>)delegate(GameObject[] x)
					{
						contentPack.bodyPrefabs.Add(x);
					});
				},
				delegate
				{
					contentLoadHelper.DispatchLoad<GameObject>(SkillsmasPlugin.executingAssembly, typeof(BaseCharacterMaster), (Action<GameObject[]>)delegate(GameObject[] x)
					{
						contentPack.masterPrefabs.Add(x);
					});
				},
				delegate
				{
					contentLoadHelper.DispatchLoad<SkillDef>(SkillsmasPlugin.executingAssembly, typeof(BaseSkill), (Action<SkillDef[]>)delegate(SkillDef[] x)
					{
						contentPack.skillDefs.Add(x);
					});
				}
			};
			int i = 0;
			while (i < loadDispatchers.Length)
			{
				loadDispatchers[i]();
				args.ReportProgress(Util.Remap((float)(i + 1), 0f, (float)loadDispatchers.Length, 0f, 0.05f));
				yield return null;
				int num = i + 1;
				i = num;
			}
			while (contentLoadHelper.coroutine.MoveNext())
			{
				args.ReportProgress(Util.Remap(contentLoadHelper.progress.value, 0f, 1f, 0.05f, 0.9f));
				yield return contentLoadHelper.coroutine.Current;
			}
			loadDispatchers = new Action[15]
			{
				delegate
				{
					ContentLoadHelper.PopulateTypeFields<ItemDef>(typeof(Items), contentPack.itemDefs, (Func<string, string>)null);
				},
				delegate
				{
					ContentLoadHelper.PopulateTypeFields<BuffDef>(typeof(Buffs), contentPack.buffDefs, (Func<string, string>)null);
				},
				delegate
				{
					contentPack.bodyPrefabs.Add(Resources.bodyPrefabs.ToArray());
				},
				delegate
				{
					contentPack.masterPrefabs.Add(Resources.masterPrefabs.ToArray());
				},
				delegate
				{
					contentPack.projectilePrefabs.Add(Resources.projectilePrefabs.ToArray());
				},
				delegate
				{
					contentPack.gameModePrefabs.Add(Resources.gameModePrefabs.ToArray());
				},
				delegate
				{
					contentPack.networkedObjectPrefabs.Add(Resources.networkedObjectPrefabs.ToArray());
				},
				delegate
				{
					contentPack.effectDefs.Add(Resources.effectPrefabs.ConvertAll((Converter<GameObject, EffectDef>)((GameObject x) => new EffectDef(x))).ToArray());
				},
				delegate
				{
					contentPack.networkSoundEventDefs.Add(Resources.networkSoundEventDefs.ToArray());
				},
				delegate
				{
					contentPack.unlockableDefs.Add(Resources.unlockableDefs.ToArray());
				},
				delegate
				{
					contentPack.entityStateTypes.Add(Resources.entityStateTypes.ToArray());
				},
				delegate
				{
					contentPack.skillDefs.Add(Resources.skillDefs.ToArray());
				},
				delegate
				{
					contentPack.skillFamilies.Add(Resources.skillFamilies.ToArray());
				},
				delegate
				{
					contentPack.sceneDefs.Add(Resources.sceneDefs.ToArray());
				},
				delegate
				{
					contentPack.gameEndingDefs.Add(Resources.gameEndingDefs.ToArray());
				}
			};
			int j = 0;
			while (j < loadDispatchers.Length)
			{
				loadDispatchers[j]();
				args.ReportProgress(Util.Remap((float)(j + 1), 0f, (float)loadDispatchers.Length, 0.9f, 0.95f));
				yield return null;
				int num = j + 1;
				j = num;
			}
			loadDispatchers = new Action[6]
			{
				delegate
				{
					ContentLoadHelper.InvokeAfterContentPackLoaded<BaseGenericLoadable>(SkillsmasPlugin.executingAssembly);
				},
				delegate
				{
					ContentLoadHelper.InvokeAfterContentPackLoaded<BaseItem>(SkillsmasPlugin.executingAssembly);
				},
				delegate
				{
					ContentLoadHelper.InvokeAfterContentPackLoaded<BaseEquipment>(SkillsmasPlugin.executingAssembly);
				},
				delegate
				{
					ContentLoadHelper.InvokeAfterContentPackLoaded<BaseBuff>(SkillsmasPlugin.executingAssembly);
				},
				delegate
				{
					ContentLoadHelper.InvokeAfterContentPackLoaded<BaseInteractable>(SkillsmasPlugin.executingAssembly);
				},
				delegate
				{
					ContentLoadHelper.InvokeAfterContentPackLoaded<BaseSkill>(SkillsmasPlugin.executingAssembly);
				}
			};
			int k = 0;
			while (k < loadDispatchers.Length)
			{
				loadDispatchers[k]();
				args.ReportProgress(Util.Remap((float)(k + 1), 0f, (float)loadDispatchers.Length, 0.95f, 0.99f));
				yield return null;
				int num = k + 1;
				k = num;
			}
		}

		public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args)
		{
			ContentPack.Copy(contentPack, args.output);
			args.ReportProgress(1f);
			yield break;
		}

		public IEnumerator FinalizeAsync(FinalizeAsyncArgs args)
		{
			Action[] actions = new Action[4]
			{
				delegate
				{
					//IL_0005: Unknown result type (might be due to invalid IL or missing references)
					//IL_000a: Unknown result type (might be due to invalid IL or missing references)
					OrderCharacterSkills(Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/Base/Mage/MageBodyPrimaryFamily.asset").WaitForCompletion(), new string[5] { "FireFirebolt", "FireLightningBolt", "Skillsmas_CryoBolt", "Skillsmas_RockBolt", "Skillsmas_WaterBolt" });
				},
				delegate
				{
					//IL_0005: Unknown result type (might be due to invalid IL or missing references)
					//IL_000a: Unknown result type (might be due to invalid IL or missing references)
					OrderCharacterSkills(Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/Base/Mage/MageBodySecondaryFamily.asset").WaitForCompletion(), new string[5] { "Skillsmas_FlameBomb", "NovaBomb", "IceBomb", "Skillsmas_RockBomb", "Skillsmas_WaterBomb" });
				},
				delegate
				{
					//IL_0005: Unknown result type (might be due to invalid IL or missing references)
					//IL_000a: Unknown result type (might be due to invalid IL or missing references)
					OrderCharacterSkills(Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/Base/Mage/MageBodyUtilityFamily.asset").WaitForCompletion(), new string[5] { "Skillsmas_FireWall", "Skillsmas_LightningPillar", "Wall", "Skillsmas_RockPlatform", "Skillsmas_WaterCloud" });
				},
				delegate
				{
					//IL_0005: Unknown result type (might be due to invalid IL or missing references)
					//IL_000a: Unknown result type (might be due to invalid IL or missing references)
					OrderCharacterSkills(Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/Base/Mage/MageBodySpecialFamily.asset").WaitForCompletion(), new string[5] { "Flamethrower", "FlyUp", "Skillsmas_FrostBarrier", "Skillsmas_RockMeteor", "Skillsmas_WaterWave" });
				}
			};
			int i = 0;
			while (i < actions.Length)
			{
				actions[i]();
				args.ReportProgress(Util.Remap((float)(i + 1), 0f, (float)actions.Length, 0f, 0.99f));
				yield return null;
				int num = i + 1;
				i = num;
			}
			args.ReportProgress(1f);
			static void OrderCharacterSkills(SkillFamily skillFamily, string[] skillNames)
			{
				//IL_000d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_0050: Unknown result type (might be due to invalid IL or missing references)
				//IL_0055: Unknown result type (might be due to invalid IL or missing references)
				//IL_005b: 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_007e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0087: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b8: 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)
				Variant item = skillFamily.variants[skillFamily.defaultVariantIndex];
				List<Variant> list = skillFamily.variants.ToList();
				List<Variant> list2 = new List<Variant>();
				foreach (string skillName in skillNames)
				{
					Variant item2 = ((IEnumerable<Variant>)list).FirstOrDefault((Func<Variant, bool>)((Variant x) => x.skillDef.skillName == skillName));
					if (!((object)(Variant)(ref item2)).Equals((object)default(Variant)))
					{
						list2.Add(item2);
						list.Remove(item2);
					}
				}
				int num2 = 0;
				foreach (Variant item3 in list2)
				{
					list.Insert(num2, item3);
					num2++;
				}
				skillFamily.variants = list.ToArray();
				skillFamily.defaultVariantIndex = (uint)list.IndexOf(item);
			}
		}
	}
}
namespace Skillsmas.SoftDependencies
{
	internal static class ArtificerExtendedSupport
	{
		public static BindingFlags bindingFlagAll = (BindingFlags)(-1);

		internal static void Init()
		{
		}

		internal static void TriggerAltPassiveSkillCast(GameObject entityStateMachineObject)
		{
		}

		internal static bool BodyHasAltPassive(GameObject bodyObject)
		{
			return false;
		}

		internal static void OnBarrierCrystalSpawned(GameObject childGameObject, ProjectileExplosion projectileExplosion)
		{
		}

		internal static int GetWaterPower(GameObject bodyGameObject)
		{
			return 0;
		}
	}
}
namespace Skillsmas.Skills
{
	public abstract class BaseSkill : BaseLoadableAsset
	{
		public SkillDef skillDef;

		public Variant skillFamilyVariant;

		public ConfigurableValue<float> configCooldown;

		public ConfigurableValue<int> configMaxStock;

		public ConfigurableValue<int> configRechargeStock;

		public ConfigurableValue<int> configRequiredStock;

		public ConfigurableValue<int> configStockToConsume;

		public ConfigurableValue<bool> configCancelSprint;

		public ConfigurableValue<bool> configForceSprint;

		public ConfigurableValue<bool> configCancelledFromSprinting;

		public ConfigurableValue<bool> configIsCombatSkill;

		public ConfigurableValue<bool> configMustKeyPress;

		public virtual Type GetSkillDefType()
		{
			return typeof(SkillDef);
		}

		public override void Load()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			//IL_001a: 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_002e: Unknown result type (might be due to invalid IL or missing references)
			skillDef = (SkillDef)ScriptableObject.CreateInstance(GetSkillDefType());
			skillFamilyVariant = new Variant
			{
				skillDef = skillDef
			};
			((BaseLoadableAsset)this).OnLoad();
			((Object)skillDef).name = skillDef.skillName;
			base.asset = skillDef;
		}

		public void SetUpValuesAndOptions(string skillName, float baseRechargeInterval, int baseMaxStock, int rechargeStock, int requiredStock, int stockToConsume, bool cancelSprintingOnActivation, bool forceSprintDuringState, bool canceledFromSprinting, bool isCombatSkill, bool mustKeyPress)
		{
			configCooldown = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, skillName, "Cooldown", baseRechargeInterval, 0f, 1000f, "", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)delegate(float newValue)
			{
				skillDef.baseRechargeInterval = newValue;
			});
			configMaxStock = ConfigurableValue.CreateInt("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, skillName, "Max Stock", baseMaxStock, 0, 1000, "", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<int>)delegate(int newValue)
			{
				skillDef.baseMaxStock = newValue;
			});
			configRechargeStock = ConfigurableValue.CreateInt("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, skillName, "Recharge Stock", rechargeStock, 0, 1000, "", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<int>)delegate(int newValue)
			{
				skillDef.rechargeStock = newValue;
			});
			configRequiredStock = ConfigurableValue.CreateInt("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, skillName, "Required Stock", requiredStock, 0, 1000, "", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<int>)delegate(int newValue)
			{
				skillDef.requiredStock = newValue;
			});
			configStockToConsume = ConfigurableValue.CreateInt("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, skillName, "Stock To Consume", stockToConsume, 0, 1000, "", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<int>)delegate(int newValue)
			{
				skillDef.stockToConsume = newValue;
			});
			configCancelSprint = ConfigurableValue.CreateBool("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, skillName, "Cancel Sprint", cancelSprintingOnActivation, "", (List<string>)null, (ConfigEntry<bool>)null, false, (Action<bool>)delegate(bool newValue)
			{
				skillDef.cancelSprintingOnActivation = newValue;
			});
			configForceSprint = ConfigurableValue.CreateBool("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, skillName, "Force Sprint", forceSprintDuringState, "", (List<string>)null, (ConfigEntry<bool>)null, false, (Action<bool>)delegate(bool newValue)
			{
				skillDef.forceSprintDuringState = newValue;
			});
			configCancelledFromSprinting = ConfigurableValue.CreateBool("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, skillName, "Cancelled From Sprinting", canceledFromSprinting, "", (List<string>)null, (ConfigEntry<bool>)null, false, (Action<bool>)delegate(bool newValue)
			{
				skillDef.canceledFromSprinting = newValue;
			});
			configIsCombatSkill = ConfigurableValue.CreateBool("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, skillName, "Is Combat Skill", isCombatSkill, "", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<bool>)delegate(bool newValue)
			{
				skillDef.isCombatSkill = newValue;
			});
			configMustKeyPress = ConfigurableValue.CreateBool("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, skillName, "Must Key Press", mustKeyPress, "", (List<string>)null, (ConfigEntry<bool>)null, false, (Action<bool>)delegate(bool newValue)
			{
				skillDef.mustKeyPress = newValue;
			});
		}
	}
}
namespace Skillsmas.Skills.Treebot
{
	public class SpikyRoots : BaseSkill
	{
		public class FireRoot : BaseSkillState, IStepSetter
		{
			public static float distanceInitial = 5f;

			public static float distanceBetweenRoots = 6f;

			public static int rootCount = 4;

			public static float floorMaxDistance = 5f;

			public static float baseDuration = 0.6f;

			public static float firingBaseDuration = 0.2f;

			public float duration;

			public int step;

			public float fireInterval;

			public float fireTimer;

			public List<Vector3> rootPositions;

			public int rootsFired = 0;

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

			public override void OnEnter()
			{
				//IL_0079: Unknown result type (might be due to invalid IL or missing references)
				//IL_007e: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
				//IL_00db: Expected O, but got Unknown
				//IL_010a: Unknown result type (might be due to invalid IL or missing references)
				//IL_010f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0111: 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_011a: Unknown result type (might be due to invalid IL or missing references)
				//IL_011f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0135: Unknown result type (might be due to invalid IL or missing references)
				//IL_013b: Unknown result type (might be due to invalid IL or missing references)
				//IL_013d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0142: Unknown result type (might be due to invalid IL or missing references)
				//IL_0147: Unknown result type (might be due to invalid IL or missing references)
				//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
				//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
				//IL_01da: 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_016a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0171: Unknown result type (might be due to invalid IL or missing references)
				//IL_0176: Unknown result type (might be due to invalid IL or missing references)
				//IL_017b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0180: Unknown result type (might be due to invalid IL or missing references)
				//IL_0194: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
				((BaseState)this).OnEnter();
				duration = baseDuration / ((BaseState)this).attackSpeedStat;
				float num = firingBaseDuration / ((BaseState)this).attackSpeedStat;
				Util.PlayAttackSpeedSound("Play_treeBot_R_yank", ((EntityState)this).gameObject, 1.8f);
				((EntityState)this).PlayAnimation("Gesture, Additive", "FireBomb", "FireBomb.playbackRate", num, 0f);
				if (NetworkServer.active && Object.op_Implicit((Object)(object)((EntityState)this).healthComponent))
				{
					((EntityState)this).healthComponent.TakeDamage(new DamageInfo
					{
						damage = ((EntityState)this).healthComponent.combinedHealth * ConfigurableValue<float>.op_Implicit(hpCost) / 100f,
						position = ((EntityState)this).characterBody.corePosition,
						attacker = null,
						inflictor = null,
						damageType = DamageTypeCombo.op_Implicit((DamageType)3),
						procCoefficient = 0f
					});
				}
				if (!((EntityState)this).isAuthority)
				{
					return;
				}
				fireInterval = num / (float)rootCount;
				rootPositions = new List<Vector3>();
				Vector3 footPosition = ((EntityState)this).characterBody.footPosition;
				Ray aimRay = ((BaseState)this).GetAimRay();
				Vector3 direction = ((Ray)(ref aimRay)).direction;
				direction.y = 0f;
				((Vector3)(ref direction)).Normalize();
				Vector3 val = footPosition + distanceInitial * direction;
				bool flag = false;
				float num2 = 20f;
				RaycastHit val2 = default(RaycastHit);
				for (int i = 0; i < rootCount; i++)
				{
					if (!flag)
					{
						if (Physics.Raycast(new Ray(val + Vector3.up * num2, Vector3.down), ref val2, num2 + floorMaxDistance, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask), (QueryTriggerInteraction)1))
						{
							val = ((RaycastHit)(ref val2)).point;
						}
						else
						{
							flag = true;
						}
					}
					rootPositions.Add(val);
					val += distanceBetweenRoots * direction;
				}
			}

			public override void FixedUpdate()
			{
				((EntityState)this).FixedUpdate();
				if (!((EntityState)this).isAuthority)
				{
					return;
				}
				if (rootsFired < rootCount)
				{
					fireTimer -= Time.fixedDeltaTime;
					while (fireTimer <= 0f)
					{
						fireTimer += fireInterval;
						FireRootAuthority();
					}
				}
				if (((EntityState)this).fixedAge >= duration)
				{
					((EntityState)this).outer.SetNextStateToMain();
				}
			}

			public void FireRootAuthority()
			{
				//IL_0019: Unknown result type (might be due to invalid IL or missing references)
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0033: Unknown result type (might be due to invalid IL or missing references)
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				//IL_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_0047: 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_0063: Unknown result type (might be due to invalid IL or missing references)
				//IL_0064: Unknown result type (might be due to invalid IL or missing references)
				//IL_006b: Unknown result type (might be due to invalid IL or missing references)
				//IL_006c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0071: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
				//IL_00da: Unknown result type (might be due to invalid IL or missing references)
				//IL_00df: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e0: 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_00e8: 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_00f2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fd: Expected O, but got Unknown
				Vector3 val = rootPositions[rootsFired % rootPositions.Count];
				Vector3 val2 = Quaternion.AngleAxis(RoR2Application.rng.RangeFloat(0f, 360f), Vector3.up) * Vector3.forward;
				ProjectileManager.instance.FireProjectile(new FireProjectileInfo
				{
					projectilePrefab = projectilePrefab,
					position = val,
					rotation = Util.QuaternionSafeLookRotation(val2),
					damage = ConfigurableValue<float>.op_Implicit(damage) / 100f * ((BaseState)this).damageStat,
					crit = ((EntityState)this).characterBody.RollCrit(),
					force = 0f,
					owner = ((EntityState)this).gameObject
				});
				if (Object.op_Implicit((Object)(object)rootSpawnEffectPrefab))
				{
					EffectManager.SpawnEffect(rootSpawnEffectPrefab, new EffectData
					{
						origin = val,
						rotation = Util.QuaternionSafeLookRotation(Vector3.up)
					}, true);
				}
				rootsFired++;
			}

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

		public static ConfigurableValue<float> damage = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "REX: Uprooting", "Damage", 240f, 0f, 1000f, "", new List<string> { "TREEBOT_SKILLSMAS_SPIKYROOTS_DESCRIPTION" }, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)null);

		public static ConfigurableValue<float> procCoefficient;

		public static ConfigurableValue<float> hpCost = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "REX: Uprooting", "HP Cost", 10f, 0f, 1000f, "", new List<string> { "TREEBOT_SKILLSMAS_SPIKYROOTS_DESCRIPTION" }, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)null);

		public static ConfigurableValue<float> healing;

		public static GameObject projectilePrefab;

		public static GameObject rootSpawnEffectPrefab;

		public override void OnPluginAwake()
		{
			((BaseLoadableAsset)this).OnPluginAwake();
			projectilePrefab = Utils.CreateBlankPrefab("Skillsmas_SpikyRootsProjectile", true);
			projectilePrefab.GetComponent<NetworkIdentity>().localPlayerAuthority = true;
		}

		public override Type GetSkillDefType()
		{
			return typeof(SteppedSkillDef);
		}

		public override void OnLoad()
		{
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0412: Unknown result type (might be due to invalid IL or missing references)
			//IL_0417: Unknown result type (might be due to invalid IL or missing references)
			//IL_0529: Unknown result type (might be due to invalid IL or missing references)
			//IL_052e: Unknown result type (might be due to invalid IL or missing references)
			skillDef.skillName = "Skillsmas_SpikyRoots";
			skillDef.skillNameToken = "TREEBOT_SKILLSMAS_SPIKYROOTS_NAME";
			skillDef.skillDescriptionToken = "TREEBOT_SKILLSMAS_SPIKYROOTS_DESCRIPTION";
			skillDef.keywordTokens = new string[1] { "KEYWORD_PERCENT_HP" };
			skillDef.icon = SkillsmasPlugin.AssetBundle.LoadAsset<Sprite>("Assets/Mods/Skillsmas/SkillIcons/Uprooting.png");
			skillDef.activationStateMachineName = "Weapon";
			skillDef.activationState = new SerializableEntityStateType(typeof(FireRoot));
			skillDef.interruptPriority = (InterruptPriority)0;
			SetUpValuesAndOptions("REX: Uprooting", 0f, 1, 1, 1, 1, cancelSprintingOnActivation: true, forceSprintDuringState: false, canceledFromSprinting: false, isCombatSkill: true, mustKeyPress: false);
			skillDef.resetCooldownTimerOnUse = false;
			skillDef.fullRestockOnAssign = true;
			skillDef.dontAllowPastMaxStocks = false;
			skillDef.beginSkillCooldownOnSkillEnd = false;
			SkillDef obj = skillDef;
			SteppedSkillDef val = (SteppedSkillDef)(object)((obj is SteppedSkillDef) ? obj : null);
			val.stepCount = 3;
			val.stepGraceDuration = 60f;
			SkillFamily val2 = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/Base/Treebot/TreebotBodyPrimaryFamily.asset").WaitForCompletion();
			ArrayUtils.ArrayAppend<Variant>(ref val2.variants, ref skillFamilyVariant);
			SkillsmasContent.Resources.entityStateTypes.Add(typeof(FireRoot));
			GameObject val3 = SkillsmasPlugin.AssetBundle.LoadAsset<GameObject>("Assets/Mods/Skillsmas/Skills/REX/SpikyRoots/SpikyRootGhost.prefab");
			val3.AddComponent<ProjectileGhostController>();
			ObjectTransformCurve val4 = ((Component)val3.transform.Find("Pivot")).gameObject.AddComponent<ObjectTransformCurve>();
			val4.translationCurveX = AnimationCurve.Constant(0f, 1f, 0f);
			val4.translationCurveY = AnimationCurve.EaseInOut(0f, -9f, 1f, 0f);
			val4.translationCurveZ = AnimationCurve.Constant(0f, 1f, 0f);
			val4.useTranslationCurves = true;
			val4.useRotationCurves = false;
			val4.loop = false;
			val4.timeMax = 0.17f;
			ObjectScaleCurve val5 = ((Component)val3.transform.Find("Pivot/Scaler")).gameObject.AddComponent<ObjectScaleCurve>();
			val5.useOverallCurveOnly = false;
			val5.curveX = AnimationCurve.EaseInOut(0.8f, 1f, 1f, 0f);
			val5.curveY = AnimationCurve.EaseInOut(0.5f, 1f, 1f, 0.3f);
			val5.curveZ = AnimationCurve.EaseInOut(0.8f, 1f, 1f, 0f);
			val5.overallCurve = AnimationCurve.Constant(0f, 1f, 1f);
			val5.timeMax = 0.4f;
			Utils.CopyChildren(SkillsmasPlugin.AssetBundle.LoadAsset<GameObject>("Assets/Mods/Skillsmas/Skills/REX/SpikyRoots/SpikyRootProjectile.prefab"), projectilePrefab, true);
			ProjectileController projectileController = projectilePrefab.AddComponent<ProjectileController>();
			projectileController.allowPrediction = true;
			projectileController.ghostPrefab = val3;
			procCoefficient = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "REX: Uprooting", "Proc Coefficient", 1f, 0f, 1000f, "", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)delegate(float newValue)
			{
				projectileController.procCoefficient = newValue;
			});
			projectilePrefab.AddComponent<ProjectileNetworkTransform>();
			ProjectileSimple val6 = projectilePrefab.AddComponent<ProjectileSimple>();
			val6.desiredForwardSpeed = 0f;
			val6.lifetime = 0.4f;
			ProjectileDamage val7 = projectilePrefab.AddComponent<ProjectileDamage>();
			HitBoxGroup val8 = projectilePrefab.AddComponent<HitBoxGroup>();
			val8.groupName = "Root";
			val8.hitBoxes = (HitBox[])(object)new HitBox[2]
			{
				((Component)projectilePrefab.transform.Find("HitBox")).gameObject.AddComponent<HitBox>(),
				((Component)projectilePrefab.transform.Find("HitBox (1)")).gameObject.AddComponent<HitBox>()
			};
			ProjectileOverlapAttack val9 = projectilePrefab.AddComponent<ProjectileOverlapAttack>();
			val9.damageCoefficient = 1f;
			val9.resetInterval = -1f;
			val9.overlapProcCoefficient = 1f;
			val9.fireFrequency = 20f;
			val9.impactEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Treebot/OmniImpactVFXSlashSyringe.prefab").WaitForCompletion();
			SkillsmasProjectileHealOwnerOnDamageInflicted healOwner = projectilePrefab.AddComponent<SkillsmasProjectileHealOwnerOnDamageInflicted>();
			healOwner.maxInstancesOfHealing = 1;
			ProjectileInflictTimedBuff inflictTimedBuff = projectilePrefab.AddComponent<ProjectileInflictTimedBuff>();
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate
			{
				inflictTimedBuff.buffDef = Buffs.Entangle;
			});
			inflictTimedBuff.duration = 0.5f;
			SkillsmasProjectileSoundAdder skillsmasProjectileSoundAdder = projectilePrefab.AddComponent<SkillsmasProjectileSoundAdder>();
			skillsmasProjectileSoundAdder.projectileOverlapAttack = val9;
			skillsmasProjectileSoundAdder.impactSoundEventDef = ScriptableObject.CreateInstance<NetworkSoundEventDef>();
			skillsmasProjectileSoundAdder.impactSoundEventDef.eventName = "Play_treeBot_m1_impact";
			SkillsmasContent.Resources.networkSoundEventDefs.Add(skillsmasProjectileSoundAdder.impactSoundEventDef);
			healing = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "REX: Uprooting", "Healing", 5f, 0f, 1000f, "", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)delegate(float newValue)
			{
				healOwner.fractionalHealing = newValue / 100f;
			});
			SkillsmasContent.Resources.projectilePrefabs.Add(projectilePrefab);
			rootSpawnEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Treebot/TreebotMortarMuzzleflash.prefab").WaitForCompletion();
		}
	}
	public class WalkingHealer : BaseSkill
	{
		public class WalkingHealerState : GenericCharacterMain
		{
			public static GameObject rangeIndicatorPrefab;

			public static LoopSoundDef loopSoundDef;

			public float duration;

			public SoundLoopPtr soundLoopPtr;

			public SphereSearch allySearch;

			public TeamMask teamMask;

			public Transform rangeIndicator;

			public float rangeIndicatorScaleVelocity;

			public float currentRadius;

			public float healInterval = 0.25f;

			public float healTimer;

			public override void OnEnter()
			{
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				//IL_003a: Unknown result type (might be due to invalid IL or missing references)
				//IL_007c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0081: Unknown result type (might be due to invalid IL or missing references)
				//IL_008d: 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_009a: Unknown result type (might be due to invalid IL or missing references)
				//IL_009f: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a9: Expected O, but got Unknown
				//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
				((GenericCharacterMain)this).OnEnter();
				duration = ConfigurableValue<float>.op_Implicit(WalkingHealer.duration);
				Util.PlaySound("Play_treeBot_R_impact", ((EntityState)this).gameObject);
				soundLoopPtr = LoopSoundManager.PlaySoundLoopLocal(((EntityState)this).gameObject, loopSoundDef);
				((EntityState)this).PlayAnimation("Gesture, Additive", "FireFlower", "FireFlower.playbackRate", 1f, 0f);
				currentRadius = ConfigurableValue<float>.op_Implicit(radius) + ((EntityState)this).characterBody.bestFitRadius;
				allySearch = new SphereSearch
				{
					radius = currentRadius,
					queryTriggerInteraction = (QueryTriggerInteraction)1,
					mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask
				};
				((TeamMask)(ref teamMask)).AddTeam(((EntityState)this).teamComponent.teamIndex);
				rangeIndicator = Object.Instantiate<GameObject>(rangeIndicatorPrefab, ((EntityState)this).characterBody.corePosition, Quaternion.identity).transform;
			}

			public override void Update()
			{
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_003a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0064: Unknown result type (might be due to invalid IL or missing references)
				((GenericCharacterMain)this).Update();
				if (Object.op_Implicit((Object)(object)rangeIndicator))
				{
					((Component)rangeIndicator).transform.position = ((EntityState)this).transform.position;
					float num = Mathf.SmoothDamp(rangeIndicator.localScale.x, currentRadius, ref rangeIndicatorScaleVelocity, 0.2f);
					rangeIndicator.localScale = new Vector3(num, num, num);
				}
			}

			public override void FixedUpdate()
			{
				((GenericCharacterMain)this).FixedUpdate();
				if (NetworkServer.active)
				{
					healTimer -= Time.fixedDeltaTime;
					if (healTimer <= 0f)
					{
						healTimer += healInterval;
						Heal();
					}
				}
				if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
				{
					((EntityState)this).outer.SetNextStateToMain();
				}
			}

			public void Heal()
			{
				//IL_000d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_0047: Unknown result type (might be due to invalid IL or missing references)
				//IL_0087: Unknown result type (might be due to invalid IL or missing references)
				//IL_008d: Unknown result type (might be due to invalid IL or missing references)
				allySearch.origin = ((EntityState)this).characterBody.corePosition;
				allySearch.radius = currentRadius;
				allySearch.RefreshCandidates();
				allySearch.FilterCandidatesByDistinctHurtBoxEntities();
				allySearch.FilterCandidatesByHurtBoxTeam(teamMask);
				HurtBox[] hurtBoxes = allySearch.GetHurtBoxes();
				foreach (HurtBox val in hurtBoxes)
				{
					val.healthComponent.HealFraction(ConfigurableValue<float>.op_Implicit(healing) / 100f * healInterval, default(ProcChainMask));
				}
			}

			public override void OnExit()
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				LoopSoundManager.StopSoundLoopLocal(soundLoopPtr);
				Util.PlaySound("Play_treeBot_sprint_end", ((EntityState)this).gameObject);
				((EntityState)this).PlayAnimation("Gesture, Additive", "FireFlower", "FireFlower.playbackRate", 1f, 0f);
				if (Object.op_Implicit((Object)(object)rangeIndicator))
				{
					EntityState.Destroy((Object)(object)((Component)rangeIndicator).gameObject);
				}
				((GenericCharacterMain)this).OnExit();
			}

			public override bool CanExecuteSkill(GenericSkill skillSlot)
			{
				return false;
			}

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

		public static ConfigurableValue<float> duration = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "REX: DIRECTIVE: Stimulate", "Duration", 8f, 0f, 1000f, "", new List<string> { "TREEBOT_SKILLSMAS_WALKINGHEALER_DESCRIPTION" }, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)null);

		public static ConfigurableValue<float> healing = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "REX: DIRECTIVE: Stimulate", "Healing", 20f, 0f, 1000f, "", new List<string> { "TREEBOT_SKILLSMAS_WALKINGHEALER_DESCRIPTION" }, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)null);

		public static ConfigurableValue<float> radius = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "REX: DIRECTIVE: Stimulate", "Radius", 13f, 0f, 1000f, "", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)null);

		public override void OnLoad()
		{
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			skillDef.skillName = "Skillsmas_WalkingHealer";
			skillDef.skillNameToken = "TREEBOT_SKILLSMAS_WALKINGHEALER_NAME";
			skillDef.skillDescriptionToken = "TREEBOT_SKILLSMAS_WALKINGHEALER_DESCRIPTION";
			skillDef.keywordTokens = new string[1] { "KEYWORD_SKILLSMAS_HARMLESS" };
			skillDef.icon = SkillsmasPlugin.AssetBundle.LoadAsset<Sprite>("Assets/Mods/Skillsmas/SkillIcons/DirectiveStimulate.png");
			skillDef.activationStateMachineName = "Weapon";
			skillDef.activationState = new SerializableEntityStateType(typeof(WalkingHealerState));
			skillDef.interruptPriority = (InterruptPriority)1;
			SetUpValuesAndOptions("REX: DIRECTIVE: Stimulate", 12f, 1, 1, 1, 1, cancelSprintingOnActivation: false, forceSprintDuringState: false, canceledFromSprinting: false, isCombatSkill: false, mustKeyPress: true);
			skillDef.resetCooldownTimerOnUse = false;
			skillDef.fullRestockOnAssign = true;
			skillDef.dontAllowPastMaxStocks = false;
			skillDef.beginSkillCooldownOnSkillEnd = true;
			SkillFamily val = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/Base/Treebot/TreebotBodySpecialFamily.asset").WaitForCompletion();
			ArrayUtils.ArrayAppend<Variant>(ref val.variants, ref skillFamilyVariant);
			SkillsmasContent.Resources.entityStateTypes.Add(typeof(WalkingHealerState));
			WalkingHealerState.rangeIndicatorPrefab = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/ShrineHealing/ShrineHealingWard.prefab").WaitForCompletion(), "Skillsmas_WalkingHealerRangeIndicator", false);
			Object.Destroy((Object)(object)WalkingHealerState.rangeIndicatorPrefab.GetComponent<HealingWard>());
			Object.Destroy((Object)(object)WalkingHealerState.rangeIndicatorPrefab.GetComponent<TeamFilter>());
			Object.Destroy((Object)(object)WalkingHealerState.rangeIndicatorPrefab.GetComponent<NetworkIdentity>());
			WalkingHealerState.loopSoundDef = ScriptableObject.CreateInstance<LoopSoundDef>();
			WalkingHealerState.loopSoundDef.startSoundName = "Play_miniMushroom_selfHeal_loop";
			WalkingHealerState.loopSoundDef.stopSoundName = "Stop_miniMushroom_selfHeal_loop";
		}
	}
}
namespace Skillsmas.Skills.Toolbot
{
	public class Crate : BaseSkill
	{
		public class SkillsmasCrateController : MonoBehaviour
		{
			public Rigidbody rigidbody;

			public ProjectileOverlapAttack overlapAttack;

			public Collider disabledCollider;

			public float disabledColliderDuration = 0.1f;

			public void Awake()
			{
				rigidbody = ((Component)this).GetComponent<Rigidbody>();
				overlapAttack = ((Component)this).GetComponent<ProjectileOverlapAttack>();
			}

			public void FixedUpdate()
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				Vector3 velocity = rigidbody.velocity;
				bool enabled = ((Vector3)(ref velocity)).sqrMagnitude >= 25f;
				((Behaviour)overlapAttack).enabled = enabled;
				if (Object.op_Implicit((Object)(object)disabledCollider) && disabledColliderDuration > 0f)
				{
					disabledColliderDuration -= Time.fixedDeltaTime;
					if (disabledColliderDuration <= 0f)
					{
						disabledCollider.enabled = true;
					}
				}
			}
		}

		public class AimCrate : AimThrowableBase
		{
			public override void OnEnter()
			{
				//IL_009e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0086: Unknown result type (might be due to invalid IL or missing references)
				//IL_0091: Unknown result type (might be due to invalid IL or missing references)
				((EntityState)(object)this).LoadConfiguration(typeof(AimStunDrone));
				base.maxDistance = 20f;
				base.rayRadius = 0f;
				base.endpointVisualizerRadiusScale = 0f;
				base.damageCoefficient = ConfigurableValue<float>.op_Implicit(damage) / 100f;
				base.baseMinimumDuration = 0.25f;
				base.projectilePrefab = crateProjectilePrefab;
				((AimThrowableBase)this).OnEnter();
				base.detonationRadius = 3f;
				if (Object.op_Implicit((Object)(object)base.endpointVisualizerTransform))
				{
					base.endpointVisualizerTransform.localScale = Vector3.one * base.detonationRadius;
				}
				((AimThrowableBase)this).UpdateVisualizers(base.currentTrajectoryInfo);
				Util.PlaySound("Play_MULT_m2_aim", ((EntityState)this).gameObject);
				((EntityState)this).PlayAnimation("Gesture, Additive", "PrepBomb", "PrepBomb.playbackRate", base.minimumDuration, 0f);
				((EntityState)this).PlayAnimation("Stance, Override", "PutAwayGun");
			}

			public override void OnExit()
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Expected O, but got Unknown
				((EntityState)this).outer.SetNextState((EntityState)new RecoverAimStunDrone());
				Util.PlaySound("Play_MULT_m2_throw", ((EntityState)this).gameObject);
				((AimThrowableBase)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;
			}
		}

		public static GameObject crateProjectilePrefab;

		public static GameObject crateGhostPrefab;

		public static ConfigurableValue<float> damage = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "MUL-T: Shipping Crate", "Damage", 400f, 0f, 1000f, "", new List<string> { "TOOLBOT_SKILLSMAS_CRATE_DESCRIPTION" }, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)null);

		public static ConfigurableValue<float> pushPower = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "MUL-T: Shipping Crate", "Push Power", 1f, 0f, 5f, "Crates can be pushed by attacks. Increase or decrease this to adjust how strongly they should be pushed.", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)null);

		public static ConfigurableValue<float> lifetime;

		public override void OnPluginAwake()
		{
			((BaseLoadableAsset)this).OnPluginAwake();
			crateProjectilePrefab = Utils.CreateBlankPrefab("Skillsmas_CrateProjectile", true);
			crateProjectilePrefab.GetComponent<NetworkIdentity>().localPlayerAuthority = true;
			crateProjectilePrefab.AddComponent<NetworkTransform>();
		}

		public override void OnLoad()
		{
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_034a: Unknown result type (might be due to invalid IL or missing references)
			//IL_034f: Unknown result type (might be due to invalid IL or missing references)
			//IL_03de: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_046d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0477: Expected O, but got Unknown
			skillDef.skillName = "Skillsmas_Crate";
			skillDef.skillNameToken = "TOOLBOT_SKILLSMAS_CRATE_NAME";
			skillDef.skillDescriptionToken = "TOOLBOT_SKILLSMAS_CRATE_DESCRIPTION";
			skillDef.icon = SkillsmasPlugin.AssetBundle.LoadAsset<Sprite>("Assets/Mods/Skillsmas/SkillIcons/Crate.png");
			skillDef.activationStateMachineName = "Weapon";
			skillDef.activationState = new SerializableEntityStateType(typeof(AimCrate));
			skillDef.interruptPriority = (InterruptPriority)1;
			SetUpValuesAndOptions("MUL-T: Shipping Crate", 6f, 1, 1, 1, 1, cancelSprintingOnActivation: true, forceSprintDuringState: false, canceledFromSprinting: false, isCombatSkill: true, mustKeyPress: true);
			skillDef.resetCooldownTimerOnUse = false;
			skillDef.fullRestockOnAssign = true;
			skillDef.dontAllowPastMaxStocks = false;
			skillDef.beginSkillCooldownOnSkillEnd = true;
			SkillFamily val = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/Base/Toolbot/ToolbotBodySecondaryFamily.asset").WaitForCompletion();
			ArrayUtils.ArrayAppend<Variant>(ref val.variants, ref skillFamilyVariant);
			SkillsmasContent.Resources.entityStateTypes.Add(typeof(AimCrate));
			crateGhostPrefab = SkillsmasPlugin.AssetBundle.LoadAsset<GameObject>("Assets/Mods/Skillsmas/Skills/MUL-T/Crate/CrateGhost.prefab");
			crateGhostPrefab.AddComponent<ProjectileGhostController>();
			GameObject val2 = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Toolbot/RoboCratePod.prefab").WaitForCompletion(), "Skillsmas_TempCrateCopy");
			Transform val3 = val2.transform.Find("Base/mdlRoboCrate/Base/RobotCrateMesh");
			Object.Destroy((Object)(object)val2);
			((Component)crateGhostPrefab.transform.Find("Mesh")).GetComponent<MeshFilter>().sharedMesh = ((Component)val3).GetComponent<MeshFilter>().sharedMesh;
			((Renderer)((Component)crateGhostPrefab.transform.Find("Mesh")).GetComponent<MeshRenderer>()).sharedMaterial = ((Renderer)((Component)val3).GetComponent<MeshRenderer>()).sharedMaterial;
			Utils.CopyChildren(SkillsmasPlugin.AssetBundle.LoadAsset<GameObject>("Assets/Mods/Skillsmas/Skills/MUL-T/Crate/CrateProjectile.prefab"), crateProjectilePrefab, true);
			ProjectileController val4 = crateProjectilePrefab.AddComponent<ProjectileController>();
			val4.ghostPrefab = crateGhostPrefab;
			val4.allowPrediction = true;
			ProjectileNetworkTransform val5 = crateProjectilePrefab.AddComponent<ProjectileNetworkTransform>();
			val5.allowClientsideCollision = true;
			crateProjectilePrefab.AddComponent<TeamFilter>();
			ProjectileSimple projectileSimple = crateProjectilePrefab.AddComponent<ProjectileSimple>();
			projectileSimple.desiredForwardSpeed = 20f;
			lifetime = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "MUL-T: Shipping Crate", "Lifetime", 600f, 0f, 1000f, "", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)delegate(float newValue)
			{
				projectileSimple.lifetime = newValue;
			});
			ProjectileDamage val6 = crateProjectilePrefab.AddComponent<ProjectileDamage>();
			HitBoxGroup val7 = crateProjectilePrefab.AddComponent<HitBoxGroup>();
			val7.hitBoxes = (HitBox[])(object)new HitBox[1] { ((Component)crateProjectilePrefab.transform.Find("HitBox")).gameObject.AddComponent<HitBox>() };
			ProjectileOverlapAttack projectileOverlapAttack = crateProjectilePrefab.AddComponent<ProjectileOverlapAttack>();
			projectileOverlapAttack.damageCoefficient = 1f;
			ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "MUL-T: Shipping Crate", "Proc Coefficient", 1f, 0f, 1000f, "", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)delegate(float newValue)
			{
				projectileOverlapAttack.overlapProcCoefficient = newValue;
			});
			projectileOverlapAttack.resetInterval = 10f;
			projectileOverlapAttack.impactEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Toolbot/ImpactToolbotDash.prefab").WaitForCompletion();
			SkillsmasCrateController skillsmasCrateController = crateProjectilePrefab.AddComponent<SkillsmasCrateController>();
			((Component)crateProjectilePrefab.transform.Find("Collider")).gameObject.AddComponent<EntityLocator>().entity = crateProjectilePrefab;
			((Component)crateProjectilePrefab.transform.Find("Collider/ProjectileBlockingCollider")).gameObject.AddComponent<EntityLocator>().entity = crateProjectilePrefab;
			skillsmasCrateController.disabledCollider = ((Component)crateProjectilePrefab.transform.Find("Collider")).GetComponent<Collider>();
			SurfaceDef surfaceDef = Addressables.LoadAssetAsync<SurfaceDef>((object)"RoR2/Base/Common/sdMetal.asset").WaitForCompletion();
			Collider[] componentsInChildren = ((Component)crateProjectilePrefab.transform.Find("Collider")).GetComponentsInChildren<Collider>();
			foreach (Collider val8 in componentsInChildren)
			{
				SurfaceDefProvider component = ((Component)val8).GetComponent<SurfaceDefProvider>();
				if (!((Object)(object)component != (Object)null))
				{
					component = ((Component)val8).gameObject.AddComponent<SurfaceDefProvider>();
					component.surfaceDef = surfaceDef;
				}
			}
			SkillsmasContent.Resources.projectilePrefabs.Add(crateProjectilePrefab);
			GlobalEventManager.OnHitAll += new hook_OnHitAll(GlobalEventManager_OnHitAll);
		}

		private void GlobalEventManager_OnHitAll(orig_OnHitAll orig, GlobalEventManager self, DamageInfo damageInfo, GameObject hitObject)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, damageInfo, hitObject);
			if (!Object.op_Implicit((Object)(object)hitObject))
			{
				return;
			}
			GameObject entity = EntityLocator.GetEntity(hitObject);
			if (Object.op_Implicit((Object)(object)entity))
			{
				SkillsmasCrateController component = entity.GetComponent<SkillsmasCrateController>();
				if (Object.op_Implicit((Object)(object)component))
				{
					component.rigidbody.AddForce(damageInfo.force * ConfigurableValue<float>.op_Implicit(pushPower), (ForceMode)1);
				}
			}
		}
	}
	public class RobotUpdate : BaseSkill
	{
		public class ToolbotUpdating : BaseCharacterMain
		{
			public static GameObject startEffectPrefab;

			public static GameObject endEffectPrefab;

			public float duration;

			public Vector3 idealDirection;

			public uint soundID;

			public bool buffGranted = false;

			public override void OnEnter()
			{
				//IL_00db: Unknown result type (might be due to invalid IL or missing references)
				//IL_0083: Unknown result type (might be due to invalid IL or missing references)
				//IL_0088: Unknown result type (might be due to invalid IL or missing references)
				//IL_010c: 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_0118: Unknown result type (might be due to invalid IL or missing references)
				//IL_0129: Expected O, but got Unknown
				((BaseCharacterMain)this).OnEnter();
				duration = ConfigurableValue<float>.op_Implicit(updateDuration);
				if (((EntityState)this).isAuthority)
				{
					EntityStateMachine val = EntityStateMachine.FindByCustomName(((EntityState)this).gameObject, "Weapon");
					if (Object.op_Implicit((Object)(object)val))
					{
						val.SetNextStateToMain();
					}
					val = EntityStateMachine.FindByCustomName(((EntityState)this).gameObject, "Weapon2");
					if (Object.op_Implicit((Object)(object)val))
					{
						val.SetNextStateToMain();
					}
					if (Object.op_Implicit((Object)(object)((EntityState)this).inputBank))
					{
						idealDirection = ((EntityState)this).inputBank.aimDirection;
						idealDirection.y = 0f;
					}
					UpdateDirection();
				}
				if (Object.op_Implicit((Object)(object)((EntityState)this).modelLocator))
				{
					((EntityState)this).modelLocator.normalizeToFloor = true;
				}
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
				{
					((EntityState)this).characterDirection.forward = idealDirection;
				}
				if (Object.op_Implicit((Object)(object)startEffectPrefab) && Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
				{
					EffectManager.SpawnEffect(startEffectPrefab, new EffectData
					{
						origin = ((EntityState)this).characterBody.corePosition
					}, false);
				}
				soundID = Util.PlaySound("Play_MULT_shift_start", ((EntityState)this).gameObject);
				((EntityState)this).PlayCrossfade("Body", "BoxModeEnter", 0.1f);
				((EntityState)this).PlayCrossfade("Stance, Override", "PutAwayGun", 0.1f);
				((BaseCharacterMain)this).modelAnimator.SetFloat("aimWeight", 0f);
			}

			public override void FixedUpdate()
			{
				//IL_008b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0091: Unknown result type (might be due to invalid IL or missing references)
				//IL_0152: Unknown result type (might be due to invalid IL or missing references)
				//IL_0157: Unknown result type (might be due to invalid IL or missing references)
				//IL_0188: Unknown result type (might be due to invalid IL or missing references)
				//IL_018e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0198: Unknown result type (might be due to invalid IL or missing references)
				//IL_019d: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
				((BaseCharacterMain)this).FixedUpdate();
				if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
				{
					if (!buffGranted)
					{
						buffGranted = true;
						if (NetworkServer.active)
						{
							if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody.healthComponent))
							{
								((EntityState)this).characterBody.healthComponent.Heal(ConfigurableValue<float>.op_Implicit(healing) / 100f * ((EntityState)this).characterBody.healthComponent.fullHealth, default(ProcChainMask), true);
							}
							((EntityState)this).characterBody.AddTimedBuff(SkillsmasContent.Buffs.Skillsmas_ToolbotUpdated, ConfigurableValue<float>.op_Implicit(buffDuration));
						}
					}
					((EntityState)this).outer.SetNextStateToMain();
				}
				else
				{
					if (!((EntityState)this).isAuthority)
					{
						return;
					}
					if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
					{
						((EntityState)this).characterBody.isSprinting = false;
					}
					if (Object.op_Implicit((Object)(object)((EntityState)this).skillLocator.special) && ((EntityState)this).inputBank.skill4.down)
					{
						((EntityState)this).skillLocator.special.ExecuteIfReady();
					}
					UpdateDirection();
					if (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
					{
						((EntityState)this).characterDirection.moveVector = idealDirection;
						if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && !((EntityState)this).characterMotor.disableAirControlUntilCollision)
						{
							CharacterMotor characterMotor = ((EntityState)this).characterMotor;
							characterMotor.rootMotion += GetIdealVelocity() * Time.fixedDeltaTime;
						}
					}
				}
			}

			public void UpdateDirection()
			{
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				//IL_001c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0021: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0046: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0051: Unknown result type (might be due to invalid IL or missing references)
				//IL_0054: 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)
				if (Object.op_Implicit((Object)(object)((EntityState)this).inputBank))
				{
					Vector2 val = Util.Vector3XZToVector2XY(((EntityState)this).inputBank.moveVector);
					if (val != Vector2.zero)
					{
						((Vector2)(ref val)).Normalize();
						Vector3 val2 = new Vector3(val.x, 0f, val.y);
						idealDirection = ((Vector3)(ref val2)).normalized;
					}
				}
			}

			public Vector3 GetIdealVelocity()
			{
				//IL_0007: 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_0026: 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_0038: Unknown result type (might be due to invalid IL or missing references)
				return ((EntityState)this).characterDirection.forward * ((EntityState)this).characterBody.moveSpeed * ConfigurableValue<float>.op_Implicit(updateSpeedMultiplier) / 100f;
			}

			public override void OnExit()
			{
				//IL_0052: Unknown result type (might be due to invalid IL or missing references)
				//IL_0057: Unknown result type (might be due to invalid IL or missing references)
				//IL_005e: Unknown result type (might be due to invalid IL or missing references)
				//IL_006f: Expected O, but got Unknown
				AkSoundEngine.StopPlayingID(soundID);
				Util.PlaySound("Play_MULT_shift_end", ((EntityState)this).gameObject);
				if (!((EntityState)this).outer.destroying && Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
				{
					if (Object.op_Implicit((Object)(object)endEffectPrefab))
					{
						EffectManager.SpawnEffect(endEffectPrefab, new EffectData
						{
							origin = ((EntityState)this).characterBody.corePosition
						}, false);
					}
					((EntityState)this).PlayAnimation("Body", "BoxModeExit");
					((EntityState)this).PlayCrossfade("Stance, Override", "Empty", 0.1f);
				}
				if (Object.op_Implicit((Object)(object)((EntityState)this).modelLocator))
				{
					((EntityState)this).modelLocator.normalizeToFloor = false;
				}
				((BaseCharacterMain)this).modelAnimator.SetFloat("aimWeight", 1f);
				((BaseCharacterMain)this).OnExit();
			}

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

		public static ConfigurableValue<float> updateDuration = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "MUL-T: Update Mode", "Update Duration", 2f, 0f, 1000f, "", new List<string> { "TOOLBOT_SKILLSMAS_ROBOTUPDATE_DESCRIPTION" }, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)null);

		public static ConfigurableValue<float> updateSpeedMultiplier = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "MUL-T: Update Mode", "Update Speed Multiplier", 100f, 0f, 1000f, "", (List<string>)null, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)null);

		public static ConfigurableValue<float> healing = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "MUL-T: Update Mode", "Healing", 10f, 0f, 1000f, "", new List<string> { "TOOLBOT_SKILLSMAS_ROBOTUPDATE_DESCRIPTION" }, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)null);

		public static ConfigurableValue<float> attackSpeed = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "MUL-T: Update Mode", "Attack Speed", 50f, 0f, 1000f, "", new List<string> { "TOOLBOT_SKILLSMAS_ROBOTUPDATE_DESCRIPTION" }, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)null);

		public static ConfigurableValue<float> buffDuration = ConfigurableValue.CreateFloat("com.themysticsword.skillsmas", "Skillsmas", SkillsmasPlugin.config, "MUL-T: Update Mode", "Buff Duration", 7f, 0f, 1000f, "", new List<string> { "TOOLBOT_SKILLSMAS_ROBOTUPDATE_DESCRIPTION" }, SkillsmasPlugin.ignoreBalanceConfig.bepinexConfigEntry, false, (Action<float>)null);

		public override void OnLoad()
		{
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			skillDef.skillName = "Skillsmas_RobotUpdate";
			skillDef.skillNameToken = "TOOLBOT_SKILLSMAS_ROBOTUPDATE_NAME";
			skillDef.skillDescriptionToken = "TOOLBOT_SKILLSMAS_ROBOTUPDATE_DESCRIPTION";
			skillDef.keywordTokens = new string[1] { "KEYWORD_SKILLSMAS_HARMLESS" };
			skillDef.icon = SkillsmasPlugin.AssetBundle.LoadAsset<Sprite>("Assets/Mods/Skillsmas/SkillIcons/UpdateMode.png");
			skillDef.activationStateMachineName = "Body";
			skillDef.activationState = new SerializableEntityStateType(typeof(ToolbotUpdating));
			skillDef.interruptPriority = (InterruptPriority)1;
			SetUpValuesAndOptions("MUL-T: Update Mode", 10f, 1, 1, 1, 1, cancelSprintingOnActivation: true, forceSprintDuringState: false, canceledFromSprinting: false, isCombatSkill: false, mustKeyPress: true);
			skillDef.resetCooldownTimerOnUse = false;
			skillDef.fullRestockOnAssign = true;
			skillDef.dontAllowPastMaxStocks = false;
			skillDef.beginSkillCooldownOnSkillEnd = true;
			SkillFamily val = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/Base/Toolbot/ToolbotBodyUtilityFamily.asset").WaitForCompletion();
			ArrayUtils.ArrayAppend<Variant>(ref val.variants, ref skillFamilyVariant);
			SkillsmasContent.Resources.entityStateTypes.Add(typeof(ToolbotUpdating));
			ToolbotUpdating.endEffectPrefab = SkillsmasPlugin.AssetBundle.LoadAsset<GameObject>("Assets/Mods/Skillsmas/Skills/MUL-T/RobotUpdate/RobotUpdateFinish.prefab");
			ToolbotUpdating.endEffectPrefab.AddComponent<EffectComponent>();
			VFXAttributes val2 = ToolbotUpdating.endEffectPrefab.AddComponent<VFXAttributes>();
			val2.vfxIntensity = (VFXIntensity)0;
			val2.vfxPriority = (VFXPriority)1;
			SkillsmasContent.Resources.effectPrefabs.Add(ToolbotUpdating.endEffectPrefab);
		}
	}
}
namespace Skillsmas.Skills.Merc
{
	public class BladeRoll : BaseSkill
	{
		public class BladeRollState : BaseCharacterMain
		{
			public static GameObject startEffectPrefab;

			public static GameObject endEffectPrefab;

			public static GameObject swirlEffectPrefab;

			public static GameObject hitEffectPrefab;

			public static LoopSoundDef loopSoundDef;

			public static float minDuration = 0.5f;

			public static float baseAnimationDuration = 0.25f;

			public static float baseSwirlEffectInterval = 0.14f;

			public static float overlapAttackResetInterval = 1f;

			public float moveSpeedDifference;

			public Vector3 idealDirection;

			public SoundLoopPtr soundLoopPtr;

			public float animationDuration;

			public float animationTimer;

			public float swirlEffectInterval;

			public float swirlEffectTimer;

			public OverlapAttack overlapAttack;

			public float overlapAttackResetTimer;

			public override void OnEnter()
			{
				//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_00ba: 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_016d: Unknown result type (might be due to invalid IL or missing references)
				//IL_012c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0131: Unknown result type (might be due to invalid IL or missing references)
				//IL_0138: Unknown result type (might be due to invalid IL or missing references)
				//IL_0149: Expected O, but got Unknown
				((BaseCharacterMain)this).OnEnter();
				moveSpeedDifference = ((BaseState)this).moveSpeedStat / ((EntityState)this).characterBody.baseMoveSpeed;
				animationDuration = baseAnimationDuration / moveSpeedDifference;
				swirlEffectInterval = baseSwirlEffectInterval / moveSpeedDifference;
				if (((EntityState)this).isAuthority)
				{
					if (Object.op_Implicit((Object)(object)((EntityState)this).inputBank))
					{
						idealDirection = ((EntityState)this).inputBank.aimDirection;
						idealDirection.y = 0f;
					}
					UpdateDirection();
				}
				if (Object.op_Implicit((Object)(object)((EntityState)this).modelLocator))
				{
					((EntityState)this).modelLocator.normalizeToFloor = true;
				}
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
				{
					((EntityState)this).characterDirection.forward = idealDirection;
				}
				overlapAttack = ((BaseState)this).InitMeleeOverlap(ConfigurableValue<float>.op_Implicit(damage) / 100f, hitEffectPrefab, ((EntityState)this).GetModelTransform(), "WhirlwindAir");
				overlapAttack.procCoefficient = ConfigurableValue<float>.op_Implicit(procCoefficient);
				if (Object.op_Implicit((Object)(object)startEffectPrefab) && Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
				{
					EffectManager.SpawnEffect(startEffectPrefab, new EffectData
					{
						origin = ((EntityState)this).characterBody.corePosition
					}, false);
				}
				Util.PlaySound("Play_merc_R_dash", ((EntityState)this).gameObject);
				soundLoopPtr = LoopSoundManager.PlaySoundLoopLocal(((EntityState)this).gameObject, loopSoundDef);
			}

			public override void FixedUpdate()
			{
				//IL_0132: Unknown result type (might be due to invalid IL or missing references)
				//IL_0137: Unknown result type (might be due to invalid IL or missing references)
				//IL_0168: Unknown result type (might be due to invalid IL or missing references)
				//IL_016e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0178: Unknown result type (might be due to invalid IL or missing references)
				//IL_017d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0182: Unknown result type (might be due to invalid IL or missing references)
				((BaseCharacterMain)this).FixedUpdate();
				animationTimer -= Time.fixedDeltaTime;
				if (animationTimer <= 0f)
				{
					animationTimer += animationDuration;
					((EntityState)this).PlayCrossfade("FullBody, Override", "WhirlwindAir", "Whirlwind.playbackRate", animationDuration, 0.01f);
				}
				swirlEffectTimer -= Time.fixedDeltaTime;
				if (swirlEffectTimer <= 0f)
				{
					swirlEffectTimer += swirlEffectInterval;
					EffectManager.SimpleMuzzleFlash(swirlEffectPrefab, ((EntityState)this).gameObject, "WhirlwindAir", false);
				}
				if (((EntityState)this).fixedAge >= minDuration && (((EntityState)this).fixedAge >= ConfigurableValue<float>.op_Implicit(maxDuration) || !((EntityState)this).inputBank.skill2.down))
				{
					((EntityState)this).outer.SetNextStateToMain();
				}
				else
				{
					if (!((EntityState)this).isAuthority)
					{
						return;
					}
					UpdateDirection();
					if (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
					{
						((EntityState)this).characterDirection.moveVector = idealDirection;
						if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && !((EntityState)this).characterMotor.disableAirControlUntilCollision)
						{
							CharacterMotor characterMotor = ((EntityState)this).characterMotor;
							characterMotor.rootMotion += GetIdealVelocity() * Time.fixedDeltaTime;
						}
					}
					overlapAttackResetTimer += Time.fixedDeltaTime;
					if (overlapAttackResetTimer >= overlapAttackResetInterval)
					{
						overlapAttackResetTimer -= overlapAttackResetInterval;
						overlapAttack.ResetIgnoredHealthComponents();
					}
					if (overlapAttack.Fire((List<HurtBox>)null))
					{
						Util.PlaySound("Play_merc_sword_impact", ((EntityState)this).gameObject);
					}
				}
			}

			public void UpdateDirection()
			{
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				//IL_001c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0021: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0046: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0051: Unknown result type (might be due to invalid IL or missing references)
				//IL_0054: 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)
				if (Object.op_Implicit((Object)(object)((EntityState)this).inputBank))
				{
					Vector2 val = Util.Vector3XZToVector2XY(((EntityState)this).inputBank.moveVector);
					if (val != Vector2.zero)
					{
						((Vector2)(ref val)).Normalize();
						Vector3 val2 = new Vector3(val.x, 0f, val.y);
						idealDirection = ((Vector3)(ref val2)).normalized;
					}
				}
			}

			public Vector3 GetIdealVelocity()
			{
				//IL_0007: 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_0026: 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_0038: Unknown result type (might be due to invalid IL or missing references)
				return ((EntityState)this).characterDirection.forward * ((EntityState)this).characterBody.moveSpeed * ConfigurableValue<float>.op_Implicit(speedMultiplier) / 100f;
			}

			public override void OnExit()
			{
				//IL_0002: 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_0057: Unknown result type (might be due to invalid IL or missing references)
				//IL_005e: Unknown result type (might be due to invalid IL or missing references)
				//IL_006f: Expected O, but got Unknown
				//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_00e5: Unknown result type (might be due to invalid IL or missing references)
				//IL