Decompiled source of Demolisher v0.6.2

plugins/Demolisher.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using BrynzaAPI;
using EmotesAPI;
using EntityStates;
using EntityStates.VoidRaidCrab;
using Grumpy;
using HG.BlendableTypes;
using HG.Reflection;
using HarmonyLib;
using IL.RoR2;
using IL.RoR2.UI;
using KinematicCharacterController;
using Microsoft.CodeAnalysis;
using Mono.Cecil;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.EntityStates;
using On.RoR2;
using On.RoR2.UI;
using R2API;
using R2API.Networking;
using R2API.Networking.Interfaces;
using R2API.Utils;
using RiskOfOptions;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Achievements;
using RoR2.Audio;
using RoR2.CharacterAI;
using RoR2.ContentManagement;
using RoR2.HudOverlay;
using RoR2.Navigation;
using RoR2.Projectile;
using RoR2.Skills;
using RoR2.UI;
using TMPro;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.Rendering.PostProcessing;
using UnityEngine.UI;

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: OptIn]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: AssemblyInformationalVersion("1.0.0+f166f55ed7bd5ba244876250185c4415ed3e8eef")]
[assembly: AssemblyProduct("Demolisher")]
[assembly: AssemblyTitle("Demolisher")]
[assembly: AssemblyCompany("Demolisher")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[Microsoft.CodeAnalysis.Embedded]
	[CompilerGenerated]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace Demolisher
{
	[RegisterAchievement("DemolisherSpeedrun", "DemolisherFlyUnlock", null, 3u, null)]
	public class DemolisherSpeedrunAchievement : BaseAchievement
	{
		public override BodyIndex LookUpRequiredBodyIndex()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return Assets.DemolisherBodyIndex;
		}

		public override void OnBodyRequirementMet()
		{
			((BaseAchievement)this).OnBodyRequirementMet();
			Hooks.onGroundHitOnTime = (Action<Collider>)Delegate.Combine(Hooks.onGroundHitOnTime, new Action<Collider>(CheckGround));
		}

		public void CheckGround(Collider collider)
		{
			TeleporterInteraction val = (Object.op_Implicit((Object)(object)((Component)collider).transform.parent) ? ((Component)((Component)collider).transform.parent).GetComponent<TeleporterInteraction>() : null);
			if ((Object)(object)val != (Object)null)
			{
				((BaseAchievement)this).Grant();
			}
		}

		public override void OnBodyRequirementBroken()
		{
			Hooks.onGroundHitOnTime = (Action<Collider>)Delegate.Remove(Hooks.onGroundHitOnTime, new Action<Collider>(CheckGround));
			((BaseAchievement)this).OnBodyRequirementBroken();
		}
	}
	[RegisterAchievement("DemolisherWorldKill", "DemolisherHookLauncherUnlock", null, 3u, typeof(OutOfBoundsBossKillServer))]
	public class DemolisherWorldKillAchievement : BaseAchievement
	{
		public class OutOfBoundsBossKillServer : BaseServerAchievement
		{
			public override void OnInstall()
			{
				((BaseServerAchievement)this).OnInstall();
				GlobalEventManager.onCharacterDeathGlobal += OnCharacterDeath;
			}

			public override void OnUninstall()
			{
				GlobalEventManager.onCharacterDeathGlobal -= OnCharacterDeath;
				((BaseServerAchievement)this).OnUninstall();
			}

			public void OnCharacterDeath(DamageReport damageReport)
			{
				//IL_000c: 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)
				if ((((Enum)damageReport.damageInfo.damageType.damageType).HasFlag((Enum)(object)(DamageType)int.MinValue) || ((Enum)damageReport.damageInfo.damageType.damageTypeExtended).HasFlag((Enum)(object)(DamageTypeExtended)int.MinValue)) && Object.op_Implicit((Object)(object)damageReport.victim))
				{
					CharacterBody body = damageReport.victim.body;
					if (Object.op_Implicit((Object)(object)body) && body.isBoss)
					{
						((BaseServerAchievement)this).Grant();
					}
				}
			}
		}

		public override BodyIndex LookUpRequiredBodyIndex()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return Assets.DemolisherBodyIndex;
		}

		public override void OnBodyRequirementMet()
		{
			((BaseAchievement)this).OnBodyRequirementMet();
			((BaseAchievement)this).SetServerTracked(true);
		}

		public override void OnBodyRequirementBroken()
		{
			((BaseAchievement)this).SetServerTracked(false);
			((BaseAchievement)this).OnBodyRequirementBroken();
		}
	}
	[RegisterAchievement("DemolisherFlyingEnemyKill", "DemolisherSlicingUnlock", null, 3u, typeof(FlyingEnemyKillServer))]
	public class DemolisherFlyingEnemyKillAchievement : BaseAchievement
	{
		public class FlyingEnemyKillServer : BaseServerAchievement
		{
			public int count;

			public override void OnInstall()
			{
				((BaseServerAchievement)this).OnInstall();
				GlobalEventManager.onCharacterDeathGlobal += OnCharacterDeath;
			}

			public override void OnUninstall()
			{
				GlobalEventManager.onCharacterDeathGlobal -= OnCharacterDeath;
				((BaseServerAchievement)this).OnUninstall();
			}

			public void OnCharacterDeath(DamageReport damageReport)
			{
				//IL_005f: 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_0083: Unknown result type (might be due to invalid IL or missing references)
				CharacterBody attackerBody = damageReport.attackerBody;
				if (!Object.op_Implicit((Object)(object)attackerBody) || !Object.op_Implicit((Object)(object)attackerBody.characterMotor) || !attackerBody.characterMotor.isGrounded || !Object.op_Implicit((Object)(object)damageReport.victim) || (!DamageAPI.HasModdedDamageType(damageReport.damageInfo, Assets.SharpnessDamageType) && !DamageAPI.HasModdedDamageType(damageReport.damageInfo, Assets.SoftnessDamageType) && !DamageAPI.HasModdedDamageType(damageReport.damageInfo, Assets.ChaosDamageType)))
				{
					return;
				}
				CharacterBody body = damageReport.victim.body;
				if (Object.op_Implicit((Object)(object)body) && body.isFlying)
				{
					count++;
					if (count >= DemolisherFlyingEnemyKillAchievement.count)
					{
						((BaseServerAchievement)this).Grant();
					}
				}
			}
		}

		public static int count = 350;

		public override BodyIndex LookUpRequiredBodyIndex()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return Assets.DemolisherBodyIndex;
		}

		public override void OnBodyRequirementMet()
		{
			((BaseAchievement)this).OnBodyRequirementMet();
			((BaseAchievement)this).SetServerTracked(true);
		}

		public override void OnBodyRequirementBroken()
		{
			((BaseAchievement)this).SetServerTracked(false);
			((BaseAchievement)this).OnBodyRequirementBroken();
		}
	}
	[RegisterAchievement("DemolisherRangedFarKill", "DemolisherCollapseUnlock", null, 3u, typeof(RangedFarKillServer))]
	public class DemolisherRangedFarKillAchievement : BaseAchievement
	{
		public class RangedFarKillServer : BaseServerAchievement
		{
			public override void OnInstall()
			{
				((BaseServerAchievement)this).OnInstall();
				GlobalEventManager.onCharacterDeathGlobal += OnCharacterDeath;
			}

			public override void OnUninstall()
			{
				GlobalEventManager.onCharacterDeathGlobal -= OnCharacterDeath;
				((BaseServerAchievement)this).OnUninstall();
			}

			public void OnCharacterDeath(DamageReport damageReport)
			{
				//IL_007c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0082: Unknown result type (might be due to invalid IL or missing references)
				//IL_0087: Unknown result type (might be due to invalid IL or missing references)
				//IL_008c: Unknown result type (might be due to invalid IL or missing references)
				if (!Object.op_Implicit((Object)(object)damageReport.attackerBody) || !Object.op_Implicit((Object)(object)damageReport.damageInfo.inflictor) || !Object.op_Implicit((Object)(object)damageReport.victim))
				{
					return;
				}
				CharacterBody body = damageReport.victim.body;
				if (!Object.op_Implicit((Object)(object)body))
				{
					return;
				}
				ProjectileRemoteDetonation component = damageReport.damageInfo.inflictor.GetComponent<ProjectileRemoteDetonation>();
				if (Object.op_Implicit((Object)(object)component))
				{
					Vector3 val = damageReport.attackerBody.footPosition - body.footPosition;
					if (!(((Vector3)(ref val)).sqrMagnitude < requiredDistance * requiredDistance))
					{
						((BaseServerAchievement)this).Grant();
					}
				}
			}
		}

		public static float requiredDistance = 128f;

		public override BodyIndex LookUpRequiredBodyIndex()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return Assets.DemolisherBodyIndex;
		}

		public override void OnBodyRequirementMet()
		{
			((BaseAchievement)this).OnBodyRequirementMet();
			((BaseAchievement)this).SetServerTracked(true);
		}

		public override void OnBodyRequirementBroken()
		{
			((BaseAchievement)this).SetServerTracked(false);
			((BaseAchievement)this).OnBodyRequirementBroken();
		}
	}
	[RegisterAchievement("DemolisherChargeDistance", "DemolisherChaindashUnlock", null, 3u, null)]
	public class DemolisherChargeDistanceAchievement : BaseAchievement
	{
		public static float requiredDistance = 64f;

		public override BodyIndex LookUpRequiredBodyIndex()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return Assets.DemolisherBodyIndex;
		}

		public override void OnBodyRequirementMet()
		{
			((BaseAchievement)this).OnBodyRequirementMet();
			ShieldCharge.onChargeEndGiveSqrTraveledDistance = (Action<float>)Delegate.Combine(ShieldCharge.onChargeEndGiveSqrTraveledDistance, new Action<float>(CheckDistance));
		}

		private void CheckDistance(float obj)
		{
			if (obj >= requiredDistance * requiredDistance)
			{
				((BaseAchievement)this).Grant();
			}
		}

		public override void OnBodyRequirementBroken()
		{
			ShieldCharge.onChargeEndGiveSqrTraveledDistance = (Action<float>)Delegate.Remove(ShieldCharge.onChargeEndGiveSqrTraveledDistance, new Action<float>(CheckDistance));
			((BaseAchievement)this).OnBodyRequirementBroken();
		}
	}
	[RegisterAchievement("DemolisherMastery", "DemolisherMasteryUnlock", null, 3u, null)]
	public class DemolisherMasteryAchievement : BasePerSurvivorClearGameMonsoonAchievement
	{
		public override BodyIndex LookUpRequiredBodyIndex()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return Assets.DemolisherBodyIndex;
		}
	}
	[RegisterAchievement("DemolisherFuelArrayCellWin", "DemolisherFuelArrayCellWinUnlock", null, 3u, null)]
	public class DemolisherFuelArrayCellWinAchievement : BaseAchievement
	{
		public override BodyIndex LookUpRequiredBodyIndex()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return Assets.DemolisherBodyIndex;
		}

		public override void OnBodyRequirementMet()
		{
			((BaseAchievement)this).OnBodyRequirementMet();
			Run.onClientGameOverGlobal += OnClientGameOverGlobal;
		}

		public override void OnBodyRequirementBroken()
		{
			Run.onClientGameOverGlobal -= OnClientGameOverGlobal;
			((BaseAchievement)this).OnBodyRequirementBroken();
		}

		private void OnClientGameOverGlobal(Run run, RunReport runReport)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)runReport.gameEnding) || !runReport.gameEnding.isWin)
			{
				return;
			}
			DifficultyDef difficultyDef = DifficultyCatalog.GetDifficultyDef(runReport.ruleBook.FindDifficulty());
			if (!(runReport.gameEnding.cachedName == "MainEnding") || difficultyDef == null || !difficultyDef.countsAsHardMode)
			{
				return;
			}
			PlayerInfo[] playerInfos = runReport.playerInfos;
			foreach (PlayerInfo val in playerInfos)
			{
				CharacterMaster master = val.master;
				if (!Object.op_Implicit((Object)(object)master) || !((NetworkBehaviour)master).hasAuthority)
				{
					continue;
				}
				Inventory inventory = master.inventory;
				if (!Object.op_Implicit((Object)(object)inventory))
				{
					continue;
				}
				EquipmentState[][] equipmentStateSlots = inventory._equipmentStateSlots;
				foreach (EquipmentState[] array in equipmentStateSlots)
				{
					EquipmentState[] array2 = array;
					foreach (EquipmentState val2 in array2)
					{
						if (val2.equipmentIndex == Equipment.QuestVolatileBattery.equipmentIndex)
						{
							((BaseAchievement)this).Grant();
						}
					}
				}
			}
		}
	}
	public static class Assets
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static Action<GameObject> <0>__ModifyRocketJump;

			public static Action<SkillDef> <1>__AutoSetBonusStockFromBody;

			public static OnRocketJumpApplied <2>__AddFeetSmoke;

			public static OnRocketJumpApplied <3>__HandleDemolisherRocketJump;

			public static OnMasterSummon <4>__SetBodyStateToMain;
		}

		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static CollectContentPackProvidersDelegate <>9__106_0;

			internal void <Init>b__106_0(AddContentPackProviderDelegate addContentPackProvider)
			{
				addContentPackProvider.Invoke((IContentPackProvider)(object)new Content());
			}
		}

		public static AssetBundle assetBundle;

		public static GameObject DemolisherBody;

		public static CharacterBody DemolisherCharacterBody;

		public static GameObject DemolisherMaster;

		public static GameObject DemolisherEmote;

		public static GameObject DemolisherElevator;

		public static SurvivorDef Demolisher;

		public static GameObject FeetEffect;

		public static GameObject DevilFeetEffect;

		public static GameObject TimestopEffect;

		public static GameObject CracksTrailEffect;

		public static GameObject PillarEffect;

		public static GameObject PillarExplosionEffect;

		public static GameObject IamRedAsFuck;

		public static GameObject Crosshair;

		public static Sprite CrosshairRangedSprite;

		public static Sprite CrosshairMeleeSprite;

		public static EffectDef DemolisherTracer;

		public static EffectDef CollapseExplosion;

		public static EffectDef ChainsExplosion;

		public static EffectDef ParryEffect;

		public static EffectDef Explosion;

		public static EffectDef DoubleDonk;

		public static EffectDef Rings;

		public static EffectDef Trail;

		public static EffectDef WhirlwindEffect;

		public static EffectDef SwordSharpnessExplosionEffect;

		public static EffectDef SwordSoftnessExplosionEffect;

		public static EffectDef ShieldChargeEffect;

		public static EffectDef SlashEffect;

		public static EffectDef AuraEffect;

		public static EffectDef LaserEffect;

		public static GameObject LemurianFireBallGhost;

		public static GameObject GrenadeProjectile;

		public static GameObject StickyProjectile;

		public static GameObject HookProjectile;

		public static GameObject SwordPillarProjectile;

		public static GameObject DemolisherProjectile;

		public static GameObject BombProjectile;

		public static SteppedSkillDef MediumMelee;

		public static SkillDef ShieldBash;

		public static SkillDef ChainDash;

		public static UnlockableDef ChainDashUnlock;

		public static DemolisherWeaponSkillDef Sharpness;

		public static DemolisherBulletAttackWeaponDef SharpnessWeapon;

		public static DemolisherWeaponSkillDef Softness;

		public static DemolisherBulletAttackWeaponDef SoftnessWeapon;

		public static DemolisherWeaponSkillDef Chaos;

		public static DemolisherBulletAttackWeaponDef ChaosWeapon;

		public static PassiveItemSkillDef Boots;

		public static DemolisherWeaponSkillDef GrenadeLauncher;

		public static DemolisherProjectileWeaponDef GrenadeWeapon;

		public static DemolisherWeaponSkillDef BombLauncher;

		public static DemolisherProjectileWeaponDef BombWeapon;

		public static DemolisherWeaponSkillDef HookLauncher;

		public static UnlockableDef HookLauncherUnlock;

		public static DemolisherProjectileWeaponDef HookWeapon;

		public static DemolisherWeaponSkillDef StickyLauncher;

		public static DemolisherProjectileWeaponDef StickyWeapon;

		public static DemolisherWeaponSkillDef DemolisherLauncher;

		public static DemolisherProjectileWeaponDef DemolisherWeapon;

		public static SkillDef SwordPillar;

		public static SkillDef Parry;

		public static SkillDef Detonate;

		public static SkillDef Whirlwind;

		public static SkillDef Slicing;

		public static UnlockableDef SlicingUnlock;

		public static SkillDef Collapse;

		public static UnlockableDef CollapseUnlock;

		public static SkillDef Fly;

		public static UnlockableDef FlyUnlock;

		public static SkillDef Laser;

		public static SkillFamily Passive;

		public static SkillFamily MeleeWeapon;

		public static SkillFamily MeleePrimary;

		public static SkillFamily MeleeSecondary;

		public static SkillFamily MeleeUtility;

		public static SkillFamily MeleeSpecial;

		public static SkillFamily RangedPrimary;

		public static SkillFamily RangedSecondary;

		public static SkillFamily RangedUtility;

		public static SkillFamily RangedSpecial;

		public static UnlockableDef MasteryUnlock;

		public static UnlockableDef GrandMasteryUnlock;

		public static SkinDef Default;

		public static SkinDef Nuclear;

		public static BuffDef SharpnessCooldown;

		public static BuffDef SharpnessCritAddition;

		public static BuffDef ChaosCooldown;

		public static BuffDef BombHit;

		public static BuffDef InstantMeleeSwing;

		public static BuffDef IgnoreBoots;

		public static BuffDef DemolisherAirControlFromVelocityAddBuff;

		public static ItemDef BootsPassive;

		public static ModdedDamageType SharpnessDamageType = DamageAPI.ReserveDamageType();

		public static ModdedDamageType SoftnessDamageType = DamageAPI.ReserveDamageType();

		public static ModdedDamageType ChaosDamageType = DamageAPI.ReserveDamageType();

		public static ModdedDamageType BombDamageType = DamageAPI.ReserveDamageType();

		public static RocketJumpDelegateDef AddFeetEffect;

		public static RocketJumpDelegateDef DemolisherRocketJump;

		public static OnMasterSummonDelegateDef SetBodyStateToMainOnSpawn;

		public static SkinSkillVariantsDef skinSkillVariantsDef;

		public static SkinSkillVariantsDef skinNuclearSkillVariantsDef;

		public static PostProcessProfile TimestopPP;

		public static NetworkSoundEventDef ShieldBashSound;

		public static BodyIndex DemolisherBodyIndex;

		public static float rocketJumpForceMovespeedClamp => RocketjumpingConfig.RocketJumpForceMovespeedClamp.Value;

		public static float rocketJumpForceMovespeedDivide => RocketjumpingConfig.RocketJumpForceMovespeedDivide.Value;

		public static float rocketJumpForceJumpClamp => RocketjumpingConfig.RocketJumpForceJumpClamp.Value;

		public static float rocketJumpForceJumpDivide => RocketjumpingConfig.RocketJumpForceJumpDivide.Value;

		public static void Init()
		{
			//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_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_036b: Unknown result type (might be due to invalid IL or missing references)
			//IL_07dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_07e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e6b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e71: Expected I4, but got Unknown
			//IL_0e94: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e9a: Expected I4, but got Unknown
			//IL_0ebd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ec3: Expected I4, but got Unknown
			//IL_0ef7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0efd: Expected I4, but got Unknown
			//IL_0f5e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f63: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f69: Expected O, but got Unknown
			//IL_0f97: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f9c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fa2: Expected O, but got Unknown
			//IL_0fd0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fd5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fdb: Expected O, but got Unknown
			//IL_11a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_11a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_11af: Expected O, but got Unknown
			//IL_04d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d5: Unknown result type (might be due to invalid IL or missing references)
			assetBundle = AssetBundle.LoadFromFileAsync(Path.Combine(Path.GetDirectoryName(DemolisherPlugin.PInfo.Location), "assetbundles", "demolisherassets")).assetBundle;
			SoundBanks.Add(Path.Combine(Path.GetDirectoryName(DemolisherPlugin.PInfo.Location), "soundbanks", "Demoman.bnk"));
			Material[] array = assetBundle.LoadAllAssets<Material>();
			foreach (Material val in array)
			{
				if (((Object)val).name == "matTrapOntop")
				{
					Shader shader = Addressables.LoadAssetAsync<Material>((object)"RoR2/DLC2/Chef/matChef_AlwaysOnTop.mat").WaitForCompletion().shader;
					val.shader = shader;
					val.renderQueue = 4000;
				}
				else
				{
					if (!((Object)val.shader).name.StartsWith("StubbedRoR2"))
					{
						continue;
					}
					string text = ((Object)val.shader).name.Replace("StubbedRoR2", "RoR2") + ".shader";
					Shader val2 = Addressables.LoadAssetAsync<Shader>((object)text).WaitForCompletion();
					if (Object.op_Implicit((Object)(object)val2))
					{
						val.shader = val2;
						if (((Object)val).name == "DemoProjectile")
						{
							val.renderQueue = 4001;
						}
					}
				}
			}
			VoicelineDef[] array2 = assetBundle.LoadAllAssets<VoicelineDef>();
			foreach (VoicelineDef voicelineDef in array2)
			{
				voicelineDef.Register();
			}
			DemolisherBody = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Character/DemolisherBody.prefab").RegisterCharacterBody();
			DemolisherMaster = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Character/DemolisherMonsterMaster.prefab").RegisterCharacterMaster();
			DemolisherElevator = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Elevator/DemolisherElevator.prefab").RegisterNetworkPrefab();
			InstantiatePrefabBehavior component = DemolisherElevator.GetComponent<InstantiatePrefabBehavior>();
			component.prefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/QuestVolatileBattery/QuestVolatileBatteryWorldPickup.prefab").WaitForCompletion();
			DemolisherEmote = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Character/DemolisherEmotes.prefab");
			if (DemolisherPlugin.emotesEnabled)
			{
				ModCompatabilities.EmoteCompatability.Init();
			}
			GenericSkill[] components = DemolisherBody.GetComponents<GenericSkill>();
			GenericSkill[] array3 = components;
			foreach (GenericSkill val3 in array3)
			{
				if (val3.skillName.Contains("Melee"))
				{
					Extensions.SetSection(val3, "Melee");
				}
				if (val3.skillName.Contains("Ranged"))
				{
					Extensions.SetSection(val3, "Ranged");
				}
				if (val3.skillName.Contains("Weapon"))
				{
					val3.loadoutTitleToken = "DEMOLISHER_SKILL_WEAPON";
				}
				if (val3.skillName.Contains("Primary"))
				{
					val3.loadoutTitleToken = "LOADOUT_SKILL_PRIMARY";
				}
				if (val3.skillName.Contains("Secondary"))
				{
					val3.loadoutTitleToken = "LOADOUT_SKILL_SECONDARY";
				}
				if (val3.skillName.Contains("Utility"))
				{
					val3.loadoutTitleToken = "LOADOUT_SKILL_UTILITY";
				}
				if (val3.skillName.Contains("Special"))
				{
					val3.loadoutTitleToken = "LOADOUT_SKILL_SPECIAL";
				}
			}
			DemolisherCharacterBody = DemolisherBody.GetComponent<CharacterBody>();
			CharacterBodyAPI.AddModdedBodyFlag(DemolisherCharacterBody, Assets.SprintAllTime);
			DemolisherCharacterBody.preferredPodPrefab = DemolisherElevator;
			DemolisherCharacterBody._defaultCrosshairPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/Crosshair/SimpleDotCrosshair");
			CharacterMotor component2 = ((Component)DemolisherCharacterBody).GetComponent<CharacterMotor>();
			Extensions.SetBunnyHop(component2, true);
			GameObject gameObject = ((Component)DemolisherBody.GetComponent<ModelLocator>().modelTransform).gameObject;
			gameObject.GetComponent<FootstepHandler>().footstepDustPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/GenericFootstepDust");
			ModelSkinController component3 = gameObject.GetComponent<ModelSkinController>();
			if (Object.op_Implicit((Object)(object)component3))
			{
				SkinDef[] skins = component3.skins;
				foreach (SkinDef val4 in skins)
				{
					SkinDefParams skinDefParams = val4.skinDefParams;
					for (int m = 0; m < skinDefParams.rendererInfos.Length; m++)
					{
						ref RendererInfo reference = ref skinDefParams.rendererInfos[m];
						if (((Object)reference.renderer).name.Contains("Devil"))
						{
							Extensions.SetDontFadeWhenNearCamera(ref reference, true);
						}
						if (Object.op_Implicit((Object)(object)reference.defaultMaterial) && ((Object)reference.defaultMaterial).name.Contains("Addressable"))
						{
							string text2 = ((Object)reference.defaultMaterial).name.Replace("Addressable", "") + ".mat";
							while (text2.Contains("%"))
							{
								text2 = text2.Replace("%", "/");
							}
							Material defaultMaterial = Addressables.LoadAssetAsync<Material>((object)text2).WaitForCompletion();
							reference.defaultMaterial = defaultMaterial;
						}
					}
				}
			}
			Demolisher = assetBundle.LoadAsset<SurvivorDef>("Assets/Demolisher/Character/Demolisher.asset").RegisterSurvivorDef<SurvivorDef>((Action<SurvivorDef>)null);
			Explosion = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherExplosion.prefab").RegisterEffect();
			DoubleDonk = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherDoubleDonk.prefab").RegisterEffect();
			CollapseExplosion = assetBundle.LoadAsset<GameObject>("Assets/Demoman/DemoNukeExplosion.prefab").RegisterEffect();
			ChainsExplosion = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherChainsExplosion.prefab").RegisterEffect();
			ParryEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherParry.prefab").RegisterEffect();
			Rings = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherRings.prefab").RegisterEffect();
			Trail = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherTrailEffect.prefab").RegisterEffect();
			DemolisherTracer = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherTracer.prefab").RegisterEffect();
			WhirlwindEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherWhirlwind.prefab").RegisterEffect();
			SwordSharpnessExplosionEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherSharpnessSwordExplosion.prefab").RegisterEffect();
			SwordSoftnessExplosionEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherSoftnessExplosion.prefab").RegisterEffect();
			ShieldChargeEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherChargeShield.prefab").RegisterEffect();
			SlashEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherSlash.prefab").RegisterEffect();
			LaserEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherLaser.prefab").RegisterEffect();
			AuraEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherAura.prefab").RegisterEffect();
			DemolisherAirControlFromVelocityAddBuff = assetBundle.LoadAsset<BuffDef>("Assets/Demolisher/Buffs/DemolisherAirControlFromVelocityAddBuff.asset").RegisterBuffDef<BuffDef>((Action<BuffDef>)null);
			GrenadeProjectile = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Projectiles/DemolisherGrenadeProjectile.prefab").RegisterProjectile(ModifyRocketJump);
			StickyProjectile = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Projectiles/DemolisherStickyProjectile.prefab").RegisterProjectile(ModifyRocketJump);
			HookProjectile = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Projectiles/DemolisherHookProjectile.prefab").RegisterProjectile();
			SwordPillarProjectile = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Projectiles/DemolisherSwordPillar.prefab").RegisterProjectile();
			DemolisherProjectile = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Projectiles/DemolisherDemolisherProjectile.prefab").RegisterProjectile(ModifyRocketJump);
			BombProjectile = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Projectiles/DemolisherBombProjectile.prefab").RegisterProjectile(ModifyRocketJump);
			LemurianFireBallGhost = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Lemurian/FireballGhost.prefab").WaitForCompletion();
			MediumMelee = assetBundle.LoadAsset<SteppedSkillDef>("Assets/Demolisher/SkillDefs/MeleePrimary/DemolisherMediumMelee.asset").RegisterSkillDef<SteppedSkillDef>((Action<SteppedSkillDef>)null);
			ShieldBash = assetBundle.LoadAsset<SkillDef>("Assets/Demolisher/SkillDefs/MeleeUtility/DemolisherShieldBash.asset").RegisterSkillDef<SkillDef>((Action<SkillDef>)null);
			ChainDash = assetBundle.LoadAsset<SkillDef>("Assets/Demolisher/SkillDefs/MeleeUtility/DemolisherChainDash.asset").RegisterSkillDef<SkillDef>((Action<SkillDef>)null);
			Sharpness = assetBundle.LoadAsset<DemolisherWeaponSkillDef>("Assets/Demolisher/SkillDefs/MeleeWeapon/DemolisherSharpness.asset").RegisterSkillDef();
			Softness = assetBundle.LoadAsset<DemolisherWeaponSkillDef>("Assets/Demolisher/SkillDefs/MeleeWeapon/DemolisherSoftness.asset").RegisterSkillDef();
			Chaos = assetBundle.LoadAsset<DemolisherWeaponSkillDef>("Assets/Demolisher/SkillDefs/MeleeWeapon/DemolisherChaos.asset").RegisterSkillDef();
			Boots = assetBundle.LoadAsset<PassiveItemSkillDef>("Assets/Demolisher/SkillDefs/Passive/DemolisherHellSupport.asset").RegisterSkillDef<PassiveItemSkillDef>((Action<PassiveItemSkillDef>)null);
			GrenadeLauncher = assetBundle.LoadAsset<DemolisherWeaponSkillDef>("Assets/Demolisher/SkillDefs/RangedSecondary/DemolisherGrenadeLauncher.asset").RegisterSkillDef();
			GrenadeLauncher.ModifySkill("Play_grenade_launcher_worldreload", ((SkillDef)GrenadeLauncher).rechargeStock);
			BombLauncher = assetBundle.LoadAsset<DemolisherWeaponSkillDef>("Assets/Demolisher/SkillDefs/RangedSecondary/DemolisherBombLauncher.asset").RegisterSkillDef();
			BombLauncher.ModifySkill("Play_grenade_launcher_worldreload", ((SkillDef)BombLauncher).rechargeStock);
			HookLauncher = assetBundle.LoadAsset<DemolisherWeaponSkillDef>("Assets/Demolisher/SkillDefs/RangedSecondary/DemolisherHookLauncher.asset").RegisterSkillDef();
			HookLauncher.ModifySkill("Play_grenade_launcher_worldreload", ((SkillDef)HookLauncher).rechargeStock);
			SwordPillar = assetBundle.LoadAsset<SkillDef>("Assets/Demolisher/SkillDefs/MeleeSecondary/DemolisherSwordPillar.asset").RegisterSkillDef<SkillDef>((Action<SkillDef>)null);
			Parry = assetBundle.LoadAsset<SkillDef>("Assets/Demolisher/SkillDefs/MeleeSecondary/DemolisherParry.asset").RegisterSkillDef<SkillDef>((Action<SkillDef>)null);
			StickyLauncher = assetBundle.LoadAsset<DemolisherWeaponSkillDef>("Assets/Demolisher/SkillDefs/RangedPrimary/DemolisherStickyLauncher.asset").RegisterSkillDef();
			StickyLauncher.ModifySkill("Play_stickybomblauncher_worldreload", ((SkillDef)StickyLauncher).rechargeStock);
			DemolisherLauncher = assetBundle.LoadAsset<DemolisherWeaponSkillDef>("Assets/Demolisher/SkillDefs/RangedSecondary/DemolisherDemolisherLauncher.asset").RegisterSkillDef();
			DemolisherLauncher.ModifySkill("Play_stickybomblauncher_worldreload", ((SkillDef)DemolisherLauncher).rechargeStock);
			Detonate = assetBundle.LoadAsset<SkillDef>("Assets/Demolisher/SkillDefs/RangedUtility/DemolisherDetonate.asset").RegisterSkillDef<SkillDef>((Action<SkillDef>)null);
			Whirlwind = assetBundle.LoadAsset<SkillDef>("Assets/Demolisher/SkillDefs/MeleeSpecial/DemolisherWhirlwind.asset").RegisterSkillDef<SkillDef>((Action<SkillDef>)AutoSetBonusStockFromBody);
			Slicing = assetBundle.LoadAsset<SkillDef>("Assets/Demolisher/SkillDefs/MeleeSpecial/DemolisherSlicing.asset").RegisterSkillDef<SkillDef>((Action<SkillDef>)null);
			Collapse = assetBundle.LoadAsset<SkillDef>("Assets/Demolisher/SkillDefs/RangedSpecial/DemolisherCollapse.asset").RegisterSkillDef<SkillDef>((Action<SkillDef>)null);
			Fly = assetBundle.LoadAsset<SkillDef>("Assets/Demolisher/SkillDefs/MeleeSpecial/DemolisherFly.asset").RegisterSkillDef<SkillDef>((Action<SkillDef>)null);
			Laser = assetBundle.LoadAsset<SkillDef>("Assets/Demolisher/SkillDefs/RangedSpecial/DemolisherLaser.asset").RegisterSkillDef<SkillDef>((Action<SkillDef>)AutoSetBonusStockFromBody);
			Passive = assetBundle.LoadAsset<SkillFamily>("Assets/Demolisher/SkillFamilies/DemolisherPassive.asset").RegisterSkillFamily<SkillFamily>((Action<SkillFamily>)null);
			MeleeWeapon = assetBundle.LoadAsset<SkillFamily>("Assets/Demolisher/SkillFamilies/DemolisherMeleeWeapon.asset").RegisterSkillFamily<SkillFamily>((Action<SkillFamily>)null);
			MeleePrimary = assetBundle.LoadAsset<SkillFamily>("Assets/Demolisher/SkillFamilies/DemolisherMeleePrimary.asset").RegisterSkillFamily<SkillFamily>((Action<SkillFamily>)null);
			MeleeUtility = assetBundle.LoadAsset<SkillFamily>("Assets/Demolisher/SkillFamilies/DemolisherMeleeUtility.asset").RegisterSkillFamily<SkillFamily>((Action<SkillFamily>)null);
			RangedPrimary = assetBundle.LoadAsset<SkillFamily>("Assets/Demolisher/SkillFamilies/DemolisherRangedPrimary.asset").RegisterSkillFamily<SkillFamily>((Action<SkillFamily>)null);
			RangedUtility = assetBundle.LoadAsset<SkillFamily>("Assets/Demolisher/SkillFamilies/DemolisherRangedUtility.asset").RegisterSkillFamily<SkillFamily>((Action<SkillFamily>)null);
			RangedSecondary = assetBundle.LoadAsset<SkillFamily>("Assets/Demolisher/SkillFamilies/DemolisherRangedSecondary.asset").RegisterSkillFamily<SkillFamily>((Action<SkillFamily>)null);
			MeleeSecondary = assetBundle.LoadAsset<SkillFamily>("Assets/Demolisher/SkillFamilies/DemolisherMeleeSecondary.asset").RegisterSkillFamily<SkillFamily>((Action<SkillFamily>)null);
			RangedSpecial = assetBundle.LoadAsset<SkillFamily>("Assets/Demolisher/SkillFamilies/DemolisherRangedSpecial.asset").RegisterSkillFamily<SkillFamily>((Action<SkillFamily>)null);
			MeleeSpecial = assetBundle.LoadAsset<SkillFamily>("Assets/Demolisher/SkillFamilies/DemolisherMeleeSpecial.asset").RegisterSkillFamily<SkillFamily>((Action<SkillFamily>)null);
			SharpnessCritAddition = assetBundle.LoadAsset<BuffDef>("Assets/Demolisher/Buffs/SharpnessCritAddition.asset").RegisterBuffDef<BuffDef>((Action<BuffDef>)null);
			SharpnessCooldown = assetBundle.LoadAsset<BuffDef>("Assets/Demolisher/Buffs/SharpnessCooldown.asset").RegisterBuffDef<BuffDef>((Action<BuffDef>)null);
			ChaosCooldown = assetBundle.LoadAsset<BuffDef>("Assets/Demolisher/Buffs/ChaosCooldown.asset").RegisterBuffDef<BuffDef>((Action<BuffDef>)null);
			BombHit = assetBundle.LoadAsset<BuffDef>("Assets/Demolisher/Buffs/BombHit.asset").RegisterBuffDef<BuffDef>((Action<BuffDef>)null);
			InstantMeleeSwing = assetBundle.LoadAsset<BuffDef>("Assets/Demolisher/Buffs/InstantMeleeSwing.asset").RegisterBuffDef<BuffDef>((Action<BuffDef>)null);
			IgnoreBoots = assetBundle.LoadAsset<BuffDef>("Assets/Demolisher/Buffs/IgnoreBoots.asset").RegisterBuffDef<BuffDef>((Action<BuffDef>)null);
			BootsPassive = assetBundle.LoadAsset<ItemDef>("Assets/Demolisher/Items/BootsPassive.asset").RegisterItemDef<ItemDef>((Action<ItemDef>)null);
			ChainDashUnlock = assetBundle.LoadAsset<UnlockableDef>("Assets/Demolisher/Unlocks/DemolisherChaindashUnlock.asset").RegisterUnlockableDef<UnlockableDef>((Action<UnlockableDef>)null);
			CollapseUnlock = assetBundle.LoadAsset<UnlockableDef>("Assets/Demolisher/Unlocks/DemolisherCollapseUnlock.asset").RegisterUnlockableDef<UnlockableDef>((Action<UnlockableDef>)null);
			FlyUnlock = assetBundle.LoadAsset<UnlockableDef>("Assets/Demolisher/Unlocks/DemolisherFlyUnlock.asset").RegisterUnlockableDef<UnlockableDef>((Action<UnlockableDef>)null);
			HookLauncherUnlock = assetBundle.LoadAsset<UnlockableDef>("Assets/Demolisher/Unlocks/DemolisherHookLauncherUnlock.asset").RegisterUnlockableDef<UnlockableDef>((Action<UnlockableDef>)null);
			SlicingUnlock = assetBundle.LoadAsset<UnlockableDef>("Assets/Demolisher/Unlocks/DemolisherSlicingUnlock.asset").RegisterUnlockableDef<UnlockableDef>((Action<UnlockableDef>)null);
			MasteryUnlock = assetBundle.LoadAsset<UnlockableDef>("Assets/Demolisher/Unlocks/DemolisherMasteryUnlock.asset").RegisterUnlockableDef<UnlockableDef>((Action<UnlockableDef>)null);
			GrandMasteryUnlock = assetBundle.LoadAsset<UnlockableDef>("Assets/Demolisher/Unlocks/DemolisherFuelArrayCellWinUnlock.asset").RegisterUnlockableDef<UnlockableDef>((Action<UnlockableDef>)null);
			Default = assetBundle.LoadAsset<SkinDef>("Assets/Demolisher/Character/DemolisherDefault.asset");
			Nuclear = assetBundle.LoadAsset<SkinDef>("Assets/Demolisher/Character/DemolisherNuclear.asset");
			TimestopEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherTimestopEffect.prefab");
			skinSkillVariantsDef = assetBundle.LoadAsset<SkinSkillVariantsDef>("Assets/Demolisher/Character/DemolisherDefaultSkillVariants.asset");
			skinSkillVariantsDef.Register();
			skinNuclearSkillVariantsDef = assetBundle.LoadAsset<SkinSkillVariantsDef>("Assets/Demolisher/Character/DemolisherNuclearSkillVariants.asset");
			skinNuclearSkillVariantsDef.Register();
			FeetEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherFeetSmoke.prefab");
			CracksTrailEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherCracks.prefab");
			PillarEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherPillar.prefab");
			PillarExplosionEffect = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/DemolisherPillarExplosion.prefab");
			IamRedAsFuck = assetBundle.LoadAsset<GameObject>("Assets/Demolisher/Effects/IAmRedAsFuck.prefab");
			Crosshair = assetBundle.LoadAsset<GameObject>("Assets/Demoman/DemoExtraCrosshairReworkSimplified.prefab");
			CrosshairMeleeSprite = assetBundle.LoadAsset<Sprite>("Assets/Demoman/UI/DemoSwordIndicatorThinHalf2.png");
			CrosshairRangedSprite = assetBundle.LoadAsset<Sprite>("Assets/Demoman/UI/DemoStickyIndicatorThinHalf2.png");
			CharacterBodyAPI.SetCustomSprintIcon(DemolisherCharacterBody, Parry.icon);
			SharpnessWeapon = Sharpness.RegisterWeapon<DemolisherWeaponSkillDef, DemolisherBulletAttackWeaponDef>(null, null);
			SharpnessWeapon.moddedDamageTypes = (ModdedDamageType[])(object)new ModdedDamageType[1] { (ModdedDamageType)(int)SharpnessDamageType };
			SoftnessWeapon = Softness.RegisterWeapon<DemolisherWeaponSkillDef, DemolisherBulletAttackWeaponDef>(null, null);
			SoftnessWeapon.moddedDamageTypes = (ModdedDamageType[])(object)new ModdedDamageType[1] { (ModdedDamageType)(int)SoftnessDamageType };
			ChaosWeapon = Chaos.RegisterWeapon<DemolisherWeaponSkillDef, DemolisherBulletAttackWeaponDef>(null, null);
			ChaosWeapon.moddedDamageTypes = (ModdedDamageType[])(object)new ModdedDamageType[1] { (ModdedDamageType)(int)ChaosDamageType };
			GrenadeWeapon = GrenadeLauncher.RegisterWeapon<DemolisherWeaponSkillDef, DemolisherProjectileWeaponDef>(null, null);
			BombWeapon = BombLauncher.RegisterWeapon<DemolisherWeaponSkillDef, DemolisherProjectileWeaponDef>(null, null);
			BombWeapon.moddedDamageTypes = (ModdedDamageType[])(object)new ModdedDamageType[1] { (ModdedDamageType)(int)BombDamageType };
			HookWeapon = HookLauncher.RegisterWeapon<DemolisherWeaponSkillDef, DemolisherProjectileWeaponDef>(null, null);
			StickyWeapon = StickyLauncher.RegisterWeapon<DemolisherWeaponSkillDef, DemolisherProjectileWeaponDef>(null, null);
			DemolisherWeapon = DemolisherLauncher.RegisterWeapon<DemolisherWeaponSkillDef, DemolisherProjectileWeaponDef>(null, null);
			AddFeetEffect = assetBundle.LoadAsset<RocketJumpDelegateDef>("Assets/Demolisher/DelegateDefs/AddFeetEffect.asset");
			RocketJumpDelegateDef addFeetEffect = AddFeetEffect;
			object obj = <>O.<2>__AddFeetSmoke;
			if (obj == null)
			{
				OnRocketJumpApplied val5 = DemolisherFeetEffect.AddFeetSmoke;
				<>O.<2>__AddFeetSmoke = val5;
				obj = (object)val5;
			}
			((DelegateDef<OnRocketJumpApplied>)(object)addFeetEffect).@delegate = (OnRocketJumpApplied)obj;
			DemolisherRocketJump = assetBundle.LoadAsset<RocketJumpDelegateDef>("Assets/Demolisher/DelegateDefs/DemolisherRocketJump.asset");
			RocketJumpDelegateDef demolisherRocketJump = DemolisherRocketJump;
			object obj2 = <>O.<3>__HandleDemolisherRocketJump;
			if (obj2 == null)
			{
				OnRocketJumpApplied val6 = HandleDemolisherRocketJump;
				<>O.<3>__HandleDemolisherRocketJump = val6;
				obj2 = (object)val6;
			}
			((DelegateDef<OnRocketJumpApplied>)(object)demolisherRocketJump).@delegate = (OnRocketJumpApplied)obj2;
			SetBodyStateToMainOnSpawn = assetBundle.LoadAsset<OnMasterSummonDelegateDef>("Assets/Demolisher/DelegateDefs/SetBodyStateToMainOnSpawn.asset");
			OnMasterSummonDelegateDef setBodyStateToMainOnSpawn = SetBodyStateToMainOnSpawn;
			object obj3 = <>O.<4>__SetBodyStateToMain;
			if (obj3 == null)
			{
				OnMasterSummon val7 = SetBodyStateToMain;
				<>O.<4>__SetBodyStateToMain = val7;
				obj3 = (object)val7;
			}
			((DelegateDef<OnMasterSummon>)(object)setBodyStateToMainOnSpawn).@delegate = (OnMasterSummon)obj3;
			typeof(DemolisherMainState).RegisterEntityState();
			typeof(FireGrenade).RegisterEntityState();
			typeof(FireGrenadeHold).RegisterEntityState();
			typeof(FireGrenadeAndHold).RegisterEntityState();
			typeof(MediumMeleeAttack).RegisterEntityState();
			typeof(MediumMeleeAttackWindUp).RegisterEntityState();
			typeof(MediumMeleeAttackWindDown).RegisterEntityState();
			typeof(ShieldCharge).RegisterEntityState();
			typeof(Detonate).RegisterEntityState();
			typeof(WhirlwindMelee).RegisterEntityState();
			typeof(Parry).RegisterEntityState();
			typeof(ChargeCollapse).RegisterEntityState();
			typeof(FireCollapse).RegisterEntityState();
			typeof(FireTallSword).RegisterEntityState();
			typeof(PrepareGroundSword).RegisterEntityState();
			typeof(GroundSlash).RegisterEntityState();
			typeof(Slicing).RegisterEntityState();
			typeof(ExitSlicing).RegisterEntityState();
			typeof(Slice).RegisterEntityState();
			typeof(Slam).RegisterEntityState();
			typeof(SlamFire).RegisterEntityState();
			typeof(ChainDash).RegisterEntityState();
			typeof(Fly).RegisterEntityState();
			typeof(Laser).RegisterEntityState();
			typeof(Ascend).RegisterEntityState();
			typeof(Arrived).RegisterEntityState();
			typeof(Open).RegisterEntityState();
			object obj4 = <>c.<>9__106_0;
			if (obj4 == null)
			{
				CollectContentPackProvidersDelegate val8 = delegate(AddContentPackProviderDelegate addContentPackProvider)
				{
					addContentPackProvider.Invoke((IContentPackProvider)(object)new Content());
				};
				<>c.<>9__106_0 = val8;
				obj4 = (object)val8;
			}
			ContentManager.collectContentPackProviders += (CollectContentPackProvidersDelegate)obj4;
			if (DemolisherPlugin.riskOfOptionsEnabled)
			{
				ModCompatabilities.RiskOfOptionsCompatability.Init();
			}
		}

		public static void AutoSetBonusStockFromBody(SkillDef skillDef)
		{
			SkillsAPI.SetBonusStockMultiplier(skillDef, skillDef.rechargeStock);
		}

		public static void AddLemurianProjectileGhost(GameObject projectile)
		{
			ProjectileController component = projectile.GetComponent<ProjectileController>();
			if (Object.op_Implicit((Object)(object)component) && (Object)(object)component.ghostPrefab == (Object)null)
			{
				component.ghostPrefab = LemurianFireBallGhost;
			}
		}

		public static void SetBodyStateToMain(IProjectileMasterSummon projectileMasterSummon, CharacterMaster characterMaster)
		{
			if ((Object)(object)characterMaster == (Object)null)
			{
				return;
			}
			CharacterBody body = characterMaster.GetBody();
			if (!((Object)(object)body == (Object)null))
			{
				EntityStateMachine component = ((Component)body).GetComponent<EntityStateMachine>();
				if (!((Object)(object)component == (Object)null))
				{
					Extensions.SetStateToMain(component);
				}
			}
		}

		public static void ModifyRocketJump(GameObject projectile)
		{
			RocketJumpComponent component = projectile.GetComponent<RocketJumpComponent>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.clientBuffsWhileMidair = new List<BuffDef>(2)
				{
					Assets.UseMaxAirVelocityBuff,
					DemolisherAirControlFromVelocityAddBuff
				};
			}
		}

		public static void HandleDemolisherRocketJump(RocketJumpComponent rocketJumpComponent, CharacterBody characterBody, Vector3 force)
		{
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0206: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: 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_00d9: 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_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: 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_007b: 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)
			CharacterMotor characterMotor = characterBody.characterMotor;
			Rigidbody rigidbody = characterBody.rigidbody;
			if (Object.op_Implicit((Object)(object)characterMotor))
			{
				if (characterMotor.isFlying)
				{
					float magnitude = ((Vector3)(ref characterMotor.velocity)).magnitude;
					float magnitude2 = ((Vector3)(ref force)).magnitude;
					float num = characterBody.moveSpeed * rocketJumpForceMovespeedClamp;
					float num2 = magnitude - magnitude2;
					num2 += Mathf.Lerp(magnitude2, 0f, num2 / num) + magnitude2 * characterBody.moveSpeed / rocketJumpForceMovespeedDivide;
					characterMotor.velocity = Vector3.ClampMagnitude(characterMotor.velocity, num2);
					return;
				}
				float num3 = Mathf.Abs(characterMotor.velocity.y);
				float num4 = characterBody.jumpPower * rocketJumpForceJumpClamp;
				float num5 = num3 - force.y;
				float num6 = Mathf.Lerp(force.y, 0f, num5 / num4);
				num5 += num6 + force.y * characterBody.jumpPower / rocketJumpForceJumpDivide;
				Vector2 val = default(Vector2);
				((Vector2)(ref val))..ctor(force.x, force.z);
				float magnitude3 = ((Vector2)(ref val)).magnitude;
				Vector2 val2 = default(Vector2);
				((Vector2)(ref val2))..ctor(characterMotor.velocity.x, characterMotor.velocity.z);
				float magnitude4 = ((Vector2)(ref val2)).magnitude;
				float num7 = characterBody.moveSpeed * rocketJumpForceMovespeedClamp;
				float num8 = magnitude4 - magnitude3;
				float num9 = Mathf.Lerp(magnitude4, 0f, num8 / num7);
				num8 += num9 + magnitude3 * characterBody.moveSpeed / rocketJumpForceMovespeedDivide;
				val2 = Vector2.ClampMagnitude(val2, num8);
				characterMotor.velocity = new Vector3(val2.x, num5, val2.y);
			}
			else if (Object.op_Implicit((Object)(object)rigidbody))
			{
				Vector3 velocity = rigidbody.velocity;
				float magnitude5 = ((Vector3)(ref velocity)).magnitude;
				float magnitude6 = ((Vector3)(ref force)).magnitude;
				float num10 = characterBody.moveSpeed * rocketJumpForceMovespeedClamp;
				float num11 = magnitude5 - magnitude6;
				num11 += Mathf.Lerp(magnitude6, 0f, num11 / num10) + magnitude6 * characterBody.moveSpeed / rocketJumpForceMovespeedDivide;
				rigidbody.velocity = Vector3.ClampMagnitude(rigidbody.velocity, num11);
			}
		}
	}
	public interface IStateSeeker
	{
		IStateTarget foundState { get; set; }

		Func<bool> onStateFound { get; }

		void FindState(CharacterBody characterBody)
		{
			GenericSkill[] allSkills = characterBody.skillLocator.allSkills;
			foreach (GenericSkill val in allSkills)
			{
				IStateTarget stateTarget = (((Object)(object)val == (Object)null || (Object)(object)val.stateMachine == (Object)null || val.stateMachine.state == null) ? null : (val.stateMachine.state as IStateTarget));
				if (stateTarget != null && !stateTarget.taken)
				{
					foundState = stateTarget;
					if (onStateFound == null || onStateFound())
					{
						foundState.taken = true;
						break;
					}
				}
			}
		}
	}
	public class DemolisherComponent : NetworkBehaviour
	{
		public static float swapSpeed;

		public static float extraCrosshairScale;

		public float test;

		public CharacterBody characterBody;

		public ModelLocator modelLocator;

		public SkillLocator skillLocator;

		public DemolisherModel demolisherModel;

		public GenericSkill meleeWeapon;

		public GenericSkill meleePrimary;

		public GenericSkill meleeSecondary;

		public GenericSkill meleeUtility;

		public GenericSkill meleeSpecial;

		public GenericSkill rangedWeapon;

		public GenericSkill rangedPrimary;

		public GenericSkill rangedSecondary;

		public GenericSkill rangedUtility;

		public GenericSkill rangedSpecial;

		[HideInInspector]
		public GenericSkill holsterPrimary;

		[HideInInspector]
		public GenericSkill holsterSecondary;

		[HideInInspector]
		public GenericSkill holsterUtility;

		[HideInInspector]
		public GenericSkill holsterSpecial;

		[HideInInspector]
		public SkillIcon altPrimarySkillIcon;

		[HideInInspector]
		public SkillIcon altSecondarySkillIcon;

		[HideInInspector]
		public SkillIcon altUtilitySkillIcon;

		[HideInInspector]
		public SkillIcon altSpecialSkillIcon;

		[HideInInspector]
		public ChildLocator childLocator;

		[HideInInspector]
		public Animator animator;

		[HideInInspector]
		public int rangedLayerIndex = -1;

		[HideInInspector]
		public float overrideGeneralMeter = 1f;

		[HideInInspector]
		public float overrideMeleeUtilityMeter = -1f;

		public Action<DemolisherComponent> onSwapped;

		private bool swapping;

		private float swappingVelocity;

		private OverlayController overlayController;

		private static int kRpcRpcSwapWeapons;

		private static int kCmdCmdSwapWeapons;

		public bool isSwapped
		{
			get
			{
				if ((Object)(object)skillLocator == (Object)null)
				{
					return false;
				}
				return (Object)(object)skillLocator.primary == (Object)(object)rangedPrimary;
			}
		}

		public void Awake()
		{
			if (Object.op_Implicit((Object)(object)modelLocator) && Object.op_Implicit((Object)(object)modelLocator.modelTransform))
			{
				animator = ((Component)modelLocator.modelTransform).GetComponent<Animator>();
				childLocator = ((Component)modelLocator.modelTransform).GetComponent<ChildLocator>();
				demolisherModel = ((Component)modelLocator.modelTransform).GetComponent<DemolisherModel>();
				rangedLayerIndex = animator.GetLayerIndex("BodyRanged");
			}
			if (isSwapped)
			{
				holsterPrimary = meleePrimary;
				holsterSecondary = meleeSecondary;
				holsterUtility = meleeUtility;
				holsterSpecial = meleeSpecial;
				if (Object.op_Implicit((Object)(object)demolisherModel))
				{
					demolisherModel.swordInvisibilityCount++;
				}
			}
			else
			{
				holsterPrimary = rangedPrimary;
				holsterSecondary = rangedSecondary;
				holsterUtility = rangedUtility;
				holsterSpecial = rangedSpecial;
				if (Object.op_Implicit((Object)(object)demolisherModel))
				{
					demolisherModel.gunInvisibilityCount++;
				}
			}
		}

		public void OnEnable()
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			OverlayCreationParams val = default(OverlayCreationParams);
			val.prefab = Assets.Crosshair;
			val.childLocatorEntry = "CrosshairExtras";
			OverlayCreationParams val2 = val;
			overlayController = HudOverlayManager.AddOverlay(((Component)this).gameObject, val2);
			overlayController.onInstanceAdded += OnOverlayInstanceAdded;
			overlayController.onInstanceRemove += OnOverlayInstanceRemoved;
		}

		public void OnDisable()
		{
			HudOverlayManager.RemoveOverlay(overlayController);
			overlayController = null;
		}

		private void OnOverlayInstanceRemoved(OverlayController controller, GameObject @object)
		{
		}

		private void OnOverlayInstanceAdded(OverlayController controller, GameObject @object)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			Transform transform = @object.transform;
			((transform is RectTransform) ? transform : null).localScale = new Vector3(0f - extraCrosshairScale, extraCrosshairScale, 1f);
			DemolisherCrosshair demolisherCrosshair = @object.GetComponent<DemolisherCrosshair>();
			HudElement component = @object.GetComponent<HudElement>();
			component.targetBodyObject = ((Component)this).gameObject;
			demolisherCrosshair.demolisherComponent = this;
			onSwapped = (Action<DemolisherComponent>)Delegate.Combine(onSwapped, new Action<DemolisherComponent>(ChangeCrosshairImages));
			ChangeCrosshairImages(this);
			void ChangeCrosshairImages(DemolisherComponent demolisherComponent)
			{
				if (Object.op_Implicit((Object)(object)demolisherComponent) && Object.op_Implicit((Object)(object)demolisherCrosshair))
				{
					Sprite sprite = (isSwapped ? Assets.CrosshairRangedSprite : Assets.CrosshairMeleeSprite);
					Image generalMeter = demolisherCrosshair.generalMeter;
					if (generalMeter != null)
					{
						generalMeter.sprite = sprite;
					}
					Image generalMeterBase = demolisherCrosshair.generalMeterBase;
					if (generalMeterBase != null)
					{
						generalMeterBase.sprite = sprite;
					}
					Image meleeUtilityMeter = demolisherCrosshair.meleeUtilityMeter;
					if (meleeUtilityMeter != null)
					{
						meleeUtilityMeter.sprite = sprite;
					}
					Image meleeUtilityMeterBase = demolisherCrosshair.meleeUtilityMeterBase;
					if (meleeUtilityMeterBase != null)
					{
						meleeUtilityMeterBase.sprite = sprite;
					}
				}
			}
		}

		public void SwapWeapons()
		{
			if (isSwapped)
			{
				if (Object.op_Implicit((Object)(object)skillLocator))
				{
					skillLocator.primary = meleePrimary;
					skillLocator.secondary = meleeSecondary;
					skillLocator.utility = meleeUtility;
					skillLocator.special = meleeSpecial;
				}
				holsterPrimary = rangedPrimary;
				holsterSecondary = rangedSecondary;
				holsterUtility = rangedUtility;
				holsterSpecial = rangedSpecial;
				swapping = false;
				if (Object.op_Implicit((Object)(object)demolisherModel))
				{
					demolisherModel.swordInvisibilityCount--;
					demolisherModel.gunInvisibilityCount++;
				}
				EntityState.PlayAnimationOnAnimator(animator, "Gesture, Override", "RangedToMelee", "Slash.playbackRate", 1f / characterBody.attackSpeed, 0f);
				Util.PlaySound("Play_draw_sword", ((Component)this).gameObject);
			}
			else
			{
				if (Object.op_Implicit((Object)(object)skillLocator))
				{
					skillLocator.primary = rangedPrimary;
					skillLocator.secondary = rangedSecondary;
					skillLocator.utility = rangedUtility;
					skillLocator.special = rangedSpecial;
				}
				holsterPrimary = meleePrimary;
				holsterSecondary = meleeSecondary;
				holsterUtility = meleeUtility;
				holsterSpecial = meleeSpecial;
				if (Object.op_Implicit((Object)(object)demolisherModel))
				{
					demolisherModel.swordInvisibilityCount++;
					demolisherModel.gunInvisibilityCount--;
				}
				swapping = true;
				EntityState.PlayAnimationOnAnimator(animator, "Gesture, Override", "MeleeToRanged", "Slash.playbackRate", 1f / characterBody.attackSpeed, 0f);
				Util.PlaySound("Play_grenade_launcher_worldreload", ((Component)this).gameObject);
			}
			onSwapped?.Invoke(this);
		}

		public void CallSwapWeapons()
		{
			SwapWeapons();
			if (NetworkServer.active)
			{
				CallRpcSwapWeapons();
			}
			else
			{
				CallCmdSwapWeapons();
			}
		}

		[ClientRpc]
		public void RpcSwapWeapons()
		{
			if (!((NetworkBehaviour)this).hasAuthority)
			{
				SwapWeapons();
			}
		}

		[Command]
		public void CmdSwapWeapons()
		{
			CallRpcSwapWeapons();
		}

		public void ToggleWeapon(string name, bool toggle)
		{
			if (!((Object)(object)childLocator == (Object)null))
			{
				Transform val = childLocator.FindChild(name);
				if (!((Object)(object)val == (Object)null))
				{
					((Component)val).gameObject.SetActive(toggle);
				}
			}
		}

		public void Update()
		{
			if (rangedLayerIndex >= 0)
			{
				animator.SetLayerWeight(rangedLayerIndex, Mathf.SmoothDamp(animator.GetLayerWeight(rangedLayerIndex), swapping ? 1f : 0f, ref swappingVelocity, swapSpeed));
			}
		}

		static DemolisherComponent()
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			swapSpeed = 0.1f;
			extraCrosshairScale = 1.5f;
			kCmdCmdSwapWeapons = 790294761;
			NetworkBehaviour.RegisterCommandDelegate(typeof(DemolisherComponent), kCmdCmdSwapWeapons, new CmdDelegate(InvokeCmdCmdSwapWeapons));
			kRpcRpcSwapWeapons = -1008129197;
			NetworkBehaviour.RegisterRpcDelegate(typeof(DemolisherComponent), kRpcRpcSwapWeapons, new CmdDelegate(InvokeRpcRpcSwapWeapons));
			NetworkCRC.RegisterBehaviour("DemolisherComponent", 0);
		}

		private void UNetVersion()
		{
		}

		protected static void InvokeCmdCmdSwapWeapons(NetworkBehaviour obj, NetworkReader reader)
		{
			if (!NetworkServer.active)
			{
				Debug.LogError((object)"Command CmdSwapWeapons called on client.");
			}
			else
			{
				((DemolisherComponent)(object)obj).CmdSwapWeapons();
			}
		}

		public void CallCmdSwapWeapons()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected O, but got Unknown
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkClient.active)
			{
				Debug.LogError((object)"Command function CmdSwapWeapons called on server.");
				return;
			}
			if (((NetworkBehaviour)this).isServer)
			{
				CmdSwapWeapons();
				return;
			}
			NetworkWriter val = new NetworkWriter();
			val.Write((short)0);
			val.Write((short)5);
			val.WritePackedUInt32((uint)kCmdCmdSwapWeapons);
			val.Write(((Component)this).GetComponent<NetworkIdentity>().netId);
			((NetworkBehaviour)this).SendCommandInternal(val, 0, "CmdSwapWeapons");
		}

		protected static void InvokeRpcRpcSwapWeapons(NetworkBehaviour obj, NetworkReader reader)
		{
			if (!NetworkClient.active)
			{
				Debug.LogError((object)"RPC RpcSwapWeapons called on server.");
			}
			else
			{
				((DemolisherComponent)(object)obj).RpcSwapWeapons();
			}
		}

		public void CallRpcSwapWeapons()
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkServer.active)
			{
				Debug.LogError((object)"RPC Function RpcSwapWeapons called on client.");
				return;
			}
			NetworkWriter val = new NetworkWriter();
			val.Write((short)0);
			val.Write((short)2);
			val.WritePackedUInt32((uint)kRpcRpcSwapWeapons);
			val.Write(((Component)this).GetComponent<NetworkIdentity>().netId);
			((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcSwapWeapons");
		}

		public override bool OnSerialize(NetworkWriter writer, bool forceAll)
		{
			bool result = default(bool);
			return result;
		}

		public override void OnDeserialize(NetworkReader reader, bool initialState)
		{
		}
	}
	[RequireComponent(typeof(ProjectileController))]
	public class ProjectileRemoteDetonation : MonoBehaviour
	{
		public string identificator = "Sticky";

		private ProjectileDetonator _projectileDetonator;

		public ProjectileController projectileController;

		public ProjectileExplosion projectileExplosion;

		[HideInInspector]
		public bool detonating;

		public ProjectileDetonator projectileDetonator
		{
			get
			{
				if (Object.op_Implicit((Object)(object)_projectileDetonator))
				{
					return _projectileDetonator;
				}
				_projectileDetonator = (Object.op_Implicit((Object)(object)projectileController.owner) ? Extensions.GetOrAddComponent<ProjectileDetonator>(projectileController.owner) : null);
				return _projectileDetonator;
			}
		}

		public void OnEnable()
		{
			Add();
		}

		public void Add()
		{
			if (Object.op_Implicit((Object)(object)projectileDetonator) && (!projectileDetonator.projectiles.ContainsKey(identificator) || !projectileDetonator.projectiles[identificator].Contains(this)))
			{
				projectileDetonator.AddProjectile(this);
			}
		}

		public void Remove()
		{
			if (Object.op_Implicit((Object)(object)projectileDetonator) && (!projectileDetonator.projectiles.ContainsKey(identificator) || projectileDetonator.projectiles[identificator].Contains(this)))
			{
				projectileDetonator.RemoveProjectile(this);
			}
		}

		public void Start()
		{
			Add();
		}

		public void OnDisable()
		{
			Remove();
		}

		public void Detonate()
		{
			detonating = true;
			if (Object.op_Implicit((Object)(object)projectileExplosion))
			{
				projectileExplosion.Detonate();
			}
			else
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
		}
	}
	public class ProjectileDetonator : NetworkBehaviour, ILifeBehavior
	{
		public Dictionary<string, List<ProjectileRemoteDetonation>> projectiles = new Dictionary<string, List<ProjectileRemoteDetonation>>();

		private static int kCmdCmdDetonateAll;

		public void AddProjectile(ProjectileRemoteDetonation projectileRemoteDetonation)
		{
			if (projectiles.ContainsKey(projectileRemoteDetonation.identificator))
			{
				projectiles[projectileRemoteDetonation.identificator].Add(projectileRemoteDetonation);
				return;
			}
			projectiles.Add(projectileRemoteDetonation.identificator, new List<ProjectileRemoteDetonation> { projectileRemoteDetonation });
		}

		public void RemoveProjectile(ProjectileRemoteDetonation projectileRemoteDetonation)
		{
			List<ProjectileRemoteDetonation> list = (projectiles.ContainsKey(projectileRemoteDetonation.identificator) ? projectiles[projectileRemoteDetonation.identificator] : null);
			if (list != null && list.Contains(projectileRemoteDetonation))
			{
				list.Remove(projectileRemoteDetonation);
			}
		}

		public void DetonateAll()
		{
			foreach (string key in projectiles.Keys)
			{
				DetonateAll(key);
			}
		}

		[Command]
		public void CmdDetonateAll(string identificator)
		{
			ServerDetonateAll(identificator);
		}

		public void ServerDetonateAll(string identificator)
		{
			if (!projectiles.ContainsKey(identificator))
			{
				return;
			}
			List<ProjectileRemoteDetonation> list = projectiles[identificator];
			int num = 0;
			do
			{
				num = 0;
				for (int i = 0; i < list.Count; i++)
				{
					ProjectileRemoteDetonation projectileRemoteDetonation = list[i];
					if (Object.op_Implicit((Object)(object)projectileRemoteDetonation) && !projectileRemoteDetonation.detonating)
					{
						projectileRemoteDetonation.Detonate();
						num++;
					}
				}
			}
			while (num > 0);
		}

		public void DetonateAll(string identificator)
		{
			if (NetworkServer.active)
			{
				ServerDetonateAll(identificator);
			}
			else
			{
				CallCmdDetonateAll(identificator);
			}
		}

		public void OnDeathStart()
		{
			if (NetworkServer.active)
			{
				DetonateAll();
			}
		}

		private void UNetVersion()
		{
		}

		protected static void InvokeCmdCmdDetonateAll(NetworkBehaviour obj, NetworkReader reader)
		{
			if (!NetworkServer.active)
			{
				Debug.LogError((object)"Command CmdDetonateAll called on client.");
			}
			else
			{
				((ProjectileDetonator)(object)obj).CmdDetonateAll(reader.ReadString());
			}
		}

		public void CallCmdDetonateAll(string identificator)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkClient.active)
			{
				Debug.LogError((object)"Command function CmdDetonateAll called on server.");
				return;
			}
			if (((NetworkBehaviour)this).isServer)
			{
				CmdDetonateAll(identificator);
				return;
			}
			NetworkWriter val = new NetworkWriter();
			val.Write((short)0);
			val.Write((short)5);
			val.WritePackedUInt32((uint)kCmdCmdDetonateAll);
			val.Write(((Component)this).GetComponent<NetworkIdentity>().netId);
			val.Write(identificator);
			((NetworkBehaviour)this).SendCommandInternal(val, 0, "CmdDetonateAll");
		}

		static ProjectileDetonator()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			kCmdCmdDetonateAll = -1758859230;
			NetworkBehaviour.RegisterCommandDelegate(typeof(ProjectileDetonator), kCmdCmdDetonateAll, new CmdDelegate(InvokeCmdCmdDetonateAll));
			NetworkCRC.RegisterBehaviour("ProjectileDetonator", 0);
		}

		public override bool OnSerialize(NetworkWriter writer, bool forceAll)
		{
			bool result = default(bool);
			return result;
		}

		public override void OnDeserialize(NetworkReader reader, bool initialState)
		{
		}
	}
	[RequireComponent(typeof(ProjectileDamage))]
	[RequireComponent(typeof(ProjectileController))]
	public class ProjectileBulletAttack : MonoBehaviour
	{
		public ProjectileController projectileController;

		public ProjectileDamage projectileDamage;

		public string exitSound;

		public LoopSoundDef loopSoundDef;

		public Vector3 aimVector = Vector3.up;

		public bool localRotation = false;

		public bool allowTrajectoryAimAssist = false;

		public int bulletCount = 1;

		public bool cheapMultiBullet = false;

		public FalloffModel falloffModel = (FalloffModel)0;

		public float minSpread = 0f;

		public float maxSpread = 0f;

		public float spreadYawScale = 1f;

		public float spreadPitchScale = 1f;

		public float multiBulletOdds = 0f;

		public float radius = 1f;

		public float maxDistance = 1f;

		public float procCoefficient = 1f;

		public float effectCoefficient = 1f;

		public bool sniper = false;

		public bool smartCollision = true;

		public float trajectoryAimAssistMultiplier = 0f;

		public GameObject hitEffectPrefab;

		public GameObject tracerEffectPrefab;

		public LayerMask hitMask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask;

		public LayerMask stopperMask = ((LayerIndex)(ref LayerIndex.noCollision)).mask;

		public float fireInterval = 0f;

		[HideInInspector]
		public float fireStopwatch = 0f;

		public float updateInterval = 1f;

		[HideInInspector]
		public float updateStopwatch = 0f;

		public float resetInterval = 1f;

		[HideInInspector]
		public float resetStopwatch = 0f;

		public DemolisherBulletAttack bulletAttack;

		private Vector3 previousPosition;

		public virtual void Awake()
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: 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)
			if ((Object)(object)projectileDamage == (Object)null)
			{
				projectileDamage = ((Component)this).GetComponent<ProjectileDamage>();
			}
			if ((Object)(object)projectileController == (Object)null)
			{
				projectileController = ((Component)this).GetComponent<ProjectileController>();
			}
			DemolisherBulletAttack demolisherBulletAttack = new DemolisherBulletAttack();
			((BulletAttack)demolisherBulletAttack).aimVector = aimVector;
			((BulletAttack)demolisherBulletAttack).allowTrajectoryAimAssist = allowTrajectoryAimAssist;
			((BulletAttack)demolisherBulletAttack).bulletCount = (uint)bulletCount;
			((BulletAttack)demolisherBulletAttack).damage = projectileDamage.damage;
			((BulletAttack)demolisherBulletAttack).damageColorIndex = projectileDamage.damageColorIndex;
			((BulletAttack)demolisherBulletAttack).damageType = projectileDamage.damageType;
			((BulletAttack)demolisherBulletAttack).falloffModel = falloffModel;
			((BulletAttack)demolisherBulletAttack).force = projectileDamage.force;
			((BulletAttack)demolisherBulletAttack).isCrit = projectileDamage.crit;
			((BulletAttack)demolisherBulletAttack).maxSpread = maxSpread;
			((BulletAttack)demolisherBulletAttack).minSpread = minSpread;
			((BulletAttack)demolisherBulletAttack).origin = ((Component)this).transform.position;
			((BulletAttack)demolisherBulletAttack).owner = projectileController.owner;
			((BulletAttack)demolisherBulletAttack).radius = radius;
			((BulletAttack)demolisherBulletAttack).maxDistance = maxDistance;
			((BulletAttack)demolisherBulletAttack).procCoefficient = procCoefficient;
			((BulletAttack)demolisherBulletAttack).sniper = sniper;
			((BulletAttack)demolisherBulletAttack).smartCollision = smartCollision;
			((BulletAttack)demolisherBulletAttack).weapon = ((Component)this).gameObject;
			((BulletAttack)demolisherBulletAttack).trajectoryAimAssistMultiplier = trajectoryAimAssistMultiplier;
			((BulletAttack)demolisherBulletAttack).spreadYawScale = spreadYawScale;
			((BulletAttack)demolisherBulletAttack).spreadPitchScale = spreadPitchScale;
			((BulletAttack)demolisherBulletAttack).hitEffectPrefab = hitEffectPrefab;
			((BulletAttack)demolisherBulletAttack).tracerEffectPrefab = tracerEffectPrefab;
			((BulletAttack)demolisherBulletAttack).hitMask = hitMask;
			((BulletAttack)demolisherBulletAttack).stopperMask = stopperMask;
			demolisherBulletAttack.effectCoefficient = effectCoefficient;
			bulletAttack = demolisherBulletAttack;
			Extensions.SetIgnoreHitTargets((BulletAttack)(object)bulletAttack, true);
		}

		public virtual void Start()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			previousPosition = ((Component)this).transform.position;
			if (Object.op_Implicit((Object)(object)loopSoundDef))
			{
				Util.PlaySound(loopSoundDef.startSoundName, ((Component)this).gameObject);
			}
		}

		public virtual void UpdateBulletAttack()
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_013e: 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_01c2: 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_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			((BulletAttack)bulletAttack).allowTrajectoryAimAssist = allowTrajectoryAimAssist;
			((BulletAttack)bulletAttack).bulletCount = (uint)bulletCount;
			((BulletAttack)bulletAttack).falloffModel = falloffModel;
			((BulletAttack)bulletAttack).maxSpread = maxSpread;
			((BulletAttack)bulletAttack).minSpread = minSpread;
			((BulletAttack)bulletAttack).sniper = sniper;
			((BulletAttack)bulletAttack).smartCollision = smartCollision;
			((BulletAttack)bulletAttack).trajectoryAimAssistMultiplier = trajectoryAimAssistMultiplier;
			((BulletAttack)bulletAttack).spreadPitchScale = spreadPitchScale;
			((BulletAttack)bulletAttack).spreadYawScale = spreadYawScale;
			((BulletAttack)bulletAttack).procCoefficient = procCoefficient;
			((BulletAttack)bulletAttack).procCoefficient = effectCoefficient;
			((BulletAttack)bulletAttack).radius = radius;
			((BulletAttack)bulletAttack).maxDistance = maxDistance;
			((BulletAttack)bulletAttack).origin = ((Component)this).transform.position;
			((BulletAttack)bulletAttack).damage = projectileDamage.damage;
			((BulletAttack)bulletAttack).damageColorIndex = projectileDamage.damageColorIndex;
			((BulletAttack)bulletAttack).damageType = projectileDamage.damageType;
			((BulletAttack)bulletAttack).force = projectileDamage.force;
			((BulletAttack)bulletAttack).isCrit = projectileDamage.crit;
			((BulletAttack)bulletAttack).owner = projectileController.owner;
			if (localRotation)
			{
				((BulletAttack)bulletAttack).aimVector = ((Component)this).transform.rotation * aimVector;
			}
			else
			{
				((BulletAttack)bulletAttack).aimVector = aimVector;
			}
			updateStopwatch = 0f;
		}

		public virtual void FireBulletAttack()
		{
			if (NetworkServer.active)
			{
				((BulletAttack)bulletAttack).Fire();
			}
			fireStopwatch = 0f;
		}

		public virtual void Reset()
		{
			Extensions.ResetIgnoredHealthComponents((BulletAttack)(object)bulletAttack);
			resetStopwatch = 0f;
		}

		public virtual void IncrementTimers(float deltaTime)
		{
			resetStopwatch += deltaTime;
			fireStopwatch += deltaTime;
			updateStopwatch += deltaTime;
		}

		public virtual void OnDestroy()
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)loopSoundDef))
			{
				Util.PlaySound(loopSoundDef.stopSoundName, ((Component)this).gameObject);
			}
			if (!string.IsNullOrEmpty(exitSound))
			{
				PointSoundManager.EmitSoundLocal((AkEventIdArg)exitSound, previousPosition);
			}
		}

		public virtual void FixedUpdate()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			previousPosition = ((Component)this).transform.position;
			IncrementTimers(Time.fixedDeltaTime);
			if (updateStopwatch >= updateInterval)
			{
				UpdateBulletAttack();
			}
			if (fireStopwatch >= fireInterval)
			{
				FireBulletAttack();
			}
			if (resetStopwatch >= resetInterval)
			{
				Reset();
			}
		}
	}
	[RequireComponent(typeof(CharacterController))]
	public class DemolisherSwordPillarProjectile : ProjectileBulletAttack
	{
		public CharacterController characterController;

		public DemolisherSwordPillarBodyMover demolisherSwordPillarBodyMover;

		public float lifetime = 1f;

		public float gravity = 3f;

		public AnimationCurve velocityOverLifetime = AnimationCurve.Constant(0f, 1f, 100f);

		public float steering = 90f;

		[HideInInspector]
		public float timer;

		[HideInInspector]
		public DemolisherBulletAttackWeaponDef meleeWeapon;

		[HideInInspector]
		public FireTallSword fireTallSword;

		[HideInInspector]
		public InputBankTest inputBank;

		private bool modified;

		private Stack<Vector3> moveVectors = new Stack<Vector3>();

		private int count;

		private bool reversed;

		private float attackSpeed;

		public override void Awake()
		{
			base.Awake();
			if ((Object)(object)characterController == (Object)null)
			{
				characterController = ((Component)this).GetComponent<CharacterController>();
			}
		}

		public override void Start()
		{
			//IL_000e: 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_002e: Unknown result type (might be due to invalid IL or missing references)
			base.Start();
			Vector3 forward = ((Component)this).transform.forward;
			forward.y = 0f;
			((Vector3)(ref forward)).Normalize();
			((Component)this).transform.forward = forward;
			if ((Object)(object)projectileController == (Object)null || (Object)(object)projectileController.owner == (Object)null)
			{
				return;
			}
			CharacterBody component = projectileController.owner.GetComponent<CharacterBody>();
			if (!Object.op_Implicit((Object)(object)component) || !Object.op_Implicit((Object)(object)component.skillLocator))
			{
				return;
			}
			GenericSkill[] allSkills = component.skillLocator.allSkills;
			foreach (GenericSkill val in allSkills)
			{
				fireTallSword = (((Object)(object)val == (Object)null || (Object)(object)val.stateMachine == (Object)null || val.stateMachine.state == null || !(val.stateMachine.state is FireTallSword)) ? null : (val.stateMachine.state as FireTallSword));
				if (fireTallSword == null || fireTallSword.stateTaken)
				{
					continue;
				}
				attackSpeed = ((BaseState)fireTallSword).attackSpeedStat;
				if (Object.op_Implicit((Object)(object)fireTallSword.currentMeleeWeaponDef))
				{
					attackSpeed *= fireTallSword.currentMeleeWeaponDef.attackSpeedMultiplier;
				}
				meleeWeapon = fireTallSword.currentMeleeWeaponDef;
				if (Object.op_Implicit((Object)(object)demolisherSwordPillarBodyMover) && Object.op_Implicit((Object)(object)demolisherSwordPillarBodyMover.vehicleSeat) && ((EntityState)fireTallSword).isAuthority && Object.op_Implicit((Object)(object)((EntityState)fireTallSword).characterBody) && Object.op_Implicit((Object)(object)((EntityState)fireTallSword).inputBank) && ((EntityState)fireTallSword).inputBank.skill1.down)
				{
					if (NetworkServer.active)
					{
						demolisherSwordPillarBodyMover.vehicleSeat.SetPassenger(((EntityState)fireTallSword).gameObject);
					}
					else
					{
						NetMessageExtensions.Send((INetMessage)(object)new VehicleSeatSetPassengerAuthority(((NetworkBehaviour)demolisherSwordPillarBodyMover.vehicleSeat).netIdentity, ((EntityState)fireTallSword).characterBody.networkIdentity), (NetworkDestination)2);
					}
				}
				if (Object.op_Implicit((Object)(object)meleeWeapon))
				{
					fireTallSword.stateTaken = true;
					inputBank = ((EntityState)fireTallSword).inputBank;
					OneTimeMeleeModification(meleeWeapon);
					break;
				}
			}
		}

		public void OnEnable()
		{
			GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
		}

		private void GlobalEventManager_onServerDamageDealt(DamageReport obj)
		{
			//IL_0084: 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)
			if (Object.op_Implicit((Object)(object)demolisherSwordPillarBodyMover) && obj.damageInfo != null && Object.op_Implicit((Object)(object)obj.victimBody) && Object.op_Implicit((Object)(object)obj.damageInfo.inflictor) && (Object)(object)obj.damageInfo.inflictor == (Object)(object)((Component)this).gameObject && !demolisherSwordPillarBodyMover.hitCharacterBodies.Contains(obj.victimBody))
			{
				demolisherSwordPillarBodyMover.AddHitBody(obj.victimBody, obj.victimBody.transform.position - ((Component)this).transform.position);
			}
		}

		public void OnDisable()
		{
			GlobalEventManager.onServerDamageDealt -= GlobalEventManager_onServerDamageDealt;
		}

		public void OneTimeMeleeModification(DemolisherBulletAttackWeaponDef demolisherBulletAttackWeaponDef)
		{
			object attack = this;
			demolisherBulletAttackWeaponDef.OneTimeModification(this, ref attack);
		}

		public override void UpdateBulletAttack()
		{
			base.UpdateBulletAttack();
			object attack = bulletAttack;
			if ((Object)(object)meleeWeapon != (Object)null)
			{
				meleeWeapon.ModifyAttack(this, ref attack);
			}
		}

		public override void IncrementTimers(float deltaTime)
		{
			base.IncrementTimers(deltaTime);
			timer += deltaTime;
		}

		public override void FixedUpdate()
		{
			//IL_0021: 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_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			//IL_0119: 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)
			base.FixedUpdate();
			if (NetworkServer.active)
			{
				((Component)this).transform.forward = Vector3.RotateTowards(((Component)this).transform.forward, Direction(), steering / 57.3f, 0f);
				if (!reversed && timer >= lifetime / attackSpeed / 2f)
				{
					Reverse();
				}
				Vector3 val;
				if (reversed)
				{
					val = ((moveVectors.Count > 0) ? moveVectors.Pop() : ((Component)this).transform.position);
				}
				else
				{
					float num = velocityOverLifetime.Evaluate(timer / attackSpeed) * attackSpeed;
					val = (((Component)this).transform.forward * num + Physics.gravity * gravity) * Time.fixedDeltaTime;
				}
				if (reversed)
				{
					((Component)this).transform.position = val;
				}
				else
				{
					characterController.Move(val);
					AddPath();
				}
				if (timer >= lifetime / attackSpeed)
				{
					Object.Destroy((Object)(object)((Component)this).gameObject);
				}
			}
		}

		public void AddPath()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			Vector3 position = ((Component)this).transform.position;
			moveVectors.Push(position);
		}

		public void Reverse()
		{
			reversed = true;
			((Component)this).gameObject.layer = LayerIndex.noCollision.intVal;
		}

		public Vector3 Direction()
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)inputBank))
			{
				Vector3 aimDirection = inputBank.aimDirection;
				aimDirection.y = 0f;
				((Vector3)(ref aimDirection)).Normalize();
				return aimDirection;
			}
			return ((Component)this).transform.forward;
		}

		public static Vector3 NearestPointOnLine(Vector3 linePnt, Vector3 lineDir, Vector3 pnt)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: 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_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			((Vector3)(ref lineDir)).Normalize();
			Vector3 val = pnt - linePnt;
			float num = Vector3.Dot(val, lineDir);
			return linePnt + lineDir * num;
		}
	}
	public class DemolisherSwordPillarBodyMover : NetworkBehaviour
	{
		public struct HitBody
		{
			public Vector3 relativePosition;

			public CharacterBody characterBody;

			public EntityStateMachine[] entityStateMachines;
		}

		public VehicleSeat vehicleSeat;

		public Stack<HitBody> hitBodies = new Stack<HitBody>();

		public Stack<CharacterBody> hitCharacterBodies = new Stack<CharacterBody>();

		private static int kRpcRpcAddHitBody;

		[Server]
		public void AddHitBody(CharacterBody characterBody, Vector3 vector3)
		{
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkServer.active)
			{
				Debug.LogWarning((object)"[Server] function 'System.Void Demolisher.DemolisherSwordPillarBodyMover::AddHitBody(RoR2.CharacterBody,UnityEngine.Vector3)' called on client");
				return;
			}
			if (Object.op_Implicit((Object)(object)characterBody.currentVehicle) && NetworkServer.active)
			{
				characterBody.currentVehicle.EjectPassenger();
			}
			if (characterBody.hasEffectiveAuthority)
			{
				FinalAddHitBody(characterBody, vector3);
			}
			else
			{
				CallRpcAddHitBody(characterBody.networkIdentity, vector3);
			}
		}

		[ClientRpc]
		public void RpcAddHitBody(NetworkIdentity networkIdentity, Vector3 vector3)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)networkIdentity) && Util.HasEffectiveAuthority(networkIdentity))
			{
				CharacterBody component = ((Component)networkIdentity).gameObject.GetComponent<CharacterBody>();
				if (Object.op_Implicit((Object)(object)component))
				{
					FinalAddHitBody(component, vector3);
				}
			}
		}

		public void FinalAddHitBody(CharacterBody characterBody, Vector3 vector3)
		{
			//IL_0013: 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_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Expected O, but got Unknown
			HitBody hitBody = default(HitBody);
			hitBody.characterBody = characterBody;
			hitBody.relativePosition = vector3;
			hitBody.entityStateMachines = ((Component)characterBody).gameObject.GetComponents<EntityStateMachine>();
			HitBody hitBody2 = hitBody;
			hitBodies.Push(hitBody2);
			hitCharacterBodies.Push(characterBody);
			if (hitBody2.entityStateMachines != null)
			{
				EntityStateMachine[] entityStateMachines = hitBody2.entityStateMachines;
				foreach (EntityStateMachine val in entityStateMachines)
				{
					if (val != null)
					{
						val.SetNextState((EntityState)new Idle());
					}
				}
			}
			HandleHitBody(hitBody2);
		}

		public void HandleHitBody(HitBody hitBody)
		{
			//IL_002b: 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_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody characterBody = hitBody.characterBody;
			if (Object.op_Implicit((Object)(object)characterBody) && characterBody.hasEffectiveAuthority)
			{
				Vector3 val = ((Component)this).transform.position + hitBody.relativePosition;
				if (Object.op_Implicit((Object)(object)characterBody.characterMotor))
				{
					((BaseCharacterController)characterBody.characterMotor).Motor.SetPosition(val, true);
					characterBody.characterMotor.velocity = Vector3.zero;
				}
				else if (Object.op_Implicit((Object)(object)characterBody.rigidbody))
				{
					characterBody.rigidbody.position = val;
					characterBody.rigidbody.velocity = Vector3.zero;
				}
				else
				{
					characterBody.transform.position = val;
				}
			}
		}

		public void OnEnable()
		{
			if (Object.op_Implicit((Object)(object)vehicleSeat))
			{
				vehicleSeat.onPassengerEnter += VehicleSeat_onPassengerEnter;
			}
		}

		public void OnDestroy()
		{
			foreach (HitBody hitBody in hitBodies)
			{
				if (!Object.op_Implicit((Object)(object)hitBody.characterBody) || !Object.op_Implicit((Object)(object)hitBody.characterBody.healthComponent) || !hitBody.characterBody.healthComponent.alive || hitBody.entityStateMachines == null)
				{
					continue;
				}
				EntityStateMachine[] entityStateMachines = hitBody.entityStateMachines;
				foreach (EntityStateMachine val in entityStateMachines)
				{
					if (val != null)
					{
						val.SetNextStateToMain();
					}
				}
			}
		}

		private void VehicleSeat_onPassengerEnter(GameObject obj)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)obj))
			{
				return;
			}
			CharacterBody component = obj.GetComponent<CharacterBody>();
			if (Object.op_Implicit((Object)(object)component))
			{
				Vector3 localPosition = component.corePosition - component.footPosition;
				if (Object.op_Implicit((Object)(object)vehicleSeat.exitPosition))
				{
					vehicleSeat.exitPosition.localPosition = localPosition;
				}
				if (Object.op_Implicit((Object)(object)vehicleSeat.seatPosition))
				{
					vehicleSeat.seatPosition.localPosition = localPosition;
				}
			}
		}

		public void FixedUpdate()
		{
			foreach (HitBody hitBody in hitBodies)
			{
				HandleHitBody(hitBody);
			}
		}

		public void OnDisable()
		{
			if (Object.op_Implicit((Object)(object)vehicleSeat))
			{
				vehicleSeat.onPassengerEnter -= VehicleSeat_onPassengerEnter;
			}
		}

		private void UNetVersion()
		{
		}

		protected static void InvokeRpcRpcAddHitBody(NetworkBehaviour obj, NetworkReader reader)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkClient.active)
			{
				Debug.LogError((object)"RPC RpcAddHitBody called on server.");
			}
			else
			{
				((DemolisherSwordPillarBodyMover)(object)obj).RpcAddHitBody(reader.ReadNetworkIdentity(), reader.ReadVector3());
			}
		}

		public void CallRpcAddHitBody(NetworkIdentity networkIdentity, Vector3 vector3)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkServer.active)
			{
				Debug.LogError((object)"RPC Function RpcAddHitBody called on client.");
				return;
			}
			NetworkWriter val = new NetworkWriter();
			val.Write((short)0);
			val.Write((short)2);
			val.WritePackedUInt32((uint)kRpcRpcAddHitBody);
			val.Write(((Component)this).GetComponent<NetworkIdentity>().netId);
			val.Write(networkIdentity);
			val.Write(vector3);
			((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcAddHitBody");
		}

		static DemolisherSwordPillarBodyMover()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			kRpcRpcAddHitBody = 1977598276;
			NetworkBehaviour.RegisterRpcDelegate(typeof(DemolisherSwordPillarBodyMover), kRpcRpcAddHitBody, new CmdDelegate(InvokeRpcRpcAddHitBody));
			NetworkCRC.RegisterBehaviour("DemolisherSwordPillarBodyMover", 0);
		}

		public override bool OnSerialize(NetworkWriter writer, bool forceAll)
		{
			bool result = default(bool);
			return result;
		}

		public override void OnDeserialize(NetworkReader reader, bool initialState)
		{
		}
	}
	public class DemolisherSwordPillarGhost : MonoBehaviour
	{
		public Transform swordPillarTransform;

		public ProjectileGhostController projectileGhostController;

		private DemolisherSwordPillarProjectile _demolisherSwordPillarProjectile;

		public GameObject expirationEffectPrefab;

		public DemolisherSwordPillarProjectile demolisherSwordPillarProjectile
		{
			get
			{
				if ((Object)(object)_demolisherSwordPillarProjectile == (Object)null)
				{
					_demolisherSwordPillarProjectile = ((Object.op_Implicit((Object)(object)projectileGhostController) && Object.op_Implicit((Object)(object)projectileGhostController.authorityTransform)) ? ((Component)projectileGhostController.authorityTransform).gameObject.GetComponent<DemolisherSwordPillarProjectile>() : null);
				}
				return _demolisherSwordPillarProjectile;
			}
		}

		public void Awake()
		{
			if (Object.op_Implicit((Object)(object)swordPillarTransform))
			{
				swordPillarTransform.SetParent((Transform)null, true);
			}
		}

		public void OnEnable()
		{
			if (Object.op_Implicit((Object)(object)swordPillarTransform))
			{
				((Component)swordPillarTransform).gameObject.SetActive(true);
			}
		}

		public void LateUpdate()
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: 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)
			if (!((Object)(object)demolisherSwordPillarProjectile == (Object)null) && !((Object)(object)swordPillarTransform == (Object)null))
			{
				BulletAttack bulletAttack = (BulletAttack)(object)demolisherSwordPillarProjectile.bulletAttack;
				swordPillarTransform.position = ((Component)this).transform.position;
				Vector3 forward = ((Component)this).transform.forward;
				forward.y = 0f;
				((Vector3)(ref forward)).Normalize();
				swordPillarTransform.rotation = Util.QuaternionSafeLookRotation(forward, bulletAttack.aimVector);
				float radius = bulletAttack.radius;
				swordPillarTransform.localScale = new Vector3(radius, bulletAttack.maxDistance, radius);
			}
		}

		public void OnDisable()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Expected O, but got Unknown
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)swordPillarTransform))
			{
				if (Object.op_Implicit((Object)(object)expirationEffectPrefab))
				{
					EffectData val = new EffectData
					{
						origin = ((Component)this).transform.position,
						rotation = swordPillarTransform.rotation
					};
					Extensions.SetScale(val, (Vector3?)swordPillarTransform.localScale);
					EffectManager.SpawnEffect(expirationEffectPrefab, val, false);
				}
				((Component)swordPillarTransform).gameObject.SetActive(false);
			}
		}

		public void OnDestroy()
		{
			if (Object.op_Implicit((Object)(object)swordPillarTransform))
			{
				Object.Destroy((Object)(object)((Component)swordPillarTransform).gameObject);
			}
		}
	}
	public class DemolisherSlash : MonoBehaviour
	{
		public EffectComponent effectComponent;

		public ParticleSystem[] swipeParticles;

		public void Start()
		{
			if (Object.op_Implicit((Object)(object)effectComponent) && effectComponent.effectData != null)
			{
				Init(effectComponent.effectData.genericFloat);
			}
		}

		public void Init(float speed)
		{
			ParticleSystem[] array = swipeParticles;
			foreach (ParticleSystem val in array)
			{
				val.playbackSpeed = speed;
			}
		}
	}
	public class DemolisherWhirlwind : MonoBehaviour
	{
		public EffectComponent effectComponent;

		public ParticleSystem[] particles;

		public void Start()
		{
			if (Object.op_Implicit((Object)(object)effectComponent) && effectComponent.effectData != null)
			{
				float playbackSpeed = 1f / effectComponent.effectData.genericFloat;
				ParticleSystem[] array = particles;
				foreach (ParticleSystem val in array)
				{