Decompiled source of Voidcrid v1.5.3

Voidcrid.dll

Decompiled 6 months ago
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using AncientScepter;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.Bandit2;
using EntityStates.LemurianBruiserMonster;
using EntityStates.VoidRaidCrab.Weapon;
using On.RoR2;
using PlasmaCoreSpikestripContent.Content.Skills;
using R2API;
using RoR2;
using RoR2.Achievements;
using RoR2.Projectile;
using RoR2.Skills;
using SkillsPlusPlus;
using SkillsPlusPlus.Modifiers;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using Voidcrid.Effects;
using Voidcrid.Hooks;
using Voidcrid.Language;
using Voidcrid.Modules;
using Voidcrid.Skills;

[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("Voidcrid")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Voidcrid")]
[assembly: AssemblyTitle("Voidcrid")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Voidcrid
{
	internal static class Log
	{
		internal static ManualLogSource _logSource;

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

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

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

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

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

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

		internal static void LogWarning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
	public class SkillSetup
	{
		private static UnlockableDef entropyUnlock;

		public static GameObject voidFrogProjectile;

		private static UnlockableDef ethUnlock;

		public static GameObject voidBreath;

		private static UnlockableDef VoidcridUnlock;

		internal static AssetBundle mainAssetBundle;

		internal static GameObject voidcridBodyPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Croco/CrocoBody.prefab").WaitForCompletion();

		private SkillLocator skillLocator = voidcridBodyPrefab.GetComponent<SkillLocator>();

		private const string assetbundleName = "acrid3";

		private const string csProjName = "Voidcrid";

		public static void SetupSkills(SkillLocator skillLocator)
		{
			FlamebreathSetup(skillLocator);
			NullBeamSetup(skillLocator);
			VoidEscapeSetup(skillLocator);
			EntropySetup(skillLocator);
			VoidcridPassive(skillLocator);
		}

		internal static void LoadAssetBundle()
		{
			try
			{
				mainAssetBundle = AssetBundle.LoadFromFile(Assembly.GetExecutingAssembly().Location.Replace("Voidcrid.dll", "acrid3"));
				Debug.Log((object)"Loaded assetbundle");
			}
			catch (Exception ex)
			{
				Debug.Log((object)("Failed to load assetbundle. Make sure your assetbundle name is setup correctly\n" + ex));
			}
		}

		private static void FlamebreathSetup(SkillLocator skillLocator)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: 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_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Expected O, but got Unknown
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			SkillDef val = ScriptableObject.CreateInstance<SkillDef>();
			val.activationState = new SerializableEntityStateType(typeof(Voidcridbreath));
			val.activationStateMachineName = "Weapon";
			val.baseMaxStock = 1;
			val.baseRechargeInterval = VoidcridDef.FlamebreathOverrideRecharge.Value;
			val.beginSkillCooldownOnSkillEnd = true;
			val.canceledFromSprinting = false;
			val.cancelSprintingOnActivation = true;
			val.fullRestockOnAssign = true;
			val.interruptPriority = (InterruptPriority)2;
			val.isCombatSkill = true;
			val.mustKeyPress = false;
			val.rechargeStock = 1;
			val.requiredStock = 1;
			val.stockToConsume = 1;
			val.icon = mainAssetBundle.LoadAsset<Sprite>("deepflame2.png");
			val.skillDescriptionToken = "VOIDCRID_FLAMEBREATH_DESC";
			val.skillName = "VOIDCRID_FLAMEBREATH";
			val.skillNameToken = "VOIDCRID_FLAMEBREATH";
			ContentAddition.AddSkillDef(val);
			bool flag = default(bool);
			ContentAddition.AddEntityState(typeof(Voidcridbreath), ref flag);
			SkillFamily skillFamily = skillLocator.primary.skillFamily;
			Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
			Variant[] variants = skillFamily.variants;
			int num = skillFamily.variants.Length - 1;
			Variant val2 = new Variant
			{
				skillDef = val
			};
			((Variant)(ref val2)).viewableNode = new Node(val.skillNameToken, false, (Node)null);
			variants[num] = val2;
		}

		private static void NullBeamSetup(SkillLocator skillLocator)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: 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_0182: Expected O, but got Unknown
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			SkillDef val = ScriptableObject.CreateInstance<SkillDef>();
			val.activationState = new SerializableEntityStateType(typeof(NullBeam));
			val.activationStateMachineName = "Weapon";
			val.baseMaxStock = 1;
			val.baseRechargeInterval = VoidcridDef.NullBeamOverrideRecharge.Value;
			val.beginSkillCooldownOnSkillEnd = true;
			val.canceledFromSprinting = false;
			val.cancelSprintingOnActivation = true;
			val.fullRestockOnAssign = true;
			val.interruptPriority = (InterruptPriority)2;
			val.isCombatSkill = true;
			val.rechargeStock = 1;
			val.requiredStock = 1;
			val.stockToConsume = 1;
			val.icon = mainAssetBundle.LoadAsset<Sprite>("nullbeam2.png");
			val.skillDescriptionToken = "VOIDCRID_NULLBEAM_DESC";
			val.skillName = "nullifier";
			val.skillNameToken = "VOIDCRID_NULLBEAM";
			val.mustKeyPress = true;
			ContentAddition.AddSkillDef(val);
			bool flag = default(bool);
			ContentAddition.AddEntityState(typeof(NullBeam), ref flag);
			VoidcridUnlock = ScriptableObject.CreateInstance<UnlockableDef>();
			VoidcridUnlock.cachedName = "Skills.Croco.Nullbeam";
			VoidcridUnlock.nameToken = "ACHIEVEMENT_VOIDCRIDUNLOCK_NAME";
			VoidcridUnlock.achievementIcon = mainAssetBundle.LoadAsset<Sprite>("nullbeam2.png");
			ContentAddition.AddUnlockableDef(VoidcridUnlock);
			SkillFamily skillFamily = skillLocator.secondary.skillFamily;
			Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
			Variant[] variants = skillFamily.variants;
			int num = skillFamily.variants.Length - 1;
			Variant val2 = new Variant
			{
				skillDef = val,
				unlockableDef = VoidcridUnlock
			};
			((Variant)(ref val2)).viewableNode = new Node(val.skillNameToken, false, (Node)null);
			variants[num] = val2;
		}

		private static void VoidEscapeSetup(SkillLocator skillLocator)
		{
			//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_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: 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_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: 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_01e4: Expected O, but got Unknown
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
			EntityStateMachine val = voidcridBodyPrefab.AddComponent<EntityStateMachine>();
			val.customName = "Drift";
			val.initialStateType = new SerializableEntityStateType(typeof(Idle));
			val.mainStateType = new SerializableEntityStateType(typeof(Idle));
			NetworkStateMachine component = voidcridBodyPrefab.GetComponent<NetworkStateMachine>();
			component.stateMachines = component.stateMachines.Append(val).ToArray();
			SkillDef val2 = ScriptableObject.CreateInstance<SkillDef>();
			val2.activationState = new SerializableEntityStateType(typeof(VoidEscape));
			val2.activationStateMachineName = "Drift";
			val2.baseMaxStock = 1;
			val2.baseRechargeInterval = VoidcridDef.EtherealDriftOverrideRecharge.Value;
			val2.beginSkillCooldownOnSkillEnd = true;
			val2.canceledFromSprinting = false;
			val2.cancelSprintingOnActivation = true;
			val2.fullRestockOnAssign = true;
			val2.interruptPriority = (InterruptPriority)2;
			val2.isCombatSkill = true;
			val2.rechargeStock = 1;
			val2.requiredStock = 1;
			val2.stockToConsume = 1;
			val2.mustKeyPress = true;
			val2.icon = mainAssetBundle.LoadAsset<Sprite>("voiddrift.png");
			val2.skillDescriptionToken = "VOIDCRID_VOIDRIFT_DESC";
			val2.skillName = "VOIDCRID_VOIDDRIFT";
			val2.skillNameToken = "VOIDCRID_VOIDDRIFT";
			ContentAddition.AddSkillDef(val2);
			bool flag = default(bool);
			ContentAddition.AddEntityState(typeof(VoidEscape), ref flag);
			SkillFamily skillFamily = skillLocator.utility.skillFamily;
			ethUnlock = ScriptableObject.CreateInstance<UnlockableDef>();
			ethUnlock.cachedName = "Skins.Croco.Blackrid";
			ethUnlock.nameToken = "ACHIEVEMENT_RIGHTTOJAIL_NAME";
			ethUnlock.achievementIcon = mainAssetBundle.LoadAsset<Sprite>("voiddrift.png");
			ContentAddition.AddUnlockableDef(ethUnlock);
			Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
			Variant[] variants = skillFamily.variants;
			int num = skillFamily.variants.Length - 1;
			Variant val3 = new Variant
			{
				skillDef = val2,
				unlockableDef = ethUnlock
			};
			((Variant)(ref val3)).viewableNode = new Node(val2.skillNameToken, false, (Node)null);
			variants[num] = val3;
		}

		private static void EntropySetup(SkillLocator skillLocator)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: 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_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Expected O, but got Unknown
			//IL_0191: 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)
			SkillDef val = ScriptableObject.CreateInstance<SkillDef>();
			val.activationState = new SerializableEntityStateType(typeof(Entropy));
			val.activationStateMachineName = "Weapon";
			val.baseMaxStock = 1;
			val.baseRechargeInterval = VoidcridDef.EntropyOverrideRecharge.Value;
			val.beginSkillCooldownOnSkillEnd = true;
			val.canceledFromSprinting = false;
			val.fullRestockOnAssign = true;
			val.interruptPriority = (InterruptPriority)2;
			val.resetCooldownTimerOnUse = false;
			val.isCombatSkill = true;
			val.mustKeyPress = false;
			val.cancelSprintingOnActivation = true;
			val.rechargeStock = 1;
			val.requiredStock = 1;
			val.stockToConsume = 1;
			val.mustKeyPress = true;
			val.icon = mainAssetBundle.LoadAsset<Sprite>("entropy2.png");
			val.skillDescriptionToken = "VOIDCRID_ENTROPY_DESC";
			val.skillName = "VOIDCRID_ENTROPY";
			val.skillNameToken = "VOIDCRID_ENTROPY";
			ContentAddition.AddSkillDef(val);
			bool flag = default(bool);
			ContentAddition.AddEntityState(typeof(Entropy), ref flag);
			entropyUnlock = ScriptableObject.CreateInstance<UnlockableDef>();
			entropyUnlock.cachedName = "Skins.Croco.Voidcrid";
			entropyUnlock.nameToken = "ACHIEVEMENT_GRANDFATHERPARADOX_NAME";
			entropyUnlock.achievementIcon = mainAssetBundle.LoadAsset<Sprite>("entropy2.png");
			ContentAddition.AddUnlockableDef(entropyUnlock);
			SkillFamily skillFamily = skillLocator.special.skillFamily;
			Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
			Variant[] variants = skillFamily.variants;
			int num = skillFamily.variants.Length - 1;
			Variant val2 = new Variant
			{
				skillDef = val,
				unlockableDef = entropyUnlock
			};
			((Variant)(ref val2)).viewableNode = new Node(val.skillNameToken, false, (Node)null);
			variants[num] = val2;
		}

		public static void VoidcridPassive(SkillLocator skillLocator)
		{
			Debug.Log((object)"Starting passive setup");
			if (VoidcridDef.VoidcridPassiveShow.Value)
			{
				SurvivorDef component = voidcridBodyPrefab.GetComponent<SurvivorDef>();
				Debug.Log((object)"Get Voidcrid Def");
				skillLocator.passiveSkill.enabled = true;
				skillLocator.passiveSkill.skillNameToken = "VOIDCRID_PASSIVE";
				skillLocator.passiveSkill.skillDescriptionToken = "VOIDCRID_PASSIVE_DESC";
				skillLocator.passiveSkill.icon = mainAssetBundle.LoadAsset<Sprite>("icon.png");
				Debug.Log((object)"Load language");
				LanguageAPI.Add("CROCO_OUTRO_FLAVOR", "..and so it left, a shell of its former self.");
				LanguageAPI.Add("CROCO_MAIN_ENDING_ESCAPE_FAILURE_FLAVOR", "..and so it stayed, forever chained to the Abyss.");
				Debug.Log((object)"Finished overriding ending");
			}
			else
			{
				skillLocator.passiveSkill.enabled = false;
			}
		}

		public static void DeathBehavior()
		{
			//IL_0018: 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)
			Debug.Log((object)"Setting up death animation...");
			CharacterDeathBehavior component = voidcridBodyPrefab.GetComponent<CharacterDeathBehavior>();
			component.deathState = UtilCreateSerializableAndNetRegister<DeathState>();
		}

		private static SerializableEntityStateType UtilCreateSerializableAndNetRegister<T>() where T : EntityState
		{
			//IL_0027: 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_003c: 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)
			Debug.Log((object)("Registering EntityState " + typeof(T).FullName + " and returning a new instance of SerializableEntityStateType of that type..."));
			bool flag = default(bool);
			ContentAddition.AddEntityState<T>(ref flag);
			return new SerializableEntityStateType(typeof(T));
		}

		internal static void ManipulateFirebreathColor()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			GameObject flamethrowerEffectPrefab = Flamebreath.flamethrowerEffectPrefab;
			GameObject val = PrefabAPI.InstantiateClone(flamethrowerEffectPrefab, "voidcridFirePurple");
			Material component = val.GetComponent<Material>();
			component.SetColor("_COLOR", Color.magenta);
			voidBreath = val;
			ContentAddition.AddProjectile(voidBreath);
		}

		internal static void CreateFogProjectile()
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			Debug.Log((object)"Creating Fog projectile");
			GameObject val = PrefabAPI.InstantiateClone(LegacyResourcesAPI.Load<GameObject>("Prefabs/Projectiles/ElementalRingVoidBlackHole"), "fogPain");
			FogDamageController val2 = val.AddComponent<FogDamageController>();
			BuffDef dangerBuffDef = Addressables.LoadAssetAsync<BuffDef>((object)"RoR2/Base/Common/bdVoidFogMild.asset").WaitForCompletion();
			val2.healthFractionPerSecond = VoidcridDef.VoidcridFogDamageOverride.Value;
			val2.dangerBuffDuration = 0.6f;
			val2.tickPeriodSeconds = 0.5f;
			val2.healthFractionRampCoefficientPerSecond = 0.015f;
			val2.dangerBuffDef = dangerBuffDef;
			SphereZone val3 = val.AddComponent<SphereZone>();
			val3.radius = VoidcridDef.EntropyOverrideRadius.Value + 1f;
			val2.initialSafeZones = (BaseZoneBehavior[])(object)new BaseZoneBehavior[1] { (BaseZoneBehavior)val3 };
			val3.isInverted = true;
			val.AddComponent<DestroyOnTimer>().duration = 5f;
			voidFrogProjectile = val;
			ContentAddition.AddProjectile(voidFrogProjectile);
			Debug.Log((object)"Finished creating voidFog projectile");
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.sixfears7.Voidcrid", "Voidcrid", "1.0.0")]
	[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.*/)]
	public class VoidcridDef : BaseUnityPlugin
	{
		public static bool ancientScepterInstalled = false;

		public static bool skillsPlusInstalled = false;

		public static SkillDef voidScepter;

		internal static GameObject voidcridBodyPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Croco/CrocoBody.prefab").WaitForCompletion();

		private SkillLocator skillLocator = voidcridBodyPrefab.GetComponent<SkillLocator>();

		public static ConfigEntry<float> NullBeamOverrideJailChance { get; set; }

		public static ConfigEntry<float> EntropyOverrideJailChance { get; set; }

		public static ConfigEntry<float> EtherealDriftOverrideJailChance { get; set; }

		public static ConfigEntry<float> NullBeamOverrideDamage { get; set; }

		public static ConfigEntry<float> NullBeamOverrideDuration { get; set; }

		public static ConfigEntry<float> NullBeamOverrideProc { get; set; }

		public static ConfigEntry<float> FlamebreathOverrideDuration { get; set; }

		public static ConfigEntry<float> EntropyOverrideDamage { get; set; }

		public static ConfigEntry<float> EntropyOverrideFireSpeed { get; set; }

		public static ConfigEntry<float> EtherealDriftOverrideDamage { get; set; }

		public static ConfigEntry<float> ScepterEntropyOverrideDamage { get; set; }

		public static ConfigEntry<float> FlamebreathOverrideDamage { get; set; }

		public static ConfigEntry<float> ScepterEntropyOverrideFireSpeed { get; set; }

		public static ConfigEntry<float> ScepterEntropyOverrideVoidJailChance { get; set; }

		public static ConfigEntry<float> ScepterEntropyOverrideRadius { get; set; }

		public static ConfigEntry<float> FlamebreathOverrideRecharge { get; set; }

		public static ConfigEntry<float> FlamebreathOverrideTickFreq { get; set; }

		public static ConfigEntry<float> NullBeamOverrideRecharge { get; set; }

		public static ConfigEntry<float> EtherealDriftOverrideRecharge { get; set; }

		public static ConfigEntry<float> EntropyOverrideRecharge { get; set; }

		public static ConfigEntry<float> EntropyOverrideRadius { get; set; }

		public static ConfigEntry<float> EntropySelfDamage { get; set; }

		public static ConfigEntry<float> EntropySelfHeal { get; set; }

		public static ConfigEntry<Color> VoidGlow { get; set; }

		public static ConfigEntry<Color> ScepterGlow { get; set; }

		public static ConfigEntry<float> ScepterEntropyOverrideRecharge { get; set; }

		public static ConfigEntry<bool> VoidcridPassiveShow { get; set; }

		public static ConfigEntry<float> VoidcridFogDamageOverride { get; set; }

		public static ConfigEntry<bool> VoidcridBombDeath { get; set; }

		public void Awake()
		{
			//IL_033f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0364: Unknown result type (might be due to invalid IL or missing references)
			FlamebreathOverrideRecharge = ((BaseUnityPlugin)this).Config.Bind<float>("Recharge Interval", "Flamebreath Recharge", 0.5f, "Measured in seconds");
			NullBeamOverrideRecharge = ((BaseUnityPlugin)this).Config.Bind<float>("Recharge Interval", "Null Beam Recharge", 7f, "Measured in seconds");
			EtherealDriftOverrideRecharge = ((BaseUnityPlugin)this).Config.Bind<float>("Recharge Interval", "Ethereal Drift Recharge", 8f, "Measured in seconds");
			EntropyOverrideRecharge = ((BaseUnityPlugin)this).Config.Bind<float>("Recharge Interval", "Entropy Recharge", 12f, "Measured in seconds");
			ScepterEntropyOverrideRecharge = ((BaseUnityPlugin)this).Config.Bind<float>("Recharge Interval", "Deeprotted Entropy Recharge", 8f, "Measured in seconds");
			NullBeamOverrideJailChance = ((BaseUnityPlugin)this).Config.Bind<float>("JailChance", "NullBeamJailChance", 0.4f, "Null Beam jail chance, measured in percentage.");
			EtherealDriftOverrideJailChance = ((BaseUnityPlugin)this).Config.Bind<float>("JailChance", "EtherealDriftJailChance", 5f, "Ethereal Drift jail chance, measured in percentage.");
			EntropyOverrideJailChance = ((BaseUnityPlugin)this).Config.Bind<float>("JailChance", "EntropyJailChance", 3f, "Entropy jail chance, measured in percentage");
			NullBeamOverrideDamage = ((BaseUnityPlugin)this).Config.Bind<float>("NullBeam", "Damage", 0.3f, "NullBeam damageCoefficientPerSecond damage");
			NullBeamOverrideDuration = ((BaseUnityPlugin)this).Config.Bind<float>("NullBeam", "Duration", 2.5f, "NullBeam maximumDuration, measured in seconds");
			NullBeamOverrideProc = ((BaseUnityPlugin)this).Config.Bind<float>("NullBeam", "Proc", 0.4f, "NullBeam proc, measured as a percentage");
			EntropyOverrideDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Entropy", "Damage", 4f, "Entropy damage multiplier");
			EntropyOverrideFireSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Entropy", "Firing Speed", 0.3f, "Entropy successive attack speed, measured in seconds");
			FlamebreathOverrideDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Flamebreath", "Duration", 2f, "Flamebreath's duration, measured in seconds. Total duration: (Flamebreath duration + Attack Speed stat)");
			FlamebreathOverrideDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Flamebreath", "Damage", 10f, "Flamebreath's totalDamageCoefficient, is divided over Flamebreath duration * tickFrequency: (totalDamageCoef / [Flamebreath duration * tickFrequency])");
			EtherealDriftOverrideDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Ethereal Drift", "Damage", 1f, "Blast Attack base damage");
			EntropyOverrideRadius = ((BaseUnityPlugin)this).Config.Bind<float>("Entropy", "Radius", 12f, "Blast Attack radius");
			EntropySelfDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Entropy", "Self-Damage", 0.15f, "Damage taken to self from Entropy");
			EntropySelfHeal = ((BaseUnityPlugin)this).Config.Bind<float>("Entropy", "Heal", 0.25f, "Healing amount from Entropy");
			ScepterEntropyOverrideDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Deeprotted Entropy (Scepter)", "Damage", 5f, "Scepter's Entropy Blast Attack base damage");
			ScepterEntropyOverrideFireSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Deeprotted Entropy (Scepter)", "Firing Speed", 0.3f, "Scepter's Entropy successive attack speed, measured in seconds");
			ScepterEntropyOverrideRadius = ((BaseUnityPlugin)this).Config.Bind<float>("Deeprotted Entropy (Scepter)", "Radius", 12f, "Scepter's Entropy radius");
			VoidGlow = ((BaseUnityPlugin)this).Config.Bind<Color>("Voicrid Glow", "Color", Color.magenta, "Voidcrid's Color Glow");
			ScepterGlow = ((BaseUnityPlugin)this).Config.Bind<Color>("Voicrid Glow", "Scepter Color", Color.red, "Voidcrid's Scepter Color Glow");
			VoidcridFogDamageOverride = ((BaseUnityPlugin)this).Config.Bind<float>("Entropy", "Fog Damage", 0.08f, "Fog health fraction damage per second");
			VoidcridPassiveShow = ((BaseUnityPlugin)this).Config.Bind<bool>("Voidcrid", "Display", true, "Shows the Voidcrid fake Passive description");
			VoidcridBombDeath = ((BaseUnityPlugin)this).Config.Bind<bool>("Voidcrid", "Death", true, "Emit a devastating bomb on death");
			LanguageSetup.SetLanguage();
			SkillSetup.LoadAssetBundle();
			SkillSetup.CreateFogProjectile();
			SkillSetup.SetupSkills(skillLocator);
			VoidcridDeathProjectile.Init();
			EffectProvider.Init();
			SkillSetup.DeathBehavior();
			HookSetup.Hook();
		}

		public static bool HasDeeprot(SkillLocator sk)
		{
			bool result = false;
			if (Chainloader.PluginInfos.ContainsKey("com.plasmacore.PlasmaCoreSpikestripContent") && Object.op_Implicit((Object)(object)sk))
			{
				result = HasDeeprotInternal(sk);
			}
			return result;
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		private static bool HasDeeprotInternal(SkillLocator sk)
		{
			bool result = false;
			if ((Object)(object)DeepRot.scriptableObject != (Object)null)
			{
				GenericSkill[] allSkills = sk.allSkills;
				foreach (GenericSkill val in allSkills)
				{
					if ((Object)(object)val.skillDef == (Object)(object)DeepRot.scriptableObject.SkillDefinition)
					{
						result = true;
						break;
					}
				}
			}
			return result;
		}

		private void ScepterSkillSetup()
		{
			//IL_0059: 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_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			Debug.Log((object)"Adding ancient scepter for Voidcrid");
			LanguageAPI.Add("VOIDCRID_SCEPTER_ENTROPY", "<style=cArtifact>「Umbral Entr<style=cIsHealing>?</style>py』</style>");
			LanguageAPI.Add("VOIDCRID_SCEPTER_ENTROPY_DESC", $"<style=cArtifact>Void.</style> <style=cIsDamage>Agile.</style> <style=cIsHealing>Poisonous.</style> <style=cIsDamage>Unstable.</style> Damage is increased to <style=cIsDamage>{ScepterEntropyOverrideDamage.Value}00% x 3</style> and if held, <style=cArtifact>ensares</style> enemies for <style=cIsDamage> 10% </style> of your health and applies your Passive.</style>");
			voidScepter = ScriptableObject.CreateInstance<SkillDef>();
			voidScepter.activationState = new SerializableEntityStateType(typeof(VoidScepter));
			voidScepter.activationStateMachineName = "Weapon";
			voidScepter.baseMaxStock = 1;
			voidScepter.baseRechargeInterval = ScepterEntropyOverrideRecharge.Value;
			voidScepter.beginSkillCooldownOnSkillEnd = true;
			voidScepter.canceledFromSprinting = false;
			voidScepter.fullRestockOnAssign = true;
			voidScepter.interruptPriority = (InterruptPriority)2;
			voidScepter.resetCooldownTimerOnUse = false;
			voidScepter.isCombatSkill = true;
			voidScepter.mustKeyPress = false;
			voidScepter.cancelSprintingOnActivation = true;
			voidScepter.rechargeStock = 1;
			voidScepter.requiredStock = 1;
			voidScepter.stockToConsume = 1;
			voidScepter.icon = SkillSetup.mainAssetBundle.LoadAsset<Sprite>("deeprotentropy.png");
			voidScepter.mustKeyPress = true;
			voidScepter.skillDescriptionToken = "VOIDCRID_SCEPTER_ENTROPY_DESC";
			voidScepter.skillName = "VOIDCRID_SCEPTER_ENTROPY";
			voidScepter.skillNameToken = "VOIDCRID_SCEPTER_ENTROPY";
			ContentAddition.AddSkillDef(voidScepter);
			bool flag = default(bool);
			ContentAddition.AddEntityState(typeof(VoidScepter), ref flag);
			Debug.Log((object)"Finished adding scepter");
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		public static void ScepterSetup()
		{
			ItemBase<AncientScepterItem>.instance.RegisterScepterSkill(voidScepter, "CrocoBody", (SkillSlot)3, 1);
		}

		private void Start()
		{
			if (Chainloader.PluginInfos.ContainsKey("com.DestroyedClone.AncientScepter"))
			{
				ancientScepterInstalled = true;
				ScepterSkillSetup();
				ScepterSetup();
			}
		}
	}
}
namespace Voidcrid.Skills
{
	public class Voidcridbreath : Flamebreath
	{
		private float maxDistance = 12f;

		private float baseFlamethrowerDuration = VoidcridDef.FlamebreathOverrideDuration.Value;

		private float totalDamageCoefficient = VoidcridDef.FlamebreathOverrideDamage.Value;

		[SerializeField]
		private GameObject flamethrowerEffectPrefab = Flamebreath.flamethrowerEffectPrefab;

		[SerializeField]
		private string startAttackSoundString = Flamebreath.startAttackSoundString;

		[SerializeField]
		private string endAttackSoundString = Flamebreath.endAttackSoundString;

		private const float flamethrowerEffectBaseDistance = 15f;

		public override void OnEnter()
		{
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: 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: Expected O, but got Unknown
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: 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)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			((Flamebreath)this).OnEnter();
			base.stopwatch = 0f;
			base.entryDuration = Flamebreath.baseEntryDuration;
			base.exitDuration = Flamebreath.baseExitDuration;
			base.flamethrowerDuration = baseFlamethrowerDuration + ((BaseState)this).attackSpeedStat;
			Transform modelTransform = ((EntityState)this).GetModelTransform();
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
			{
				((EntityState)this).characterBody.SetAimTimer(base.entryDuration + base.flamethrowerDuration + 1f);
			}
			if (Object.op_Implicit((Object)(object)modelTransform))
			{
				base.childLocator = ((Component)modelTransform).GetComponent<ChildLocator>();
			}
			float num = base.flamethrowerDuration * Flamebreath.tickFrequency;
			base.tickDamageCoefficient = totalDamageCoefficient / num;
			((EntityState)this).PlayAnimation("Gesture, Mouth", "FireSpit", "FireSpit.playbackRate", base.flamethrowerDuration);
			Ray aimRay = ((BaseState)this).GetAimRay();
			if (Object.op_Implicit((Object)(object)base.muzzleTransform))
			{
				BulletAttack val = new BulletAttack();
				val.owner = ((EntityState)this).gameObject;
				val.weapon = ((EntityState)this).gameObject;
				val.origin = ((Ray)(ref aimRay)).origin;
				val.aimVector = ((Ray)(ref aimRay)).direction;
				val.minSpread = 0f;
				val.maxSpread = Flamebreath.maxSpread;
				val.damage = base.tickDamageCoefficient * ((BaseState)this).damageStat;
				val.force = Flamebreath.force;
				val.muzzleName = "MouthMuzzle";
				val.hitEffectPrefab = Flamebreath.impactEffectPrefab;
				val.isCrit = base.isCrit;
				val.radius = Flamebreath.radius;
				val.falloffModel = (FalloffModel)0;
				val.stopperMask = ((LayerIndex)(ref LayerIndex.world)).mask;
				val.procCoefficient = Flamebreath.procCoefficientPerTick;
				val.maxDistance = maxDistance;
				val.tracerEffectPrefab = flamethrowerEffectPrefab;
				val.smartCollision = true;
				val.damageType = (DamageType)(Util.CheckRoll(Flamebreath.ignitePercentChance, ((EntityState)this).characterBody.master) ? 128 : 0);
				val.Fire();
				base.isCrit = Util.CheckRoll(((BaseState)this).critStat, ((EntityState)this).characterBody.master);
			}
		}

		public override void OnExit()
		{
			Util.PlaySound(endAttackSoundString, ((EntityState)this).gameObject);
			((EntityState)this).PlayCrossfade("Gesture, Override", "BufferEmpty", 0.05f);
			if (Object.op_Implicit((Object)(object)base.flamethrowerEffectInstance))
			{
				EntityState.Destroy((Object)(object)((Component)base.flamethrowerEffectInstance).gameObject);
			}
		}

		public override void FixedUpdate()
		{
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			((Flamebreath)this).FixedUpdate();
			base.stopwatch += Time.fixedDeltaTime;
			if (base.stopwatch >= base.entryDuration && base.stopwatch < base.entryDuration + base.flamethrowerDuration && !base.hasBegunFlamethrower)
			{
				base.hasBegunFlamethrower = true;
				Util.PlaySound(startAttackSoundString, ((EntityState)this).gameObject);
				if (Object.op_Implicit((Object)(object)base.childLocator))
				{
					base.muzzleTransform = base.childLocator.FindChild("MouthMuzzle");
					base.flamethrowerEffectInstance = Object.Instantiate<GameObject>(flamethrowerEffectPrefab, base.muzzleTransform).transform;
					((Component)base.flamethrowerEffectInstance).transform.localPosition = Vector3.zero;
					((Component)base.flamethrowerEffectInstance).GetComponent<ScaleParticleSystemDuration>().newDuration = base.flamethrowerDuration;
				}
			}
			if (base.stopwatch >= base.entryDuration + base.flamethrowerDuration && base.hasBegunFlamethrower)
			{
				base.hasBegunFlamethrower = false;
				((EntityState)this).PlayCrossfade("Gesture, Override", "ExitFlamebreath", "ExitFlamebreath.playbackRate", base.exitDuration, 0.1f);
			}
			if (base.hasBegunFlamethrower)
			{
				base.flamethrowerStopwatch += Time.deltaTime;
				if (base.flamethrowerStopwatch > 1f / Flamebreath.tickFrequency)
				{
					base.flamethrowerStopwatch -= 1f / Flamebreath.tickFrequency;
					((Flamebreath)this).FireFlame("MouthMuzzle");
				}
				UpdateFlamethrowerEffect();
			}
			else if (Object.op_Implicit((Object)(object)base.flamethrowerEffectInstance))
			{
				EntityState.Destroy((Object)(object)((Component)base.flamethrowerEffectInstance).gameObject);
			}
			if (base.stopwatch >= base.flamethrowerDuration + base.entryDuration + base.exitDuration && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

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

		private void UpdateFlamethrowerEffect()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: 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)
			Ray aimRay = ((BaseState)this).GetAimRay();
			Vector3 direction = ((Ray)(ref aimRay)).direction;
			if (Object.op_Implicit((Object)(object)base.muzzleTransform))
			{
				base.muzzleTransform.forward = direction;
			}
		}
	}
	public class Entropy : BaseSkillState
	{
		public static float baseDuration = 2f;

		public static float damageCoefficient = 5f;

		public static float procCoefficient = 1f;

		public static float attackRecoil = 1.5f;

		public static float hitHopVelocity = 5.5f;

		public static string mecanimRotateParameter = "baseRotate";

		public int currentAttack;

		private float earlyExitTime = 0.9f;

		private float duration;

		private float switchAttacks = 50f;

		private float blastAttackRadius = VoidcridDef.EntropyOverrideRadius.Value;

		private float earlyExitDuration;

		private ChildLocator childLocator;

		private bool hasFired1;

		private bool hasFired2;

		private bool hasFinishedFiring;

		[SerializeField]
		private float blastAttackForce = 1000f;

		private float hitPauseTimer;

		[SerializeField]
		private GameObject aoePrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidSurvivor/VoidSurvivorMegaBlasterExplosion.prefab").WaitForCompletion();

		private float blastAttackProcCoefficient = 1f;

		private bool inHitPause;

		private DamageType voidAttack;

		private DamageType poisonAttack;

		private CrocoDamageTypeController crocoDamageTypeController;

		private GameObject leftFistEffectInstance;

		private GameObject rightFistEffectInstance;

		private bool firedBombardment = false;

		private DamageType entropyDamage;

		[SerializeField]
		public GameObject leftfistEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidJailer/VoidJailerDeathBombExplosion.prefab").WaitForCompletion();

		public GameObject rightfistEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Croco/CrocoFistEffect.prefab").WaitForCompletion();

		private float stopwatch;

		private Animator animator;

		private Transform modelBaseTransform;

		private BlastAttack obj;

		private Material entropyGlow;

		private float emissionIntensity = 4f;

		private float minIntensity = 0.3f;

		private bool doVoidGlow = false;

		private GameObject instance;

		private void FireSmash()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0098: Expected O, but got Unknown
			//IL_009e: 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_00ae: 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_00d5: 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_00e5: Invalid comparison between Unknown and I4
			//IL_0104: 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_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_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Expected O, but got Unknown
			obj = new BlastAttack
			{
				radius = blastAttackRadius,
				procCoefficient = blastAttackProcCoefficient,
				position = ((EntityState)this).transform.position,
				attacker = ((EntityState)this).gameObject,
				crit = Util.CheckRoll(((EntityState)this).characterBody.crit, ((EntityState)this).characterBody.master),
				baseDamage = ((BaseState)this).damageStat * VoidcridDef.EntropyOverrideDamage.Value,
				falloffModel = (FalloffModel)0,
				damageType = entropyDamage,
				baseForce = blastAttackForce
			};
			obj.bonusForce = Vector3.back * blastAttackForce;
			obj.teamIndex = TeamComponent.GetObjectTeam(obj.attacker);
			obj.attackerFiltering = (AttackerFiltering)2;
			if ((int)entropyDamage == 32768)
			{
				DamageAPI.AddModdedDamageType(obj, DamageTypes.entropyJail);
			}
			obj.Fire();
			if (Object.op_Implicit((Object)(object)leftFistEffectInstance) && Object.op_Implicit((Object)(object)rightFistEffectInstance))
			{
				Vector3 footPosition = ((EntityState)this).characterBody.footPosition;
				EffectManager.SpawnEffect(aoePrefab, new EffectData
				{
					origin = footPosition,
					scale = blastAttackRadius
				}, true);
			}
		}

		public override void OnEnter()
		{
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0203: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: 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_024e: Expected O, but got Unknown
			//IL_0273: Unknown result type (might be due to invalid IL or missing references)
			//IL_0278: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0284: Unknown result type (might be due to invalid IL or missing references)
			//IL_028d: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			crocoDamageTypeController = ((EntityState)this).GetComponent<CrocoDamageTypeController>();
			CharacterModel component = ((Component)((EntityState)this).GetModelTransform()).GetComponent<CharacterModel>();
			int num = ((Component)((EntityState)this).GetModelTransform()).GetComponent<CharacterModel>().baseRendererInfos.Length;
			if (num > 1)
			{
				doVoidGlow = true;
				entropyGlow = ((Component)((EntityState)this).GetModelTransform()).GetComponent<CharacterModel>().baseRendererInfos[1].defaultMaterial;
			}
			voidAttack = (DamageType)(Util.CheckRoll(VoidcridDef.EntropyOverrideJailChance.Value, ((EntityState)this).characterBody.master) ? 32768 : 0);
			poisonAttack = crocoDamageTypeController.GetDamageType();
			entropyDamage = (Util.CheckRoll(switchAttacks, ((EntityState)this).characterBody.master) ? voidAttack : poisonAttack);
			leftFistEffectInstance = Object.Instantiate<GameObject>(leftfistEffectPrefab, ((BaseState)this).FindModelChild("MuzzleHandL"));
			rightFistEffectInstance = Object.Instantiate<GameObject>(rightfistEffectPrefab, ((BaseState)this).FindModelChild("MuzzleHandR"));
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			earlyExitDuration = duration * earlyExitTime;
			hasFired1 = false;
			hasFired2 = false;
			hasFinishedFiring = false;
			((BaseState)this).moveSpeedStat = 0f;
			childLocator = ((EntityState)this).GetModelChildLocator();
			modelBaseTransform = ((EntityState)this).GetModelBaseTransform();
			animator = ((EntityState)this).GetModelAnimator();
			bool isGrounded = ((EntityState)this).characterMotor.isGrounded;
			bool @bool = animator.GetBool("isMoving");
			string text = "Slash3";
			animator.SetBool("attacking", true);
			float num2 = Mathf.Max(duration, 0.2f);
			((EntityState)this).PlayCrossfade("Gesture, Additive", text, "Slash.playbackRate", num2, 0.05f);
			((EntityState)this).PlayCrossfade("Gesture, Override", text, "Slash.playbackRate", num2, 0.05f);
			float num3 = damageCoefficient;
			if (NetworkServer.active)
			{
				ProcChainMask val = default(ProcChainMask);
				((ProcChainMask)(ref val)).AddProc((ProcType)21);
				if (entropyDamage == poisonAttack)
				{
					((EntityState)this).healthComponent.HealFraction(VoidcridDef.EntropySelfHeal.Value, val);
				}
				else
				{
					DamageInfo val2 = new DamageInfo();
					val2.damage = VoidcridDef.EntropySelfDamage.Value * ((EntityState)this).healthComponent.fullCombinedHealth;
					val2.position = ((EntityState)this).characterBody.corePosition;
					val2.force = Vector3.zero;
					val2.damageColorIndex = (DamageColorIndex)9;
					val2.crit = false;
					val2.attacker = null;
					val2.inflictor = null;
					val2.damageType = (DamageType)1;
					val2.procCoefficient = 0f;
					val2.procChainMask = val;
					((EntityState)this).healthComponent.TakeDamage(val2);
				}
			}
			ManageEntroypGlow();
		}

		private void ManageEntroypGlow()
		{
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			if (doVoidGlow)
			{
				float num = minIntensity / VoidcridDef.EntropyOverrideFireSpeed.Value;
				if (Object.op_Implicit((Object)(object)entropyGlow))
				{
					entropyGlow.EnableKeyword("_EMISSION");
					entropyGlow.SetColor("_EmColor", VoidcridDef.VoidGlow.Value * emissionIntensity);
					emissionIntensity -= num;
				}
				if (hasFinishedFiring)
				{
					entropyGlow.DisableKeyword("_EMISSION");
					entropyGlow.SetColor("_EmColor", Color.black);
				}
			}
		}

		public override void FixedUpdate()
		{
			//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)
			((EntityState)this).FixedUpdate();
			((BaseState)this).moveSpeedStat = 0f;
			hitPauseTimer -= Time.fixedDeltaTime;
			if (hitPauseTimer <= 0f && inHitPause)
			{
				inHitPause = false;
			}
			if (!inHitPause)
			{
				stopwatch += Time.fixedDeltaTime;
			}
			else
			{
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
				{
					((EntityState)this).characterMotor.velocity = Vector3.zero;
				}
				if (Object.op_Implicit((Object)(object)animator))
				{
					animator.SetFloat("Slash3.playbackRate", 3f);
				}
			}
			if (stopwatch >= duration * VoidcridDef.EntropyOverrideFireSpeed.Value && !hasFired1 && !hasFired2 && !hasFinishedFiring)
			{
				if (((EntityState)this).isAuthority)
				{
					FireSmash();
					hasFired1 = true;
				}
				ManageEntroypGlow();
			}
			if (stopwatch >= duration * (VoidcridDef.EntropyOverrideFireSpeed.Value * 2f) && hasFired1 && !hasFired2 && !hasFinishedFiring)
			{
				if (((EntityState)this).isAuthority)
				{
					FireSmash();
					hasFired2 = true;
				}
				ManageEntroypGlow();
			}
			if (stopwatch >= duration * (VoidcridDef.EntropyOverrideFireSpeed.Value * 3f) && hasFired1 && hasFired2 && !hasFinishedFiring)
			{
				if (((EntityState)this).isAuthority)
				{
					FireSmash();
					hasFinishedFiring = true;
				}
				ManageEntroypGlow();
			}
			if (((BaseSkillState)this).IsKeyDownAuthority() && hasFinishedFiring && ((EntityState)this).isAuthority)
			{
				Bombardment();
				firedBombardment = true;
			}
			if (((EntityState)this).isAuthority && (hasFinishedFiring || firedBombardment))
			{
				((EntityState)this).outer.SetNextStateToMain();
				((BaseState)this).StartAimMode(0.2f, false);
			}
		}

		public override void OnExit()
		{
			((BaseState)this).moveSpeedStat = 0f;
			animator.SetBool("attacking", false);
			EntityState.Destroy((Object)(object)leftFistEffectInstance);
			EntityState.Destroy((Object)(object)rightFistEffectInstance);
			((EntityState)this).OnExit();
		}

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

		private void Bombardment()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: 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_0056: 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_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_00a6: Unknown result type (might be due to invalid IL or missing references)
			float damage = 1f;
			ProjectileManager.instance.FireProjectile(new FireProjectileInfo
			{
				damage = damage,
				damageTypeOverride = crocoDamageTypeController.GetDamageType(),
				crit = ((BaseState)this).RollCrit(),
				damageColorIndex = (DamageColorIndex)9,
				position = ((EntityState)this).characterBody.footPosition,
				procChainMask = default(ProcChainMask),
				force = 6000f,
				owner = ((EntityState)this).gameObject,
				projectilePrefab = SkillSetup.voidFrogProjectile,
				rotation = Quaternion.identity,
				target = ((EntityState)this).gameObject
			});
		}
	}
	public class NullBeam : BaseSkillState
	{
		private string muzzle = "MouthMuzzle";

		private float baseDuration = 1f;

		private float maxDistance = 100f;

		private float minDistance = 1f;

		private float recoilAmplitude = 1f;

		private float bulletRadius = 1f;

		private GameObject hitEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidSurvivor/VoidSurvivorBeamImpactCorrupt.prefab").WaitForCompletion();

		private GameObject tracerEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidJailer/VoidJailerCaptureTracer.prefab").WaitForCompletion();

		private float spreadBloomValue = 0.3f;

		private float forcePerSecond = 2f;

		public ItemIndex index;

		public static float nullBeamDamage = VoidcridDef.NullBeamOverrideDamage.Value;

		private float minimumDuration;

		private BuffDef nullifier = Buffs.Nullified;

		private float maxSpread = 2f;

		private DamageType deeprotDamage;

		private DamageType passiveAttack;

		private float rotAttack = 8f;

		private CrocoDamageTypeController crocoDamageTypeController;

		private float switchAttacks = 50f;

		public static DamageType voidcridLaserAttack;

		private Material voidGlow;

		private bool doVoidGlow = false;

		private float maxIntensity = 4f;

		private float duration = VoidcridDef.NullBeamOverrideDuration.Value;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			int num = ((Component)((EntityState)this).GetModelTransform()).GetComponent<CharacterModel>().baseRendererInfos.Length;
			crocoDamageTypeController = ((EntityState)this).GetComponent<CrocoDamageTypeController>();
			minimumDuration = baseDuration / ((BaseState)this).attackSpeedStat;
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.AddBuff(Buffs.Slow50);
				((EntityState)this).characterBody.AddBuff(Buffs.SmallArmorBoost);
			}
			((EntityState)this).PlayAnimation("Gesture, Mouth", "FireSpit", "FireSpit.playbackRate", duration);
			if (num > 1)
			{
				doVoidGlow = true;
				voidGlow = ((Component)((EntityState)this).GetModelTransform()).GetComponent<CharacterModel>().baseRendererInfos[1].defaultMaterial;
			}
		}

		public override void FixedUpdate()
		{
			//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_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: 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_00d3: 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_0067: 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_00ec: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).FixedUpdate();
			FireBullet();
			float num = CalcCharge();
			Ray aimRay = ((BaseState)this).GetAimRay();
			((EntityState)this).characterBody.SetAimTimer(3f);
			if (doVoidGlow)
			{
				voidGlow.EnableKeyword("_EMISSION");
				voidGlow.SetColor("_EmColor", VoidcridDef.VoidGlow.Value * maxIntensity);
				maxIntensity -= maxIntensity * Time.fixedDeltaTime / (VoidcridDef.NullBeamOverrideDuration.Value - 1f);
			}
			Ray aimRay2 = ((BaseState)this).GetAimRay();
			Vector3 point = ((Ray)(ref aimRay2)).GetPoint(maxDistance + ((BaseState)this).attackSpeedStat);
			RaycastHit val = default(RaycastHit);
			if (Util.CharacterRaycast(((EntityState)this).gameObject, ((BaseState)this).GetAimRay(), ref val, maxDistance, ((LayerIndex)(ref LayerIndex.world)).mask, (QueryTriggerInteraction)0))
			{
				point = ((RaycastHit)(ref val)).point;
			}
			if (((EntityState)this).isAuthority && (((EntityState)this).fixedAge >= VoidcridDef.NullBeamOverrideDuration.Value || (((EntityState)this).fixedAge >= baseDuration && !((BaseSkillState)this).IsKeyDownAuthority())))
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override void OnExit()
		{
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).OnExit();
			if (NetworkServer.active)
			{
				((EntityState)this).characterBody.RemoveBuff(Buffs.Slow50);
				((EntityState)this).characterBody.RemoveBuff(Buffs.SmallArmorBoost);
			}
			if (doVoidGlow)
			{
				voidGlow.DisableKeyword("_EMISSION");
				voidGlow.SetColor("_EmColor", Color.black);
			}
		}

		protected float CalcCharge()
		{
			return Mathf.Clamp01(((EntityState)this).fixedAge / baseDuration);
		}

		private void FireBullet()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Expected O, but got I4
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Expected O, but got I4
			//IL_00d4: 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_00ee: Expected O, but got Unknown
			//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_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_0219: 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_022b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: Invalid comparison between Unknown and I4
			//IL_0240: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078->IL0078: Incompatible stack types: O vs I4
			//IL_006d->IL0078: Incompatible stack types: I4 vs O
			//IL_006d->IL0078: Incompatible stack types: O vs I4
			//IL_00d4->IL00d4: Incompatible stack types: O vs I4
			//IL_00ce->IL00d4: Incompatible stack types: I4 vs O
			//IL_00ce->IL00d4: Incompatible stack types: O vs I4
			Ray aimRay = ((BaseState)this).GetAimRay();
			((BaseState)this).AddRecoil(-1f * recoilAmplitude, -2f * recoilAmplitude, -0.5f * recoilAmplitude, 0.5f * recoilAmplitude);
			if (VoidcridDef.HasDeeprot(((EntityState)this).skillLocator))
			{
				object obj = this;
				int num;
				if (Util.CheckRoll(rotAttack, ((EntityState)this).characterBody.master))
				{
					obj = crocoDamageTypeController.GetDamageType();
					num = (int)obj;
				}
				else
				{
					num = 0;
					obj = num;
					num = (int)obj;
				}
				((NullBeam)num).passiveAttack = (DamageType)obj;
			}
			else
			{
				passiveAttack = (DamageType)0;
			}
			voidcridLaserAttack = (DamageType)(Util.CheckRoll(VoidcridDef.NullBeamOverrideJailChance.Value, ((EntityState)this).characterBody.master) ? 32768 : 0);
			object obj2 = this;
			int num2;
			if (Util.CheckRoll(switchAttacks, ((EntityState)this).characterBody.master))
			{
				obj2 = passiveAttack;
				num2 = (int)obj2;
			}
			else
			{
				num2 = 0;
				obj2 = num2;
				num2 = (int)obj2;
			}
			((NullBeam)num2).deeprotDamage = (DamageType)obj2;
			if (((EntityState)this).isAuthority)
			{
				BulletAttack val = new BulletAttack();
				val.owner = ((EntityState)this).gameObject;
				val.weapon = ((EntityState)this).gameObject;
				val.origin = ((Ray)(ref aimRay)).origin;
				val.aimVector = ((Ray)(ref aimRay)).direction;
				val.muzzleName = muzzle;
				val.maxDistance = Mathf.Lerp(minDistance, maxDistance, Random.value);
				val.minSpread = 1f;
				val.maxSpread = maxSpread;
				val.radius = bulletRadius;
				val.smartCollision = false;
				val.falloffModel = (FalloffModel)1;
				val.hitMask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask;
				val.damage = nullBeamDamage * ((BaseState)this).damageStat;
				val.procCoefficient = VoidcridDef.NullBeamOverrideProc.Value;
				val.force = forcePerSecond;
				val.isCrit = Util.CheckRoll(((BaseState)this).critStat, ((EntityState)this).characterBody.master);
				val.hitEffectPrefab = hitEffectPrefab;
				val.tracerEffectPrefab = tracerEffectPrefab;
				val.damageType = (Util.CheckRoll(switchAttacks, ((EntityState)this).characterBody.master) ? deeprotDamage : voidcridLaserAttack);
				if ((int)voidcridLaserAttack == 32768)
				{
					DamageAPI.AddModdedDamageType(val, DamageTypes.nullBeamJail);
				}
				val.Fire();
			}
			((EntityState)this).characterBody.AddSpreadBloom(spreadBloomValue);
		}

		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 class SkillsPlusCompat
	{
		public static float nullBeamDmg;

		public static void init()
		{
			nullBeamDmg = NullBeam.nullBeamDamage;
			doLanguage();
			Debug.Log((object)"Added lang");
			SkillModifierManager.LoadSkillModifiers();
			Debug.Log((object)"Added skill modifiers");
		}

		private static void doLanguage()
		{
			LanguageAPI.Add("VOIDCRID_NULLBEAM_UPGRADE_DESCRIPTION", "<style=cIsUtility>+5%</style> damage, <style=cIsUtility>+10%</style> bullet thickness, and <style=cIsUtility>+0.1</style> bullet spread");
		}
	}
	[SkillLevelModifier("nullifier", new Type[] { typeof(NullBeam) })]
	public class NullbeamModifier : SimpleSkillModifier<NullBeam>
	{
		public override void OnSkillLeveledUp(int level, CharacterBody characterBody, SkillDef skillDef)
		{
			base.OnSkillLeveledUp(level, characterBody, skillDef);
			NullBeam.nullBeamDamage = BaseSkillModifier.MultScaling(SkillsPlusCompat.nullBeamDmg, 0.05f, level);
		}
	}
	public class VoidEscape : StealthMode
	{
		private TemporaryVisualEffect voidFog;

		public static DamageReport onCharacterDeathGlobal;

		public CharacterBody body;

		[SerializeField]
		private GameObject smokeBombEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/VoidMegaCrabDeathPreExplosion.prefab").WaitForCompletion();

		private string smokeBombMuzzleString = "MuzzleCenter";

		[SerializeField]
		private GameObject explosionPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/VoidMegaCrabDeathBombExplosion.prefab").WaitForCompletion();

		private FireGravityBump FGBSound = new FireGravityBump();

		public GameObject voidFogInstance = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VoidFogMildEffect.prefab").WaitForCompletion();

		public float voidJailChance = 3f;

		private CrocoDamageTypeController crocoDamageTypeController;

		private DamageType baseAttack;

		public override void OnEnter()
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			((StealthMode)this).OnEnter();
			bool flag = VoidcridDef.HasDeeprot(((EntityState)this).skillLocator);
			crocoDamageTypeController = ((EntityState)this).GetComponent<CrocoDamageTypeController>();
			if (flag)
			{
				baseAttack = crocoDamageTypeController.GetDamageType();
			}
			else
			{
				baseAttack = (DamageType)32;
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
			{
				if (NetworkServer.active)
				{
					((EntityState)this).characterBody.AddBuff(Buffs.Cloak);
					((EntityState)this).characterBody.AddBuff(Buffs.CloakSpeed);
					((EntityState)this).characterBody.AddBuff(Buffs.VoidFogStrong);
					((EntityState)this).characterBody.AddBuff(Buffs.HiddenInvincibility);
				}
				((EntityState)this).characterBody.onSkillActivatedAuthority += OnSkillActivatedAuthority;
			}
			if (((EntityState)this).isAuthority)
			{
				FireSmokebomb();
			}
			Util.PlaySound(FGBSound.enterSoundString, ((EntityState)this).gameObject);
			((EntityState)this).characterBody.UpdateSingleTemporaryVisualEffect(ref voidFog, "Prefabs/TemporaryVisualEffects/voidFogMildEffect", ((EntityState)this).characterBody.radius, true, "");
		}

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

		public override void OnExit()
		{
			if (!((EntityState)this).outer.destroying && ((EntityState)this).isAuthority)
			{
				FireSmokebomb();
			}
			Util.PlaySound(FGBSound.enterSoundString, ((EntityState)this).gameObject);
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
			{
				if (NetworkServer.active)
				{
					((EntityState)this).characterBody.RemoveBuff(Buffs.CloakSpeed);
					((EntityState)this).characterBody.RemoveBuff(Buffs.Cloak);
					((EntityState)this).characterBody.RemoveBuff(Buffs.HiddenInvincibility);
					((EntityState)this).characterBody.RemoveBuff(Buffs.VoidFogStrong);
				}
				((EntityState)this).characterBody.onSkillActivatedAuthority -= OnSkillActivatedAuthority;
			}
			((EntityState)this).characterBody.UpdateSingleTemporaryVisualEffect(ref voidFog, "Prefabs/TemporaryVisualEffects/voidFogMildEffect", ((EntityState)this).characterBody.radius, false, "");
			((StealthMode)this).OnExit();
		}

		private void OnSkillActivatedAuthority(GenericSkill skill)
		{
			if (skill.isCombatSkill)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		private void FireSmokebomb()
		{
			//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_001f: 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_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_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: 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_013a: 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_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: Expected O, but got Unknown
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: 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_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Expected O, but got Unknown
			//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_00cd: 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_00dd: Invalid comparison between Unknown and I4
			//IL_00f2: 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)
			if (((EntityState)this).isAuthority)
			{
				BlastAttack val = new BlastAttack
				{
					radius = StealthMode.blastAttackRadius,
					procCoefficient = StealthMode.blastAttackProcCoefficient,
					position = ((EntityState)this).transform.position,
					attacker = ((EntityState)this).gameObject,
					crit = Util.CheckRoll(((EntityState)this).characterBody.crit, ((EntityState)this).characterBody.master),
					baseDamage = VoidcridDef.EtherealDriftOverrideDamage.Value,
					falloffModel = (FalloffModel)0,
					damageType = (DamageType)(Util.CheckRoll(VoidcridDef.EtherealDriftOverrideJailChance.Value, ((EntityState)this).characterBody.master) ? 32768 : ((int)baseAttack)),
					baseForce = StealthMode.blastAttackForce
				};
				val.teamIndex = TeamComponent.GetObjectTeam(val.attacker);
				val.attackerFiltering = (AttackerFiltering)2;
				if ((int)val.damageType == 32768)
				{
					DamageAPI.AddModdedDamageType(val, DamageTypes.entropyJail);
				}
				val.Fire();
			}
			if (Object.op_Implicit((Object)(object)smokeBombEffectPrefab))
			{
				EffectManager.SimpleMuzzleFlash(smokeBombEffectPrefab, ((EntityState)this).gameObject, smokeBombMuzzleString, false);
				Vector3 footPosition = ((EntityState)this).characterBody.footPosition;
				EffectManager.SpawnEffect(explosionPrefab, new EffectData
				{
					origin = footPosition,
					scale = StealthMode.blastAttackRadius
				}, true);
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
			{
				((EntityState)this).characterMotor.velocity = new Vector3(((EntityState)this).characterMotor.velocity.x, StealthMode.shortHopVelocity * 1.7f, ((EntityState)this).characterMotor.velocity.z);
			}
		}

		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 class VoidScepter : BaseSkillState
	{
		public static float baseDuration = 2f;

		public static float damageCoefficient = 5f;

		public int maxBounces;

		public float bounceRange = 3f;

		public static float procCoefficient = 1f;

		public static float attackRecoil = 1.5f;

		public static float hitHopVelocity = 5.5f;

		public static string mecanimRotateParameter = "baseRotate";

		public int currentAttack;

		private float earlyExitTime = 0.9f;

		private float duration;

		private float switchAttacks = 50f;

		private float blastAttackRadius = VoidcridDef.ScepterEntropyOverrideRadius.Value;

		private float earlyExitDuration;

		private ChildLocator childLocator;

		private bool hasFired1;

		private bool hasFired2;

		private bool hasFinishedFiring;

		private bool firedBombardment;

		[SerializeField]
		private float blastAttackForce = 1000f;

		private GameObject groundImpact = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidRaidCrab/VoidRaidCrabGravityBumpExplosionGround.prefab").WaitForCompletion();

		private float hitPauseTimer;

		[SerializeField]
		private GameObject aoePrefab;

		private GameObject aoe2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidRaidCrab/VoidRaidCrabTripleBeamExplosion.prefab").WaitForCompletion();

		private float blastAttackProcCoefficient = 1f;

		private bool inHitPause;

		private DamageType voidAttack;

		private DamageType poisonAttack;

		private CrocoDamageTypeController crocoDamageTypeController;

		private GameObject leftFistEffectInstance;

		private GameObject rightFistEffectInstance;

		private Material entropyGlow;

		private float emissionIntensity = 4f;

		private float minIntensity = 0.3f;

		private DamageType entropyDamage;

		[SerializeField]
		public GameObject leftfistEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidSurvivor/VoidSurvivorMegaBlasterExplosionCorrupted.prefab").WaitForCompletion();

		public GameObject rightfistEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidSurvivor/VoidSurvivorMegaBlasterExplosionCorrupted.prefab").WaitForCompletion();

		private GameObject projectilePrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/Projectiles/ElementalRingVoidBlackHole");

		private float stopwatch;

		private Animator animator;

		private Transform modelBaseTransform;

		private BlastAttack obj;

		private bool doVoidGlow = false;

		private void FireSmash()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0098: Expected O, but got Unknown
			//IL_009e: 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_00ae: 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_00d5: 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_00e5: Invalid comparison between Unknown and I4
			//IL_0104: 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_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_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Expected O, but got Unknown
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: 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_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Expected O, but got Unknown
			obj = new BlastAttack
			{
				radius = blastAttackRadius,
				procCoefficient = blastAttackProcCoefficient,
				position = ((EntityState)this).transform.position,
				attacker = ((EntityState)this).gameObject,
				crit = Util.CheckRoll(((EntityState)this).characterBody.crit, ((EntityState)this).characterBody.master),
				baseDamage = ((BaseState)this).damageStat * VoidcridDef.ScepterEntropyOverrideDamage.Value,
				falloffModel = (FalloffModel)0,
				damageType = entropyDamage,
				baseForce = blastAttackForce
			};
			obj.bonusForce = Vector3.back * blastAttackForce;
			obj.teamIndex = TeamComponent.GetObjectTeam(obj.attacker);
			obj.attackerFiltering = (AttackerFiltering)2;
			if ((int)entropyDamage == 32768)
			{
				DamageAPI.AddModdedDamageType(obj, DamageTypes.entropyJail);
			}
			obj.Fire();
			if (Object.op_Implicit((Object)(object)leftFistEffectInstance) && Object.op_Implicit((Object)(object)rightFistEffectInstance))
			{
				Vector3 footPosition = ((EntityState)this).characterBody.footPosition;
				EffectManager.SpawnEffect(aoePrefab, new EffectData
				{
					origin = footPosition,
					scale = blastAttackRadius
				}, true);
				EffectManager.SpawnEffect(aoe2, new EffectData
				{
					origin = footPosition,
					scale = blastAttackRadius
				}, true);
			}
		}

		public override void OnEnter()
		{
			//IL_0080: 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_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: 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_00c9: 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_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_0225: Unknown result type (might be due to invalid IL or missing references)
			//IL_022b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0258: Unknown result type (might be due to invalid IL or missing references)
			//IL_025f: Expected O, but got Unknown
			//IL_0284: Unknown result type (might be due to invalid IL or missing references)
			//IL_0289: Unknown result type (might be due to invalid IL or missing references)
			//IL_0290: Unknown result type (might be due to invalid IL or missing references)
			//IL_0295: Unknown result type (might be due to invalid IL or missing references)
			//IL_029e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02be: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d3: 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)
			((BaseState)this).OnEnter();
			int num = ((Component)((EntityState)this).GetModelTransform()).GetComponent<CharacterModel>().baseRendererInfos.Length;
			if (num > 1)
			{
				doVoidGlow = true;
				entropyGlow = ((Component)((EntityState)this).GetModelTransform()).GetComponent<CharacterModel>().baseRendererInfos[1].defaultMaterial;
			}
			crocoDamageTypeController = ((EntityState)this).GetComponent<CrocoDamageTypeController>();
			voidAttack = (DamageType)(Util.CheckRoll(VoidcridDef.EntropyOverrideJailChance.Value, ((EntityState)this).characterBody.master) ? 32768 : 0);
			poisonAttack = crocoDamageTypeController.GetDamageType();
			aoePrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidSurvivor/VoidSurvivorMegaBlasterExplosionCorrupted.prefab").WaitForCompletion();
			entropyDamage = (Util.CheckRoll(switchAttacks, ((EntityState)this).characterBody.master) ? voidAttack : poisonAttack);
			leftFistEffectInstance = Object.Instantiate<GameObject>(leftfistEffectPrefab, ((BaseState)this).FindModelChild("MuzzleHandL"));
			rightFistEffectInstance = Object.Instantiate<GameObject>(rightfistEffectPrefab, ((BaseState)this).FindModelChild("MuzzleHandR"));
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			earlyExitDuration = duration * earlyExitTime;
			hasFired1 = false;
			hasFired2 = false;
			hasFinishedFiring = false;
			firedBombardment = false;
			((BaseState)this).moveSpeedStat = 0f;
			childLocator = ((EntityState)this).GetModelChildLocator();
			modelBaseTransform = ((EntityState)this).GetModelBaseTransform();
			animator = ((EntityState)this).GetModelAnimator();
			bool isGrounded = ((EntityState)this).characterMotor.isGrounded;
			bool @bool = animator.GetBool("isMoving");
			string text = "Slash3";
			animator.SetBool("attacking", true);
			float num2 = Mathf.Max(duration, 0.2f);
			((EntityState)this).PlayCrossfade("Gesture, Additive", text, "Slash.playbackRate", num2, 0.05f);
			((EntityState)this).PlayCrossfade("Gesture, Override", text, "Slash.playbackRate", num2, 0.05f);
			float num3 = Entropy.damageCoefficient;
			if (NetworkServer.active)
			{
				ProcChainMask val = default(ProcChainMask);
				((ProcChainMask)(ref val)).AddProc((ProcType)21);
				if (entropyDamage == poisonAttack)
				{
					((EntityState)this).healthComponent.HealFraction(VoidcridDef.EntropySelfHeal.Value, val);
				}
				else
				{
					DamageInfo val2 = new DamageInfo();
					val2.damage = VoidcridDef.EntropySelfDamage.Value * ((EntityState)this).healthComponent.fullCombinedHealth;
					val2.position = ((EntityState)this).characterBody.corePosition;
					val2.force = Vector3.zero;
					val2.damageColorIndex = (DamageColorIndex)9;
					val2.crit = false;
					val2.attacker = null;
					val2.inflictor = null;
					val2.damageType = (DamageType)1;
					val2.procCoefficient = 0f;
					val2.procChainMask = val;
					((EntityState)this).healthComponent.TakeDamage(val2);
				}
			}
			ManageEntroypGlow();
		}

		public override void FixedUpdate()
		{
			//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)
			((EntityState)this).FixedUpdate();
			((BaseState)this).moveSpeedStat = 0f;
			hitPauseTimer -= Time.fixedDeltaTime;
			if (hitPauseTimer <= 0f && inHitPause)
			{
				inHitPause = false;
			}
			if (!inHitPause)
			{
				stopwatch += Time.fixedDeltaTime;
			}
			else
			{
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
				{
					((EntityState)this).characterMotor.velocity = Vector3.zero;
				}
				if (Object.op_Implicit((Object)(object)animator))
				{
					animator.SetFloat("Slash3.playbackRate", 3f);
				}
			}
			if (stopwatch >= duration * VoidcridDef.ScepterEntropyOverrideFireSpeed.Value && !hasFired1 && !hasFired2 && !hasFinishedFiring)
			{
				if (((EntityState)this).isAuthority)
				{
					FireSmash();
					hasFired1 = true;
				}
				ManageEntroypGlow();
			}
			if (stopwatch >= duration * (VoidcridDef.EntropyOverrideFireSpeed.Value * 2f) && hasFired1 && !hasFired2 && !hasFinishedFiring)
			{
				if (((EntityState)this).isAuthority)
				{
					FireSmash();
					hasFired2 = true;
				}
				ManageEntroypGlow();
			}
			if (stopwatch >= duration * (VoidcridDef.EntropyOverrideFireSpeed.Value * 3f) && hasFired1 && hasFired2 && !hasFinishedFiring)
			{
				if (((EntityState)this).isAuthority)
				{
					FireSmash();
					hasFinishedFiring = true;
				}
				ManageEntroypGlow();
			}
			if (((BaseSkillState)this).IsKeyDownAuthority() && hasFinishedFiring && ((EntityState)this).isAuthority)
			{
				Bombardment();
				firedBombardment = true;
			}
			if (((EntityState)this).isAuthority && (hasFinishedFiring || firedBombardment))
			{
				((EntityState)this).outer.SetNextStateToMain();
				((BaseState)this).StartAimMode(0.2f, false);
			}
		}

		public override void OnExit()
		{
			((BaseState)this).moveSpeedStat = 0f;
			animator.SetBool("attacking", false);
			EntityState.Destroy((Object)(object)leftFistEffectInstance);
			EntityState.Destroy((Object)(object)rightFistEffectInstance);
			((EntityState)this).OnExit();
		}

		private void ManageEntroypGlow()
		{
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			if (doVoidGlow)
			{
				float num = minIntensity / VoidcridDef.ScepterEntropyOverrideFireSpeed.Value;
				if (Object.op_Implicit((Object)(object)entropyGlow))
				{
					entropyGlow.EnableKeyword("_EMISSION");
					entropyGlow.SetColor("_EmColor", VoidcridDef.ScepterGlow.Value * emissionIntensity);
					emissionIntensity -= num;
				}
				if (hasFinishedFiring)
				{
					entropyGlow.DisableKeyword("_EMISSION");
					entropyGlow.SetColor("_EmColor", Color.black);
				}
			}
		}

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

		private void Bombardment()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: 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_0056: 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_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_00a6: Unknown result type (might be due to invalid IL or missing references)
			float damage = 1f;
			ProjectileManager.instance.FireProjectile(new FireProjectileInfo
			{
				damage = damage,
				damageTypeOverride = crocoDamageTypeController.GetDamageType(),
				crit = ((BaseState)this).RollCrit(),
				damageColorIndex = (DamageColorIndex)9,
				position = ((EntityState)this).characterBody.footPosition,
				procChainMask = default(ProcChainMask),
				force = 6000f,
				owner = ((EntityState)this).gameObject,
				projectilePrefab = SkillSetup.voidFrogProjectile,
				rotation = Quaternion.identity,
				target = ((EntityState)this).gameObject
			});
		}
	}
}
namespace Voidcrid.Effects
{
	public static class EffectProvider
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_Resolve <0>__InterceptHealthCmpAssetReferences;
		}

		public static GameObject VoidcridSilentKill { get; private set; }

		internal static void Init()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			object obj = <>O.<0>__InterceptHealthCmpAssetReferences;
			if (obj == null)
			{
				hook_Resolve val = InterceptHealthCmpAssetReferences;
				<>O.<0>__InterceptHealthCmpAssetReferences = val;
				obj = (object)val;
			}
			AssetReferences.Resolve += (hook_Resolve)obj;
		}

		private static void InterceptHealthCmpAssetReferences(orig_Resolve originalMethod)
		{
			//IL_0055: 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_0060: Expected O, but got Unknown
			originalMethod.Invoke();
			VoidcridSilentKill = PrefabAPI.InstantiateClone(AssetReferences.critGlassesVoidExecuteEffectPrefab, "VoidcridSilentKill");
			VoidcridSilentKill.AddComponent<NetworkIdentity>();
			EffectComponent componentInChildren = VoidcridSilentKill.GetComponentInChildren<EffectComponent>();
			componentInChildren.soundName = null;
			ContentAddition.AddEffect(VoidcridSilentKill);
			object obj = <>O.<0>__InterceptHealthCmpAssetReferences;
			if (obj == null)
			{
				hook_Resolve val = InterceptHealthCmpAssetReferences;
				<>O.<0>__InterceptHealthCmpAssetReferences = val;
				obj = (object)val;
			}
			AssetReferences.Resolve -= (hook_Resolve)obj;
		}
	}
}
namespace Voidcrid.Modules
{
	public class DamageTypes
	{
		public static ModdedDamageType nullBeamJail = DamageAPI.ReserveDamageType();

