Decompiled source of BetterBots v0.0.8

BepInEx/plugins/BetterBots.dll

Decompiled 6 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using AIGraph;
using Agents;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using BetterBots.Attributes;
using BetterBots.Components;
using BetterBots.Data;
using BetterBots.Managers;
using BetterBots.PlayerBotActionDebugs;
using BetterBots.Utils;
using ChainedPuzzles;
using Enemies;
using GameData;
using Gear;
using HarmonyLib;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.Attributes;
using Il2CppInterop.Runtime.Injection;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using Il2CppSystem.Reflection;
using LevelGeneration;
using Player;
using SNetwork;
using UnityEngine;
using UnityEngine.AI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("BetterBots")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BetterBots")]
[assembly: AssemblyCopyright("Copyright ©  2022")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("84385dfb-6568-471f-998e-58f5a2c9754e")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace BetterBots
{
	[BepInPlugin("com.east.bb", "BetterBots", "0.0.8")]
	public class BetterBots : BasePlugin
	{
		public static class Settings
		{
			public static readonly float ADDITIONAL_BULLET_DAMAGE;

			public static readonly float DAMAGE_RESISTANCE_MULTIPLIER;
		}

		public static Harmony HarmonyMain;

		public const string GUID = "com.east.bb";

		public const string Name = "BetterBots";

		public const string Version = "0.0.8";

		public override void Load()
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			BBLog.Message("<<<<---------Launcing Better Bots------------>>>");
			new Harmony("com.east.bb").PatchAll();
		}

		public static void OnStartGame()
		{
			BBLog.Message("<<<<---------OnStartGame Better Bots------------>>>");
			LaunchComponents();
			OnStarted();
		}

		private static void OnStarted()
		{
			ConfigurationPluginManager.Initialized();
		}

		private static void LaunchComponents()
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			foreach (Type type in types)
			{
				if (!(type.BaseType != null))
				{
					continue;
				}
				Type typeFromHandle = typeof(MonoBehaviorFixed);
				if (!(type.BaseType == typeFromHandle) && !typeFromHandle.IsSubclassOf(typeFromHandle))
				{
					continue;
				}
				ClassInjector.RegisterTypeInIl2Cpp(type);
				IL2CPP_ComponentDescriptorAttribute customAttribute = type.GetCustomAttribute<IL2CPP_ComponentDescriptorAttribute>();
				if (customAttribute != null && customAttribute.m_launchOnStartLoad)
				{
					GameObject val = new GameObject();
					val.AddComponent(Il2CppType.From(type));
					BBLog.Message("Adding Component " + type);
					if (customAttribute.m_dontDestroyOnLoad)
					{
						Object.DontDestroyOnLoad((Object)(object)val);
					}
				}
			}
		}
	}
}
namespace BetterBots.Utils
{
	public static class BBLog
	{
		private static readonly ManualLogSource logger;

		private static bool m_enableDebugs;

		static BBLog()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Expected O, but got Unknown
			logger = new ManualLogSource("BETTER-BETTER-IMPROVED");
			m_enableDebugs = true;
			Logger.Sources.Add((ILogSource)(object)logger);
		}

		public static void Verbose(object msg)
		{
			logger.LogInfo(msg);
		}

		public static void Debug(object msg)
		{
			if (m_enableDebugs)
			{
				logger.LogDebug(msg);
			}
		}

		public static void Message(object msg)
		{
			if (m_enableDebugs)
			{
				logger.LogMessage(msg);
			}
		}

		public static void Error(object msg)
		{
			if (m_enableDebugs)
			{
				logger.LogError(msg);
			}
		}

