Decompiled source of DreadRifts v0.1.23

plugins/DreadRifts/DreadRifts.dll

Decompiled a month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Serialization;
using BepInEx;
using BepInEx.Configuration;
using DreadRifts.Core;
using DreadRifts.Runtime;
using HarmonyLib;
using Jotunn.Configs;
using Jotunn.Entities;
using Jotunn.Managers;
using Jotunn.Utils;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("Ketanol")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.1.23.0")]
[assembly: AssemblyInformationalVersion("0.1.23")]
[assembly: AssemblyProduct("DreadRifts")]
[assembly: AssemblyTitle("DreadRifts")]
[assembly: InternalsVisibleTo("DreadRifts.RuntimeProbe")]
[assembly: AssemblyVersion("0.1.23.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[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 DreadRifts
{
	[BepInPlugin("ketanol.dreadrifts", "DreadRifts", "0.1.23")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	public sealed class Plugin : BaseUnityPlugin
	{
		public const string Guid = "ketanol.dreadrifts";

		public const string Version = "0.1.23";

		public const string DisplayName = "DreadRifts";

		internal static Plugin Instance;

		internal RiftServer Server;

		internal RiftClient Client;

		internal RiftWire Wire;

		internal ConfigEntry<KeyboardShortcut> MenuKey;

		internal ConfigEntry<float> EffectsIntensity;

		private Harmony harmony;

		private void Awake()
		{
			//IL_0021: 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_006e: Expected O, but got Unknown
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Expected O, but got Unknown
			Instance = this;
			MenuKey = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Controls", "Expedition menu", new KeyboardShortcut((KeyCode)289, Array.Empty<KeyCode>()), "Open your current expedition. The gate also opens this menu.");
			EffectsIntensity = ((BaseUnityPlugin)this).Config.Bind<float>("Visuals", "Effects intensity", 1f, new ConfigDescription("Local particle density and light intensity for DreadRifts objects. Does not change combat or other world objects.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1.5f), Array.Empty<object>()));
			Wire = new RiftWire();
			Server = new RiftServer(this);
			Client = new RiftClient(this);
			PrefabManager.OnVanillaPrefabsAvailable += RiftAssets.Register;
			harmony = new Harmony("ketanol.dreadrifts");
			harmony.PatchAll(typeof(Plugin).Assembly);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"DreadRifts development build 0.1.23");
		}

		private void Update()
		{
			Client.TickUI();
			try
			{
				if (!Object.op_Implicit((Object)(object)ZNet.instance) || !Object.op_Implicit((Object)(object)ZNetScene.instance) || !Object.op_Implicit((Object)(object)ObjectDB.instance))
				{
					Server.Reset();
					Client.Reset();
					return;
				}
				if (ZNet.instance.IsServer())
				{
					Server.Tick();
				}
				FortressCargoRuntime.Tick();
				Client.Tick();
			}
			catch (Exception error)
			{
				Fail(error);
			}
		}

		internal void Fail(Exception error)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)RiftLocalization.Text(error.ToString()));
		}

		internal void LogInfo(string message)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)RiftLocalization.Text(message));
		}

		private void OnDisable()
		{
			Client?.Close();
		}

		private void OnDestroy()
		{
			PrefabManager.OnVanillaPrefabsAvailable -= RiftAssets.Register;
			Client?.Reset();
			Server?.Reset();
			Harmony obj = harmony;
			if (obj != null)
			{
				obj.UnpatchSelf();
			}
			Instance = null;
		}
	}
}
namespace DreadRifts.Runtime
{
	internal sealed class ArenaArchProfile
	{
		private readonly List<Vector3> left = new List<Vector3>();

		private readonly List<Vector3> right = new List<Vector3>();

		private static readonly Dictionary<int, ArenaArchProfile> profiles = new Dictionary<int, ArenaArchProfile>();

		internal float Height => left[left.Count - 1].y;

		internal Vector3 Center => (left[0] + right[0]) * 0.5f + Vector3.up * (Height * 0.45f);

