Decompiled source of PlayableDevastator v1.1.0

PlayableDevastator.dll

Decompiled 8 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using AncientScepter;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using EntityStates;
using EntityStates.GravekeeperBoss;
using EntityStates.VoidMegaCrab.BackWeapon;
using EntityStates.VoidMegaCrab.Weapon;
using KinematicCharacterController;
using On.RoR2;
using R2API;
using R2API.Utils;
using RoR2;
using RoR2.Projectile;
using RoR2.Skills;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;

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

internal class Assets
{
	public static AssetBundle MainAssetBundle;

	public static void PopulateAssets()
	{
		if ((Object)(object)MainAssetBundle == (Object)null)
		{
			using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PlayableDevastator.devastatorassets"))
			{
				MainAssetBundle = AssetBundle.LoadFromStream(stream);
			}
		}
	}
}
internal class FixStupidCollider : MonoBehaviour
{
	private void OnEnable()
	{
		CapsuleCollider component = ((Component)this).GetComponent<CapsuleCollider>();
		component.radius = 2f;
		component.height = 3f;
	}
}
internal class DisplayController : MonoBehaviour
{
	private void OnEnable()
	{
		//IL_0016: 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)
		((Component)this).transform.localPosition = new Vector3(0f, 1.5f, 0f);
		((Component)this).transform.localRotation = Quaternion.Euler(0f, 345f, 0f);
	}
}
internal class Hook
{
	internal static void Hooks()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_TakeDamage);
		Run.onRunStartGlobal += Run_onRunStartGlobal;
	}

	private static void Run_onRunStartGlobal(Run obj)
	{
		bool flag = false;
		foreach (NetworkUser readOnlyInstances in NetworkUser.readOnlyInstancesList)
		{
			if (Object.op_Implicit((Object)(object)readOnlyInstances) && Object.op_Implicit((Object)(object)readOnlyInstances.master) && Object.op_Implicit((Object)(object)readOnlyInstances.master.bodyPrefab) && ((Object)readOnlyInstances.master.bodyPrefab).name.Contains("「V??oid Devastator』"))
			{
				flag = true;
			}
		}
		if (flag && MainPlugin.openCrabRave.Value)
		{
			Application.OpenURL("https://www.youtube.com/watch?v=LDU_Txk06tM");
		}
	}

	private static void HealthComponent_TakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo)
	{
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: 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_0090: 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_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c3: Expected O, but got Unknown
		//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_017b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0223: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0247: Unknown result type (might be due to invalid IL or missing references)
		//IL_024c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0254: Unknown result type (might be due to invalid IL or missing references)
		//IL_0259: Unknown result type (might be due to invalid IL or missing references)
		//IL_025b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0260: Unknown result type (might be due to invalid IL or missing references)
		//IL_0304: Unknown result type (might be due to invalid IL or missing references)
		//IL_0309: Unknown result type (might be due to invalid IL or missing references)
		//IL_0311: Unknown result type (might be due to invalid IL or missing references)
		//IL_0316: Unknown result type (might be due to invalid IL or missing references)
		//IL_0318: Unknown result type (might be due to invalid IL or missing references)
		//IL_031d: Unknown result type (might be due to invalid IL or missing references)
		//IL_027b: Unknown result type (might be due to invalid IL or missing references)
		//IL_027d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0274: Unknown result type (might be due to invalid IL or missing references)
		//IL_0338: Unknown result type (might be due to invalid IL or missing references)
		//IL_033a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0331: Unknown result type (might be due to invalid IL or missing references)
		//IL_0282: Unknown result type (might be due to invalid IL or missing references)
		//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_033f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0367: Unknown result type (might be due to invalid IL or missing references)
		//IL_0369: Unknown result type (might be due to invalid IL or missing references)
		CharacterBody val = null;
		if (Object.op_Implicit((Object)(object)damageInfo.attacker))
		{
			val = damageInfo.attacker.GetComponent<CharacterBody>();
		}
		if (Object.op_Implicit((Object)(object)self.body) && self.body.HasBuff(Prefabs.shieldBuff) && Object.op_Implicit((Object)(object)val) && NetworkServer.active)
		{
			DamageInfo val2 = new DamageInfo
			{
				attacker = ((Component)self.body).gameObject,
				inflictor = ((Component)self.body).gameObject,
				damage = damageInfo.damage * 2f,
				procCoefficient = 0f,
				damageType = (DamageType)0,
				damageColorIndex = (DamageColorIndex)9,
				position = self.body.corePosition,
				rejected = false
			};
			val.healthComponent.TakeDamage(val2);
			EffectManager.SimpleEffect(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidBarnacle/VoidBarnacleImpactExplosion.prefab").WaitForCompletion(), self.body.corePosition, Quaternion.identity, true);
		}
		if (Object.op_Implicit((Object)(object)damageInfo.attacker) && ((Object)damageInfo.attacker).name.Contains("「V??oid Devastator』Body") && ((ProcChainMask)(ref damageInfo.procChainMask)).HasProc((ProcType)19))
		{
			DotDef dotDef = DotController.GetDotDef((DotIndex)8);
			DotController.InflictDot(((Component)self.body).gameObject, damageInfo.attacker, (DotIndex)8, dotDef.interval, 1f, (uint?)null);
		}
		if (Object.op_Implicit((Object)(object)self.body) && DamageAPI.HasModdedDamageType(damageInfo, Prefabs.collapse) && NetworkServer.active)
		{
			DotDef dotDef2 = DotController.GetDotDef((DotIndex)8);
			DotController.InflictDot(((Component)self.body).gameObject, damageInfo.attacker, (DotIndex)8, dotDef2.interval, 1f, (uint?)null);
			DotController.InflictDot(((Component)self.body).gameObject, damageInfo.attacker, (DotIndex)8, dotDef2.interval, 1f, (uint?)null);
		}
		if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)self.body) && NetworkServer.active)
		{
			if (DamageAPI.HasModdedDamageType(damageInfo, Prefabs.missile))
			{
				bool alive = self.alive;
				float num = 5f;
				Vector3 position = damageInfo.position;
				Vector3 val3 = self.body.corePosition - position;
				float magnitude = ((Vector3)(ref val3)).magnitude;
				Quaternion val4 = ((magnitude != 0f) ? Util.QuaternionSafeLookRotation(val3) : Random.rotationUniform);
				float num2 = 0.5f;
				float num3 = Util.OnHitProcDamage(damageInfo.damage, val.damage, num2);
				ProjectileManager.instance.FireProjectile(Prefabs.missileStuckProjectile, position, val4, damageInfo.attacker, num3, 100f, damageInfo.crit, (DamageColorIndex)3, (GameObject)null, alive ? (magnitude * num) : (-1f));
			}
			else if (DamageAPI.HasModdedDamageType(damageInfo, Prefabs.missileScepter))
			{
				bool alive2 = self.alive;
				float num4 = 5f;
				Vector3 position2 = damageInfo.position;
				Vector3 val5 = self.body.corePosition - position2;
				float magnitude2 = ((Vector3)(ref val5)).magnitude;
				Quaternion val6 = ((magnitude2 != 0f) ? Util.QuaternionSafeLookRotation(val5) : Random.rotationUniform);
				float num5 = 0.5f;
				float num6 = Util.OnHitProcDamage(damageInfo.damage, val.damage, num5);
				ProjectileManager.instance.FireProjectile(Prefabs.missileStuckProjectileScepter, position2, val6, damageInfo.attacker, num6, 100f, damageInfo.crit, (DamageColorIndex)3, (GameObject)null, alive2 ? (magnitude2 * num4) : (-1f));
			}
		}
		orig.Invoke(self, damageInfo);
	}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.Dragonyck.PlayableDevastator", "PlayableDevastator", "1.1.0")]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
public class MainPlugin : BaseUnityPlugin
{
	public const string MODUID = "com.Dragonyck.PlayableDevastator";