		public static void Warn(object msg)
		{
			if (m_enableDebugs)
			{
				logger.LogWarning(msg);
			}
		}
	}
	public static class CppUtils
	{
		public static List<T> ToList<T>(this List<T> cppList)
		{
			List<T> list = new List<T>();
			for (int i = 0; i < cppList.Count; i++)
			{
				list.Add(cppList[i]);
			}
			return list;
		}
	}
	public static class PlayerAgentExtraExtensions
	{
		public static bool CanSeePosition(this PlayerAgent player, Vector3 eyePos, Vector3 targetPos, int layerMask, out RaycastHit hitInfo)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: 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_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			Ray val = default(Ray);
			((Ray)(ref val)).origin = eyePos;
			Ray val2 = val;
			Vector3 val3 = targetPos - eyePos;
			float magnitude = ((Vector3)(ref val3)).magnitude;
			val3 = (((Ray)(ref val2)).direction = val3 / magnitude);
			return !Physics.Raycast(val2, ref hitInfo, magnitude, layerMask);
		}

		public static bool CanSeeObject(this PlayerAgent player, Vector3 eyePos, GameObject targetObj)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			Vector3 position = targetObj.transform.position;
			if (!player.CanSeePosition(eyePos, position, LayerManager.MASK_WORLD, out var hitInfo) && (Object)(object)((Component)((RaycastHit)(ref hitInfo)).transform).gameObject != (Object)(object)targetObj)
			{
				return ((RaycastHit)(ref hitInfo)).transform.IsChildOf(targetObj.transform);
			}
			return true;
		}
	}
	public static class TypeExtensions
	{
		public static bool IsTypeMonoBehaviorFixed(Type type)
		{
			if (type == typeof(MonoBehaviorFixed))
			{
				return true;
			}
			if (type.BaseType == typeof(MonoBehaviorFixed) || type.IsSubclassOf(typeof(MonoBehaviorFixed)))
			{
				return true;
			}
			return false;
		}
	}
}
namespace BetterBots.PlayerBotActionDebugs
{
	public class PBAD_UseFireArm : PlayerBotActionDebug<PlayerBotActionUseFirearm>
	{
		protected override void PostAdditionalFields(PlayerBotActionUseFirearm action)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: 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_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			bool flag = action.TestFriendlyFire();
			AppendColorInformation("TestFriendlyFire", flag ? Color.green : Color.red, flag);
			AppendColorInformation("OpenFire", action.m_desc.OpenFire ? Color.green : Color.red, action.m_desc.OpenFire);
			AppendColorInformation("m_lookAction", (action.m_lookAction != null) ? Color.green : Color.red, (action.m_lookAction != null) ? "Active" : "Not Active");
			AppendColorInformation("m_aimIsBlending", ((PlayerBotActionBase)action).m_agent.SyncIK.m_aimIsBlending ? Color.green : Color.red, ((PlayerBotActionBase)action).m_agent.SyncIK.m_aimIsBlending);
			AppendColorInformation("requireVisibility", action.m_desc.requireVisibility ? Color.green : Color.red, "action.m_desc.requireVisibility");
		}
	}
	public class PlayerBotActionDebug<PA> : PlayerBotActionDebugBase where PA : PlayerBotActionBase
	{
		public override Type ActionType => Il2CppType.Of<PA>();

		public override string ActionName => ((MemberInfo)Il2CppType.Of<PA>()).Name;

		public sealed override void PrintFields(PlayerBotActionBase m_actionBase)
		{
			base.PrintFields(m_actionBase);
			PostAdditionalFields(((Il2CppObjectBase)m_actionBase).TryCast<PA>());
		}

		protected virtual void PostAdditionalFields(PA action)
		{
		}
	}
	public class PBAD_Attack : PlayerBotActionDebug<PlayerBotActionAttack>
	{
		protected override void PostAdditionalFields(PlayerBotActionAttack action)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: 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_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			StanceEnum stance = action.m_desc.Stance;
			AppendInformation("Posture", ((object)(StanceEnum)(ref stance)).ToString());
			PostureEnum posture = action.m_desc.Posture;
			AppendInformation("Stance", ((object)(PostureEnum)(ref posture)).ToString());
			AppendInformation("Haste", "<color=orange>" + action.m_desc.Haste + "</color>");
			AttackMeansEnum means = action.m_desc.Means;
			AppendInformation("Means", "<color=#FFA8A8>" + ((object)(AttackMeansEnum)(ref means)).ToString() + "</color>");
		}
	}
	public abstract class PlayerBotActionDebugBase
	{
		private string m_currentMessage;

		public virtual Type ActionType => null;

		public virtual string ActionName => "UNKNOWN";

		public string Message => m_currentMessage;

		public virtual void PrintFields(PlayerBotActionBase m_actionBase)
		{
			ResetMessage();
			SetTitle(ActionName);
			PrintBaseFields(m_actionBase);
		}

		protected void PrintBaseFields(PlayerBotActionBase m_actionBase)
		{
			//IL_0014: 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)
			if (m_actionBase.m_descBase != null)
			{
				StatusType status = m_actionBase.m_descBase.Status;
				AppendInformation("Status", ((object)(StatusType)(ref status)).ToString());
				AppendInformation("Priority", "<color=orange>" + m_actionBase.m_descBase.Prio + "</color>");
			}
			else
			{
				ApendErrorInformation("Action Descriptor is null!!");
			}
		}

		private void SetTitle(string title)
		{
			m_currentMessage = m_currentMessage + "\n\t" + title;
		}

		private void ResetMessage()
		{
			m_currentMessage = string.Empty;
		}

		protected void AppendInformation(string fieldName, string information)
		{
			m_currentMessage = m_currentMessage + "\n\t\t" + fieldName + " : " + information;
		}

		protected void AppendInformation(string fieldName, object informationObject)
		{
			AppendInformation(fieldName, informationObject.ToString());
		}

		protected void AppendColorInformation(string fieldName, Color color, string information)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			m_currentMessage = m_currentMessage + "\n\t\t" + fieldName + " : <color=#" + ColorUtility.ToHtmlStringRGBA(color) + ">" + information + "</color>";
		}

		protected void AppendColorInformation(string fieldName, Color color, object informationObj)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			AppendColorInformation(fieldName, color, informationObj.ToString());
		}

		protected void ApendErrorInformation(string information)
		{
			m_currentMessage = m_currentMessage + "\n\t\t<color=red>" + information + "</color>";
		}
	}
	public class PBAD_CarryExpeditionItem : PlayerBotActionDebug<PlayerBotActionCarryExpeditionItem>
	{
		protected override void PostAdditionalFields(PlayerBotActionCarryExpeditionItem action)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			if (action.m_desc != null)
			{
				Color yellow = Color.yellow;
				State state = action.m_state;
				AppendColorInformation("State", yellow, ((object)(State)(ref state)).ToString());
				if ((Object)(object)action.m_desc.TargetItem != (Object)null)
				{
					AppendInformation("TargetItem", "<color=yellow>" + ((Item)action.m_desc.TargetItem).PublicName + "</color>");
				}
				else
				{
					AppendInformation("TargetItem", "<color=red>NONE</color>");
				}
				AppendInformation("AllowIdleDrop", action.m_desc.AllowIdleDrop.ToString());
				AppendInformation("MaxLeaderDistance", action.m_desc.MaxLeaderDistance.ToString());
				AppendInformation("HoldPrio", action.m_desc.HoldPrio.ToString());
			}
		}
	}
	public class PBAD_Follow : PlayerBotActionDebug<PlayerBotActionFollow>
	{
		protected override void PostAdditionalFields(PlayerBotActionFollow action)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			State state = action.m_state;
			AppendInformation("State", ((object)(State)(ref state)).ToString());
			AppendInformation("Client", ((Object)action.m_desc.Client.Owner).ToString());
			AppendInformation("MaxDistance", action.m_desc.MaxDistance.ToString());
			AppendInformation("FormationPrio", action.m_desc.FormationPrio.ToString());
		}
	}
	public class PBAD_CollectItem : PlayerBotActionDebug<PlayerBotActionCollectItem>
	{
		protected override void PostAdditionalFields(PlayerBotActionCollectItem action)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			State state = action.m_state;
			AppendInformation("State", ((object)(State)(ref state)).ToString());
			if ((Object)(object)action.m_desc.TargetItem != (Object)null)
			{
				AppendInformation("TargetItem", "<color=yellow>" + action.m_desc.TargetItem.PublicName + "</color>");
			}
			else
			{
				AppendInformation("TargetItem", "<color=red>NONE</color>");
			}
			if ((Object)(object)action.m_desc.TargetContainer != (Object)null)
			{
				eResourceContainerStatus status = action.m_desc.TargetContainer.m_core.Status;
				AppendInformation("TargetContainer Status", ((object)(eResourceContainerStatus)(ref status)).ToString());
				AppendInformation("TargetContainer Name", ((Object)action.m_desc.TargetContainer).name.ToString());
			}
		}
	}
	public class PBAD_Melee : PlayerBotActionDebug<PlayerBotActionMelee>
	{
		protected override void PostAdditionalFields(PlayerBotActionMelee action)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			StateEnum state = action.m_desc.State;
			AppendInformation("State", ((object)(StateEnum)(ref state)).ToString());
			AppendInformation("Strike", action.m_desc.Strike.ToString());
			AppendInformation("IsCharged", action.m_desc.IsCharged.ToString());
			AppendInformation("ChargeDuraction", Mathf.Max(Time.time - action.m_chargeStartTime, 0f).ToString());
		}
	}
	public class PBAD_UseBioScan : PlayerBotActionDebug<PlayerBotActionUseBioscan>
	{
		protected override void PostAdditionalFields(PlayerBotActionUseBioscan action)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			State state = action.m_state;
			AppendInformation("State", ((object)(State)(ref state)).ToString());
		}
	}
	public enum PlayerBotActionType
	{
		Idle,
		Follow,
		Attack,
		Revive,
		ShareResource,
		UseBioScan,
		CollectItem,
		CarryExpedtionItem,
		Melee,
		UseFireArm
	}
}
namespace BetterBots.Patches.ManualPatches
{
	[HarmonyPatch(typeof(BulletWeapon))]
	internal class Patch_BulletWeapon
	{
		[HarmonyPrefix]
		[HarmonyPatch("BulletHit")]
		private static bool Pre_BulletHit(ref WeaponHitData weaponRayData)
		{
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			if (SNet.IsMaster && ConfigurationPluginManager.BetterBotsAimBot && (Object)(object)weaponRayData.owner != (Object)null && weaponRayData.owner.Owner.IsBot)
			{
				if (PlayerBotManagerExtended.TryToHitEnemy(weaponRayData.owner, out var hitDir, out var raycastHit))
				{
					weaponRayData.fireDir = hitDir;
					weaponRayData.rayHit = raycastHit;
				}
				weaponRayData.damage = PlayerBotManagerExtended.AddBonusMulitplier(weaponRayData.damage, BetterBots.Settings.ADDITIONAL_BULLET_DAMAGE);
				RaycastHit rayHit = weaponRayData.rayHit;
				if ((Object)(object)((RaycastHit)(ref rayHit)).collider != (Object)null)
				{
					rayHit = weaponRayData.rayHit;
					if ((Object)(object)((Component)((RaycastHit)(ref rayHit)).collider).gameObject != (Object)null)
					{
						rayHit = weaponRayData.rayHit;
						if ((Object)(object)((Component)((RaycastHit)(ref rayHit)).collider).gameObject.GetComponentInParent<PlayerAgent>() != (Object)null)
						{
							return false;
						}
					}
				}
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(AgentModifierManager))]
	internal class Patch_AgentModifierManager
	{
		[HarmonyPrefix]
		[HarmonyPatch("ApplyModifier")]
		private static void Pre_ApplyModifier(Agent agent, AgentModifier modifier, ref float value)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Invalid comparison between Unknown and I4
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Invalid comparison between Unknown and I4
			if ((Object)(object)agent != (Object)null)
			{
				PlayerAgent val = ((Il2CppObjectBase)agent).TryCast<PlayerAgent>();
				if ((Object)(object)val != (Object)null && (Object)(object)val.Owner != (Object)null && val.Owner.IsBot && ((int)modifier == 6 || (int)modifier == 7))
				{
					value = PlayerBotManagerExtended.SubtractBonusMulitplier(value, BetterBots.Settings.DAMAGE_RESISTANCE_MULTIPLIER);
				}
			}
		}
	}
	[HarmonyPatch(typeof(DramaManager))]
	internal class Patch_DramaManager
	{
		[HarmonyPostfix]
		[HarmonyPatch("CheckLoudTransition")]
		private static void PostCheckLoudTransition(DRAMA_State newState)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Invalid comparison between Unknown and I4
			bool hasLoudStateEnter = false;
			if (newState - 5 <= 3)
			{
				hasLoudStateEnter = true;
			}
			PlayerBotManagerExtended.HasLoudStateEnter = hasLoudStateEnter;
		}
	}
	[HarmonyPatch(typeof(PlayerAgent))]
	internal class Patch_PlayerAgent
	{
		private const bool m_recordBot = true;

		[HarmonyPostfix]
		[HarmonyPatch("Setup")]
		private static void PostSetup(PlayerAgent __instance)
		{
			if (__instance.Owner.IsBot && (Object)(object)((Component)__instance).gameObject.GetComponent<BotRecorder>() == (Object)null)
			{
				((Component)__instance).gameObject.AddComponent<BotRecorder>();
				BBLog.Message("BotRecoder Setup for " + __instance.Owner.NickName);
			}
		}
	}
	[HarmonyPatch(typeof(PlayerAIBot))]
	internal class Patch_PlayerAIBot
	{
		[HarmonyPostfix]
		[HarmonyPatch("WantsCrouch")]
		private static void Post_WantsToCrouch(PlayerAIBot __instance, ref bool __result)
		{
			BotRecorder component = ((Component)__instance.Agent).gameObject.GetComponent<BotRecorder>();
			if ((Object)(object)component != (Object)null && component.SneakingRestricted)
			{
				__result = false;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("HasTwitcherNearby")]
		private static void Post_HasTwitcherNearby(PlayerAIBot __instance, ref bool __result)
		{
			BotRecorder component = ((Component)__instance.Agent).gameObject.GetComponent<BotRecorder>();
			if ((Object)(object)component != (Object)null && component.SneakingRestricted)
			{
				__result = false;
			}
		}
	}
	[HarmonyPatch(typeof(PlayerBotActionAttack))]
	internal class Patch_PlayerBotActionAttack
	{
		[HarmonyPostfix]
		[HarmonyPatch("ChooseAttackOption")]
		private static void Post_ChooseAttackOption(PlayerBotActionAttack __instance, ref bool __result)
		{
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Invalid comparison between Unknown and I4
			if (!__result)
			{
				return;
			}
			BotRecorder component = ((Component)((PlayerBotActionBase)__instance).m_agent).gameObject.GetComponent<BotRecorder>();
			if (!((Object)(object)component != (Object)null))
			{
				return;
			}
			ItemEquippable bestItemToUse;
			if (PlayerBotManagerExtended.LoudStateIsEarlyToMelee)
			{
				if (PlayerBotManagerExtended.TryGetBestMeleeWeapon(PlayerBackpackManager.GetBackpack(((PlayerBotActionBase)__instance).m_agent.Owner), out var weapon))
				{
					__instance.m_currentAttackOption.Means = (AttackMeansEnum)1;
					__instance.m_currentAttackOption.Prio = 100000f;
					__instance.m_currentAttackOption.ItemToUse = (ItemEquippable)(object)weapon;
					__instance.m_currentAttackOption.Stance = (StanceEnum)2;
				}
			}
			else if (component.Brain.HasAmmo() && component.Brain.ForceBulletsOnly && PlayerBotManagerExtended.TryToGetBestWeapon(((PlayerBotActionBase)__instance).m_agent, out bestItemToUse) && (int)__instance.m_currentAttackOption.Means != 4)
			{
				__instance.m_currentAttackOption.Means = (AttackMeansEnum)4;
				__instance.m_currentAttackOption.Prio = 100000f;
				__instance.m_currentAttackOption.ItemToUse = bestItemToUse;
				__instance.m_currentAttackOption.Stance = (StanceEnum)1;
			}
		}
	}
	[HarmonyPatch(typeof(PlayerBotActionBioscanProximity))]
	internal class Patch_PlayerBotActionBioscanProximity
	{
		[HarmonyPostfix]
		[HarmonyPatch("VerifyScanner")]
		private static void Post_VerifyScanner(PlayerBotActionBioscanProximity __instance, ref bool __result)
		{
			if ((Object)(object)__instance.m_desc.Bioscan != (Object)null && __instance.m_desc.Bioscan.IsExitPuzzle)
			{
				__result = true;
			}
		}
	}
	[HarmonyPatch(typeof(PlayerBotActionCarryExpeditionItem))]
	internal class Patch_PlayerBotActionCarryExpeditionItem
	{
		[HarmonyPostfix]
		[HarmonyPatch("UpdateStateIdle")]
		private static void Post_UpdateStateIdle(PlayerBotActionCarryExpeditionItem __instance)
		{
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			BotRecorder component = ((Component)((PlayerBotActionBase)__instance).m_agent).gameObject.GetComponent<BotRecorder>();
			if ((Object)(object)component != (Object)null && !component.IsDangerousToCollectExpeditionItem() && (!component.m_firstExpeditionItemTimer || component.m_abortExpeditionItemTimer + 3f < Time.time) && !__instance.m_isCarrying && !PlayerBotManagerExtended.IsBotCurrentlyBusyWithAction(((PlayerBotActionBase)__instance).m_bot))
			{
				__instance.m_collectAction.TargetPosition = ((Component)__instance.m_desc.TargetItem).transform.position;
				if (((PlayerBotActionBase)__instance).m_bot.RequestAction((Descriptor)(object)__instance.m_collectAction))
				{
					__instance.SetState((State)1);
				}
			}
		}
	}
	[HarmonyPatch(typeof(PlayerBotActionUseBioscan))]
	internal class Patch_PlayerBotActionUseBioscan
	{
		[HarmonyPostfix]
		[HarmonyPatch("VerifyScanner")]
		private static void Post_VerifyScanner(PlayerBotActionUseBioscan __instance, ref bool __result)
		{
			if ((Object)(object)__instance.m_desc.Bioscan != (Object)null && __instance.m_desc.Bioscan.IsExitPuzzle)
			{
				__result = true;
			}
		}
	}
	[HarmonyPatch(typeof(PlayerBotActionUseFirearm))]
	internal class Patch_PlayerBotActionUseFireArm
	{
		[HarmonyPrefix]
		[HarmonyPatch("TestFriendlyFire")]
		private static bool Pre_TestFriendlyFire(PlayerBotActionUseFirearm __instance, ref bool __result)
		{
			__result = PlayerBotManagerExtended.TryToHitEnemy(((PlayerBotActionBase)__instance).m_agent, out var _, out var _);
			return false;
		}
	}
	[HarmonyPatch(typeof(RootPlayerBotAction))]
	internal class Patch_RootPlayerBotAction
	{
		[HarmonyPrefix]
		[HarmonyPatch("UpdateActionReviveTeammate")]
		private static bool Pre_UpdateActionReviveTeammate(RootPlayerBotAction __instance)
		{
			BotRecorder component = ((Component)((PlayerBotActionBase)__instance).m_agent).gameObject.GetComponent<BotRecorder>();
			if ((Object)(object)component != (Object)null)
			{
				return !component.Brain.ReviveRestricted;
			}
			return true;
		}

		[HarmonyPrefix]
		[HarmonyPatch("UpdateActionShareResoursePack")]
		private static bool Pre_UpdateActionShareResoursePack(RootPlayerBotAction __instance)
		{
			BotRecorder component = ((Component)((PlayerBotActionBase)__instance).m_agent).gameObject.GetComponent<BotRecorder>();
			if ((Object)(object)component != (Object)null)
			{
				return !component.IsInDangerousSituation();
			}
			return true;
		}

		[HarmonyPrefix]
		[HarmonyPatch("UpdateActionCollectItem")]
		private static bool Pre_UpdateActionCollectItem(RootPlayerBotAction __instance, ref Descriptor bestAction)
		{
			//IL_026a: 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_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: 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_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
			if (((Descriptor)__instance.m_collectItemAction).IsTerminated())
			{
				((Descriptor)__instance.m_collectItemAction).Prio = RootPlayerBotAction.m_prioSettings.CollectItem;
				if (RootPlayerBotAction.CompareActionPrios((Descriptor)(object)__instance.m_collectItemAction, bestAction) && !PlayerBackpackManager.GetBackpack(((PlayerBotActionBase)__instance).m_agent.Owner).HasBackpackItem((InventorySlot)8) && !((PlayerBotActionBase)__instance).m_bot.IsActionForbidden((Descriptor)(object)__instance.m_collectItemAction))
				{
					ItemPriorityData itemPriorityData = new ItemPriorityData(((PlayerBotActionBase)__instance).m_agent);
					AIG_CourseNode courseNode = ((Agent)((PlayerBotActionBase)__instance).m_agent).CourseNode;
					for (int i = 0; i < courseNode.MetaData.StorageContainers.Count; i++)
					{
						LG_ResourceContainer_Storage val = courseNode.MetaData.StorageContainers[i];
						LG_WeakResourceContainer component = ((Component)val).gameObject.GetComponent<LG_WeakResourceContainer>();
						if (!((Object)(object)component != (Object)null) || !component.ISOpen)
						{
							continue;
						}
						((AIReservation)RootPlayerBotAction.s_tempObjReservation).CharacterID = ((PlayerBotActionBase)__instance).m_agent.CharacterID;
						RootPlayerBotAction.s_tempObjReservation.Object = ((Component)val).gameObject;
						if (PlayerManager.Current.IsObjectReserved(RootPlayerBotAction.s_tempObjReservation) || ((PlayerBotActionBase)__instance).IsAnyHumanPlayerNear(((Component)val).transform.position, 7f))
						{
							continue;
						}
						Vector3 val2 = ((Component)val).transform.position - ((Component)val).transform.up * RootPlayerBotAction.s_collectItemStandDistance;
						if (!((PlayerBotActionBase)__instance).SnapPositionToNav(val2, ref val2))
						{
							continue;
						}
						((AIReservation)RootPlayerBotAction.s_tempPosReservation).CharacterID = ((PlayerBotActionBase)__instance).m_agent.CharacterID;
						RootPlayerBotAction.s_tempPosReservation.Position = val2;
						if (PlayerManager.Current.IsPositionReserved(RootPlayerBotAction.s_tempPosReservation))
						{
							continue;
						}
						float prio = ((Descriptor)__instance.m_collectItemAction).Prio;
						if (((PlayerBotActionBase)__instance).m_bot.ApplyRestrictionsToRootPosition(ref val2, ref prio) || !PlayerBotManagerExtended.GetItemsFromStorageContainer(val, out var storageItems))
						{
							continue;
						}
						for (int j = 0; j < storageItems.Count; j++)
						{
							Item val3 = storageItems[j];
							if (val3.ItemDataBlock != null && !ItemPriorityData.BlockedItems.Contains(((GameDataBlockBase<ItemDataBlock>)(object)val3.ItemDataBlock).persistentID))
							{
								itemPriorityData.UpcomingItemGrabStatus = new ItemPriorityData.ItemGrabStats
								{
									Item = val3,
									Position = val2,
									Container = val
								};
								itemPriorityData.DeterminePriority();
							}
						}
					}
					if (itemPriorityData.CurrentItemGrabStatus != null)
					{
						__instance.m_collectItemAction.TargetItem = itemPriorityData.CurrentItemGrabStatus.Item;
						__instance.m_collectItemAction.TargetContainer = itemPriorityData.CurrentItemGrabStatus.Container;
						__instance.m_collectItemAction.TargetPosition = itemPriorityData.CurrentItemGrabStatus.Position;
						__instance.m_collectItemAction.Haste = ((DramaManager.GoToCombat || DramaManager.GoToEncounter) ? 2f : 0.5f);
						bestAction = (Descriptor)(object)__instance.m_collectItemAction;
					}
				}
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(StartMainGame))]
	internal class Patch_StartMainGame
	{
		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		private static void PostStart()
		{
			BetterBots.OnStartGame();
		}
	}
	[HarmonyPatch(typeof(Weapon))]
	internal class Patch_Weapon
	{
		[HarmonyPrefix]
		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		private static void Pre_CastWeaponRay(Transform alignTransform, ref WeaponHitData weaponRayData, ref Vector3 originPos, ref int altRayCastMask)
		{
			if (SNet.IsMaster && weaponRayData != null && (Object)(object)weaponRayData.owner != (Object)null && (Object)(object)weaponRayData.owner.Owner != (Object)null && weaponRayData.owner.Owner.IsBot && altRayCastMask == -1)
			{
				altRayCastMask = PlayerBotManagerExtended.MASK_BULLET_RAY_BOTS;
			}
		}
	}
}
namespace BetterBots.Managers
{
	public static class BotRecorderManager
	{
		private static List<BotRecorder> s_recorders = new List<BotRecorder>();

		private static int s_lastGuiSlotIndex = -1;

		private const float m_recty = 300f;

		public const float m_height = 2000f;

		private static Rect[] s_guiSlots = (Rect[])(object)new Rect[4]
		{
			new Rect(400f, 300f, 500f, 2000f),
			new Rect(700f, 300f, 500f, 2000f),
			new Rect(1000f, 300f, 500f, 2000f),
			new Rect(1200f, 300f, 500f, 2000f)
		};

		public const bool m_guiManagerEnabled = false;

		public static void RegisterBotRecorder(BotRecorder recorder)
		{
		}

		private static void AssignSlotIndex(BotRecorder recorder)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			s_lastGuiSlotIndex++;
			recorder.m_guiSlotIndex = s_lastGuiSlotIndex;
			recorder.m_guiSlot = s_guiSlots[s_lastGuiSlotIndex];
			recorder.m_hasGuiSlot = true;
		}

		public static void DeRegisterRecorder(BotRecorder recorderDestroyed)
		{
		}
	}
	public static class ConfigurationPluginManager
	{
		private static bool Inited;

		private static ConfigFile ConfigurationFile;

		public static bool BetterBotsAimBot;

		public static void Initialized()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Expected O, but got Unknown
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Expected O, but got Unknown
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			if (!Inited)
			{
				Inited = true;
				ConfigurationFile = new ConfigFile(Path.Combine(Paths.ConfigPath, "BetterBots.cfg"), true);
				ConfigDefinition val = new ConfigDefinition("Improved Aim", "Enabled");
				ConfigDescription val2 = new ConfigDescription("Improves the bots' accuracy by 100%", (AcceptableValueBase)null, (object[])null);
				ConfigurationFile.Bind<bool>(val, false, val2);
				ConfigEntry<bool> val3 = default(ConfigEntry<bool>);
				if (ConfigurationFile.TryGetEntry<bool>(val, ref val3))
				{
					BetterBotsAimBot = val3.Value;
				}
				ConfigurationFile.Save();
			}
		}
	}
	public static class PlayerBotManagerExtended
	{
		public class AimSpot
		{
			public Dam_EnemyDamageLimb DamLimb;

			public float Prio;

			public static readonly float HEAD_LIMB_PRIO = 2f;

			public static readonly float WEAK_LIMB_PRIO = 3f;

			public static readonly float DEFAULT_LIMB_PRIO = 1f;
		}

		public class AttackEnemy
		{
			public bool Awake;

			public EnemyAgent Enemy;

			public float Prio;

			public AttackEnemy(EnemyAgent enemyAgent)
			{
				Enemy = enemyAgent;
			}

			private bool IsAwake()
			{
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				//IL_0026: Invalid comparison between Unknown and I4
				bool flag = default(bool);
				bool flag2 = default(bool);
				Enemy.AI.IsHibernating(ref flag, ref flag2);
				if ((int)((AgentAI)Enemy.AI).Mode == 1 || flag2)
				{
					return true;
				}
				return false;
			}

			public bool IsAttackable()
			{
				//IL_0052: Unknown result type (might be due to invalid IL or missing references)
				//IL_0058: Unknown result type (might be due to invalid IL or missing references)
				if (IsAwake())
				{
					return true;
				}
				if (((Agent)Enemy).CourseNode == null)
				{
					return false;
				}
				List<EnemyAgent> reachableEnemiesInNodes = AIG_CourseGraph.GetReachableEnemiesInNodes(((Agent)Enemy).CourseNode, 2);
				if (reachableEnemiesInNodes != null)
				{
					Enumerator<EnemyAgent> enumerator = reachableEnemiesInNodes.GetEnumerator();
					while (enumerator.MoveNext())
					{
						EnemyAgent current = enumerator.Current;
						if ((Object)(object)current != (Object)(object)Enemy)
						{
							float num = Vector3.Distance(Enemy.ListenerPosition, current.ListenerPosition);
							float num2 = current.EnemyDetectionData.movementDetectionDistance * 0.1f;
							if (current.EnemyDetectionData.movementDetectionDistance + num2 > num)
							{
								return false;
							}
						}
					}
				}
				return true;
			}
		}

		private static float m_loudStateEnter;

		private static bool m_hasLoudStateEnter;

		public static int MASK_BULLET_RAY_BOTS;

		private static List<BotRecorder> m_botRecorders;

		public static bool HasLoudStateEnter
		{
			get
			{
				return m_hasLoudStateEnter;
			}
			set
			{
				if (m_hasLoudStateEnter != value)
				{
					m_hasLoudStateEnter = value;
					if (m_hasLoudStateEnter)
					{
						m_loudStateEnter = Time.time;
					}
				}
			}
		}

		public static bool LoudStateIsEarlyToMelee
		{
			get
			{
				if (m_hasLoudStateEnter)
				{
					return m_loudStateEnter + 3f > Time.time;
				}
				return false;
			}
		}

		public static void Awake()
		{
			m_botRecorders = new List<BotRecorder>();
			MASK_BULLET_RAY_BOTS = LayerManager.Current.GetMask(new string[6] { "Default", "Default_NoGraph", "Default_BlockGraph", "EnemyDamagable", "ProjectileBlocker", "Dynamic" });
			BBLog.Message("PlayerBotManagerExtended, Awake");
		}

		public static bool IsBotCurrentlyBusyWithAction(PlayerAIBot bot)
		{
			Descriptor targetDesc;
			bool flag = bot.TryGetActionDescriptor<Descriptor>(queued: true, active: true, out targetDesc);
			Descriptor targetDesc2;
			bool flag2 = bot.TryGetActionDescriptor<Descriptor>(queued: true, active: true, out targetDesc2);
			Descriptor targetDesc3;
			bool flag3 = bot.TryGetActionDescriptor<Descriptor>(queued: true, active: true, out targetDesc3);
			Descriptor targetDesc4;
			bool flag4 = bot.TryGetActionDescriptor<Descriptor>(queued: true, active: true, out targetDesc4);
			Descriptor targetDesc5;
			bool flag5 = bot.TryGetActionDescriptor<Descriptor>(queued: true, active: true, out targetDesc5);
			Descriptor targetDesc6;
			bool flag6 = bot.TryGetActionDescriptor<Descriptor>(queued: true, active: true, out targetDesc6);
			Descriptor targetDesc7;
			Descriptor targetDesc8;
			return bot.TryGetActionDescriptor<Descriptor>(queued: true, active: true, out targetDesc7) || bot.TryGetActionDescriptor<Descriptor>(queued: true, active: true, out targetDesc8) || flag || flag2 || flag3 || flag4 || flag5 || flag6;
		}

		public static void Start()
		{
		}

		public static void Update()
		{
		}

		public static float AddBonusMulitplier(float originalValue, float multiplier)
		{
			float num = originalValue * multiplier;
			return originalValue += num;
		}

		public static float SubtractBonusMulitplier(float originalValue, float multiplier)
		{
			float num = originalValue * multiplier;
			return originalValue -= num;
		}

		private static void UpdateForcedUnlockObjective()
		{
			//IL_003e: 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_00b5: 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)
			SyncedNavMarkerWrapper[] array = Il2CppArrayBase<SyncedNavMarkerWrapper>.op_Implicit((Il2CppArrayBase<SyncedNavMarkerWrapper>)(object)GuiManager.Current.m_playerPings);
			for (int i = 0; i < array.Length; i++)
			{
				if (!array[i].NavMarkerIsVisible() || IsPlayerSlotIndexBot(array[i].m_playerIndex))
				{
					continue;
				}
				Collider[] array2 = Il2CppArrayBase<Collider>.op_Implicit((Il2CppArrayBase<Collider>)(object)Physics.OverlapSphere(((Component)array[i]).transform.position, 10f, LayerManager.MASK_PING_TARGET));
				if (array2.Length == 0)
				{
					continue;
				}
				for (int j = 0; j < array2.Length; j++)
				{
					LG_WeakResourceContainer componentInParent = ((Component)array2[i]).gameObject.GetComponentInParent<LG_WeakResourceContainer>();
					if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent.m_weakLock != (Object)null && (int)componentInParent.m_weakLock.m_lockType != 0 && !IsObjectReservedForUnlockAction(((Component)componentInParent).gameObject) && TryToGetClosestPlayerBotToStorage(((Component)componentInParent).gameObject, componentInParent.m_weakLock.m_lockType, out var bestBotRecorder))
					{
						bestBotRecorder.ForceUnlockAction(componentInParent, componentInParent.m_weakLock.m_lockType);
					}
				}
			}
		}

		public static bool IsObjectReservedForUnlockAction(GameObject gameObject)
		{
			for (int i = 0; i < m_botRecorders.Count; i++)
			{
				BotRecorder botRecorder = m_botRecorders[i];
				if (botRecorder.HasRootAction && !((Descriptor)botRecorder.RootAction.m_unlockAction).IsTerminated() && (Object)(object)botRecorder.RootAction.m_unlockAction.TargetGO == (Object)(object)gameObject)
				{
					return true;
				}
			}
			return false;
		}

		private static bool TryToGetClosestPlayerBotToStorage(GameObject storage, eWeakLockType lockType, out BotRecorder bestBotRecorder)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Invalid comparison between Unknown and I4
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			bestBotRecorder = null;
			float num = 0f;
			for (int i = 0; i < m_botRecorders.Count; i++)
			{
				BotRecorder botRecorder = m_botRecorders[i];
				if (botRecorder.HasRootAction && ((Agent)botRecorder.Agent).Alive && ((Descriptor)botRecorder.RootAction.m_unlockAction).IsTerminated() && ((int)lockType == 1 || botRecorder.HasLockMelters()))
				{
					float num2 = Vector3.Distance(((Agent)botRecorder.Agent).Position, storage.transform.position);
					if ((Object)(object)bestBotRecorder == (Object)null || num > num2)
					{
						bestBotRecorder = botRecorder;
						num = num2;
					}
				}
			}
			return (Object)(object)bestBotRecorder != (Object)null;
		}

		public static void FixedUpdate()
		{
		}

		public static void LateUpdate()
		{
		}

		public static bool IsPlayerSlotIndexBot(int playerSlotIndex)
		{
			for (int i = 0; i < PlayerManager.PlayerAgentsInLevel.Count; i++)
			{
				PlayerAgent val = PlayerManager.PlayerAgentsInLevel[i];
				if ((Object)(object)val != (Object)null && val.PlayerSlotIndex == playerSlotIndex)
				{
					return val.Owner.IsBot;
				}
			}
			return false;
		}

		public static void RegisterBotRecoder(BotRecorder botRecorder)
		{
			if (!m_botRecorders.Contains(botRecorder))
			{
				m_botRecorders.Add(botRecorder);
			}
		}

		public static void DeRegisterBotRecorder(BotRecorder botRecorder)
		{
			if (m_botRecorders.Contains(botRecorder))
			{
				m_botRecorders.Remove(botRecorder);
			}
		}

		public static float GetAmmoRel(PlayerBackpack backPack, AmmoType ammoType)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Invalid comparison between Unknown and I4
			float ammoInPack = backPack.AmmoStorage.GetAmmoInPack(ammoType);
			if ((int)ammoType != 0)
			{
				if ((int)ammoType == 1)
				{
					return backPack.AmmoStorage.GetClipAmmoFromSlot((InventorySlot)2) + ammoInPack;
				}
				return 0f;
			}
			return backPack.AmmoStorage.GetClipAmmoFromSlot((InventorySlot)1) + ammoInPack;
		}

		public static bool TryGetBulletWeapon(PlayerBackpack playerBackpack, InventorySlot slot, out BulletWeaponSynced weapon)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			weapon = null;
			BackpackItem val = default(BackpackItem);
			if (playerBackpack.TryGetBackpackItem(slot, ref val) && (Object)(object)val.Instance != (Object)null)
			{
				ItemEquippable val2 = ((Il2CppObjectBase)val.Instance).TryCast<ItemEquippable>();
				if ((Object)(object)val2 != (Object)null && val2.IsWeapon && (Object)(object)val2.WeaponComp != (Object)null)
				{
					weapon = ((Il2CppObjectBase)val2.WeaponComp).TryCast<BulletWeaponSynced>();
					return (Object)(object)weapon != (Object)null;
				}
			}
			return false;
		}

		public static bool TryGetBestMeleeWeapon(PlayerBackpack playerBackpack, out MeleeWeaponThirdPerson weapon)
		{
			weapon = null;
			BackpackItem val = default(BackpackItem);
			if (playerBackpack.TryGetBackpackItem((InventorySlot)10, ref val) && (Object)(object)val.Instance != (Object)null)
			{
				ItemEquippable val2 = ((Il2CppObjectBase)val.Instance).TryCast<ItemEquippable>();
				if ((Object)(object)val2 != (Object)null)
				{
					weapon = ((Il2CppObjectBase)val2).TryCast<MeleeWeaponThirdPerson>();
					return (Object)(object)weapon != (Object)null;
				}
			}
			return false;
		}

		public static bool TryToGetBestWeapon(PlayerAgent playerAgent, out ItemEquippable bestItemToUse)
		{
			bestItemToUse = null;
			PlayerBackpack playerBackpack = default(PlayerBackpack);
			PlayerBackpackManager.TryGetBackpack(playerAgent.Owner, ref playerBackpack);
			if (playerBackpack == null)
			{
				return false;
			}
			float highestClipsRel = 0f;
			float highestBulletInPackRel = 0f;
			BulletWeaponSynced weapon;
			bool flag = TryGetBulletWeapon(playerBackpack, (InventorySlot)1, out weapon);
			BulletWeaponSynced weapon2;
			bool flag2 = TryGetBulletWeapon(playerBackpack, (InventorySlot)2, out weapon2);
			if (flag2)
			{
				DetermineBestWeapon(weapon2, ignoreClip: false, ref bestItemToUse);
			}
			if (flag)
			{
				DetermineBestWeapon(weapon, ignoreClip: false, ref bestItemToUse);
			}
			if ((Object)(object)bestItemToUse == (Object)null)
			{
				if (flag2)
				{
					DetermineBestWeapon(weapon2, ignoreClip: true, ref bestItemToUse);
				}
				if (flag)
				{
					DetermineBestWeapon(weapon, ignoreClip: true, ref bestItemToUse);
				}
			}
			return (Object)(object)bestItemToUse != (Object)null;
			void DetermineBestWeapon(BulletWeaponSynced bulletWeapon, bool ignoreClip, ref ItemEquippable bestitemEquippable)
			{
				//IL_0013: Unknown result type (might be due to invalid IL or missing references)
				float currentClipRel = ((ItemEquippable)bulletWeapon).GetCurrentClipRel();
				float bulletsRelInPack = playerBackpack.AmmoStorage.GetBulletsRelInPack(((ItemEquippable)bulletWeapon).AmmoType);
				if (ignoreClip)
				{
					if (bulletsRelInPack > 0f && bulletsRelInPack > highestBulletInPackRel)
					{
						bestitemEquippable = (ItemEquippable)(object)bulletWeapon;
						highestBulletInPackRel = bulletsRelInPack;
					}
				}
				else if (currentClipRel > 0f && currentClipRel > highestClipsRel)
				{
					bestitemEquippable = (ItemEquippable)(object)bulletWeapon;
					highestClipsRel = currentClipRel;
				}
			}
		}

		public static bool TryToGetLimb(EnemyAgent enemy, bool includeHeadLimb, out AimSpot bestTargetAimSpot)
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Invalid comparison between Unknown and I4
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Invalid comparison between Unknown and I4
			bestTargetAimSpot = null;
			if ((Object)(object)enemy.ModelRef == (Object)null)
			{
				return false;
			}
			if (enemy.Damage.DamageLimbs != null && ((Il2CppArrayBase<Dam_EnemyDamageLimb>)(object)enemy.Damage.DamageLimbs).Count > 0)
			{
				Vector3 eyePosition = ((Agent)enemy).EyePosition;
				float num = 0f;
				for (int i = 0; i < ((Il2CppArrayBase<Dam_EnemyDamageLimb>)(object)enemy.Damage.DamageLimbs).Count; i++)
				{
					Dam_EnemyDamageLimb val = ((Il2CppArrayBase<Dam_EnemyDamageLimb>)(object)enemy.Damage.DamageLimbs)[i];
					if ((Object)(object)val != (Object)null && (int)val.m_type != 2 && !val.IsDestroyed)
					{
						Vector3 position = ((Component)val).transform.position;
						Vector3 val2 = eyePosition - position;
						float magnitude = ((Vector3)(ref val2)).magnitude;
						AimSpot aimSpot = new AimSpot
						{
							DamLimb = val,
							Prio = (((int)val.m_type == 1) ? AimSpot.WEAK_LIMB_PRIO : AimSpot.DEFAULT_LIMB_PRIO)
						};
						if (bestTargetAimSpot == null || (num > magnitude && aimSpot.Prio > bestTargetAimSpot.Prio))
						{
							num = magnitude;
							bestTargetAimSpot = aimSpot;
						}
					}
				}
			}
			if (includeHeadLimb && (Object)(object)enemy.m_headLimb != (Object)null && !enemy.m_headLimb.IsDestroyed)
			{
				AimSpot aimSpot2 = new AimSpot
				{
					DamLimb = enemy.m_headLimb,
					Prio = AimSpot.HEAD_LIMB_PRIO
				};
				if (bestTargetAimSpot == null || aimSpot2.Prio > bestTargetAimSpot.Prio)
				{
					bestTargetAimSpot = aimSpot2;
				}
			}
			return bestTargetAimSpot != null;
		}

		public static bool TryToHitEnemy(PlayerAgent playerAgent, out Vector3 hitDir, out RaycastHit raycastHit)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00c9: 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)
			hitDir = Vector3.zero;
			raycastHit = default(RaycastHit);
			if (playerAgent.TryGetActionDescriptor<Descriptor>(queued: true, active: true, out Descriptor targetDesc) && (Object)(object)targetDesc.TargetAgent != (Object)null)
			{
				EnemyAgent val = ((Il2CppObjectBase)targetDesc.TargetAgent).TryCast<EnemyAgent>();
				if ((Object)(object)val != (Object)null && TryToGetLimb(val, includeHeadLimb: true, out var bestTargetAimSpot) && (Object)(object)playerAgent.Inventory != (Object)null && (Object)(object)playerAgent.Inventory.WieldedItem != (Object)null)
				{
					Collider component = ((Component)bestTargetAimSpot.DamLimb).GetComponent<Collider>();
					if ((Object)(object)component != (Object)null)
					{
						Transform muzzleAlign = playerAgent.Inventory.WieldedItem.MuzzleAlign;
						Bounds bounds = component.bounds;
						hitDir = ((Bounds)(ref bounds)).center - muzzleAlign.position;
						if (Physics.Raycast(muzzleAlign.position, hitDir, ref raycastHit, 100000f, LayerManager.MASK_BULLETWEAPON_RAY, (QueryTriggerInteraction)1))
						{
							GameObject gameObject = ((Component)((RaycastHit)(ref raycastHit)).collider).gameObject;
							if ((Object)(object)gameObject.GetComponentInParent<EnemyAgent>() != (Object)null)
							{
								return (Object)(object)gameObject.GetComponentInParent<PlayerAgent>() == (Object)null;
							}
						}
					}
				}
			}
			return false;
		}

		public static bool TryGetActionDescriptor<PAD>(this PlayerAgent playerAgent, bool queued, bool active, out PAD targetDesc) where PAD : Descriptor
		{
			targetDesc = default(PAD);
			PlayerAIBot component = ((Component)playerAgent).gameObject.GetComponent<PlayerAIBot>();
			if ((Object)(object)component != (Object)null)
			{
				return component.TryGetActionDescriptor<PAD>(queued, active, out targetDesc);
			}
			return false;
		}

		public static bool TryGetActionDescriptor<PAD>(this PlayerAIBot bot, bool queued, bool active, out PAD targetDesc) where PAD : Descriptor
		{
			targetDesc = default(PAD);
			if ((Object)(object)bot != (Object)null)
			{
				if (queued)
				{
					for (int i = 0; i < bot.m_queuedActions.Count; i++)
					{
						Descriptor val = bot.m_queuedActions[i];
						if (val != null)
						{
							PAD val2 = ((Il2CppObjectBase)val).TryCast<PAD>();
							if (val2 != null)
							{
								targetDesc = val2;
								return true;
							}
						}
					}
				}
				if (active)
				{
					for (int j = 0; j < bot.m_actions.Count; j++)
					{
						PlayerBotActionBase val3 = bot.m_actions[j];
						if (val3 != null && val3.DescBase != null)
						{
							PAD val4 = ((Il2CppObjectBase)val3.DescBase).TryCast<PAD>();
							if (val4 != null)
							{
								targetDesc = val4;
								return true;
							}
						}
					}
				}
			}
			return false;
		}

		public static bool GetItemsFromStorageContainer(LG_ResourceContainer_Storage storage, out List<Item> storageItems)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: 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)
			storageItems = new List<Item>();
			Il2CppArrayBase<BoxCollider> componentsInChildren = ((Component)storage).GetComponentsInChildren<BoxCollider>();
			if (componentsInChildren != null && componentsInChildren.Count > 0)
			{
				Collider[] array = Il2CppArrayBase<Collider>.op_Implicit((Il2CppArrayBase<Collider>)(object)Physics.OverlapSphere(((Component)storage).transform.position, 2f, LayerManager.MASK_APPLY_CARRY_ITEM, (QueryTriggerInteraction)1));
				if (array.Length != 0)
				{
					for (int i = 0; i < array.Length; i++)
					{
						Item componentInParent = ((Component)array[i]).GetComponentInParent<Item>();
						if (!((Object)(object)componentInParent != (Object)null))
						{
							continue;
						}
						for (int j = 0; j < componentsInChildren.Count; j++)
						{
							Bounds bounds = ((Collider)componentsInChildren[j]).bounds;
							if (((Bounds)(ref bounds)).Contains(((Component)componentInParent).transform.position))
							{
								storageItems.Add(componentInParent);
								break;
							}
						}
					}
				}
			}
			return storageItems.Count > 0;
		}

		public static int PriorityBasedOnItem(uint itemID)
		{
			return itemID switch
			{
				101u => 10, 
				127u => 9, 
				102u => 8, 
				132u => 7, 
				_ => 0, 
			};
		}

		public static float GetTotalAmmoRel()
		{
			int num = 0;
			float num2 = 0f;
			BackpackItem val = default(BackpackItem);
			BackpackItem val2 = default(BackpackItem);
			for (int i = 0; i < PlayerManager.PlayerAgentsInLevel.Count; i++)
			{
				PlayerBackpack backpack = PlayerBackpackManager.GetBackpack(PlayerManager.PlayerAgentsInLevel[i].Owner);
				if (backpack.TryGetBackpackItem((InventorySlot)1, ref val))
				{
					num++;
					num2 += backpack.AmmoStorage.StandardAmmo.RelInPack;
				}
				if (backpack.TryGetBackpackItem((InventorySlot)2, ref val2))
				{
					num++;
					num2 += backpack.AmmoStorage.SpecialAmmo.RelInPack;
				}
			}
			return num2 / (float)num;
		}

		public static float GetOverallHealth()
		{
			float num = 0f;
			float num2 = 0f;
			List<PlayerAgent> playerAgentsInLevel = PlayerManager.PlayerAgentsInLevel;
			if (playerAgentsInLevel.Count > 0)
			{
				for (int i = 0; i < playerAgentsInLevel.Count; i++)
				{
					PlayerAgent val = playerAgentsInLevel[i];
					if ((Object)(object)val != (Object)null)
					{
						num2 += ((Dam_SyncedDamageBase)val.Damage).GetHealthRel();
						num += 1f;
					}
				}
			}
			return num2 / num;
		}

		public static bool TryToGetClosestPlayerAgentToPlayer(PlayerAgent sourcePlayer, out PlayerAgent otherPlayer)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			otherPlayer = null;
			List<PlayerAgent> playerAgentsInLevel = PlayerManager.PlayerAgentsInLevel;
			bool flag = false;
			float num = 0f;
			for (int i = 0; i < playerAgentsInLevel.Count; i++)
			{
				PlayerAgent val = playerAgentsInLevel[i];
				if (((Object)val).GetInstanceID() != ((Object)sourcePlayer).GetInstanceID() && !val.Owner.IsBot && ((Agent)val).Alive)
				{
					float num2 = Vector3.Distance(((Agent)val).Position, ((Agent)sourcePlayer).Position);
					if (!flag || num2 < num)
					{
						otherPlayer = val;
						num = num2;
						flag = true;
					}
				}
			}
			return flag;
		}

		public static bool HasEndlessWave()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			if (Mastermind.Current.m_events == null)
			{
				return false;
			}
			Enumerator<MastermindEvent> enumerator = Mastermind.Current.m_events.GetEnumerator();
			while (enumerator.MoveNext())
			{
				MastermindEvent current = enumerator.Current;
				if ((int)current.EventType == 1)
				{
					SurvivalWave val = ((Il2CppObjectBase)current).TryCast<SurvivalWave>();
					if ((Object)(object)val != (Object)null && val.m_settings.m_populationPointsTotal < 0f)
					{
						return true;
					}
				}
			}
			return false;
		}
	}
}
namespace BetterBots.Data
{
	public class PlayerBotForcedUnlockAction
	{
		public PlayerAIBot Bot;

