Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of DreadRifts v0.1.23
plugins/DreadRifts/DreadRifts.dll
Decompiled a month ago
The result has been truncated due to the large size, download it to view full contents!
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