diff --git a/src/main/java/net/minestom/server/inventory/PlayerInventory.java b/src/main/java/net/minestom/server/inventory/PlayerInventory.java index c00b5cd46..8172487eb 100644 --- a/src/main/java/net/minestom/server/inventory/PlayerInventory.java +++ b/src/main/java/net/minestom/server/inventory/PlayerInventory.java @@ -214,8 +214,9 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler this.items[slot] = itemStack; } - // Refresh inventory items - update(); + // Refresh slot + refreshSlot(slot); + //update(); in case of problems // Sync equipment if (equipmentSlot != null) { diff --git a/src/main/java/net/minestom/server/item/ItemFlag.java b/src/main/java/net/minestom/server/item/ItemFlag.java new file mode 100644 index 000000000..fa77de086 --- /dev/null +++ b/src/main/java/net/minestom/server/item/ItemFlag.java @@ -0,0 +1,11 @@ +package net.minestom.server.item; + +public enum ItemFlag { + + HIDE_ATTRIBUTES, + HIDE_DESTROYS, + HIDE_ENCHANTS, + HIDE_PLACED_ON, + HIDE_POTION_EFFECTS, + HIDE_UNBREAKABLE +} diff --git a/src/main/java/net/minestom/server/item/ItemStack.java b/src/main/java/net/minestom/server/item/ItemStack.java index f7ac1c19c..511492d5a 100644 --- a/src/main/java/net/minestom/server/item/ItemStack.java +++ b/src/main/java/net/minestom/server/item/ItemStack.java @@ -4,10 +4,7 @@ import net.minestom.server.data.Data; import net.minestom.server.data.DataContainer; import net.minestom.server.item.rule.VanillaStackingRule; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class ItemStack implements DataContainer { @@ -31,7 +28,9 @@ public class ItemStack implements DataContainer { private boolean unbreakable; private ArrayList lore; - private Map enchantmentMap; + private Map enchantmentMap; + + private int hideFlag; private StackingRule stackingRule; private Data data; @@ -71,6 +70,7 @@ public class ItemStack implements DataContainer { itemStack.isUnbreakable() == unbreakable && itemStack.getDamage() == damage && itemStack.enchantmentMap.equals(enchantmentMap) && + itemStack.hideFlag == hideFlag && itemStack.getStackingRule() == stackingRule && itemStack.getData() == data; } @@ -123,11 +123,11 @@ public class ItemStack implements DataContainer { return lore != null && !lore.isEmpty(); } - public Map getEnchantmentMap() { + public Map getEnchantmentMap() { return Collections.unmodifiableMap(enchantmentMap); } - public void setEnchantment(Enchantment enchantment, int level) { + public void setEnchantment(Enchantment enchantment, short level) { if (level < 1) { removeEnchantment(enchantment); return; @@ -141,7 +141,40 @@ public class ItemStack implements DataContainer { } public int getEnchantmentLevel(Enchantment enchantment) { - return this.enchantmentMap.getOrDefault(enchantment, 0); + return this.enchantmentMap.getOrDefault(enchantment, (short) 0); + } + + public int getHideFlag() { + return hideFlag; + } + + public void addItemFlags(ItemFlag... hideFlags) { + for (ItemFlag f : hideFlags) { + this.hideFlag |= getBitModifier(f); + } + } + + public void removeItemFlags(ItemFlag... hideFlags) { + for (ItemFlag f : hideFlags) { + this.hideFlag &= ~getBitModifier(f); + } + } + + public Set getItemFlags() { + Set currentFlags = EnumSet.noneOf(ItemFlag.class); + + for (ItemFlag f : ItemFlag.values()) { + if (hasItemFlag(f)) { + currentFlags.add(f); + } + } + + return currentFlags; + } + + public boolean hasItemFlag(ItemFlag flag) { + int bitModifier = getBitModifier(flag); + return (this.hideFlag & bitModifier) == bitModifier; } public boolean isUnbreakable() { @@ -202,4 +235,8 @@ public class ItemStack implements DataContainer { ItemStack.defaultStackingRule = defaultStackingRule; } + + private byte getBitModifier(ItemFlag hideFlag) { + return (byte) (1 << hideFlag.ordinal()); + } } diff --git a/src/main/java/net/minestom/server/utils/NbtReaderUtils.java b/src/main/java/net/minestom/server/utils/NbtReaderUtils.java index ca84e605d..a0beca546 100644 --- a/src/main/java/net/minestom/server/utils/NbtReaderUtils.java +++ b/src/main/java/net/minestom/server/utils/NbtReaderUtils.java @@ -71,7 +71,7 @@ public class NbtReaderUtils { if (listName.equals("StoredEnchantments")) { reader.readByte(); // Should be a compound (0x0A) - int size = reader.readInteger(); + int size = reader.readInteger(); // Enchants count for (int ench = 0; ench < size; ench++) { reader.readByte(); // Type id (short) diff --git a/src/main/java/net/minestom/server/utils/Utils.java b/src/main/java/net/minestom/server/utils/Utils.java index d45cd4ff2..47f00843f 100644 --- a/src/main/java/net/minestom/server/utils/Utils.java +++ b/src/main/java/net/minestom/server/utils/Utils.java @@ -83,7 +83,7 @@ public class Utils { packet.writeBoolean(false); } else { packet.writeBoolean(true); - Utils.writeVarInt(packet, itemStack.getMaterialId()); + packet.writeVarInt(itemStack.getMaterialId()); packet.writeByte(itemStack.getAmount()); if (!itemStack.hasNbtTag()) { @@ -101,10 +101,13 @@ public class Utils { packet.writeInt(1); } - // Damage - packet.writeByte((byte) 0x02); - packet.writeShortSizedString("Damage"); - packet.writeShort(itemStack.getDamage()); + // Start damage + { + packet.writeByte((byte) 0x02); + packet.writeShortSizedString("Damage"); + packet.writeShort(itemStack.getDamage()); + } + // End damage // Display boolean hasDisplayName = itemStack.hasDisplayName(); @@ -137,22 +140,23 @@ public class Utils { // End display // Start enchantment + // FIXME: something is broken, enchants are basically ignored... { - Map enchantmentMap = itemStack.getEnchantmentMap(); + Map enchantmentMap = itemStack.getEnchantmentMap(); if (!enchantmentMap.isEmpty()) { - packet.writeByte((byte) 0x09); // list + packet.writeByte((byte) 0x09); // Type id (list) packet.writeShortSizedString("StoredEnchantments"); packet.writeByte((byte) 0x0A); // Compound packet.writeInt(enchantmentMap.size()); // Map size - for (Map.Entry entry : enchantmentMap.entrySet()) { + for (Map.Entry entry : enchantmentMap.entrySet()) { Enchantment enchantment = entry.getKey(); - int level = entry.getValue(); + short level = entry.getValue(); packet.writeByte((byte) 0x02); // Type id (short) packet.writeShortSizedString("lvl"); - packet.writeShort((short) level); + packet.writeShort(level); packet.writeByte((byte) 0x08); // Type id (string) packet.writeShortSizedString("id"); @@ -166,6 +170,16 @@ public class Utils { } // End enchantment + // Start hide flags + /*{ + int hideFlag = itemStack.getHideFlag(); + if (hideFlag != 0) { + packet.writeByte((byte) 3); // Type id (int) + packet.writeShortSizedString("HideFlags"); + packet.writeInt(hideFlag); + } + }*/ + packet.writeByte((byte) 0); // End nbt } }