Decompiled source of LicensePlate v1.3.0

LicensePlate.dll

Decompiled 10 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using ComfyLib;
using HarmonyLib;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("LicensePlate")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("LicensePlate")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("89477657-8729-4e5e-995e-4d58fa20b25b")]
[assembly: AssemblyFileVersion("1.3.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.3.0.0")]
[module: UnverifiableCode]
namespace ComfyLib
{
	public static class ConfigFileExtensions
	{
		internal sealed class ConfigurationManagerAttributes
		{
			public Action<ConfigEntryBase> CustomDrawer;

			public bool? Browsable;

			public bool? HideDefaultButton;

			public int? Order;
		}

		private static readonly Dictionary<string, int> _sectionToSettingOrder = new Dictionary<string, int>();

		private static int GetSettingOrder(string section)
		{
			if (!_sectionToSettingOrder.TryGetValue(section, out var value))
			{
				value = 0;
			}
			_sectionToSettingOrder[section] = value - 1;
			return value;
		}

		public static ConfigEntry<T> BindInOrder<T>(this ConfigFile config, string section, string key, T defaultValue, string description, AcceptableValueBase acceptableValues)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			return config.Bind<T>(section, key, defaultValue, new ConfigDescription(description, acceptableValues, new object[1]
			{
				new ConfigurationManagerAttributes
				{
					Order = GetSettingOrder(section)
				}
			}));
		}

		public static ConfigEntry<T> BindInOrder<T>(this ConfigFile config, string section, string key, T defaultValue, string description, Action<ConfigEntryBase> customDrawer = null, bool browsable = true, bool hideDefaultButton = false, bool hideSettingName = false)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Expected O, but got Unknown
			return config.Bind<T>(section, key, defaultValue, new ConfigDescription(description, (AcceptableValueBase)null, new object[1]
			{
				new ConfigurationManagerAttributes
				{
					Browsable = browsable,
					CustomDrawer = customDrawer,
					HideDefaultButton = hideDefaultButton,
					Order = GetSettingOrder(section)
				}
			}));
		}

		public static void OnSettingChanged<T>(this ConfigEntry<T> configEntry, Action settingChangedHandler)
		{
			configEntry.SettingChanged += delegate
			{
				settingChangedHandler();
			};
		}

		public static void OnSettingChanged<T>(this ConfigEntry<T> configEntry, Action<T> settingChangedHandler)
		{
			configEntry.SettingChanged += delegate(object _, EventArgs eventArgs)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				settingChangedHandler((T)((SettingChangedEventArgs)eventArgs).ChangedSetting.BoxedValue);
			};
		}

		public static void OnSettingChanged<T>(this ConfigEntry<T> configEntry, Action<ConfigEntry<T>> settingChangedHandler)
		{
			configEntry.SettingChanged += delegate(object _, EventArgs eventArgs)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				settingChangedHandler((ConfigEntry<T>)((SettingChangedEventArgs)eventArgs).ChangedSetting.BoxedValue);
			};
		}
	}
	public static class ObjectExtensions
	{
		public static T Ref<T>(this T o) where T : Object
		{
			if (!Object.op_Implicit((Object)(object)o))
			{
				return default(T);
			}
			return o;
		}
	}
}
namespace LicensePlate
{
	public sealed class ShipName : MonoBehaviour, TextReceiver
	{
		private ZNetView _netView;

		private NpcText _npcText;

		private ShipControlls _shipControlls;

		private Ship _ship;

		private string _shipName = string.Empty;

		private string _shipNameCache = string.Empty;

		private void Awake()
		{
			_shipControlls = ((Component)this).GetComponent<ShipControlls>();
			_ship = _shipControlls.Ref<ShipControlls>()?.m_ship;
			_netView = _shipControlls.Ref<ShipControlls>()?.m_nview;
			if (Object.op_Implicit((Object)(object)_shipControlls) && Object.op_Implicit((Object)(object)_ship) && Object.op_Implicit((Object)(object)_netView) && _netView.IsValid())
			{
				((MonoBehaviour)this).InvokeRepeating("UpdateShipName", 0f, 1f);
			}
		}

