Decompiled source of TF2SoldierMod v1.3.1

TF2SoldierMod.dll

Decompiled 3 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.Commando.CommandoWeapon;
using HG;
using HG.BlendableTypes;
using IL.RoR2;
using KinematicCharacterController;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.EntityStates;
using On.RoR2;
using R2API;
using R2API.Networking;
using R2API.Utils;
using RoR2;
using RoR2.Achievements;
using RoR2.Audio;
using RoR2.ContentManagement;
using RoR2.Projectile;
using RoR2.Skills;
using RoR2.UI;
using TF2SoldierMod.Modules;
using TF2SoldierMod.Modules.Controllers;
using TF2SoldierMod.Modules.Survivors;
using TF2SoldierMod.SkillStates;
using TF2SoldierMod.SkillStates.Banners;
using TF2SoldierMod.SkillStates.BaseStates;
using TF2SoldierMod.SkillStates.TF2Soldier.ReloadStates;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using UnityEngine.Rendering;

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

	internal string bodyNameToken = "";

	internal string subtitleNameToken = "";

	internal string bodyNameToClone = "Commando";

	internal Texture characterPortrait = null;

	internal GameObject crosshair = null;

	internal GameObject podPrefab = null;

	internal float maxHealth = 100f;

	internal float healthGrowth = 2f;

	internal float healthRegen = 0f;

	internal float shield = 0f;

	internal float shieldGrowth = 0f;

	internal float moveSpeed = 7f;

	internal float moveSpeedGrowth = 0f;

	internal float acceleration = 80f;

	internal float jumpPower = 15f;

	internal float jumpPowerGrowth = 0f;

	internal float damage = 12f;

	internal float attackSpeed = 1f;

	internal float attackSpeedGrowth = 0f;

	internal float armor = 0f;

	internal float armorGrowth = 0f;

	internal float crit = 1f;

	internal float critGrowth = 0f;

	internal int jumpCount = 1;

	internal Color bodyColor = Color.grey;

	internal Vector3 aimOriginPosition = new Vector3(0f, 1.8f, 0f);

	internal Vector3 modelBasePosition = new Vector3(0f, -0.92f, 0f);

	internal Vector3 cameraPivotPosition = new Vector3(0f, 1.6f, 0f);
}
internal class CustomRendererInfo
{
	internal string childName;

	internal Material material;

	internal bool ignoreOverlays;
}
internal class SkillDefInfo
{
	public string skillName;

	public string skillNameToken;

	public string skillDescriptionToken;

	public Sprite skillIcon;

	public SerializableEntityStateType activationState;

	public string activationStateMachineName;

	public int baseMaxStock;

	public float baseRechargeInterval;

	public bool beginSkillCooldownOnSkillEnd;

	public bool canceledFromSprinting;

	public bool forceSprintDuringState;

	public bool fullRestockOnAssign;

	public InterruptPriority interruptPriority;

	public bool resetCooldownTimerOnUse;

	public bool isCombatSkill;

	public bool mustKeyPress;

	public bool cancelSprintingOnActivation;

	public int rechargeStock;

	public int requiredStock;

	public int stockToConsume;

