Decompiled source of AdditionalFastTravel v1.1.1

plugins/clearwater.atlyss.additionalfasttravel.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Mirror;
using UnityEngine;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Mirror")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("clearwater.atlyss.additionalfasttravel")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.1.1.0")]
[assembly: AssemblyInformationalVersion("1.1.1+9d764c15a3bba5167e5e9effa559e6f348d4c4f3")]
[assembly: AssemblyProduct("AdditionalFastTravel")]
[assembly: AssemblyTitle("clearwater.atlyss.additionalfasttravel")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.1.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[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 ATLYSS_AdditionalFastTravel
{
	public static class FastTravelActions
	{
		public enum WarpResult
		{
			Warped,
			AlreadyHere,
			MultipleMatches,
			NoMatches,
			InDungeon
		}

		public enum GotoResult
		{
			Warped,
			MultipleMatches,
			NoMatches,
			InDungeon,
			UnknownPosition
		}

		public static void ListWarps()
		{
			List<SceneData.KnownSceneData> availableScenes = SceneData.GetAvailableScenes();
			string text = string.Join("\n", availableScenes.Select((SceneData.KnownSceneData x) => "  " + x.Name));
			if (string.IsNullOrWhiteSpace(text))
			{
				text = "No maps available! Tell the mod developer about this!";
			}
			Utils.ChatMsg("Available warps:\n" + text);
		}

		public static void ListGotos()
		{
			List<SceneData.Goto> availableGotos = SceneData.GetAvailableGotos();
			string text = string.Join("\n", availableGotos.Select((SceneData.Goto x) => "  " + x.Name));
			if (string.IsNullOrWhiteSpace(text))
			{
				text = "No gotos available! Tell the mod developer about this!";
			}
			Utils.ChatMsg("Available goto points for this area:\n" + text);
		}

		public static void WarpAndGoto(string sceneName, string locationName)
		{
			switch (WarpToScene(sceneName, ""))
			{
			case WarpResult.AlreadyHere:
				Utils.ChatMsg("Already in the given map!");
				GoToLocation(locationName);
				break;
			case WarpResult.Warped:
				Main.StoredGoto = locationName;
				Main.StoredGotoNotBefore = DateTime.Now + TimeSpan.FromSeconds(2.0);
				break;
			}
		}

		public static WarpResult WarpToScene(string sceneName, string difficulty)
		{
			//IL_011c: 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_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			if (SceneData.IsInDungeon())
			{
				Utils.ChatMsg("<color=orange>Cannot use this command while in a dungeon.</color>");
				return WarpResult.InDungeon;
			}
			List<SceneData.KnownSceneData> availableScenes = SceneData.GetAvailableScenes();
			List<SceneData.KnownSceneData> list = Utils.FindClosestMatch(sceneName, availableScenes, (SceneData.KnownSceneData scene) => scene.Name);
			if (list.Count == 0)
			{
				Utils.ChatMsg("<color=orange>ERROR</color>: No matches found for map " + sceneName + ". Use /warp to list all maps.");
				return WarpResult.NoMatches;
			}
			if (list.Count > 1)
			{
				string text = string.Join("\n", list.Select((SceneData.KnownSceneData x) => "  " + x.Name));
				Utils.ChatMsg("<color=orange>ERROR</color>: Found multiple matches for map " + sceneName + ":\n" + text + "\nTry to use a more specific name or use /warp to list all maps.");
				return WarpResult.MultipleMatches;
			}
			if (SceneData.GetCurrentScene() == list[0].Path)
			{
				return WarpResult.AlreadyHere;
			}
			ZoneDifficulty val = (ZoneDifficulty)1;
			if (difficulty.Equals("HARD", StringComparison.InvariantCultureIgnoreCase))
			{
				val = (ZoneDifficulty)2;
			}
			else if (difficulty.Equals("EASY", StringComparison.InvariantCultureIgnoreCase))
			{
				val = (ZoneDifficulty)2;
			}
			string text2 = list[0].Gotos.FirstOrDefault((SceneData.Goto x) => x.SpawnPoint != null).SpawnPoint ?? "spawnPoint";
			Player._mainPlayer._pSound._aSrcGeneral.PlayOneShot(Player._mainPlayer._pSound._portalInteract, 1f);
			Player._mainPlayer.Cmd_SceneTransport(list[0].Path, text2, val);
			return WarpResult.Warped;
		}

		public static GotoResult GoToLocation(string locationName)
		{
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			if (SceneData.IsInDungeon())
			{
				Utils.ChatMsg("<color=orange>Cannot use this command while in a dungeon.</color>");
				return GotoResult.InDungeon;
			}
			List<SceneData.Goto> availableGotos = SceneData.GetAvailableGotos();
			List<SceneData.Goto> list = Utils.FindClosestMatch(locationName, availableGotos, (SceneData.Goto go) => go.Name);
			if (list.Count == 0)
			{
				Utils.ChatMsg("<color=orange>ERROR</color>: No matches found for goto " + locationName + ". Use /goto to list all locations.");
				return GotoResult.NoMatches;
			}
			if (list.Count > 1)
			{
				string text = string.Join("\n", list.Select((SceneData.Goto x) => "  " + x.Name));
				Utils.ChatMsg("<color=orange>ERROR</color>: Found multiple matches for goto " + locationName + ":\n" + text + "\nTry to use a more specific name or use /goto to list all locations.");
				return GotoResult.MultipleMatches;
			}
			Vector3? position = list[0].Position;
			if (!position.HasValue)
			{
				Utils.ChatMsg("<color=orange>ERROR</color>: Couldn't retrieve position for " + list[0].Name + ", please report this to the mod developer!");
				return GotoResult.UnknownPosition;
			}
			Player._mainPlayer._pSound._aSrcGeneral.PlayOneShot(Player._mainPlayer._pSound._warp, 1f);
			((Collider)Player._mainPlayer._pMove._playerController).enabled = false;
			((Component)Player._mainPlayer).transform.SetPositionAndRotation(position.Value, ((Component)Player._mainPlayer).transform.rotation);
			CameraFunction._current.CameraReset();
			((Collider)Player._mainPlayer._pMove._playerController).enabled = true;
			Utils.ChatMsg("Moved to " + list[0].Name + ".");
			return GotoResult.Warped;
		}
	}
	public static class Logging
	{
		public static ManualLogSource PluginLogger = Logger.CreateLogSource("AdditionalFastTravel");

		public static void Debug(string text)
		{
			PluginLogger.LogDebug((object)text);
		}

		public static void Message(string text)
		{
			PluginLogger.LogMessage((object)text);
		}

		public static void Warn(string text)
		{
			PluginLogger.LogWarning((object)text);
		}

		public static void Error(string text)
		{
			PluginLogger.LogError((object)text);
		}

		public static void Fatal(string text)
		{
			PluginLogger.LogFatal((object)text);
		}

		public static void Info(string text)
		{
			PluginLogger.LogInfo((object)text);
		}
	}
	[BepInPlugin("clearwater.atlyss.additionalfasttravel", "AdditionalFastTravel", "1.1.1")]
	public class Main : BaseUnityPlugin
	{
		public static DateTime StoredGotoNotBefore { get; internal set; } = DateTime.Now;


		public static string StoredGoto { get; internal set; } = "";


		private void Awake()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			Logging.Info("-- LOADING AdditionalFastTravel--");
			Harmony val = new Harmony("clearwater.atlyss.additionalfasttravel");
			val.PatchAll();
		}

		private void LateUpdate()
		{
			if (!string.IsNullOrWhiteSpace(StoredGoto) && Object.op_Implicit((Object)(object)Player._mainPlayer) && !Player._mainPlayer._bufferingStatus && DateTime.Now >= StoredGotoNotBefore)
			{
				FastTravelActions.GoToLocation(StoredGoto);
				StoredGoto = "";
			}
		}
	}
	public static class SceneData
	{
		public struct Goto
		{
			public string Name;

			public string? SpawnPoint;

			public Vector3? Position;

			public bool Disabled;

			public Goto()
			{
				SpawnPoint = null;
				Position = null;
				Disabled = false;
				Name = "";
			}

			public static Goto FromSpawnPointDisable(string spawnPoint)
			{
				Goto result = new Goto();
				result.Name = "";
				result.SpawnPoint = spawnPoint;
				result.Disabled = true;
				return result;
			}

			public static Goto FromSpawnPoint(string name, string spawnPoint)
			{
				Goto result = new Goto();
				result.Name = name;
				result.SpawnPoint = spawnPoint;
				return result;
			}

			public static Goto FromPosition(string name, Vector3 position)
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				Goto result = new Goto();
				result.Name = name;
				result.Position = position;
				return result;
			}
		}

		public struct KnownSceneData
		{
			public bool IsCustomMap;

			public string Name;

			public string Path;

			public List<Goto> Gotos;

			public KnownSceneData()
			{
				IsCustomMap = false;
				Name = "";
				Path = "";
				Gotos = new List<Goto>();
			}
		}

		private static readonly List<KnownSceneData> SceneDatas = new List<KnownSceneData>(17)
		{
			new KnownSceneData
			{
				Name = "SanctumCatacombs",
				Path = "Assets/Scenes/map_dungeon00_sanctumCatacombs.unity",
				Gotos = new List<Goto>(1) { Goto.FromSpawnPoint("Spawn", "spawnPoint") }
			},
			new KnownSceneData
			{
				Name = "CrescentGrove",
				Path = "Assets/Scenes/map_dungeon01_crescentGrove.unity",
				Gotos = new List<Goto>(1) { Goto.FromSpawnPoint("Spawn", "spawnPoint") }
			},
			new KnownSceneData
			{
				Name = "Sanctum",
				Path = "Assets/Scenes/00_zone_forest/_zone00_sanctum.unity",
				Gotos = new List<Goto>(8)
				{
					Goto.FromSpawnPoint("Spawn", "startPoint"),
					Goto.FromSpawnPoint("WorldPortal", "worldPortalPoint"),
					Goto.FromSpawnPoint("OuterSanctum", "gatePoint"),
					Goto.FromSpawnPoint("Respawn", "respawnPoint"),
					Goto.FromPosition("Shop", new Vector3(200f, 11f, -110f)),
					Goto.FromPosition("Enchanting", new Vector3(310f, 11f, -281f)),
					Goto.FromPosition("Barracks", new Vector3(-160f, 29f, -600f)),
					Goto.FromPosition("Lake", new Vector3(500f, 43f, 90f))
				}
			},
			new KnownSceneData
			{
				Name = "SanctumArena",
				Path = "Assets/Scenes/00_zone_forest/_zone00_sanctumArena.unity",
				Gotos = new List<Goto>(1) { Goto.FromSpawnPoint("Spawn", "spawnPoint") }
			},
			new KnownSceneData
			{
				Name = "OuterSanctum",
				Path = "Assets/Scenes/00_zone_forest/_zone00_outerSanctum.unity",
				Gotos = new List<Goto>(4)
				{
					Goto.FromSpawnPoint("Sanctum", "spawnPoint"),
					Goto.FromSpawnPoint("ArcwoodPass", "arcwoodSpawn"),
					Goto.FromSpawnPoint("EffoldTerrace", "terraceSpawn"),
					Goto.FromSpawnPoint("TuulValley", "tuulValleyPoint")
				}
			},
			new KnownSceneData
			{
				Name = "ArcwoodPass",
				Path = "Assets/Scenes/00_zone_forest/_zone00_arcwoodPass.unity",
				Gotos = new List<Goto>(8)
				{
					Goto.FromPosition("Chapel", new Vector3(-54f, 1f, 1702f)),
					Goto.FromPosition("CatacombsEntrance", new Vector3(298f, 42f, 1819f)),
					Goto.FromPosition("BadgeMerchants", new Vector3(136f, 81f, 2585f)),
					Goto.FromSpawnPoint("OuterSanctum", "spawnPoint"),
					Goto.FromSpawnPoint("Waypoint", "catacombWaypoint"),
					Goto.FromSpawnPoint("DungeonPortal", "fortSpawn"),
					Goto.FromSpawnPoint("DungeonEnd", "endDungeonSpawn"),
					Goto.FromSpawnPoint("CrescentRoad", "keepSpawn")
				}
			},
			new KnownSceneData
			{
				Name = "CatacombsArena",
				Path = "Assets/Scenes/00_zone_forest/_zone00_catacombsArena.unity",
				Gotos = new List<Goto>(1) { Goto.FromSpawnPoint("Spawn", "spawnPoint") }
			},
			new KnownSceneData
			{
				Name = "EffoldTerrace",
				Path = "Assets/Scenes/00_zone_forest/_zone00_effoldTerrace.unity",
				Gotos = new List<Goto>(2)
				{
					Goto.FromSpawnPoint("Spawn", "startPoint"),
					Goto.FromPosition("CenterArea", new Vector3(20f, 18f, 45f))
				}
			},
			new KnownSceneData
			{
				Name = "CrescentRoad",
				Path = "Assets/Scenes/00_zone_forest/_zone00_crescentRoad.unity",
				Gotos = new List<Goto>(3)
				{
					Goto.FromSpawnPoint("ArcwoodPass", "spawnPoint"),
					Goto.FromSpawnPoint("CrescentKeep", "keepSpawn"),
					Goto.FromSpawnPoint("LuvoraGarden", "gardenPoint")
				}
			},
			new KnownSceneData
			{
				Name = "CrescentKeep",
				Path = "Assets/Scenes/00_zone_forest/_zone00_crescentKeep.unity",
				Gotos = new List<Goto>(7)
				{
					Goto.FromPosition("KeepEntrance", new Vector3(-150f, 55f, 235f)),
					Goto.FromPosition("GroveLobby", new Vector3(-1265f, 225f, 575f)),
					Goto.FromSpawnPoint("CrescentRoad", "startPoint"),
					Goto.FromSpawnPoint("Waypoint1", "ckeepWaypoint1"),
					Goto.FromSpawnPoint("Waypoint2", "ckeepWaypoint2"),
					Goto.FromSpawnPoint("GateOfTheMoon", "moonGateSpawn"),
					Goto.FromSpawnPoint("CrescentGrove", "groveEntrance")
				}
			},
			new KnownSceneData
			{
				Name = "LuvoraGarden",
				Path = "Assets/Scenes/00_zone_forest/_zone00_luvoraGarden.unity",
				Gotos = new List<Goto>(1) { Goto.FromSpawnPoint("Spawn", "startPoint") }
			},
			new KnownSceneData
			{
				Name = "TuulValley",
				Path = "Assets/Scenes/00_zone_forest/_zone00_tuulValley.unity",
				Gotos = new List<Goto>(2)
				{
					Goto.FromSpawnPoint("OuterSanctum", "spawnPoint"),
					Goto.FromSpawnPoint("TuulEnclave", "enclavePoint")
				}
			},
			new KnownSceneData
			{
				Name = "TuulEnclave",
				Path = "Assets/Scenes/00_zone_forest/_zone00_tuulEnclave.unity",
				Gotos = new List<Goto>(2)
				{
					Goto.FromSpawnPoint("TuulValley", "spawnPoint"),
					Goto.FromSpawnPoint("BularrFortress", "fortSpawn")
				}
			},
			new KnownSceneData
			{
				Name = "BularrFortress",
				Path = "Assets/Scenes/00_zone_forest/_zone00_bularFortress.unity",
				Gotos = new List<Goto>(3)
				{
					Goto.FromPosition("AmmagonHut", new Vector3(-92f, 14f, -580f)),
					Goto.FromSpawnPoint("TuulEnclave", "startPoint"),
					Goto.FromSpawnPoint("Waypoint", "tuulValleyWaypoint")
				}
			},
			new KnownSceneData
			{
				Name = "GateOfTheMoon",
				Path = "Assets/Scenes/00_zone_forest/_zone00_gateOfTheMoon.unity",
				Gotos = new List<Goto>(5)
				{
					Goto.FromPosition("RedwoudEntrance", new Vector3(805f, 5f, 820f)),
					Goto.FromSpawnPoint("CrescentKeep", "spawnPoint"),
					Goto.FromSpawnPointDisable("treePoint"),
					Goto.FromSpawnPointDisable("autumnPoint"),
					Goto.FromSpawnPoint("WallOfTheStars", "starWallSpawn")
				}
			},
			new KnownSceneData
			{
				Name = "WallOfTheStars",
				Path = "Assets/Scenes/00_zone_forest/_zone00_wallOfTheStars.unity",
				Gotos = new List<Goto>(4)
				{
					Goto.FromPosition("Merchant", new Vector3(-100f, 12f, -345f)),
					Goto.FromSpawnPoint("GateOfTheMoon", "spawnPoint"),
					Goto.FromSpawnPoint("Waypoint", "wallStarWaypoint"),
					Goto.FromSpawnPoint("TrialOfTheStars", "trialSpawn")
				}
			},
			new KnownSceneData
			{
				Name = "TrialOfTheStars",
				Path = "Assets/Scenes/00_zone_forest/_zone00_trialOfTheStars.unity",
				Gotos = new List<Goto>(6)
				{
					Goto.FromPosition("CheckpointHub", new Vector3(30f, 0f, 188f)),
					Goto.FromPosition("Checkpoint1", new Vector3(60f, 448f, 185f)),
					Goto.FromPosition("Checkpoint2", new Vector3(-10f, 878f, 184f)),
					Goto.FromPosition("Checkpoint3", new Vector3(50f, 1130f, 181f)),
					Goto.FromPosition("Summit", new Vector3(-9f, 1511f, 289f)),
					Goto.FromSpawnPoint("WallOfTheStars", "spawnPoint")
				}
			}
		};

		public static string LastNetworkSceneLoaded { get; internal set; } = "";


		public static string GetCurrentScene()
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			string result = "<null>";
			if (NetworkServer.active)
			{
				object obj;
				if (!Object.op_Implicit((Object)(object)Player._mainPlayer))
				{
					obj = "<null>";
				}
				else
				{
					Scene scene = ((Component)Player._mainPlayer).gameObject.scene;
					obj = ((Scene)(ref scene)).path;
				}
				result = (string)obj;
			}
			else if (NetworkClient.active)
			{
				result = LastNetworkSceneLoaded;
			}
			return result;
		}

		public static bool IsInDungeon()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Invalid comparison between Unknown and I4
			if ((Object)(object)Player._mainPlayer == (Object)null)
			{
				return false;
			}
			return (int)Player._mainPlayer._playerMapInstance._zoneType == 2;
		}

		public static List<KnownSceneData> GetAvailableScenes()
		{
			List<KnownSceneData> list = new List<KnownSceneData>(SceneDatas);
			foreach (KeyValuePair<string, ScriptableMapData> extraMap in GameManager._current._cachedScriptableMapDatas)
			{
				string sanitizedMapName = extraMap.Value._mapLockID.Replace(" ", "");
				if (!list.Any((KnownSceneData x) => x.Path == extraMap.Value._subScene) && !list.Any((KnownSceneData x) => x.Name == sanitizedMapName))
				{
					list.Add(new KnownSceneData
					{
						Name = sanitizedMapName,
						Path = extraMap.Value._subScene,
						IsCustomMap = true,
						Gotos = new List<Goto>()
					});
				}
			}
			return list;
		}

		public static List<Goto> GetAvailableGotos()
		{
			List<KnownSceneData> availableScenes = GetAvailableScenes();
			return UpdateFromMapSpawnPoints(availableScenes.FirstOrDefault((KnownSceneData x) => x.Path == GetCurrentScene()).Gotos ?? new List<Goto>());
		}

		private static List<Goto> UpdateFromMapSpawnPoints(List<Goto> gotos)
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			SpawnPoint[] array = Object.FindObjectsByType<SpawnPoint>((FindObjectsInactive)0, (FindObjectsSortMode)0);
			List<Goto> list = new List<Goto>(gotos);
			SpawnPoint[] array2 = array;
			foreach (SpawnPoint val in array2)
			{
				Scene scene = ((Component)val).gameObject.scene;
				if (((Scene)(ref scene)).path != GetCurrentScene())
				{
					continue;
				}
				string tag = val._spawnPointTag;
				if (!string.IsNullOrWhiteSpace(tag))
				{
					int num = list.FindIndex((Goto x) => x.SpawnPoint == tag);
					if (num != -1)
					{
						Goto value = list[num];
						value.Position = ((Component)val).transform.position;
						list[num] = value;
					}
					else
					{
						string name = char.ToUpper(tag[0]) + tag.Substring(1);
						list.Add(Goto.FromPosition(name, ((Component)val).transform.position));
					}
				}
			}
			return list.Where((Goto x) => !x.Disabled).ToList();
		}
	}
	public static class Utils
	{
		public static List<T> FindClosestMatch<T>(string input, List<T> options, Func<T, string> keySelector)
		{
			Func<T, string> keySelector2 = keySelector;
			string input2 = input;
			foreach (T option in options)
			{
				if (keySelector2(option).Equals(input2, StringComparison.InvariantCultureIgnoreCase))
				{
					return new List<T>(1) { option };
				}
			}
			return options.Where((T x) => keySelector2(x).Contains(input2, StringComparison.InvariantCultureIgnoreCase)).ToList();
		}

		public static void ChatMsg(string message)
		{
			ChatBehaviour._current.New_ChatMessage(message);
		}
	}
	internal static class ModInfo
	{
		public const string GUID = "clearwater.atlyss.additionalfasttravel";

		public const string NAME = "AdditionalFastTravel";

		public const string VERSION = "1.1.1";
	}
}
namespace ATLYSS_AdditionalFastTravel.HarmonyPatches
{
	[HarmonyPatch(typeof(NetworkManager), "ClientChangeScene")]
	internal static class ListenForSceneChanges
	{
		private static void Prefix(string newSceneName, SceneOperation sceneOperation)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Invalid comparison between Unknown and I4
			if ((int)sceneOperation == 1)
			{
				SceneData.LastNetworkSceneLoaded = newSceneName;
			}
		}
	}
	[HarmonyPatch(typeof(ChatBehaviour), "Cmd_SendChatMessage")]
	internal static class ListenForWarpCommandPatch
	{
		private static void Usage(string msg)
		{
			Utils.ChatMsg("<color=orange>Usage:</color> " + msg);
		}

		private static bool Prefix(string _message)
		{
			string[] array = _message.Split(' ', StringSplitOptions.RemoveEmptyEntries);
			if (array.Length == 0)
			{
				return true;
			}
			if (array[0] == "/warp")
			{
				if (array.Length == 1)
				{
					FastTravelActions.ListWarps();
				}
				if (array.Length == 2)
				{
					FastTravelActions.WarpToScene(array[1], "");
				}
				else if (array.Length == 3)
				{
					FastTravelActions.WarpAndGoto(array[1], array[2]);
				}
				else
				{
					Usage("\n  <color=orange>/warp [area]</color> - warp to map\n  <color=orange>/warp [area] [goto]</color> - warp and goto at the same time");
				}
				return false;
			}
			if (array[0] == "/dungeon")
			{
				if (array.Length == 1)
				{
					FastTravelActions.ListWarps();
				}
				if (array.Length == 3)
				{
					FastTravelActions.WarpToScene(array[1], array[2]);
				}
				else
				{
					Usage("\n  <color=orange>/dungeon [area] [difficulty]</color> - warp to map with EASY / NORMAL / HARD difficulty");
				}
				return false;
			}
			if (array[0] == "/goto")
			{
				if (array.Length == 1)
				{
					FastTravelActions.ListGotos();
				}
				if (array.Length == 2)
				{
					FastTravelActions.GoToLocation(array[1]);
				}
				else
				{
					Usage("\n  <color=orange>/goto [location]</color> - go to location in current map");
				}
				return false;
			}
			return true;
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}