using System; using System.Collections; 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 BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using ExitGames.Client.Photon; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using Photon.Realtime; using REPOLib.Modules; using REPOPingMod.Input; using REPOPingMod.Networking; using REPOPingMod.PingSystem; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("Autodesk.Fbx")] [assembly: IgnoresAccessChecksTo("Discord.Sdk")] [assembly: IgnoresAccessChecksTo("Domain_Reload")] [assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")] [assembly: IgnoresAccessChecksTo("FbxBuildTestAssets")] [assembly: IgnoresAccessChecksTo("Klattersynth")] [assembly: IgnoresAccessChecksTo("Photon3Unity3D")] [assembly: IgnoresAccessChecksTo("PhotonChat")] [assembly: IgnoresAccessChecksTo("PhotonRealtime")] [assembly: IgnoresAccessChecksTo("PhotonUnityNetworking")] [assembly: IgnoresAccessChecksTo("PhotonUnityNetworking.Utilities")] [assembly: IgnoresAccessChecksTo("PhotonVoice.API")] [assembly: IgnoresAccessChecksTo("PhotonVoice")] [assembly: IgnoresAccessChecksTo("PhotonVoice.PUN")] [assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime")] [assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime.Public")] [assembly: IgnoresAccessChecksTo("Sirenix.OdinInspector.Attributes")] [assembly: IgnoresAccessChecksTo("Sirenix.Serialization.Config")] [assembly: IgnoresAccessChecksTo("Sirenix.Serialization")] [assembly: IgnoresAccessChecksTo("Sirenix.Utilities")] [assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")] [assembly: IgnoresAccessChecksTo("Unity.Burst")] [assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")] [assembly: IgnoresAccessChecksTo("Unity.Collections")] [assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")] [assembly: IgnoresAccessChecksTo("Unity.Formats.Fbx.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")] [assembly: IgnoresAccessChecksTo("Unity.Mathematics")] [assembly: IgnoresAccessChecksTo("Unity.MemoryProfiler")] [assembly: IgnoresAccessChecksTo("Unity.Postprocessing.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")] [assembly: IgnoresAccessChecksTo("Unity.Splines")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("Unity.Timeline")] [assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Antlr3.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Core")] [assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Flow")] [assembly: IgnoresAccessChecksTo("Unity.VisualScripting.State")] [assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: IgnoresAccessChecksTo("websocket-sharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("REPOPingMod")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+2d663e5aa121592efa0d517d5f83a67d631348ce")] [assembly: AssemblyProduct("REPOPingMod")] [assembly: AssemblyTitle("REPOPingMod")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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 REPOPingMod { public static class ArmPointing { private class PointState { public bool isPointing; public Vector3 worldTarget; public float timer; } private static readonly Dictionary _states = new Dictionary(); public static void Initialize(Harmony harmony) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown try { MethodInfo methodInfo = AccessTools.Method(typeof(PlayerAvatarRightArm), "Update", (Type[])null, (Type[])null); if (methodInfo != null) { HarmonyMethod val = new HarmonyMethod(typeof(ArmPointing), "RemoteArmPostfix", (Type[])null); harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Plugin.Logger.LogInfo((object)"[ArmPointing] Patched PlayerAvatarRightArm.Update"); } } catch (Exception ex) { Plugin.Logger.LogWarning((object)("[ArmPointing] Failed to patch: " + ex.Message)); } SceneManager.sceneLoaded += delegate { _states.Clear(); }; } public static void StartPointing(Vector3 worldPosition, float duration = 1f) { } public static void StartPointingForPlayer(int actorNumber, Vector3 worldPosition, float duration = 1f) { //IL_007f: 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) PlayerAvatar[] array = Object.FindObjectsOfType(); foreach (PlayerAvatar val in array) { if ((Object)(object)val.photonView != (Object)null && val.photonView.Owner != null && val.photonView.Owner.ActorNumber == actorNumber) { int instanceID = ((Object)val).GetInstanceID(); if (!_states.ContainsKey(instanceID)) { _states[instanceID] = new PointState(); } _states[instanceID].isPointing = true; _states[instanceID].worldTarget = worldPosition; _states[instanceID].timer = duration; break; } } } private static void RemoteArmPostfix(PlayerAvatarRightArm __instance) { //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: 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_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_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_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_00fc: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance.playerAvatar == (Object)null) { return; } int instanceID = ((Object)__instance.playerAvatar).GetInstanceID(); if (!_states.TryGetValue(instanceID, out var value) || !value.isPointing) { return; } float deltaTime = Time.deltaTime; value.timer -= deltaTime; if (value.timer <= 0f) { value.isPointing = false; _states.Remove(instanceID); } else { if ((Object)(object)__instance.rightArmTransform == (Object)null) { return; } __instance.rightArmTransform.localEulerAngles = __instance.grabberPose; Transform grabberAimTarget = __instance.grabberAimTarget; if (!((Object)(object)grabberAimTarget == (Object)null)) { Transform rightArmParentTransform = __instance.rightArmParentTransform; if (!((Object)(object)rightArmParentTransform == (Object)null)) { Vector3 position = grabberAimTarget.position; grabberAimTarget.position = Vector3.Lerp(position, value.worldTarget, 30f * deltaTime); Quaternion localRotation = rightArmParentTransform.localRotation; rightArmParentTransform.LookAt(grabberAimTarget); Quaternion localRotation2 = rightArmParentTransform.localRotation; rightArmParentTransform.localRotation = localRotation; rightArmParentTransform.localRotation = SemiFunc.SpringQuaternionGet(__instance.grabberSteerSpring, localRotation2, deltaTime); } } } } } public class PingController : MonoBehaviour { private RadialWheel _radialWheel; private float _pressStartTime; private bool _isPressed; private bool _wheelOpened; private bool _hasHitPoint; private Vector3 _savedHitPoint; private Vector3 _savedHitNormal; private GameObject _savedHitObject; private float _lastPingTime; public void Initialize(RadialWheel radialWheel) { _radialWheel = radialWheel; } private void Update() { //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) bool mouseButtonDown = Input.GetMouseButtonDown(2); bool mouseButtonUp = Input.GetMouseButtonUp(2); bool mouseButtonDown2 = Input.GetMouseButtonDown(1); float value = Plugin.PingConfig.RadialWheelDelay.Value; if (mouseButtonDown) { _pressStartTime = Time.time; _isPressed = true; _wheelOpened = false; _hasHitPoint = TryRaycast(out _savedHitPoint, out _savedHitNormal, out _savedHitObject); } if (_isPressed && !_wheelOpened && Time.time - _pressStartTime >= value) { _wheelOpened = true; _radialWheel?.Show(); } if (_wheelOpened && mouseButtonDown2) { _radialWheel?.Hide(); _isPressed = false; _wheelOpened = false; } if (!(_isPressed && mouseButtonUp)) { return; } _isPressed = false; if (_hasHitPoint && Time.time - _lastPingTime >= 0.5f) { _lastPingTime = Time.time; PingType pingType2; if (_wheelOpened) { PingType? pingType = _radialWheel?.GetSelectedType(); _radialWheel?.Hide(); if (!pingType.HasValue) { _wheelOpened = false; return; } pingType2 = pingType.Value; } else { pingType2 = DetectPingType(_savedHitObject); } Vector3 position = _savedHitPoint + _savedHitNormal * 0.3f; GameObject hitObject = null; if ((Object)(object)_savedHitObject != (Object)null && (pingType2 != 0 || IsCart(_savedHitObject))) { hitObject = _savedHitObject; } PingManager.Instance?.PlacePingLocal(position, pingType2, hitObject); } else if (_wheelOpened) { _radialWheel?.Hide(); } _wheelOpened = false; } private bool TryRaycast(out Vector3 hitPoint, out Vector3 hitNormal, out GameObject hitObject) { //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_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0052: 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_0054: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) hitPoint = Vector3.zero; hitNormal = Vector3.up; hitObject = null; Camera main = Camera.main; if ((Object)(object)main == (Object)null) { return false; } float value = Plugin.PingConfig.MaxPingDistance.Value; Vector3 position = ((Component)main).transform.position; Vector3 forward = ((Component)main).transform.forward; Ray val = new Ray(position, forward); int num = ~804864; RaycastHit[] array = Physics.RaycastAll(val, value, num, (QueryTriggerInteraction)1); if (array.Length == 0) { return false; } Array.Sort(array, (RaycastHit a, RaycastHit b) => ((RaycastHit)(ref a)).distance.CompareTo(((RaycastHit)(ref b)).distance)); RaycastHit[] array2 = array; for (int i = 0; i < array2.Length; i++) { RaycastHit val2 = array2[i]; if (!((RaycastHit)(ref val2)).collider.isTrigger && !(((RaycastHit)(ref val2)).distance < 0.5f)) { hitPoint = ((RaycastHit)(ref val2)).point; hitNormal = ((RaycastHit)(ref val2)).normal; hitObject = ((Component)((RaycastHit)(ref val2)).collider).gameObject; return true; } } return false; } private static PingType DetectPingType(GameObject hitObj) { if ((Object)(object)hitObj == (Object)null) { return PingType.GoHere; } bool flag = IsCart(hitObj); bool flag2 = IsEnemy(hitObj); bool flag3 = IsItem(hitObj); Plugin.Logger.LogInfo((object)$"[DETECT] Object: {((Object)hitObj).name} | Layer: {hitObj.layer} | IsCart: {flag} | IsEnemy: {flag2} | IsItem: {flag3}"); if (flag2) { return PingType.Enemy; } if (flag) { return PingType.GoHere; } if (flag3) { return PingType.Loot; } return PingType.GoHere; } private static bool IsEnemy(GameObject obj) { if (!((Object)(object)obj.GetComponentInParent() != (Object)null) && !((Object)(object)obj.GetComponentInParent() != (Object)null)) { return (Object)(object)obj.GetComponentInParent() != (Object)null; } return true; } private static bool IsItem(GameObject obj) { if (!((Object)(object)obj.GetComponentInParent() != (Object)null)) { return (Object)(object)obj.GetComponentInParent() != (Object)null; } return true; } private static bool IsCart(GameObject obj) { return (Object)(object)obj.GetComponentInParent() != (Object)null; } private static string GetCustomLabel(GameObject hitObj) { if ((Object)(object)hitObj != (Object)null && IsCart(hitObj)) { return "Cart is here"; } return null; } } [BepInPlugin("com.repomods.pingsystem", "REPO Ping System", "0.3.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public const string PluginGUID = "com.repomods.pingsystem"; public const string PluginName = "REPO Ping System"; public const string PluginVersion = "0.3.1"; internal static ManualLogSource Logger; internal static PingConfig PingConfig; private void Awake() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)"REPO Ping System v0.3.1 loading..."); PingConfig = new PingConfig(((BaseUnityPlugin)this).Config); try { GameObject val = new GameObject("REPOPingMod"); ((Object)val).hideFlags = (HideFlags)61; Logger.LogInfo((object)"[DEBUG] GameObject created with HideAndDontSave"); PingAudio.Initialize(val); Logger.LogInfo((object)"[DEBUG] PingAudio initialized"); val.AddComponent(); Logger.LogInfo((object)"[DEBUG] PingManager added"); PingNetSync pingNetSync = val.AddComponent(); Logger.LogInfo((object)"[DEBUG] PingNetSync added"); pingNetSync.Initialize(); Logger.LogInfo((object)"[DEBUG] PingNetSync initialized"); RadialWheel radialWheel = val.AddComponent(); Logger.LogInfo((object)"[DEBUG] RadialWheel added"); PingController pingController = val.AddComponent(); pingController.Initialize(radialWheel); Logger.LogInfo((object)$"[DEBUG] PingController added, enabled={((Behaviour)pingController).enabled}, go.active={val.activeInHierarchy}"); ArmPointing.Initialize(new Harmony("com.repomods.pingsystem")); Logger.LogInfo((object)"REPO Ping System v0.3.1 loaded successfully!"); } catch (Exception arg) { Logger.LogError((object)string.Format("{0} v{1} FAILED to load: {2}", "REPO Ping System", "0.3.1", arg)); } } } } namespace REPOPingMod.PingSystem { public static class PingAudio { private enum ToneShape { Sine, Square } private static readonly Dictionary _clips = new Dictionary(); private static AudioSource _audioSource; public static void Initialize(GameObject parent) { _audioSource = parent.AddComponent(); _audioSource.playOnAwake = false; _audioSource.spatialBlend = 0f; _clips[PingType.GoHere] = GenerateTone(440f, 0.15f, ToneShape.Sine); _clips[PingType.Danger] = GenerateDoubleTone(880f, 0.1f, 0.05f); _clips[PingType.Enemy] = GenerateTone(220f, 0.25f, ToneShape.Square); _clips[PingType.Loot] = GenerateRisingTone(523f, 784f, 0.2f); } public static void Play(PingType type) { if (Plugin.PingConfig.SoundEnabled.Value && _clips.TryGetValue(type, out var value)) { _audioSource.volume = Plugin.PingConfig.SoundVolume.Value; _audioSource.PlayOneShot(value); } } private static AudioClip GenerateTone(float frequency, float duration, ToneShape shape) { int num = 44100; int num2 = (int)((float)num * duration); float[] array = new float[num2]; for (int i = 0; i < num2; i++) { float num3 = (float)i / (float)num; float num4 = 1f - (float)i / (float)num2; float num5 = ((shape == ToneShape.Sine) ? Mathf.Sin(MathF.PI * 2f * frequency * num3) : ((Mathf.Sin(MathF.PI * 2f * frequency * num3) >= 0f) ? 1f : (-1f))); array[i] = num5 * num4 * 0.5f; } AudioClip obj = AudioClip.Create($"ping_{shape}_{frequency}", num2, 1, num, false); obj.SetData(array, 0); return obj; } private static AudioClip GenerateDoubleTone(float frequency, float toneDuration, float gapDuration) { int num = 44100; int num2 = (int)((float)num * toneDuration); int num3 = (int)((float)num * gapDuration); int num4 = num2 * 2 + num3; float[] array = new float[num4]; for (int i = 0; i < num2; i++) { float num5 = (float)i / (float)num; float num6 = 1f - (float)i / (float)num2; array[i] = Mathf.Sin(MathF.PI * 2f * frequency * num5) * num6 * 0.5f; } int num7 = num2 + num3; for (int j = 0; j < num2; j++) { float num8 = (float)j / (float)num; float num9 = 1f - (float)j / (float)num2; array[num7 + j] = Mathf.Sin(MathF.PI * 2f * frequency * num8) * num9 * 0.5f; } AudioClip obj = AudioClip.Create("ping_double", num4, 1, num, false); obj.SetData(array, 0); return obj; } private static AudioClip GenerateRisingTone(float startFreq, float endFreq, float duration) { int num = 44100; int num2 = (int)((float)num * duration); float[] array = new float[num2]; for (int i = 0; i < num2; i++) { float num3 = (float)i / (float)num; float num4 = (float)i / (float)num2; float num5 = Mathf.Lerp(startFreq, endFreq, num4); float num6 = 1f - num4 * 0.5f; array[i] = Mathf.Sin(MathF.PI * 2f * num5 * num3) * num6 * 0.5f; } AudioClip obj = AudioClip.Create("ping_rising", num2, 1, num, false); obj.SetData(array, 0); return obj; } } public class PingConfig { public ConfigEntry PingKey { get; } public ConfigEntry PingDuration { get; } public ConfigEntry PingFadeDuration { get; } public ConfigEntry MaxPingDistance { get; } public ConfigEntry SoundVolume { get; } public ConfigEntry SoundEnabled { get; } public ConfigEntry ShowDistance { get; } public ConfigEntry ShowPlayerName { get; } public ConfigEntry RadialWheelDelay { get; } public PingConfig(ConfigFile config) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Expected O, but got Unknown //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Expected O, but got Unknown PingKey = config.Bind("Input", "PingKey", (KeyCode)325, "Key to activate ping"); PingDuration = config.Bind("Ping", "PingDuration", 4f, new ConfigDescription("How long the ping marker lasts (seconds)", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 30f), Array.Empty())); PingFadeDuration = config.Bind("Ping", "PingFadeDuration", 2f, new ConfigDescription("Fade out duration at end of ping (seconds)", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 5f), Array.Empty())); MaxPingDistance = config.Bind("Ping", "MaxPingDistance", 100f, new ConfigDescription("Maximum raycast distance for placing pings", (AcceptableValueBase)(object)new AcceptableValueRange(10f, 500f), Array.Empty())); SoundVolume = config.Bind("Audio", "SoundVolume", 0.7f, new ConfigDescription("Ping sound volume", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 1f), Array.Empty())); SoundEnabled = config.Bind("Audio", "SoundEnabled", true, "Enable or disable ping sounds"); ShowDistance = config.Bind("Display", "ShowDistance", true, "Show distance on ping marker"); ShowPlayerName = config.Bind("Display", "ShowPlayerName", true, "Show player name on ping marker"); RadialWheelDelay = config.Bind("Input", "RadialWheelDelay", 0.3f, new ConfigDescription("Seconds to hold before radial wheel opens", (AcceptableValueBase)(object)new AcceptableValueRange(0.1f, 1f), Array.Empty())); } } public class PingManager : MonoBehaviour { private readonly Dictionary _activePings = new Dictionary(); public static PingManager Instance { get; private set; } private void Awake() { if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this) { Object.Destroy((Object)(object)this); return; } Instance = this; SceneManager.sceneLoaded += OnSceneLoaded; } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { _activePings.Clear(); } private void OnDestroy() { SceneManager.sceneLoaded -= OnSceneLoaded; } public void PlacePingLocal(Vector3 position, PingType type, GameObject hitObject = null, string customLabel = null) { //IL_0048: 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_006f: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)LevelGenerator.Instance == (Object)null) && LevelGenerator.Instance.Generated && !SemiFunc.MenuLevel()) { string localPlayerId = GetLocalPlayerId(); string localPlayerName = GetLocalPlayerName(); string hitObjectName = (((Object)(object)hitObject != (Object)null) ? ((Object)hitObject).name : ""); PlacePing(position, type, localPlayerId, localPlayerName, hitObject, customLabel); PingAudio.Play(type); PingNetSync.Instance?.BroadcastPing(position, type, localPlayerId, localPlayerName, hitObjectName); ArmPointing.StartPointing(position); } } public void PlacePing(Vector3 position, PingType type, string playerId, string playerName, GameObject hitObject = null, string customLabel = null) { //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_0041: 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) if (_activePings.TryGetValue(playerId, out var value) && (Object)(object)value != (Object)null) { Object.Destroy((Object)(object)((Component)value).gameObject); } GameObject val = new GameObject($"Ping_{type}_{playerName}"); val.transform.position = position; PingMarker pingMarker = val.AddComponent(); pingMarker.Initialize(type, playerName, playerId, hitObject, customLabel); _activePings[playerId] = pingMarker; Plugin.Logger.LogInfo((object)$"Ping placed: {type} by {playerName} at {position}"); } public void OnMarkerDestroyed(string playerId, PingMarker marker) { if (playerId != null && _activePings.TryGetValue(playerId, out var value) && (Object)(object)value == (Object)(object)marker) { _activePings.Remove(playerId); } } public void RemovePing(string playerId) { if (_activePings.TryGetValue(playerId, out var value) && (Object)(object)value != (Object)null) { Object.Destroy((Object)(object)((Component)value).gameObject); } _activePings.Remove(playerId); } public GameObject FindObjectByName(Vector3 position, string objectName) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) Collider[] array = Physics.OverlapSphere(position, 3f); Collider[] array2 = array; foreach (Collider val in array2) { if (!val.isTrigger && ((Object)((Component)val).gameObject).name == objectName) { return ((Component)val).gameObject; } } array2 = array; foreach (Collider val2 in array2) { if (val2.isTrigger) { continue; } Transform val3 = ((Component)val2).transform; for (int j = 0; j < 3; j++) { if (!((Object)(object)val3 != (Object)null)) { break; } if (((Object)((Component)val3).gameObject).name == objectName) { return ((Component)val2).gameObject; } val3 = val3.parent; } } return null; } private string GetLocalPlayerId() { if (SemiFunc.IsMultiplayer()) { return PhotonNetwork.LocalPlayer.ActorNumber.ToString(); } return "local"; } private string GetLocalPlayerName() { if (SemiFunc.IsMultiplayer()) { return PhotonNetwork.LocalPlayer.NickName; } return "Player"; } } public class PingMarker : MonoBehaviour { [CompilerGenerated] private sealed class d__29 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public GameObject target; public PingMarker <>4__this; private Transform 5__2; private GameObject 5__3; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__29(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { 5__2 = null; 5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_01b2: 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_040a: Unknown result type (might be due to invalid IL or missing references) //IL_040f: Unknown result type (might be due to invalid IL or missing references) //IL_041d: Unknown result type (might be due to invalid IL or missing references) //IL_043f: Unknown result type (might be due to invalid IL or missing references) //IL_044e: Unknown result type (might be due to invalid IL or missing references) //IL_045d: Unknown result type (might be due to invalid IL or missing references) //IL_048a: Unknown result type (might be due to invalid IL or missing references) //IL_0491: Expected O, but got Unknown //IL_04a9: Unknown result type (might be due to invalid IL or missing references) //IL_04d3: Unknown result type (might be due to invalid IL or missing references) //IL_04e7: Unknown result type (might be due to invalid IL or missing references) //IL_04ee: Unknown result type (might be due to invalid IL or missing references) //IL_04f3: Unknown result type (might be due to invalid IL or missing references) //IL_0506: Unknown result type (might be due to invalid IL or missing references) //IL_0515: Unknown result type (might be due to invalid IL or missing references) //IL_051a: Unknown result type (might be due to invalid IL or missing references) //IL_0522: Unknown result type (might be due to invalid IL or missing references) //IL_053f: Unknown result type (might be due to invalid IL or missing references) //IL_0560: Unknown result type (might be due to invalid IL or missing references) //IL_0568: Unknown result type (might be due to invalid IL or missing references) //IL_057c: Unknown result type (might be due to invalid IL or missing references) //IL_0583: Unknown result type (might be due to invalid IL or missing references) //IL_0588: Unknown result type (might be due to invalid IL or missing references) //IL_0592: Unknown result type (might be due to invalid IL or missing references) //IL_059a: Unknown result type (might be due to invalid IL or missing references) //IL_05a9: Unknown result type (might be due to invalid IL or missing references) //IL_05ae: Unknown result type (might be due to invalid IL or missing references) //IL_05d4: Unknown result type (might be due to invalid IL or missing references) //IL_0635: Unknown result type (might be due to invalid IL or missing references) //IL_063a: Unknown result type (might be due to invalid IL or missing references) //IL_063e: Unknown result type (might be due to invalid IL or missing references) //IL_0645: Unknown result type (might be due to invalid IL or missing references) //IL_064f: Unknown result type (might be due to invalid IL or missing references) //IL_0654: Unknown result type (might be due to invalid IL or missing references) //IL_0656: Unknown result type (might be due to invalid IL or missing references) //IL_065e: Unknown result type (might be due to invalid IL or missing references) //IL_0663: Unknown result type (might be due to invalid IL or missing references) //IL_0665: Unknown result type (might be due to invalid IL or missing references) //IL_066f: Unknown result type (might be due to invalid IL or missing references) //IL_0677: Unknown result type (might be due to invalid IL or missing references) //IL_0689: Unknown result type (might be due to invalid IL or missing references) //IL_0693: Expected O, but got Unknown //IL_06b4: Expected O, but got Unknown //IL_06c0: Expected O, but got Unknown int num = <>1__state; PingMarker pingMarker = <>4__this; switch (num) { default: return false; case 0: { <>1__state = -1; 5__2 = target.transform; MeshRenderer[] array = null; Transform val14 = target.transform; for (int k = 0; k < 8; k++) { if (!((Object)(object)val14 != (Object)null)) { break; } if ((Object)(object)((Component)val14).GetComponent("PhysGrabCart") != (Object)null) { 5__2 = val14; array = ((Component)5__2).GetComponentsInChildren(true); break; } if ((Object)(object)val14.parent != (Object)null && (Object)(object)((Component)val14.parent).GetComponent("LevelGenerator") != (Object)null) { break; } val14 = val14.parent; } if (array == null || array.Length == 0) { 5__2 = target.transform; for (int l = 0; l < 3; l++) { if (!((Object)(object)5__2 != (Object)null)) { break; } array = ((Component)5__2).GetComponentsInChildren(true); if ((array != null && array.Length != 0) || ((Object)(object)5__2.parent != (Object)null && (Object)(object)((Component)5__2.parent).GetComponent("LevelGenerator") != (Object)null)) { break; } 5__2 = 5__2.parent; } } if (array == null || array.Length == 0) { return false; } <>2__current = null; <>1__state = 1; return true; } case 1: { <>1__state = -1; bool activeSelf = ((Component)5__2).gameObject.activeSelf; ((Component)5__2).gameObject.SetActive(false); Vector3 val13 = default(Vector3); ((Vector3)(ref val13))..ctor(0f, -5000f, 0f); 5__3 = Object.Instantiate(((Component)5__2).gameObject, val13, Quaternion.identity); ((Component)5__2).gameObject.SetActive(activeSelf); <>2__current = null; <>1__state = 2; return true; } case 2: { <>1__state = -1; if ((Object)(object)5__3 == (Object)null) { return false; } MonoBehaviour[] componentsInChildren8 = 5__3.GetComponentsInChildren(true); foreach (MonoBehaviour val12 in componentsInChildren8) { if ((Object)(object)val12 != (Object)null) { ((Behaviour)val12).enabled = false; } } <>2__current = null; <>1__state = 3; return true; } case 3: { <>1__state = -1; if ((Object)(object)5__3 == (Object)null) { return false; } Rigidbody[] componentsInChildren3 = 5__3.GetComponentsInChildren(true); foreach (Rigidbody val7 in componentsInChildren3) { if ((Object)(object)val7 != (Object)null) { val7.isKinematic = true; } } Collider[] componentsInChildren4 = 5__3.GetComponentsInChildren(true); foreach (Collider val8 in componentsInChildren4) { if ((Object)(object)val8 != (Object)null) { val8.enabled = false; } } AudioSource[] componentsInChildren5 = 5__3.GetComponentsInChildren(true); foreach (AudioSource val9 in componentsInChildren5) { if ((Object)(object)val9 != (Object)null) { ((Behaviour)val9).enabled = false; } } Animator[] componentsInChildren6 = 5__3.GetComponentsInChildren(true); foreach (Animator val10 in componentsInChildren6) { if ((Object)(object)val10 != (Object)null) { ((Behaviour)val10).enabled = false; } } ParticleSystem[] componentsInChildren7 = 5__3.GetComponentsInChildren(true); foreach (ParticleSystem val11 in componentsInChildren7) { if ((Object)(object)val11 != (Object)null) { val11.Stop(); } } <>2__current = null; <>1__state = 4; return true; } case 4: { <>1__state = -1; if ((Object)(object)5__3 == (Object)null) { return false; } 5__3.SetActive(true); int num2 = 31; Transform[] componentsInChildren = 5__3.GetComponentsInChildren(); for (int i = 0; i < componentsInChildren.Length; i++) { ((Component)componentsInChildren[i]).gameObject.layer = num2; } Renderer[] componentsInChildren2 = 5__3.GetComponentsInChildren(true); if (componentsInChildren2.Length == 0) { Object.Destroy((Object)(object)5__3); return false; } Bounds bounds = componentsInChildren2[0].bounds; for (int j = 1; j < componentsInChildren2.Length; j++) { ((Bounds)(ref bounds)).Encapsulate(componentsInChildren2[j].bounds); } float num3 = Mathf.Max(new float[3] { ((Bounds)(ref bounds)).size.x, ((Bounds)(ref bounds)).size.y, ((Bounds)(ref bounds)).size.z }); if (num3 < 0.01f) { Object.Destroy((Object)(object)5__3); return false; } GameObject val = new GameObject("PingPreviewLight"); val.layer = num2; Light obj = val.AddComponent(); obj.type = (LightType)1; obj.color = Color.white; obj.intensity = 1.5f; obj.cullingMask = 1 << num2; val.transform.position = ((Bounds)(ref bounds)).center + new Vector3(1f, 2f, 1f) * num3; val.transform.LookAt(((Bounds)(ref bounds)).center); GameObject val2 = new GameObject("PingPreviewFillLight") { layer = num2 }; Light obj2 = val2.AddComponent(); obj2.type = (LightType)1; obj2.color = new Color(0.8f, 0.85f, 1f); obj2.intensity = 0.8f; obj2.cullingMask = 1 << num2; val2.transform.position = ((Bounds)(ref bounds)).center + new Vector3(-1f, 0.5f, -1f) * num3; val2.transform.LookAt(((Bounds)(ref bounds)).center); GameObject val3 = new GameObject("PingPreviewCam"); Camera val4 = val3.AddComponent(); val4.clearFlags = (CameraClearFlags)2; val4.backgroundColor = new Color(0f, 0f, 0f, 0f); val4.orthographic = true; ((Behaviour)val4).enabled = false; val4.orthographicSize = num3 * 0.6f; val4.nearClipPlane = 0.01f; val4.farClipPlane = num3 * 10f; val4.cullingMask = 1 << num2; Vector3 val5 = new Vector3(1f, 0.8f, 1f); Vector3 val6 = ((Vector3)(ref val5)).normalized * num3 * 3f; val3.transform.position = ((Bounds)(ref bounds)).center + val6; val3.transform.LookAt(((Bounds)(ref bounds)).center); pingMarker._previewRT = new RenderTexture(64, 64, 16, (RenderTextureFormat)0); val4.targetTexture = pingMarker._previewRT; val4.Render(); val4.targetTexture = null; Object.Destroy((Object)val3); Object.Destroy((Object)(object)val); Object.Destroy((Object)val2); Object.Destroy((Object)(object)5__3); return false; } } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static Font _cachedFont; private static Texture2D _circleTexture; private static GUIStyle _labelStyle; private static GUIStyle _nameStyle; private static GUIStyle _distStyle; private string _playerId; private float _spawnTime; private float _duration; private float _fadeDuration; private RenderTexture _previewRT; private string _customLabel; private Transform _trackedObject; private Vector3 _trackingOffset; public PingType Type { get; private set; } public string PlayerName { get; private set; } public Vector3 WorldPosition { get; private set; } public void Initialize(PingType type, string playerName, string playerId, GameObject hitObject = null, string customLabel = null) { //IL_0024: 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_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) Type = type; PlayerName = playerName; _playerId = playerId; _customLabel = customLabel; WorldPosition = ((Component)this).transform.position; if ((Object)(object)hitObject != (Object)null) { _trackedObject = hitObject.transform; _trackingOffset = WorldPosition - _trackedObject.position; } PingConfig pingConfig = Plugin.PingConfig; _duration = pingConfig.PingDuration.Value; _fadeDuration = Mathf.Min(pingConfig.PingFadeDuration.Value, _duration); _spawnTime = Time.time; if ((Object)(object)_cachedFont == (Object)null) { _cachedFont = Resources.GetBuiltinResource("Arial.ttf"); if ((Object)(object)_cachedFont == (Object)null) { _cachedFont = Resources.GetBuiltinResource("LegacyRuntime.ttf"); } } if ((Object)(object)_circleTexture == (Object)null) { _circleTexture = CreateCircleTexture(64); } InitStyles(); if ((Object)(object)hitObject != (Object)null) { ((MonoBehaviour)this).StartCoroutine(CapturePreviewAsync(hitObject)); } } private static void InitStyles() { //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_001c: 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_0038: Expected O, but got Unknown //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_0044: 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_0053: 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_0068: Expected O, but got Unknown //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_0074: 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_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown if (_labelStyle == null) { GUIStyle val = new GUIStyle { alignment = (TextAnchor)4, fontSize = 14, fontStyle = (FontStyle)1 }; val.normal.textColor = Color.white; _labelStyle = val; GUIStyle val2 = new GUIStyle { alignment = (TextAnchor)4, fontSize = 13, fontStyle = (FontStyle)1 }; val2.normal.textColor = Color.white; _nameStyle = val2; GUIStyle val3 = new GUIStyle { alignment = (TextAnchor)4, fontSize = 12 }; val3.normal.textColor = new Color(0.9f, 0.9f, 0.9f, 0.9f); _distStyle = val3; } } private void Update() { //IL_0035: 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) if (Time.time - _spawnTime >= _duration) { Object.Destroy((Object)(object)((Component)this).gameObject); } else if ((Object)(object)_trackedObject != (Object)null) { WorldPosition = _trackedObject.position + _trackingOffset; } } private void OnGUI() { //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: 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_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: 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_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: 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_0126: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01ea: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_0215: 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_0224: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02c1: 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_017f: Unknown result type (might be due to invalid IL or missing references) Camera main = Camera.main; if ((Object)(object)main == (Object)null) { return; } float num = Time.time - _spawnTime; float num2 = 1f; if (_fadeDuration > 0f) { float num3 = _duration - _fadeDuration; if (num >= num3) { num2 = Mathf.Lerp(1f, 0f, (num - num3) / _fadeDuration); } } float num4 = 1f; if (num < 0.2f) { num4 = Mathf.SmoothStep(0f, 1f, num / 0.2f); } Vector3 val = main.WorldToViewportPoint(WorldPosition); if (val.z <= 0f) { return; } float num5 = Vector3.Distance(((Component)main).transform.position, WorldPosition); if (!(num5 > 15f)) { float num6 = val.x * (float)Screen.width; float num7 = (1f - val.y) * (float)Screen.height; Color color = Type.GetColor(); color.a = num2; float num8 = 50f * num4; float num9 = num8 / 2f; GUI.color = color; GUI.DrawTexture(new Rect(num6 - num9, num7 - num9, num8, num8), (Texture)(object)_circleTexture); if ((Object)(object)_previewRT != (Object)null) { float num10 = num8 * 0.7f; float num11 = num10 / 2f; GUI.color = new Color(1f, 1f, 1f, num2); GUI.DrawTexture(new Rect(num6 - num11, num7 - num11, num10, num10), (Texture)(object)_previewRT); } GUI.color = new Color(1f, 1f, 1f, num2); _labelStyle.normal.textColor = new Color(1f, 1f, 1f, num2); GUI.Label(new Rect(num6 - 60f, num7 - num9 - 2f, 120f, 20f), Type.GetLabel(), _labelStyle); _nameStyle.normal.textColor = new Color(color.r, color.g, color.b, num2); GUI.Label(new Rect(num6 - 80f, num7 - num9 - 22f, 160f, 20f), PlayerName, _nameStyle); _distStyle.normal.textColor = new Color(0.9f, 0.9f, 0.9f, num2); GUI.Label(new Rect(num6 - 60f, num7 + num9 + 2f, 120f, 20f), $"{num5:F0}m", _distStyle); GUI.color = Color.white; } } [IteratorStateMachine(typeof(d__29))] private IEnumerator CapturePreviewAsync(GameObject target) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__29(0) { <>4__this = this, target = target }; } private void OnDestroy() { PingManager.Instance?.OnMarkerDestroyed(_playerId, this); if ((Object)(object)_previewRT != (Object)null) { _previewRT.Release(); Object.Destroy((Object)(object)_previewRT); } } private static Texture2D CreateCircleTexture(int size) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_002a: 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_0072: 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_0077: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(size, size, (TextureFormat)4, false); Color[] array = (Color[])(object)new Color[size * size]; float num = (float)size / 2f; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { float num2 = Vector2.Distance(new Vector2((float)j, (float)i), new Vector2(num, num)); float num3 = Mathf.Clamp01((num - num2) * 2f); array[i * size + j] = (Color)((num2 <= num) ? new Color(1f, 1f, 1f, num3) : Color.clear); } } val.SetPixels(array); val.Apply(); return val; } } public enum PingType { GoHere, Danger, Enemy, Loot } public static class PingTypeExtensions { public static Color GetColor(this PingType type) { //IL_002c: 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_0048: 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_0064: 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_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_008e: 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_008d: Unknown result type (might be due to invalid IL or missing references) return (Color)(type switch { PingType.GoHere => new Color(0.2f, 0.6f, 1f, 1f), PingType.Danger => new Color(1f, 0.2f, 0.2f, 1f), PingType.Enemy => new Color(1f, 0.6f, 0.1f, 1f), PingType.Loot => new Color(0.2f, 0.9f, 0.3f, 1f), _ => Color.white, }); } public static string GetLabel(this PingType type) { return type switch { PingType.GoHere => "Go Here", PingType.Danger => "Danger", PingType.Enemy => "Enemy", PingType.Loot => "Loot", _ => "Ping", }; } } } namespace REPOPingMod.Networking { public class PingNetSync : MonoBehaviour { private NetworkedEvent _pingEvent; private bool _initialized; private static readonly Dictionary _lastPingTime = new Dictionary(); public static PingNetSync Instance { get; private set; } private void Awake() { if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this) { Object.Destroy((Object)(object)this); } else { Instance = this; } } public void Initialize() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown try { _pingEvent = new NetworkedEvent("PingSystem_PlacePing", (Action)HandlePingEventData); _initialized = true; Plugin.Logger.LogInfo((object)"Ping network sync initialized via REPOLib NetworkedEvent"); } catch (Exception ex) { Plugin.Logger.LogWarning((object)("REPOLib NetworkedEvent init failed: " + ex.Message + " — local-only mode")); _initialized = false; } } public void BroadcastPing(Vector3 position, PingType type, string playerId, string playerName, string hitObjectName = "") { //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_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown //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_009c: Unknown result type (might be due to invalid IL or missing references) if (_initialized && SemiFunc.IsMultiplayer()) { string[] obj = new string[7] { position.x.ToString(CultureInfo.InvariantCulture), position.y.ToString(CultureInfo.InvariantCulture), position.z.ToString(CultureInfo.InvariantCulture), null, null, null, null }; int num = (int)type; obj[3] = num.ToString(); obj[4] = playerId; obj[5] = hitObjectName ?? ""; obj[6] = playerName; string text = string.Join("|", obj); RaiseEventOptions val = new RaiseEventOptions { Receivers = (ReceiverGroup)0 }; SendOptions sendReliable = SendOptions.SendReliable; _pingEvent.RaiseEvent((object)text, val, sendReliable); } } private void HandlePingEventData(EventData eventData) { if (eventData.CustomData is string data) { HandlePingReceived(data); } } private void HandlePingReceived(string data) { //IL_0119: 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_0136: 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_015f: Unknown result type (might be due to invalid IL or missing references) try { string[] array = data.Split('|'); if (array.Length < 7) { return; } float num = float.Parse(array[0], CultureInfo.InvariantCulture); float num2 = float.Parse(array[1], CultureInfo.InvariantCulture); float num3 = float.Parse(array[2], CultureInfo.InvariantCulture); Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(num, num2, num3); PingType pingType = (PingType)int.Parse(array[3]); if (!Enum.IsDefined(typeof(PingType), pingType)) { return; } string text = array[4]; string text2 = array[5]; string playerName = string.Join("|", array, 6, array.Length - 6); if (SemiFunc.IsMultiplayer() && text == PhotonNetwork.LocalPlayer.ActorNumber.ToString()) { return; } float time = Time.time; if (!_lastPingTime.TryGetValue(text, out var value) || !(time - value < 0.5f)) { _lastPingTime[text] = time; GameObject hitObject = null; if (!string.IsNullOrEmpty(text2)) { hitObject = PingManager.Instance?.FindObjectByName(val, text2); } PingManager.Instance?.PlacePing(val, pingType, text, playerName, hitObject); if (int.TryParse(text, out var result)) { ArmPointing.StartPointingForPlayer(result, val); } Camera main = Camera.main; if ((Object)(object)main != (Object)null && Vector3.Distance(((Component)main).transform.position, val) <= 20f) { PingAudio.Play(pingType); } } } catch (Exception ex) { Plugin.Logger.LogWarning((object)("Failed to process received ping: " + ex.Message)); } } } } namespace REPOPingMod.Input { public class RadialWheel : MonoBehaviour { private bool _visible; private PingType? _hoveredType; private Vector2 _screenCenter; private float _wheelRadius = 120f; private float _sectionSize = 80f; private float _deadZone = 30f; private Texture2D _bgTexture; private Texture2D _hoverGoHereTexture; private Texture2D _hoverDangerTexture; private Texture2D _hoverEnemyTexture; private Texture2D _hoverLootTexture; private Texture2D _sectionBgTexture; private CursorLockMode _savedCursorLockState; private bool _savedCursorVisible; private readonly Dictionary _normalStyles = new Dictionary(); private GUIStyle _hoveredStyle; private void Awake() { //IL_0015: 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_004a: 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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0080: 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_009b: 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_00de: 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_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: 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_0100: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Expected O, but got Unknown //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Expected O, but got Unknown _bgTexture = MakeSolidTexture(new Color(0f, 0f, 0f, 0.6f)); _sectionBgTexture = MakeSolidTexture(new Color(0.2f, 0.2f, 0.2f, 0.7f)); _hoverGoHereTexture = MakeSolidTexture(WithAlpha(PingType.GoHere.GetColor(), 0.8f)); _hoverDangerTexture = MakeSolidTexture(WithAlpha(PingType.Danger.GetColor(), 0.8f)); _hoverEnemyTexture = MakeSolidTexture(WithAlpha(PingType.Enemy.GetColor(), 0.8f)); _hoverLootTexture = MakeSolidTexture(WithAlpha(PingType.Loot.GetColor(), 0.8f)); foreach (PingType value in Enum.GetValues(typeof(PingType))) { Dictionary normalStyles = _normalStyles; GUIStyle val = new GUIStyle { alignment = (TextAnchor)4, fontSize = 14, fontStyle = (FontStyle)0 }; val.normal.textColor = value.GetColor(); normalStyles[value] = val; } GUIStyle val2 = new GUIStyle { alignment = (TextAnchor)4, fontSize = 16, fontStyle = (FontStyle)1 }; val2.normal.textColor = Color.white; _hoveredStyle = val2; } public void Show() { //IL_002c: 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_0037: 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) _visible = true; _hoveredType = null; _screenCenter = new Vector2((float)Screen.width / 2f, (float)Screen.height / 2f); _savedCursorLockState = Cursor.lockState; _savedCursorVisible = Cursor.visible; Cursor.lockState = (CursorLockMode)0; Cursor.visible = true; } public void Hide() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) _visible = false; _hoveredType = null; Cursor.lockState = _savedCursorLockState; Cursor.visible = _savedCursorVisible; } public PingType? GetSelectedType() { return _hoveredType; } private void Update() { //IL_0009: 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_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_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) //IL_0050: Unknown result type (might be due to invalid IL or missing references) if (!_visible) { return; } Vector2 val = new Vector2(Input.mousePosition.x, Input.mousePosition.y) - _screenCenter; if (((Vector2)(ref val)).magnitude < _deadZone) { _hoveredType = null; return; } float num = Mathf.Atan2(val.y, val.x) * 57.29578f; if (num < 0f) { num += 360f; } if (num >= 45f && num < 135f) { _hoveredType = PingType.GoHere; } else if (num >= 135f && num < 225f) { _hoveredType = PingType.Loot; } else if (num >= 225f && num < 315f) { _hoveredType = PingType.Enemy; } else { _hoveredType = PingType.Danger; } } private void OnGUI() { //IL_0047: 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_0081: 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_00bd: Unknown result type (might be due to invalid IL or missing references) if (_visible) { float num = _wheelRadius + 40f; float num2 = (float)Screen.height - _screenCenter.y; GUI.DrawTexture(new Rect(_screenCenter.x - num, num2 - num, num * 2f, num * 2f), (Texture)(object)_bgTexture); DrawSection(PingType.GoHere, new Vector2(0f, _wheelRadius), _hoverGoHereTexture); DrawSection(PingType.Danger, new Vector2(_wheelRadius, 0f), _hoverDangerTexture); DrawSection(PingType.Enemy, new Vector2(0f, 0f - _wheelRadius), _hoverEnemyTexture); DrawSection(PingType.Loot, new Vector2(0f - _wheelRadius, 0f), _hoverLootTexture); } } private void DrawSection(PingType type, Vector2 offset, Texture2D hoverTexture) { //IL_0042: 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_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) bool flag = _hoveredType == type; float num = (flag ? (_sectionSize * 1.2f) : _sectionSize); float num2 = _screenCenter.x + offset.x - num / 2f; float num3 = (float)Screen.height - _screenCenter.y - offset.y - num / 2f; Rect val = new Rect(num2, num3, num, num); GUI.DrawTexture(val, (Texture)(object)(flag ? hoverTexture : _sectionBgTexture)); GUIStyle val2 = (flag ? _hoveredStyle : _normalStyles[type]); GUI.Label(val, type.GetLabel(), val2); } private static Texture2D MakeSolidTexture(Color color) { //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_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: Expected O, but got Unknown Texture2D val = new Texture2D(1, 1); val.SetPixel(0, 0, color); val.Apply(); return val; } private static Color WithAlpha(Color c, float a) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) return new Color(c.r, c.g, c.b, a); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }