Skip to content

Commit 54904dd

Browse files
authored
base64 itemstack item (#227)
1 parent 797fd26 commit 54904dd

File tree

4 files changed

+48
-0
lines changed

4 files changed

+48
-0
lines changed

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/menu/MenuItem.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,13 @@
3939
import org.bukkit.inventory.meta.trim.TrimMaterial;
4040
import org.bukkit.inventory.meta.trim.TrimPattern;
4141
import org.bukkit.potion.PotionEffect;
42+
import org.bukkit.util.io.BukkitObjectInputStream;
4243
import org.jetbrains.annotations.NotNull;
4344
import org.jetbrains.annotations.Nullable;
4445

46+
import java.io.ByteArrayInputStream;
47+
import java.io.IOException;
48+
import java.util.Base64;
4549
import java.util.Arrays;
4650
import java.util.ArrayList;
4751
import java.util.List;
@@ -54,6 +58,7 @@
5458

5559
import static com.extendedclip.deluxemenus.utils.Constants.INVENTORY_ITEM_ACCESSORS;
5660
import static com.extendedclip.deluxemenus.utils.Constants.PLACEHOLDER_PREFIX;
61+
import static com.extendedclip.deluxemenus.utils.Constants.STACK_PREFIX;
5762

5863
public class MenuItem {
5964

@@ -65,6 +70,25 @@ public MenuItem(@NotNull final DeluxeMenus plugin, @NotNull final MenuItemOption
6570
this.options = options;
6671
}
6772

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

@@ -78,6 +102,16 @@ public ItemStack getItemStack(@NotNull final MenuHolder holder) {
78102
stringMaterial = holder.setPlaceholdersAndArguments(stringMaterial.substring(PLACEHOLDER_PREFIX.length()));
79103
lowercaseStringMaterial = stringMaterial.toLowerCase(Locale.ENGLISH);
80104
}
105+
if (ItemUtils.isItemStackOption(lowercaseStringMaterial)) {
106+
stringMaterial = holder.setPlaceholdersAndArguments(stringMaterial.substring(STACK_PREFIX.length()));
107+
ItemStack base64Item = base64ToItemStack(stringMaterial);
108+
if (base64Item != null) {
109+
itemStack = base64Item;
110+
amount = itemStack.getAmount();
111+
lowercaseStringMaterial = itemStack.getType().toString().toLowerCase(Locale.ENGLISH);
112+
}
113+
}
114+
81115

82116
if (ItemUtils.isPlayerItem(lowercaseStringMaterial)) {
83117
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"

0 commit comments

Comments
 (0)