Skip to content

Commit 458c449

Browse files
committed
Merge branch 'main' into feat/minimessage-support
2 parents b327184 + 54904dd commit 458c449

10 files changed

Lines changed: 145 additions & 12 deletions

File tree

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ authlib = "1.5.25"
66
headdb = "1.3.2"
77
itemsadder = "3.6.3-beta-14"
88
nexo = "1.1.0"
9-
oraxen = "1.159.0"
9+
oraxen = "1.190.0"
1010
mythiclib = "1.7.1-SNAPSHOT"
1111
mmoitems = "6.10-SNAPSHOT"
1212
papi = "2.11.6"
@@ -28,7 +28,7 @@ authlib = { module = "com.mojang:authlib", version.ref = "authlib" }
2828
headdb = { module = "com.arcaniax:HeadDatabase-API", version.ref = "headdb" }
2929
itemsadder = { module = "com.github.LoneDev6:api-itemsadder", version.ref = "itemsadder" }
3030
nexo = { module = "com.nexomc:nexo", version.ref = "nexo" }
31-
oraxen = { module = "com.github.oraxen:oraxen", version.ref = "oraxen" }
31+
oraxen = { module = "io.th0rgal:oraxen", version.ref = "oraxen" }
3232
mythiclib = { module = "io.lumine:MythicLib-dist", version.ref = "mythiclib"}
3333
mmoitems = { module = "net.Indyuce:MMOItems-API", version.ref = "mmoitems" }
3434
papi = { module = "me.clip:placeholderapi", version.ref = "papi" }

src/main/java/com/extendedclip/deluxemenus/config/DeluxeMenusConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
import java.util.stream.Collectors;
7474

7575
import static com.extendedclip.deluxemenus.utils.Constants.PLACEHOLDER_PREFIX;
76+
import static com.extendedclip.deluxemenus.utils.Constants.STACK_PREFIX;
7677
import static com.extendedclip.deluxemenus.utils.Constants.PLAYER_ITEMS;
7778
import static com.extendedclip.deluxemenus.utils.Constants.WATER_BOTTLE;
7879

@@ -90,6 +91,7 @@ public class DeluxeMenusConfig {
9091
VALID_MATERIALS.add(WATER_BOTTLE);
9192

9293
VALID_MATERIAL_PREFIXES.add(PLACEHOLDER_PREFIX);
94+
VALID_MATERIAL_PREFIXES.add(STACK_PREFIX);
9395
}
9496

9597
private final String separator = File.separator;

src/main/java/com/extendedclip/deluxemenus/dupe/DupeFixer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import org.bukkit.event.EventHandler;
77
import org.bukkit.event.entity.EntityPickupItemEvent;
88
import org.bukkit.event.player.PlayerDropItemEvent;
9-
import org.bukkit.event.player.PlayerLoginEvent;
9+
import org.bukkit.event.player.PlayerJoinEvent;
1010
import org.bukkit.inventory.ItemStack;
1111
import org.jetbrains.annotations.NotNull;
1212

@@ -54,7 +54,7 @@ private void onDrop(@NotNull final PlayerDropItemEvent event) {
5454
}
5555