		public static ModdedDamageType ethJail = DamageAPI.ReserveDamageType();

		public static ModdedDamageType entropyJail = DamageAPI.ReserveDamageType();

		public static ModdedDamageType voidcridDeath = DamageAPI.ReserveDamageType();

		public static ModdedDamageType voidcridDeath2 = DamageAPI.ReserveDamageType();

		public static ModdedDamageType voidcridPoison = DamageAPI.ReserveDamageType();
	}
	public static class VoidcridDeathProjectile
	{
		public static GameObject VoidcridDeath { get; private set; }

		public static GameObject VoidcridDeath2 { get; private set; }

		public static GameObject VoidcridPoison { get; private set; }

		internal static void Init()
		{
			//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_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: 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_0073: 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_00a1: Unknown result type (might be due to invalid IL or missing references)
			VoidcridDeath = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/VoidMegaCrab/VoidMegacrabAntimatterExplosion.prefab").WaitForCompletion(), "VoidcridDeathBomb");
			VoidcridDeath2 = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Nullifier/NullifierDeathBombProjectile.prefab").WaitForCompletion(), "VoidcridDeathBomb2");
			VoidcridPoison = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Croco/CrocoLeapAcid.prefab").WaitForCompletion(), "VoidcridPoisonPool");
			ModdedDamageTypeHolderComponent val = VoidcridDeath.AddComponent<ModdedDamageTypeHolderComponent>();
			val.Add(DamageTypes.voidcridDeath);
			ModdedDamageTypeHolderComponent val2 = VoidcridDeath.AddComponent<ModdedDamageTypeHolderComponent>();
			val2.Add(DamageTypes.voidcridDeath2);
			ModdedDamageTypeHolderComponent val3 = VoidcridPoison.AddComponent<ModdedDamageTypeHolderComponent>();
			val3.Add(DamageTypes.voidcridPoison);
			ContentAddition.AddProjectile(VoidcridDeath);
			ContentAddition.AddProjectile(VoidcridDeath2);
			ContentAddition.AddProjectile(VoidcridPoison);
		}
	}
	public class DeathState : GenericCharacterDeath
	{
		private string MuzzleName = "MouthMuzzle";

		private Transform muzzleTransform;

		public override bool shouldAutoDestroy => false;

		public override void OnEnter()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: 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_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: 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_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: 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_0185: 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_019c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
			((GenericCharacterDeath)this).OnEnter();
			Vector3 val = Vector3.up * 3f;
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
			{
				val += ((EntityState)this).characterMotor.velocity;
				((Behaviour)((EntityState)this).characterMotor).enabled = false;
			}
			if (Object.op_Implicit((Object)(object)((GenericCharacterDeath)this).cachedModelTransform))
			{
				RagdollController component = ((Component)((GenericCharacterDeath)this).cachedModelTransform).GetComponent<RagdollController>();
				if (Object.op_Implicit((Object)(object)component))
				{
					component.BeginRagdoll(val);
				}
			}
			muzzleTransform = ((BaseState)this).FindModelChild(MuzzleName);
			if (((EntityState)this).isAuthority)
			{
				FireProjectileInfo val2 = default(FireProjectileInfo);
				if (getVoidItemCount(((EntityState)this).characterBody.inventory) >= 3)
				{
					val2.projectilePrefab = VoidcridDeathProjectile.VoidcridDeath;
				}
				else if (getVoidItemCount(((EntityState)this).characterBody.inventory) >= 7)
				{
					val2.projectilePrefab = VoidcridDeathProjectile.VoidcridDeath2;
				}
				val2.position = ((EntityState)this).characterBody.corePosition;
				val2.rotation = Quaternion.LookRotation(((EntityState)this).characterDirection.forward, Vector3.up);
				val2.owner = ((EntityState)this).gameObject;
				val2.damage = ((BaseState)this).damageStat;
				val2.crit = ((EntityState)this).characterBody.RollCrit();
				ProjectileManager.instance.FireProjectile(val2);
				FireProjectileInfo val3 = default(FireProjectileInfo);
				val3.projectilePrefab = VoidcridDeathProjectile.VoidcridPoison;
				val3.position = ((EntityState)this).characterBody.corePosition;
				val3.rotation = Quaternion.LookRotation(((EntityState)this).characterDirection.forward, Vector3.up);
				val3.owner = ((EntityState)this).gameObject;
				val3.damage = ((BaseState)this).damageStat;
				val3.crit = ((EntityState)this).characterBody.RollCrit();
				ProjectileManager.instance.FireProjectile(val3);
			}
		}

