Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of EasySpawner v1.6.3
EasySpawner.dll
Decompiled 2 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using EasySpawner.Config; using EasySpawner.UI; using HarmonyLib; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("EasySpawner")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("EasySpawner")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("d575372d-3e88-42f8-b234-bf555c7016d6")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace EasySpawner { [BepInPlugin("cooley.easyspawner", "Easy Spawner", "1.6.3")] [BepInProcess("valheim.exe")] public class EasySpawnerPlugin : BaseUnityPlugin { private static AssetBundle menuAssetBundle; public static GameObject menuPrefab; public static GameObject menuGameObject; public static EasySpawnerMenu menu = new EasySpawnerMenu(); public static EasySpawnerConfig config = new EasySpawnerConfig(); public static List<string> prefabNames = new List<string>(); private static List<string> playerNames = new List<string>(); public static Stack<List<GameObject>> spawnActions = new Stack<List<GameObject>>(); public const string assetBundleName = "EasySpawnerAssetBundle"; public const string favouritesFileName = "cooley.easyspawner.favouriteItems.txt"; public Harmony harmony; private void Awake() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown Debug.Log((object)"Easy spawner: Easy spawner loaded plugin"); harmony = new Harmony("cooley.easyspawner"); harmony.PatchAll(); config.ConfigFile = ((BaseUnityPlugin)this).Config; config.SetupConfig(); } private void Update() { if (!Object.op_Implicit((Object)(object)Player.m_localPlayer)) { return; } if (!IsAnyInputFocused() && config.IfMenuHotkeyPressed()) { if (!Object.op_Implicit((Object)(object)menuGameObject)) { CreateMenu(); } else { menuGameObject.SetActive(!menuGameObject.activeSelf); } } else if (Object.op_Implicit((Object)(object)menuGameObject)) { if (config.IfSpawnHotkeyPressed()) { Debug.Log((object)"Spawn hotkey pressed"); ((UnityEvent)menu.SpawnButton.onClick).Invoke(); } else if (config.IfUndoHotkeyPressed() && spawnActions.Count > 0) { UndoSpawn(); } } } private static bool IsAnyInputFocused() { if ((Object)(object)EventSystem.current == (Object)null) { return false; } GameObject currentSelectedGameObject = EventSystem.current.currentSelectedGameObject; if ((Object)(object)currentSelectedGameObject == (Object)null) { return false; } InputField component = currentSelectedGameObject.GetComponent<InputField>(); if ((Object)(object)component != (Object)null && component.isFocused) { return true; } Component component2 = currentSelectedGameObject.GetComponent("TMP_InputField"); if ((Object)(object)component2 == (Object)null) { return false; } PropertyInfo property = ((object)component2).GetType().GetProperty("isFocused"); return property != null && property.PropertyType == typeof(bool) && (bool)property.GetValue(component2); } public static AssetBundle GetAssetBundleFromResources(string fileName) { Assembly executingAssembly = Assembly.GetExecutingAssembly(); string name = executingAssembly.GetManifestResourceNames().Single((string str) => str.EndsWith(fileName)); using Stream stream = executingAssembly.GetManifestResourceStream(name); return AssetBundle.LoadFromStream(stream); } public static void LoadAsset(string assetFileName) { if (Object.op_Implicit((Object)(object)menuAssetBundle)) { Debug.Log((object)"Easy spawner: menu asset bundle already loaded"); return; } menuAssetBundle = GetAssetBundleFromResources(assetFileName); if (Object.op_Implicit((Object)(object)menuAssetBundle)) { Debug.Log((object)"Easy spawner: menu asset bundle loaded"); } else { Debug.Log((object)"Easy spawner: menu asset bundle failed to load"); } } public static string GetFavouritesFilePath() { return Path.Combine(Paths.ConfigPath, "cooley.easyspawner.favouriteItems.txt"); } public static void LoadFavourites() { Debug.Log((object)("Easy spawner: load favourite Items from file: " + GetFavouritesFilePath())); if (!File.Exists(GetFavouritesFilePath())) { return; } using StreamReader streamReader = File.OpenText(GetFavouritesFilePath()); while (!streamReader.EndOfStream) { string text = streamReader.ReadLine(); if (text == null || !EasySpawnerMenu.PrefabStates.ContainsKey(text)) { Debug.Log((object)("Easy spawner: favourite prefab '" + text + "' not found")); } else { EasySpawnerMenu.PrefabStates[text].isFavourite = true; } } } public static void SaveFavourites() { Debug.Log((object)("Easy spawner: save favourite Items to file: " + GetFavouritesFilePath())); using StreamWriter streamWriter = File.CreateText(GetFavouritesFilePath()); foreach (KeyValuePair<string, PrefabState> prefabState in EasySpawnerMenu.PrefabStates) { if (prefabState.Value.isFavourite) { streamWriter.WriteLine(prefabState.Key); } } } private static Transform FindGUIRoot() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); GameObject[] rootGameObjects = ((Scene)(ref activeScene)).GetRootGameObjects(); GameObject[] array = rootGameObjects; foreach (GameObject val in array) { string name = ((Object)val).name; if (name == "GuiRoot") { return val.transform.Find("GUI"); } if (name == "_GameMain") { return val.transform.Find("LoadingGUI"); } } return null; } private GameObject CreateCustomGUI(string name, int sortingOrder, Transform parent) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007e: 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_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name, new Type[5] { typeof(RectTransform), typeof(GuiPixelFix), typeof(Canvas), typeof(CanvasScaler), typeof(GraphicRaycaster) }); val.layer = 5; val.transform.SetParent(((Component)parent).transform, false); RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; component.anchoredPosition = Vector2.zero; Canvas component2 = val.GetComponent<Canvas>(); component2.additionalShaderChannels = (AdditionalCanvasShaderChannels)25; component2.renderMode = (RenderMode)0; component2.overrideSorting = true; component2.sortingOrder = sortingOrder; CanvasScaler component3 = val.GetComponent<CanvasScaler>(); component3.referencePixelsPerUnit = 50f; component3.uiScaleMode = (ScaleMode)1; return val; } private void CreateMenu() { //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)"Easy spawner: Loading menu prefab"); if (!Object.op_Implicit((Object)(object)menuAssetBundle)) { Debug.Log((object)"EasySpawner: Asset bundle not loaded"); return; } if (!Object.op_Implicit((Object)(object)menuPrefab)) { menuPrefab = menuAssetBundle.LoadAsset<GameObject>("EasySpawnerMenu"); } if (!Object.op_Implicit((Object)(object)menuPrefab)) { Debug.Log((object)"Easy spawner: Loading menu prefab failed"); return; } Debug.Log((object)"Easy spawner: Successfully loaded menu prefab"); if (!Object.op_Implicit((Object)(object)menuPrefab.GetComponent<UIElementDragger>())) { menuPrefab.AddComponent<UIElementDragger>(); } menuGameObject = Object.Instantiate<GameObject>(menuPrefab); Transform val = FindGUIRoot(); if (!Object.op_Implicit((Object)(object)val)) { Debug.Log((object)"Easy spawner: Couldnt find UI gameobject"); return; } GameObject val2 = CreateCustomGUI("easyspawnerCanvas", 2000, val); val2.transform.SetAsLastSibling(); menuGameObject.transform.SetParent(val2.transform, false); menuGameObject.transform.localScale = new Vector3(0.4f, 0.4f, 0.4f); menuGameObject.transform.localPosition = new Vector3(-250f, -25f, 0f); playerNames = GetPlayerNames(); menu.CreateMenu(menuGameObject); Style.ApplyAll(menuGameObject, menu); ((MonoBehaviour)menuGameObject.GetComponent<UIElementDragger>()).StartCoroutine(CheckForNewPlayersCoroutine()); } public static void SpawnPrefab(string prefabName, Player player, int amount = 1, int level = 1, bool pickup = false, bool ignoreStackSize = false) { //IL_0088: 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_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_0280: Unknown result type (might be due to invalid IL or missing references) //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)("Easy spawner: Trying to spawn " + prefabName)); GameObject prefab = ZNetScene.instance.GetPrefab(prefabName); if (!Object.op_Implicit((Object)(object)prefab)) { ((Character)Player.m_localPlayer).Message((MessageType)1, prefabName + " does not exist", 0, (Sprite)null); Debug.Log((object)("Easy spawner: spawning " + prefabName + " failed")); return; } List<GameObject> list = new List<GameObject>(); if (Object.op_Implicit((Object)(object)prefab.GetComponent<Character>())) { for (int i = 0; i < amount; i++) { GameObject val = Object.Instantiate<GameObject>(prefab, ((Component)player).transform.position + ((Component)player).transform.forward * 2f + Vector3.up, Quaternion.identity); Character component = val.GetComponent<Character>(); if (level > 1) { component.SetLevel(level); } list.Add(val); } } else if (Object.op_Implicit((Object)(object)prefab.GetComponent<ItemDrop>())) { ItemDrop component2 = prefab.GetComponent<ItemDrop>(); if (component2.m_itemData.IsEquipable()) { if (ignoreStackSize) { component2.m_itemData.m_stack = amount; amount = 1; } component2.m_itemData.m_quality = level; component2.m_itemData.m_durability = component2.m_itemData.GetMaxDurability(); for (int j = 0; j < amount; j++) { list.Add(SpawnItem(pickup, prefab, player)); } } else { int num = 1; int num2 = 0; if (ignoreStackSize) { component2.m_itemData.m_stack = amount; } else { int num3 = component2.m_itemData.m_shared.m_maxStackSize; if (num3 < 1) { num3 = 1; } component2.m_itemData.m_stack = num3; num = amount / num3; num2 = amount % num3; } for (int k = 0; k < num; k++) { list.Add(SpawnItem(pickup, prefab, player)); } if (num2 != 0) { component2.m_itemData.m_stack = num2; list.Add(SpawnItem(pickup, prefab, player)); } } component2.m_itemData.m_stack = 1; component2.m_itemData.m_quality = 1; } else { for (int l = 0; l < amount; l++) { list.Add(Object.Instantiate<GameObject>(prefab, ((Component)player).transform.position + ((Component)player).transform.forward * 2f, Quaternion.identity)); } } spawnActions.Push(list); ((Character)Player.m_localPlayer).Message((MessageType)1, "Spawning object " + prefabName, 0, (Sprite)null); Debug.Log((object)("Easy spawner: Spawned " + amount + " " + prefabName)); } private static GameObject SpawnItem(bool pickup, GameObject prefab, Player player) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002b: 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_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) if (pickup) { ((Humanoid)Player.m_localPlayer).PickupPrefab(prefab, 0, true); return null; } return Object.Instantiate<GameObject>(prefab, ((Component)player).transform.position + ((Component)player).transform.forward * 2f + Vector3.up, Quaternion.identity); } private void UndoSpawn() { Debug.Log((object)"Easyspawner: Undo spawn action"); if (spawnActions.Count <= 0) { return; } List<GameObject> list = spawnActions.Pop(); Debug.Log((object)("Easyspawner: Destroying " + list.Count + " objects")); string text = "objects"; foreach (GameObject item in list) { if ((Object)(object)item != (Object)null) { text = ((Object)item).name.Remove(((Object)item).name.Length - 7); ZNetView component = item.GetComponent<ZNetView>(); if (Object.op_Implicit((Object)(object)component) && component.IsValid() && component.IsOwner()) { component.Destroy(); } } } ((Character)Player.m_localPlayer).Message((MessageType)2, "Undo spawn of " + list.Count + " " + text, 0, (Sprite)null); Debug.Log((object)"Easyspawner: Spawn undone"); } private List<string> GetPlayerNames() { //IL_002b: 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_0033: Unknown result type (might be due to invalid IL or missing references) List<string> list = new List<string>(); if (Object.op_Implicit((Object)(object)ZNet.instance)) { foreach (PlayerInfo player in ZNet.instance.GetPlayerList()) { list.Add(player.m_name); } } return list; } private void PlayerListChanged() { Debug.Log((object)"EasySpawner: Player list changed, updating player dropdown"); playerNames = GetPlayerNames(); menu.RebuildPlayerDropdown(); } private IEnumerator CheckForNewPlayersCoroutine() { Debug.Log((object)"EasySpawner: Starting check for new players coroutine"); while (Object.op_Implicit((Object)(object)menuGameObject)) { yield return (object)new WaitForSeconds(3f); if (!menuGameObject.activeSelf || !Object.op_Implicit((Object)(object)ZNet.instance) || !Object.op_Implicit((Object)(object)Player.m_localPlayer)) { continue; } List<string> newPlayerNames = GetPlayerNames(); if (newPlayerNames.Count != playerNames.Count) { PlayerListChanged(); continue; } foreach (string name in newPlayerNames) { if (!playerNames.Contains(name)) { PlayerListChanged(); break; } } } Debug.Log((object)"EasySpawner: Stopping check for new players coroutine"); } public static void DestroyMenu() { Debug.Log((object)"Easy spawner: Easy spawner unloading assets"); if (Object.op_Implicit((Object)(object)menuGameObject)) { menu.Destroy(); Object.Destroy((Object)(object)menuGameObject); } menuPrefab = null; if (Object.op_Implicit((Object)(object)menuAssetBundle)) { menuAssetBundle.Unload(true); } Debug.Log((object)"Easy spawner: Easy spawner unloaded assets"); } private void OnDestroy() { ((MonoBehaviour)this).StopAllCoroutines(); if ((Object)(object)menuGameObject != (Object)null) { DestroyMenu(); } if (harmony != null) { harmony.UnpatchSelf(); } } } } namespace EasySpawner.UI { public class EasySpawnerMenu { public Dropdown PlayerDropdown; public InputField SearchField; public InputField AmountField; public InputField LevelField; public Toggle PutInInventoryToggle; public Toggle IgnoreStackSizeToggle; public Toggle FavouritesOnlyToggle; public Button SpawnButton; public Text SpawnText; public Text UndoText; public Text CloseText; public ScrollRect PrefabScrollView; public PrefabItem[] PrefabItems; public Queue<PrefabItem> PrefabItemPool = new Queue<PrefabItem>(); public string SelectedPrefabName; public static Dictionary<string, PrefabState> PrefabStates = new Dictionary<string, PrefabState>(); public List<string> SearchItems = new List<string>(); public const float BaseMenuScale = 0.4f; public void CreateMenu(GameObject menuGameObject) { //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Expected O, but got Unknown PlayerDropdown = ((Component)menuGameObject.transform.Find("PlayerDropdown")).GetComponent<Dropdown>(); PrefabScrollView = ((Component)menuGameObject.transform.Find("PrefabScrollView")).GetComponent<ScrollRect>(); SearchField = ((Component)menuGameObject.transform.Find("SearchInputField")).GetComponent<InputField>(); ((UnityEvent<string>)(object)SearchField.onValueChanged).AddListener((UnityAction<string>)delegate { RebuildPrefabDropdown(); }); AmountField = ((Component)menuGameObject.transform.Find("AmountInputField")).GetComponent<InputField>(); LevelField = ((Component)menuGameObject.transform.Find("LevelInputField")).GetComponent<InputField>(); PutInInventoryToggle = ((Component)menuGameObject.transform.Find("PutInInventoryToggle")).GetComponent<Toggle>(); IgnoreStackSizeToggle = ((Component)menuGameObject.transform.Find("IgnoreStackSizeToggle")).GetComponent<Toggle>(); FavouritesOnlyToggle = ((Component)menuGameObject.transform.Find("FavouritesOnlyToggle")).GetComponent<Toggle>(); ((UnityEvent<bool>)(object)FavouritesOnlyToggle.onValueChanged).AddListener((UnityAction<bool>)delegate { RebuildPrefabDropdown(); }); SpawnButton = ((Component)menuGameObject.transform.Find("SpawnButton")).GetComponent<Button>(); ((UnityEvent)SpawnButton.onClick).AddListener(new UnityAction(SpawnButtonPress)); Transform val = menuGameObject.transform.Find("HotkeyText"); SpawnText = ((Component)val.Find("SpawnText")).GetComponent<Text>(); UndoText = ((Component)val.Find("UndoText")).GetComponent<Text>(); CloseText = ((Component)val.Find("CloseText")).GetComponent<Text>(); EasySpawnerConfig config = EasySpawnerPlugin.config; if (config.SpawnHotkeyModifierSet) { SpawnText.text = "Spawn: " + config.FirstSpawnHotkeyModifier.Value + " + " + config.FirstSpawnHotkey.Value; } else { SpawnText.text = "Spawn: " + config.FirstSpawnHotkey.Value; } if (config.UndoHotkeyModifierSet) { UndoText.text = "Undo: " + config.UndoHotkeyModifier.Value + " + " + config.UndoHotkey.Value; } else { UndoText.text = "Undo: " + config.UndoHotkey.Value; } if (config.OpenHotkeyModifierSet) { CloseText.text = "Open: " + config.FirstOpenHotkeyModifier.Value + " + " + config.FirstOpenHotkey.Value; } else { CloseText.text = "Open: " + config.FirstOpenHotkey.Value; } UpdateMenuSize(null, null); config.UIWidth.SettingChanged += UpdateMenuSize; UpdateMenuScale(null, null); config.UIScale.SettingChanged += UpdateMenuScale; PlayerDropdown.ClearOptions(); RebuildPlayerDropdown(); PrefabItems = new PrefabItem[20]; PrefabItem prefabItem = ((Component)((Transform)PrefabScrollView.content).GetChild(0)).gameObject.AddComponent<PrefabItem>(); ((Component)prefabItem).gameObject.SetActive(false); for (int i = 0; i < 20; i++) { GameObject val2 = Object.Instantiate<GameObject>(((Component)prefabItem).gameObject, (Transform)(object)PrefabScrollView.content); PrefabItem component = val2.GetComponent<PrefabItem>(); component.Init(SelectPrefab, FavouritePrefab); PoolPrefabItem(component); PrefabItems[i] = component; } ((UnityEvent<Vector2>)(object)PrefabScrollView.onValueChanged).AddListener((UnityAction<Vector2>)UpdateItemPrefabPool); RebuildPrefabDropdown(); } private void UpdateMenuSize(object sender, EventArgs e) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) RectTransform val = (RectTransform)EasySpawnerPlugin.menuGameObject.transform; val.sizeDelta = new Vector2(EasySpawnerPlugin.config.UIWidth.Value, val.sizeDelta.y); } private void UpdateMenuScale(object sender, EventArgs e) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) Transform transform = EasySpawnerPlugin.menuGameObject.transform; float num = Mathf.Clamp(EasySpawnerPlugin.config.UIScale.Value, 0.5f, 2.5f); float num2 = 0.4f * num; transform.localScale = new Vector3(num2, num2, num2); } public void PoolPrefabItem(PrefabItem item) { item.Pool(); PrefabItemPool.Enqueue(item); } public void PoolAllPrefabItems() { PrefabItem[] prefabItems = PrefabItems; foreach (PrefabItem item in prefabItems) { if (!PrefabItemPool.Contains(item)) { PoolPrefabItem(item); } } } public void UpdateItemPrefabPool(Vector2 slider) { //IL_0032: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_007b: 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_009a: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) PrefabScrollView.content.SetSizeWithCurrentAnchors((Axis)1, (float)(SearchItems.Count - 1) * 20f); Rect rect = ((Component)PrefabScrollView).GetComponent<RectTransform>().rect; Vector2 anchoredPosition = PrefabScrollView.content.anchoredPosition; PrefabItem[] prefabItems = PrefabItems; foreach (PrefabItem prefabItem in prefabItems) { if (!PrefabItemPool.Contains(prefabItem)) { float y = prefabItem.rectTransform.anchoredPosition.y; if (y > 0f - anchoredPosition.y + 20f || y < 0f - anchoredPosition.y - ((Rect)(ref rect)).height - 20f) { PoolPrefabItem(prefabItem); } } } int num = Mathf.Max(0, Mathf.CeilToInt((anchoredPosition.y - 20f) / 20f)); int num2 = Mathf.CeilToInt((((Rect)(ref rect)).height + 40f) / 20f); int i; for (i = num; i < Mathf.Min(num + num2, SearchItems.Count); i++) { if (!PrefabItems.Any((PrefabItem x) => x.posIndex == i) && PrefabItemPool.Count > 0) { PrefabItem prefabItem2 = PrefabItemPool.Dequeue(); prefabItem2.rectTransform.anchoredPosition = new Vector2(0f, (float)(-i * 20) - 10f); prefabItem2.posIndex = i; prefabItem2.SetName(SearchItems[i]); prefabItem2.toggle.SetIsOnWithoutNotify(SelectedPrefabName == prefabItem2.GetName()); prefabItem2.SetFavouriteOn(PrefabStates[prefabItem2.GetName()].isFavourite, silent: true); ((Component)prefabItem2).gameObject.SetActive(true); } } } private void SelectPrefab(PrefabItem caller) { PrefabItem[] prefabItems = PrefabItems; foreach (PrefabItem prefabItem in prefabItems) { prefabItem.toggle.SetIsOnWithoutNotify((Object)(object)prefabItem == (Object)(object)caller); } SelectedPrefabName = (((Object)(object)caller != (Object)null) ? caller.GetName() : null); } private void FavouritePrefab(bool favourite, PrefabItem caller) { string name = caller.GetName(); PrefabStates[name].isFavourite = favourite; EasySpawnerPlugin.SaveFavourites(); RebuildPrefabDropdown(); } public void RebuildPlayerDropdown() { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Expected O, but got Unknown //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: 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_009b: 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) //IL_00ab: Expected O, but got Unknown if (Object.op_Implicit((Object)(object)PlayerDropdown) && Object.op_Implicit((Object)(object)ZNet.instance) && Object.op_Implicit((Object)(object)Player.m_localPlayer)) { PlayerDropdown.ClearOptions(); PlayerDropdown.options.Add(new OptionData(Player.m_localPlayer.GetPlayerName())); { foreach (PlayerInfo player in ZNet.instance.GetPlayerList()) { if (player.m_name != Player.m_localPlayer.GetPlayerName()) { PlayerDropdown.options.Add(new OptionData(player.m_name)); } } return; } } Debug.Log((object)"EasySpawner: Cannot rebuild player dropdown"); } private void SpawnButtonPress() { if (SelectedPrefabName == null) { return; } string selectedPrefabName = SelectedPrefabName; bool pickup = PutInInventoryToggle.isOn; bool isOn = IgnoreStackSizeToggle.isOn; Player val = Player.m_localPlayer; if (!int.TryParse(AmountField.text, out var result) || result < 1) { result = 1; } if (!int.TryParse(LevelField.text, out var result2) || result2 < 1) { result2 = 1; } if (!PlayerDropdown.options[PlayerDropdown.value].text.Equals(val.GetPlayerName())) { pickup = false; foreach (Player allPlayer in Player.GetAllPlayers()) { if (allPlayer.GetPlayerName().Equals(PlayerDropdown.options[PlayerDropdown.value].text)) { val = allPlayer; break; } } } EasySpawnerPlugin.SpawnPrefab(selectedPrefabName, val, result, result2, pickup, isOn); } public void RebuildPrefabDropdown() { //IL_0136: Unknown result type (might be due to invalid IL or missing references) SelectPrefab(null); SearchItems.Clear(); Parallel.ForEach(EasySpawnerPlugin.prefabNames, delegate(string name) { bool flag = name.IndexOf(SearchField.text, StringComparison.OrdinalIgnoreCase) >= 0; string localizedName = PrefabStates[name].localizedName; flag = flag || (localizedName.Length > 0 && localizedName.IndexOf(SearchField.text, StringComparison.OrdinalIgnoreCase) >= 0); PrefabStates[name].isSearched = flag; }); foreach (string prefabName in EasySpawnerPlugin.prefabNames) { PrefabState prefabState = PrefabStates[prefabName]; if (prefabState.isSearched && prefabState.isFavourite) { SearchItems.Add(prefabName); } } if (!FavouritesOnlyToggle.isOn) { foreach (string prefabName2 in EasySpawnerPlugin.prefabNames) { PrefabState prefabState2 = PrefabStates[prefabName2]; if (prefabState2.isSearched && !prefabState2.isFavourite) { SearchItems.Add(prefabName2); } } } PoolAllPrefabItems(); UpdateItemPrefabPool(new Vector2(PrefabScrollView.horizontalScrollbar.value, PrefabScrollView.verticalScrollbar.value)); } public void Destroy() { ((UnityEventBase)PrefabScrollView.onValueChanged).RemoveAllListeners(); ((UnityEventBase)SearchField.onValueChanged).RemoveAllListeners(); ((UnityEventBase)SpawnButton.onClick).RemoveAllListeners(); PrefabItems = null; PrefabItemPool = new Queue<PrefabItem>(); EasySpawnerPlugin.config.UIWidth.SettingChanged -= UpdateMenuSize; EasySpawnerPlugin.config.UIScale.SettingChanged -= UpdateMenuScale; } } public class PrefabItem : MonoBehaviour { public RectTransform rectTransform; public Toggle toggle; public int posIndex = -1; private Text label; private Toggle favourite; private string itemName; private Color starOnColor = new Color(1f, 40f / 51f, 0.16078432f); private Color starOffColor = new Color(0.6039216f, 0.6039216f, 0.6039216f); public void Init(Action<PrefabItem> selectPrefabCall, Action<bool, PrefabItem> favouritePrefabCall) { rectTransform = ((Component)this).GetComponent<RectTransform>(); toggle = ((Component)this).GetComponent<Toggle>(); label = ((Component)((Component)this).transform.Find("ItemLabel")).GetComponent<Text>(); favourite = ((Component)((Component)this).transform.Find("Star")).GetComponent<Toggle>(); toggle.isOn = false; ((UnityEvent<bool>)(object)toggle.onValueChanged).AddListener((UnityAction<bool>)delegate { selectPrefabCall(this); }); SetFavouriteOn(on: false, silent: false); ((UnityEvent<bool>)(object)favourite.onValueChanged).AddListener((UnityAction<bool>)delegate(bool on) { favouritePrefabCall(on, this); }); } public void SetFavouriteOn(bool on, bool silent) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) if (silent) { favourite.SetIsOnWithoutNotify(on); } else { favourite.isOn = on; } ((Selectable)favourite).targetGraphic.color = (on ? starOnColor : starOffColor); } public void Pool() { ((Component)this).gameObject.SetActive(false); posIndex = -1; toggle.SetIsOnWithoutNotify(false); SetFavouriteOn(on: false, silent: true); } public void SetName(string itemName) { this.itemName = itemName; string localizedName = EasySpawnerMenu.PrefabStates[itemName].localizedName; label.text = ((localizedName.Length > 0) ? (localizedName + " (" + itemName + ")") : itemName); } public string GetName() { return itemName; } } public class PrefabState { public bool isSearched; public bool isFavourite; public string localizedName; } public static class Style { private static Font averiaSerif; private static Font averiaSerifBold; public static void ApplyAll(GameObject root, EasySpawnerMenu menu) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) FindFonds(); ApplyPanel(root.GetComponent<Image>()); Text[] componentsInChildren = root.GetComponentsInChildren<Text>(true); foreach (Text text in componentsInChildren) { ApplyText(text, new Color(73f / 85f, 73f / 85f, 73f / 85f)); } InputField[] componentsInChildren2 = root.GetComponentsInChildren<InputField>(true); foreach (InputField inputField in componentsInChildren2) { ApplyInputField(inputField); } Button[] componentsInChildren3 = root.GetComponentsInChildren<Button>(true); foreach (Button button in componentsInChildren3) { ApplyButton(button); } Toggle[] componentsInChildren4 = root.GetComponentsInChildren<Toggle>(true); foreach (Toggle toggle in componentsInChildren4) { ApplyToogle(toggle); } ScrollRect[] componentsInChildren5 = root.GetComponentsInChildren<ScrollRect>(true); foreach (ScrollRect scrollRect in componentsInChildren5) { ApplyScrollRect(scrollRect); } Dropdown[] componentsInChildren6 = root.GetComponentsInChildren<Dropdown>(true); foreach (Dropdown dropdown in componentsInChildren6) { ApplyDropdown(dropdown); } } public static void ApplyPanel(Image image) { image.sprite = GetSprite("woodpanel_settings"); } public static void ApplyText(Text text, Color color) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 //IL_0035: Unknown result type (might be due to invalid IL or missing references) if ((int)text.fontStyle == 1) { text.font = averiaSerifBold; text.fontStyle = (FontStyle)0; } else { text.font = averiaSerif; } ((Graphic)text).color = color; } public static void ApplyInputField(InputField inputField) { ((Component)inputField).GetComponent<Image>().sprite = GetSprite("text_field"); } public static void ApplyButton(Button button) { ((Component)button).GetComponent<Image>().sprite = GetSprite("button"); } public static void ApplyToogle(Toggle toggle) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0101: 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_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) switch (((Object)((Component)toggle).gameObject).name) { case "_Template": case "_Template(Clone)": ((Image)((Selectable)toggle).targetGraphic).sprite = GetSprite("button"); ((Image)((Selectable)toggle).targetGraphic).type = (Type)1; ((Image)((Selectable)toggle).targetGraphic).pixelsPerUnitMultiplier = 2f; break; default: ((Image)((Selectable)toggle).targetGraphic).sprite = GetSprite("checkbox"); ((Image)((Selectable)toggle).targetGraphic).type = (Type)1; ((Image)((Selectable)toggle).targetGraphic).pixelsPerUnitMultiplier = 2f; break; case "Star": case "Star(Clone)": break; } if ((Object)(object)toggle.graphic != (Object)null) { ((Graphic)((Component)toggle.graphic).GetComponent<Image>()).color = new Color(1f, 0.678f, 0.103f, 1f); ((Component)toggle.graphic).GetComponent<Image>().sprite = GetSprite("checkbox_marker"); ((MaskableGraphic)((Component)toggle.graphic).GetComponent<Image>()).maskable = true; } } public static void ApplyScrollRect(ScrollRect scrollRect) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) ((Component)scrollRect).GetComponent<Image>().sprite = GetSprite("item_background_sunken"); if (Object.op_Implicit((Object)(object)scrollRect.horizontalScrollbar)) { ((Image)((Selectable)scrollRect.horizontalScrollbar).targetGraphic).sprite = GetSprite("text_field"); ((Graphic)(Image)((Selectable)scrollRect.horizontalScrollbar).targetGraphic).color = Color.grey; ((Image)((Selectable)scrollRect.horizontalScrollbar).targetGraphic).type = (Type)1; ((Image)((Selectable)scrollRect.horizontalScrollbar).targetGraphic).pixelsPerUnitMultiplier = 2f; ((Component)scrollRect.horizontalScrollbar).GetComponent<Image>().sprite = GetSprite("text_field"); ((Component)scrollRect.horizontalScrollbar).GetComponent<Image>().pixelsPerUnitMultiplier = 3f; } if (Object.op_Implicit((Object)(object)scrollRect.verticalScrollbar)) { ((Image)((Selectable)scrollRect.verticalScrollbar).targetGraphic).sprite = GetSprite("text_field"); ((Graphic)(Image)((Selectable)scrollRect.verticalScrollbar).targetGraphic).color = Color.grey; ((Image)((Selectable)scrollRect.verticalScrollbar).targetGraphic).type = (Type)1; ((Image)((Selectable)scrollRect.verticalScrollbar).targetGraphic).pixelsPerUnitMultiplier = 2f; ((Component)scrollRect.verticalScrollbar).GetComponent<Image>().sprite = GetSprite("text_field"); ((Component)scrollRect.verticalScrollbar).GetComponent<Image>().pixelsPerUnitMultiplier = 3f; } } public static void ApplyDropdown(Dropdown dropdown) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) ((Image)((Selectable)dropdown).targetGraphic).sprite = GetSprite("button"); ApplyScrollRect(((Component)dropdown.template).GetComponent<ScrollRect>()); } public static Sprite GetSprite(string name) { return ((IEnumerable<Sprite>)Resources.FindObjectsOfTypeAll<Sprite>()).FirstOrDefault((Func<Sprite, bool>)((Sprite x) => ((Object)x).name == name)); } private static void FindFonds() { Font[] source = Resources.FindObjectsOfTypeAll<Font>(); averiaSerif = ((IEnumerable<Font>)source).FirstOrDefault((Func<Font, bool>)((Font x) => ((Object)x).name == "AveriaSerifLibre-Regular")); averiaSerifBold = ((IEnumerable<Font>)source).FirstOrDefault((Func<Font, bool>)((Font x) => ((Object)x).name == "AveriaSerifLibre-Bold")); } } public class UIElementDragger : MonoBehaviour, IDragHandler, IEventSystemHandler, IBeginDragHandler { private RectTransform window; private Vector2 delta; private void Awake() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown window = (RectTransform)((Component)this).transform; } public void OnBeginDrag(PointerEventData eventData) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: 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) delta = Vector2.op_Implicit(Input.mousePosition - ((Transform)window).position); } public void OnDrag(PointerEventData eventData) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0025: 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) //IL_003d: 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_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0087: 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) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) Vector2 val = eventData.position - delta; Rect rect = window.rect; Vector2 val2 = Vector2.op_Implicit(((Transform)window).lossyScale); float num = ((Rect)(ref rect)).width / 2f * val2.x; float num2 = (float)Screen.width - num; float num3 = ((Rect)(ref rect)).height / 2f * val2.y; float num4 = (float)Screen.height - num3; val.x = Mathf.Clamp(val.x, num, num2); val.y = Mathf.Clamp(val.y, num3, num4); ((Component)this).transform.position = Vector2.op_Implicit(val); } } } namespace EasySpawner.Patches { [HarmonyPatch(typeof(DungeonDB), "Start")] internal class DungeonDB_Start_Patch { private static void Postfix() { Debug.Log((object)"Easy spawner: Easy spawner loading assets"); EasySpawnerPlugin.LoadAsset("EasySpawnerAssetBundle"); Debug.Log((object)"Easy spawner: Easy spawner loaded assets"); if (EasySpawnerPlugin.prefabNames.Count != 0) { return; } if (!Object.op_Implicit((Object)(object)ZNetScene.instance)) { Debug.LogError((object)"EasySpawner: Can't load prefab due to ZNetScene.instance is null"); return; } ItemDrop val = default(ItemDrop); Piece val2 = default(Piece); foreach (GameObject prefab in ZNetScene.instance.m_prefabs) { string localizedName = ""; if (prefab.TryGetComponent<ItemDrop>(ref val)) { localizedName = Localization.instance.Localize(val.m_itemData.m_shared.m_name).Trim(); } if (prefab.TryGetComponent<Piece>(ref val2)) { localizedName = Localization.instance.Localize(val2.m_name).Trim(); } EasySpawnerPlugin.prefabNames.Add(((Object)prefab).name); EasySpawnerMenu.PrefabStates.Add(((Object)prefab).name, new PrefabState { localizedName = localizedName }); } EasySpawnerPlugin.prefabNames.Sort(NameComparator); EasySpawnerPlugin.LoadFavourites(); } private static string GetPrimaryName(string key) { string localizedName = EasySpawnerMenu.PrefabStates[key].localizedName; return (localizedName.Length > 0) ? localizedName : key; } private static int NameComparator(string a, string b) { return string.Compare(GetPrimaryName(a), GetPrimaryName(b), StringComparison.InvariantCultureIgnoreCase); } } [HarmonyPatch] public static class ZInputPatcher { public static bool EasySpawnerIsFocused() { if ((Object)(object)EasySpawnerPlugin.menuGameObject == (Object)null || !EasySpawnerPlugin.menuGameObject.activeSelf) { return false; } return EasySpawnerPlugin.menu.SearchField.isFocused || EasySpawnerPlugin.menu.AmountField.isFocused || EasySpawnerPlugin.menu.LevelField.isFocused; } [HarmonyPatch(typeof(ZInput), "GetButtonDown")] [HarmonyPostfix] public static void GetButtonDownPatch(ref bool __result) { if (EasySpawnerIsFocused()) { __result = false; } } [HarmonyPatch(typeof(ZInput), "GetButtonUp")] [HarmonyPostfix] public static void GetButtonUpPatch(ref bool __result) { if (EasySpawnerIsFocused()) { __result = false; } } [HarmonyPatch(typeof(ZInput), "GetButton")] [HarmonyPostfix] public static void GetButtonPatch(ref bool __result) { if (EasySpawnerIsFocused()) { __result = false; } } } [HarmonyPatch(typeof(ZNetScene), "Shutdown")] internal class ZNetSceneShutdownPatch { private static void Prefix() { EasySpawnerPlugin.DestroyMenu(); } } } namespace EasySpawner.Config { public class EasySpawnerConfig { public ConfigEntry<string> FirstOpenHotkey; public ConfigEntry<string> FirstOpenHotkeyModifier; public ConfigEntry<string> SecondOpenHotkey; public ConfigEntry<string> FirstSpawnHotkey; public ConfigEntry<string> FirstSpawnHotkeyModifier; public ConfigEntry<string> SecondSpawnHotkey; public ConfigEntry<string> UndoHotkey; public ConfigEntry<string> UndoHotkeyModifier; public ConfigEntry<float> UIWidth; public ConfigEntry<float> UIScale; public bool OpenHotkeyModifierSet; public bool SpawnHotkeyModifierSet; public bool UndoHotkeyModifierSet; public ConfigFile ConfigFile { get; set; } public void SetupConfig() { FirstOpenHotkey = ConfigFile.Bind<string>("Hotkeys", "firstOpenHotkey", "/", "Main hotkey to show/hide the menu. To find appropriate hotkeys use https://answers.unity.com/questions/762073/c-list-of-string-name-for-inputgetkeystring-name.html"); FirstOpenHotkeyModifier = ConfigFile.Bind<string>("Hotkeys", "firstOpenHotkeyModifier", "", "Optional Modifier to the firstOpenHotkey. Setting this will mean you have to press firstOpenHotkey + firstOpenHotkeyModifier to open/hide the menu. E.g. set this to left alt"); SecondOpenHotkey = ConfigFile.Bind<string>("Hotkeys", "secondOpenHotkey", "[/]", "Secondary hotkey to show/hide the menu"); FirstSpawnHotkey = ConfigFile.Bind<string>("Hotkeys", "firstSpawnHotkey", "=", "Main hotkey to spawn selected prefab"); FirstSpawnHotkeyModifier = ConfigFile.Bind<string>("Hotkeys", "firstSpawnHotkeyModifier", "", "Optional Modifier to the firstSpawnHotkey. Setting this will mean you have to press firstSpawnHotkey + firstSpawnHotkeyModifier to spawn selected prefab. E.g. set this to left alt"); SecondSpawnHotkey = ConfigFile.Bind<string>("Hotkeys", "secondSpawnHotkey", "[+]", "Secondary hotkey to spawn selected prefab"); UndoHotkey = ConfigFile.Bind<string>("Hotkeys", "UndoHotkey", "z", "Hotkey to Undo last spawn"); UndoHotkeyModifier = ConfigFile.Bind<string>("Hotkeys", "UndoHotkeyModifier", "left ctrl", "Modifier to Undo hotkey"); UIWidth = ConfigFile.Bind<float>("UI", "MenuWidth", 600f, "Width of the menu"); UIScale = ConfigFile.Bind<float>("UI", "MenuScale", 1f, "Scale of the menu UI (1.0 = default)"); FirstOpenHotkey.Value = FirstOpenHotkey.Value.ToLower(); FirstOpenHotkeyModifier.Value = FirstOpenHotkeyModifier.Value.ToLower(); SecondOpenHotkey.Value = SecondOpenHotkey.Value.ToLower(); FirstSpawnHotkey.Value = FirstSpawnHotkey.Value.ToLower(); FirstSpawnHotkeyModifier.Value = FirstSpawnHotkeyModifier.Value.ToLower(); SecondSpawnHotkey.Value = SecondSpawnHotkey.Value.ToLower(); UndoHotkey.Value = UndoHotkey.Value.ToLower(); UndoHotkeyModifier.Value = UndoHotkeyModifier.Value.ToLower(); OpenHotkeyModifierSet = !string.IsNullOrWhiteSpace(FirstOpenHotkeyModifier.Value); SpawnHotkeyModifierSet = !string.IsNullOrWhiteSpace(FirstSpawnHotkeyModifier.Value); UndoHotkeyModifierSet = !string.IsNullOrWhiteSpace(UndoHotkeyModifier.Value); } public bool IfUndoHotkeyPressed() { if (!UndoHotkeyModifierSet) { return Input.GetKeyDown(UndoHotkey.Value); } return Input.GetKey(UndoHotkeyModifier.Value) && Input.GetKeyDown(UndoHotkey.Value); } public bool IfMenuHotkeyPressed() { if (!OpenHotkeyModifierSet) { return Input.GetKeyDown(FirstOpenHotkey.Value) || Input.GetKeyDown(SecondOpenHotkey.Value); } return (Input.GetKey(FirstOpenHotkeyModifier.Value) && Input.GetKeyDown(FirstOpenHotkey.Value)) || Input.GetKeyDown(SecondOpenHotkey.Value); } public bool IfSpawnHotkeyPressed() { if (!SpawnHotkeyModifierSet) { return Input.GetKeyDown(FirstSpawnHotkey.Value) || Input.GetKeyDown(SecondSpawnHotkey.Value); } return (Input.GetKey(FirstSpawnHotkeyModifier.Value) && Input.GetKeyDown(FirstSpawnHotkey.Value)) || Input.GetKeyDown(SecondSpawnHotkey.Value); } } }