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 System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using HarmonyLib;
using Microsoft.CodeAnalysis;
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("ContentsWithin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ContentsWithin")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("a12ea987-2ff3-4af8-8745-24bae44b63bd")]
[assembly: AssemblyFileVersion("2.1.6")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.1.6.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
}
namespace ContentsWithin
{
[BepInPlugin("com.maxsch.valheim.contentswithin", "ContentsWithin", "2.1.6")]
public class ContentsWithin : BaseUnityPlugin
{
[HarmonyPatch(typeof(Player))]
public class PlayerPatch
{
[HarmonyPatch("UpdateHover")]
[HarmonyPostfix]
public static void UpdateHoverPostfix(Player __instance)
{
if (isModEnabled.Value && !((Object)(object)lastHoverObject == (Object)(object)__instance.m_hovering))
{
lastHoverObject = __instance.m_hovering;
lastHoverContainer = (Object.op_Implicit((Object)(object)lastHoverObject) ? lastHoverObject.GetComponentInParent<Container>() : null);
}
}
}
[HarmonyPatch(typeof(InventoryGrid))]
public static class InventoryGridPatch
{
[HarmonyPatch("Awake")]
[HarmonyPostfix]
public static void AwakePostfix(InventoryGrid __instance)
{
initializedGrids.Add(__instance);
}
}
[HarmonyPatch(typeof(InventoryGui))]
public class InventoryGuiPatch
{
[HarmonyPatch("Awake")]
[HarmonyPostfix]
[HarmonyPriority(200)]
public static void AwakePostfix(ref InventoryGui __instance)
{
RectTransform obj = __instance.m_player.Ref<RectTransform>();
inventoryPanel = ((obj != null) ? ((Component)obj).gameObject : null);
Transform obj2 = __instance.m_infoPanel.Ref<Transform>();
infoPanel = ((obj2 != null) ? ((Component)obj2).gameObject : null);
Transform obj3 = __instance.m_inventoryRoot.Find("Crafting").Ref<Transform>();
craftingPanel = ((obj3 != null) ? ((Component)obj3).gameObject : null);
Button obj4 = __instance.m_takeAllButton.Ref<Button>();
takeAllButton = ((obj4 != null) ? ((Component)obj4).gameObject : null);
Button obj5 = __instance.m_stackAllButton.Ref<Button>();
stackAllButton = ((obj5 != null) ? ((Component)obj5).gameObject : null);
if (Chainloader.PluginInfos.ContainsKey("randyknapp.mods.auga"))
{
Transform obj6 = __instance.m_inventoryRoot.Find("RightPanel").Ref<Transform>();
craftingPanel = ((obj6 != null) ? ((Component)obj6).gameObject : null);
}
}
[HarmonyPatch("Show")]
[HarmonyPostfix]
public static void ShowPostfix()
{
isRealGuiVisible = true;
}
[HarmonyPatch("Hide")]
[HarmonyPostfix]
public static void HidePostfix()
{
isRealGuiVisible = false;
}
[HarmonyPatch("Update")]
[HarmonyPrefix]
public static void UpdatePrefix(InventoryGui __instance)
{
if (!ShowRealGUI())
{
__instance.m_animator.SetBool("visible", false);
}
}
[HarmonyPatch("Update")]
[HarmonyPostfix]
public static void UpdatePostfix(InventoryGui __instance)
{
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Expected O, but got Unknown
bool flag = true;
if (Chainloader.PluginInfos.ContainsKey("org.bepinex.plugins.jewelcrafting"))
{
object? obj = jewelcraftingOpenInventoryField?.GetValue(null);
Inventory val = (Inventory)((obj is Inventory) ? obj : null);
flag = val == null;
}
GameObject obj2 = inventoryPanel.Ref<GameObject>();
if (obj2 != null)
{
obj2.SetActive(ShowRealGUI());
}
GameObject obj3 = craftingPanel.Ref<GameObject>();
if (obj3 != null)
{
obj3.SetActive(ShowRealGUI());
}
GameObject obj4 = infoPanel.Ref<GameObject>();
if (obj4 != null)
{
obj4.SetActive(ShowRealGUI());
}
GameObject obj5 = takeAllButton.Ref<GameObject>();
if (obj5 != null)
{
obj5.SetActive(flag && ShowRealGUI());
}
GameObject obj6 = stackAllButton.Ref<GameObject>();
if (obj6 != null)
{
obj6.SetActive(flag && ShowRealGUI());
}
if (Object.op_Implicit((Object)(object)takeAllButton) && Chainloader.PluginInfos.ContainsKey("goldenrevolver.quick_stack_store"))
{
bool flag2 = false;
foreach (Transform item in takeAllButton.transform.parent)
{
Transform val2 = item;
switch (((Object)val2).name)
{
case "quickStackToContainerButton":
flag2 = true;
((Component)val2).gameObject.SetActive(flag && ShowRealGUI());
break;
case "storeAllButton":
case "sortContainerButton":
case "restockFromContainerButton":
((Component)val2).gameObject.SetActive(flag && ShowRealGUI());
break;
}
}
if (flag2)
{
GameObject obj7 = stackAllButton.Ref<GameObject>();
if (obj7 != null)
{
obj7.SetActive(false);
}
}
}
if (!ShowRealGUI())
{
if (HasContainerAccess(lastHoverContainer))
{
ShowPreviewContainer(lastHoverContainer.GetInventory());
delayTime = openDelayTime.Value;
}
else if (delayTime > 0f)
{
ShowPreviewContainer(emptyInventory);
delayTime -= Time.deltaTime;
}
else
{
InventoryGui.instance.m_animator.SetBool("visible", false);
delayTime = 0f;
}
}
}
private static bool HasContainerAccess(Container container)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)container))
{
return false;
}
bool flag = PrivateArea.CheckAccess(((Component)container).transform.position, 0f, false, false);
bool flag2 = container.CheckAccess(Game.instance.m_playerProfile.m_playerID);
return flag && flag2;
}
[HarmonyPatch("SetupDragItem")]
[HarmonyPrefix]
public static bool SetupDragItemPrefix()
{
return ShowRealGUI();
}
private static void ShowPreviewContainer(Inventory container)
{
InventoryGui.instance.m_animator.SetBool("visible", true);
InventoryGui.instance.m_hiddenFrames = 10;
((Component)InventoryGui.instance.m_container).gameObject.SetActive(true);
if (initializedGrids.Contains(InventoryGui.instance.m_containerGrid))
{
InventoryGui.instance.m_containerGrid.UpdateInventory(container, (Player)null, (ItemData)null);
InventoryGui.instance.m_containerGrid.ResetView();
InventoryGui.instance.m_containerName.text = Localization.instance.Localize(container.GetName());
int num = Mathf.CeilToInt(container.GetTotalWeight());
InventoryGui.instance.m_containerWeight.text = num.ToString();
}
}
}
public const string PluginGUID = "com.maxsch.valheim.contentswithin";
public const string PluginName = "ContentsWithin";
public const string PluginVersion = "2.1.6";
private static ConfigEntry<bool> isModEnabled;
private static ConfigEntry<bool> startHidden;
private static ConfigEntry<KeyboardShortcut> toggleShowContentsShortcut;
private static ConfigEntry<float> openDelayTime;
private static bool isRealGuiVisible;
private static bool showContent = true;
private static float delayTime;
private static Inventory emptyInventory = new Inventory("", (Sprite)null, 0, 0);
private static HashSet<InventoryGrid> initializedGrids = new HashSet<InventoryGrid>();
private static Container lastHoverContainer;
private static GameObject lastHoverObject;
private static GameObject inventoryPanel;
private static GameObject infoPanel;
private static GameObject craftingPanel;
private static GameObject takeAllButton;
private static GameObject stackAllButton;
private Harmony harmony;
private static FieldInfo? jewelcraftingOpenInventoryField;
private static FieldInfo? GetJewelcraftingOpenInventoryField()
{
Type type = AccessTools.TypeByName("Jewelcrafting.GemStones+AddFakeSocketsContainer");
return AccessTools.Field(type, "openInventory");
}
public void Awake()
{
//IL_0085: 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_00bb: Expected O, but got Unknown
isModEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("_Global", "isModEnabled", true, "Globally enable or disable this mod. When disabled, no container contents will be shown and hotkeys will not work.");
startHidden = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "startHidden", false, "Hide the container contents until the hotkey is pressed.");
openDelayTime = ((BaseUnityPlugin)this).Config.Bind<float>("Settings", "openDelayTime", 0.3f, "Time before the UI is closed when not hovering over a chest. This reduces the amount of animations when switching between chests.");
toggleShowContentsShortcut = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "toggleShowContentsShortcut", new KeyboardShortcut((KeyCode)112, (KeyCode[])(object)new KeyCode[1] { (KeyCode)303 }), "Shortcut to toggle on/off the 'show container contents' feature.");
showContent = !startHidden.Value;
harmony = new Harmony("com.maxsch.valheim.contentswithin");
harmony.PatchAll();
}
private void Start()
{
if (Chainloader.PluginInfos.ContainsKey("org.bepinex.plugins.jewelcrafting"))
{
jewelcraftingOpenInventoryField = GetJewelcraftingOpenInventoryField();
}
}
private void Update()
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
if (!isModEnabled.Value)
{
return;
}
KeyboardShortcut value = toggleShowContentsShortcut.Value;
if (((KeyboardShortcut)(ref value)).IsDown())
{
showContent = !showContent;
if (Object.op_Implicit((Object)(object)MessageHud.instance))
{
MessageHud.instance.ShowMessage((MessageType)2, $"ShowContainerContents: {showContent}", 0, (Sprite)null);
}
if (!showContent && !isRealGuiVisible && Object.op_Implicit((Object)(object)InventoryGui.instance))
{
InventoryGui.instance.Hide();
}
}
}
private static bool ShowRealGUI()
{
return !isModEnabled.Value || !showContent || isRealGuiVisible;
}
}
public static class ObjectExtensions
{
public static T Ref<T>(this T o) where T : Object
{
return Object.op_Implicit((Object)(object)o) ? o : default(T);
}
}
}