		public override void FixedUpdate()
		{
			((GenericCharacterDeath)this).FixedUpdate();
			if (((EntityState)this).fixedAge >= 6f)
			{
				((GenericCharacterDeath)this).DestroyModel();
				if (NetworkServer.active)
				{
					((GenericCharacterDeath)this).DestroyBodyAsapServer();
				}
			}
		}

		public override void OnExit()
		{
			((GenericCharacterDeath)this).DestroyModel();
			((GenericCharacterDeath)this).OnExit();
		}

		private int getVoidItemCount(Inventory inventory)
		{
			int num = 0;
			num += inventory.GetItemCount(Items.CritGlassesVoid);
			num += inventory.GetItemCount(Items.ElementalRingVoid);
			num += inventory.GetItemCount(Items.ExplodeOnDeathVoid);
			num += inventory.GetItemCount(Items.EquipmentMagazineVoid);
			num += inventory.GetItemCount(Items.ChainLightningVoid);
			num += inventory.GetItemCount(Items.TreasureCacheVoid);
			num += inventory.GetItemCount(Items.MushroomVoid);
			num += inventory.GetItemCount(Items.BearVoid);
			num += inventory.GetItemCount(Items.SlowOnHitVoid);
			num += inventory.GetItemCount(Items.MissileVoid);
			num += inventory.GetItemCount(Items.ExtraLifeVoid);
			num += inventory.GetItemCount(Items.BleedOnHitVoid);
			num += inventory.GetItemCount(Items.CloverVoid);
			return num + inventory.GetItemCount(Items.VoidMegaCrabItem);
		}
	}
}
namespace Voidcrid.Language
{
	public class LanguageSetup
	{
		public static void SetLanguage()
		{
			LanguageAPI.Add("VOIDCRID_PASSIVE", "<style=cArtifact>Void</style>crid");
			LanguageAPI.Add("VOIDCRID_PASSIVE_DESC", "All <style=cArtifact>Void</style> attacks have a chance to <style=cArtifact>jail</style> enemies (and apply <style=cWorldEvent>Deeprot</style>, if selected).");
			LanguageAPI.Add("ACHIEVEMENT_GRANDFATHERPARADOX_NAME", "Acrid: Grandfather Paradox");
			LanguageAPI.Add("ACHIEVEMENT_GRANDFATHERPARADOX_DESCRIPTION", "An unexpected amphibian, an unfortunate end.");
			LanguageAPI.Add("ACHIEVEMENT_RIGHTTOJAIL_NAME", "Acrid: Right To Jail");
			LanguageAPI.Add("ACHIEVEMENT_RIGHTTOJAIL_DESCRIPTION", "As Acrid, jail a Jailer.");
			LanguageAPI.Add("ACHIEVEMENT_VOIDCRIDUNLOCK_NAME", "...Left alone");
			LanguageAPI.Add("ACHIEVEMENT_VOIDCRIDUNLOCK_DESCRIPTION", "As Acrid, corrupt yourself 7 times to break containment.");
			LanguageAPI.Add("VOIDCRID_PASSIVE", "<style=cArtifact>Void</style>crid");
			LanguageAPI.Add("VOIDCRID_PASSIVE_DESC", "All <style=cArtifact>Void</style> attacks have a chance to <style=cArtifact>jail</style> enemies (and apply <style=cWorldEvent>Deeprot</style>, if selected).");
			LanguageAPI.Add("ACHIEVEMENT_GRANDFATHERPARADOX_NAME", "Acrid: Grandfather Paradox");
			LanguageAPI.Add("ACHIEVEMENT_GRANDFATHERPARADOX_DESCRIPTION", "An unexpected amphibian, an unfortunate end.");
			LanguageAPI.Add("ACHIEVEMENT_RIGHTTOJAIL_NAME", "Acrid: Right To Jail");
			LanguageAPI.Add("ACHIEVEMENT_RIGHTTOJAIL_DESCRIPTION", "As Acrid, jail a Jailer.");
			LanguageAPI.Add("ACHIEVEMENT_VOIDCRIDUNLOCK_NAME", "...Left alone");
			LanguageAPI.Add("ACHIEVEMENT_VOIDCRIDUNLOCK_DESCRIPTION", "As Acrid, corrupt yourself 7 times to break containment.");
			LanguageAPI.Add("VOIDCRID_FLAMEBREATH", "Flamebreath");
			LanguageAPI.Add("VOIDCRID_FLAMEBREATH_DESC", "<style=cDeath>Igniting.</style> <style=cIsDamage>Agile.</style> Release a burst of <style=cIsDamage>flame</style>, <style=cDeath>burning</style> enemies for <style=cIsDamage>250%</style> damage.");
			LanguageAPI.Add("VOIDCRID_NULLBEAM", "<style=cArtifact>「N?ll Beam』</style>");
			LanguageAPI.Add("VOIDCRID_NULLBEAM_DESC", "<style=cArtifact>Void.</style> Draw deep from the <style=cArtifact>Void</style>, battering enemies with a swath of <style=cDeath>tentacles</style> for <style=cIsDamage>900%</style> damage.");
			LanguageAPI.Add("VOIDCRID_VOIDDRIFT", "<style=cArtifact>「Ethereal Dr?ft』</style>");
			LanguageAPI.Add("VOIDCRID_VOIDRIFT_DESC", "<style=cArtifact>Void.</style> <style=cIsDamage>Stunning.</style> Slip into the <style=cArtifact>Void</style> dealing <style=cIsDamage>400% total</style> damage, with a chance to take enemies with you.");
			LanguageAPI.Add("VOIDCRID_ENTROPY", "<style=cArtifact>「Entr<style=cIsHealing>?</style>py』</style>");
			LanguageAPI.Add("VOIDCRID_ENTROPY_DESC", $"<style=cArtifact>Void.</style> <style=cIsDamage>Agile.</style> <style=cIsHealing>Poisonous.</style> <style=cIsDamage>Unstable.</style> Reorganize your cells, <style=cIsHealing>healing</style> for <style=cIsDamage>{VoidcridDef.EntropySelfHeal.Value * 100f}%</style> or <style=cDeath>harming</style> yourself for <style=cIsDamage>{VoidcridDef.EntropySelfDamage.Value * 100f}%</style> health to damage for <style=cIsDamage>{VoidcridDef.EntropyOverrideDamage.Value}00% x 3</style> damage or <style=cIsHealing>poison</style> enemies. If held, creates a temporary <style=cArtifact>black hole</style>, <style=cDeath>choking</style> everyone inside and applies your <style=cIsHealing>Passive</style> on exiting.");
		}
	}
}
namespace Voidcrid.Hooks
{
	public class HookSetup
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_TakeDamage <0>__JailJailJail;