		public PlayerBotForcedUnlockAction(PlayerAIBot bot)
		{
			Bot = bot;
		}

		public void ForceUnlockAction(LG_WeakResourceContainer storage, eWeakLockType lockType, Descriptor descriptor)
		{
			//IL_0018: 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_0037: Invalid comparison between Unknown and I4
			descriptor.TargetGO = ((Component)storage).gameObject;
			descriptor.TargetPosition = ((Component)storage).gameObject.transform.position;
			descriptor.TargetType = (TargetTypeEnum)1;
			((Descriptor)descriptor).Prio = 500f;
			descriptor.Method = (MethodEnum)(((int)lockType != 2) ? 1 : 4);
			descriptor.Lock = storage.m_weakLock;
			Bot.StartAction((Descriptor)(object)descriptor);
		}
	}
	public class ItemPriorityData
	{
		public class ItemGrabStats
		{
			public LG_ResourceContainer_Storage Container;

			public Item Item;

			public Vector3 Position;
		}

		public PlayerAgent Player;

		public static List<uint> BlockedItems = new List<uint> { 114u, 130u, 167u, 174u, 140u, 142u, 30u };

		public ItemGrabStats UpcomingItemGrabStatus;

		public ItemGrabStats CurrentItemGrabStatus;

		public float BestPriority;

