From afa8f4e96aa335815602308426f9e4d4b9de5622 Mon Sep 17 00:00:00 2001 From: surv <121835328+mesoscopic@users.noreply.github.com> Date: Sat, 30 Nov 2024 15:17:57 -0500 Subject: [PATCH] fix painting variants (#2490) * fix: painting variants are now ordered and sent to the client correctly * fix: use equals() to compare Strings Co-authored-by: mudkip * chore: add comment explaining painting variant check * chore: improve explanation for painting variant exception Proper support for "holder" types like this one should be added later. --------- Co-authored-by: mudkip --- .../minestom/server/entity/metadata/other/PaintingMeta.java | 4 +++- .../net/minestom/server/network/NetworkBufferTypeImpl.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) 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 8922bd510..fa82a1ae0 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 @@ -18,6 +18,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Comparator; public class PaintingMeta extends EntityMeta implements ObjectDataProvider { public static final byte OFFSET = EntityMeta.MAX_OFFSET; @@ -104,7 +105,8 @@ public class PaintingMeta extends EntityMeta implements ObjectDataProvider { static @NotNull DynamicRegistry createDefaultRegistry() { return DynamicRegistry.create( "minecraft:painting_variant", VariantImpl.REGISTRY_NBT_TYPE, Registry.Resource.PAINTING_VARIANTS, - (namespace, props) -> new VariantImpl(Registry.paintingVariant(namespace, props)) + (namespace, props) -> new VariantImpl(Registry.paintingVariant(namespace, props)), + Comparator.naturalOrder() ); } diff --git a/src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java b/src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java index 8a790a79a..c8b2ab9ed 100644 --- a/src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java +++ b/src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java @@ -631,7 +631,9 @@ interface NetworkBufferTypeImpl extends NetworkBuffer.Type { 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); + // Painting variants may be sent in their entirety rather than a registry reference so the ID is offset by 1 to indicate this. + // FIXME: Support sending the entire registry object instead of an ID reference. + final int id = registry.id().equals("minecraft:painting_variant")?registry.getId(value)+1:registry.getId(value); Check.argCondition(id == -1, "Key is not registered: {0} > {1}", registry, value); buffer.write(VAR_INT, id); }