Decompiled source of Desk Swarm v0.1.0
DeskSwarm.dll
Decompiled a day 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.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EZhex1991.EZSoftBone; using HarmonyLib; using Microsoft.CodeAnalysis; using OnTogetherMods.Shared; using PurrNet; using PurrNet.Modules; using Steamworks; using TMPro; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; [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("DeskSwarm")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.1.0.0")] [assembly: AssemblyInformationalVersion("0.1.0+0b27320f963af1e8d0082d17c2086af5659a05e0")] [assembly: AssemblyProduct("DeskSwarm")] [assembly: AssemblyTitle("DeskSwarm")] [assembly: AssemblyVersion("0.1.0.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 OnTogetherMods.Shared { internal static class PanelStack { private const string TableKey = "OnTogetherMods.PanelStack.Panels"; private const string HiddenKey = "OnTogetherMods.PanelStack.Hidden"; private const string IconBarKey = "OnTogetherMods.IconBar.Rect"; private const float Margin = 20f; private const float FromRight = 0.15f; private const float Gap = 10f; private const int WorldScene = 2; public const int PhotoModeOrder = 0; public const int EmoteSyncOrder = 10; public const int TeleportSpotsOrder = 20; public const int SongPlayerOrder = 30; public const int TraceOverlayOrder = 40; public const int NameDesignerOrder = 50; public const int OutfitSlotsOrder = 60; public const int DeskSwarmOrder = 70; public const string CanvasPrefix = "OnTogetherMods "; private static int _hiddenFrame = -1; private static bool _gameUIHidden; private static FieldRef<UIManager, HideUIState> _eyeState; private static bool _eyeStateMissing; public static float Width => (float)Screen.width * 1080f / (float)Screen.height; public static bool Hidden { get { if (!(AppDomain.CurrentDomain.GetData("OnTogetherMods.PanelStack.Hidden") is int num) || Time.frameCount > num) { return GameUIHidden; } return true; } } public static bool GameUIHidden { get { //IL_001a: 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_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Invalid comparison between Unknown and I4 int frameCount = Time.frameCount; if (_hiddenFrame != frameCount) { _hiddenFrame = frameCount; _gameUIHidden = false; Scene activeScene = SceneManager.GetActiveScene(); if (((Scene)(ref activeScene)).buildIndex == 2) { UIManager i = MonoSingleton<UIManager>.I; _gameUIHidden = (Object)(object)i != (Object)null && (int)EyeState(i) > 0; } } return _gameUIHidden; } } public static bool IsModCanvas(Canvas canvas) { Canvas val = canvas; Transform parent = ((Component)canvas).transform.parent; while ((Object)(object)parent != (Object)null) { Canvas component = ((Component)parent).GetComponent<Canvas>(); val = (((Object)(object)component != (Object)null) ? component : val); parent = parent.parent; } return ((Object)((Component)val).gameObject).name.StartsWith("OnTogetherMods ", StringComparison.Ordinal); } private static HideUIState EyeState(UIManager ui) { if (_eyeState == null && !_eyeStateMissing) { try { _eyeState = AccessTools.FieldRefAccess<UIManager, HideUIState>("_hideUIState"); } catch (Exception) { _eyeStateMissing = true; } } if (_eyeState != null) { return _eyeState.Invoke(ui); } return (HideUIState)0; } public static void HideForCapture() { AppDomain.CurrentDomain.SetData("OnTogetherMods.PanelStack.Hidden", Time.frameCount + 1); } public static Rect Place(string id, int order, Vector2 size) { //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_004d: 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_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) Hashtable hashtable = Panels(); int frameCount = Time.frameCount; hashtable[id] = new double[3] { order, size.y, frameCount }; float width = Width; float num = Mathf.Max(20f, width * 0.85f - size.x); float num2 = Bottom(num + size.x, frameCount) - size.y; foreach (DictionaryEntry item in hashtable) { string text = (string)item.Key; double[] array = (double[])item.Value; bool flag = (double)frameCount - array[2] <= 2.0; bool flag2 = array[0] < (double)order || (array[0] == (double)order && string.CompareOrdinal(text, id) < 0); if (text != id && flag && flag2) { num2 -= (float)array[1] + 10f; } } return new Rect(num, num2, size.x, size.y); } private static float Bottom(float windowRight, int frame) { float num = 1060f; if (AppDomain.CurrentDomain.GetData("OnTogetherMods.IconBar.Rect") is double[] array && (double)frame - array[4] <= 2.0) { float num2 = 1080f / (float)Screen.height; if (array[0] * (double)num2 < (double)(windowRight + 10f)) { num = Mathf.Min(num, (float)array[1] * num2 - 10f); } } return num; } public static Matrix4x4 Begin(out float width) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) float num = (float)Screen.height / 1080f; Matrix4x4 matrix = GUI.matrix; GUI.matrix = Matrix4x4.Scale(new Vector3(num, num, 1f)); width = (float)Screen.width / num; return matrix; } public static void End(Matrix4x4 previous) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) GUI.matrix = previous; } public static GUIStyle MakeStyle(TextAnchor alignment) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0010: 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_001e: 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_002c: 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_003f: Expected O, but got Unknown //IL_003f: 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_0050: Expected O, but got Unknown GUIStyle val = new GUIStyle(GUI.skin.box) { alignment = alignment, fontSize = 15, richText = true, wordWrap = false, padding = new RectOffset(12, 12, 10, 10) }; val.normal.textColor = Color.white; return val; } private static Hashtable Panels() { Hashtable hashtable = AppDomain.CurrentDomain.GetData("OnTogetherMods.PanelStack.Panels") as Hashtable; if (hashtable == null) { hashtable = new Hashtable(); AppDomain.CurrentDomain.SetData("OnTogetherMods.PanelStack.Panels", hashtable); } return hashtable; } } internal static class IconBar { public enum State { Plain, Open, On, Off } public enum Click { None, Left, Right } private struct Metrics { public float Unit; public int Art; public int Button; public int Gap; public int Margin; } private static class Patches { private static Action<InputManager, bool> _setMouse0Down; private static Action<InputManager, bool> _setMouse1; private static Action<InputManager, bool> _setMouse1Up; private static FieldRef<QuadPainterGPU, Vector2> _previousUV; private static bool _leftOnBar; private static bool _rightOnBar; public static void Apply(Harmony harmony) { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Expected O, but got Unknown _setMouse0Down = Setter("IsMouseButton0Down"); _setMouse1 = Setter("IsMouseButton1"); _setMouse1Up = Setter("IsMouseButton1Up"); harmony.Patch((MethodBase)AccessTools.Method(typeof(InputManager), "Update", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(Patches), "InputPostfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); _previousUV = AccessTools.FieldRefAccess<QuadPainterGPU, Vector2>("previousUV"); harmony.Patch((MethodBase)AccessTools.Method(typeof(QuadPainterGPU), "Update", (Type[])null, (Type[])null), new HarmonyMethod(typeof(Patches), "PaintPrefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } private static void InputPostfix(InputManager __instance) { bool mouseOver = MouseOver; if (Input.GetMouseButtonDown(0)) { _leftOnBar = mouseOver; } if (Input.GetMouseButtonDown(1)) { _rightOnBar = mouseOver; } if (mouseOver) { _setMouse0Down(__instance, arg2: false); } if (_rightOnBar) { _setMouse1(__instance, arg2: false); _setMouse1Up(__instance, arg2: false); } if (!Input.GetMouseButton(0)) { _leftOnBar = false; } if (!Input.GetMouseButton(1)) { _rightOnBar = false; } } private static bool PaintPrefix(QuadPainterGPU __instance) { if (__instance.IsActive && (_leftOnBar || MouseOver)) { _previousUV.Invoke(__instance).x = -1f; return false; } return true; } private static Action<InputManager, bool> Setter(string property) { return (Action<InputManager, bool>)Delegate.CreateDelegate(typeof(Action<InputManager, bool>), AccessTools.PropertySetter(typeof(InputManager), property)); } } public const int PhotoModeOrder = 0; public const int EmoteSyncOrder = 10; public const int TeleportSpotsOrder = 20; public const int NameDesignerOrder = 30; public const int OutfitSlotsOrder = 35; public const int DeskSnapOrder = 40; public const int DeskSwarmOrder = 45; public const int FocusAnywhereOrder = 50; public const int SongPlayerOrder = 60; public const int TraceOverlayOrder = 70; public const int ChatRangeOrder = 80; public const int QuickHideOrder = 90; public const int NetworkCrashFixOrder = 100; private const string RectKey = "OnTogetherMods.IconBar.Rect"; private const string TableKey = "OnTogetherMods.IconBar.Icons"; private const string PatchedKey = "OnTogetherMods.IconBar.Patched"; private const string BlockerKey = "OnTogetherMods.IconBar.Blocker"; private const string BlockerFrameKey = "OnTogetherMods.IconBar.BlockerFrame"; private const string HiddenKey = "OnTogetherMods.IconBar.HiddenUntil"; private const int WorldScene = 2; private const int TooltipDepth = -100; private static readonly Dictionary<char, Color32> Palette = new Dictionary<char, Color32> { { 'K', new Color32((byte)42, (byte)36, (byte)51, byte.MaxValue) }, { 'W', new Color32((byte)247, (byte)243, (byte)234, byte.MaxValue) }, { 'G', new Color32((byte)201, (byte)198, (byte)207, byte.MaxValue) }, { 'g', new Color32((byte)143, (byte)138, (byte)153, byte.MaxValue) }, { 'D', new Color32((byte)87, (byte)82, (byte)95, byte.MaxValue) }, { 'B', new Color32((byte)168, (byte)107, (byte)60, byte.MaxValue) }, { 'b', new Color32((byte)217, (byte)160, (byte)102, byte.MaxValue) }, { 'd', new Color32((byte)110, (byte)67, (byte)37, byte.MaxValue) }, { 'R', new Color32((byte)224, (byte)90, (byte)90, byte.MaxValue) }, { 'r', new Color32((byte)168, (byte)58, (byte)70, byte.MaxValue) }, { 'p', new Color32((byte)246, (byte)165, (byte)165, byte.MaxValue) }, { 'Y', new Color32((byte)245, (byte)208, (byte)97, byte.MaxValue) }, { 'y', new Color32((byte)201, (byte)150, (byte)50, byte.MaxValue) }, { 'O', new Color32((byte)232, (byte)146, (byte)74, byte.MaxValue) }, { 'L', new Color32((byte)159, (byte)214, (byte)245, byte.MaxValue) }, { 'U', new Color32((byte)74, (byte)143, (byte)217, byte.MaxValue) }, { 'u', new Color32((byte)47, (byte)90, (byte)158, byte.MaxValue) }, { 'N', new Color32((byte)116, (byte)192, (byte)105, byte.MaxValue) }, { 'n', new Color32((byte)63, (byte)138, (byte)74, byte.MaxValue) }, { 'P', new Color32((byte)246, (byte)207, (byte)174, byte.MaxValue) }, { 'V', new Color32((byte)154, (byte)114, (byte)214, byte.MaxValue) }, { 'v', new Color32((byte)105, (byte)72, (byte)160, byte.MaxValue) }, { 'S', new Color32((byte)233, (byte)139, (byte)181, byte.MaxValue) }, { 'H', new Color32((byte)60, (byte)48, (byte)56, byte.MaxValue) } }; private static readonly Color32 ButtonFill = new Color32((byte)28, (byte)26, (byte)34, (byte)200); private static readonly Color32 ButtonEdge = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)30); private static readonly Color32 HoverFill = new Color32((byte)48, (byte)45, (byte)58, (byte)225); private static readonly Color32 HoverEdge = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)80); private static readonly Color32 OpenFill = new Color32((byte)70, (byte)64, (byte)88, (byte)235); private static readonly Color32 OpenEdge = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)150); private static readonly Color32 DotFill = new Color32((byte)140, (byte)220, (byte)120, byte.MaxValue); private static readonly Color32 DotEdge = new Color32((byte)20, (byte)40, (byte)20, byte.MaxValue); private static readonly Dictionary<string[], Texture2D[]> Icons = new Dictionary<string[], Texture2D[]>(); private static Texture2D _buttonTexture; private static Texture2D _hoverTexture; private static Texture2D _openTexture; private static Texture2D _dotTexture; private static GUIStyle _buttonStyle; private static GUIStyle _tipStyle; private static int _builtFor; private static int _cachedFrame = -1; private static bool _inWorld; private static bool _visible; private static int _pressedButton; private static bool RowHidden { get { if (AppDomain.CurrentDomain.GetData("OnTogetherMods.IconBar.HiddenUntil") is int num) { return Time.frameCount <= num; } return false; } } public static bool MouseOver { get { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_005c: 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_006f: Unknown result type (might be due to invalid IL or missing references) if (!(AppDomain.CurrentDomain.GetData("OnTogetherMods.IconBar.Rect") is double[] array) || array[5] < 0.5 || (double)Time.frameCount - array[4] > 2.0) { return false; } Vector3 mousePosition = Input.mousePosition; Rect val = default(Rect); ((Rect)(ref val))..ctor((float)array[0], (float)array[1], (float)array[2], (float)array[3]); return ((Rect)(ref val)).Contains(new Vector2(mousePosition.x, (float)Screen.height - mousePosition.y)); } } public static Click Draw(string id, int order, string[] pixels, State state, string name, KeyCode key, string hint = null) { //IL_0086: 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_003d: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0049: 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_0029: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) int controlID = GUIUtility.GetControlID((FocusType)2); Event current = Event.current; Refresh(); if (!_inWorld) { Hide(controlID, current); UpdateBlocker(shown: false, default(Rect)); return Click.None; } Rect bar; Metrics m; Rect icon = Place(id, order, out bar, out m); Share(bar); UpdateBlocker(_visible, bar); if (!_visible) { Hide(controlID, current); return Click.None; } Matrix4x4 matrix = GUI.matrix; GUI.matrix = Matrix4x4.identity; try { return Handle(controlID, current, icon, m, pixels, state, name, key, hint); } finally { GUI.matrix = matrix; } } public static void HideRow() { AppDomain.CurrentDomain.SetData("OnTogetherMods.IconBar.HiddenUntil", Time.frameCount + 1); } public static string KeyText(KeyCode key) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) if ((int)key != 0) { return $" ({key})"; } return ""; } private static Click Handle(int control, Event e, Rect icon, Metrics m, string[] pixels, State state, string name, KeyCode key, string hint) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected I4, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) bool flag = ((Rect)(ref icon)).Contains(e.mousePosition); EventType typeForControl = e.GetTypeForControl(control); switch ((int)typeForControl) { default: { if ((int)typeForControl != 7) { break; } BuildStyles(m); bool flag2 = GUIUtility.hotControl == control; _buttonStyle.normal.background = ((state == State.Open || (flag2 && flag)) ? _openTexture : (flag ? _hoverTexture : _buttonTexture)); _buttonStyle.Draw(icon, false, false, false, false); Texture2D[] array = IconTextures(pixels); GUI.DrawTexture(new Rect(((Rect)(ref icon)).x + (((Rect)(ref icon)).width - (float)m.Art) / 2f, ((Rect)(ref icon)).y + (((Rect)(ref icon)).height - (float)m.Art) / 2f, (float)m.Art, (float)m.Art), (Texture)(object)((state == State.Off) ? array[1] : array[0])); if (state == State.On) { float num = Mathf.Max(1, Mathf.RoundToInt(2f * m.Unit)); float num2 = ((Texture)_dotTexture).width; GUI.DrawTexture(new Rect(((Rect)(ref icon)).xMax - num - num2, ((Rect)(ref icon)).yMax - num - num2, num2, num2), (Texture)(object)_dotTexture); } int num3; if (flag) { num3 = ((GUIUtility.hotControl == 0 || flag2) ? 1 : 0); if (num3 != 0) { DrawTooltip(icon, m, Tooltip(state, name, key, hint)); } } else { num3 = 0; } GUI.depth = ((num3 != 0) ? (-100) : 0); break; } case 0: if (flag && (e.button == 0 || e.button == 1)) { GUIUtility.hotControl = control; _pressedButton = e.button; e.Use(); } break; case 3: if (GUIUtility.hotControl == control) { e.Use(); } break; case 1: if (GUIUtility.hotControl != control) { break; } GUIUtility.hotControl = 0; e.Use(); if (flag && e.button == _pressedButton) { if (e.button != 0) { return Click.Right; } return Click.Left; } break; case 2: break; } return Click.None; } private static string Tooltip(State state, string name, KeyCode key, string hint) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) string text = name + KeyText(key); switch (state) { case State.On: text += ": on"; break; case State.Off: text += ": off"; break; } if (hint == null) { return text; } return text + "\n" + hint; } private static void DrawTooltip(Rect icon, Metrics m, string text) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_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_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) GUIContent val = new GUIContent(text); Vector2 val2 = _tipStyle.CalcSize(val); float num = Mathf.Clamp(((Rect)(ref icon)).center.x - val2.x / 2f, (float)m.Margin, Mathf.Max((float)m.Margin, (float)(Screen.width - m.Margin) - val2.x)); float num2 = ((Rect)(ref icon)).y - (float)m.Gap - val2.y; _tipStyle.Draw(new Rect(Mathf.Round(num), Mathf.Round(num2), val2.x, val2.y), val, false, false, false, false); } private static void Hide(int control, Event e) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 if (GUIUtility.hotControl == control) { GUIUtility.hotControl = 0; } if ((int)e.type == 7) { GUI.depth = 0; } } private static Metrics Measure() { float num = (float)Screen.height / 1080f; int num2 = Mathf.Max(1, Mathf.RoundToInt(2f * num)); int num3 = Mathf.Max(2, Mathf.RoundToInt(4f * num)); return new Metrics { Unit = num, Art = 16 * num2, Button = 16 * num2 + 2 * num3, Gap = Mathf.Max(2, Mathf.RoundToInt(6f * num)), Margin = Mathf.RoundToInt(20f * num) }; } private static Rect Place(string id, int order, out Rect bar, out Metrics m) { //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0137: 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) Hashtable hashtable = Table(); int frameCount = Time.frameCount; if (hashtable[id] is double[] array) { array[0] = order; array[1] = frameCount; } else { hashtable[id] = new double[2] { order, frameCount }; } int num = 0; int num2 = 0; foreach (DictionaryEntry item in hashtable) { string text = (string)item.Key; double[] array2 = (double[])item.Value; if (!((double)frameCount - array2[1] > 2.0)) { num2++; if (text != id && (array2[0] < (double)order || (array2[0] == (double)order && string.CompareOrdinal(text, id) < 0))) { num++; } } } m = Measure(); int num3 = num2 * m.Button + (num2 - 1) * m.Gap; int num4 = Screen.width - m.Margin - num3; int num5 = Screen.height - m.Margin - m.Button; bar = new Rect((float)num4, (float)num5, (float)num3, (float)m.Button); return new Rect((float)(num4 + num * (m.Button + m.Gap)), (float)num5, (float)m.Button, (float)m.Button); } private static void Share(Rect bar) { AppDomain currentDomain = AppDomain.CurrentDomain; int frameCount = Time.frameCount; if (!(currentDomain.GetData("OnTogetherMods.IconBar.Rect") is double[] array) || (int)array[4] != frameCount || !(array[2] >= (double)((Rect)(ref bar)).width)) { currentDomain.SetData("OnTogetherMods.IconBar.Rect", new double[6] { ((Rect)(ref bar)).x, ((Rect)(ref bar)).y, ((Rect)(ref bar)).width, ((Rect)(ref bar)).height, frameCount, _visible ? 1 : 0 }); } } private static Hashtable Table() { Hashtable hashtable = AppDomain.CurrentDomain.GetData("OnTogetherMods.IconBar.Icons") as Hashtable; if (hashtable == null) { hashtable = new Hashtable(); AppDomain.CurrentDomain.SetData("OnTogetherMods.IconBar.Icons", hashtable); } return hashtable; } private static void Refresh() { //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_0055: 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_0063: Invalid comparison between Unknown and I4 int frameCount = Time.frameCount; if (_cachedFrame != frameCount) { _cachedFrame = frameCount; Scene activeScene = SceneManager.GetActiveScene(); _inWorld = ((Scene)(ref activeScene)).buildIndex == 2; _visible = false; if (_inWorld && !PanelStack.Hidden && !RowHidden) { TaskManager i = MonoSingleton<TaskManager>.I; _visible = (Object)(object)i != (Object)null && ((int)i.LockState == 0 || (int)i.LockState == 5); } } } private static void UpdateBlocker(bool shown, Rect bar) { //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected O, but got Unknown //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_00bd: 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_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) AppDomain currentDomain = AppDomain.CurrentDomain; int frameCount = Time.frameCount; if (currentDomain.GetData("OnTogetherMods.IconBar.BlockerFrame") is int num && num == frameCount) { return; } currentDomain.SetData("OnTogetherMods.IconBar.BlockerFrame", frameCount); object? data = currentDomain.GetData("OnTogetherMods.IconBar.Blocker"); GameObject val = (GameObject)((data is GameObject) ? data : null); if ((Object)(object)val == (Object)null) { if (!shown) { return; } val = CreateBlocker(); currentDomain.SetData("OnTogetherMods.IconBar.Blocker", val); } if (shown) { RectTransform val2 = (RectTransform)val.transform.GetChild(0); Vector2 val3 = default(Vector2); ((Vector2)(ref val3))..ctor(((Rect)(ref bar)).x, (float)Screen.height - ((Rect)(ref bar)).yMax); if (val2.anchoredPosition != val3) { val2.anchoredPosition = val3; } if (val2.sizeDelta != ((Rect)(ref bar)).size) { val2.sizeDelta = ((Rect)(ref bar)).size; } } if (val.activeSelf != shown) { val.SetActive(shown); } } private static GameObject CreateBlocker() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_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) //IL_008d: 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_0093: 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_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("OnTogetherMods IconBar ClickBlocker"); Object.DontDestroyOnLoad((Object)(object)val); Canvas obj = val.AddComponent<Canvas>(); obj.renderMode = (RenderMode)0; obj.sortingOrder = 32767; val.AddComponent<GraphicRaycaster>(); GameObject val2 = new GameObject("Area", new Type[3] { typeof(RectTransform), typeof(CanvasRenderer), typeof(Image) }); val2.transform.SetParent(val.transform, false); ((Graphic)val2.GetComponent<Image>()).color = Color.clear; RectTransform val3 = (RectTransform)val2.transform; val3.anchorMin = Vector2.zero; val3.anchorMax = Vector2.zero; val3.pivot = Vector2.zero; val.SetActive(false); return val; } public static void Patch() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown AppDomain currentDomain = AppDomain.CurrentDomain; if (currentDomain.GetData("OnTogetherMods.IconBar.Patched") != null) { return; } currentDomain.SetData("OnTogetherMods.IconBar.Patched", true); try { Patches.Apply(new Harmony("nelphei.ontogether.iconbar")); } catch (Exception arg) { Debug.LogError((object)$"[OnTogetherMods] Icon bar patches failed, so clicks on it may reach the game: {arg}"); } } private static Texture2D[] IconTextures(string[] pixels) { //IL_0093: 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_0095: 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_00a8: 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_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) if (Icons.TryGetValue(pixels, out var value) && (Object)(object)value[0] != (Object)null && (Object)(object)value[1] != (Object)null) { return value; } Color32[] array = (Color32[])(object)new Color32[256]; Color32[] array2 = (Color32[])(object)new Color32[256]; for (int i = 0; i < 16; i++) { string text = ((i < pixels.Length) ? pixels[i] : ""); for (int j = 0; j < 16; j++) { char key = ((j < text.Length) ? text[j] : '.'); Color32 value2; Color32 val = (Color32)(Palette.TryGetValue(key, out value2) ? value2 : new Color32((byte)0, (byte)0, (byte)0, (byte)0)); int num = (15 - i) * 16 + j; array[num] = val; byte b = (byte)Mathf.RoundToInt(0.3f * (float)(int)val.r + 0.59f * (float)(int)val.g + 0.11f * (float)(int)val.b); array2[num] = new Color32(b, b, b, (byte)((float)(int)val.a * 0.45f)); } } value = (Texture2D[])(object)new Texture2D[2] { NewTexture(16, 16, array, (FilterMode)0), NewTexture(16, 16, array2, (FilterMode)0) }; Icons[pixels] = value; return value; } private static void BuildStyles(Metrics m) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008e: 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_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_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Expected O, but got Unknown //IL_0105: Expected O, but got Unknown //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Expected O, but got Unknown //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Expected O, but got Unknown //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Expected O, but got Unknown //IL_01bd: Unknown result type (might be due to invalid IL or missing references) if (_builtFor != Screen.height || _buttonStyle == null || !((Object)(object)_buttonTexture != (Object)null) || !((Object)(object)_dotTexture != (Object)null)) { _builtFor = Screen.height; int num = Mathf.Max(2, Mathf.RoundToInt(6f * m.Unit)); Destroy(_buttonTexture); Destroy(_hoverTexture); Destroy(_openTexture); Destroy(_dotTexture); _buttonTexture = RoundedBox(num, ButtonFill, ButtonEdge); _hoverTexture = RoundedBox(num, HoverFill, HoverEdge); _openTexture = RoundedBox(num, OpenFill, OpenEdge); int num2 = Mathf.Max(2, Mathf.RoundToInt(3f * m.Unit)); _dotTexture = RoundedBox(num2, DotFill, DotEdge, 2 * num2); int num3 = num + 1; _buttonStyle = new GUIStyle { border = new RectOffset(num3, num3, num3, num3) }; _tipStyle = new GUIStyle { border = new RectOffset(num3, num3, num3, num3), padding = new RectOffset(Mathf.RoundToInt(10f * m.Unit), Mathf.RoundToInt(10f * m.Unit), Mathf.RoundToInt(6f * m.Unit), Mathf.RoundToInt(6f * m.Unit)), fontSize = Mathf.Max(8, Mathf.RoundToInt(15f * m.Unit)), alignment = (TextAnchor)3, wordWrap = false, richText = false }; _tipStyle.normal.background = _hoverTexture; _tipStyle.normal.textColor = Color.white; } } private static Texture2D RoundedBox(int radius, Color32 fill, Color32 edge, int size = 0) { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_008d: 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_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: 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) if (size <= 0) { size = 2 * radius + 4; } Color32[] array = (Color32[])(object)new Color32[size * size]; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { float num = (float)j + 0.5f; float num2 = (float)i + 0.5f; float num3 = Mathf.Max(Mathf.Max((float)radius - num, num - (float)(size - radius)), 0f); float num4 = Mathf.Max(Mathf.Max((float)radius - num2, num2 - (float)(size - radius)), 0f); float num5 = Mathf.Sqrt(num3 * num3 + num4 * num4) - (float)radius; float num6 = Mathf.Clamp01(0.5f - num5); Color val = Color.Lerp(Color32.op_Implicit(fill), Color32.op_Implicit(edge), Mathf.Clamp01(num5 + 1.5f)); val.a *= num6; array[i * size + j] = Color32.op_Implicit(val); } } return NewTexture(size, size, array, (FilterMode)1); } private static Texture2D NewTexture(int width, int height, Color32[] pixels, FilterMode filter) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0017: 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_002f: Expected O, but got Unknown Texture2D val = new Texture2D(width, height, (TextureFormat)4, false) { filterMode = filter, wrapMode = (TextureWrapMode)1, hideFlags = (HideFlags)61 }; val.SetPixels32(pixels); val.Apply(false, true); return val; } private static void Destroy(Texture2D texture) { if ((Object)(object)texture != (Object)null) { Object.Destroy((Object)(object)texture); } } } internal sealed class ClickBlocker { private readonly GameObject _root; private readonly RectTransform _area; public ClickBlocker(string name) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown //IL_009a: 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_00b5: Expected O, but got Unknown //IL_00bb: 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_00db: Unknown result type (might be due to invalid IL or missing references) _root = new GameObject(name); Object.DontDestroyOnLoad((Object)(object)_root); Canvas obj = _root.AddComponent<Canvas>(); obj.renderMode = (RenderMode)0; obj.sortingOrder = 32767; _root.AddComponent<GraphicRaycaster>(); GameObject val = new GameObject("Area", new Type[3] { typeof(RectTransform), typeof(CanvasRenderer), typeof(Image) }); val.transform.SetParent(_root.transform, false); ((Graphic)val.GetComponent<Image>()).color = Color.clear; _area = (RectTransform)val.transform; _area.anchorMin = Vector2.zero; _area.anchorMax = Vector2.zero; _area.pivot = Vector2.zero; _root.SetActive(false); } public void Update(bool shown, Rect screenRect) { //IL_002d: 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) if (!((Object)(object)_root == (Object)null)) { if (shown) { _area.anchoredPosition = new Vector2(((Rect)(ref screenRect)).x, (float)Screen.height - ((Rect)(ref screenRect)).yMax); _area.sizeDelta = ((Rect)(ref screenRect)).size; } if (_root.activeSelf != shown) { _root.SetActive(shown); } } } public void Destroy() { if ((Object)(object)_root != (Object)null) { Object.Destroy((Object)(object)_root); } } public static bool MouseIn(Rect screenRect) { //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_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) Vector3 mousePosition = Input.mousePosition; return ((Rect)(ref screenRect)).Contains(new Vector2(mousePosition.x, (float)Screen.height - mousePosition.y)); } } internal sealed class TextBox { public const float FontSize = 18f; private static readonly RectOffset Padding = new RectOffset(12, 12, 10, 10); private static Sprite _boxSprite; private static bool _lookedForBox; private readonly string _name; private readonly TextAlignmentOptions _alignment; private GameObject _root; private RectTransform _box; private TextMeshProUGUI _text; private int _drawnFrame = -100; private string _measured; private TMP_FontAsset _measuredFont; private Vector2 _measuredSize; public TMP_FontAsset Font { get; set; } public TextBox(string name, TextAlignmentOptions alignment) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) _name = name; _alignment = alignment; } public Vector2 Measure(string text) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0051: 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_006d: 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) Prepare(); if (text != _measured || (Object)(object)((TMP_Text)_text).font != (Object)(object)_measuredFont) { Vector2 preferredValues = ((TMP_Text)_text).GetPreferredValues(text); _measuredSize = new Vector2(Mathf.Ceil(preferredValues.x) + (float)Padding.horizontal, Mathf.Ceil(preferredValues.y) + (float)Padding.vertical); _measured = text; _measuredFont = ((TMP_Text)_text).font; } return _measuredSize; } public void Draw(Rect rect, string text) { //IL_003a: 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) Prepare(); if (((TMP_Text)_text).text != text) { ((TMP_Text)_text).text = text; } _box.anchoredPosition = new Vector2(((Rect)(ref rect)).x, 0f - ((Rect)(ref rect)).y); _box.sizeDelta = ((Rect)(ref rect)).size; _drawnFrame = Time.frameCount; } public void LateUpdate() { if (!((Object)(object)_root == (Object)null)) { bool flag = Time.frameCount - _drawnFrame <= 1 && !PanelStack.Hidden; if (_root.activeSelf != flag) { _root.SetActive(flag); } } } public void Destroy() { if ((Object)(object)_root != (Object)null) { Object.Destroy((Object)(object)_root); } } private void Prepare() { if ((Object)(object)_root == (Object)null) { Build(); } TMP_FontAsset val = (((Object)(object)Font != (Object)null) ? Font : PlayerNames.NameTagFont()); if ((Object)(object)val != (Object)null && (Object)(object)((TMP_Text)_text).font != (Object)(object)val) { ((TMP_Text)_text).font = val; } if (!_root.activeSelf && !PanelStack.Hidden) { _root.SetActive(true); } } private void Build() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_005f: 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_00b2: Expected O, but got Unknown //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Expected O, but got Unknown //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0104: 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_0107: 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_0157: 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_018c: Expected O, but got Unknown //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: 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_023c: 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) _root = new GameObject("OnTogetherMods " + _name); Object.DontDestroyOnLoad((Object)(object)_root); Canvas obj = _root.AddComponent<Canvas>(); obj.renderMode = (RenderMode)0; obj.sortingOrder = 32766; CanvasScaler obj2 = _root.AddComponent<CanvasScaler>(); obj2.uiScaleMode = (ScaleMode)1; obj2.referenceResolution = new Vector2(1920f, 1080f); obj2.screenMatchMode = (ScreenMatchMode)0; obj2.matchWidthOrHeight = 1f; GameObject val = new GameObject("Box", new Type[3] { typeof(RectTransform), typeof(CanvasRenderer), typeof(Image) }); val.transform.SetParent(_root.transform, false); _box = (RectTransform)val.transform; RectTransform box = _box; RectTransform box2 = _box; RectTransform box3 = _box; Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(0f, 1f); box3.pivot = val2; Vector2 anchorMin = (box2.anchorMax = val2); box.anchorMin = anchorMin; Image component = val.GetComponent<Image>(); ((Graphic)component).raycastTarget = false; Sprite val4 = BoxSprite(); if ((Object)(object)val4 != (Object)null) { component.sprite = val4; component.type = (Type)1; } else { ((Graphic)component).color = new Color(0f, 0f, 0f, 0.65f); } GameObject val5 = new GameObject("Text", new Type[2] { typeof(RectTransform), typeof(CanvasRenderer) }); val5.transform.SetParent(val.transform, false); RectTransform val6 = (RectTransform)val5.transform; val6.anchorMin = Vector2.zero; val6.anchorMax = Vector2.one; val6.offsetMin = new Vector2((float)Padding.left, (float)Padding.bottom); val6.offsetMax = new Vector2((float)(-Padding.right), (float)(-Padding.top)); _text = val5.AddComponent<TextMeshProUGUI>(); ((Graphic)_text).raycastTarget = false; ((TMP_Text)_text).richText = true; ((TMP_Text)_text).fontSize = 18f; ((Graphic)_text).color = Color.white; ((TMP_Text)_text).alignment = _alignment; ((TMP_Text)_text).textWrappingMode = (TextWrappingModes)0; ((TMP_Text)_text).overflowMode = (TextOverflowModes)0; _root.SetActive(false); } private static Sprite BoxSprite() { //IL_0050: 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_0087: Unknown result type (might be due to invalid IL or missing references) if (!_lookedForBox) { _lookedForBox = true; GUIStyle box = GUI.skin.box; Texture2D background = box.normal.background; if ((Object)(object)background != (Object)null) { RectOffset border = box.border; _boxSprite = Sprite.Create(background, new Rect(0f, 0f, (float)((Texture)background).width, (float)((Texture)background).height), new Vector2(0.5f, 0.5f), 100f, 0u, (SpriteMeshType)0, new Vector4((float)border.left, (float)border.bottom, (float)border.right, (float)border.top)); } } return _boxSprite; } } internal static class PlayerNames { private static readonly HashSet<string> Closable = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "color", "b", "i", "u", "s", "size", "font", "font-weight", "material", "mark", "gradient", "cspace", "mspace", "voffset", "alpha", "indent", "line-height", "line-indent", "align", "rotate", "lowercase", "uppercase", "allcaps", "smallcaps", "sup", "sub", "width", "margin", "nobr", "link", "style", "noparse" }; private static readonly Regex Tag = new Regex("<(/?)(#|[A-Za-z][\\w-]*)[^<>]*>"); private static TMP_FontAsset _font; private static float _nextFontLookup; public static string Of(PlayerController player) { string text = (((Object)(object)player != (Object)null && (Object)(object)player.PlayerNameText != (Object)null) ? ((TMP_Text)player.PlayerNameText).text : null); if (!string.IsNullOrWhiteSpace(text)) { return ForText(text.Trim()); } return null; } public static string Plain(string name) { return name.Replace("<", "‹"); } public static string WithoutTags(string name) { return Tag.Replace(name, ""); } public static string ForText(string name) { List<string> list = new List<string>(); bool flag = false; foreach (Match item in Tag.Matches(name)) { string text = ((item.Groups[2].Value == "#") ? "color" : item.Groups[2].Value.ToLowerInvariant()); bool flag2 = item.Groups[1].Value == "/"; if (!Closable.Contains(text) || (flag && (!flag2 || !(text == "noparse")))) { continue; } if (flag2) { int num = list.LastIndexOf(text); if (num >= 0) { list.RemoveAt(num); } } else { list.Add(text); } flag = list.Contains("noparse"); } StringBuilder stringBuilder = new StringBuilder(name); for (int num2 = list.Count - 1; num2 >= 0; num2--) { stringBuilder.Append("</").Append(list[num2]).Append('>'); } return stringBuilder.ToString(); } public static TMP_FontAsset NameTagFont() { if ((Object)(object)_font == (Object)null && Time.unscaledTime >= _nextFontLookup) { _nextFontLookup = Time.unscaledTime + 1f; PlayerController val = Object.FindAnyObjectByType<PlayerController>(); if ((Object)(object)val != (Object)null && (Object)(object)val.PlayerNameText != (Object)null) { _font = ((TMP_Text)val.PlayerNameText).font; } } return _font; } } } namespace DeskSwarm { internal static class AreaExits { public static HashSet<Collider> At(PlayerFocusController me, Vector3 position) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0059: 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_0065: Unknown result type (might be due to invalid IL or missing references) HashSet<Collider> hashSet = new HashSet<Collider>(); CharacterController component = ((Component)me).GetComponent<CharacterController>(); if ((Object)(object)component == (Object)null) { return hashSet; } float radius = component.radius; Vector3 val = position + component.center; float num = Mathf.Max(0f, component.height / 2f - radius); Collider[] array = Physics.OverlapCapsule(val + Vector3.up * num, val - Vector3.up * num, radius, -1, (QueryTriggerInteraction)2); foreach (Collider val2 in array) { if (val2.isTrigger && (Object)(object)((Component)val2).GetComponentInParent<PlayerController>() == (Object)null) { hashSet.Add(val2); } } return hashSet; } public static void LeaveOld(PlayerFocusController me, HashSet<Collider> before) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) if (before == null || before.Count == 0) { return; } HashSet<Collider> hashSet = At(me, ((Component)me).transform.position); CharacterController component = ((Component)me).GetComponent<CharacterController>(); PlayerAreaChecker val = ((Component)me).GetComponent<PlayerAreaChecker>() ?? ((Component)me).GetComponentInChildren<PlayerAreaChecker>(); int num = 0; foreach (Collider item in before) { if (!((Object)(object)item == (Object)null) && !hashSet.Contains(item)) { if ((Object)(object)val != (Object)null) { ((Component)val).gameObject.SendMessage("OnTriggerExit", (object)item, (SendMessageOptions)1); } if ((Object)(object)component != (Object)null) { ((Component)item).gameObject.SendMessage("OnTriggerExit", (object)component, (SendMessageOptions)1); } num++; if (Plugin.Settings.DebugLog.Value) { Plugin.Log.LogInfo((object)("Left the area " + ((Object)item).name + " after flying away from it.")); } } } if (num > 0) { Plugin.Log.LogInfo((object)$"Stood up away from where you sat down, so told the game you left {num} area(s) there."); } } } internal sealed class Flight { private const float FollowSmoothing = 0.45f; private const float FollowSpeed = 14f; private const float BobHeight = 0.06f; private const float BobSeconds = 2.4f; private const float MaxTilt = 12f; private const float TiltPerSpeed = 1.6f; private const float GroundSearch = 1.2f; private const float TrailStep = 0.25f; private int _ground; private readonly RaycastHit[] _hits = (RaycastHit[])(object)new RaycastHit[16]; private PlayerFocusController _sitter; private bool _flown; private HashSet<Collider> _sitAreas; private bool _managing; private Vector3 _base; private Vector3 _velocity; private float _yaw; private float _pitch; private float _roll; private float _bob; private readonly List<Vector3> _path = new List<Vector3>(); private ulong _pathLeader; private static Settings S => Plugin.Settings; public bool Piloting { get { return IsPiloting; } private set { IsPiloting = value; } } public static bool IsPiloting { get; private set; } public bool InFormation { get; private set; } public bool LeaderMissing { get; private set; } public void StartPiloting(PlayerFocusController me) { if (!Piloting && Game.CanFly(me)) { Piloting = true; Game.CameraDrift(on: false); Plugin.Log.LogInfo((object)"Took off."); } } public void StopPiloting(PlayerFocusController me) { if (Piloting) { Piloting = false; if (Game.CanFly(me)) { Game.CameraDrift(on: true); } Plugin.Log.LogInfo((object)"Stopped flying."); } } public void OnFocusPicked() { if (Piloting) { Game.CameraDrift(on: false); } } public void Update(PlayerFocusController me, Swarms swarms) { InFormation = false; LeaderMissing = false; bool flag = (Object)(object)me != (Object)null && me.IsFocus; if ((Object)(object)_sitter != (Object)null && ((Object)(object)_sitter != (Object)(object)me || !flag)) { EndSit(); } if (!Game.CanFly(me)) { Piloting = false; return; } if ((Object)(object)_sitter == (Object)null) { _sitter = me; _flown = false; } float deltaTime = Time.deltaTime; if (deltaTime <= 0f) { return; } Swarm followed = swarms.Followed; int mySpot = swarms.MySpot; if (followed != null && mySpot >= 0) { if (Piloting) { StopPiloting(me); } PlayerController val = Game.PlayerOf(followed.Leader); if ((Object)(object)val == (Object)null) { LeaderMissing = true; Settle(me, deltaTime); return; } Begin(me); Follow(followed, mySpot, ((Component)val).transform, deltaTime); InFormation = true; } else { if (!Piloting) { if (_managing) { Settle(me, deltaTime); } return; } Begin(me); Pilot(deltaTime); } _bob = Mathf.MoveTowards(_bob, 1f, deltaTime); Apply(me, deltaTime, InFormation, mySpot); } private void EndSit() { PlayerFocusController sitter = _sitter; _sitter = null; _managing = false; _path.Clear(); if (Piloting) { Piloting = false; Plugin.Log.LogInfo((object)"Stood up, so stopped flying."); } if (_flown && (Object)(object)sitter != (Object)null && !sitter.IsFocus) { AreaExits.LeaveOld(sitter, _sitAreas); } _flown = false; _sitAreas = null; } private void Begin(PlayerFocusController me) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_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) if (!_flown) { _flown = true; _sitAreas = AreaExits.At(me, ((Component)me).transform.position); } if (!_managing) { _managing = true; Transform transform = ((Component)me).transform; _base = transform.position; _yaw = transform.eulerAngles.y; _velocity = Vector3.zero; _pitch = 0f; _roll = 0f; _bob = 0f; } } private void Pilot(float dt) { //IL_0080: 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_0096: 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_00ac: 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) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_010a: 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) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0120: 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_0163: 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) float num = 0f; float num2 = 0f; float num3 = 0f; if (!Game.KeysBusy()) { InputManager i = MonoSingleton<InputManager>.I; num = i.Vertical; num2 = i.Horizontal; num3 = (Input.GetKey(S.UpKey.Value) ? 1f : 0f) - (Input.GetKey(S.DownKey.Value) ? 1f : 0f); } Vector3 val = Quaternion.Euler(0f, Game.CameraYaw(), 0f) * new Vector3(num2, 0f, num); if (((Vector3)(ref val)).sqrMagnitude > 1f) { ((Vector3)(ref val)).Normalize(); } Vector3 val2 = val * S.FlySpeed.Value + Vector3.up * (num3 * S.ClimbSpeed.Value); _velocity = Vector3.Lerp(_velocity, val2, 1f - Mathf.Exp(-3f * dt)); _base += _velocity * dt; Vector3 val3 = default(Vector3); ((Vector3)(ref val3))..ctor(_velocity.x, 0f, _velocity.z); if (((Vector3)(ref val3)).sqrMagnitude > 0.16f) { _yaw = Mathf.LerpAngle(_yaw, Mathf.Atan2(val3.x, val3.z) * 57.29578f, 1f - Mathf.Exp(-5f * dt)); } } private void Follow(Swarm swarm, int spot, Transform leader, float dt) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: 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_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: 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_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) Vector3 position = leader.position; float y = leader.eulerAngles.y; RecordPath(swarm, position); float yaw; Vector3 val = Formations.Place(swarm.Formation, spot, swarm.Members.Count, swarm.Spread, position, y, Game.SharedTime, _path, out yaw); float num = Vector3.Distance(_base, val); _base = Vector3.SmoothDamp(_base, val, ref _velocity, 0.45f, Mathf.Max(14f, num * 1.5f), dt); _yaw = Mathf.LerpAngle(_yaw, yaw, 1f - Mathf.Exp(-4f * dt)); } private void Settle(PlayerFocusController me, float dt) { //IL_0018: 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_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: 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) if (_managing) { float num = Mathf.Exp(-4f * dt); _velocity *= num; _base += _velocity * dt; _bob = Mathf.MoveTowards(_bob, 0f, dt); Apply(me, dt, follower: false, 0); if (((Vector3)(ref _velocity)).sqrMagnitude < 0.0004f && Mathf.Abs(_pitch) < 0.2f && Mathf.Abs(_roll) < 0.2f && _bob <= 0f) { Game.MoveSeated(me, _base, Quaternion.Euler(0f, _yaw, 0f), _yaw); _managing = false; } } } private void Apply(PlayerFocusController me, float dt, bool follower, int spot) { //IL_0002: 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_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_0169: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0199: 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_01a3: Unknown result type (might be due to invalid IL or missing references) float num = Floor(_base) + 0.06f * _bob; if (_base.y < num) { _base.y = num; _velocity.y = Mathf.Max(0f, _velocity.y); } float num2 = 0f; float num3 = 0f; if (S.Tilt.Value) { Vector3 val = Quaternion.Inverse(Quaternion.Euler(0f, _yaw, 0f)) * _velocity; num2 = Mathf.Clamp(val.z * 1.6f, -12f, 12f); num3 = Mathf.Clamp((0f - val.x) * 1.6f, -12f, 12f); } float num4 = 1f - Mathf.Exp(-5f * dt); _pitch = Mathf.Lerp(_pitch, num2, num4); _roll = Mathf.Lerp(_roll, num3, num4); float num5 = (follower ? ((float)spot * 1.7f) : 0f); float num6 = _bob * 0.06f * Mathf.Sin((float)(Game.SharedTime % 2.4000000953674316 / 2.4000000953674316) * 2f * MathF.PI + num5); Quaternion rotation = Quaternion.Euler(0f, _yaw, 0f) * Quaternion.Euler(_pitch, 0f, _roll); Game.MoveSeated(me, _base + Vector3.up * num6, rotation, _yaw); } private void RecordPath(Swarm swarm, Vector3 leaderAt) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0089: 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_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: 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) if (_pathLeader != swarm.Leader) { goto IL_003d; } Vector3 val; if (_path.Count > 0) { val = leaderAt - _path[0]; if (((Vector3)(ref val)).sqrMagnitude > 625f) { goto IL_003d; } } goto IL_0054; IL_0054: if (_path.Count != 0) { val = leaderAt - _path[0]; if (!(((Vector3)(ref val)).sqrMagnitude >= 0.0625f)) { goto IL_008f; } } _path.Insert(0, leaderAt); goto IL_008f; IL_008f: float num = Formations.PathNeeded(swarm.Members.Count, swarm.Spread); float num2 = 0f; for (int i = 1; i < _path.Count; i++) { num2 += Vector3.Distance(_path[i - 1], _path[i]); if (num2 > num) { _path.RemoveRange(i + 1, _path.Count - i - 1); break; } } return; IL_003d: _pathLeader = swarm.Leader; _path.Clear(); goto IL_0054; } private float Floor(Vector3 at) { //IL_005e: 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_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_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_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) if (_ground == 0) { _ground = ~LayerMask.GetMask(new string[7] { "Ignore Raycast", "Player", "Area", "AreaTrigger", "Customization", "IsGroundedChecker", "DeskRender" }); } float num = Game.SeaLevel + 0.1f; int num2 = Physics.RaycastNonAlloc(at + Vector3.up * 1.2f, Vector3.down, _hits, 1.2f, _ground, (QueryTriggerInteraction)1); for (int i = 0; i < num2; i++) { RaycastHit val = _hits[i]; if (((RaycastHit)(ref val)).point.y > num && (Object)(object)((Component)((RaycastHit)(ref val)).collider).GetComponentInParent<PlayerController>() == (Object)null && (Object)(object)((Component)((RaycastHit)(ref val)).collider).GetComponentInParent<PetController>() == (Object)null) { num = ((RaycastHit)(ref val)).point.y; } } return num; } } public enum Formation { Ring, V, Line, Tower, Trail } internal static class Formations { private const float Spacing = 1.7f; private const float OrbitSpeed = 1f; private const float PathSpare = 6f; public static readonly Formation[] All = new Formation[5] { Formation.Ring, Formation.V, Formation.Line, Formation.Tower, Formation.Trail }; public static Vector3 Place(Formation formation, int index, int count, float spread, Vector3 leader, float leaderYaw, double time, List<Vector3> path, out float yaw) { //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_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_0173: 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_0181: 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_018c: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) count = Mathf.Max(count, index + 1); float num = 1.7f * spread; Quaternion val = Quaternion.Euler(0f, leaderYaw, 0f); yaw = leaderYaw; switch (formation) { case Formation.Ring: { float num7 = Mathf.Max(2.6f * spread, (float)count * num / (MathF.PI * 2f)); double num8 = time * 1.0 / (double)num7 % 6.2831854820251465; float num9 = MathF.PI * 2f * (float)index / (float)count + (float)num8; Vector3 val3 = default(Vector3); ((Vector3)(ref val3))..ctor(num7 * Mathf.Sin(num9), 1f, num7 * Mathf.Cos(num9)); yaw = Mathf.Atan2(Mathf.Cos(num9), 0f - Mathf.Sin(num9)) * 57.29578f; return leader + val3; } case Formation.V: { int num5 = index / 2 + 1; float num6 = ((index % 2 == 0) ? (-1f) : 1f); Vector3 val2 = default(Vector3); ((Vector3)(ref val2))..ctor(num6 * (float)num5 * num * 0.8f, 0f, 0f - (0.6f + (float)num5 * num * 0.8f)); return leader + val * val2; } case Formation.Line: { int num3 = index / 2 + 1; float num4 = ((index % 2 == 0) ? (-1f) : 1f); return leader + val * new Vector3(num4 * (float)num3 * num, 0f, 0f); } case Formation.Tower: { float num2 = Mathf.Max(1.5f, 1.7f * spread); return leader + Vector3.up * (num2 * (float)(index + 1)); } default: return AlongPath(leader, leaderYaw, path, (float)(index + 1) * num * 1.1f + 0.4f, out yaw) + Vector3.up * 0.3f; } } public static float PathNeeded(int count, float spread) { return (float)(count + 1) * 1.7f * spread * 1.1f + 6f; } private static Vector3 AlongPath(Vector3 leader, float leaderYaw, List<Vector3> path, float distance, out float yaw) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: 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_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_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_00b3: 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_008d: 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_0099: 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_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) Vector3 val = leader; Vector3 val2 = Quaternion.Euler(0f, leaderYaw, 0f) * Vector3.back; float num = distance; if (path != null) { Vector3 val4 = default(Vector3); foreach (Vector3 item in path) { Vector3 val3 = item - val; float magnitude = ((Vector3)(ref val3)).magnitude; if (!(magnitude < 0.001f)) { ((Vector3)(ref val4))..ctor(val3.x, 0f, val3.z); if (((Vector3)(ref val4)).sqrMagnitude > 0.0001f) { val2 = ((Vector3)(ref val4)).normalized; } if (magnitude >= num) { yaw = YawOf(-val2); return val + val3 * (num / magnitude); } num -= magnitude; val = item; } } } yaw = YawOf(-val2); return val + val2 * num; } private static float YawOf(Vector3 direction) { //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) return Mathf.Atan2(direction.x, direction.z) * 57.29578f; } } internal static class Game { private const int WorldScene = 2; private static readonly FieldRef<PlayerFocusController, Vector3> PreFocusPosition = AccessTools.FieldRefAccess<PlayerFocusController, Vector3>("_preFocusPosition"); private static readonly FieldRef<PlayerFocusController, Quaternion> PreFocusRotation = AccessTools.FieldRefAccess<PlayerFocusController, Quaternion>("_preFocusRotation"); private static readonly FieldRef<PlayerFocusController, FocusAreaController> ActiveFocusArea = AccessTools.FieldRefAccess<PlayerFocusController, FocusAreaController>("_activeFocusAreaController"); private static ulong _lastId; private static string _lastIdText; private static readonly Dictionary<ulong, string> NameTags = new Dictionary<ulong, string>(); public static bool InWorld { get { //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) Scene activeScene = SceneManager.GetActiveScene(); return ((Scene)(ref activeScene)).buildIndex == 2; } } public static PlayerFocusController Me { get { if (!InWorld) { return null; } TextChannelManager i = NetworkSingleton<TextChannelManager>.I; if (!((Object)(object)i != (Object)null)) { return null; } return i.MainFocusController; } } public static PlayerMovementController MyMovement { get { TextChannelManager i = NetworkSingleton<TextChannelManager>.I; if (!((Object)(object)i != (Object)null)) { return null; } return i.MainMovementController; } } public static float SeaLevel { get { GameSettings i = ScriptableSingleton<GameSettings>.I; if (!((Object)(object)i != (Object)null)) { return float.MinValue; } return i.SwimPosY; } } public static double SharedTime { get { NetworkManager main = NetworkManager.main; if ((Object)(object)main != (Object)null && (main.isClient || main.isServer)) { TickManager tickModule = main.tickModule; if (tickModule != null) { return tickModule.syncedPreciseTick * tickModule.tickDeltaDouble; } } return Time.timeAsDouble; } } public static bool CanFly(PlayerFocusController me) { if ((Object)(object)me != (Object)null && me.IsFocus && (Object)(object)me.CurrentFocusAreaController == (Object)null) { return (Object)(object)ActiveFocusArea.Invoke(me) == (Object)null; } return false; } public static void MoveSeated(PlayerFocusController me, Vector3 position, Quaternion rotation, float yaw) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0023: 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_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0051: 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) Transform transform = ((Component)me).transform; Vector3 val = transform.position - position; bool num = ((Vector3)(ref val)).sqrMagnitude > 4f; transform.SetPositionAndRotation(position, rotation); PreFocusPosition.Invoke(me) = position; PreFocusRotation.Invoke(me) = Quaternion.Euler(0f, yaw, 0f); if (num) { ResetTail(me); } FollowScript i = MonoSingleton<FollowScript>.I; if ((Object)(object)i != (Object)null && (Object)(object)i.FollowTarget == (Object)(object)transform) { i.Update(); } } public static float CameraYaw() { //IL_0023: 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) MainSceneManager i = MonoSingleton<MainSceneManager>.I; Transform val = (((Object)(object)i != (Object)null) ? i.PlayerFollower : null); if ((Object)(object)val != (Object)null) { return val.eulerAngles.y; } Camera main = Camera.main; if (!((Object)(object)main != (Object)null)) { return 0f; } return ((Component)main).transform.eulerAngles.y; } public static void CameraDrift(bool on) { PlayerMovementController myMovement = MyMovement; if (!((Object)(object)myMovement == (Object)null)) { if (on) { myMovement.StartCameraRotationRoutine(); return; } myMovement.StopCameraRotationRoutine(); myMovement.CameraFocusRoutine = null; } } public static bool KeysBusy() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Invalid comparison between Unknown and I4 TaskManager i = MonoSingleton<TaskManager>.I; if (!((Object)(object)i == (Object)null) && !i.IsCancelInputs()) { return (int)i.LockState > 0; } return true; } public static bool IsTyping() { TaskManager i = MonoSingleton<TaskManager>.I; if ((Object)(object)i != (Object)null) { return i.IsWriting; } return false; } public static KeyCode StandUpKey() { //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_0020: 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) try { return MonoSingleton<DataManager>.I.SettingsData.Keys[(KeyType)4].Item1; } catch (Exception) { return (KeyCode)32; } } public static PlayerController PlayerOf(ulong steamId) { try { PlayerPanelController i = NetworkSingleton<PlayerPanelController>.I; if ((Object)(object)i == (Object)null || i.PlayerSteamIDs == null || i.PlayerControllers == null) { return null; } if (steamId != _lastId) { _lastId = steamId; _lastIdText = steamId.ToString(); } int num = i.PlayerSteamIDs.IndexOf(_lastIdText); return (num >= 0 && num < i.PlayerControllers.Count) ? i.PlayerControllers[num] : null; } catch (Exception) { return null; } } public static string PlayerName(ulong steamId) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) string text = PlayerNames.Of(PlayerOf(steamId)); if (text != null) { NameTags[steamId] = text; return text; } if (!NameTags.TryGetValue(steamId, out var value)) { return PlayerNames.Plain(LobbyChannel.NameOf(new CSteamID(steamId))); } return value; } private static void ResetTail(PlayerFocusController me) { PlayerCustomizationController component = ((Component)me).GetComponent<PlayerCustomizationController>(); if (!((Object)(object)component == (Object)null) && component.OutfitMeshRenderers.TryGetValue((OutfitType)8, out var value) && !((Object)(object)value == (Object)null) && !((Object)(object)((Component)value).transform.parent == (Object)null)) { EZSoftBone component2 = ((Component)((Component)value).transform.parent).GetComponent<EZSoftBone>(); if ((Object)(object)component2 != (Object)null) { component2.SetRestState(); } } } } internal static class Icon { public static readonly string[] Pixels = new string[16] { "................", ".GGGGGG..GGGGGG.", "...KgK....KgK...", "....g......g....", "....g.KKKK.g....", "....g.KLUK.g....", "....g.KUUK.g....", "KKKKKKKKKKKKKKKK", "KbbbbbbbbbbbbbbK", "KKKKKKKKKKKKKKKK", ".KBK........KBK.", ".KBK........KBK.", ".KKK........KKK.", "................", "..L..L....L..L..", ".L..L....L..L..." }; } internal sealed class LobbyChannel { private const string Tag = "OTDS1"; private Callback<LobbyChatMsg_t> _chatMsg; private Callback<LobbyChatUpdate_t> _chatUpdate; private readonly byte[] _buffer = new byte[4096]; private float _nextPoll; public CSteamID Lobby { get; private set; } = CSteamID.Nil; public CSteamID Me { get; private set; } = CSteamID.Nil; public bool InLobby => Lobby != CSteamID.Nil; public event Action<CSteamID, string[]> MessageReceived; public event Action<CSteamID> MemberLeft; public event Action LobbyChanged; public void Poll() { //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_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) if (Time.unscaledTime < _nextPoll) { return; } _nextPoll = Time.unscaledTime + 1f; CSteamID val = ReadLobby(); if (val == Lobby) { return; } Lobby = val; if (InLobby) { Me = SteamUser.GetSteamID(); if (_chatMsg == null) { _chatMsg = Callback<LobbyChatMsg_t>.Create((DispatchDelegate<LobbyChatMsg_t>)OnChatMsg); _chatUpdate = Callback<LobbyChatUpdate_t>.Create((DispatchDelegate<LobbyChatUpdate_t>)OnChatUpdate); } } Plugin.Log.LogInfo((object)(InLobby ? $"In lobby {Lobby}." : "Left the lobby.")); this.LobbyChanged?.Invoke(); } public bool Send(string message) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) if (!InLobby) { return false; } byte[] bytes = Encoding.ASCII.GetBytes("OTDS1 " + message); bool num = SteamMatchmaking.SendLobbyChatMsg(Lobby, bytes, bytes.Length); if (!num) { Plugin.Log.LogWarning((object)("Steam didn't send \"" + message + "\".")); return num; } if (Plugin.Settings.DebugLog.Value) { Plugin.Log.LogInfo((object)("Sent: " + message)); } return num; } public unsafe static string NameOf(CSteamID id) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) try { return SteamFriends.GetFriendPersonaName(id); } catch (Exception) { return ((object)(*(CSteamID*)(&id))/*cast due to .constrained prefix*/).ToString(); } } private static CSteamID ReadLobby() { //IL_0046: 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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) try { MultiplayerManager i = MonoSingleton<MultiplayerManager>.I; if ((Object)(object)i == (Object)null || !ulong.TryParse(i.LobbyCode, out var result) || result == 0L) { return CSteamID.Nil; } CSteamID val = default(CSteamID); ((CSteamID)(ref val))..ctor(result); return (SteamMatchmaking.GetNumLobbyMembers(val) > 0) ? val : CSteamID.Nil; } catch (Exception) { return CSteamID.Nil; } } private void OnChatMsg(LobbyChatMsg_t msg) { //IL_0000: 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_00b6: 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_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) if (msg.m_ulSteamIDLobby != Lobby.m_SteamID) { return; } CSteamID val = default(CSteamID); EChatEntryType val2 = default(EChatEntryType); int lobbyChatEntry = SteamMatchmaking.GetLobbyChatEntry(Lobby, (int)msg.m_iChatID, ref val, _buffer, _buffer.Length, ref val2); if (lobbyChatEntry <= 0 || val == Me) { return; } string text = Encoding.ASCII.GetString(_buffer, 0, lobbyChatEntry).TrimEnd('\0'); string[] array = text.Split(' '); if (array.Length < 2 || array[0] != "OTDS1") { return; } try { this.MessageReceived?.Invoke(val, array.AsSpan(1).ToArray()); } catch (Exception arg) { Plugin.Log.LogError((object)$"Failed to handle \"{text}\" from {NameOf(val)}: {arg}"); } } private void OnChatUpdate(LobbyChatUpdate_t update) { //IL_0000: 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_0013: 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_002f: Unknown result type (might be due to invalid IL or missing references) if (update.m_ulSteamIDLobby == Lobby.m_SteamID && (update.m_rgfChatMemberStateChange & 0x1E) != 0) { this.MemberLeft?.Invoke(new CSteamID(update.m_ulSteamIDUserChanged)); } } } [HarmonyPatch(typeof(InputManager), "Update")] internal static class InputPatch { private static readonly Action<InputManager, bool> SetMouse0Down = Setter("IsMouseButton0Down"); private static readonly Action<InputManager, bool> SetSpaceDown = Setter("IsSpaceKeyDown"); private static void Postfix(InputManager __instance) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) if (SwarmController.IsMouseOverWindow) { SetMouse0Down(__instance, arg2: false); } if (Flight.IsPiloting && __instance.IsSpaceKeyDown) { KeyCode val = Game.StandUpKey(); Settings settings = Plugin.Settings; if ((settings.UpKey.Value == val || settings.DownKey.Value == val) && (int)MonoSingleton<TaskManager>.I.LockState == 0) { SetSpaceDown(__instance, arg2: false); } } } private static Action<InputManager, bool> Setter(string property) { return (Action<InputManager, bool>)Delegate.CreateDelegate(typeof(Action<InputManager, bool>), AccessTools.PropertySetter(typeof(InputManager), property)); } } [HarmonyPatch(typeof(PlayerFocusController), "SetFocus")] internal static class SetFocusPatch { private static void Postfix(PlayerFocusController __instance) { try { if (((NetworkIdentity)__instance).isOwner) { SwarmController.Instance?.OnFocusPicked(); } } catch (Exception ex) { Plugin.Log.LogError((object)ex); } } } [BepInPlugin("nelphei.ontogether.deskswarm", "Desk Swarm", "0.1.0")] public class Plugin : BaseUnityPlugin { public const string PluginGuid = "nelphei.ontogether.deskswarm"; public const string PluginName = "Desk Swarm"; public const string PluginVersion = "0.1.0"; internal static ManualLogSource Log; internal static Settings Settings; private GameObject _host; private void Awake() { //IL_0020: 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_003f: Expected O, but got Unknown //IL_0081: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; Settings = new Settings(((BaseUnityPlugin)this).Config); new Harmony("nelphei.ontogether.deskswarm").PatchAll(); IconBar.Patch(); _host = new GameObject("DeskSwarm"); ((Object)_host).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)_host); _host.AddComponent<SwarmController>(); Log.LogInfo((object)string.Format("{0} {1} loaded. Press {2} to open its window.", "Desk Swarm", "0.1.0", Settings.WindowKey.Value)); } private void OnDestroy() { if ((Object)(object)_host != (Object)null) { Object.Destroy((Object)(object)_host); } } } internal sealed class Settings { public readonly ConfigEntry<KeyCode> WindowKey; public readonly ConfigEntry<KeyCode> FlyKey; public readonly ConfigEntry<KeyCode> UpKey; public readonly ConfigEntry<KeyCode> DownKey; public readonly ConfigEntry<float> FlySpeed; public readonly ConfigEntry<float> ClimbSpeed; public readonly ConfigEntry<bool> Tilt; public readonly ConfigEntry<Formation> StartFormation; public readonly ConfigEntry<bool> ShowNotices; public readonly ConfigEntry<bool> ShowIcon; public readonly ConfigEntry<bool> DebugLog; public Settings(ConfigFile config) { //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Expected O, but got Unknown WindowKey = config.Bind<KeyCode>("Keys", "WindowKey", (KeyCode)292, "Shows or hides the Desk Swarm window."); FlyKey = config.Bind<KeyCode>("Keys", "FlyKey", (KeyCode)0, "Takes off or stops flying while you're sitting at your desk. None by default: use the window's button or right-click the icon."); UpKey = config.Bind<KeyCode>("Keys", "UpKey", (KeyCode)32, "Flies up while you're flying your desk. While you fly, this key doesn't stand you up: stop flying first."); DownKey = config.Bind<KeyCode>("Keys", "DownKey", (KeyCode)304, "Flies down while you're flying your desk."); FlySpeed = config.Bind<float>("Flying", "FlySpeed", 6f, new ConfigDescription("How fast your desk flies with the movement keys, in metres per second.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 20f), Array.Empty<object>())); ClimbSpeed = config.Bind<float>("Flying", "ClimbSpeed", 3f, new ConfigDescription("How fast your desk flies up and down, in metres per second.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.5f, 10f), Array.Empty<object>())); Tilt = config.Bind<bool>("Flying", "Tilt", true, "Tip the desk a little into the way it's flying, like a drone. Everyone sees it."); StartFormation = config.Bind<Formation>("Swarm", "StartFormation", Formation.Ring, "The formation a swarm you start begins with. You can change it in the window."); ShowNotices = config.Bind<bool>("Display", "ShowNotices", true, "Show a short message at the top of the screen when someone joins or leaves your swarm, and so on."); ShowIcon = config.Bind<bool>("Display", "ShowIcon", true, "Show a flying desk icon in the row of mod icons at the bottom-right. Clicking it does what WindowKey does, and right-clicking it takes off or stops flying."); DebugLog = config.Bind<bool>("Debug", "DebugLog", false, "Write every swarm message and flight change to the BepInEx log."); } } internal sealed class SwarmController : MonoBehaviour { private const string PanelId = "DeskSwarm"; private const float Width = 360f; private const float Pad = 10f; private const float HeaderHeight = 24f; private const float RowHeight = 28f; private const float Gap = 4f; private const float SectionGap = 8f; private const int MaxListed = 6; private static readonly Color White = Color.white; private static readonly Colo