Decompiled source of MindControl v0.0.1

MindControl.dll

Decompiled 3 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using AIGraph;
using API;
using Agents;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using Enemies;
using HarmonyLib;
using Il2CppInterop.Runtime.Injection;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem.Collections.Generic;
using LevelGeneration;
using Microsoft.CodeAnalysis;
using MindControl.BepInEx;
using Player;
using ReplayRecorder;
using ReplayRecorder.Net;
using SNetwork;
using StateMachines;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("MindControl")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+91c81a4b4726217314e44288a66a576e540178aa")]
[assembly: AssemblyProduct("MindControl")]
[assembly: AssemblyTitle("MindControl")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace API
{
	internal static class APILogger
	{
		private static readonly ManualLogSource logger;

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

		private static string Format(string module, object msg)
		{
			return $"[{module}]: {msg}";
		}

		public static void Info(string module, object data)
		{
			logger.LogMessage((object)Format(module, data));
		}

		public static void Verbose(string module, object data)
		{
		}

		public static void Log(object data)
		{
			logger.LogDebug((object)Format("MindControl", data));
		}

		public static void Debug(object data)
		{
			if (ConfigManager.Debug)
			{
				Log(data);
			}
		}

		public static void Warn(object data)
		{
			logger.LogWarning((object)Format("MindControl", data));
		}

		public static void Error(object data)
		{
			logger.LogError((object)Format("MindControl", data));
		}
	}
}
namespace MindControl
{
	[HarmonyPatch]
	public class EnemyController : MonoBehaviour
	{
		[HarmonyPatch]
		internal static class Patches
		{
			public static bool DontRecurse = false;

			private static bool patch = true;

			[HarmonyPatch(typeof(EnemySync), "OnSpawn")]
			[HarmonyPostfix]
			private static void Postfix_OnSpawn(EnemySync __instance, pEnemySpawnData spawnData)
			{
				if (SNet.IsMaster)
				{
					EnemyAgent agent = __instance.m_agent;
					if (!((Object)(object)((Component)agent).GetComponent<PouncerBehaviour>() != (Object)null) && !agent.EnemyBehaviorData.IsFlyer)
					{
						((Component)agent).gameObject.AddComponent<EnemyController>().AssignAgent(agent);
					}
				}
			}

			[HarmonyPatch(typeof(EnemyBehaviour), "UpdateState")]
			[HarmonyPrefix]
			private static void Prefix_UpdateState(EnemyBehaviour __instance)
			{
				if (!DontRecurse && !(__instance.m_updatebehaviour >= Clock.Time) && controllers.TryGetValue(((Agent)__instance.m_ai.m_enemyAgent).GlobalID, out EnemyController value))
				{
					value.UpdateBehaviour();
				}
			}

			[HarmonyPatch(typeof(EB_InCombat_MoveToPoint), "UpdateBehaviour")]
			[HarmonyPrefix]
			private static bool Prefix_UpdateBehaviour(EB_InCombat_MoveToPoint __instance)
			{
				if (!SNet.IsMaster)
				{
					return true;
				}
				EnemyAI ai = ((EB_StateBase)__instance).m_ai;
				if (!controllers.TryGetValue(((Agent)ai.m_enemyAgent).GlobalID, out EnemyController value) || !value.IsControlled)
				{
					return true;
				}
				if (value.commandBuffer.Peek().type == Command.Type.Attack)
				{
					return true;
				}
				return false;
			}

			[HarmonyPatch(typeof(EnemyCourseNavigation), "UpdateTracking")]
			[HarmonyPostfix]
			[HarmonyPriority(0)]
			private static void UpdateTracking(EnemyCourseNavigation __instance)
			{
				if (!patch || !SNet.IsMaster)
				{
					return;
				}
				EnemyAI aI = __instance.m_owner.AI;
				if (controllers.TryGetValue(((Agent)aI.m_enemyAgent).GlobalID, out EnemyController value) && value.IsControlled)
				{
					Command command = value.commandBuffer.Peek();
					if (command.type == Command.Type.Attack && (Object)(object)command.target != (Object)null)
					{
						patch = false;
						((AgentAI)aI).SetTarget((Agent)(object)command.target);
						patch = true;
					}
					else if (command.type == Command.Type.MoveAttack && (Object)(object)value.currentTarget != (Object)null)
					{
						patch = false;
						((AgentAI)aI).SetTarget((Agent)(object)value.currentTarget);
						patch = true;
					}
				}
			}

			[HarmonyPatch(typeof(EB_InCombat), "TryAttacks")]
			[HarmonyPrefix]
			private static bool Prefix_TryAttacks(EB_InCombat __instance, ref bool __result)
			{
				if (!SNet.IsMaster)
				{
					return true;
				}
				EnemyAI ai = ((EB_StateBase)__instance).m_ai;
				if (!controllers.TryGetValue(((Agent)ai.m_enemyAgent).GlobalID, out EnemyController value) || !value.IsControlled)
				{
					return true;
				}
				Command.Type type = value.commandBuffer.Peek().type;
				if ((uint)(type - 1) <= 1u)
				{
					return true;
				}
				__result = false;
				return false;
			}

			[HarmonyPatch(typeof(EB_InCombat), "TryStrafe")]
			[HarmonyPrefix]
			private static bool Prefix_TryStrafe(EB_InCombat __instance, ref bool __result)
			{
				if (!SNet.IsMaster)
				{
					return true;
				}
				EnemyAI ai = ((EB_StateBase)__instance).m_ai;
				if (!controllers.TryGetValue(((Agent)ai.m_enemyAgent).GlobalID, out EnemyController value) || !value.IsControlled)
				{
					return true;
				}
				if (value.commandBuffer.Peek().type == Command.Type.Attack)
				{
					if ((((AgentAI)ai).Abilities.HasAbility((AgentAbility)1) && !((AgentAI)ai).Abilities.IsAbilityReady((AgentAbility)1, 0)) || (((AgentAI)ai).Abilities.HasAbility((AgentAbility)2) && !((AgentAI)ai).Abilities.IsAbilityReady((AgentAbility)2, 0)))
					{
						return true;
					}
					__result = false;
					return false;
				}
				__result = false;
				return false;
			}

			[HarmonyPatch(typeof(EB_InCombat), "TryScream")]
			[HarmonyPrefix]
			private static bool Prefix_TryScream(EB_InCombat __instance, ref bool __result)
			{
				if (!SNet.IsMaster)
				{
					return true;
				}
				EnemyAI ai = ((EB_StateBase)__instance).m_ai;
				if (!controllers.TryGetValue(((Agent)ai.m_enemyAgent).GlobalID, out EnemyController value) || !value.IsControlled)
				{
					return true;
				}
				__result = false;
				return false;
			}
		}

		public class Command
		{
			public enum Type
			{
				Move,
				Attack,
				MoveAttack
			}

			public Type type;

			public PlayerAgent? target;

			public Vector3 position;

			public Vector3 destination;

			public Command(Vector3 pos)
			{
				//IL_000e: Unknown result type (might be due to invalid IL or missing references)
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0015: 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)
				type = Type.Move;
				position = pos;
				destination = pos;
			}

			public Command(PlayerAgent target)
			{
				type = Type.Attack;
				this.target = target;
			}
		}

		public static Dictionary<int, EnemyController> controllers = new Dictionary<int, EnemyController>();

		private int globalId;

		private EnemyAgent agent;

		private EnemyAI ai;

		private EnemyLocomotion locomotion;

		private EnemyBehaviour behaviour;

		private EnemyBehaviourData behaviourData;

		private EB_InCombat EBInCombat;

		public Queue<Command> commandBuffer = new Queue<Command>();

		private PlayerAgent? currentTarget;

		public bool IsControlled
		{
			get
			{
				if (agent.m_alive)
				{
					return commandBuffer.Count > 0;
				}
				return false;
			}
		}

		public void AssignAgent(EnemyAgent agent)
		{
			this.agent = agent;
			globalId = ((Agent)this.agent).GlobalID;
			locomotion = agent.Locomotion;
			ai = agent.AI;
			behaviour = ai.m_behaviour;
			EBInCombat = ((Il2CppObjectBase)((StateMachine<EB_StateBase>)(object)behaviour).m_states[5]).Cast<EB_InCombat>();
			behaviourData = ai.m_behaviourData;
			controllers.Add(globalId, this);
		}

		private void OnDestroy()
		{
			controllers.Remove(globalId);
		}

		public void AddPosition(Vector3 pos)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			commandBuffer.Enqueue(new Command(pos));
		}

		public void AddAttackPosition(Vector3 pos)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			Command command = new Command(pos);
			command.type = Command.Type.MoveAttack;
			commandBuffer.Enqueue(command);
		}

		public void AddTarget(PlayerAgent target)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			if (target.m_alive)
			{
				commandBuffer.Enqueue(new Command(target));
			}
			else
			{
				commandBuffer.Enqueue(new Command(((Agent)target).m_position));
			}
		}

		public void ClearCommands()
		{
			if (commandBuffer.Count > 0)
			{
				commandBuffer.Clear();
				behaviourData.m_advanceTimer = 0f;
				Patches.DontRecurse = true;
				behaviour.ChangeState((EB_States)5);
				Patches.DontRecurse = false;
			}
		}

		public void UpdateBehaviour()
		{
			if (IsControlled)
			{
				Command command = commandBuffer.Peek();
				switch (command.type)
				{
				case Command.Type.Move:
				case Command.Type.MoveAttack:
					MoveCommand(command);
					break;
				case Command.Type.Attack:
					AttackCommand(command);
					break;
				}
			}
		}

		private void AttackCommand(Command command)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Invalid comparison between Unknown and I4
			if ((int)((AgentAI)ai).Mode != 1)
			{
				((AgentAI)ai).Mode = (AgentMode)1;
				((AgentAI)ai).ModeChange();
			}
			if (((Il2CppObjectBase)((StateMachine<EB_StateBase>)(object)behaviour).m_currentState).TryCast<EB_Hibernating>() != null)
			{
				locomotion.ChangeState((ES_StateEnum)2);
				Patches.DontRecurse = true;
				behaviour.ChangeState((EB_States)5);
				Patches.DontRecurse = false;
			}
			behaviourData.m_advanceTimer = 0f;
			if (!((Object)(object)command.target == (Object)null))
			{
				if (((AgentAI)ai).m_target == null || (Object)(object)((AgentAI)ai).m_target.m_agent == (Object)null || ((AgentAI)ai).m_target.m_agent.GlobalID != ((Agent)command.target).GlobalID)
				{
					((AgentAI)ai).SetTarget((Agent)(object)command.target);
				}
				if (!((Agent)command.target).Alive)
				{
					commandBuffer.Dequeue();
					APILogger.Debug("Target dead!");
				}
			}
		}

		private void MoveCommand(Command command)
		{
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Invalid comparison between Unknown and I4
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Invalid comparison between Unknown and I4
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Invalid comparison between Unknown and I4
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Invalid comparison between Unknown and I4
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: Invalid comparison between Unknown and I4
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Invalid comparison between Unknown and I4
			//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Invalid comparison between Unknown and I4
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0237: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Invalid comparison between Unknown and I4
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Invalid comparison between Unknown and I4
			//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0302: Unknown result type (might be due to invalid IL or missing references)
			//IL_0307: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val;
			ES_StateEnum currentStateEnum;
			if (command.type == Command.Type.MoveAttack)
			{
				if ((Object)(object)currentTarget != (Object)null)
				{
					float max = agent.EnemyBehaviorData.MeleeAttackDistance.Max;
					float max2 = agent.EnemyBehaviorData.RangedAttackDistance.Max;
					val = ((Agent)currentTarget).m_position - ((Agent)agent).m_position;
					float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude;
					if (((AgentAI)ai).Abilities.HasAbility((AgentAbility)1) && sqrMagnitude >= max && ((AgentAI)ai).Abilities.HasAbility((AgentAbility)2) && sqrMagnitude >= max2)
					{
						currentTarget = null;
					}
				}
				if ((Object)(object)currentTarget == (Object)null)
				{
					float num = float.MaxValue;
					Enumerator<PlayerAgent> enumerator = PlayerManager.PlayerAgentsInLevel.GetEnumerator();
					while (enumerator.MoveNext())
					{
						PlayerAgent current = enumerator.Current;
						if (current.m_alive)
						{
							val = ((Agent)current).m_position - ((Agent)agent).m_position;
							float sqrMagnitude2 = ((Vector3)(ref val)).sqrMagnitude;
							if (sqrMagnitude2 < num)
							{
								num = sqrMagnitude2;
								currentTarget = current;
							}
						}
					}
				}
				if ((Object)(object)currentTarget != (Object)null && currentTarget.m_alive)
				{
					((AgentAI)ai).SetTarget((Agent)(object)currentTarget);
					if (EBInCombat.TryAttacks())
					{
						return;
					}
					currentStateEnum = locomotion.CurrentStateEnum;
					if (currentStateEnum - 18 <= 1 || (int)currentStateEnum == 23)
					{
						return;
					}
				}
			}
			currentStateEnum = locomotion.CurrentStateEnum;
			if ((int)currentStateEnum <= 10)
			{
				if ((int)currentStateEnum == 7 || (int)currentStateEnum == 10)
				{
					return;
				}
			}
			else if (currentStateEnum - 24 <= 1 || (int)currentStateEnum == 29)
			{
				return;
			}
			if ((int)((AgentAI)ai).Mode != 1)
			{
				((AgentAI)ai).Mode = (AgentMode)1;
				((AgentAI)ai).ModeChange();
			}
			if (((AgentAI)ai).m_target == null || !((AgentAI)ai).m_target.m_hasLineOfSight)
			{
				EnemyAgent enemyAgent = ai.m_enemyAgent;
				val = command.destination - ((Component)ai).transform.position;
				((Agent)enemyAgent).TargetLookDir = ((Vector3)(ref val)).normalized;
			}
			else
			{
				((Agent)ai.m_enemyAgent).TargetLookDir = ((AgentAI)ai).m_target.m_dir;
			}
			if ((int)locomotion.CurrentStateEnum != 2)
			{
				locomotion.ChangeState((ES_StateEnum)2);
			}
			if (((Il2CppObjectBase)((StateMachine<EB_StateBase>)(object)behaviour).m_currentState).TryCast<EB_InCombat_MoveToPoint>() == null)
			{
				Patches.DontRecurse = true;
				behaviour.ChangeState((EB_States)5);
				behaviour.m_updatebehaviour = 0f;
				((StateMachine<EB_StateBase>)(object)behaviour).UpdateState();
				behaviour.ChangeState((EB_States)7);
				behaviour.m_updatebehaviour = 0f;
				((StateMachine<EB_StateBase>)(object)behaviour).UpdateState();
				behaviour.ChangeState((EB_States)6);
				Patches.DontRecurse = false;
			}
			EBInCombat.UpdateAvoidance();
			if (((AgentAI)ai).m_navMeshAgent.isOnNavMesh)
			{
				((AgentAI)ai).m_navMeshAgent.destination = command.position;
				command.destination = ((AgentAI)ai).m_navMeshAgent.destination;
			}
		}
	}
}
namespace MindControl.BepInEx
{
	public static class Module
	{
		public const string GUID = "randomuserhi.MindControl";

