chore: more components

This commit is contained in:
mworzala 2024-04-12 11:00:16 -04:00 committed by Matt Worzala
parent af85459761
commit 4f12d65c7a
39 changed files with 315 additions and 248 deletions

View File

@ -32,6 +32,15 @@ import java.util.List;
public class Main { public class Main {
public static void main(String[] args) { 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"); System.setProperty("minestom.experiment.pose-updates", "true");
MinecraftServer.setCompressionThreshold(0); MinecraftServer.setCompressionThreshold(0);

View File

@ -28,9 +28,9 @@ import net.minestom.server.instance.LightingChunk;
import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.Block;
import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.Inventory;
import net.minestom.server.inventory.InventoryType; import net.minestom.server.inventory.InventoryType;
import net.minestom.server.item.ItemComponent;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material; import net.minestom.server.item.Material;
import net.minestom.server.item.metadata.BundleMeta;
import net.minestom.server.monitoring.BenchmarkManager; import net.minestom.server.monitoring.BenchmarkManager;
import net.minestom.server.monitoring.TickMonitor; import net.minestom.server.monitoring.TickMonitor;
import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.MathUtils;
@ -38,8 +38,8 @@ import net.minestom.server.utils.time.TimeUnit;
import net.minestom.server.world.DimensionType; import net.minestom.server.world.DimensionType;
import java.time.Duration; import java.time.Duration;
import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
@ -100,17 +100,17 @@ public class PlayerInit {
player.setPermissionLevel(4); player.setPermissionLevel(4);
ItemStack itemStack = ItemStack.builder(Material.STONE) ItemStack itemStack = ItemStack.builder(Material.STONE)
.amount(64) .amount(64)
.meta(itemMetaBuilder -> // .meta(itemMetaBuilder ->
itemMetaBuilder.canPlaceOn(Set.of(Block.STONE)) // itemMetaBuilder.canPlaceOn(Set.of(Block.STONE))
.canDestroy(Set.of(Block.DIAMOND_ORE))) // .canDestroy(Set.of(Block.DIAMOND_ORE)))
.build(); .build();
player.getInventory().addItemStack(itemStack); player.getInventory().addItemStack(itemStack);
ItemStack bundle = ItemStack.builder(Material.BUNDLE) ItemStack bundle = ItemStack.builder(Material.BUNDLE)
.meta(BundleMeta.class, bundleMetaBuilder -> { .set(ItemComponent.BUNDLE_CONTENTS, List.of(
bundleMetaBuilder.addItem(ItemStack.of(Material.DIAMOND, 5)); ItemStack.of(Material.DIAMOND, 5),
bundleMetaBuilder.addItem(ItemStack.of(Material.RABBIT_FOOT, 5)); ItemStack.of(Material.RABBIT_FOOT, 5)
}) ))
.build(); .build();
player.getInventory().addItemStack(bundle); player.getInventory().addItemStack(bundle);

View File

@ -71,7 +71,8 @@ public class ArgumentItemStack extends Argument<ItemStack> {
throw new ArgumentSyntaxException("Item NBT is invalid", input, INVALID_NBT); 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);
} }
} }

View File

@ -41,14 +41,4 @@ public enum EquipmentSlot {
return ARMORS; 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;
};
}
} }

View File

