Decompiled source of HexDevTools v1.2.0

Plugins/HexDevTools.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using Jotunn;
using Jotunn.Managers;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("HexDevTools")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("HexDevTools")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("baf6dd8e-8466-4ff0-b61c-9cc9e48cc9ed")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace HexDevTools;

internal static class Constants
{
	internal static class DevCommands
	{
		internal const string EnableDevCommands = "devcommands";

		internal const string EnableDebugMode = "debugmode";

		internal const string NoBuildCost = "nocost";

		internal const string Fly = "fly";

		internal const string DayTime = "tod 0.5";

		internal const string NightTime = "tod 0";

		internal const string Spawn = "spawn";

		internal const string God = "god";

		internal const string FreeFly = "freefly";

		internal const string ResetTimeOfDayToDefault = "tod -1";
	}

	internal static class HexDevToolsGuiText
	{
		internal const string Title = "Dev Tools";

		internal const string EnableDevCommands = "Enable Devcommands";

		internal const string DevCommands = "Dev Commands";

		internal const string Spawn = "Spawn";

		internal const string Close = "Close";

		internal const string NoBuildCost = "No Build Cost";

		internal const string DayTime = "Day Time";

		internal const string NightTime = "Night Time";

		internal const string Fly = "Fly";

		internal const string God = "God Mode";

		internal const string FreeFly = "Free Fly";

		internal const string ResetTimeOfDayToDefault = "Reset Time of Day";