		public ItemPriorityData(PlayerAgent player)
		{
			Player = player;
		}

		private bool IsBackPackItemPrefferable()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			return PlayerBackpackManager.GetBackpack(Player.Owner).HasBackpackItem(UpcomingItemGrabStatus.Item.ItemDataBlock.inventorySlot);
		}

		public void DeterminePriority()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			if (UpcomingItemGrabStatus != null && CanGrabItem() && !IsBackPackItemPrefferable())
			{
				float num = Vector3.Distance(((Agent)Player).Position, UpcomingItemGrabStatus.Position);
				switch (((GameDataBlockBase<ItemDataBlock>)(object)UpcomingItemGrabStatus.Item.ItemDataBlock).persistentID)
				{
				case 101u:
					num /= Mathf.Lerp(10f, 4f, PlayerBotManagerExtended.GetTotalAmmoRel());
					break;
				case 102u:
					num /= Mathf.Lerp(5f, 2f, PlayerBotManagerExtended.GetOverallHealth());
					break;
				}
				if (CurrentItemGrabStatus == null || BestPriority > num)
				{
					BestPriority = num;
					CurrentItemGrabStatus = UpcomingItemGrabStatus;
				}
			}
		}

		private bool CanGrabItem()
		{
			//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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Invalid comparison between Unknown and I4
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Invalid comparison between Unknown and I4
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)UpcomingItemGrabStatus.Item.PickupInteraction == (Object)null)
			{
				return false;
			}
			Interact_Base pickupInteraction = UpcomingItemGrabStatus.Item.PickupInteraction;
			if (!pickupInteraction.IsActive || pickupInteraction.ManualTriggeringOnly || !pickupInteraction.PlayerCanInteract(Player))
			{
				return false;
			}
			InventorySlot inventorySlot = UpcomingItemGrabStatus.Item.ItemDataBlock.inventorySlot;
			if ((int)inventorySlot != 5 && (int)inventorySlot != 4)
			{
				return false;
			}
			float num = RootPlayerBotAction.s_collectItemSearchDistance;
			if (PlayerBotManagerExtended.HasEndlessWave() || ((GameDataBlockBase<ItemDataBlock>)(object)UpcomingItemGrabStatus.Item.ItemDataBlock).persistentID == 101)
			{
				num *= 10f;
			}
			Vector3 val = ((Component)UpcomingItemGrabStatus.Item).transform.position - ((Agent)Player).Position;
			return ((Vector3)(ref val)).magnitude < num;
		}
	}
	public class PB_Base
	{
		protected PlayerBotBrain m_brain;

		public PB_Base(PlayerBotBrain brain)
		{
			m_brain = brain;
		}

		public virtual void UpdateBrain()
		{
		}
	}
	public class PB_Damage : PB_Base
	{
		private bool m_firstCheck;

		private float m_lastHealthRatio;

		private float m_damageTakenTime;

		private bool m_firstDamageTaken;

		public bool IsTakingDamage => HasTakenDamageFromTimePassed(3f);

		public PB_Damage(PlayerBotBrain brain)
			: base(brain)
		{
		}

		public override void UpdateBrain()
		{
			float healthRel = ((Dam_SyncedDamageBase)m_brain.Agent.Damage).GetHealthRel();
			if (!m_firstCheck)
			{
				m_firstCheck = true;
				m_lastHealthRatio = healthRel;
			}
			else if (healthRel != m_lastHealthRatio)
			{
				if (healthRel < m_lastHealthRatio)
				{
					m_damageTakenTime = Time.time;
					m_firstDamageTaken = true;
				}
				m_lastHealthRatio = healthRel;
			}
		}

		public bool HasTakenDamageFromTimePassed(float timePassed)
		{
			if (m_firstDamageTaken)
			{
				return m_damageTakenTime + timePassed > Time.time;
			}
			return false;
		}
	}
	public class PB_Friendlies : PB_Base
	{
		public struct FriendlyStatus
		{
			public int m_tm_CanSee;

			public int m_tm_CanSee_Close;

			public float m_rev_confidence;
		}

		private static class Settings
		{
			public static readonly float Rev_Con_MaxDistance = 15f;

			public static readonly float Rev_Con_MixDistance = 5f;

			public static readonly float Rev_Close_Distance_Friendly = 5f;
		}

		private FriendlyStatus m_friendlyStatus;

		public FriendlyStatus CurrentFriendlyStatus => m_friendlyStatus;

		public PB_Friendlies(PlayerBotBrain brain)
			: base(brain)
		{
		}

		public override void UpdateBrain()
		{
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			if (((Agent)m_brain.Agent).CourseNode == null)
			{
				m_friendlyStatus = default(FriendlyStatus);
				return;
			}
			FriendlyStatus friendlyStatus = default(FriendlyStatus);
			List<PlayerAgent> playerAgentsInLevel = PlayerManager.PlayerAgentsInLevel;
			for (int i = 0; i < playerAgentsInLevel.Count; i++)
			{
				PlayerAgent val = playerAgentsInLevel[i];
				if (val.CharacterID == m_brain.Agent.CharacterID || !((Agent)val).Alive)
				{
					continue;
				}
				bool num = m_brain.Agent.CanSeeObject(m_brain.EyePosition, ((Component)val).gameObject);
				float num2 = Vector3.Distance(((Agent)m_brain.Agent).Position, ((Agent)val).Position);
				if (num)
				{
					friendlyStatus.m_tm_CanSee++;
					if (num2 < Settings.Rev_Close_Distance_Friendly)
					{
						friendlyStatus.m_tm_CanSee_Close++;
					}
				}
			}
			m_friendlyStatus = friendlyStatus;
		}
	}
	public class PB_Revive : PB_Base
	{
		public static class Settings
		{
			public static int s_attackers_Visible_Restrict_Revive = 5;

			public static int s_attackers_Close_And_Visible_Restrict_Revive = 2;

			public static int s_attackers_OneShot_Close_And_Visible_Restrict_Revive = 1;

			public static float s_reviveConfidenceProgressUninterrupted = 0.7f;

			public static float s_takingDamageDecay = 3f;
		}

		public bool ReviveIsDangerous
		{
			get
			{
				if (m_brain.m_friendliesBrain.CurrentFriendlyStatus.m_tm_CanSee_Close > 2)
				{
					return false;
				}
				if (m_brain.m_enemyBrain.EnemyDetection.m_amountOfSeenEnemiesClose >= Settings.s_attackers_Close_And_Visible_Restrict_Revive)
				{
					return true;
				}
				if (m_brain.m_enemyBrain.EnemyDetection.m_amountOfSeenOneShotEnemiesClose >= Settings.s_attackers_OneShot_Close_And_Visible_Restrict_Revive)
				{
					return true;
				}
				return false;
			}
		}

		public PB_Revive(PlayerBotBrain brain)
			: base(brain)
		{
		}
	}
	public class PB_Enemy : PB_Base
	{
		public struct EnemyDetectionData
		{
			public int m_amountOfSeenEnemies;

			public int m_amountOfSeenEnemiesClose;

			public int m_amountOfSeenOneShotEnemiesClose;

			public int m_amountOfSeenOneShotEnemies;

			public float m_closestEnemyInBounds;

			public EnemyAgent m_closestEnemy;

			public bool m_AggressiveEnemyFound;
		}

		private EnemyDetectionData m_detectData;

		public EnemyDetectionData EnemyDetection => m_detectData;

		public PB_Enemy(PlayerBotBrain brain)
			: base(brain)
		{
		}

		public override void UpdateBrain()
		{
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Invalid comparison between Unknown and I4
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			if (((Agent)m_brain.Agent).CourseNode == null)
			{
				m_detectData = default(EnemyDetectionData);
				return;
			}
			List<EnemyAgent> reachableEnemiesInNodes = AIG_CourseGraph.GetReachableEnemiesInNodes(((Agent)m_brain.Agent).CourseNode, 3);
			EnemyDetectionData detectData = default(EnemyDetectionData);
			detectData.m_AggressiveEnemyFound = false;
			for (int i = 0; i < reachableEnemiesInNodes.Count; i++)
			{
				EnemyAgent val = reachableEnemiesInNodes[i];
				if (!((Agent)val).Alive || (int)((AgentAI)val.AI).Mode != 1)
				{
					continue;
				}
				bool num = m_brain.Agent.CanSeeObject(((Agent)m_brain.Agent).EyePosition, ((Component)val).gameObject);
				float num2 = Vector3.Distance(((Agent)m_brain.Agent).Position, val.Position);
				bool flag = (double)m_brain.Agent.PlayerData.health * 0.15 < (double)val.EnemyBalancingData.MeleeAttackDamage;
				if (!detectData.m_AggressiveEnemyFound || detectData.m_closestEnemyInBounds > num2)
				{
					detectData.m_closestEnemyInBounds = num2;
					detectData.m_AggressiveEnemyFound = true;
					detectData.m_closestEnemy = val;
				}
				if (!num)
				{
					continue;
				}
				detectData.m_amountOfSeenEnemies++;
				if (flag)
				{
					detectData.m_amountOfSeenOneShotEnemies++;
				}
				if (num2 < 8f)
				{
					detectData.m_amountOfSeenEnemiesClose++;
					if (flag)
					{
						detectData.m_amountOfSeenOneShotEnemiesClose++;
					}
				}
			}
			m_detectData = detectData;
		}
	}
	public class PlayerBotActionCollection
	{
		public PlayerBotActionHighlight HighLight;

		public PlayerBotActionIdle Idle;

		public PlayerBotActionFollow Follow;

		public PlayerBotActionUseBioscan UseBioScan;

		public PlayerBotActionAttack Attack;

		public PlayerBotActionRevive Revive;

		public PlayerBotActionUseEnemyScanner UseEnemyScanner;

		public PlayerBotActionUseEnemyScanner TagEnemies;

		public PlayerBotActionCollectItem CollectItem;

		public PlayerBotActionShareResourcePack ShareResourcePack;

		public void OnSetupRootAction(RootPlayerBotAction rootAction)
		{
			HighLight = ((Il2CppObjectBase)((Descriptor)rootAction.m_highlightAction).ActionBase).TryCast<PlayerBotActionHighlight>();
			Idle = ((Il2CppObjectBase)((Descriptor)rootAction.m_highlightAction).ActionBase).TryCast<PlayerBotActionIdle>();
			Follow = ((Il2CppObjectBase)((Descriptor)rootAction.m_highlightAction).ActionBase).TryCast<PlayerBotActionFollow>();
			UseBioScan = ((Il2CppObjectBase)((Descriptor)rootAction.m_highlightAction).ActionBase).TryCast<PlayerBotActionUseBioscan>();
			Attack = ((Il2CppObjectBase)((Descriptor)rootAction.m_highlightAction).ActionBase).TryCast<PlayerBotActionAttack>();
			Revive = ((Il2CppObjectBase)((Descriptor)rootAction.m_highlightAction).ActionBase).TryCast<PlayerBotActionRevive>();
			UseEnemyScanner = ((Il2CppObjectBase)((Descriptor)rootAction.m_highlightAction).ActionBase).TryCast<PlayerBotActionUseEnemyScanner>();
			TagEnemies = ((Il2CppObjectBase)((Descriptor)rootAction.m_highlightAction).ActionBase).TryCast<PlayerBotActionUseEnemyScanner>();
			CollectItem = ((Il2CppObjectBase)((Descriptor)rootAction.m_highlightAction).ActionBase).TryCast<PlayerBotActionCollectItem>();
			ShareResourcePack = ((Il2CppObjectBase)((Descriptor)rootAction.m_highlightAction).ActionBase).TryCast<PlayerBotActionShareResourcePack>();
		}
	}
	public class PlayerBotBrain
	{
		public PB_Revive m_reviveBrain;

		public PB_Damage m_damageBrain;

		public PB_Enemy m_enemyBrain;

		public PB_Friendlies m_friendliesBrain;

		public PB_UnlockResourceContainer m_unlockResourceContainerBrain;

		private PlayerAgent m_agent;

		public PlayerAgent Agent => m_agent;

		public Vector3 EyePosition => ((Agent)m_agent).EyePosition;

		public bool IsTakingDamage => m_damageBrain.IsTakingDamage;

		public bool ForceBulletsOnly
		{
			get
			{
				if (HasAmmo())
				{
					if (IsTakingDamage)
					{
						return true;
					}
					if (m_enemyBrain.EnemyDetection.m_amountOfSeenOneShotEnemies > 0)
					{
						return true;
					}
					if (m_enemyBrain.EnemyDetection.m_amountOfSeenEnemies > 2)
					{
						return true;
					}
				}
				return false;
			}
		}

		public bool ForceAvoidStance
		{
			get
			{
				if (IsTakingDamage)
				{
					return true;
				}
				if (m_enemyBrain.EnemyDetection.m_amountOfSeenOneShotEnemies > 0)
				{
					return true;
				}
				if (m_enemyBrain.EnemyDetection.m_amountOfSeenEnemies > 3)
				{
					return true;
				}
				return false;
			}
		}

		public bool RestrictHighlightingItems => m_enemyBrain.EnemyDetection.m_amountOfSeenEnemiesClose > 0;

		public bool ReviveRestricted => m_reviveBrain.ReviveIsDangerous;

		public void Setup(PlayerAgent agent)
		{
			m_agent = agent;
			m_reviveBrain = new PB_Revive(this);
			m_damageBrain = new PB_Damage(this);
			m_enemyBrain = new PB_Enemy(this);
			m_friendliesBrain = new PB_Friendlies(this);
			m_unlockResourceContainerBrain = new PB_UnlockResourceContainer(this);
		}

		public void Update()
		{
			m_enemyBrain.UpdateBrain();
			m_reviveBrain.UpdateBrain();
			m_damageBrain.UpdateBrain();
			m_friendliesBrain.UpdateBrain();
			m_unlockResourceContainerBrain.UpdateBrain();
		}

		public bool TryToGetBioScanOnPlayerAgent(PlayerAgent playerAgent, out CP_Bioscan_Core selectedCore)
		{
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Invalid comparison between Unknown and I4
			selectedCore = null;
			List<ChainedPuzzleInstance> instances = ChainedPuzzleManager.Current.m_instances;
			if (instances == null)
			{
				return false;
			}
			for (int i = 0; i < instances.Count; i++)
			{
				ChainedPuzzleInstance val = instances[i];
				if (!((Object)(object)val != (Object)null))
				{
					continue;
				}
				Il2CppReferenceArray<iChainedPuzzleCore> chainedPuzzleCores = val.m_chainedPuzzleCores;
				if (chainedPuzzleCores == null || ((Il2CppArrayBase<iChainedPuzzleCore>)(object)chainedPuzzleCores).Count <= 0)
				{
					continue;
				}
				for (int j = 0; j < ((Il2CppArrayBase<iChainedPuzzleCore>)(object)chainedPuzzleCores).Count; j++)
				{
					if (((Il2CppArrayBase<iChainedPuzzleCore>)(object)chainedPuzzleCores)[j] == null)
					{
						continue;
					}
					CP_Bioscan_Core val2 = ((Il2CppObjectBase)((Il2CppArrayBase<iChainedPuzzleCore>)(object)chainedPuzzleCores)[j]).TryCast<CP_Bioscan_Core>();
					if ((Object)(object)val2 != (Object)null)
					{
						CP_PlayerScanner val3 = ((Il2CppObjectBase)val2.PlayerScanner).TryCast<CP_PlayerScanner>();
						if ((Object)(object)val3 != (Object)null && (int)val3.ScanPlayersRequired == 1 && val2.PlayersOnScan.ToList<PlayerAgent>().Contains(playerAgent))
						{
							selectedCore = val2;
						}
					}
				}
			}
			return (Object)(object)selectedCore != (Object)null;
		}

		public float GetAmmoRel(PlayerBackpack backPack, AmmoType ammoType)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Invalid comparison between Unknown and I4
			float ammoInPack = backPack.AmmoStorage.GetAmmoInPack(ammoType);
			if ((int)ammoType != 0)
			{
				if ((int)ammoType == 1)
				{
					return backPack.AmmoStorage.GetClipAmmoFromSlot((InventorySlot)2) + ammoInPack;
				}
				return 0f;
			}
			return backPack.AmmoStorage.GetClipAmmoFromSlot((InventorySlot)1) + ammoInPack;
		}

		public bool HasAmmo()
		{
			PlayerBackpack backpack = PlayerBackpackManager.GetBackpack(m_agent.Owner);
			BackpackItem val = default(BackpackItem);
			if (backpack.TryGetBackpackItem((InventorySlot)1, ref val) && GetAmmoRel(backpack, (AmmoType)0) > 0f)
			{
				return true;
			}
			if (backpack.TryGetBackpackItem((InventorySlot)2, ref val) && GetAmmoRel(backpack, (AmmoType)1) > 0f)
			{
				return true;
			}
			return false;
		}
	}
	public class PB_UnlockResourceContainer : PB_Base
	{
		private LG_ResourceContainer_Storage m_targetContainer;

		public bool HasTargetContainer => (Object)(object)m_targetContainer != (Object)null;

		public PB_UnlockResourceContainer(PlayerBotBrain brain)
			: base(brain)
		{
		}

		public void SetTargetResourceContainer(LG_ResourceContainer_Storage targetContainer)
		{
			m_targetContainer = targetContainer;
		}

		public void OpenTargetContainer()
		{
			if (!((Object)(object)m_targetContainer == (Object)null))
			{
				LG_WeakResourceContainer component = ((Component)m_targetContainer).gameObject.GetComponent<LG_WeakResourceContainer>();
				if (!component.ISOpen && !component.IsLocked())
				{
					component.OnWeakLockUnlocked(true);
				}
				m_targetContainer = null;
			}
		}
	}
}
namespace BetterBots.Components
{
	[IL2CPP_ComponentDescriptor(m_dontDestroyOnLoad = true, m_launchOnStartLoad = false)]
	public class BotRecorder : MonoBehaviorFixed
	{
		public Rect m_guiSlot;

