Decompiled source of BifrostBeacon v1.0.3

BifrostBeacon.dll

Decompiled 17 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace BifrostBeacon;

[BepInPlugin("com.drakosdj.bifrostbeacon", "BifrostBeacon", "1.0.3")]
public class BifrostBeaconPlugin : BaseUnityPlugin
{
	public class PeerBeaconInfo
	{
		public Vector3 Position;

		public string Name;

		public float AudioPitch;

		public string PlayerName;

		public WorldTextInstance WorldTextInstance;

		public BifrostBeam BeamInstance;

		public float AudioTimer;
	}

	public static ConfigEntry<bool> configModEnabled;

	public static ConfigEntry<KeyCode> configModifierKey;

	public static ConfigEntry<bool> configShowHudMessage;

	public static ConfigEntry<bool> configShowVisualBeam;

	public static ConfigEntry<bool> configPlayAudioBeeps;

	public static ConfigEntry<float> configAudioRange;

	public static ConfigEntry<float> configAudioPitch;

	public static ConfigEntry<bool> configShowPeerHudMessage;

	public static ConfigEntry<bool> configShowPeerVisualBeam;

	public static Vector3? activeBeaconPosition = null;

	public static string activeBeaconName = "";

	public static WorldTextInstance activeBeaconWorldText = null;

	public static BifrostBeam beamInstance = null;

	public static readonly long BeaconTalkerID = 20260708L;

	public static float audioTimer = 0f;

	public static float broadcastTimer = 0f;

	public static Dictionary<long, PeerBeaconInfo> peerBeacons = new Dictionary<long, PeerBeaconInfo>();

	public static BifrostBeaconPlugin instance;

	private void Awake()
	{
		//IL_0138: Unknown result type (might be due to invalid IL or missing references)
		//IL_013e: Expected O, but got Unknown
		instance = this;
		configModEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ModEnabled", true, "If true, the entire mod is active. If false, disables all beacons, visual beams, and audio sounds.");
		configModifierKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Keybinds", "ModifierKey", (KeyCode)304, "Modifier key held during map middle-click to set or toggle the beacon waypoint.");
		configShowHudMessage = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ShowHudMessage", true, "If true, displays the distance and height difference to the beacon on the 3D HUD waypoint text.");
		configShowVisualBeam = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ShowVisualBeam", true, "If true, projects a vertical shifting rainbow light beam from the beacon waypoint.");
		configPlayAudioBeeps = ((BaseUnityPlugin)this).Config.Bind<bool>("Audio", "PlayAudioBeeps", true, "If true, plays proximity audio beeps (wishbone sound) that speed up and get sharper as you approach.");
		configAudioRange = ((BaseUnityPlugin)this).Config.Bind<float>("Audio", "AudioRange", 100f, "Maximum distance in meters at which the proximity audio beeping starts.");
		configAudioPitch = ((BaseUnityPlugin)this).Config.Bind<float>("Audio", "AudioPitch", 1.5f, "Pitch of the proximity audio beep (1.0 is default wishbone, higher is sharper/more distinct).");
		configShowPeerHudMessage = ((BaseUnityPlugin)this).Config.Bind<bool>("Multiplayer", "ShowPeerHudMessage", true, "If true, displays other players' active waypoints on the 3D HUD.");
		configShowPeerVisualBeam = ((BaseUnityPlugin)this).Config.Bind<bool>("Multiplayer", "ShowPeerVisualBeam", false, "If true, projects vertical rainbow light beams from other players' waypoints.");
		Harmony val = new Harmony("com.drakosdj.bifrostbeacon");
		val.PatchAll();
		Debug.Log((object)"[BifrostBeacon] Plugin loaded successfully!");
	}

	public static void SetBeacon(Vector3 position, string name)
	{
		//IL_006a: 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_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d0: Expected O, but got Unknown
		//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
		if (configModEnabled.Value)
		{
			float y = position.y;
			float num = default(float);
			if ((Object)(object)ZoneSystem.instance != (Object)null && ZoneSystem.instance.GetGroundHeight(position, ref num))
			{
				y = num + 1.5f;
			}
			position.y = y;
			Debug.Log((object)string.Concat("[BifrostBeacon] Setting beacon at ", position, " named: ", name));
			ClearBeacon();
			activeBeaconPosition = position;
			activeBeaconName = (string.IsNullOrEmpty(name) ? "Beacon" : name);
			if (configShowVisualBeam.Value)
			{
				GameObject val = new GameObject("BifrostBeaconBeam");
				beamInstance = val.AddComponent<BifrostBeam>();
				beamInstance.SetPositions(position, position + Vector3.up * 1000f);
			}
			BroadcastLocalBeacon();
		}
	}