		private void UpdateShipName()
		{
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)_netView) || !_netView.IsValid() || !Object.op_Implicit((Object)(object)_ship) || !PluginConfig.IsModEnabled.Value || !PluginConfig.ShowShipNames.Value)
			{
				ClearNpcText();
				((MonoBehaviour)this).CancelInvoke("UpdateShipName");
				return;
			}
			if (!Object.op_Implicit((Object)(object)Player.m_localPlayer))
			{
				ClearNpcText();
				return;
			}
			_shipName = _netView.m_zdo.GetString(LicensePlate.ShipLicensePlateHashCode, string.Empty);
			float num = Vector3.Distance(((Component)Player.m_localPlayer).transform.position, ((Component)this).gameObject.transform.position);
			if (Object.op_Implicit((Object)(object)_npcText?.m_gui) && _shipName.Length > 0 && num > PluginConfig.ShipNameMinimumDistance.Value)
			{
				UpdateNpcTextValue(_shipName);
				return;
			}
			ClearNpcText();
			if (_shipName.Length > 0 && Object.op_Implicit((Object)(object)Player.m_localPlayer) && num > PluginConfig.ShipNameMinimumDistance.Value && num < PluginConfig.ShipNameCutoffDistance.Value)
			{
				SetNpcText(_shipName);
			}
		}

		private void ClearNpcText()
		{
			if (_npcText != null)
			{
				Chat.m_instance.ClearNpcText(_npcText);
				_npcText = null;
			}
		}

		private void SetNpcText(string shipName)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			Chat.m_instance.SetNpcText(((Component)_ship).gameObject, PluginConfig.ShipNameDisplayOffset.Value, PluginConfig.ShipNameCutoffDistance.Value, PluginConfig.ShipNameTimeToLive.Value, string.Empty, GetSanitizedShipName(shipName), false);
			_shipNameCache = shipName;
			_npcText = Chat.m_instance.FindNpcText(((Component)_ship).gameObject);
			if (Object.op_Implicit((Object)(object)_npcText?.m_gui))
			{
				CustomizeNpcText();
			}
		}

		public void UpdateNpcTextValue(string shipName)
		{
			if (!(shipName == _shipNameCache))
			{
				_shipNameCache = shipName;
				((TMP_Text)_npcText.m_textField).text = GetSanitizedShipName(shipName);
			}
		}

		private string GetSanitizedShipName(string shipName)
		{
			if (shipName.Length > 64)
			{
				shipName = shipName.Substring(0, 64);
			}
			if (PluginConfig.ShipNameStripHtmlTags.Value)
			{
				shipName = LicensePlate.HtmlTagsRegex.Replace(shipName, string.Empty);
			}
			return shipName;
		}

		private void CustomizeNpcText()
		{
			((TMP_Text)_npcText.m_textField).enableAutoSizing = false;
			((TMP_Text)_npcText.m_textField).textWrappingMode = (TextWrappingModes)0;
			((TMP_Text)_npcText.m_textField).overflowMode = (TextOverflowModes)0;
			((TMP_Text)_npcText.m_textField).fontSize = PluginConfig.ShipNameFontSize.Value;
			((TMP_Text)_npcText.m_textField).fontSizeMax = 64f;
			CustomizeNpcTextBackground(((Component)_npcText.m_gui.transform.Find("Image")).gameObject);
		}

		private void CustomizeNpcTextBackground(GameObject background)
		{
			//IL_0018: 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_002a: Unknown result type (might be due to invalid IL or missing references)
			background.GetComponent<RectTransform>().SetSizeWithCurrentAnchors((Axis)1, 60f);
			Image component = background.GetComponent<Image>();
			Color color = ((Graphic)component).color;
			color.a = 0.5f;
			((Graphic)component).color = color;
		}

		public string GetText()
		{
			if (!Object.op_Implicit((Object)(object)_netView) || !_netView.IsValid())
			{
				return string.Empty;
			}
			return _netView.m_zdo.GetString(LicensePlate.ShipLicensePlateHashCode, string.Empty);
		}

		public void SetText(string text)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)_netView) && _netView.IsValid() && Object.op_Implicit((Object)(object)Player.m_localPlayer))
			{
				LicensePlate.LogInfo($"Setting Ship ({_netView.m_zdo.m_uid}) name to: {text}");
				_netView.m_zdo.Set(LicensePlate.ShipLicensePlateHashCode, text);
				_netView.m_zdo.Set(LicensePlate.LicensePlateLastSetByHashCode, Player.m_localPlayer.GetPlayerID());
				UpdateShipName();
			}
		}
	}
	public sealed class VagonName : MonoBehaviour, TextReceiver
	{
		private ZNetView _netView;

		private NpcText _npcText;

		private Vagon _vagon;

		private string _vagonName = string.Empty;

		private string _vagonNameCache = string.Empty;

		private void Awake()
		{
			_vagon = ((Component)this).GetComponent<Vagon>();
			_netView = ((Component)this).GetComponent<ZNetView>();
			if (Object.op_Implicit((Object)(object)_vagon) && Object.op_Implicit((Object)(object)_netView) && _netView.IsValid())
			{
				((MonoBehaviour)this).InvokeRepeating("UpdateVagonName", 0f, 1f);
			}
		}

		private void UpdateVagonName()
		{
			//IL_0081: 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_00a1: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)_netView) || !_netView.IsValid() || !PluginConfig.IsModEnabled.Value || !PluginConfig.ShowCartNames.Value)
			{
				ClearNpcText();
				((MonoBehaviour)this).CancelInvoke("UpdateVagonName");
				return;
			}
			if (!Object.op_Implicit((Object)(object)Player.m_localPlayer))
			{
				ClearNpcText();
				return;
			}
			_vagonName = _netView.m_zdo.GetString(LicensePlate.VagonLicensePlateHashCode, string.Empty);
			float num = Vector3.Distance(((Component)Player.m_localPlayer).transform.position + _vagon.m_attachOffset, _vagon.m_attachPoint.position);
			if (Object.op_Implicit((Object)(object)_npcText?.m_gui) && _vagonName.Length > 0 && num > PluginConfig.CartNameMinimumDistance.Value)
			{
				UpdateNpcTextValue(_vagonName);
				return;
			}
			ClearNpcText();
			if (_vagonName.Length > 0 && Object.op_Implicit((Object)(object)Player.m_localPlayer) && num > PluginConfig.CartNameMinimumDistance.Value && num < PluginConfig.CartNameCutoffDistance.Value)
			{
				SetNpcText(_vagonName);
			}
		}

		private void ClearNpcText()
		{
			if (_npcText != null)
			{
				Chat.m_instance.ClearNpcText(_npcText);
				_npcText = null;
			}
			_vagonNameCache = string.Empty;
		}

		private void SetNpcText(string vagonName)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			Chat.m_instance.SetNpcText(((Component)this).gameObject, PluginConfig.CartNameDisplayOffset.Value, PluginConfig.CartNameCutoffDistance.Value, PluginConfig.CartNameTimeToLive.Value, string.Empty, GetSanitizedVagonName(vagonName), false);
			_vagonNameCache = vagonName;
			_npcText = Chat.m_instance.FindNpcText(((Component)this).gameObject);
			if (Object.op_Implicit((Object)(object)_npcText?.m_gui))
			{
				CustomizeNpcText();
			}
		}

		private void UpdateNpcTextValue(string vagonName)
		{
			if (!(vagonName == _vagonNameCache))
			{
				_vagonNameCache = vagonName;
				((TMP_Text)_npcText.m_textField).text = GetSanitizedVagonName(vagonName);
			}
		}

		private string GetSanitizedVagonName(string vagonName)
		{
			if (vagonName.Length > 64)
			{
				vagonName = vagonName.Substring(0, 64);
			}
			if (PluginConfig.CartNameStripHtmlTags.Value)
			{
				vagonName = LicensePlate.HtmlTagsRegex.Replace(vagonName, string.Empty);
			}
			return vagonName;
		}

		private void CustomizeNpcText()
		{
			((TMP_Text)_npcText.m_textField).enableAutoSizing = false;
			((TMP_Text)_npcText.m_textField).textWrappingMode = (TextWrappingModes)0;
			((TMP_Text)_npcText.m_textField).overflowMode = (TextOverflowModes)0;
			((TMP_Text)_npcText.m_textField).fontSize = PluginConfig.CartNameFontSize.Value;
			((TMP_Text)_npcText.m_textField).fontSizeMax = 64f;
			CustomizeNpcTextBackground(((Component)_npcText.m_gui.transform.Find("Image")).gameObject);
		}

		private void CustomizeNpcTextBackground(GameObject background)
		{
			//IL_0018: 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_002a: Unknown result type (might be due to invalid IL or missing references)
			background.GetComponent<RectTransform>().SetSizeWithCurrentAnchors((Axis)1, 60f);
			Image component = background.GetComponent<Image>();
			Color color = ((Graphic)component).color;
			color.a = 0.5f;
			((Graphic)component).color = color;
		}

		public string GetText()
		{
			if (!Object.op_Implicit((Object)(object)_netView) || !_netView.IsValid())
			{
				return string.Empty;
			}
			return _netView.m_zdo.GetString(LicensePlate.VagonLicensePlateHashCode, string.Empty);
		}

		public void SetText(string text)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)_netView) && _netView.IsValid() && Object.op_Implicit((Object)(object)Player.m_localPlayer))
			{
				LicensePlate.LogInfo($"Setting Vagon ({_netView.m_zdo.m_uid}) name to: {text}");
				_netView.m_zdo.Set(LicensePlate.VagonLicensePlateHashCode, text);
				_netView.m_zdo.Set(LicensePlate.LicensePlateLastSetByHashCode, Player.m_localPlayer.GetPlayerID());
				UpdateVagonName();
			}
		}
	}
	[BepInPlugin("redseiko.valheim.licenseplate", "LicensePlate", "1.3.0")]
	public sealed class LicensePlate : BaseUnityPlugin
	{
		public const string PluginGuid = "redseiko.valheim.licenseplate";

		public const string PluginName = "LicensePlate";

		public const string PluginVersion = "1.3.0";

		public static readonly int ShipLicensePlateHashCode = StringExtensionMethods.GetStableHashCode("ShipLicensePlate");

		public static readonly int VagonLicensePlateHashCode = StringExtensionMethods.GetStableHashCode("VagonLicensePlate");

		public static readonly int LicensePlateLastSetByHashCode = StringExtensionMethods.GetStableHashCode("LicensePlateLastSetBy");

		public static readonly Regex HtmlTagsRegex = new Regex("<.*?>");

		private static ManualLogSource _logger;

		private Harmony _harmony;

		private void Awake()
		{
			_logger = ((BaseUnityPlugin)this).Logger;
			PluginConfig.BindConfig(((BaseUnityPlugin)this).Config);
			_harmony = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "redseiko.valheim.licenseplate");
		}

		private void OnDestroy()
		{
			Harmony harmony = _harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}

		public static void LogInfo(object obj)
		{
			_logger.LogInfo((object)$"[{DateTime.Now.ToString(DateTimeFormatInfo.InvariantInfo)}] {obj}");
		}

		public static void LogError(object obj)
		{
			_logger.LogError((object)$"[{DateTime.Now.ToString(DateTimeFormatInfo.InvariantInfo)}] {obj}");
		}
	}
	[HarmonyPatch(typeof(ShipControlls))]
	internal static class ShipControllsPatch
	{
		private static readonly Lazy<string> _renameText = new Lazy<string>(() => Localization.m_instance.Localize("\n[<color=yellow><b>$KEY_AltPlace + $KEY_Use</b></color>] $hud_rename"));

		[HarmonyPostfix]
		[HarmonyPatch("Awake")]
		private static void AwakePostfix(ref ShipControlls __instance)
		{
			if (PluginConfig.IsModEnabled.Value && PluginConfig.ShowShipNames.Value)
			{
				((Component)__instance).gameObject.AddComponent<ShipName>();
			}
		}

		[HarmonyTranspiler]
		[HarmonyPatch("Interact")]
		private static IEnumerable<CodeInstruction> InteractTranspiler(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0002: 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_0022: Expected O, but got Unknown
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Expected O, but got Unknown
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Expected O, but got Unknown
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Expected O, but got Unknown
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Expected O, but got Unknown
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Expected O, but got Unknown
			return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[5]
			{
				new CodeMatch((OpCode?)OpCodes.Ldloc_0, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(Character), "GetStandingOnShip", (Type[])null, (Type[])null), (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(ShipControlls), "m_ship"), (string)null),
				new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(Object), "op_Inequality", (Type[])null, (Type[])null), (string)null)
			}).Advance(5).InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[3]
			{
				new CodeInstruction(OpCodes.Ldarg_0, (object)null),
				new CodeInstruction(OpCodes.Ldarg_3, (object)null),
				Transpilers.EmitDelegate<Func<bool, ShipControlls, bool, bool>>((Func<bool, ShipControlls, bool, bool>)StandingOnShipInequalityDelegate)
			})
				.InstructionEnumeration();
		}

		private static bool StandingOnShipInequalityDelegate(bool isNotEqual, ShipControlls shipControls, bool alt)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			ShipName shipName = default(ShipName);
			if (!isNotEqual && alt && PluginConfig.IsModEnabled.Value && PluginConfig.ShowShipNames.Value && PrivateArea.CheckAccess(((Component)shipControls).transform.position, 0f, true, false) && Object.op_Implicit((Object)(object)shipControls.m_nview) && shipControls.m_nview.IsValid() && shipControls.m_nview.IsOwner() && ((Component)shipControls).TryGetComponent<ShipName>(ref shipName))
			{
				TextInput.m_instance.RequestText((TextReceiver)(object)shipName, "$hud_rename", 64);
				return true;
			}
			return isNotEqual;
		}

		[HarmonyPostfix]
		[HarmonyPatch("GetHoverText")]
		private static void GetHoverTextPostfix(ref ShipControlls __instance, ref string __result)
		{
			if (PluginConfig.IsModEnabled.Value && PluginConfig.ShowShipNames.Value && Object.op_Implicit((Object)(object)__instance.m_nview) && __instance.m_nview.IsValid() && Object.op_Implicit((Object)(object)Player.m_localPlayer) && __instance.InUseDistance((Humanoid)(object)Player.m_localPlayer))
			{
				__result += _renameText.Value;
			}
		}
	}
	[HarmonyPatch(typeof(Vagon))]
	internal static class VagonPatch
	{
		private static readonly Lazy<string> _renameText = new Lazy<string>(() => Localization.m_instance.Localize("\n[<color=yellow><b>$KEY_AltPlace + $KEY_Use</b></color>] $hud_rename"));

		[HarmonyPostfix]
		[HarmonyPatch("Awake")]
		private static void AwakePostfix(ref Vagon __instance)
		{
			if (PluginConfig.IsModEnabled.Value && PluginConfig.ShowCartNames.Value)
			{
				((Component)__instance).gameObject.AddComponent<VagonName>();
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("Interact")]
		private static bool InteractPrefix(ref Vagon __instance, ref bool __result, bool hold, bool alt)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			VagonName vagonName = default(VagonName);
			if (alt && PluginConfig.IsModEnabled.Value && PluginConfig.ShowCartNames.Value && PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, true, false) && Object.op_Implicit((Object)(object)__instance.m_nview) && __instance.m_nview.IsValid() && __instance.m_nview.IsOwner() && ((Component)__instance).TryGetComponent<VagonName>(ref vagonName))
			{
				TextInput.m_instance.RequestText((TextReceiver)(object)vagonName, "$hud_rename", 64);
				__result = true;
				return false;
			}
			return true;
		}

		[HarmonyPostfix]
		[HarmonyPatch("GetHoverText")]
		private static void GetHoverTextPostfix(ref Vagon __instance, ref string __result)
		{
			if (PluginConfig.IsModEnabled.Value && PluginConfig.ShowCartNames.Value && Object.op_Implicit((Object)(object)__instance.m_nview) && __instance.m_nview.IsValid())
			{
				__result += _renameText.Value;
			}
		}
	}
	public static class PluginConfig
	{
		public static ConfigEntry<bool> IsModEnabled { get; private set; }

		public static ConfigEntry<bool> ShowShipNames { get; private set; }

		public static ConfigEntry<float> ShipNameMinimumDistance { get; private set; }

		public static ConfigEntry<float> ShipNameCutoffDistance { get; private set; }

		public static ConfigEntry<Vector3> ShipNameDisplayOffset { get; private set; }

		public static ConfigEntry<float> ShipNameTimeToLive { get; private set; }

		public static ConfigEntry<int> ShipNameFontSize { get; private set; }

		public static ConfigEntry<bool> ShipNameStripHtmlTags { get; private set; }

		public static ConfigEntry<bool> ShowCartNames { get; private set; }

		public static ConfigEntry<float> CartNameMinimumDistance { get; private set; }

		public static ConfigEntry<float> CartNameCutoffDistance { get; private set; }

		public static ConfigEntry<Vector3> CartNameDisplayOffset { get; private set; }

		public static ConfigEntry<float> CartNameTimeToLive { get; private set; }

		public static ConfigEntry<int> CartNameFontSize { get; private set; }

		public static ConfigEntry<bool> CartNameStripHtmlTags { get; private set; }

		public static void BindConfig(ConfigFile config)
		{
			IsModEnabled = config.BindInOrder("_Global", "isModEnabled", defaultValue: true, "Globally enable or disable this mod.");
			BindShipNameConfig(config);
			BindCartNameConfig(config);
		}

		private static void BindShipNameConfig(ConfigFile config)
		{
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			ShowShipNames = config.BindInOrder("ShipName", "showShipNames", defaultValue: true, "Show custom names over ships.");
			ShipNameMinimumDistance = config.BindInOrder("ShipName", "shipNameMinimumDistance", 0f, "Minimum distance for custom ship names to appear/disappear. Must be less than cutoff distance.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 20f));
			ShipNameMinimumDistance.OnSettingChanged<float>(ValidateShipNameMinimumDistance);
			ShipNameCutoffDistance = config.BindInOrder("ShipName", "shipNameCutoffDistance", 25f, "Cutoff distance for custom ship names to appear/disappear.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 40f));
			ShipNameCutoffDistance.OnSettingChanged<float>(ValidateShipNameMinimumDistance);
			ShipNameDisplayOffset = config.BindInOrder<Vector3>("ShipName", "shipNameDisplayOffset", Vector3.up, "Display offset for custom ship names.");
			ShipNameTimeToLive = config.BindInOrder("ShipName", "shipNameTimeToLive", 60f, "Time (in seconds) for a custom ship name to be displayed.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 300f));
			ShipNameFontSize = config.BindInOrder("ShipName", "shipNameFontSize", 20, "Font size for custom ship names.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(2, 64));
			ShipNameStripHtmlTags = config.BindInOrder("ShipName", "shipNameStripHtmlTags", defaultValue: false, "If true, html tags will be stripped from custom ship names when they are displayed.");
			static void ValidateShipNameMinimumDistance()
			{
				ShipNameMinimumDistance.Value = Mathf.Min(ShipNameMinimumDistance.Value, ShipNameCutoffDistance.Value);
			}
		}

		private static void BindCartNameConfig(ConfigFile config)
		{
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			ShowCartNames = config.BindInOrder("CartName", "showCartNames", defaultValue: true, "Show custom names over carts.");
			CartNameMinimumDistance = config.BindInOrder("CartName", "cartNameMinimumDistance", 0f, "Minimum distance for custom cart names to appear/disappear. Must be less than cutoff distance.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f));
			CartNameMinimumDistance.OnSettingChanged<float>(ValidateCartNameMinimumDistance);
			CartNameCutoffDistance = config.BindInOrder("CartName", "cartNameCutoffDistance", 10f, "Cutoff distance for custom cart names to appear/disappear.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 25f));
			CartNameCutoffDistance.OnSettingChanged<float>(ValidateCartNameMinimumDistance);
			CartNameDisplayOffset = config.BindInOrder<Vector3>("CartName", "cartNameDisplayOffset", Vector3.up, "Display offset for custom cart names.");
			CartNameTimeToLive = config.BindInOrder("CartName", "cartNameTimeToLive", 60f, "Time (in seconds) for a custom cart name to be displayed.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 300f));
			CartNameFontSize = config.BindInOrder("CartName", "cartNameFontSize", 20, "Font size for custom cart names.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(2, 64));
			CartNameStripHtmlTags = config.BindInOrder("CartName", "cartNameStripHtmlTags", defaultValue: false, "If true, html tags will be stripped from custom cart names when they are displayed.");
			static void ValidateCartNameMinimumDistance()
			{
				CartNameMinimumDistance.Value = Mathf.Min(CartNameMinimumDistance.Value, CartNameCutoffDistance.Value);
			}
		}
	}
}