	public const string MODNAME = "PlayableDevastator";

	public const string VERSION = "1.1.0";

	public const string SURVIVORNAME = "「V??oid Devastator』";

	public const string SURVIVORNAMEKEY = "DRAGONDEVASTATOR";

	public static GameObject characterPrefab;

	public GameObject characterDisplay;

	public GameObject doppelganger;

	public static Color characterColor;

	protected internal static ConfigEntry<int> baseJumpCount;

	protected internal static ConfigEntry<float> mainRootSpeed;

	protected internal static ConfigEntry<float> baseMaxHealth;

	protected internal static ConfigEntry<float> levelMaxHealth;

	protected internal static ConfigEntry<float> baseRegen;

	protected internal static ConfigEntry<float> levelRegen;

	protected internal static ConfigEntry<float> baseMaxShield;

	protected internal static ConfigEntry<float> levelMaxShield;

	protected internal static ConfigEntry<float> baseMoveSpeed;

	protected internal static ConfigEntry<float> levelMoveSpeed;

	protected internal static ConfigEntry<float> baseAcceleration;

	protected internal static ConfigEntry<float> baseJumpPower;

	protected internal static ConfigEntry<float> levelJumpPower;

	protected internal static ConfigEntry<float> baseDamage;

	protected internal static ConfigEntry<float> levelDamage;

	protected internal static ConfigEntry<float> baseAttackSpeed;

	protected internal static ConfigEntry<float> levelAttackSpeed;

	protected internal static ConfigEntry<float> baseCrit;

	protected internal static ConfigEntry<float> levelCrit;

	protected internal static ConfigEntry<float> baseArmor;

	protected internal static ConfigEntry<float> levelArmor;

	protected internal static List<string> itemBlacklist = new List<string>();

	protected internal static List<PickupIndex> tier1 = new List<PickupIndex>();

	protected internal static List<PickupIndex> tier2 = new List<PickupIndex>();

	protected internal static List<PickupIndex> tier3 = new List<PickupIndex>();

	protected internal static ConfigEntry<bool> openCrabRave;

	protected internal static SkillDef scepterOverrideDef;

