diff --git a/InvUI/src/main/java/de/studiocode/invui/item/ItemBuilder.java b/InvUI/src/main/java/de/studiocode/invui/item/ItemBuilder.java index f5e5acd..9b5ed3f 100644 --- a/InvUI/src/main/java/de/studiocode/invui/item/ItemBuilder.java +++ b/InvUI/src/main/java/de/studiocode/invui/item/ItemBuilder.java @@ -7,9 +7,12 @@ import com.mojang.authlib.properties.Property; import com.mojang.authlib.properties.PropertyMap; import de.studiocode.inventoryaccess.util.ReflectionRegistry; import de.studiocode.inventoryaccess.util.ReflectionUtils; +import de.studiocode.inventoryaccess.version.InventoryAccess; import de.studiocode.invui.util.MojangApiUtils; import de.studiocode.invui.util.Pair; import de.studiocode.invui.window.impl.BaseWindow; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.OfflinePlayer; @@ -25,6 +28,7 @@ import java.io.Serializable; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; public class ItemBuilder implements ItemProvider { @@ -33,10 +37,10 @@ public class ItemBuilder implements ItemProvider { protected int amount = 1; protected int damage; protected int customModelData; - protected String displayName; - protected List lore = new ArrayList<>(); - protected List itemFlags = new ArrayList<>(); - protected HashMap> enchantments = new HashMap<>(); + protected BaseComponent[] displayName; + protected List lore; + protected List itemFlags; + protected HashMap> enchantments; protected GameProfile gameProfile; /** @@ -98,23 +102,43 @@ public class ItemBuilder implements ItemProvider { ItemMeta itemMeta = itemStack.getItemMeta(); if (itemMeta != null) { - if (itemMeta instanceof Damageable) ((Damageable) itemMeta).setDamage(damage); - if (customModelData != 0) itemMeta.setCustomModelData(customModelData); - if (displayName != null) itemMeta.setDisplayName(displayName); - if (gameProfile != null) { - ReflectionUtils.setFieldValue(ReflectionRegistry.CB_CRAFT_META_SKULL_PROFILE_FIELD, itemMeta, gameProfile); - } - if (!enchantments.isEmpty()) { + // display name + if (displayName != null) + InventoryAccess.getItemUtils().setDisplayName(itemMeta, displayName); + + // lore + if (lore != null) + InventoryAccess.getItemUtils().setLore(itemMeta, lore); + + // damage + if (itemMeta instanceof Damageable) + ((Damageable) itemMeta).setDamage(damage); + + // custom model data + if (customModelData != 0) + itemMeta.setCustomModelData(customModelData); + + // enchantments + if (enchantments != null) { if (base != null) itemMeta.getEnchants().forEach((enchantment, level) -> itemMeta.removeEnchant(enchantment)); + enchantments.forEach((enchantment, pair) -> itemMeta.addEnchant(enchantment, pair.getFirst(), pair.getSecond())); } - if (!itemFlags.isEmpty()) { - if (base != null) itemMeta.removeItemFlags(itemMeta.getItemFlags().toArray(new ItemFlag[0])); + + // item flags + if (itemFlags != null) { + if (base != null) + itemMeta.removeItemFlags(itemMeta.getItemFlags().toArray(new ItemFlag[0])); + itemMeta.addItemFlags(itemFlags.toArray(new ItemFlag[0])); } - itemMeta.setLore(lore); + // game profile + if (gameProfile != null) + ReflectionUtils.setFieldValue(ReflectionRegistry.CB_CRAFT_META_SKULL_PROFILE_FIELD, itemMeta, gameProfile); + + // apply to the item stack itemStack.setItemMeta(itemMeta); } @@ -156,26 +180,45 @@ public class ItemBuilder implements ItemProvider { } public ItemBuilder setDisplayName(String displayName) { + this.displayName = TextComponent.fromLegacyText(displayName); + return this; + } + + public ItemBuilder setDisplayName(BaseComponent[] displayName) { this.displayName = displayName; return this; } - public ItemBuilder setLore(@NotNull List lore) { + public ItemBuilder setLegacyLore(@NotNull List lore) { + this.lore = lore.stream() + .map(TextComponent::fromLegacyText) + .collect(Collectors.toList()); + return this; + } + + public ItemBuilder setLore(List lore) { this.lore = lore; return this; } public ItemBuilder addLoreLines(@NotNull String... lines) { + if (lore == null) lore = new ArrayList<>(); + + for (String line : lines) + lore.add(TextComponent.fromLegacyText(line)); + return this; + } + + public ItemBuilder addLoreLines(@NotNull BaseComponent[]... lines) { + if (lore == null) lore = new ArrayList<>(); + lore.addAll(Arrays.asList(lines)); return this; } - public ItemBuilder removeLoreLines(@NotNull String... lines) { - lore.removeAll(Arrays.asList(lines)); - return this; - } - public ItemBuilder removeLoreLine(int index) { + if (lore == null) lore = new ArrayList<>(); + lore.remove(index); return this; } @@ -191,11 +234,15 @@ public class ItemBuilder implements ItemProvider { } public ItemBuilder addItemFlags(@NotNull ItemFlag... itemFlags) { + if (this.itemFlags == null) this.itemFlags = new ArrayList<>(); + this.itemFlags.addAll(Arrays.asList(itemFlags)); return this; } public ItemBuilder removeItemFlags(@NotNull ItemFlag... itemFlags) { + if (this.itemFlags == null) this.itemFlags = new ArrayList<>(); + this.itemFlags.removeAll(Arrays.asList(itemFlags)); return this; } @@ -211,16 +258,22 @@ public class ItemBuilder implements ItemProvider { } public ItemBuilder addEnchantment(Enchantment enchantment, int level, boolean ignoreLevelRestriction) { + if (enchantments == null) enchantments = new HashMap<>(); + enchantments.put(enchantment, new Pair<>(level, ignoreLevelRestriction)); return this; } public ItemBuilder removeEnchantment(Enchantment enchantment) { + if (enchantments == null) enchantments = new HashMap<>(); + enchantments.remove(enchantment); return this; } public ItemBuilder clearEnchantments() { + if (enchantments == null) enchantments = new HashMap<>(); + enchantments.clear(); return this; } @@ -245,11 +298,11 @@ public class ItemBuilder implements ItemProvider { return customModelData; } - public String getDisplayName() { + public BaseComponent[] getDisplayName() { return displayName; } - public List getLore() { + public List getLore() { return lore; } @@ -270,9 +323,9 @@ public class ItemBuilder implements ItemProvider { try { ItemBuilder clone = ((ItemBuilder) super.clone()); if (base != null) clone.base = base.clone(); - clone.lore = new ArrayList<>(lore); - clone.itemFlags = new ArrayList<>(itemFlags); - clone.enchantments = new HashMap<>(enchantments); + if (lore != null) clone.lore = new ArrayList<>(lore); + if (itemFlags != null) clone.itemFlags = new ArrayList<>(itemFlags); + if (enchantments != null) clone.enchantments = new HashMap<>(enchantments); return clone; } catch (CloneNotSupportedException e) { diff --git a/InventoryAccess/1_14_R1/src/main/java/de/studiocode/inventoryaccess/v1_14_R1/util/ItemUtilsImpl.java b/InventoryAccess/1_14_R1/src/main/java/de/studiocode/inventoryaccess/v1_14_R1/util/ItemUtilsImpl.java index ff2d416..588cd84 100644 --- a/InventoryAccess/1_14_R1/src/main/java/de/studiocode/inventoryaccess/v1_14_R1/util/ItemUtilsImpl.java +++ b/InventoryAccess/1_14_R1/src/main/java/de/studiocode/inventoryaccess/v1_14_R1/util/ItemUtilsImpl.java @@ -1,14 +1,19 @@ package de.studiocode.inventoryaccess.v1_14_R1.util; import de.studiocode.inventoryaccess.abstraction.util.ItemUtils; +import de.studiocode.inventoryaccess.util.ReflectionRegistry; import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.md_5.bungee.api.chat.BaseComponent; import net.minecraft.server.v1_14_R1.ItemStack; import net.minecraft.server.v1_14_R1.NBTCompressedStreamTools; import net.minecraft.server.v1_14_R1.NBTTagCompound; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack; +import org.bukkit.inventory.meta.ItemMeta; import java.io.*; import java.lang.reflect.Field; +import java.util.List; +import java.util.stream.Collectors; public class ItemUtilsImpl implements ItemUtils { @@ -72,4 +77,22 @@ public class ItemUtilsImpl implements ItemUtils { return null; } + @Override + public void setDisplayName(ItemMeta itemMeta, BaseComponent[] name) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD, + itemMeta, + InventoryUtilsImpl.createNMSComponent(name) + ); + } + + @Override + public void setLore(ItemMeta itemMeta, List lore) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD, + itemMeta, + lore.stream().map(InventoryUtilsImpl::createNMSComponent).collect(Collectors.toList()) + ); + } + } diff --git a/InventoryAccess/1_15_R1/src/main/java/de/studiocode/inventoryaccess/v1_15_R1/util/ItemUtilsImpl.java b/InventoryAccess/1_15_R1/src/main/java/de/studiocode/inventoryaccess/v1_15_R1/util/ItemUtilsImpl.java index f0c0e3b..2825ebb 100644 --- a/InventoryAccess/1_15_R1/src/main/java/de/studiocode/inventoryaccess/v1_15_R1/util/ItemUtilsImpl.java +++ b/InventoryAccess/1_15_R1/src/main/java/de/studiocode/inventoryaccess/v1_15_R1/util/ItemUtilsImpl.java @@ -1,14 +1,19 @@ package de.studiocode.inventoryaccess.v1_15_R1.util; import de.studiocode.inventoryaccess.abstraction.util.ItemUtils; +import de.studiocode.inventoryaccess.util.ReflectionRegistry; import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.md_5.bungee.api.chat.BaseComponent; import net.minecraft.server.v1_15_R1.ItemStack; import net.minecraft.server.v1_15_R1.NBTCompressedStreamTools; import net.minecraft.server.v1_15_R1.NBTTagCompound; import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack; +import org.bukkit.inventory.meta.ItemMeta; import java.io.*; import java.lang.reflect.Field; +import java.util.List; +import java.util.stream.Collectors; public class ItemUtilsImpl implements ItemUtils { @@ -72,4 +77,22 @@ public class ItemUtilsImpl implements ItemUtils { return null; } + @Override + public void setDisplayName(ItemMeta itemMeta, BaseComponent[] name) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD, + itemMeta, + InventoryUtilsImpl.createNMSComponent(name) + ); + } + + @Override + public void setLore(ItemMeta itemMeta, List lore) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD, + itemMeta, + lore.stream().map(InventoryUtilsImpl::createNMSComponent).collect(Collectors.toList()) + ); + } + } diff --git a/InventoryAccess/1_16_R1/src/main/java/de/studiocode/inventoryaccess/v1_16_R1/util/ItemUtilsImpl.java b/InventoryAccess/1_16_R1/src/main/java/de/studiocode/inventoryaccess/v1_16_R1/util/ItemUtilsImpl.java index 217e2af..aab156e 100644 --- a/InventoryAccess/1_16_R1/src/main/java/de/studiocode/inventoryaccess/v1_16_R1/util/ItemUtilsImpl.java +++ b/InventoryAccess/1_16_R1/src/main/java/de/studiocode/inventoryaccess/v1_16_R1/util/ItemUtilsImpl.java @@ -1,14 +1,19 @@ package de.studiocode.inventoryaccess.v1_16_R1.util; import de.studiocode.inventoryaccess.abstraction.util.ItemUtils; +import de.studiocode.inventoryaccess.util.ReflectionRegistry; import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.md_5.bungee.api.chat.BaseComponent; import net.minecraft.server.v1_16_R1.ItemStack; import net.minecraft.server.v1_16_R1.NBTCompressedStreamTools; import net.minecraft.server.v1_16_R1.NBTTagCompound; import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack; +import org.bukkit.inventory.meta.ItemMeta; import java.io.*; import java.lang.reflect.Field; +import java.util.List; +import java.util.stream.Collectors; public class ItemUtilsImpl implements ItemUtils { @@ -72,4 +77,22 @@ public class ItemUtilsImpl implements ItemUtils { return null; } + @Override + public void setDisplayName(ItemMeta itemMeta, BaseComponent[] name) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD, + itemMeta, + InventoryUtilsImpl.createNMSComponent(name) + ); + } + + @Override + public void setLore(ItemMeta itemMeta, List lore) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD, + itemMeta, + lore.stream().map(InventoryUtilsImpl::createNMSComponent).collect(Collectors.toList()) + ); + } + } diff --git a/InventoryAccess/1_16_R2/src/main/java/de/studiocode/inventoryaccess/v1_16_R2/util/ItemUtilsImpl.java b/InventoryAccess/1_16_R2/src/main/java/de/studiocode/inventoryaccess/v1_16_R2/util/ItemUtilsImpl.java index 8db8c0c..8b4941b 100644 --- a/InventoryAccess/1_16_R2/src/main/java/de/studiocode/inventoryaccess/v1_16_R2/util/ItemUtilsImpl.java +++ b/InventoryAccess/1_16_R2/src/main/java/de/studiocode/inventoryaccess/v1_16_R2/util/ItemUtilsImpl.java @@ -1,14 +1,19 @@ package de.studiocode.inventoryaccess.v1_16_R2.util; import de.studiocode.inventoryaccess.abstraction.util.ItemUtils; +import de.studiocode.inventoryaccess.util.ReflectionRegistry; import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.md_5.bungee.api.chat.BaseComponent; import net.minecraft.server.v1_16_R2.ItemStack; import net.minecraft.server.v1_16_R2.NBTCompressedStreamTools; import net.minecraft.server.v1_16_R2.NBTTagCompound; import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; +import org.bukkit.inventory.meta.ItemMeta; import java.io.*; import java.lang.reflect.Field; +import java.util.List; +import java.util.stream.Collectors; public class ItemUtilsImpl implements ItemUtils { @@ -72,4 +77,22 @@ public class ItemUtilsImpl implements ItemUtils { return null; } + @Override + public void setDisplayName(ItemMeta itemMeta, BaseComponent[] name) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD, + itemMeta, + InventoryUtilsImpl.createNMSComponent(name) + ); + } + + @Override + public void setLore(ItemMeta itemMeta, List lore) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD, + itemMeta, + lore.stream().map(InventoryUtilsImpl::createNMSComponent).collect(Collectors.toList()) + ); + } + } diff --git a/InventoryAccess/1_16_R3/src/main/java/de/studiocode/inventoryaccess/v1_16_R3/util/ItemUtilsImpl.java b/InventoryAccess/1_16_R3/src/main/java/de/studiocode/inventoryaccess/v1_16_R3/util/ItemUtilsImpl.java index a4c369e..933c27d 100644 --- a/InventoryAccess/1_16_R3/src/main/java/de/studiocode/inventoryaccess/v1_16_R3/util/ItemUtilsImpl.java +++ b/InventoryAccess/1_16_R3/src/main/java/de/studiocode/inventoryaccess/v1_16_R3/util/ItemUtilsImpl.java @@ -1,14 +1,20 @@ package de.studiocode.inventoryaccess.v1_16_R3.util; import de.studiocode.inventoryaccess.abstraction.util.ItemUtils; +import de.studiocode.inventoryaccess.util.ReflectionRegistry; import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.server.v1_16_R3.ItemStack; import net.minecraft.server.v1_16_R3.NBTCompressedStreamTools; import net.minecraft.server.v1_16_R3.NBTTagCompound; import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack; +import org.bukkit.inventory.meta.ItemMeta; import java.io.*; import java.lang.reflect.Field; +import java.util.List; +import java.util.stream.Collectors; public class ItemUtilsImpl implements ItemUtils { @@ -72,4 +78,22 @@ public class ItemUtilsImpl implements ItemUtils { return null; } + @Override + public void setDisplayName(ItemMeta itemMeta, BaseComponent[] name) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD, + itemMeta, + ComponentSerializer.toString(name) + ); + } + + @Override + public void setLore(ItemMeta itemMeta, List lore) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD, + itemMeta, + lore.stream().map(ComponentSerializer::toString).collect(Collectors.toList()) + ); + } + } \ No newline at end of file diff --git a/InventoryAccess/1_17_R1/src/main/java/de/studiocode/inventoryaccess/v1_17_R1/util/ItemUtilsImpl.java b/InventoryAccess/1_17_R1/src/main/java/de/studiocode/inventoryaccess/v1_17_R1/util/ItemUtilsImpl.java index 98b2941..60abcd1 100644 --- a/InventoryAccess/1_17_R1/src/main/java/de/studiocode/inventoryaccess/v1_17_R1/util/ItemUtilsImpl.java +++ b/InventoryAccess/1_17_R1/src/main/java/de/studiocode/inventoryaccess/v1_17_R1/util/ItemUtilsImpl.java @@ -1,14 +1,20 @@ package de.studiocode.inventoryaccess.v1_17_R1.util; import de.studiocode.inventoryaccess.abstraction.util.ItemUtils; +import de.studiocode.inventoryaccess.util.ReflectionRegistry; import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; +import org.bukkit.inventory.meta.ItemMeta; import java.io.*; import java.lang.reflect.Field; +import java.util.List; +import java.util.stream.Collectors; public class ItemUtilsImpl implements ItemUtils { @@ -72,4 +78,22 @@ public class ItemUtilsImpl implements ItemUtils { return null; } + @Override + public void setDisplayName(ItemMeta itemMeta, BaseComponent[] name) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD, + itemMeta, + ComponentSerializer.toString(name) + ); + } + + @Override + public void setLore(ItemMeta itemMeta, List lore) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD, + itemMeta, + lore.stream().map(ComponentSerializer::toString).collect(Collectors.toList()) + ); + } + } \ No newline at end of file diff --git a/InventoryAccess/1_17_R2/src/main/java/de/studiocode/inventoryaccess/v1_17_R2/util/ItemUtilsImpl.java b/InventoryAccess/1_17_R2/src/main/java/de/studiocode/inventoryaccess/v1_17_R2/util/ItemUtilsImpl.java index 5e58ff3..8389b5a 100644 --- a/InventoryAccess/1_17_R2/src/main/java/de/studiocode/inventoryaccess/v1_17_R2/util/ItemUtilsImpl.java +++ b/InventoryAccess/1_17_R2/src/main/java/de/studiocode/inventoryaccess/v1_17_R2/util/ItemUtilsImpl.java @@ -1,14 +1,20 @@ package de.studiocode.inventoryaccess.v1_17_R2.util; import de.studiocode.inventoryaccess.abstraction.util.ItemUtils; +import de.studiocode.inventoryaccess.util.ReflectionRegistry; import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; +import org.bukkit.inventory.meta.ItemMeta; import java.io.*; import java.lang.reflect.Field; +import java.util.List; +import java.util.stream.Collectors; public class ItemUtilsImpl implements ItemUtils { @@ -72,4 +78,22 @@ public class ItemUtilsImpl implements ItemUtils { return null; } + @Override + public void setDisplayName(ItemMeta itemMeta, BaseComponent[] name) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD, + itemMeta, + ComponentSerializer.toString(name) + ); + } + + @Override + public void setLore(ItemMeta itemMeta, List lore) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD, + itemMeta, + lore.stream().map(ComponentSerializer::toString).collect(Collectors.toList()) + ); + } + } \ No newline at end of file diff --git a/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/abstraction/util/ItemUtils.java b/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/abstraction/util/ItemUtils.java index d3b05c9..f6e0bdc 100644 --- a/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/abstraction/util/ItemUtils.java +++ b/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/abstraction/util/ItemUtils.java @@ -1,9 +1,12 @@ package de.studiocode.inventoryaccess.abstraction.util; +import net.md_5.bungee.api.chat.BaseComponent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import java.io.InputStream; import java.io.OutputStream; +import java.util.List; public interface ItemUtils { @@ -47,4 +50,18 @@ public interface ItemUtils { */ ItemStack deserializeItemStack(InputStream inputStream, boolean compressed); + /** + * Sets the display name of an {@link ItemMeta} + * @param itemMeta The {@link ItemMeta} + * @param name The display name as a {@link BaseComponent BaseComponent[]} + */ + void setDisplayName(ItemMeta itemMeta, BaseComponent[] name); + + /** + * Sets the lore of an {@link ItemMeta} + * @param itemMeta The {@link ItemMeta} + * @param lore The lore as a list of {@link BaseComponent BaseComponent[]} + */ + void setLore(ItemMeta itemMeta, List lore); + }