5656
@EventHandler
57-
private void onLogin(@NotNull final PlayerLoginEvent event) {
57+
private void onLogin(@NotNull final PlayerJoinEvent event) {
5858
plugin.getServer().getScheduler().runTaskLater(
5959
plugin,
6060
() -> {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.extendedclip.deluxemenus.events;
2+
3+
import com.extendedclip.deluxemenus.menu.Menu;
4+
import com.extendedclip.deluxemenus.menu.MenuHolder;
5+
import org.bukkit.entity.Player;
6+
import org.bukkit.event.HandlerList;
7+
import org.bukkit.event.player.PlayerEvent;
8+
import org.jetbrains.annotations.NotNull;
9+
10+
public class DeluxeMenusOpenMenuEvent extends PlayerEvent {
11+
private static final HandlerList HANDLERS = new HandlerList();
12+
private final MenuHolder holder;
13+
14+
public DeluxeMenusOpenMenuEvent(Player player, MenuHolder holder) {
15+
super(player);
16+
this.holder = holder;
17+
}
18+
19+
public MenuHolder getHolder() {
20+
return holder;
21+
}
22+
23+
public static HandlerList getHandlerList() {
24+
return HANDLERS;
25+
}
26+
27+
@Override
28+
public @NotNull HandlerList getHandlers() {
29+
return HANDLERS;
30+
}
31+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.extendedclip.deluxemenus.events;
2+
3+
import org.bukkit.entity.Player;
4+
import org.bukkit.event.Cancellable;
5+
import org.bukkit.event.HandlerList;
6+
import org.bukkit.event.player.PlayerEvent;
7+
import org.jetbrains.annotations.NotNull;
8+
9+
public class DeluxeMenusPreOpenMenuEvent extends PlayerEvent implements Cancellable {
10+
private static final HandlerList HANDLERS = new HandlerList();
11+
12+
private boolean cancelled = false;
13+
14+
public DeluxeMenusPreOpenMenuEvent(Player player) {
15+
super(player);
16+
}
17+
18+
public static HandlerList getHandlerList() {
19+
return HANDLERS;
20+
}
21+
22+
@Override
23+
public @NotNull HandlerList getHandlers() {
24+
return HANDLERS;
25+
}
26+
27+
@Override
28+
public boolean isCancelled() {
29+
return cancelled;
30+
}
31+
32+
@Override
33+
public void setCancelled(boolean b) {
34+
this.cancelled = b;
35+
}
36+
}
37+

src/main/java/com/extendedclip/deluxemenus/menu/Menu.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package com.extendedclip.deluxemenus.menu;
22

33
import com.extendedclip.deluxemenus.DeluxeMenus;
4+
import com.extendedclip.deluxemenus.action.ClickHandler;
5+
import com.extendedclip.deluxemenus.dupe.MenuItemMarker;
6+
import com.extendedclip.deluxemenus.events.DeluxeMenusOpenMenuEvent;
7+
import com.extendedclip.deluxemenus.events.DeluxeMenusPreOpenMenuEvent;
48
import com.extendedclip.deluxemenus.menu.command.RegistrableMenuCommand;
59
import com.extendedclip.deluxemenus.menu.options.MenuOptions;
610
import com.extendedclip.deluxemenus.requirement.RequirementList;
@@ -271,7 +275,12 @@ public void openMenu(final @NotNull Player viewer, final @Nullable Map<String, S
271275
return;
272276
}
273277

274-
final MenuHolder holder = new MenuHolder(plugin, viewer);
278+
DeluxeMenusPreOpenMenuEvent preOpenEvent = new DeluxeMenusPreOpenMenuEvent(viewer);
279+
Bukkit.getPluginManager().callEvent(preOpenEvent);
280+
281+
if (preOpenEvent.isCancelled()) return;
282+
283+
final MenuHolder holder = new MenuHolder(plugin, viewer);
275284
if (placeholderPlayer != null) {
276285
holder.setPlaceholderPlayer(placeholderPlayer);
277286
}
@@ -392,12 +401,17 @@ public void openMenu(final @NotNull Player viewer, final @Nullable Map<String, S
392401
viewer.openInventory(inventory);
393402
menuHolders.add(holder);
394403

395-
if (updatePlaceholders) {
396-
holder.startUpdatePlaceholdersTask();
397-
}
398-
});
399-
});
400-
}
404+
if (updatePlaceholders) {
405+
holder.startUpdatePlaceholdersTask();
406+
}
407+
});
408+
409+
Bukkit.getScheduler().runTask(plugin, () -> {
410+
DeluxeMenusOpenMenuEvent openEvent = new DeluxeMenusOpenMenuEvent(viewer, holder);
411+
Bukkit.getPluginManager().callEvent(openEvent);
412+
});
413+
});
414+
}
401415