		public int m_guiSlotIndex;

		private PlayerAIBot m_bot;

		private RootPlayerBotAction m_rootAction;

		private PlayerBotBrain m_brain;

		private bool m_hasRootAction;

		private string m_botName;

		private PlayerBotActionCollection m_actionCollection;

		private PlayerBotForcedUnlockAction m_forcedUnlockAction;

		public float m_abortExpeditionItemTimer;

		public bool m_firstExpeditionItemTimer;

		private PlayerBotActionDebugBase[] m_actiondebugs;

		private GUIStyle m_recorderStyle;

		public bool m_hasGuiSlot;

		[HideFromIl2Cpp]
		public PlayerBotBrain Brain => m_brain;

		[HideFromIl2Cpp]
		public PlayerAgent Agent => m_agent;

		[HideFromIl2Cpp]
		public RootPlayerBotAction RootAction => m_rootAction;

		[HideFromIl2Cpp]
		public bool HasRootAction => m_hasRootAction;

		[HideFromIl2Cpp]
		public PlayerBotForcedUnlockAction ForcedUnlockAction => m_forcedUnlockAction;

		[HideFromIl2Cpp]
		public bool SneakingRestricted
		{
			get
			{
				if (!Brain.m_enemyBrain.EnemyDetection.m_AggressiveEnemyFound)
				{
					return false;
				}
				if (Brain.m_enemyBrain.EnemyDetection.m_amountOfSeenEnemiesClose > 0)
				{
					return true;
				}
				if (Brain.m_enemyBrain.EnemyDetection.m_closestEnemyInBounds < 10f)
				{
					return true;
				}
				return false;
			}
		}