	private void Awake()
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_002c: Expected O, but got Unknown
		//IL_002c: Expected O, but got Unknown
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0060: Expected O, but got Unknown
		//IL_0060: Expected O, but got Unknown
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Expected O, but got Unknown
		//IL_0094: Expected O, but got Unknown
		//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_00c8: Expected O, but got Unknown
		//IL_00c8: Expected O, but got Unknown
		//IL_00dd: 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_00fc: Expected O, but got Unknown
		//IL_00fc: Expected O, but got Unknown
		//IL_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_0126: Unknown result type (might be due to invalid IL or missing references)
		//IL_0130: Expected O, but got Unknown
		//IL_0130: Expected O, but got Unknown
		//IL_0145: Unknown result type (might be due to invalid IL or missing references)
		//IL_015a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0164: Expected O, but got Unknown
		//IL_0164: Expected O, but got Unknown
		//IL_0179: 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: Expected O, but got Unknown
		//IL_0198: Expected O, but got Unknown
		//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cc: Expected O, but got Unknown
		//IL_01cc: Expected O, but got Unknown
		//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0200: Expected O, but got Unknown
		//IL_0200: Expected O, but got Unknown
		//IL_0215: Unknown result type (might be due to invalid IL or missing references)
		//IL_022a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0234: Expected O, but got Unknown
		//IL_0234: Expected O, but got Unknown
		//IL_0249: Unknown result type (might be due to invalid IL or missing references)
		//IL_025e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0268: Expected O, but got Unknown
		//IL_0268: Expected O, but got Unknown
		//IL_027d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0292: Unknown result type (might be due to invalid IL or missing references)
		//IL_029c: Expected O, but got Unknown
		//IL_029c: Expected O, but got Unknown
		//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d0: Expected O, but got Unknown
		//IL_02d0: Expected O, but got Unknown
		//IL_02e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0304: Expected O, but got Unknown
		//IL_0304: Expected O, but got Unknown
		//IL_0319: Unknown result type (might be due to invalid IL or missing references)
		//IL_032e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0338: Expected O, but got Unknown
		//IL_0338: Expected O, but got Unknown
		//IL_034d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0362: Unknown result type (might be due to invalid IL or missing references)
		//IL_036c: Expected O, but got Unknown
		//IL_036c: Expected O, but got Unknown
		//IL_0381: Unknown result type (might be due to invalid IL or missing references)
		//IL_0396: Unknown result type (might be due to invalid IL or missing references)
		//IL_03a0: Expected O, but got Unknown
		//IL_03a0: Expected O, but got Unknown
		//IL_03b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d4: Expected O, but got Unknown
		//IL_03d4: Expected O, but got Unknown
		//IL_03e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_03fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0408: Expected O, but got Unknown
		//IL_0408: Expected O, but got Unknown
		//IL_041d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0432: Unknown result type (might be due to invalid IL or missing references)
		//IL_043c: Expected O, but got Unknown
		//IL_043c: Expected O, but got Unknown
		//IL_0451: Unknown result type (might be due to invalid IL or missing references)
		//IL_0462: Unknown result type (might be due to invalid IL or missing references)
		//IL_046c: Expected O, but got Unknown
		//IL_046c: Expected O, but got Unknown
		baseJumpCount = ((BaseUnityPlugin)this).Config.Bind<int>(new ConfigDefinition("Base Jump Count", "Value"), 1, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		mainRootSpeed = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Main Root Speed", "Value"), 33f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		baseMaxHealth = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Base Max Health", "Value"), 160f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		levelMaxHealth = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Level Max Health", "Value"), 45f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		baseRegen = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Base Regen", "Value"), 1f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		levelRegen = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Level Regen", "Value"), 0.4f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		baseMaxShield = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Base Max Shield", "Value"), 0f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		levelMaxShield = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Level Max Shield", "Value"), 0f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		baseMoveSpeed = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Base Move Speed", "Value"), 6.5f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		levelMoveSpeed = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Level Move Speed", "Value"), 0f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		baseAcceleration = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Base Acceleration", "Value"), 110f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		baseJumpPower = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Base Jump Power", "Value"), 15f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		levelJumpPower = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Level Jump Power", "Value"), 0f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		baseDamage = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Base Damage", "Value"), 12f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		levelDamage = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Level Damage", "Value"), 2.4f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		baseAttackSpeed = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Base Attack Speed", "Value"), 1f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		levelAttackSpeed = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Level Attack Speed", "Value"), 0f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		baseCrit = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Base Crit", "Value"), 0f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		levelCrit = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Level Crit", "Value"), 0f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		baseArmor = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Base Armor", "Value"), 90f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		levelArmor = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Level Armor", "Value"), 1f, new ConfigDescription("", (AcceptableValueBase)null, Array.Empty<object>()));
		openCrabRave = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("Cursed Crab Rave", "Enable"), false, new ConfigDescription("Opens Crab Rave in the background", (AcceptableValueBase)null, Array.Empty<object>()));
		Assets.PopulateAssets();
		CreatePrefab();
		Prefabs.CreatePrefabs();
		RegisterStates();
		RegisterCharacter();
		CreateDoppelganger();
		Hook.Hooks();
		if (ModCompat.AncientScepterEnabled)
		{
			ModCompat.AddScepterSupport();
		}
	}

	private void RegisterStates()
	{
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0025: 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_0035: Unknown result type (might be due to invalid IL or missing references)
		bool flag = false;
		ContentAddition.AddEntityState<CharacterMain>(ref flag);
		ContentAddition.AddEntityState<Primary>(ref flag);
		ContentAddition.AddEntityState<FirePrimary>(ref flag);
		ContentAddition.AddEntityState<Secondary>(ref flag);
		ContentAddition.AddEntityState<Utility>(ref flag);
		ContentAddition.AddEntityState<AltUtility>(ref flag);
		ContentAddition.AddEntityState<Special>(ref flag);
	}

	internal void CreatePrefab()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0217: Unknown result type (might be due to invalid IL or missing references)
		//IL_02af: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_0301: Unknown result type (might be due to invalid IL or missing references)
		//IL_030b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0341: Unknown result type (might be due to invalid IL or missing references)
		//IL_0346: Unknown result type (might be due to invalid IL or missing references)
		characterPrefab = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/VoidMegaCrabBody.prefab").WaitForCompletion(), "「V??oid Devastator』Body", true);
		characterPrefab.GetComponent<NetworkIdentity>().localPlayerAuthority = true;
		CapsuleCollider component = characterPrefab.GetComponent<CapsuleCollider>();
		component.radius = 2f;
		component.height = 5f;
		characterPrefab.GetComponent<KinematicCharacterMotor>().Capsule = component;
		characterPrefab.AddComponent<FixStupidCollider>();
		CharacterBody component2 = characterPrefab.GetComponent<CharacterBody>();
		((Object)component2).name = "「V??oid Devastator』Body";
		component2.baseNameToken = "「V??oid Devastator』";
		component2.bodyFlags = (BodyFlags)1040;
		component2.mainRootSpeed = mainRootSpeed.Value;
		component2.baseMaxHealth = baseMaxHealth.Value;
		component2.levelMaxHealth = levelMaxHealth.Value;
		component2.baseRegen = baseRegen.Value;
		component2.levelRegen = levelRegen.Value;
		component2.baseMaxShield = baseMaxShield.Value;
		component2.levelMaxShield = levelMaxShield.Value;
		component2.baseMoveSpeed = baseMoveSpeed.Value;
		component2.levelMoveSpeed = levelMoveSpeed.Value;
		component2.baseAcceleration = baseAcceleration.Value;
		component2.baseJumpPower = baseJumpPower.Value;
		component2.levelJumpPower = levelJumpPower.Value;
		component2.baseDamage = baseDamage.Value;
		component2.levelDamage = levelDamage.Value;
		component2.baseAttackSpeed = baseAttackSpeed.Value;
		component2.levelAttackSpeed = levelAttackSpeed.Value;
		component2.baseCrit = baseCrit.Value;
		component2.levelCrit = levelCrit.Value;
		component2.baseArmor = baseArmor.Value;
		component2.levelArmor = levelArmor.Value;
		component2.baseJumpCount = baseJumpCount.Value;
		component2.hideCrosshair = false;
		characterColor = component2.bodyColor;
		component2.aimOriginTransform.localPosition = new Vector3(0f, 6f, 0f);
		HealthComponent component3 = characterPrefab.GetComponent<HealthComponent>();
		component3.health = baseMaxHealth.Value;
		component3.shield = baseMaxShield.Value;
		component3.barrier = 0f;
		component3.magnetiCharge = 0f;
		component3.body = null;
		component3.dontShowHealthbar = false;
		component3.globalDeathEventChanceCoefficient = 1f;
		characterPrefab.GetComponent<Interactor>().maxInteractionDistance = 14f;
		characterPrefab.GetComponent<InteractionDriver>().highlightInteractor = true;
		characterPrefab.GetComponent<CameraTargetParams>().cameraParams = Addressables.LoadAssetAsync<CharacterCameraParams>((object)"RoR2/Base/Common/ccpStandard.asset").WaitForCompletion();
		ModelLocator component4 = characterPrefab.GetComponent<ModelLocator>();
		component4.modelBaseTransform.localPosition = new Vector3(0f, -2.6f, 0f);
		GameObject gameObject = ((Component)component4.modelTransform).gameObject;
		gameObject.transform.localScale = Vector3.one * 0.3f;
		HurtBoxGroup component5 = gameObject.GetComponent<HurtBoxGroup>();
		component5.mainHurtBox.collider = (Collider)(object)component;
		EntityStateMachine component6 = ((Component)component2).GetComponent<EntityStateMachine>();
		component6.mainStateType = new SerializableEntityStateType(typeof(CharacterMain));
		Utils.NewStateMachine<Idle>(characterPrefab, "Shield");
		Utils.NewStateMachine<Idle>(characterPrefab, "Weapon");
		NetworkStateMachine component7 = ((Component)component2).GetComponent<NetworkStateMachine>();
		component7.stateMachines = characterPrefab.GetComponents<EntityStateMachine>();
		SkillSetup();
		ContentAddition.AddBody(characterPrefab);
	}

	private void SkillSetup()
	{
		GenericSkill[] componentsInChildren = characterPrefab.GetComponentsInChildren<GenericSkill>();
		foreach (GenericSkill val in componentsInChildren)
		{
			if (val.skillFamily.variants[0].skillDef.activationStateMachineName != "WhiteCannon" && val.skillFamily.variants[0].skillDef.activationStateMachineName != "BlackCannon")
			{
				Object.DestroyImmediate((Object)(object)val);
			}
		}
		PassiveSetup();
		PrimarySetup();
		SecondarySetup();
		UtilitySetup();
		SpecialSetup();
	}

	private void PassiveSetup()
	{
		SkillLocator component = characterPrefab.GetComponent<SkillLocator>();
		LanguageAPI.Add("DRAGONDEVASTATOR_PASSIVE_NAME", "Collapsing Star");
		LanguageAPI.Add("DRAGONDEVASTATOR_PASSIVE_DESCRIPTION", "As a creature of the <style=cIsVoid>Void</style>, the Devastator dies spectacularly, creating a <style=cIsVoid>void rift</style> on death that <style=cDeath>executes</style> everything inside the bubble. Additionally, every time the Devastator would inflict one stack of <style=cIsDamage>collapse</style>, inflict another.");
		component.passiveSkill.enabled = true;
		component.passiveSkill.skillNameToken = "DRAGONDEVASTATOR_PASSIVE_NAME";
		component.passiveSkill.skillDescriptionToken = "DRAGONDEVASTATOR_PASSIVE_DESCRIPTION";
		component.passiveSkill.icon = Assets.MainAssetBundle.LoadAsset<Sprite>("passive");
	}

	private void PrimarySetup()
	{
		//IL_0031: 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_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Expected O, but got Unknown
		//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
		SkillLocator component = characterPrefab.GetComponent<SkillLocator>();
		LanguageAPI.Add("DRAGONDEVASTATOR_M1", "Scour");
		LanguageAPI.Add("DRAGONDEVASTATOR_M1_DESCRIPTION", "Fire a spray of explosive minelets for <style=cIsDamage>85% damage</style>. They stick to terrain and can be detonated with Banish Charge, dealing it's full <style=cIsDamage>damage</style> in a small area.");
		SkillDef val = Object.Instantiate<SkillDef>(Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/VoidMegaCrab/FireCrabWhiteCannon.asset").WaitForCompletion());
		val.activationState = new SerializableEntityStateType(typeof(Primary));
		val.skillDescriptionToken = "DRAGONDEVASTATOR_M1_DESCRIPTION";
		val.skillName = "DRAGONDEVASTATOR_M1";
		val.skillNameToken = "DRAGONDEVASTATOR_M1";
		val.icon = Assets.MainAssetBundle.LoadAsset<Sprite>("m1");
		ContentAddition.AddSkillDef(val);
		SkillFamily val2 = Object.Instantiate<SkillFamily>(component.primary.skillFamily);
		Variant[] variants = val2.variants;
		Variant val3 = new Variant
		{
			skillDef = val
		};
		((Variant)(ref val3)).viewableNode = new Node(val.skillNameToken, false, (Node)null);
		variants[0] = val3;
		ContentAddition.AddSkillFamily(val2);
		Reflection.SetFieldValue<SkillFamily>((object)component.primary, "_skillFamily", val2);
	}

	private void SecondarySetup()
	{
		//IL_0031: 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_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Expected O, but got Unknown
		//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
		SkillLocator component = characterPrefab.GetComponent<SkillLocator>();
		LanguageAPI.Add("DRAGONDEVASTATOR_M2", "Banish Charge");
		LanguageAPI.Add("DRAGONDEVASTATOR_M2_DESCRIPTION", "Hurl an unstable void explosive for <style=cIsDamage>600% damage</style>.");
		SkillDef val = Object.Instantiate<SkillDef>(Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/VoidMegaCrab/FireCrabBlackCannon.asset").WaitForCompletion());
		val.activationState = new SerializableEntityStateType(typeof(Secondary));
		val.skillDescriptionToken = "DRAGONDEVASTATOR_M2_DESCRIPTION";
		val.skillName = "DRAGONDEVASTATOR_M2";
		val.skillNameToken = "DRAGONDEVASTATOR_M2";
		val.icon = Assets.MainAssetBundle.LoadAsset<Sprite>("m2");
		ContentAddition.AddSkillDef(val);
		SkillFamily val2 = Object.Instantiate<SkillFamily>(component.secondary.skillFamily);
		Variant[] variants = val2.variants;
		Variant val3 = new Variant
		{
			skillDef = val
		};
		((Variant)(ref val3)).viewableNode = new Node(val.skillNameToken, false, (Node)null);
		variants[0] = val3;
		ContentAddition.AddSkillFamily(val2);
		Reflection.SetFieldValue<SkillFamily>((object)component.secondary, "_skillFamily", val2);
	}

	private void UtilitySetup()
	{
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0130: Unknown result type (might be due to invalid IL or missing references)
		//IL_0148: Unknown result type (might be due to invalid IL or missing references)
		//IL_0152: Expected O, but got Unknown
		//IL_0153: Unknown result type (might be due to invalid IL or missing references)
		//IL_0155: Unknown result type (might be due to invalid IL or missing references)
		//IL_0192: Unknown result type (might be due to invalid IL or missing references)
		//IL_0197: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0264: Unknown result type (might be due to invalid IL or missing references)
		//IL_0284: Unknown result type (might be due to invalid IL or missing references)
		//IL_028e: Expected O, but got Unknown
		//IL_028f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0291: Unknown result type (might be due to invalid IL or missing references)
		SkillLocator component = characterPrefab.GetComponent<SkillLocator>();
		LanguageAPI.Add("DRAGONDEVASTATOR_UTIL", "Submerge");
		LanguageAPI.Add("DRAGONDEVASTATOR_UTIL_DESCRIPTION", "Retreat into the void briefly, re-emerging a short distance away, influenced by directional input. An explosion is created on arrival around Devastator, <style=cIsDamage>stunning</style> and dealing <style=cIsDamage>280% damage</style>.");
		SkillDef val = ScriptableObject.CreateInstance<SkillDef>();
		val.activationState = new SerializableEntityStateType(typeof(Utility));
		val.activationStateMachineName = "Body";
		val.baseMaxStock = 2;
		val.baseRechargeInterval = 4f;
		val.beginSkillCooldownOnSkillEnd = false;
		val.canceledFromSprinting = false;
		val.fullRestockOnAssign = false;
		val.interruptPriority = (InterruptPriority)0;
		val.isCombatSkill = false;
		val.mustKeyPress = true;
		val.cancelSprintingOnActivation = false;
		val.rechargeStock = 1;
		val.requiredStock = 1;
		val.stockToConsume = 1;
		val.icon = Assets.MainAssetBundle.LoadAsset<Sprite>("utility");
		val.skillDescriptionToken = "DRAGONDEVASTATOR_UTIL_DESCRIPTION";
		val.skillName = "DRAGONDEVASTATOR_UTIL";
		val.skillNameToken = "DRAGONDEVASTATOR_UTIL";
		ContentAddition.AddSkillDef(val);
		component.utility = characterPrefab.AddComponent<GenericSkill>();
		SkillFamily val2 = ScriptableObject.CreateInstance<SkillFamily>();
		val2.variants = (Variant[])(object)new Variant[1];
		Reflection.SetFieldValue<SkillFamily>((object)component.utility, "_skillFamily", val2);
		SkillFamily skillFamily = component.utility.skillFamily;
		Variant[] variants = skillFamily.variants;
		Variant val3 = new Variant
		{
			skillDef = val
		};
		((Variant)(ref val3)).viewableNode = new Node(val.skillNameToken, false, (Node)null);
		variants[0] = val3;
		ContentAddition.AddSkillFamily(skillFamily);
		LanguageAPI.Add("DRAGONDEVASTATORALT_UTIL", "Abjure");
		LanguageAPI.Add("DRAGONDEVASTATORALT_UTIL_DESCRIPTION", "Create a bubble of <style=cIsVoid>void energy</style>, negating <style=cIsDamage>projectiles</style> around the Devastator briefly. Any damage taken while the bubble is active is returned to the attacker and its <style=cIsDamage>damage</style> is doubled.");
		val = ScriptableObject.CreateInstance<SkillDef>();
		val.activationState = new SerializableEntityStateType(typeof(AltUtility));
		val.activationStateMachineName = "Shield";
		val.baseMaxStock = 1;
		val.baseRechargeInterval = 8f;
		val.beginSkillCooldownOnSkillEnd = false;
		val.canceledFromSprinting = false;
		val.fullRestockOnAssign = false;
		val.interruptPriority = (InterruptPriority)0;
		val.isCombatSkill = false;
		val.mustKeyPress = true;
		val.cancelSprintingOnActivation = false;
		val.rechargeStock = 1;
		val.requiredStock = 1;
		val.stockToConsume = 1;
		val.icon = Assets.MainAssetBundle.LoadAsset<Sprite>("altutility");
		val.skillDescriptionToken = "DRAGONDEVASTATORALT_UTIL_DESCRIPTION";
		val.skillName = "DRAGONDEVASTATORALT_UTIL";
		val.skillNameToken = "DRAGONDEVASTATORALT_UTIL";
		ContentAddition.AddSkillDef(val);
		Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
		Variant[] variants2 = skillFamily.variants;
		int num = skillFamily.variants.Length - 1;
		val3 = new Variant
		{
			skillDef = val,
			unlockableDef = null
		};
		((Variant)(ref val3)).viewableNode = new Node(val.skillNameToken, false, (Node)null);
		variants2[num] = val3;
	}

	private void SpecialSetup()
	{
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0130: Unknown result type (might be due to invalid IL or missing references)
		//IL_0148: Unknown result type (might be due to invalid IL or missing references)
		//IL_0152: Expected O, but got Unknown
		//IL_0153: Unknown result type (might be due to invalid IL or missing references)
		//IL_0155: Unknown result type (might be due to invalid IL or missing references)
		//IL_019a: Unknown result type (might be due to invalid IL or missing references)
		//IL_019f: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
		SkillLocator component = characterPrefab.GetComponent<SkillLocator>();
		LanguageAPI.Add("DRAGONDEVASTATOR_SPEC", "Annihilate");
		LanguageAPI.Add("DRAGONDEVASTATOR_SPEC_DESCRIPTION", "Fire a burst of homing void spikes that deal <style=cIsDamage>34% damage</style> each and stick to hit surfaces, <style=cIsDamage>detonating</style> after a short duration for <style=cIsDamage>17% damage</style> and applies <style=cIsDamage>Collapse</style>.");
		SkillDef val = ScriptableObject.CreateInstance<SkillDef>();
		val.activationState = new SerializableEntityStateType(typeof(Special));
		val.activationStateMachineName = "BackWeapon";
		val.baseMaxStock = 1;
		val.baseRechargeInterval = 8f;
		val.beginSkillCooldownOnSkillEnd = false;
		val.canceledFromSprinting = false;
		val.fullRestockOnAssign = false;
		val.interruptPriority = (InterruptPriority)0;
		val.isCombatSkill = true;
		val.mustKeyPress = true;
		val.cancelSprintingOnActivation = false;
		val.rechargeStock = 1;
		val.requiredStock = 1;
		val.stockToConsume = 1;
		val.icon = Assets.MainAssetBundle.LoadAsset<Sprite>("special");
		val.skillDescriptionToken = "DRAGONDEVASTATOR_SPEC_DESCRIPTION";
		val.skillName = "DRAGONDEVASTATOR_SPEC";
		val.skillNameToken = "DRAGONDEVASTATOR_SPEC";
		ContentAddition.AddSkillDef(val);
		component.special = characterPrefab.AddComponent<GenericSkill>();
		SkillFamily val2 = ScriptableObject.CreateInstance<SkillFamily>();
		val2.variants = (Variant[])(object)new Variant[1];
		Reflection.SetFieldValue<SkillFamily>((object)component.special, "_skillFamily", val2);
		SkillFamily skillFamily = component.special.skillFamily;
		Variant[] variants = skillFamily.variants;
		Variant val3 = new Variant
		{
			skillDef = val
		};
		((Variant)(ref val3)).viewableNode = new Node(val.skillNameToken, false, (Node)null);
		variants[0] = val3;
		ContentAddition.AddSkillFamily(skillFamily);
		LanguageAPI.Add("DRAGONDEVASTATOR_SPEC_SCEPTER", "Unmaker Barrage");
		LanguageAPI.Add("DRAGONDEVASTATOR_SPEC_DESCRIPTION_SCEPTER", "Fire a cluster of homing void spikes that burrow into enemies and terrain, that create a large explosion dealing <style=cIsDamage>17% damage</style> and applies <style=cIsDamage>Collapse</style>.");
		scepterOverrideDef = ScriptableObject.CreateInstance<SkillDef>();
		scepterOverrideDef.activationState = new SerializableEntityStateType(typeof(SpecialScepter));
		scepterOverrideDef.activationStateMachineName = "BackWeapon";
		scepterOverrideDef.baseMaxStock = 1;
		scepterOverrideDef.baseRechargeInterval = 8f;
		scepterOverrideDef.beginSkillCooldownOnSkillEnd = false;
		scepterOverrideDef.canceledFromSprinting = false;
		scepterOverrideDef.fullRestockOnAssign = false;
		scepterOverrideDef.interruptPriority = (InterruptPriority)0;
		scepterOverrideDef.isCombatSkill = true;
		scepterOverrideDef.mustKeyPress = true;
		scepterOverrideDef.cancelSprintingOnActivation = false;
		scepterOverrideDef.rechargeStock = 1;
		scepterOverrideDef.requiredStock = 1;
		scepterOverrideDef.stockToConsume = 1;
		scepterOverrideDef.icon = Assets.MainAssetBundle.LoadAsset<Sprite>("scepter");
		scepterOverrideDef.skillDescriptionToken = "DRAGONDEVASTATOR_SPEC_DESCRIPTION_SCEPTER";
		scepterOverrideDef.skillName = "DRAGONDEVASTATOR_SPEC_SCEPTER";
		scepterOverrideDef.skillNameToken = "DRAGONDEVASTATOR_SPEC_SCEPTER";
		ContentAddition.AddSkillDef(val);
	}

	private void RegisterCharacter()
	{
		//IL_0075: 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_00b0: 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_00df: Unknown result type (might be due to invalid IL or missing references)
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_023c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0241: Unknown result type (might be due to invalid IL or missing references)
		characterDisplay = PrefabAPI.InstantiateClone(characterPrefab, "「V??oid Devastator』Display", true);
		Object.Destroy((Object)(object)characterDisplay.GetComponent<KinematicCharacterMotor>());
		Object.Destroy((Object)(object)characterDisplay.GetComponent<CharacterBody>());
		Object.Destroy((Object)(object)characterDisplay.GetComponent<CharacterMotor>());
		Object.Destroy((Object)(object)characterDisplay.GetComponent<CharacterDirection>());
		characterDisplay.transform.localRotation = Quaternion.Euler(0f, 344f, 0f);
		characterDisplay.transform.rotation = Quaternion.Euler(0f, 344f, 0f);
		characterDisplay.transform.localScale = Vector3.one * 0.5f;
		characterDisplay.transform.position = new Vector3(0f, 1.5f, 0f);
		characterDisplay.AddComponent<DisplayController>();
		characterDisplay.GetComponent<ModelLocator>().modelBaseTransform.localScale = Vector3.one;
		RendererInfo[] baseRendererInfos = characterDisplay.GetComponentInChildren<CharacterModel>().baseRendererInfos;
		for (int i = 0; i < baseRendererInfos.Length; i++)
		{
			Material val = Object.Instantiate<Material>(baseRendererInfos[i].defaultMaterial);
			val.DisableKeyword("DITHER");
			baseRendererInfos[i].defaultMaterial = val;
		}
		string text = "Void Devastator is a bulky tank of a survivor, using ranged attacks to batter whole groups of foes while inflicting multiple stacks of collapse.<style=cSub>\r\n\r\n< ! > Devastator is a little slower than the average survivor- especially when using the alternate utility." + Environment.NewLine + "<style=cSub>\r\n\r\n< ! > Scour is a close-range combo setup tool. It leaves explosive charges embedded where it strikes, which can be detonated with either Banish Charge or the explosion from Submerge. " + Environment.NewLine + "<style=cSub>\r\n\r\n< ! > Your utility choice massively influences your build- Submerge gives excellent evasion and offense, while Abjure makes you a tanky bulwark." + Environment.NewLine + "<style=cSub>\r\n\r\n< ! > Annihilate's on-hit and on-explode damage are both fairly weak, but the flurries of Collapse inflicted can decimate the health of bosses." + Environment.NewLine + "<style=cSub>\r\n\r\n< ! > It is time for crab.";
		string text2 = "..and so it left, off to hunt more prey among the stars.";
		string text3 = "..and so it returned, having caught worthy quarry.";
		LanguageAPI.Add("DRAGONDEVASTATOR_NAME", "「V??oid Devastator』");
		LanguageAPI.Add("DRAGONDEVASTATOR_DESCRIPTION", text);
		LanguageAPI.Add("DRAGONDEVASTATOR_SUBTITLE", "");
		LanguageAPI.Add("DRAGONDEVASTATOR_OUTRO", text2);
		LanguageAPI.Add("DRAGONDEVASTATOR_FAIL", text3);
		SurvivorDef val2 = ScriptableObject.CreateInstance<SurvivorDef>();
		val2.cachedName = "DRAGONDEVASTATOR_NAME";
		val2.unlockableDef = null;
		val2.descriptionToken = "DRAGONDEVASTATOR_DESCRIPTION";
		val2.primaryColor = characterColor;
		val2.bodyPrefab = characterPrefab;
		val2.displayPrefab = characterDisplay;
		val2.outroFlavorToken = "DRAGONDEVASTATOR_OUTRO";
		val2.mainEndingEscapeFailureFlavorToken = "DRAGONDEVASTATOR_FAIL";
		ContentAddition.AddSurvivorDef(val2);
	}

	private void CreateDoppelganger()
	{
		//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)
		doppelganger = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/VoidMegaCrabMaster.prefab").WaitForCompletion(), "「V??oid Devastator』Master", true);
		ContentAddition.AddMaster(doppelganger);
		CharacterMaster component = doppelganger.GetComponent<CharacterMaster>();
		component.bodyPrefab = characterPrefab;
	}
}
public static class ModCompat
{
	private static bool? emoteEnabled;

	private static bool? skillsEnabled;

	private static bool? ancientEnabled;

	public static bool AncientScepterEnabled
	{
		get
		{
			if (!ancientEnabled.HasValue)
			{
				ancientEnabled = Chainloader.PluginInfos.ContainsKey("com.DestroyedClone.AncientScepter");
			}
			return ancientEnabled.Value;
		}
	}

	public static void AddScepterSupport()
	{
		ItemBase<AncientScepterItem>.instance.RegisterScepterSkill(MainPlugin.scepterOverrideDef, "「V??oid Devastator』Body", (SkillSlot)3, 0);
	}
}
internal class Prefabs
{
	internal static ModdedDamageType collapse;

	internal static ModdedDamageType missile;

	internal static ModdedDamageType missileScepter;

	internal static GameObject chargedBlackCannonProjectile;

	internal static GameObject missileProjectile;

	internal static GameObject missileScepterProjectile;

	internal static GameObject missileScepterProjectileGhost;

	internal static GameObject missileStuckProjectile;

	internal static GameObject missileStuckProjectileScepter;

	internal static GameObject dashEffect;

	internal static GameObject shieldAttachment;

	internal static BuffDef shieldBuff;

	internal static void CreatePrefabs()
	{
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0128: Unknown result type (might be due to invalid IL or missing references)
		//IL_0162: Unknown result type (might be due to invalid IL or missing references)
		//IL_016c: Unknown result type (might be due to invalid IL or missing references)
		//IL_018c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0191: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_01de: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0206: Unknown result type (might be due to invalid IL or missing references)
		//IL_0221: Unknown result type (might be due to invalid IL or missing references)
		//IL_0226: Unknown result type (might be due to invalid IL or missing references)
		//IL_0249: Unknown result type (might be due to invalid IL or missing references)
		//IL_0264: Unknown result type (might be due to invalid IL or missing references)
		//IL_0269: Unknown result type (might be due to invalid IL or missing references)
		//IL_0312: Unknown result type (might be due to invalid IL or missing references)
		//IL_0317: Unknown result type (might be due to invalid IL or missing references)
		//IL_032c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0331: Unknown result type (might be due to invalid IL or missing references)
		//IL_0349: Unknown result type (might be due to invalid IL or missing references)
		//IL_0398: Unknown result type (might be due to invalid IL or missing references)
		//IL_039d: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ca: 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_041a: Unknown result type (might be due to invalid IL or missing references)
		shieldBuff = ScriptableObject.CreateInstance<BuffDef>();
		((Object)shieldBuff).name = "Void Shield";
		shieldBuff.iconSprite = Assets.MainAssetBundle.LoadAsset<Sprite>("shieldBuff");
		shieldBuff.buffColor = Color.white;
		shieldBuff.canStack = false;
		shieldBuff.isDebuff = false;
		shieldBuff.eliteDef = null;
		shieldBuff.isHidden = false;
		ContentAddition.AddBuffDef(shieldBuff);
		collapse = DamageAPI.ReserveDamageType();
		missile = DamageAPI.ReserveDamageType();
		missileScepter = DamageAPI.ReserveDamageType();
		GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/MajorAndMinorConstruct/MegaConstructBubbleShield.prefab").WaitForCompletion();
		shieldAttachment = PrefabAPI.InstantiateClone(val, "VoidDevastatorShieldAttachment", true);
		shieldAttachment.GetComponent<NetworkIdentity>().localPlayerAuthority = true;
		((Renderer)((Component)shieldAttachment.transform.Find("Fairies")).GetComponent<ParticleSystemRenderer>()).material = Addressables.LoadAssetAsync<Material>((object)"RoR2/DLC1/ChainLightningVoid/matLightningVoid.mat").WaitForCompletion();
		Transform val2 = shieldAttachment.transform.Find("Collision");
		val2.localPosition = new Vector3(1f, -4f, 0f);
		Object.Destroy((Object)(object)((Component)val2).GetComponent<MeshCollider>());
		((Component)val2).gameObject.AddComponent<SphereCollider>().radius = 0.25f;
		Transform val3 = val2.Find("ActiveVisual");
		val3.localScale = Vector3.one * 0.25f;
		Renderer component = ((Component)val3).GetComponent<Renderer>();
		component.sharedMaterials = (Material[])(object)new Material[1] { Addressables.LoadAssetAsync<Material>((object)"RoR2/DLC1/VoidRaidCrab/matVoidRaidCrabTripleBeamSphere2.mat").WaitForCompletion() };
		dashEffect = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/MegaCrabBlackCannonProjectile.prefab").WaitForCompletion(), "VoidDashExplosionEffect", false);
		Utils.RegisterEffect(dashEffect, 1f, "Play_voidman_m2_explode");
		chargedBlackCannonProjectile = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/MegaCrabBlackCannonProjectile.prefab").WaitForCompletion(), "ChargedBlackCannonProjectile", true);
		chargedBlackCannonProjectile.AddComponent<ModdedDamageTypeHolderComponent>().Add(collapse);
		ContentAddition.AddProjectile(chargedBlackCannonProjectile);
		missileProjectile = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/MissileVoidBigProjectile.prefab").WaitForCompletion(), "VoidMissileProjectile", true);
		missileProjectile.AddComponent<ModdedDamageTypeHolderComponent>().Add(missile);
		ContentAddition.AddProjectile(missileProjectile);
		missileStuckProjectile = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/MegaCrabWhiteCannonStuckProjectile.prefab").WaitForCompletion(), "VoidMissileStuckProjectile", true);
		missileStuckProjectile.GetComponent<ProjectileController>().allowPrediction = false;
		missileStuckProjectile.AddComponent<SphereCollider>().radius = 0.5f;
		ProjectileStickOnImpact val4 = missileStuckProjectile.AddComponent<ProjectileStickOnImpact>();
		val4.ignoreWorld = false;
		val4.ignoreCharacters = false;
		ProjectileImpactExplosion component2 = missileStuckProjectile.GetComponent<ProjectileImpactExplosion>();
		component2.lifetimeAfterImpact = 2f;
		component2.lifetime = 2f;
		component2.timerAfterImpact = true;
		component2.destroyOnEnemy = false;
		component2.destroyOnWorld = false;
		((ProjectileExplosion)component2).blastDamageCoefficient = 1f;
		((ProjectileExplosion)component2).explosionEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidBarnacle/VoidBarnacleImpactExplosion.prefab").WaitForCompletion();
		component2.impactEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidBarnacle/VoidBarnacleImpactExplosion.prefab").WaitForCompletion();
		missileStuckProjectile.AddComponent<ModdedDamageTypeHolderComponent>().Add(collapse);
		ContentAddition.AddProjectile(missileStuckProjectile);
		missileStuckProjectileScepter = PrefabAPI.InstantiateClone(missileStuckProjectile, "VoidMissileStuckScepterProjectile", true);
		((ProjectileExplosion)missileStuckProjectileScepter.GetComponent<ProjectileImpactExplosion>()).blastRadius = 6f;
		ContentAddition.AddProjectile(missileStuckProjectileScepter);
		missileScepterProjectileGhost = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/MissileVoidBigGhost.prefab").WaitForCompletion(), "VoidMissileScepterProjectileGhost", false);
		((Renderer)missileScepterProjectileGhost.GetComponentInChildren<TrailRenderer>()).material = Addressables.LoadAssetAsync<Material>((object)"RoR2/DLC1/RandomEquipmentTrigger/matBottledChaosTrail.mat").WaitForCompletion();
		missileScepterProjectile = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/MissileVoidBigProjectile.prefab").WaitForCompletion(), "VoidMissileScepterProjectile", true);
		missileScepterProjectile.AddComponent<ProjectileController>().ghostPrefab = missileScepterProjectileGhost;
		missileScepterProjectile.AddComponent<ModdedDamageTypeHolderComponent>().Add(missile);
		ContentAddition.AddProjectile(missileScepterProjectile);
	}
}
internal class CharacterMain : GenericCharacterMain
{
	public override void Update()
	{
		((GenericCharacterMain)this).Update();
		((BaseCharacterMain)this).modelAnimator.SetBool("isSprinting", false);
	}
}
internal class Primary : ChargeCrabWhiteCannon
{
	public override FireCrabCannonBase GetNextState()
	{
		return (FireCrabCannonBase)(object)new FirePrimary();
	}

	public override void OnEnter()
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		((ChargeCrabCannonBase)this).baseDuration = 0.6f;
		((ChargeCrabCannonBase)this).chargeEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/VoidMegacrabWhiteSphereChargeFX.prefab").WaitForCompletion();
		((ChargeCrabCannonBase)this).chargeMuzzleName = "MuzzleWhiteCannon";
		((ChargeCrabCannonBase)this).soundName = "Play_voidDevastator_m1_chargeUp";
		((ChargeCrabCannonBase)this).animationLayerName = "Left Gun Override (Arm)";
		((ChargeCrabCannonBase)this).animationStateName = "LeftShootPrepAndCharge";
		((ChargeCrabCannonBase)this).animationPlaybackRateParam = "LeftCharge.playbackRate";
		((ChargeCrabCannonBase)this).animationCrossfadeDuration = 0.2f;
		((ChargeCrabCannonBase)this).OnEnter();
	}
}
internal class FirePrimary : FireCrabWhiteCannon
{
	public override void OnEnter()
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_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)
		((FireCrabCannonBase)this).projectileCount = 10;
		((FireCrabCannonBase)this).muzzleflashEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/MegaCrabWhiteMuzzleFlash.prefab").WaitForCompletion();
		((FireCrabCannonBase)this).projectilePrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/MegaCrabWhiteCannonProjectile.prefab").WaitForCompletion();
		((FireCrabCannonBase)this).totalYawSpread = 2f;
		((FireCrabCannonBase)this).spread = FireHook.spread;
		((FireCrabCannonBase)this).muzzleName = "MuzzleWhiteCannon";
		((FireCrabCannonBase)this).attackSound = "Play_voidDevastator_m1_fire";
		((FireCrabCannonBase)this).OnEnter();
		((FireCrabCannonBase)this).fireDuration = 0f;
	}

	public override void FixedUpdate()
	{
		((FireCrabCannonBase)this).FixedUpdate();
		if (((FireCrabCannonBase)this).projectilesFired < ((FireCrabCannonBase)this).projectileCount)
		{
			MyFireProjectile();
		}
	}

	private void MyFireProjectile()
	{
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: 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_00f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
		Util.PlaySound(((FireCrabCannonBase)this).attackSound, ((EntityState)this).gameObject);
		((EntityState)this).characterBody.SetAimTimer(3f);
		if (Object.op_Implicit((Object)(object)((FireCrabCannonBase)this).muzzleflashEffectPrefab))
		{
			EffectManager.SimpleMuzzleFlash(((FireCrabCannonBase)this).muzzleflashEffectPrefab, ((EntityState)this).gameObject, ((FireCrabCannonBase)this).muzzleName, false);
		}
		if (((EntityState)this).isAuthority)
		{
			Ray aimRay = ((BaseState)this).GetAimRay();
			int num = Mathf.FloorToInt((float)((FireCrabCannonBase)this).projectilesFired - (float)(((FireCrabCannonBase)this).projectileCount - 1) / 2f);
			float num2 = Random.Range(0f - ((FireCrabCannonBase)this).spread, ((FireCrabCannonBase)this).spread) / 2f;
			float num3 = Random.Range(0f - ((FireCrabCannonBase)this).spread, ((FireCrabCannonBase)this).spread) / 2f;
			Vector3 val = Util.ApplySpread(((Ray)(ref aimRay)).direction, 0f, 0f, 1f, 1f, num3, num2);
			Vector3 position = ((FireCrabCannonBase)this).muzzleTransform.position;
			ProjectileManager.instance.FireProjectile(((FireCrabCannonBase)this).projectilePrefab, position, Util.QuaternionSafeLookRotation(val), ((EntityState)this).gameObject, ((BaseState)this).damageStat * ((FireCrabCannonBase)this).damageCoefficient, ((FireCrabCannonBase)this).force, Util.CheckRoll(((BaseState)this).critStat, ((EntityState)this).characterBody.master), (DamageColorIndex)0, (GameObject)null, -1f);
		}
		((FireCrabCannonBase)this).projectilesFired = ((FireCrabCannonBase)this).projectilesFired + 1;
	}
}
internal class Secondary : ChargeCrabBlackCannon
{
	public override void OnEnter()
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		((ChargeCrabCannonBase)this).baseDuration = 1f;
		((ChargeCrabCannonBase)this).chargeEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/VoidMegacrabBlackSphereChargeFX.prefab").WaitForCompletion();
		((ChargeCrabCannonBase)this).chargeMuzzleName = "MuzzleBlackCannon";
		((ChargeCrabCannonBase)this).soundName = "Play_voidDevastator_m2_chargeUp";
		((ChargeCrabCannonBase)this).animationLayerName = "Right Gun Override (Arm)";
		((ChargeCrabCannonBase)this).animationStateName = "RightShootPrepAndCharge";
		((ChargeCrabCannonBase)this).animationPlaybackRateParam = "RightCharge.playbackRate";
		((ChargeCrabCannonBase)this).animationCrossfadeDuration = 0.2f;
		((ChargeCrabCannonBase)this).OnEnter();
	}
}
internal class Special : FireVoidMissiles
{
	public override void OnEnter()
	{
		FireVoidMissiles.projectilePrefab = Prefabs.missileProjectile;
		((FireVoidMissiles)this).OnEnter();
	}
}
internal class SpecialScepter : FireVoidMissiles
{
	public override void OnEnter()
	{
		FireVoidMissiles.projectilePrefab = Prefabs.missileScepterProjectile;
		FireVoidMissiles.baseDurationBetweenMissiles = 0.1f;
		((FireVoidMissiles)this).OnEnter();
	}
}
internal class Utility : BaseSkillState
{
	private float duration = 0.25f;

