3939import org .bukkit .inventory .meta .trim .TrimMaterial ;
4040import org .bukkit .inventory .meta .trim .TrimPattern ;
4141import org .bukkit .potion .PotionEffect ;
42+ import org .bukkit .util .io .BukkitObjectInputStream ;
4243import org .jetbrains .annotations .NotNull ;
4344import org .jetbrains .annotations .Nullable ;
4445
46+ import java .io .ByteArrayInputStream ;
47+ import java .io .IOException ;
48+ import java .util .Base64 ;
4549import java .util .Arrays ;
4650import java .util .ArrayList ;
4751import java .util .List ;
5458
5559import static com .extendedclip .deluxemenus .utils .Constants .INVENTORY_ITEM_ACCESSORS ;
5660import static com .extendedclip .deluxemenus .utils .Constants .PLACEHOLDER_PREFIX ;
61+ import static com .extendedclip .deluxemenus .utils .Constants .STACK_PREFIX ;
5762
5863public 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 ());
0 commit comments