		[HideFromIl2Cpp]
		private PlayerAgent m_agent => m_bot.Agent;

		[HideFromIl2Cpp]
		private string Preffix => "Bot: <color=#" + ColorUtility.ToHtmlStringRGB(m_agent.Owner.PlayerColor) + ">" + m_botName + "</color> ";

		[HideFromIl2Cpp]
		private string GetLogInfo
		{
			get
			{
				List<string> val = new List<string>();
				GetActionDebug(PlayerBotActionType.Idle, val);
				GetActionDebug(PlayerBotActionType.Follow, val);
				GetActionDebug(PlayerBotActionType.UseBioScan, val);
				GetActionDebug(PlayerBotActionType.Attack, val);
				GetActionDebug(PlayerBotActionType.UseFireArm, val);
				GetActionDebug(PlayerBotActionType.Revive, val);
				GetActionDebug(PlayerBotActionType.ShareResource, val);
				GetActionDebug(PlayerBotActionType.CollectItem, val);
				GetActionDebug(PlayerBotActionType.CarryExpedtionItem, val);
				string text = "<b><color=yellow>Active Actions</color></b>\n";
				Enumerator<string> enumerator = val.GetEnumerator();
				while (enumerator.MoveNext())
				{
					string current = enumerator.Current;
					text += current;
				}
				return text;
			}
		}

		private void Awake()
		{
			Setup();
		}

		[HideFromIl2Cpp]
		public bool HasLockMelters()
		{
			BackpackItem val = default(BackpackItem);
			if (!PlayerBackpackManager.GetBackpack(m_bot.Agent.Owner).TryGetBackpackItem((InventorySlot)5, ref val))
			{
				return false;
			}
			if (val.ItemID != 116)
			{
				return false;
			}
			return true;
		}

		[HideFromIl2Cpp]
		public void ForceUnlockAction(LG_WeakResourceContainer storage, eWeakLockType lockType)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			m_forcedUnlockAction.ForceUnlockAction(storage, lockType, m_rootAction.m_unlockAction);
		}

		private void Setup()
		{
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Expected O, but got Unknown
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			m_firstExpeditionItemTimer = false;
			m_actionCollection = new PlayerBotActionCollection();
			m_rootAction = null;
			m_hasRootAction = false;
			m_bot = ((Component)this).GetComponent<PlayerAIBot>();
			m_botName = m_bot.Agent.Owner.NickName;
			m_forcedUnlockAction = new PlayerBotForcedUnlockAction(m_bot);
			SetupActionDebugs();
			m_recorderStyle = new GUIStyle();
			m_recorderStyle.fontSize = 20;
			m_recorderStyle.normal.textColor = Color.white;
			m_brain = new PlayerBotBrain();
			m_brain.Setup(m_bot.Agent);
			BotRecorderManager.RegisterBotRecorder(this);
			PlayerBotManagerExtended.RegisterBotRecoder(this);
			if ((Object)(object)m_bot == (Object)null)
			{
				BBLog.Error("Could not get PlayerAIBot component!!");
			}
		}

		private void SetupActionDebugs()
		{
			m_actiondebugs = new PlayerBotActionDebugBase[typeof(PlayerBotActionType).GetEnumValues().Length];
			m_actiondebugs[1] = new PBAD_Follow();
			m_actiondebugs[9] = new PBAD_UseFireArm();
			m_actiondebugs[5] = new PBAD_UseBioScan();
			m_actiondebugs[2] = new PBAD_Attack();
			m_actiondebugs[6] = new PBAD_CollectItem();
			m_actiondebugs[7] = new PBAD_CarryExpeditionItem();
			m_actiondebugs[8] = new PBAD_Melee();
		}

		private void Update()
		{
			if (SNet.IsMaster)
			{
				CheckRootAction();
				if (m_hasRootAction)
				{
					m_brain.Update();
					UpdateCarryExpeditionItem();
					UpdateReviveAction();
					UpdateShareResourceAction();
					UpdateCollectItemAction();
					UpdateUseBioScanAction();
					UpdateHighlightAction();
					UpdateDeployTripMineAction();
					CheckFollowAction();
				}
			}
		}

