Skip to content

Commit 48af12e

Browse files
Move placeholder item to public ItemUtils
1 parent 77bfc92 commit 48af12e

5 files changed

Lines changed: 49 additions & 33 deletions

File tree

invui/src/main/java/xyz/xenondevs/invui/internal/menu/CustomMerchantMenu.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
import org.bukkit.entity.Player;
1717
import org.jspecify.annotations.Nullable;
1818
import xyz.xenondevs.invui.internal.network.PacketListener;
19-
import xyz.xenondevs.invui.internal.util.ItemUtils2;
2019
import xyz.xenondevs.invui.internal.util.MathUtils;
2120
import xyz.xenondevs.invui.item.Item;
21+
import xyz.xenondevs.invui.util.ItemUtils;
2222
import xyz.xenondevs.invui.window.MerchantWindow;
2323

2424
import java.lang.invoke.MethodHandle;
@@ -141,9 +141,9 @@ private MerchantOffer toMerchantOffer(MerchantWindow.Trade trade) {
141141

142142
private ItemStack toItemStack(@Nullable Item item) {
143143
if (item == null)
144-
return CraftItemStack.unwrap(ItemUtils2.getNonEmptyPlaceholder());
144+
return CraftItemStack.unwrap(ItemUtils.getPlaceholder());
145145

146-
var itemStack = CraftItemStack.unwrap(ItemUtils2.nonEmpty(item.getItemProvider(player).get(player.locale())));
146+
var itemStack = CraftItemStack.unwrap(ItemUtils.takeOrPlaceholder(item.getItemProvider(player).get(player.locale())));
147147
// add random tag value to prevent client-side insertion of matching items
148148
itemStack.update(
149149
DataComponents.CUSTOM_DATA,

invui/src/main/java/xyz/xenondevs/invui/internal/util/ItemUtils2.java

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@
22

33
import io.papermc.paper.datacomponent.DataComponentType;
44
import io.papermc.paper.datacomponent.DataComponentTypes;
5-
import net.kyori.adventure.key.Key;
65
import net.minecraft.core.component.DataComponents;
76
import net.minecraft.world.item.component.BundleContents;
87
import org.bukkit.Material;
98
import org.bukkit.Registry;
109
import org.bukkit.craftbukkit.inventory.CraftItemStack;
1110
import org.bukkit.inventory.ItemStack;
1211
import org.jspecify.annotations.Nullable;
13-
import xyz.xenondevs.invui.item.ItemBuilder;
1412
import xyz.xenondevs.invui.util.ItemUtils;
1513

1614
import java.util.ArrayList;
@@ -23,30 +21,6 @@
2321
@SuppressWarnings("UnstableApiUsage")
2422
public class ItemUtils2 {
2523

26-
private static final ItemStack NON_EMPTY_PLACEHOLDER = new ItemBuilder(Material.BARRIER)
27-
.hideTooltip(true)
28-
.set(DataComponentTypes.ITEM_MODEL, Key.key("air"))
29-
.build();
30-
31-
/**
32-
* Returns the copy of the non-empty placeholder item, which should be used to replace empty slots.
33-
*
34-
* @return the non-empty placeholder item
35-
*/
36-
public static ItemStack getNonEmptyPlaceholder() {
37-
return NON_EMPTY_PLACEHOLDER.clone();
38-
}
39-
40-
/**
41-
* Returns the given item stack if it is not empty, otherwise the non-empty placeholder item.
42-
*
43-
* @param itemStack the item stack
44-
* @return the non-empty item stack
45-
*/
46-
public static ItemStack nonEmpty(@Nullable ItemStack itemStack) {
47-
return ItemUtils.isEmpty(itemStack) ? getNonEmptyPlaceholder() : itemStack;
48-
}
49-
5024
/**
5125
* Creates a new list where all intermediary empty item stacks are replaced with the non-empty placeholder item
5226
* and all trailing empty item stacks are removed.
@@ -68,7 +42,7 @@ public static List<ItemStack> withoutIntermediaryEmpties(List<@Nullable ItemStac
6842
for (int i = 0; i <= lastNonNull; i++) {
6943
var itemStack = items.get(i);
7044
if (ItemUtils.isEmpty(itemStack)) {
71-
sanitized.add(getNonEmptyPlaceholder());
45+
sanitized.add(ItemUtils.getPlaceholder());
7246
} else {
7347
sanitized.add(itemStack);
7448
}

invui/src/main/java/xyz/xenondevs/invui/util/ItemUtils.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
11
package xyz.xenondevs.invui.util;
22

3+
import io.papermc.paper.datacomponent.DataComponentTypes;
4+
import net.kyori.adventure.key.Key;
35
import org.bukkit.Material;
46
import org.bukkit.inventory.ItemStack;
57
import org.jspecify.annotations.Nullable;
8+
import xyz.xenondevs.invui.item.ItemBuilder;
9+
import xyz.xenondevs.invui.item.ItemProvider;
10+
import xyz.xenondevs.invui.item.ItemWrapper;
611

712
/**
813
* Generic item-related utilities.
914
*/
15+
@SuppressWarnings("UnstableApiUsage")
1016
public class ItemUtils {
1117

18+
private static final ItemStack PLACEHOLDER = new ItemBuilder(Material.BARRIER)
19+
.hideTooltip(true)
20+
.set(DataComponentTypes.ITEM_MODEL, Key.key("air"))
21+
.build();
22+
private static final ItemWrapper PLACEHOLDER_PROVIDER = new ItemWrapper(PLACEHOLDER);
23+
1224
/**
1325
* Checks whether the given {@link ItemStack} is empty.
1426
* <p>
@@ -68,4 +80,33 @@ public static boolean isEmpty(@Nullable ItemStack itemStack) {
6880
return itemStack.clone();
6981
}
7082

83+
/**
84+
* Returns a copy of the non-empty placeholder item, which is an invisible non-air item stack.
85+
*
86+
* @return the non-empty placeholder item
87+
*/
88+
public static ItemStack getPlaceholder() {
89+
return PLACEHOLDER.clone();
90+
}
91+
92+
/**
93+
* Gets an {@link ItemProvider} for the {@link #getPlaceholder() placeholder} item.
94+
*
95+
* @return the placeholder item provider
96+
*/
97+
public static ItemProvider getPlaceholderProvider() {
98+
return PLACEHOLDER_PROVIDER;
99+
}
100+
101+
/**
102+
* Returns the given item stack if it is not {@link #isEmpty(ItemStack) empty},
103+
* otherwise the {@link #getPlaceholder() placeholder} item.
104+
*
105+
* @param itemStack the item stack
106+
* @return the non-empty item stack
107+
*/
108+
public static ItemStack takeOrPlaceholder(@Nullable ItemStack itemStack) {
109+
return isEmpty(itemStack) ? getPlaceholder() : itemStack;
110+
}
111+
71112
}

invui/src/main/java/xyz/xenondevs/invui/window/CartographyWindowImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
import xyz.xenondevs.invui.gui.AbstractGui;
99
import xyz.xenondevs.invui.gui.Gui;
1010
import xyz.xenondevs.invui.internal.menu.CustomCartographyMenu;
11-
import xyz.xenondevs.invui.internal.util.ItemUtils2;
1211
import xyz.xenondevs.invui.state.Property;
1312
import xyz.xenondevs.invui.util.ColorPalette;
13+
import xyz.xenondevs.invui.util.ItemUtils;
1414

1515
import java.awt.image.BufferedImage;
1616
import java.util.HashSet;
@@ -59,7 +59,7 @@ public CartographyWindowImpl(
5959
@Override
6060
protected void setMenuItem(int slot, @Nullable ItemStack itemStack) {
6161
if (slot == 0 || slot == 1) {
62-
super.setMenuItem(slot, ItemUtils2.nonEmpty(itemStack));
62+
super.setMenuItem(slot, ItemUtils.takeOrPlaceholder(itemStack));
6363
} else {
6464
super.setMenuItem(slot, itemStack);
6565
}

invui/src/main/java/xyz/xenondevs/invui/window/StonecutterWindowImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import xyz.xenondevs.invui.internal.menu.CustomStonecutterMenu;
1414
import xyz.xenondevs.invui.internal.util.ItemUtils2;
1515
import xyz.xenondevs.invui.state.MutableProperty;
16+
import xyz.xenondevs.invui.util.ItemUtils;
1617

1718
import java.util.ArrayList;
1819
import java.util.Arrays;
@@ -106,7 +107,7 @@ public void setSelectedSlot(int i) {
106107
@Override
107108
protected void setMenuItem(int slot, @Nullable ItemStack itemStack) {
108109
if (slot == 0) {
109-
super.setMenuItem(0, ItemUtils2.nonEmpty(itemStack));
110+
super.setMenuItem(0, ItemUtils.takeOrPlaceholder(itemStack));
110111
} else if (slot >= 38 && slot < buttonsGui.getSize() + 38) {
111112
buttons[slot - 38] = itemStack;
112113
buttonsDirty = true;

0 commit comments

Comments
 (0)