Decompiled source of KinCaller v1.0.0

KinCaller.dll

Decompiled 10 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using HarmonyLib;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem.Collections.Generic;
using KinCaller.Services;
using Microsoft.CodeAnalysis;
using ProjectM;
using ProjectM.CastleBuilding;
using ProjectM.Network;
using ProjectM.Terrain;
using Stunlock.Core;
using Unity.Collections;
using Unity.Entities;
using Unity.Mathematics;
using Unity.Transforms;
using VampireCommandFramework;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("KinCaller")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Controls the destination of dominated prisoners when using the Dusk Caller")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+7d91ebf340ecfdc7e93dbabf97e47d6ef697db26")]
[assembly: AssemblyProduct("KinCaller")]
[assembly: AssemblyTitle("KinCaller")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace KinCaller
{
	internal static class Core
	{
		internal static bool _hasInitialized = false;

		public static World Server { get; } = GetWorld("Server") ?? throw new Exception("There is no Server world (yet). Did you install a server mod on the client?");

		public static EntityManager EntityManager { get; } = Server.EntityManager;

		public static ManualLogSource Log { get; } = Plugin.LogInstance;

		public static ExtraditionService Extradition { get; private set; }

		public static CastleTerritoryService CastleTerritory { get; private set; }

		public static void LogException(Exception e, [CallerMemberName] string caller = null)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			ManualLogSource log = Log;
			bool flag = default(bool);
			BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(51, 5, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failure in ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(caller);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\nMessage: ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.Message);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" Inner:");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.InnerException?.Message);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\n\nStack: ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.StackTrace);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\nInner Stack: ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.InnerException?.StackTrace);
			}
			log.LogError(val);
		}

		internal static void InitializeAfterLoaded()
		{
			if (!_hasInitialized)
			{
				CastleTerritory = new CastleTerritoryService();
				Extradition = new ExtraditionService();
				_hasInitialized = true;
				Log.LogInfo((object)"[KinCaller] Initialized.");
			}
		}

		private static World GetWorld(string name)
		{
			Enumerator<World> enumerator = World.s_AllWorlds.GetEnumerator();
			while (enumerator.MoveNext())
			{
				World current = enumerator.Current;
				if (current.Name == name)
				{
					return current;
				}
			}
			return null;
		}
	}
	public static class ECSExtensions
	{
		public unsafe static void Write<T>(this Entity entity, T componentData) where T : struct
		{
			//IL_0025: 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_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			ComponentType val = default(ComponentType);
			((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
			int num = Marshal.SizeOf<T>();
			byte* ptr = stackalloc byte[(int)(uint)num];
			Marshal.StructureToPtr(componentData, (IntPtr)ptr, fDeleteOld: false);
			EntityManager entityManager = Core.EntityManager;
			((EntityManager)(ref entityManager)).SetComponentDataRaw(entity, val.TypeIndex, (void*)ptr, num);
		}

		public unsafe static T Read<T>(this Entity entity) where T : struct
		{
			//IL_000d: 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_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)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			ComponentType val = default(ComponentType);
			((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
			EntityManager entityManager = Core.EntityManager;
			return Marshal.PtrToStructure<T>(new IntPtr(((EntityManager)(ref entityManager)).GetComponentDataRawRO(entity, val.TypeIndex)));
		}

		public static bool Has<T>(this Entity entity)
		{
			//IL_000d: 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_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)
			ComponentType val = default(ComponentType);
			((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
			EntityManager entityManager = Core.EntityManager;
			return ((EntityManager)(ref entityManager)).HasComponent(entity, val);
		}
	}
	[BepInPlugin("KinCaller", "KinCaller", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BasePlugin
	{
		private Harmony _harmony;

		private static Plugin Instance;

		public static Harmony Harmony => Instance._harmony;

		public static ManualLogSource LogInstance { get; private set; }

		public override void Load()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Expected O, but got Unknown
			Instance = this;
			ManualLogSource log = ((BasePlugin)this).Log;
			bool flag = default(bool);
			BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(27, 2, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Plugin ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("KinCaller");
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" version ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("1.0.0");
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" is loaded!");
			}
			log.LogInfo(val);
			LogInstance = ((BasePlugin)this).Log;
			_harmony = new Harmony("KinCaller");
			_harmony.PatchAll(Assembly.GetExecutingAssembly());
			CommandRegistry.RegisterAll();
		}

		public override bool Unload()
		{
			CommandRegistry.UnregisterAssembly();
			Harmony harmony = _harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			return true;
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "KinCaller";

		public const string PLUGIN_NAME = "KinCaller";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace KinCaller.Services
{
	internal class CastleTerritoryService
	{
		private const float BLOCK_SIZE = 10f;

		private readonly Dictionary<int2, int> _blockToTerritory = new Dictionary<int2, int>();

		private readonly EntityQuery _heartQuery;

		public CastleTerritoryService()
		{
			//IL_0012: 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_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Expected O, but got Unknown
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			EntityManager entityManager = Core.EntityManager;
			EntityQueryDesc[] array = new EntityQueryDesc[1];
			EntityQueryDesc val = new EntityQueryDesc();
			val.All = Il2CppStructArray<ComponentType>.op_Implicit((ComponentType[])(object)new ComponentType[1] { ComponentType.ReadOnly<CastleHeart>() });
			val.Options = (EntityQueryOptions)2;
			array[0] = val;
			_heartQuery = ((EntityManager)(ref entityManager)).CreateEntityQuery((EntityQueryDesc[])(object)array);
			BuildBlockMap();
		}

		private void BuildBlockMap()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: 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_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			EntityManager entityManager = Core.EntityManager;
			EntityQueryDesc[] array = new EntityQueryDesc[1];
			EntityQueryDesc val = new EntityQueryDesc();
			val.All = Il2CppStructArray<ComponentType>.op_Implicit((ComponentType[])(object)new ComponentType[1] { ComponentType.ReadOnly<CastleTerritory>() });
			val.Options = (EntityQueryOptions)2;
			array[0] = val;
			EntityQuery val2 = ((EntityManager)(ref entityManager)).CreateEntityQuery((EntityQueryDesc[])(object)array);
			try
			{
				NativeArray<Entity> val3 = ((EntityQuery)(ref val2)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
				try
				{
					Enumerator<Entity> enumerator = val3.GetEnumerator();
					while (enumerator.MoveNext())
					{
						Entity current = enumerator.Current;
						int castleTerritoryIndex = current.Read<CastleTerritory>().CastleTerritoryIndex;
						entityManager = Core.EntityManager;
						DynamicBuffer<CastleTerritoryBlocks> buffer = ((EntityManager)(ref entityManager)).GetBuffer<CastleTerritoryBlocks>(current, false);
						for (int i = 0; i < buffer.Length; i++)
						{
							_blockToTerritory[buffer[i].BlockCoordinate] = castleTerritoryIndex;
						}
					}
				}
				finally
				{
					val3.Dispose();
				}
			}
			finally
			{
				((EntityQuery)(ref val2)).Dispose();
			}
		}

		public int GetTerritoryIndex(float3 pos)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//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_000d: Unknown result type (might be due to invalid IL or missing references)
			int2 key = ConvertPosToBlockCoord(pos);
			if (!_blockToTerritory.TryGetValue(key, out var value))
			{
				return -1;
			}
			return value;
		}

		public Entity GetHeartForTerritory(int territoryIndex)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_001e: 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_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: 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_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: 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)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			if (territoryIndex == -1)
			{
				return Entity.Null;
			}
			EntityQuery heartQuery = _heartQuery;
			NativeArray<Entity> val = ((EntityQuery)(ref heartQuery)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
			try
			{
				Enumerator<Entity> enumerator = val.GetEnumerator();
				while (enumerator.MoveNext())
				{
					Entity current = enumerator.Current;
					Entity castleTerritoryEntity = current.Read<CastleHeart>().CastleTerritoryEntity;
					if (!((Entity)(ref castleTerritoryEntity)).Equals(Entity.Null) && castleTerritoryEntity.Read<CastleTerritory>().CastleTerritoryIndex == territoryIndex)
					{
						return current;
					}
				}
			}
			finally
			{
				val.Dispose();
			}
			return Entity.Null;
		}

		private static int2 ConvertPosToBlockCoord(float3 pos)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: 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)
			int num = (int)math.floor(pos.x * 2f) + 6400;
			int num2 = (int)math.floor(pos.z * 2f) + 6400;
			return new int2((int)math.floor((float)num / 10f), (int)math.floor((float)num2 / 10f));
		}
	}
	internal class ExtraditionService
	{
		public enum RoutingOutcome
		{
			MarkedTerritory,
			OwnCastle,
			Vanilla
		}

		private class SaveData
		{
			[JsonInclude]
			public Dictionary<string, int> Players { get; set; } = new Dictionary<string, int>();
		}

		private readonly Dictionary<ulong, int> _targetTerritory = new Dictionary<ulong, int>();

		private static readonly string SaveDir = Path.Combine(Paths.ConfigPath, "KinCaller");

		private static readonly string SavePath = Path.Combine(SaveDir, "target_territories.json");

		private readonly EntityQuery _prisonCellQuery;

		public ExtraditionService()
		{
			//IL_0012: 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_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Expected O, but got Unknown
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: 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)
			EntityManager entityManager = Core.EntityManager;
			EntityQueryDesc[] array = new EntityQueryDesc[1];
			EntityQueryDesc val = new EntityQueryDesc();
			val.All = Il2CppStructArray<ComponentType>.op_Implicit((ComponentType[])(object)new ComponentType[4]
			{
				new ComponentType(Il2CppType.Of<PrisonCell>(), (AccessMode)1),
				new ComponentType(Il2CppType.Of<NetworkId>(), (AccessMode)1),
				new ComponentType(Il2CppType.Of<LocalToWorld>(), (AccessMode)1),
				new ComponentType(Il2CppType.Of<CastleHeartConnection>(), (AccessMode)1)
			});
			val.Options = (EntityQueryOptions)2;
			array[0] = val;
			_prisonCellQuery = ((EntityManager)(ref entityManager)).CreateEntityQuery((EntityQueryDesc[])(object)array);
			Load();
		}

		public void SetTargetTerritory(Entity userEntity, int territoryIndex)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			ulong steamId = GetSteamId(userEntity);
			if (steamId != 0L && territoryIndex >= 0)
			{
				_targetTerritory[steamId] = territoryIndex;
				Save();
			}
		}

		public bool ClearTarget(Entity userEntity)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			ulong steamId = GetSteamId(userEntity);
			if (steamId == 0L)
			{
				return false;
			}
			if (!_targetTerritory.Remove(steamId))
			{
				return false;
			}
			Save();
			return true;
		}

		public int GetTargetTerritory(Entity userEntity)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			ulong steamId = GetSteamId(userEntity);
			if (steamId == 0L)
			{
				return -1;
			}
			if (!_targetTerritory.TryGetValue(steamId, out var value))
			{
				return -1;
			}
			return value;
		}

		public (Entity Cell, RoutingOutcome Outcome) FindBestCell(Entity casterUser, Entity prisoner, Entity currentCell)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: 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_00a7: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: 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_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: 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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			if (((Entity)(ref casterUser)).Equals(Entity.Null))
			{
				return (Cell: Entity.Null, Outcome: RoutingOutcome.Vanilla);
			}
			LocalToWorld val = prisoner.Read<LocalToWorld>();
			float3 position = ((LocalToWorld)(ref val)).Position;
			ulong steamId = GetSteamId(casterUser);
			if (steamId != 0L && _targetTerritory.TryGetValue(steamId, out var value))
			{
				Entity heartForTerritory = Core.CastleTerritory.GetHeartForTerritory(value);
				if (!((Entity)(ref heartForTerritory)).Equals(Entity.Null) && IsOwnerAllied(GetHeartOwnerFromHeart(heartForTerritory), casterUser))
				{
					if (GetCellTerritoryIndex(currentCell) == value)
					{
						return (Cell: currentCell, Outcome: RoutingOutcome.MarkedTerritory);
					}
					Entity item = FindNearestEmptyInTerritory(value, position, currentCell);
					if (!((Entity)(ref item)).Equals(Entity.Null))
					{
						return (Cell: item, Outcome: RoutingOutcome.MarkedTerritory);
					}
				}
			}
			if (GetHeartOwner(currentCell) == casterUser)
			{
				return (Cell: currentCell, Outcome: RoutingOutcome.OwnCastle);
			}
			Entity item2 = FindNearestEmptyInOwnCastle(casterUser, position, currentCell);
			if (!((Entity)(ref item2)).Equals(Entity.Null))
			{
				return (Cell: item2, Outcome: RoutingOutcome.OwnCastle);
			}
			return (Cell: Entity.Null, Outcome: RoutingOutcome.Vanilla);
		}

		public int CountEmptyCellsInTerritory(int territoryIndex)
		{
			//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_000a: 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_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_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			EntityQuery prisonCellQuery = _prisonCellQuery;
			NativeArray<Entity> val = ((EntityQuery)(ref prisonCellQuery)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
			try
			{
				int num = 0;
				Enumerator<Entity> enumerator = val.GetEnumerator();
				while (enumerator.MoveNext())
				{
					Entity current = enumerator.Current;
					if (IsCellEmpty(current) && GetCellTerritoryIndex(current) == territoryIndex)
					{
						num++;
					}
				}
				return num;
			}
			finally
			{
				val.Dispose();
			}
		}

		public static void RedirectPrisoner(Entity prisoner, Entity fromCell, Entity toCell)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//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_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: 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_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: 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_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			PrisonCell componentData = fromCell.Read<PrisonCell>();
			componentData.ImprisonedEntity = NetworkedEntity.op_Implicit(Entity.Null);
			fromCell.Write<PrisonCell>(componentData);
			PrisonCell componentData2 = toCell.Read<PrisonCell>();
			componentData2.ImprisonedEntity = NetworkedEntity.op_Implicit(prisoner);
			toCell.Write<PrisonCell>(componentData2);
			Imprisoned componentData3 = prisoner.Read<Imprisoned>();
			componentData3.PrisonCellEntity = toCell;
			prisoner.Write<Imprisoned>(componentData3);
		}

		private Entity FindNearestEmptyInTerritory(int territoryIndex, float3 referencePos, Entity exclude = default(Entity))
		{
			//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_000a: 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_0014: 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_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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)
			//IL_0033: 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: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: 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_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			EntityQuery prisonCellQuery = _prisonCellQuery;
			NativeArray<Entity> val = ((EntityQuery)(ref prisonCellQuery)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
			try
			{
				Entity result = Entity.Null;
				float num = float.MaxValue;
				Enumerator<Entity> enumerator = val.GetEnumerator();
				while (enumerator.MoveNext())
				{
					Entity current = enumerator.Current;
					if (!(current == exclude) && IsCellEmpty(current) && GetCellTerritoryIndex(current) == territoryIndex)
					{
						LocalToWorld val2 = current.Read<LocalToWorld>();
						float num2 = math.distancesq(referencePos, ((LocalToWorld)(ref val2)).Position);
						if (num2 < num)
						{
							num = num2;
							result = current;
						}
					}
				}
				return result;
			}
			finally
			{
				val.Dispose();
			}
		}

		private Entity FindNearestEmptyInOwnCastle(Entity userEntity, float3 referencePos, Entity exclude = default(Entity))
		{
			//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_000a: 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_0014: 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_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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)
			//IL_0033: 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: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: 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_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: 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_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_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			EntityQuery prisonCellQuery = _prisonCellQuery;
			NativeArray<Entity> val = ((EntityQuery)(ref prisonCellQuery)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
			try
			{
				Entity result = Entity.Null;
				float num = float.MaxValue;
				Enumerator<Entity> enumerator = val.GetEnumerator();
				while (enumerator.MoveNext())
				{
					Entity current = enumerator.Current;
					if (!(current == exclude) && IsCellEmpty(current) && !(GetHeartOwner(current) != userEntity))
					{
						LocalToWorld val2 = current.Read<LocalToWorld>();
						float num2 = math.distancesq(referencePos, ((LocalToWorld)(ref val2)).Position);
						if (num2 < num)
						{
							num = num2;
							result = current;
						}
					}
				}
				return result;
			}
			finally
			{
				val.Dispose();
			}
		}

		private void Load()
		{
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Expected O, but got Unknown
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Expected O, but got Unknown
			if (!File.Exists(SavePath))
			{
				return;
			}
			bool flag = default(bool);
			try
			{
				SaveData saveData = JsonSerializer.Deserialize<SaveData>(File.ReadAllText(SavePath));
				if (saveData?.Players == null)
				{
					return;
				}
				foreach (var (s, num2) in saveData.Players)
				{
					if (ulong.TryParse(s, out var result) && num2 >= 0)
					{
						_targetTerritory[result] = num2;
					}
				}
				ManualLogSource log = Core.Log;
				BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(54, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[KinCaller] Loaded extradition targets for ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(_targetTerritory.Count);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" player(s).");
				}
				log.LogInfo(val);
			}
			catch (Exception ex)
			{
				ManualLogSource log2 = Core.Log;
				BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(52, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("[KinCaller] Failed to load target_territories.json: ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(ex.Message);
				}
				log2.LogError(val2);
			}
		}

		private void Save()
		{
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Expected O, but got Unknown
			try
			{
				Directory.CreateDirectory(SaveDir);
				SaveData value = new SaveData
				{
					Players = _targetTerritory.ToDictionary((KeyValuePair<ulong, int> kvp) => kvp.Key.ToString(), (KeyValuePair<ulong, int> kvp) => kvp.Value)
				};
				string text = SavePath + ".tmp";
				File.WriteAllText(text, JsonSerializer.Serialize(value, new JsonSerializerOptions
				{
					WriteIndented = true
				}));
				File.Move(text, SavePath, overwrite: true);
			}
			catch (Exception ex)
			{
				ManualLogSource log = Core.Log;
				bool flag = default(bool);
				BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(52, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[KinCaller] Failed to save target_territories.json: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.Message);
				}
				log.LogError(val);
			}
		}

		private static ulong GetSteamId(Entity userEntity)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			if (((Entity)(ref userEntity)).Equals(Entity.Null) || !userEntity.Has<User>())
			{
				return 0uL;
			}
			return userEntity.Read<User>().PlatformId;
		}

		private static bool IsCellEmpty(Entity cell)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			if (!cell.Has<PrisonCell>())
			{
				return false;
			}
			PrisonCell val = cell.Read<PrisonCell>();
			Entity entityOnServer = ((NetworkedEntity)(ref val.ImprisonedEntity)).GetEntityOnServer();
			return ((Entity)(ref entityOnServer)).Equals(Entity.Null);
		}

		private static int GetCellTerritoryIndex(Entity cell)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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)
			if (!cell.Has<CastleHeartConnection>())
			{
				return -1;
			}
			CastleHeartConnection val = cell.Read<CastleHeartConnection>();
			Entity entityOnServer = ((NetworkedEntity)(ref val.CastleHeartEntity)).GetEntityOnServer();
			if (((Entity)(ref entityOnServer)).Equals(Entity.Null))
			{
				return -1;
			}
			return GetCastleTerritoryIndex(entityOnServer);
		}

		internal static bool IsOwnerAllied(Entity ownerUser, Entity casterUser)
		{
			//IL_0002: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: 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_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			if (((Entity)(ref ownerUser)).Equals(Entity.Null))
			{
				return false;
			}
			if (ownerUser == casterUser)
			{
				return true;
			}
			if (!casterUser.Has<User>() || !ownerUser.Has<User>())
			{
				return false;
			}
			User val = casterUser.Read<User>();
			Entity entityOnServer = ((NetworkedEntity)(ref val.ClanEntity)).GetEntityOnServer();
			val = ownerUser.Read<User>();
			Entity entityOnServer2 = ((NetworkedEntity)(ref val.ClanEntity)).GetEntityOnServer();
			if (((Entity)(ref entityOnServer)).Equals(Entity.Null) || ((Entity)(ref entityOnServer2)).Equals(Entity.Null))
			{
				return false;
			}
			return entityOnServer == entityOnServer2;
		}

		internal static Entity GetHeartOwner(Entity cell)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: 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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			if (!cell.Has<CastleHeartConnection>())
			{
				return Entity.Null;
			}
			CastleHeartConnection val = cell.Read<CastleHeartConnection>();
			return GetHeartOwnerFromHeart(((NetworkedEntity)(ref val.CastleHeartEntity)).GetEntityOnServer());
		}

		internal static Entity GetHeartOwnerFromHeart(Entity heart)
		{
			//IL_0002: 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_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			if (((Entity)(ref heart)).Equals(Entity.Null) || !heart.Has<UserOwner>())
			{
				return Entity.Null;
			}
			UserOwner val = heart.Read<UserOwner>();
			return ((NetworkedEntity)(ref val.Owner)).GetEntityOnServer();
		}

		internal static int GetCastleTerritoryIndex(Entity heartEntity)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: 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_002e: 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)
			if (!heartEntity.Has<CastleHeart>())
			{
				return -1;
			}
			Entity castleTerritoryEntity = heartEntity.Read<CastleHeart>().CastleTerritoryEntity;
			if (((Entity)(ref castleTerritoryEntity)).Equals(Entity.Null) || !castleTerritoryEntity.Has<CastleTerritory>())
			{
				return -1;
			}
			return castleTerritoryEntity.Read<CastleTerritory>().CastleTerritoryIndex;
		}

		internal unsafe static string GetCastleTerritoryRegionName(Entity heartEntity)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: 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_001c: 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_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			if (!heartEntity.Has<CastleHeart>())
			{
				return string.Empty;
			}
			Entity castleTerritoryEntity = heartEntity.Read<CastleHeart>().CastleTerritoryEntity;
			if (((Entity)(ref castleTerritoryEntity)).Equals(Entity.Null) || !castleTerritoryEntity.Has<TerritoryWorldRegion>())
			{
				return string.Empty;
			}
			WorldRegionType region = castleTerritoryEntity.Read<TerritoryWorldRegion>().Region;
			return Regex.Replace(((object)(*(WorldRegionType*)(&region))/*cast due to .constrained prefix*/).ToString().Replace("_", ""), "(?<!^)([A-Z])", " $1");
		}

		internal unsafe static string DescribeHeartPlain(Entity heart)
		{
			//IL_0002: 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_001b: 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_0023: 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_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			if (((Entity)(ref heart)).Equals(Entity.Null))
			{
				return "an unknown territory";
			}
			int castleTerritoryIndex = GetCastleTerritoryIndex(heart);
			string castleTerritoryRegionName = GetCastleTerritoryRegionName(heart);
			Entity heartOwnerFromHeart = GetHeartOwnerFromHeart(heart);
			object obj;
			if (!heartOwnerFromHeart.Has<User>())
			{
				obj = "unknown";
			}
			else
			{
				User val = heartOwnerFromHeart.Read<User>();
				obj = ((object)(*(FixedString64Bytes*)(&val.CharacterName))/*cast due to .constrained prefix*/).ToString();
			}
			string text = ((castleTerritoryIndex < 0) ? "no plot" : ((castleTerritoryRegionName.Length > 0) ? $"Plot {castleTerritoryIndex}, {castleTerritoryRegionName}" : $"Plot {castleTerritoryIndex}"));
			return (string?)obj + "'s castle (" + text + ")";
		}

		internal static string DescribeCellPlain(Entity cell)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: 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_001c: Unknown result type (might be due to invalid IL or missing references)
			if (!cell.Has<CastleHeartConnection>())
			{
				return "an unknown cell";
			}
			CastleHeartConnection val = cell.Read<CastleHeartConnection>();
			return DescribeHeartPlain(((NetworkedEntity)(ref val.CastleHeartEntity)).GetEntityOnServer());
		}
	}
}
namespace KinCaller.Patches
{
	[HarmonyPatch(typeof(BuffSystem_Spawn_Server), "OnUpdate")]
	internal static class ImprisonSuccessfulBuffPatch
	{
		private const int ImprisonSuccessfulPlayerBuff = -1939804277;

