Skip to content

Commit 3935a47

Browse files
committed
refactor: bridge for paper's newer version
1 parent 11dfd20 commit 3935a47

File tree

10 files changed

+167
-86
lines changed

10 files changed

+167
-86
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ dependencies {
2222
implementation('it.unimi.dsi:fastutil:8.5.15')
2323
implementation("net.kyori:adventure-api:4.23.0")
2424
compileOnly("net.kyori:adventure-text-serializer-legacy:4.23.0")
25-
compileOnly('org.spigotmc:spigot-api:1.8.8-R0.1-SNAPSHOT')
25+
compileOnly("io.papermc.paper:paper-api:1.21.7-R0.1-SNAPSHOT")
2626
compileOnly('org.jetbrains:annotations:26.0.2')
2727

2828
testImplementation platform('org.junit:junit-bom:5.10.0')

src/main/java/pt/supercrafting/menu/Menu.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import org.jetbrains.annotations.NotNull;
1515
import org.jetbrains.annotations.Nullable;
1616
import org.jetbrains.annotations.Unmodifiable;
17+
import pt.supercrafting.menu.bridge.InventoryFactory;
18+
import pt.supercrafting.menu.bridge.PaperBridge;
1719
import pt.supercrafting.menu.editor.MenuEditor;
1820
import pt.supercrafting.menu.editor.decoration.MenuDecoration;
1921
import pt.supercrafting.menu.handler.MenuHandler;
@@ -58,11 +60,11 @@ protected Menu(@NotNull Component title, @NotNull InventoryType type, int size)
5860

5961
this.clickProcessor = new MenuClickProcessor(this);
6062

61-
String legacyTitle = LegacyComponentSerializer.legacySection().serialize(title);
63+
InventoryFactory factory = PaperBridge.getInventoryFactory();
6264
if(type == InventoryType.CHEST)
63-
this.handle = Bukkit.createInventory(this, size, legacyTitle);
65+
this.handle = factory.createInventory(this, title, size);
6466
else
65-
this.handle = Bukkit.createInventory(this, type, legacyTitle);
67+
this.handle = factory.createInventory(this, title, type);
6668
}
6769