		internal const string SpawnPlaceholder = "prefabName arg1 arg2";
	}
}
[BepInPlugin("hex.devtools", "HexDevTools", "1.2.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
	private const string PluginGuid = "hex.devtools";

	private const string PluginName = "HexDevTools";

	private const string PluginVersion = "1.2.0";

	private readonly PrefabSearchService _prefabSearchService = new PrefabSearchService();

	private ConfigEntry<KeyboardShortcut> _toggleKey;

	private bool _uiVisible;

	private bool _devCommandsEnabled;

	private GameObject _uiRoot;

	private GameObject _clickOutsideBackground;

	private GameObject _mainPanel;

	private GameObject _devCommandPanel;

	private GameObject _devCommandButtonArea;

	private GameObject _spawnPanel;

	private Button _enableDevCommandsButton;

	private InputField _spawnInputField;

	private Text _spawnSuggestionsText;

	private List<string> _spawnMatches = new List<string>();

	private int _spawnMatchIndex = -1;

	private bool _spawnPrefabSelected;

	internal static Plugin Instance { get; private set; }

	private void Awake()
	{
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		Instance = this;
		_toggleKey = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("General", "ToggleKey", new KeyboardShortcut((KeyCode)289, Array.Empty<KeyCode>()), "Toggle Dev Tools UI");
		_toggleKey.SettingChanged += delegate
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			Logger.LogInfo((object)("Toggle key changed to: " + ((object)_toggleKey.Value/*cast due to .constrained prefix*/).ToString()));
		};
		GUIManager.OnCustomGUIAvailable += OnCustomGUIAvailable;
		Logger.LogInfo((object)"HexDevTools loaded.");
	}

	private void Update()
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		if (_toggleKey != null)
		{
			KeyboardShortcut value = _toggleKey.Value;
			if (((KeyboardShortcut)(ref value)).IsDown())
			{
				SetPanelVisible(!_uiVisible);
				return;
			}
		}
		if (_uiVisible && Input.GetKeyDown((KeyCode)27))
		{
			SetPanelVisible(visible: false);
		}
		else if ((Object)(object)_spawnInputField != (Object)null && _spawnInputField.isFocused && !_spawnPrefabSelected && Input.GetKeyDown((KeyCode)9))
		{
			bool reverse = Input.GetKey((KeyCode)308) || Input.GetKey((KeyCode)307);
			CycleSpawnSuggestion(reverse);
		}
	}

	private void OnDestroy()
	{
		GUIManager.OnCustomGUIAvailable -= OnCustomGUIAvailable;
		GUIManager.BlockInput(false);
		Instance = null;
	}

	private void OnCustomGUIAvailable()
	{
		_prefabSearchService.CachePrefabNames();
		CreateUiRoot();
		CreateClickOutsideBackground();
		CreateMainPanel();
		CreateHeader();
		CreateEnableDevCommandsButton();
		CreateDevCommandPanel();
		CreateSpawnPanel();
		CreateCloseButton();
		ResetDevCommandUiState();
		ResetSpawnAutocomplete();
		_uiVisible = false;
		_uiRoot.SetActive(false);
	}

	private void CreateUiRoot()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Expected O, but got Unknown
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		_uiRoot = new GameObject("HexDevToolsRoot");
		_uiRoot.transform.SetParent(GUIManager.CustomGUIFront.transform, false);
		RectTransform obj = _uiRoot.AddComponent<RectTransform>();
		obj.anchorMin = Vector2.zero;
		obj.anchorMax = Vector2.one;
		obj.offsetMin = Vector2.zero;
		obj.offsetMax = Vector2.zero;
	}

	private void CreateClickOutsideBackground()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Expected O, but got Unknown
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_0082: 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)
		//IL_00ba: Expected O, but got Unknown
		_clickOutsideBackground = new GameObject("ClickOutsideBackground");
		_clickOutsideBackground.transform.SetParent(_uiRoot.transform, false);
		RectTransform obj = _clickOutsideBackground.AddComponent<RectTransform>();
		obj.anchorMin = Vector2.zero;
		obj.anchorMax = Vector2.one;
		obj.offsetMin = Vector2.zero;
		obj.offsetMax = Vector2.zero;
		Image obj2 = _clickOutsideBackground.AddComponent<Image>();
		((Graphic)obj2).color = new Color(0f, 0f, 0f, 0.001f);
		((Graphic)obj2).raycastTarget = true;
		Button obj3 = _clickOutsideBackground.AddComponent<Button>();
		((Selectable)obj3).transition = (Transition)0;
		((UnityEvent)obj3.onClick).AddListener((UnityAction)delegate
		{
			SetPanelVisible(visible: false);
		});
	}

	private void CreateMainPanel()
	{
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		_mainPanel = GUIManager.Instance.CreateWoodpanel(_uiRoot.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), Vector2.zero, 430f, 680f, true);
		_mainPanel.transform.SetAsLastSibling();
	}

	private void CreateHeader()
	{
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0059: Unknown result type (might be due to invalid IL or missing references)
		GUIManager.Instance.CreateText("Dev Tools", _mainPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -45f), GUIManager.Instance.AveriaSerifBold, 30, GUIManager.Instance.ValheimOrange, true, Color.black, 300f, 40f, false);
	}

	private void CreateEnableDevCommandsButton()
	{
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: 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)
		//IL_0093: Expected O, but got Unknown
		GameObject val = GUIManager.Instance.CreateButton("Enable Devcommands", _mainPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -95f), 180f, 30f);
		Button button = val.GetComponent<Button>();
		_enableDevCommandsButton = button;
		((UnityEvent)button.onClick).AddListener((UnityAction)delegate
		{
			if (!_devCommandsEnabled)
			{
				RunConsoleCommand("devcommands");
				RunConsoleCommand("debugmode");
				_devCommandsEnabled = true;
				((Selectable)button).interactable = false;
				ShowHudMessage("Devcommands enabled.");
				_devCommandPanel.SetActive(true);
				_spawnPanel.SetActive(true);
			}
		});
	}

	private void CreateDevCommandPanel()
	{
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
		_devCommandPanel = GUIManager.Instance.CreateWoodpanel(_mainPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -260f), 330f, 290f, false);
		GUIManager.Instance.CreateText("Dev Commands", _devCommandPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -25f), GUIManager.Instance.AveriaSerifBold, 16, GUIManager.Instance.ValheimOrange, true, Color.black, 200f, 30f, false);
		CreateDevCommandButtonArea();
		CreateDevCommandButton("No Build Cost", "nocost");
		CreateDevCommandButton("Fly", "fly");
		CreateDevCommandButton("Free Fly", "freefly");
		CreateDevCommandButton("God Mode", "god");
		CreateDevCommandButton("Day Time", "tod 0.5");
		CreateDevCommandButton("Night Time", "tod 0");
		CreateDevCommandButton("Reset Time of Day", "tod -1");
	}

	private void CreateDevCommandButtonArea()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Expected O, but got Unknown
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: 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_00ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b6: Expected O, but got Unknown
		_devCommandButtonArea = new GameObject("HexDevToolsDevCommandButtonArea");
		_devCommandButtonArea.transform.SetParent(_devCommandPanel.transform, false);
		RectTransform obj = _devCommandButtonArea.AddComponent<RectTransform>();
		obj.anchorMin = new Vector2(0.5f, 1f);
		obj.anchorMax = new Vector2(0.5f, 1f);
		obj.anchoredPosition = new Vector2(0f, -150f);
		obj.sizeDelta = new Vector2(260f, 220f);
		VerticalLayoutGroup obj2 = _devCommandButtonArea.AddComponent<VerticalLayoutGroup>();
		((LayoutGroup)obj2).childAlignment = (TextAnchor)1;
		((HorizontalOrVerticalLayoutGroup)obj2).spacing = 6f;
		((LayoutGroup)obj2).padding = new RectOffset(0, 0, 0, 0);
		((HorizontalOrVerticalLayoutGroup)obj2).childControlWidth = false;
		((HorizontalOrVerticalLayoutGroup)obj2).childControlHeight = false;
		((HorizontalOrVerticalLayoutGroup)obj2).childForceExpandWidth = false;
		((HorizontalOrVerticalLayoutGroup)obj2).childForceExpandHeight = false;
	}

	private void CreateDevCommandButton(string text, string command)
	{
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Expected O, but got Unknown
		((UnityEvent)GUIManager.Instance.CreateButton(text, _devCommandButtonArea.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), Vector2.zero, 180f, 28f).GetComponent<Button>().onClick).AddListener((UnityAction)delegate
		{
			RunConsoleCommand(command);
		});
	}

	private void CreateSpawnPanel()
	{
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ac: 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_00f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0110: Unknown result type (might be due to invalid IL or missing references)
		//IL_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_0157: Unknown result type (might be due to invalid IL or missing references)
		//IL_0166: Unknown result type (might be due to invalid IL or missing references)
		//IL_0175: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_022a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0239: Unknown result type (might be due to invalid IL or missing references)
		//IL_0248: Unknown result type (might be due to invalid IL or missing references)
		//IL_0259: Unknown result type (might be due to invalid IL or missing references)
		//IL_025f: Unknown result type (might be due to invalid IL or missing references)
		//IL_02de: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e8: Expected O, but got Unknown
		_spawnPanel = GUIManager.Instance.CreateWoodpanel(_mainPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -535f), 330f, 175f, false);
		GUIManager.Instance.CreateText("Spawn", _spawnPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -25f), GUIManager.Instance.AveriaSerifBold, 16, GUIManager.Instance.ValheimOrange, true, Color.black, 200f, 25f, false);
		Text component = GUIManager.Instance.CreateText("Tab Key: Select/Cycle Prefabs\r\nEnter Key: Spawn", _spawnPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -48f), GUIManager.Instance.AveriaSerif, 11, Color.white, true, Color.black, 280f, 40f, false).GetComponent<Text>();
		component.alignment = (TextAnchor)1;
		((Graphic)component).raycastTarget = false;
		GameObject val = GUIManager.Instance.CreateInputField(_spawnPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(-45f, -82f), (ContentType)0, "prefabName arg1 arg2", 14, 200f, 30f);
		_spawnInputField = val.GetComponent<InputField>();
		((UnityEvent<string>)(object)_spawnInputField.onEndEdit).AddListener((UnityAction<string>)delegate
		{
			if (Input.GetKeyDown((KeyCode)13) || Input.GetKeyDown((KeyCode)271))
			{
				ExecuteSpawn();
			}
		});
		GameObject obj = GUIManager.Instance.CreateButton("Spawn", _spawnPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(105f, -82f), 80f, 30f);
		GameObject val2 = GUIManager.Instance.CreateText(string.Empty, _spawnPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -137f), GUIManager.Instance.AveriaSerif, 11, Color.white, true, Color.black, 300f, 60f, false);
		_spawnSuggestionsText = val2.GetComponent<Text>();
		_spawnSuggestionsText.alignment = (TextAnchor)0;
		_spawnSuggestionsText.horizontalOverflow = (HorizontalWrapMode)0;
		_spawnSuggestionsText.verticalOverflow = (VerticalWrapMode)0;
		((Graphic)_spawnSuggestionsText).raycastTarget = false;
		((UnityEvent<string>)(object)_spawnInputField.onValueChanged).AddListener((UnityAction<string>)HandleSpawnInputChanged);
		((UnityEvent)obj.GetComponent<Button>().onClick).AddListener(new UnityAction(ExecuteSpawn));
	}

	private void HandleSpawnInputChanged(string value)
	{
		if (string.IsNullOrWhiteSpace(value))
		{
			ResetSpawnAutocomplete();
			return;
		}
		if (value.IndexOf(' ') >= 0)
		{
			_spawnPrefabSelected = true;
			ClearSpawnSuggestions();
			return;
		}
		_spawnPrefabSelected = false;
		_spawnMatchIndex = -1;
		_spawnMatches = _prefabSearchService.FindMatches(value);
		UpdateSpawnSuggestions();
	}

	private void CycleSpawnSuggestion(bool reverse)
	{
		if ((Object)(object)_spawnInputField == (Object)null || _spawnMatches == null || _spawnMatches.Count == 0)
		{
			return;
		}
		if (reverse)
		{
			_spawnMatchIndex--;
			if (_spawnMatchIndex < 0)
			{
				_spawnMatchIndex = _spawnMatches.Count - 1;
			}
		}
		else
		{
			_spawnMatchIndex++;
			if (_spawnMatchIndex >= _spawnMatches.Count)
			{
				_spawnMatchIndex = 0;
			}
		}
		string text = _spawnMatches[_spawnMatchIndex];
		_spawnInputField.SetTextWithoutNotify(text);
		int length = text.Length;
		_spawnInputField.caretPosition = length;
		_spawnInputField.selectionAnchorPosition = length;
		_spawnInputField.selectionFocusPosition = length;
		_spawnInputField.ActivateInputField();
		UpdateSpawnSuggestions();
	}

	private void UpdateSpawnSuggestions()
	{
		if ((Object)(object)_spawnSuggestionsText == (Object)null)
		{
			return;
		}
		if (_spawnMatches == null || _spawnMatches.Count == 0)
		{
			_spawnSuggestionsText.text = string.Empty;
			return;
		}
		List<string> list = new List<string>();
		for (int i = 0; i < _spawnMatches.Count; i++)
		{
			string text = _spawnMatches[i];
			if (i == _spawnMatchIndex)
			{
				list.Add("> " + text + " <");
			}
			else
			{
				list.Add(text);
			}
		}
		_spawnSuggestionsText.text = string.Join("   ", list);
	}

	private void ResetSpawnAutocomplete()
	{
		_spawnMatches.Clear();
		_spawnMatchIndex = -1;
		_spawnPrefabSelected = false;
		ClearSpawnSuggestions();
	}

	private void ClearSpawnSuggestions()
	{
		if ((Object)(object)_spawnSuggestionsText != (Object)null)
		{
			_spawnSuggestionsText.text = string.Empty;
		}
	}

	private void CreateCloseButton()
	{
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Expected O, but got Unknown
		((UnityEvent)GUIManager.Instance.CreateButton("Close", _mainPanel.transform, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0f, 35f), 140f, 30f).GetComponent<Button>().onClick).AddListener((UnityAction)delegate
		{
			SetPanelVisible(visible: false);
			Logger.LogInfo((object)"Dev panel closed via button.");
		});
	}

	private void ResetDevCommandUiState()
	{
		if ((Object)(object)_enableDevCommandsButton != (Object)null)
		{
			((Selectable)_enableDevCommandsButton).interactable = !_devCommandsEnabled;
		}
		bool devCommandsEnabled = _devCommandsEnabled;
		if ((Object)(object)_devCommandPanel != (Object)null)
		{
			_devCommandPanel.SetActive(devCommandsEnabled);
		}
		if ((Object)(object)_spawnPanel != (Object)null)
		{
			_spawnPanel.SetActive(devCommandsEnabled);
		}
	}

	private void SetPanelVisible(bool visible)
	{
		_uiVisible = visible;
		if ((Object)(object)_uiRoot != (Object)null)
		{
			_uiRoot.SetActive(visible);
			GUIManager.BlockInput(visible);
		}
		if (!visible)
		{
			ResetSpawnAutocomplete();
			if ((Object)(object)_spawnInputField != (Object)null)
			{
				_spawnInputField.SetTextWithoutNotify(string.Empty);
			}
		}
	}

	private void ExecuteSpawn()
	{
		if ((Object)(object)_spawnInputField == (Object)null)
		{
			Logger.LogWarning((object)"Spawn input field is null.");
			return;
		}
		if (string.IsNullOrWhiteSpace(_spawnInputField.text))
		{
			ShowHudMessage("Enter a prefab name and optional spawn arguments.");
			return;
		}
		ExecuteSpawnInput(_spawnInputField);
		_spawnInputField.SetTextWithoutNotify(string.Empty);
		ResetSpawnAutocomplete();
		((MonoBehaviour)this).StartCoroutine(RefocusSpawnInput());
	}

	private static void ExecuteSpawnInput(InputField spawnInput)
	{
		if ((Object)(object)spawnInput == (Object)null)
		{
			Logger.LogWarning((object)"Spawn input field is null.");
			return;
		}
		string text = spawnInput.text;
		if (string.IsNullOrEmpty(text))
		{
			ShowHudMessage("Enter a prefab name and optional spawn arguments.");
			return;
		}
		text = text.Trim();
		if (string.IsNullOrEmpty(text))
		{
			ShowHudMessage("Enter a prefab name and optional spawn arguments.");
		}
		else
		{
			RunConsoleCommand("spawn " + text);
		}
	}

	private static void ShowHudMessage(string message)
	{
		if ((Object)(object)Player.m_localPlayer == (Object)null)
		{
			Logger.LogWarning((object)("Player.m_localPlayer is null. Could not show HUD message: " + message));
		}
		else
		{
			((Character)Player.m_localPlayer).Message((MessageType)1, message, 0, (Sprite)null);
		}
	}

	private static void RunConsoleCommand(string command)
	{
		if ((Object)(object)Console.instance == (Object)null)
		{
			Logger.LogWarning((object)("Console.instance is null. Could not run command: " + command));
			return;
		}
		((Terminal)Console.instance).TryRunCommand(command, false, false);
		Logger.LogInfo((object)("Ran command: " + command));
	}

	private IEnumerator RefocusSpawnInput()
	{
		yield return null;
		if ((Object)(object)_spawnInputField != (Object)null && _uiVisible && ((Component)_spawnInputField).gameObject.activeInHierarchy)
		{
			_spawnInputField.ActivateInputField();
			((Selectable)_spawnInputField).Select();
		}
	}
}
internal class PrefabSearchService
{
	private readonly List<string> _prefabNames = new List<string>();

