From 4f12d65c7ad07670e35d64208b0b50e8f574f64b Mon Sep 17 00:00:00 2001 From: mworzala Date: Fri, 12 Apr 2024 11:00:16 -0400 Subject: [PATCH] chore: more components --- .../src/main/java/net/minestom/demo/Main.java | 9 +++ .../java/net/minestom/demo/PlayerInit.java | 18 ++--- .../minecraft/ArgumentItemStack.java | 3 +- .../minestom/server/entity/EquipmentSlot.java | 10 --- .../minestom/server/entity/ItemEntity.java | 11 ++- .../net/minestom/server/entity/Metadata.java | 2 +- .../net/minestom/server/entity/Player.java | 11 ++- .../entity/attribute/AttributeInstance.java | 2 +- .../entity/attribute/AttributeOperation.java | 4 +- .../server/instance/InstanceContainer.java | 2 +- .../block/rule/BlockPlacementRule.java | 4 +- .../minestom/server/item/ItemComponent.java | 6 +- .../server/item/ItemComponentImpl.java | 12 +++ .../server/item/ItemComponentMap.java | 14 ++++ .../server/item/ItemComponentMapImpl.java | 47 ++++++++++++ .../server/item/ItemComponentPatch.java | 34 +++++++-- .../server/item/ItemComponentPatchImpl.java | 4 - .../net/minestom/server/item/ItemStack.java | 28 +++---- .../minestom/server/item/ItemStackImpl.java | 37 ++++++---- .../net/minestom/server/item/Material.java | 20 +---- .../listener/BlockPlacementListener.java | 6 +- .../listener/PlayerDiggingListener.java | 7 +- .../server/listener/UseItemListener.java | 3 +- .../server/network/NetworkBuffer.java | 2 - .../server/network/NetworkBufferTypeImpl.java | 36 --------- .../client/play/ClientClickWindowPacket.java | 8 +- .../ClientCreativeInventoryActionPacket.java | 5 +- .../server/play/AdvancementsPacket.java | 5 +- .../server/play/DeclareRecipesPacket.java | 36 ++++----- .../server/play/EntityEquipmentPacket.java | 13 ++-- .../packet/server/play/ExplosionPacket.java | 3 +- .../packet/server/play/SetSlotPacket.java | 23 +++--- .../packet/server/play/TradeListPacket.java | 10 +-- .../packet/server/play/WindowItemsPacket.java | 39 +++++----- .../particle/data/ItemParticleData.java | 4 +- .../minestom/server/registry/Registry.java | 74 ++++++++++--------- .../server/utils/binary/BinaryReader.java | 2 +- .../server/utils/binary/BinaryWriter.java | 2 +- .../server/world/biomes/BiomeParticle.java | 7 +- 39 files changed, 315 insertions(+), 248 deletions(-) create mode 100644 src/main/java/net/minestom/server/item/ItemComponentMapImpl.java delete mode 100644 src/main/java/net/minestom/server/item/ItemComponentPatchImpl.java diff --git a/demo/src/main/java/net/minestom/demo/Main.java b/demo/src/main/java/net/minestom/demo/Main.java index 6471f8564..1f5066fb2 100644 --- a/demo/src/main/java/net/minestom/demo/Main.java +++ b/demo/src/main/java/net/minestom/demo/Main.java @@ -32,6 +32,15 @@ import java.util.List; public class Main { public static void main(String[] args) { + try { + + Class.forName("net.minestom.server.item.ItemComponent"); + Class.forName("net.minestom.server.item.ItemStack"); + } catch (Exception e) { + e.printStackTrace(); + System.err.println("Failed to load Minestom classes, make sure you are using the correct dependencies"); + return; + } System.setProperty("minestom.experiment.pose-updates", "true"); MinecraftServer.setCompressionThreshold(0); diff --git a/demo/src/main/java/net/minestom/demo/PlayerInit.java b/demo/src/main/java/net/minestom/demo/PlayerInit.java index 81974b749..94ed4ca1e 100644 --- a/demo/src/main/java/net/minestom/demo/PlayerInit.java +++ b/demo/src/main/java/net/minestom/demo/PlayerInit.java @@ -28,9 +28,9 @@ import net.minestom.server.instance.LightingChunk; import net.minestom.server.instance.block.Block; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.InventoryType; +import net.minestom.server.item.ItemComponent; import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; -import net.minestom.server.item.metadata.BundleMeta; import net.minestom.server.monitoring.BenchmarkManager; import net.minestom.server.monitoring.TickMonitor; import net.minestom.server.utils.MathUtils; @@ -38,8 +38,8 @@ import net.minestom.server.utils.time.TimeUnit; import net.minestom.server.world.DimensionType; import java.time.Duration; +import java.util.List; import java.util.Random; -import java.util.Set; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicReference; @@ -100,17 +100,17 @@ public class PlayerInit { player.setPermissionLevel(4); ItemStack itemStack = ItemStack.builder(Material.STONE) .amount(64) - .meta(itemMetaBuilder -> - itemMetaBuilder.canPlaceOn(Set.of(Block.STONE)) - .canDestroy(Set.of(Block.DIAMOND_ORE))) +// .meta(itemMetaBuilder -> +// itemMetaBuilder.canPlaceOn(Set.of(Block.STONE)) +// .canDestroy(Set.of(Block.DIAMOND_ORE))) .build(); player.getInventory().addItemStack(itemStack); ItemStack bundle = ItemStack.builder(Material.BUNDLE) - .meta(BundleMeta.class, bundleMetaBuilder -> { - bundleMetaBuilder.addItem(ItemStack.of(Material.DIAMOND, 5)); - bundleMetaBuilder.addItem(ItemStack.of(Material.RABBIT_FOOT, 5)); - }) + .set(ItemComponent.BUNDLE_CONTENTS, List.of( + ItemStack.of(Material.DIAMOND, 5), + ItemStack.of(Material.RABBIT_FOOT, 5) + )) .build(); player.getInventory().addItemStack(bundle); diff --git a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentItemStack.java b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentItemStack.java index 18e5ef25e..aa74f7796 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentItemStack.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentItemStack.java @@ -71,7 +71,8 @@ public class ArgumentItemStack extends Argument { throw new ArgumentSyntaxException("Item NBT is invalid", input, INVALID_NBT); } - return ItemStack.fromNBT(material, compound); +// return ItemStack.fromNBT(material, compound); //todo + return ItemStack.of(material); } } diff --git a/src/main/java/net/minestom/server/entity/EquipmentSlot.java b/src/main/java/net/minestom/server/entity/EquipmentSlot.java index 2fa5bc189..14d852b72 100644 --- a/src/main/java/net/minestom/server/entity/EquipmentSlot.java +++ b/src/main/java/net/minestom/server/entity/EquipmentSlot.java @@ -41,14 +41,4 @@ public enum EquipmentSlot { return ARMORS; } - public static @NotNull EquipmentSlot fromAttributeSlot(@NotNull AttributeSlot attributeSlot) { - return switch (attributeSlot) { - case MAINHAND -> MAIN_HAND; - case OFFHAND -> OFF_HAND; - case FEET -> BOOTS; - case LEGS -> LEGGINGS; - case CHEST -> CHESTPLATE; - case HEAD -> HELMET; - }; - } } diff --git a/src/main/java/net/minestom/server/entity/ItemEntity.java b/src/main/java/net/minestom/server/entity/ItemEntity.java index f0ff33d7b..9339a23c7 100644 --- a/src/main/java/net/minestom/server/entity/ItemEntity.java +++ b/src/main/java/net/minestom/server/entity/ItemEntity.java @@ -5,7 +5,7 @@ import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.entity.EntityItemMergeEvent; import net.minestom.server.instance.EntityTracker; import net.minestom.server.item.ItemStack; -import net.minestom.server.item.StackingRule; +import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.time.Cooldown; import net.minestom.server.utils.time.TimeUnit; import org.jetbrains.annotations.NotNull; @@ -77,13 +77,12 @@ public class ItemEntity extends Entity { if (getDistanceSquared(itemEntity) > mergeRange * mergeRange) return; final ItemStack itemStackEntity = itemEntity.getItemStack(); - final StackingRule stackingRule = StackingRule.get(); - final boolean canStack = stackingRule.canBeStacked(itemStack, itemStackEntity); + final boolean canStack = itemStack.isSimilar(itemStackEntity); if (!canStack) return; - final int totalAmount = stackingRule.getAmount(itemStack) + stackingRule.getAmount(itemStackEntity); - if (!stackingRule.canApply(itemStack, totalAmount)) return; - final ItemStack result = stackingRule.apply(itemStack, totalAmount); + final int totalAmount = itemStack.amount() + itemStackEntity.amount(); + if (!MathUtils.isBetween(totalAmount, 0, itemStack.maxStackSize())) return; + final ItemStack result = itemStack.withAmount(totalAmount); EntityItemMergeEvent entityItemMergeEvent = new EntityItemMergeEvent(this, itemEntity, result); EventDispatcher.callCancellable(entityItemMergeEvent, () -> { setItemStack(entityItemMergeEvent.getResult()); diff --git a/src/main/java/net/minestom/server/entity/Metadata.java b/src/main/java/net/minestom/server/entity/Metadata.java index dd6802e53..62f9ce66e 100644 --- a/src/main/java/net/minestom/server/entity/Metadata.java +++ b/src/main/java/net/minestom/server/entity/Metadata.java @@ -53,7 +53,7 @@ public final class Metadata { } public static Entry ItemStack(@NotNull ItemStack value) { - return new MetadataImpl.EntryImpl<>(TYPE_ITEM_STACK, value, NetworkBuffer.ITEM); + return new MetadataImpl.EntryImpl<>(TYPE_ITEM_STACK, value, ItemStack.NETWORK_TYPE); } public static Entry Boolean(boolean value) { diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 446de1935..bb0d9f12a 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -443,7 +443,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, refreshActiveHand(false, isOffHand, false); final ItemStack foodItem = itemUpdateStateEvent.getItemStack(); - final boolean isFood = foodItem.material().isFood(); + final boolean isFood = foodItem.has(ItemComponent.FOOD); if (isFood) { PlayerEatEvent playerEatEvent = new PlayerEatEvent(this, foodItem, eatingHand); @@ -1804,6 +1804,13 @@ public class Player extends LivingEntity implements CommandSender, Localizable, } } + /** + * Used internally to determine when sending the close inventory packet should be skipped. + */ + public boolean skipClosePacket() { + return skipClosePacket; + } + /** * Used internally to reset the skipClosePacket field, which determines when sending the close inventory packet * should be skipped. @@ -2210,7 +2217,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, return null; final ItemStack updatedItem = getItemInHand(hand); - final boolean isFood = updatedItem.material().isFood(); + final boolean isFood = updatedItem.has(ItemComponent.FOOD); if (isFood && !allowFood) return null; diff --git a/src/main/java/net/minestom/server/entity/attribute/AttributeInstance.java b/src/main/java/net/minestom/server/entity/attribute/AttributeInstance.java index c26416941..c3adb948c 100644 --- a/src/main/java/net/minestom/server/entity/attribute/AttributeInstance.java +++ b/src/main/java/net/minestom/server/entity/attribute/AttributeInstance.java @@ -115,7 +115,7 @@ public final class AttributeInstance { final Collection modifiers = getModifiers(); double base = getBaseValue(); - for (var modifier : modifiers.stream().filter(mod -> mod.getOperation() == AttributeOperation.ADDITION).toArray(AttributeModifier[]::new)) { + for (var modifier : modifiers.stream().filter(mod -> mod.getOperation() == AttributeOperation.ADD_VALUE).toArray(AttributeModifier[]::new)) { base += modifier.getAmount(); } diff --git a/src/main/java/net/minestom/server/entity/attribute/AttributeOperation.java b/src/main/java/net/minestom/server/entity/attribute/AttributeOperation.java index acf09ab91..2a66e7d04 100644 --- a/src/main/java/net/minestom/server/entity/attribute/AttributeOperation.java +++ b/src/main/java/net/minestom/server/entity/attribute/AttributeOperation.java @@ -3,11 +3,11 @@ package net.minestom.server.entity.attribute; import org.jetbrains.annotations.Nullable; public enum AttributeOperation { - ADDITION(0), + ADD_VALUE(0), MULTIPLY_BASE(1), MULTIPLY_TOTAL(2); - private static final AttributeOperation[] VALUES = new AttributeOperation[]{ADDITION, MULTIPLY_BASE, MULTIPLY_TOTAL}; + private static final AttributeOperation[] VALUES = new AttributeOperation[]{ADD_VALUE, MULTIPLY_BASE, MULTIPLY_TOTAL}; private final int id; AttributeOperation(int id) { diff --git a/src/main/java/net/minestom/server/instance/InstanceContainer.java b/src/main/java/net/minestom/server/instance/InstanceContainer.java index 689da10cf..2ea2c3e19 100644 --- a/src/main/java/net/minestom/server/instance/InstanceContainer.java +++ b/src/main/java/net/minestom/server/instance/InstanceContainer.java @@ -159,7 +159,7 @@ public class InstanceContainer extends Instance { this, block, pp.getBlockFace(), blockPosition, new Vec(pp.getCursorX(), pp.getCursorY(), pp.getCursorZ()), pp.getPlayer().getPosition(), - pp.getPlayer().getItemInHand(pp.getHand()).meta(), + pp.getPlayer().getItemInHand(pp.getHand()), pp.getPlayer().isSneaking() ); } else { diff --git a/src/main/java/net/minestom/server/instance/block/rule/BlockPlacementRule.java b/src/main/java/net/minestom/server/instance/block/rule/BlockPlacementRule.java index 68d027514..a2eb98107 100644 --- a/src/main/java/net/minestom/server/instance/block/rule/BlockPlacementRule.java +++ b/src/main/java/net/minestom/server/instance/block/rule/BlockPlacementRule.java @@ -4,7 +4,7 @@ import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Pos; import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.BlockFace; -import net.minestom.server.item.ItemMeta; +import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -61,7 +61,7 @@ public abstract class BlockPlacementRule { @NotNull Point placePosition, @Nullable Point cursorPosition, @Nullable Pos playerPosition, - @Nullable ItemMeta usedItemMeta, + @Nullable ItemStack usedItemStack, boolean isPlayerShifting ) { } diff --git a/src/main/java/net/minestom/server/item/ItemComponent.java b/src/main/java/net/minestom/server/item/ItemComponent.java index eef69da27..efc579be6 100644 --- a/src/main/java/net/minestom/server/item/ItemComponent.java +++ b/src/main/java/net/minestom/server/item/ItemComponent.java @@ -47,8 +47,8 @@ public sealed interface ItemComponent extends StaticProtocolObject permits It ItemComponent MAP_ID = declare("map_id", NetworkBuffer.VAR_INT, BinaryTagSerializer.INT); ItemComponent MAP_DECORATIONS = declare("map_decorations", null, MapDecorations.NBT_TYPE); ItemComponent MAP_POST_PROCESSING = declare("map_post_processing", MapPostProcessing.NETWORK_TYPE, null); - ItemComponent> CHARGED_PROJECTILES = declare("charged_projectiles", NetworkBuffer.ITEM.list(Short.MAX_VALUE), BinaryTagSerializer.ITEM.list()); - ItemComponent> BUNDLE_CONTENTS = declare("bundle_contents", NetworkBuffer.ITEM.list(Short.MAX_VALUE), BinaryTagSerializer.ITEM.list()); + ItemComponent> CHARGED_PROJECTILES = declare("charged_projectiles", ItemStack.NETWORK_TYPE.list(Short.MAX_VALUE), BinaryTagSerializer.ITEM.list()); + ItemComponent> BUNDLE_CONTENTS = declare("bundle_contents", ItemStack.NETWORK_TYPE.list(Short.MAX_VALUE), BinaryTagSerializer.ITEM.list()); ItemComponent POTION_CONTENTS = declare("potion_contents", null, null); //todo ItemComponent SUSPICIOUS_STEW_EFFECTS = declare("suspicious_stew_effects", null, null); //todo ItemComponent WRITABLE_BOOK_CONTENT = declare("writable_book_content", WritableBookContent.NETWORK_TYPE, WritableBookContent.NBT_TYPE); @@ -69,7 +69,7 @@ public sealed interface ItemComponent extends StaticProtocolObject permits It ItemComponent BANNER_PATTERNS = declare("banner_patterns", null, null); //todo ItemComponent BASE_COLOR = declare("base_color", null, null); //todo dyecolor is the same stringrepresentable as item rarity ItemComponent POT_DECORATIONS = declare("pot_decorations", null, null); //todo - ItemComponent> CONTAINER = declare("container", NetworkBuffer.ITEM.list(256), BinaryTagSerializer.ITEM.list()); + ItemComponent> CONTAINER = declare("container", ItemStack.NETWORK_TYPE.list(256), BinaryTagSerializer.ITEM.list()); ItemComponent BLOCK_STATE = declare("block_state", null, null); //todo ItemComponent BEES = declare("bees", null, null); //todo ItemComponent LOCK = declare("lock", null, BinaryTagSerializer.STRING); diff --git a/src/main/java/net/minestom/server/item/ItemComponentImpl.java b/src/main/java/net/minestom/server/item/ItemComponentImpl.java index 3f45c08b1..4850b4692 100644 --- a/src/main/java/net/minestom/server/item/ItemComponentImpl.java +++ b/src/main/java/net/minestom/server/item/ItemComponentImpl.java @@ -34,12 +34,24 @@ record ItemComponentImpl( return nbt.read(tag); } + @Override + public @NotNull BinaryTag write(@NotNull T value) { + Check.notNull(nbt, "{0} cannot be serialized to NBT", this); + return nbt.write(value); + } + @Override public @NotNull T read(@NotNull NetworkBuffer reader) { Check.notNull(network, "{0} cannot be deserialized from network", this); return network.read(reader); } + @Override + public void write(@NotNull NetworkBuffer writer, @NotNull T value) { + Check.notNull(network, "{0} cannot be serialized to network", this); + network.write(writer, value); + } + @Override public String toString() { return name(); diff --git a/src/main/java/net/minestom/server/item/ItemComponentMap.java b/src/main/java/net/minestom/server/item/ItemComponentMap.java index 3e3b9d011..0944c3382 100644 --- a/src/main/java/net/minestom/server/item/ItemComponentMap.java +++ b/src/main/java/net/minestom/server/item/ItemComponentMap.java @@ -1,10 +1,15 @@ package net.minestom.server.item; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public interface ItemComponentMap { + static @NotNull ItemComponentMap.Builder builder() { + return new ItemComponentMapImpl.BuilderImpl(new Int2ObjectArrayMap<>()); + } + boolean has(@NotNull ItemComponent component); @Nullable T get(@NotNull ItemComponent component); @@ -14,4 +19,13 @@ public interface ItemComponentMap { return value != null ? value : defaultValue; } + interface Builder extends ItemComponentMap { + + @NotNull Builder set(@NotNull ItemComponent component, @Nullable Object value); + + @NotNull Builder remove(@NotNull ItemComponent component); + + @NotNull ItemComponentMap build(); + } + } diff --git a/src/main/java/net/minestom/server/item/ItemComponentMapImpl.java b/src/main/java/net/minestom/server/item/ItemComponentMapImpl.java new file mode 100644 index 000000000..42365e07a --- /dev/null +++ b/src/main/java/net/minestom/server/item/ItemComponentMapImpl.java @@ -0,0 +1,47 @@ +package net.minestom.server.item; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public record ItemComponentMapImpl(@NotNull Int2ObjectMap components) implements ItemComponentMap { + @Override + public boolean has(@NotNull ItemComponent component) { + return components.get(component.id()) != null; + } + + @Override + public @Nullable T get(@NotNull ItemComponent component) { + return (T) components.get(component.id()); + } + + public record BuilderImpl(@NotNull Int2ObjectMap components) implements ItemComponentMap.Builder { + + @Override + public boolean has(@NotNull ItemComponent component) { + return components.get(component.id()) != null; + } + + @Override + public @Nullable T get(@NotNull ItemComponent component) { + return (T) components.get(component.id()); + } + + @Override + public @NotNull Builder set(@NotNull ItemComponent component, @Nullable Object value) { + components.put(component.id(), value); + return this; + } + + @Override + public @NotNull Builder remove(@NotNull ItemComponent component) { + components.remove(component.id()); + return this; + } + + @Override + public @NotNull ItemComponentMap build() { + return new ItemComponentMapImpl(components); + } + } +} diff --git a/src/main/java/net/minestom/server/item/ItemComponentPatch.java b/src/main/java/net/minestom/server/item/ItemComponentPatch.java index 85b618dfc..0a07a0fca 100644 --- a/src/main/java/net/minestom/server/item/ItemComponentPatch.java +++ b/src/main/java/net/minestom/server/item/ItemComponentPatch.java @@ -7,7 +7,6 @@ import net.kyori.adventure.nbt.CompoundBinaryTag; import net.minestom.server.network.NetworkBuffer; import net.minestom.server.utils.nbt.BinaryTagSerializer; import net.minestom.server.utils.validate.Check; -import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -137,15 +136,34 @@ record ItemComponentPatch(@NotNull Int2ObjectMap patch) { return new ItemComponentPatch(newPatch); } - interface Builder extends ItemComponentMap { + public @NotNull Builder builder() { + return new Builder(new Int2ObjectArrayMap<>(patch)); + } - @Contract(value = "_, _ -> this", pure = true) - @NotNull Builder set(@NotNull ItemComponent component, @NotNull T value); + record Builder(@NotNull Int2ObjectMap patch) implements ItemComponentMap { - @Contract(value = "_ -> this", pure = true) - @NotNull Builder remove(@NotNull ItemComponent component); + @Override + public boolean has(@NotNull ItemComponent component) { + return patch.get(component.id()) != null; + } - @Contract(value = "-> new", pure = true) - @NotNull ItemComponentPatch build(); + @Override + public @Nullable T get(@NotNull ItemComponent component) { + return (T) patch.get(component.id()); + } + + public ItemComponentPatch.@NotNull Builder set(@NotNull ItemComponent component, @NotNull T value) { + patch.put(component.id(), value); + return this; + } + + public ItemComponentPatch.@NotNull Builder remove(@NotNull ItemComponent component) { + patch.put(component.id(), null); + return this; + } + + public @NotNull ItemComponentPatch build() { + return new ItemComponentPatch(patch); + } } } diff --git a/src/main/java/net/minestom/server/item/ItemComponentPatchImpl.java b/src/main/java/net/minestom/server/item/ItemComponentPatchImpl.java deleted file mode 100644 index 21664c6d8..000000000 --- a/src/main/java/net/minestom/server/item/ItemComponentPatchImpl.java +++ /dev/null @@ -1,4 +0,0 @@ -package net.minestom.server.item; - -final class ItemComponentPatchImpl implements ItemComponentPatch { -} diff --git a/src/main/java/net/minestom/server/item/ItemStack.java b/src/main/java/net/minestom/server/item/ItemStack.java index adfc8f390..5ee39e958 100644 --- a/src/main/java/net/minestom/server/item/ItemStack.java +++ b/src/main/java/net/minestom/server/item/ItemStack.java @@ -3,11 +3,9 @@ package net.minestom.server.item; import net.kyori.adventure.nbt.CompoundBinaryTag; import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.event.HoverEventSource; +import net.minestom.server.inventory.ContainerInventory; import net.minestom.server.item.component.CustomData; import net.minestom.server.network.NetworkBuffer; -import net.minestom.server.item.component.ItemComponent; -import net.minestom.server.item.component.ItemComponentMap; -import net.minestom.server.inventory.ContainerInventory; import net.minestom.server.tag.Tag; import net.minestom.server.tag.TagReadable; import net.minestom.server.tag.TagWritable; @@ -57,15 +55,7 @@ public sealed interface ItemStack extends TagReadable, ItemComponentMap, HoverEv * @param nbtCompound The nbt representation of the item */ static @NotNull ItemStack fromItemNBT(@NotNull CompoundBinaryTag nbtCompound) { -// String id = nbtCompound.getString("id"); -// Check.notNull(id, "Item NBT must contain an id field."); -// Material material = Material.fromNamespaceId(id); -// Check.notNull(material, "Unknown material: {0}", id); -// -// Byte amount = nbtCompound.getByte("Count"); -// if (amount == null) amount = 1; -// final CompoundBinaryTag tag = nbtCompound.getCompound("tag"); -// return tag != null ? fromNBT(material, tag, amount) : of(material, amount); + return ItemStackImpl.NBT_TYPE.read(nbtCompound); } @Contract(pure = true) @@ -91,6 +81,12 @@ public sealed interface ItemStack extends TagReadable, ItemComponentMap, HoverEv @Contract(value = "_, _ -> new", pure = true) @NotNull ItemStack with(@NotNull ItemComponent component, T value); + default @NotNull ItemStack with(@NotNull ItemComponent component, @NotNull UnaryOperator operator) { + T value = get(component); + if (value == null) return this; + return with(component, operator.apply(value)); + } + @Contract(value = "_, -> new", pure = true) @NotNull ItemStack without(@NotNull ItemComponent component); @@ -102,7 +98,12 @@ public sealed interface ItemStack extends TagReadable, ItemComponentMap, HoverEv @Override @Contract(pure = true) default @UnknownNullability T getTag(@NotNull Tag tag) { - return getOrDefault(ItemComponent.CUSTOM_DATA, CustomData.EMPTY).getTag(tag); + return get(ItemComponent.CUSTOM_DATA, CustomData.EMPTY).getTag(tag); + } + + @Contract(pure = true) + default int maxStackSize() { + return get(ItemComponent.MAX_STACK_SIZE, 64); } @Contract(value = "_, -> new", pure = true) @@ -133,6 +134,7 @@ public sealed interface ItemStack extends TagReadable, ItemComponentMap, HoverEv // //todo(matt): revisit, // throw new RuntimeException(e); // } + throw new UnsupportedOperationException("todo"); } sealed interface Builder extends TagWritable diff --git a/src/main/java/net/minestom/server/item/ItemStackImpl.java b/src/main/java/net/minestom/server/item/ItemStackImpl.java index 4574d5de6..a0361b94b 100644 --- a/src/main/java/net/minestom/server/item/ItemStackImpl.java +++ b/src/main/java/net/minestom/server/item/ItemStackImpl.java @@ -1,5 +1,6 @@ package net.minestom.server.item; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import net.kyori.adventure.nbt.CompoundBinaryTag; import net.minestom.server.item.component.CustomData; import net.minestom.server.network.NetworkBuffer; @@ -14,7 +15,22 @@ import java.util.function.Consumer; record ItemStackImpl(Material material, int amount, ItemComponentPatch components) implements ItemStack { - static final NetworkBuffer.Type NETWORK_TYPE = null; + static final NetworkBuffer.Type NETWORK_TYPE = new NetworkBuffer.Type<>() { + @Override + public void write(@NotNull NetworkBuffer buffer, ItemStack value) { + buffer.write(NetworkBuffer.VAR_INT, value.material().id()); + buffer.write(NetworkBuffer.VAR_INT, value.amount()); + buffer.write(ItemComponentPatch.NETWORK_TYPE, ((ItemStackImpl) value).components); + } + + @Override + public ItemStack read(@NotNull NetworkBuffer buffer) { + Material material = Material.fromId(buffer.read(NetworkBuffer.VAR_INT)); + int amount = buffer.read(NetworkBuffer.VAR_INT); + ItemComponentPatch components = buffer.read(ItemComponentPatch.NETWORK_TYPE); + return new ItemStackImpl(material, amount, components); + } + }; static final BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.COMPOUND.map(ItemStackImpl::fromCompound, ItemStackImpl::toCompound); static ItemStack create(Material material, int amount, ItemComponentPatch components) { @@ -26,6 +42,10 @@ record ItemStackImpl(Material material, int amount, ItemComponentPatch component return create(material, amount, ItemComponentPatch.EMPTY); } + public ItemStackImpl { + Check.notNull(material, "Material cannot be null"); + } + @Override public @Nullable T get(@NotNull ItemComponent component) { return components.get(material.prototype(), component); @@ -50,6 +70,7 @@ record ItemStackImpl(Material material, int amount, ItemComponentPatch component @Override public @NotNull ItemStack withAmount(int amount) { + if (amount <= 0) return ItemStack.AIR; return create(material, amount, components); } @@ -65,9 +86,7 @@ record ItemStackImpl(Material material, int amount, ItemComponentPatch component @Override public @NotNull ItemStack consume(int amount) { - int newAmount = amount() - amount; - if (newAmount <= 0) return AIR; - return withAmount(newAmount); + return withAmount(amount() - amount); } @Override @@ -78,14 +97,6 @@ record ItemStackImpl(Material material, int amount, ItemComponentPatch component @Override public @NotNull CompoundBinaryTag toItemNBT() { return (CompoundBinaryTag) NBT_TYPE.write(this); - -// CompoundBinaryTag.Builder builder = CompoundBinaryTag.builder() -// .putString("id", material.name()) -// .putByte("Count", (byte) amount); -// CompoundBinaryTag nbt = meta.toNBT(); -// if (nbt.size() > 0) builder.put("tag", nbt); -// return builder.build(); - //todo } @Contract(value = "-> new", pure = true) @@ -124,7 +135,7 @@ record ItemStackImpl(Material material, int amount, ItemComponentPatch component Builder(Material material, int amount) { this.material = material; this.amount = amount; - this.components = ItemComponentPatch.builder(material); + this.components = new ItemComponentPatch.Builder(new Int2ObjectArrayMap<>()); } @Override diff --git a/src/main/java/net/minestom/server/item/Material.java b/src/main/java/net/minestom/server/item/Material.java index e389136c6..6863f54a0 100644 --- a/src/main/java/net/minestom/server/item/Material.java +++ b/src/main/java/net/minestom/server/item/Material.java @@ -76,27 +76,11 @@ public sealed interface Material extends StaticProtocolObject, Materials permits } default boolean isArmor() { - //todo how does armor work nowadays - return false; -// return registry().isArmor(); + return registry().isArmor(); } - default boolean hasState() { - if (this == BOW || this == TRIDENT || this == CROSSBOW || this == SHIELD) { - return true; - } else { - return isFood(); - } - } - - @Deprecated(forRemoval = true) default int maxStackSize() { - return prototype().getOrDefault(ItemComponent.MAX_STACK_SIZE, 64); - } - - @Deprecated(forRemoval = true) - default boolean isFood() { - return prototype().has(ItemComponent.FOOD); + return prototype().get(ItemComponent.MAX_STACK_SIZE, 64); } static @NotNull Collection<@NotNull Material> values() { diff --git a/src/main/java/net/minestom/server/listener/BlockPlacementListener.java b/src/main/java/net/minestom/server/listener/BlockPlacementListener.java index 38526303d..76b6b764d 100644 --- a/src/main/java/net/minestom/server/listener/BlockPlacementListener.java +++ b/src/main/java/net/minestom/server/listener/BlockPlacementListener.java @@ -28,8 +28,6 @@ import net.minestom.server.network.packet.server.play.BlockChangePacket; import net.minestom.server.utils.chunk.ChunkUtils; import net.minestom.server.utils.validate.Check; -import java.util.concurrent.atomic.AtomicBoolean; - public class BlockPlacementListener { private static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager(); @@ -90,7 +88,9 @@ public class BlockPlacementListener { canPlaceBlock = false; // Spectators can't place blocks } else if (player.getGameMode() == GameMode.ADVENTURE) { //Check if the block can be placed on the block - canPlaceBlock = usedItem.meta().canPlaceOn(interactedBlock); +// canPlaceBlock = usedItem.meta().canPlaceOn(interactedBlock); + canPlaceBlock = false; + //todo } diff --git a/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java b/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java index 4d816bbf6..d5ce06126 100644 --- a/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java @@ -118,9 +118,10 @@ public final class PlayerDiggingListener { } else if (player.getGameMode() == GameMode.ADVENTURE) { // Check if the item can break the block with the current item final ItemStack itemInMainHand = player.getItemInMainHand(); - if (!itemInMainHand.meta().canDestroy(block)) { - return true; - } + //todo +// if (!itemInMainHand.meta().canDestroy(block)) { +// return true; +// } } return false; } diff --git a/src/main/java/net/minestom/server/listener/UseItemListener.java b/src/main/java/net/minestom/server/listener/UseItemListener.java index 214bfb05c..5a122ebde 100644 --- a/src/main/java/net/minestom/server/listener/UseItemListener.java +++ b/src/main/java/net/minestom/server/listener/UseItemListener.java @@ -7,6 +7,7 @@ import net.minestom.server.event.player.PlayerItemAnimationEvent; import net.minestom.server.event.player.PlayerPreEatEvent; import net.minestom.server.event.player.PlayerUseItemEvent; import net.minestom.server.inventory.PlayerInventory; +import net.minestom.server.item.ItemComponent; import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; import net.minestom.server.network.packet.client.play.ClientUseItemPacket; @@ -54,7 +55,7 @@ public class UseItemListener { itemAnimationType = PlayerItemAnimationEvent.ItemAnimationType.SHIELD; } else if (material == Material.TRIDENT) { itemAnimationType = PlayerItemAnimationEvent.ItemAnimationType.TRIDENT; - } else if (material.isFood()) { + } else if (itemStack.has(ItemComponent.FOOD)) { itemAnimationType = PlayerItemAnimationEvent.ItemAnimationType.EAT; // Eating code, contains the eating time customisation diff --git a/src/main/java/net/minestom/server/network/NetworkBuffer.java b/src/main/java/net/minestom/server/network/NetworkBuffer.java index 5695d3e16..aa8838aed 100644 --- a/src/main/java/net/minestom/server/network/NetworkBuffer.java +++ b/src/main/java/net/minestom/server/network/NetworkBuffer.java @@ -10,7 +10,6 @@ import net.minestom.server.entity.metadata.animal.FrogMeta; import net.minestom.server.entity.metadata.animal.SnifferMeta; import net.minestom.server.entity.metadata.animal.tameable.CatMeta; import net.minestom.server.entity.metadata.other.PaintingMeta; -import net.minestom.server.item.ItemStack; import net.minestom.server.network.packet.server.play.data.WorldPos; import net.minestom.server.particle.Particle; import net.minestom.server.utils.Direction; @@ -48,7 +47,6 @@ public final class NetworkBuffer { public static final Type COMPONENT = new NetworkBufferTypeImpl.ComponentType(); public static final Type JSON_COMPONENT = new NetworkBufferTypeImpl.JsonComponentType(); public static final Type UUID = new NetworkBufferTypeImpl.UUIDType(); - public static final Type ITEM = new NetworkBufferTypeImpl.ItemType(); public static final Type BYTE_ARRAY = new NetworkBufferTypeImpl.ByteArrayType(); public static final Type LONG_ARRAY = new NetworkBufferTypeImpl.LongArrayType(); diff --git a/src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java b/src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java index 804171ac6..b1fc188f7 100644 --- a/src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java +++ b/src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java @@ -1,16 +1,12 @@ package net.minestom.server.network; import net.kyori.adventure.nbt.BinaryTag; -import net.kyori.adventure.nbt.CompoundBinaryTag; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.minestom.server.adventure.serializer.nbt.NbtComponentSerializer; import net.minestom.server.color.Color; import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Vec; -import net.minestom.server.item.ItemComponent; -import net.minestom.server.item.ItemStack; -import net.minestom.server.item.Material; import net.minestom.server.network.packet.server.play.data.WorldPos; import net.minestom.server.particle.Particle; import net.minestom.server.particle.data.ParticleData; @@ -407,38 +403,6 @@ interface NetworkBufferTypeImpl extends NetworkBuffer.Type { } } - record ItemType() implements NetworkBufferTypeImpl { - @Override - public void write(@NotNull NetworkBuffer buffer, ItemStack value) { - if (value.isAir()) { - buffer.write(VAR_INT, 0); // 0 count always - return; - } - buffer.write(VAR_INT, value.amount()); - buffer.write(VAR_INT, value.material().id()); - buffer.write(VAR_INT, 1); // Added components - buffer.write(VAR_INT, 0); // Removed components - var component = ItemComponent.MAX_STACK_SIZE; - buffer.write(VAR_INT, component.id()); - buffer.write(VAR_INT, 16); - } - - @Override - public ItemStack read(@NotNull NetworkBuffer buffer) { - int count = buffer.read(VAR_INT); - if (count <= 0) return ItemStack.AIR; - - final int id = buffer.read(VAR_INT); - final Material material = Material.fromId(id); - if (material == null) throw new RuntimeException("Unknown material id: " + id); - - buffer.read(VAR_INT); // Added components - buffer.read(VAR_INT); // Removed components - - return ItemStack.fromNBT(material, CompoundBinaryTag.empty(), count); - } - } - record ByteArrayType() implements NetworkBufferTypeImpl { @Override public void write(@NotNull NetworkBuffer buffer, byte[] value) { diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientClickWindowPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientClickWindowPacket.java index 1e1e64c33..595bfc27e 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientClickWindowPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientClickWindowPacket.java @@ -22,7 +22,7 @@ public record ClientClickWindowPacket(byte windowId, int stateId, public ClientClickWindowPacket(@NotNull NetworkBuffer reader) { this(reader.read(BYTE), reader.read(VAR_INT), reader.read(SHORT), reader.read(BYTE), reader.readEnum(ClickType.class), - reader.readCollection(ChangedSlot::new, MAX_CHANGED_SLOTS), reader.read(ITEM)); + reader.readCollection(ChangedSlot::new, MAX_CHANGED_SLOTS), reader.read(ItemStack.NETWORK_TYPE)); } @Override @@ -33,18 +33,18 @@ public record ClientClickWindowPacket(byte windowId, int stateId, writer.write(BYTE, button); writer.write(VAR_INT, clickType.ordinal()); writer.writeCollection(changedSlots); - writer.write(ITEM, clickedItem); + writer.write(ItemStack.NETWORK_TYPE, clickedItem); } public record ChangedSlot(short slot, @NotNull ItemStack item) implements NetworkBuffer.Writer { public ChangedSlot(@NotNull NetworkBuffer reader) { - this(reader.read(SHORT), reader.read(ITEM)); + this(reader.read(SHORT), reader.read(ItemStack.NETWORK_TYPE)); } @Override public void write(@NotNull NetworkBuffer writer) { writer.write(SHORT, slot); - writer.write(ITEM, item); + writer.write(ItemStack.NETWORK_TYPE, item); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientCreativeInventoryActionPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientCreativeInventoryActionPacket.java index f1c382d6f..794029111 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientCreativeInventoryActionPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientCreativeInventoryActionPacket.java @@ -5,17 +5,16 @@ import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.packet.client.ClientPacket; import org.jetbrains.annotations.NotNull; -import static net.minestom.server.network.NetworkBuffer.ITEM; import static net.minestom.server.network.NetworkBuffer.SHORT; public record ClientCreativeInventoryActionPacket(short slot, @NotNull ItemStack item) implements ClientPacket { public ClientCreativeInventoryActionPacket(@NotNull NetworkBuffer reader) { - this(reader.read(SHORT), reader.read(ITEM)); + this(reader.read(SHORT), reader.read(ItemStack.NETWORK_TYPE)); } @Override public void write(@NotNull NetworkBuffer writer) { writer.write(SHORT, slot); - writer.write(ITEM, item); + writer.write(ItemStack.NETWORK_TYPE, item); } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/AdvancementsPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/AdvancementsPacket.java index e8b4870ae..1461344f4 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/AdvancementsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/AdvancementsPacket.java @@ -5,7 +5,6 @@ import net.minestom.server.advancements.FrameType; import net.minestom.server.adventure.ComponentHolder; import net.minestom.server.item.ItemStack; import net.minestom.server.network.NetworkBuffer; -import net.minestom.server.network.packet.server.ServerPacket.ComponentHolding; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import org.jetbrains.annotations.NotNull; @@ -164,7 +163,7 @@ public record AdvancementsPacket(boolean reset, @NotNull List recipes) implem private DeclaredShapelessCraftingRecipe(@NotNull NetworkBuffer reader) { this(reader.read(STRING), reader.read(STRING), reader.readEnum(RecipeCategory.Crafting.class), - reader.readCollection(Ingredient::new, MAX_INGREDIENTS), reader.read(ITEM)); + reader.readCollection(Ingredient::new, MAX_INGREDIENTS), reader.read(ItemStack.NETWORK_TYPE)); } @Override @@ -78,7 +78,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem writer.write(STRING, group); writer.writeEnum(RecipeCategory.Crafting.class, crafting); writer.writeCollection(ingredients); - writer.write(ITEM, result); + writer.write(ItemStack.NETWORK_TYPE, result); } @Override @@ -114,7 +114,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem for (int slot = 0; slot < width * height; slot++) { ingredients.add(new Ingredient(reader)); } - ItemStack result = reader.read(ITEM); + ItemStack result = reader.read(ItemStack.NETWORK_TYPE); boolean showNotification = reader.read(BOOLEAN); return new DeclaredShapedCraftingRecipe(recipeId, group, category, width, height, ingredients, result, showNotification); } @@ -128,7 +128,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem for (Ingredient ingredient : ingredients) { ingredient.write(writer); } - writer.write(ITEM, result); + writer.write(ItemStack.NETWORK_TYPE, result); writer.write(BOOLEAN, showNotification); } @@ -145,7 +145,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem public DeclaredSmeltingRecipe(@NotNull NetworkBuffer reader) { this(reader.read(STRING), reader.read(STRING), reader.readEnum(RecipeCategory.Cooking.class), - new Ingredient(reader), reader.read(ITEM), + new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE), reader.read(FLOAT), reader.read(VAR_INT)); } @@ -154,7 +154,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem writer.write(STRING, group); writer.writeEnum(RecipeCategory.Cooking.class, category); writer.write(ingredient); - writer.write(ITEM, result); + writer.write(ItemStack.NETWORK_TYPE, result); writer.write(FLOAT, experience); writer.write(VAR_INT, cookingTime); } @@ -172,7 +172,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem public DeclaredBlastingRecipe(@NotNull NetworkBuffer reader) { this(reader.read(STRING), reader.read(STRING), reader.readEnum(RecipeCategory.Cooking.class), - new Ingredient(reader), reader.read(ITEM), + new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE), reader.read(FLOAT), reader.read(VAR_INT)); } @@ -181,7 +181,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem writer.write(STRING, group); writer.writeEnum(RecipeCategory.Cooking.class, category); writer.write(ingredient); - writer.write(ITEM, result); + writer.write(ItemStack.NETWORK_TYPE, result); writer.write(FLOAT, experience); writer.write(VAR_INT, cookingTime); } @@ -199,7 +199,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem public DeclaredSmokingRecipe(@NotNull NetworkBuffer reader) { this(reader.read(STRING), reader.read(STRING), reader.readEnum(RecipeCategory.Cooking.class), - new Ingredient(reader), reader.read(ITEM), + new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE), reader.read(FLOAT), reader.read(VAR_INT)); } @@ -208,7 +208,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem writer.write(STRING, group); writer.writeEnum(RecipeCategory.Cooking.class, category); writer.write(ingredient); - writer.write(ITEM, result); + writer.write(ItemStack.NETWORK_TYPE, result); writer.write(FLOAT, experience); writer.write(VAR_INT, cookingTime); } @@ -226,7 +226,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem public DeclaredCampfireCookingRecipe(@NotNull NetworkBuffer reader) { this(reader.read(STRING), reader.read(STRING), reader.readEnum(RecipeCategory.Cooking.class), - new Ingredient(reader), reader.read(ITEM), + new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE), reader.read(FLOAT), reader.read(VAR_INT)); } @@ -235,7 +235,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem writer.write(STRING, group); writer.writeEnum(RecipeCategory.Cooking.class, category); writer.write(ingredient); - writer.write(ITEM, result); + writer.write(ItemStack.NETWORK_TYPE, result); writer.write(FLOAT, experience); writer.write(VAR_INT, cookingTime); } @@ -250,14 +250,14 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem Ingredient ingredient, ItemStack result) implements DeclaredRecipe { public DeclaredStonecutterRecipe(@NotNull NetworkBuffer reader) { this(reader.read(STRING), reader.read(STRING), - new Ingredient(reader), reader.read(ITEM)); + new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE)); } @Override public void write(@NotNull NetworkBuffer writer) { writer.write(STRING, group); writer.write(ingredient); - writer.write(ITEM, result); + writer.write(ItemStack.NETWORK_TYPE, result); } @Override @@ -270,7 +270,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem Ingredient base, Ingredient addition, ItemStack result) implements DeclaredRecipe { public DeclaredSmithingTransformRecipe(@NotNull NetworkBuffer reader) { - this(reader.read(STRING), new Ingredient(reader), new Ingredient(reader), new Ingredient(reader), reader.read(ITEM)); + this(reader.read(STRING), new Ingredient(reader), new Ingredient(reader), new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE)); } @Override @@ -278,7 +278,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem writer.write(template); writer.write(base); writer.write(addition); - writer.write(ITEM, result); + writer.write(ItemStack.NETWORK_TYPE, result); } @Override @@ -312,11 +312,11 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem } public Ingredient(@NotNull NetworkBuffer reader) { - this(reader.readCollection(ITEM, MAX_INGREDIENTS)); + this(reader.readCollection(ItemStack.NETWORK_TYPE, MAX_INGREDIENTS)); } public void write(@NotNull NetworkBuffer writer) { - writer.writeCollection(ITEM, items); + writer.writeCollection(ItemStack.NETWORK_TYPE, items); } } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityEquipmentPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityEquipmentPacket.java index 9715976bf..a46d13d77 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityEquipmentPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityEquipmentPacket.java @@ -2,9 +2,9 @@ package net.minestom.server.network.packet.server.play; import net.kyori.adventure.text.Component; import net.minestom.server.entity.EquipmentSlot; +import net.minestom.server.item.ItemComponent; import net.minestom.server.item.ItemStack; import net.minestom.server.network.NetworkBuffer; -import net.minestom.server.network.packet.server.ServerPacket.ComponentHolding; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import org.jetbrains.annotations.NotNull; @@ -16,7 +16,8 @@ import java.util.Objects; import java.util.function.UnaryOperator; import java.util.stream.Collectors; -import static net.minestom.server.network.NetworkBuffer.*; +import static net.minestom.server.network.NetworkBuffer.BYTE; +import static net.minestom.server.network.NetworkBuffer.VAR_INT; public record EntityEquipmentPacket(int entityId, @NotNull Map equipments) implements ServerPacket.Play, ServerPacket.ComponentHolding { @@ -39,7 +40,7 @@ public record EntityEquipmentPacket(int entityId, byte slotEnum = (byte) entry.getKey().ordinal(); if (!last) slotEnum |= 0x80; writer.write(BYTE, slotEnum); - writer.write(ITEM, entry.getValue()); + writer.write(ItemStack.NETWORK_TYPE, entry.getValue()); } } @@ -52,7 +53,7 @@ public record EntityEquipmentPacket(int entityId, public @NotNull Collection components() { return this.equipments.values() .stream() - .map(ItemStack::getDisplayName) + .map(item -> item.get(ItemComponent.CUSTOM_NAME)) .filter(Objects::nonNull) .collect(Collectors.toList()); } @@ -60,7 +61,7 @@ public record EntityEquipmentPacket(int entityId, @Override public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator operator) { final var map = new EnumMap(EquipmentSlot.class); - this.equipments.forEach((key, value) -> map.put(key, value.withDisplayName(operator))); + this.equipments.forEach((key, value) -> map.put(key, value.with(ItemComponent.CUSTOM_NAME, operator))); return new EntityEquipmentPacket(this.entityId, map); } @@ -70,7 +71,7 @@ public record EntityEquipmentPacket(int entityId, byte slot; do { slot = reader.read(BYTE); - equipments.put(EquipmentSlot.values()[slot & 0x7F], reader.read(ITEM)); + equipments.put(EquipmentSlot.values()[slot & 0x7F], reader.read(ItemStack.NETWORK_TYPE)); } while ((slot & 0x80) == 0x80); return equipments; } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ExplosionPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ExplosionPacket.java index 70c15f6d8..798ded661 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ExplosionPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ExplosionPacket.java @@ -1,5 +1,6 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.item.ItemStack; import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; @@ -53,7 +54,7 @@ public record ExplosionPacket(double x, double y, double z, float radius, return writer.toByteArray(); } else if (particle.equals(Particle.ITEM)) { - writer.writeItemStack(reader.read(ITEM)); + writer.writeItemStack(reader.read(ItemStack.NETWORK_TYPE)); } else if (particle.equals(Particle.DUST_COLOR_TRANSITION)) { for (int i = 0; i < 7; i++) writer.writeFloat(reader.read(FLOAT)); diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java index 1be1adafa..8ddf7bbc2 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java @@ -1,9 +1,9 @@ package net.minestom.server.network.packet.server.play; import net.kyori.adventure.text.Component; +import net.minestom.server.item.ItemComponent; import net.minestom.server.item.ItemStack; import net.minestom.server.network.NetworkBuffer; -import net.minestom.server.network.packet.server.ServerPacket.ComponentHolding; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import org.jetbrains.annotations.NotNull; @@ -19,7 +19,7 @@ public record SetSlotPacket(byte windowId, int stateId, short slot, @NotNull ItemStack itemStack) implements ServerPacket.Play, ServerPacket.ComponentHolding { public SetSlotPacket(@NotNull NetworkBuffer reader) { this(reader.read(BYTE), reader.read(VAR_INT), reader.read(SHORT), - reader.read(ITEM)); + reader.read(ItemStack.NETWORK_TYPE)); } @Override @@ -27,7 +27,7 @@ public record SetSlotPacket(byte windowId, int stateId, short slot, writer.write(BYTE, windowId); writer.write(VAR_INT, stateId); writer.write(SHORT, slot); - writer.write(ITEM, itemStack); + writer.write(ItemStack.NETWORK_TYPE, itemStack); } @Override @@ -37,20 +37,21 @@ public record SetSlotPacket(byte windowId, int stateId, short slot, @Override public @NotNull Collection components() { - final var components = new ArrayList<>(this.itemStack.getLore()); - final var displayname = this.itemStack.getDisplayName(); + final var components = new ArrayList<>(this.itemStack.get(ItemComponent.LORE, List.of())); + final var displayname = this.itemStack.get(ItemComponent.CUSTOM_NAME); if (displayname != null) components.add(displayname); - return List.copyOf(components); } @Override public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator operator) { - return new SetSlotPacket(this.windowId, this.stateId, this.slot, this.itemStack.withDisplayName(operator).withLore(lines -> { - final var translatedComponents = new ArrayList(); - lines.forEach(component -> translatedComponents.add(operator.apply(component))); - return translatedComponents; - })); + return new SetSlotPacket(this.windowId, this.stateId, this.slot, this.itemStack + .with(ItemComponent.CUSTOM_NAME, operator) + .with(ItemComponent.LORE, (UnaryOperator>) lines -> { + final var translatedComponents = new ArrayList(); + lines.forEach(component -> translatedComponents.add(operator.apply(component))); + return translatedComponents; + })); } /** diff --git a/src/main/java/net/minestom/server/network/packet/server/play/TradeListPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/TradeListPacket.java index baffa039a..c21acc41b 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/TradeListPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/TradeListPacket.java @@ -45,17 +45,17 @@ public record TradeListPacket(int windowId, @NotNull List trades, int tradeUsesNumber, int maxTradeUsesNumber, int exp, int specialPrice, float priceMultiplier, int demand) implements NetworkBuffer.Writer { public Trade(@NotNull NetworkBuffer reader) { - this(reader.read(ITEM), reader.read(ITEM), - reader.readOptional(ITEM), reader.read(BOOLEAN), + this(reader.read(ItemStack.NETWORK_TYPE), reader.read(ItemStack.NETWORK_TYPE), + reader.readOptional(ItemStack.NETWORK_TYPE), reader.read(BOOLEAN), reader.read(INT), reader.read(INT), reader.read(INT), reader.read(INT), reader.read(FLOAT), reader.read(INT)); } @Override public void write(@NotNull NetworkBuffer writer) { - writer.write(ITEM, inputItem1); - writer.write(ITEM, result); - writer.writeOptional(ITEM, inputItem2); + writer.write(ItemStack.NETWORK_TYPE, inputItem1); + writer.write(ItemStack.NETWORK_TYPE, result); + writer.writeOptional(ItemStack.NETWORK_TYPE, inputItem2); writer.write(BOOLEAN, tradeDisabled); writer.write(INT, tradeUsesNumber); writer.write(INT, maxTradeUsesNumber); diff --git a/src/main/java/net/minestom/server/network/packet/server/play/WindowItemsPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/WindowItemsPacket.java index 21073cbfd..a015c42bd 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/WindowItemsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/WindowItemsPacket.java @@ -1,9 +1,9 @@ package net.minestom.server.network.packet.server.play; import net.kyori.adventure.text.Component; +import net.minestom.server.item.ItemComponent; import net.minestom.server.item.ItemStack; import net.minestom.server.network.NetworkBuffer; -import net.minestom.server.network.packet.server.ServerPacket.ComponentHolding; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import org.jetbrains.annotations.NotNull; @@ -13,7 +13,8 @@ import java.util.Collection; import java.util.List; import java.util.function.UnaryOperator; -import static net.minestom.server.network.NetworkBuffer.*; +import static net.minestom.server.network.NetworkBuffer.BYTE; +import static net.minestom.server.network.NetworkBuffer.VAR_INT; public record WindowItemsPacket(byte windowId, int stateId, @NotNull List items, @NotNull ItemStack carriedItem) implements ServerPacket.Play, ServerPacket.ComponentHolding { @@ -24,16 +25,16 @@ public record WindowItemsPacket(byte windowId, int stateId, @NotNull List(); list.forEach(itemStack -> { - components.addAll(itemStack.getLore()); + components.addAll(itemStack.get(ItemComponent.LORE, List.of())); - final var displayName = itemStack.getDisplayName(); + final var displayName = itemStack.get(ItemComponent.CUSTOM_NAME); if (displayName == null) return; components.add(displayName); @@ -62,19 +63,21 @@ public record WindowItemsPacket(byte windowId, int stateId, @NotNull List operator) { + UnaryOperator> loreOperator = lines -> { + final var translatedComponents = new ArrayList(); + lines.forEach(component -> translatedComponents.add(operator.apply(component))); + return translatedComponents; + }; return new WindowItemsPacket( this.windowId, this.stateId, - this.items.stream().map(stack -> stack.withDisplayName(operator).withLore(lines -> { - final var translatedComponents = new ArrayList(); - lines.forEach(component -> translatedComponents.add(operator.apply(component))); - return translatedComponents; - })).toList(), - this.carriedItem.withDisplayName(operator).withLore(lines -> { - final var translatedComponents = new ArrayList(); - lines.forEach(component -> translatedComponents.add(operator.apply(component))); - return translatedComponents; - }) + this.items.stream().map(stack -> stack + .with(ItemComponent.CUSTOM_NAME, operator) + .with(ItemComponent.LORE, loreOperator)) + .toList(), + this.carriedItem + .with(ItemComponent.CUSTOM_NAME, operator) + .with(ItemComponent.LORE, loreOperator) ); } } diff --git a/src/main/java/net/minestom/server/particle/data/ItemParticleData.java b/src/main/java/net/minestom/server/particle/data/ItemParticleData.java index 58ddfb0d3..7f11bb2a3 100644 --- a/src/main/java/net/minestom/server/particle/data/ItemParticleData.java +++ b/src/main/java/net/minestom/server/particle/data/ItemParticleData.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; public record ItemParticleData(ItemStack item) implements ParticleData { ItemParticleData(NetworkBuffer reader) { - this(reader.read(NetworkBuffer.ITEM)); + this(reader.read(ItemStack.NETWORK_TYPE)); } ItemParticleData() { @@ -17,7 +17,7 @@ public record ItemParticleData(ItemStack item) implements ParticleData { @Override public void write(@NotNull NetworkBuffer writer) { - writer.write(NetworkBuffer.ITEM, item); + writer.write(ItemStack.NETWORK_TYPE, item); } @Override diff --git a/src/main/java/net/minestom/server/registry/Registry.java b/src/main/java/net/minestom/server/registry/Registry.java index 2cf0dcfeb..742c9bbf3 100644 --- a/src/main/java/net/minestom/server/registry/Registry.java +++ b/src/main/java/net/minestom/server/registry/Registry.java @@ -9,6 +9,7 @@ import net.minestom.server.collision.BoundingBox; import net.minestom.server.collision.CollisionUtils; import net.minestom.server.collision.Shape; import net.minestom.server.entity.EntitySpawnType; +import net.minestom.server.entity.EquipmentSlot; import net.minestom.server.instance.block.Block; import net.minestom.server.item.ItemComponent; import net.minestom.server.item.ItemComponentMap; @@ -477,8 +478,8 @@ public final class Registry { private final Supplier blockSupplier; private final ItemComponentMap prototype; -// private final EquipmentSlot equipmentSlot; //todo -// private final EntityType entityType; //todo + private final EquipmentSlot equipmentSlot; + // private final EntityType entityType; //todo private final Properties custom; private MaterialEntry(String namespace, Properties main, Properties custom) { @@ -493,32 +494,38 @@ public final class Registry { try { ItemComponentMap.Builder builder = ItemComponentMap.builder(); for (Map.Entry entry : main.section("components")) { - //noinspection unchecked - ItemComponent component = (ItemComponent) ItemComponent.fromNamespaceId(entry.getKey()); - Check.notNull(component, "Unknown component: " + entry.getKey()); + try { + //noinspection unchecked + ItemComponent component = (ItemComponent) ItemComponent.fromNamespaceId(entry.getKey()); + Check.notNull(component, "Unknown component: " + entry.getKey()); - byte[] rawValue = Base64.getDecoder().decode((String) entry.getValue()); - BinaryTagReader reader = new BinaryTagReader(new DataInputStream(new ByteArrayInputStream(rawValue))); - builder.set(component, component.read(reader.readNameless())); + byte[] rawValue = Base64.getDecoder().decode((String) entry.getValue()); + BinaryTagReader reader = new BinaryTagReader(new DataInputStream(new ByteArrayInputStream(rawValue))); + + //todo remove this try/catch, just so i dont need to impl all comps yet + builder.set(component, component.read(reader.readNameless())); + } catch (NullPointerException e) { + System.out.println(e.getMessage()); + } } this.prototype = builder.build(); } catch (IOException e) { throw new RuntimeException("failed to parse material registry: " + namespace, e); } -// { -// final Properties armorProperties = main.section("armorProperties"); -// if (armorProperties != null) { -// switch (armorProperties.getString("slot")) { -// case "feet" -> this.equipmentSlot = EquipmentSlot.BOOTS; -// case "legs" -> this.equipmentSlot = EquipmentSlot.LEGGINGS; -// case "chest" -> this.equipmentSlot = EquipmentSlot.CHESTPLATE; -// case "head" -> this.equipmentSlot = EquipmentSlot.HELMET; -// default -> this.equipmentSlot = null; -// } -// } else { -// this.equipmentSlot = null; -// } -// } + { + final Properties armorProperties = main.section("armorProperties"); + if (armorProperties != null) { + switch (armorProperties.getString("slot")) { + case "feet" -> this.equipmentSlot = EquipmentSlot.BOOTS; + case "legs" -> this.equipmentSlot = EquipmentSlot.LEGGINGS; + case "chest" -> this.equipmentSlot = EquipmentSlot.CHESTPLATE; + case "head" -> this.equipmentSlot = EquipmentSlot.HELMET; + default -> this.equipmentSlot = null; + } + } else { + this.equipmentSlot = null; + } + } // { // final Properties spawnEggProperties = main.section("spawnEggProperties"); // if (spawnEggProperties != null) { @@ -549,14 +556,14 @@ public final class Registry { return prototype; } - // public boolean isArmor() { -// return equipmentSlot != null; -// } -// -// public @Nullable EquipmentSlot equipmentSlot() { -// return equipmentSlot; -// } -// + public boolean isArmor() { + return equipmentSlot != null; + } + + public @Nullable EquipmentSlot equipmentSlot() { + return equipmentSlot; + } + // /** // * Gets the entity type this item can spawn. Only present for spawn eggs (e.g. wolf spawn egg, skeleton spawn egg) // * @return The entity type it can spawn, or null if it is not a spawn egg @@ -612,11 +619,12 @@ public final class Registry { custom); } } + public record TrimMaterialEntry(@NotNull NamespaceID namespace, @NotNull String assetName, @NotNull Material ingredient, float itemModelIndex, - @NotNull Map overrideArmorMaterials, + @NotNull Map overrideArmorMaterials, @NotNull Component description, Properties custom) implements Entry { public TrimMaterialEntry(@NotNull String namespace, @NotNull Properties main, Properties custom) { @@ -625,7 +633,7 @@ public final class Registry { main.getString("asset_name"), Objects.requireNonNull(Material.fromNamespaceId(main.getString("ingredient"))), (float) main.getDouble("item_model_index"), - Objects.requireNonNullElse(main.section("override_armor_materials"),new PropertiesMap(Map.of())) + Objects.requireNonNullElse(main.section("override_armor_materials"), new PropertiesMap(Map.of())) .asMap().entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> (String) entry.getValue())), JSONComponentSerializer.json().deserialize(main.section("description").toString()), custom @@ -803,7 +811,7 @@ public final class Registry { public String toString() { AtomicReference string = new AtomicReference<>("{ "); this.map.forEach((s, object) -> string.set(string.get() + " , " + "\"" + s + "\"" + " : " + "\"" + object.toString() + "\"")); - return string.updateAndGet(s -> s.replaceFirst(" , ","") + "}"); + return string.updateAndGet(s -> s.replaceFirst(" , ", "") + "}"); } } diff --git a/src/main/java/net/minestom/server/utils/binary/BinaryReader.java b/src/main/java/net/minestom/server/utils/binary/BinaryReader.java index 5fbcb3b6d..dc85307a1 100644 --- a/src/main/java/net/minestom/server/utils/binary/BinaryReader.java +++ b/src/main/java/net/minestom/server/utils/binary/BinaryReader.java @@ -187,7 +187,7 @@ public class BinaryReader extends InputStream { } public ItemStack readItemStack() { - return buffer.read(ITEM); + return buffer.read(ItemStack.NETWORK_TYPE); } public Component readComponent(int maxLength) { diff --git a/src/main/java/net/minestom/server/utils/binary/BinaryWriter.java b/src/main/java/net/minestom/server/utils/binary/BinaryWriter.java index 7a0eb0116..037c12fd4 100644 --- a/src/main/java/net/minestom/server/utils/binary/BinaryWriter.java +++ b/src/main/java/net/minestom/server/utils/binary/BinaryWriter.java @@ -164,7 +164,7 @@ public class BinaryWriter extends OutputStream { } public void writeItemStack(@NotNull ItemStack itemStack) { - this.buffer.write(ITEM, itemStack); + this.buffer.write(ItemStack.NETWORK_TYPE, itemStack); } public void writeNBT(@NotNull String name, @NotNull BinaryTag tag) { diff --git a/src/main/java/net/minestom/server/world/biomes/BiomeParticle.java b/src/main/java/net/minestom/server/world/biomes/BiomeParticle.java index 42fdd44dc..9025f5dc5 100644 --- a/src/main/java/net/minestom/server/world/biomes/BiomeParticle.java +++ b/src/main/java/net/minestom/server/world/biomes/BiomeParticle.java @@ -58,9 +58,10 @@ public record BiomeParticle(float probability, Option option) { @Override public CompoundBinaryTag toNbt() { - //todo test count might be wrong type - return item.meta().toNBT() - .putString("type", type); + //todo +// return item.meta().toNBT() +// .putString("type", type); + return CompoundBinaryTag.empty(); } }