	public float speedCoefficient = 5f;

	private Vector3 blinkVector = Vector3.zero;

	private HurtBoxGroup hurtboxGroup;

	public override void OnEnter()
	{
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		((BaseState)this).OnEnter();
		Util.PlaySound("Play_voidman_m2_shoot", ((EntityState)this).gameObject);
		blinkVector = GetBlinkVector();
		EffectManager.SimpleEffect(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Brother/BrotherDashEffect.prefab").WaitForCompletion(), ((EntityState)this).characterBody.corePosition, Util.QuaternionSafeLookRotation(((EntityState)this).characterDirection.forward, Vector3.up), false);
		Transform modelTransform = ((EntityState)this).GetModelTransform();
		if (Object.op_Implicit((Object)(object)modelTransform))
		{
			hurtboxGroup = ((Component)modelTransform).GetComponent<HurtBoxGroup>();
			if (Object.op_Implicit((Object)(object)hurtboxGroup))
			{
				int hurtBoxesDeactivatorCounter = hurtboxGroup.hurtBoxesDeactivatorCounter + 1;
				hurtboxGroup.hurtBoxesDeactivatorCounter = hurtBoxesDeactivatorCounter;
			}
			PrintController component = ((Component)modelTransform).GetComponent<PrintController>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.printTime = 0.8f;
				((Behaviour)component).enabled = true;
			}
		}
	}

