using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using Fusion; using Il2CppInterop.Runtime.Injection; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Microsoft.CodeAnalysis; using Steamworks; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("Beacon")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("Beacon")] [assembly: AssemblyTitle("Beacon")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ShiftAtMidnightBeacon { [BepInPlugin("clementinise.shiftatmidnight.beacon", "Beacon", "1.0.0")] public class BeaconPlugin : BasePlugin { public const string Guid = "clementinise.shiftatmidnight.beacon"; internal static ConfigEntry PingKey; public const float Lifetime = 6f; public const float Size = 0.8f; public const float Reach = 100f; public const float Volume = 1f; public override void Load() { //IL_005b: Unknown result type (might be due to invalid IL or missing references) ModLog.Source = ((BasePlugin)this).Log; PingKey = ((BasePlugin)this).Config.Bind("Ping", "PingKey", (KeyCode)325, "What drops a marker. Mouse2 is the middle mouse button."); ClassInjector.RegisterTypeInIl2Cpp(); ((BasePlugin)this).AddComponent(); ModLog.Msg($"Beacon ready. {PingKey.Value} drops a marker."); } } public class BeaconBehaviour : MonoBehaviour { private PingField _field; private PingSync _sync; private PingInput _input; private int _lastSceneHandle; public BeaconBehaviour(IntPtr handle) : base(handle) { } private void Awake() { //IL_0035: 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) _field = new PingField(); _sync = new PingSync(_field); _input = new PingInput(_field, _sync); Scene activeScene = SceneManager.GetActiveScene(); _lastSceneHandle = ((Scene)(ref activeScene)).handle; } private void Update() { try { DetectSceneChange(); _input.Tick(); _sync.Tick(); } catch (Exception value) { ModLog.Error($"Update: {value}"); } } private void LateUpdate() { try { _field.LateTick(); } catch (Exception value) { ModLog.Error($"LateUpdate: {value}"); } } private void DetectSceneChange() { //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) Scene activeScene = SceneManager.GetActiveScene(); int handle = ((Scene)(ref activeScene)).handle; if (handle != _lastSceneHandle) { _lastSceneHandle = handle; _field.Clear(); _sync.Clear(); MarkerMesh.Rescan(); MarkerMesh.Ensure(); } } private void OnDestroy() { try { _field.Clear(); } catch { } } } internal static class Interop { public static IEnumerable Safe(Il2CppArrayBase array) where T : Il2CppObjectBase { if (array == null) { yield break; } for (int i = 0; i < array.Length; i++) { T v = array[i]; if (v != null) { yield return v; } } } } internal static class MarkerMesh { private const string GameMeshName = "SM_Icon_Arrow_Long_02"; private const string TipChildName = "Arrow Tip"; private const string PreferredShader = "Hidden/Internal-Colored"; private const string FallbackShader = "Universal Render Pipeline/Unlit"; private const int ZTestLessEqual = 4; private const int ZTestGreater = 5; private const int CullOff = 0; private const int BlendSrcAlpha = 5; private const int BlendOneMinusSrcAlpha = 10; private const int ZWriteOff = 0; private const int VisibleQueue = 3000; private const int OccludedQueue = 3100; private static Mesh _mesh; private static Material _material; private static Material _occluded; private static bool _tried; private static bool _improvised; public static Quaternion Correction { get; private set; } public static Vector3 Tip { get; private set; } public static float UnitScale { get; private set; } public static Mesh Ring { get; private set; } public static Mesh Mesh => _mesh; public static Material Material => _material; public static Material Occluded => _occluded; public static bool Ready => (Object)(object)_mesh != (Object)null && (Object)(object)_material != (Object)null; public static void Ensure() { try { BuildMaterial(); BuildMesh(); BuildRing(); } catch (Exception value) { ModLog.Error($"Building the marker failed: {value}"); } } public static void Rescan() { if (_improvised) { _tried = false; } } private static void BuildMaterial() { if ((Object)(object)_material != (Object)null) { return; } Shader val = Shader.Find("Hidden/Internal-Colored"); if ((Object)(object)val == (Object)null) { val = Shader.Find("Universal Render Pipeline/Unlit"); ModLog.Warning(((Object)(object)val == (Object)null) ? "Neither 'Hidden/Internal-Colored' nor 'Universal Render Pipeline/Unlit' is in this build. Pings will not draw." : "'Hidden/Internal-Colored' is not in this build, falling back to 'Universal Render Pipeline/Unlit'. Pings will be hidden by walls."); } if (!((Object)(object)val == (Object)null)) { _material = Translucent(val, 4, 3000); if (!_material.HasProperty("_ZTest")) { ModLog.Warning("'" + ((Object)val).name + "' has no _ZTest property, so pings will be hidden by walls with nothing shown through them."); } else { _occluded = Translucent(val, 5, 3100); } } } private static Material Translucent(Shader shader, int zTest, int queue) { //IL_0002: 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_0011: Expected O, but got Unknown Material val = new Material(shader) { hideFlags = (HideFlags)61 }; SetIfPresent(val, "_SrcBlend", 5); SetIfPresent(val, "_DstBlend", 10); SetIfPresent(val, "_Cull", 0); SetIfPresent(val, "_ZWrite", 0); SetIfPresent(val, "_ZTest", zTest); val.renderQueue = queue; return val; } private static bool SetIfPresent(Material material, string property, int value) { if (!material.HasProperty(property)) { return false; } material.SetInt(property, value); return true; } private static void BuildMesh() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: 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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009e: 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_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_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_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_006b: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) if (_tried) { return; } _tried = true; Mesh val = FindGameMesh(); if ((Object)(object)val == (Object)null) { Improvise("'SM_Icon_Arrow_Long_02' is not loaded, using a built-in arrow instead."); return; } Vector3 val2 = ThinnestAxis(val.bounds); Bounds bounds; Vector3 val4; if (TipOf(val, out var tip)) { Vector3 val3 = tip; bounds = val.bounds; val4 = Vector3.ProjectOnPlane(val3 - ((Bounds)(ref bounds)).center, val2); } else { val4 = LongestAxis(val.bounds); bounds = val.bounds; tip = ((Bounds)(ref bounds)).center + val4 * Extent(val.bounds, val4); ModLog.Warning("'SM_Icon_Arrow_Long_02' has no 'Arrow Tip' child, so which end is the point had to be guessed. The arrow may be back to front."); } if (((Vector3)(ref val4)).sqrMagnitude < Mathf.Epsilon) { Improvise("'SM_Icon_Arrow_Long_02' has no usable length, using a built-in arrow instead."); return; } _improvised = false; Adopt(val, ((Vector3)(ref val4)).normalized, val2, tip); } private static void Improvise(string why) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) Mesh val = ProceduralArrow.Build(); _improvised = true; Adopt(val, Vector3.forward, Vector3.up, Vector3.zero); Object.Destroy((Object)(object)val); ModLog.Msg(why); } private static void Adopt(Mesh source, Vector3 pointAxis, Vector3 faceAxis, Vector3 tipLocal) { //IL_0078: 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) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: 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_00cf: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)source == (Object)null) { return; } Mesh val = ((Il2CppObjectBase)Object.Instantiate(source)).TryCast(); if ((Object)(object)val == (Object)null) { ModLog.Error("Could not copy the marker mesh."); return; } if ((Object)(object)_mesh != (Object)null) { Object.Destroy((Object)(object)_mesh); } _mesh = val; ((Object)_mesh).hideFlags = (HideFlags)61; ((Object)_mesh).name = "BeaconArrow"; Correction = Quaternion.Inverse(Quaternion.LookRotation(pointAxis, faceAxis)); Tip = tipLocal; Bounds bounds = _mesh.bounds; float x = ((Bounds)(ref bounds)).size.x; bounds = _mesh.bounds; float y = ((Bounds)(ref bounds)).size.y; bounds = _mesh.bounds; float num = Mathf.Max(x, Mathf.Max(y, ((Bounds)(ref bounds)).size.z)); UnitScale = ((num > Mathf.Epsilon) ? (1f / num) : 1f); } private static Mesh FindGameMesh() { foreach (Mesh item in Interop.Safe(Resources.FindObjectsOfTypeAll())) { if (((Object)item).name == "SM_Icon_Arrow_Long_02") { return item; } } return null; } private static void BuildRing() { if (!((Object)(object)Ring != (Object)null)) { Ring = ProceduralRing.Build(); ((Object)Ring).hideFlags = (HideFlags)61; ((Object)Ring).name = "BeaconRing"; } } private static bool TipOf(Mesh mesh, out Vector3 tip) { //IL_0002: 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_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) tip = Vector3.zero; foreach (MeshFilter item in Interop.Safe(Resources.FindObjectsOfTypeAll())) { if (!((Object)(object)item.sharedMesh == (Object)null) && !(((Il2CppObjectBase)item.sharedMesh).Pointer != ((Il2CppObjectBase)mesh).Pointer)) { Transform val = ((Component)item).transform.Find("Arrow Tip"); if (!((Object)(object)val == (Object)null)) { tip = val.localPosition; return true; } } } return false; } private static Vector3 ThinnestAxis(Bounds bounds) { //IL_0003: 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_0009: 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_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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_0054: 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) Vector3 size = ((Bounds)(ref bounds)).size; if (size.x <= size.y && size.x <= size.z) { return Vector3.right; } return (size.y <= size.z) ? Vector3.up : Vector3.forward; } private static Vector3 LongestAxis(Bounds bounds) { //IL_0003: 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_0009: 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_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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_0054: 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) Vector3 size = ((Bounds)(ref bounds)).size; if (size.x >= size.y && size.x >= size.z) { return Vector3.right; } return (size.y >= size.z) ? Vector3.up : Vector3.forward; } private static float Extent(Bounds bounds, Vector3 axis) { //IL_0002: 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) return Mathf.Abs(Vector3.Dot(((Bounds)(ref bounds)).extents, axis)); } } internal static class ProceduralArrow { private const float Length = 1f; private const float HeadLength = 0.45f; private const float HeadHalfWidth = 0.3f; private const float ShaftHalfWidth = 0.11f; public static Mesh Build() { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0086: 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_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Expected O, but got Unknown Vector3[] array = Face(); Vector3[] array2 = Face(); Il2CppStructArray val = new Il2CppStructArray((long)(array.Length + array2.Length)); Il2CppStructArray val2 = new Il2CppStructArray((long)((Il2CppArrayBase)(object)val).Length); Il2CppStructArray val3 = new Il2CppStructArray((long)((Il2CppArrayBase)(object)val).Length); for (int i = 0; i < array.Length; i++) { ((Il2CppArrayBase)(object)val)[i] = array[i]; ((Il2CppArrayBase)(object)val2)[i] = Vector3.up; ((Il2CppArrayBase)(object)val3)[i] = Color.white; ((Il2CppArrayBase)(object)val)[array.Length + i] = array2[i]; ((Il2CppArrayBase)(object)val2)[array.Length + i] = Vector3.down; ((Il2CppArrayBase)(object)val3)[array.Length + i] = Color.white; } int[] array3 = new int[9] { 0, 1, 2, 3, 5, 4, 4, 5, 6 }; Il2CppStructArray val4 = new Il2CppStructArray((long)(array3.Length * 2)); for (int j = 0; j < array3.Length; j++) { ((Il2CppArrayBase)(object)val4)[j] = array3[j]; ((Il2CppArrayBase)(object)val4)[array3.Length + j] = array.Length + array3[array3.Length - 1 - j]; } Mesh val5 = new Mesh { name = "BeaconArrowSource" }; val5.vertices = val; val5.normals = val2; val5.colors = val3; val5.triangles = val4; val5.RecalculateBounds(); return val5; } private static Vector3[] Face() { //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_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_009e: 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_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) return (Vector3[])(object)new Vector3[7] { new Vector3(0f, 0f, 0f), new Vector3(-0.3f, 0f, -0.45f), new Vector3(0.3f, 0f, -0.45f), new Vector3(-0.11f, 0f, -0.45f), new Vector3(0.11f, 0f, -0.45f), new Vector3(-0.11f, 0f, -1f), new Vector3(0.11f, 0f, -1f) }; } } internal static class ProceduralRing { private const int Segments = 48; private const float OuterRadius = 0.5f; private const float Thickness = 0.18f; private const float EdgeSoftness = 0.85f; private const int Rings = 3; public static Mesh Build() { //IL_00e2: 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_00f7: 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_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Unknown result type (might be due to invalid IL or missing references) //IL_02be: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Expected O, but got Unknown int num = 144; float num2 = 0.41f; float num3 = 0.14999998f; float[] array = new float[3] { 0.5f, (0.5f + num2) * 0.5f, num2 }; float[] array2 = new float[3] { num3, 1f, num3 }; Il2CppStructArray val = new Il2CppStructArray((long)(num * 2)); Il2CppStructArray val2 = new Il2CppStructArray((long)((Il2CppArrayBase)(object)val).Length); Il2CppStructArray val3 = new Il2CppStructArray((long)((Il2CppArrayBase)(object)val).Length); Vector3 val4 = default(Vector3); Color val5 = default(Color); for (int i = 0; i < 48; i++) { float num4 = (float)i / 48f * (float)Math.PI * 2f; ((Vector3)(ref val4))..ctor(Mathf.Cos(num4), 0f, Mathf.Sin(num4)); for (int j = 0; j < 3; j++) { int num5 = i * 3 + j; ((Color)(ref val5))..ctor(1f, 1f, 1f, array2[j]); ((Il2CppArrayBase)(object)val)[num5] = val4 * array[j]; ((Il2CppArrayBase)(object)val2)[num5] = Vector3.up; ((Il2CppArrayBase)(object)val3)[num5] = val5; ((Il2CppArrayBase)(object)val)[num + num5] = ((Il2CppArrayBase)(object)val)[num5]; ((Il2CppArrayBase)(object)val2)[num + num5] = Vector3.down; ((Il2CppArrayBase)(object)val3)[num + num5] = val5; } } Il2CppStructArray val6 = new Il2CppStructArray(1152L); int num6 = 0; for (int k = 0; k < 48; k++) { int num7 = (k + 1) % 48; for (int l = 0; l < 2; l++) { int num8 = k * 3 + l; int num9 = num8 + 1; int num10 = num7 * 3 + l; int num11 = num10 + 1; ((Il2CppArrayBase)(object)val6)[num6++] = num8; ((Il2CppArrayBase)(object)val6)[num6++] = num9; ((Il2CppArrayBase)(object)val6)[num6++] = num10; ((Il2CppArrayBase)(object)val6)[num6++] = num10; ((Il2CppArrayBase)(object)val6)[num6++] = num9; ((Il2CppArrayBase)(object)val6)[num6++] = num11; ((Il2CppArrayBase)(object)val6)[num6++] = num + num8; ((Il2CppArrayBase)(object)val6)[num6++] = num + num10; ((Il2CppArrayBase)(object)val6)[num6++] = num + num9; ((Il2CppArrayBase)(object)val6)[num6++] = num + num10; ((Il2CppArrayBase)(object)val6)[num6++] = num + num11; ((Il2CppArrayBase)(object)val6)[num6++] = num + num9; } } Mesh val7 = new Mesh { name = "BeaconRingSource" }; val7.vertices = val; val7.normals = val2; val7.colors = val3; val7.triangles = val6; val7.RecalculateBounds(); return val7; } } internal static class ModLog { public static ManualLogSource Source; [Conditional("DEVTOOLS")] public static void Debug(string message) { ManualLogSource source = Source; if (source != null) { source.LogInfo((object)message); } } public static void Msg(string message) { ManualLogSource source = Source; if (source != null) { source.LogInfo((object)message); } } public static void Warning(string message) { ManualLogSource source = Source; if (source != null) { source.LogWarning((object)message); } } public static void Error(string message) { ManualLogSource source = Source; if (source != null) { source.LogError((object)message); } } } internal static class NetworkContext { public static NetworkRunner Runner { get { FusionNetworkManager instance = FusionNetworkManager.Instance; if ((Object)(object)instance == (Object)null) { return null; } NetworkRunner runner = instance._runner; if ((Object)(object)runner == (Object)null || !runner.IsRunning) { return null; } return runner; } } public static PlayerManager LocalPlayerManager { get { ClientPlayer instance = ClientPlayer.Instance; return ((Object)(object)instance == (Object)null) ? null : instance.playerMan; } } public static ThirdPersonManager LocalBody { get { PlayerManager localPlayerManager = LocalPlayerManager; return ((Object)(object)localPlayerManager == (Object)null) ? null : localPlayerManager.thirdPersonMan; } } public static Camera LocalCamera { get { PlayerManager localPlayerManager = LocalPlayerManager; if ((Object)(object)localPlayerManager != (Object)null) { FPSController fpsScript = localPlayerManager.fpsScript; if ((Object)(object)fpsScript != (Object)null && (Object)(object)fpsScript.playerCamera != (Object)null) { return fpsScript.playerCamera; } InteractManager interactMan = localPlayerManager.interactMan; if ((Object)(object)interactMan != (Object)null && (Object)(object)interactMan.mainCamera != (Object)null) { return interactMan.mainCamera; } } return Camera.main; } } public static ulong LocalSteamId { get { //IL_0002: Unknown result type (might be due to invalid IL or missing references) try { return SteamUser.GetSteamID().m_SteamID; } catch { return 0uL; } } } public static CSteamID Lobby { get { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) PlatformManager instance = PlatformManager.Instance; if ((Object)(object)instance == (Object)null) { return default(CSteamID); } return new CSteamID { m_SteamID = instance._lobbyID }; } } } internal sealed class PingField { public const int MostPerPlayer = 5; private readonly List _markers = new List(); public void Place(ulong owner, Vector3 point, Vector3 normal, Transform follow, Color colour, float lifetime) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) MarkerMesh.Ensure(); if (MarkerMesh.Ready) { EvictSame(follow); EvictOldest(owner); _markers.Add(new PingMarker(owner, point, normal, follow, colour, lifetime, NetworkContext.LocalCamera)); } } public void LateTick() { if (_markers.Count == 0) { return; } Camera localCamera = NetworkContext.LocalCamera; for (int num = _markers.Count - 1; num >= 0; num--) { if (_markers[num].Expired) { _markers[num].Destroy(); _markers.RemoveAt(num); } else { _markers[num].Aim(localCamera); } } } public void Clear() { foreach (PingMarker marker in _markers) { marker.Destroy(); } _markers.Clear(); } private void EvictSame(Transform follow) { if ((Object)(object)follow == (Object)null) { return; } for (int num = _markers.Count - 1; num >= 0; num--) { Transform following = _markers[num].Following; if (!((Object)(object)following == (Object)null) && !(((Il2CppObjectBase)following).Pointer != ((Il2CppObjectBase)follow).Pointer)) { _markers[num].Destroy(); _markers.RemoveAt(num); } } } private void EvictOldest(ulong owner) { int num = 0; foreach (PingMarker marker in _markers) { if (marker.Owner == owner) { num++; } } if (num < 5) { return; } for (int i = 0; i < _markers.Count; i++) { if (_markers[i].Owner == owner) { _markers[i].Destroy(); _markers.RemoveAt(i); break; } } } } internal sealed class PingInput { private const float Cooldown = 0.1f; private readonly PingField _field; private readonly PingSync _sync; private float _nextAllowed; public PingInput(PingField field, PingSync sync) { _field = field; _sync = sync; } public void Tick() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) if (Input.GetKeyDown(BeaconPlugin.PingKey.Value) && !(Time.unscaledTime < _nextAllowed) && Allowed()) { Camera localCamera = NetworkContext.LocalCamera; if (!((Object)(object)localCamera == (Object)null) && PingReach.Find(((Component)localCamera).transform.position, ((Component)localCamera).transform.forward, 100f, out var hit)) { _nextAllowed = Time.unscaledTime + 0.1f; int num = ShirtColour.LocalIndex(); float lifetime = 6f; NetworkObject val = PingTarget.Creature(((RaycastHit)(ref hit)).collider); Transform follow = (((Object)(object)val == (Object)null) ? null : ((Component)val).transform); uint target = ((!((Object)(object)val == (Object)null)) ? val.Id.Raw : 0u); _field.Place(NetworkContext.LocalSteamId, ((RaycastHit)(ref hit)).point, ((RaycastHit)(ref hit)).normal, follow, ShirtColour.Of(num), lifetime); _sync.Add(((RaycastHit)(ref hit)).point, ((RaycastHit)(ref hit)).normal, target, num, lifetime); } } } private static bool Allowed() { PlayerManager localPlayerManager = NetworkContext.LocalPlayerManager; if ((Object)(object)localPlayerManager == (Object)null) { return false; } return !localPlayerManager.paused && !localPlayerManager.dead && !localPlayerManager.customizablesMenuOpen && !localPlayerManager.dontAllowLockCursor; } } internal sealed class PingMarker { private sealed class Piece { public readonly Transform Transform; private readonly Material _visible; private readonly Material _hidden; private readonly Color _colour; public Piece(string name, Transform parent, Mesh mesh, Color colour) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown _colour = colour; GameObject val = new GameObject(name); val.transform.SetParent(parent, false); Transform = val.transform; _visible = Draw(val, mesh, MarkerMesh.Material); if (!((Object)(object)MarkerMesh.Occluded == (Object)null)) { GameObject val2 = new GameObject("Behind"); val2.transform.SetParent(Transform, false); _hidden = Draw(val2, mesh, MarkerMesh.Occluded); } } public void Fade(float alpha) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) Set(_visible, new Color(_colour.r, _colour.g, _colour.b, alpha)); Set(_hidden, new Color(_colour.r * 0.45f, _colour.g * 0.45f, _colour.b * 0.45f, alpha * 0.5f)); } private static Material Draw(GameObject on, Mesh mesh, Material material) { on.AddComponent().sharedMesh = mesh; MeshRenderer val = on.AddComponent(); ((Renderer)val).material = material; ((Renderer)val).shadowCastingMode = (ShadowCastingMode)0; ((Renderer)val).receiveShadows = false; return ((Renderer)val).material; } private static void Set(Material material, Color colour) { //IL_0023: 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)material == (Object)null)) { if (material.HasProperty("_Color")) { material.SetColor("_Color", colour); } if (material.HasProperty("_BaseColor")) { material.SetColor("_BaseColor", colour); } } } } private const float RingLift = 0.05f; private const float RingWidth = 0.68f; private const float MinimumRollAngle = 4f; private const float HoverLow = 0.135f; private const float HoverSwing = 0.11f; private const float BobSpeed = 3.2f; private const float ArrivalDuration = 0.3f; private const float ShrinkDuration = 0.5f; private const float ArrowArrivalScale = 2.6f; private const float RingArrivalScale = 0f; private const float RingPulse = 0.09f; private const float SolidDistance = 8f; private const float FaintDistance = 40f; private const float FaintestAlpha = 0.3f; private const float OccludedDim = 0.45f; private const float OccludedAlpha = 0.5f; private readonly GameObject _object; private readonly Piece _arrow; private readonly Piece _ring; private readonly Vector3 _normal; private readonly float _placedAt; private readonly Transform _follow; private readonly float _followHeight; private readonly bool _follows; private readonly Hittable _hittable; private readonly PlayerManager _person; private float _expiresAt; private Vector3 _point; private Quaternion _rotation; public readonly ulong Owner; public Transform Following => _follow; public bool Expired => Time.unscaledTime >= _expiresAt; public PingMarker(ulong owner, Vector3 point, Vector3 normal, Transform follow, Color colour, float lifetime, Camera camera) { //IL_00b2: 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_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_003f: 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_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) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_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_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_00e6: 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_00fb: Expected O, but got Unknown //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) Owner = owner; _follow = follow; _placedAt = Time.unscaledTime; _expiresAt = _placedAt + lifetime; if ((Object)(object)follow != (Object)null) { _normal = Vector3.up; _follows = true; _followHeight = PingTarget.HoverHeight(follow); _point = follow.position + Vector3.up * _followHeight; _hittable = ((Component)follow).GetComponentInChildren(true); ThirdPersonManager componentInChildren = ((Component)follow).GetComponentInChildren(true); if ((Object)(object)componentInChildren != (Object)null) { _person = componentInChildren.playerMan; } } else { _point = point; _normal = normal; } _rotation = Quaternion.LookRotation(-_normal, Sideways(_normal)) * MarkerMesh.Correction; _object = new GameObject("BeaconPing"); _object.transform.position = _point; Object.DontDestroyOnLoad((Object)(object)_object); _arrow = new Piece("Arrow", _object.transform, MarkerMesh.Mesh, colour); if ((Object)(object)_follow == (Object)null) { _ring = new Piece("Ring", _object.transform, MarkerMesh.Ring, colour); } PingSound.PlayOn(_object, 1f); Aim(camera); } public void Aim(Camera camera) { //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_0093: 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_009a: 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_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0140: 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_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_021c: 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_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_object == (Object)null || (Object)(object)camera == (Object)null) { return; } if (_follows) { if (Gone()) { Cut(); } else { _point = _follow.position + Vector3.up * _followHeight; _object.transform.position = _point; } } Vector3 position = ((Component)camera).transform.position; Roll(position - _point); float num = 0.8f; float num2 = Leaving(); float alpha = Alpha(Vector3.Distance(position, _point)); float num3 = Mathf.Sin((Time.unscaledTime - _placedAt) * 3.2f) * 0.5f + 0.5f; float num4 = num * MarkerMesh.UnitScale * Arriving(2.6f) * num2; _arrow.Transform.localRotation = _rotation; _arrow.Transform.localScale = Vector3.one * num4; _arrow.Transform.localPosition = _normal * ((0.135f + num3 * 0.11f) * num) - _rotation * (MarkerMesh.Tip * num4); _arrow.Fade(alpha); if (_ring != null) { float num5 = num * 0.68f * Mathf.Lerp(1.09f, 0.90999997f, num3) * Arriving(0f) * num2; _ring.Transform.localRotation = Quaternion.FromToRotation(Vector3.up, _normal); _ring.Transform.localScale = Vector3.one * num5; _ring.Transform.localPosition = _normal * (0.05f * num); _ring.Fade(alpha); } } public void Destroy() { if ((Object)(object)_object != (Object)null) { Object.Destroy((Object)(object)_object); } } private bool Gone() { if ((Object)(object)_follow == (Object)null) { return true; } if ((Object)(object)_person != (Object)null && _person.dead) { return true; } return (Object)(object)_hittable != (Object)null && _hittable.maxHealth > 0f && _hittable.health <= 0f; } private void Cut() { float num = Time.unscaledTime + 0.5f; if (num < _expiresAt) { _expiresAt = num; } } private static float Alpha(float distance) { return Mathf.Lerp(1f, 0.3f, Mathf.SmoothStep(0f, 1f, Mathf.InverseLerp(8f, 40f, distance))); } private float Arriving(float from) { float num = (Time.unscaledTime - _placedAt) / 0.3f; if (num >= 1f) { return 1f; } float num2 = 1f - num; return Mathf.Lerp(from, 1f, 1f - num2 * num2 * num2); } private float Leaving() { return Mathf.SmoothStep(0f, 1f, (_expiresAt - Time.unscaledTime) / 0.5f); } private void Roll(Vector3 toCamera) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: 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_000d: 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_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_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_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) Vector3 val = Vector3.ProjectOnPlane(toCamera, _normal); if (!(((Vector3)(ref val)).magnitude < ((Vector3)(ref toCamera)).magnitude * Mathf.Sin((float)Math.PI / 45f))) { _rotation = Quaternion.LookRotation(-_normal, val) * MarkerMesh.Correction; } } private static Vector3 Sideways(Vector3 normal) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: 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) Vector3 val = Vector3.Cross(normal, Vector3.up); if (((Vector3)(ref val)).sqrMagnitude < Mathf.Epsilon) { val = Vector3.Cross(normal, Vector3.forward); } return ((Vector3)(ref val)).normalized; } } internal static class PingReach { private const string SeeThroughLayer = "Curb"; private static readonly string[] LookPast = new string[2] { "AboveCollider", "ForestRoof" }; private static int _mask; private static bool _built; public static int Mask { get { if (_built) { return _mask; } _built = true; _mask = -5; int num = LayerMask.NameToLayer("Curb"); if (num >= 0) { _mask &= ~(1 << num); } else { ModLog.Warning("No layer called 'Curb', so pings will stop on fences."); } return _mask; } } public static bool Find(Vector3 origin, Vector3 direction, float reach, out RaycastHit hit) { //IL_0002: 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) hit = default(RaycastHit); Il2CppStructArray val = Physics.RaycastAll(origin, direction, reach, Mask, (QueryTriggerInteraction)1); if (val == null) { return false; } bool flag = false; for (int i = 0; i < ((Il2CppArrayBase)(object)val).Length; i++) { RaycastHit val2 = ((Il2CppArrayBase)(object)val)[i]; if (!Ignored(((RaycastHit)(ref val2)).collider) && (!flag || !(((RaycastHit)(ref val2)).distance >= ((RaycastHit)(ref hit)).distance))) { hit = val2; flag = true; } } return flag; } private static bool Ignored(Collider collider) { if ((Object)(object)collider == (Object)null) { return true; } string[] lookPast = LookPast; foreach (string value in lookPast) { if (((Object)collider).name.StartsWith(value, StringComparison.Ordinal)) { return true; } } return false; } public static string Describe(Collider collider) { if ((Object)(object)collider == (Object)null) { return "nothing"; } int layer = ((Component)collider).gameObject.layer; return $"'{((Object)collider).name}' on layer {layer} ({LayerMask.LayerToName(layer)})"; } public static string Identify(Collider collider) { //IL_005c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)collider == (Object)null) { return "nothing"; } NetworkObject componentInParent = ((Component)collider).GetComponentInParent(true); if ((Object)(object)componentInParent == (Object)null) { return "static, under " + Path(((Component)collider).transform); } return $"NetworkObject {componentInParent.Id} on '{((Object)componentInParent).name}', under {Path(((Component)collider).transform)}"; } private static string Path(Transform t) { List list = new List(); Transform val = t; while ((Object)(object)val != (Object)null) { list.Insert(0, ((Object)val).name); val = val.parent; } return string.Join("/", list); } } internal static class PingSound { private const float SpatialBlend = 0.75f; private static bool _warned; public static void PlayOn(GameObject marker, float volume) { AudioSource val = Alert(); if ((Object)(object)val == (Object)null || (Object)(object)val.clip == (Object)null) { WarnOnce(); return; } AudioSource val2 = marker.AddComponent(); val2.clip = val.clip; val2.outputAudioMixerGroup = val.outputAudioMixerGroup; val2.spatialBlend = 0.75f; val2.volume = volume; val2.Play(); } private static AudioSource Alert() { StoreManager instance = StoreManager.Instance; return ((Object)(object)instance == (Object)null) ? null : instance.alertSuccessAudio; } private static void WarnOnce() { if (!_warned) { _warned = true; ModLog.Warning("The store's alert sound is not available, so pings will be silent."); } } } internal sealed class PingSync { private struct Outgoing { public int Id; public uint Target; public Vector3 Point; public Vector3 Normal; public float ExpiresAt; } private const string Key = "beacon"; private const string Version = "3"; private const char FieldSeparator = '|'; private const char PartSeparator = ':'; private const float PollInterval = 0.2f; private const float PublishInterval = 0.25f; private const string PositionFormat = "0.##"; private const string NormalFormat = "0.###"; private const int PartsPerPing = 8; private readonly PingField _field; private readonly List _mine = new List(); private readonly Dictionary _highest = new Dictionary(); private readonly StringBuilder _payload = new StringBuilder(); private float _nextPoll; private float _nextPublish; private string _published; private int _lastId; private int _colourIndex = -1; private bool _changed; public PingSync(PingField field) { _field = field; } public void Tick() { //IL_0002: 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_0008: 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_004c: Unknown result type (might be due to invalid IL or missing references) try { CSteamID lobby = NetworkContext.Lobby; if (lobby.m_SteamID != 0) { Expire(); Publish(lobby); if (!(Time.unscaledTime < _nextPoll)) { _nextPoll = Time.unscaledTime + 0.2f; Poll(lobby); } } } catch (Exception value) { ModLog.Error($"Sync: {value}"); } } public void Add(Vector3 point, Vector3 normal, uint target, int colourIndex, float lifetime) { //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) if (target != 0) { for (int num = _mine.Count - 1; num >= 0; num--) { if (_mine[num].Target == target) { _mine.RemoveAt(num); } } } if (_mine.Count >= 5) { _mine.RemoveAt(0); } _mine.Add(new Outgoing { Id = ++_lastId, Target = target, Point = point, Normal = normal, ExpiresAt = Time.unscaledTime + lifetime }); _colourIndex = colourIndex; _changed = true; } public void Clear() { _mine.Clear(); _highest.Clear(); _published = null; _changed = false; } private void Expire() { for (int num = _mine.Count - 1; num >= 0; num--) { if (!(Time.unscaledTime < _mine[num].ExpiresAt)) { _mine.RemoveAt(num); _changed = true; } } } private void Publish(CSteamID lobby) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) if (_changed && !(Time.unscaledTime < _nextPublish)) { string text = Serialise(); _changed = false; if (!(text == _published)) { SteamMatchmaking.SetLobbyMemberData(lobby, "beacon", text); _published = text; _nextPublish = Time.unscaledTime + 0.25f; } } } private string Serialise() { //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) if (_mine.Count == 0) { return string.Empty; } _payload.Clear(); _payload.Append("3").Append('|').Append(Text(_colourIndex)); foreach (Outgoing item in _mine) { _payload.Append('|').Append(Text(item.Id)).Append(':') .Append(item.Target.ToString(CultureInfo.InvariantCulture)) .Append(':') .Append(Number(item.Point.x, "0.##")) .Append(':') .Append(Number(item.Point.y, "0.##")) .Append(':') .Append(Number(item.Point.z, "0.##")) .Append(':') .Append(Number(item.Normal.x, "0.###")) .Append(':') .Append(Number(item.Normal.y, "0.###")) .Append(':') .Append(Number(item.Normal.z, "0.###")); } return _payload.ToString(); } private void Poll(CSteamID lobby) { //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_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) ulong localSteamId = NetworkContext.LocalSteamId; int numLobbyMembers = SteamMatchmaking.GetNumLobbyMembers(lobby); for (int i = 0; i < numLobbyMembers; i++) { CSteamID lobbyMemberByIndex = SteamMatchmaking.GetLobbyMemberByIndex(lobby, i); if (lobbyMemberByIndex.m_SteamID != localSteamId) { string lobbyMemberData = SteamMatchmaking.GetLobbyMemberData(lobby, lobbyMemberByIndex, "beacon"); if (!string.IsNullOrEmpty(lobbyMemberData)) { Read(lobbyMemberByIndex.m_SteamID, lobbyMemberData); } } } } private void Read(ulong owner, string raw) { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) string[] array = raw.Split('|'); if (array.Length < 3 || array[0] != "3" || !int.TryParse(array[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return; } _highest.TryGetValue(owner, out var value); int num = value; Color colour = ShirtColour.Of(result); for (int i = 2; i < array.Length; i++) { if (ParsePing(array[i], out var id, out var target, out var point, out var normal) && id > value) { Transform follow = PingTarget.Resolve(target); _field.Place(owner, point, normal, follow, colour, 6f); if (id > num) { num = id; } } } _highest[owner] = num; } private static bool ParsePing(string text, out int id, out uint target, out Vector3 point, out Vector3 normal) { //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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: 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) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) id = 0; target = 0u; point = Vector3.zero; normal = Vector3.up; string[] array = text.Split(':'); if (array.Length != 8) { return false; } if (!int.TryParse(array[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out id)) { return false; } if (!uint.TryParse(array[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out target)) { return false; } if (!Coordinate(array[2], out var value) || !Coordinate(array[3], out var value2) || !Coordinate(array[4], out var value3)) { return false; } if (!Coordinate(array[5], out var value4) || !Coordinate(array[6], out var value5) || !Coordinate(array[7], out var value6)) { return false; } point = new Vector3(value, value2, value3); Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(value4, value5, value6); if (((Vector3)(ref val)).sqrMagnitude < Mathf.Epsilon) { return false; } normal = ((Vector3)(ref val)).normalized; return true; } private static string Number(float value, string format) { return value.ToString(format, CultureInfo.InvariantCulture); } private static string Text(int value) { return value.ToString(CultureInfo.InvariantCulture); } private static bool Coordinate(string text, out float value) { return float.TryParse(text, NumberStyles.Float, CultureInfo.InvariantCulture, out value); } } internal static class PingTarget { private const string BodyHolder = "GFXHolder"; private const string CrownBone = "mixamorig:HeadTop_End"; private const float Gap = 0.2f; private const float ShortestCreature = 0.4f; private const float TallestCreature = 4f; public static NetworkObject Creature(Collider collider) { if ((Object)(object)collider == (Object)null) { return null; } NetworkObject componentInParent = ((Component)collider).GetComponentInParent(true); if ((Object)(object)componentInParent == (Object)null) { return null; } if ((Object)(object)((Component)componentInParent).GetComponentInChildren(true) != (Object)null) { return componentInParent; } if ((Object)(object)((Component)componentInParent).GetComponentInChildren(true) != (Object)null) { return componentInParent; } if ((Object)(object)((Component)componentInParent).GetComponentInChildren(true) != (Object)null) { return componentInParent; } if ((Object)(object)Holder(((Component)componentInParent).transform) != (Object)null) { return componentInParent; } return null; } private static Transform Holder(Transform root) { foreach (Transform item in Interop.Safe(((Component)root).GetComponentsInChildren(true))) { if (((Object)item).name == "GFXHolder") { return item; } } return null; } public static Transform Resolve(uint raw) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) if (raw == 0) { return null; } NetworkRunner runner = NetworkContext.Runner; if ((Object)(object)runner == (Object)null) { return null; } NetworkObject val = default(NetworkObject); if (!runner.TryFindObject(new NetworkId(raw), ref val) || (Object)(object)val == (Object)null) { return null; } return ((Component)val).transform; } public static float HoverHeight(Transform root) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) Transform val = Crown(root); float top; if ((Object)(object)val != (Object)null) { top = val.position.y - root.position.y; string text = "mixamorig:HeadTop_End"; } else if (!Tallest(root, out top)) { top = 0.4f; string text = "nothing to measure"; } else { string text = "renderer bounds"; } return Mathf.Clamp(top, 0.4f, 4f) + 0.2f; } private static Transform Crown(Transform root) { foreach (Transform item in Interop.Safe(((Component)root).GetComponentsInChildren(true))) { if (((Object)item).name == "mixamorig:HeadTop_End") { return item; } } return null; } private static bool Tallest(Transform root, out float top) { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0056: 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) top = 0f; bool flag = false; foreach (Renderer item in Interop.Safe(((Component)root).GetComponentsInChildren(true))) { if (!((Object)(object)((Il2CppObjectBase)item).TryCast() == (Object)null) || !((Object)(object)((Il2CppObjectBase)item).TryCast() == (Object)null)) { Bounds bounds = item.bounds; float num = ((Bounds)(ref bounds)).max.y - root.position.y; if (!flag || num > top) { top = num; } flag = true; } } return flag; } } internal static class ShirtColour { private static readonly string[] ColourProperties = new string[3] { "_BaseColor", "_Color", "_TintColor" }; private const string InstanceSuffix = " (Instance)"; public const int Unknown = -1; private static readonly Color Fallback = Color.white; private static bool _warned; public static int LocalIndex() { ThirdPersonManager localBody = NetworkContext.LocalBody; if ((Object)(object)localBody == (Object)null || (Object)(object)localBody.shirt == (Object)null || localBody.shirtColors == null) { return -1; } Material sharedMaterial = ((Renderer)localBody.shirt).sharedMaterial; if ((Object)(object)sharedMaterial == (Object)null) { return -1; } string text = Strip(((Object)sharedMaterial).name); for (int i = 0; i < ((Il2CppArrayBase)(object)localBody.shirtColors).Length; i++) { Material val = ((Il2CppArrayBase)(object)localBody.shirtColors)[i]; if ((Object)(object)val != (Object)null && Strip(((Object)val).name) == text) { return i; } } return -1; } public static Color Of(int index) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: 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_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_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: 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_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) ThirdPersonManager localBody = NetworkContext.LocalBody; if ((Object)(object)localBody == (Object)null || localBody.shirtColors == null) { return Fallback; } if (index < 0 || index >= ((Il2CppArrayBase)(object)localBody.shirtColors).Length) { return Fallback; } Material val = ((Il2CppArrayBase)(object)localBody.shirtColors)[index]; if ((Object)(object)val == (Object)null) { return Fallback; } string[] colourProperties = ColourProperties; foreach (string text in colourProperties) { if (val.HasProperty(text)) { Color color = val.GetColor(text); if (!IsWhite(color)) { color.a = 1f; return color; } } } WarnOnce(val); return Fallback; } private static bool IsWhite(Color c) { //IL_0000: 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_0024: Unknown result type (might be due to invalid IL or missing references) return Mathf.Approximately(c.r, 1f) && Mathf.Approximately(c.g, 1f) && Mathf.Approximately(c.b, 1f); } private static void WarnOnce(Material material) { if (!_warned) { _warned = true; DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(41, 2); defaultInterpolatedStringHandler.AppendLiteral("Shirt material '"); defaultInterpolatedStringHandler.AppendFormatted(((Object)material).name); defaultInterpolatedStringHandler.AppendLiteral("' (shader '"); Shader shader = material.shader; defaultInterpolatedStringHandler.AppendFormatted((shader != null) ? ((Object)shader).name : null); defaultInterpolatedStringHandler.AppendLiteral("') carries no "); ModLog.Warning(defaultInterpolatedStringHandler.ToStringAndClear() + "colour this can read, so pings will all be white."); } } private static string Strip(string name) { if (string.IsNullOrEmpty(name)) { return name; } return name.EndsWith(" (Instance)") ? name.Substring(0, name.Length - " (Instance)".Length) : name; } } }