using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using TMPro;
using UnityEngine;
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("ExtendedPlayerInventory")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ExtendedPlayerInventory")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("ab1e5ca2-0722-4a12-99b5-9ea15c00b532")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyVersion("1.0.0.0")]
public class AedenthornUtils
{
public static bool IgnoreKeyPresses(bool extra = false)
{
int result;
if (!extra)
{
if (!((Object)(object)ZNetScene.instance == (Object)null) && !((Object)(object)Player.m_localPlayer == (Object)null) && !Minimap.IsOpen() && !Console.IsVisible() && !TextInput.IsVisible() && !ZNet.instance.InPasswordDialog())
{
Chat instance = Chat.instance;
if (instance == null || !instance.HasFocus())
{
result = (Menu.IsVisible() ? 1 : 0);
goto IL_005f;
}
}
result = 1;
goto IL_005f;
}
int result2;
if (!((Object)(object)ZNetScene.instance == (Object)null) && !((Object)(object)Player.m_localPlayer == (Object)null) && !Minimap.IsOpen() && !Console.IsVisible() && !TextInput.IsVisible() && !ZNet.instance.InPasswordDialog())
{
Chat instance2 = Chat.instance;
if ((instance2 == null || !instance2.HasFocus()) && !StoreGui.IsVisible() && !InventoryGui.IsVisible() && !Menu.IsVisible())
{
TextViewer instance3 = TextViewer.instance;
result2 = ((instance3 != null && instance3.IsVisible()) ? 1 : 0);
goto IL_00d9;
}
}
result2 = 1;
goto IL_00d9;
IL_005f:
return (byte)result != 0;
IL_00d9:
return (byte)result2 != 0;
}
public static bool CheckKeyDown(string value)
{
try
{
return Input.GetKeyDown(value.ToLower());
}
catch
{
return false;
}
}
public static bool CheckKeyHeld(string value, bool req = true)
{
try
{
return Input.GetKey(value.ToLower());
}
catch
{
return !req;
}
}
}
namespace ExtendedPlayerInventory;
[BepInPlugin("aedenthorn.ExtendedPlayerInventory", "Extended Player Inventory", "0.9.1")]
public class BepInExPlugin : BaseUnityPlugin
{
[HarmonyPatch(typeof(Player), "Awake")]
private static class Player_Awake_Patch
{
private static void Prefix(Player __instance, Inventory ___m_inventory)
{
if (modEnabled.Value)
{
Dbgl("Player_Awake");
int num = extraRows.Value + (addEquipmentRow.Value ? 5 : 4);
AccessTools.FieldRefAccess<Inventory, int>(___m_inventory, "m_height") = num;
__instance.m_tombstone.GetComponent<Container>().m_height = num;
}
}
}
[HarmonyPatch(typeof(TombStone), "Awake")]
private static class TombStone_Awake_Patch
{
private static void Prefix(TombStone __instance)
{
if (modEnabled.Value)
{
Dbgl("TombStone_Awake");
int height = extraRows.Value + (addEquipmentRow.Value ? 5 : 4);
((Component)__instance).GetComponent<Container>().m_height = height;
}
}
}
[HarmonyPatch(typeof(TombStone), "Interact")]
private static class TombStone_Interact_Patch
{
private static void Prefix(TombStone __instance, Container ___m_container)
{
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Expected O, but got Unknown
if (modEnabled.Value)
{
Dbgl("TombStone_Interact");
int height = extraRows.Value + (addEquipmentRow.Value ? 5 : 4);
((Component)__instance).GetComponent<Container>().m_height = height;
Traverse val = Traverse.Create((object)___m_container);
string @string = val.Field("m_nview").GetValue<ZNetView>().GetZDO()
.GetString("items", "");
if (!string.IsNullOrEmpty(@string))
{
ZPackage val2 = new ZPackage(@string);
val.Field("m_loading").SetValue((object)true);
val.Field("m_inventory").GetValue<Inventory>().Load(val2);
val.Field("m_loading").SetValue((object)false);
val.Field("m_lastDataString").SetValue((object)@string);
}
}
}
}
[HarmonyPatch(typeof(Inventory), "MoveInventoryToGrave")]
private static class MoveInventoryToGrave_Patch
{
private static void Postfix(Inventory __instance, Inventory original)
{
if (modEnabled.Value)
{
Dbgl("MoveInventoryToGrave");
Dbgl($"inv: {__instance.GetHeight()} orig: {original.GetHeight()}");
}
}
}
[HarmonyPatch(typeof(InventoryGui), "Show")]
private static class InventoryGui_Show_Patch
{
private static void Postfix(InventoryGui __instance)
{
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
if (modEnabled.Value && addEquipmentRow.Value && Object.op_Implicit((Object)(object)Player.m_localPlayer))
{
Dbgl("InventoryGui Show");
ArrangeEquipment(Player.m_localPlayer);
if (displayEquipmentRowSeparate.Value && (Object)(object)((Transform)__instance.m_player).Find("EquipmentBkg") == (Object)null)
{
Transform val = Object.Instantiate<Transform>(((Transform)__instance.m_player).Find("Bkg"), (Transform)(object)__instance.m_player);
val.SetAsFirstSibling();
((Object)val).name = "EquipmentBkg";
((Component)val).GetComponent<RectTransform>().anchorMin = new Vector2(1f, 0f);
((Component)val).GetComponent<RectTransform>().anchorMax = new Vector2(1.5f, 1f);
}
else if (!displayEquipmentRowSeparate.Value && Object.op_Implicit((Object)(object)((Transform)__instance.m_player).Find("EquipmentBkg")))
{
Object.Destroy((Object)(object)((Component)((Transform)__instance.m_player).Find("EquipmentBkg")).gameObject);
}
}
}
}
[HarmonyPatch(typeof(Inventory), "Changed")]
private static class Inventory_Changed_Patch
{
private static void Postfix(Inventory __instance)
{
if (modEnabled.Value && addEquipmentRow.Value && Object.op_Implicit((Object)(object)Player.m_localPlayer) && __instance == ((Humanoid)Player.m_localPlayer).GetInventory())
{
int num = extraRows.Value + (addEquipmentRow.Value ? 5 : 4);
AccessTools.FieldRefAccess<Inventory, int>(__instance, "m_height") = num;
ArrangeEquipment(Player.m_localPlayer);
}
}
}
[HarmonyPatch(typeof(Humanoid), "SetupEquipment")]
private static class Humanoid_SetupEquipment_Patch
{
private static void Postfix(Humanoid __instance)
{
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Expected O, but got Unknown
if (modEnabled.Value && addEquipmentRow.Value && __instance is Player && (!((Object)(object)__instance != (Object)(object)Player.m_localPlayer) || (showGearInMenu.Value && !((Object)(object)Player.m_localPlayer != (Object)null))))
{
ArrangeEquipment((Player)__instance);
}
}
}
[HarmonyPatch(typeof(Humanoid), "UnequipItem")]
private static class Humanoid_UnequipItem_Patch
{
private static void Postfix(Humanoid __instance, ItemData item)
{
}
}
[HarmonyPatch(typeof(Player), "EquipInventoryItems")]
private static class Humanoid_EquipItem_Patch
{
private static void Postfix(Player __instance)
{
ArrangeEquipment(__instance);
}
}
[HarmonyPatch(typeof(Player), "Update")]
private static class Player_Update_Patch
{
private static void Postfix(Player __instance, Inventory ___m_inventory)
{
if (!modEnabled.Value)
{
return;
}
int num = extraRows.Value + (addEquipmentRow.Value ? 5 : 4);
AccessTools.FieldRefAccess<Inventory, int>(___m_inventory, "m_height") = num;
__instance.m_tombstone.GetComponent<Container>().m_height = num;
if (AedenthornUtils.IgnoreKeyPresses(extra: true) || !addEquipmentRow.Value)
{
return;
}
int num2;
if (AedenthornUtils.CheckKeyDown(hotKey1.Value))
{
num2 = 1;
}
else if (AedenthornUtils.CheckKeyDown(hotKey2.Value))
{
num2 = 2;
}
else
{
if (!AedenthornUtils.CheckKeyDown(hotKey3.Value))
{
return;
}
num2 = 3;
}
Dbgl($"Pressed hotkey {num2}");
ItemData itemAt = ___m_inventory.GetItemAt(num2 + 4, ___m_inventory.GetHeight() - 1);
if (itemAt != null)
{
((Humanoid)__instance).UseItem((Inventory)null, itemAt, false);
}
}
private static void CreateTombStone()
{
//IL_003a: 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)
Dbgl($"height {Player.m_localPlayer.m_tombstone.GetComponent<Container>().m_height}");
GameObject val = Object.Instantiate<GameObject>(Player.m_localPlayer.m_tombstone, ((Character)Player.m_localPlayer).GetCenterPoint(), ((Component)Player.m_localPlayer).transform.rotation);
TombStone component = val.GetComponent<TombStone>();
Dbgl($"height {val.GetComponent<Container>().m_height}");
Dbgl($"inv height {val.GetComponent<Container>().GetInventory().GetHeight()}");
Dbgl($"inv slots {val.GetComponent<Container>().GetInventory().GetEmptySlots()}");
for (int i = 0; i < val.GetComponent<Container>().GetInventory().GetEmptySlots(); i++)
{
val.GetComponent<Container>().GetInventory().AddItem("SwordBronze", 1, 1, 0, 0L, "", false);
}
Dbgl($"no items: {val.GetComponent<Container>().GetInventory().NrOfItems()}");
PlayerProfile playerProfile = Game.instance.GetPlayerProfile();
component.Setup(playerProfile.GetName(), playerProfile.GetPlayerID());
}
}
[HarmonyPatch(typeof(InventoryGui), "Update")]
private static class InventoryGui_Update_Patch
{
private static void Postfix(InventoryGui __instance, Animator ___m_animator, InventoryGrid ___m_playerGrid)
{
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
if (!modEnabled.Value || !Object.op_Implicit((Object)(object)Player.m_localPlayer) || !___m_animator.GetBool("visible"))
{
return;
}
((Component)((Transform)__instance.m_player).Find("Bkg")).GetComponent<RectTransform>().anchorMin = new Vector2(0f, (float)(extraRows.Value + ((addEquipmentRow.Value && !displayEquipmentRowSeparate.Value) ? 1 : 0)) * -0.25f);
if (addEquipmentRow.Value)
{
if (displayEquipmentRowSeparate.Value && (Object)(object)((Transform)__instance.m_player).Find("EquipmentBkg") == (Object)null)
{
Transform val = Object.Instantiate<Transform>(((Transform)__instance.m_player).Find("Bkg"), (Transform)(object)__instance.m_player);
val.SetAsFirstSibling();
((Object)val).name = "EquipmentBkg";
((Component)val).GetComponent<RectTransform>().anchorMin = new Vector2(1f, 0f);
((Component)val).GetComponent<RectTransform>().anchorMax = new Vector2(1.5f, 1f);
}
else if (!displayEquipmentRowSeparate.Value && Object.op_Implicit((Object)(object)((Transform)__instance.m_player).Find("EquipmentBkg")))
{
Object.Destroy((Object)(object)((Component)((Transform)__instance.m_player).Find("EquipmentBkg")).gameObject);
}
}
}
}
[HarmonyPatch(typeof(InventoryGui), "UpdateInventory")]
private static class UpdateInventory_Patch
{
private static void Postfix(InventoryGrid ___m_playerGrid)
{
//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
//IL_0215: Unknown result type (might be due to invalid IL or missing references)
//IL_0244: Unknown result type (might be due to invalid IL or missing references)
//IL_0273: Unknown result type (might be due to invalid IL or missing references)
//IL_02a2: Unknown result type (might be due to invalid IL or missing references)
//IL_02d1: Unknown result type (might be due to invalid IL or missing references)
//IL_0300: Unknown result type (might be due to invalid IL or missing references)
if (modEnabled.Value && addEquipmentRow.Value)
{
Inventory inventory = ((Humanoid)Player.m_localPlayer).GetInventory();
int num = inventory.GetWidth() * (inventory.GetHeight() - 1);
SetSlotText(helmetText.Value, ((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++));
SetSlotText(chestText.Value, ((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++));
SetSlotText(legsText.Value, ((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++));
SetSlotText(backText.Value, ((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++));
SetSlotText(utilityText.Value, ((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++));
SetSlotText(hotKey1.Value, ((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++), center: false);
SetSlotText(hotKey2.Value, ((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++), center: false);
SetSlotText(hotKey3.Value, ((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++), center: false);
if (displayEquipmentRowSeparate.Value)
{
num = inventory.GetWidth() * (inventory.GetHeight() - 1);
((Component)((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++)).GetComponent<RectTransform>().anchoredPosition = new Vector2(678f, 0f);
((Component)((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++)).GetComponent<RectTransform>().anchoredPosition = new Vector2(748f, -35f);
((Component)((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++)).GetComponent<RectTransform>().anchoredPosition = new Vector2(678f, -70f);
((Component)((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++)).GetComponent<RectTransform>().anchoredPosition = new Vector2(748f, -105f);
((Component)((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++)).GetComponent<RectTransform>().anchoredPosition = new Vector2(678f, -140f);
((Component)((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++)).GetComponent<RectTransform>().anchoredPosition = new Vector2(643f, -210f);
((Component)((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++)).GetComponent<RectTransform>().anchoredPosition = new Vector2(713f, -210f);
((Component)((Component)___m_playerGrid.m_gridRoot).transform.GetChild(num++)).GetComponent<RectTransform>().anchoredPosition = new Vector2(783f, -210f);
}
}
}
}
[HarmonyPatch(typeof(Inventory), "FindEmptySlot")]
private static class FindEmptySlot_Patch
{
private static void Prefix(Inventory __instance, ref int ___m_height)
{
if (modEnabled.Value && addEquipmentRow.Value && Object.op_Implicit((Object)(object)Player.m_localPlayer) && __instance == ((Humanoid)Player.m_localPlayer).GetInventory())
{
Dbgl("FindEmptySlot");
___m_height--;
}
}
private static void Postfix(Inventory __instance, ref int ___m_height)
{
if (modEnabled.Value && addEquipmentRow.Value && Object.op_Implicit((Object)(object)Player.m_localPlayer) && __instance == ((Humanoid)Player.m_localPlayer).GetInventory())
{
___m_height++;
}
}
}
[HarmonyPatch(typeof(Inventory), "GetEmptySlots")]
private static class GetEmptySlots_Patch
{
private static bool Prefix(Inventory __instance, ref int __result, List<ItemData> ___m_inventory, int ___m_width, int ___m_height)
{
if (!modEnabled.Value || !addEquipmentRow.Value || __instance != ((Humanoid)Player.m_localPlayer).GetInventory())
{
return true;
}
int count = ___m_inventory.FindAll((ItemData i) => i.m_gridPos.y < ___m_height - 1).Count;
__result = (___m_height - 1) * ___m_width - count;
return false;
}
}
[HarmonyPatch(typeof(Inventory), "HaveEmptySlot")]
private static class HaveEmptySlot_Patch
{
private static bool Prefix(Inventory __instance, ref bool __result, List<ItemData> ___m_inventory, int ___m_width, int ___m_height)
{
if (modEnabled.Value && addEquipmentRow.Value && ___m_inventory != null)
{
Player localPlayer = Player.m_localPlayer;
if (__instance == ((localPlayer != null) ? ((Humanoid)localPlayer).GetInventory() : null))
{
int count = ___m_inventory.FindAll((ItemData i) => i?.m_gridPos.y < ___m_height - 1).Count;
__result = count < ___m_width * (___m_height - 1);
return false;
}
}
return true;
}
}
[HarmonyPatch(typeof(Inventory), "AddItem", new Type[] { typeof(ItemData) })]
private static class Inventory_AddItem_Patch1
{
private static bool Prefix(Inventory __instance, ref bool __result, List<ItemData> ___m_inventory, ItemData item)
{
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
if (!modEnabled.Value || !addEquipmentRow.Value || !Object.op_Implicit((Object)(object)Player.m_localPlayer) || __instance != ((Humanoid)Player.m_localPlayer).GetInventory())
{
return true;
}
Dbgl("AddItem");
if (IsEquipmentSlotFree(__instance, item, out var which))
{
item.m_gridPos = new Vector2i(which, __instance.GetHeight() - 1);
___m_inventory.Add(item);
((Humanoid)Player.m_localPlayer).EquipItem(item, false);
typeof(Inventory).GetMethod("Changed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(__instance, new object[0]);
__result = true;
return false;
}
return true;
}
}
[HarmonyPatch(typeof(Inventory), "AddItem", new Type[]
{
typeof(ItemData),
typeof(int),
typeof(int),
typeof(int)
})]
private static class Inventory_AddItem_Patch2
{
private static void Prefix(Inventory __instance, ref int ___m_width, ref int ___m_height, int x, int y)
{
if (modEnabled.Value)
{
if (x >= ___m_width)
{
___m_width = x + 1;
}
if (y >= ___m_height)
{
___m_height = y + 1;
}
}
}
}
[HarmonyPatch(typeof(Hud), "Awake")]
private static class Hud_Awake_Patch
{
private static void Postfix(Hud __instance)
{
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
if (modEnabled.Value && addEquipmentRow.Value)
{
Transform val = Object.Instantiate<Transform>(__instance.m_rootObject.transform.Find("HotKeyBar"));
((Object)val).name = "QuickAccessBar";
val.SetParent(__instance.m_rootObject.transform);
((Transform)((Component)val).GetComponent<RectTransform>()).localPosition = Vector3.zero;
GameObject elementPrefab = ((Component)val).GetComponent<HotkeyBar>().m_elementPrefab;
QuickAccessBar quickAccessBar = ((Component)val).gameObject.AddComponent<QuickAccessBar>();
quickAccessBar.m_elementPrefab = elementPrefab;
BepInExPlugin.elementPrefab = elementPrefab;
Object.Destroy((Object)(object)((Component)val).GetComponent<HotkeyBar>());
}
}
}
[HarmonyPatch(typeof(Hud), "Update")]
private static class Hud_Update_Patch
{
private static void Postfix(Hud __instance)
{
//IL_0045: 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_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_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
//IL_026b: Unknown result type (might be due to invalid IL or missing references)
//IL_026c: Unknown result type (might be due to invalid IL or missing references)
//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
//IL_0176: Unknown result type (might be due to invalid IL or missing references)
//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
//IL_0206: Unknown result type (might be due to invalid IL or missing references)
//IL_022b: Unknown result type (might be due to invalid IL or missing references)
if (!modEnabled.Value || !addEquipmentRow.Value || (Object)(object)Player.m_localPlayer == (Object)null)
{
return;
}
float scaleFactor = GameObject.Find("LoadingGUI").GetComponent<CanvasScaler>().scaleFactor;
Vector3 mousePosition = Input.mousePosition;
if (!modEnabled.Value)
{
lastMousePos = mousePosition;
return;
}
SetElementPositions();
if (lastMousePos == Vector3.zero)
{
lastMousePos = mousePosition;
}
Transform val = ((Component)Hud.instance).transform.Find("hudroot");
if (AedenthornUtils.CheckKeyHeld(modKeyOne.Value) && AedenthornUtils.CheckKeyHeld(modKeyTwo.Value))
{
Rect zero = Rect.zero;
Transform obj = val.Find("QuickAccessBar");
if ((Object)(object)((obj != null) ? ((Component)obj).GetComponent<RectTransform>() : null) != (Object)null)
{
((Rect)(ref zero))..ctor(((Component)val.Find("QuickAccessBar")).GetComponent<RectTransform>().anchoredPosition.x * scaleFactor, ((Component)val.Find("QuickAccessBar")).GetComponent<RectTransform>().anchoredPosition.y * scaleFactor + (float)Screen.height - ((Component)val.Find("QuickAccessBar")).GetComponent<RectTransform>().sizeDelta.y * scaleFactor * quickAccessScale.Value, ((Component)val.Find("QuickAccessBar")).GetComponent<RectTransform>().sizeDelta.x * scaleFactor * quickAccessScale.Value * 0.375f, ((Component)val.Find("QuickAccessBar")).GetComponent<RectTransform>().sizeDelta.y * scaleFactor * quickAccessScale.Value);
}
if (((Rect)(ref zero)).Contains(lastMousePos) && (currentlyDragging == "" || currentlyDragging == "QuickAccessBar"))
{
ConfigEntry<float> quickAccessX = BepInExPlugin.quickAccessX;
quickAccessX.Value += (mousePosition.x - lastMousePos.x) / scaleFactor;
ConfigEntry<float> quickAccessY = BepInExPlugin.quickAccessY;
quickAccessY.Value += (mousePosition.y - lastMousePos.y) / scaleFactor;
currentlyDragging = "QuickAccessBar";
}
else
{
currentlyDragging = "";
}
}
else
{
currentlyDragging = "";
}
lastMousePos = mousePosition;
}
}
[HarmonyPatch(typeof(Terminal), "InputText")]
private static class InputText_Patch
{
private static bool Prefix(Terminal __instance)
{
if (!modEnabled.Value)
{
return true;
}
string text = ((TMP_InputField)__instance.m_input).text;
if (text.ToLower().Equals(typeof(BepInExPlugin).Namespace.ToLower() + " reset"))
{
((BaseUnityPlugin)context).Config.Reload();
((BaseUnityPlugin)context).Config.Save();
__instance.AddString(text);
__instance.AddString(((BaseUnityPlugin)context).Info.Metadata.Name + " config reloaded");
return false;
}
return true;
}
}
private static BepInExPlugin context;
private Harmony harmony;
public static ConfigEntry<bool> modEnabled;
public static ConfigEntry<bool> isDebug;
public static ConfigEntry<int> nexusID;
public static ConfigEntry<bool> addEquipmentRow;
public static ConfigEntry<bool> showGearInMenu;
public static ConfigEntry<bool> displayEquipmentRowSeparate;
public static ConfigEntry<int> extraRows;
public static ConfigEntry<string> helmetText;
public static ConfigEntry<string> chestText;
public static ConfigEntry<string> legsText;
public static ConfigEntry<string> backText;
public static ConfigEntry<string> utilityText;
public static ConfigEntry<float> quickAccessScale;
public static ConfigEntry<string> hotKey1;
public static ConfigEntry<string> hotKey2;
public static ConfigEntry<string> hotKey3;
public static ConfigEntry<string> modKeyOne;
public static ConfigEntry<string> modKeyTwo;
public static ConfigEntry<string>[] hotkeys;
private static ConfigEntry<float> quickAccessX;
private static ConfigEntry<float> quickAccessY;
private static GameObject elementPrefab;
private static ItemType[] typeEnums;
private static FieldInfo[] fields;
private static ItemData[] equipItems;
private static Vector3 lastMousePos;
private static string currentlyDragging;
public static void Dbgl(string str = "", bool pref = true)
{
if (isDebug.Value)
{
Debug.Log((object)((pref ? (typeof(BepInExPlugin).Namespace + " ") : "") + str));
}
}
private void Awake()
{
//IL_0303: Unknown result type (might be due to invalid IL or missing references)
//IL_030d: Expected O, but got Unknown
context = this;
modEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Enable this mod");
isDebug = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "IsDebug", true, "Enable debug logs");
nexusID = ((BaseUnityPlugin)this).Config.Bind<int>("General", "NexusID", 1356, "Nexus mod ID for updates");
nexusID.Value = 1356;
extraRows = ((BaseUnityPlugin)this).Config.Bind<int>("Toggles", "ExtraRows", 0, "Number of extra ordinary rows.");
addEquipmentRow = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "AddEquipmentRow", true, "Add special row for equipped items and quick slots.");
showGearInMenu = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "ShowGearInMenu", true, "Display equipped items in the main menu.");
displayEquipmentRowSeparate = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "DisplayEquipmentRowSeparate", true, "Display equipment and quickslots in their own area.");
helmetText = ((BaseUnityPlugin)this).Config.Bind<string>("Strings", "HelmetText", "Head", "Text to show for helmet slot.");
chestText = ((BaseUnityPlugin)this).Config.Bind<string>("Strings", "ChestText", "Chest", "Text to show for chest slot.");
legsText = ((BaseUnityPlugin)this).Config.Bind<string>("Strings", "LegsText", "Legs", "Text to show for legs slot.");
backText = ((BaseUnityPlugin)this).Config.Bind<string>("Strings", "BackText", "Back", "Text to show for back slot.");
utilityText = ((BaseUnityPlugin)this).Config.Bind<string>("Strings", "UtilityText", "Utility", "Text to show for utility slot.");
quickAccessScale = ((BaseUnityPlugin)this).Config.Bind<float>("Misc", "QuickAccessScale", 1f, "Scale of quick access bar.");
hotKey1 = ((BaseUnityPlugin)this).Config.Bind<string>("Hotkeys", "HotKey1", "v", "Hotkey 1 - Use https://docs.unity3d.com/Manual/ConventionalGameInput.html");
hotKey2 = ((BaseUnityPlugin)this).Config.Bind<string>("Hotkeys", "HotKey2", "b", "Hotkey 2 - Use https://docs.unity3d.com/Manual/ConventionalGameInput.html");
hotKey3 = ((BaseUnityPlugin)this).Config.Bind<string>("Hotkeys", "HotKey3", "n", "Hotkey 3 - Use https://docs.unity3d.com/Manual/ConventionalGameInput.html");
modKeyOne = ((BaseUnityPlugin)this).Config.Bind<string>("Hotkeys", "ModKey1", "mouse 0", "First modifier key to move quick slots. Use https://docs.unity3d.com/Manual/ConventionalGameInput.html format.");
modKeyTwo = ((BaseUnityPlugin)this).Config.Bind<string>("Hotkeys", "ModKey2", "left ctrl", "Second modifier key to move quick slots. Use https://docs.unity3d.com/Manual/ConventionalGameInput.html format.");
quickAccessX = ((BaseUnityPlugin)this).Config.Bind<float>("ZCurrentPositions", "quickAccessX", 9999f, "Current X of Quick Slots");
quickAccessY = ((BaseUnityPlugin)this).Config.Bind<float>("ZCurrentPositions", "quickAccessY", 9999f, "Current Y of Quick Slots");
hotkeys = new ConfigEntry<string>[3] { hotKey1, hotKey2, hotKey3 };
harmony = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID);
harmony.PatchAll();
}
private static void ArrangeEquipment(Player __instance)
{
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
//IL_0153: Unknown result type (might be due to invalid IL or missing references)
//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
//IL_01bd: Invalid comparison between Unknown and I4
//IL_0238: Unknown result type (might be due to invalid IL or missing references)
//IL_023d: Unknown result type (might be due to invalid IL or missing references)
//IL_023f: Unknown result type (might be due to invalid IL or missing references)
//IL_0249: Unknown result type (might be due to invalid IL or missing references)
//IL_0253: Unknown result type (might be due to invalid IL or missing references)
//IL_0297: Unknown result type (might be due to invalid IL or missing references)
//IL_0299: Unknown result type (might be due to invalid IL or missing references)
if (!modEnabled.Value || !addEquipmentRow.Value)
{
return;
}
Inventory inventory = ((Humanoid)__instance).GetInventory();
List<ItemData> allItems = inventory.GetAllItems();
ItemData[] array = (ItemData[])(object)new ItemData[5]
{
AccessTools.FieldRefAccess<Humanoid, ItemData>((Humanoid)(object)__instance, "m_helmetItem"),
AccessTools.FieldRefAccess<Humanoid, ItemData>((Humanoid)(object)__instance, "m_chestItem"),
AccessTools.FieldRefAccess<Humanoid, ItemData>((Humanoid)(object)__instance, "m_legItem"),
AccessTools.FieldRefAccess<Humanoid, ItemData>((Humanoid)(object)__instance, "m_shoulderItem"),
AccessTools.FieldRefAccess<Humanoid, ItemData>((Humanoid)(object)__instance, "m_utilityItem")
};
int width = inventory.GetWidth();
int num = width * (inventory.GetHeight() - 1);
if (array[0] != null)
{
array[0].m_gridPos = new Vector2i(num % width, num / width);
}
num++;
if (array[1] != null)
{
array[1].m_gridPos = new Vector2i(num % width, num / width);
}
num++;
if (array[2] != null)
{
array[2].m_gridPos = new Vector2i(num % width, num / width);
}
num++;
if (array[3] != null)
{
array[3].m_gridPos = new Vector2i(num % width, num / width);
}
num++;
if (array[4] != null)
{
array[4].m_gridPos = new Vector2i(num % width, num / width);
}
for (int i = 0; i < allItems.Count; i++)
{
if (!IsAtEquipmentSlot(inventory, allItems[i], out var which))
{
continue;
}
if (allItems[i] == array[which])
{
allItems[i].m_equipped = true;
continue;
}
if ((int)allItems[i].m_shared.m_itemType == (int)typeEnums[which] && equipItems[which] != allItems[i])
{
((Humanoid)__instance).EquipItem(allItems[i], true);
array[which] = allItems[i];
allItems[i].m_equipped = true;
continue;
}
Vector2i val = (Vector2i)typeof(Inventory).GetMethod("FindEmptySlot", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(inventory, new object[1] { true });
if (val.x < 0 || val.y < 0 || val.y == inventory.GetHeight() - 1)
{
((Humanoid)__instance).DropItem(inventory, allItems[i], allItems[i].m_stack);
}
else
{
allItems[i].m_gridPos = val;
}
}
equipItems = array;
}
public static void SetSlotText(string value, Transform transform, bool center = true)
{
//IL_0061: 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)
Transform val = transform.Find("binding");
if (!Object.op_Implicit((Object)(object)val))
{
val = Object.Instantiate<Transform>(elementPrefab.transform.Find("binding"), transform);
}
((Behaviour)((Component)val).GetComponent<TMP_Text>()).enabled = true;
((Component)val).GetComponent<TMP_Text>().text = value;
((Component)val).GetComponent<RectTransform>().sizeDelta = new Vector2(300f, 17f);
if (center)
{
((Component)val).GetComponent<RectTransform>().anchoredPosition = new Vector2(32f, -10f);
}
}
private static bool IsEquipmentSlotFree(Inventory inventory, ItemData item, out int which)
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
which = Array.IndexOf(typeEnums, item.m_shared.m_itemType);
return which >= 0 && inventory.GetItemAt(which, inventory.GetHeight() - 1) == null;
}
private static bool IsAtEquipmentSlot(Inventory inventory, ItemData item, out int which)
{
if (!addEquipmentRow.Value || item.m_gridPos.x > 4 || item.m_gridPos.y < inventory.GetHeight() - 1)
{
which = -1;
return false;
}
which = item.m_gridPos.x;
return true;
}
private static void SetElementPositions()
{
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
Transform val = ((Component)Hud.instance).transform.Find("hudroot");
Transform obj = val.Find("QuickAccessBar");
if ((Object)(object)((obj != null) ? ((Component)obj).GetComponent<RectTransform>() : null) != (Object)null)
{
if (quickAccessX.Value == 9999f)
{
quickAccessX.Value = ((Component)val.Find("healthpanel")).GetComponent<RectTransform>().anchoredPosition.x - 32f;
}
if (quickAccessY.Value == 9999f)
{
quickAccessY.Value = ((Component)val.Find("healthpanel")).GetComponent<RectTransform>().anchoredPosition.y - 870f;
}
((Component)val.Find("QuickAccessBar")).GetComponent<RectTransform>().anchoredPosition = new Vector2(quickAccessX.Value, quickAccessY.Value);
((Transform)((Component)val.Find("QuickAccessBar")).GetComponent<RectTransform>()).localScale = new Vector3(quickAccessScale.Value, quickAccessScale.Value, 1f);
}
}
static BepInExPlugin()
{
ItemType[] array = new ItemType[5];
RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
typeEnums = (ItemType[])(object)array;
fields = new FieldInfo[5]
{
AccessTools.Field(typeof(Humanoid), "m_helmetItem"),
AccessTools.Field(typeof(Humanoid), "m_chestItem"),
AccessTools.Field(typeof(Humanoid), "m_legItem"),
AccessTools.Field(typeof(Humanoid), "m_shoulderItem"),
AccessTools.Field(typeof(Humanoid), "m_utilityItem")
};
equipItems = (ItemData[])(object)new ItemData[5];
}
}
public class QuickAccessBar : MonoBehaviour
{
private class ElementData
{
public bool m_used;
public GameObject m_go;
public Image m_icon;
public GuiBar m_durability;
public TMP_Text m_amount;
public GameObject m_equiped;
public GameObject m_queued;
public GameObject m_selection;
}
public GameObject m_elementPrefab;
public float m_elementSpace = 70f;
private int m_selected;
private List<ElementData> m_elements = new List<ElementData>();
private List<ItemData> m_items = new List<ItemData>();
private void Update()
{
Player localPlayer = Player.m_localPlayer;
UpdateIcons(localPlayer);
}
private void UpdateIcons(Player player)
{
//IL_0251: Unknown result type (might be due to invalid IL or missing references)
//IL_04ad: Unknown result type (might be due to invalid IL or missing references)
//IL_04a6: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)player) || ((Character)player).IsDead())
{
foreach (ElementData element in m_elements)
{
Object.Destroy((Object)(object)element.m_go);
}
m_elements.Clear();
return;
}
m_items.Clear();
Inventory inventory = ((Humanoid)player).GetInventory();
if (inventory.GetItemAt(5, inventory.GetHeight() - 1) != null)
{
m_items.Add(inventory.GetItemAt(5, inventory.GetHeight() - 1));
}
if (inventory.GetItemAt(6, inventory.GetHeight() - 1) != null)
{
m_items.Add(inventory.GetItemAt(6, inventory.GetHeight() - 1));
}
if (inventory.GetItemAt(7, inventory.GetHeight() - 1) != null)
{
m_items.Add(inventory.GetItemAt(7, inventory.GetHeight() - 1));
}
m_items.Sort((ItemData x, ItemData y) => x.m_gridPos.x.CompareTo(y.m_gridPos.x));
int num = 0;
foreach (ItemData item in m_items)
{
if (item.m_gridPos.x - 4 > num)
{
num = item.m_gridPos.x - 4;
}
}
if (m_elements.Count != num)
{
foreach (ElementData element2 in m_elements)
{
Object.Destroy((Object)(object)element2.m_go);
}
m_elements.Clear();
for (int i = 0; i < num; i++)
{
ElementData elementData = new ElementData();
elementData.m_go = Object.Instantiate<GameObject>(m_elementPrefab, ((Component)this).transform);
elementData.m_go.transform.localPosition = new Vector3((float)i * m_elementSpace, 0f, 0f);
BepInExPlugin.SetSlotText(BepInExPlugin.hotkeys[i].Value, elementData.m_go.transform, center: false);
elementData.m_icon = ((Component)((Component)elementData.m_go.transform).transform.Find("icon")).GetComponent<Image>();
elementData.m_durability = ((Component)elementData.m_go.transform.Find("durability")).GetComponent<GuiBar>();
elementData.m_amount = ((Component)elementData.m_go.transform.Find("amount")).GetComponent<TMP_Text>();
elementData.m_equiped = ((Component)elementData.m_go.transform.Find("equiped")).gameObject;
elementData.m_queued = ((Component)elementData.m_go.transform.Find("queued")).gameObject;
elementData.m_selection = ((Component)elementData.m_go.transform.Find("selected")).gameObject;
m_elements.Add(elementData);
}
}
foreach (ElementData element3 in m_elements)
{
element3.m_used = false;
}
bool flag = ZInput.IsGamepadActive();
for (int j = 0; j < m_items.Count; j++)
{
ItemData val = m_items[j];
ElementData elementData2 = m_elements[val.m_gridPos.x - 5];
elementData2.m_used = true;
((Component)elementData2.m_icon).gameObject.SetActive(true);
elementData2.m_icon.sprite = val.GetIcon();
((Component)elementData2.m_durability).gameObject.SetActive(val.m_shared.m_useDurability);
if (val.m_shared.m_useDurability)
{
if (val.m_durability <= 0f)
{
elementData2.m_durability.SetValue(1f);
elementData2.m_durability.SetColor((Color)((Mathf.Sin(Time.time * 10f) > 0f) ? Color.red : new Color(0f, 0f, 0f, 0f)));
}
else
{
elementData2.m_durability.SetValue(val.GetDurabilityPercentage());
elementData2.m_durability.ResetColor();
}
}
elementData2.m_equiped.SetActive(val.m_equipped);
elementData2.m_queued.SetActive(player.IsEquipActionQueued(val));
if (val.m_shared.m_maxStackSize > 1)
{
((Component)elementData2.m_amount).gameObject.SetActive(true);
elementData2.m_amount.text = val.m_stack + "/" + val.m_shared.m_maxStackSize;
}
else
{
((Component)elementData2.m_amount).gameObject.SetActive(false);
}
}
for (int k = 0; k < m_elements.Count; k++)
{
ElementData elementData3 = m_elements[k];
elementData3.m_selection.SetActive(flag && k == m_selected);
if (!elementData3.m_used)
{
((Component)elementData3.m_icon).gameObject.SetActive(false);
((Component)elementData3.m_durability).gameObject.SetActive(false);
elementData3.m_equiped.SetActive(false);
elementData3.m_queued.SetActive(false);
((Component)elementData3.m_amount).gameObject.SetActive(false);
}
}
}
}