	internal void CachePrefabNames()
	{
		_prefabNames.Clear();
		if ((Object)(object)ZNetScene.instance == (Object)null)
		{
			Logger.LogWarning((object)"ZNetScene.instance is null. Could not cache prefab names.");
			return;
		}
		foreach (GameObject prefab in ZNetScene.instance.m_prefabs)
		{
			if (!((Object)(object)prefab == (Object)null) && !string.IsNullOrWhiteSpace(((Object)prefab).name))
			{
				_prefabNames.Add(((Object)prefab).name);
			}
		}
		List<string> collection = _prefabNames.Distinct<string>(StringComparer.OrdinalIgnoreCase).OrderBy<string, string>((string name) => name, StringComparer.OrdinalIgnoreCase).ToList();
		_prefabNames.Clear();
		_prefabNames.AddRange(collection);
		Logger.LogInfo((object)$"Cached {_prefabNames.Count} prefab names.");
	}

	internal List<string> FindMatches(string input, int maxResults = 10)
	{
		string searchText = GetPrefabSearchText(input);
		if (string.IsNullOrWhiteSpace(searchText))
		{
			return new List<string>();
		}
		return _prefabNames.Where((string name) => name.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0).Take(maxResults).ToList();
	}

	internal static string GetPrefabSearchText(string input)
	{
		if (string.IsNullOrWhiteSpace(input))
		{
			return string.Empty;
		}
		string text = input.TrimStart(Array.Empty<char>());
		int num = text.IndexOf(' ');
		if (num < 0)
		{
			return text;
		}
		return text.Substring(0, num);
	}

	internal static string ReplacePrefabName(string input, string prefabName)
	{
		if (string.IsNullOrWhiteSpace(prefabName))
		{
			return input;
		}
		if (string.IsNullOrWhiteSpace(input))
		{
			return prefabName;
		}
		string text = input.TrimStart(Array.Empty<char>());
		int num = text.IndexOf(' ');
		if (num < 0)
		{
			return prefabName;
		}
		string text2 = text.Substring(num);
		return prefabName + text2;
	}
}