@ -5,7 +5,7 @@ import net.minestom.server.event.EventDispatcher;
import net.minestom.server.event.entity.EntityItemMergeEvent; import net.minestom.server.event.entity.EntityItemMergeEvent;
import net.minestom.server.instance.EntityTracker; import net.minestom.server.instance.EntityTracker;
import net.minestom.server.item.ItemStack; 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.Cooldown;
import net.minestom.server.utils.time.TimeUnit; import net.minestom.server.utils.time.TimeUnit;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -77,13 +77,12 @@ public class ItemEntity extends Entity {
if (getDistanceSquared(itemEntity) > mergeRange * mergeRange) return; if (getDistanceSquared(itemEntity) > mergeRange * mergeRange) return;
final ItemStack itemStackEntity = itemEntity.getItemStack(); final ItemStack itemStackEntity = itemEntity.getItemStack();
final StackingRule stackingRule = StackingRule.get(); final boolean canStack = itemStack.isSimilar(itemStackEntity);
final boolean canStack = stackingRule.canBeStacked(itemStack, itemStackEntity);
if (!canStack) return; if (!canStack) return;
final int totalAmount = stackingRule.getAmount(itemStack) + stackingRule.getAmount(itemStackEntity); final int totalAmount = itemStack.amount() + itemStackEntity.amount();
if (!stackingRule.canApply(itemStack, totalAmount)) return; if (!MathUtils.isBetween(totalAmount, 0, itemStack.maxStackSize())) return;
final ItemStack result = stackingRule.apply(itemStack, totalAmount); final ItemStack result = itemStack.withAmount(totalAmount);
EntityItemMergeEvent entityItemMergeEvent = new EntityItemMergeEvent(this, itemEntity, result); EntityItemMergeEvent entityItemMergeEvent = new EntityItemMergeEvent(this, itemEntity, result);
EventDispatcher.callCancellable(entityItemMergeEvent, () -> { EventDispatcher.callCancellable(entityItemMergeEvent, () -> {
setItemStack(entityItemMergeEvent.getResult()); setItemStack(entityItemMergeEvent.getResult());

View File

@ -53,7 +53,7 @@ public final class Metadata {
} }
public static Entry<ItemStack> ItemStack(@NotNull ItemStack value) { public static Entry<ItemStack> 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(boolean value) { public static Entry<Boolean> Boolean(boolean value) {

View File

@ -443,7 +443,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable,
refreshActiveHand(false, isOffHand, false); refreshActiveHand(false, isOffHand, false);
final ItemStack foodItem = itemUpdateStateEvent.getItemStack(); final ItemStack foodItem = itemUpdateStateEvent.getItemStack();
final boolean isFood = foodItem.material().isFood(); final boolean isFood = foodItem.has(ItemComponent.FOOD);
if (isFood) { if (isFood) {
PlayerEatEvent playerEatEvent = new PlayerEatEvent(this, foodItem, eatingHand); 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 * Used internally to reset the skipClosePacket field, which determines when sending the close inventory packet
* should be skipped. * should be skipped.
@ -2210,7 +2217,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable,
return null; return null;
final ItemStack updatedItem = getItemInHand(hand); final ItemStack updatedItem = getItemInHand(hand);
final boolean isFood = updatedItem.material().isFood(); final boolean isFood = updatedItem.has(ItemComponent.FOOD);
if (isFood && !allowFood) if (isFood && !allowFood)
return null; return null;

View File

@ -115,7 +115,7 @@ public final class AttributeInstance {
final Collection<AttributeModifier> modifiers = getModifiers(); final Collection<AttributeModifier> modifiers = getModifiers();
double base = getBaseValue(); 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(); base += modifier.getAmount();
} }

View File

@ -3,11 +3,11 @@ package net.minestom.server.entity.attribute;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public enum AttributeOperation { public enum AttributeOperation {
ADDITION(0), ADD_VALUE(0),
MULTIPLY_BASE(1), MULTIPLY_BASE(1),
MULTIPLY_TOTAL(2); 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; private final int id;
AttributeOperation(int id) { AttributeOperation(int id) {

View File

@ -159,7 +159,7 @@ public class InstanceContainer extends Instance {
this, block, pp.getBlockFace(), blockPosition, this, block, pp.getBlockFace(), blockPosition,
new Vec(pp.getCursorX(), pp.getCursorY(), pp.getCursorZ()), new Vec(pp.getCursorX(), pp.getCursorY(), pp.getCursorZ()),
pp.getPlayer().getPosition(), pp.getPlayer().getPosition(),
pp.getPlayer().getItemInHand(pp.getHand()).meta(), pp.getPlayer().getItemInHand(pp.getHand()),
pp.getPlayer().isSneaking() pp.getPlayer().isSneaking()
); );
} else { } else {

View File

@ -4,7 +4,7 @@ import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Pos;
import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.block.BlockFace; 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 net.minestom.server.item.Material;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -61,7 +61,7 @@ public abstract class BlockPlacementRule {
@NotNull Point placePosition, @NotNull Point placePosition,
@Nullable Point cursorPosition, @Nullable Point cursorPosition,
@Nullable Pos playerPosition, @Nullable Pos playerPosition,
@Nullable ItemMeta usedItemMeta, @Nullable ItemStack usedItemStack,
boolean isPlayerShifting boolean isPlayerShifting
) { ) {
} }

View File

@ -47,8 +47,8 @@ public sealed interface ItemComponent<T> extends StaticProtocolObject permits It
ItemComponent<Integer> MAP_ID = declare("map_id", NetworkBuffer.VAR_INT, BinaryTagSerializer.INT); ItemComponent<Integer> MAP_ID = declare("map_id", NetworkBuffer.VAR_INT, BinaryTagSerializer.INT);
ItemComponent<MapDecorations> MAP_DECORATIONS = declare("map_decorations", null, MapDecorations.NBT_TYPE); ItemComponent<MapDecorations> MAP_DECORATIONS = declare("map_decorations", null, MapDecorations.NBT_TYPE);
ItemComponent<MapPostProcessing> MAP_POST_PROCESSING = declare("map_post_processing", MapPostProcessing.NETWORK_TYPE, null); ItemComponent<MapPostProcessing> MAP_POST_PROCESSING = declare("map_post_processing", MapPostProcessing.NETWORK_TYPE, null);
ItemComponent<List<ItemStack>> CHARGED_PROJECTILES = declare("charged_projectiles", NetworkBuffer.ITEM.list(Short.MAX_VALUE), BinaryTagSerializer.ITEM.list()); ItemComponent<List<ItemStack>> CHARGED_PROJECTILES = declare("charged_projectiles", ItemStack.NETWORK_TYPE.list(Short.MAX_VALUE), BinaryTagSerializer.ITEM.list());
ItemComponent<List<ItemStack>> BUNDLE_CONTENTS = declare("bundle_contents", NetworkBuffer.ITEM.list(Short.MAX_VALUE), BinaryTagSerializer.ITEM.list()); ItemComponent<List<ItemStack>> BUNDLE_CONTENTS = declare("bundle_contents", ItemStack.NETWORK_TYPE.list(Short.MAX_VALUE), BinaryTagSerializer.ITEM.list());
ItemComponent<Void> POTION_CONTENTS = declare("potion_contents", null, null); //todo ItemComponent<Void> POTION_CONTENTS = declare("potion_contents", null, null); //todo
ItemComponent<Void> SUSPICIOUS_STEW_EFFECTS = declare("suspicious_stew_effects", null, null); //todo ItemComponent<Void> SUSPICIOUS_STEW_EFFECTS = declare("suspicious_stew_effects", null, null); //todo
ItemComponent<WritableBookContent> WRITABLE_BOOK_CONTENT = declare("writable_book_content", WritableBookContent.NETWORK_TYPE, WritableBookContent.NBT_TYPE); ItemComponent<WritableBookContent> WRITABLE_BOOK_CONTENT = declare("writable_book_content", WritableBookContent.NETWORK_TYPE, WritableBookContent.NBT_TYPE);
@ -69,7 +69,7 @@ public sealed interface ItemComponent<T> extends StaticProtocolObject permits It
ItemComponent<Void> BANNER_PATTERNS = declare("banner_patterns", null, null); //todo ItemComponent<Void> BANNER_PATTERNS = declare("banner_patterns", null, null); //todo
ItemComponent<Void> BASE_COLOR = declare("base_color", null, null); //todo dyecolor is the same stringrepresentable as item rarity ItemComponent<Void> BASE_COLOR = declare("base_color", null, null); //todo dyecolor is the same stringrepresentable as item rarity
ItemComponent<Void> POT_DECORATIONS = declare("pot_decorations", null, null); //todo ItemComponent<Void> POT_DECORATIONS = declare("pot_decorations", null, null); //todo
ItemComponent<List<ItemStack>> CONTAINER = declare("container", NetworkBuffer.ITEM.list(256), BinaryTagSerializer.ITEM.list()); ItemComponent<List<ItemStack>> CONTAINER = declare("container", ItemStack.NETWORK_TYPE.list(256), BinaryTagSerializer.ITEM.list());
ItemComponent<Void> BLOCK_STATE = declare("block_state", null, null); //todo ItemComponent<Void> BLOCK_STATE = declare("block_state", null, null); //todo
ItemComponent<Void> BEES = declare("bees", null, null); //todo ItemComponent<Void> BEES = declare("bees", null, null); //todo
ItemComponent<String> LOCK = declare("lock", null, BinaryTagSerializer.STRING); ItemComponent<String> LOCK = declare("lock", null, BinaryTagSerializer.STRING);

View File

@ -34,12 +34,24 @@ record ItemComponentImpl<T>(
return nbt.read(tag); 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 @Override
public @NotNull T read(@NotNull NetworkBuffer reader) { public @NotNull T read(@NotNull NetworkBuffer reader) {
Check.notNull(network, "{0} cannot be deserialized from network", this); Check.notNull(network, "{0} cannot be deserialized from network", this);
return network.read(reader); 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 @Override
public String toString() { public String toString() {
return name(); return name();

View File

@ -1,10 +1,15 @@
package net.minestom.server.item; package net.minestom.server.item;
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public interface ItemComponentMap { public interface ItemComponentMap {
static @NotNull ItemComponentMap.Builder builder() {
return new ItemComponentMapImpl.BuilderImpl(new Int2ObjectArrayMap<>());
}
boolean has(@NotNull ItemComponent<?> component); boolean has(@NotNull ItemComponent<?> component);
<T> @Nullable T get(@NotNull ItemComponent<T> component); <T> @Nullable T get(@NotNull ItemComponent<T> component);
@ -14,4 +19,13 @@ public interface ItemComponentMap {
return value != null ? value : defaultValue; 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();
}
} }

View File

@ -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<Object> components) implements ItemComponentMap {
@Override
public boolean has(@NotNull ItemComponent<?> component) {
return components.get(component.id()) != null;
}
@Override
public <T> @Nullable T get(@NotNull ItemComponent<T> component) {
return (T) components.get(component.id());
}
public record BuilderImpl(@NotNull Int2ObjectMap<Object> components) implements ItemComponentMap.Builder {
@Override
public boolean has(@NotNull ItemComponent<?> component) {
return components.get(component.id()) != null;
}
@Override
public <T> @Nullable T get(@NotNull ItemComponent<T> 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);
}
}
}

View File

@ -7,7 +7,6 @@ import net.kyori.adventure.nbt.CompoundBinaryTag;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.utils.nbt.BinaryTagSerializer; import net.minestom.server.utils.nbt.BinaryTagSerializer;
import net.minestom.server.utils.validate.Check; import net.minestom.server.utils.validate.Check;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -137,15 +136,34 @@ record ItemComponentPatch(@NotNull Int2ObjectMap<Object> patch) {
return new ItemComponentPatch(newPatch); return new ItemComponentPatch(newPatch);
} }
interface Builder extends ItemComponentMap { public @NotNull Builder builder() {
return new Builder(new Int2ObjectArrayMap<>(patch));
}
@Contract(value = "_, _ -> this", pure = true) record Builder(@NotNull Int2ObjectMap<Object> patch) implements ItemComponentMap {
<T> @NotNull Builder set(@NotNull ItemComponent<T> component, @NotNull T value);
@Contract(value = "_ -> this", pure = true) @Override
@NotNull Builder remove(@NotNull ItemComponent<?> component); public boolean has(@NotNull ItemComponent<?> component) {
return patch.get(component.id()) != null;
}
@Contract(value = "-> new", pure = true) @Override
@NotNull ItemComponentPatch build(); public <T> @Nullable T get(@NotNull ItemComponent<T> component) {
return (T) patch.get(component.id());
}
public <T> ItemComponentPatch.@NotNull Builder set(@NotNull ItemComponent<T> 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);
}
} }
} }

View File

@ -1,4 +0,0 @@
package net.minestom.server.item;
final class ItemComponentPatchImpl implements ItemComponentPatch {
}

View File

@ -3,11 +3,9 @@ package net.minestom.server.item;
import net.kyori.adventure.nbt.CompoundBinaryTag; import net.kyori.adventure.nbt.CompoundBinaryTag;
import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.event.HoverEventSource; import net.kyori.adventure.text.event.HoverEventSource;
import net.minestom.server.inventory.ContainerInventory;
import net.minestom.server.item.component.CustomData; import net.minestom.server.item.component.CustomData;
import net.minestom.server.network.NetworkBuffer; 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.Tag;
import net.minestom.server.tag.TagReadable; import net.minestom.server.tag.TagReadable;
import net.minestom.server.tag.TagWritable; 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 * @param nbtCompound The nbt representation of the item
*/ */
static @NotNull ItemStack fromItemNBT(@NotNull CompoundBinaryTag nbtCompound) { static @NotNull ItemStack fromItemNBT(@NotNull CompoundBinaryTag nbtCompound) {
// String id = nbtCompound.getString("id"); return ItemStackImpl.NBT_TYPE.read(nbtCompound);
// 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);
} }
@Contract(pure = true) @Contract(pure = true)
@ -91,6 +81,12 @@ public sealed interface ItemStack extends TagReadable, ItemComponentMap, HoverEv
@Contract(value = "_, _ -> new", pure = true) @Contract(value = "_, _ -> new", pure = true)
<T> @NotNull ItemStack with(@NotNull ItemComponent<T> component, T value); <T> @NotNull ItemStack with(@NotNull ItemComponent<T> component, T value);
default <T> @NotNull ItemStack with(@NotNull ItemComponent<T> component, @NotNull UnaryOperator<T> operator) {
T value = get(component);
if (value == null) return this;
return with(component, operator.apply(value));
}
@Contract(value = "_, -> new", pure = true) @Contract(value = "_, -> new", pure = true)
@NotNull ItemStack without(@NotNull ItemComponent<?> component); @NotNull ItemStack without(@NotNull ItemComponent<?> component);
@ -102,7 +98,12 @@ public sealed interface ItemStack extends TagReadable, ItemComponentMap, HoverEv
@Override @Override
@Contract(pure = true) @Contract(pure = true)
default <T> @UnknownNullability T getTag(@NotNull Tag<T> tag) { default <T> @UnknownNullability T getTag(@NotNull Tag<T> 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) @Contract(value = "_, -> new", pure = true)
@ -133,6 +134,7 @@ public sealed interface ItemStack extends TagReadable, ItemComponentMap, HoverEv
// //todo(matt): revisit, // //todo(matt): revisit,
// throw new RuntimeException(e); // throw new RuntimeException(e);
// } // }
throw new UnsupportedOperationException("todo");
} }
sealed interface Builder extends TagWritable sealed interface Builder extends TagWritable

View File

@ -1,5 +1,6 @@
package net.minestom.server.item; package net.minestom.server.item;
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
import net.kyori.adventure.nbt.CompoundBinaryTag; import net.kyori.adventure.nbt.CompoundBinaryTag;
import net.minestom.server.item.component.CustomData; import net.minestom.server.item.component.CustomData;
import net.minestom.server.network.NetworkBuffer; 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 { record ItemStackImpl(Material material, int amount, ItemComponentPatch components) implements ItemStack {
static final NetworkBuffer.Type<ItemStack> NETWORK_TYPE = null; static final NetworkBuffer.Type<ItemStack> 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<ItemStack> NBT_TYPE = BinaryTagSerializer.COMPOUND.map(ItemStackImpl::fromCompound, ItemStackImpl::toCompound); static final BinaryTagSerializer<ItemStack> NBT_TYPE = BinaryTagSerializer.COMPOUND.map(ItemStackImpl::fromCompound, ItemStackImpl::toCompound);
static ItemStack create(Material material, int amount, ItemComponentPatch components) { 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); return create(material, amount, ItemComponentPatch.EMPTY);
} }
public ItemStackImpl {
Check.notNull(material, "Material cannot be null");
}
@Override @Override
public <T> @Nullable T get(@NotNull ItemComponent<T> component) { public <T> @Nullable T get(@NotNull ItemComponent<T> component) {
return components.get(material.prototype(), component); return components.get(material.prototype(), component);
@ -50,6 +70,7 @@ record ItemStackImpl(Material material, int amount, ItemComponentPatch component
@Override @Override
public @NotNull ItemStack withAmount(int amount) { public @NotNull ItemStack withAmount(int amount) {
if (amount <= 0) return ItemStack.AIR;
return create(material, amount, components); return create(material, amount, components);
} }
@ -65,9 +86,7 @@ record ItemStackImpl(Material material, int amount, ItemComponentPatch component
@Override @Override
public @NotNull ItemStack consume(int amount) { public @NotNull ItemStack consume(int amount) {
int newAmount = amount() - amount; return withAmount(amount() - amount);
if (newAmount <= 0) return AIR;
return withAmount(newAmount);
} }
@Override @Override
@ -78,14 +97,6 @@ record ItemStackImpl(Material material, int amount, ItemComponentPatch component
@Override @Override
public @NotNull CompoundBinaryTag toItemNBT() { public @NotNull CompoundBinaryTag toItemNBT() {
return (CompoundBinaryTag) NBT_TYPE.write(this); 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) @Contract(value = "-> new", pure = true)
@ -124,7 +135,7 @@ record ItemStackImpl(Material material, int amount, ItemComponentPatch component
Builder(Material material, int amount) { Builder(Material material, int amount) {
this.material = material; this.material = material;
this.amount = amount; this.amount = amount;
this.components = ItemComponentPatch.builder(material); this.components = new ItemComponentPatch.Builder(new Int2ObjectArrayMap<>());
} }
@Override @Override

View File

@ -76,27 +76,11 @@ public sealed interface Material extends StaticProtocolObject, Materials permits
} }
default boolean isArmor() { default boolean isArmor() {
//todo how does armor work nowadays return registry().isArmor();
return false;
// 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() { default int maxStackSize() {
return prototype().getOrDefault(ItemComponent.MAX_STACK_SIZE, 64); return prototype().get(ItemComponent.MAX_STACK_SIZE, 64);
}
@Deprecated(forRemoval = true)
default boolean isFood() {
return prototype().has(ItemComponent.FOOD);
} }
static @NotNull Collection<@NotNull Material> values() { static @NotNull Collection<@NotNull Material> values() {

View File

@ -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.chunk.ChunkUtils;
import net.minestom.server.utils.validate.Check; import net.minestom.server.utils.validate.Check;
import java.util.concurrent.atomic.AtomicBoolean;
public class BlockPlacementListener { public class BlockPlacementListener {
private static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager(); private static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager();
@ -90,7 +88,9 @@ public class BlockPlacementListener {
canPlaceBlock = false; // Spectators can't place blocks canPlaceBlock = false; // Spectators can't place blocks
} else if (player.getGameMode() == GameMode.ADVENTURE) { } else if (player.getGameMode() == GameMode.ADVENTURE) {
//Check if the block can be placed on the block //Check if the block can be placed on the block
canPlaceBlock = usedItem.meta().canPlaceOn(interactedBlock); // canPlaceBlock = usedItem.meta().canPlaceOn(interactedBlock);
canPlaceBlock = false;
//todo
} }

View File

@ -118,9 +118,10 @@ public final class PlayerDiggingListener {
} else if (player.getGameMode() == GameMode.ADVENTURE) { } else if (player.getGameMode() == GameMode.ADVENTURE) {
// Check if the item can break the block with the current item // Check if the item can break the block with the current item
final ItemStack itemInMainHand = player.getItemInMainHand(); final ItemStack itemInMainHand = player.getItemInMainHand();
if (!itemInMainHand.meta().canDestroy(block)) { //todo
return true; // if (!itemInMainHand.meta().canDestroy(block)) {
} // return true;
// }
} }
return false; return false;
} }

View File

@ -7,6 +7,7 @@ import net.minestom.server.event.player.PlayerItemAnimationEvent;
import net.minestom.server.event.player.PlayerPreEatEvent; import net.minestom.server.event.player.PlayerPreEatEvent;
import net.minestom.server.event.player.PlayerUseItemEvent; import net.minestom.server.event.player.PlayerUseItemEvent;
import net.minestom.server.inventory.PlayerInventory; import net.minestom.server.inventory.PlayerInventory;
import net.minestom.server.item.ItemComponent;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material; import net.minestom.server.item.Material;
import net.minestom.server.network.packet.client.play.ClientUseItemPacket; import net.minestom.server.network.packet.client.play.ClientUseItemPacket;
@ -54,7 +55,7 @@ public class UseItemListener {
itemAnimationType = PlayerItemAnimationEvent.ItemAnimationType.SHIELD; itemAnimationType = PlayerItemAnimationEvent.ItemAnimationType.SHIELD;
} else if (material == Material.TRIDENT) { } else if (material == Material.TRIDENT) {
itemAnimationType = PlayerItemAnimationEvent.ItemAnimationType.TRIDENT; itemAnimationType = PlayerItemAnimationEvent.ItemAnimationType.TRIDENT;
} else if (material.isFood()) { } else if (itemStack.has(ItemComponent.FOOD)) {
itemAnimationType = PlayerItemAnimationEvent.ItemAnimationType.EAT; itemAnimationType = PlayerItemAnimationEvent.ItemAnimationType.EAT;
// Eating code, contains the eating time customisation // Eating code, contains the eating time customisation

View File

@ -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.SnifferMeta;
import net.minestom.server.entity.metadata.animal.tameable.CatMeta; import net.minestom.server.entity.metadata.animal.tameable.CatMeta;
import net.minestom.server.entity.metadata.other.PaintingMeta; 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.network.packet.server.play.data.WorldPos;
import net.minestom.server.particle.Particle; import net.minestom.server.particle.Particle;
import net.minestom.server.utils.Direction; import net.minestom.server.utils.Direction;
@ -48,7 +47,6 @@ public final class NetworkBuffer {
public static final Type<Component> COMPONENT = new NetworkBufferTypeImpl.ComponentType(); public static final Type<Component> COMPONENT = new NetworkBufferTypeImpl.ComponentType();
public static final Type<Component> JSON_COMPONENT = new NetworkBufferTypeImpl.JsonComponentType(); public static final Type<Component> JSON_COMPONENT = new NetworkBufferTypeImpl.JsonComponentType();
public static final Type<UUID> UUID = new NetworkBufferTypeImpl.UUIDType(); public static final Type<UUID> UUID = new NetworkBufferTypeImpl.UUIDType();
public static final Type<ItemStack> ITEM = new NetworkBufferTypeImpl.ItemType();
public static final Type<byte[]> BYTE_ARRAY = new NetworkBufferTypeImpl.ByteArrayType(); public static final Type<byte[]> BYTE_ARRAY = new NetworkBufferTypeImpl.ByteArrayType();
public static final Type<long[]> LONG_ARRAY = new NetworkBufferTypeImpl.LongArrayType(); public static final Type<long[]> LONG_ARRAY = new NetworkBufferTypeImpl.LongArrayType();

View File

@ -1,16 +1,12 @@
package net.minestom.server.network; package net.minestom.server.network;
import net.kyori.adventure.nbt.BinaryTag; import net.kyori.adventure.nbt.BinaryTag;
import net.kyori.adventure.nbt.CompoundBinaryTag;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.minestom.server.adventure.serializer.nbt.NbtComponentSerializer; import net.minestom.server.adventure.serializer.nbt.NbtComponentSerializer;
import net.minestom.server.color.Color; import net.minestom.server.color.Color;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Vec; 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.network.packet.server.play.data.WorldPos;
import net.minestom.server.particle.Particle; import net.minestom.server.particle.Particle;
import net.minestom.server.particle.data.ParticleData; import net.minestom.server.particle.data.ParticleData;
@ -407,38 +403,6 @@ interface NetworkBufferTypeImpl<T> extends NetworkBuffer.Type<T> {
} }
} }
record ItemType() implements NetworkBufferTypeImpl<ItemStack> {
@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<byte[]> { record ByteArrayType() implements NetworkBufferTypeImpl<byte[]> {
@Override @Override
public void write(@NotNull NetworkBuffer buffer, byte[] value) { public void write(@NotNull NetworkBuffer buffer, byte[] value) {

View File

@ -22,7 +22,7 @@ public record ClientClickWindowPacket(byte windowId, int stateId,
public ClientClickWindowPacket(@NotNull NetworkBuffer reader) { public ClientClickWindowPacket(@NotNull NetworkBuffer reader) {
this(reader.read(BYTE), reader.read(VAR_INT), this(reader.read(BYTE), reader.read(VAR_INT),
reader.read(SHORT), reader.read(BYTE), reader.readEnum(ClickType.class), 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 @Override
@ -33,18 +33,18 @@ public record ClientClickWindowPacket(byte windowId, int stateId,
writer.write(BYTE, button); writer.write(BYTE, button);
writer.write(VAR_INT, clickType.ordinal()); writer.write(VAR_INT, clickType.ordinal());
writer.writeCollection(changedSlots); 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 record ChangedSlot(short slot, @NotNull ItemStack item) implements NetworkBuffer.Writer {
public ChangedSlot(@NotNull NetworkBuffer reader) { public ChangedSlot(@NotNull NetworkBuffer reader) {
this(reader.read(SHORT), reader.read(ITEM)); this(reader.read(SHORT), reader.read(ItemStack.NETWORK_TYPE));
} }
@Override @Override
public void write(@NotNull NetworkBuffer writer) { public void write(@NotNull NetworkBuffer writer) {
writer.write(SHORT, slot); writer.write(SHORT, slot);
writer.write(ITEM, item); writer.write(ItemStack.NETWORK_TYPE, item);
} }
} }

View File

@ -5,17 +5,16 @@ import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.network.packet.client.ClientPacket;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.ITEM;
import static net.minestom.server.network.NetworkBuffer.SHORT; import static net.minestom.server.network.NetworkBuffer.SHORT;
public record ClientCreativeInventoryActionPacket(short slot, @NotNull ItemStack item) implements ClientPacket { public record ClientCreativeInventoryActionPacket(short slot, @NotNull ItemStack item) implements ClientPacket {
public ClientCreativeInventoryActionPacket(@NotNull NetworkBuffer reader) { public ClientCreativeInventoryActionPacket(@NotNull NetworkBuffer reader) {
this(reader.read(SHORT), reader.read(ITEM)); this(reader.read(SHORT), reader.read(ItemStack.NETWORK_TYPE));
} }
@Override @Override
public void write(@NotNull NetworkBuffer writer) { public void write(@NotNull NetworkBuffer writer) {
writer.write(SHORT, slot); writer.write(SHORT, slot);
writer.write(ITEM, item); writer.write(ItemStack.NETWORK_TYPE, item);
} }
} }

View File

@ -5,7 +5,6 @@ import net.minestom.server.advancements.FrameType;
import net.minestom.server.adventure.ComponentHolder; import net.minestom.server.adventure.ComponentHolder;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.network.NetworkBuffer; 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.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -164,7 +163,7 @@ public record AdvancementsPacket(boolean reset, @NotNull List<AdvancementMapping
private static DisplayData read(@NotNull NetworkBuffer reader) { private static DisplayData read(@NotNull NetworkBuffer reader) {
var title = reader.read(COMPONENT); var title = reader.read(COMPONENT);
var description = reader.read(COMPONENT); var description = reader.read(COMPONENT);
var icon = reader.read(ITEM); var icon = reader.read(ItemStack.NETWORK_TYPE);
var frameType = FrameType.values()[reader.read(VAR_INT)]; var frameType = FrameType.values()[reader.read(VAR_INT)];
var flags = reader.read(INT); var flags = reader.read(INT);
var backgroundTexture = (flags & 0x1) != 0 ? reader.read(STRING) : null; var backgroundTexture = (flags & 0x1) != 0 ? reader.read(STRING) : null;
@ -180,7 +179,7 @@ public record AdvancementsPacket(boolean reset, @NotNull List<AdvancementMapping
public void write(@NotNull NetworkBuffer writer) { public void write(@NotNull NetworkBuffer writer) {
writer.write(COMPONENT, title); writer.write(COMPONENT, title);
writer.write(COMPONENT, description); writer.write(COMPONENT, description);
writer.write(ITEM, icon); writer.write(ItemStack.NETWORK_TYPE, icon);
writer.writeEnum(FrameType.class, frameType); writer.writeEnum(FrameType.class, frameType);
writer.write(INT, flags); writer.write(INT, flags);
if ((flags & 0x1) != 0) { if ((flags & 0x1) != 0) {

View File

@ -70,7 +70,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
private DeclaredShapelessCraftingRecipe(@NotNull NetworkBuffer reader) { private DeclaredShapelessCraftingRecipe(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(STRING), this(reader.read(STRING), reader.read(STRING),
reader.readEnum(RecipeCategory.Crafting.class), 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 @Override
@ -78,7 +78,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
writer.write(STRING, group); writer.write(STRING, group);
writer.writeEnum(RecipeCategory.Crafting.class, crafting); writer.writeEnum(RecipeCategory.Crafting.class, crafting);
writer.writeCollection(ingredients); writer.writeCollection(ingredients);
writer.write(ITEM, result); writer.write(ItemStack.NETWORK_TYPE, result);
} }
@Override @Override
@ -114,7 +114,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
for (int slot = 0; slot < width * height; slot++) { for (int slot = 0; slot < width * height; slot++) {
ingredients.add(new Ingredient(reader)); ingredients.add(new Ingredient(reader));
} }
ItemStack result = reader.read(ITEM); ItemStack result = reader.read(ItemStack.NETWORK_TYPE);
boolean showNotification = reader.read(BOOLEAN); boolean showNotification = reader.read(BOOLEAN);
return new DeclaredShapedCraftingRecipe(recipeId, group, category, width, height, ingredients, result, showNotification); return new DeclaredShapedCraftingRecipe(recipeId, group, category, width, height, ingredients, result, showNotification);
} }
@ -128,7 +128,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
for (Ingredient ingredient : ingredients) { for (Ingredient ingredient : ingredients) {
ingredient.write(writer); ingredient.write(writer);
} }
writer.write(ITEM, result); writer.write(ItemStack.NETWORK_TYPE, result);
writer.write(BOOLEAN, showNotification); writer.write(BOOLEAN, showNotification);
} }
@ -145,7 +145,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
public DeclaredSmeltingRecipe(@NotNull NetworkBuffer reader) { public DeclaredSmeltingRecipe(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(STRING), this(reader.read(STRING), reader.read(STRING),
reader.readEnum(RecipeCategory.Cooking.class), 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)); reader.read(FLOAT), reader.read(VAR_INT));
} }
@ -154,7 +154,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
writer.write(STRING, group); writer.write(STRING, group);
writer.writeEnum(RecipeCategory.Cooking.class, category); writer.writeEnum(RecipeCategory.Cooking.class, category);
writer.write(ingredient); writer.write(ingredient);
writer.write(ITEM, result); writer.write(ItemStack.NETWORK_TYPE, result);
writer.write(FLOAT, experience); writer.write(FLOAT, experience);
writer.write(VAR_INT, cookingTime); writer.write(VAR_INT, cookingTime);
} }
@ -172,7 +172,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
public DeclaredBlastingRecipe(@NotNull NetworkBuffer reader) { public DeclaredBlastingRecipe(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(STRING), this(reader.read(STRING), reader.read(STRING),
reader.readEnum(RecipeCategory.Cooking.class), 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)); reader.read(FLOAT), reader.read(VAR_INT));
} }
@ -181,7 +181,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
writer.write(STRING, group); writer.write(STRING, group);
writer.writeEnum(RecipeCategory.Cooking.class, category); writer.writeEnum(RecipeCategory.Cooking.class, category);
writer.write(ingredient); writer.write(ingredient);
writer.write(ITEM, result); writer.write(ItemStack.NETWORK_TYPE, result);
writer.write(FLOAT, experience); writer.write(FLOAT, experience);
writer.write(VAR_INT, cookingTime); writer.write(VAR_INT, cookingTime);
} }
@ -199,7 +199,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
public DeclaredSmokingRecipe(@NotNull NetworkBuffer reader) { public DeclaredSmokingRecipe(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(STRING), this(reader.read(STRING), reader.read(STRING),
reader.readEnum(RecipeCategory.Cooking.class), 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)); reader.read(FLOAT), reader.read(VAR_INT));
} }
@ -208,7 +208,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
writer.write(STRING, group); writer.write(STRING, group);
writer.writeEnum(RecipeCategory.Cooking.class, category); writer.writeEnum(RecipeCategory.Cooking.class, category);
writer.write(ingredient); writer.write(ingredient);
writer.write(ITEM, result); writer.write(ItemStack.NETWORK_TYPE, result);
writer.write(FLOAT, experience); writer.write(FLOAT, experience);
writer.write(VAR_INT, cookingTime); writer.write(VAR_INT, cookingTime);
} }
@ -226,7 +226,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
public DeclaredCampfireCookingRecipe(@NotNull NetworkBuffer reader) { public DeclaredCampfireCookingRecipe(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(STRING), this(reader.read(STRING), reader.read(STRING),
reader.readEnum(RecipeCategory.Cooking.class), 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)); reader.read(FLOAT), reader.read(VAR_INT));
} }
@ -235,7 +235,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
writer.write(STRING, group); writer.write(STRING, group);
writer.writeEnum(RecipeCategory.Cooking.class, category); writer.writeEnum(RecipeCategory.Cooking.class, category);
writer.write(ingredient); writer.write(ingredient);
writer.write(ITEM, result); writer.write(ItemStack.NETWORK_TYPE, result);
writer.write(FLOAT, experience); writer.write(FLOAT, experience);
writer.write(VAR_INT, cookingTime); writer.write(VAR_INT, cookingTime);
} }
@ -250,14 +250,14 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
Ingredient ingredient, ItemStack result) implements DeclaredRecipe { Ingredient ingredient, ItemStack result) implements DeclaredRecipe {
public DeclaredStonecutterRecipe(@NotNull NetworkBuffer reader) { public DeclaredStonecutterRecipe(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(STRING), this(reader.read(STRING), reader.read(STRING),
new Ingredient(reader), reader.read(ITEM)); new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE));
} }
@Override @Override
public void write(@NotNull NetworkBuffer writer) { public void write(@NotNull NetworkBuffer writer) {
writer.write(STRING, group); writer.write(STRING, group);
writer.write(ingredient); writer.write(ingredient);
writer.write(ITEM, result); writer.write(ItemStack.NETWORK_TYPE, result);
} }
@Override @Override
@ -270,7 +270,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
Ingredient base, Ingredient addition, Ingredient base, Ingredient addition,
ItemStack result) implements DeclaredRecipe { ItemStack result) implements DeclaredRecipe {
public DeclaredSmithingTransformRecipe(@NotNull NetworkBuffer reader) { 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 @Override
@ -278,7 +278,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
writer.write(template); writer.write(template);
writer.write(base); writer.write(base);
writer.write(addition); writer.write(addition);
writer.write(ITEM, result); writer.write(ItemStack.NETWORK_TYPE, result);
} }
@Override @Override
@ -312,11 +312,11 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
} }
public Ingredient(@NotNull NetworkBuffer reader) { 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) { public void write(@NotNull NetworkBuffer writer) {
writer.writeCollection(ITEM, items); writer.writeCollection(ItemStack.NETWORK_TYPE, items);
} }
} }
} }

View File

@ -2,9 +2,9 @@ package net.minestom.server.network.packet.server.play;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.entity.EquipmentSlot; import net.minestom.server.entity.EquipmentSlot;
import net.minestom.server.item.ItemComponent;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.network.NetworkBuffer; 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.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -16,7 +16,8 @@ import java.util.Objects;
import java.util.function.UnaryOperator; import java.util.function.UnaryOperator;
import java.util.stream.Collectors; 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, public record EntityEquipmentPacket(int entityId,
@NotNull Map<EquipmentSlot, ItemStack> equipments) implements ServerPacket.Play, ServerPacket.ComponentHolding { @NotNull Map<EquipmentSlot, ItemStack> equipments) implements ServerPacket.Play, ServerPacket.ComponentHolding {
@ -39,7 +40,7 @@ public record EntityEquipmentPacket(int entityId,
byte slotEnum = (byte) entry.getKey().ordinal(); byte slotEnum = (byte) entry.getKey().ordinal();
if (!last) slotEnum |= 0x80; if (!last) slotEnum |= 0x80;
writer.write(BYTE, slotEnum); 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<Component> components() { public @NotNull Collection<Component> components() {
return this.equipments.values() return this.equipments.values()
.stream() .stream()
.map(ItemStack::getDisplayName) .map(item -> item.get(ItemComponent.CUSTOM_NAME))
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@ -60,7 +61,7 @@ public record EntityEquipmentPacket(int entityId,
@Override @Override
public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator<Component> operator) { public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator<Component> operator) {
final var map = new EnumMap<EquipmentSlot, ItemStack>(EquipmentSlot.class); final var map = new EnumMap<EquipmentSlot, ItemStack>(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); return new EntityEquipmentPacket(this.entityId, map);
} }
@ -70,7 +71,7 @@ public record EntityEquipmentPacket(int entityId,
byte slot; byte slot;
do { do {
slot = reader.read(BYTE); 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); } while ((slot & 0x80) == 0x80);
return equipments; return equipments;
} }

View File

@ -1,5 +1,6 @@
package net.minestom.server.network.packet.server.play; 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.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; 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(); return writer.toByteArray();
} }
else if (particle.equals(Particle.ITEM)) { 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)) { else if (particle.equals(Particle.DUST_COLOR_TRANSITION)) {
for (int i = 0; i < 7; i++) writer.writeFloat(reader.read(FLOAT)); for (int i = 0; i < 7; i++) writer.writeFloat(reader.read(FLOAT));

View File

@ -1,9 +1,9 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.item.ItemComponent;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.network.NetworkBuffer; 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.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import org.jetbrains.annotations.NotNull; 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 { @NotNull ItemStack itemStack) implements ServerPacket.Play, ServerPacket.ComponentHolding {
public SetSlotPacket(@NotNull NetworkBuffer reader) { public SetSlotPacket(@NotNull NetworkBuffer reader) {
this(reader.read(BYTE), reader.read(VAR_INT), reader.read(SHORT), this(reader.read(BYTE), reader.read(VAR_INT), reader.read(SHORT),
reader.read(ITEM)); reader.read(ItemStack.NETWORK_TYPE));
} }
@Override @Override
@ -27,7 +27,7 @@ public record SetSlotPacket(byte windowId, int stateId, short slot,
writer.write(BYTE, windowId); writer.write(BYTE, windowId);
writer.write(VAR_INT, stateId); writer.write(VAR_INT, stateId);
writer.write(SHORT, slot); writer.write(SHORT, slot);
writer.write(ITEM, itemStack); writer.write(ItemStack.NETWORK_TYPE, itemStack);
} }
@Override @Override
@ -37,20 +37,21 @@ public record SetSlotPacket(byte windowId, int stateId, short slot,
@Override @Override
public @NotNull Collection<Component> components() { public @NotNull Collection<Component> components() {
final var components = new ArrayList<>(this.itemStack.getLore()); final var components = new ArrayList<>(this.itemStack.get(ItemComponent.LORE, List.of()));
final var displayname = this.itemStack.getDisplayName(); final var displayname = this.itemStack.get(ItemComponent.CUSTOM_NAME);
if (displayname != null) components.add(displayname); if (displayname != null) components.add(displayname);
return List.copyOf(components); return List.copyOf(components);
} }
@Override @Override
public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator<Component> operator) { public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator<Component> operator) {
return new SetSlotPacket(this.windowId, this.stateId, this.slot, this.itemStack.withDisplayName(operator).withLore(lines -> { return new SetSlotPacket(this.windowId, this.stateId, this.slot, this.itemStack
final var translatedComponents = new ArrayList<Component>(); .with(ItemComponent.CUSTOM_NAME, operator)
lines.forEach(component -> translatedComponents.add(operator.apply(component))); .with(ItemComponent.LORE, (UnaryOperator<List<Component>>) lines -> {
return translatedComponents; final var translatedComponents = new ArrayList<Component>();
})); lines.forEach(component -> translatedComponents.add(operator.apply(component)));
return translatedComponents;
}));
} }
/** /**

View File

@ -45,17 +45,17 @@ public record TradeListPacket(int windowId, @NotNull List<Trade> trades,
int tradeUsesNumber, int maxTradeUsesNumber, int exp, int tradeUsesNumber, int maxTradeUsesNumber, int exp,
int specialPrice, float priceMultiplier, int demand) implements NetworkBuffer.Writer { int specialPrice, float priceMultiplier, int demand) implements NetworkBuffer.Writer {
public Trade(@NotNull NetworkBuffer reader) { public Trade(@NotNull NetworkBuffer reader) {
this(reader.read(ITEM), reader.read(ITEM), this(reader.read(ItemStack.NETWORK_TYPE), reader.read(ItemStack.NETWORK_TYPE),
reader.readOptional(ITEM), reader.read(BOOLEAN), reader.readOptional(ItemStack.NETWORK_TYPE), reader.read(BOOLEAN),
reader.read(INT), reader.read(INT), reader.read(INT), reader.read(INT), reader.read(INT), reader.read(INT),
reader.read(INT), reader.read(FLOAT), reader.read(INT)); reader.read(INT), reader.read(FLOAT), reader.read(INT));
} }
@Override @Override
public void write(@NotNull NetworkBuffer writer) { public void write(@NotNull NetworkBuffer writer) {
writer.write(ITEM, inputItem1); writer.write(ItemStack.NETWORK_TYPE, inputItem1);
writer.write(ITEM, result); writer.write(ItemStack.NETWORK_TYPE, result);
writer.writeOptional(ITEM, inputItem2); writer.writeOptional(ItemStack.NETWORK_TYPE, inputItem2);
writer.write(BOOLEAN, tradeDisabled); writer.write(BOOLEAN, tradeDisabled);
writer.write(INT, tradeUsesNumber); writer.write(INT, tradeUsesNumber);
writer.write(INT, maxTradeUsesNumber); writer.write(INT, maxTradeUsesNumber);

View File

@ -1,9 +1,9 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.item.ItemComponent;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.network.NetworkBuffer; 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.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -13,7 +13,8 @@ import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.function.UnaryOperator; 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<ItemStack> items, public record WindowItemsPacket(byte windowId, int stateId, @NotNull List<ItemStack> items,
@NotNull ItemStack carriedItem) implements ServerPacket.Play, ServerPacket.ComponentHolding { @NotNull ItemStack carriedItem) implements ServerPacket.Play, ServerPacket.ComponentHolding {
@ -24,16 +25,16 @@ public record WindowItemsPacket(byte windowId, int stateId, @NotNull List<ItemSt
} }
public WindowItemsPacket(@NotNull NetworkBuffer reader) { public WindowItemsPacket(@NotNull NetworkBuffer reader) {
this(reader.read(BYTE), reader.read(VAR_INT), reader.readCollection(ITEM, MAX_ENTRIES), this(reader.read(BYTE), reader.read(VAR_INT), reader.readCollection(ItemStack.NETWORK_TYPE, MAX_ENTRIES),
reader.read(ITEM)); reader.read(ItemStack.NETWORK_TYPE));
} }
@Override @Override
public void write(@NotNull NetworkBuffer writer) { public void write(@NotNull NetworkBuffer writer) {
writer.write(BYTE, windowId); writer.write(BYTE, windowId);
writer.write(VAR_INT, stateId); writer.write(VAR_INT, stateId);
writer.writeCollection(ITEM, items); writer.writeCollection(ItemStack.NETWORK_TYPE, items);
writer.write(ITEM, carriedItem); writer.write(ItemStack.NETWORK_TYPE, carriedItem);
} }
@Override @Override
@ -49,9 +50,9 @@ public record WindowItemsPacket(byte windowId, int stateId, @NotNull List<ItemSt
final var components = new ArrayList<Component>(); final var components = new ArrayList<Component>();
list.forEach(itemStack -> { 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; if (displayName == null) return;
components.add(displayName); components.add(displayName);
@ -62,19 +63,21 @@ public record WindowItemsPacket(byte windowId, int stateId, @NotNull List<ItemSt
@Override @Override
public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator<Component> operator) { public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator<Component> operator) {
UnaryOperator<List<Component>> loreOperator = lines -> {
final var translatedComponents = new ArrayList<Component>();
lines.forEach(component -> translatedComponents.add(operator.apply(component)));
return translatedComponents;
};
return new WindowItemsPacket( return new WindowItemsPacket(
this.windowId, this.windowId,
this.stateId, this.stateId,
this.items.stream().map(stack -> stack.withDisplayName(operator).withLore(lines -> { this.items.stream().map(stack -> stack
final var translatedComponents = new ArrayList<Component>(); .with(ItemComponent.CUSTOM_NAME, operator)
lines.forEach(component -> translatedComponents.add(operator.apply(component))); .with(ItemComponent.LORE, loreOperator))
return translatedComponents; .toList(),
})).toList(), this.carriedItem
this.carriedItem.withDisplayName(operator).withLore(lines -> { .with(ItemComponent.CUSTOM_NAME, operator)
final var translatedComponents = new ArrayList<Component>(); .with(ItemComponent.LORE, loreOperator)
lines.forEach(component -> translatedComponents.add(operator.apply(component)));
return translatedComponents;
})
); );
} }
} }

View File

@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull;
public record ItemParticleData(ItemStack item) implements ParticleData { public record ItemParticleData(ItemStack item) implements ParticleData {
ItemParticleData(NetworkBuffer reader) { ItemParticleData(NetworkBuffer reader) {
this(reader.read(NetworkBuffer.ITEM)); this(reader.read(ItemStack.NETWORK_TYPE));
} }
ItemParticleData() { ItemParticleData() {
@ -17,7 +17,7 @@ public record ItemParticleData(ItemStack item) implements ParticleData {
@Override @Override
public void write(@NotNull NetworkBuffer writer) { public void write(@NotNull NetworkBuffer writer) {
writer.write(NetworkBuffer.ITEM, item); writer.write(ItemStack.NETWORK_TYPE, item);
} }
@Override @Override

View File

@ -9,6 +9,7 @@ import net.minestom.server.collision.BoundingBox;
import net.minestom.server.collision.CollisionUtils; import net.minestom.server.collision.CollisionUtils;
import net.minestom.server.collision.Shape; import net.minestom.server.collision.Shape;
import net.minestom.server.entity.EntitySpawnType; import net.minestom.server.entity.EntitySpawnType;
import net.minestom.server.entity.EquipmentSlot;
import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.Block;
import net.minestom.server.item.ItemComponent; import net.minestom.server.item.ItemComponent;
import net.minestom.server.item.ItemComponentMap; import net.minestom.server.item.ItemComponentMap;
@ -477,8 +478,8 @@ public final class Registry {
private final Supplier<Block> blockSupplier; private final Supplier<Block> blockSupplier;
private final ItemComponentMap prototype; private final ItemComponentMap prototype;
// private final EquipmentSlot equipmentSlot; //todo private final EquipmentSlot equipmentSlot;
// private final EntityType entityType; //todo // private final EntityType entityType; //todo
private final Properties custom; private final Properties custom;
private MaterialEntry(String namespace, Properties main, Properties custom) { private MaterialEntry(String namespace, Properties main, Properties custom) {
@ -493,32 +494,38 @@ public final class Registry {
try { try {
ItemComponentMap.Builder builder = ItemComponentMap.builder(); ItemComponentMap.Builder builder = ItemComponentMap.builder();
for (Map.Entry<String, Object> entry : main.section("components")) { for (Map.Entry<String, Object> entry : main.section("components")) {
//noinspection unchecked try {
ItemComponent<Object> component = (ItemComponent<Object>) ItemComponent.fromNamespaceId(entry.getKey()); //noinspection unchecked
Check.notNull(component, "Unknown component: " + entry.getKey()); ItemComponent<Object> component = (ItemComponent<Object>) ItemComponent.fromNamespaceId(entry.getKey());
Check.notNull(component, "Unknown component: " + entry.getKey());
byte[] rawValue = Base64.getDecoder().decode((String) entry.getValue()); byte[] rawValue = Base64.getDecoder().decode((String) entry.getValue());
BinaryTagReader reader = new BinaryTagReader(new DataInputStream(new ByteArrayInputStream(rawValue))); BinaryTagReader reader = new BinaryTagReader(new DataInputStream(new ByteArrayInputStream(rawValue)));
builder.set(component, component.read(reader.readNameless()));
//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(); this.prototype = builder.build();
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException("failed to parse material registry: " + namespace, e); throw new RuntimeException("failed to parse material registry: " + namespace, e);
} }
// { {
// final Properties armorProperties = main.section("armorProperties"); final Properties armorProperties = main.section("armorProperties");
// if (armorProperties != null) { if (armorProperties != null) {
// switch (armorProperties.getString("slot")) { switch (armorProperties.getString("slot")) {
// case "feet" -> this.equipmentSlot = EquipmentSlot.BOOTS; case "feet" -> this.equipmentSlot = EquipmentSlot.BOOTS;
// case "legs" -> this.equipmentSlot = EquipmentSlot.LEGGINGS; case "legs" -> this.equipmentSlot = EquipmentSlot.LEGGINGS;
// case "chest" -> this.equipmentSlot = EquipmentSlot.CHESTPLATE; case "chest" -> this.equipmentSlot = EquipmentSlot.CHESTPLATE;
// case "head" -> this.equipmentSlot = EquipmentSlot.HELMET; case "head" -> this.equipmentSlot = EquipmentSlot.HELMET;
// default -> this.equipmentSlot = null; default -> this.equipmentSlot = null;
// } }
// } else { } else {
// this.equipmentSlot = null; this.equipmentSlot = null;
// } }
// } }
// { // {
// final Properties spawnEggProperties = main.section("spawnEggProperties"); // final Properties spawnEggProperties = main.section("spawnEggProperties");
// if (spawnEggProperties != null) { // if (spawnEggProperties != null) {
@ -549,14 +556,14 @@ public final class Registry {
return prototype; return prototype;
} }
// public boolean isArmor() { public boolean isArmor() {
// return equipmentSlot != null; return equipmentSlot != null;
// } }
//
// public @Nullable EquipmentSlot equipmentSlot() { public @Nullable EquipmentSlot equipmentSlot() {
// return equipmentSlot; return equipmentSlot;
// } }
//
// /** // /**
// * Gets the entity type this item can spawn. Only present for spawn eggs (e.g. wolf spawn egg, skeleton spawn egg) // * 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 // * @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); custom);
} }
} }
public record TrimMaterialEntry(@NotNull NamespaceID namespace, public record TrimMaterialEntry(@NotNull NamespaceID namespace,
@NotNull String assetName, @NotNull String assetName,
@NotNull Material ingredient, @NotNull Material ingredient,
float itemModelIndex, float itemModelIndex,
@NotNull Map<String,String> overrideArmorMaterials, @NotNull Map<String, String> overrideArmorMaterials,
@NotNull Component description, @NotNull Component description,
Properties custom) implements Entry { Properties custom) implements Entry {
public TrimMaterialEntry(@NotNull String namespace, @NotNull Properties main, Properties custom) { public TrimMaterialEntry(@NotNull String namespace, @NotNull Properties main, Properties custom) {
@ -625,7 +633,7 @@ public final class Registry {
main.getString("asset_name"), main.getString("asset_name"),
Objects.requireNonNull(Material.fromNamespaceId(main.getString("ingredient"))), Objects.requireNonNull(Material.fromNamespaceId(main.getString("ingredient"))),
(float) main.getDouble("item_model_index"), (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())), .asMap().entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> (String) entry.getValue())),
JSONComponentSerializer.json().deserialize(main.section("description").toString()), JSONComponentSerializer.json().deserialize(main.section("description").toString()),
custom custom
@ -803,7 +811,7 @@ public final class Registry {
public String toString() { public String toString() {
AtomicReference<String> string = new AtomicReference<>("{ "); AtomicReference<String> string = new AtomicReference<>("{ ");
this.map.forEach((s, object) -> string.set(string.get() + " , " + "\"" + s + "\"" + " : " + "\"" + object.toString() + "\"")); this.map.forEach((s, object) -> string.set(string.get() + " , " + "\"" + s + "\"" + " : " + "\"" + object.toString() + "\""));
return string.updateAndGet(s -> s.replaceFirst(" , ","") + "}"); return string.updateAndGet(s -> s.replaceFirst(" , ", "") + "}");
} }
} }

View File

@ -187,7 +187,7 @@ public class BinaryReader extends InputStream {
} }
public ItemStack readItemStack() { public ItemStack readItemStack() {
return buffer.read(ITEM); return buffer.read(ItemStack.NETWORK_TYPE);
} }
public Component readComponent(int maxLength) { public Component readComponent(int maxLength) {

View File

@ -164,7 +164,7 @@ public class BinaryWriter extends OutputStream {
} }
public void writeItemStack(@NotNull ItemStack itemStack) { 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) { public void writeNBT(@NotNull String name, @NotNull BinaryTag tag) {

View File

@ -58,9 +58,10 @@ public record BiomeParticle(float probability, Option option) {
@Override @Override
public CompoundBinaryTag toNbt() { public CompoundBinaryTag toNbt() {
//todo test count might be wrong type //todo
return item.meta().toNBT() // return item.meta().toNBT()
.putString("type", type); // .putString("type", type);
return CompoundBinaryTag.empty();
} }
} }