From abf80e597ebc63e81e99ea89be0e6041255327e6 Mon Sep 17 00:00:00 2001 From: mworzala Date: Thu, 23 May 2024 17:46:57 -0400 Subject: [PATCH] chore: cleanup networkbuffer additions --- .../java/net/minestom/demo/PlayerInit.java | 4 + .../net/minestom/server/color/DyeColor.java | 2 +- .../minestom/server/recipe/RecipeType.java | 2 +- .../net/minestom/server/entity/Metadata.java | 10 +- .../entity/metadata/animal/ArmadilloMeta.java | 3 +- .../entity/metadata/animal/FrogMeta.java | 3 +- .../entity/metadata/animal/SnifferMeta.java | 3 +- .../metadata/animal/tameable/CatMeta.java | 3 +- .../metadata/animal/tameable/WolfMeta.java | 2 +- .../entity/metadata/other/PaintingMeta.java | 3 + .../instance/block/banner/BannerPattern.java | 2 +- .../net/minestom/server/item/Material.java | 2 +- .../server/item/armor/TrimMaterial.java | 2 +- .../server/item/armor/TrimPattern.java | 2 +- .../server/item/component/ItemRarity.java | 2 +- .../item/component/MapPostProcessing.java | 5 +- .../server/network/NetworkBuffer.java | 95 +++------------ .../server/network/NetworkBufferTypeImpl.java | 115 ++++++++++++++---- .../server/sound/BuiltinSoundEvent.java | 24 ---- .../net/minestom/server/sound/SoundEvent.java | 26 +++- 20 files changed, 168 insertions(+), 142 deletions(-) diff --git a/demo/src/main/java/net/minestom/demo/PlayerInit.java b/demo/src/main/java/net/minestom/demo/PlayerInit.java index 4976b3b4f..d1d3fd639 100644 --- a/demo/src/main/java/net/minestom/demo/PlayerInit.java +++ b/demo/src/main/java/net/minestom/demo/PlayerInit.java @@ -1,5 +1,6 @@ package net.minestom.demo; +import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.minestom.server.MinecraftServer; import net.minestom.server.advancements.FrameType; @@ -40,6 +41,7 @@ import net.minestom.server.monitoring.BenchmarkManager; import net.minestom.server.monitoring.TickMonitor; import net.minestom.server.potion.CustomPotionEffect; import net.minestom.server.potion.PotionEffect; +import net.minestom.server.sound.SoundEvent; import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.time.TimeUnit; @@ -141,6 +143,8 @@ public class PlayerInit { Material.IRON_SWORD ); NotificationCenter.send(notification, event.getPlayer()); + + player.playSound(Sound.sound(SoundEvent.ENTITY_EXPERIENCE_ORB_PICKUP, Sound.Source.PLAYER, 0.5f, 1f)); } }) .addListener(PlayerPacketOutEvent.class, event -> { diff --git a/src/autogenerated/java/net/minestom/server/color/DyeColor.java b/src/autogenerated/java/net/minestom/server/color/DyeColor.java index 9b668face..ff16c321e 100644 --- a/src/autogenerated/java/net/minestom/server/color/DyeColor.java +++ b/src/autogenerated/java/net/minestom/server/color/DyeColor.java @@ -41,7 +41,7 @@ public enum DyeColor implements RGBLike { BLACK(new Color(0x1d1d21), new Color(0x0), new Color(0x1e1b1b), 29); - public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.fromEnum(DyeColor.class); + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(DyeColor.class); public static final BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.fromEnumStringable(DyeColor.class); diff --git a/src/autogenerated/java/net/minestom/server/recipe/RecipeType.java b/src/autogenerated/java/net/minestom/server/recipe/RecipeType.java index d00a60f10..16735c2d4 100644 --- a/src/autogenerated/java/net/minestom/server/recipe/RecipeType.java +++ b/src/autogenerated/java/net/minestom/server/recipe/RecipeType.java @@ -55,7 +55,7 @@ public enum RecipeType implements StaticProtocolObject { DECORATED_POT(NamespaceID.from("minecraft:crafting_decorated_pot")); - public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.fromEnum(RecipeType.class); + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(RecipeType.class); private final NamespaceID namespace; diff --git a/src/main/java/net/minestom/server/entity/Metadata.java b/src/main/java/net/minestom/server/entity/Metadata.java index db19831b5..2909b586c 100644 --- a/src/main/java/net/minestom/server/entity/Metadata.java +++ b/src/main/java/net/minestom/server/entity/Metadata.java @@ -148,7 +148,7 @@ public final class Metadata { } public static Entry CatVariant(@NotNull CatMeta.Variant value) { - return new MetadataImpl.EntryImpl<>(TYPE_CAT_VARIANT, value, NetworkBuffer.CAT_VARIANT); + return new MetadataImpl.EntryImpl<>(TYPE_CAT_VARIANT, value, CatMeta.Variant.NETWORK_TYPE); } public static Entry> WolfVariant(@NotNull DynamicRegistry.Key value) { @@ -158,19 +158,19 @@ public final class Metadata { // WOLF VARIANT public static Entry FrogVariant(@NotNull FrogMeta.Variant value) { - return new MetadataImpl.EntryImpl<>(TYPE_FROG_VARIANT, value, NetworkBuffer.FROG_VARIANT); + return new MetadataImpl.EntryImpl<>(TYPE_FROG_VARIANT, value, FrogMeta.Variant.NETWORK_TYPE); } public static Entry PaintingVariant(@NotNull PaintingMeta.Variant value) { - return new MetadataImpl.EntryImpl<>(TYPE_PAINTING_VARIANT, value, NetworkBuffer.PAINTING_VARIANT); + return new MetadataImpl.EntryImpl<>(TYPE_PAINTING_VARIANT, value, PaintingMeta.Variant.NETWORK_TYPE); } public static Entry SnifferState(@NotNull SnifferMeta.State value) { - return new MetadataImpl.EntryImpl<>(TYPE_SNIFFER_STATE, value, NetworkBuffer.SNIFFER_STATE); + return new MetadataImpl.EntryImpl<>(TYPE_SNIFFER_STATE, value, SnifferMeta.State.NETWORK_TYPE); } public static Entry ArmadilloState(@NotNull ArmadilloMeta.State value) { - return new MetadataImpl.EntryImpl<>(TYPE_ARMADILLO_STATE, value, NetworkBuffer.ARMADILLO_STATE); + return new MetadataImpl.EntryImpl<>(TYPE_ARMADILLO_STATE, value, ArmadilloMeta.State.NETWORK_TYPE); } public static Entry Vector3(@NotNull Point value) { diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/ArmadilloMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/ArmadilloMeta.java index a0807cfb8..04e4c6b51 100644 --- a/src/main/java/net/minestom/server/entity/metadata/animal/ArmadilloMeta.java +++ b/src/main/java/net/minestom/server/entity/metadata/animal/ArmadilloMeta.java @@ -2,6 +2,7 @@ package net.minestom.server.entity.metadata.animal; import net.minestom.server.entity.Entity; import net.minestom.server.entity.Metadata; +import net.minestom.server.network.NetworkBuffer; import org.jetbrains.annotations.NotNull; public class ArmadilloMeta extends AnimalMeta { @@ -27,6 +28,6 @@ public class ArmadilloMeta extends AnimalMeta { SCARED, UNROLLING; - private static final State[] VALUES = values(); + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(State.class); } } diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/FrogMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/FrogMeta.java index cfb2914ce..1acd38bb1 100644 --- a/src/main/java/net/minestom/server/entity/metadata/animal/FrogMeta.java +++ b/src/main/java/net/minestom/server/entity/metadata/animal/FrogMeta.java @@ -2,6 +2,7 @@ package net.minestom.server.entity.metadata.animal; import net.minestom.server.entity.Entity; import net.minestom.server.entity.Metadata; +import net.minestom.server.network.NetworkBuffer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -36,6 +37,6 @@ public class FrogMeta extends AnimalMeta { WARM, COLD; - private final static FrogMeta.Variant[] VALUES = values(); + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(Variant.class); } } diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/SnifferMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/SnifferMeta.java index b1bf238ec..abd9cef09 100644 --- a/src/main/java/net/minestom/server/entity/metadata/animal/SnifferMeta.java +++ b/src/main/java/net/minestom/server/entity/metadata/animal/SnifferMeta.java @@ -2,6 +2,7 @@ package net.minestom.server.entity.metadata.animal; import net.minestom.server.entity.Entity; import net.minestom.server.entity.Metadata; +import net.minestom.server.network.NetworkBuffer; import org.jetbrains.annotations.NotNull; public class SnifferMeta extends AnimalMeta { @@ -38,6 +39,6 @@ public class SnifferMeta extends AnimalMeta { DIGGING, RISING; - private static final State[] VALUES = values(); + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(State.class); } } diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/tameable/CatMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/tameable/CatMeta.java index 087743b76..0f8416243 100644 --- a/src/main/java/net/minestom/server/entity/metadata/animal/tameable/CatMeta.java +++ b/src/main/java/net/minestom/server/entity/metadata/animal/tameable/CatMeta.java @@ -3,6 +3,7 @@ package net.minestom.server.entity.metadata.animal.tameable; import net.minestom.server.color.DyeColor; import net.minestom.server.entity.Entity; import net.minestom.server.entity.Metadata; +import net.minestom.server.network.NetworkBuffer; import org.jetbrains.annotations.NotNull; public class CatMeta extends TameableAnimalMeta { @@ -61,7 +62,7 @@ public class CatMeta extends TameableAnimalMeta { JELLIE, ALL_BLACK; - private static final Variant[] VALUES = values(); + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(Variant.class); } } diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/tameable/WolfMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/tameable/WolfMeta.java index a9bc83495..f8ea13c33 100644 --- a/src/main/java/net/minestom/server/entity/metadata/animal/tameable/WolfMeta.java +++ b/src/main/java/net/minestom/server/entity/metadata/animal/tameable/WolfMeta.java @@ -62,7 +62,7 @@ public class WolfMeta extends TameableAnimalMeta { } public sealed interface Variant extends ProtocolObject, WolfVariants permits VariantImpl { - @NotNull NetworkBuffer.Type> NETWORK_TYPE = NetworkBuffer.registryKey(Registries::wolfVariant); + @NotNull NetworkBuffer.Type> NETWORK_TYPE = NetworkBuffer.RegistryKey(Registries::wolfVariant); @NotNull BinaryTagSerializer> NBT_TYPE = BinaryTagSerializer.registryKey(Registries::wolfVariant); static @NotNull Variant create( diff --git a/src/main/java/net/minestom/server/entity/metadata/other/PaintingMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/PaintingMeta.java index 06b0ec616..9b8b071bb 100644 --- a/src/main/java/net/minestom/server/entity/metadata/other/PaintingMeta.java +++ b/src/main/java/net/minestom/server/entity/metadata/other/PaintingMeta.java @@ -4,6 +4,7 @@ import net.minestom.server.entity.Entity; import net.minestom.server.entity.Metadata; import net.minestom.server.entity.metadata.EntityMeta; import net.minestom.server.entity.metadata.ObjectDataProvider; +import net.minestom.server.network.NetworkBuffer; import net.minestom.server.registry.StaticProtocolObject; import net.minestom.server.utils.NamespaceID; import net.minestom.server.utils.validate.Check; @@ -105,6 +106,8 @@ public class PaintingMeta extends EntityMeta implements ObjectDataProvider { FIRE(32, 32), DONKEY_KONG(64, 48); + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(Variant.class); + private static final Variant[] VALUES = values(); public static @Nullable Variant fromId(int id) { diff --git a/src/main/java/net/minestom/server/instance/block/banner/BannerPattern.java b/src/main/java/net/minestom/server/instance/block/banner/BannerPattern.java index dd9383d6c..d47e243be 100644 --- a/src/main/java/net/minestom/server/instance/block/banner/BannerPattern.java +++ b/src/main/java/net/minestom/server/instance/block/banner/BannerPattern.java @@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public sealed interface BannerPattern extends ProtocolObject, BannerPatterns permits BannerPatternImpl { - @NotNull NetworkBuffer.Type> NETWORK_TYPE = NetworkBuffer.registryKey(Registries::bannerPattern); + @NotNull NetworkBuffer.Type> NETWORK_TYPE = NetworkBuffer.RegistryKey(Registries::bannerPattern); @NotNull BinaryTagSerializer> NBT_TYPE = BinaryTagSerializer.registryKey(Registries::bannerPattern); static @NotNull BannerPattern create( diff --git a/src/main/java/net/minestom/server/item/Material.java b/src/main/java/net/minestom/server/item/Material.java index 2de6611f7..eac55eb98 100644 --- a/src/main/java/net/minestom/server/item/Material.java +++ b/src/main/java/net/minestom/server/item/Material.java @@ -48,7 +48,7 @@ import java.util.Collection; public sealed interface Material extends StaticProtocolObject, Materials permits MaterialImpl { - NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.lazy(() -> MaterialImpl.NETWORK_TYPE); + NetworkBuffer.Type NETWORK_TYPE = MaterialImpl.NETWORK_TYPE; BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.lazy(() -> MaterialImpl.NBT_TYPE); /** diff --git a/src/main/java/net/minestom/server/item/armor/TrimMaterial.java b/src/main/java/net/minestom/server/item/armor/TrimMaterial.java index ed6c2800e..db579d65d 100644 --- a/src/main/java/net/minestom/server/item/armor/TrimMaterial.java +++ b/src/main/java/net/minestom/server/item/armor/TrimMaterial.java @@ -18,7 +18,7 @@ import java.util.HashMap; import java.util.Map; public sealed interface TrimMaterial extends ProtocolObject permits TrimMaterialImpl { - @NotNull NetworkBuffer.Type> NETWORK_TYPE = NetworkBuffer.registryKey(Registries::trimMaterial); + @NotNull NetworkBuffer.Type> NETWORK_TYPE = NetworkBuffer.RegistryKey(Registries::trimMaterial); @NotNull BinaryTagSerializer> NBT_TYPE = BinaryTagSerializer.registryKey(Registries::trimMaterial); static @NotNull TrimMaterial create( diff --git a/src/main/java/net/minestom/server/item/armor/TrimPattern.java b/src/main/java/net/minestom/server/item/armor/TrimPattern.java index ef33c06ad..1afcfe9fc 100644 --- a/src/main/java/net/minestom/server/item/armor/TrimPattern.java +++ b/src/main/java/net/minestom/server/item/armor/TrimPattern.java @@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public sealed interface TrimPattern extends ProtocolObject permits TrimPatternImpl { - @NotNull NetworkBuffer.Type> NETWORK_TYPE = NetworkBuffer.registryKey(Registries::trimPattern); + @NotNull NetworkBuffer.Type> NETWORK_TYPE = NetworkBuffer.RegistryKey(Registries::trimPattern); @NotNull BinaryTagSerializer> NBT_TYPE = BinaryTagSerializer.registryKey(Registries::trimPattern); static @NotNull TrimPattern create( diff --git a/src/main/java/net/minestom/server/item/component/ItemRarity.java b/src/main/java/net/minestom/server/item/component/ItemRarity.java index 16cc1a498..eed4e7aad 100644 --- a/src/main/java/net/minestom/server/item/component/ItemRarity.java +++ b/src/main/java/net/minestom/server/item/component/ItemRarity.java @@ -11,6 +11,6 @@ public enum ItemRarity { private static final ItemRarity[] VALUES = values(); - public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.fromEnum(ItemRarity.class); + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(ItemRarity.class); public static final BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.fromEnumStringable(ItemRarity.class); } diff --git a/src/main/java/net/minestom/server/item/component/MapPostProcessing.java b/src/main/java/net/minestom/server/item/component/MapPostProcessing.java index 624902948..a73723b31 100644 --- a/src/main/java/net/minestom/server/item/component/MapPostProcessing.java +++ b/src/main/java/net/minestom/server/item/component/MapPostProcessing.java @@ -1,6 +1,7 @@ package net.minestom.server.item.component; import net.minestom.server.network.NetworkBuffer; +import org.jetbrains.annotations.NotNull; public enum MapPostProcessing { LOCK, @@ -9,12 +10,12 @@ public enum MapPostProcessing { public static final NetworkBuffer.Type NETWORK_TYPE = new NetworkBuffer.Type<>() { @Override - public void write(NetworkBuffer buffer, MapPostProcessing value) { + public void write(@NotNull NetworkBuffer buffer, MapPostProcessing value) { buffer.write(NetworkBuffer.VAR_INT, value.ordinal()); } @Override - public MapPostProcessing read(NetworkBuffer buffer) { + public MapPostProcessing read(@NotNull NetworkBuffer buffer) { return VALUES[buffer.read(NetworkBuffer.VAR_INT)]; } }; diff --git a/src/main/java/net/minestom/server/network/NetworkBuffer.java b/src/main/java/net/minestom/server/network/NetworkBuffer.java index d252b8e07..ab69d2461 100644 --- a/src/main/java/net/minestom/server/network/NetworkBuffer.java +++ b/src/main/java/net/minestom/server/network/NetworkBuffer.java @@ -5,11 +5,6 @@ import net.kyori.adventure.text.Component; import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Point; import net.minestom.server.entity.Entity; -import net.minestom.server.entity.metadata.animal.ArmadilloMeta; -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.network.packet.server.play.data.WorldPos; import net.minestom.server.particle.Particle; import net.minestom.server.registry.DynamicRegistry; @@ -58,6 +53,10 @@ public final class NetworkBuffer { public static final Type VAR_INT_ARRAY = new NetworkBufferTypeImpl.VarIntArrayType(); public static final Type VAR_LONG_ARRAY = new NetworkBufferTypeImpl.VarLongArrayType(); + public static @NotNull Type> RegistryKey(@NotNull Function> selector) { + return new NetworkBufferTypeImpl.RegistryTypeType<>(selector); + } + // METADATA public static final Type BLOCK_STATE = new NetworkBufferTypeImpl.BlockStateType(); public static final Type VILLAGER_DATA = new NetworkBufferTypeImpl.VillagerDataType(); @@ -67,64 +66,28 @@ public final class NetworkBuffer { public static final Type QUATERNION = new NetworkBufferTypeImpl.QuaternionType(); public static final Type PARTICLE = new NetworkBufferTypeImpl.ParticleType(); - public static final Type OPT_CHAT = NetworkBufferTypeImpl.fromOptional(COMPONENT); - public static final Type OPT_BLOCK_POSITION = NetworkBufferTypeImpl.fromOptional(BLOCK_POSITION); - public static final Type OPT_UUID = NetworkBufferTypeImpl.fromOptional(UUID); + public static final Type<@Nullable Component> OPT_CHAT = Optional(COMPONENT); + public static final Type<@Nullable Point> OPT_BLOCK_POSITION = Optional(BLOCK_POSITION); + public static final Type<@Nullable UUID> OPT_UUID = Optional(UUID); - public static final Type DIRECTION = NetworkBufferTypeImpl.fromEnum(Direction.class); - public static final Type POSE = NetworkBufferTypeImpl.fromEnum(Entity.Pose.class); + public static final Type DIRECTION = new NetworkBufferTypeImpl.EnumType<>(Direction.class); + public static final Type POSE = new NetworkBufferTypeImpl.EnumType<>(Entity.Pose.class); - public static final Type CAT_VARIANT = NetworkBufferTypeImpl.fromEnum(CatMeta.Variant.class); - public static final Type FROG_VARIANT = NetworkBufferTypeImpl.fromEnum(FrogMeta.Variant.class); - public static final Type PAINTING_VARIANT = NetworkBufferTypeImpl.fromEnum(PaintingMeta.Variant.class); - public static final Type SNIFFER_STATE = NetworkBufferTypeImpl.fromEnum(SnifferMeta.State.class); - public static final Type ARMADILLO_STATE = NetworkBufferTypeImpl.fromEnum(ArmadilloMeta.State.class); + // Combinators - public static Type> registryKey(@NotNull Function> selector) { - return new NetworkBuffer.Type<>() { - @Override - public void write(@NotNull NetworkBuffer buffer, DynamicRegistry.Key value) { - Check.stateCondition(buffer.registries == null, "Buffer does not have registries"); - final DynamicRegistry registry = selector.apply(buffer.registries); - final int id = registry.getId(value); - Check.argCondition(id == -1, "Key is not registered: {0} > {1}", registry, value); - buffer.write(VAR_INT, id); - } - - @Override - public DynamicRegistry.Key read(@NotNull NetworkBuffer buffer) { - Check.stateCondition(buffer.registries == null, "Buffer does not have registries"); - DynamicRegistry registry = selector.apply(buffer.registries); - final int id = buffer.read(VAR_INT); - final DynamicRegistry.Key key = registry.getKey(id); - Check.argCondition(key == null, "No such ID in registry: {0} > {1}", registry, id); - return key; - } - }; + public static @NotNull Type<@Nullable T> Optional(@NotNull Type type) { + return new NetworkBufferTypeImpl.OptionalType<>(type); } - public static > Type fromEnum(@NotNull Class enumClass) { - return NetworkBufferTypeImpl.fromEnum(enumClass); + public static > @NotNull Type Enum(@NotNull Class enumClass) { + return new NetworkBufferTypeImpl.EnumType<>(enumClass); } - public static Type lazy(@NotNull Supplier> supplier) { - return new NetworkBuffer.Type<>() { - private Type type; - - @Override - public void write(@NotNull NetworkBuffer buffer, T value) { - if (type == null) type = supplier.get(); - type.write(buffer, value); - } - - @Override - public T read(@NotNull NetworkBuffer buffer) { - if (type == null) type = supplier.get(); - return null; - } - }; + public static @NotNull Type Lazy(@NotNull Supplier> supplier) { + return new NetworkBufferTypeImpl.LazyType<>(supplier); } + ByteBuffer nioBuffer; final boolean resizable; int writeIndex; @@ -348,31 +311,11 @@ public final class NetworkBuffer { T read(@NotNull NetworkBuffer buffer); default @NotNull Type map(@NotNull Function to, @NotNull Function from) { - return new Type() { - @Override - public void write(@NotNull NetworkBuffer buffer, S value) { - Type.this.write(buffer, from.apply(value)); - } - - @Override - public S read(@NotNull NetworkBuffer buffer) { - return to.apply(Type.this.read(buffer)); - } - }; + return new NetworkBufferTypeImpl.MappedType<>(this, to, from); } default @NotNull Type> list(int maxSize) { - return new NetworkBuffer.Type<>() { - @Override - public void write(@NotNull NetworkBuffer buffer, List value) { - buffer.writeCollection(Type.this, value); - } - - @Override - public List read(@NotNull NetworkBuffer buffer) { - return buffer.readCollection(Type.this, maxSize); - } - }; + return new NetworkBufferTypeImpl.ListType<>(this, maxSize); } } diff --git a/src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java b/src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java index 1b8590603..fdf1ccf6a 100644 --- a/src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java +++ b/src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java @@ -9,15 +9,22 @@ import net.minestom.server.coordinate.Vec; import net.minestom.server.network.packet.server.play.data.WorldPos; import net.minestom.server.particle.Particle; import net.minestom.server.particle.data.ParticleData; +import net.minestom.server.registry.DynamicRegistry; +import net.minestom.server.registry.ProtocolObject; +import net.minestom.server.registry.Registries; import net.minestom.server.utils.Unit; import net.minestom.server.utils.nbt.BinaryTagReader; import net.minestom.server.utils.nbt.BinaryTagWriter; import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.*; import java.nio.charset.StandardCharsets; +import java.util.List; import java.util.UUID; +import java.util.function.Function; +import java.util.function.Supplier; import static net.minestom.server.network.NetworkBuffer.*; @@ -580,31 +587,95 @@ interface NetworkBufferTypeImpl extends NetworkBuffer.Type { } } - static > NetworkBufferTypeImpl fromEnum(Class enumClass) { - return new NetworkBufferTypeImpl<>() { - @Override - public void write(@NotNull NetworkBuffer buffer, T value) { - buffer.writeEnum(enumClass, value); - } + // Combinators - @Override - public T read(@NotNull NetworkBuffer buffer) { - return buffer.readEnum(enumClass); - } - }; + record EnumType>(@NotNull Class enumClass) implements NetworkBufferTypeImpl { + @Override + public void write(@NotNull NetworkBuffer buffer, E value) { + buffer.writeEnum(enumClass, value); + } + + @Override + public E read(@NotNull NetworkBuffer buffer) { + return buffer.readEnum(enumClass); + } } - static NetworkBufferTypeImpl fromOptional(Type optionalType) { - return new NetworkBufferTypeImpl<>() { - @Override - public void write(@NotNull NetworkBuffer buffer, T value) { - buffer.writeOptional(optionalType, value); - } + record OptionalType(@NotNull Type parent) implements NetworkBufferTypeImpl<@Nullable T> { + @Override + public void write(@NotNull NetworkBuffer buffer, T value) { + buffer.writeOptional(parent, value); + } - @Override - public T read(@NotNull NetworkBuffer buffer) { - return buffer.readOptional(optionalType); - } - }; + @Override + public T read(@NotNull NetworkBuffer buffer) { + return buffer.readOptional(parent); + } + } + + final class LazyType implements NetworkBufferTypeImpl { + private final @NotNull Supplier> supplier; + private Type type; + + public LazyType(@NotNull Supplier> supplier) { + this.supplier = supplier; + } + + @Override + public void write(@NotNull NetworkBuffer buffer, T value) { + if (type == null) type = supplier.get(); + type.write(buffer, value); + } + + @Override + public T read(@NotNull NetworkBuffer buffer) { + if (type == null) type = supplier.get(); + return null; + } + } + + record MappedType(@NotNull Type parent, @NotNull Function to, @NotNull Function from) implements NetworkBufferTypeImpl { + @Override + public void write(@NotNull NetworkBuffer buffer, S value) { + parent.write(buffer, from.apply(value)); + } + + @Override + public S read(@NotNull NetworkBuffer buffer) { + return to.apply(parent.read(buffer)); + } + } + + record ListType(@NotNull Type parent, int maxSize) implements NetworkBufferTypeImpl> { + @Override + public void write(@NotNull NetworkBuffer buffer, List value) { + buffer.writeCollection(parent, value); + } + + @Override + public List read(@NotNull NetworkBuffer buffer) { + return buffer.readCollection(parent, maxSize); + } + } + + record RegistryTypeType(@NotNull Function> selector) implements NetworkBufferTypeImpl> { + @Override + public void write(@NotNull NetworkBuffer buffer, DynamicRegistry.Key value) { + Check.stateCondition(buffer.registries == null, "Buffer does not have registries"); + final DynamicRegistry registry = selector.apply(buffer.registries); + final int id = registry.getId(value); + Check.argCondition(id == -1, "Key is not registered: {0} > {1}", registry, value); + buffer.write(VAR_INT, id); + } + + @Override + public DynamicRegistry.Key read(@NotNull NetworkBuffer buffer) { + Check.stateCondition(buffer.registries == null, "Buffer does not have registries"); + DynamicRegistry registry = selector.apply(buffer.registries); + final int id = buffer.read(VAR_INT); + final DynamicRegistry.Key key = registry.getKey(id); + Check.argCondition(key == null, "No such ID in registry: {0} > {1}", registry, id); + return key; + } } } diff --git a/src/main/java/net/minestom/server/sound/BuiltinSoundEvent.java b/src/main/java/net/minestom/server/sound/BuiltinSoundEvent.java index 9cfbfd894..25518acb0 100644 --- a/src/main/java/net/minestom/server/sound/BuiltinSoundEvent.java +++ b/src/main/java/net/minestom/server/sound/BuiltinSoundEvent.java @@ -1,6 +1,5 @@ package net.minestom.server.sound; -import net.minestom.server.network.NetworkBuffer; import net.minestom.server.registry.Registry; import net.minestom.server.registry.StaticProtocolObject; import net.minestom.server.utils.NamespaceID; @@ -12,29 +11,6 @@ record BuiltinSoundEvent(NamespaceID namespace, int id) implements StaticProtoco private static final Registry.Container CONTAINER = Registry.createStaticContainer(Registry.Resource.SOUNDS, (namespace, properties) -> new BuiltinSoundEvent(NamespaceID.from(namespace), properties.getInt("id"))); - public static final NetworkBuffer.Type NETWORK_TYPE = new NetworkBuffer.Type<>() { - @Override - public void write(@NotNull NetworkBuffer buffer, SoundEvent value) { - switch (value) { - case BuiltinSoundEvent soundEvent -> buffer.write(NetworkBuffer.VAR_INT, soundEvent.id + 1); - case CustomSoundEvent soundEvent -> { - buffer.write(NetworkBuffer.VAR_INT, 0); // Custom sound - buffer.write(NetworkBuffer.STRING, soundEvent.name()); - buffer.writeOptional(NetworkBuffer.FLOAT, soundEvent.range()); - } - } - } - - @Override - public SoundEvent read(@NotNull NetworkBuffer buffer) { - int id = buffer.read(NetworkBuffer.VAR_INT) - 1; - if (id != -1) return getId(id); - - NamespaceID namespace = NamespaceID.from(buffer.read(NetworkBuffer.STRING)); - return new CustomSoundEvent(namespace, buffer.readOptional(NetworkBuffer.FLOAT)); - } - }; - static SoundEvent get(@NotNull String namespace) { return CONTAINER.get(namespace); } diff --git a/src/main/java/net/minestom/server/sound/SoundEvent.java b/src/main/java/net/minestom/server/sound/SoundEvent.java index 4a6898e43..6228dd5cc 100644 --- a/src/main/java/net/minestom/server/sound/SoundEvent.java +++ b/src/main/java/net/minestom/server/sound/SoundEvent.java @@ -15,8 +15,32 @@ import java.util.Collection; */ public sealed interface SoundEvent extends ProtocolObject, Sound.Type, SoundEvents permits BuiltinSoundEvent, CustomSoundEvent { - @NotNull NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.lazy(() -> BuiltinSoundEvent.NETWORK_TYPE); //todo what is the init issue here?? + @NotNull NetworkBuffer.Type NETWORK_TYPE = new NetworkBuffer.Type<>() { + @Override + public void write(@NotNull NetworkBuffer buffer, SoundEvent value) { + switch (value) { + case BuiltinSoundEvent soundEvent -> buffer.write(NetworkBuffer.VAR_INT, soundEvent.id() + 1); + case CustomSoundEvent soundEvent -> { + buffer.write(NetworkBuffer.VAR_INT, 0); // Custom sound + buffer.write(NetworkBuffer.STRING, soundEvent.name()); + buffer.writeOptional(NetworkBuffer.FLOAT, soundEvent.range()); + } + } + } + @Override + public SoundEvent read(@NotNull NetworkBuffer buffer) { + int id = buffer.read(NetworkBuffer.VAR_INT) - 1; + if (id != -1) return BuiltinSoundEvent.getId(id); + + NamespaceID namespace = NamespaceID.from(buffer.read(NetworkBuffer.STRING)); + return new CustomSoundEvent(namespace, buffer.readOptional(NetworkBuffer.FLOAT)); + } + }; + + /** + * Get all the builtin sound events. Resource pack sounds will never be returned from this method. + */ static @NotNull Collection values() { return BuiltinSoundEvent.values(); }