	public static void ClearBeacon()
	{
		Debug.Log((object)"[BifrostBeacon] Clearing active beacon");
		activeBeaconPosition = null;
		activeBeaconName = "";
		if ((Object)(object)Chat.instance != (Object)null && activeBeaconWorldText != null)
		{
			if ((Object)(object)activeBeaconWorldText.m_gui != (Object)null)
			{
				Object.Destroy((Object)(object)activeBeaconWorldText.m_gui);
			}
			GetWorldTexts(Chat.instance)?.Remove(activeBeaconWorldText);
			activeBeaconWorldText = null;
		}
		if ((Object)(object)beamInstance != (Object)null)
		{
			Object.Destroy((Object)(object)((Component)beamInstance).gameObject);
			beamInstance = null;
		}
		if (ZRoutedRpc.instance != null)
		{
			ZRoutedRpc.instance.InvokeRoutedRPC(0L, "BifrostBeacon_ClearBeacon", new object[0]);
		}
	}

	public static void ClearPeerBeacon(long sender)
	{
		if (!peerBeacons.TryGetValue(sender, out var value))
		{
			return;
		}
		if ((Object)(object)Chat.instance != (Object)null && value.WorldTextInstance != null)
		{
			if ((Object)(object)value.WorldTextInstance.m_gui != (Object)null)
			{
				Object.Destroy((Object)(object)value.WorldTextInstance.m_gui);
			}
			GetWorldTexts(Chat.instance)?.Remove(value.WorldTextInstance);
			value.WorldTextInstance = null;
		}
		if ((Object)(object)value.BeamInstance != (Object)null)
		{
			Object.Destroy((Object)(object)((Component)value.BeamInstance).gameObject);
			value.BeamInstance = null;
		}
	}

	public static void ClearAllBeacons()
	{
		ClearBeacon();
		foreach (long item in peerBeacons.Keys.ToList())
		{
			ClearPeerBeacon(item);
		}
		peerBeacons.Clear();
	}

	public static void BroadcastLocalBeacon()
	{
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		if (ZRoutedRpc.instance != null && activeBeaconPosition.HasValue)
		{
			string text = (((Object)(object)Player.m_localPlayer != (Object)null) ? Player.m_localPlayer.GetPlayerName() : "Player");
			string text2 = activeBeaconName + "|" + text;
			ZRoutedRpc.instance.InvokeRoutedRPC(0L, "BifrostBeacon_SetBeacon", new object[3] { activeBeaconPosition.Value, text2, configAudioPitch.Value });
		}
	}

	public static void RPC_SetBeacon(long sender, Vector3 position, string nameAndPlayer, float audioPitch)
	{
		//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0109: Unknown result type (might be due to invalid IL or missing references)
		//IL_010e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0128: 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)
		if ((Object)(object)ZNet.instance != (Object)null && sender == ZNet.GetUID())
		{
			return;
		}
		string text = "Beacon";
		string text2 = "Player";
		if (!string.IsNullOrEmpty(nameAndPlayer))
		{
			int num = nameAndPlayer.IndexOf('|');
			if (num >= 0)
			{
				text = nameAndPlayer.Substring(0, num);
				text2 = nameAndPlayer.Substring(num + 1);
			}
			else
			{
				text = nameAndPlayer;
			}
		}
		Debug.Log((object)string.Concat("[BifrostBeacon] Received SetBeacon RPC from peer: ", sender, " name: ", text, " pos: ", position, " pitch: ", audioPitch, " player: ", text2));
		if (!peerBeacons.TryGetValue(sender, out var value))
		{
			value = new PeerBeaconInfo();
			peerBeacons[sender] = value;
		}
		else if (value.Position != position)
		{
			ClearPeerBeacon(sender);
		}
		value.Position = position;
		value.Name = (string.IsNullOrEmpty(text) ? "Beacon" : text);
		value.AudioPitch = audioPitch;
		value.PlayerName = text2;
	}

	public static void RPC_ClearBeacon(long sender)
	{
		if (!((Object)(object)ZNet.instance != (Object)null) || sender != ZNet.GetUID())
		{
			Debug.Log((object)("[BifrostBeacon] Received ClearBeacon RPC from peer: " + sender));
			ClearPeerBeacon(sender);
			peerBeacons.Remove(sender);
		}
	}