		public const string Name = "MindControl";

		public const string Version = "0.0.1";
	}
	public static class ConfigManager
	{
		public static ConfigFile configFile;

		private static ConfigEntry<bool> debug;

		public static bool Debug
		{
			get
			{
				return debug.Value;
			}
			set
			{
				debug.Value = value;
			}
		}

		static ConfigManager()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Expected O, but got Unknown
			configFile = new ConfigFile(Path.Combine(Paths.ConfigPath, "MindControl.cfg"), true);
			debug = configFile.Bind<bool>("Debug", "enable", false, "Enables debug messages when true.");
		}
	}
	[BepInPlugin("randomuserhi.MindControl", "MindControl", "0.0.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BasePlugin
	{
		private enum CommandType
		{
			MindControlPosition,
			MindControlClear,
			MindControlAttack,
			MindControlAttackPosition
		}

		private static Harmony? harmony;

		public override void Load()
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			APILogger.Log("Plugin is loaded!");
			harmony = new Harmony("randomuserhi.MindControl");
			harmony.PatchAll();
			ClassInjector.RegisterTypeInIl2Cpp<EnemyController>();
			APILogger.Log("Debug is " + (ConfigManager.Debug ? "Enabled" : "Disabled"));
			VNet.Register("MindControl", (Action<ulong, ArraySegment<byte>>)OnMindControlCommand);
			VNet.Register("MindControl.SpawnEnemy", (Action<ulong, ArraySegment<byte>>)OnMindControlSpawnCommand);
		}

		private static AIG_CourseNode? GetNode(Vector3 position)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			AIG_INode val = default(AIG_INode);
			AIG_NodeCluster val2 = default(AIG_NodeCluster);
			if (AIG_GeomorphNodeVolume.TryGetNode(0, Dimension.GetDimensionFromPos(position).DimensionIndex, position, ref val, false) && AIG_NodeCluster.TryGetNodeCluster(val.ClusterID, ref val2))
			{
				if (val2.CourseNode == null)
				{
					return null;
				}
				return val2.CourseNode;
			}
			return null;
		}

		private static void OnMindControlSpawnCommand(ulong from, ArraySegment<byte> buffer)
		{
			//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_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			if (!SNet.IsMaster)
			{
				return;
			}
			int num = 0;
			Vector3 pos = BitHelper.ReadHalfVector3(buffer, ref num);
			Quaternion rot = Quaternion.identity;
			uint id = BitHelper.ReadUInt(buffer, ref num);
			MainThread.Run((Action)delegate
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				//IL_002e: Unknown result type (might be due to invalid IL or missing references)
				AIG_CourseNode val = GetNode(pos);
				if (val == null)
				{
					val = ((Agent)PlayerManager.GetLocalPlayerAgent()).CourseNode;
				}
				EnemyAllocator.Current.SpawnEnemy(id, val, (AgentMode)4, pos, rot, (EnemyGroup)null, -1);
			});
		}

		private static void OnMindControlCommand(ulong from, ArraySegment<byte> buffer)
		{
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			if (!SNet.IsMaster)
			{
				return;
			}
			int index = 0;
			CommandType commandType = (CommandType)BitHelper.ReadUShort(buffer, ref index);
			APILogger.Debug($"Received command of type '{commandType}'.");
			switch (commandType)
			{
			case CommandType.MindControlClear:
			{
				int numEnemies4 = BitHelper.ReadInt(buffer, ref index);
				APILogger.Debug($"Num Enemies '{numEnemies4}'.");
				MainThread.Run((Action)delegate
				{
					for (int i = 0; i < numEnemies4; i++)
					{
						ushort key = BitHelper.ReadUShort(buffer, ref index);
						if (EnemyController.controllers.TryGetValue(key, out EnemyController value))
						{
							value.ClearCommands();
						}
					}
				});
				break;
			}
			case CommandType.MindControlPosition:
			{
				Vector3 pos2 = BitHelper.ReadHalfVector3(buffer, ref index);
				int numEnemies3 = BitHelper.ReadInt(buffer, ref index);
				APILogger.Debug($"Num Enemies '{numEnemies3}'.");
				MainThread.Run((Action)delegate
				{
					//IL_0037: Unknown result type (might be due to invalid IL or missing references)
					for (int i = 0; i < numEnemies3; i++)
					{
						ushort key = BitHelper.ReadUShort(buffer, ref index);
						if (EnemyController.controllers.TryGetValue(key, out EnemyController value))
						{
							value.ClearCommands();
							value.AddPosition(pos2);
						}
					}
				});
				break;
			}
			case CommandType.MindControlAttackPosition:
			{
				Vector3 pos = BitHelper.ReadHalfVector3(buffer, ref index);
				int numEnemies2 = BitHelper.ReadInt(buffer, ref index);
				APILogger.Debug($"Num Enemies '{numEnemies2}'.");
				MainThread.Run((Action)delegate
				{
					//IL_0037: Unknown result type (might be due to invalid IL or missing references)
					for (int i = 0; i < numEnemies2; i++)
					{
						ushort key = BitHelper.ReadUShort(buffer, ref index);
						if (EnemyController.controllers.TryGetValue(key, out EnemyController value))
						{
							value.ClearCommands();
							value.AddAttackPosition(pos);
						}
					}
				});
				break;
			}
			case CommandType.MindControlAttack:
			{
				byte slot = BitHelper.ReadByte(buffer, ref index);
				int numEnemies = BitHelper.ReadInt(buffer, ref index);
				APILogger.Debug($"Num Enemies '{numEnemies}'.");
				MainThread.Run((Action)delegate
				{
					if (slot < ((Il2CppArrayBase<SNet_Slot>)(object)SNet.Slots.PlayerSlots).Length)
					{
						PlayerAgent val = ((Il2CppObjectBase)((Il2CppArrayBase<SNet_Slot>)(object)SNet.Slots.PlayerSlots)[(int)slot].player.m_playerAgent).TryCast<PlayerAgent>();
						if ((Object)(object)val != (Object)null)
						{
							for (int i = 0; i < numEnemies; i++)
							{
								ushort key = BitHelper.ReadUShort(buffer, ref index);
								if (EnemyController.controllers.TryGetValue(key, out EnemyController value))
								{
									value.ClearCommands();
									value.AddTarget(val);
								}
							}
						}
					}
				});
				break;
			}
			default:
				APILogger.Error($"No command defined for message of type '{commandType}'");
				break;
			}
		}
	}
}