		private const int SendToPrisonInvulnerabilityBuff = -1988445418;

		private static string P(string s)
		{
			return "<color=#9966CC>" + s + "</color>";
		}

		private static string G(string s)
		{
			return "<color=#A0A0A0>" + s + "</color>";
		}

		private static string M(string s)
		{
			return "<color=#E066C0>" + s + "</color>";
		}

		private unsafe static string CellLocation(Entity cell, bool includeName = true)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: 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_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			if (!cell.Has<CastleHeartConnection>())
			{
				return string.Empty;
			}
			CastleHeartConnection val = cell.Read<CastleHeartConnection>();
			Entity entityOnServer = ((NetworkedEntity)(ref val.CastleHeartEntity)).GetEntityOnServer();
			if (((Entity)(ref entityOnServer)).Equals(Entity.Null))
			{
				return string.Empty;
			}
			int castleTerritoryIndex = ExtraditionService.GetCastleTerritoryIndex(entityOnServer);
			string castleTerritoryRegionName = ExtraditionService.GetCastleTerritoryRegionName(entityOnServer);
			string text = ((castleTerritoryIndex < 0) ? string.Empty : ((castleTerritoryRegionName.Length > 0) ? (G("(Plot ") + P($"{castleTerritoryIndex}") + G(", " + castleTerritoryRegionName + ")")) : (G("(Plot ") + P($"{castleTerritoryIndex}") + G(")"))));
			if (!includeName)
			{
				return text;
			}
			if (!entityOnServer.Has<UserOwner>())
			{
				return text;
			}
			UserOwner val2 = entityOnServer.Read<UserOwner>();
			Entity entityOnServer2 = ((NetworkedEntity)(ref val2.Owner)).GetEntityOnServer();
			if (((Entity)(ref entityOnServer2)).Equals(Entity.Null) || !entityOnServer2.Has<User>())
			{
				return text;
			}
			User val3 = entityOnServer2.Read<User>();
			string s = ((object)(*(FixedString64Bytes*)(&val3.CharacterName))/*cast due to .constrained prefix*/).ToString();
			string text2 = G("in ") + M(s) + G("'s castle");
			if (text.Length <= 0)
			{
				return text2;
			}
			return text2 + " " + text;
		}