			public static hook_TakeDamage <1>__VoidcridDeathBombFake;
		}

		private static void JailJailJail(orig_TakeDamage orig, HealthComponent self, DamageInfo info)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: 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)
			if ((DamageAPI.HasModdedDamageType(info, DamageTypes.nullBeamJail) || DamageAPI.HasModdedDamageType(info, DamageTypes.ethJail) || DamageAPI.HasModdedDamageType(info, DamageTypes.entropyJail)) && NetworkServer.active)
			{
				self.body.AddTimedBuff(Buffs.Nullified, 3f);
			}
			orig.Invoke(self, info);
		}

		private static void VoidcridDeathBombFake(orig_TakeDamage originalMethod, HealthComponent @this, DamageInfo damageInfo)
		{
			//IL_0036: 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_0076: 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_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid I

Voidcrid_Skins.dll

Decompiled 6 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using MonoMod.RuntimeDetour.HookGen;
using RoR2;
using RoR2.ContentManagement;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace Voidcrid_Skins;

[BepInPlugin("com.sixfears7.Voidcrid_Skins", "Voidcrid_Skins", "1.0.0")]
public class Voidcrid_SkinsPlugin : BaseUnityPlugin
{
	private class FieldException : Exception
	{
		public FieldException(string message, Exception innerException)
			: base(message, innerException)
		{
		}
	}

	private static AssetBundle assetBundle;

	private static readonly List<Material> materialsWithRoRShader = new List<Material>();

	internal static Voidcrid_SkinsPlugin Instance { get; private set; }

	internal static ManualLogSource InstanceLogger
	{
		get
		{
			Voidcrid_SkinsPlugin instance = Instance;
			return (instance != null) ? ((BaseUnityPlugin)instance).Logger : null;
		}
	}

	private void Start()
	{
		Instance = this;
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Voidcrid_Skins.sixfears7voidcrid_skins"))
		{
			assetBundle = AssetBundle.LoadFromStream(stream);
		}
		((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit);
		HookEndpointManager.Add((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings));
		ReplaceShaders();
	}

	private static void ReplaceShaders()
	{
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGStandard.shader", "Assets/Resources/mouthfix.mat", "Assets/Resources/pink.mat", "Assets/Resources/Blackrid.mat", "Assets/Resources/demoneyes.mat", "Assets/Resources/Whitecrid.mat");
	}

	private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		Shader shader = Addressables.LoadAssetAsync<Shader>((object)shaderPath).WaitForCompletion();
		foreach (string text in materialPaths)
		{
			Material val = assetBundle.LoadAsset<Material>(text);
			val.shader = shader;
			materialsWithRoRShader.Add(val);
		}
	}

	private static void LanguageLoadStrings(Action<Language> orig, Language self)
	{
		orig(self);
		self.SetStringByToken("SIXFEARS7_SKIN_VOIDCRID_NAME", "Voidcrid");
		self.SetStringByToken("SIXFEARS7_SKIN_BLACKRID_NAME", "Blackrid");
		self.SetStringByToken("SIXFEARS7_SKIN_RADIOACRID_NAME", "Abominacrid");
	}

	private static void Nothing(Action<SkinDef> orig, SkinDef self)
	{
	}

	private static void BodyCatalogInit()
	{
		MethodInfo method = typeof(SkinDef).GetMethod("Awake", BindingFlags.Instance | BindingFlags.NonPublic);
		HookEndpointManager.Add((MethodBase)method, (Delegate)new Action<Action<SkinDef>, SkinDef>(Nothing));
		AddCrocoBodyVoidcridSkin();
		AddCrocoBodyBlackridSkin();
		AddCrocoBodyRadioacridSkin();
		HookEndpointManager.Remove((MethodBase)method, (Delegate)new Action<Action<SkinDef>, SkinDef>(Nothing));
	}

	private static void AddCrocoBodyVoidcridSkin()
	{
		//IL_025b: Unknown result type (might be due to invalid IL or missing references)
		string text = "CrocoBody";
		string text2 = "Voidcrid";
		try
		{
			GameObject val = BodyCatalog.FindBodyPrefab(text);
			if (!Object.op_Implicit((Object)(object)val))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
				return;
			}
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController val2 = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)val2))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
				return;
			}
			Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>(true);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			TryCatchThrow("Icon", delegate
			{
				skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\Voidcrid_Skins\\Icons\\VoidcridIcon.png");
			});
			((Object)skin).name = text2;
			skin.nameToken = "SIXFEARS7_SKIN_VOIDCRID_NAME";
			skin.rootObject = gameObject;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = Array.Empty<SkinDef>();
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = null;
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				skin.gameObjectActivations = Array.Empty<GameObjectActivation>();
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0011: 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_004c: 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_0056: 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_0091: Unknown result type (might be due to invalid IL or missing references)
				//IL_0092: Unknown result type (might be due to invalid IL or missing references)
				skin.rendererInfos = (RendererInfo[])(object)new RendererInfo[2]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/mouthfix.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)0,
						ignoreOverlays = false,
						renderer = renderers[2]
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/pink.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)0,
						ignoreOverlays = false,
						renderer = renderers[3]
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Unknown result type (might be due to invalid IL or missing references)
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				skin.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets/Resources/FINALLFXD.mesh"),
						renderer = renderers[2]
					}
				};
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				skin.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skin.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref val2.skins, val2.skins.Length + 1);
			val2.skins[val2.skins.Length - 1] = skin;
			BodyCatalog.skins[BodyCatalog.FindBodyIndex(val)] = val2.skins;
		}
		catch (FieldException ex)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
			InstanceLogger.LogError((object)ex.InnerException);
		}
		catch (Exception ex2)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex2);
		}
	}

	private static void AddCrocoBodyBlackridSkin()
	{
		//IL_025b: Unknown result type (might be due to invalid IL or missing references)
		string text = "CrocoBody";
		string text2 = "Blackrid";
		try
		{
			GameObject val = BodyCatalog.FindBodyPrefab(text);
			if (!Object.op_Implicit((Object)(object)val))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
				return;
			}
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController val2 = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)val2))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
				return;
			}
			Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>(true);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			TryCatchThrow("Icon", delegate
			{
				skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\Voidcrid_Skins\\Icons\\BlackridIcon.png");
			});
			((Object)skin).name = text2;
			skin.nameToken = "SIXFEARS7_SKIN_BLACKRID_NAME";
			skin.rootObject = gameObject;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = Array.Empty<SkinDef>();
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = null;
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				skin.gameObjectActivations = Array.Empty<GameObjectActivation>();
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0011: 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_004c: 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_0056: 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_0091: Unknown result type (might be due to invalid IL or missing references)
				//IL_0092: Unknown result type (might be due to invalid IL or missing references)
				skin.rendererInfos = (RendererInfo[])(object)new RendererInfo[2]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/Blackrid.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)0,
						ignoreOverlays = false,
						renderer = renderers[2]
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/demoneyes.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)0,
						ignoreOverlays = false,
						renderer = renderers[3]
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Unknown result type (might be due to invalid IL or missing references)
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				skin.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets/Resources/FINALLFXD.mesh"),
						renderer = renderers[2]
					}
				};
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				skin.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skin.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref val2.skins, val2.skins.Length + 1);
			val2.skins[val2.skins.Length - 1] = skin;
			BodyCatalog.skins[BodyCatalog.FindBodyIndex(val)] = val2.skins;
		}
		catch (FieldException ex)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
			InstanceLogger.LogError((object)ex.InnerException);
		}
		catch (Exception ex2)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex2);
		}
	}

	private static void AddCrocoBodyRadioacridSkin()
	{
		//IL_025b: Unknown result type (might be due to invalid IL or missing references)
		string text = "CrocoBody";
		string text2 = "Radioacrid";
		try
		{
			GameObject val = BodyCatalog.FindBodyPrefab(text);
			if (!Object.op_Implicit((Object)(object)val))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
				return;
			}
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController val2 = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)val2))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
				return;
			}
			Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>(true);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			TryCatchThrow("Icon", delegate
			{
				skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\Voidcrid_Skins\\Icons\\RadioacridIcon.png");
			});
			((Object)skin).name = text2;
			skin.nameToken = "SIXFEARS7_SKIN_RADIOACRID_NAME";
			skin.rootObject = gameObject;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = Array.Empty<SkinDef>();
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = ((IEnumerable<UnlockableDef>)ContentManager.unlockableDefs).FirstOrDefault((Func<UnlockableDef, bool>)((UnlockableDef def) => def.cachedName == "GrandfatherParadox"));
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				skin.gameObjectActivations = Array.Empty<GameObjectActivation>();
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0011: 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_004c: 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_0056: 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_0091: Unknown result type (might be due to invalid IL or missing references)
				//IL_0092: Unknown result type (might be due to invalid IL or missing references)
				skin.rendererInfos = (RendererInfo[])(object)new RendererInfo[2]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/Whitecrid.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)0,
						ignoreOverlays = false,
						renderer = renderers[2]
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/Whitecrid.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)0,
						ignoreOverlays = false,
						renderer = renderers[3]
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Unknown result type (might be due to invalid IL or missing references)
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				skin.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets/Resources/FINALLFXD.mesh"),
						renderer = renderers[2]
					}
				};
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				skin.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skin.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref val2.skins, val2.skins.Length + 1);
			val2.skins[val2.skins.Length - 1] = skin;
			BodyCatalog.skins[BodyCatalog.FindBodyIndex(val)] = val2.skins;
		}
		catch (FieldException ex)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
			InstanceLogger.LogError((object)ex.InnerException);
		}
		catch (Exception ex2)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex2);
		}
	}

	private static void TryCatchThrow(string message, Action action)
	{
		try
		{
			action?.Invoke();
		}
		catch (Exception innerException)
		{
			throw new FieldException(message, innerException);
		}
	}
}