using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("Equipment Sheet")] [assembly: AssemblyFileVersion("0.9.1")] [assembly: AssemblyCompany("R4V9N1")] [assembly: AssemblyDescription("Created by R4V9N1")] [assembly: AssemblyProduct("Equipment Sheet")] [assembly: AssemblyCopyright("Created by R4V9N1")] [assembly: AssemblyMetadata("Creator", "Created by R4V9N1")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("0.9.1.0")] namespace EquipmentSheet; [BepInPlugin("r4v9n1.equipmentsheet", "Equipment Sheet", "0.9.1")] public sealed class EquipmentSheetPlugin : BaseUnityPlugin { private enum SlotKind { Equipment, Food } private sealed class SlotDef { public readonly string Label; public readonly ItemType Type; public readonly SlotKind Kind; public SlotDef(string label, ItemType type) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) Label = label; Type = type; Kind = SlotKind.Equipment; } public SlotDef(string label) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) Label = label; Type = (ItemType)0; Kind = SlotKind.Food; } } private sealed class SheetUpgradeTransaction { public Player Player; public Inventory PlayerInventory; public ItemData OriginalItem; public Vector2i SheetPosition; public bool OriginalRemoved; public ItemData ReplacementItem; } public const string PluginGuid = "r4v9n1.equipmentsheet"; public const string PluginName = "Equipment Sheet"; public const string PluginVersion = "0.9.1"; public const string CreatorCredit = "Created by R4V9N1"; private const string CustomDataKey = "is.codex.valheim.equipmentsheet.inventory.v1"; private const string PendingTransferKey = "is.codex.valheim.equipmentsheet.pending-transfer.v1"; private const int SheetColumns = 3; private const int SheetRows = 3; private const int EquipmentSlotCount = 6; private static readonly SlotDef[] Slots = new SlotDef[9] { new SlotDef("Helm", (ItemType)6), new SlotDef("Chest", (ItemType)7), new SlotDef("Legs", (ItemType)11), new SlotDef("Trinket", (ItemType)24), new SlotDef("Back", (ItemType)17), new SlotDef("Belt", (ItemType)18), new SlotDef("Food 1"), new SlotDef("Food 2"), new SlotDef("Food 3") }; private static ConfigEntry _enabled; private static ConfigEntry _panelGap; private static ConfigEntry _panelExtraRightOffset; private static ManualLogSource _log; private static RectTransform _panel; private static InventoryGrid _grid; private static Inventory _equipmentInventory; private static Image[] _slotFrames; private static Image[] _slotIcons; private static Text[] _slotLabels; private static Text[] _slotAmounts; private static Text[] _slotQualities; private static Image[] _slotDurabilityBacks; private static Image[] _slotDurabilityBars; private static UIInputHandler[] _slotHitboxes; private static UITooltip[] _slotTooltips; private static Vector2 _cellSize = new Vector2(50f, 50f); private static Vector2[] _slotPositions; private static FieldInfo _customDataField; private static FieldInfo _onChangedField; private static FieldInfo _inventoryItemsField; private static FieldInfo _dragGoField; private static FieldInfo _dragItemField; private static FieldInfo _dragInventoryField; private static FieldInfo _dragAmountField; private static FieldInfo _itemEquippedField; private static FieldInfo _gridWidthField; private static FieldInfo _gridHeightField; private static FieldInfo _humanoidChestField; private static FieldInfo _humanoidLegField; private static FieldInfo _humanoidHelmetField; private static FieldInfo _humanoidShoulderField; private static FieldInfo _humanoidUtilityField; private static FieldInfo _humanoidTrinketField; private static FieldInfo _currentContainerField; private static FieldInfo _craftUpgradeItemField; private static MethodInfo _inventoryChangedMethod; private static MethodInfo _setupDragItemMethod; private static MethodInfo _setupEquipmentMethod; private static MethodInfo _createItemTooltipMethod; private static Player _loadedPlayer; private static bool _loadingInventory; private static int _upgradeRecipeScanDepth; private static SheetUpgradeTransaction _sheetUpgradeTransaction; private static readonly List PendingAutoRouteItems = new List(); private static ItemData _manualSheetDragItem; private static float _lastWrongTypeMessageTime = float.NegativeInfinity; private Harmony _harmony; private void Awake() { //IL_02f7: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Expected O, but got Unknown _log = ((BaseUnityPlugin)this).Logger; _enabled = ((BaseUnityPlugin)this).Config.Bind("General", "Enabled", true, "Show the equipment sheet panel next to the player inventory."); _panelGap = ((BaseUnityPlugin)this).Config.Bind("General", "PanelGap", 20f, "Horizontal gap (UI units) between the vanilla inventory grid and the equipment panel."); _panelExtraRightOffset = ((BaseUnityPlugin)this).Config.Bind("General", "PanelExtraRightOffset", 60f, "Extra horizontal offset added after PanelGap. Useful when another UI overlaps the equipment panel."); _customDataField = AccessTools.Field(typeof(Player), "m_customData"); _onChangedField = AccessTools.Field(typeof(Inventory), "m_onChanged"); _inventoryItemsField = AccessTools.Field(typeof(Inventory), "m_inventory"); _dragGoField = AccessTools.Field(typeof(InventoryGui), "m_dragGo"); _dragItemField = AccessTools.Field(typeof(InventoryGui), "m_dragItem"); _dragInventoryField = AccessTools.Field(typeof(InventoryGui), "m_dragInventory"); _dragAmountField = AccessTools.Field(typeof(InventoryGui), "m_dragAmount"); _itemEquippedField = AccessTools.Field(typeof(ItemData), "m_equipped"); _gridWidthField = AccessTools.Field(typeof(InventoryGrid), "m_width"); _gridHeightField = AccessTools.Field(typeof(InventoryGrid), "m_height"); _humanoidChestField = AccessTools.Field(typeof(Humanoid), "m_chestItem"); _humanoidLegField = AccessTools.Field(typeof(Humanoid), "m_legItem"); _humanoidHelmetField = AccessTools.Field(typeof(Humanoid), "m_helmetItem"); _humanoidShoulderField = AccessTools.Field(typeof(Humanoid), "m_shoulderItem"); _humanoidUtilityField = AccessTools.Field(typeof(Humanoid), "m_utilityItem"); _humanoidTrinketField = AccessTools.Field(typeof(Humanoid), "m_trinketItem"); _currentContainerField = AccessTools.Field(typeof(InventoryGui), "m_currentContainer"); _craftUpgradeItemField = AccessTools.Field(typeof(InventoryGui), "m_craftUpgradeItem"); _inventoryChangedMethod = AccessTools.Method(typeof(Inventory), "Changed", (Type[])null, (Type[])null); _setupDragItemMethod = AccessTools.Method(typeof(InventoryGui), "SetupDragItem", new Type[3] { typeof(ItemData), typeof(Inventory), typeof(int) }, (Type[])null); _setupEquipmentMethod = AccessTools.Method(typeof(Humanoid), "SetupEquipment", (Type[])null, (Type[])null); _createItemTooltipMethod = AccessTools.Method(typeof(InventoryGrid), "CreateItemTooltip", new Type[2] { typeof(ItemData), typeof(UITooltip) }, (Type[])null); EnsureEquipmentInventory(); _harmony = new Harmony("r4v9n1.equipmentsheet"); _harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Equipment Sheet 0.9.1 loaded."); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Created by R4V9N1."); } private void OnDestroy() { if (_harmony != null) { _harmony.UnpatchSelf(); _harmony = null; } } private void Update() { InventoryGui instance = InventoryGui.instance; Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer != (Object)null && (Object)(object)localPlayer != (Object)(object)_loadedPlayer) { LoadEquipmentInventory(localPlayer); RestorePendingTransfer(localPlayer); _loadedPlayer = localPlayer; } if (_manualSheetDragItem != null && ((Object)(object)instance == (Object)null || _dragItemField == null || _dragItemField.GetValue(instance) != _manualSheetDragItem)) { _manualSheetDragItem = null; } ProcessPendingAutoRouteItems(localPlayer); if (!((Object)(object)_panel == (Object)null) && !((Object)(object)instance == (Object)null) && !((Object)(object)localPlayer == (Object)null)) { bool flag = _enabled != null && _enabled.Value && (Object)(object)instance.m_player != (Object)null && ((Component)instance.m_player).gameObject.activeInHierarchy; if (((Component)_panel).gameObject.activeSelf != flag) { ((Component)_panel).gameObject.SetActive(flag); } if (flag) { UpdateEquipmentGrid(instance, localPlayer); } } } internal static void SetupPanel(InventoryGui gui) { //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Expected O, but got Unknown //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: 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_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_023b: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Unknown result type (might be due to invalid IL or missing references) //IL_0262: Unknown result type (might be due to invalid IL or missing references) //IL_026f: Unknown result type (might be due to invalid IL or missing references) //IL_0283: 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) //IL_02af: Unknown result type (might be due to invalid IL or missing references) //IL_02c5: Unknown result type (might be due to invalid IL or missing references) //IL_02fd: Unknown result type (might be due to invalid IL or missing references) //IL_0518: Unknown result type (might be due to invalid IL or missing references) //IL_051d: Unknown result type (might be due to invalid IL or missing references) //IL_0551: Unknown result type (might be due to invalid IL or missing references) //IL_0556: Unknown result type (might be due to invalid IL or missing references) //IL_0564: Unknown result type (might be due to invalid IL or missing references) //IL_0575: Unknown result type (might be due to invalid IL or missing references) //IL_058a: Unknown result type (might be due to invalid IL or missing references) //IL_059f: Unknown result type (might be due to invalid IL or missing references) //IL_05b1: Unknown result type (might be due to invalid IL or missing references) //IL_05bb: Unknown result type (might be due to invalid IL or missing references) //IL_05e2: Unknown result type (might be due to invalid IL or missing references) //IL_062d: Unknown result type (might be due to invalid IL or missing references) //IL_0632: Unknown result type (might be due to invalid IL or missing references) //IL_0640: Unknown result type (might be due to invalid IL or missing references) //IL_0651: Unknown result type (might be due to invalid IL or missing references) //IL_0666: Unknown result type (might be due to invalid IL or missing references) //IL_067b: Unknown result type (might be due to invalid IL or missing references) //IL_068d: Unknown result type (might be due to invalid IL or missing references) //IL_069c: Unknown result type (might be due to invalid IL or missing references) //IL_06a1: Unknown result type (might be due to invalid IL or missing references) //IL_06ab: Unknown result type (might be due to invalid IL or missing references) //IL_06ba: Unknown result type (might be due to invalid IL or missing references) //IL_06bf: Unknown result type (might be due to invalid IL or missing references) //IL_06d2: Unknown result type (might be due to invalid IL or missing references) //IL_0725: Unknown result type (might be due to invalid IL or missing references) //IL_072a: Unknown result type (might be due to invalid IL or missing references) //IL_0738: Unknown result type (might be due to invalid IL or missing references) //IL_0743: Unknown result type (might be due to invalid IL or missing references) //IL_0754: Unknown result type (might be due to invalid IL or missing references) //IL_0769: Unknown result type (might be due to invalid IL or missing references) //IL_077e: Unknown result type (might be due to invalid IL or missing references) //IL_0790: Unknown result type (might be due to invalid IL or missing references) //IL_079a: Unknown result type (might be due to invalid IL or missing references) //IL_07a4: Unknown result type (might be due to invalid IL or missing references) //IL_07f0: Unknown result type (might be due to invalid IL or missing references) //IL_082c: Unknown result type (might be due to invalid IL or missing references) //IL_0840: Unknown result type (might be due to invalid IL or missing references) //IL_0882: Unknown result type (might be due to invalid IL or missing references) //IL_089d: Unknown result type (might be due to invalid IL or missing references) //IL_08a2: Unknown result type (might be due to invalid IL or missing references) //IL_08dc: Unknown result type (might be due to invalid IL or missing references) //IL_08f6: Unknown result type (might be due to invalid IL or missing references) //IL_08fb: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_panel != (Object)null) && !((Object)(object)gui == (Object)null) && !((Object)(object)gui.m_player == (Object)null) && !((Object)(object)gui.m_playerGrid == (Object)null) && !((Object)(object)gui.m_playerGrid.m_elementPrefab == (Object)null)) { EnsureEquipmentInventory(); RectTransform player = gui.m_player; GameObject val = new GameObject("EquipmentSheetPanel", new Type[1] { typeof(RectTransform) }); val.transform.SetParent(((Transform)player).parent, false); RectTransform component = val.GetComponent(); component.anchorMin = player.anchorMin; component.anchorMax = player.anchorMax; component.pivot = player.pivot; RectTransform component2 = gui.m_playerGrid.m_elementPrefab.GetComponent(); if ((Object)(object)component2 != (Object)null && component2.sizeDelta.x > 0f && component2.sizeDelta.y > 0f) { _cellSize = component2.sizeDelta; } float num = 3f * _cellSize.x + 8f + 24f; float num2 = 3f * _cellSize.y + 8f + 24f; float num3 = ((_panelGap == null) ? 20f : _panelGap.Value) + ((_panelExtraRightOffset == null) ? 60f : _panelExtraRightOffset.Value); component.sizeDelta = new Vector2(num, num2); Vector2 anchoredPosition = player.anchoredPosition; Rect rect = player.rect; component.anchoredPosition = anchoredPosition + new Vector2(((Rect)(ref rect)).width + num3, 0f); Image val2 = val.AddComponent(); Image component3 = ((Component)player).GetComponent(); if ((Object)(object)component3 != (Object)null) { val2.sprite = component3.sprite; val2.type = component3.type; ((Graphic)val2).color = ((Graphic)component3).color; ((Graphic)val2).material = ((Graphic)component3).material; } else { ((Graphic)val2).color = new Color(0f, 0f, 0f, 0.6f); } GameObject val3 = new GameObject("EquipmentSheetGridRoot", new Type[1] { typeof(RectTransform) }); val3.transform.SetParent((Transform)(object)component, false); RectTransform component4 = val3.GetComponent(); component4.anchorMin = new Vector2(0f, 1f); component4.anchorMax = new Vector2(0f, 1f); component4.pivot = new Vector2(0f, 1f); component4.anchoredPosition = new Vector2(12f, -12f); component4.sizeDelta = new Vector2(3f * _cellSize.x + 8f, 3f * _cellSize.y + 8f); _grid = val3.AddComponent(); _grid.m_elementPrefab = gui.m_playerGrid.m_elementPrefab; _grid.m_gridRoot = component4; if (_gridWidthField != null) { _gridWidthField.SetValue(_grid, 3); } if (_gridHeightField != null) { _gridHeightField.SetValue(_grid, 3); } _grid.m_elementSpace = 4f; _grid.m_tooltipAnchor = gui.m_playerGrid.m_tooltipAnchor; _grid.m_onSelected = delegate(InventoryGrid grid, ItemData item, Vector2i pos, Modifier mod) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) HandleEquipmentGridSelected(gui, grid, item, pos, mod); }; _grid.m_onRightClick = delegate(InventoryGrid grid, ItemData item, Vector2i pos) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) HandleEquipmentGridSelected(gui, grid, item, pos, (Modifier)0); }; _grid.OnMoveToLowerInventoryGrid = gui.m_playerGrid.OnMoveToLowerInventoryGrid; _grid.OnMoveToUpperInventoryGrid = gui.m_playerGrid.OnMoveToUpperInventoryGrid; _grid.m_uiGroup = gui.m_playerGrid.m_uiGroup; _slotPositions = (Vector2[])(object)new Vector2[Slots.Length]; _slotFrames = (Image[])(object)new Image[Slots.Length]; _slotIcons = (Image[])(object)new Image[Slots.Length]; _slotLabels = (Text[])(object)new Text[Slots.Length]; _slotAmounts = (Text[])(object)new Text[Slots.Length]; _slotQualities = (Text[])(object)new Text[Slots.Length]; _slotDurabilityBacks = (Image[])(object)new Image[Slots.Length]; _slotDurabilityBars = (Image[])(object)new Image[Slots.Length]; _slotHitboxes = (UIInputHandler[])(object)new UIInputHandler[Slots.Length]; _slotTooltips = (UITooltip[])(object)new UITooltip[Slots.Length]; Font builtinResource = Resources.GetBuiltinResource("Arial.ttf"); for (int num4 = 0; num4 < Slots.Length; num4++) { int num5 = num4 % 3; int num6 = num4 / 3; _slotPositions[num4] = new Vector2((float)num5 * (_cellSize.x + 4f), (float)(-num6) * (_cellSize.y + 4f)); GameObject val4 = new GameObject("EquipmentSheet_" + Slots[num4].Label + "_Frame", new Type[1] { typeof(RectTransform) }); val4.transform.SetParent((Transform)(object)component4, false); RectTransform component5 = val4.GetComponent(); component5.anchorMin = new Vector2(0f, 1f); component5.anchorMax = new Vector2(0f, 1f); component5.pivot = new Vector2(0f, 1f); component5.anchoredPosition = _slotPositions[num4]; component5.sizeDelta = _cellSize; Image val5 = val4.AddComponent(); ((Graphic)val5).color = new Color(0f, 0f, 0f, 0.45f); ((Graphic)val5).raycastTarget = false; _slotFrames[num4] = val5; GameObject val6 = new GameObject("EquipmentSheet_" + Slots[num4].Label + "_Icon", new Type[1] { typeof(RectTransform) }); val6.transform.SetParent((Transform)(object)component4, false); RectTransform component6 = val6.GetComponent(); component6.anchorMin = new Vector2(0f, 1f); component6.anchorMax = new Vector2(0f, 1f); component6.pivot = new Vector2(0f, 1f); component6.anchoredPosition = _slotPositions[num4] + new Vector2(4f, -4f); component6.sizeDelta = _cellSize - new Vector2(8f, 8f); Image val7 = val6.AddComponent(); ((Graphic)val7).color = Color.white; val7.preserveAspect = true; ((Graphic)val7).raycastTarget = false; _slotIcons[num4] = val7; GameObject val8 = new GameObject("EquipmentSheet_" + Slots[num4].Label + "_Label", new Type[1] { typeof(RectTransform) }); val8.transform.SetParent((Transform)(object)component4, false); val8.transform.SetAsLastSibling(); RectTransform component7 = val8.GetComponent(); component7.anchorMin = new Vector2(0f, 1f); component7.anchorMax = new Vector2(0f, 1f); component7.pivot = new Vector2(0f, 1f); component7.anchoredPosition = _slotPositions[num4]; component7.sizeDelta = _cellSize; Text val9 = val8.AddComponent(); val9.text = Slots[num4].Label; val9.font = builtinResource; val9.fontSize = 12; val9.alignment = (TextAnchor)4; ((Graphic)val9).color = new Color(1f, 1f, 1f, 0.95f); ((Graphic)val9).raycastTarget = false; val9.horizontalOverflow = (HorizontalWrapMode)0; val9.verticalOverflow = (VerticalWrapMode)1; Outline obj = val8.AddComponent(); ((Shadow)obj).effectColor = new Color(0f, 0f, 0f, 0.85f); ((Shadow)obj).effectDistance = new Vector2(1f, -1f); _slotLabels[num4] = val9; _slotAmounts[num4] = CreateSlotCornerText(component4, builtinResource, "EquipmentSheet_" + Slots[num4].Label + "_Amount", _slotPositions[num4] + new Vector2(2f, 0f - _cellSize.y + 16f), (TextAnchor)3); _slotQualities[num4] = CreateSlotCornerText(component4, builtinResource, "EquipmentSheet_" + Slots[num4].Label + "_Quality", _slotPositions[num4] + new Vector2(_cellSize.x - 18f, -2f), (TextAnchor)5); CreateSlotDurabilityBar(component4, num4); } CreateSlotHitboxes(component4); _panel = component; val.SetActive(false); if (_log != null) { _log.LogInfo((object)"Equipment Sheet: created persistent equipment inventory panel."); } } } private static void EnsureEquipmentInventory() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown if (_equipmentInventory == null) { _equipmentInventory = new Inventory("Equipment Sheet", (Sprite)null, 3, 3); HookEquipmentInventoryChanged(); } } private static void HookEquipmentInventoryChanged() { if (_equipmentInventory == null || _onChangedField == null) { return; } Action action = _onChangedField.GetValue(_equipmentInventory) as Action; Action action2 = ValidateEquipmentInventory; bool flag = false; if (action != null) { Delegate[] invocationList = action.GetInvocationList(); for (int i = 0; i < invocationList.Length; i++) { if (invocationList[i] == action2) { flag = true; break; } } } if (!flag) { _onChangedField.SetValue(_equipmentInventory, (Action)Delegate.Combine(action, action2)); } } private static void UpdateEquipmentGrid(InventoryGui gui, Player player) { if (!((Object)(object)_grid == (Object)null) && _equipmentInventory != null) { UpdateSlotVisuals(); } } private static Text CreateSlotCornerText(RectTransform parent, Font font, string name, Vector2 position, TextAnchor anchor) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007d: 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_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name, new Type[1] { typeof(RectTransform) }); val.transform.SetParent((Transform)(object)parent, false); RectTransform component = val.GetComponent(); component.anchorMin = new Vector2(0f, 1f); component.anchorMax = new Vector2(0f, 1f); component.pivot = new Vector2(0f, 1f); component.anchoredPosition = position; component.sizeDelta = new Vector2(16f, 14f); Text obj = val.AddComponent(); obj.font = font; obj.fontSize = 10; obj.alignment = anchor; ((Graphic)obj).color = Color.white; ((Graphic)obj).raycastTarget = false; Outline obj2 = val.AddComponent(); ((Shadow)obj2).effectColor = new Color(0f, 0f, 0f, 0.85f); ((Shadow)obj2).effectDistance = new Vector2(1f, -1f); return obj; } private static void CreateSlotDurabilityBar(RectTransform parent, int slot) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: 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_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("EquipmentSheet_" + Slots[slot].Label + "_DurabilityBack", new Type[1] { typeof(RectTransform) }); val.transform.SetParent((Transform)(object)parent, false); RectTransform component = val.GetComponent(); component.anchorMin = new Vector2(0f, 1f); component.anchorMax = new Vector2(0f, 1f); component.pivot = new Vector2(0f, 1f); component.anchoredPosition = _slotPositions[slot] + new Vector2(4f, 0f - _cellSize.y + 7f); component.sizeDelta = new Vector2(_cellSize.x - 8f, 4f); Image val2 = val.AddComponent(); ((Graphic)val2).color = new Color(0f, 0f, 0f, 0.8f); ((Graphic)val2).raycastTarget = false; ((Component)val2).gameObject.SetActive(false); _slotDurabilityBacks[slot] = val2; GameObject val3 = new GameObject("EquipmentSheet_" + Slots[slot].Label + "_DurabilityBar", new Type[1] { typeof(RectTransform) }); val3.transform.SetParent((Transform)(object)parent, false); RectTransform component2 = val3.GetComponent(); component2.anchorMin = new Vector2(0f, 1f); component2.anchorMax = new Vector2(0f, 1f); component2.pivot = new Vector2(0f, 1f); component2.anchoredPosition = component.anchoredPosition; component2.sizeDelta = component.sizeDelta; Image val4 = val3.AddComponent(); ((Graphic)val4).color = Color.green; ((Graphic)val4).raycastTarget = false; ((Component)val4).gameObject.SetActive(false); _slotDurabilityBars[slot] = val4; } private static void UpdateSlotVisuals() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Unknown result type (might be due to invalid IL or missing references) if (_slotLabels == null) { return; } Vector2i val = default(Vector2i); for (int i = 0; i < _slotLabels.Length; i++) { if ((Object)(object)_slotLabels[i] == (Object)null) { continue; } ((Vector2i)(ref val))..ctor(i % 3, i / 3); ItemData val2 = ((_equipmentInventory == null) ? null : _equipmentInventory.GetItemAt(val.x, val.y)); bool flag = val2 != null && val2.m_shared != null; _slotLabels[i].text = Slots[i].Label; ((Component)_slotLabels[i]).gameObject.SetActive(!flag); ((Component)_slotLabels[i]).transform.SetAsLastSibling(); if (_slotIcons != null && i < _slotIcons.Length && (Object)(object)_slotIcons[i] != (Object)null) { _slotIcons[i].sprite = (flag ? val2.GetIcon() : null); ((Component)_slotIcons[i]).gameObject.SetActive(flag); ((Component)_slotIcons[i]).transform.SetAsLastSibling(); } if (_slotAmounts != null && i < _slotAmounts.Length && (Object)(object)_slotAmounts[i] != (Object)null) { _slotAmounts[i].text = ((flag && val2.m_stack > 1) ? val2.m_stack.ToString() : ""); ((Component)_slotAmounts[i]).gameObject.SetActive(flag && val2.m_stack > 1); ((Component)_slotAmounts[i]).transform.SetAsLastSibling(); } if (_slotQualities != null && i < _slotQualities.Length && (Object)(object)_slotQualities[i] != (Object)null) { _slotQualities[i].text = ((flag && val2.m_quality > 1) ? val2.m_quality.ToString() : ""); ((Component)_slotQualities[i]).gameObject.SetActive(flag && val2.m_quality > 1); ((Component)_slotQualities[i]).transform.SetAsLastSibling(); } UpdateSlotDurability(i, val2, flag); if (_slotTooltips != null && i < _slotTooltips.Length && (Object)(object)_slotTooltips[i] != (Object)null) { if (flag && (Object)(object)_grid != (Object)null) { SetSlotTooltip(val2, _slotTooltips[i]); } else { _slotTooltips[i].Set("", "", ((Object)(object)_grid == (Object)null) ? null : _grid.m_tooltipAnchor, Vector2.zero); } } if (_slotHitboxes != null && i < _slotHitboxes.Length && (Object)(object)_slotHitboxes[i] != (Object)null) { ((Component)_slotHitboxes[i]).transform.SetAsLastSibling(); } } } private static void UpdateSlotDurability(int slot, ItemData item, bool hasItem) { //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0172: 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_0120: 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) bool flag = hasItem && item.m_shared != null && item.m_shared.m_useDurability && item.GetMaxDurability() > 0f; if (_slotDurabilityBacks != null && slot < _slotDurabilityBacks.Length && (Object)(object)_slotDurabilityBacks[slot] != (Object)null) { ((Component)_slotDurabilityBacks[slot]).gameObject.SetActive(flag); ((Component)_slotDurabilityBacks[slot]).transform.SetAsLastSibling(); } if (_slotDurabilityBars != null && slot < _slotDurabilityBars.Length && !((Object)(object)_slotDurabilityBars[slot] == (Object)null)) { Image val = _slotDurabilityBars[slot]; ((Component)val).gameObject.SetActive(flag); ((Component)val).transform.SetAsLastSibling(); if (flag) { float num = Mathf.Clamp01(item.m_durability / item.GetMaxDurability()); ((Graphic)val).rectTransform.sizeDelta = new Vector2((_cellSize.x - 8f) * num, 4f); ((Graphic)val).color = ((num > 0.5f) ? Color.Lerp(new Color(1f, 0.75f, 0.1f, 1f), new Color(0.1f, 0.85f, 0.15f, 1f), (num - 0.5f) * 2f) : Color.Lerp(new Color(0.85f, 0.1f, 0.05f, 1f), new Color(1f, 0.75f, 0.1f, 1f), num * 2f)); } } } private static void CreateSlotHitboxes(RectTransform gridRoot) { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0065: 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_0081: 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_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)gridRoot == (Object)null || _slotPositions == null) { return; } for (int i = 0; i < Slots.Length; i++) { int slotIndex = i; GameObject val = new GameObject("EquipmentSheet_" + Slots[i].Label + "_Hitbox", new Type[1] { typeof(RectTransform) }); val.transform.SetParent((Transform)(object)gridRoot, false); val.transform.SetAsLastSibling(); RectTransform component = val.GetComponent(); component.anchorMin = new Vector2(0f, 1f); component.anchorMax = new Vector2(0f, 1f); component.pivot = new Vector2(0f, 1f); component.anchoredPosition = _slotPositions[i]; component.sizeDelta = _cellSize; Image obj = val.AddComponent(); ((Graphic)obj).color = new Color(0f, 0f, 0f, 0f); ((Graphic)obj).raycastTarget = true; UIInputHandler val2 = val.AddComponent(); val2.m_onLeftDown = delegate { HandleSheetSlotClicked(slotIndex, rightClick: false); }; val2.m_onRightDown = delegate { HandleSheetSlotClicked(slotIndex, rightClick: true); }; _slotHitboxes[i] = val2; UITooltip val3 = val.AddComponent(); ConfigureSlotTooltip(val3); _slotTooltips[i] = val3; } } private static void ConfigureSlotTooltip(UITooltip tooltip) { if (!((Object)(object)tooltip == (Object)null)) { InventoryGui instance = InventoryGui.instance; UITooltip val = (((Object)(object)instance != (Object)null && (Object)(object)instance.m_playerGrid != (Object)null && (Object)(object)instance.m_playerGrid.m_elementPrefab != (Object)null) ? instance.m_playerGrid.m_elementPrefab.GetComponentInChildren(true) : null); if ((Object)(object)val != (Object)null) { tooltip.m_tooltipPrefab = val.m_tooltipPrefab; tooltip.m_gamepadFocusObject = val.m_gamepadFocusObject; } } } private static void SetSlotTooltip(ItemData item, UITooltip tooltip) { //IL_0084: Unknown result type (might be due to invalid IL or missing references) if (item != null && !((Object)(object)tooltip == (Object)null)) { if (_createItemTooltipMethod != null && (Object)(object)_grid != (Object)null) { _createItemTooltipMethod.Invoke(_grid, new object[2] { item, tooltip }); } else { string text = ((item.m_shared == null) ? "" : item.m_shared.m_name); tooltip.Set(text, item.GetTooltip(-1), ((Object)(object)_grid == (Object)null) ? null : _grid.m_tooltipAnchor, Vector2.zero); } } } private static void HandleSheetSlotClicked(int slotIndex, bool rightClick) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: 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) if (slotIndex < 0 || slotIndex >= Slots.Length || _equipmentInventory == null) { return; } InventoryGui instance = InventoryGui.instance; if (!((Object)(object)instance == (Object)null)) { Vector2i val = default(Vector2i); ((Vector2i)(ref val))..ctor(slotIndex % 3, slotIndex / 3); ItemData itemAt = _equipmentInventory.GetItemAt(val.x, val.y); if (IsFoodSlot(slotIndex) && itemAt != null && rightClick && !HasActiveDrag(instance)) { TryConsumeFoodSlot(slotIndex, itemAt); } else if (IsEquipmentSlot(slotIndex) && itemAt != null && rightClick && !HasActiveDrag(instance)) { MoveEquipmentItemToPlayerBag(itemAt); } else { HandleEquipmentGridSelected(instance, _grid, itemAt, val, (Modifier)0); } } } private static bool HasActiveDrag(InventoryGui gui) { if ((Object)(object)gui != (Object)null && _dragItemField != null) { return _dragItemField.GetValue(gui) is ItemData; } return false; } private static void TryConsumeFoodSlot(int slotIndex, ItemData item) { Player localPlayer = Player.m_localPlayer; if (!((Object)(object)localPlayer == (Object)null) && _equipmentInventory != null && IsFoodSlot(slotIndex) && MatchesSlot(item, slotIndex)) { ((Humanoid)localPlayer).UseItem(_equipmentInventory, item, true); RefreshEquipmentInventory(); SaveEquipmentInventory(localPlayer); } } private static void ValidateEquipmentInventory() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (_loadingInventory || _equipmentInventory == null) { return; } bool flag = false; List list = new List(_equipmentInventory.GetAllItems()); for (int i = 0; i < list.Count; i++) { ItemData val = list[i]; if (val != null && val.m_shared != null) { int slotIndex = GetSlotIndex(val.m_gridPos); if (slotIndex >= 0 && MatchesSlot(val, slotIndex)) { SetEquippedFlag(val, IsEquipmentSlot(slotIndex)); continue; } MoveItemBackToPlayerBag(val); flag = true; } } if (flag) { RefreshEquipmentInventory(); ShowWrongItemTypeMessage(); } SyncCharacterEquipment(Player.m_localPlayer); SaveEquipmentInventory(Player.m_localPlayer); } internal static void QueueAutoRouteEquippedItem(Humanoid humanoid, ItemData item, bool equipped) { Player val = (Player)(object)((humanoid is Player) ? humanoid : null); if (equipped && !((Object)(object)val == (Object)null) && !((Object)(object)val != (Object)(object)Player.m_localPlayer) && item != null) { Inventory inventory = ((Humanoid)val).GetInventory(); if (item == _manualSheetDragItem && inventory != null && inventory.ContainsItem(item)) { _manualSheetDragItem = null; PendingAutoRouteItems.Remove(item); ((Humanoid)val).UnequipItem(item, false); } else if (!((Object)(object)val != (Object)(object)_loadedPlayer) && _enabled != null && _enabled.Value && GetEquipmentSlotForItem(item) >= 0 && inventory != null && inventory.ContainsItem(item) && ((Humanoid)val).IsItemEquiped(item) && !PendingAutoRouteItems.Contains(item)) { PendingAutoRouteItems.Add(item); } } } private static void ProcessPendingAutoRouteItems(Player player) { if (PendingAutoRouteItems.Count != 0) { List list = new List(PendingAutoRouteItems); PendingAutoRouteItems.Clear(); for (int i = 0; i < list.Count; i++) { MoveEquippedBagItemToSheet(player, list[i]); } } } private static void MoveEquippedBagItemToSheet(Player player, ItemData item) { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: 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_010c: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0151: 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) if ((Object)(object)player == (Object)null || item == null || _equipmentInventory == null || !((Humanoid)player).IsItemEquiped(item)) { return; } int equipmentSlotForItem = GetEquipmentSlotForItem(item); Inventory inventory = ((Humanoid)player).GetInventory(); List inventoryItems = GetInventoryItems(inventory); List inventoryItems2 = GetInventoryItems(_equipmentInventory); if (equipmentSlotForItem < 0 || inventory == null || inventoryItems == null || inventoryItems2 == null || !inventoryItems.Contains(item)) { return; } Vector2i val = default(Vector2i); ((Vector2i)(ref val))..ctor(equipmentSlotForItem % 3, equipmentSlotForItem / 3); Vector2i gridPos = item.m_gridPos; if (inventory.GetItemAt(gridPos.x, gridPos.y) != item) { return; } ItemData itemAt = _equipmentInventory.GetItemAt(val.x, val.y); if (itemAt == item) { return; } inventoryItems.Remove(item); if (itemAt != null) { inventoryItems2.Remove(itemAt); itemAt.m_gridPos = gridPos; SetEquippedFlag(itemAt, equipped: false); inventoryItems.Add(itemAt); } item.m_gridPos = val; SetEquippedFlag(item, equipped: true); inventoryItems2.Add(item); if (_equipmentInventory.GetItemAt(val.x, val.y) != item || (itemAt != null && inventory.GetItemAt(gridPos.x, gridPos.y) != itemAt)) { inventoryItems2.Remove(item); item.m_gridPos = gridPos; SetEquippedFlag(item, equipped: true); inventoryItems.Add(item); if (itemAt != null) { inventoryItems.Remove(itemAt); itemAt.m_gridPos = val; SetEquippedFlag(itemAt, equipped: true); inventoryItems2.Add(itemAt); } } else { RefreshEquipmentInventory(); if (_inventoryChangedMethod != null) { _inventoryChangedMethod.Invoke(inventory, null); } SaveEquipmentInventory(player); } } private static void MoveEquipmentItemToPlayerBag(ItemData item) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_008d: 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_00a8: 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_00d5: Unknown result type (might be due to invalid IL or missing references) Player localPlayer = Player.m_localPlayer; Inventory val = (((Object)(object)localPlayer == (Object)null) ? null : ((Humanoid)localPlayer).GetInventory()); List inventoryItems = GetInventoryItems(val); List inventoryItems2 = GetInventoryItems(_equipmentInventory); if ((Object)(object)localPlayer == (Object)null || item == null || val == null || inventoryItems == null || inventoryItems2 == null || !inventoryItems2.Contains(item)) { return; } Vector2i val2 = FindFirstEmptyPosition(val); if (val2.x < 0) { ((Character)localPlayer).Message((MessageType)2, "$inventory_full", 0, (Sprite)null); return; } Vector2i gridPos = item.m_gridPos; SavePendingTransfer(localPlayer, item); ((Humanoid)localPlayer).UnequipItem(item, false); inventoryItems2.Remove(item); item.m_gridPos = val2; SetEquippedFlag(item, equipped: false); inventoryItems.Add(item); if (val.GetItemAt(val2.x, val2.y) != item || _equipmentInventory.ContainsItem(item)) { inventoryItems.Remove(item); item.m_gridPos = gridPos; SetEquippedFlag(item, equipped: true); inventoryItems2.Add(item); SyncCharacterEquipment(localPlayer); ClearPendingTransfer(localPlayer); } else { RefreshEquipmentInventory(); if (_inventoryChangedMethod != null) { _inventoryChangedMethod.Invoke(val, null); } SaveEquipmentInventory(localPlayer); ClearPendingTransfer(localPlayer); } } private static Vector2i FindFirstEmptyPosition(Inventory inventory) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) if (inventory == null) { return new Vector2i(-1, -1); } int width = inventory.GetWidth(); int height = inventory.GetHeight(); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (inventory.GetItemAt(j, i) == null) { return new Vector2i(j, i); } } } return new Vector2i(-1, -1); } private static int GetEquipmentSlotForItem(ItemData item) { for (int i = 0; i < 6; i++) { if (MatchesSlot(item, i)) { return i; } } return -1; } private static FieldInfo GetHumanoidFieldForType(ItemType type) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Invalid comparison between Unknown and I4 //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Invalid comparison between Unknown and I4 //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Invalid comparison between Unknown and I4 //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Invalid comparison between Unknown and I4 //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Invalid comparison between Unknown and I4 if ((int)type <= 11) { if ((int)type == 6) { return _humanoidHelmetField; } if ((int)type == 7) { return _humanoidChestField; } if ((int)type == 11) { return _humanoidLegField; } } else { if ((int)type == 17) { return _humanoidShoulderField; } if ((int)type == 18) { return _humanoidUtilityField; } if ((int)type == 24) { return _humanoidTrinketField; } } return null; } private static void SyncCharacterEquipment(Player player) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)player == (Object)null || _equipmentInventory == null || _setupEquipmentMethod == null) { return; } bool flag = false; Vector2i val = default(Vector2i); for (int i = 0; i < 6; i++) { FieldInfo humanoidFieldForType = GetHumanoidFieldForType(Slots[i].Type); if (humanoidFieldForType == null) { continue; } ((Vector2i)(ref val))..ctor(i % 3, i / 3); ItemData val2 = _equipmentInventory.GetItemAt(val.x, val.y); if (val2 != null && (val2.m_shared == null || !MatchesSlot(val2, i))) { val2 = null; } object? value = humanoidFieldForType.GetValue(player); ItemData val3 = (ItemData)((value is ItemData) ? value : null); if (val3 == val2) { continue; } bool flag2 = val3 != null && _equipmentInventory.ContainsItem(val3); if (val2 != null || flag2) { if (val3 != null) { ((Humanoid)player).UnequipItem(val3, false); } if (val2 != null) { humanoidFieldForType.SetValue(player, val2); SetEquippedFlag(val2, equipped: true); } flag = true; } } if (flag) { _setupEquipmentMethod.Invoke(player, null); } } internal static bool IsEquipmentGrid(InventoryGrid grid) { if ((Object)(object)grid != (Object)null && (Object)(object)_grid != (Object)null) { return (Object)(object)grid == (Object)(object)_grid; } return false; } internal static bool BeginContainerUpdateGuard(InventoryGui gui) { if ((Object)(object)gui == (Object)null || _dragInventoryField == null || _currentContainerField == null) { return false; } object? value = _dragInventoryField.GetValue(gui); Inventory val = (Inventory)((value is Inventory) ? value : null); if (val == null || val != _equipmentInventory) { return false; } object? value2 = _currentContainerField.GetValue(gui); if ((Object)((value2 is Container) ? value2 : null) != (Object)null) { return false; } Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { return false; } _dragInventoryField.SetValue(gui, ((Humanoid)localPlayer).GetInventory()); return true; } internal static void EndContainerUpdateGuard(InventoryGui gui, bool didSwap) { if (didSwap && !((Object)(object)gui == (Object)null) && !(_dragInventoryField == null)) { _dragInventoryField.SetValue(gui, _equipmentInventory); } } internal static bool TryDropIntoEquipmentSlot(Inventory fromInventory, ItemData item, int amount, Vector2i pos) { //IL_001c: 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) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0104: 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_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) if (_equipmentInventory == null || fromInventory == null || item == null || item.m_shared == null) { return false; } if (_equipmentInventory.GetItemAt(pos.x, pos.y) == item) { return true; } int slotIndex = GetSlotIndex(pos); if (slotIndex < 0 || !MatchesSlot(item, slotIndex)) { ShowWrongItemTypeMessage(); return false; } if (IsFoodSlot(slotIndex)) { return TryDropIntoFoodSlot(fromInventory, item, amount, pos); } if (_equipmentInventory.GetItemAt(pos.x, pos.y) != null) { return false; } if (Mathf.Clamp((amount <= 0) ? item.m_stack : amount, 1, item.m_stack) != item.m_stack) { ShowWrongItemTypeMessage(); return false; } if (fromInventory == _equipmentInventory) { item.m_gridPos = pos; SetEquippedFlag(item, equipped: true); RefreshEquipmentInventory(); SaveEquipmentInventory(Player.m_localPlayer); return true; } Player localPlayer = Player.m_localPlayer; SavePendingTransfer(localPlayer, item); List inventoryItems = GetInventoryItems(fromInventory); List inventoryItems2 = GetInventoryItems(_equipmentInventory); if (inventoryItems == null || inventoryItems2 == null || !inventoryItems.Contains(item)) { ClearPendingTransfer(localPlayer); return false; } Vector2i gridPos = item.m_gridPos; inventoryItems.Remove(item); item.m_gridPos = pos; SetEquippedFlag(item, equipped: true); inventoryItems2.Add(item); if (_equipmentInventory.GetItemAt(pos.x, pos.y) != item) { inventoryItems2.Remove(item); item.m_gridPos = gridPos; SetEquippedFlag(item, equipped: false); inventoryItems.Add(item); RestorePendingTransfer(localPlayer); return false; } RefreshEquipmentInventory(); if (_inventoryChangedMethod != null) { _inventoryChangedMethod.Invoke(fromInventory, null); } SaveEquipmentInventory(Player.m_localPlayer); ClearPendingTransfer(localPlayer); return true; } private static bool TryDropIntoFoodSlot(Inventory fromInventory, ItemData item, int amount, Vector2i pos) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_006f: 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_0059: Unknown result type (might be due to invalid IL or missing references) if (_equipmentInventory == null || fromInventory == null || item == null || !IsFoodItem(item)) { return false; } int num = Mathf.Clamp((amount <= 0) ? item.m_stack : amount, 1, item.m_stack); ItemData itemAt = _equipmentInventory.GetItemAt(pos.x, pos.y); if (itemAt == item) { return true; } if (fromInventory == _equipmentInventory) { return TryMoveFoodInsideSheet(item, num, itemAt, pos); } int stack = item.m_stack; bool flag = _equipmentInventory.MoveItemToThis(fromInventory, item, num, pos.x, pos.y); if (!(item.m_stack != stack || flag)) { return false; } SetEquippedFlag(item, equipped: false); RefreshEquipmentInventory(); if (_inventoryChangedMethod != null) { _inventoryChangedMethod.Invoke(fromInventory, null); } SaveEquipmentInventory(Player.m_localPlayer); return true; } private static bool TryMoveFoodInsideSheet(ItemData item, int amount, ItemData target, Vector2i pos) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) List inventoryItems = GetInventoryItems(_equipmentInventory); if (inventoryItems == null || item == null || !inventoryItems.Contains(item)) { return false; } if (target == null) { item.m_gridPos = pos; SetEquippedFlag(item, equipped: false); RefreshEquipmentInventory(); SaveEquipmentInventory(Player.m_localPlayer); return true; } if (!CanStackFood(target, item)) { return false; } int num = target.m_shared.m_maxStackSize - target.m_stack; if (num <= 0) { return false; } int num2 = Mathf.Min(Mathf.Clamp(amount, 1, item.m_stack), num); target.m_stack += num2; item.m_stack -= num2; SetEquippedFlag(target, equipped: false); SetEquippedFlag(item, equipped: false); if (item.m_stack <= 0) { inventoryItems.Remove(item); } RefreshEquipmentInventory(); SaveEquipmentInventory(Player.m_localPlayer); return true; } private static bool CanStackFood(ItemData target, ItemData item) { if (target == null || item == null || target.m_shared == null || item.m_shared == null) { return false; } if (target.m_shared.m_name == item.m_shared.m_name && target.m_quality == item.m_quality && target.m_worldLevel == item.m_worldLevel) { return target.m_shared.m_maxStackSize > 1; } return false; } private static void HandleEquipmentGridSelected(InventoryGui gui, InventoryGrid grid, ItemData item, Vector2i pos, Modifier mod) { //IL_007b: Unknown result type (might be due to invalid IL or missing references) if (!IsEquipmentGrid(grid) || (Object)(object)gui == (Object)null) { return; } ItemData val = (ItemData)((_dragItemField == null) ? null : /*isinst with value type is only supported in some contexts*/); Inventory fromInventory = (Inventory)((_dragInventoryField == null) ? null : /*isinst with value type is only supported in some contexts*/); int amount = ((!(_dragAmountField == null)) ? ((int)_dragAmountField.GetValue(gui)) : 0); if (val != null) { if (TryDropIntoEquipmentSlot(fromInventory, val, amount, pos)) { ClearDragItem(gui); } } else if (item != null && _setupDragItemMethod != null) { SetEquippedFlag(item, equipped: false); _manualSheetDragItem = item; _setupDragItemMethod.Invoke(gui, new object[3] { item, _equipmentInventory, item.m_stack }); } } private static void ClearDragItem(InventoryGui gui) { if (!((Object)(object)gui == (Object)null)) { ItemData val = (ItemData)((_dragItemField == null) ? null : /*isinst with value type is only supported in some contexts*/); if (_manualSheetDragItem == val) { _manualSheetDragItem = null; } GameObject val2 = (GameObject)((_dragGoField == null) ? null : /*isinst with value type is only supported in some contexts*/); if ((Object)(object)val2 != (Object)null) { Object.Destroy((Object)(object)val2); } if (_dragGoField != null) { _dragGoField.SetValue(gui, null); } if (_dragItemField != null) { _dragItemField.SetValue(gui, null); } if (_dragInventoryField != null) { _dragInventoryField.SetValue(gui, null); } if (_dragAmountField != null) { _dragAmountField.SetValue(gui, 0); } } } private static int GetSlotIndex(Vector2i pos) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0009: 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_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) if (pos.x < 0 || pos.x >= 3 || pos.y < 0 || pos.y >= 3) { return -1; } int num = pos.y * 3 + pos.x; if (num < 0 || num >= Slots.Length) { return -1; } return num; } private static bool IsEquipmentSlot(int slot) { if (slot >= 0 && slot < 6 && slot < Slots.Length) { return Slots[slot].Kind == SlotKind.Equipment; } return false; } private static bool IsFoodSlot(int slot) { if (slot >= 6 && slot < Slots.Length) { return Slots[slot].Kind == SlotKind.Food; } return false; } private static bool MatchesSlot(ItemData item, int slot) { //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_0040: 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_0052: Unknown result type (might be due to invalid IL or missing references) if (item == null || item.m_shared == null || slot < 0 || slot >= Slots.Length) { return false; } if (IsFoodSlot(slot)) { return IsFoodItem(item); } if (!IsEquipmentSlot(slot)) { return false; } ItemType itemType = item.m_shared.m_itemType; if (IsExplicitlyExcludedEquipmentType(itemType)) { return false; } return itemType == Slots[slot].Type; } private static bool IsFoodItem(ItemData item) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Invalid comparison between Unknown and I4 if (item == null || item.m_shared == null) { return false; } if ((int)item.m_shared.m_itemType == 2) { if (!(item.m_shared.m_food > 0f) && !(item.m_shared.m_foodStamina > 0f) && !(item.m_shared.m_foodEitr > 0f)) { return (Object)(object)item.m_shared.m_consumeStatusEffect != (Object)null; } return true; } return false; } private unsafe static bool IsExplicitlyExcludedEquipmentType(ItemType type) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Invalid comparison between Unknown and I4 //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Invalid comparison between Unknown and I4 //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Invalid comparison between Unknown and I4 //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Invalid comparison between Unknown and I4 //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Invalid comparison between Unknown and I4 if ((int)type == 4 || (int)type == 3 || (int)type == 14 || (int)type == 22 || (int)type == 20 || (int)type == 5 || (int)type == 19 || (int)type == 15) { return true; } string text = ((object)(*(ItemType*)(&type))/*cast due to .constrained prefix*/).ToString(); if (text.IndexOf("Bow", StringComparison.OrdinalIgnoreCase) < 0) { return text.IndexOf("Ranged", StringComparison.OrdinalIgnoreCase) >= 0; } return true; } private static void MoveItemBackToPlayerBag(ItemData item) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) Player localPlayer = Player.m_localPlayer; Inventory val = (((Object)(object)localPlayer == (Object)null) ? null : ((Humanoid)localPlayer).GetInventory()); if (item == null || val == null || _equipmentInventory == null || !_equipmentInventory.ContainsItem(item)) { return; } SetEquippedFlag(item, equipped: false); if (!val.AddItem(item)) { int slotIndex = GetSlotIndex(item.m_gridPos); SetEquippedFlag(item, slotIndex >= 0 && IsEquipmentSlot(slotIndex) && MatchesSlot(item, slotIndex)); if (_log != null) { _log.LogWarning((object)("Equipment Sheet: invalid item '" + GetItemDisplayName(item) + "' is in an equipment slot, but the player bag is full.")); } } else { _equipmentInventory.RemoveItem(item); if (_log != null) { _log.LogInfo((object)("Equipment Sheet: moved invalid item '" + GetItemDisplayName(item) + "' back to the player bag.")); } } } internal static void SaveEquipmentInventory(Player player) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown if (!((Object)(object)player == (Object)null) && _equipmentInventory != null) { Dictionary customData = GetCustomData(player); if (customData != null) { ZPackage val = new ZPackage(); _equipmentInventory.Save(val); customData["is.codex.valheim.equipmentsheet.inventory.v1"] = val.GetBase64(); } } } private static void SavePendingTransfer(Player player, ItemData item) { //IL_0020: 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_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown if (!((Object)(object)player == (Object)null) && item != null) { Dictionary customData = GetCustomData(player); if (customData != null) { Inventory val = new Inventory("EquipmentSheetPending", (Sprite)null, 1, 1); ItemData val2 = item.Clone(); val2.m_gridPos = new Vector2i(0, 0); val.AddItem(val2, val2.m_gridPos); ZPackage val3 = new ZPackage(); val.Save(val3); customData["is.codex.valheim.equipmentsheet.pending-transfer.v1"] = val3.GetBase64(); } } } private static void ClearPendingTransfer(Player player) { GetCustomData(player)?.Remove("is.codex.valheim.equipmentsheet.pending-transfer.v1"); } private static void RestorePendingTransfer(Player player) { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //IL_0057: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)player == (Object)null) { return; } Dictionary customData = GetCustomData(player); if (customData == null || !customData.TryGetValue("is.codex.valheim.equipmentsheet.pending-transfer.v1", out var value) || string.IsNullOrEmpty(value)) { return; } Inventory inventory = ((Humanoid)player).GetInventory(); if (inventory == null) { return; } try { Inventory val = new Inventory("EquipmentSheetPending", (Sprite)null, 1, 1); ZPackage val2 = new ZPackage(); val2.Load(Convert.FromBase64String(value)); val.Load(val2); List allItems = val.GetAllItems(); for (int i = 0; i < allItems.Count; i++) { ItemData val3 = allItems[i]; if (val3 != null) { ItemData val4 = val3.Clone(); SetEquippedFlag(val4, equipped: false); inventory.AddItem(val4); } } ClearPendingTransfer(player); if (_inventoryChangedMethod != null) { _inventoryChangedMethod.Invoke(inventory, null); } if (_log != null) { _log.LogWarning((object)"Equipment Sheet: restored an interrupted equipment transfer back to the player bag."); } } catch (Exception ex) { if (_log != null) { _log.LogWarning((object)("Equipment Sheet: failed to restore pending transfer: " + ex.Message)); } } } internal static void LoadEquipmentInventory(Player player) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown EnsureEquipmentInventory(); Dictionary customData = GetCustomData(player); if (customData == null || !customData.TryGetValue("is.codex.valheim.equipmentsheet.inventory.v1", out var value) || string.IsNullOrEmpty(value)) { ClearEquipmentInventory(player, clearSavedData: false); return; } try { _loadingInventory = true; ZPackage val = new ZPackage(); val.Load(Convert.FromBase64String(value)); _equipmentInventory.RemoveAll(); _equipmentInventory.Load(val); MarkEquipmentItemsEquipped(); RefreshEquipmentInventory(); if (_log != null) { _log.LogInfo((object)"Equipment Sheet: loaded persistent equipment inventory."); } } catch (Exception ex) { if (_log != null) { _log.LogWarning((object)("Equipment Sheet: failed to load persistent equipment inventory: " + ex.Message)); } } finally { _loadingInventory = false; } SyncCharacterEquipment(player); } internal static void MoveSheetItemsToPlayerInventoryForDeath(Player player) { //IL_005e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)player == (Object)null || _equipmentInventory == null) { return; } Inventory inventory = ((Humanoid)player).GetInventory(); List inventoryItems = GetInventoryItems(inventory); List inventoryItems2 = GetInventoryItems(_equipmentInventory); if (inventory == null || inventoryItems == null || inventoryItems2 == null || inventoryItems2.Count == 0) { ClearEquipmentCustomData(player); return; } List list = new List(inventoryItems2); for (int i = 0; i < list.Count; i++) { ItemData val = list[i]; if (val != null) { int slotIndex = GetSlotIndex(val.m_gridPos); SetEquippedFlag(val, slotIndex >= 0 && IsEquipmentSlot(slotIndex) && MatchesSlot(val, slotIndex)); if (!inventoryItems.Contains(val)) { inventoryItems.Add(val); } inventoryItems2.Remove(val); } } ClearEquipmentCustomData(player); RefreshEquipmentInventory(); if (_inventoryChangedMethod != null) { _inventoryChangedMethod.Invoke(inventory, null); } if (_log != null) { _log.LogInfo((object)"Equipment Sheet: moved sheet items into the vanilla death-drop inventory."); } } private static void ClearEquipmentInventory(Player player, bool clearSavedData) { if (_equipmentInventory != null && _equipmentInventory.NrOfItems() > 0) { List oldItems = new List(_equipmentInventory.GetAllItems()); _loadingInventory = true; try { _equipmentInventory.RemoveAll(); } finally { _loadingInventory = false; } RefreshEquipmentInventory(); ClearCharacterEquipmentReferences(player, oldItems); } if (clearSavedData) { ClearEquipmentCustomData(player); } } private static void ClearCharacterEquipmentReferences(Player player, List oldItems) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)player == (Object)null || oldItems == null || oldItems.Count == 0 || _setupEquipmentMethod == null) { return; } bool flag = false; for (int i = 0; i < 6; i++) { FieldInfo humanoidFieldForType = GetHumanoidFieldForType(Slots[i].Type); if (!(humanoidFieldForType == null)) { object? value = humanoidFieldForType.GetValue(player); ItemData val = (ItemData)((value is ItemData) ? value : null); if (val != null && oldItems.Contains(val)) { humanoidFieldForType.SetValue(player, null); SetEquippedFlag(val, equipped: false); flag = true; } } } if (flag) { _setupEquipmentMethod.Invoke(player, null); } } private static void ClearEquipmentCustomData(Player player) { Dictionary customData = GetCustomData(player); if (customData != null) { customData.Remove("is.codex.valheim.equipmentsheet.inventory.v1"); customData.Remove("is.codex.valheim.equipmentsheet.pending-transfer.v1"); } } private static void MarkEquipmentItemsEquipped() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) if (_equipmentInventory != null) { List allItems = _equipmentInventory.GetAllItems(); for (int i = 0; i < allItems.Count; i++) { ItemData val = allItems[i]; int num = ((val == null) ? (-1) : GetSlotIndex(val.m_gridPos)); SetEquippedFlag(val, num >= 0 && IsEquipmentSlot(num) && MatchesSlot(val, num)); } } } private static void RefreshEquipmentInventory() { if (_equipmentInventory != null && _inventoryChangedMethod != null) { _inventoryChangedMethod.Invoke(_equipmentInventory, null); } } private static void SetEquippedFlag(ItemData item, bool equipped) { if (_itemEquippedField != null && item != null) { _itemEquippedField.SetValue(item, equipped); } } private static List GetInventoryItems(Inventory inventory) { if (!(_inventoryItemsField == null) && inventory != null) { return _inventoryItemsField.GetValue(inventory) as List; } return null; } internal static float GetEquipmentWeight() { if (_equipmentInventory != null) { return _equipmentInventory.GetTotalWeight(); } return 0f; } internal static bool BeginUpgradeRecipeScan(InventoryGui gui) { int num; if ((Object)(object)gui != (Object)null && _enabled != null && _enabled.Value) { num = (gui.InUpradeTab() ? 1 : 0); if (num != 0) { _upgradeRecipeScanDepth++; } } else { num = 0; } return (byte)num != 0; } internal static void EndUpgradeRecipeScan(bool active) { if (active && _upgradeRecipeScanDepth > 0) { _upgradeRecipeScanDepth--; } } internal static void AddSheetUpgradeItems(Inventory inventory, string name, List items) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) Player localPlayer = Player.m_localPlayer; if (_upgradeRecipeScanDepth <= 0 || _equipmentInventory == null || (Object)(object)localPlayer == (Object)null || inventory != ((Humanoid)localPlayer).GetInventory() || string.IsNullOrEmpty(name) || items == null) { return; } List allItems = _equipmentInventory.GetAllItems(); for (int i = 0; i < allItems.Count; i++) { ItemData val = allItems[i]; int num = ((val == null) ? (-1) : GetSlotIndex(val.m_gridPos)); if (num >= 0 && IsEquipmentSlot(num) && MatchesSlot(val, num) && val.m_shared.m_name == name && val.m_worldLevel >= Game.m_worldLevel && !items.Contains(val)) { items.Add(val); } } } internal static bool BeginSheetUpgrade(InventoryGui gui, Player player) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)gui == (Object)null || (Object)(object)player == (Object)null || _equipmentInventory == null || _craftUpgradeItemField == null) { return false; } object? value = _craftUpgradeItemField.GetValue(gui); ItemData val = (ItemData)((value is ItemData) ? value : null); int num = ((val == null) ? (-1) : GetSlotIndex(val.m_gridPos)); if (num < 0 || !IsEquipmentSlot(num) || !MatchesSlot(val, num) || !_equipmentInventory.ContainsItem(val)) { return false; } Inventory inventory = ((Humanoid)player).GetInventory(); if (inventory == null) { return false; } if (_sheetUpgradeTransaction != null) { EndSheetUpgrade(new InvalidOperationException("A previous equipment upgrade transaction was still active.")); } SavePendingTransfer(player, val); _sheetUpgradeTransaction = new SheetUpgradeTransaction { Player = player, PlayerInventory = inventory, OriginalItem = val, SheetPosition = val.m_gridPos }; return true; } internal static void EndSheetUpgrade(Exception exception) { //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) SheetUpgradeTransaction sheetUpgradeTransaction = _sheetUpgradeTransaction; _sheetUpgradeTransaction = null; if (sheetUpgradeTransaction == null) { return; } int num; if (exception == null && sheetUpgradeTransaction.OriginalRemoved) { num = ((sheetUpgradeTransaction.ReplacementItem != null) ? 1 : 0); if (num != 0) { goto IL_00bd; } } else { num = 0; } if (sheetUpgradeTransaction.OriginalRemoved) { List inventoryItems = GetInventoryItems(_equipmentInventory); if (inventoryItems != null) { if (sheetUpgradeTransaction.ReplacementItem != null) { inventoryItems.Remove(sheetUpgradeTransaction.ReplacementItem); } if (!inventoryItems.Contains(sheetUpgradeTransaction.OriginalItem)) { sheetUpgradeTransaction.OriginalItem.m_gridPos = sheetUpgradeTransaction.SheetPosition; SetEquippedFlag(sheetUpgradeTransaction.OriginalItem, equipped: true); inventoryItems.Add(sheetUpgradeTransaction.OriginalItem); } } if (_log != null) { _log.LogWarning((object)("Equipment Sheet: restored '" + GetItemDisplayName(sheetUpgradeTransaction.OriginalItem) + "' after its upgrade did not complete.")); } } goto IL_00bd; IL_00bd: if (num != 0) { SetEquippedFlag(sheetUpgradeTransaction.ReplacementItem, equipped: true); } RefreshEquipmentInventory(); SyncCharacterEquipment(sheetUpgradeTransaction.Player); SaveEquipmentInventory(sheetUpgradeTransaction.Player); ClearPendingTransfer(sheetUpgradeTransaction.Player); } internal static void IncludeSheetUpgradeItem(Inventory inventory, ItemData item, ref bool result) { SheetUpgradeTransaction sheetUpgradeTransaction = _sheetUpgradeTransaction; if (!result && sheetUpgradeTransaction != null && inventory == sheetUpgradeTransaction.PlayerInventory && item == sheetUpgradeTransaction.OriginalItem && _equipmentInventory != null && _equipmentInventory.ContainsItem(item)) { result = true; } } internal static bool RemoveSheetUpgradeItem(Inventory inventory, ItemData item, ref bool result) { SheetUpgradeTransaction sheetUpgradeTransaction = _sheetUpgradeTransaction; if (sheetUpgradeTransaction == null || inventory != sheetUpgradeTransaction.PlayerInventory || item != sheetUpgradeTransaction.OriginalItem) { return true; } result = _equipmentInventory != null && _equipmentInventory.RemoveItem(item); sheetUpgradeTransaction.OriginalRemoved = result; return false; } internal static bool AddUpgradedSheetItem(Inventory inventory, string name, int stack, int quality, int variant, long crafterID, string crafterName, Vector2i position, bool pickedUp, ref ItemData result) { //IL_0072: 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_00ad: Unknown result type (might be due to invalid IL or missing references) SheetUpgradeTransaction sheetUpgradeTransaction = _sheetUpgradeTransaction; if (sheetUpgradeTransaction == null || !sheetUpgradeTransaction.OriginalRemoved || inventory != sheetUpgradeTransaction.PlayerInventory || sheetUpgradeTransaction.OriginalItem == null || (Object)(object)sheetUpgradeTransaction.OriginalItem.m_dropPrefab == (Object)null || name != ((Object)sheetUpgradeTransaction.OriginalItem.m_dropPrefab).name || quality != sheetUpgradeTransaction.OriginalItem.m_quality + 1 || variant != sheetUpgradeTransaction.OriginalItem.m_variant || position.x != sheetUpgradeTransaction.SheetPosition.x || position.y != sheetUpgradeTransaction.SheetPosition.y) { return true; } result = _equipmentInventory.AddItem(name, stack, quality, variant, crafterID, crafterName, sheetUpgradeTransaction.SheetPosition, pickedUp); sheetUpgradeTransaction.ReplacementItem = result; return false; } internal static void AddEquippedItems(List items) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) if (_equipmentInventory == null || items == null) { return; } List allItems = _equipmentInventory.GetAllItems(); for (int i = 0; i < allItems.Count; i++) { ItemData val = allItems[i]; int num = ((val == null) ? (-1) : GetSlotIndex(val.m_gridPos)); if (num >= 0 && IsEquipmentSlot(num) && MatchesSlot(val, num) && !items.Contains(val)) { SetEquippedFlag(val, equipped: true); items.Add(val); } } } internal static void AddWornEquippedItems(List items) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) if (_equipmentInventory == null || items == null) { return; } List allItems = _equipmentInventory.GetAllItems(); for (int i = 0; i < allItems.Count; i++) { ItemData val = allItems[i]; int num = ((val == null) ? (-1) : GetSlotIndex(val.m_gridPos)); if (num >= 0 && IsEquipmentSlot(num) && MatchesSlot(val, num) && !items.Contains(val) && val.m_shared.m_useDurability && val.m_durability < val.GetMaxDurability()) { items.Add(val); } } } private static Dictionary GetCustomData(Player player) { if (!(_customDataField == null) && !((Object)(object)player == (Object)null)) { return _customDataField.GetValue(player) as Dictionary; } return null; } private static string GetItemDisplayName(ItemData item) { if (item == null || item.m_shared == null || string.IsNullOrEmpty(item.m_shared.m_name)) { return ""; } return item.m_shared.m_name; } private static void ShowWrongItemTypeMessage() { if (!(Time.time - _lastWrongTypeMessageTime < 2f)) { _lastWrongTypeMessageTime = Time.time; if ((Object)(object)MessageHud.instance != (Object)null) { MessageHud.instance.ShowMessage((MessageType)2, "That item doesn't belong in that slot.", 0, (Sprite)null, false); } } } } [HarmonyPatch(typeof(InventoryGui), "UpdateContainer")] internal static class InventoryGuiUpdateContainerEquipmentSheetPatch { private static void Prefix(InventoryGui __instance, ref bool __state) { __state = EquipmentSheetPlugin.BeginContainerUpdateGuard(__instance); } private static void Postfix(InventoryGui __instance, bool __state) { EquipmentSheetPlugin.EndContainerUpdateGuard(__instance, __state); } } [HarmonyPatch(typeof(InventoryGui), "Awake")] internal static class InventoryGuiAwakeEquipmentSheetPatch { private static void Postfix(InventoryGui __instance) { EquipmentSheetPlugin.SetupPanel(__instance); } } [HarmonyPatch(typeof(Player), "Save")] internal static class PlayerSaveEquipmentSheetPatch { private static void Prefix(Player __instance) { EquipmentSheetPlugin.SaveEquipmentInventory(__instance); } } [HarmonyPatch(typeof(Player), "Load")] internal static class PlayerLoadEquipmentSheetPatch { private static void Postfix(Player __instance) { EquipmentSheetPlugin.LoadEquipmentInventory(__instance); } } [HarmonyPatch(typeof(Player), "CreateTombStone")] internal static class PlayerCreateTombStoneEquipmentSheetPatch { private static void Prefix(Player __instance) { EquipmentSheetPlugin.MoveSheetItemsToPlayerInventoryForDeath(__instance); } } [HarmonyPatch(typeof(Humanoid), "EquipItem", new Type[] { typeof(ItemData), typeof(bool) })] internal static class HumanoidEquipItemEquipmentSheetPatch { private static void Postfix(Humanoid __instance, ItemData item, bool __result) { EquipmentSheetPlugin.QueueAutoRouteEquippedItem(__instance, item, __result); } } [HarmonyPatch(typeof(InventoryGui), "UpdateRecipeList", new Type[] { typeof(List) })] internal static class InventoryGuiUpdateRecipeListEquipmentSheetPatch { private static void Prefix(InventoryGui __instance, ref bool __state) { __state = EquipmentSheetPlugin.BeginUpgradeRecipeScan(__instance); } private static Exception Finalizer(Exception __exception, bool __state) { EquipmentSheetPlugin.EndUpgradeRecipeScan(__state); return __exception; } } [HarmonyPatch(typeof(InventoryGui), "DoCrafting", new Type[] { typeof(Player) })] internal static class InventoryGuiDoCraftingEquipmentSheetPatch { private static void Prefix(InventoryGui __instance, Player player) { EquipmentSheetPlugin.BeginSheetUpgrade(__instance, player); } private static Exception Finalizer(Exception __exception) { EquipmentSheetPlugin.EndSheetUpgrade(__exception); return __exception; } } [HarmonyPatch(typeof(Inventory), "GetAllItems", new Type[] { typeof(string), typeof(List) })] internal static class InventoryGetAllItemsByNameEquipmentSheetPatch { private static void Postfix(Inventory __instance, string name, List items) { EquipmentSheetPlugin.AddSheetUpgradeItems(__instance, name, items); } } [HarmonyPatch(typeof(Inventory), "ContainsItem", new Type[] { typeof(ItemData) })] internal static class InventoryContainsItemEquipmentSheetPatch { private static void Postfix(Inventory __instance, ItemData item, ref bool __result) { EquipmentSheetPlugin.IncludeSheetUpgradeItem(__instance, item, ref __result); } } [HarmonyPatch(typeof(Inventory), "RemoveItem", new Type[] { typeof(ItemData) })] internal static class InventoryRemoveItemEquipmentSheetPatch { private static bool Prefix(Inventory __instance, ItemData item, ref bool __result) { return EquipmentSheetPlugin.RemoveSheetUpgradeItem(__instance, item, ref __result); } } [HarmonyPatch(typeof(Inventory), "AddItem", new Type[] { typeof(string), typeof(int), typeof(int), typeof(int), typeof(long), typeof(string), typeof(Vector2i), typeof(bool) })] internal static class InventoryAddCraftedItemEquipmentSheetPatch { private static bool Prefix(Inventory __instance, string name, int stack, int quality, int variant, long crafterID, string crafterName, Vector2i position, bool pickedUp, ref ItemData __result) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return EquipmentSheetPlugin.AddUpgradedSheetItem(__instance, name, stack, quality, variant, crafterID, crafterName, position, pickedUp, ref __result); } } [HarmonyPatch(typeof(Inventory), "GetTotalWeight")] internal static class InventoryTotalWeightEquipmentSheetPatch { private static void Postfix(Inventory __instance, ref float __result) { Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer != (Object)null && __instance == ((Humanoid)localPlayer).GetInventory()) { __result += EquipmentSheetPlugin.GetEquipmentWeight(); } } } [HarmonyPatch(typeof(Inventory), "GetEquippedItems")] internal static class InventoryGetEquippedItemsEquipmentSheetPatch { private static void Postfix(Inventory __instance, ref List __result) { Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer != (Object)null && __instance == ((Humanoid)localPlayer).GetInventory()) { EquipmentSheetPlugin.AddEquippedItems(__result); } } } [HarmonyPatch(typeof(Inventory), "GetWornItems")] internal static class InventoryGetWornItemsEquipmentSheetPatch { private static void Postfix(Inventory __instance, List worn) { Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer != (Object)null && __instance == ((Humanoid)localPlayer).GetInventory()) { EquipmentSheetPlugin.AddWornEquippedItems(worn); } } } [HarmonyPatch(typeof(InventoryGrid), "DropItem")] internal static class InventoryGridDropItemEquipmentSheetPatch { private static bool Prefix(InventoryGrid __instance, Inventory __0, ItemData __1, int __2, Vector2i __3, ref bool __result) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) if (!EquipmentSheetPlugin.IsEquipmentGrid(__instance)) { return true; } __result = EquipmentSheetPlugin.TryDropIntoEquipmentSlot(__0, __1, __2, __3); return false; } }