		internal static ArenaArchProfile Fit(Transform frame, GameObject walls)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0213: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: 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_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			int key = Mathf.RoundToInt(frame.eulerAngles.y * 100f);
			if (profiles.TryGetValue(key, out var value))
			{
				return value;
			}
			ArenaArchProfile arenaArchProfile = new ArenaArchProfile();
			Collider[] array = walls.GetComponentsInChildren<Collider>().Where(delegate(Collider c)
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				//IL_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_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)
				if (c.enabled && !c.isTrigger)
				{
					Bounds bounds = c.bounds;
					return ((Bounds)(ref bounds)).SqrDistance(frame.position + Vector3.up * 3f) < 64f;
				}
				return false;
			}).ToArray();
			float num = 0f;
			Ray val = default(Ray);
			RaycastHit val2 = default(RaycastHit);
			for (int num2 = 0; num2 <= 76; num2++)
			{
				float num3 = 0.18f + (float)num2 * 0.1f;
				float num4 = 0f;
				float num5 = 0f;
				float num6 = -3.6f;
				bool flag = false;
				for (int num7 = 0; num7 <= 144; num7++)
				{
					float num8 = -3.6f + (float)num7 * 0.05f;
					((Ray)(ref val))..ctor(frame.TransformPoint(new Vector3(num8, num3, 3f)), -frame.forward);
					bool flag2 = num7 == 144;
					if (!flag2)
					{
						Collider[] array2 = array;
						for (int num9 = 0; num9 < array2.Length; num9++)
						{
							if (array2[num9].Raycast(val, ref val2, 3.08f))
							{
								flag2 = true;
								break;
							}
						}
					}
					if (!flag2 && !flag)
					{
						num6 = num8;
						flag = true;
					}
					if (flag2 && flag)
					{
						float num10 = num8 - 0.05f;
						if (num6 <= num + 0.4f && num10 >= num - 0.4f && num10 - num6 > num5 - num4)
						{
							num4 = num6;
							num5 = num10;
						}
						flag = false;
					}
				}
				if (num5 - num4 < 0.38f)
				{
					if (arenaArchProfile.left.Count != 0 || !(num3 < 1.2f))
					{
						break;
					}
				}
				else
				{
					arenaArchProfile.left.Add(new Vector3(num4 + 0.055f, num3, -0.06f));
					arenaArchProfile.right.Add(new Vector3(num5 - 0.055f, num3, -0.06f));
					num = (num4 + num5) * 0.5f;
				}
			}
			if (arenaArchProfile.left.Count >= 40 && arenaArchProfile.right.Last().x - arenaArchProfile.left.Last().x < 1.3f)
			{
				profiles[key] = arenaArchProfile;
				return arenaArchProfile;
			}
			arenaArchProfile.left.Clear();
			arenaArchProfile.right.Clear();
			for (int num11 = 0; num11 <= 64; num11++)
			{
				float num12 = 0.05f + (float)num11 * 7.7f / 64f;
				float num13 = Mathf.Clamp01((num12 - 3.7f) / 4.05f);
				float num14 = 3.55f * (1f - num13 * num13);
				arenaArchProfile.left.Add(new Vector3(0f - num14, num12, 0f));
				arenaArchProfile.right.Add(new Vector3(num14, num12, 0f));
			}
			return arenaArchProfile;
		}

		internal Vector3 Edge(float t, int side)
		{
			//IL_0036: 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_0048: Unknown result type (might be due to invalid IL or missing references)
			List<Vector3> list = ((side < 0) ? left : right);
			float num = Mathf.Clamp01(t) * (float)(list.Count - 1);
			int num2 = Mathf.Min((int)num, list.Count - 2);
			return Vector3.Lerp(list[num2], list[num2 + 1], num - (float)num2);
		}

		internal Vector3[] Outline(float inset)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: 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_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			List<Vector3> list = new List<Vector3>();
			for (int i = 0; i < left.Count; i++)
			{
				list.Add(left[i]);
			}
			for (int num = right.Count - 1; num >= 0; num--)
			{
				list.Add(right[num]);
			}
			for (int j = 0; j < list.Count; j++)
			{
				list[j] = Vector3.MoveTowards(list[j], Center, inset) + Vector3.forward * 0.02f;
			}
			return list.ToArray();
		}

		internal Mesh Veil()
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//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_006f: 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_009d: 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_00b4: 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_00e2: 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_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_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Expected O, but got Unknown
			Vector3[] array = (Vector3[])(object)new Vector3[left.Count * 2];
			Vector2[] array2 = (Vector2[])(object)new Vector2[array.Length];
			int[] array3 = new int[(left.Count - 1) * 6];
			for (int i = 0; i < left.Count; i++)
			{
				array[i * 2] = left[i];
				array[i * 2 + 1] = right[i];
				array2[i * 2] = new Vector2(left[i].x / 6f + 0.5f, left[i].y / Height);
				array2[i * 2 + 1] = new Vector2(right[i].x / 6f + 0.5f, right[i].y / Height);
				if (i != left.Count - 1)
				{
					int num = i * 6;
					int num2 = (array3[num] = i * 2);
					array3[num + 1] = num2 + 1;
					array3[num + 2] = num2 + 2;
					array3[num + 3] = num2 + 1;
					array3[num + 4] = num2 + 3;
					array3[num + 5] = num2 + 2;
				}
			}
			Mesh val = new Mesh
			{
				name = "DreadRifts fitted arch veil",
				vertices = array,
				uv = array2,
				triangles = array3
			};
			val.RecalculateBounds();
			return val;
		}
	}
	internal sealed class ArenaBallistaMounts : MonoBehaviour
	{
		internal readonly Vector3[] Points = (Vector3[])(object)new Vector3[6];

		internal readonly Quaternion[] Rotations = (Quaternion[])(object)new Quaternion[6];

		private readonly List<Material> materials = new List<Material>();

		private static readonly float[] angles = new float[6] { -123.75f, -78.75f, -33.75f, 123.75f, 78.75f, 33.75f };

		internal static ArenaBallistaMounts Create(ArenaRuntime arena)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: 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_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_0207: Unknown result type (might be due to invalid IL or missing references)
			//IL_021d: Unknown result type (might be due to invalid IL or missing references)
			//IL_023f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_02da: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e6: Expected O, but got Unknown
			GameObject val = new GameObject("DreadRifts six ballista platforms");
			val.transform.SetParent(arena.Geometry.Root.transform, false);
			ArenaBallistaMounts arenaBallistaMounts = val.AddComponent<ArenaBallistaMounts>();
			Vector3 val2 = default(Vector3);
			for (int i = 0; i < 6; i++)
			{
				float num = angles[i] * ((float)Math.PI / 180f);
				((Vector3)(ref val2))..ctor(Mathf.Sin(num), 0f, 0f - Mathf.Cos(num));
				Vector3 wall = arena.Geometry.GroundOrigin + val2 * 29f;
				float num2 = (from h in Physics.RaycastAll(wall + Vector3.up * 24f, Vector3.down, 23f, -1, (QueryTriggerInteraction)1)
					where ((Component)((RaycastHit)(ref h)).collider).transform.IsChildOf(arena.Geometry.Root.transform) && ((RaycastHit)(ref h)).normal.y > 0.7f && ((RaycastHit)(ref h)).point.y > wall.y + 7f && ((RaycastHit)(ref h)).point.y < wall.y + 15f
					select ((RaycastHit)(ref h)).point.y).DefaultIfEmpty(wall.y + 10f).Max();
				Quaternion val3 = Quaternion.LookRotation(-val2, Vector3.up);
				Vector3 val4 = new Vector3(wall.x, num2, wall.z) - val2 * 1.3f;
				arenaBallistaMounts.Points[i] = val4 + Vector3.up * 0.18f;
				arenaBallistaMounts.Rotations[i] = val3;
				GameObject deck = GameObject.CreatePrimitive((PrimitiveType)3);
				((Object)deck).name = "DreadRifts ballista mount " + (i + 1);
				deck.transform.SetParent(val.transform, false);
				deck.transform.position = val4 - Vector3.up * 0.2f;
				deck.transform.rotation = val3;
				deck.transform.localScale = new Vector3(3.2f, 0.4f, 3.4f);
				deck.layer = LayerMask.NameToLayer("piece");
				if (!GUIManager.IsHeadless())
				{
					MeshRenderer val5 = ((IEnumerable<MeshRenderer>)arena.Geometry.Root.GetComponentsInChildren<MeshRenderer>()).FirstOrDefault((Func<MeshRenderer, bool>)((MeshRenderer r) => (Object)(object)r != (Object)(object)deck.GetComponent<MeshRenderer>() && Object.op_Implicit((Object)(object)((Renderer)r).sharedMaterial) && ((Renderer)r).sharedMaterial.HasProperty("_MainTex")));
					if (Object.op_Implicit((Object)(object)val5))
					{
						((Renderer)deck.GetComponent<MeshRenderer>()).sharedMaterial = ((Renderer)val5).sharedMaterial;
						continue;
					}
					Material val6 = new Material(Shader.Find("Standard"))
					{
						color = new Color(0.22f, 0.24f, 0.26f)
					};
					arenaBallistaMounts.materials.Add(val6);
					((Renderer)deck.GetComponent<MeshRenderer>()).sharedMaterial = val6;
				}
			}
			return arenaBallistaMounts;
		}

		private void OnDestroy()
		{
			foreach (Material material in materials)
			{
				if (Object.op_Implicit((Object)(object)material))
				{
					Object.Destroy((Object)(object)material);
				}
			}
		}
	}
	internal sealed class ArenaBallista : MonoBehaviour
	{
		[HarmonyPatch(typeof(Turret), "Awake")]
		private static class Attach
		{
			private static void Postfix(Turret __instance)
			{
				ZNetView component = ((Component)__instance).GetComponent<ZNetView>();
				if (Object.op_Implicit((Object)(object)component) && component.IsValid() && component.GetZDO().GetString("dr_ballista_run", "").Length != 0)
				{
					(((Component)__instance).GetComponent<ArenaBallista>() ?? ((Component)__instance).gameObject.AddComponent<ArenaBallista>()).Configure();
				}
			}
		}

		[HarmonyPatch(typeof(Turret), "FixedUpdate")]
		private static class CombatOnly
		{
			private static bool Prefix(Turret __instance)
			{
				//IL_007b: Unknown result type (might be due to invalid IL or missing references)
				ArenaBallista component = ((Component)__instance).GetComponent<ArenaBallista>();
				if (!Object.op_Implicit((Object)(object)component))
				{
					return true;
				}
				if (component.Active && Object.op_Implicit((Object)(object)__instance.m_defaultAmmo))
				{
					return true;
				}
				if (Object.op_Implicit((Object)(object)component.view) && component.view.IsValid() && component.view.IsOwner() && Object.op_Implicit((Object)(object)component.target))
				{
					component.target = null;
					component.view.InvokeRPC(ZNetView.Everybody, "RPC_SetTarget", new object[1] { ZDOID.None });
				}
				return false;
			}
		}

		[HarmonyPatch(typeof(Turret), "UpdateTarget")]
		private static class ArenaTargets
		{
			private static bool Prefix(Turret __instance)
			{
				ArenaBallista component = ((Component)__instance).GetComponent<ArenaBallista>();
				if (!Object.op_Implicit((Object)(object)component))
				{
					return true;
				}
				component.Scan();
				return false;
			}
		}

		[HarmonyPatch(typeof(Turret), "UseItem")]
		private static class NoManualAmmo
		{
			private static bool Prefix(Turret __instance, ref bool __result)
			{
				if (!Object.op_Implicit((Object)(object)((Component)__instance).GetComponent<ArenaBallista>()))
				{
					return true;
				}
				__result = false;
				return false;
			}
		}

		[HarmonyPatch(typeof(Turret), "GetHoverText")]
		private static class Hover
		{
			private static bool Prefix(Turret __instance, ref string __result)
			{
				if (!Object.op_Implicit((Object)(object)((Component)__instance).GetComponent<ArenaBallista>()))
				{
					return true;
				}
				__result = RiftLocalization.Text("⟦dr_ballista⟧\n⟦dr_ballista_danger⟧");
				return false;
			}
		}

		[HarmonyPatch(typeof(WearNTear), "Damage")]
		private static class NoDamage
		{
			private static bool Prefix(WearNTear __instance)
			{
				return !Object.op_Implicit((Object)(object)((Component)__instance).GetComponent<ArenaBallista>());
			}
		}

		[HarmonyPatch(typeof(WearNTear), "UpdateWear")]
		private static class NoStructuralWear
		{
			private static bool Prefix(WearNTear __instance)
			{
				return !Object.op_Implicit((Object)(object)((Component)__instance).GetComponent<ArenaBallista>());
			}
		}

		[HarmonyPatch(typeof(Turret), "ShootProjectile")]
		private static class Shot
		{
			private static bool Prefix(Turret __instance, out ArenaBallista __state)
			{
				__state = firing;
				ArenaBallista component = ((Component)__instance).GetComponent<ArenaBallista>();
				if (Object.op_Implicit((Object)(object)component) && (!component.Active || !IsEnemy(component.target, component.view.GetZDO().GetString("dr_ballista_run", ""))))
				{
					return false;
				}
				firing = component;
				return true;
			}

			private static Exception Finalizer(Exception __exception, ArenaBallista __state)
			{
				firing = __state;
				return __exception;
			}
		}

		[HarmonyPatch(typeof(Projectile), "Setup")]
		private static class ArenaBoltSetup
		{
			private static void Postfix(Projectile __instance)
			{
				if (Object.op_Implicit((Object)(object)firing))
				{
					__instance.m_hitFriendly = false;
					__instance.m_noDamageFriendly = false;
					__instance.m_aoe = 0f;
					__instance.m_respawnItemOnHit = false;
					__instance.m_spawnItem = null;
					ArenaBallistaBolt.Attach(__instance, firing.view.GetZDO().GetString("dr_ballista_run", ""), firing.view.GetZDO().GetString("dr_ballista_arena", ""));
				}
			}
		}

		internal const string RunKey = "dr_ballista_run";

		internal const string ArenaKey = "dr_ballista_arena";

		private static readonly int targetMask = LayerMask.GetMask(new string[9] { "Default", "static_solid", "Default_small", "piece", "terrain", "character", "character_net", "character_ghost", "vehicle" });

		private ZNetView view;

		private Turret turret;

		private float nextScan;

		private Character target;

		[ThreadStatic]
		private static ArenaBallista firing;

		private RunState State
		{
			get
			{
				RunState runState = Plugin.Instance.Server.FindRun(view.GetZDO().GetString("dr_ballista_run", ""));
				if (runState == null)
				{
					if (!(Plugin.Instance.Client.Run?.Id == view.GetZDO().GetString("dr_ballista_run", "")))
					{
						return null;
					}
					runState = Plugin.Instance.Client.Run;
				}
				return runState;
			}
		}

		private bool Active
		{
			get
			{
				if (!Object.op_Implicit((Object)(object)view) || !view.IsValid() || !Object.op_Implicit((Object)(object)Plugin.Instance))
				{
					return false;
				}
				RunState state = State;
				if (view.GetZDO().GetBool("dr_ballista_active", false) && state != null && state.Phase == RunPhase.Combat && state.HasCheckpoint)
				{
					return state.ArenaId == view.GetZDO().GetString("dr_ballista_arena", "");
				}
				return false;
			}
		}

		internal static GameObject NativePrefab()
		{
			if (!Object.op_Implicit((Object)(object)ZNetScene.instance))
			{
				return null;
			}
			GameObject prefab = ZNetScene.instance.GetPrefab("piece_turret");
			if (!Object.op_Implicit((Object)(object)prefab) || !Object.op_Implicit((Object)(object)prefab.GetComponent<Turret>()))
			{
				return null;
			}
			return prefab;
		}

		private void Awake()
		{
			view = ((Component)this).GetComponent<ZNetView>();
			turret = ((Component)this).GetComponent<Turret>();
		}

		private bool Inside(Vector3 point)
		{
			//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_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_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: 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_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)
			Vector3 vec = view.GetZDO().GetVec3("dr_ballista_origin", Vector3.zero);
			if (point.y >= vec.y - 3f && point.y <= vec.y + 45f)
			{
				Vector2 val = new Vector2(point.x - vec.x, point.z - vec.z);
				return ((Vector2)(ref val)).sqrMagnitude <= 961f;
			}
			return false;
		}

		private void Configure()
		{
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			turret.m_name = "⟦dr_ballista⟧";
			turret.m_targetPlayers = (turret.m_targetTamed = false);
			turret.m_targetEnemies = true;
			turret.m_maxAmmo = 0;
			turret.m_returnAmmoOnDestroy = false;
			turret.m_horizontalAngle = 85f;
			turret.m_verticalAngle = 80f;
			turret.m_viewDistance = 65f;
			turret.m_attackCooldown = 4f;
			turret.m_turnRate = 80f;
			GameObject prefab = ZNetScene.instance.GetPrefab("TurretBoltWood");
			if (Object.op_Implicit((Object)(object)prefab))
			{
				turret.m_defaultAmmo = prefab.GetComponent<ItemDrop>();
			}
			else if (turret.m_allowedAmmo.Count > 0)
			{
				turret.m_defaultAmmo = turret.m_allowedAmmo[0].m_ammo;
			}
			Piece component = ((Component)this).GetComponent<Piece>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.m_canBeRemoved = false;
			}
			WearNTear component2 = ((Component)this).GetComponent<WearNTear>();
			if (Object.op_Implicit((Object)(object)component2))
			{
				((Behaviour)component2).enabled = false;
			}
		}

		internal static bool IsEnemy(Character character, string runId)
		{
			if (!Object.op_Implicit((Object)(object)character) || character.IsPlayer() || character.IsTamed() || character.IsDead())
			{
				return false;
			}
			RiftActor component = ((Component)character).GetComponent<RiftActor>();
			if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.View) && component.View.IsValid())
			{
				return component.RunId == runId;
			}
			return false;
		}

		private void Scan()
		{
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: 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_00eb: 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_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: 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_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			if (!view.IsOwner() || Time.time < nextScan)
			{
				return;
			}
			nextScan = Time.time + 0.7f;
			Character val = null;
			Vector3 eye = turret.m_eye.transform.position;
			foreach (Character candidate in (from c in Character.GetAllCharacters()
				where IsEnemy(c, view.GetZDO().GetString("dr_ballista_run", "")) && Inside(((Component)c).transform.position)
				select c).OrderBy(delegate(Character c)
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				Vector3 val4 = ((Component)c).transform.position - eye;
				return ((Vector3)(ref val4)).sqrMagnitude;
			}))
			{
				Vector3 val2 = candidate.GetCenterPoint() - eye;
				Vector3 val3 = val2;
				val3.y = 0f;
				if (!(Vector3.Angle(((Component)this).transform.forward, val3) > turret.m_horizontalAngle) && !Physics.RaycastAll(eye, ((Vector3)(ref val2)).normalized, ((Vector3)(ref val2)).magnitude, targetMask, (QueryTriggerInteraction)1).Any((RaycastHit h) => !((Component)((RaycastHit)(ref h)).collider).transform.IsChildOf(((Component)this).transform) && (Object)(object)((Component)((RaycastHit)(ref h)).collider).GetComponentInParent<Character>() != (Object)(object)candidate))
				{
					val = candidate;
					break;
				}
			}
			if ((Object)(object)val != (Object)(object)target)
			{
				target = val;
				view.InvokeRPC(ZNetView.Everybody, "RPC_SetTarget", new object[1] { Object.op_Implicit((Object)(object)target) ? target.GetZDOID() : ZDOID.None });
			}
		}
	}
	internal sealed class ArenaBallistaBolt : MonoBehaviour
	{
		[HarmonyPatch(typeof(Projectile), "IsValidTarget")]
		private static class ProtectAllies
		{
			[HarmonyPriority(0)]
			private static void Postfix(Projectile __instance, IDestructible destr, ref bool __result)
			{
				ArenaBallistaBolt arenaBallistaBolt = Resolve(__instance);
				if (!Object.op_Implicit((Object)(object)arenaBallistaBolt))
				{
					return;
				}
				int num;
				if (__result && arenaBallistaBolt.CombatActive)
				{
					Character val = (Character)(object)((destr is Character) ? destr : null);
					if (val != null)
					{
						num = (ArenaBallista.IsEnemy(val, arenaBallistaBolt.runId) ? 1 : 0);
						goto IL_0036;
					}
				}
				num = 0;
				goto IL_0036;
				IL_0036:
				__result = (byte)num != 0;
			}
		}

		[HarmonyPatch(typeof(Projectile), "Awake")]
		private static class RestoreIdentity
		{
			private static void Postfix(Projectile __instance)
			{
				Resolve(__instance);
			}
		}

		private const string RunKey = "dr_bolt_run";

		private const string ArenaKey = "dr_bolt_arena";

		private string runId;

		private string arenaId;

		private Projectile projectile;

		private bool CombatActive
		{
			get
			{
				if (!Object.op_Implicit((Object)(object)Plugin.Instance))
				{
					return false;
				}
				RunState runState = Plugin.Instance.Server.FindRun(runId) ?? ((Plugin.Instance.Client.Run?.Id == runId) ? Plugin.Instance.Client.Run : null);
				if (runState != null && runState.Phase == RunPhase.Combat && runState.HasCheckpoint)
				{
					return runState.ArenaId == arenaId;
				}
				return false;
			}
		}

		internal static void Attach(Projectile shot, string run, string arena)
		{
			ArenaBallistaBolt obj = ((Component)shot).GetComponent<ArenaBallistaBolt>() ?? ((Component)shot).gameObject.AddComponent<ArenaBallistaBolt>();
			obj.runId = run;
			obj.arenaId = arena;
			obj.projectile = shot;
			ZNetView component = ((Component)shot).GetComponent<ZNetView>();
			if (Object.op_Implicit((Object)(object)component) && component.IsValid() && component.IsOwner())
			{
				component.GetZDO().Set("dr_bolt_run", run);
				component.GetZDO().Set("dr_bolt_arena", arena);
			}
		}

		private static ArenaBallistaBolt Resolve(Projectile shot)
		{
			ArenaBallistaBolt component = ((Component)shot).GetComponent<ArenaBallistaBolt>();
			if (Object.op_Implicit((Object)(object)component))
			{
				return component;
			}
			ZNetView component2 = ((Component)shot).GetComponent<ZNetView>();
			if (!Object.op_Implicit((Object)(object)component2) || !component2.IsValid() || component2.GetZDO().GetString("dr_bolt_run", "").Length == 0)
			{
				return null;
			}
			Attach(shot, component2.GetZDO().GetString("dr_bolt_run", ""), component2.GetZDO().GetString("dr_bolt_arena", ""));
			return ((Component)shot).GetComponent<ArenaBallistaBolt>();
		}

		private void FixedUpdate()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)projectile) && !CombatActive)
			{
				projectile.m_damage = default(DamageTypes);
				ZNetView component = ((Component)this).GetComponent<ZNetView>();
				if (Object.op_Implicit((Object)(object)component) && component.IsValid() && component.IsOwner())
				{
					ZNetScene.instance.Destroy(((Component)this).gameObject);
				}
			}
		}
	}
	internal sealed class RiftServer
	{
		private sealed class RevivePulse
		{
			internal string Run;

			internal long Target;

			internal long Serial;

			internal long Started;

			internal long Last;
		}

		[HarmonyPatch(typeof(WearNTear), "UpdateWear")]
		private static class PreserveFurnitureDuringRecovery
		{
			private static bool Prefix(WearNTear __instance)
			{
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				if (Object.op_Implicit((Object)(object)Plugin.Instance) && Object.op_Implicit((Object)(object)ZNetScene.instance))
				{
					return !Plugin.Instance.Server.WaitingForFortressSupport(((Component)__instance).transform.position);
				}
				return true;
			}
		}

		private sealed class LootIndex
		{
			internal RunState Run;

			internal readonly Dictionary<string, ArenaLootEntry> Entries = new Dictionary<string, ArenaLootEntry>();

			internal readonly List<ArenaLootEntry> Pending = new List<ArenaLootEntry>();
		}

		private sealed class CirclePulse
		{
			public string Token;

			public long At;

			public bool Eligible;
		}

		private sealed class StackPass
		{
			internal RunState Run;

			internal Queue<BankEntry> Pending;

			internal readonly Dictionary<string, BankEntry> Targets = new Dictionary<string, BankEntry>();

			internal int Count;
		}

		private float nextBallistaTick;

		private readonly List<ZDO> ballistaObjects = new List<ZDO>();

		private readonly Dictionary<string, ShopQuote> shopQuotes = new Dictionary<string, ShopQuote>();

		private readonly Dictionary<long, RevivePulse> revivePulses = new Dictionary<long, RevivePulse>();

		private readonly Dictionary<string, long> battleHitReceipts = new Dictionary<string, long>();

		private float nextEquipmentReward;

		private readonly Dictionary<string, float> rewardRetryAt = new Dictionary<string, float>();

		private readonly Dictionary<string, long> healingCooldown = new Dictionary<string, long>();

		private float nextFortress;

		private int fortressTurn;

		private readonly Dictionary<string, int> fortressTerrainSteps = new Dictionary<string, int>();

		private readonly List<ZDO> fortressNearby = new List<ZDO>();

		private readonly Dictionary<string, float> fortressNotices = new Dictionary<string, float>();

		private readonly Dictionary<string, float> fortressErrors = new Dictionary<string, float>();

		private float nextLootTick;

		private readonly List<ZDO> nearbyLootObjects = new List<ZDO>();

		private readonly Dictionary<string, LootIndex> lootIndexes = new Dictionary<string, LootIndex>();

		private readonly Dictionary<string, CirclePulse> circlePulses = new Dictionary<string, CirclePulse>();

		private readonly Dictionary<string, PartyCircle> partyCircles = new Dictionary<string, PartyCircle>();

		private float nextCircleTick;

		private float lastPortalTick;

		private readonly Plugin plugin;

		private WorldState world;

		private AtomicStore<WorldState> store;

		private string fault = "";

		private float nextTick;

		private int arenaSearchTurn;

		private readonly Dictionary<long, long> sessions = new Dictionary<long, long>();

		private readonly Dictionary<long, Vector3> observedPositions = new Dictionary<long, Vector3>();

		private readonly Dictionary<string, long> altarHits = new Dictionary<string, long>();

		private readonly Dictionary<string, BiomeArenaSearch> arenaSearches = new Dictionary<string, BiomeArenaSearch>();

		private readonly Dictionary<string, int> arenaSearchRetries = new Dictionary<string, int>();

		private readonly HashSet<string> arenaMigrations = new HashSet<string>();

		private readonly Dictionary<string, StackPass> stackPasses = new Dictionary<string, StackPass>();

		private float nextStackPass;

		private Task warehouseSave;

		private WorldState savingWorld;

		private Action warehouseSaved;

		private readonly Queue<KeyValuePair<long, RiftRequest>> deferredRequests = new Queue<KeyValuePair<long, RiftRequest>>();

		private bool worldDirty;

		private int operationDepth;

		private readonly List<Action> durableActions = new List<Action>();

		private void TickBallistas()
		{
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_024d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0269: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
			if (Time.unscaledTime < nextBallistaTick || !Object.op_Implicit((Object)(object)ZNetScene.instance))
			{
				return;
			}
			nextBallistaTick = Time.unscaledTime + 0.5f;
			RunState[] source = world.Runs.Where((RunState r) => r.HasCheckpoint && r.Members.Any((Member m) => m.Present && m.Connected)).ToArray();
			HashSet<string> hashSet = new HashSet<string>();
			for (int num = ballistaObjects.Count - 1; num >= 0; num--)
			{
				ZDO zdo = ballistaObjects[num];
				if (ZDOMan.instance.GetZDO(zdo.m_uid) != zdo || zdo.GetString("dr_ballista_run", "").Length == 0)
				{
					ballistaObjects.RemoveAt(num);
				}
				else
				{
					RunState runState = source.FirstOrDefault((RunState r) => r.Id == zdo.GetString("dr_ballista_run", "") && r.ArenaId == zdo.GetString("dr_ballista_arena", ""));
					int slot = zdo.GetInt("dr_ballista_slot", -1);
					string item = runState?.Id + ":" + slot;
					if (runState == null || !ArenaUpgrades.Installed(runState, slot) || !hashSet.Add(item))
					{
						RemoveNetworkObject(zdo);
						ballistaObjects.RemoveAt(num);
					}
					else
					{
						zdo.Set("dr_ballista_active", runState.Phase == RunPhase.Combat);
					}
				}
			}
			foreach (RunState item2 in source.Where((RunState r) => r.BallistaMask != 0))
			{
				ArenaRuntime arenaRuntime = ArenaRuntime.Find(item2.Id, RiftWire.Vec(item2.Checkpoint));
				if (arenaRuntime == null || arenaRuntime.Id != item2.ArenaId || !Object.op_Implicit((Object)(object)ArenaBallista.NativePrefab()))
				{
					continue;
				}
				for (int num2 = 0; num2 < 6; num2++)
				{
					if (ArenaUpgrades.Installed(item2, num2) && !hashSet.Contains(item2.Id + ":" + num2))
					{
						ZDO val = CreateNetworkObject(((Object)ArenaBallista.NativePrefab()).name, arenaRuntime.BallistaMounts.Points[num2]);
						val.SetRotation(arenaRuntime.BallistaMounts.Rotations[num2]);
						val.Set("dr_ballista_run", item2.Id);
						val.Set("dr_ballista_arena", item2.ArenaId);
						val.Set("dr_ballista_slot", num2);
						val.Set("dr_ballista_origin", arenaRuntime.Geometry.GroundOrigin);
						val.Set("dr_ballista_active", item2.Phase == RunPhase.Combat);
						val.SetOwner(0L);
						ballistaObjects.Add(val);
					}
				}
			}
		}

		private void QuoteShop(long sender, RunState run, Member own, RiftRequest request)
		{
			RequireArch(sender, run, own, "shop");
			int num = ArenaShop.Price(request.EntryId);
			int num2 = ArenaShop.Value(request.Encounter);
			Expedition.Require(num > 0 && num2 > 0, "⟦dr_shop_unavailable⟧");
			ShopQuote quote = new ShopQuote
			{
				Id = Guid.NewGuid().ToString("N"),
				Run = run.Id,
				Player = own.PlayerId,
				Product = request.EntryId,
				Currency = request.Encounter,
				Price = num,
				Quantity = (num + num2 - 1) / num2,
				Expires = RiftWire.Now + 60000,
				Stage = Enumerable.Range(0, StageCatalog.Stages.Length).Where(WorldBoss).DefaultIfEmpty(0)
					.Max()
			};
			quote.Change = quote.Quantity * num2 - num;
			if (quote.Currency != "Coins")
			{
				Expedition.Require(!run.WarehouseLocked, Expedition.WarehouseLockMessage(run));
				Expedition.Require(run.Warehouse.Where((BankEntry e) => e.ReservedBy.Length == 0 && e.Item.Prefab == quote.Currency).Sum((Func<BankEntry, long>)((BankEntry e) => e.Item.Quantity)) >= quote.Quantity, "⟦dr_shop_resources_missing⟧");
			}
			string[] array = (from p in shopQuotes
				where p.Value.Expires < RiftWire.Now || p.Value.Player == own.PlayerId
				select p.Key).ToArray();
			foreach (string key in array)
			{
				shopQuotes.Remove(key);
			}
			shopQuotes[quote.Id] = quote;
			RiftReply riftReply = View(run, own.PlayerId, "shop_quote");
			riftReply.Id = request.Id;
			riftReply.ShopQuote = quote;
			plugin.Wire.Reply(sender, riftReply);
		}

		private void BuyShop(long sender, RunState run, Member own, RiftRequest request)
		{
			Transfer transfer = run.Transfers.FirstOrDefault((Transfer t) => t.Id == request.Id);
			if (transfer != null)
			{
				Expedition.Require(transfer.PlayerId == own.PlayerId && transfer.Kind == TransferKind.Shop, "⟦dr_upgrade_invalid⟧");
				ReplyTransfer(sender, run, own.PlayerId, transfer);
				return;
			}
			if (run.ShopReceipts.Any((ShopReceipt r) => r.Id == request.Id && r.Player == own.PlayerId))
			{
				plugin.Wire.Reply(sender, View(run, own.PlayerId, "shop_bought"));
				return;
			}
			RequireArch(sender, run, own, "shop");
			Expedition.Require(shopQuotes.TryGetValue(request.Id, out var quote) && quote.Run == run.Id && quote.Player == own.PlayerId && quote.Expires >= RiftWire.Now, "⟦dr_shop_quote_expired⟧");
			Expedition.Require(!HasPending(run, own.PlayerId), "⟦dr_text_197⟧");
			if (quote.Currency != "Coins")
			{
				Expedition.Require(!run.WarehouseLocked, Expedition.WarehouseLockMessage(run));
			}
			List<KeyValuePair<BankEntry, ItemPayload>> list = new List<KeyValuePair<BankEntry, ItemPayload>>();
			if (quote.Currency != "Coins")
			{
				int num = quote.Quantity;
				foreach (BankEntry item in run.Warehouse.Where((BankEntry e) => e.ReservedBy.Length == 0 && e.Item.Prefab == quote.Currency))
				{
					int num2 = Math.Min(num, item.Item.Quantity);
					if (num2 == 0)
					{
						break;
					}
					ItemPayload value = ((num2 == item.Item.Quantity) ? null : NativeItems.EncodeAmount(NativeItems.Decode(item.Item), item.Item.Quantity - num2));
					list.Add(new KeyValuePair<BankEntry, ItemPayload>(item, value));
					num -= num2;
				}
				Expedition.Require(num == 0, "⟦dr_shop_resources_missing⟧");
			}
			ItemPayload itemPayload = ((quote.Product == "fortress") ? FortressAssets.Blueprint(own.PlayerId, run.Id, quote.Id) : EpicEquipmentRewards.ShopItem(quote.Stage, quote.Product));
			if (quote.Currency == "Coins")
			{
				Transfer transfer2 = new Transfer
				{
					Id = quote.Id,
					PlayerId = own.PlayerId,
					Kind = TransferKind.Shop,
					ShopProduct = quote.Product,
					PurchasedItem = itemPayload,
					CreatedAtMs = RiftWire.Now,
					Item = new ItemPayload
					{
						Prefab = "Coins",
						Quantity = quote.Price
					}
				};
				run.Transfers.Add(transfer2);
				SaveWarehouseTransfer(sender, run, own.PlayerId, transfer2);
				return;
			}
			ItemPayload itemPayload2 = null;
			if (quote.Change > 0)
			{
				GameObject itemPrefab = ObjectDB.instance.GetItemPrefab("Coins");
				ItemData obj = itemPrefab.GetComponent<ItemDrop>().m_itemData.Clone();
				obj.m_dropPrefab = itemPrefab;
				obj.m_stack = quote.Change;
				itemPayload2 = NativeItems.Encode(obj);
			}
			foreach (KeyValuePair<BankEntry, ItemPayload> item2 in list)
			{
				if (item2.Value == null)
				{
					run.Warehouse.Remove(item2.Key);
				}
				else
				{
					item2.Key.Item = item2.Value;
				}
			}
			if (itemPayload2 != null)
			{
				run.Warehouse.Add(new BankEntry
				{
					Id = "change:" + quote.Id,
					DepositedBy = own.PlayerId,
					Item = itemPayload2
				});
			}
			ArenaShop.Credit(run, own.PlayerId, quote.Id, quote.Product, itemPayload);
			SaveWarehouseData(delegate
			{
				plugin.Wire.Reply(sender, View(run, own.PlayerId, "shop_bought"));
			});
		}

		private void ReceiveRevive(long sender, RunState run, Member own, RiftRequest request)
		{
			Member member = run.Members.FirstOrDefault((Member m) => m.PlayerId == request.TargetPlayer);
			if (!request.Flag || !CanRevive(sender, run, own, member) || member.DeathSerial != request.Serial)
			{
				revivePulses.Remove(own.PlayerId);
				return;
			}
			long now = RiftWire.Now;
			if (!revivePulses.TryGetValue(own.PlayerId, out var value) || value.Run != run.Id || value.Target != member.PlayerId || value.Serial != member.DeathSerial || now - value.Last > 700)
			{
				Dictionary<long, RevivePulse> dictionary = revivePulses;
				long playerId = own.PlayerId;
				RevivePulse obj = new RevivePulse
				{
					Run = run.Id,
					Target = member.PlayerId,
					Serial = member.DeathSerial,
					Started = now
				};
				value = obj;
				dictionary[playerId] = obj;
			}
			value.Last = now;
		}

		private bool CanRevive(long sender, RunState run, Member own, Member target)
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			if (run.Phase != RunPhase.Combat || own == null || own.Dead || !own.Present || !own.Connected || target == null || target == own || !target.Dead || !target.Present || !target.Connected || target.DeathPosition == null || target.RespawnAtMs <= RiftWire.Now)
			{
				return false;
			}
			Vector3 val = PlayerPosition(sender);
			Vector3 val2 = RiftWire.Vec(target.DeathPosition);
			if (Vector3.Distance(val, val2) > 3.5f)
			{
				return false;
			}
			return !Physics.Linecast(val + Vector3.up, val2 + Vector3.up, LayerMask.GetMask(new string[3] { "terrain", "piece", "static_solid" }), (QueryTriggerInteraction)1);
		}

		private void TickRevives()
		{
			KeyValuePair<long, RevivePulse>[] array = revivePulses.ToArray();
			for (int i = 0; i < array.Length; i++)
			{
				KeyValuePair<long, RevivePulse> entry = array[i];
				RevivePulse pulse = entry.Value;
				RunState runState = FindRun(pulse.Run);
				Member own = runState?.Members.FirstOrDefault((Member m) => m.PlayerId == entry.Key);
				Member member = runState?.Members.FirstOrDefault((Member m) => m.PlayerId == pulse.Target);
				if (runState == null || RiftWire.Now - pulse.Last > 700 || !CanRevive(PeerFor(entry.Key), runState, own, member) || member.DeathSerial != pulse.Serial)
				{
					revivePulses.Remove(entry.Key);
				}
				else if (RiftWire.Now - pulse.Started >= 5000)
				{
					member.RespawnAtMs = 0L;
					BattleScore battleScore = ArenaProgress.Score(runState, entry.Key);
					if (battleScore != null)
					{
						battleScore.Rescues++;
					}
					revivePulses.Remove(entry.Key);
					Save();
					SendRunState(runState);
				}
			}
			if (battleHitReceipts.Count > 4096)
			{
				string[] array2 = (from p in battleHitReceipts
					where RiftWire.Now - p.Value > 30000
					select p.Key).ToArray();
				foreach (string key in array2)
				{
					battleHitReceipts.Remove(key);
				}
			}
		}

		private void ReceiveBattleHit(long sender, RunState run, RiftRequest request)
		{
			ZDO val = RiftWire.Find(request.NetworkId);
			EnemyRecord enemyRecord = run.Enemies.FirstOrDefault((EnemyRecord e) => e.Id == request.ActorId && e.NetworkId == request.NetworkId);
			if (enemyRecord == null)
			{
				return;
			}
			bool num;
			if (val == null)
			{
				if (!enemyRecord.Dead)
				{
					return;
				}
				num = enemyRecord.LastOwner != sender;
			}
			else
			{
				if (val.GetOwner() != sender)
				{
					return;
				}
				num = val.GetString("dr_run", "") != run.Id;
			}
			if (num || run.Report?.Encounter != request.Encounter || request.Amount <= 0f || float.IsNaN(request.Amount) || float.IsInfinity(request.Amount) || request.Amount > 1000000f || battleHitReceipts.ContainsKey(request.Id))
			{
				return;
			}
			BattleScore battleScore = ArenaProgress.Score(run, request.TargetPlayer);
			if (battleScore != null)
			{
				battleHitReceipts[request.Id] = RiftWire.Now;
				battleScore.Damage += request.Amount;
				if (enemyRecord.Dead && enemyRecord.LastAttacker == 0L)
				{
					battleScore.Kills++;
				}
				enemyRecord.LastAttacker = request.TargetPlayer;
			}
		}

		private void RequireArch(long sender, RunState run, Member own, string action)
		{
			//IL_0026: 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)
			RequirePresent(run, own, sender);
			Expedition.Require(!own.Dead && ArenaUpgrades.ServicesOpen(run), "⟦dr_services_closed⟧");
			Expedition.Require(Vector3.Distance(PlayerPosition(sender), ArenaRuntime.Ensure(run).ServicePoint(action)) <= 4.5f, "⟦dr_service_near⟧");
		}

		private void BuyBallista(long sender, RunState run, Member own, RiftRequest request)
		{
			if (!run.Transfers.Any((Transfer t) => t.Id == request.Id))
			{
				RequireArch(sender, run, own, "upgrades");
				Expedition.Require((Object)(object)ArenaBallista.NativePrefab() != (Object)null, "⟦dr_ballista_unavailable⟧");
			}
			Transfer transfer = ArenaUpgrades.Prepare(run, own.PlayerId, request.Id, request.Number, RiftWire.Now);
			if (transfer.Phase == TransferPhase.Prepared)
			{
				own.Ready = false;
				run.CircleEndsAtMs = 0L;
				partyCircles.Remove(run.Id);
			}
			SaveWarehouseData(delegate
			{
				ReplyTransfer(sender, run, own.PlayerId, transfer);
				SendRunState(run);
			});
		}

		private void RepairAtArch(long sender, RunState run, Member own, RiftRequest request)
		{
			RequireArch(sender, run, own, "repair");
			RiftReply riftReply = View(run, own.PlayerId, "repair");
			riftReply.Id = request.Id;
			riftReply.Message = NextLevelCircle.Encounter(run);
			plugin.Wire.Reply(sender, riftReply);
		}

		private void TickEquipmentRewards()
		{
			if (Time.unscaledTime < nextEquipmentReward || !EpicEquipmentRewards.Ready())
			{
				return;
			}
			nextEquipmentReward = Time.unscaledTime + 0.5f;
			foreach (RunState run in world.Runs)
			{
				foreach (PersonalReward item in run.Rewards.Where((PersonalReward r) => r.EquipmentRewardVersion < 1))
				{
					string key = run.Id + ":" + item.Id;
					if (rewardRetryAt.TryGetValue(key, out var value) && Time.unscaledTime < value)
					{
						continue;
					}
					List<ItemPayload> list;
					try
					{
						list = EpicEquipmentRewards.Generate(run, item);
					}
					catch (Exception error)
					{
						rewardRetryAt[key] = Time.unscaledTime + 30f;
						plugin.Fail(error);
						continue;
					}
					for (int num = 0; num < list.Count; num++)
					{
						string id = "equipment-v1:" + item.Id + ":" + num;
						Expedition.Require(!item.Items.Any((BankEntry e) => e.Id == id), "⟦dr_error_108⟧");
					}
					for (int num2 = 0; num2 < list.Count; num2++)
					{
						item.Items.Add(new BankEntry
						{
							Id = "equipment-v1:" + item.Id + ":" + num2,
							DepositedBy = item.PlayerId,
							Item = list[num2]
						});
					}
					item.EquipmentRewardVersion = 1;
					Save();
					SendRunState(run);
					return;
				}
			}
		}

		private void ChangeDifficulty(long sender, RunState run, Member own, RiftRequest request)
		{
			RequirePresent(run, own, sender);
			Expedition.Require(!own.Dead, "⟦dr_text_054⟧");
			ExpeditionTravel.ChangeDifficulty(run, (Difficulty)request.Number);
			partyCircles.Remove(run.Id);
			Save();
			SendRunState(run);
			RiftReply riftReply = View(run, own.PlayerId, "difficulty");
			riftReply.Message = (Expedition.IsCombat(run) ? "⟦dr_difficulty_waves⟧" : "⟦dr_difficulty_changed⟧");
			plugin.Wire.Reply(sender, riftReply);
		}

		private void SelectLevel(long sender, RunState run, Member own, RiftRequest request)
		{
			RequirePresent(run, own, sender);
			Expedition.Require(!own.Dead && run.Members.Where((Member x) => x.Present && x.Connected).All((Member x) => !x.Dead), "⟦dr_travel_wait_alive⟧");
			Expedition.Require(!HasPending(run, 0L), "⟦dr_text_090⟧");
			Expedition.Require(WorldBoss(request.Stage), "⟦dr_error_073⟧");
			ExpeditionTravel.Select(run, request.Stage, request.Level);
			partyCircles.Remove(run.Id);
			Save();
			RemoveActors(run);
			PrepareArena(run);
			SendRunState(run);
			RiftReply riftReply = View(run, own.PlayerId, "select_level");
			riftReply.Message = "⟦dr_travel_selected⟧";
			plugin.Wire.Reply(sender, riftReply);
		}

		private void HealAtArch(long sender, RunState run, Member own, RiftRequest request)
		{
			RequireArch(sender, run, own, "heal");
			string key = run.Id + ":" + own.PlayerId;
			if (!healingCooldown.TryGetValue(key, out var value) || RiftWire.Now >= value)
			{
				healingCooldown[key] = RiftWire.Now + 1500;
				RiftReply riftReply = View(run, own.PlayerId, "heal");
				riftReply.Id = request.Id;
				riftReply.Message = NextLevelCircle.Encounter(run);
				plugin.Wire.Reply(sender, riftReply);
			}
		}

		private static void NearbyCargoObjects(Vector3 point, List<ZDO> buffer)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			buffer.Clear();
			ZDOMan.instance.FindSectorObjects(ZoneSystem.GetZone(point), new SimulationDistance(2, 0, true), buffer, (List<ZDO>)null);
		}

		private static bool CargoCandidate(GameObject prefab)
		{
			if (Object.op_Implicit((Object)(object)prefab) && (Object.op_Implicit((Object)(object)prefab.GetComponent<Piece>()) || Object.op_Implicit((Object)(object)prefab.GetComponent<ItemDrop>())) && !Object.op_Implicit((Object)(object)prefab.GetComponent<Character>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<TombStone>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<Ship>()))
			{
				return !Object.op_Implicit((Object)(object)prefab.GetComponent<Vagon>());
			}
			return false;
		}

		private static void RequireCargoAuthority(ZDO zdo)
		{
			Expedition.Require(zdo.GetPrefab() == StringExtensionMethods.GetStableHashCode("DreadRifts_PackedFurniture") || zdo.GetOwner() == 0L || zdo.GetOwner() == ZNet.GetUID(), "⟦dr_fortress_cargo_network_busy⟧");
		}

		private static void RequireSupportedCargo(GameObject prefab)
		{
			Expedition.Require(CargoCandidate(prefab) && !Object.op_Implicit((Object)(object)prefab.GetComponent<PrivateArea>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<TeleportWorld>()), "⟦dr_fortress_cargo_unsupported⟧");
			Expedition.Require(prefab.GetComponentsInChildren<MonoBehaviour>(true).All((MonoBehaviour c) => !Object.op_Implicit((Object)(object)c) || ((object)c).GetType().Assembly == typeof(Piece).Assembly || ((object)c).GetType().Assembly == typeof(MonoBehaviour).Assembly), "⟦dr_fortress_cargo_unsupported⟧");
		}

		private void CaptureFortressCargo(FortressRecord fort, Vector3 origin, float rotation)
		{
			//IL_0006: 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_0040: 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_01b1: 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_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: 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_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			List<ZDO> list = new List<ZDO>();
			NearbyCargoObjects(origin, list);
			List<FortressCargo> list2 = new List<FortressCargo>();
			Quaternion val = Quaternion.Inverse(Quaternion.Euler(0f, rotation, 0f));
			foreach (ZDO item in list)
			{
				if (InFootprint(item.GetPosition(), origin, FortressAssets.Radius) && !(item.GetString("dr_fortress_id", "") == fort.Id) && item.GetPrefab() != StringExtensionMethods.GetStableHashCode("DreadRifts_PackedFurniture"))
				{
					GameObject prefab = ZNetScene.instance.GetPrefab(item.GetPrefab());
					if (CargoCandidate(prefab))
					{
						RequireSupportedCargo(prefab);
						RequireCargoAuthority(item);
						string text = ((item.GetString("dr_cargo_fort", "") == fort.Id) ? item.GetString("dr_cargo_key", "") : "");
						FortressCargo obj = new FortressCargo
						{
							Key = ((text.Length == 0) ? Guid.NewGuid().ToString("N") : text),
							NetworkId = RiftWire.Identity(item),
							Prefab = item.GetPrefab(),
							Source = RiftWire.Pos(item.GetPosition()),
							Local = RiftWire.Pos(val * (item.GetPosition() - origin))
						};
						Quaternion val2 = val * item.GetRotation();
						obj.Angles = RiftWire.Pos(((Quaternion)(ref val2)).eulerAngles);
						list2.Add(obj);
					}
				}
			}
			fort.Cargo = list2;
			fort.CargoOrigin = RiftWire.Pos(origin);
			fort.CargoRotation = rotation;
			fort.CargoReady = true;
			fort.CargoStored = false;
			fort.CargoSealed = false;
		}

		private List<ZDO> ResolveFortressCargo(FortressRecord fort)
		{
			//IL_002d: 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)
			List<ZDO> list = new List<ZDO>();
			NearbyCargoObjects(RiftWire.Vec(fort.CargoOrigin ?? fort.Position), list);
			List<ZDO> list2 = new List<ZDO>();
			NearbyCargoObjects(RiftWire.Vec(fort.Position), list2);
			list.AddRange(list2);
			ZDO[] source = list.Distinct().ToArray();
			List<ZDO> list3 = new List<ZDO>();
			foreach (FortressCargo item in fort.Cargo)
			{
				ZDO[] array = source.Where((ZDO z) => z.GetString("dr_cargo_fort", "") == fort.Id && z.GetString("dr_cargo_key", "") == item.Key).ToArray();
				Expedition.Require(array.Length <= 1, "⟦dr_fortress_cargo_missing⟧");
				ZDO val = array.FirstOrDefault();
				if (val == null)
				{
					ZDO[] array2 = source.Where((ZDO z) => z.GetPrefab() == item.Prefab && Vector3.Distance(z.GetPosition(), RiftWire.Vec(item.Source)) < 0.05f && (z.GetString("dr_cargo_fort", "").Length == 0 || z.GetString("dr_cargo_fort", "") == fort.Id)).ToArray();
					Expedition.Require(array2.Length == 1, "⟦dr_fortress_cargo_missing⟧");
					val = array2[0];
				}
				Expedition.Require(!list3.Contains(val), "⟦dr_fortress_cargo_missing⟧");
				list3.Add(val);
			}
			return list3;
		}

		private void StoreFortressCargo(FortressRecord fort)
		{
			//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_007e: Unknown result type (might be due to invalid IL or missing references)
			List<ZDO> objects = ResolveFortressCargo(fort);
			foreach (ZDO item in objects)
			{
				RequireCargoAuthority(item);
			}
			List<ZDO> list = new List<ZDO>();
			Vector3 origin = RiftWire.Vec(fort.CargoOrigin ?? fort.Position);
			NearbyCargoObjects(origin, list);
			Expedition.Require(fort.Phase == FortressPhase.Packed || list.Where((ZDO z) => InFootprint(z.GetPosition(), origin, FortressAssets.Radius) && z.GetString("dr_fortress_id", "") != fort.Id && CargoCandidate(ZNetScene.instance.GetPrefab(z.GetPrefab()))).All((ZDO z) => objects.Contains(z)), "⟦dr_fortress_cargo_changed⟧");
			for (int num = 0; num < objects.Count; num++)
			{
				ZDO obj = objects[num];
				FortressCargo fortressCargo = fort.Cargo[num];
				obj.SetOwner(ZNet.GetUID());
				obj.Set("dr_cargo_fort", fort.Id);
				obj.Set("dr_cargo_key", fortressCargo.Key);
				obj.Set("dr_cargo_prefab", fortressCargo.Prefab);
				obj.SetPrefab(StringExtensionMethods.GetStableHashCode("DreadRifts_PackedFurniture"));
				obj.Persistent = true;
				obj.Distant = false;
				FortressCargoRuntime.Changed(obj);
			}
			fort.CargoStored = true;
		}

		private bool RefreshCargoJournal(FortressRecord fort, Vector3 origin, float rotation)
		{
			//IL_0013: 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)
			List<ZDO> list = new List<ZDO>();
			NearbyCargoObjects(origin, list);
			if (list.Any((ZDO z) => z.GetString("dr_cargo_fort", "") == fort.Id && z.GetPrefab() == StringExtensionMethods.GetStableHashCode("DreadRifts_PackedFurniture")))
			{
				return false;
			}
			FortressRecord fortressRecord = new FortressRecord
			{
				Id = fort.Id
			};
			CaptureFortressCargo(fortressRecord, origin, rotation);
			if (fort.CargoReady && fortressRecord.Cargo.Count == fort.Cargo.Count && fortressRecord.Cargo.All((FortressCargo c) => fort.Cargo.Any((FortressCargo old) => old.NetworkId == c.NetworkId && old.Prefab == c.Prefab && Vector3.Distance(RiftWire.Vec(old.Source), RiftWire.Vec(c.Source)) < 0.05f && Quaternion.Angle(Quaternion.Euler(RiftWire.Vec(old.Angles)), Quaternion.Euler(RiftWire.Vec(c.Angles))) < 0.5f)))
			{
				return false;
			}
			fort.Cargo = fortressRecord.Cargo;
			fort.CargoOrigin = fortressRecord.CargoOrigin;
			fort.CargoRotation = rotation;
			fort.CargoReady = true;
			Save();
			return true;
		}

		private void RestoreFortressCargo(FortressRecord fort)
		{
			List<ZDO> list = ResolveFortressCargo(fort);
			foreach (ZDO item in list)
			{
				RequireCargoAuthority(item);
			}
			foreach (FortressCargo item2 in fort.Cargo)
			{
				Expedition.Require(Object.op_Implicit((Object)(object)ZNetScene.instance.GetPrefab(item2.Prefab)), "⟦dr_fortress_cargo_unsupported⟧");
			}
			RestoreCargoObjects(fort, list, fort.Cargo);
			fort.CargoStored = false;
		}

		private static void RestoreCargoObjects(FortressRecord fort, List<ZDO> objects, List<FortressCargo> entries)
		{
			//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_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_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			Quaternion val = Quaternion.Euler(0f, fort.Rotation, 0f);
			Vector3 val2 = RiftWire.Vec(fort.Position);
			for (int i = 0; i < objects.Count; i++)
			{
				ZDO obj = objects[i];
				FortressCargo fortressCargo = entries[i];
				ZNetView component = ZNetScene.instance.GetPrefab(fortressCargo.Prefab).GetComponent<ZNetView>();
				obj.Set("dr_cargo_fort", fort.Id);
				obj.Set("dr_cargo_key", fortressCargo.Key);
				obj.Set("dr_cargo_prefab", fortressCargo.Prefab);
				obj.SetOwner(ZNet.GetUID());
				obj.SetPosition(val2 + val * RiftWire.Vec(fortressCargo.Local));
				obj.SetRotation(val * Quaternion.Euler(RiftWire.Vec(fortressCargo.Angles)));
				obj.SetPrefab(fortressCargo.Prefab);
				obj.Distant = component.m_distant;
				obj.Set("dr_cargo_revision", fort.Revision);
				FortressCargoRuntime.Changed(obj);
			}
		}

		private static bool SiteFootprint(Vector3 point, Vector3 centre, float radius)
		{
			//IL_0000: 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_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_0026: 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_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)
			if (Mathf.Abs(point.y - centre.y) < 512f)
			{
				Vector2 val = new Vector2(point.x - centre.x, point.z - centre.z);
				return ((Vector2)(ref val)).sqrMagnitude <= radius * radius;
			}
			return false;
		}

		private List<ZDO> SiteObjects(Vector3 position, string id)
		{
			//IL_0007: 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)
			//IL_001b: 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_0053: 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_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			List<ZDO> list = new List<ZDO>();
			NearbyCargoObjects(position, list);
			HashSet<ZDO> hashSet = new HashSet<ZDO>(list.Where((ZDO z) => SiteFootprint(z.GetPosition(), position, FortressAssets.Radius)));
			Collider[] array = Physics.OverlapBox(position, new Vector3(FortressAssets.Radius, 512f, FortressAssets.Radius), Quaternion.identity, -1, (QueryTriggerInteraction)1);
			foreach (Collider val in array)
			{
				if (!Object.op_Implicit((Object)(object)val))
				{
					continue;
				}
				Bounds bounds = val.bounds;
				if (SiteFootprint(((Bounds)(ref bounds)).ClosestPoint(position), position, FortressAssets.Radius))
				{
					ZNetView componentInParent = ((Component)val).GetComponentInParent<ZNetView>();
					if (Object.op_Implicit((Object)(object)componentInParent) && componentInParent.IsValid())
					{
						hashSet.Add(componentInParent.GetZDO());
					}
				}
			}
			return hashSet.Where((ZDO z) => z.GetString("dr_fortress_id", "") != id && z.GetString("dr_cargo_fort", "") != id && z.GetPrefab() != StringExtensionMethods.GetStableHashCode("DreadRifts_PackedFurniture")).ToList();
		}

		private static bool ClearAtSite(ZDO zdo, GameObject prefab)
		{
			if (Object.op_Implicit((Object)(object)prefab) && zdo.GetLong(ZDOVars.s_creator, 0L) == 0L && zdo.GetString("dr_fortress_id", "").Length == 0 && zdo.GetString("dr_cargo_fort", "").Length == 0 && !Object.op_Implicit((Object)(object)prefab.GetComponent<Piece>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<Plant>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<Character>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<ItemDrop>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<Container>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<TombStone>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<Ship>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<Vagon>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<ItemStand>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<ArmorStand>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<TerrainComp>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<TerrainModifier>()))
			{
				if (!Object.op_Implicit((Object)(object)prefab.GetComponent<TreeBase>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<TreeLog>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<MineRock>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<MineRock5>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<Pickable>()))
				{
					return Object.op_Implicit((Object)(object)prefab.GetComponent<PickableItem>());
				}
				return true;
			}
			return false;
		}

		private void RequireSiteProtection(Vector3 position, long owner, string id, List<ZDO> objects)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0203: Unknown result type (might be due to invalid IL or missing references)
			foreach (KeyValuePair<long, long> session in sessions)
			{
				if (session.Value != owner && SiteFootprint(PlayerPosition(session.Key), position, FortressAssets.Radius))
				{
					throw new InvalidOperationException("⟦dr_fortress_players_inside⟧");
				}
			}
			foreach (ZDO @object in objects)
			{
				GameObject prefab = ZNetScene.instance.GetPrefab(@object.GetPrefab());
				if (Object.op_Implicit((Object)(object)prefab))
				{
					if (Object.op_Implicit((Object)(object)prefab.GetComponent<Player>()))
					{
						ZNetView val = ZNetScene.instance.FindInstance(@object);
						Player val2 = (Object.op_Implicit((Object)(object)val) ? ((Component)val).GetComponent<Player>() : null);
						Expedition.Require(Object.op_Implicit((Object)(object)val2) && val2.GetPlayerID() == owner, "⟦dr_fortress_players_inside⟧");
					}
					else
					{
						Expedition.Require(!Object.op_Implicit((Object)(object)prefab.GetComponent<PrivateArea>()), "⟦dr_fortress_protected_site⟧");
						Expedition.Require(@object.GetLong(ZDOVars.s_creator, 0L) == 0L && !Object.op_Implicit((Object)(object)prefab.GetComponent<Piece>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<Container>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<Plant>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<TombStone>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<Ship>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<Vagon>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<ItemStand>()) && !Object.op_Implicit((Object)(object)prefab.GetComponent<ArmorStand>()), "⟦dr_fortress_buildings_inside⟧");
					}
				}
			}
			List<ZDO> list = new List<ZDO>();
			NearbyCargoObjects(position, list);
			foreach (ZDO item in list)
			{
				GameObject prefab2 = ZNetScene.instance.GetPrefab(item.GetPrefab());
				PrivateArea val3 = (Object.op_Implicit((Object)(object)prefab2) ? prefab2.GetComponent<PrivateArea>() : null);
				if (Object.op_Implicit((Object)(object)val3) && SiteFootprint(item.GetPosition(), position, FortressAssets.Radius + val3.m_radius))
				{
					throw new InvalidOperationException("⟦dr_fortress_protected_site⟧");
				}
			}
		}

		private bool ClearFortressSite(FortressRecord fort)
		{
			//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_002c: 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)
			Expedition.Require(fort.Phase == FortressPhase.Building && !fort.SitePrepared, "⟦dr_fortress_busy⟧");
			Vector3 position = RiftWire.Vec(fort.Position);
			List<ZDO> list = SiteObjects(position, fort.Id);
			RequireSiteProtection(position, fort.Owner, fort.Id, list);
			ZDO[] array = list.Where((ZDO z) => ClearAtSite(z, ZNetScene.instance.GetPrefab(z.GetPrefab()))).Take(24).ToArray();
			ZDO[] array2 = array;
			for (int num = 0; num < array2.Length; num++)
			{
				RemoveNetworkObject(array2[num]);
			}
			if (array.Length != 0)
			{
				FortressNotice(fort, "⟦dr_fortress_clearing⟧");
				return false;
			}
			return true;
		}

		internal bool WaitingForFortressSupport(Vector3 point)
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			if (world == null)
			{
				return false;
			}
			foreach (FortressRecord fortress in world.Fortresses)
			{
				if (fortress.Phase == FortressPhase.Recovering && InFootprint(point, RiftWire.Vec(fortress.Position), FortressAssets.Radius))
				{
					ZDO val = RiftWire.Find(fortress.NetworkId);
					ZNetView val2 = ((val == null) ? null : ZNetScene.instance.FindInstance(val));
					FortressRuntime fortressRuntime = (Object.op_Implicit((Object)(object)val2) ? ((Component)val2).GetComponent<FortressRuntime>() : null);
					if (!Object.op_Implicit((Object)(object)fortressRuntime) || !fortressRuntime.IsBuilt)
					{
						return true;
					}
				}
			}
			return false;
		}

		private bool EnsureFortressRoot(FortressRecord fort)
		{
			//IL_006f: 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_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Expected O, but got Unknown
			ZDO val = RiftWire.Find(fort.NetworkId);
			if (val != null)
			{
				Expedition.Require(val.GetPrefab() == StringExtensionMethods.GetStableHashCode("DreadRifts_Fortress") && val.GetString("dr_fortress_id", "") == fort.Id && val.GetInt("dr_fortress_revision", 0) == fort.Revision, "⟦dr_fortress_busy⟧");
			}
			else
			{
				val = CreateNetworkObject("DreadRifts_Fortress", RiftWire.Vec(fort.Position));
				val.SetRotation(Quaternion.Euler(0f, fort.Rotation, 0f));
				val.Set("dr_fortress_id", fort.Id);
				val.Set("dr_fortress_run", fort.Run);
				val.Set("dr_fortress_owner", fort.Owner);
				val.Set("dr_fortress_revision", fort.Revision);
				fort.NetworkId = RiftWire.Identity(val);
				Save();
			}
			ZNetView val2 = ZNetScene.instance.FindInstance(val);
			if (!Object.op_Implicit((Object)(object)val2))
			{
				GameObject val3 = (GameObject)AccessTools.Method(typeof(ZNetScene), "CreateObject", (Type[])null, (Type[])null).Invoke(ZNetScene.instance, new object[1] { val });
				val2 = (Object.op_Implicit((Object)(object)val3) ? val3.GetComponent<ZNetView>() : null);
			}
			FortressRuntime fortressRuntime = (Object.op_Implicit((Object)(object)val2) ? ((Component)val2).GetComponent<FortressRuntime>() : null);
			if (Object.op_Implicit((Object)(object)fortressRuntime))
			{
				return fortressRuntime.IsBuilt;
			}
			return false;
		}

		private void RecoverFortress(FortressRecord fort)
		{
			if (!EnsureFortressRoot(fort))
			{
				return;
			}
			ZDO[] source = (from z in RiftWire.NetworkObjects()
				where z.GetString("dr_cargo_fort", "") == fort.Id
				select z).ToArray();
			List<ZDO> objects = new List<ZDO>();
			List<FortressCargo> list = new List<FortressCargo>();
			foreach (ZDO item in source.Where((ZDO z) => z.GetPrefab() == StringExtensionMethods.GetStableHashCode("DreadRifts_PackedFurniture")))
			{
				string key = item.GetString("dr_cargo_key", "");
				FortressCargo[] array = fort.Cargo.Where((FortressCargo c) => c.Key == key && key.Length > 0).ToArray();
				Expedition.Require(array.Length == 1 && source.Count((ZDO z) => z.GetString("dr_cargo_key", "") == key) == 1 && item.GetInt("dr_cargo_prefab", 0) == array[0].Prefab, "⟦dr_fortress_cargo_missing⟧");
				RequireCargoAuthority(item);
				GameObject prefab = ZNetScene.instance.GetPrefab(array[0].Prefab);
				Expedition.Require(Object.op_Implicit((Object)(object)prefab) && Object.op_Implicit((Object)(object)prefab.GetComponent<ZNetView>()), "⟦dr_fortress_cargo_unsupported⟧");
				objects.Add(item);
				list.Add(array[0]);
			}
			RestoreCargoObjects(fort, objects, list);
			fort.CargoStored = false;
			fort.SitePrepared = true;
			fort.Phase = FortressPhase.Placed;
			fortressTerrainSteps.Remove(fort.Id);
			SaveWarehouseData(delegate
			{
				plugin.LogInfo("Fortress recovery completed without clearance or terrain edits; archived objects restored=" + objects.Count + " fortress=" + fort.Id);
				FortressNotice(fort, "⟦dr_fortress_done⟧", done: true);
			});
		}

		private void FortressNotice(FortressRecord fort, string message, bool done = false)
		{
			if (done || !fortressNotices.TryGetValue(fort.Id, out var value) || !(Time.unscaledTime < value))
			{
				fortressNotices[fort.Id] = Time.unscaledTime + 10f;
				long num = PeerFor(fort.Owner);
				if (num != 0L)
				{
					plugin.Wire.Reply(num, new RiftReply
					{
						Command = (done ? "fortress_done" : "fortress_wait"),
						Message = message,
						WorldId = world.WorldId,
						Revision = world.Revision
					});
				}
			}
		}

		private FortressRecord OwnedFortress(RunState run, Member own, string id)
		{
			FortressRecord fortressRecord = world.Fortresses.FirstOrDefault((FortressRecord f) => f.Id == id && f.Run == run.Id);
			Expedition.Require(fortressRecord != null && fortressRecord.Owner == own.PlayerId, "⟦dr_fortress_owner_only⟧");
			return fortressRecord;
		}

		private bool RepeatFortress(long sender, RunState run, Member own, RiftRequest request, TransferKind kind)
		{
			Transfer transfer = run.Transfers.FirstOrDefault((Transfer t) => t.Id == request.Id);
			if (transfer == null)
			{
				return false;
			}
			Expedition.Require(transfer.PlayerId == own.PlayerId && transfer.Kind == kind, "⟦dr_upgrade_invalid⟧");
			ReplyTransfer(sender, run, own.PlayerId, transfer);
			return true;
		}

		private void PrepareFortress(long sender, RunState run, Member own, RiftRequest request)
		{
			//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_0201: Unknown result type (might be due to invalid IL or missing references)
			if (!RepeatFortress(sender, run, own, request, TransferKind.FortressPlace))
			{
				Expedition.Require(!HasPending(run, own.PlayerId) && !own.Present && !own.Dead, "⟦dr_fortress_outside⟧");
				ItemData val = NativeItems.Decode(request.Item);
				string id = FortressAssets.Data(val, "dr_fortress_id");
				Expedition.Require(FortressAssets.IsBlueprint(val) && val.m_stack == 1 && FortressAssets.Data(val, "dr_fortress_run") == run.Id && FortressAssets.Data(val, "dr_fortress_owner") == own.PlayerId.ToString() && run.ShopReceipts.Any((ShopReceipt r) => r.Id == id && r.Player == own.PlayerId && r.Product == "fortress"), "⟦dr_fortress_invalid⟧");
				FortressAssets.EnsureTemplate();
				FortressRecord fortressRecord = world.Fortresses.FirstOrDefault((FortressRecord f) => f.Id == id);
				Expedition.Require(fortressRecord == null || (fortressRecord.Owner == own.PlayerId && fortressRecord.Run == run.Id && fortressRecord.Phase == FortressPhase.Packed && fortressRecord.PendingTransfer.Length == 0), "⟦dr_fortress_busy⟧");
				Vector3 value = ValidateFortressTarget(sender, own.PlayerId, request, id);
				if (fortressRecord == null)
				{
					fortressRecord = new FortressRecord
					{
						Id = id,
						Run = run.Id,
						Owner = own.PlayerId
					};
					world.Fortresses.Add(fortressRecord);
				}
				Transfer transfer = new Transfer
				{
					Id = request.Id,
					Kind = TransferKind.FortressPlace,
					PlayerId = own.PlayerId,
					FortressId = fortressRecord.Id,
					Item = request.Item.Copy(),
					Placement = RiftWire.Pos(value),
					Rotation = request.Amount,
					CreatedAtMs = RiftWire.Now
				};
				fortressRecord.PendingTransfer = transfer.Id;
				run.Transfers.Add(transfer);
				SaveWarehouseTransfer(sender, run, own.PlayerId, transfer);
			}
		}

		private void RequirePylon(long sender, FortressRecord fort, int revision)
		{
			//IL_002e: 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)
			Expedition.Require(fort.Phase == FortressPhase.Placed && fort.PendingTransfer.Length == 0 && fort.Revision == revision, "⟦dr_fortress_busy⟧");
			Expedition.Require(InFootprint(PlayerPosition(sender), RiftWire.Vec(fort.Position), 4f), "⟦dr_fortress_near_pylon⟧");
		}

		private void PackFortress(long sender, RunState run, Member own, RiftRequest request)
		{
			if (!RepeatFortress(sender, run, own, request, TransferKind.FortressPack))
			{
				FortressRecord fortressRecord = OwnedFortress(run, own, request.EntryId);
				RequirePylon(sender, fortressRecord, request.Number);
				Expedition.Require(!HasPending(run, own.PlayerId), "⟦dr_text_197⟧");
				FortressAssets.EnsureTemplate();
				RequireFortressEmpty(fortressRecord);
				fortressRecord.CargoReady = false;
				Transfer transfer = new Transfer
				{
					Id = request.Id,
					PlayerId = own.PlayerId,
					Kind = TransferKind.FortressPack,
					FortressId = fortressRecord.Id,
					Item = FortressAssets.Blueprint(fortressRecord.Owner, fortressRecord.Run, fortressRecord.Id),
					CreatedAtMs = RiftWire.Now
				};
				fortressRecord.PendingTransfer = transfer.Id;
				run.Transfers.Add(transfer);
				SaveWarehouseTransfer(sender, run, own.PlayerId, transfer);
			}
		}

		private void MoveFortress(long sender, RunState run, Member own, RiftRequest request)
		{
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: 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_0191: Unknown result type (might be due to invalid IL or missing references)
			FortressRecord fortressRecord = OwnedFortress(run, own, request.EntryId);
			if (fortressRecord.LastMove == request.Id)
			{
				ReplyFortress(sender, fortressRecord, request.Id);
				return;
			}
			if (!request.Flag)
			{
				RequirePylon(sender, fortressRecord, request.Number);
				RequireFortressEmpty(fortressRecord);
				fortressRecord.MovePermit = request.Id;
				fortressRecord.MovePermitUntil = RiftWire.Now + 1800000;
				Save();
				ReplyFortress(sender, fortressRecord, request.Id, "fortress_preview");
				return;
			}
			Expedition.Require(fortressRecord.MovePermit == request.Id && fortressRecord.MovePermitUntil >= RiftWire.Now && fortressRecord.Phase == FortressPhase.Placed && fortressRecord.PendingTransfer.Length == 0 && fortressRecord.Revision == request.Number, "⟦dr_fortress_busy⟧");
			RequireFortressEmpty(fortressRecord);
			Vector3 val = ValidateFortressTarget(sender, own.PlayerId, request, fortressRecord.Id);
			Expedition.Require(Vector2.Distance(new Vector2(val.x, val.z), new Vector2(fortressRecord.Position.X, fortressRecord.Position.Z)) > FortressAssets.Radius * 2f + 2f, "⟦dr_fortress_overlap⟧");
			CaptureFortressCargo(fortressRecord, RiftWire.Vec(fortressRecord.Position), fortressRecord.Rotation);
			fortressRecord.OldNetworkId = fortressRecord.NetworkId;
			fortressRecord.OldPosition = fortressRecord.Position.Copy();
			fortressRecord.NetworkId = "";
			fortressRecord.Position = RiftWire.Pos(val);
			fortressRecord.Rotation = request.Amount;
			fortressRecord.Revision++;
			fortressRecord.SitePrepared = false;
			fortressRecord.PlacementProtocol = 1;
			fortressRecord.Phase = FortressPhase.Building;
			fortressRecord.LastMove = request.Id;
			fortressRecord.MovePermit = "";
			Save();
			ReplyFortress(sender, fortressRecord, request.Id);
		}

		private void ReplyFortress(long sender, FortressRecord fort, string id, string command = "fortress_accepted")
		{
			plugin.Wire.Reply(sender, new RiftReply
			{
				Command = command,
				Id = id,
				WorldId = world.WorldId,
				Revision = world.Revision,
				Fortress = new FortressRecord
				{
					Id = fort.Id,
					Run = fort.Run,
					Owner = fort.Owner,
					Revision = fort.Revision,
					Phase = fort.Phase,
					Position = fort.Position.Copy(),
					Rotation = fort.Rotation
				}
			});
		}

		private void FortressDoor(long sender, RunState run, Member own, RiftRequest request)
		{
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			FortressRecord fortressRecord = OwnedFortress(run, own, request.EntryId);
			Expedition.Require(fortressRecord.Phase == FortressPhase.Placed && fortressRecord.Revision == request.Number, "⟦dr_fortress_busy⟧");
			Expedition.Require(request.GateId == "0" || request.GateId == "1", "⟦dr_fortress_near_gate⟧");
			int index = ((!(request.GateId == "0")) ? 1 : 0);
			ZDO val = RiftWire.Find(fortressRecord.NetworkId);
			Vector3 player = PlayerPosition(sender);
			Vector3 origin = RiftWire.Vec(fortressRecord.Position);
			Quaternion rotation = Quaternion.Euler(0f, fortressRecord.Rotation, 0f);
			bool flag = new int[2] { -1, 1 }.Any((int side) => Vector3.Distance(origin + rotation * FortressAssets.GateControlPosition(index, side), player) < 5f);
			Expedition.Require(val != null && flag, "⟦dr_fortress_near_gate⟧");
			val.SetOwner(ZNet.GetUID());
			val.Set(FortressAssets.GateStateKey(index), !FortressAssets.GateIsOpen(val, index));
		}

		private Vector3 ValidateFortressTarget(long sender, long owner, RiftRequest request, string id)
		{
			//IL_001c: 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_005c: 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_0069: 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_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			Expedition.Require(request.Position != null && BiomeTerrain.Finite(RiftWire.Vec(request.Position)) && !float.IsNaN(request.Amount) && !float.IsInfinity(request.Amount), "⟦dr_fortress_site⟧");
			Vector3 position = RiftWire.Vec(request.Position);
			Expedition.Require(Vector3.Distance(PlayerPosition(sender), position) <= 45f && position.y < 3000f && position.y > ZoneSystem.instance.m_waterLevel + 0.5f, "⟦dr_fortress_site⟧");
			Expedition.Require(BiomeTerrain.Prepare(position, FortressAssets.Radius + 20f), "⟦dr_fortress_loading⟧");
			Expedition.Require(world.Runs.SelectMany((RunState r) => r.ArenaSites).All((ArenaSite s) => Vector3.Distance(RiftWire.Vec(s.Origin), position) > FortressAssets.Radius + 45f), "⟦dr_fortress_site⟧");
			Expedition.Require(world.Fortresses.Where((FortressRecord f) => f.Id != id && f.Phase != FortressPhase.Packed).All((FortressRecord f) => Vector3.Distance(RiftWire.Vec(f.Position), position) > FortressAssets.Radius * 2f + 2f), "⟦dr_fortress_overlap⟧");
			RequireSiteProtection(position, owner, id, SiteObjects(position, id));
			return position;
		}

		private void RequireFortressEmpty(FortressRecord fort)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			RequireClearFootprint(RiftWire.Vec(fort.Position), fort.Owner, fort.Id, placement: false);
		}

		private void RequireClearFootprint(Vector3 position, long owner, string id, bool placement)
		{
			//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_0065: 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_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_024b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_0274: Unknown result type (might be due to invalid IL or missing references)
			//IL_0279: Unknown result type (might be due to invalid IL or missing references)
			FortressAssets.EnsureTemplate();
			float radius = FortressAssets.Radius;
			foreach (KeyValuePair<long, long> session in sessions)
			{
				if (session.Value != owner && InFootprint(PlayerPosition(session.Key), position, radius))
				{
					throw new InvalidOperationException("⟦dr_fortress_players_inside⟧");
				}
			}
			Collider[] array = Physics.OverlapBox(position + Vector3.up * 8f, new Vector3(radius, 16f, radius), Quaternion.identity, -1, (QueryTriggerInteraction)1);
			foreach (Collider val in array)
			{
				if (!Object.op_Implicit((Object)(object)val))
				{
					continue;
				}
				Bounds bounds = val.bounds;
				if (!InFootprint(((Bounds)(ref bounds)).ClosestPoint(position), position, radius))
				{
					continue;
				}
				FortressRuntime componentInParent = ((Component)val).GetComponentInParent<FortressRuntime>();
				if ((Object.op_Implicit((Object)(object)componentInParent) && Object.op_Implicit((Object)(object)componentInParent.View) && componentInParent.View.IsValid() && componentInParent.View.GetZDO().GetString("dr_fortress_id", "") == id) || Object.op_Implicit((Object)(object)((Component)val).GetComponentInParent<Heightmap>()))
				{
					continue;
				}
				Player componentInParent2 = ((Component)val).GetComponentInParent<Player>();
				if (Object.op_Implicit((Object)(object)componentInParent2))
				{
					Expedition.Require(componentInParent2.GetPlayerID() == owner, "⟦dr_fortress_players_inside⟧");
					continue;
				}
				if (!placement && Object.op_Implicit((Object)(object)((Component)val).GetComponentInParent<Character>()))
				{
					throw new InvalidOperationException("⟦dr_fortress_creatures_inside⟧");
				}
				if (!placement && (Object.op_Implicit((Object)(object)((Component)val).GetComponentInParent<Ship>()) || Object.op_Implicit((Object)(object)((Component)val).GetComponentInParent<Vagon>()) || Object.op_Implicit((Object)(object)((Component)val).GetComponentInParent<TombStone>())))
				{
					throw new InvalidOperationException("⟦dr_fortress_cargo_unsupported⟧");
				}
				if (Object.op_Implicit((Object)(object)((Component)val).GetComponentInParent<ItemDrop>()) || Object.op_Implicit((Object)(object)((Component)val).GetComponentInParent<Piece>()))
				{
					if (placement)
					{
						throw new InvalidOperationException("⟦dr_fortress_buildings_inside⟧");
					}
					ZNetView componentInParent3 = ((Component)val).GetComponentInParent<ZNetView>();
					Expedition.Require(Object.op_Implicit((Object)(object)componentInParent3) && componentInParent3.IsValid(), "⟦dr_fortress_cargo_unsupported⟧");
					RequireSupportedCargo(ZNetScene.instance.GetPrefab(componentInParent3.GetZDO().GetPrefab()));
				}
				else if (placement && !Object.op_Implicit((Object)(object)((Component)val).GetComponentInParent<Character>()))
				{
					throw new InvalidOperationException("⟦dr_fortress_obstacle⟧");
				}
			}
			NearbyCargoObjects(position, fortressNearby);
			foreach (ZDO item in fortressNearby)
			{
				if (!InFootprint(item.GetPosition(), position, radius) || item.GetString("dr_fortress_id", "") == id)
				{
					continue;
				}
				GameObject prefab = ZNetScene.instance.GetPrefab(item.GetPrefab());
				Expedition.Require(Object.op_Implicit((Object)(object)prefab), "⟦dr_fortress_cargo_unsupported⟧");
				if (item.GetPrefab() == StringExtensionMethods.GetStableHashCode("DreadRifts_PackedFurniture") || Object.op_Implicit((Object)(object)prefab.GetComponent<Player>()))
				{
					continue;
				}
				if (!placement && (Object.op_Implicit((Object)(object)prefab.GetComponent<Ship>()) || Object.op_Implicit((Object)(object)prefab.GetComponent<Vagon>()) || Object.op_Implicit((Object)(object)prefab.GetComponent<TombStone>())))
				{
					throw new InvalidOperationException("⟦dr_fortress_cargo_unsupported⟧");
				}
				if (!placement && Object.op_Implicit((Object)(object)prefab.GetComponent<Character>()))
				{
					throw new InvalidOperationException("⟦dr_fortress_creatures_inside⟧");
				}
				if (Object.op_Implicit((Object)(object)prefab.GetComponent<ItemDrop>()) || Object.op_Implicit((Object)(object)prefab.GetComponent<Piece>()))
				{
					if (placement)
					{
						throw new InvalidOperationException("⟦dr_fortress_buildings_inside⟧");
					}
					RequireSupportedCargo(prefab);
					RequireCargoAuthority(item);
					continue;
				}
				if (placement && (Object.op_Implicit((Object)(object)prefab.GetComponent<TreeBase>()) || Object.op_Implicit((Object)(object)prefab.GetComponent<TreeLog>()) || Object.op_Implicit((Object)(object)prefab.GetComponent<Destructible>())))
				{
					throw new InvalidOperationException("⟦dr_fortress_obstacle⟧");
				}
				if (!Object.op_Implicit((Object)(object)prefab.GetComponent<PrivateArea>()))
				{
					continue;
				}
				throw new InvalidOperationException("⟦dr_fortress_obstacle⟧");
			}
		}

		private static bool InFootprint(Vector3 point, Vector3 origin, float radius)
		{
			//IL_0000: 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_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_0026: 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_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)
			if (Mathf.Abs(point.y - origin.y) < 35f)
			{
				Vector2 val = new Vector2(point.x - origin.x, point.z - origin.z);
				return ((Vector2)(ref val)).sqrMagnitude < radius * radius;
			}
			return false;
		}

		private void SettleFortressTransfer(RunState run, Transfer transfer, bool cancelled)
		{
			if (transfer.Kind != TransferKind.FortressPlace && transfer.Kind != TransferKind.FortressPack)
			{
				return;
			}
			FortressRecord fortressRecord = world.Fortresses.First((FortressRecord f) => f.Id == transfer.FortressId && f.Run == run.Id);
			if (fortressRecord.PendingTransfer != transfer.Id)
			{
				return;
			}
			fortressRecord.PendingTransfer = "";
			if (!cancelled)
			{
				if (transfer.Kind == TransferKind.FortressPlace)
				{
					fortressRecord.Position = transfer.Placement.Copy();
					fortressRecord.Rotation = transfer.Rotation;
					fortressRecord.Revision++;
					fortressRecord.SitePrepared = false;
					fortressRecord.PlacementProtocol = 1;
					fortressRecord.Phase = FortressPhase.Building;
				}
				else
				{
					fortressRecord.Phase = FortressPhase.Packing;
				}
			}
		}

		private void TickFortresses()
		{
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_024f: 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_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0339: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_047