	public static void AddInworldTextForPeer(Chat chat, long talkerID, Vector3 position, string text)
	{
		//IL_0064: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)chat == (Object)null)
		{
			return;
		}
		try
		{
			MethodInfo method = typeof(Chat).GetMethod("AddInworldText", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (method != null)
			{
				object obj = null;
				try
				{
					obj = UserInfo.GetLocalUser();
				}
				catch (Exception)
				{
				}
				method.Invoke(chat, new object[6]
				{
					null,
					talkerID,
					position,
					(object)(Type)3,
					obj,
					text
				});
			}
		}
		catch (Exception ex2)
		{
			Debug.LogWarning((object)("[BifrostBeacon] Failed to invoke Chat.AddInworldText for peer: " + ex2.Message));
		}
	}

	public static List<Player> GetAllPlayers()
	{
		try
		{
			MethodInfo method = typeof(Player).GetMethod("GetAllPlayers", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
			if (method != null && method.Invoke(null, null) is List<Player> result)
			{
				return result;
			}
			FieldInfo field = typeof(Player).GetField("m_players", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
			if (field != null && field.GetValue(null) is List<Player> result2)
			{
				return result2;
			}
		}
		catch (Exception ex)
		{
			Debug.LogWarning((object)("[BifrostBeacon] Failed to get player list: " + ex.Message));
		}
		return new List<Player>();
	}

	public static long GetZDOOwner(object zdo)
	{
		if (zdo == null)
		{
			return 0L;
		}
		try
		{
			MethodInfo method = zdo.GetType().GetMethod("GetOwner", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (method != null)
			{
				return (long)method.Invoke(zdo, null);
			}
			FieldInfo field = zdo.GetType().GetField("m_owner", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (field != null)
			{
				return (long)field.GetValue(zdo);
			}
		}
		catch (Exception)
		{
		}
		return 0L;
	}

	public static Player FindPlayerByPeerID(long peerID)
	{
		List<Player> allPlayers = GetAllPlayers();
		foreach (Player item in allPlayers)
		{
			if ((Object)(object)item == (Object)null)
			{
				continue;
			}
			ZNetView component = ((Component)item).GetComponent<ZNetView>();
			if ((Object)(object)component != (Object)null)
			{
				ZDO zDO = component.GetZDO();
				if (zDO != null && GetZDOOwner(zDO) == peerID)
				{
					return item;
				}
			}
		}
		return null;
	}

	public static long GetZDOIDUserID(ZDOID zdoid)
	{
		//IL_002b: 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_00d1: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			PropertyInfo property = typeof(ZDOID).GetProperty("UserID", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (property != null)
			{
				return (long)property.GetValue(zdoid, null);
			}
			MethodInfo method = typeof(ZDOID).GetMethod("GetUserID", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (method != null)
			{
				return (long)method.Invoke(zdoid, null);
			}
			FieldInfo field = typeof(ZDOID).GetField("m_userID", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (field == null)
			{
				field = typeof(ZDOID).GetField("userID", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			}
			if (field != null)
			{
				return (long)field.GetValue(zdoid);
			}
		}
		catch (Exception)
		{
		}
		return 0L;
	}

	public static string FindPlayerNameByPeerID(long peerID)
	{
		//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)ZNet.instance != (Object)null)
		{
			try
			{
				MethodInfo method = typeof(ZNet).GetMethod("GetPlayerList", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (method != null)
				{
					IList list = (IList)method.Invoke(ZNet.instance, null);
					if (list != null)
					{
						foreach (object item in list)
						{
							if (item != null)
							{
								Type type = item.GetType();
								FieldInfo field = type.GetField("m_characterID", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
								FieldInfo field2 = type.GetField("m_name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
								if (field != null && field2 != null && field.GetValue(item) is ZDOID zdoid && GetZDOIDUserID(zdoid) == peerID)
								{
									return (string)field2.GetValue(item);
								}
							}
						}
					}
				}
			}
			catch (Exception ex)
			{
				Debug.LogWarning((object)("[BifrostBeacon] Failed in FindPlayerNameByPeerID: " + ex.Message));
			}
		}
		return null;
	}

	public static bool MyGetKey(KeyCode key)
	{
		//IL_0001: 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_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Invalid comparison between Unknown and I4
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Invalid comparison between Unknown and I4
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: Invalid comparison between Unknown and I4
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Invalid comparison between Unknown and I4
		//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c3: Invalid comparison between Unknown and I4
		//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e0: Invalid comparison between Unknown and I4
		//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0100: Invalid comparison between Unknown and I4
		//IL_011a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Invalid comparison between Unknown and I4
		//IL_013a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0140: Invalid comparison between Unknown and I4
		//IL_0157: Unknown result type (might be due to invalid IL or missing references)
		//IL_015d: Invalid comparison between Unknown and I4
		//IL_0174: Unknown result type (might be due to invalid IL or missing references)
		//IL_017a: Invalid comparison between Unknown and I4
		//IL_0191: Unknown result type (might be due to invalid IL or missing references)
		//IL_0197: Invalid comparison between Unknown and I4
		if (Input.GetKey(key))
		{
			return true;
		}
		if (ZInput.GetKey(key, true))
		{
			return true;
		}
		try
		{
			Keyboard current = Keyboard.current;
			if (current != null)
			{
				if ((int)key == 280)
				{
					return ((ButtonControl)current.pageUpKey).isPressed;
				}
				if ((int)key == 281)
				{
					return ((ButtonControl)current.pageDownKey).isPressed;
				}
				if ((int)key == 273)
				{
					return ((ButtonControl)current.upArrowKey).isPressed;
				}
				if ((int)key == 274)
				{
					return ((ButtonControl)current.downArrowKey).isPressed;
				}
				if ((int)key == 278)
				{
					return ((ButtonControl)current.homeKey).isPressed;
				}
				if ((int)key == 27)
				{
					return ((ButtonControl)current.escapeKey).isPressed;
				}
				if ((int)key == 304)
				{
					return ((ButtonControl)current.leftShiftKey).isPressed;
				}
				if ((int)key == 303)
				{
					return ((ButtonControl)current.rightShiftKey).isPressed;
				}
				if ((int)key == 306)
				{
					return ((ButtonControl)current.leftCtrlKey).isPressed;
				}
				if ((int)key == 305)
				{
					return ((ButtonControl)current.rightCtrlKey).isPressed;
				}
				if ((int)key == 308)
				{
					return ((ButtonControl)current.leftAltKey).isPressed;
				}
				if ((int)key == 307)
				{
					return ((ButtonControl)current.rightAltKey).isPressed;
				}
			}
		}
		catch (Exception)
		{
		}
		return false;
	}

	public static Vector3 GetMouseOrPointerPosition()
	{
		//IL_0085: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_008e: 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_006a: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			PropertyInfo property = typeof(ZInput).GetProperty("pointerPosition", BindingFlags.Static | BindingFlags.Public);
			if (property != null)
			{
				return (Vector3)property.GetValue(null, null);
			}
			FieldInfo field = typeof(ZInput).GetField("mousePosition", BindingFlags.Static | BindingFlags.Public);
			if (field != null)
			{
				return (Vector3)field.GetValue(null);
			}
		}
		catch (Exception)
		{
		}
		try
		{
			return Input.mousePosition;
		}
		catch (Exception)
		{
		}
		return Vector3.zero;
	}

	public static void ShowCenterMessage(string text)
	{
		if ((Object)(object)MessageHud.instance == (Object)null)
		{
			return;
		}
		try
		{
			MethodInfo method = typeof(MessageHud).GetMethod("ShowMessage", BindingFlags.Instance | BindingFlags.Public);
			if (method != null)
			{
				ParameterInfo[] parameters = method.GetParameters();
				object[] array = new object[parameters.Length];
				array[0] = (object)(MessageType)2;
				array[1] = text;
				for (int i = 2; i < parameters.Length; i++)
				{
					array[i] = ((parameters[i].DefaultValue != DBNull.Value) ? parameters[i].DefaultValue : null);
				}
				method.Invoke(MessageHud.instance, array);
			}
		}
		catch (Exception ex)
		{
			Debug.LogWarning((object)("[BifrostBeacon] Failed to display HUD message: " + ex.Message));
		}
	}

	public static Vector3 ScreenToWorldPoint(Minimap minimap, Vector3 mousePos)
	{
		//IL_000f: 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_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_004b: 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_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)minimap == (Object)null)
		{
			return Vector3.zero;
		}
		try
		{
			MethodInfo method = typeof(Minimap).GetMethod("ScreenToWorldPoint", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (method != null)
			{
				return (Vector3)method.Invoke(minimap, new object[1] { mousePos });
			}
		}
		catch (Exception ex)
		{
			Debug.LogWarning((object)("[BifrostBeacon] Failed ScreenToWorldPoint: " + ex.Message));
		}
		return Vector3.zero;
	}

	public static PinData GetClosestPin(Minimap minimap, Vector3 pos, float radius)
	{
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)minimap == (Object)null)
		{
			return null;
		}
		try
		{
			List<PinData> minimapPins = GetMinimapPins(minimap);
			if (minimapPins == null)
			{
				return null;
			}
			PinData result = null;
			float num = radius;
			foreach (PinData item in minimapPins)
			{
				if (item != null)
				{
					float num2 = Utils.DistanceXZ(pos, item.m_pos);
					if (num2 < num)
					{
						num = num2;
						result = item;
					}
				}
			}
			return result;
		}
		catch (Exception ex)
		{
			Debug.LogWarning((object)("[BifrostBeacon] Failed GetClosestPin: " + ex.Message));
		}
		return null;
	}

	public static void AddInworldText(Chat chat, Vector3 position, string text)
	{
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)chat == (Object)null)
		{
			return;
		}
		try
		{
			MethodInfo method = typeof(Chat).GetMethod("AddInworldText", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (method != null)
			{
				object obj = null;
				try
				{
					obj = UserInfo.GetLocalUser();
				}
				catch (Exception)
				{
				}
				method.Invoke(chat, new object[6]
				{
					null,
					BeaconTalkerID,
					position,
					(object)(Type)3,
					obj,
					text
				});
			}
		}
		catch (Exception ex2)
		{
			Debug.LogWarning((object)("[BifrostBeacon] Failed to invoke Chat.AddInworldText: " + ex2.Message));
		}
	}

	public static WorldTextInstance FindExistingWorldText(Chat chat, long talkerID)
	{
		//IL_0055: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Expected O, but got Unknown
		if ((Object)(object)chat == (Object)null)
		{
			return null;
		}
		try
		{
			MethodInfo method = typeof(Chat).GetMethod("FindExistingWorldText", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (method != null)
			{
				return (WorldTextInstance)method.Invoke(chat, new object[1] { talkerID });
			}
		}
		catch (Exception ex)
		{
			Debug.LogWarning((object)("[BifrostBeacon] Failed FindExistingWorldText: " + ex.Message));
		}
		return null;
	}

	public static List<WorldTextInstance> GetWorldTexts(Chat chat)
	{
		if ((Object)(object)chat == (Object)null)
		{
			return null;
		}
		try
		{
			PropertyInfo property = typeof(Chat).GetProperty("WorldTexts", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (property != null)
			{
				return (List<WorldTextInstance>)property.GetValue(chat, null);
			}
			FieldInfo field = typeof(Chat).GetField("m_worldTexts", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (field != null)
			{
				return (List<WorldTextInstance>)field.GetValue(chat);
			}
		}
		catch (Exception ex)
		{
			Debug.LogWarning((object)("[BifrostBeacon] Failed GetWorldTexts: " + ex.Message));
		}
		return null;
	}

	public static List<PinData> GetMinimapPins(Minimap minimap)
	{
		if ((Object)(object)minimap == (Object)null)
		{
			return null;
		}
		try
		{
			FieldInfo field = typeof(Minimap).GetField("m_pins", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (field != null)
			{
				return (List<PinData>)field.GetValue(minimap);
			}
		}
		catch (Exception ex)
		{
			Debug.LogWarning((object)("[BifrostBeacon] Failed GetMinimapPins: " + ex.Message));
		}
		return null;
	}

	public static float GetLargeZoom(Minimap minimap)
	{
		if ((Object)(object)minimap == (Object)null)
		{
			return 1f;
		}
		try
		{
			FieldInfo field = typeof(Minimap).GetField("m_largeZoom", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (field != null)
			{
				return (float)field.GetValue(minimap);
			}
		}
		catch (Exception)
		{
		}
		return 1f;
	}

	public static float GetRemoveRadius(Minimap minimap)
	{
		if ((Object)(object)minimap == (Object)null)
		{
			return 10f;
		}
		try
		{
			FieldInfo field = typeof(Minimap).GetField("m_removeRadius", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (field != null)
			{
				return (float)field.GetValue(minimap);
			}
		}
		catch (Exception)
		{
		}
		return 10f;
	}
}
[HarmonyPatch(typeof(Minimap), "OnMapMiddleClick", new Type[] { typeof(UIInputHandler) })]
public static class Minimap_OnMapMiddleClick_Patch
{
	public static bool Prefix(Minimap __instance, UIInputHandler handler)
	{
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_0098: 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_009e: 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_00c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_010b: Unknown result type (might be due to invalid IL or missing references)
		//IL_014e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0177: Unknown result type (might be due to invalid IL or missing references)
		//IL_017e: 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)
		try
		{
			if ((Object)(object)Player.m_localPlayer == (Object)null)
			{
				return true;
			}
			if (!BifrostBeaconPlugin.configModEnabled.Value)
			{
				return true;
			}
			KeyCode value = BifrostBeaconPlugin.configModifierKey.Value;
			bool flag = BifrostBeaconPlugin.MyGetKey(value);
			Debug.Log((object)string.Concat("[BifrostBeacon] OnMapMiddleClick Prefix. ModifierKey: ", value, ", Pressed: ", flag));
			if (flag)
			{
				Vector3 mouseOrPointerPosition = BifrostBeaconPlugin.GetMouseOrPointerPosition();
				Vector3 val = BifrostBeaconPlugin.ScreenToWorldPoint(__instance, mouseOrPointerPosition);
				Debug.Log((object)string.Concat("[BifrostBeacon] MousePos: ", mouseOrPointerPosition, ", Click WorldPoint: ", val));
				float largeZoom = BifrostBeaconPlugin.GetLargeZoom(__instance);
				float removeRadius = BifrostBeaconPlugin.GetRemoveRadius(__instance);
				float num = removeRadius * largeZoom * 2f;
				num = Mathf.Clamp(num, 5f, 100f);
				PinData closestPin = BifrostBeaconPlugin.GetClosestPin(__instance, val, num);
				if (closestPin != null)
				{
					Debug.Log((object)("[BifrostBeacon] Found closest pin: " + closestPin.m_name + " at position: " + closestPin.m_pos));
					if (BifrostBeaconPlugin.activeBeaconPosition.HasValue && Utils.DistanceXZ(BifrostBeaconPlugin.activeBeaconPosition.Value, closestPin.m_pos) < 1f)
					{
						BifrostBeaconPlugin.ClearBeacon();
						BifrostBeaconPlugin.ShowCenterMessage("Waypoint cleared");
					}
					else
					{
						BifrostBeaconPlugin.SetBeacon(closestPin.m_pos, closestPin.m_name);
						BifrostBeaconPlugin.ShowCenterMessage("Waypoint set: " + (string.IsNullOrEmpty(closestPin.m_name) ? "Pin" : closestPin.m_name));
					}
				}
				else
				{
					Debug.Log((object)("[BifrostBeacon] No pin found within zoom-scaled radius of " + num + "m."));
					if (BifrostBeaconPlugin.activeBeaconPosition.HasValue)
					{
						BifrostBeaconPlugin.ClearBeacon();
						BifrostBeaconPlugin.ShowCenterMessage("Waypoint cleared");
					}
				}
				return false;
			}
		}
		catch (Exception ex)
		{
			Debug.LogWarning((object)("[BifrostBeacon] Exception in OnMapMiddleClick Prefix, falling back to default ping: " + ex));
			return true;
		}
		return true;
	}
}
[HarmonyPatch(typeof(Chat), "UpdateWorldTexts", new Type[] { typeof(float) })]
public static class Chat_UpdateWorldTexts_Patch
{
	public static void Postfix(Chat __instance, float dt)
	{
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0105: Unknown result type (might be due to invalid IL or missing references)
		//IL_010b: Expected O, but got Unknown
		//IL_011b: Unknown result type (might be due to invalid IL or missing references)
		//IL_011c: 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_0127: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0428: Unknown result type (might be due to invalid IL or missing references)
		//IL_0169: Unknown result type (might be due to invalid IL or missing references)
		//IL_0640: Unknown result type (might be due to invalid IL or missing references)
		//IL_0646: Expected O, but got Unknown
		//IL_065a: Unknown result type (might be due to invalid IL or missing references)
		//IL_065b: Unknown result type (might be due to invalid IL or missing references)
		//IL_065c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0666: Unknown result type (might be due to invalid IL or missing references)
		//IL_066b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0487: Unknown result type (might be due to invalid IL or missing references)
		//IL_0488: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_06e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_06e6: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			if ((Object)(object)Player.m_localPlayer == (Object)null)
			{
				return;
			}
			if (!BifrostBeaconPlugin.configModEnabled.Value)
			{
				if (BifrostBeaconPlugin.activeBeaconPosition.HasValue || BifrostBeaconPlugin.peerBeacons.Count > 0)
				{
					BifrostBeaconPlugin.ClearAllBeacons();
				}
				return;
			}
			Vector3 position = ((Component)Player.m_localPlayer).transform.position;
			if (BifrostBeaconPlugin.activeBeaconPosition.HasValue)
			{
				Vector3 value = BifrostBeaconPlugin.activeBeaconPosition.Value;
				float num = Utils.DistanceXZ(position, value);
				if (num < 5f && !((Character)Player.m_localPlayer).IsTeleporting() && !((Character)Player.m_localPlayer).IsDead())
				{
					BifrostBeaconPlugin.ClearBeacon();
					BifrostBeaconPlugin.ShowCenterMessage("Waypoint reached");
				}
				else
				{
					if (BifrostBeaconPlugin.configShowVisualBeam.Value && (Object)(object)BifrostBeaconPlugin.beamInstance == (Object)null)
					{
						GameObject val = new GameObject("BifrostBeaconBeam");
						BifrostBeaconPlugin.beamInstance = val.AddComponent<BifrostBeam>();
						BifrostBeaconPlugin.beamInstance.SetPositions(value, value + Vector3.up * 1000f);
						Debug.Log((object)"[BifrostBeacon] Recreated visual beam.");
					}
					if (BifrostBeaconPlugin.activeBeaconWorldText == null || (Object)(object)BifrostBeaconPlugin.activeBeaconWorldText.m_gui == (Object)null)
					{
						BifrostBeaconPlugin.AddInworldText(__instance, value, "PING");
						BifrostBeaconPlugin.activeBeaconWorldText = BifrostBeaconPlugin.FindExistingWorldText(__instance, BifrostBeaconPlugin.BeaconTalkerID);
						Debug.Log((object)"[BifrostBeacon] Spawned new 3D world text tracker.");
					}
					if (BifrostBeaconPlugin.activeBeaconWorldText != null)
					{
						BifrostBeaconPlugin.activeBeaconWorldText.m_timer = 0f;
						BifrostBeaconPlugin.activeBeaconWorldText.m_position = value;
						string text = (((Object)(object)Player.m_localPlayer != (Object)null) ? Player.m_localPlayer.GetPlayerName() : "");
						string text2 = BifrostBeaconPlugin.activeBeaconName;
						if (!string.IsNullOrEmpty(text))
						{
							text2 = text2 + " (" + text + ")";
						}
						if (BifrostBeaconPlugin.configShowHudMessage.Value)
						{
							float num2 = value.y - position.y;
							string text3 = ((num2 > 0f) ? ("+" + num2.ToString("F0") + "m") : (num2.ToString("F0") + "m"));
							string text4 = text2;
							text2 = text4 + "\n" + num.ToString("F0") + "m, " + text3;
						}
						BifrostBeaconPlugin.activeBeaconWorldText.m_text = text2;
						if ((Object)(object)BifrostBeaconPlugin.activeBeaconWorldText.m_textMeshField != (Object)null)
						{
							((TMP_Text)BifrostBeaconPlugin.activeBeaconWorldText.m_textMeshField).text = text2;
						}
					}
					if (BifrostBeaconPlugin.configPlayAudioBeeps.Value && num <= BifrostBeaconPlugin.configAudioRange.Value)
					{
						BifrostBeaconPlugin.audioTimer += dt;
						float num3 = Mathf.Clamp01(num / BifrostBeaconPlugin.configAudioRange.Value);
						float num4 = Mathf.Lerp(0.5f, 4f, num3);
						if (BifrostBeaconPlugin.audioTimer >= num4)
						{
							BifrostBeaconPlugin.audioTimer = 0f;
							PlayProximityBeep(num3, ((Component)Player.m_localPlayer).transform, BifrostBeaconPlugin.configAudioPitch.Value);
						}
					}
				}
			}
			foreach (KeyValuePair<long, BifrostBeaconPlugin.PeerBeaconInfo> peerBeacon in BifrostBeaconPlugin.peerBeacons)
			{
				long key = peerBeacon.Key;
				BifrostBeaconPlugin.PeerBeaconInfo value2 = peerBeacon.Value;
				Vector3 value = value2.Position;
				float num5 = Utils.DistanceXZ(position, value);
				Player val2 = BifrostBeaconPlugin.FindPlayerByPeerID(key);
				string text5 = (string.IsNullOrEmpty(value2.PlayerName) ? "Player" : value2.PlayerName);
				if (BifrostBeaconPlugin.configShowPeerHudMessage.Value)
				{
					if (value2.WorldTextInstance == null || (Object)(object)value2.WorldTextInstance.m_gui == (Object)null)
					{
						BifrostBeaconPlugin.AddInworldTextForPeer(__instance, key, value, "PING");
						value2.WorldTextInstance = BifrostBeaconPlugin.FindExistingWorldText(__instance, key);
						Debug.Log((object)("[BifrostBeacon] Spawned new 3D world text tracker for peer " + key));
					}
					if (value2.WorldTextInstance != null)
					{
						value2.WorldTextInstance.m_timer = 0f;
						value2.WorldTextInstance.m_position = value;
						string text2 = value2.Name + " (" + text5 + ")";
						if (BifrostBeaconPlugin.configShowHudMessage.Value)
						{
							float num2 = value.y - position.y;
							string text3 = ((num2 > 0f) ? ("+" + num2.ToString("F0") + "m") : (num2.ToString("F0") + "m"));
							string text4 = text2;
							text2 = text4 + "\n" + num5.ToString("F0") + "m, " + text3;
						}
						value2.WorldTextInstance.m_text = text2;
						if ((Object)(object)value2.WorldTextInstance.m_textMeshField != (Object)null)
						{
							((TMP_Text)value2.WorldTextInstance.m_textMeshField).text = text2;
						}
					}
				}
				else if (value2.WorldTextInstance != null)
				{
					if ((Object)(object)value2.WorldTextInstance.m_gui != (Object)null)
					{
						Object.Destroy((Object)(object)value2.WorldTextInstance.m_gui);
					}
					BifrostBeaconPlugin.GetWorldTexts(__instance)?.Remove(value2.WorldTextInstance);
					value2.WorldTextInstance = null;
				}
				if (BifrostBeaconPlugin.configShowPeerVisualBeam.Value)
				{
					if ((Object)(object)value2.BeamInstance == (Object)null)
					{
						GameObject val = new GameObject("BifrostBeaconBeam_Peer_" + key);
						value2.BeamInstance = val.AddComponent<BifrostBeam>();
						value2.BeamInstance.SetPositions(value, value + Vector3.up * 1000f);
						Debug.Log((object)("[BifrostBeacon] Recreated visual beam for peer " + key));
					}
				}
				else if ((Object)(object)value2.BeamInstance != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)value2.BeamInstance).gameObject);
					value2.BeamInstance = null;
				}
				if (!((Object)(object)val2 != (Object)null))
				{
					continue;
				}
				float num6 = Utils.DistanceXZ(((Component)val2).transform.position, value);
				if (num6 <= BifrostBeaconPlugin.configAudioRange.Value)
				{
					value2.AudioTimer += dt;
					float num3 = Mathf.Clamp01(num6 / BifrostBeaconPlugin.configAudioRange.Value);
					float num4 = Mathf.Lerp(0.5f, 4f, num3);
					if (value2.AudioTimer >= num4)
					{
						value2.AudioTimer = 0f;
						PlayProximityBeep(num3, ((Component)val2).transform, value2.AudioPitch);
					}
				}
			}
			BifrostBeaconPlugin.broadcastTimer += dt;
			if (BifrostBeaconPlugin.broadcastTimer >= 10f)
			{
				BifrostBeaconPlugin.broadcastTimer = 0f;
				BifrostBeaconPlugin.BroadcastLocalBeacon();
			}
		}
		catch (Exception ex)
		{
			Debug.LogWarning((object)("[BifrostBeacon] Exception in Chat_UpdateWorldTexts_Patch: " + ex));
		}
	}

	public static void PlayProximityBeep(float pct, Transform targetTransform, float pitch)
	{
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: 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_01c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ca: Expected O, but got Unknown
		if ((Object)(object)ObjectDB.instance == (Object)null || (Object)(object)targetTransform == (Object)null)
		{
			return;
		}
		SE_Finder val = ObjectDB.instance.m_StatusEffects.OfType<SE_Finder>().FirstOrDefault();
		if (!((Object)(object)val != (Object)null))
		{
			return;
		}
		EffectList val2 = ((pct < 0.2f) ? val.m_pingEffectNear : ((pct < 0.6f) ? val.m_pingEffectMed : val.m_pingEffectFar));
		if (val2 == null)
		{
			return;
		}
		GameObject[] array = val2.Create(targetTransform.position, targetTransform.rotation, targetTransform, 1f, -1, default(ZDOID));
		if (array == null)
		{
			return;
		}
		GameObject[] array2 = array;
		foreach (GameObject val3 in array2)
		{
			if ((Object)(object)val3 == (Object)null)
			{
				continue;
			}
			MonoBehaviour[] componentsInChildren = val3.GetComponentsInChildren<MonoBehaviour>();
			foreach (MonoBehaviour val4 in componentsInChildren)
			{
				if ((Object)(object)val4 == (Object)null || ((object)val4).GetType().Name != "ZSFX")
				{
					continue;
				}
				try
				{
					Type type = ((object)val4).GetType();
					FieldInfo field = type.GetField("m_minPitch", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					FieldInfo field2 = type.GetField("m_maxPitch", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					if (field != null)
					{
						field.SetValue(val4, pitch);
					}
					if (field2 != null)
					{
						field2.SetValue(val4, pitch);
					}
					FieldInfo field3 = type.GetField("m_audioSource", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					if (field3 != null)
					{
						AudioSource val5 = (AudioSource)field3.GetValue(val4);
						if ((Object)(object)val5 != (Object)null)
						{
							val5.pitch = pitch;
						}
					}
				}
				catch (Exception)
				{
				}
			}
			AudioSource[] componentsInChildren2 = val3.GetComponentsInChildren<AudioSource>();
			foreach (AudioSource val5 in componentsInChildren2)
			{
				if (!((Object)(object)val5 == (Object)null))
				{
					val5.pitch = pitch;
				}
			}
		}
	}
}
[HarmonyPatch(typeof(Game), "Start")]
public static class Game_Start_Patch
{
	public static void Prefix()
	{
		if (ZRoutedRpc.instance != null)
		{
			ZRoutedRpc.instance.Register<Vector3, string, float>("BifrostBeacon_SetBeacon", (Action<long, Vector3, string, float>)BifrostBeaconPlugin.RPC_SetBeacon);
			ZRoutedRpc.instance.Register("BifrostBeacon_ClearBeacon", (Action<long>)BifrostBeaconPlugin.RPC_ClearBeacon);
			Debug.Log((object)"[BifrostBeacon] Registered network RPCs successfully.");
		}
	}
}
[HarmonyPatch(typeof(ZNet), "Disconnect")]
public static class ZNet_Disconnect_Patch
{
	public static void Prefix(ZNetPeer peer)
	{
		if (peer != null)
		{
			long uid = peer.m_uid;
			BifrostBeaconPlugin.ClearPeerBeacon(uid);
			BifrostBeaconPlugin.peerBeacons.Remove(uid);
		}
	}
}
[HarmonyPatch(typeof(ZNet), "OnDestroy")]
public static class ZNet_OnDestroy_Patch
{
	public static void Postfix()
	{
		BifrostBeaconPlugin.ClearAllBeacons();
	}
}
public class BifrostBeam : MonoBehaviour
{
	private LineRenderer lineRenderer;

	private float hueOffset = 0f;

	private void Awake()
	{
		//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ab: Expected O, but got Unknown
		lineRenderer = ((Component)this).gameObject.AddComponent<LineRenderer>();
		lineRenderer.useWorldSpace = true;
		lineRenderer.positionCount = 2;
		lineRenderer.startWidth = 1.5f;
		lineRenderer.endWidth = 1.5f;
		Shader val = Shader.Find("Sprites/Default");
		if ((Object)(object)val == (Object)null)
		{
			val = Shader.Find("Particles/Standard Unlit");
		}
		if ((Object)(object)val == (Object)null)
		{
			val = Shader.Find("Standard");
		}
		if ((Object)(object)val != (Object)null)
		{
			((Renderer)lineRenderer).material = new Material(val);
		}
		else
		{
			Debug.LogWarning((object)"[BifrostBeacon] Failed to find a suitable shader for the beam LineRenderer!");
		}
	}

	public void SetPositions(Vector3 start, Vector3 end)
	{
		//IL_001c: 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)
		if ((Object)(object)lineRenderer != (Object)null)
		{
			lineRenderer.SetPosition(0, start);
			lineRenderer.SetPosition(1, end);
		}
	}

	private void Update()
	{
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Expected O, but got Unknown
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)lineRenderer == (Object)null))
		{
			hueOffset += Time.deltaTime * 0.15f;
			if (hueOffset > 1f)
			{
				hueOffset -= 1f;
			}
			Gradient val = new Gradient();
			GradientColorKey[] array = (GradientColorKey[])(object)new GradientColorKey[5];
			for (int i = 0; i < array.Length; i++)
			{
				float num = (float)i / (float)(array.Length - 1);
				float num2 = (num + hueOffset) % 1f;
				ref GradientColorKey reference = ref array[i];
				reference = new GradientColorKey(Color.HSVToRGB(num2, 0.9f, 1f), num);
			}
			val.SetKeys(array, (GradientAlphaKey[])(object)new GradientAlphaKey[2]
			{
				new GradientAlphaKey(0.7f, 0f),
				new GradientAlphaKey(0f, 1f)
			});
			lineRenderer.colorGradient = val;
		}
	}

	private void OnDestroy()
	{
		if ((Object)(object)lineRenderer != (Object)null && (Object)(object)((Renderer)lineRenderer).material != (Object)null)
		{
			Object.Destroy((Object)(object)((Renderer)lineRenderer).material);
		}
	}
}