	private Vector3 GetBlinkVector()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: 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_0030: 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_003b: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = ((((EntityState)this).inputBank.moveVector == Vector3.zero) ? ((EntityState)this).characterDirection.forward : ((EntityState)this).inputBank.moveVector);
		return ((Vector3)(ref val)).normalized;
	}

	public override void FixedUpdate()
	{
		//IL_0064: Unknown result type (might be due to invalid IL or missing references)
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		//IL_0098: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		((EntityState)this).FixedUpdate();
		((EntityState)this).characterBody.isSprinting = true;
		if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
		{
			((EntityState)this).outer.SetNextStateToMain();
		}
		if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
		{
			((EntityState)this).characterMotor.velocity = Vector3.zero;
			CharacterMotor characterMotor = ((EntityState)this).characterMotor;
			characterMotor.rootMotion += blinkVector * (((BaseState)this).moveSpeedStat * speedCoefficient * Time.fixedDeltaTime);
		}
	}

	public override void OnExit()
	{
		//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_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0064: Expected O, but got Unknown
		//IL_0081: 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_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fc: 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)
		((EntityState)this).OnExit();
		if (Object.op_Implicit((Object)(object)hurtboxGroup))
		{
			int hurtBoxesDeactivatorCounter = hurtboxGroup.hurtBoxesDeactivatorCounter - 1;
			hurtboxGroup.hurtBoxesDeactivatorCounter = hurtBoxesDeactivatorCounter;
		}
		EffectManager.SimpleEffect(Prefabs.dashEffect, ((EntityState)this).characterBody.corePosition, Quaternion.identity, false);
		if (((EntityState)this).isAuthority)
		{
			BlastAttack val = new BlastAttack();
			val.radius = 15f;
			val.procCoefficient = 1f;
			val.position = ((EntityState)this).transform.position;
			val.attacker = ((EntityState)this).gameObject;
			val.crit = Util.CheckRoll(((EntityState)this).characterBody.crit, ((EntityState)this).characterBody.master);
			val.baseDamage = ((EntityState)this).characterBody.damage * 2.8f;
			val.falloffModel = (FalloffModel)0;
			val.damageType = (DamageType)32;
			val.baseForce = 200f;
			val.teamIndex = TeamComponent.GetObjectTeam(val.attacker);
			val.attackerFiltering = (AttackerFiltering)2;
			val.Fire();
		}
	}

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

	private NetworkedBodyAttachment attachment;

	private AimRequest request;

	public override void OnEnter()
	{
		//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)
		((BaseState)this).OnEnter();
		Util.PlaySound("Play_voidman_shift_end", ((EntityState)this).gameObject);
		if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams))
		{
			request = ((EntityState)this).cameraTargetParams.RequestAimType((AimType)2);
		}
		if (NetworkServer.active)
		{
			((EntityState)this).characterBody.AddBuff(Prefabs.shieldBuff);
			attachment = Object.Instantiate<GameObject>(Prefabs.shieldAttachment, new Vector3(0f, 0f, 0.1f), Quaternion.identity, (Transform)null).GetComponent<NetworkedBodyAttachment>();
			attachment.AttachToGameObjectAndSpawn(((Component)((EntityState)this).characterBody).gameObject, (string)null);
		}
	}

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

	public override void OnExit()
	{
		((EntityState)this).OnExit();
		if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams))
		{
			request.Dispose();
		}
		if (NetworkServer.active && Object.op_Implicit((Object)(object)attachment))
		{
			((EntityState)this).characterBody.RemoveBuff(Prefabs.shieldBuff);
			EntityState.Destroy((Object)(object)((Component)attachment).gameObject);
		}
	}
}
internal class Utils
{
	public static EntityStateMachine NewStateMachine<T>(GameObject obj, string customName) where T : EntityState
	{
		//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_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		SerializableEntityStateType val = default(SerializableEntityStateType);
		((SerializableEntityStateType)(ref val))..ctor(typeof(T));
		EntityStateMachine val2 = obj.AddComponent<EntityStateMachine>();
		val2.customName = customName;
		val2.initialStateType = val;
		val2.mainStateType = val;
		return val2;
	}