		private bool TryToGetBackPackItem(InventorySlot slot, out BackpackItem item)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			return PlayerBackpackManager.GetBackpack(m_agent.Owner).TryGetBackpackItem(slot, ref item);
		}

		private void UpdateCarryExpeditionItem()
		{
			//IL_007f: 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_0095: Unknown result type (might be due to invalid IL or missing references)
			if (!IsDangerousToContinueHoldingExpeditionItem() || !m_bot.TryGetActionDescriptor<Descriptor>(queued: true, active: true, out Descriptor targetDesc))
			{
				return;
			}
			PlayerBotActionCarryExpeditionItem val = ((Il2CppObjectBase)((Descriptor)targetDesc).ActionBase).TryCast<PlayerBotActionCarryExpeditionItem>();
			if (val != null)
			{
				val.SetState((State)0);
				m_bot.StopAction((Descriptor)(object)val.m_collectAction);
				BackpackItem val2 = default(BackpackItem);
				if (val.m_isCarrying && ((PlayerBotActionBase)val).m_backpack.TryGetBackpackItem((InventorySlot)8, ref val2) && Object.op_Implicit((Object)(object)val2.Instance))
				{
					PlayerBackpackManager.WantToDropItem(m_agent.Owner, val2.Instance.Get_pItemData(), ((Agent)m_agent).Position, ((Agent)m_agent).Rotation, true);
					val.m_isCarrying = false;
				}
				m_abortExpeditionItemTimer = Time.time;
				m_firstExpeditionItemTimer = true;
			}
		}

		private void UpdateDeployTripMineAction()
		{
		}

		[HideFromIl2Cpp]
		public bool IsInDangerousSituation()
		{
			if (!Brain.m_damageBrain.IsTakingDamage)
			{
				return Brain.m_enemyBrain.EnemyDetection.m_amountOfSeenEnemies > 3;
			}
			return true;
		}

		[HideFromIl2Cpp]
		public bool IsDangerousToContinueHoldingExpeditionItem()
		{
			if (!Brain.m_damageBrain.IsTakingDamage && Brain.m_enemyBrain.EnemyDetection.m_amountOfSeenEnemiesClose <= 0)
			{
				return Brain.m_enemyBrain.EnemyDetection.m_amountOfSeenOneShotEnemiesClose > 0;
			}
			return true;
		}

		[HideFromIl2Cpp]
		public bool IsDangerousToCollectExpeditionItem()
		{
			if (!Brain.m_damageBrain.IsTakingDamage && Brain.m_enemyBrain.EnemyDetection.m_amountOfSeenEnemiesClose <= 0)
			{
				return Brain.m_enemyBrain.EnemyDetection.m_amountOfSeenOneShotEnemiesClose > 0;
			}
			return true;
		}

		private void UpdateShareResourceAction()
		{
			if (m_rootAction.m_shareResourceAction != null && !((Descriptor)m_rootAction.m_shareResourceAction).IsTerminated() && IsInDangerousSituation())
			{
				((PlayerBotActionBase)m_rootAction).SafeStopAction((Descriptor)(object)m_rootAction.m_shareResourceAction);
			}
		}

		private void CheckFollowAction()
		{
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Invalid comparison between Unknown and I4
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: 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_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Expected I4, but got Unknown
			//IL_0169: 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_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			if (m_rootAction.m_followLeaderAction == null || (Object)(object)m_rootAction.m_followLeaderAction.Client == (Object)null || !((Agent)m_agent).Alive || ((Agent)m_agent).CourseNode == null)
			{
				return;
			}
			PlayerAgent client = m_rootAction.m_followLeaderAction.Client;
			if (((Agent)client).CourseNode != null && ((Agent)client).Alive && !TryToGetBackPackItem((InventorySlot)8, out var _) && !PlayerBotManagerExtended.IsBotCurrentlyBusyWithAction(m_bot) && (int)GameStateManager.CurrentStateName == 10)
			{
				float num = 20f;
				if ((Object)(object)((Agent)m_agent).CourseNode.m_area != (Object)(object)((Agent)client).CourseNode.m_area)
				{
					num = 10f;
				}
				if (Vector3.Distance(((Agent)client).Position, ((Agent)m_agent).Position) > num && ((Descriptor)m_rootAction.m_followLeaderAction).ActionBase != null && TryToGetRandomNavmeshLocation(((Agent)client).Position, 5f, out var finalPosition))
				{
					m_agent.WarpTo(finalPosition, ((Agent)client).Rotation, new pPlayerLocationData
					{
						lookDir = ((Agent)m_agent).TargetLookDir,
						courseNode = new pCourseNode
						{
							courseNodeIDPlusOne = (byte)((Agent)m_agent).CourseNode.NodeID
						},
						plocStateReferenceID = (int)m_agent.Locomotion.m_currentStateEnum,
						goodPosition = finalPosition,
						plocState = m_agent.Locomotion.m_currentStateEnum
					});
				}
			}
		}

		public bool TryToGetRandomNavmeshLocation(Vector3 fromPos, float radius, out Vector3 finalPosition)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			finalPosition = Vector3.zero;
			NavMeshHit val = default(NavMeshHit);
			if (NavMesh.SamplePosition(Random.insideUnitSphere * radius + fromPos, ref val, radius, -1))
			{
				finalPosition = ((NavMeshHit)(ref val)).position;
				return true;
			}
			return false;
		}

		[HideFromIl2Cpp]
		private void UpdateUseBioScanAction()
		{
			if (m_rootAction.m_useBioscanAction != null && ((Descriptor)m_rootAction.m_useBioscanAction).IsTerminated() && m_rootAction.m_followLeaderAction != null && (Object)(object)m_rootAction.m_followLeaderAction.Client != (Object)null && m_rootAction.m_followLeaderAction.Client.IsInBioscan && m_brain.TryToGetBioScanOnPlayerAgent(m_rootAction.m_followLeaderAction.Client, out var selectedCore))
			{
				((Descriptor)m_rootAction.m_useBioscanAction).Prio = RootPlayerBotAction.m_prioSettings.UseBioscan;
				m_rootAction.m_useBioscanAction.Bioscan = selectedCore;
				if (m_bot.RequestAction((Descriptor)(object)m_rootAction.m_useBioscanAction))
				{
					BBLog.Warn(m_botName + " forcing to go to following agent since they are going rogue...");
				}
				else
				{
					BBLog.Error(m_botName + " tried to be forced to go to following agent since they are going rogue...");
				}
			}
		}

		[HideFromIl2Cpp]
		private void ForceBulletAttack()
		{
			PlayerBotActionAttack val = ((Il2CppObjectBase)((Descriptor)m_rootAction.m_attackAction).ActionBase).TryCast<PlayerBotActionAttack>();
			if (val != null)
			{
				val.m_desc.Means = (AttackMeansEnum)4;
				val.m_desc.Stance = (StanceEnum)1;
			}
		}

		[HideFromIl2Cpp]
		private void ForceMeleeAttack()
		{
			PlayerBotActionAttack val = ((Il2CppObjectBase)((Descriptor)m_rootAction.m_attackAction).ActionBase).TryCast<PlayerBotActionAttack>();
			if (val != null)
			{
				val.m_desc.Means = (AttackMeansEnum)1;
			}
		}

		[HideFromIl2Cpp]
		private void UpdateCollectItemAction()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			if (m_rootAction.m_collectItemAction == null || ((Descriptor)m_rootAction.m_collectItemAction).IsTerminated())
			{
				return;
			}
			if ((Object)(object)m_rootAction.m_collectItemAction.TargetContainer != (Object)null)
			{
				LG_ResourceContainer_Storage targetContainer = m_rootAction.m_collectItemAction.TargetContainer;
				if (((PlayerBotActionBase)m_rootAction).IsAnyHumanPlayerNear(((Component)targetContainer).transform.position, 5f))
				{
					((PlayerBotActionBase)m_rootAction).SafeStopAction((Descriptor)(object)m_rootAction.m_collectItemAction);
					return;
				}
			}
			m_rootAction.m_collectItemAction.Haste = ((DramaManager.GoToCombat || DramaManager.GoToEncounter) ? 2f : 0.5f);
		}

		[HideFromIl2Cpp]
		private void UpdateHighlightAction()
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Invalid comparison between Unknown and I4
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Invalid comparison between Unknown and I4
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			if (m_rootAction.m_highlightAction == null || ((Descriptor)m_rootAction.m_highlightAction).IsTerminated())
			{
				return;
			}
			Descriptor highlightAction = m_rootAction.m_highlightAction;
			if ((int)((Descriptor)highlightAction).Status == 2)
			{
				if (!Brain.m_unlockResourceContainerBrain.HasTargetContainer)
				{
					LG_ResourceContainer_Storage componentInParent = highlightAction.TargetGO.GetComponentInParent<LG_ResourceContainer_Storage>();
					if ((Object)(object)componentInParent != (Object)null)
					{
						Brain.m_unlockResourceContainerBrain.SetTargetResourceContainer(componentInParent);
					}
				}
				else
				{
					PlayerBotActionHighlight val = ((Il2CppObjectBase)((Descriptor)highlightAction).ActionBase).TryCast<PlayerBotActionHighlight>();
					if (val != null && (int)val.m_state == 2)
					{
						Brain.m_unlockResourceContainerBrain.OpenTargetContainer();
					}
				}
			}
			bool flag = false;
			if (m_brain.RestrictHighlightingItems)
			{
				flag = true;
			}
			else if ((DramaManager.GoToCombat || DramaManager.GoToEncounter) && m_rootAction.m_followLeaderAction != null && (Object)(object)m_rootAction.m_followLeaderAction.Client != (Object)null && Vector3.Distance(((Agent)m_agent).Position, ((Agent)m_rootAction.m_followLeaderAction.Client).Position) > 20f)
			{
				flag = true;
			}
			if (flag)
			{
				m_bot.StopAction((Descriptor)(object)m_rootAction.m_highlightAction);
			}
		}

		[HideFromIl2Cpp]
		private void StopReviveActions(PlayerBotActionRevive action)
		{
			m_bot.StopAction((Descriptor)(object)action.m_desc);
			if (action.m_lookAction != null && !((Descriptor)action.m_lookAction).IsTerminated())
			{
				m_bot.StopAction((Descriptor)(object)action.m_lookAction);
			}
			if (action.m_travelAction != null && !((Descriptor)action.m_travelAction).IsTerminated())
			{
				m_bot.StopAction((Descriptor)(object)action.m_travelAction);
			}
		}

		[HideFromIl2Cpp]
		private void UpdateReviveAction()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Invalid comparison between Unknown and I4
			if (m_rootAction.m_reviveAction == null || ((Descriptor)m_rootAction.m_reviveAction).IsTerminated())
			{
				return;
			}
			Descriptor reviveAction = m_rootAction.m_reviveAction;
			PlayerBotActionBase actionBase = ((Descriptor)reviveAction).ActionBase;
			PlayerBotActionRevive val = ((actionBase != null) ? ((Il2CppObjectBase)actionBase).TryCast<PlayerBotActionRevive>() : null);
			if (!m_brain.ReviveRestricted || val == null)
			{
				return;
			}
			bool flag = false;
			if ((int)val.m_state == 2)
			{
				if ((Object)(object)reviveAction.Client == (Object)null || (Object)(object)reviveAction.Client.ReviveInteraction == (Object)null || ((Interact_Timed)reviveAction.Client.ReviveInteraction).InteractionTimerRel < 0.5f)
				{
					flag = true;
				}
			}
			else
			{
				flag = true;
			}
			if (flag)
			{
				StopReviveActions(val);
				ForceFollowBestPlayerAgent();
			}
		}

		[HideFromIl2Cpp]
		private void ForceFollowBestPlayerAgent()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Invalid comparison between Unknown and I4
			if (m_rootAction.m_followLeaderAction == null || (int)((Descriptor)m_rootAction.m_followLeaderAction).Status == 2)
			{
				return;
			}
			bool flag = false;
			PlayerAgent otherPlayer;
			if ((Object)(object)((PlayerBotActionBase)m_rootAction).m_bot.SyncValues.Leader != (Object)null)
			{
				flag = true;
				m_rootAction.m_followLeaderAction.Client = ((PlayerBotActionBase)m_rootAction).m_bot.SyncValues.Leader;
			}
			else if (PlayerBotManagerExtended.TryToGetClosestPlayerAgentToPlayer(m_agent, out otherPlayer))
			{
				flag = true;
				m_rootAction.m_followLeaderAction.Client = otherPlayer;
				m_bot.SyncValues.Leader = otherPlayer;
			}
			if (flag)
			{
				if (m_bot.RequestAction((Descriptor)(object)m_rootAction.m_followLeaderAction))
				{
					BBLog.Message(m_botName + " is now force following " + m_bot.SyncValues.Leader.Owner.NickName);
				}
				else
				{
					BBLog.Error(m_botName + " tried to force follow " + m_bot.SyncValues.Leader.Owner.NickName + " but is busy with other actions!");
				}
			}
		}

		[HideFromIl2Cpp]
		private void CheckRootAction()
		{
			if (m_bot.m_rootAction == null)
			{
				m_hasRootAction = false;
				return;
			}
			if (m_bot.m_rootAction.ActionBase == null)
			{
				m_hasRootAction = false;
				return;
			}
			RootPlayerBotAction val = ((Il2CppObjectBase)m_bot.m_rootAction.ActionBase).TryCast<RootPlayerBotAction>();
			if (val == null)
			{
				m_hasRootAction = false;
				return;
			}
			m_rootAction = val;
			m_hasRootAction = true;
		}

		[HideFromIl2Cpp]
		private void GetActionDebug(PlayerBotActionType type, List<string> actionsList)
		{
			if ((Object)(object)m_bot == (Object)null && m_bot.m_actions == null && m_bot.m_actions.Count == 0)
			{
				return;
			}
			PlayerBotActionDebugBase playerBotActionDebugBase = m_actiondebugs[(int)type];
			if (playerBotActionDebugBase == null)
			{
				return;
			}
			Enumerator<PlayerBotActionBase> enumerator = m_bot.m_actions.GetEnumerator();
			while (enumerator.MoveNext())
			{
				PlayerBotActionBase current = enumerator.Current;
				if (current != null && playerBotActionDebugBase.ActionType != (Type)null && playerBotActionDebugBase.ActionType == ((Object)current).GetIl2CppType())
				{
					playerBotActionDebugBase.PrintFields(current);
					actionsList.Add(playerBotActionDebugBase.Message);
				}
			}
		}

		private void OnGUI()
		{
		}

		[HideFromIl2Cpp]
		private void OnDestroy()
		{
			BotRecorderManager.DeRegisterRecorder(this);
			PlayerBotManagerExtended.DeRegisterBotRecorder(this);
			BBLog.Warn("BotRecorder Destroyed!! - " + m_botName);
		}

		public BotRecorder(IntPtr pointer)
			: base(pointer)
		{
		}
	}
	public class MonoBehaviorFixed : MonoBehaviour
	{
		public MonoBehaviorFixed()
		{
		}

		public MonoBehaviorFixed(IntPtr pointer)
			: base(pointer)
		{
		}
	}
	public class PlayerBotDevWheel : MonoBehaviorFixed
	{
		private void Update()
		{
			if (Input.GetKeyDown((KeyCode)286))
			{
				PlayerBotManagerExtended.TryToGetClosestPlayerAgentToPlayer(PlayerManager.GetLocalPlayerAgent(), out var otherPlayer);
				PlayerAIBot component = ((Component)otherPlayer).GetComponent<PlayerAIBot>();
				if ((Object)(object)component != (Object)null)
				{
					((Il2CppObjectBase)component.m_rootAction.ActionBase).TryCast<RootPlayerBotAction>();
				}
			}
		}
	}
	[IL2CPP_ComponentDescriptor(m_dontDestroyOnLoad = true, m_launchOnStartLoad = true)]
	public class PlayerBotManagerUpdater : MonoBehaviorFixed
	{
		public PlayerBotManagerUpdater()
		{
		}

		public PlayerBotManagerUpdater(IntPtr pointer)
			: base(pointer)
		{
		}

		private void Update()
		{
			PlayerBotManagerExtended.Update();
		}

		private void FixedUpdate()
		{
			PlayerBotManagerExtended.FixedUpdate();
		}

		private void LateUpdate()
		{
			PlayerBotManagerExtended.LateUpdate();
		}

		private void Start()
		{
			PlayerBotManagerExtended.Start();
		}

		private void Awake()
		{
			PlayerBotManagerExtended.Awake();
		}
	}
}
namespace BetterBots.Attributes
{
	[AttributeUsage(AttributeTargets.Class)]
	public class IL2CPP_ComponentDescriptorAttribute : Attribute
	{
		public bool m_launchOnStartLoad;

		public bool m_dontDestroyOnLoad;
	}
	[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
	public class PBD_Data : Attribute
	{
		public PlayerBotActionType ActionType;
	}
}