using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using Jotunn.Utils; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("LatchLink")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.2.0.0")] [assembly: AssemblyInformationalVersion("0.2.0")] [assembly: AssemblyProduct("LatchLink")] [assembly: AssemblyTitle("LatchLink")] [assembly: AssemblyVersion("0.2.0.0")] namespace DoorSwitch; [HarmonyPatch(typeof(Door), "Interact")] [HarmonyPriority(0)] [HarmonyAfter(new string[] { "Harmony.Azumatt.WardIsLove" })] internal static class DoorInteractionPatch { private static bool Prefix(Door __instance, Humanoid character, bool hold, ref bool __result) { if (hold || !LinkingSession.ShouldHandleDoorInteraction) { return true; } __result = LinkingSession.TryHandleDoor(__instance, character); return false; } } public sealed class DoorSwitchController : MonoBehaviour, Hoverable, Interactable { private const float StatePollInterval = 0.1f; private const float PositionAnimationSpeed = 0.8f; private const float RotationAnimationSpeed = 240f; public string PieceNameToken; public Transform Actuator; public Vector3 ReleasedPosition; public Vector3 ActivePosition; public Vector3 ReleasedRotation; public Vector3 ActiveRotation; private ZNetView networkView; private bool targetActive; private float nextStatePoll; private void Awake() { networkView = ((Component)this).GetComponent(); RefreshVisualState(); ApplyVisualState(immediate: true); } private void Update() { if (!((Object)(object)networkView == (Object)null) && networkView.IsValid()) { if (Time.time >= nextStatePoll) { nextStatePoll = Time.time + 0.1f; RefreshVisualState(); } ApplyVisualState(immediate: false); } } public bool Interact(Humanoid character, bool hold, bool alt) { //IL_0026: 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_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: 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) if (hold || (Object)(object)networkView == (Object)null || !networkView.IsValid()) { return false; } if (!PrivateArea.CheckAccess(((Component)this).transform.position, 0f, true, false)) { return true; } bool flag = alt || ZInput.GetKey((KeyCode)304, false) || ZInput.GetKey((KeyCode)303, false); bool flag2 = ZInput.GetKey((KeyCode)308, false) || ZInput.GetKey((KeyCode)307, false); ZDOID uid = networkView.GetZDO().m_uid; if (flag && flag2) { SwitchRpc.RequestClearLinks(uid); } else if (flag) { LinkingSession.BeginOrCancel(uid); } else if (flag2) { SwitchRpc.RequestCycleMode(uid); } else { SwitchRpc.RequestActivate(uid); } return true; } public bool UseItem(Humanoid user, ItemData item) { return false; } public string GetHoverName() { return Localization.instance.Localize(PieceNameToken); } public string GetHoverText() { if ((Object)(object)networkView == (Object)null || !networkView.IsValid()) { return GetHoverName(); } ZDO zDO = networkView.GetZDO(); int count = SwitchData.ReadLinks(zDO).Count; string modeName = SwitchData.GetModeName(SwitchData.ReadMode(zDO)); string text = GetHoverName() + $" ({modeName}, {count} linked)\n" + "[$KEY_Use] Activate\n[Shift + $KEY_Use] Link [Alt + $KEY_Use] Mode"; return Localization.instance.Localize(text); } private void RefreshVisualState() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) ZDO val = (((Object)(object)networkView != (Object)null && networkView.IsValid()) ? networkView.GetZDO() : null); if (val == null) { targetActive = false; return; } List list = SwitchData.ReadLinks(val); if (list.Count == 0) { targetActive = false; return; } bool flag = false; bool flag2 = false; foreach (ZDOID item in list) { ZDOMan instance = ZDOMan.instance; ZDO val2 = ((instance != null) ? instance.GetZDO(item) : null); if (val2 != null) { flag = true; if (val2.GetInt(ZDOVars.s_state, 0) != 0) { flag2 = true; break; } } } targetActive = (flag ? flag2 : val.GetBool("doorswitch_last_state", false)); } private void ApplyVisualState(bool immediate) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_006a: 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_007b: 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_0096: 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_004b: 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) if (!((Object)(object)Actuator == (Object)null)) { Vector3 val = (targetActive ? ActivePosition : ReleasedPosition); Quaternion val2 = Quaternion.Euler(targetActive ? ActiveRotation : ReleasedRotation); if (immediate) { Actuator.localPosition = val; Actuator.localRotation = val2; } else { Actuator.localPosition = Vector3.MoveTowards(Actuator.localPosition, val, 0.8f * Time.deltaTime); Actuator.localRotation = Quaternion.RotateTowards(Actuator.localRotation, val2, 240f * Time.deltaTime); } } } } [BepInPlugin("com.tomtom.latchlink", "LatchLink", "0.2.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public sealed class DoorSwitchPlugin : BaseUnityPlugin { public const string ModGuid = "com.tomtom.latchlink"; public const string ModName = "LatchLink"; public const string ModVersion = "0.2.0"; private Harmony harmony; internal static ConfigEntry MaximumLinks { get; private set; } internal static ConfigEntry MaximumLinkDistance { get; private set; } private void Awake() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Expected O, but got Unknown //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Expected O, but got Unknown MaximumLinks = ((BaseUnityPlugin)this).Config.Bind("General", "Maximum links per switch", 32, new ConfigDescription("Maximum number of doors controlled by one switch.", (AcceptableValueBase)(object)new AcceptableValueRange(1, 256), Array.Empty())); MaximumLinkDistance = ((BaseUnityPlugin)this).Config.Bind("General", "Maximum link distance", 100f, new ConfigDescription("Maximum distance in metres between a switch and a linked target.", (AcceptableValueBase)(object)new AcceptableValueRange(2f, 1000f), Array.Empty())); AddLocalizations(); SwitchRpc.Initialize(); PrefabManager.OnVanillaPrefabsAvailable += RegisterPieces; harmony = new Harmony("com.tomtom.latchlink"); harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"LatchLink 0.2.0 loaded"); } private void Update() { LinkingSession.Update(); } private void OnDestroy() { PrefabManager.OnVanillaPrefabsAvailable -= RegisterPieces; Harmony obj = harmony; if (obj != null) { obj.UnpatchSelf(); } } private static void AddLocalizations() { CustomLocalization localization = LocalizationManager.Instance.GetLocalization(); string text = "English"; localization.AddTranslation(ref text, new Dictionary { ["doorswitch_wood_name"] = "Wooden Lever", ["doorswitch_wood_description"] = "A simple lever for remotely operating linked doors and gates.", ["doorswitch_iron_name"] = "Iron Button", ["doorswitch_iron_description"] = "A compact mechanical control for linked doors and gates.", ["doorswitch_rune_name"] = "Rune Switch", ["doorswitch_rune_description"] = "A glowing runic control for linked doors and gates." }); } private static void RegisterPieces() { SwitchPieceFactory.RegisterAll(); PrefabManager.OnVanillaPrefabsAvailable -= RegisterPieces; } } internal static class LinkingSession { private const float SessionDuration = 90f; private static ZDOID switchId = ZDOID.None; private static float expiresAt; private static bool suppressDoorHandling; internal static bool IsActive { get { if (!((ZDOID)(ref switchId)).IsNone()) { return Time.unscaledTime < expiresAt; } return false; } } internal static bool ShouldHandleDoorInteraction { get { if (IsActive) { return !suppressDoorHandling; } return false; } } internal static void BeginOrCancel(ZDOID id) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (IsActive && switchId == id) { Cancel("Link mode cancelled"); return; } switchId = id; expiresAt = Time.unscaledTime + 90f; ShowMessage("Link mode: use a door or gate to add/remove it; Escape cancels"); } internal static void Update() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (!IsActive) { switchId = ZDOID.None; } else if (ZInput.GetKeyDown((KeyCode)27, false)) { Cancel("Link mode finished"); } } internal static bool TryHandleDoor(Door door, Humanoid user) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) if (!IsActive) { return false; } expiresAt = Time.unscaledTime + 90f; if (!PrivateArea.CheckAccess(((Component)door).transform.position, 0f, true, false)) { End(); return true; } ZNetView componentInParent = ((Component)door).GetComponentInParent(); if ((Object)(object)componentInParent == (Object)null || !componentInParent.IsValid()) { ShowMessage("That target is not networked and cannot be linked"); End(); return true; } SwitchRpc.RequestToggleLink(switchId, componentInParent.GetZDO().m_uid); End(); return true; } internal static bool InteractWithoutLinking(Door door, Humanoid user) { bool flag = suppressDoorHandling; suppressDoorHandling = true; try { return door.Interact(user, false, false); } finally { suppressDoorHandling = flag; } } private static void Cancel(string message) { End(); ShowMessage(message); } private static void End() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) switchId = ZDOID.None; expiresAt = 0f; } internal static void ShowMessage(string message) { if ((Object)(object)Player.m_localPlayer != (Object)null) { ((Character)Player.m_localPlayer).Message((MessageType)2, message, 0, (Sprite)null); } } } internal static class SwitchData { internal const string LinksKey = "doorswitch_links"; internal const string ModeKey = "doorswitch_mode"; internal const string LastStateKey = "doorswitch_last_state"; internal const string ActivationKey = "doorswitch_activation"; internal static List ReadLinks(ZDO zdo) { //IL_0084: Unknown result type (might be due to invalid IL or missing references) List list = new List(); if (zdo == null) { return list; } string text = zdo.GetString("doorswitch_links", string.Empty); if (string.IsNullOrWhiteSpace(text)) { return list; } string[] array = text.Split(new char[1] { ';' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split(':'); if (array2.Length == 2 && long.TryParse(array2[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out var result) && uint.TryParse(array2[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out var result2) && result != 0L && result2 != 0) { list.Add(new ZDOID(result, result2)); } } return list; } internal static void WriteLinks(ZDO zdo, IEnumerable links) { //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) List list = new List(); foreach (ZDOID link in links) { ZDOID current = link; if (!((ZDOID)(ref current)).IsNone()) { list.Add(((ZDOID)(ref current)).UserID.ToString(CultureInfo.InvariantCulture) + ":" + ((ZDOID)(ref current)).ID.ToString(CultureInfo.InvariantCulture)); } } zdo.Set("doorswitch_links", string.Join(";", list)); } internal static SwitchMode ReadMode(ZDO zdo) { int num = ((zdo != null) ? zdo.GetInt("doorswitch_mode", 0) : 0); if (num < 0 || num > 2) { return SwitchMode.Toggle; } return (SwitchMode)num; } internal static string GetModeName(SwitchMode mode) { return mode switch { SwitchMode.Open => "Open", SwitchMode.Close => "Close", _ => "Toggle", }; } } [HarmonyPatch(typeof(Player), "HaveRequirements", new Type[] { typeof(Piece), typeof(RequirementMode) })] internal static class SwitchDiscoveryPatch { private static bool Prefix(Player __instance, Piece piece, RequirementMode mode, ref bool __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 if ((int)mode != 1 || !SwitchPieceFactory.IsSwitchPiece(piece)) { return true; } if (piece.m_dlc.Length > 0 && !DLCMan.instance.IsDLCInstalled(piece.m_dlc)) { __result = false; return false; } Requirement[] resources = piece.m_resources; foreach (Requirement val in resources) { if ((Object)(object)val.m_resItem != (Object)null && val.m_amount > 0 && !__instance.IsKnownMaterial(val.m_resItem.m_itemData.m_shared.m_name)) { __result = false; return false; } } __result = true; return false; } } internal static class SwitchIconFactory { private const int Size = 64; internal static Sprite Create(SwitchVisualStyle style) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown //IL_00a0: 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) Color32[] array = (Color32[])(object)new Color32[4096]; Color32 val = default(Color32); ((Color32)(ref val))..ctor((byte)0, (byte)0, (byte)0, (byte)0); for (int i = 0; i < array.Length; i++) { array[i] = val; } switch (style) { case SwitchVisualStyle.IronButton: DrawIronButton(array); break; case SwitchVisualStyle.RuneSwitch: DrawRuneSwitch(array); break; default: DrawWoodLever(array); break; } Texture2D val2 = new Texture2D(64, 64, (TextureFormat)4, false) { name = $"DoorSwitch_{style}_Icon", filterMode = (FilterMode)0, wrapMode = (TextureWrapMode)1 }; val2.SetPixels32(array); val2.Apply(false, false); Sprite obj = Sprite.Create(val2, new Rect(0f, 0f, 64f, 64f), new Vector2(0.5f, 0.5f), 64f); ((Object)obj).name = ((Object)val2).name; return obj; } private static void DrawWoodLever(Color32[] pixels) { //IL_000c: 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_0032: 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_0076: 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_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) DrawPlate(pixels, new Color32((byte)47, (byte)29, (byte)17, byte.MaxValue), new Color32((byte)131, (byte)76, (byte)31, byte.MaxValue), new Color32((byte)188, (byte)116, (byte)48, byte.MaxValue)); DrawLine(pixels, 30, 27, 41, 47, 7, new Color32((byte)48, (byte)31, (byte)18, byte.MaxValue)); DrawLine(pixels, 30, 27, 41, 47, 4, new Color32((byte)222, (byte)153, (byte)54, byte.MaxValue)); FillCircle(pixels, 30, 27, 8, new Color32((byte)48, (byte)31, (byte)18, byte.MaxValue)); FillCircle(pixels, 30, 27, 5, new Color32((byte)230, (byte)165, (byte)65, byte.MaxValue)); FillCircle(pixels, 42, 49, 7, new Color32((byte)48, (byte)31, (byte)18, byte.MaxValue)); FillCircle(pixels, 42, 49, 4, new Color32((byte)244, (byte)183, (byte)72, byte.MaxValue)); } private static void DrawIronButton(Color32[] pixels) { //IL_000c: 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_0035: 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_0070: 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_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) DrawPlate(pixels, new Color32((byte)25, (byte)29, (byte)32, byte.MaxValue), new Color32((byte)91, (byte)103, (byte)112, byte.MaxValue), new Color32((byte)153, (byte)165, (byte)171, byte.MaxValue)); FillCircle(pixels, 32, 31, 15, new Color32((byte)35, (byte)20, (byte)18, byte.MaxValue)); FillCircle(pixels, 32, 31, 12, new Color32((byte)191, (byte)35, (byte)25, byte.MaxValue)); FillCircle(pixels, 30, 34, 7, new Color32((byte)239, (byte)61, (byte)37, byte.MaxValue)); FillCircle(pixels, 28, 37, 3, new Color32(byte.MaxValue, (byte)146, (byte)100, byte.MaxValue)); DrawRivets(pixels, new Color32((byte)206, (byte)213, (byte)215, byte.MaxValue)); } private static void DrawRuneSwitch(Color32[] pixels) { //IL_000c: 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_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0082: 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_00a2: 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_00c2: Unknown result type (might be due to invalid IL or missing references) DrawPlate(pixels, new Color32((byte)28, (byte)34, (byte)37, byte.MaxValue), new Color32((byte)75, (byte)85, (byte)89, byte.MaxValue), new Color32((byte)130, (byte)141, (byte)145, byte.MaxValue)); Color32 color = default(Color32); ((Color32)(ref color))..ctor((byte)7, (byte)91, (byte)119, byte.MaxValue); Color32 color2 = default(Color32); ((Color32)(ref color2))..ctor((byte)46, (byte)224, byte.MaxValue, byte.MaxValue); DrawLine(pixels, 29, 17, 35, 48, 8, color); DrawLine(pixels, 32, 33, 45, 44, 8, color); DrawLine(pixels, 32, 33, 43, 22, 8, color); DrawLine(pixels, 29, 17, 35, 48, 4, color2); DrawLine(pixels, 32, 33, 45, 44, 4, color2); DrawLine(pixels, 32, 33, 43, 22, 4, color2); } private static void DrawPlate(Color32[] pixels, Color32 border, Color32 face, Color32 highlight) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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) FillRect(pixels, 10, 6, 53, 57, border); FillRect(pixels, 14, 10, 49, 53, face); FillRect(pixels, 16, 12, 47, 15, highlight); FillRect(pixels, 16, 16, 19, 50, highlight); } private static void DrawRivets(Color32[] pixels, Color32 color) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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) FillCircle(pixels, 18, 15, 2, color); FillCircle(pixels, 46, 15, 2, color); FillCircle(pixels, 18, 49, 2, color); FillCircle(pixels, 46, 49, 2, color); } private static void DrawLine(Color32[] pixels, int x0, int y0, int x1, int y1, int thickness, Color32 color) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) int num = Mathf.Abs(x1 - x0); int num2 = ((x0 < x1) ? 1 : (-1)); int num3 = -Mathf.Abs(y1 - y0); int num4 = ((y0 < y1) ? 1 : (-1)); int num5 = num + num3; while (true) { FillCircle(pixels, x0, y0, thickness / 2, color); if (x0 != x1 || y0 != y1) { int num6 = 2 * num5; if (num6 >= num3) { num5 += num3; x0 += num2; } if (num6 <= num) { num5 += num; y0 += num4; } continue; } break; } } private static void FillCircle(Color32[] pixels, int centerX, int centerY, int radius, Color32 color) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) int num = radius * radius; for (int i = centerY - radius; i <= centerY + radius; i++) { for (int j = centerX - radius; j <= centerX + radius; j++) { int num2 = j - centerX; int num3 = i - centerY; if (num2 * num2 + num3 * num3 <= num) { SetPixel(pixels, j, i, color); } } } } private static void FillRect(Color32[] pixels, int minX, int minY, int maxX, int maxY, Color32 color) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) for (int i = minY; i <= maxY; i++) { for (int j = minX; j <= maxX; j++) { SetPixel(pixels, j, i, color); } } } private static void SetPixel(Color32[] pixels, int x, int y, Color32 color) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) if (x >= 0 && x < 64 && y >= 0 && y < 64) { pixels[y * 64 + x] = color; } } } internal enum SwitchMode { Toggle, Open, Close } internal static class SwitchPieceFactory { private readonly struct Requirement { internal string Item { get; } internal int Amount { get; } internal Requirement(string item, int amount) { Item = item; Amount = amount; } } private const string BasePrefab = "sign"; private static readonly HashSet SwitchPrefabHashes = new HashSet(); internal static void RegisterAll() { Register("doorswitch_wood", "$doorswitch_wood_name", "$doorswitch_wood_description", SwitchVisualStyle.WoodLever, new Requirement[2] { new Requirement("Wood", 4), new Requirement("Resin", 1) }); Register("doorswitch_iron", "$doorswitch_iron_name", "$doorswitch_iron_description", SwitchVisualStyle.IronButton, new Requirement[2] { new Requirement("FineWood", 2), new Requirement("Iron", 2) }); Register("doorswitch_rune", "$doorswitch_rune_name", "$doorswitch_rune_description", SwitchVisualStyle.RuneSwitch, new Requirement[3] { new Requirement("Stone", 4), new Requirement("SurtlingCore", 1), new Requirement("GreydwarfEye", 2) }); } internal static bool IsSwitchPrefab(int prefabHash) { return SwitchPrefabHashes.Contains(prefabHash); } private static void Register(string prefabName, string displayName, string description, SwitchVisualStyle style, IEnumerable requirements) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Expected O, but got Unknown PieceConfig val = new PieceConfig { Name = displayName, Description = description, PieceTable = PieceTables.Hammer, Category = PieceCategories.Misc, CraftingStation = CraftingStations.Workbench, Icon = SwitchIconFactory.Create(style) }; foreach (Requirement requirement in requirements) { val.AddRequirement(requirement.Item, requirement.Amount, true); } CustomPiece val2 = new CustomPiece(prefabName, "sign", val); PreparePrefab(val2.PiecePrefab, displayName, style); PieceManager.Instance.AddPiece(val2); SwitchPrefabHashes.Add(StringExtensionMethods.GetStableHashCode(prefabName)); } internal static bool IsSwitchPiece(Piece piece) { if ((Object)(object)piece != (Object)null) { return IsSwitchPrefab(StringExtensionMethods.GetStableHashCode(Utils.GetPrefabName(((Component)piece).gameObject))); } return false; } private static void PreparePrefab(GameObject prefab, string displayName, SwitchVisualStyle style) { Material sourceMaterial = (from renderer in prefab.GetComponentsInChildren(true) select renderer.sharedMaterial).FirstOrDefault((Func)((Material material) => (Object)(object)material != (Object)null)); Renderer[] componentsInChildren = prefab.GetComponentsInChildren(true); for (int num = 0; num < componentsInChildren.Length; num++) { componentsInChildren[num].enabled = false; } Sign[] componentsInChildren2 = prefab.GetComponentsInChildren(true); for (int num = 0; num < componentsInChildren2.Length; num++) { Object.DestroyImmediate((Object)(object)componentsInChildren2[num]); } DoorSwitchController doorSwitchController = prefab.AddComponent(); doorSwitchController.PieceNameToken = displayName; BuildVisual(prefab, doorSwitchController, style, sourceMaterial); } private static void BuildVisual(GameObject prefab, DoorSwitchController controller, SwitchVisualStyle style, Material sourceMaterial) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0039: 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_006e: 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_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015c: 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_0176: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_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_0192: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: 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_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_0255: 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_027d: Unknown result type (might be due to invalid IL or missing references) //IL_029f: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_02c7: Unknown result type (might be due to invalid IL or missing references) //IL_02e9: Unknown result type (might be due to invalid IL or missing references) //IL_02fd: Unknown result type (might be due to invalid IL or missing references) //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_0325: Unknown result type (might be due to invalid IL or missing references) //IL_032a: Unknown result type (might be due to invalid IL or missing references) //IL_033f: Unknown result type (might be due to invalid IL or missing references) //IL_0344: Unknown result type (might be due to invalid IL or missing references) //IL_034b: Unknown result type (might be due to invalid IL or missing references) //IL_0350: Unknown result type (might be due to invalid IL or missing references) //IL_0351: Unknown result type (might be due to invalid IL or missing references) //IL_0353: Unknown result type (might be due to invalid IL or missing references) //IL_0358: Unknown result type (might be due to invalid IL or missing references) //IL_035a: Unknown result type (might be due to invalid IL or missing references) //IL_0370: Unknown result type (might be due to invalid IL or missing references) //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_03a0: Unknown result type (might be due to invalid IL or missing references) //IL_03b4: Unknown result type (might be due to invalid IL or missing references) //IL_03b9: Unknown result type (might be due to invalid IL or missing references) //IL_03ca: Unknown result type (might be due to invalid IL or missing references) //IL_03fb: Unknown result type (might be due to invalid IL or missing references) //IL_040f: Unknown result type (might be due to invalid IL or missing references) //IL_0423: Unknown result type (might be due to invalid IL or missing references) //IL_0446: Unknown result type (might be due to invalid IL or missing references) //IL_045a: Unknown result type (might be due to invalid IL or missing references) //IL_045f: Unknown result type (might be due to invalid IL or missing references) //IL_0482: Unknown result type (might be due to invalid IL or missing references) //IL_0496: Unknown result type (might be due to invalid IL or missing references) //IL_049b: Unknown result type (might be due to invalid IL or missing references) //IL_04b1: Unknown result type (might be due to invalid IL or missing references) //IL_04b6: Unknown result type (might be due to invalid IL or missing references) //IL_04b7: Unknown result type (might be due to invalid IL or missing references) //IL_04b9: Unknown result type (might be due to invalid IL or missing references) //IL_04be: Unknown result type (might be due to invalid IL or missing references) //IL_04c0: Unknown result type (might be due to invalid IL or missing references) //IL_04d5: Unknown result type (might be due to invalid IL or missing references) //IL_04da: Unknown result type (might be due to invalid IL or missing references) //IL_04ef: Unknown result type (might be due to invalid IL or missing references) //IL_04f4: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("DoorSwitchVisual"); val.transform.SetParent(prefab.transform, false); val.layer = prefab.layer; Material material = CreateMaterial(sourceMaterial, new Color(0.58f, 0.32f, 0.12f), 0f, Color.black); switch (style) { case SwitchVisualStyle.IronButton: { material = CreateMaterial(sourceMaterial, new Color(0.48f, 0.52f, 0.56f), 0.75f, Color.black); Material material2 = CreateMaterial(sourceMaterial, new Color(0.95f, 0.07f, 0.025f), 0.35f, new Color(1.4f, 0.06f, 0.015f)); CreatePrimitive((PrimitiveType)3, "Plate", val.transform, new Vector3(0f, 0f, 0f), new Vector3(0.38f, 0.42f, 0.09f), Vector3.zero, material); controller.Actuator = CreatePrimitive((PrimitiveType)2, "Actuator", val.transform, new Vector3(0f, 0f, 0.1f), new Vector3(0.12f, 0.055f, 0.12f), new Vector3(90f, 0f, 0f), material2).transform; controller.ReleasedPosition = controller.Actuator.localPosition; controller.ActivePosition = new Vector3(0f, 0f, 0.065f); controller.ReleasedRotation = (controller.ActiveRotation = controller.Actuator.localEulerAngles); break; } case SwitchVisualStyle.RuneSwitch: { material = CreateMaterial(sourceMaterial, new Color(0.42f, 0.44f, 0.46f), 0.05f, Color.black); Material material2 = CreateMaterial(sourceMaterial, new Color(0.02f, 0.82f, 1f), 0.1f, new Color(0.04f, 1.6f, 2.8f)); CreatePrimitive((PrimitiveType)3, "Stone", val.transform, Vector3.zero, new Vector3(0.4f, 0.46f, 0.1f), Vector3.zero, material); Transform transform2 = new GameObject("Actuator").transform; transform2.SetParent(val.transform, false); CreatePrimitive((PrimitiveType)3, "RuneVertical", transform2, new Vector3(0f, 0f, 0.064f), new Vector3(0.045f, 0.27f, 0.025f), new Vector3(0f, 0f, 18f), material2); CreatePrimitive((PrimitiveType)3, "RuneBranchTop", transform2, new Vector3(0.055f, 0.07f, 0.064f), new Vector3(0.035f, 0.15f, 0.025f), new Vector3(0f, 0f, -42f), material2); CreatePrimitive((PrimitiveType)3, "RuneBranchBottom", transform2, new Vector3(0.055f, -0.07f, 0.064f), new Vector3(0.035f, 0.15f, 0.025f), new Vector3(0f, 0f, 42f), material2); controller.Actuator = transform2; controller.ReleasedPosition = Vector3.zero; controller.ActivePosition = new Vector3(0f, 0f, -0.018f); controller.ReleasedRotation = (controller.ActiveRotation = Vector3.zero); break; } default: { Material material2 = CreateMaterial(sourceMaterial, new Color(0.92f, 0.56f, 0.13f), 0.35f, new Color(0.18f, 0.07f, 0.01f)); CreatePrimitive((PrimitiveType)3, "Plate", val.transform, Vector3.zero, new Vector3(0.34f, 0.42f, 0.09f), Vector3.zero, material); Transform transform = new GameObject("Actuator").transform; transform.SetParent(val.transform, false); CreatePrimitive((PrimitiveType)2, "Pivot", transform, new Vector3(0f, 0f, 0.075f), new Vector3(0.09f, 0.045f, 0.09f), new Vector3(90f, 0f, 0f), material2); CreatePrimitive((PrimitiveType)3, "Handle", transform, new Vector3(0f, 0.13f, 0.12f), new Vector3(0.055f, 0.28f, 0.055f), Vector3.zero, material2); CreatePrimitive((PrimitiveType)0, "Knob", transform, new Vector3(0f, 0.27f, 0.12f), new Vector3(0.11f, 0.11f, 0.11f), Vector3.zero, material2); controller.Actuator = transform; controller.ReleasedPosition = (controller.ActivePosition = Vector3.zero); controller.ReleasedRotation = new Vector3(0f, 0f, -25f); controller.ActiveRotation = new Vector3(0f, 0f, 25f); break; } } } private static GameObject CreatePrimitive(PrimitiveType type, string name, Transform parent, Vector3 position, Vector3 scale, Vector3 rotation, Material material) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002c: 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) GameObject obj = GameObject.CreatePrimitive(type); ((Object)obj).name = name; obj.transform.SetParent(parent, false); obj.transform.localPosition = position; obj.transform.localScale = scale; obj.transform.localEulerAngles = rotation; obj.layer = ((Component)parent).gameObject.layer; Collider component = obj.GetComponent(); if ((Object)(object)component != (Object)null) { Object.DestroyImmediate((Object)(object)component); } obj.GetComponent().sharedMaterial = material; return obj; } private static Material CreateMaterial(Material source, Color color, float metallic, Color emission) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0068: 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_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: 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) if ((Object)(object)source == (Object)null) { throw new InvalidOperationException("No source material was available for the switch visual."); } Material val = new Material(source); if (val.HasProperty("_MainTex")) { val.SetTexture("_MainTex", (Texture)(object)Texture2D.whiteTexture); } if (val.HasProperty("_BaseMap")) { val.SetTexture("_BaseMap", (Texture)(object)Texture2D.whiteTexture); } if (val.HasProperty("_Color")) { val.SetColor("_Color", color); } if (val.HasProperty("_BaseColor")) { val.SetColor("_BaseColor", color); } if (val.HasProperty("_Metallic")) { val.SetFloat("_Metallic", metallic); } if (emission != Color.black) { val.EnableKeyword("_EMISSION"); if (val.HasProperty("_EmissionColor")) { val.SetColor("_EmissionColor", emission); } if (val.HasProperty("_EmissiveColor")) { val.SetColor("_EmissiveColor", emission); } } return val; } } internal enum SwitchVisualStyle { WoodLever, IronButton, RuneSwitch } internal static class SwitchRpc { private enum Command : byte { Activate, ToggleLink, ClearLinks, CycleMode, Result, OperateTargets } private static CustomRPC rpc; internal static void Initialize() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_0027: Expected O, but got Unknown rpc = NetworkManager.Instance.AddRPC("DoorSwitch", new CoroutineHandler(OnServerReceive), new CoroutineHandler(OnClientReceive)); } internal static void RequestActivate(ZDOID switchId) { //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) SendToServer(Command.Activate, delegate(ZPackage package) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) package.Write(switchId); }); } internal static void RequestToggleLink(ZDOID switchId, ZDOID targetId) { //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_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) SendToServer(Command.ToggleLink, delegate(ZPackage package) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) package.Write(switchId); package.Write(targetId); }); } internal static void RequestClearLinks(ZDOID switchId) { //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) SendToServer(Command.ClearLinks, delegate(ZPackage package) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) package.Write(switchId); }); } internal static void RequestCycleMode(ZDOID switchId) { //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) SendToServer(Command.CycleMode, delegate(ZPackage package) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) package.Write(switchId); }); } private static void SendToServer(Command command, Action writePayload) { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown if (rpc == null || (Object)(object)ZNet.instance == (Object)null) { LinkingSession.ShowMessage("The network is not ready"); return; } long num; if (ZNet.instance.IsServer()) { num = ZNet.GetUID(); } else { ZNetPeer serverPeer = ZNet.instance.GetServerPeer(); if (serverPeer == null) { LinkingSession.ShowMessage("The server connection is not ready"); return; } num = serverPeer.m_uid; } ZPackage val = new ZPackage(); val.Write((byte)command); writePayload(val); rpc.SendPackage(num, val); } private static IEnumerator OnServerReceive(long sender, ZPackage package) { switch ((Command)package.ReadByte()) { case Command.Activate: OnActivate(sender, package.ReadZDOID()); break; case Command.ToggleLink: OnToggleLink(sender, package.ReadZDOID(), package.ReadZDOID()); break; case Command.ClearLinks: OnClearLinks(sender, package.ReadZDOID()); break; case Command.CycleMode: OnCycleMode(sender, package.ReadZDOID()); break; case Command.Result: OnResult(package.ReadString()); break; case Command.OperateTargets: if (sender == ZNet.GetUID()) { OnOperateTargets(package); } break; } yield break; } private static IEnumerator OnClientReceive(long sender, ZPackage package) { ZNet instance = ZNet.instance; ZNetPeer val = ((instance != null) ? instance.GetServerPeer() : null); if (val != null && sender == val.m_uid) { switch ((Command)package.ReadByte()) { case Command.Result: OnResult(package.ReadString()); break; case Command.OperateTargets: OnOperateTargets(package); break; } } yield break; } private static void OnActivate(long sender, ZDOID switchId) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if (TryGetServerSwitch(sender, switchId, out var switchZdo)) { List validTargets = GetValidTargets(switchZdo); if (validTargets.Count == 0) { Reply(sender, "This switch has no linked doors"); return; } SwitchMode switchMode = SwitchData.ReadMode(switchZdo); bool flag = (byte)(((switchMode != SwitchMode.Close) ? 1u : 0u) & (uint)(switchMode switch { SwitchMode.Toggle => validTargets.Any((ZDO target) => target.GetInt(ZDOVars.s_state, 0) == 0) ? 1 : 0, SwitchMode.Open => 1, _ => 0, })) != 0; SendOperation(sender, flag, validTargets); switchZdo.Set("doorswitch_last_state", flag); switchZdo.Set("doorswitch_activation", switchZdo.GetInt("doorswitch_activation", 0) + 1); } } private static void OnToggleLink(long sender, ZDOID switchId, ZDOID targetId) { //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_000e: 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_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) if (!TryGetServerSwitch(sender, switchId, out var switchZdo)) { return; } ZDOMan instance = ZDOMan.instance; ZDO val = ((instance != null) ? instance.GetZDO(targetId) : null); if (!IsDoorTarget(val)) { Reply(sender, "That object is not a supported door, gate, or drawbridge"); return; } float num = Vector3.Distance(switchZdo.GetPosition(), val.GetPosition()); if (num > DoorSwitchPlugin.MaximumLinkDistance.Value) { Reply(sender, $"Target is too far away ({num:0} m; limit {DoorSwitchPlugin.MaximumLinkDistance.Value:0} m)"); return; } List list = SwitchData.ReadLinks(switchZdo); int num2 = list.FindIndex((ZDOID link) => link == targetId); if (num2 >= 0) { list.RemoveAt(num2); SwitchData.WriteLinks(switchZdo, list); Reply(sender, $"Target unlinked ({list.Count} remaining)"); } else if (list.Count >= DoorSwitchPlugin.MaximumLinks.Value) { Reply(sender, $"This switch already has the maximum of {DoorSwitchPlugin.MaximumLinks.Value} links"); } else { list.Add(targetId); SwitchData.WriteLinks(switchZdo, list); Reply(sender, $"Target linked ({list.Count} total)"); } } private static void OnClearLinks(long sender, ZDOID switchId) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if (TryGetServerSwitch(sender, switchId, out var switchZdo)) { SwitchData.WriteLinks(switchZdo, (IEnumerable)(object)new ZDOID[0]); Reply(sender, "All links removed"); } } private static void OnCycleMode(long sender, ZDOID switchId) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if (TryGetServerSwitch(sender, switchId, out var switchZdo)) { SwitchMode switchMode = (SwitchMode)((int)(SwitchData.ReadMode(switchZdo) + 1) % 3); switchZdo.Set("doorswitch_mode", (int)switchMode); Reply(sender, "Switch mode: " + SwitchData.GetModeName(switchMode)); } } private static bool TryGetServerSwitch(long sender, ZDOID switchId, out ZDO switchZdo) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) switchZdo = null; if ((Object)(object)ZNet.instance == (Object)null || !ZNet.instance.IsServer() || ZDOMan.instance == null) { return false; } switchZdo = ZDOMan.instance.GetZDO(switchId); if (switchZdo == null || !SwitchPieceFactory.IsSwitchPrefab(switchZdo.GetPrefab())) { Reply(sender, "The selected switch no longer exists"); switchZdo = null; return false; } return true; } private static List GetValidTargets(ZDO switchZdo) { //IL_0016: 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) List list = new List(); foreach (ZDOID item in SwitchData.ReadLinks(switchZdo)) { ZDO zDO = ZDOMan.instance.GetZDO(item); if (IsDoorTarget(zDO)) { list.Add(zDO); } } return list; } private static bool IsDoorTarget(ZDO target) { if (target == null || (Object)(object)ZNetScene.instance == (Object)null) { return false; } GameObject prefab = ZNetScene.instance.GetPrefab(target.GetPrefab()); if ((Object)(object)prefab != (Object)null) { return (Object)(object)prefab.GetComponentInChildren(true) != (Object)null; } return false; } private static void SendOperation(long peerId, bool desiredOpen, List targets) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0033: Unknown result type (might be due to invalid IL or missing references) ZPackage val = new ZPackage(); val.Write((byte)5); val.Write(desiredOpen); val.Write(targets.Count); foreach (ZDO target in targets) { val.Write(target.m_uid); } rpc.SendPackage(peerId, val); } private static void OnOperateTargets(ZPackage package) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) bool flag = package.ReadBool(); int num = Mathf.Clamp(package.ReadInt(), 0, 256); int num2 = 0; int num3 = 0; int num4 = 0; Humanoid localPlayer = (Humanoid)(object)Player.m_localPlayer; for (int i = 0; i < num; i++) { ZDOID val = package.ReadZDOID(); ZNetScene instance = ZNetScene.instance; GameObject val2 = ((instance != null) ? instance.FindInstance(val) : null); Door val3 = (((Object)(object)val2 != (Object)null) ? val2.GetComponentInChildren(true) : null); ZNetView val4 = (((Object)(object)val3 != (Object)null) ? ((Component)val3).GetComponentInParent() : null); if ((Object)(object)val3 == (Object)null || (Object)(object)val4 == (Object)null || !val4.IsValid() || (Object)(object)localPlayer == (Object)null) { continue; } num2++; if (val4.GetZDO().GetInt(ZDOVars.s_state, 0) != 0 != flag) { num3++; if (LinkingSession.InteractWithoutLinking(val3, localPlayer)) { num4++; } } } if (num2 == 0) { OnResult("Linked doors are not loaded; move closer and try again"); } else if (num4 > 0) { OnResult(string.Format("{0} {1} linked target{2}", flag ? "Opened" : "Closed", num4, (num4 == 1) ? string.Empty : "s")); } else if (num3 == 0) { OnResult("All loaded linked targets are already " + (flag ? "open" : "closed")); } } private static void Reply(long peerId, string message) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Expected O, but got Unknown if (rpc != null) { ZPackage val = new ZPackage(); val.Write((byte)4); val.Write(message); rpc.SendPackage(peerId, val); } } private static void OnResult(string message) { LinkingSession.ShowMessage(message); } }