chore: cleanup networkbuffer additions

This commit is contained in:
mworzala 2024-05-23 17:46:57 -04:00 committed by Matt Worzala
parent f2665be443
commit abf80e597e
20 changed files with 168 additions and 142 deletions

View File

@ -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 -> {

View File

@ -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<DyeColor> NETWORK_TYPE = NetworkBuffer.fromEnum(DyeColor.class);
public static final NetworkBuffer.Type<DyeColor> NETWORK_TYPE = NetworkBuffer.Enum(DyeColor.class);
public static final BinaryTagSerializer<DyeColor> NBT_TYPE = BinaryTagSerializer.fromEnumStringable(DyeColor.class);

View File

@ -55,7 +55,7 @@ public enum RecipeType implements StaticProtocolObject {
DECORATED_POT(NamespaceID.from("minecraft:crafting_decorated_pot"));
public static final NetworkBuffer.Type<RecipeType> NETWORK_TYPE = NetworkBuffer.fromEnum(RecipeType.class);
public static final NetworkBuffer.Type<RecipeType> NETWORK_TYPE = NetworkBuffer.Enum(RecipeType.class);
private final NamespaceID namespace;

View File

@ -148,7 +148,7 @@ public final class Metadata {
}
public static Entry<CatMeta.Variant> 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<DynamicRegistry.Key<WolfMeta.Variant>> WolfVariant(@NotNull DynamicRegistry.Key<WolfMeta.Variant> value) {
@ -158,19 +158,19 @@ public final class Metadata {
// WOLF VARIANT
public static Entry<FrogMeta.Variant> 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<PaintingMeta.Variant> 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<SnifferMeta.State> 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<ArmadilloMeta.State> 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<Point> Vector3(@NotNull Point value) {

View File

@ -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<State> NETWORK_TYPE = NetworkBuffer.Enum(State.class);
}
}

View File

@ -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<Variant> NETWORK_TYPE = NetworkBuffer.Enum(Variant.class);
}
}

View File

@ -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<State> NETWORK_TYPE = NetworkBuffer.Enum(State.class);
}
}

View File

@ -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<Variant> NETWORK_TYPE = NetworkBuffer.Enum(Variant.class);
}
}

View File