	internal static T CopyComponent<T>(T original, GameObject destination) where T : Component
	{
		Type type = ((object)original).GetType();
		Component val = destination.AddComponent(type);
		FieldInfo[] fields = type.GetFields();
		FieldInfo[] array = fields;
		foreach (FieldInfo fieldInfo in array)
		{
			fieldInfo.SetValue(val, fieldInfo.GetValue(original));
		}
		return (T)(object)((val is T) ? val : null);
	}

	public static Sprite CreateSpriteFromTexture(Texture2D texture)
	{
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)texture))
		{
			return Sprite.Create(texture, new Rect(0f, 0f, (float)((Texture)texture).width, (float)((Texture)texture).height), new Vector2(0.5f, 0.5f));
		}
		return null;
	}

	public static GameObject FindInActiveObjectByName(string name)
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Invalid comparison between Unknown and I4
		Transform[] array = Resources.FindObjectsOfTypeAll<Transform>();
		for (int i = 0; i < array.Length; i++)
		{
			if ((int)((Object)array[i]).hideFlags == 0 && ((Object)array[i]).name == name)
			{
				return ((Component)array[i]).gameObject;
			}
		}
		return null;
	}

	public static GameObject CreateHitbox(string name, Transform parent, Vector3 scale)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Expected O, but got Unknown
		//IL_001b: 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_003d: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = new GameObject(name);
		val.transform.SetParent(parent);
		val.transform.localPosition = Vector3.zero;
		val.transform.localRotation = Quaternion.identity;
		val.transform.localScale = scale;
		HitBoxGroup val2 = ((Component)parent).gameObject.AddComponent<HitBoxGroup>();
		HitBox val3 = val.AddComponent<HitBox>();
		val.layer = LayerIndex.projectile.intVal;
		val2.hitBoxes = (HitBox[])(object)new HitBox[1] { val3 };
		val2.groupName = name;
		return val;
	}

	internal static void RegisterEffect(GameObject effect, float duration, string soundName = "")
	{
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		EffectComponent val = effect.GetComponent<EffectComponent>();
		if (!Object.op_Implicit((Object)(object)val))
		{
			val = effect.AddComponent<EffectComponent>();
		}
		if (!Object.op_Implicit((Object)(object)effect.GetComponent<DestroyOnTimer>()))
		{
			effect.AddComponent<DestroyOnTimer>().duration = duration;
		}
		if (!Object.op_Implicit((Object)(object)effect.GetComponent<NetworkIdentity>()))
		{
			effect.AddComponent<NetworkIdentity>();
		}
		if (!Object.op_Implicit((Object)(object)effect.GetComponent<VFXAttributes>()))
		{
			effect.AddComponent<VFXAttributes>().vfxPriority = (VFXPriority)2;
		}
		val.applyScale = false;
		val.effectIndex = (EffectIndex)(-1);
		val.parentToReferencedTransform = true;
		val.positionAtReferencedTransform = true;
		val.soundName = soundName;
		ContentAddition.AddEffect(effect);
	}

	public static Material InstantiateMaterial(Color color, Texture tex, Color emColor, float emPower, Texture emTex, float normStr, Texture normTex)
	{
		//IL_0037: 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)
		Material val = Object.Instantiate<Material>(LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterBodies/CommandoBody").GetComponentInChildren<CharacterModel>().baseRendererInfos[0].defaultMaterial);
		if (Object.op_Implicit((Object)(object)val))
		{
			val.SetColor("_Color", color);
			val.SetTexture("_MainTex", tex);
			val.SetColor("_EmColor", emColor);
			val.SetFloat("_EmPower", emPower);
			val.SetTexture("_EmTex", emTex);
			val.SetFloat("_NormalStrength", 1f);
			val.SetTexture("_NormalTex", normTex);
			return val;
		}
		return val;
	}

	public static Material FindMaterial(string name)
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Invalid comparison between Unknown and I4
		Material[] array = Resources.FindObjectsOfTypeAll<Material>();
		for (int i = 0; i < array.Length; i++)
		{
			if ((int)((Object)array[i]).hideFlags == 0 && ((Object)array[i]).name == name)
			{
				return array[i];
			}
		}
		return null;
	}
}