6870
public void refresh() {

src/main/java/pt/supercrafting/menu/MenuClickProcessor.java

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import org.bukkit.plugin.Plugin;
1616
import org.jetbrains.annotations.ApiStatus;
1717
import org.jetbrains.annotations.NotNull;
18-
import pt.supercrafting.menu.bridge.ItemBridge;
18+
import pt.supercrafting.menu.bridge.PaperBridge;
1919
import pt.supercrafting.menu.item.MenuItem;
2020
import pt.supercrafting.menu.slot.MenuSlot;
2121

@@ -127,7 +127,7 @@ private void clickMenu(@NotNull InventoryClickEvent event) {
127127

128128
ClickType clickType = event.getClick();
129129
ItemStack cursor = event.getCursor();
130-
boolean isAdd = !ItemBridge.isEmpty(cursor) && !clickType.isShiftClick();
130+
boolean isAdd = !PaperBridge.isEmpty(cursor) && !clickType.isShiftClick();
131131

132132
boolean handled;
133133
if(isAdd) {
@@ -156,7 +156,7 @@ private void clickMenu(@NotNull InventoryClickEvent event) {
156156
IntList slots = new IntArrayList(PLAYER_INVENTORY_SLOTS.size());
157157
for (int i = 0; i < inventory.getSize(); i++) {
158158
ItemStack itemStack = inventory.getItem(i);
159-
if(itemStack != null && !ItemBridge.isEmpty(itemStack) && itemStack.isSimilar(result))
159+
if(itemStack != null && !PaperBridge.isEmpty(itemStack) && itemStack.isSimilar(result))
160160
slots.add(i);
161161
}
162162

@@ -168,31 +168,31 @@ private void clickMenu(@NotNull InventoryClickEvent event) {
168168

169169
ItemStack playerItem = inventory.getItem(playerSlot);
170170
if(playerItem == null)
171-
playerItem = ItemBridge.empty();
171+
playerItem = PaperBridge.empty();
172172

173-
if(!ItemBridge.isEmpty(playerItem) && !playerItem.isSimilar(result))
173+
if(!PaperBridge.isEmpty(playerItem) && !playerItem.isSimilar(result))
174174
continue;
175175

176-
int allowedToAdd = ItemBridge.isEmpty(playerItem) ? result.getMaxStackSize() : playerItem.getMaxStackSize() - playerItem.getAmount();
176+
int allowedToAdd = PaperBridge.isEmpty(playerItem) ? result.getMaxStackSize() : playerItem.getMaxStackSize() - playerItem.getAmount();
177177
if(allowedToAdd <= 0)
178178
continue;
179179

180180
int toAdd = Math.min(allowedToAdd, result.getAmount());
181-
ItemStack newPlayerItem = ItemBridge.asQuantity(playerItem, playerItem.getAmount() + toAdd);
181+
ItemStack newPlayerItem = PaperBridge.asQuantity(playerItem, playerItem.getAmount() + toAdd);
182182
inventory.setItem(playerSlot, newPlayerItem);
183183

184-
result = ItemBridge.asQuantity(result, result.getAmount() - toAdd);
184+
result = PaperBridge.asQuantity(result, result.getAmount() - toAdd);
185185
if(result.getAmount() <= 0)
186186
break;
187187

188188
}
189189

190-
if(!ItemBridge.isEmpty(result)) {
190+
if(!PaperBridge.isEmpty(result)) {
191191
MenuSlot.Add add = new MenuSlot.PlayerAdd(result, result.getAmount(), player);
192192
slot.add(add);
193193

194194
ItemStack remaining = add.getResult();
195-
if(!ItemBridge.isEmpty(remaining)) // Drop overflow items
195+
if(!PaperBridge.isEmpty(remaining)) // Drop overflow items
196196
player.getWorld().dropItemNaturally(player.getLocation(), remaining);
197197
}
198198

@@ -229,26 +229,26 @@ private void clickHotBar(@NotNull InventoryClickEvent event) {
229229
Inventory inventory = player.getInventory();
230230

231231
ItemStack hotbarItem =inventory.getItem(hotbarButton);
232-
if(hotbarItem != null && ItemBridge.isEmpty(hotbarItem)) {
232+
if(hotbarItem != null && PaperBridge.isEmpty(hotbarItem)) {
233233

234234
MenuSlot.Add add = new MenuSlot.PlayerAdd(hotbarItem, hotbarItem.getAmount(), player);
235235
slot.add(add);
236236

237237
ItemStack remaining = add.getResult();
238-
if(ItemBridge.isEmpty(remaining))
239-
remaining = ItemBridge.empty();
238+
if(PaperBridge.isEmpty(remaining))
239+
remaining = PaperBridge.empty();
240240

241241
inventory.setItem(hotbarButton, remaining);
242242
}
243243

244244
hotbarItem = inventory.getItem(hotbarButton); // Updated
245-
if(hotbarItem == null || ItemBridge.isEmpty(hotbarItem))
245+
if(hotbarItem == null || PaperBridge.isEmpty(hotbarItem))
246246
player.getInventory().setItem(hotbarButton, result);
247247
else {
248248
//player.give(hotbarItem);
249249
Map<Integer, ItemStack> overflow = player.getInventory().addItem(hotbarItem);
250250
for (ItemStack drop : overflow.values()) {
251-
if(!ItemBridge.isEmpty(drop)) {
251+
if(!PaperBridge.isEmpty(drop)) {
252252
player.getWorld().dropItemNaturally(player.getLocation(), drop);
253253
}
254254
}
@@ -273,18 +273,18 @@ private void clickInventory(@NotNull InventoryClickEvent event) {
273273

274274
ItemStack playerItem = playerInventory.getItem(slot);
275275
if(playerItem == null)
276-
playerItem = ItemBridge.empty();
277-
if(ItemBridge.isEmpty(playerItem) || !playerItem.isSimilar(cursor))
276+
playerItem = PaperBridge.empty();
277+
if(PaperBridge.isEmpty(playerItem) || !playerItem.isSimilar(cursor))
278278
continue;
279279

280280
int allowedToAdd = cursor.getMaxStackSize() - cursor.getAmount();
281281
if(allowedToAdd <= 0)
282282
continue;
283283

284284
int toAdd = Math.min(allowedToAdd, playerItem.getAmount());
285-
ItemStack newCursor = ItemBridge.asQuantity(cursor, cursor.getAmount() + toAdd);
285+
ItemStack newCursor = PaperBridge.asQuantity(cursor, cursor.getAmount() + toAdd);
286286

287-
ItemStack newPlayerItem = ItemBridge.asQuantity(playerItem, playerItem.getAmount() - toAdd);
287+
ItemStack newPlayerItem = PaperBridge.asQuantity(playerItem, playerItem.getAmount() - toAdd);
288288
playerInventory.setItem(slot, newPlayerItem);
289289
cursor = newCursor;
290290

@@ -295,7 +295,7 @@ private void clickInventory(@NotNull InventoryClickEvent event) {
295295
}
296296

297297
ItemStack currentItem = event.getCurrentItem();
298-
if(currentItem == null || ItemBridge.isEmpty(currentItem))
298+
if(currentItem == null || PaperBridge.isEmpty(currentItem))
299299
return;
300300

301301
if(DEFAULT_BEHAVIORS.contains(action))
@@ -367,7 +367,7 @@ public void drag(@NotNull InventoryDragEvent event) {
367367

368368
IntList draggedSlots = new IntArrayList(slotsByInventory.get(menuInventory));
369369
ItemStack cursor = event.getOldCursor();
370-
if(ItemBridge.isEmpty(cursor))
370+
if(PaperBridge.isEmpty(cursor))
371371
return;
372372

373373
event.setCancelled(false);
@@ -388,14 +388,14 @@ public void drag(@NotNull InventoryDragEvent event) {
388388
menuSlot.add(add);
389389

390390
ItemStack result = add.getResult();
391-
if(!ItemBridge.isEmpty(result) && !result.isSimilar(cursor)) {
391+
if(!PaperBridge.isEmpty(result) && !result.isSimilar(cursor)) {
392392
overFlow.add(result);
393393
} else if(result.isSimilar(cursor) && !add.isSuccessful())
394394
giveBack += amountPerSlot;
395395

396396
}
397397

398-
ItemStack newCursor = ItemBridge.asQuantity(cursor, giveBack);
398+
ItemStack newCursor = PaperBridge.asQuantity(cursor, giveBack);
399399
event.setCursor(newCursor);
400400

401401
Plugin plugin = MenuManager.instance.getPlugin();
@@ -404,7 +404,7 @@ public void drag(@NotNull InventoryDragEvent event) {
404404
if(!overFlow.isEmpty()) {
405405
//player.give(overFlow);
406406
for (ItemStack itemStack : overFlow) {
407-
if(!ItemBridge.isEmpty(itemStack)) {
407+
if(!PaperBridge.isEmpty(itemStack)) {
408408
player.getWorld().dropItemNaturally(player.getLocation(), itemStack);
409409
}
410410
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package pt.supercrafting.menu.bridge;
2+
3+
import net.kyori.adventure.text.Component;
4+
import net.kyori.adventure.text.serializer.ComponentEncoder;
5+
import org.bukkit.Bukkit;
6+
import org.bukkit.event.inventory.InventoryType;
7+
import org.bukkit.inventory.Inventory;
8+
import org.bukkit.inventory.InventoryHolder;
9+
import org.jetbrains.annotations.NotNull;
10+
import org.jetbrains.annotations.Nullable;
11+
12+
public interface InventoryFactory {
13+
14+
@NotNull Inventory createInventory(@Nullable InventoryHolder holder, @NotNull Component title, @NotNull InventoryType type);
15+
@NotNull Inventory createInventory(@Nullable InventoryHolder holder, @NotNull Component title, int size);
16+
17+
@SuppressWarnings("deprecation")
18+
record Legacy(@NotNull ComponentEncoder<Component, String> encoder) implements InventoryFactory {
19+
20+
@Override
21+
public @NotNull Inventory createInventory(@Nullable InventoryHolder holder, @NotNull Component title, @NotNull InventoryType type) {
22+
return Bukkit.createInventory(holder, type, encoder.serialize(title));
23+
}
24+
25+
@Override
26+
public @NotNull Inventory createInventory(@Nullable InventoryHolder holder, @NotNull Component title, int size) {
27+
return Bukkit.createInventory(holder, size, encoder.serialize(title));
28+
}
29+
30+
}
31+
32+
record Paper() implements InventoryFactory {
33+
34+
@Override
35+
public @NotNull Inventory createInventory(@Nullable InventoryHolder holder, @NotNull Component title, @NotNull InventoryType type) {
36+
return Bukkit.createInventory(holder, type, title);
37+
}
38+
39+
@Override
40+
public @NotNull Inventory createInventory(@Nullable InventoryHolder holder, @NotNull Component title, int size) {
41+
return Bukkit.createInventory(holder, size, title);
42+
}
43+
44+
}
45+
46+
}

src/main/java/pt/supercrafting/menu/bridge/ItemBridge.java

Lines changed: 0 additions & 35 deletions
This file was deleted.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package pt.supercrafting.menu.bridge;
2+
3+
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
4+
import org.bukkit.Material;
5+
import org.bukkit.inventory.ItemStack;
6+
import org.jetbrains.annotations.ApiStatus;
7+
import org.jetbrains.annotations.NotNull;
8+
import org.jetbrains.annotations.Nullable;
9+
10+
@ApiStatus.Internal
11+
public final class PaperBridge {
12+
13+
private static final boolean PAPER;
14+
private static final InventoryFactory INVENTORY_FACTORY;
15+
16+
private PaperBridge() {
17+
throw new UnsupportedOperationException("This class cannot be instantiated.");
18+
}
19+
20+
static {
21+
boolean paper;
22+
try {
23+
ItemStack.class.getMethod("isEmpty");
24+
paper = true;
25+
} catch (NoSuchMethodException e) {
26+
paper = false;
27+
}
28+
29+
PAPER = paper;
30+
if (paper) {
31+
INVENTORY_FACTORY = new InventoryFactory.Paper();
32+
} else {
33+
INVENTORY_FACTORY = new InventoryFactory.Legacy(LegacyComponentSerializer.legacySection());
34+
}
35+
}
36+
37+
@NotNull
38+
public static ItemStack asQuantity(@NotNull ItemStack itemStack, int quantity) {
39+
40+
if(PAPER)
41+
return itemStack.asQuantity(quantity);
42+
43+
if (quantity <= 0) {
44+
return empty();
45+
}
46+
ItemStack newItemStack = itemStack.clone();
47+
newItemStack.setAmount(quantity);
48+
return newItemStack;
49+
}
50+
51+
public static boolean isEmpty(@Nullable ItemStack itemStack) {
52+
if(itemStack != null && PAPER)
53+
return itemStack.isEmpty();
54+
return itemStack == null || itemStack.getType() == Material.AIR || itemStack.getAmount() <= 0;
55+
}
56+
57+
@NotNull
58+
public static ItemStack empty() {
59+
if(PAPER)
60+
return ItemStack.empty();
61+
return new ItemStack(Material.AIR);
62+
}
63+
64+
public static @NotNull InventoryFactory getInventoryFactory() {
65+
return INVENTORY_FACTORY;
66+
}
67+
68+
}

src/main/java/pt/supercrafting/menu/item/MenuItem.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import org.bukkit.event.inventory.InventoryClickEvent;
66
import org.bukkit.inventory.ItemStack;
77
import org.jetbrains.annotations.NotNull;
8-
import pt.supercrafting.menu.bridge.ItemBridge;
8+
import pt.supercrafting.menu.bridge.PaperBridge;
99
import pt.supercrafting.menu.slot.MenuSlot;
1010

1111
import java.util.Objects;
@@ -50,7 +50,7 @@ public Click(@NotNull Player player, int slot, @NotNull ItemStack cursor, @NotNu
5050

5151
@Override
5252
public @NotNull ItemStack itemStack() {
53-
return ItemBridge.empty();
53+
return PaperBridge.empty();
5454
}
5555

5656
@Override

src/main/java/pt/supercrafting/menu/slot/ForbiddenSlot.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
import org.bukkit.inventory.ItemStack;
44
import org.jetbrains.annotations.NotNull;
5-
import pt.supercrafting.menu.bridge.ItemBridge;
5+
import pt.supercrafting.menu.bridge.PaperBridge;
66

77
public record ForbiddenSlot(@NotNull ItemStack icon) implements MenuSlot {
88

99
public static final ForbiddenSlot INSTANCE = new ForbiddenSlot();
1010

1111
private ForbiddenSlot() {
12-
this(ItemBridge.empty());
12+
this(PaperBridge.empty());
1313
}
1414

1515
@Override
@@ -19,7 +19,7 @@ private ForbiddenSlot() {
1919

2020
@Override
2121
public @NotNull ItemStack itemStack() {
22-
return ItemBridge.empty();
22+
return PaperBridge.empty();
2323
}
2424

2525
@Override

0 commit comments

Comments
 (0)