@ -62,7 +62,7 @@ public class WolfMeta extends TameableAnimalMeta {
}
public sealed interface Variant extends ProtocolObject, WolfVariants permits VariantImpl {
@NotNull NetworkBuffer.Type<DynamicRegistry.Key<Variant>> NETWORK_TYPE = NetworkBuffer.registryKey(Registries::wolfVariant);
@NotNull NetworkBuffer.Type<DynamicRegistry.Key<Variant>> NETWORK_TYPE = NetworkBuffer.RegistryKey(Registries::wolfVariant);
@NotNull BinaryTagSerializer<DynamicRegistry.Key<Variant>> NBT_TYPE = BinaryTagSerializer.registryKey(Registries::wolfVariant);
static @NotNull Variant create(

View File

@ -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<Variant> NETWORK_TYPE = NetworkBuffer.Enum(Variant.class);
private static final Variant[] VALUES = values();
public static @Nullable Variant fromId(int id) {

View File

@ -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<DynamicRegistry.Key<BannerPattern>> NETWORK_TYPE = NetworkBuffer.registryKey(Registries::bannerPattern);
@NotNull NetworkBuffer.Type<DynamicRegistry.Key<BannerPattern>> NETWORK_TYPE = NetworkBuffer.RegistryKey(Registries::bannerPattern);
@NotNull BinaryTagSerializer<DynamicRegistry.Key<BannerPattern>> NBT_TYPE = BinaryTagSerializer.registryKey(Registries::bannerPattern);
static @NotNull BannerPattern create(

View File

@ -48,7 +48,7 @@ import java.util.Collection;
public sealed interface Material extends StaticProtocolObject, Materials permits MaterialImpl {
NetworkBuffer.Type<Material> NETWORK_TYPE = NetworkBuffer.lazy(() -> MaterialImpl.NETWORK_TYPE);
NetworkBuffer.Type<Material> NETWORK_TYPE = MaterialImpl.NETWORK_TYPE;
BinaryTagSerializer<Material> NBT_TYPE = BinaryTagSerializer.lazy(() -> MaterialImpl.NBT_TYPE);
/**

View File

@ -18,7 +18,7 @@ import java.util.HashMap;
import java.util.Map;
public sealed interface TrimMaterial extends ProtocolObject permits TrimMaterialImpl {
@NotNull NetworkBuffer.Type<DynamicRegistry.Key<TrimMaterial>> NETWORK_TYPE = NetworkBuffer.registryKey(Registries::trimMaterial);
@NotNull NetworkBuffer.Type<DynamicRegistry.Key<TrimMaterial>> NETWORK_TYPE = NetworkBuffer.RegistryKey(Registries::trimMaterial);
@NotNull BinaryTagSerializer<DynamicRegistry.Key<TrimMaterial>> NBT_TYPE = BinaryTagSerializer.registryKey(Registries::trimMaterial);
static @NotNull TrimMaterial create(

View File

@ -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<DynamicRegistry.Key<TrimPattern>> NETWORK_TYPE = NetworkBuffer.registryKey(Registries::trimPattern);
@NotNull NetworkBuffer.Type<DynamicRegistry.Key<TrimPattern>> NETWORK_TYPE = NetworkBuffer.RegistryKey(Registries::trimPattern);
@NotNull BinaryTagSerializer<DynamicRegistry.Key<TrimPattern>> NBT_TYPE = BinaryTagSerializer.registryKey(Registries::trimPattern);
static @NotNull TrimPattern create(

View File

@ -11,6 +11,6 @@ public enum ItemRarity {
private static final ItemRarity[] VALUES = values();
public static final NetworkBuffer.Type<ItemRarity> NETWORK_TYPE = NetworkBuffer.fromEnum(ItemRarity.class);
public static final NetworkBuffer.Type<ItemRarity> NETWORK_TYPE = NetworkBuffer.Enum(ItemRarity.class);
public static final BinaryTagSerializer<ItemRarity> NBT_TYPE = BinaryTagSerializer.fromEnumStringable(ItemRarity.class);
}

View File

@ -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<MapPostProcessing> 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)];
}
};

View File

@ -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<int[]> VAR_INT_ARRAY = new NetworkBufferTypeImpl.VarIntArrayType();
public static final Type<long[]> VAR_LONG_ARRAY = new NetworkBufferTypeImpl.VarLongArrayType();
public static <T extends ProtocolObject> @NotNull Type<DynamicRegistry.Key<T>> RegistryKey(@NotNull Function<Registries, DynamicRegistry<T>> selector) {
return new NetworkBufferTypeImpl.RegistryTypeType<>(selector);
}
// METADATA
public static final Type<Integer> BLOCK_STATE = new NetworkBufferTypeImpl.BlockStateType();
public static final Type<int[]> VILLAGER_DATA = new NetworkBufferTypeImpl.VillagerDataType();
@ -67,64 +66,28 @@ public final class NetworkBuffer {
public static final Type<float[]> QUATERNION = new NetworkBufferTypeImpl.QuaternionType();
public static final Type<Particle> PARTICLE = new NetworkBufferTypeImpl.ParticleType();
public static final Type<Component> OPT_CHAT = NetworkBufferTypeImpl.fromOptional(COMPONENT);
public static final Type<Point> OPT_BLOCK_POSITION = NetworkBufferTypeImpl.fromOptional(BLOCK_POSITION);
public static final Type<UUID> 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> DIRECTION = NetworkBufferTypeImpl.fromEnum(Direction.class);
public static final Type<Entity.Pose> POSE = NetworkBufferTypeImpl.fromEnum(Entity.Pose.class);
public static final Type<Direction> DIRECTION = new NetworkBufferTypeImpl.EnumType<>(Direction.class);
public static final Type<Entity.Pose> POSE = new NetworkBufferTypeImpl.EnumType<>(Entity.Pose.class);
public static final Type<CatMeta.Variant> CAT_VARIANT = NetworkBufferTypeImpl.fromEnum(CatMeta.Variant.class);
public static final Type<FrogMeta.Variant> FROG_VARIANT = NetworkBufferTypeImpl.fromEnum(FrogMeta.Variant.class);
public static final Type<PaintingMeta.Variant> PAINTING_VARIANT = NetworkBufferTypeImpl.fromEnum(PaintingMeta.Variant.class);
public static final Type<SnifferMeta.State> SNIFFER_STATE = NetworkBufferTypeImpl.fromEnum(SnifferMeta.State.class);
public static final Type<ArmadilloMeta.State> ARMADILLO_STATE = NetworkBufferTypeImpl.fromEnum(ArmadilloMeta.State.class);
// Combinators
public static <T extends ProtocolObject> Type<DynamicRegistry.Key<T>> registryKey(@NotNull Function<Registries, DynamicRegistry<T>> selector) {
return new NetworkBuffer.Type<>() {
@Override
public void write(@NotNull NetworkBuffer buffer, DynamicRegistry.Key<T> value) {
Check.stateCondition(buffer.registries == null, "Buffer does not have registries");
final DynamicRegistry<T> 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<T> read(@NotNull NetworkBuffer buffer) {
Check.stateCondition(buffer.registries == null, "Buffer does not have registries");
DynamicRegistry<T> registry = selector.apply(buffer.registries);
final int id = buffer.read(VAR_INT);
final DynamicRegistry.Key<T> key = registry.getKey(id);
Check.argCondition(key == null, "No such ID in registry: {0} > {1}", registry, id);
return key;
}
};
public static <T> @NotNull Type<@Nullable T> Optional(@NotNull Type<T> type) {
return new NetworkBufferTypeImpl.OptionalType<>(type);
}
public static <E extends Enum<E>> Type<E> fromEnum(@NotNull Class<E> enumClass) {
return NetworkBufferTypeImpl.fromEnum(enumClass);
public static <E extends Enum<E>> @NotNull Type<E> Enum(@NotNull Class<E> enumClass) {
return new NetworkBufferTypeImpl.EnumType<>(enumClass);
}
public static <T> Type<T> lazy(@NotNull Supplier<Type<T>> supplier) {
return new NetworkBuffer.Type<>() {
private Type<T> 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 <T> @NotNull Type<T> Lazy(@NotNull Supplier<NetworkBuffer.@NotNull Type<T>> 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 <S> @NotNull Type<S> map(@NotNull Function<T, S> to, @NotNull Function<S, T> from) {
return new Type<S>() {
@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<T>> list(int maxSize) {
return new NetworkBuffer.Type<>() {
@Override
public void write(@NotNull NetworkBuffer buffer, List<T> value) {
buffer.writeCollection(Type.this, value);
}
@Override
public List<T> read(@NotNull NetworkBuffer buffer) {
return buffer.readCollection(Type.this, maxSize);
}
};
return new NetworkBufferTypeImpl.ListType<>(this, maxSize);
}
}

View File

@ -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<T> extends NetworkBuffer.Type<T> {
}
}
static <T extends Enum<?>> NetworkBufferTypeImpl<T> fromEnum(Class<T> 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<E extends Enum<?>>(@NotNull Class<E> enumClass) implements NetworkBufferTypeImpl<E> {
@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 <T> NetworkBufferTypeImpl<T> fromOptional(Type<T> optionalType) {
return new NetworkBufferTypeImpl<>() {
@Override
public void write(@NotNull NetworkBuffer buffer, T value) {
buffer.writeOptional(optionalType, value);
}
record OptionalType<T>(@NotNull Type<T> 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<T> implements NetworkBufferTypeImpl<T> {
private final @NotNull Supplier<NetworkBuffer.@NotNull Type<T>> supplier;
private Type<T> type;
public LazyType(@NotNull Supplier<NetworkBuffer.@NotNull Type<T>> 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<T, S>(@NotNull Type<T> parent, @NotNull Function<T, S> to, @NotNull Function<S, T> from) implements NetworkBufferTypeImpl<S> {
@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<T>(@NotNull Type<T> parent, int maxSize) implements NetworkBufferTypeImpl<List<T>> {
@Override
public void write(@NotNull NetworkBuffer buffer, List<T> value) {
buffer.writeCollection(parent, value);
}
@Override
public List<T> read(@NotNull NetworkBuffer buffer) {
return buffer.readCollection(parent, maxSize);
}
}
record RegistryTypeType<T extends ProtocolObject>(@NotNull Function<Registries, DynamicRegistry<T>> selector) implements NetworkBufferTypeImpl<DynamicRegistry.Key<T>> {
@Override
public void write(@NotNull NetworkBuffer buffer, DynamicRegistry.Key<T> value) {
Check.stateCondition(buffer.registries == null, "Buffer does not have registries");
final DynamicRegistry<T> 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<T> read(@NotNull NetworkBuffer buffer) {
Check.stateCondition(buffer.registries == null, "Buffer does not have registries");
DynamicRegistry<T> registry = selector.apply(buffer.registries);
final int id = buffer.read(VAR_INT);
final DynamicRegistry.Key<T> key = registry.getKey(id);
Check.argCondition(key == null, "No such ID in registry: {0} > {1}", registry, id);
return key;
}
}
}

View File

@ -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<BuiltinSoundEvent> CONTAINER = Registry.createStaticContainer(Registry.Resource.SOUNDS,
(namespace, properties) -> new BuiltinSoundEvent(NamespaceID.from(namespace), properties.getInt("id")));
public static final NetworkBuffer.Type<SoundEvent> 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);
}

View File

@ -15,8 +15,32 @@ import java.util.Collection;
*/
public sealed interface SoundEvent extends ProtocolObject, Sound.Type, SoundEvents permits BuiltinSoundEvent, CustomSoundEvent {
@NotNull NetworkBuffer.Type<SoundEvent> NETWORK_TYPE = NetworkBuffer.lazy(() -> BuiltinSoundEvent.NETWORK_TYPE); //todo what is the init issue here??
@NotNull NetworkBuffer.Type<SoundEvent> 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<? extends SoundEvent> values() {
return BuiltinSoundEvent.values();
}