	public string[] keywordTokens;
}
namespace TF2SoldierMod
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.Lemner.TF2SoldierMod", "TF2SoldierMod", "1.3.1")]
	[R2APISubmoduleDependency(new string[] { "PrefabAPI", "LanguageAPI", "SoundAPI", "NetworkingAPI", "DamageAPI", "TempVisualEffectAPI" })]
	public class TF2SoldierPlugin : BaseUnityPlugin
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static hook_ApplyJumpVelocity <>9__17_3;

			internal void <Hook>b__17_3(orig_ApplyJumpVelocity orig, CharacterMotor characterMotor, CharacterBody characterBody, float horizontalBonus, float verticalBonus, bool vault)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_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_008e: 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_0071: Unknown result type (might be due to invalid IL or missing references)
				//IL_0072: Unknown result type (might be due to invalid IL or missing references)
				Vector3 velocity = characterMotor.velocity;
				orig.Invoke(characterMotor, characterBody, horizontalBonus, verticalBonus, vault);
				if (characterBody.baseNameToken.Equals("LEMN_SOLDIERTF2_BODY_NAME"))
				{
					Vector3 velocity2 = characterMotor.moveDirection * characterBody.moveSpeed * horizontalBonus;
					if (((Vector3)(ref characterMotor.velocity)).sqrMagnitude < ((Vector3)(ref velocity2)).sqrMagnitude)
					{
						velocity2.y = characterMotor.velocity.y;
						characterMotor.velocity = velocity2;
					}
					else
					{
						velocity.y = characterMotor.velocity.y;
						characterMotor.velocity = velocity;
					}
				}
			}
		}

		public const string MODUID = "com.Lemner.TF2SoldierMod";

		public const string MODNAME = "TF2SoldierMod";

		public const string MODVERSION = "1.3.1";

		public const string developerPrefix = "LEMN";

		internal List<SurvivorBase> Survivors = new List<SurvivorBase>();

		public static TF2SoldierPlugin instance;

		public static ModdedDamageType ReserveShooterHit;

		public static ModdedDamageType DeathResistor;

		public static ModdedDamageType ZatoichiHit;

		public static ModdedDamageType BazookaHit;

		private Dictionary<CharacterMotor, SoldierMintTeaInfo> info = new Dictionary<CharacterMotor, SoldierMintTeaInfo>();

		public static bool isFalling;

		private void Awake()
		{
			//IL_0060: 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_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_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			instance = this;
			Assets.Initialize();
			Config.ReadConfig();
			States.RegisterStates();
			Buffs.RegisterBuffs();
			Projectiles.RegisterProjectiles();
			Tokens.AddTokens();
			ItemDisplays.PopulateDisplays();
			new Soldier().Initialize();
			new ContentPacks().Initialize();
			ContentManager.onContentPacksAssigned += LateSetup;
			Hook();
			ReserveShooterHit = DamageAPI.ReserveDamageType();
			DeathResistor = DamageAPI.ReserveDamageType();
			ZatoichiHit = DamageAPI.ReserveDamageType();
			BazookaHit = DamageAPI.ReserveDamageType();
			LanguageAPI.Add("KEYWORD_MINICRIT", "<style=cKeywordName><style=cIsDamage>Mini Crit</style></style><style=cSub>Deals <style=cIsDamage>1.5x damage.</style><style=cIsUtility> Activates on-crit items.</style>\nDamage is overridden by regular critical strikes.</style>");
			LanguageAPI.Add("KEYWORD_OVERHEAL", "<style=cKeywordName><style=cIsHealing>Overheal</style></style><style=cSub>Healing recieved from this ability is instead <style=cIsHealing>applied as a barrier</style>, if your health is full.</style>");
			LanguageAPI.Add("KEYWORD_PASSIVEONLY", "<style=cKeywordName><style=cIsUtility>Passive Only</style></style><style=cSub>This ability cannot be directly used, and instead provides <style=cIsUtility>passive benefits.</style></style>");
			LanguageAPI.Add("KEYWORD_ROCKETJUMP", "<style=cKeywordName><style=cIsUtility>Rocket Jumping</style></style><style=cSub>The rockets from this ability <style=cIsUtility>push you back</style> when they explode near you.</style>");
			LanguageAPI.Add("KEYWORD_SELFDAMAGE", "<style=cKeywordName><style=cIsHealth>Self Damaging</style></style><style=cSub>The rockets from this ability damage you for <style=cIsHealth>15% of your current health</style> when they explode near you. This damage is <style=cIsUtility>non-lethal.</style></style>");
			LanguageAPI.Add("KEYWORD_DEATHRESIST", $"<style=cKeywordName><style=cIsUtility>Death Resist</style></style><style=cSub>Activated when you would have been killed. You <style=cIsUtility>cannot be lowered below 1 health by normal means.</style> Lasts {7.5f} seconds, and has a cooldown of {30f} seconds.</style>");
			LanguageAPI.Add("KEYWORD_LOADING", "<style=cKeywordName><style=cIsUtility>Loading</style></style><style=cSub>Holding the button down loads a rocket. Releasing fires all stored rockets. Attempting to load more than the maximum <style=cIsHealth>damages you</style> and <style=cIsUtility>pushes you backward.</style></style>");
			LanguageAPI.Add("KEYWORD_MOTIVATE", string.Format("<style=cKeywordName><style=cIsUtility>Motivation</style></style><style=cSub>Increases damage by {0}x, attack speed by {1}%, movement speed by {2}x, critical strike chance by {3}%, and grants {4} additional jump{5}.</style>", 1.25f, 50f, 1.5f, 30f, 1, ""));
			LanguageAPI.Add("KEYWORD_DUELING", $"<style=cKeywordName><style=cIsDamage>Dueling</style></style><style=cSub>Hitting an elite enemy with this ability has a <style=cIsUtility>{20f}% chance to steal their affix for {90f} seconds.</style>\nKilling an elite enemy with this ability <style=cIsUtility>steals their affix 100% of the time.</style>\nHitting an elite enemy sharing an affix with you with this ability <style=cIsDamage>does {5f}x damage and is a guaranteed critical strike</style>, with a <style=cIsDamage>{20f}% chance to execute them.</style></style>");
		}

		private static bool ConchBuffCondition(CharacterBody body)
		{
			return body.HasBuff(Buffs.conchBuff);
		}

		private static bool CritBuffCondition(CharacterBody body)
		{
			return body.HasBuff(Buffs.buffBannerBuff);
		}

		private static bool BattalionBuffCondition(CharacterBody body)
		{
			return body.HasBuff(Buffs.battalionBuff);
		}

		private static bool WhipBuffCondition(CharacterBody body)
		{
			return body.HasBuff(Buffs.whipBuff);
		}

		private void LateSetup(ReadOnlyArray<ReadOnlyContentPack> obj)
		{
			SurvivorBase.instance.SetItemDisplays();
		}

		private void Hook()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Expected O, but got Unknown
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Expected O, but got Unknown
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Expected O, but got Unknown
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Expected O, but got Unknown
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Expected O, but got Unknown
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Expected O, but got Unknown
			CharacterBody.RecalculateStats += new hook_RecalculateStats(CharacterBody_RecalculateStats);
			CharacterMotor.OnLanded += new hook_OnLanded(CharacterMotor_OnLanded);
			CharacterMotor.OnGroundHit += new hook_OnGroundHit(CharacterMotor_OnGroundHit);
			CharacterBody.FixedUpdate += new hook_FixedUpdate(CharacterBody_FixedUpdate);
			HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_TakeDamage);
			CharacterModel.Awake += new hook_Awake(CharacterModel_Awake);
			CharacterModel.Start += new hook_Start(CharacterModel_Start);
			CharacterBody.OnBuffFirstStackGained += new hook_OnBuffFirstStackGained(CharacterBody_OnBuffFirstStackGained);
			CharacterBody.OnBuffFinalStackLost += new hook_OnBuffFinalStackLost(CharacterBody_OnBuffFinalStackLost);
			if (Config.autoJumpEnabled.Value)
			{
				GenericCharacterMain.GatherInputs += (hook_GatherInputs)delegate(orig_GatherInputs orig, GenericCharacterMain self)
				{
					orig.Invoke(self);
					if (((EntityState)self).characterBody.baseNameToken.Equals("LEMN_SOLDIERTF2_BODY_NAME") && Access<bool>(self, "hasInputBank"))
					{
						CharacterMotor motor2 = GetMotor(self);
						if (motor2 != null)
						{
							GetInfo(motor2).GroundedJump = AccessProperty<InputBankTest>(self, typeof(EntityState), "inputBank").jump.down;
						}
					}
				};
			}
			GenericCharacterMain.ProcessJump += (hook_ProcessJump)delegate(orig_ProcessJump orig, GenericCharacterMain self)
			{
				CharacterMotor motor = GetMotor(self);
				if (motor != null && motor.isGrounded)
				{
					SoldierMintTeaInfo soldierMintTeaInfo = GetInfo(motor);
					if (soldierMintTeaInfo != null && soldierMintTeaInfo.GroundedJump)
					{
						Set(self, "jumpInputReceived", true);
					}
				}
				orig.Invoke(self);
			};
			CharacterMotor.PreMove += (hook_PreMove)delegate(orig_PreMove orig, CharacterMotor self, float deltaTime)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_004d: Unknown result type (might be due to invalid IL or missing references)
				//IL_004e: Unknown result type (might be due to invalid IL or missing references)
				Vector3 velocity3 = self.velocity;
				orig.Invoke(self, deltaTime);
				if (IsPlayerControlled(self) && self.body.baseNameToken.Equals("LEMN_SOLDIERTF2_BODY_NAME") && !self.body.HasBuff(Buffs.parachuteBuff))
				{
					self.velocity = velocity3;
					PreMovementHandler(self, deltaTime);
				}
			};
			object obj = <>c.<>9__17_3;
			if (obj == null)
			{
				hook_ApplyJumpVelocity val = delegate(orig_ApplyJumpVelocity orig, CharacterMotor characterMotor, CharacterBody characterBody, float horizontalBonus, float verticalBonus, bool vault)
				{
					//IL_0002: Unknown result type (might be due to invalid IL or missing references)
					//IL_0007: Unknown result type (might be due to invalid IL or missing references)
					//IL_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_008e: 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_0071: Unknown result type (might be due to invalid IL or missing references)
					//IL_0072: Unknown result type (might be due to invalid IL or missing references)
					Vector3 velocity = characterMotor.velocity;
					orig.Invoke(characterMotor, characterBody, horizontalBonus, verticalBonus, vault);
					if (characterBody.baseNameToken.Equals("LEMN_SOLDIERTF2_BODY_NAME"))
					{
						Vector3 velocity2 = characterMotor.moveDirection * characterBody.moveSpeed * horizontalBonus;
						if (((Vector3)(ref characterMotor.velocity)).sqrMagnitude < ((Vector3)(ref velocity2)).sqrMagnitude)
						{
							velocity2.y = characterMotor.velocity.y;
							characterMotor.velocity = velocity2;
						}
						else
						{
							velocity.y = characterMotor.velocity.y;
							characterMotor.velocity = velocity;
						}
					}
				};
				<>c.<>9__17_3 = val;
				obj = (object)val;
			}
			GenericCharacterMain.ApplyJumpVelocity += (hook_ApplyJumpVelocity)obj;
		}

		private void CharacterMotor_OnGroundHit(orig_OnGroundHit orig, CharacterMotor self, Collider hitCollider, Vector3 hitNormal, Vector3 hitPoint, ref HitStabilityReport hitStabilityReport)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: 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_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: 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_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0216: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, hitCollider, hitNormal, hitPoint, ref hitStabilityReport);
			float num = 50f;
			float num2 = 65f;
			if (Object.op_Implicit((Object)(object)self.body) && self.body.baseNameToken.Equals("LEMN_SOLDIERTF2_BODY_NAME") && self.body.skillLocator.secondary.skillNameToken.Equals("LEMN_SOLDIERTF2_BODY_SECONDARY_MANNTREADS_NAME") && Mathf.Abs(self.velocity.y) > num)
			{
				float num3 = Mathf.Lerp(15f, 40f, Mathf.InverseLerp(num, num2, Mathf.Abs(self.velocity.y)));
				new BlastAttack
				{
					attacker = ((Component)self.body).gameObject,
					inflictor = ((Component)self.body).gameObject,
					teamIndex = TeamComponent.GetObjectTeam(((Component)self.body).gameObject),
					position = hitPoint,
					procCoefficient = 1.5f,
					radius = 3f,
					baseForce = 0f,
					baseDamage = self.body.damage * num3,
					falloffModel = (FalloffModel)0,
					crit = true,
					damageColorIndex = (DamageColorIndex)0,
					attackerFiltering = (AttackerFiltering)2
				}.Fire();
				Util.PlaySound("MannTreadBoomSound", ((Component)self).gameObject);
				List<HurtBox> list = new SphereSearch
				{
					radius = 3f,
					mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask,
					origin = hitPoint
				}.RefreshCandidates().FilterCandidatesByHurtBoxTeam(TeamMask.allButNeutral).FilterCandidatesByDistinctHurtBoxEntities()
					.GetHurtBoxes()
					.ToList();
				if (list.Count > 1 && isFalling)
				{
					new ShakeEmitter
					{
						amplitudeTimeDecay = true,
						duration = 0.4f,
						radius = 100f,
						scaleShakeRadiusWithLocalScale = false,
						wave = new Wave
						{
							amplitude = 1f,
							frequency = 40f,
							cycleOffset = 0f
						}
					}.StartShake();
					Util.PlaySound("MannTreadSquishSound", ((Component)self).gameObject);
				}
				isFalling = false;
			}
		}

		private void CharacterBody_OnBuffFinalStackLost(orig_OnBuffFinalStackLost orig, CharacterBody self, BuffDef buffDef)
		{
			//IL_006c: 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_00c3: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, buffDef);
			if ((Object)(object)buffDef == (Object)(object)Buffs.whipBuff || (Object)(object)buffDef == (Object)(object)Buffs.conchBuff || (Object)(object)buffDef == (Object)(object)Buffs.battalionBuff || (Object)(object)buffDef == (Object)(object)Buffs.buffBannerBuff)
			{
				Util.PlaySound("SpeedDownSound", ((Component)self).gameObject);
			}
			if ((Object)(object)buffDef == (Object)(object)Buffs.deathResistActive)
			{
				NetworkingHelpers.ApplyBuff(self, Buffs.deathResistCooldown.buffIndex, 1, 30f);
			}
			if ((Object)(object)buffDef == (Object)(object)Buffs.EliteVoid && self.inventory.GetItemCount(Items.BearVoid) == 0)
			{
				NetworkingHelpers.ApplyBuff(self, Buffs.BearVoidReady.buffIndex, 0, -1f);
				NetworkingHelpers.ApplyBuff(self, Buffs.BearVoidCooldown.buffIndex, 0, -1f);
			}
		}

		private void CharacterBody_OnBuffFirstStackGained(orig_OnBuffFirstStackGained orig, CharacterBody self, BuffDef buffDef)
		{
			orig.Invoke(self, buffDef);
			if ((Object)(object)buffDef == (Object)(object)Buffs.whipBuff || (Object)(object)buffDef == (Object)(object)Buffs.conchBuff || (Object)(object)buffDef == (Object)(object)Buffs.battalionBuff || (Object)(object)buffDef == (Object)(object)Buffs.buffBannerBuff)
			{
				Util.PlaySound("SpeedUpSound", ((Component)self).gameObject);
			}
		}

		private void CharacterModel_Start(orig_Start orig, CharacterModel self)
		{
			orig.Invoke(self);
			if (!((Object)(object)self == (Object)null) && !((Object)(object)self.body == (Object)null) && (Object)(object)self != (Object)null && self.body.baseNameToken.Equals("LEMN_SOLDIERTF2_BODY_NAME"))
			{
				if (self.body.skillLocator.utility.skillNameToken.Equals("LEMN_SOLDIERTF2_BODY_UTILITY_CHUTE_TOGGLE_NAME"))
				{
					((Component)self.childLocator.FindChild("BaseJumper")).gameObject.SetActive(true);
				}
				else if (self.body.skillLocator.utility.skillNameToken.Equals("LEMN_SOLDIERTF2_BODY_UTILITY_CONCH_NAME"))
				{
					((Component)self.childLocator.FindChild("ConcherorPack")).gameObject.SetActive(true);
				}
				else if (self.body.skillLocator.utility.skillNameToken.Equals("LEMN_SOLDIERTF2_BODY_UTILITY_BATTALION_NAME"))
				{
					((Component)self.childLocator.FindChild("BattalionPack")).gameObject.SetActive(true);
				}
				else if (self.body.skillLocator.utility.skillNameToken.Equals("LEMN_SOLDIERTF2_BODY_UTILITY_BUFFBANNER_NAME"))
				{
					((Component)self.childLocator.FindChild("BuffPack")).gameObject.SetActive(true);
				}
				if (self.body.skillLocator.primary.skillNameToken.Equals("LEMN_SOLDIERTF2_BODY_PRIMARY_ROCKET_NAME"))
				{
					((Component)self.childLocator.FindChild("RocketLauncher")).gameObject.SetActive(true);
				}
				else if (self.body.skillLocator.primary.skillNameToken.Equals("LEMN_SOLDIERTF2_BODY_PRIMARY_BAZOOKA_NAME"))
				{
					((Component)self.childLocator.FindChild("BeggarsBazooka")).gameObject.SetActive(true);
				}
				else if (self.body.skillLocator.primary.skillNameToken.Equals("LEMN_SOLDIERTF2_BODY_PRIMARY_JUMPER_NAME"))
				{
					((Component)self.childLocator.FindChild("RocketJumper")).gameObject.SetActive(true);
				}
				else if (self.body.skillLocator.primary.skillNameToken.Equals("LEMN_SOLDIERTF2_BODY_PRIMARY_AIRSTRIKE_NAME"))
				{
					((Component)self.childLocator.FindChild("AirStrike")).gameObject.SetActive(true);
				}
			}
		}

		private void CharacterModel_Awake(orig_Awake orig, CharacterModel self)
		{
			orig.Invoke(self);
			if (((Object)((Component)self).gameObject).name.Contains("SoldierTF2Display"))
			{
				Util.PlaySound("MenuNoteSoldier", ((Component)self).gameObject);
			}
		}

		private void CharacterBody_FixedUpdate(orig_FixedUpdate orig, CharacterBody self)
		{
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self);
			if (!Object.op_Implicit((Object)(object)self) || !self.baseNameToken.Equals("LEMN_SOLDIERTF2_BODY_NAME"))
			{
				return;
			}
			if (self.skillLocator.secondary.skillNameToken.Equals("LEMN_SOLDIERTF2_BODY_SECONDARY_MANNTREADS_NAME"))
			{
				if (!((Enum)self.bodyFlags).HasFlag((Enum)(object)(BodyFlags)1))
				{
					self.bodyFlags = (BodyFlags)(self.bodyFlags | 1);
				}
				if (self.characterMotor.velocity.y < -55f && !isFalling)
				{
					Util.PlaySound("MannTreadFallSound", ((Component)self).gameObject);
					isFalling = true;
				}
			}
			if (self.HasBuff(Buffs.parachuteBuff) && self.hasEffectiveAuthority)
			{
				float y = self.characterMotor.velocity.y;
				if (y < 0f)
				{
					y = Mathf.MoveTowards(y, -4f, 80f * Time.deltaTime);
					self.characterMotor.velocity = new Vector3(self.characterMotor.velocity.x, y, self.characterMotor.velocity.z);
				}
			}
			if (self.HasBuff(Buffs.BanditSkull) && self.skillLocator.primary.skillNameToken.Equals("LEMN_SOLDIERTF2_BODY_PRIMARY_AIRSTRIKE_NAME"))
			{
				self.skillLocator.primary.SetBonusStockFromBody(Mathf.FloorToInt((float)(self.GetBuffCount(Buffs.BanditSkull) / 6)));
			}
		}

		private void HealthComponent_TakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo)
		{
			//IL_0464: Unknown result type (might be due to invalid IL or missing references)
			//IL_046a: Unknown result type (might be due to invalid IL or missing references)
			//IL_046f: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0486: Unknown result type (might be due to invalid IL or missing references)
			//IL_048c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0491: Unknown result type (might be due to invalid IL or missing references)
			//IL_0496: Unknown result type (might be due to invalid IL or missing references)
			//IL_049c: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_04e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_061d: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_05b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_05bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_05c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0359: Unknown result type (might be due to invalid IL or missing references)
			//IL_035f: Unknown result type (might be due to invalid IL or missing references)
			//IL_067d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0265: Unknown result type (might be due to invalid IL or missing references)
			//IL_026e: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_05eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_05f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_05f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0278: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0208: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_03da: Unknown result type (might be due to invalid IL or missing references)
			//IL_03dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_079b: Unknown result type (might be due to invalid IL or missing references)
			//IL_07a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_071b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0720: Unknown result type (might be due to invalid IL or missing references)
			//IL_0723: Unknown result type (might be due to invalid IL or missing references)
			//IL_0739: Unknown result type (might be due to invalid IL or missing references)
			//IL_0822: Unknown result type (might be due to invalid IL or missing references)
			//IL_082c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0831: Unknown result type (might be due to invalid IL or missing references)
			//IL_0836: Unknown result type (might be due to invalid IL or missing references)
			//IL_0895: Unknown result type (might be due to invalid IL or missing references)
			//IL_08b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_08d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0951: Unknown result type (might be due to invalid IL or missing references)
			//IL_0957: Unknown result type (might be due to invalid IL or missing references)
			//IL_09f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_09c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a47: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody val = null;
			if ((Object)(object)damageInfo.attacker != (Object)null)
			{
				val = damageInfo.attacker.GetComponent<CharacterBody>();
			}
			bool flag = false;
			if ((Object)(object)damageInfo.attacker != (Object)null)
			{
				if ((Object)(object)val != (Object)null && val.HasBuff(Buffs.buffBannerBuff) && !flag && !damageInfo.crit)
				{
					flag = true;
					damageInfo.damage *= 1.5f;
					damageInfo.damageColorIndex = (DamageColorIndex)3;
					Util.PlaySound("MiniCritSound", ((Component)val).gameObject);
				}
				if ((Object)(object)val != (Object)null && val.baseNameToken.Equals("LEMN_SOLDIERTF2_BODY_NAME") && Object.op_Implicit((Object)(object)val.skillLocator) && val.skillLocator.secondary.skillNameToken.Equals("LEMN_SOLDIERTF2_BODY_SECONDARY_RESERVE_SHOOTER_NAME") && (Object)(object)self.body != (Object)null && (self.body.isFlying || (Object.op_Implicit((Object)(object)self.body.characterMotor) && !self.body.characterMotor.isGrounded)) && DamageAPI.HasModdedDamageType(damageInfo, ReserveShooterHit))
				{
					if (!flag && !damageInfo.crit)
					{
						Debug.Log((object)("Flying: " + self.body.isFlying));
						Debug.Log((object)("Not Grounded: " + (Object.op_Implicit((Object)(object)self.body.characterMotor) && !self.body.characterMotor.isGrounded)));
						flag = true;
						damageInfo.damage *= 1.5f;
						damageInfo.damageColorIndex = (DamageColorIndex)3;
						Util.PlaySound("MiniCritSound", ((Component)val).gameObject);
					}
					if (Util.CheckRoll(10f, val.master))
					{
						damageInfo.damageType |= DamageTypeCombo.op_Implicit((DamageType)1024);
					}
				}
				if ((Object)(object)val != (Object)null && DamageAPI.HasModdedDamageType(damageInfo, ZatoichiHit))
				{
					if (self.body.isElite)
					{
						bool flag2 = false;
						BuffIndex[] eliteBuffIndices = BuffCatalog.eliteBuffIndices;
						foreach (BuffIndex val2 in eliteBuffIndices)
						{
							if (self.body.HasBuff(val2) && val.HasBuff(val2))
							{
								flag2 = true;
							}
						}
						if (flag2)
						{
							if (Util.CheckRoll(20f, val.master.luck, (CharacterMaster)null))
							{
								damageInfo.damage = self.fullCombinedHealth;
							}
							else
							{
								damageInfo.damage *= 5f;
								damageInfo.crit = true;
							}
						}
					}
					if (DamageAPI.HasModdedDamageType(damageInfo, ZatoichiHit))
					{
						float num = val.healthComponent.fullHealth - val.healthComponent.health;
						float num2 = val.healthComponent.fullHealth * 0.05f;
						float num3 = Mathf.Clamp(num2 - num, 0f, val.healthComponent.fullHealth);
						val.healthComponent.Heal(num2, default(ProcChainMask), true);
						if (num3 > 0f)
						{
							val.healthComponent.AddBarrierAuthority(num3 / 2f);
						}
						if (self.body.isElite && Util.CheckRoll(15f, val.master.luck, (CharacterMaster)null))
						{
							BuffIndex val3 = self.body.activeBuffsList.Intersect(BuffCatalog.eliteBuffIndices).First();
							if (!val.HasBuff(val3))
							{
								NetworkingHelpers.ApplyBuff(val, val3, 1, 90f);
							}
						}
					}
				}
			}
			if (Object.op_Implicit((Object)(object)self) && Object.op_Implicit((Object)(object)self.body) && (self.body.HasBuff(Buffs.deathResistActive) || (self.body.HasBuff(Buffs.battalionBuff) && !self.body.HasBuff(Buffs.deathResistCooldown))) && DamageTypeCombo.op_Implicit(damageInfo.damageType & DamageTypeCombo.op_Implicit((DamageType)1)) == 0)
			{
				damageInfo.damageType |= DamageTypeCombo.op_Implicit((DamageType)1);
				DamageAPI.AddModdedDamageType(damageInfo, DeathResistor);
			}
			if (Object.op_Implicit((Object)(object)self) && Object.op_Implicit((Object)(object)self.body) && self.body.baseNameToken.Equals("LEMN_SOLDIERTF2_BODY_NAME") && DamageTypeCombo.op_Implicit(damageInfo.damageType & DamageTypeCombo.op_Implicit((DamageType)2097152)) == 1)
			{
				damageInfo.damage *= 0.6f;
			}
			CharacterBody val4 = null;
			KillGracePeriod killGracePeriod = null;
			if (Object.op_Implicit((Object)(object)damageInfo.attacker))
			{
				val4 = damageInfo.attacker.GetComponent<CharacterBody>();
				if (Object.op_Implicit((Object)(object)val4) && !val4.baseNameToken.Equals("LEMN_SOLDIERTF2_BODY_NAME"))
				{
					val4 = null;
				}
			}
			if (Object.op_Implicit((Object)(object)val4) && Config.killGracePeriod.Value > 0f)
			{
				killGracePeriod = ((Component)self).gameObject.GetComponent<KillGracePeriod>();
				if ((Object)(object)killGracePeriod == (Object)null)
				{
					killGracePeriod = ((Component)self).gameObject.AddComponent<KillGracePeriod>();
				}
				if (self.alive && DamageTypeCombo.op_Implicit(damageInfo.damageType & DamageTypeCombo.op_Implicit((DamageType)268435456)) == 0L && killGracePeriod.HasSkull(val4))
				{
					damageInfo.damageType |= DamageTypeCombo.op_Implicit((DamageType)268435456);
				}
			}
			if (Object.op_Implicit((Object)(object)self.body) && self.body.HasBuff(Buffs.bazookaBurstDebuff) && DamageAPI.HasModdedDamageType(damageInfo, BazookaHit))
			{
				int buffCount = self.body.GetBuffCount(Buffs.bazookaBurstDebuff);
				float num4 = 1.5f + 0.5f * (float)(buffCount - 1);
				damageInfo.damage *= num4;
			}
			orig.Invoke(self, damageInfo);
			if (Object.op_Implicit((Object)(object)self.body) && DamageAPI.HasModdedDamageType(damageInfo, BazookaHit))
			{
				int buffCount2 = self.body.GetBuffCount(Buffs.bazookaBurstDebuff);
				NetworkingHelpers.ApplyBuff(self.body, Buffs.bazookaBurstDebuff.buffIndex, 1, 1f);
			}
			if ((Object)(object)val != (Object)null && DamageAPI.HasModdedDamageType(damageInfo, ZatoichiHit) && !self.alive)
			{
				if (self.body.isElite)
				{
					BuffIndex val5 = self.body.activeBuffsList.Intersect(BuffCatalog.eliteBuffIndices).First();
					if (!val.HasBuff(val5))
					{
						NetworkingHelpers.ApplyBuff(val, val5, 1, 90f);
					}
				}
				float num5 = val.healthComponent.fullHealth - val.healthComponent.health;
				float num6 = val.healthComponent.fullHealth * 0.4f;
				float num7 = Mathf.Clamp(num6 - num5, 0f, val.healthComponent.fullHealth);
				val.healthComponent.Heal(num6, default(ProcChainMask), true);
				if (num7 > 0f)
				{
					val.healthComponent.AddBarrierAuthority(num7 / 2f);
				}
			}
			if (Config.killGracePeriod.Value > 0f && Object.op_Implicit((Object)(object)killGracePeriod) && Object.op_Implicit((Object)(object)val4) && Object.op_Implicit((Object)(object)val4.master) && !damageInfo.rejected)
			{
				if (self.alive)
				{
					killGracePeriod.AddTimer(val4, DamageTypeCombo.op_Implicit(damageInfo.damageType & DamageTypeCombo.op_Implicit((DamageType)268435456)));
				}
				else
				{
					killGracePeriod.TriggerEffects(val4, self.body);
				}
			}
			if ((Object)(object)self.body != (Object)null && (self.body.isFlying || (Object.op_Implicit((Object)(object)self.body.characterMotor) && !self.body.characterMotor.isGrounded)) && DamageAPI.HasModdedDamageType(damageInfo, ReserveShooterHit) && !self.body.HasBuff(Buffs.DeathMark.buffIndex))
			{
				NetworkingHelpers.ApplyBuff(self.body, Buffs.DeathMark.buffIndex, 1, 5f);
			}
			if ((Object)(object)damageInfo.attacker != (Object)null && Object.op_Implicit((Object)(object)val) && damageInfo.attacker.GetComponent<CharacterBody>().HasBuff(Buffs.conchBuff) && (Object)(object)damageInfo.attacker.GetComponent<CharacterBody>().healthComponent != (Object)(object)self)
			{
				damageInfo.attacker.GetComponent<CharacterBody>().healthComponent.Heal(damageInfo.damage * 0.2f, default(ProcChainMask), true);
			}
			if ((Object)(object)damageInfo.attacker != (Object)null && flag)
			{
				CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
				if ((Object)(object)component != (Object)null && (Object)(object)component.master != (Object)null)
				{
					GlobalEventManager.instance.OnCrit(component, damageInfo, component.master, damageInfo.procCoefficient, damageInfo.procChainMask);
				}
			}
			if (Object.op_Implicit((Object)(object)self) && Object.op_Implicit((Object)(object)self.body) && self.combinedHealth == 1f && DamageAPI.HasModdedDamageType(damageInfo, DeathResistor) && !self.body.HasBuff(Buffs.deathResistActive) && !self.body.HasBuff(Buffs.deathResistCooldown))
			{
				NetworkingHelpers.ApplyBuff(self.body, Buffs.deathResistActive.buffIndex, 1, 7.5f);
			}
		}

		private void CharacterMotor_OnLanded(orig_OnLanded orig, CharacterMotor self)
		{
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self);
			if (Object.op_Implicit((Object)(object)self.body))
			{
				if (self.body.HasBuff(Buffs.rocketJumpingBuff))
				{
					NetworkingHelpers.ApplyBuff(self.body, Buffs.rocketJumpingBuff.buffIndex, 0, -1f);
				}
				if (self.body.HasBuff(Buffs.parachuteBuff))
				{
					Util.PlaySound("ParachuteCloseSound", ((Component)this).gameObject);
					GameObject val = ((Component)self.body.modelLocator.modelTransform).gameObject.GetComponent<CharacterModel>().childLocator.FindChildGameObject("BaseJumperChute");
					val.SetActive(false);
					NetworkingHelpers.ApplyBuff(self.body, Buffs.parachuteBuff.buffIndex, 0, -1f);
				}
			}
		}

		private void CharacterBody_RecalculateStats(orig_RecalculateStats orig, CharacterBody self)
		{
			//IL_022b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_026e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self);
			if (!Object.op_Implicit((Object)(object)self))
			{
				return;
			}
			if (self.HasBuff(Buffs.conchBuff))
			{
				self.moveSpeed *= 1.5f;
			}
			if (self.HasBuff(Buffs.rocketJumpingBuff))
			{
				self.armor += 25f;
			}
			if (self.HasBuff(Buffs.buffBannerBuff))
			{
				self.attackSpeed *= 1.5f;
			}
			if (self.HasBuff(Buffs.battalionBuff))
			{
				self.armor += 200f;
			}
			if (self.HasBuff(Buffs.whipBuff))
			{
				self.moveSpeed *= 1.5f;
				self.attackSpeed += 0.5f;
				self.crit += 30f;
				self.maxJumpCount += 1;
				self.damage *= 1.25f;
			}
			if (self.baseNameToken.Equals("LEMN_SOLDIERTF2_BODY_NAME"))
			{
				int num = 0;
				TeamMask val = default(TeamMask);
				((TeamMask)(ref val)).AddTeam(self.master.teamIndex);
				List<HurtBox> list = new SphereSearch
				{
					radius = 20f,
					mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask,
					origin = self.transform.position
				}.RefreshCandidates().FilterCandidatesByHurtBoxTeam(val).FilterCandidatesByDistinctHurtBoxEntities()
					.GetHurtBoxes()
					.ToList();
				foreach (HurtBox item in list)
				{
					if ((Object)(object)item.healthComponent != (Object)(object)self.healthComponent && item.healthComponent.body.HasBuff(Buffs.whipBuff))
					{
						num++;
					}
				}
				NetworkingHelpers.ApplyBuff(self, Buffs.whipHeadBuff.buffIndex, num, -1f);
			}
			if (self.HasBuff(Buffs.whipHeadBuff.buffIndex))
			{
				self.damage *= 1f + 0.25f * (float)self.GetBuffCount(Buffs.whipHeadBuff.buffIndex);
			}
			if (self.HasBuff(Buffs.parachuteBuff.buffIndex))
			{
				self.damage *= 1.2f;
				self.attackSpeed *= 1.2f;
			}
		}

		private void PreMovementHandler(CharacterMotor self, float deltaTime)
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			if (!self.hasEffectiveAuthority)
			{
				return;
			}
			if (!self.isGrounded || GetInfo(self).LeniencyFrame)
			{
				AirMovementHandler(self, 3f, 30f);
			}
			else
			{
				GroundMovement(self, deltaTime);
			}
			if (self.useGravity)
			{
				self.velocity.y += Physics.gravity.y * deltaTime;
				if (self.isGrounded)
				{
					self.velocity.y = Mathf.Max(self.velocity.y, 0f);
				}
			}
			GetInfo(self).LeniencyFrame = !self.isGrounded;
		}

		private void AirMovementHandler(CharacterMotor characterMotor, float maximumAirAcceleration, float airAcceleration)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: 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_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: 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_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			Vector3 moveDirection = characterMotor.moveDirection;
			float num = (((double)((Vector3)(ref moveDirection)).sqrMagnitude > 0.0001) ? characterMotor.walkSpeed : 0f);
			if (num > maximumAirAcceleration)
			{
				num = maximumAirAcceleration;
			}
			Vector3 velocity = characterMotor.velocity;
			velocity.y = 0f;
			Vector3 val = velocity;
			moveDirection = characterMotor.moveDirection;
			float num2 = Vector3.Dot(val, ((Vector3)(ref moveDirection)).normalized);
			float num3 = num - num2;
			if (!(num3 <= 0f))
			{
				float num4 = airAcceleration * num;
				if (num4 > num3)
				{
					num4 = num3;
				}
				Vector3 velocity2 = characterMotor.velocity;
				moveDirection = characterMotor.moveDirection;
				characterMotor.velocity = velocity2 + ((Vector3)(ref moveDirection)).normalized * num4;
			}
		}

		private void GroundMovement(CharacterMotor self, float deltaTime)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			float acceleration = self.acceleration;
			Vector3 val = self.moveDirection;
			if (!self.isFlying)
			{
				val.y = 0f;
			}
			CharacterBody obj = Access<CharacterBody>(self, "body");
			if (obj != null && obj.isSprinting && 0f < ((Vector3)(ref val)).magnitude && ((Vector3)(ref val)).magnitude < 1f)
			{
				val /= ((Vector3)(ref val)).magnitude;
			}
			Vector3 val2 = val * self.walkSpeed;
			if (!self.isFlying)
			{
				val2.y = self.velocity.y;
			}
			self.velocity = Vector3.MoveTowards(self.velocity, val2, acceleration * deltaTime);
		}

		private bool IsPlayerControlled(CharacterMotor motor)
		{
			foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
			{
				object obj;
				if (instance == null)
				{
					obj = null;
				}
				else
				{
					CharacterMaster master = instance.master;
					if (master == null)
					{
						obj = null;
					}
					else
					{
						CharacterBody body = master.GetBody();
						obj = ((body != null) ? body.characterMotor : null);
					}
				}
				if ((Object)obj == (Object)(object)motor)
				{
					return true;
				}
			}
			return false;
		}

		private SoldierMintTeaInfo GetInfo(CharacterMotor characterMotor)
		{
			if ((Object)(object)characterMotor == (Object)null)
			{
				return null;
			}
			if (info.TryGetValue(characterMotor, out var value))
			{
				return value;
			}
			return info[characterMotor] = new SoldierMintTeaInfo
			{
				Motor = characterMotor,
				LeniencyFrame = false
			};
		}

		private static CharacterMotor GetMotor(GenericCharacterMain genericCharacterMain)
		{
			return AccessProperty<CharacterMotor>(genericCharacterMain, typeof(EntityState), "characterMotor");
		}

		private T Access<T>(object o, string field)
		{
			FieldInfo field2 = o.GetType().GetField(field, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.GetField);
			if (field2 == null)
			{
				ManualLogSource logger = ((BaseUnityPlugin)this).Logger;
				if (logger != null)
				{
					logger.LogError((object)("Unrecognized field " + field + " in class " + o.GetType().FullName));
				}
			}
			return (T)field2.GetValue(o);
		}

		private static T AccessProperty<T>(object o, Type type, string field)
		{
			PropertyInfo property = type.GetProperty(field, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty);
			if (property == null)
			{
			}
			return (T)property.GetValue(o);
		}

		private void Set(object o, string field, object value)
		{
			FieldInfo field2 = o.GetType().GetField(field, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.GetField);
			field2.SetValue(o, value);
		}
	}
	internal class SoldierMintTeaInfo
	{
		public CharacterMotor Motor { get; set; }

		public bool LeniencyFrame { get; set; }

		public bool GroundedJump { get; set; }
	}
}
namespace TF2SoldierMod.SkillStates
{
	public class AirStrike : BaseSkillState
	{
		public static float damageCoefficient = 4f;