		private static string Join(string main, string loc)
		{
			if (loc.Length <= 0)
			{
				return main;
			}
			return main + " " + loc;
		}

		private static bool HasBuff(Entity e, int guid)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			if (((Entity)(ref e)).Equals(Entity.Null) || !e.Has<BuffBuffer>())
			{
				return false;
			}
			EntityManager entityManager = Core.EntityManager;
			DynamicBuffer<BuffBuffer> buffer = ((EntityManager)(ref entityManager)).GetBuffer<BuffBuffer>(e, false);
			for (int i = 0; i < buffer.Length; i++)
			{
				if (buffer[i].PrefabGuid._Value == guid)
				{
					return true;
				}
			}
			return false;
		}

		[HarmonyPrefix]
		private unsafe static void Prefix(BuffSystem_Spawn_Server __instance)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: 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_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: 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_00a0: 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_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: 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_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0369: Unknown result type (might be due to invalid IL or missing references)
			//IL_0370: Expected O, but got Unknown
			//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0302: Expected O, but got Unknown
			//IL_022c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0397: Unknown result type (might be due to invalid IL or missing references)
			//IL_0329: Unknown result type (might be due to invalid IL or missing references)
			//IL_0296: Unknown result type (might be due to invalid IL or missing references)
			//IL_0264: Unknown result type (might be due to invalid IL or missing references)
			if (!Core._hasInitialized)
			{
				return;
			}
			EntityQuery query = __instance._Query;
			NativeArray<Entity> val = ((EntityQuery)(ref query)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
			try
			{
				Enumerator<Entity> enumerator = val.GetEnumerator();
				FixedString512Bytes val3 = default(FixedString512Bytes);
				bool flag3 = default(bool);
				while (enumerator.MoveNext())
				{
					Entity current = enumerator.Current;
					try
					{
						if (current.Read<PrefabGUID>()._Value != -1939804277)
						{
							continue;
						}
						Entity owner = current.Read<EntityOwner>().Owner;
						if (((Entity)(ref owner)).Equals(Entity.Null) || !owner.Has<Imprisoned>() || !HasBuff(owner, -1988445418))
						{
							continue;
						}
						Entity target = current.Read<Buff>().Target;
						if (!target.Has<PlayerCharacter>())
						{
							continue;
						}
						Entity userEntity = target.Read<PlayerCharacter>().UserEntity;
						if (((Entity)(ref userEntity)).Equals(Entity.Null))
						{
							continue;
						}
						Entity prisonCellEntity = owner.Read<Imprisoned>().PrisonCellEntity;
						if (((Entity)(ref prisonCellEntity)).Equals(Entity.Null))
						{
							continue;
						}
						(Entity Cell, ExtraditionService.RoutingOutcome Outcome) tuple = Core.Extradition.FindBestCell(userEntity, owner, prisonCellEntity);
						Entity item = tuple.Cell;
						ExtraditionService.RoutingOutcome item2 = tuple.Outcome;
						bool flag = !((Entity)(ref item)).Equals(Entity.Null) && !((Entity)(ref item)).Equals(prisonCellEntity);
						bool flag2 = Core.Extradition.GetTargetTerritory(userEntity) >= 0;
						if (flag)
						{
							ExtraditionService.RedirectPrisoner(owner, prisonCellEntity, item);
						}
						if (userEntity.Has<User>())
						{
							User val2 = userEntity.Read<User>();
							((FixedString512Bytes)(ref val3))..ctor(item2 switch
							{
								ExtraditionService.RoutingOutcome.MarkedTerritory => Join(G("Prisoner routed to ") + M("your") + P(" marked territory"), CellLocation(item)), 
								ExtraditionService.RoutingOutcome.OwnCastle => flag2 ? Join(G("No room in ") + M("your") + P(" marked territory;") + G(" routed to ") + M("your") + G(" castle holding cell instead"), CellLocation(item, includeName: false)) : Join(G("Prisoner routed to ") + M("your") + G(" castle holding cell"), CellLocation(item, includeName: false)), 
								_ => flag2 ? Join(G("No room in ") + M("your") + G(" marked territory or castle; prisoner held"), CellLocation(prisonCellEntity)) : Join(G("No empty cell in ") + M("your") + G(" castle; prisoner held"), CellLocation(prisonCellEntity)), 
							});
							ServerChatUtils.SendSystemMessageToClient(Core.EntityManager, val2, ref val3);
						}
						object obj;
						if (!userEntity.Has<User>())
						{
							obj = "Unknown";
						}
						else
						{
							User val4 = userEntity.Read<User>();
							obj = ((object)(*(FixedString64Bytes*)(&val4.CharacterName))/*cast due to .constrained prefix*/).ToString();
						}
						string text = (string)obj;
						if (flag)
						{
							ManualLogSource log = Core.Log;
							BepInExInfoLogInterpolatedStringHandler val5 = new BepInExInfoLogInterpolatedStringHandler(36, 3, ref flag3);
							if (flag3)
							{
								((BepInExLogInterpolatedStringHandler)val5).AppendLiteral("[KinCaller] ");
								((BepInExLogInterpolatedStringHandler)val5).AppendFormatted<string>(text);
								((BepInExLogInterpolatedStringHandler)val5).AppendLiteral(" routed prisoner to ");
								((BepInExLogInterpolatedStringHandler)val5).AppendFormatted<string>(ExtraditionService.DescribeCellPlain(item));
								((BepInExLogInterpolatedStringHandler)val5).AppendLiteral(" [");
								((BepInExLogInterpolatedStringHandler)val5).AppendFormatted<ExtraditionService.RoutingOutcome>(item2);
								((BepInExLogInterpolatedStringHandler)val5).AppendLiteral("].");
							}
							log.LogInfo(val5);
						}
						else
						{
							ManualLogSource log2 = Core.Log;
							BepInExInfoLogInterpolatedStringHandler val5 = new BepInExInfoLogInterpolatedStringHandler(34, 3, ref flag3);
							if (flag3)
							{
								((BepInExLogInterpolatedStringHandler)val5).AppendLiteral("[KinCaller] ");
								((BepInExLogInterpolatedStringHandler)val5).AppendFormatted<string>(text);
								((BepInExLogInterpolatedStringHandler)val5).AppendLiteral(" left prisoner in ");
								((BepInExLogInterpolatedStringHandler)val5).AppendFormatted<string>(ExtraditionService.DescribeCellPlain(prisonCellEntity));
								((BepInExLogInterpolatedStringHandler)val5).AppendLiteral(" [");
								((BepInExLogInterpolatedStringHandler)val5).AppendFormatted<ExtraditionService.RoutingOutcome>(item2);
								((BepInExLogInterpolatedStringHandler)val5).AppendLiteral("].");
							}
							log2.LogInfo(val5);
						}
					}
					catch (Exception e)
					{
						Core.LogException(e, "Prefix");
					}
				}
			}
			finally
			{
				val.Dispose();
			}
		}
	}
	[HarmonyPatch(typeof(SpawnTeamSystem_OnPersistenceLoad), "OnUpdate")]
	public static class InitializationPatch
	{
		[HarmonyPostfix]
		public static void OneShot_AfterLoad_InitializationPatch()
		{
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Expected O, but got Unknown
			Core.InitializeAfterLoaded();
			try
			{
				MethodInfo method = typeof(SpawnTeamSystem_OnPersistenceLoad).GetMethod("OnUpdate", Type.EmptyTypes);
				MethodInfo method2 = typeof(InitializationPatch).GetMethod("OneShot_AfterLoad_InitializationPatch");
				if (method != null && method2 != null)
				{
					Plugin.Harmony.Unpatch((MethodBase)method, method2);
				}
				else
				{
					Core.Log.LogWarning((object)"[KinCaller] Could not resolve OnUpdate/OneShot for unpatch; patch will remain installed.");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource log = Core.Log;
				bool flag = default(bool);
				BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(51, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[KinCaller] Failed to unpatch InitializationPatch: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.Message);
				}
				log.LogError(val);
			}
		}
	}
	[HarmonyPatch(typeof(SetMapMarkerSystem), "OnUpdate")]
	internal static class SetMapMarkerSystemPatch
	{
		private const int DominateBuff = -1447419822;

		private static string P(string s)
		{
			return "<color=#9966CC>" + s + "</color>";
		}

		private static string G(string s)
		{
			return "<color=#A0A0A0>" + s + "</color>";
		}

		private static string M(string s)
		{
			return "<color=#E066C0>" + s + "</color>";
		}

		[HarmonyPrefix]
		private unsafe static void Prefix(SetMapMarkerSystem __instance)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: 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_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: 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_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: 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_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Expected O, but got Unknown
			//IL_0152: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			//IL_032c: Unknown result type (might be due to invalid IL or missing references)
			if (!Core._hasInitialized)
			{
				return;
			}
			EntityQuery query = __instance._Query;
			NativeArray<Entity> val = ((EntityQuery)(ref query)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
			try
			{
				Enumerator<Entity> enumerator = val.GetEnumerator();
				bool flag = default(bool);
				while (enumerator.MoveNext())
				{
					Entity current = enumerator.Current;
					try
					{
						FromCharacter val2 = current.Read<FromCharacter>();
						if (!HasDominateBuff(val2.Character))
						{
							continue;
						}
						Entity user = val2.User;
						if (!user.Has<User>())
						{
							continue;
						}
						User val3 = user.Read<User>();
						float2 position = current.Read<SetMapMarkerEvent>().Position;
						int territoryIndex = Core.CastleTerritory.GetTerritoryIndex(new float3(position.x, 0f, position.y));
						Entity heartForTerritory = Core.CastleTerritory.GetHeartForTerritory(territoryIndex);
						Entity heartOwnerFromHeart = ExtraditionService.GetHeartOwnerFromHeart(heartForTerritory);
						if (!((Entity)(ref heartForTerritory)).Equals(Entity.Null) && ExtraditionService.IsOwnerAllied(heartOwnerFromHeart, user) && Core.Extradition.GetTargetTerritory(user) != territoryIndex)
						{
							Core.Extradition.SetTargetTerritory(user, territoryIndex);
							ManualLogSource log = Core.Log;
							BepInExInfoLogInterpolatedStringHandler val4 = new BepInExInfoLogInterpolatedStringHandler(39, 2, ref flag);
							if (flag)
							{
								((BepInExLogInterpolatedStringHandler)val4).AppendLiteral("[KinCaller] ");
								((BepInExLogInterpolatedStringHandler)val4).AppendFormatted<FixedString64Bytes>(val3.CharacterName);
								((BepInExLogInterpolatedStringHandler)val4).AppendLiteral(" set DuskCaller target to ");
								((BepInExLogInterpolatedStringHandler)val4).AppendFormatted<string>(ExtraditionService.DescribeHeartPlain(heartForTerritory));
								((BepInExLogInterpolatedStringHandler)val4).AppendLiteral(".");
							}
							log.LogInfo(val4);
							int castleTerritoryIndex = ExtraditionService.GetCastleTerritoryIndex(heartForTerritory);
							string castleTerritoryRegionName = ExtraditionService.GetCastleTerritoryRegionName(heartForTerritory);
							bool num = heartOwnerFromHeart == user;
							object obj;
							if (!heartOwnerFromHeart.Has<User>())
							{
								obj = "";
							}
							else
							{
								User val5 = heartOwnerFromHeart.Read<User>();
								obj = ((object)(*(FixedString64Bytes*)(&val5.CharacterName))/*cast due to .constrained prefix*/).ToString();
							}
							string text = (string)obj;
							string text2 = (num ? (M("your") + G(" territory")) : ((text.Length > 0) ? (M(text) + G("'s territory")) : G("an allied territory")));
							string text3 = ((castleTerritoryIndex >= 0) ? (" " + ((castleTerritoryRegionName.Length > 0) ? (G("(Plot ") + P($"{castleTerritoryIndex}") + G(", " + castleTerritoryRegionName + ")")) : (G("(Plot ") + P($"{castleTerritoryIndex}") + G(")")))) : "");
							int num2 = Core.Extradition.CountEmptyCellsInTerritory(territoryIndex);
							string text4 = ((num2 > 0) ? (G(". ") + P($"{num2}") + G((num2 == 1) ? " empty holding cell." : " empty holding cells.")) : (G(". ") + P("0") + G(" empty holding cells. Prisoners will fall back to ") + M("your") + G(" nearest castle.")));
							Send(val3, P("DuskCaller target set ") + G("to ") + text2 + text3 + text4);
						}
					}
					catch (Exception e)
					{
						Core.LogException(e, "Prefix");
					}
				}
			}
			finally
			{
				val.Dispose();
			}
		}

		private static bool HasDominateBuff(Entity character)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			if (((Entity)(ref character)).Equals(Entity.Null) || !character.Has<BuffBuffer>())
			{
				return false;
			}
			EntityManager entityManager = Core.EntityManager;
			DynamicBuffer<BuffBuffer> buffer = ((EntityManager)(ref entityManager)).GetBuffer<BuffBuffer>(character, false);
			for (int i = 0; i < buffer.Length; i++)
			{
				if (buffer[i].PrefabGuid._Value == -1447419822)
				{
					return true;
				}
			}
			return false;
		}

		private static void Send(User user, string message)
		{
			//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_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)
			FixedString512Bytes val = FixedString512Bytes.op_Implicit(message);
			ServerChatUtils.SendSystemMessageToClient(Core.EntityManager, user, ref val);
		}
	}
}
namespace KinCaller.Commands
{
	[CommandGroup("caller", null)]
	internal class CallerCommands
	{
		private static string P(string s)
		{
			return "<color=#9966CC>" + s + "</color>";
		}