402416
public void refreshForAll() {
403417
menuHolders.stream().filter(menuHolder -> menuHolder.getMenuName().equalsIgnoreCase(options.name())).forEach(MenuHolder::refreshMenu);

src/main/java/com/extendedclip/deluxemenus/menu/MenuItem.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,13 @@
3737
import org.bukkit.inventory.meta.trim.TrimMaterial;
3838
import org.bukkit.inventory.meta.trim.TrimPattern;
3939
import org.bukkit.potion.PotionEffect;
40+
import org.bukkit.util.io.BukkitObjectInputStream;
4041
import org.jetbrains.annotations.NotNull;
4142
import org.jetbrains.annotations.Nullable;
4243

44+
import java.io.ByteArrayInputStream;
45+
import java.io.IOException;
46+
import java.util.Base64;
4347
import java.util.Arrays;
4448
import java.util.ArrayList;
4549
import java.util.List;
@@ -52,6 +56,7 @@
5256

5357
import static com.extendedclip.deluxemenus.utils.Constants.INVENTORY_ITEM_ACCESSORS;
5458
import static com.extendedclip.deluxemenus.utils.Constants.PLACEHOLDER_PREFIX;
59+
import static com.extendedclip.deluxemenus.utils.Constants.STACK_PREFIX;
5560

5661
public class MenuItem {
5762

@@ -63,6 +68,25 @@ public MenuItem(@NotNull final DeluxeMenus plugin, @NotNull final MenuItemOption
6368
this.options = options;
6469
}
6570

71+
public static ItemStack base64ToItemStack(String data) {
72+
try {
73+
byte[] bytes = Base64.getDecoder().decode(data);
74+
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
75+
BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream);
76+
dataInput.close();
77+
Object object = dataInput.readObject();
78+
if (object instanceof ItemStack) {
79+
return (ItemStack) object;
80+
}
81+
return null;
82+
} catch (IllegalArgumentException e) {
83+
return null;
84+
} catch (IOException e) {
85+
return null;
86+
} catch (ClassNotFoundException e) {
87+
return null;
88+
}
89+
}
6690
public ItemStack getItemStack(@NotNull final MenuHolder holder) {
6791
final Player viewer = holder.getViewer();
6892

@@ -76,6 +100,16 @@ public ItemStack getItemStack(@NotNull final MenuHolder holder) {
76100
stringMaterial = holder.setPlaceholdersAndArguments(stringMaterial.substring(PLACEHOLDER_PREFIX.length()));
77101
lowercaseStringMaterial = stringMaterial.toLowerCase(Locale.ENGLISH);
78102
}
103+
if (ItemUtils.isItemStackOption(lowercaseStringMaterial)) {
104+
stringMaterial = holder.setPlaceholdersAndArguments(stringMaterial.substring(STACK_PREFIX.length()));
105+
ItemStack base64Item = base64ToItemStack(stringMaterial);
106+
if (base64Item != null) {
107+
itemStack = base64Item;
108+
amount = itemStack.getAmount();
109+
lowercaseStringMaterial = itemStack.getType().toString().toLowerCase(Locale.ENGLISH);
110+
}
111+
}
112+
79113

80114
if (ItemUtils.isPlayerItem(lowercaseStringMaterial)) {
81115
final ItemStack playerItem = INVENTORY_ITEM_ACCESSORS.get(lowercaseStringMaterial).apply(viewer.getInventory());

src/main/java/com/extendedclip/deluxemenus/utils/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ private Constants() {
3232
public static final String BASE64_HEAD_TYPE = "basehead";
3333
public static final String HDB_HEAD_TYPE = "hdb";
3434

35+
public static final String STACK_PREFIX = "stack-";
3536
public static final String PLACEHOLDER_PREFIX = "placeholder-";
3637
public static final String WATER_BOTTLE = "water_bottle";
3738

src/main/java/com/extendedclip/deluxemenus/utils/ItemUtils.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import static com.extendedclip.deluxemenus.utils.Constants.INVENTORY_ITEM_ACCESSORS;
1313
import static com.extendedclip.deluxemenus.utils.Constants.PLACEHOLDER_PREFIX;
14+
import static com.extendedclip.deluxemenus.utils.Constants.STACK_PREFIX;
1415
import static com.extendedclip.deluxemenus.utils.Constants.WATER_BOTTLE;
1516

1617
public final class ItemUtils {
@@ -29,6 +30,16 @@ public static boolean isPlaceholderOption(@NotNull final String material) {
2930
return material.toLowerCase(Locale.ROOT).startsWith(PLACEHOLDER_PREFIX);
3031
}
3132

33+
/**
34+
* Checks if the string starts with the substring "stack-". The check is case-insensitive.
35+
*
36+
* @param itemstack The string to check
37+
* @return true if the string starts with "stack-", false otherwise
38+
*/
39+
public static boolean isItemStackOption(@NotNull final String material) {
40+
return material.toLowerCase(Locale.ROOT).startsWith(STACK_PREFIX);
41+
}
42+
3243
/**
3344
* Checks if the string is a player item. The check is case-sensitive.
3445
* Player items are: "main_hand", "off_hand", "armor_helmet", "armor_chestplate", "armor_leggings", "armor_boots"

src/main/java/com/extendedclip/deluxemenus/utils/SkullUtils.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,10 @@ public static ItemStack getSkullByName(@NotNull final DeluxeMenus plugin, @NotNu
136136

137137
final OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerName);
138138

139-
if (!VersionHelper.IS_SKULL_OWNER_LEGACY) {
139+
if (VersionHelper.HAS_PLAYER_PROFILES && offlinePlayer.getPlayerProfile().getTextures().isEmpty()) {
140+
// updates the Player Profile and populates textures for offline players - for some reason this doesn't populate when getting the Profile first time
141+
headMeta.setOwnerProfile(offlinePlayer.getPlayerProfile().update().join());
142+
} else if (!VersionHelper.IS_SKULL_OWNER_LEGACY) {
140143
headMeta.setOwningPlayer(offlinePlayer);
141144
} else {
142145
headMeta.setOwner(offlinePlayer.getName());

0 commit comments

Comments
 (0)