		public static float procCoefficient = 1f;

		public static float baseDuration = 0.65f;

		public static float throwForce = 70f;

		private float duration;

		private float fireTime;

		private bool hasFired;

		private Animator animator;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			if (((BaseState)this).HasBuff(Buffs.rocketJumpingBuff))
			{
				duration *= 0.4f;
			}
			fireTime = 0.1f * duration;
			((EntityState)this).characterBody.SetAimTimer(2f);
			animator = ((EntityState)this).GetModelAnimator();
			Helpers.SwapToPrimary(((EntityState)this).characterBody);
			animator.SetFloat("weaponIndex", 0f);
			Util.PlaySound("AirStrikeLaunchSound", ((EntityState)this).gameObject);
			((EntityState)this).PlayAnimation("PrimaryFire, Override", "FirePrimary", "ThrowBomb.playbackRate", duration, 0f);
		}

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

		private void Fire()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			if (hasFired)
			{
				return;
			}
			hasFired = true;
			if (((EntityState)this).isAuthority)
			{
				Ray aimRay = ((BaseState)this).GetAimRay();
				GameObject airStrikeRocketPrefab = Projectiles.airStrikeRocketPrefab;
				airStrikeRocketPrefab.GetComponent<ProjectileController>().owner = ((EntityState)this).gameObject;
				if (!Object.op_Implicit((Object)(object)airStrikeRocketPrefab.GetComponent<TF2ExplosionHandler>()))
				{
					TF2ExplosionHandler tF2ExplosionHandler = airStrikeRocketPrefab.AddComponent<TF2ExplosionHandler>();
					tF2ExplosionHandler.rocketDamageBase = damageCoefficient;
					tF2ExplosionHandler.isAirStrike = true;
				}
				int itemCount = ((EntityState)this).characterBody.inventory.GetItemCount(Items.MoreMissile);
				float num = 1f;
				if (itemCount > 1)
				{
					num += 0.5f * (float)(itemCount - 1);
				}
				ProjectileManager.instance.FireProjectile(airStrikeRocketPrefab, ((Ray)(ref aimRay)).origin, Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction), ((EntityState)this).gameObject, 0f, 1000f, false, (DamageColorIndex)0, (GameObject)null, RocketLauncher.throwForce);
				if (itemCount > 0)
				{
					GameObject icbmAirStrikeRocketPrefab = Projectiles.icbmAirStrikeRocketPrefab;
					ProjectileManager.instance.FireProjectile(icbmAirStrikeRocketPrefab, ((Ray)(ref aimRay)).origin, Quaternion.Euler(0f, 20f, 0f) * Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction), ((EntityState)this).gameObject, 0f, 1000f, false, (DamageColorIndex)0, (GameObject)null, RocketLauncher.throwForce);
					ProjectileManager.instance.FireProjectile(icbmAirStrikeRocketPrefab, ((Ray)(ref aimRay)).origin, Quaternion.Euler(0f, -20f, 0f) * Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction), ((EntityState)this).gameObject, 0f, 1000f, false, (DamageColorIndex)0, (GameObject)null, RocketLauncher.throwForce);
				}
			}
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (((EntityState)this).fixedAge >= fireTime)
			{
				Fire();
			}
			if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
			{
				if (((EntityState)this).skillLocator.primary.stock < ((EntityState)this).skillLocator.primary.maxStock)
				{
					((EntityState)this).outer.SetNextState((EntityState)(object)new RocketReload());
				}
				else
				{
					((EntityState)this).outer.SetNextStateToMain();
				}
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)2;
		}
	}
	public class BeggarsBazookaChargeUp : BaseSkillState
	{
		public static float damageCoefficient = 7f;

		public static float procCoefficient = 1f;

		public static float baseDuration = 0.9f;

		public static float throwForce = 80f;

		public static float minChargeDuration = 0.2f;

		public bool isOverloading;

		private bool hasOverloaded;

		private float duration;

		private float overloadDelayMax;

		private static float overloadDelay = 0f;

		private float fireTime;

		private bool rocketAdded;

		private int maxRockets = 3;

		public int currentRockets;

		private Animator animator;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			overloadDelayMax = duration;
			fireTime = 0.1f * duration;
			((EntityState)this).characterBody.SetAimTimer(2f);
			animator = ((EntityState)this).GetModelAnimator();
			Helpers.SwapToPrimary(((EntityState)this).characterBody);
			animator.SetFloat("weaponIndex", 0f);
		}

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

		private void Overload()
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: 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_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: 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_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: 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_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Expected O, but got Unknown
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			if (!hasOverloaded)
			{
				hasOverloaded = true;
				if (((EntityState)this).isAuthority)
				{
					((EntityState)this).skillLocator.primary.AddOneStock();
					currentRockets--;
					NetworkingHelpers.ApplyBuff(((EntityState)this).characterBody, Buffs.bazookaLoadBuff.buffIndex, currentRockets, -1f);
					Util.PlaySound("RocketExplodeSound", ((EntityState)this).gameObject);
					Ray aimRay = ((BaseState)this).GetAimRay();
					Vector3 val = Vector3.Normalize(((Ray)(ref aimRay)).direction);
					NetworkingHelpers.DealDamage(new DamageInfo
					{
						damage = ((EntityState)this).characterBody.healthComponent.combinedHealth * 0.15f,
						force = -1f * val * 5700f,
						position = ((EntityState)this).characterBody.corePosition,
						damageColorIndex = (DamageColorIndex)0,
						crit = false,
						attacker = null,
						inflictor = null,
						damageType = DamageTypeCombo.op_Implicit((DamageType)262211),
						procCoefficient = 0f,
						procChainMask = default(ProcChainMask)
					}, ((EntityState)this).characterBody.mainHurtBox, true, false, false);
					NetworkingHelpers.ApplyBuff(((EntityState)this).characterBody, Buffs.rocketJumpingBuff.buffIndex, 1, -1f);
					overloadDelay = overloadDelayMax;
				}
			}
		}

		public int CalculateRocketCount()
		{
			return Mathf.FloorToInt(((EntityState)this).fixedAge / duration + duration * 4f / 5f);
		}

		public void AddRocket()
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			if (!rocketAdded)
			{
				((EntityState)this).skillLocator.primary.DeductStock(1);
				currentRockets++;
				NetworkingHelpers.ApplyBuff(((EntityState)this).characterBody, Buffs.bazookaLoadBuff.buffIndex, currentRockets, -1f);
				rocketAdded = true;
			}
		}

		public override void FixedUpdate()
		{
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).FixedUpdate();
			int num = CalculateRocketCount();
			overloadDelay -= Time.deltaTime;
			if (((EntityState)this).isAuthority && (num > currentRockets || isOverloading))
			{
				Helpers.SwapToPrimary(((EntityState)this).characterBody);
				animator.SetFloat("weaponIndex", 0f);
				((EntityState)this).PlayAnimation("Reload", "soldier_model_skeleton_primary_reload", "Reload.playbackRate", duration * 2f, 0f);
				if ((currentRockets >= maxRockets || (isOverloading && currentRockets > 0)) && overloadDelay <= 0f)
				{
					isOverloading = true;
					Overload();
					hasOverloaded = false;
					Util.PlaySound("BeggarsReloadSound", ((EntityState)this).gameObject);
				}
				else if (!isOverloading)
				{
					AddRocket();
					rocketAdded = false;
					Util.PlaySound("BeggarsReloadSound", ((EntityState)this).gameObject);
				}
			}
			if (((BaseState)this).isGrounded && ((EntityState)this).characterBody.HasBuff(Buffs.rocketJumpingBuff))
			{
				NetworkingHelpers.ApplyBuff(((EntityState)this).characterBody, Buffs.rocketJumpingBuff.buffIndex, 0, -1f);
			}
			if (((EntityState)this).isAuthority && !((BaseSkillState)this).IsKeyDownAuthority())
			{
				BeggarsBazookaFire beggarsBazookaFire = new BeggarsBazookaFire();
				beggarsBazookaFire.rockets = currentRockets;
				((EntityState)this).outer.SetNextState((EntityState)(object)beggarsBazookaFire);
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)2;
		}
	}
	public class BeggarsBazookaFire : BaseSkillState
	{
		public static float damageCoefficient = 7f;

		public static float procCoefficient = 1f;

		public static float baseDuration = 0.65f;

		public static float throwForce = 70f;

		public int rockets;

		private float duration;

		private float rocketDelayMax = 0.3f;

		private static float rocketDelay = 0f;

		private float fireTime;

		private bool hasFired;

		private Animator animator;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			fireTime = 0.1f * duration;
			rocketDelayMax = 0.3f / ((BaseState)this).attackSpeedStat;
			((EntityState)this).characterBody.SetAimTimer(2f);
			animator = ((EntityState)this).GetModelAnimator();
			Helpers.SwapToPrimary(((EntityState)this).characterBody);
			animator.SetFloat("weaponIndex", 0f);
		}

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

		private void Fire()
		{
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			//IL_025a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0261: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_026b: Unknown result type (might be due to invalid IL or missing references)
			if (hasFired)
			{
				return;
			}
			hasFired = true;
			if (((EntityState)this).isAuthority)
			{
				((EntityState)this).skillLocator.primary.AddOneStock();
				((EntityState)this).characterBody.SetSpreadBloom(3f, true);
				rocketDelay = rocketDelayMax;
				rockets--;
				NetworkingHelpers.ApplyBuff(((EntityState)this).characterBody, Buffs.bazookaLoadBuff.buffIndex, rockets, -1f);
				Ray aimRay = ((BaseState)this).GetAimRay();
				GameObject bazookaRocketPrefab = Projectiles.bazookaRocketPrefab;
				bazookaRocketPrefab.GetComponent<ProjectileController>().owner = ((EntityState)this).gameObject;
				if (!Object.op_Implicit((Object)(object)bazookaRocketPrefab.GetComponent<TF2ExplosionHandler>()))
				{
					TF2ExplosionHandler tF2ExplosionHandler = bazookaRocketPrefab.AddComponent<TF2ExplosionHandler>();
					tF2ExplosionHandler.rocketDamageBase = damageCoefficient;
					tF2ExplosionHandler.isBazooka = true;
				}
				Helpers.SwapToPrimary(((EntityState)this).characterBody);
				animator.SetFloat("weaponIndex", 0f);
				float num = 4f;
				int itemCount = ((EntityState)this).characterBody.inventory.GetItemCount(Items.MoreMissile);
				float num2 = 1f;
				if (itemCount > 1)
				{
					num2 += 0.5f * (float)(itemCount - 1);
				}
				ProjectileManager.instance.FireProjectile(bazookaRocketPrefab, ((Ray)(ref aimRay)).origin, Quaternion.Euler(Random.Range(0f - num, num), Random.Range(0f - num, num), 0f) * Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction), ((EntityState)this).gameObject, 0f, 1000f, false, (DamageColorIndex)0, (GameObject)null, RocketLauncher.throwForce);
				if (itemCount > 0)
				{
					GameObject icbmBazookaRocketPrefab = Projectiles.icbmBazookaRocketPrefab;
					ProjectileManager.instance.FireProjectile(icbmBazookaRocketPrefab, ((Ray)(ref aimRay)).origin, Quaternion.Euler(Random.Range((0f - num) * 2f, num * 2f), Random.Range((0f - num) * 2f, num * 2f), 0f) * Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction), ((EntityState)this).gameObject, 0f, 1000f, false, (DamageColorIndex)0, (GameObject)null, RocketLauncher.throwForce);
					ProjectileManager.instance.FireProjectile(icbmBazookaRocketPrefab, ((Ray)(ref aimRay)).origin, Quaternion.Euler(Random.Range((0f - num) * 2f, num * 2f), Random.Range((0f - num) * 2f, num * 2f), 0f) * Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction), ((EntityState)this).gameObject, 0f, 1000f, false, (DamageColorIndex)0, (GameObject)null, RocketLauncher.throwForce);
				}
			}
			Util.PlaySound("BeggarsLaunchSound", ((EntityState)this).gameObject);
			((EntityState)this).PlayAnimation("PrimaryFire, Override", "FirePrimary", "ThrowBomb.playbackRate", duration, 0f);
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			rocketDelay -= Time.deltaTime;
			if (((EntityState)this).isAuthority && rocketDelay <= 0f && rockets > 0)
			{
				Fire();
				hasFired = false;
			}
			if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority && rockets <= 0)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)2;
		}
	}
	public class DisciplinaryAction : BaseMeleeAttack
	{
		public override void OnEnter()
		{
			//IL_001a: 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_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
			Helpers.SwapToSpecial(((EntityState)this).characterBody);
			hitboxName = "Shovel";
			damageType = (DamageType)0;
			damageCoefficient = 2f;
			procCoefficient = 1f;
			pushForce = 100f;
			bonusForce = Vector3.zero;
			baseDuration = 1f;
			attackStartTime = 0.2f;
			attackEndTime = 0.4f;
			baseEarlyExitTime = 0.4f;
			hitStopDuration = 0.012f;
			attackRecoil = 0.5f;
			hitHopVelocity = 4f;
			swingSoundString = "WhipSwingSound";
			hitSoundString = "";
			muzzleString = ((swingIndex % 2 == 0) ? "SwingLeft" : "SwingRight");
			swingEffectPrefab = Assets.swordSwingEffect;
			hitEffectPrefab = Assets.swordHitImpactEffect;
			hitSoundString = "WhipHitEnemySound";
			base.OnEnter();
			TeamMask val = default(TeamMask);
			((TeamMask)(ref val)).AddTeam(((EntityState)this).characterBody.master.teamIndex);
			Ray aimRay = ((BaseState)this).GetAimRay();
			Vector3 val2 = Vector3.Normalize(((Ray)(ref aimRay)).direction);
			List<HurtBox> list = new SphereSearch
			{
				radius = 5f,
				mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask,
				origin = ((EntityState)this).transform.position + 2.5f * val2
			}.RefreshCandidates().FilterCandidatesByHurtBoxTeam(val).FilterCandidatesByDistinctHurtBoxEntities()
				.GetHurtBoxes()
				.ToList();
			bool flag = false;
			foreach (HurtBox item in list)
			{
				if ((Object)(object)item.healthComponent != (Object)(object)((EntityState)this).healthComponent)
				{
					NetworkingHelpers.ApplyBuff(((EntityState)this).characterBody, Buffs.whipBuff.buffIndex, 1, 40f);
					NetworkingHelpers.ApplyBuff(item.healthComponent.body, Buffs.whipBuff.buffIndex, 1, 40f);
					if (!flag)
					{
						flag = true;
						Util.PlaySound("WhipHitPlayerSound", ((Component)((EntityState)this).characterBody).gameObject);
					}
					Util.CleanseBody(item.healthComponent.body, true, false, false, true, true, false);
					Util.CleanseBody(((EntityState)this).characterBody, true, false, false, true, true, false);
				}
			}
		}

		protected override void PlayAttackAnimation()
		{
			base.PlayAttackAnimation();
		}

		protected override void PlaySwingEffect()
		{
			base.PlaySwingEffect();
		}

		protected override void OnHitEnemyAuthority()
		{
			base.OnHitEnemyAuthority();
		}

		protected override void SetNextState()
		{
			if (swingIndex == 0)
			{
				int num = 1;
			}
			else
			{
				int num = 0;
			}
		}

		public override void OnExit()
		{
			base.OnExit();
		}
	}
	public class ParachuteAnimController : MonoBehaviour
	{
		private bool isReady;

		private void Start()
		{
			if (!isReady)
			{
				InitAnims();
			}
		}

		private void InitAnims()
		{
			isReady = true;
		}
	}
	public class Manntreads : BaseSkillState
	{
		public static float damageCoefficient = 0.65f;

		public static float procCoefficient = 0.5f;

		public static float baseDuration = 0.6f;

		public static float force = 50f;

		public static float recoil = 3f;

		public static float range = 256f;

		public static float velocityThreshold = 25f;

		public static float velocityMaximum = 50f;

		public static GameObject tracerEffectPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/Tracers/TracerGoldGat");

		private float duration;

		private float fireTime;

		private bool hasFired;

		private string muzzleString;

		private Animator animator;

		private GameObject rocketLauncherObj;

		private GameObject bazookaLauncherObj;

		private GameObject shotgunObj;

		private GameObject shovelObj;

		public void Awake()
		{
		}

		public void OnDestroy()
		{
		}

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
		}

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

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

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

		private GameObject shotgunObj;

		private GameObject shovelObj;

		private GameObject bazookaLauncherObj;

		private GameObject airStrikeLauncherObj;

		private GameObject jumperLauncherObj;

		public override void OnEnter()
		{
			//IL_001a: 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_0046: Unknown result type (might be due to invalid IL or missing references)
			Helpers.SwapToSpecial(((EntityState)this).characterBody);
			hitboxName = "Shovel";
			damageType = (DamageType)0;
			damageCoefficient = 1.5f;
			procCoefficient = 1f;
			pushForce = 100f;
			bonusForce = Vector3.zero;
			baseDuration = 1f;
			attackStartTime = 0.2f;
			attackEndTime = 0.4f;
			baseEarlyExitTime = 0.4f;
			hitStopDuration = 0.012f;
			attackRecoil = 0.5f;
			hitHopVelocity = 4f;
			swingSoundString = "ShovelSwingSound";
			hitSoundString = "";
			muzzleString = ((swingIndex % 2 == 0) ? "SwingLeft" : "SwingRight");
			swingEffectPrefab = Assets.swordSwingEffect;
			hitEffectPrefab = Assets.swordHitImpactEffect;
			if (((EntityState)this).characterBody.HasBuff(Buffs.rocketJumpingBuff))
			{
				forceCrit = true;
				hitSoundString = "CritSound";
				damageCoefficient = 25f;
			}
			else
			{
				hitSoundString = "ShovelHitSound";
			}
			base.OnEnter();
		}

		protected override void PlayAttackAnimation()
		{
			base.PlayAttackAnimation();
		}

		protected override void PlaySwingEffect()
		{
			base.PlaySwingEffect();
		}

		protected override void OnHitEnemyAuthority()
		{
			base.OnHitEnemyAuthority();
		}

		protected override void SetNextState()
		{
			int num = ((swingIndex == 0) ? 1 : 0);
			((EntityState)this).outer.SetNextState((EntityState)(object)new MarketGardener
			{
				swingIndex = num
			});
		}

		public override void OnExit()
		{
			base.OnExit();
		}
	}
	internal class ParachuteToggle : BaseSkillState
	{
		public static float enterDuration = 0.2f;

		public static float exitDuration = 0.2f;

		private bool hasToggled;

		private float duration;

		private GameObject chuteObj;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			chuteObj = ((EntityState)this).GetModelChildLocator().FindChildGameObject("BaseJumperChute");
		}

		public void Toggle()
		{
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			if (hasToggled)
			{
				return;
			}
			hasToggled = true;
			if (((BaseState)this).HasBuff(Buffs.parachuteBuff))
			{
				Util.PlaySound("ParachuteCloseSound", ((EntityState)this).gameObject);
				PlayAnimation(chuteObj.GetComponent<Animator>(), "Retract", "Retract");
				chuteObj.SetActive(false);
				duration = enterDuration / ((BaseState)this).attackSpeedStat;
				if (((EntityState)this).isAuthority)
				{
					NetworkingHelpers.ApplyBuff(((EntityState)this).characterBody, Buffs.parachuteBuff.buffIndex, 0, -1f);
				}
			}
			else
			{
				Util.PlaySound("ParachuteOpenSound", ((EntityState)this).gameObject);
				chuteObj.SetActive(true);
				PlayAnimation(chuteObj.GetComponent<Animator>(), "Deploy", "Deploy");
				duration = exitDuration / ((BaseState)this).attackSpeedStat;
				if (((EntityState)this).isAuthority)
				{
					NetworkingHelpers.ApplyBuff(((EntityState)this).characterBody, Buffs.parachuteBuff.buffIndex, 1, -1f);
				}
			}
		}

		private void PlayAnimation(Animator animator, string layerName, string animationStateName)
		{
			int layerIndex = animator.GetLayerIndex(layerName);
			animator.speed = 1f;
			animator.Update(0f);
			animator.PlayInFixedTime(animationStateName, layerIndex, 0f);
		}

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

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0017: 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_001a: Unknown result type (might be due to invalid IL or missing references)
			if (((BaseState)this).HasBuff(Buffs.parachuteBuff))
			{
				return (InterruptPriority)2;
			}
			return (InterruptPriority)1;
		}
	}
	public class ReserveShoot : BaseSkillState
	{
		public static float damageCoefficient = 0.5f;

		public static float procCoefficient = 0.5f;

		public static float baseDuration = 0.6f;

		public static float force = 50f;

		public static float recoil = 3f;

		public static float range = 256f;

		public static GameObject tracerEffectPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/Tracers/TracerGoldGat");

		private float duration;

		private float fireTime;

		private bool hasFired;

		private string muzzleString;

		private Animator animator;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			fireTime = 0.2f * duration;
			((EntityState)this).characterBody.SetAimTimer(2f);
			muzzleString = "Muzzle";
			Helpers.SwapToSecondary(((EntityState)this).characterBody);
			animator = ((EntityState)this).GetModelAnimator();
			animator.SetFloat("weaponIndex", 1f);
			((EntityState)this).PlayAnimation("PrimaryFire, Override", "FireSecondary", "ShootGun.playbackRate", 1.8f, 0f);
		}

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

		private void Fire()
		{
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: 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_01b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c1: Expected O, but got Unknown
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			if (!hasFired)
			{
				hasFired = true;
				((EntityState)this).characterBody.AddSpreadBloom(1.5f);
				EffectManager.SimpleMuzzleFlash(FirePistol2.muzzleEffectPrefab, ((EntityState)this).gameObject, muzzleString, false);
				Util.PlaySound("ReserveShooterShootSound", ((EntityState)this).gameObject);
				if (((EntityState)this).isAuthority)
				{
					Ray aimRay = ((BaseState)this).GetAimRay();
					((BaseState)this).AddRecoil(-1f * ShotgunShoot.recoil, -2f * ShotgunShoot.recoil, -0.5f * ShotgunShoot.recoil, 0.5f * ShotgunShoot.recoil);
					BulletAttack val = new BulletAttack
					{
						bulletCount = 9u,
						aimVector = ((Ray)(ref aimRay)).direction,
						origin = ((Ray)(ref aimRay)).origin,
						damage = damageCoefficient * ((BaseState)this).damageStat,
						damageColorIndex = (DamageColorIndex)0,
						damageType = DamageTypeCombo.op_Implicit((DamageType)0),
						falloffModel = (FalloffModel)0,
						maxDistance = ShotgunShoot.range,
						force = ShotgunShoot.force,
						hitMask = CommonMasks.bullet,
						minSpread = 0f,
						maxSpread = 0.8f,
						isCrit = ((BaseState)this).RollCrit(),
						owner = ((EntityState)this).gameObject,
						muzzleName = muzzleString,
						smartCollision = false,
						procChainMask = default(ProcChainMask),
						procCoefficient = procCoefficient,
						radius = 0f,
						sniper = false,
						stopperMask = CommonMasks.bullet,
						weapon = null,
						tracerEffectPrefab = ShotgunShoot.tracerEffectPrefab,
						spreadPitchScale = 1f,
						spreadYawScale = 1f,
						queryTriggerInteraction = (QueryTriggerInteraction)0,
						hitEffectPrefab = FirePistol2.hitEffectPrefab
					};
					DamageAPI.AddModdedDamageType(val, TF2SoldierPlugin.ReserveShooterHit);
					val.Fire();
				}
			}
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (((EntityState)this).fixedAge >= fireTime)
			{
				Fire();
			}
			if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
			{
				if (((EntityState)this).skillLocator.secondary.stock < ((EntityState)this).skillLocator.secondary.maxStock)
				{
					((EntityState)this).outer.SetNextState((EntityState)(object)new ShotgunReload());
				}
				else
				{
					((EntityState)this).outer.SetNextStateToMain();
				}
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)2;
		}
	}
	public class RocketJumper : BaseSkillState
	{
		public static float damageCoefficient = 0f;

		public static float procCoefficient = 0f;

		public static float baseDuration = 0.65f;

		public static float throwForce = 70f;

		private float duration;

		private float fireTime;

		private bool hasFired;

		private Animator animator;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			duration = RocketLauncher.baseDuration / ((BaseState)this).attackSpeedStat;
			fireTime = 0.1f * duration;
			((EntityState)this).characterBody.SetAimTimer(2f);
			animator = ((EntityState)this).GetModelAnimator();
			Helpers.SwapToPrimary(((EntityState)this).characterBody);
			animator.SetFloat("weaponIndex", 0f);
			Util.PlaySound("RocketJumperLaunchSound", ((EntityState)this).gameObject);
			((EntityState)this).PlayAnimation("PrimaryFire, Override", "FirePrimary", "ThrowBomb.playbackRate", duration, 0f);
		}

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

		private void Fire()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			if (hasFired)
			{
				return;
			}
			hasFired = true;
			if (((EntityState)this).isAuthority)
			{
				Ray aimRay = ((BaseState)this).GetAimRay();
				GameObject rocketJumperPrefab = Projectiles.rocketJumperPrefab;
				rocketJumperPrefab.GetComponent<ProjectileController>().owner = ((EntityState)this).gameObject;
				if (!Object.op_Implicit((Object)(object)rocketJumperPrefab.GetComponent<TF2JumperExplosionHandler>()))
				{
					rocketJumperPrefab.AddComponent<TF2JumperExplosionHandler>();
				}
				ProjectileManager.instance.FireProjectile(rocketJumperPrefab, ((Ray)(ref aimRay)).origin, Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction), ((EntityState)this).gameObject, damageCoefficient * ((BaseState)this).damageStat, 0f, ((BaseState)this).RollCrit(), (DamageColorIndex)0, (GameObject)null, RocketLauncher.throwForce);
			}
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (((EntityState)this).fixedAge >= fireTime)
			{
				Fire();
			}
			if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
			{
				if (((EntityState)this).skillLocator.primary.stock < ((EntityState)this).skillLocator.primary.maxStock)
				{
					((EntityState)this).outer.SetNextState((EntityState)(object)new RocketReload());
				}
				else
				{
					((EntityState)this).outer.SetNextStateToMain();
				}
			}
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)2;
		}
	}
	[RequireComponent(typeof(ProjectileController))]
	public class TF2JumperExplosionHandler : MonoBehaviour, IProjectileImpactBehavior
	{
		private ProjectileController projectileController;

		private float explodeRadius;

		private bool hasDetonated;

		protected virtual void Awake()
		{
			projectileController = ((Component)this).GetComponent<ProjectileController>();
			explodeRadius = ((ProjectileExplosion)((Component)this).GetComponent<ProjectileImpactExplosion>()).blastRadius;
			hasDetonated = false;
		}

		public void OnProjectileImpact(ProjectileImpactInfo impactInfo)
		{
			if (!hasDetonated)
			{
				hasDetonated = true;
				Detonate();
			}
		}

		public void Detonate()
		{
			DetonateServer();
		}

		protected void DetonateServer()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: 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_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_019d: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: Expected O, but got Unknown
			//IL_0206: Unknown result type (might be due to invalid IL or missing references)
			//IL_020a: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Unknown result type (might be due to invalid IL or missing references)
			//IL_0259: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_029a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0270: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody component = projectileController.owner.GetComponent<CharacterBody>();
			TeamMask val = default(TeamMask);
			((TeamMask)(ref val)).AddTeam(projectileController.teamFilter.teamIndex);
			List<HurtBox> list = new SphereSearch
			{
				radius = explodeRadius,
				mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask,
				origin = ((Component)this).transform.position
			}.RefreshCandidates().FilterCandidatesByHurtBoxTeam(val).FilterCandidatesByDistinctHurtBoxEntities()
				.GetHurtBoxes()
				.ToList();
			Vector3 val3 = default(Vector3);
			foreach (HurtBox item in list)
			{
				Vector3 corePosition = component.corePosition;
				Vector3 position = ((Component)this).transform.position;
				Vector3 val2 = corePosition - position;
				if (!(((Vector3)(ref val2)).magnitude < explodeRadius) || !((Object)(object)item.healthComponent.body == (Object)(object)component))
				{
					continue;
				}
				Vector3 normalized = ((Vector3)(ref val2)).normalized;
				((Vector3)(ref val3))..ctor(6100f, 6100f, 6100f);
				Vector3 val4 = Vector3.Scale(normalized, val3) * Mathf.Min(1f / Vector3.Distance(corePosition, position), 1f);
				CharacterMotor characterMotor = component.characterMotor;
				((BaseCharacterController)characterMotor).Motor.ForceUnground(0.1f);
				bool isGrounded = characterMotor.isGrounded;
				float num = 0.5f;
				if (!isGrounded)
				{
					num = 1.5f;
				}
				NetworkingHelpers.ApplyBuff(component, Buffs.rocketJumpingBuff.buffIndex, 1, -1f);
				NetworkingHelpers.DealDamage(new DamageInfo
				{
					damage = component.healthComponent.combinedHealth * 0f,
					force = Vector3.zero,
					position = component.corePosition,
					damageColorIndex = (DamageColorIndex)0,
					crit = false,
					attacker = null,
					inflictor = null,
					damageType = DamageTypeCombo.op_Implicit((DamageType)262146),
					procCoefficient = 0f,
					procChainMask = default(ProcChainMask)
				}, component.mainHurtBox, true, false, false);
				Vector3 val5 = val4 * num;
				float num2 = 4500f;
				if (Mathf.Abs(val5.x) > num2)
				{
					if (val5.x < 0f)
					{
						val5.x = 0f - num2;
					}
					else
					{
						val5.x = num2;
					}
				}
				if (Mathf.Abs(val5.y) > num2)
				{
					if (val5.y < 0f)
					{
						val5.y = 0f - num2;
					}
					else
					{
						val5.y = num2;
					}
				}
				if (Mathf.Abs(val5.z) > num2)
				{
					if (val5.z < 0f)
					{
						val5.z = 0f - num2;
					}
					else
					{
						val5.z = num2;
					}
				}
				component.characterMotor.ApplyForce(val5, false, false);
			}
		}
	}
	public class RocketLauncher : BaseSkillState
	{
		public static float damageCoefficient = 6f;

		public static float procCoefficient = 1f;

		public static float baseDuration = 0.65f;

		public static float throwForce = 70f;

		private float duration;

		private float fireTime;

		private bool hasFired;

		private Animator animator;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			fireTime = 0.1f * duration;
			((EntityState)this).characterBody.SetAimTimer(2f);
			animator = ((EntityState)this).GetModelAnimator();
			Helpers.SwapToPrimary(((EntityState)this).characterBody);
			animator.SetFloat("weaponIndex", 0f);
			Util.PlaySound("RocketSound", ((EntityState)this).gameObject);
			((EntityState)this).PlayAnimation("PrimaryFire, Override", "FirePrimary", "ThrowBomb.playbackRate", duration, 0f);
		}

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

		private void Fire()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing ref