plugins/SpyMod.dll

Decompiled a day 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 AncientScepter;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EmotesAPI;
using EntityStates;
using EntityStates.AI.Walker;
using EntityStates.BrotherMonster;
using EntityStates.Commando.CommandoWeapon;
using HG;
using HG.BlendableTypes;
using JetBrains.Annotations;
using KinematicCharacterController;
using On.RoR2;
using On.RoR2.UI;
using R2API;
using R2API.Networking;
using R2API.Networking.Interfaces;
using R2API.Utils;
using RoR2;
using RoR2.Achievements;
using RoR2.Audio;
using RoR2.CharacterAI;
using RoR2.ContentManagement;
using RoR2.HudOverlay;
using RoR2.Navigation;
using RoR2.Orbs;
using RoR2.Projectile;
using RoR2.Skills;
using RoR2.UI;
using SpyMod.Modules;
using SpyMod.Modules.Achievements;
using SpyMod.Modules.BaseStates;
using SpyMod.Modules.Characters;
using SpyMod.Spy;
using SpyMod.Spy.Components;
using SpyMod.Spy.Content;
using SpyMod.Spy.SkillStates;
using ThreeEyedGames;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using UnityEngine.Rendering;
using UnityEngine.Rendering.PostProcessing;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("SpyMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+362fef4f942e837a4d53695cdc85824ad32a307a")]
[assembly: AssemblyProduct("SpyMod")]
[assembly: AssemblyTitle("SpyMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
internal enum SpyCameraParams
{
	DEFAULT,
	AIM_PISTOL,
	AIM_SNIPER,
	EMOTE
}
namespace SpyMod
{
	internal static class Log
	{
		internal static ManualLogSource _logSource;

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

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

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

		internal static void ErrorAssetBundle(string assetName, string bundleName)
		{
			Error("failed to load asset, " + assetName + ", because it does not exist in asset bundle, " + bundleName);
		}

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

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

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

		internal static void Warning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.kenko.Spy", "Spy", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class SpyPlugin : BaseUnityPlugin
	{
		public const string MODUID = "com.kenko.Spy";

		public const string MODNAME = "Spy";

		public const string MODVERSION = "1.0.0";

		public const string DEVELOPER_PREFIX = "KENKO";

		public static SpyPlugin instance;

		public static bool emotesInstalled => Chainloader.PluginInfos.ContainsKey("com.weliveinasociety.CustomEmotesAPI");

		public static bool scepterInstalled => Chainloader.PluginInfos.ContainsKey("com.DestroyedClone.AncientScepter");

		private void Awake()
		{
			instance = this;
			NetworkingAPI.RegisterMessageType<SyncStabExplosion>();
			NetworkingAPI.RegisterMessageType<SyncStealth>();
			NetworkingAPI.RegisterMessageType<SyncResetStab>();
			Log.Init(((BaseUnityPlugin)this).Logger);
			Language.Init();
			new SpySurvivor().Initialize();
			new SpyDecoy().Initialize();
			new ContentPacks().Initialize();
		}

		private void Start()
		{
			SoundBanks.Init();
		}
	}
}
namespace SpyMod.Spy
{
	public class SpyDecoy : CharacterBase<SpyDecoy>
	{
		public const string SPY_PREFIX = "KENKO_SPY_DECOY_";

		internal static GameObject characterPrefab;

		public static GameObject decoyMasterPrefab;

		public static SpawnCard decoySpawnCard;

		public override string assetBundleName => "spy";

		public override string bodyName => "SpyDecoyBody";

		public override string modelPrefabName => "mdlSpyDecoy";

		public override BodyInfo bodyInfo => new BodyInfo
		{
			bodyName = bodyName,
			bodyNameToken = "KENKO_SPY_DECOY_NAME",
			subtitleNameToken = "KENKO_SPY_DECOY_SUBTITLE",
			characterPortrait = assetBundle.LoadAsset<Texture>("texSpyIcon"),
			bodyColor = SpyAssets.spyColor,
			crosshair = Assets.LoadCrosshair("Standard"),
			podPrefab = null,
			maxHealth = 1f,
			healthRegen = 0f,
			armor = 0f,
			damage = 0f,
			moveSpeed = 0f,
			moveSpeedGrowth = 0f,
			damageGrowth = 0f,
			healthGrowth = 0f,
			jumpCount = 0
		};

		public override CustomRendererInfo[] customRendererInfos => new CustomRendererInfo[6]
		{
			new CustomRendererInfo
			{
				childName = "Model",
				dontHotpoo = true
			},
			new CustomRendererInfo
			{
				childName = "Revolver",
				dontHotpoo = true
			},
			new CustomRendererInfo
			{
				childName = "Knife",
				dontHotpoo = true
			},
			new CustomRendererInfo
			{
				childName = "Watch",
				dontHotpoo = true
			},
			new CustomRendererInfo
			{
				childName = "Tie",
				dontHotpoo = true
			},
			new CustomRendererInfo
			{
				childName = "Visor",
				dontHotpoo = true
			}
		};

		public override ItemDisplaysBase itemDisplays => null;

		public override AssetBundle assetBundle { get; protected set; }

		public override GameObject bodyPrefab { get; protected set; }

		public override CharacterBody prefabCharacterBody { get; protected set; }

		public override GameObject characterModelObject { get; protected set; }

		public override CharacterModel prefabCharacterModel { get; protected set; }

		public override void Initialize()
		{
			base.Initialize();
		}

		public override void InitializeCharacter()
		{
			base.InitializeCharacter();
			ChildLocator componentInChildren = bodyPrefab.GetComponentInChildren<ChildLocator>();
			((Component)componentInChildren.FindChild("Knife")).gameObject.SetActive(false);
			((Component)componentInChildren.FindChild("Watch")).gameObject.SetActive(false);
			bodyPrefab.layer = LayerIndex.fakeActor.intVal;
			InitializeEntityStateMachines();
			InitializeSkills();
			InitializeSkins();
			InitializeCharacterMaster();
			characterPrefab = bodyPrefab;
		}

		public override void InitializeEntityStateMachines()
		{
			Prefabs.ClearEntityStateMachines(bodyPrefab);
			Prefabs.AddMainEntityStateMachine(bodyPrefab, "Body", typeof(GenericCharacterMain), typeof(DecoySpawn));
		}

		public override void InitializeSkills()
		{
			Skills.CreateDecoySkillFamilies(bodyPrefab);
		}

		public override void InitializeSkins()
		{
			ModelSkinController val = ((Component)prefabCharacterModel).gameObject.AddComponent<ModelSkinController>();
			ChildLocator component = ((Component)prefabCharacterModel).GetComponent<ChildLocator>();
			RendererInfo[] baseRendererInfos = prefabCharacterModel.baseRendererInfos;
			List<SkinDef> list = new List<SkinDef>();
			SkinDef item = Skins.CreateSkinDef("DEFAULT_SKIN", assetBundle.LoadAsset<Sprite>("texDefaultSkin"), baseRendererInfos, ((Component)prefabCharacterModel).gameObject);
			list.Add(item);
			val.skins = list.ToArray();
		}

		public override void InitializeCharacterMaster()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Lemurian/LemurianMaster.prefab").WaitForCompletion(), "SpyDecoyMaster");
			CharacterMaster component = val.GetComponent<CharacterMaster>();
			component.bodyPrefab = bodyPrefab;
			BaseAI component2 = val.GetComponent<BaseAI>();
			component2.neverRetaliateFriendlies = true;
			component2.aimVectorMaxSpeed *= 3f;
			component2.fullVision = true;
			InitializeSkillDrivers(val);
			decoyMasterPrefab = val;
			SpyMod.Modules.Content.AddMasterPrefab(val);
			CreateSpawnCard();
		}

		private void CreateSpawnCard()
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			CharacterSpawnCard val = ScriptableObject.CreateInstance<CharacterSpawnCard>();
			((Object)val).name = "cssSpyDecoy";
			((SpawnCard)val).prefab = decoyMasterPrefab;
			((SpawnCard)val).sendOverNetwork = true;
			((SpawnCard)val).hullSize = (HullClassification)0;
			((SpawnCard)val).nodeGraphType = (GraphType)0;
			((SpawnCard)val).requiredFlags = (NodeFlags)0;
			((SpawnCard)val).forbiddenFlags = (NodeFlags)4;
			((SpawnCard)val).eliteRules = (EliteRules)0;
			((SpawnCard)val).occupyPosition = false;
			decoySpawnCard = (SpawnCard)(object)val;
		}

		protected virtual void InitializeSkillDrivers(GameObject masterPrefab)
		{
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: 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_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0206: 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_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_022d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_036d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0375: Unknown result type (might be due to invalid IL or missing references)
			//IL_037d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0399: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_042d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0435: Unknown result type (might be due to invalid IL or missing references)
			//IL_043d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0459: Unknown result type (might be due to invalid IL or missing references)
			AISkillDriver[] componentsInChildren = masterPrefab.GetComponentsInChildren<AISkillDriver>();
			foreach (AISkillDriver val in componentsInChildren)
			{
				Object.DestroyImmediate((Object)(object)val);
			}
			AISkillDriver val2 = masterPrefab.AddComponent<AISkillDriver>();
			val2.customName = "DoNothing1";
			val2.skillSlot = (SkillSlot)(-1);
			val2.requireSkillReady = true;
			val2.minUserHealthFraction = float.NegativeInfinity;
			val2.maxUserHealthFraction = float.PositiveInfinity;
			val2.minTargetHealthFraction = float.NegativeInfinity;
			val2.maxTargetHealthFraction = float.PositiveInfinity;
			val2.minDistance = 0f;
			val2.maxDistance = float.PositiveInfinity;
			val2.activationRequiresAimConfirmation = false;
			val2.activationRequiresTargetLoS = false;
			val2.selectionRequiresTargetLoS = false;
			val2.maxTimesSelected = -1;
			val2.moveTargetType = (TargetType)0;
			val2.movementType = (MovementType)0;
			val2.aimType = (AimType)0;
			val2.moveInputScale = 1f;
			val2.ignoreNodeGraph = false;
			val2.buttonPressType = (ButtonPressType)0;
			AISkillDriver val3 = masterPrefab.AddComponent<AISkillDriver>();
			val3.customName = "DoNothing2";
			val3.skillSlot = (SkillSlot)(-1);
			val3.requireSkillReady = true;
			val3.minUserHealthFraction = float.NegativeInfinity;
			val3.maxUserHealthFraction = float.PositiveInfinity;
			val3.minTargetHealthFraction = float.NegativeInfinity;
			val3.maxTargetHealthFraction = float.PositiveInfinity;
			val3.minDistance = 0f;
			val3.maxDistance = float.PositiveInfinity;
			val3.activationRequiresAimConfirmation = false;
			val3.activationRequiresTargetLoS = false;
			val3.selectionRequiresTargetLoS = false;
			val3.maxTimesSelected = -1;
			val3.moveTargetType = (TargetType)0;
			val3.movementType = (MovementType)0;
			val3.aimType = (AimType)0;
			val3.moveInputScale = 1f;
			val3.ignoreNodeGraph = false;
			val3.buttonPressType = (ButtonPressType)0;
			AISkillDriver val4 = masterPrefab.AddComponent<AISkillDriver>();
			val4.customName = "DoNothing3";
			val4.skillSlot = (SkillSlot)(-1);
			val4.requireSkillReady = true;
			val4.minUserHealthFraction = float.NegativeInfinity;
			val4.maxUserHealthFraction = float.PositiveInfinity;
			val4.minTargetHealthFraction = float.NegativeInfinity;
			val4.maxTargetHealthFraction = float.PositiveInfinity;
			val4.minDistance = 0f;
			val4.maxDistance = float.PositiveInfinity;
			val4.activationRequiresAimConfirmation = false;
			val4.activationRequiresTargetLoS = false;
			val4.selectionRequiresTargetLoS = false;
			val4.maxTimesSelected = -1;
			val4.moveTargetType = (TargetType)0;
			val4.movementType = (MovementType)0;
			val4.aimType = (AimType)0;
			val4.moveInputScale = 1f;
			val4.ignoreNodeGraph = false;
			val4.buttonPressType = (ButtonPressType)0;
			AISkillDriver val5 = masterPrefab.AddComponent<AISkillDriver>();
			val5.customName = "DoNothing4";
			val5.skillSlot = (SkillSlot)(-1);
			val5.requireSkillReady = true;
			val5.minUserHealthFraction = float.NegativeInfinity;
			val5.maxUserHealthFraction = float.PositiveInfinity;
			val5.minTargetHealthFraction = float.NegativeInfinity;
			val5.maxTargetHealthFraction = float.PositiveInfinity;
			val5.minDistance = 0f;
			val5.maxDistance = float.PositiveInfinity;
			val5.activationRequiresAimConfirmation = false;
			val5.activationRequiresTargetLoS = false;
			val5.selectionRequiresTargetLoS = false;
			val5.maxTimesSelected = -1;
			val5.moveTargetType = (TargetType)0;
			val5.movementType = (MovementType)0;
			val5.aimType = (AimType)0;
			val5.moveInputScale = 1f;
			val5.ignoreNodeGraph = false;
			val5.buttonPressType = (ButtonPressType)0;
			AISkillDriver val6 = masterPrefab.AddComponent<AISkillDriver>();
			val6.customName = "DoNothing5";
			val6.skillSlot = (SkillSlot)(-1);
			val6.requireSkillReady = true;
			val6.minUserHealthFraction = float.NegativeInfinity;
			val6.maxUserHealthFraction = float.PositiveInfinity;
			val6.minTargetHealthFraction = float.NegativeInfinity;
			val6.maxTargetHealthFraction = float.PositiveInfinity;
			val6.minDistance = 0f;
			val6.maxDistance = float.PositiveInfinity;
			val6.activationRequiresAimConfirmation = false;
			val6.activationRequiresTargetLoS = false;
			val6.selectionRequiresTargetLoS = false;
			val6.maxTimesSelected = -1;
			val6.moveTargetType = (TargetType)0;
			val6.movementType = (MovementType)0;
			val6.aimType = (AimType)0;
			val6.moveInputScale = 1f;
			val6.ignoreNodeGraph = false;
			val6.buttonPressType = (ButtonPressType)0;
			AISkillDriver val7 = masterPrefab.AddComponent<AISkillDriver>();
			val7.customName = "DoNothing6";
			val7.skillSlot = (SkillSlot)(-1);
			val7.requireSkillReady = true;
			val7.minUserHealthFraction = float.NegativeInfinity;
			val7.maxUserHealthFraction = float.PositiveInfinity;
			val7.minTargetHealthFraction = float.NegativeInfinity;
			val7.maxTargetHealthFraction = float.PositiveInfinity;
			val7.minDistance = 0f;
			val7.maxDistance = float.PositiveInfinity;
			val7.activationRequiresAimConfirmation = false;
			val7.activationRequiresTargetLoS = false;
			val7.selectionRequiresTargetLoS = false;
			val7.maxTimesSelected = -1;
			val7.moveTargetType = (TargetType)0;
			val7.movementType = (MovementType)0;
			val7.aimType = (AimType)0;
			val7.moveInputScale = 1f;
			val7.ignoreNodeGraph = false;
			val7.buttonPressType = (ButtonPressType)0;
		}
	}
	public class SpySurvivor : SurvivorBase<SpySurvivor>
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static hook_Init <>9__63_0;

			internal void <Emotes>b__63_0(orig_Init orig)
			{
				orig.Invoke();
				GameObject val = SpyAssets.mainAssetBundle.LoadAsset<GameObject>("spy_emoteskeleton");
				CustomEmotesAPI.ImportArmature(characterPrefab, val, 0, true);
			}
		}

		public const string SPY_PREFIX = "KENKO_SPY_";

		internal static GameObject characterPrefab;

		public static SkillDef cloakScepterSkillDef;

		public static SkillDef deadmanScepterSkillDef;

		public override string assetBundleName => "spy";

		public override string bodyName => "SpyBody";

		public override string masterName => "SpyMonsterMaster";

		public override string modelPrefabName => "mdlSpy";

		public override string displayPrefabName => "SpyDisplay";

		public override string survivorTokenPrefix => "KENKO_SPY_";

		public override BodyInfo bodyInfo => new BodyInfo
		{
			bodyName = bodyName,
			bodyNameToken = "KENKO_SPY_NAME",
			subtitleNameToken = "KENKO_SPY_SUBTITLE",
			characterPortrait = assetBundle.LoadAsset<Texture>("texSpyIcon"),
			bodyColor = SpyAssets.spyColor,
			sortPosition = 7f,
			crosshair = Assets.LoadCrosshair("Standard"),
			podPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/NetworkedObjects/SurvivorPod"),
			maxHealth = 100f,
			healthRegen = 1.2f,
			armor = 0f,
			damage = 12f,
			damageGrowth = 2.4f,
			healthGrowth = 35f,
			jumpCount = 1
		};

		public override CustomRendererInfo[] customRendererInfos => new CustomRendererInfo[6]
		{
			new CustomRendererInfo
			{
				childName = "Model",
				dontHotpoo = true
			},
			new CustomRendererInfo
			{
				childName = "Revolver",
				dontHotpoo = true
			},
			new CustomRendererInfo
			{
				childName = "Knife",
				dontHotpoo = true
			},
			new CustomRendererInfo
			{
				childName = "Watch",
				dontHotpoo = true
			},
			new CustomRendererInfo
			{
				childName = "Tie",
				dontHotpoo = true
			},
			new CustomRendererInfo
			{
				childName = "Visor",
				dontHotpoo = true
			}
		};

		public override UnlockableDef characterUnlockableDef => SpyUnlockables.characterUnlockableDef;

		public override ItemDisplaysBase itemDisplays => new SpyItemDisplays();

		public override AssetBundle assetBundle { get; protected set; }

		public override GameObject bodyPrefab { get; protected set; }

		public override CharacterBody prefabCharacterBody { get; protected set; }

		public override GameObject characterModelObject { get; protected set; }

		public override CharacterModel prefabCharacterModel { get; protected set; }

		public override GameObject displayPrefab { get; protected set; }

		public override void Initialize()
		{
			base.Initialize();
		}

		public override void InitializeCharacter()
		{
			SpyConfig.Init();
			SpyUnlockables.Init();
			base.InitializeCharacter();
			SpyCrosshair.Init(assetBundle);
			CameraParams.InitializeParams();
			ChildLocator componentInChildren = bodyPrefab.GetComponentInChildren<ChildLocator>();
			((Component)componentInChildren.FindChild("Knife")).gameObject.SetActive(false);
			((Component)componentInChildren.FindChild("Watch")).gameObject.SetActive(false);
			DamageTypes.Init();
			SpyStates.Init();
			SpyTokens.Init();
			SpyAssets.Init(assetBundle);
			SpyBuffs.Init(assetBundle);
			InitializeEntityStateMachines();
			InitializeSkills();
			InitializeSkins();
			InitializeCharacterMaster();
			AdditionalBodySetup();
			characterPrefab = bodyPrefab;
			AddHooks();
		}

		private void AdditionalBodySetup()
		{
			AddHitboxes();
			bodyPrefab.AddComponent<SpyController>();
		}

		public void AddHitboxes()
		{
			Prefabs.SetupHitBoxGroup(characterModelObject, "KnifeHitbox", "KnifeHitbox");
		}

		public override void InitializeEntityStateMachines()
		{
			Prefabs.ClearEntityStateMachines(bodyPrefab);
			Prefabs.AddMainEntityStateMachine(bodyPrefab, "Body", typeof(MainState), typeof(SpawnTeleporterState));
			Prefabs.AddEntityStateMachine(bodyPrefab, "Weapon");
			Prefabs.AddEntityStateMachine(bodyPrefab, "Weapon2");
			Prefabs.AddEntityStateMachine(bodyPrefab, "Watch");
		}

		public override void InitializeSkills()
		{
			bodyPrefab.AddComponent<SpyPassive>();
			Skills.CreateSkillFamilies(bodyPrefab);
			AddPassiveSkills();
			AddPrimarySkills();
			AddSecondarySkills();
			AddUtilitySkills();
			AddSpecialSkills();
			if (SpyPlugin.scepterInstalled)
			{
				InitializeScepter();
			}
		}

		private void AddPassiveSkills()
		{
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			SpyPassive component = bodyPrefab.GetComponent<SpyPassive>();
			SkillLocator component2 = bodyPrefab.GetComponent<SkillLocator>();
			component2.passiveSkill.enabled = false;
			component.spyPassive = Skills.CreateSkillDef(new SkillDefInfo
			{
				skillName = "KENKO_SPY_PASSIVE_NAME",
				skillNameToken = "KENKO_SPY_PASSIVE_NAME",
				skillDescriptionToken = "KENKO_SPY_PASSIVE_DESCRIPTION",
				skillIcon = assetBundle.LoadAsset<Sprite>("texSpyPassive"),
				keywordTokens = new string[1] { Tokens.spyBackstabKeyword },
				activationState = new SerializableEntityStateType(typeof(Idle)),
				activationStateMachineName = "",
				baseMaxStock = 1,
				baseRechargeInterval = 0f,
				beginSkillCooldownOnSkillEnd = false,
				canceledFromSprinting = false,
				forceSprintDuringState = false,
				fullRestockOnAssign = true,
				interruptPriority = (InterruptPriority)0,
				resetCooldownTimerOnUse = false,
				isCombatSkill = false,
				mustKeyPress = false,
				cancelSprintingOnActivation = false,
				rechargeStock = 1,
				requiredStock = 2,
				stockToConsume = 1
			});
			Skills.AddPassiveSkills(component.passiveSkillSlot.skillFamily, component.spyPassive);
		}

		private void AddPrimarySkills()
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: 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)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			SkillDefInfo skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "Diamondback";
			skillDefInfo.skillNameToken = "KENKO_SPY_PRIMARY_REVOLVER_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SPY_PRIMARY_REVOLVER_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[1] { Tokens.spyCritKeyword };
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texSpyRevolver");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(Shoot));
			skillDefInfo.activationStateMachineName = "Weapon";
			skillDefInfo.interruptPriority = (InterruptPriority)0;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.baseRechargeInterval = 0f;
			skillDefInfo.rechargeStock = 0;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 0;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = true;
			skillDefInfo.dontAllowPastMaxStocks = false;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.mustKeyPress = false;
			skillDefInfo.isCombatSkill = true;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = true;
			skillDefInfo.forceSprintDuringState = false;
			SpySkillDef spySkillDef = Skills.CreateSkillDef<SpySkillDef>(skillDefInfo);
			skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "Ambassador";
			skillDefInfo.skillNameToken = "KENKO_SPY_PRIMARY_REVOLVER2_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SPY_PRIMARY_REVOLVER2_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[0];
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texSpyAmbassador");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(Shoot2));
			skillDefInfo.activationStateMachineName = "Weapon";
			skillDefInfo.interruptPriority = (InterruptPriority)0;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.baseRechargeInterval = 0f;
			skillDefInfo.rechargeStock = 0;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 0;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = true;
			skillDefInfo.dontAllowPastMaxStocks = false;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.mustKeyPress = false;
			skillDefInfo.isCombatSkill = true;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = true;
			skillDefInfo.forceSprintDuringState = false;
			SpySkillDef spySkillDef2 = Skills.CreateSkillDef<SpySkillDef>(skillDefInfo);
			Skills.AddPrimarySkills(bodyPrefab, spySkillDef, spySkillDef2);
		}

		private void AddSecondarySkills()
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			SkillDefInfo skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "Stab";
			skillDefInfo.skillNameToken = "KENKO_SPY_SECONDARY_KNIFE_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SPY_SECONDARY_KNIFE_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[1] { Tokens.agileKeyword };
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texSpyStab");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(ChargeKnife));
			skillDefInfo.activationStateMachineName = "Weapon";
			skillDefInfo.interruptPriority = (InterruptPriority)1;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.baseRechargeInterval = 5f;
			skillDefInfo.rechargeStock = 1;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 1;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = true;
			skillDefInfo.dontAllowPastMaxStocks = false;
			skillDefInfo.beginSkillCooldownOnSkillEnd = true;
			skillDefInfo.mustKeyPress = true;
			skillDefInfo.isCombatSkill = true;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = false;
			skillDefInfo.forceSprintDuringState = false;
			SpySkillDef spySkillDef = Skills.CreateSkillDef<SpySkillDef>(skillDefInfo);
			skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "Big Earner";
			skillDefInfo.skillNameToken = "KENKO_SPY_SECONDARY_KNIFE2_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SPY_SECONDARY_KNIFE2_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[2]
			{
				Tokens.agileKeyword,
				Tokens.spyBigEarnerKeyword
			};
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texSpyStab2");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(ChargeKnife));
			skillDefInfo.activationStateMachineName = "Weapon";
			skillDefInfo.interruptPriority = (InterruptPriority)1;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.baseRechargeInterval = 7f;
			skillDefInfo.rechargeStock = 1;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 1;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = true;
			skillDefInfo.dontAllowPastMaxStocks = false;
			skillDefInfo.beginSkillCooldownOnSkillEnd = true;
			skillDefInfo.mustKeyPress = true;
			skillDefInfo.isCombatSkill = true;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = false;
			skillDefInfo.forceSprintDuringState = false;
			SpySkillDef spySkillDef2 = Skills.CreateSkillDef<SpySkillDef>(skillDefInfo);
			Skills.AddSecondarySkills(bodyPrefab, spySkillDef, spySkillDef2);
		}

		private void AddUtilitySkills()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			SkillDefInfo skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "Sap";
			skillDefInfo.skillNameToken = "KENKO_SPY_UTILITY_FLIP_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SPY_UTILITY_FLIP_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[0];
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texSpyFlip");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(Sap));
			skillDefInfo.activationStateMachineName = "Weapon2";
			skillDefInfo.interruptPriority = (InterruptPriority)1;
			skillDefInfo.baseRechargeInterval = 8f;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.rechargeStock = 1;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 1;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = true;
			skillDefInfo.dontAllowPastMaxStocks = false;
			skillDefInfo.mustKeyPress = false;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.isCombatSkill = false;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = false;
			skillDefInfo.forceSprintDuringState = true;
			SkillDef val = Skills.CreateSkillDef(skillDefInfo);
			Skills.AddUtilitySkills(bodyPrefab, val);
		}

		private void AddSpecialSkills()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			SkillDefInfo skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "Cloak";
			skillDefInfo.skillNameToken = "KENKO_SPY_SPECIAL_WATCH_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SPY_SPECIAL_WATCH_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[0];
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texSpyCloak");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(Cloak));
			skillDefInfo.activationStateMachineName = "Weapon";
			skillDefInfo.interruptPriority = (InterruptPriority)2;
			skillDefInfo.baseRechargeInterval = 0f;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.rechargeStock = 1;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 0;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = true;
			skillDefInfo.dontAllowPastMaxStocks = true;
			skillDefInfo.mustKeyPress = true;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.isCombatSkill = false;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = false;
			skillDefInfo.forceSprintDuringState = false;
			SkillDef val = Skills.CreateSkillDef(skillDefInfo);
			skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "Deadman's Watch";
			skillDefInfo.skillNameToken = "KENKO_SPY_SPECIAL_WATCH2_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SPY_SPECIAL_WATCH2_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[0];
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texSpyWatch");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(SwapWatch));
			skillDefInfo.activationStateMachineName = "Watch";
			skillDefInfo.interruptPriority = (InterruptPriority)2;
			skillDefInfo.baseRechargeInterval = 10f;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.rechargeStock = 1;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 0;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = true;
			skillDefInfo.dontAllowPastMaxStocks = false;
			skillDefInfo.mustKeyPress = true;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.isCombatSkill = false;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = false;
			skillDefInfo.forceSprintDuringState = false;
			SkillDef val2 = Skills.CreateSkillDef(skillDefInfo);
			Skills.AddSpecialSkills(bodyPrefab, val, val2);
		}

		private void InitializeScepter()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: 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_013b: 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)
			SkillDefInfo skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "Cloak Scepter";
			skillDefInfo.skillNameToken = "KENKO_SPY_SPECIAL_SCEPTER_WATCH_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SPY_SPECIAL_SCEPTER_WATCH_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[0];
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texSpyCloak");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(CloakScepter));
			skillDefInfo.activationStateMachineName = "Weapon";
			skillDefInfo.interruptPriority = (InterruptPriority)2;
			skillDefInfo.baseRechargeInterval = 0f;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.rechargeStock = 1;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 0;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = true;
			skillDefInfo.dontAllowPastMaxStocks = true;
			skillDefInfo.mustKeyPress = true;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.isCombatSkill = false;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = false;
			skillDefInfo.forceSprintDuringState = false;
			cloakScepterSkillDef = Skills.CreateSkillDef(skillDefInfo);
			skillDefInfo = new SkillDefInfo();
			skillDefInfo.skillName = "Deadman's Watch Scepter";
			skillDefInfo.skillNameToken = "KENKO_SPY_SPECIAL_SCEPTER_WATCH2_NAME";
			skillDefInfo.skillDescriptionToken = "KENKO_SPY_SPECIAL_SCEPTER_WATCH2_DESCRIPTION";
			skillDefInfo.keywordTokens = new string[0];
			skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texSpyWatch");
			skillDefInfo.activationState = new SerializableEntityStateType(typeof(SwapWatchScepter));
			skillDefInfo.activationStateMachineName = "Weapon";
			skillDefInfo.interruptPriority = (InterruptPriority)2;
			skillDefInfo.baseRechargeInterval = 10f;
			skillDefInfo.baseMaxStock = 1;
			skillDefInfo.rechargeStock = 1;
			skillDefInfo.requiredStock = 1;
			skillDefInfo.stockToConsume = 0;
			skillDefInfo.resetCooldownTimerOnUse = false;
			skillDefInfo.fullRestockOnAssign = true;
			skillDefInfo.dontAllowPastMaxStocks = false;
			skillDefInfo.mustKeyPress = true;
			skillDefInfo.beginSkillCooldownOnSkillEnd = false;
			skillDefInfo.isCombatSkill = false;
			skillDefInfo.canceledFromSprinting = false;
			skillDefInfo.cancelSprintingOnActivation = false;
			skillDefInfo.forceSprintDuringState = false;
			deadmanScepterSkillDef = Skills.CreateSkillDef(skillDefInfo);
			ItemBase<AncientScepterItem>.instance.RegisterScepterSkill(cloakScepterSkillDef, bodyName, (SkillSlot)3, 0);
			ItemBase<AncientScepterItem>.instance.RegisterScepterSkill(deadmanScepterSkillDef, bodyName, (SkillSlot)3, 1);
		}

		public override void InitializeSkins()
		{
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: 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_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
			ModelSkinController val = ((Component)prefabCharacterModel).gameObject.AddComponent<ModelSkinController>();
			ChildLocator component = ((Component)prefabCharacterModel).GetComponent<ChildLocator>();
			RendererInfo[] baseRendererInfos = prefabCharacterModel.baseRendererInfos;
			List<SkinDef> list = new List<SkinDef>();
			SkinDef val2 = Skins.CreateSkinDef("DEFAULT_SKIN", assetBundle.LoadAsset<Sprite>("texDefaultSkin"), baseRendererInfos, ((Component)prefabCharacterModel).gameObject);
			val2.meshReplacements = Skins.getMeshReplacements(assetBundle, baseRendererInfos, "meshSpy", "meshRevolver", "meshKnife", "meshWatch", "meshTie", "meshVisor");
			val2.gameObjectActivations = (GameObjectActivation[])(object)new GameObjectActivation[1]
			{
				new GameObjectActivation
				{
					gameObject = component.FindChildGameObject("Tie"),
					shouldActivate = true
				}
			};
			list.Add(val2);
			SkinDef val3 = Skins.CreateSkinDef("KENKO_SPY_MASTERY_SKIN_NAME", assetBundle.LoadAsset<Sprite>("texMonsoonSkin"), baseRendererInfos, ((Component)prefabCharacterModel).gameObject, SpyUnlockables.masterySkinUnlockableDef);
			val3.meshReplacements = Skins.getMeshReplacements(assetBundle, baseRendererInfos, "meshSpyAlt", "meshRevolverAlt", "meshKnifeAlt", "meshWatchAlt", null, "meshVisorAlt");
			val3.rendererInfos[0].defaultMaterial = SpyAssets.spyMonsoonMat;
			val3.rendererInfos[1].defaultMaterial = SpyAssets.spyMonsoonMat;
			val3.rendererInfos[2].defaultMaterial = SpyAssets.spyMonsoonMat;
			val3.rendererInfos[3].defaultMaterial = SpyAssets.spyMonsoonMat;
			val3.rendererInfos[5].defaultMaterial = SpyAssets.spyVisorMonsoonMat;
			val3.gameObjectActivations = (GameObjectActivation[])(object)new GameObjectActivation[1]
			{
				new GameObjectActivation
				{
					gameObject = component.FindChildGameObject("Tie"),
					shouldActivate = false
				}
			};
			list.Add(val3);
			val.skins = list.ToArray();
		}

		public override void InitializeCharacterMaster()
		{
			SpyAI.Init(bodyPrefab, masterName);
		}

		private void AddHooks()
		{
			//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_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Expected O, but got Unknown
			HUD.onHudTargetChangedGlobal += HUDSetup;
			LoadoutPanelController.Rebuild += new hook_Rebuild(LoadoutPanelController_Rebuild);
			HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_TakeDamage);
			GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal;
			CharacterBody.RecalculateStats += new hook_RecalculateStats(CharacterBody_RecalculateStats);
			if (SpyPlugin.emotesInstalled)
			{
				Emotes();
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		private static void Emotes()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			object obj = <>c.<>9__63_0;
			if (obj == null)
			{
				hook_Init val = delegate(orig_Init orig)
				{
					orig.Invoke();
					GameObject val2 = SpyAssets.mainAssetBundle.LoadAsset<GameObject>("spy_emoteskeleton");
					CustomEmotesAPI.ImportArmature(characterPrefab, val2, 0, true);
				};
				<>c.<>9__63_0 = val;
				obj = (object)val;
			}
			SurvivorCatalog.Init += (hook_Init)obj;
		}

		private static void LoadoutPanelController_Rebuild(orig_Rebuild orig, LoadoutPanelController self)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self);
			if (self.currentDisplayData.bodyIndex != BodyCatalog.FindBodyIndex("SpyBody"))
			{
				return;
			}
			LanguageTextMeshController[] componentsInChildren = ((Component)self).gameObject.GetComponentsInChildren<LanguageTextMeshController>();
			foreach (LanguageTextMeshController val in componentsInChildren)
			{
				if (Object.op_Implicit((Object)(object)val) && val.token == "LOADOUT_SKILL_MISC")
				{
					val.token = "Passive";
				}
			}
		}

		private void CharacterBody_RecalculateStats(orig_RecalculateStats orig, CharacterBody self)
		{
			orig.Invoke(self);
			if (!Object.op_Implicit((Object)(object)self) || !(self.baseNameToken == "KENKO_SPY_NAME"))
			{
				return;
			}
			SpyController component = ((Component)self).gameObject.GetComponent<SpyController>();
			if (Object.op_Implicit((Object)(object)component))
			{
				if (self.HasBuff(SpyBuffs.armorBuff))
				{
					self.armor += 100f;
				}
				if (self.HasBuff(SpyBuffs.spyBigEarnerBuff))
				{
					self.moveSpeed += (float)self.GetBuffCount(SpyBuffs.spyBigEarnerBuff);
				}
			}
		}

		private void HealthComponent_TakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: 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_0310: Unknown result type (might be due to invalid IL or missing references)
			//IL_0333: Unknown result type (might be due to invalid IL or missing references)
			//IL_033d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0343: Invalid comparison between Unknown and I4
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Expected O, but got Unknown
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0371: Unknown result type (might be due to invalid IL or missing references)
			//IL_0354: Unknown result type (might be due to invalid IL or missing references)
			//IL_0355: 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_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_06f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_06fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_06fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0200: Unknown result type (might be due to invalid IL or missing references)
			//IL_0242: Unknown result type (might be due to invalid IL or missing references)
			//IL_0249: Expected O, but got Unknown
			//IL_027a: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Unknown result type (might be due to invalid IL or missing references)
			//IL_028c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0291: Unknown result type (might be due to invalid IL or missing references)
			//IL_0296: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d4: 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_03db: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fe: Expected O, but got Unknown
			//IL_0433: Unknown result type (might be due to invalid IL or missing references)
			//IL_043b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0440: Unknown result type (might be due to invalid IL or missing references)
			//IL_0447: Unknown result type (might be due to invalid IL or missing references)
			//IL_044c: Unknown result type (might be due to invalid IL or missing references)
			//IL_045c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0461: Unknown result type (might be due to invalid IL or missing references)
			//IL_046d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0481: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkServer.active || !self.alive || self.godMode || self.ospTimer > 0f)
			{
				return;
			}
			CharacterBody body = self.body;
			CharacterBody val = null;
			Vector3 val2 = Vector3.zero;
			if (Object.op_Implicit((Object)(object)damageInfo.attacker))
			{
				val = damageInfo.attacker.GetComponent<CharacterBody>();
				if (Object.op_Implicit((Object)(object)val))
				{
					val2 = val.corePosition - damageInfo.position;
				}
			}
			if (damageInfo.damage > 0f && !damageInfo.rejected && Object.op_Implicit((Object)(object)body))
			{
				if (body.baseNameToken == "KENKO_SPY_NAME")
				{
					SpyController component = ((Component)body).GetComponent<SpyController>();
					if (Object.op_Implicit((Object)(object)component) && component.IsStopWatchOut() && component.isSpecialDeadman)
					{
						NetworkIdentity val3 = default(NetworkIdentity);
						if (((Component)self).gameObject.TryGetComponent<NetworkIdentity>(ref val3))
						{
							NetMessageExtensions.Send((INetMessage)(object)new SyncStealth(val3.netId, ((Component)self).gameObject), (NetworkDestination)1);
						}
						damageInfo.rejected = true;
						DamageInfo val4 = new DamageInfo();
						if (damageInfo.damage >= body.healthComponent.combinedHealth * SpyConfig.cloakHealthCost.Value)
						{
							val4.damage = body.healthComponent.combinedHealth * SpyConfig.cloakHealthCost.Value;
							val4.damageType = (DamageType)2051;
						}
						else
						{
							val4.damage = damageInfo.damage;
							val4.damageType = (DamageType)2049;
						}
						val4.attacker = null;
						val4.canRejectForce = true;
						val4.crit = false;
						val4.inflictor = null;
						val4.damageColorIndex = (DamageColorIndex)0;
						val4.force = Vector3.zero;
						val4.rejected = false;
						val4.position = body.corePosition;
						val4.procChainMask = default(ProcChainMask);
						val4.procCoefficient = 0f;
						if (body.skillLocator.special.skillNameToken != "KENKO_SPY_SPECIAL_SCEPTER_WATCH2_NAME")
						{
							body.healthComponent.TakeDamage(val4);
						}
						MasterSummon val5 = new MasterSummon();
						val5.masterPrefab = SpyDecoy.decoyMasterPrefab;
						val5.ignoreTeamMemberLimit = true;
						val5.teamIndexOverride = (TeamIndex)1;
						val5.summonerBodyObject = ((Component)body).gameObject;
						val5.position = body.previousPosition;
						val5.rotation = Util.QuaternionSafeLookRotation(body.characterDirection.forward);
						CharacterMaster val6 = val5.Perform();
						Util.CleanseBody(body, true, false, false, true, true, true);
						if (body.HasBuff(SpyBuffs.spyWatchDebuff))
						{
							body.RemoveBuff(SpyBuffs.spyWatchDebuff);
						}
						body.AddBuff(Buffs.Cloak);
						body.AddBuff(Buffs.CloakSpeed);
						body.AddBuff(SpyBuffs.armorBuff);
					}
				}
				if (Object.op_Implicit((Object)(object)val) && val.baseNameToken == "KENKO_SPY_NAME" && !DamageAPI.HasModdedDamageType(damageInfo, DamageTypes.SpyExecute) && val.canPerformBackstab && (damageInfo.damageType & 0x4000000) != 67108864 && (((ProcChainMask)(ref damageInfo.procChainMask)).HasProc((ProcType)17) || BackstabManager.IsBackstab(-val2, body)))
				{
					if (DamageAPI.HasModdedDamageType(damageInfo, DamageTypes.SpyBackStab))
					{
						if (damageInfo.crit)
						{
							damageInfo.damage *= 1.5f;
						}
						else
						{
							damageInfo.crit = true;
						}
						((ProcChainMask)(ref damageInfo.procChainMask)).AddProc((ProcType)17);
						damageInfo.damageType = (DamageType)(damageInfo.damageType | 2);
						damageInfo.damageType = (DamageType)(damageInfo.damageType | 0x800);
						DamageAPI.AddModdedDamageType(damageInfo, DamageTypes.SpyExecute);
						Util.PlaySound("sfx_spy_crit", ((Component)val).gameObject);
						DamageInfo val7 = new DamageInfo();
						val7.damage = 0f;
						val7.attacker = ((Component)val).gameObject;
						val7.canRejectForce = true;
						val7.crit = true;
						val7.inflictor = null;
						val7.damageColorIndex = (DamageColorIndex)12;
						val7.damageType = damageInfo.damageType;
						val7.force = Vector3.zero;
						val7.rejected = false;
						val7.position = body.corePosition;
						val7.procChainMask = default(ProcChainMask);
						val7.procCoefficient = 0.25f;
						DamageAPI.AddModdedDamageType(val7, DamageTypes.SpyExecute);
						if (Object.op_Implicit((Object)(object)body.healthComponent))
						{
							SpyController component2 = ((Component)val).GetComponent<SpyController>();
							if (body.isChampion || (body.isBoss && Object.op_Implicit((Object)(object)component2)))
							{
								if (damageInfo.damage * 2f > body.healthComponent.fullCombinedHealth * 0.1f)
								{
									val7.damage = damageInfo.damage * 2f;
								}
								else
								{
									val7.damage += body.healthComponent.fullCombinedHealth * 0.1f;
								}
								if (component2.isDiamondBack)
								{
									for (int i = val.GetBuffCount(SpyBuffs.spyDiamondbackBuff); i < 3; i++)
									{
										if (val.GetBuffCount(SpyBuffs.spyDiamondbackBuff) < 5)
										{
											val.AddBuff(SpyBuffs.spyDiamondbackBuff);
										}
									}
								}
								if (component2.isBigEarner)
								{
									int num = 5;
									float num2 = 2f;
									val.ClearTimedBuffs(SpyBuffs.spyBigEarnerBuff);
									for (int j = 0; j < num; j++)
									{
										val.AddTimedBuff(SpyBuffs.spyBigEarnerBuff, num2 * (float)(j + 1) / (float)num);
									}
									val.healthComponent.AddBarrier((val.healthComponent.fullHealth + val.healthComponent.fullShield) * 0.2f);
								}
								body.healthComponent.TakeDamage(val7);
							}
							else if (body.isElite && Object.op_Implicit((Object)(object)component2))
							{
								if (damageInfo.damage * 2f > body.healthComponent.fullCombinedHealth * 0.3f)
								{
									val7.damage = damageInfo.damage * 2f;
								}
								else
								{
									val7.damage += body.healthComponent.fullCombinedHealth * 0.3f;
								}
								if (component2.isDiamondBack && val.GetBuffCount(SpyBuffs.spyDiamondbackBuff) < 5)
								{
									val.AddBuff(SpyBuffs.spyDiamondbackBuff);
								}
								body.healthComponent.TakeDamage(val7);
							}
							else
							{
								val7.damage += body.healthComponent.fullCombinedHealth;
								body.healthComponent.TakeDamage(val7);
							}
						}
					}
					else
					{
						damageInfo.damageType = (DamageType)(damageInfo.damageType | 0x4000000);
					}
				}
			}
			orig.Invoke(self, damageInfo);
		}

		private static void GlobalEventManager_onCharacterDeathGlobal(DamageReport damageReport)
		{
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_02be: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: 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_0219: Expected O, but got Unknown
			//IL_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0242: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			//IL_0249: Unknown result type (might be due to invalid IL or missing references)
			//IL_024b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: Unknown result type (might be due to invalid IL or missing references)
			//IL_025e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0260: 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)
			CharacterBody attackerBody = damageReport.attackerBody;
			if (!Object.op_Implicit((Object)(object)attackerBody) || !Object.op_Implicit((Object)(object)damageReport.attackerMaster) || !Object.op_Implicit((Object)(object)damageReport.victim) || !(attackerBody.baseNameToken == "KENKO_SPY_NAME") || !DamageAPI.HasModdedDamageType(damageReport.damageInfo, DamageTypes.SpyExecute))
			{
				return;
			}
			SpyController component = ((Component)attackerBody).GetComponent<SpyController>();
			if (Object.op_Implicit((Object)(object)component))
			{
				if (attackerBody.skillLocator.special.skillNameToken == "KENKO_SPY_SPECIAL_SCEPTER_WATCH2_NAME")
				{
					attackerBody.skillLocator.special.Reset();
				}
				if (component.isDiamondBack)
				{
					if (attackerBody.GetBuffCount(SpyBuffs.spyDiamondbackBuff) <= 0)
					{
						component.ActivateCritLightning();
					}
					if (NetworkServer.active)
					{
						for (int i = 0; i < 2; i++)
						{
							if (attackerBody.GetBuffCount(SpyBuffs.spyDiamondbackBuff) < 5)
							{
								attackerBody.AddBuff(SpyBuffs.spyDiamondbackBuff);
							}
						}
					}
				}
				if (component.isBigEarner)
				{
					NetworkIdentity val = default(NetworkIdentity);
					if (attackerBody.skillLocator.secondary.stock < attackerBody.skillLocator.secondary.maxStock && damageReport.attacker.TryGetComponent<NetworkIdentity>(ref val))
					{
						NetMessageExtensions.Send((INetMessage)(object)new SyncResetStab(val.netId, ((Component)damageReport.victim).gameObject), (NetworkDestination)1);
					}
					if (!SpyConfig.bigEarnerFullyResets.Value)
					{
						component.ResetChainStabPeriod();
					}
					int num = 5;
					float num2 = 2f;
					attackerBody.ClearTimedBuffs(SpyBuffs.spyBigEarnerBuff);
					for (int j = 0; j < num; j++)
					{
						attackerBody.AddTimedBuff(SpyBuffs.spyBigEarnerBuff, num2 * (float)(j + 1) / (float)num);
					}
					attackerBody.healthComponent.AddBarrier((attackerBody.healthComponent.fullHealth + attackerBody.healthComponent.fullShield) * 0.1f);
					EffectData val2 = new EffectData();
					val2.origin = attackerBody.corePosition;
					CharacterMotor characterMotor = attackerBody.characterMotor;
					bool flag = false;
					if (Object.op_Implicit((Object)(object)characterMotor))
					{
						Vector3 moveDirection = characterMotor.moveDirection;
						if (moveDirection != Vector3.zero)
						{
							val2.rotation = Util.QuaternionSafeLookRotation(moveDirection);
							flag = true;
						}
					}
					if (!flag)
					{
						val2.rotation = attackerBody.transform.rotation;
					}
					EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/MoveSpeedOnKillActivate"), val2, true);
				}
			}
			NetworkIdentity val3 = default(NetworkIdentity);
			if (((Component)damageReport.victim).gameObject.TryGetComponent<NetworkIdentity>(ref val3))
			{
				NetMessageExtensions.Send((INetMessage)(object)new SyncStabExplosion(val3.netId, ((Component)damageReport.victim).gameObject), (NetworkDestination)1);
			}
		}

		internal static void HUDSetup(HUD hud)
		{
			//IL_01be: 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_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_023e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0255: Unknown result type (might be due to invalid IL or missing references)
			//IL_026c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: Unknown result type (might be due to invalid IL or missing references)
			//IL_030b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0322: Unknown result type (might be due to invalid IL or missing references)
			//IL_0339: Unknown result type (might be due to invalid IL or missing references)
			//IL_0350: Unknown result type (might be due to invalid IL or missing references)
			//IL_0367: Unknown result type (might be due to invalid IL or missing references)
			//IL_0383: Unknown result type (might be due to invalid IL or missing references)
			//IL_039f: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)hud.targetBodyObject) && Object.op_Implicit((Object)(object)hud.targetMaster) && (Object)(object)hud.targetMaster.bodyPrefab == (Object)(object)characterPrefab && ((NetworkBehaviour)hud.targetMaster).hasAuthority)
			{
				Transform parent = ((Component)hud.equipmentIcons[0]).gameObject.transform.parent;
				Transform val = ((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("SpringCanvas")
					.Find("BottomLeftCluster")
					.Find("BarRoots")
					.Find("LevelDisplayCluster");
				GameObject val2 = Object.Instantiate<GameObject>(((Component)val).gameObject, ((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("SpringCanvas")
					.Find("BottomLeftCluster"));
				((Object)val2).name = "AmmoTracker";
				val2.transform.SetParent(((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("CrosshairCanvas")
					.Find("CrosshairExtras"));
				Object.DestroyImmediate((Object)(object)((Component)val2.transform.GetChild(0)).gameObject);
				Object.Destroy((Object)(object)val2.GetComponentInChildren<LevelText>());
				Object.Destroy((Object)(object)val2.GetComponentInChildren<ExpBar>());
				((Component)val2.transform.Find("LevelDisplayRoot").Find("ValueText")).gameObject.SetActive(false);
				Object.DestroyImmediate((Object)(object)((Component)val2.transform.Find("ExpBarRoot")).gameObject);
				((Component)val2.transform.Find("LevelDisplayRoot")).GetComponent<RectTransform>().anchoredPosition = new Vector2(-12f, 0f);
				RectTransform component = val2.GetComponent<RectTransform>();
				((Transform)component).localScale = new Vector3(0.8f, 0.8f, 1f);
				component.anchorMin = new Vector2(0f, 0f);
				component.anchorMax = new Vector2(0f, 0f);
				component.offsetMin = new Vector2(120f, -40f);
				component.offsetMax = new Vector2(120f, -40f);
				component.pivot = new Vector2(0.5f, 0f);
				component.anchoredPosition = new Vector2(50f, 0f);
				((Transform)component).localPosition = new Vector3(120f, -40f, 0f);
				GameObject val3 = Object.Instantiate<GameObject>(SpyAssets.mainAssetBundle.LoadAsset<GameObject>("WeaponChargeBar"));
				((Object)val3).name = "StealthMeter";
				val3.transform.SetParent(((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("CrosshairCanvas")
					.Find("CrosshairExtras"));
				component = val3.GetComponent<RectTransform>();
				((Transform)component).localScale = new Vector3(0.75f, 0.1f, 1f);
				component.anchorMin = new Vector2(100f, 2f);
				component.anchorMax = new Vector2(100f, 2f);
				component.pivot = new Vector2(0.5f, 0f);
				component.anchoredPosition = new Vector2(100f, 2f);
				((Transform)component).localPosition = new Vector3(100f, 2f, 0f);
				((Transform)component).rotation = Quaternion.Euler(new Vector3(0f, 0f, 90f));
				CloakHudController cloakHudController = val2.AddComponent<CloakHudController>();
				cloakHudController.targetHUD = hud;
				cloakHudController.targetText = ((Component)val2.transform.Find("LevelDisplayRoot").Find("PrefixText")).gameObject.GetComponent<LanguageTextMeshController>();
				cloakHudController.durationDisplay = val3;
				cloakHudController.durationBar = ((Component)val3.transform.GetChild(1)).gameObject.GetComponent<Image>();
				cloakHudController.durationBarColor = ((Component)val3.transform.GetChild(0)).gameObject.GetComponent<Image>();
				if (!Object.op_Implicit((Object)(object)((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("CrosshairCanvas")
					.Find("SpyCrosshair")))
				{
					GameObject val4 = Object.Instantiate<GameObject>(SpyCrosshair.spyCrosshair, ((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("CrosshairCanvas"));
					((Object)val4).name = "SpyCrosshair";
					val4.gameObject.GetComponent<HudElement>().targetBodyObject = hud.targetBodyObject;
					val4.gameObject.GetComponent<HudElement>().targetCharacterBody = hud.targetBodyObject.GetComponent<CharacterBody>();
				}
			}
		}
	}
}
namespace SpyMod.Spy.SkillStates
{
	public class ChargeKnife : BaseSpySkillState
	{
		public override void OnEnter()
		{
			RefreshState();
			base.OnEnter();
			((EntityState)this).PlayCrossfade("Gesture, Override", "ChargeStab", "Swing.playbackRate", 0.3f, 0.05f);
			Util.PlaySound("sfx_spy_knife_equip", ((EntityState)this).gameObject);
			((Component)((BaseState)this).FindModelChild("Revolver")).gameObject.SetActive(false);
			((Component)((BaseState)this).FindModelChild("Knife")).gameObject.SetActive(true);
			if (((EntityState)this).characterBody.HasBuff(SpyBuffs.spyDiamondbackBuff))
			{
				spyController.DeactivateCritLightning(willReturn: true);
			}
			spyController.SpinGun();
		}

		public override void FixedUpdate()
		{
			base.FixedUpdate();
			if (((EntityState)this).isAuthority && !((BaseSkillState)this).IsKeyDownAuthority() && (double)((EntityState)this).fixedAge >= 0.05)
			{
				((EntityState)this).outer.SetNextState((EntityState)(object)new Stab());
			}
		}

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

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)3;
		}
	}
	public class Cloak : BaseSpySkillState
	{
		private float baseDuration = 1f;

		private float duration;

		private bool willWait = false;

		protected virtual bool sceptered => false;

		public override void OnEnter()
		{
			RefreshState();
			base.OnEnter();
			if (!sceptered)
			{
				duration = baseDuration / ((BaseState)this).attackSpeedStat;
			}
			else
			{
				duration = 0f;
			}
			if (!spyController.IsStopWatchOut())
			{
				if (spyController.cloakTimer >= spyController.maxCloakTimer * 0.2f)
				{
					if (NetworkServer.active)
					{
						((EntityState)this).characterBody.AddBuff(SpyBuffs.spyWatchDebuff);
						((EntityState)this).characterBody.AddBuff(Buffs.Cloak);
						((EntityState)this).characterBody.AddBuff(Buffs.CloakSpeed);
						((EntityState)this).characterBody.AddBuff(SpyBuffs.armorBuff);
					}
					spyController.EnableWatchLayer();
					spyController.EnterStealth();
				}
			}
			else
			{
				Util.PlaySound("sfx_spy_uncloak_alt", ((EntityState)this).gameObject);
				willWait = true;
				spyController.pauseTimer = true;
			}
		}

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

		public override void OnExit()
		{
			((EntityState)this).OnExit();
			if (willWait)
			{
				spyController.pauseTimer = false;
				spyController.ExitStealth();
				spyController.DisableWatchLayer();
			}
		}

		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 CloakScepter : Cloak
	{
		protected override bool sceptered => true;
	}
	public class DecoySpawn : BaseState
	{
		private float durationBeforeDeath = 0.5f;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			durationBeforeDeath = 0.5f;
		}

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

		public override void OnExit()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0072: 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_0082: Unknown result type (might be due to invalid IL or missing references)
			if (NetworkServer.active)
			{
				DamageInfo val = new DamageInfo();
				val.damage = ((EntityState)this).healthComponent.fullCombinedHealth * 2f;
				val.attacker = null;
				val.canRejectForce = false;
				val.crit = true;
				val.inflictor = null;
				val.damageColorIndex = (DamageColorIndex)0;
				val.damageType = (DamageType)264194;
				val.force = Vector3.zero;
				val.rejected = false;
				val.position = ((EntityState)this).characterBody.corePosition;
				val.procChainMask = default(ProcChainMask);
				val.procCoefficient = 0f;
				((EntityState)this).healthComponent.TakeDamage(val);
			}
			((EntityState)this).OnExit();
		}
	}
	public class MainState : GenericCharacterMain
	{
		private Animator animator;

		public LocalUser localUser;

		public override void OnEnter()
		{
			((GenericCharacterMain)this).OnEnter();
			animator = ((BaseCharacterMain)this).modelAnimator;
			FindLocalUser();
		}

		private void FindLocalUser()
		{
			if (localUser != null || !Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
			{
				return;
			}
			foreach (LocalUser readOnlyLocalUsers in LocalUserManager.readOnlyLocalUsersList)
			{
				if ((Object)(object)readOnlyLocalUsers.cachedBody == (Object)(object)((EntityState)this).characterBody)
				{
					localUser = readOnlyLocalUsers;
					break;
				}
			}
		}

		public override void FixedUpdate()
		{
			((GenericCharacterMain)this).FixedUpdate();
			if (Object.op_Implicit((Object)(object)animator))
			{
				bool flag = false;
				if (!((EntityState)this).characterBody.outOfDanger || !((EntityState)this).characterBody.outOfCombat)
				{
					flag = true;
				}
				animator.SetBool("inCombat", flag);
				if (((BaseState)this).isGrounded)
				{
					animator.SetFloat("airBlend", 0f);
				}
				else
				{
					animator.SetFloat("airBlend", 1f);
				}
			}
		}

		public override void ProcessJump()
		{
			//IL_020e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0213: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_022b: Expected O, but got Unknown
			//IL_024e: 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_025a: 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_027c: Expected O, but got Unknown
			//IL_0290: Unknown result type (might be due to invalid IL or missing references)
			//IL_0295: Unknown result type (might be due to invalid IL or missing references)
			//IL_029c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Expected O, but got Unknown
			if (!((BaseCharacterMain)this).hasCharacterMotor)
			{
				return;
			}
			bool flag = false;
			bool flag2 = false;
			if (!base.jumpInputReceived || !Object.op_Implicit((Object)(object)((EntityState)this).characterBody) || ((EntityState)this).characterMotor.jumpCount >= ((EntityState)this).characterBody.maxJumpCount)
			{
				return;
			}
			int itemCount = ((EntityState)this).characterBody.inventory.GetItemCount(Items.JumpBoost);
			float num = 1f;
			float num2 = 1f;
			if (((EntityState)this).characterMotor.jumpCount >= ((EntityState)this).characterBody.baseJumpCount)
			{
				flag = true;
				num = 1.5f;
				num2 = 1.5f;
			}
			else if (itemCount > 0 && ((EntityState)this).characterBody.isSprinting)
			{
				float num3 = ((EntityState)this).characterBody.acceleration * ((EntityState)this).characterMotor.airControl;
				if (((EntityState)this).characterBody.moveSpeed > 0f && num3 > 0f)
				{
					flag2 = true;
					float num4 = Mathf.Sqrt(10f * (float)itemCount / num3);
					float num5 = ((EntityState)this).characterBody.moveSpeed / num3;
					num = (num4 + num5) / num5;
				}
			}
			GenericCharacterMain.ApplyJumpVelocity(((EntityState)this).characterMotor, ((EntityState)this).characterBody, num, num2, false);
			if (((BaseCharacterMain)this).hasModelAnimator)
			{
				int layerIndex = ((BaseCharacterMain)this).modelAnimator.GetLayerIndex("Body");
				if (layerIndex >= 0)
				{
					if (((EntityState)this).characterBody.isSprinting)
					{
						((BaseCharacterMain)this).modelAnimator.CrossFadeInFixedTime("SprintJump", ((BaseCharacterMain)this).smoothingParameters.intoJumpTransitionTime, layerIndex);
					}
					else if (flag)
					{
						((BaseCharacterMain)this).modelAnimator.CrossFadeInFixedTime("BonusJump", ((BaseCharacterMain)this).smoothingParameters.intoJumpTransitionTime, layerIndex);
					}
					else
					{
						((BaseCharacterMain)this).modelAnimator.CrossFadeInFixedTime("Jump", ((BaseCharacterMain)this).smoothingParameters.intoJumpTransitionTime, layerIndex);
					}
				}
			}
			if (flag)
			{
				EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/FeatherEffect"), new EffectData
				{
					origin = ((EntityState)this).characterBody.footPosition
				}, true);
			}
			else if (((EntityState)this).characterMotor.jumpCount > 0)
			{
				EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/ImpactEffects/CharacterLandImpact"), new EffectData
				{
					origin = ((EntityState)this).characterBody.footPosition,
					scale = ((EntityState)this).characterBody.radius
				}, true);
			}
			if (flag2)
			{
				EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/BoostJumpEffect"), new EffectData
				{
					origin = ((EntityState)this).characterBody.footPosition,
					rotation = Util.QuaternionSafeLookRotation(((EntityState)this).characterMotor.velocity)
				}, true);
			}
			CharacterMotor characterMotor = ((EntityState)this).characterMotor;
			characterMotor.jumpCount++;
		}
	}
	public class Sap : BaseSpySkillState
	{
		public float jumpDuration = 0.8f;

		public static float inAirDuration = 0f;

		public static float jumpPower = 18f;

		public static float minDampingStrength = 0.2f;

		public static float maxDampingStrength = 0.05f;

		private float previousAirControl;

		protected Vector3 slipVector = Vector3.zero;

		public float duration = 0.3f;

		public float speedCoefficient = 7f;

		private Vector3 cachedForward;

		private Quaternion slideRotation;

		private bool isFlip = false;

		private bool sapped = false;

		public override void OnEnter()
		{
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0262: Unknown result type (might be due to invalid IL or missing references)
			//IL_026c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0271: Unknown result type (might be due to invalid IL or missing references)
			//IL_0276: Unknown result type (might be due to invalid IL or missing references)
			//IL_0285: Unknown result type (might be due to invalid IL or missing references)
			//IL_028a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0291: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a2: Expected O, but got Unknown
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: 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_00d3: 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_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_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: 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_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_01c0: Unknown result type (might be due to invalid IL or missing references)
			base.OnEnter();
			if (((BaseState)this).isGrounded)
			{
				Vector3 val = ((((EntityState)this).inputBank.moveVector == Vector3.zero) ? ((EntityState)this).characterDirection.forward : ((EntityState)this).inputBank.moveVector);
				slipVector = ((Vector3)(ref val)).normalized;
				cachedForward = ((EntityState)this).characterDirection.forward;
				Animator modelAnimator = ((EntityState)this).GetModelAnimator();
				Vector3 val2 = (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection) ? ((EntityState)this).characterDirection.forward : slipVector);
				Vector3 val3 = Vector3.Cross(Vector3.up, val2);
				float num = Vector3.Dot(slipVector, val2);
				float num2 = Vector3.Dot(slipVector, val3);
				modelAnimator.SetFloat("dashF", num);
				modelAnimator.SetFloat("dashR", num2);
				slideRotation = Quaternion.LookRotation(slipVector, cachedForward);
				((EntityState)this).PlayCrossfade("FullBody, Override", "Dash", "Dash.playbackRate", duration * 1.5f, 0.05f);
				((EntityState)this).PlayAnimation("Gesture, Override", "BufferEmpty");
				Util.PlaySound("sfx_driver_dash", ((EntityState)this).gameObject);
				if (Object.op_Implicit((Object)(object)BaseSlideState.slideEffectPrefab) && Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
				{
					Vector3 val4 = ((EntityState)this).characterBody.corePosition;
					Quaternion val5 = Quaternion.identity;
					Transform val6 = ((BaseState)this).FindModelChild("Base");
					if (Object.op_Implicit((Object)(object)val6))
					{
						val4 = val6.position;
					}
					if (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
					{
						val5 = Util.QuaternionSafeLookRotation(slideRotation * ((EntityState)this).characterDirection.forward, Vector3.up);
					}
					EffectManager.SimpleEffect(BaseSlideState.slideEffectPrefab, val4, val5, false);
				}
			}
			else
			{
				isFlip = true;
				((EntityState)this).characterMotor.disableAirControlUntilCollision = false;
				((EntityState)this).PlayCrossfade("FullBody, Override", "Flip", "Flip.playbackRate", jumpDuration, 0.1f);
				previousAirControl = ((EntityState)this).characterMotor.airControl;
				((EntityState)this).characterMotor.airControl = 1f;
				((EntityState)this).characterMotor.velocity.y = 0f;
				((BaseCharacterController)((EntityState)this).characterMotor).Motor.ForceUnground();
				CharacterMotor characterMotor = ((EntityState)this).characterMotor;
				characterMotor.velocity += Vector3.up * jumpPower;
				EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/FeatherEffect"), new EffectData
				{
					origin = ((EntityState)this).characterBody.footPosition
				}, true);
			}
		}

		public override void FixedUpdate()
		{
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: 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_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			base.FixedUpdate();
			if (((EntityState)this).fixedAge >= duration / 2f && !sapped)
			{
				sapped = true;
				SapEnemy();
			}
			if (isFlip)
			{
				if (((EntityState)this).isAuthority && ((EntityState)this).fixedAge >= jumpDuration)
				{
					((EntityState)this).outer.SetNextStateToMain();
				}
				return;
			}
			((EntityState)this).characterMotor.velocity = Vector3.zero;
			((EntityState)this).characterMotor.rootMotion = slipVector * (((BaseState)this).moveSpeedStat * speedCoefficient * Time.fixedDeltaTime) * Mathf.Cos(((EntityState)this).fixedAge / duration * (MathF.PI / 2f));
			if (((EntityState)this).isAuthority && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
			{
				((EntityState)this).characterDirection.forward = cachedForward;
			}
			if (((EntityState)this).isAuthority && ((EntityState)this).fixedAge >= duration)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
		}

		private void SapEnemy()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: 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_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Expected O, but got Unknown
			//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_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			if (NetworkServer.active)
			{
				HurtBox[] hurtBoxes = new SphereSearch
				{
					origin = ((EntityState)this).transform.position,
					radius = 20f,
					mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask
				}.RefreshCandidates().FilterCandidatesByHurtBoxTeam(TeamMask.GetEnemyTeams(((EntityState)this).characterBody.teamComponent.teamIndex)).OrderCandidatesByDistance()
					.FilterCandidatesByDistinctHurtBoxEntities()
					.GetHurtBoxes();
				if (hurtBoxes.Length != 0)
				{
					CharacterBody body = hurtBoxes[0].healthComponent.body;
					bool alive = hurtBoxes[0].healthComponent.alive;
					Vector3 position = ((Component)hurtBoxes[0]).transform.position;
					Vector3 val = body.corePosition - position;
					float magnitude = ((Vector3)(ref val)).magnitude;
					Quaternion val2 = ((magnitude != 0f) ? Util.QuaternionSafeLookRotation(val) : Random.rotationUniform);
					ProjectileManager.instance.FireProjectile(SpyAssets.sapperPrefab, position, val2, ((EntityState)this).gameObject, 1f, 100f, ((BaseState)this).RollCrit(), (DamageColorIndex)0, (GameObject)null, alive ? (magnitude * 5f) : (-1f));
					DamageInfo val3 = new DamageInfo();
					val3.damage = 1f;
					val3.attacker = ((EntityState)this).gameObject;
					val3.inflictor = null;
					val3.force = Vector3.zero;
					val3.crit = false;
					val3.procChainMask = default(ProcChainMask);
					val3.procCoefficient = 1f;
					val3.position = position;
					val3.damageColorIndex = (DamageColorIndex)3;
					val3.damageType = (DamageType)16777216;
					Util.PlaySound("sfx_spy_sapper_plant", ((Component)body).gameObject);
					body.healthComponent.TakeDamage(val3);
				}
			}
		}

		public override void OnExit()
		{
			//IL_0039: 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_0048: Unknown result type (might be due to invalid IL or missing references)
			if (isFlip)
			{
				((EntityState)this).PlayAnimation("FullBody, Override", "BufferEmpty");
				((EntityState)this).characterMotor.airControl = previousAirControl;
			}
			else
			{
				CharacterMotor characterMotor = ((EntityState)this).characterMotor;
				characterMotor.velocity *= 0.8f;
			}
			((EntityState)this).OnExit();
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)4;
		}
	}
	public class Shoot : BaseSpySkillState
	{
		public float damageCoefficient = SpyStaticValues.revolverDamageCoefficient;

		public static float procCoefficient = 1f;

		public static float baseDuration = 0.7f;

		public static float force = 200f;

		public static float recoil = 2f;

		public static float range = 2000f;

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

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

		protected float duration;

		protected string muzzleString;

		protected bool isCrit;

		protected int diamondbackStacks;

		public string shootSoundString = "Play_bandit2_R_fire";

		protected virtual GameObject tracerPrefab => isCrit ? critTracerEffectPrefab : tracerEffectPrefab;

		public virtual FalloffModel falloff => (FalloffModel)1;

		public override void OnEnter()
		{
			base.OnEnter();
			if (spyController.IsStopWatchOut() && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
				return;
			}
			if (((EntityState)this).characterBody.hasCloakBuff)
			{
				spyController.ExitStealth();
			}
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
			((EntityState)this).characterBody.isSprinting = false;
			((EntityState)this).characterBody.SetAimTimer(2f);
			muzzleString = "GunMuzzle";
			isCrit = ((BaseState)this).RollCrit();
			diamondbackStacks = ((EntityState)this).characterBody.GetBuffCount(SpyBuffs.spyDiamondbackBuff);
			if (diamondbackStacks > 0)
			{
				if (NetworkServer.active)
				{
					((EntityState)this).characterBody.RemoveBuff(SpyBuffs.spyDiamondbackBuff);
				}
				if (isCrit)
				{
					damageCoefficient *= SpyStaticValues.diamondBackCritBonus;
				}
				else
				{
					isCrit = true;
				}
			}
			shootSoundString = (isCrit ? "sfx_spy_revolver_shoot_crit" : "sfx_spy_revolver_shoot");
			Fire();
			duration = baseDuration / ((BaseState)this).attackSpeedStat;
		}

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

		public void Fire()
		{
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: 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_00af: 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_00bc: 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_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: 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_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: 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_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: 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_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: 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_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: 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_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
			((EntityState)this).PlayAnimation("Gesture, Override", "Shoot", "Shoot.playbackRate", duration * 2f);
			EffectManager.SimpleMuzzleFlash(FirePistol2.muzzleEffectPrefab, ((EntityState)this).gameObject, muzzleString, false);
			Util.PlaySound(shootSoundString, ((EntityState)this).gameObject);
			if (((EntityState)this).isAuthority)
			{
				Ray aimRay = ((BaseState)this).GetAimRay();
				base.AddRecoil2(-1f * recoil, -2f * recoil, -0.5f * recoil, 0.5f * recoil);
				BulletAttack val = new BulletAttack
				{
					bulletCount = 1u,
					aimVector = ((Ray)(ref aimRay)).direction,
					origin = ((Ray)(ref aimRay)).origin,
					damage = damageCoefficient * ((BaseState)this).damageStat,
					damageColorIndex = (DamageColorIndex)0,
					falloffModel = falloff,
					maxDistance = range,
					force = force,
					hitMask = CommonMasks.bullet,
					minSpread = 0f,
					maxSpread = ((EntityState)this).characterBody.spreadBloomAngle * 2f,
					isCrit = isCrit,
					owner = ((EntityState)this).gameObject,
					muzzleName = muzzleString,
					smartCollision = true,
					procChainMask = default(ProcChainMask),
					procCoefficient = procCoefficient,
					radius = 0.75f,
					sniper = false,
					stopperMask = CommonMasks.bullet,
					weapon = null,
					tracerEffectPrefab = tracerPrefab,
					spreadPitchScale = 1f,
					spreadYawScale = 1f,
					queryTriggerInteraction = (QueryTriggerInteraction)0,
					hitEffectPrefab = FirePistol2.hitEffectPrefab
				};
				val.Fire();
			}
			((EntityState)this).characterBody.AddSpreadBloom(1.25f);
		}

		public override void FixedUpdate()
		{
			base.FixedUpdate();
			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)1;
		}
	}
	public class Shoot2 : BaseSpySkillState
	{
		public float damageCoefficient = SpyStaticValues.revolverDamageCoefficient;

		public static float procCoefficient = 1f;

		public static float baseDuration = 0.9f;

		public static float force = 200f;

		public static float recoil = 2f;

		public static float range = 2000f;

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

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

		protected float duration;

		protected string muzzleString;

		protected bool isCrit;

		protected int diamondbackStacks;

		public string shootSoundString = "Play_bandit2_R_fire";

		private CameraParamsOverrideHandle camParamsOverrideHandle;

		private OverlayController overlayController;

		private float fireTimer;

		public bool holding;

		protected virtual GameObject tracerPrefab => isCrit ? Shoot.critTracerEffectPrefab : Shoot.tracerEffectPrefab;

		public virtual FalloffModel falloff => (FalloffModel)1;

		public override void OnEnter()
		{
			//IL_00cc: 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)
			damageCoefficient = SpyStaticValues.ambassadorDamageCoefficient;
			base.OnEnter();
			if (spyController.IsStopWatchOut() && ((EntityState)this).isAuthority)
			{
				((EntityState)this).outer.SetNextStateToMain();
				return;
			}
			if (((EntityState)this).characterBody.hasCloakBuff)
			{
				spyController.ExitStealth();
			}
			duration = Shoot.baseDuration / ((BaseState)this).attackSpeedStat;
			((EntityState)this).characterBody.isSprinting = false;
			((EntityState)this).characterBody.SetAimTimer(2f);
			muzzleString = "GunMuzzle";
			isCrit = ((BaseState)this).RollCrit();
			shootSoundString = (isCrit ? "sfx_spy_revolver_shoot_crit" : "sfx_spy_revolver_shoot");
			Fire();
			overlayController = HudOverlayManager.AddOverlay(((EntityState)this).gameObject, new OverlayCreationParams
			{
				prefab = SpyAssets.headshotOverlay,
				childLocatorEntry = "ScopeContainer"
			});
			holding = false;
		}

		public override void FixedUpdate()
		{
			base.FixedUpdate();
			fireTimer += Time.fixedDeltaTime;
			if (((EntityState)this).isAuthority && (((ButtonState)(ref ((EntityState)this).inputBank.skill1)).justReleased || !((EntityState)this).inputBank.skill1.down) && fireTimer >= duration)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
			else if (((EntityState)this).isAuthority && ((EntityState)this).inputBank.skill1.down && fireTimer >= duration)
			{
				holding = true;
				((EntityState)this).outer.SetNextState((EntityState)(object)new Shoot2
				{
					holding = true
				});
			}
		}

		public void Fire()
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: 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_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: 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_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: 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_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: 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)
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be