		private static string G(string s)
		{
			return "<color=#A0A0A0>" + s + "</color>";
		}

		private static string M(string s)
		{
			return "<color=#E066C0>" + s + "</color>";
		}

		private static bool NotReady(ChatCommandContext ctx)
		{
			if (Core.Extradition != null && Core.CastleTerritory != null)
			{
				return false;
			}
			ctx.Reply(G("Still starting up, please try again in a moment."));
			return true;
		}

		[Command("status", null, null, "Show your current extradition target territory.", null, false)]
		public unsafe static void Status(ChatCommandContext ctx)
		{
			//IL_000f: 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_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: 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_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			if (NotReady(ctx))
			{
				return;
			}
			Entity senderUserEntity = ctx.Event.SenderUserEntity;
			int targetTerritory = Core.Extradition.GetTargetTerritory(senderUserEntity);
			if (targetTerritory < 0)
			{
				ctx.Reply(G("No DuskCaller target set. Captures go to ") + M("your") + G(" own holding cells. While dominating, place a map marker on ") + M("your") + G(" own or an allied territory to route captures there instead."));
				return;
			}
			Entity heartForTerritory = Core.CastleTerritory.GetHeartForTerritory(targetTerritory);
			if (((Entity)(ref heartForTerritory)).Equals(Entity.Null))
			{
				ctx.Reply(G("Target territory: Plot ") + P($"{targetTerritory}") + G(". No castle there now. Prisoners will route to ") + M("your") + G(" nearest castle until you re-mark."));
				return;
			}
			Entity heartOwnerFromHeart = ExtraditionService.GetHeartOwnerFromHeart(heartForTerritory);
			if (!ExtraditionService.IsOwnerAllied(heartOwnerFromHeart, senderUserEntity))
			{
				ctx.Reply(G("Target territory: Plot ") + P($"{targetTerritory}") + G(". No longer ") + M("your") + G(" own or an allied castle. Prisoners will route to ") + M("your") + G(" nearest castle. Re-mark to update."));
				return;
			}
			bool num = heartOwnerFromHeart == senderUserEntity;
			object obj;
			if (!heartOwnerFromHeart.Has<User>())
			{
				obj = "Unknown";
			}
			else
			{
				User val = heartOwnerFromHeart.Read<User>();
				obj = ((object)(*(FixedString64Bytes*)(&val.CharacterName))/*cast due to .constrained prefix*/).ToString();
			}
			string s = (string)obj;
			string castleTerritoryRegionName = ExtraditionService.GetCastleTerritoryRegionName(heartForTerritory);
			string text = (num ? (M("your") + G(" territory")) : (M(s) + G("'s territory")));
			string text2 = ((castleTerritoryRegionName.Length > 0) ? (", " + castleTerritoryRegionName) : "");
			ctx.Reply(P("DuskCaller target: ") + text + " " + G("(Plot ") + P($"{targetTerritory}") + G(text2 + ")"));
			int num2 = Core.Extradition.CountEmptyCellsInTerritory(targetTerritory);
			ctx.Reply((num2 > 0) ? (G("Empty holding cells in that territory: ") + P($"{num2}")) : (G("Empty holding cells in that territory: ") + P("0") + G(". Prisoners will fall back to ") + M("your") + G(" nearest castle.")));
		}

		[Command("clear", null, null, "Clear your extradition target territory.", null, false)]
		public static void Clear(ChatCommandContext ctx)
		{
			//IL_000f: 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_001a: Unknown result type (might be due to invalid IL or missing references)
			if (!NotReady(ctx))
			{
				Entity senderUserEntity = ctx.Event.SenderUserEntity;
				if (Core.Extradition.ClearTarget(senderUserEntity))
				{
					ctx.Reply(P("DuskCaller target cleared.") + " " + G("Captures now go to ") + M("your") + G(" own holding cells."));
				}
				else
				{
					ctx.Reply(G("You have no DuskCaller target set."));
				}
			}
		}
	}
}