From 532067a18312c482611c4be66870fc8b28ead3e9 Mon Sep 17 00:00:00 2001 From: Doc Date: Tue, 18 Nov 2025 09:46:14 -0300 Subject: [PATCH 1/6] Fix TropicalFishBucketMeta using outdated components --- .../meta/TropicalFishBucketMeta.java | 20 +-- .../CraftMetaTropicalFishBucket.java | 149 +++++++++++++----- 2 files changed, 114 insertions(+), 55 deletions(-) diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java index 268b92e347b7..ad4073711b7e 100644 --- a/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java +++ b/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java @@ -11,9 +11,6 @@ public interface TropicalFishBucketMeta extends ItemMeta { /** * Gets the color of the fish's pattern. - *

- * Plugins should check that hasVariant() returns true before - * calling this method. * * @return pattern color */ @@ -22,9 +19,6 @@ public interface TropicalFishBucketMeta extends ItemMeta { /** * Sets the color of the fish's pattern. - *

- * Setting this when hasVariant() returns false will initialize - * all other values to unspecified defaults. * * @param color pattern color */ @@ -32,9 +26,6 @@ public interface TropicalFishBucketMeta extends ItemMeta { /** * Gets the color of the fish's body. - *

- * Plugins should check that hasVariant() returns true before - * calling this method. * * @return pattern color */ @@ -43,9 +34,6 @@ public interface TropicalFishBucketMeta extends ItemMeta { /** * Sets the color of the fish's body. - *

- * Setting this when hasVariant() returns false will initialize - * all other values to unspecified defaults. * * @param color body color */ @@ -53,9 +41,6 @@ public interface TropicalFishBucketMeta extends ItemMeta { /** * Gets the fish's pattern. - *

- * Plugins should check that hasVariant() returns true before - * calling this method. * * @return pattern */ @@ -64,9 +49,6 @@ public interface TropicalFishBucketMeta extends ItemMeta { /** * Sets the fish's pattern. - *

- * Setting this when hasVariant() returns false will initialize - * all other values to unspecified defaults. * * @param pattern new pattern */ @@ -77,7 +59,9 @@ public interface TropicalFishBucketMeta extends ItemMeta { * spawned. * * @return if there is a variant + * @deprecated The colors and pattern are separate components now */ + @Deprecated(forRemoval = true, since = "1.21.10") boolean hasVariant(); @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java index 4fdd196c0bb6..bfa85fe1cd0a 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java @@ -19,11 +19,17 @@ @DelegateDeserialization(SerializableMeta.class) class CraftMetaTropicalFishBucket extends CraftMetaItem implements TropicalFishBucketMeta { + @Deprecated static final ItemMetaKey VARIANT = new ItemMetaKey("BucketVariantTag", "fish-variant"); + static final ItemMetaKeyType PATTERN = new ItemMetaKeyType<>(DataComponents.TROPICAL_FISH_PATTERN, "fish-pattern"); + static final ItemMetaKeyType BASE_COLOR = new ItemMetaKeyType<>(DataComponents.TROPICAL_FISH_BASE_COLOR, "fish-base-color"); + static final ItemMetaKeyType PATTERN_COLOR = new ItemMetaKeyType<>(DataComponents.TROPICAL_FISH_PATTERN_COLOR, "fish-pattern-color"); static final ItemMetaKeyType>> ENTITY_TAG = new ItemMetaKeyType<>(DataComponents.ENTITY_DATA, "entity-tag"); static final ItemMetaKeyType BUCKET_ENTITY_TAG = new ItemMetaKeyType<>(DataComponents.BUCKET_ENTITY_DATA, "bucket-entity-tag"); - private Integer variant; + private net.minecraft.world.entity.animal.TropicalFish.Pattern pattern; + private net.minecraft.world.item.DyeColor baseColor; + private net.minecraft.world.item.DyeColor patternColor; private CompoundTag entityTag; private CompoundTag bucketEntityTag; @@ -34,7 +40,9 @@ class CraftMetaTropicalFishBucket extends CraftMetaItem implements TropicalFishB return; } - this.variant = tropicalFishBucketMeta.variant; + this.pattern = tropicalFishBucketMeta.pattern; + this.baseColor = tropicalFishBucketMeta.baseColor; + this.patternColor = tropicalFishBucketMeta.patternColor; this.entityTag = tropicalFishBucketMeta.entityTag; this.bucketEntityTag = tropicalFishBucketMeta.bucketEntityTag; } @@ -44,11 +52,28 @@ class CraftMetaTropicalFishBucket extends CraftMetaItem implements TropicalFishB getOrEmpty(tag, CraftMetaTropicalFishBucket.ENTITY_TAG).ifPresent((nbt) -> { this.entityTag = nbt.copyTagWithEntityId(); - this.entityTag.getInt(CraftMetaTropicalFishBucket.VARIANT.NBT).ifPresent(variant -> this.variant = variant); + this.entityTag.getInt(CraftMetaTropicalFishBucket.VARIANT.NBT).ifPresent(variant -> { + this.pattern = getPattern(variant); + this.baseColor = getBaseColor(variant); + this.patternColor = getPatternColor(variant); + }); }); getOrEmpty(tag, CraftMetaTropicalFishBucket.BUCKET_ENTITY_TAG).ifPresent((nbt) -> { this.bucketEntityTag = nbt.copyTag(); - this.bucketEntityTag.getInt(CraftMetaTropicalFishBucket.VARIANT.NBT).ifPresent(variant -> this.variant = variant); + this.bucketEntityTag.getInt(CraftMetaTropicalFishBucket.VARIANT.NBT).ifPresent(variant -> { + this.pattern = getPattern(variant); + this.baseColor = getBaseColor(variant); + this.patternColor = getPatternColor(variant); + }); + }); + getOrEmpty(tag, CraftMetaTropicalFishBucket.PATTERN).ifPresent((pattern) -> { + this.pattern = pattern; + }); + getOrEmpty(tag, CraftMetaTropicalFishBucket.BASE_COLOR).ifPresent((bodyColor) -> { + this.baseColor = bodyColor; + }); + getOrEmpty(tag, CraftMetaTropicalFishBucket.PATTERN_COLOR).ifPresent((patternColor) -> { + this.patternColor = patternColor; }); } @@ -57,7 +82,24 @@ class CraftMetaTropicalFishBucket extends CraftMetaItem implements TropicalFishB Integer variant = SerializableMeta.getObject(Integer.class, map, CraftMetaTropicalFishBucket.VARIANT.BUKKIT, true); if (variant != null) { - this.variant = variant; + this.pattern = getPattern(variant); + this.baseColor = getBaseColor(variant); + this.patternColor = getPatternColor(variant); + } + + String pattern = SerializableMeta.getString(map, CraftMetaTropicalFishBucket.PATTERN.BUKKIT, true); + if (pattern != null) { + this.setPattern(TropicalFish.Pattern.valueOf(pattern)); + } + + String bodyColor = SerializableMeta.getString(map, CraftMetaTropicalFishBucket.BASE_COLOR.BUKKIT, true); + if (bodyColor != null) { + this.setBodyColor(DyeColor.valueOf(bodyColor)); + } + + String patternColor = SerializableMeta.getString(map, CraftMetaTropicalFishBucket.PATTERN_COLOR.BUKKIT, true); + if (patternColor != null) { + this.setPatternColor(DyeColor.valueOf(patternColor)); } } @@ -88,16 +130,20 @@ void applyToItem(CraftMetaItem.Applicator tag) { } CompoundTag bucketEntityTag = (this.bucketEntityTag != null) ? this.bucketEntityTag.copy() : null; - if (this.hasVariant()) { - if (bucketEntityTag == null) { - bucketEntityTag = new CompoundTag(); - } - bucketEntityTag.putInt(CraftMetaTropicalFishBucket.VARIANT.NBT, this.variant); - } - if (bucketEntityTag != null) { tag.put(CraftMetaTropicalFishBucket.BUCKET_ENTITY_TAG, CustomData.of(bucketEntityTag)); } + + if (this.pattern != null) { + tag.put(CraftMetaTropicalFishBucket.PATTERN, this.pattern); + } + if (this.patternColor != null) { + tag.put(CraftMetaTropicalFishBucket.PATTERN_COLOR, this.patternColor); + } + if (this.baseColor != null) { + tag.put(CraftMetaTropicalFishBucket.BASE_COLOR, this.baseColor); + } + } @Override @@ -106,54 +152,42 @@ boolean isEmpty() { } boolean isBucketEmpty() { - return !(this.hasVariant() || this.entityTag != null || this.bucketEntityTag != null); + return !(this.pattern != null || this.entityTag != null || this.bucketEntityTag != null); } @Override public DyeColor getPatternColor() { - com.google.common.base.Preconditions.checkState(this.hasVariant(), "This bucket doesn't have variant, check hasVariant first!"); - return CraftTropicalFish.getPatternColor(this.variant); + return DyeColor.values()[this.patternColor.ordinal()]; } @Override public void setPatternColor(DyeColor color) { - if (this.variant == null) { - this.variant = 0; - } - this.variant = CraftTropicalFish.getData(color, this.getBodyColor(), this.getPattern()); // Paper - properly set tropical fish pattern color without mutating body color + this.patternColor = net.minecraft.world.item.DyeColor.byId(color.ordinal()); } @Override public DyeColor getBodyColor() { - com.google.common.base.Preconditions.checkState(this.hasVariant(), "This bucket doesn't have variant, check hasVariant first!"); - return CraftTropicalFish.getBodyColor(this.variant); + return DyeColor.values()[this.baseColor.ordinal()]; } @Override public void setBodyColor(DyeColor color) { - if (this.variant == null) { - this.variant = 0; - } - this.variant = CraftTropicalFish.getData(this.getPatternColor(), color, this.getPattern()); + this.baseColor = net.minecraft.world.item.DyeColor.byId(color.ordinal()); } @Override public TropicalFish.Pattern getPattern() { - com.google.common.base.Preconditions.checkState(this.hasVariant(), "This bucket doesn't have variant, check hasVariant first!"); - return CraftTropicalFish.getPattern(this.variant); + return CraftTropicalFish.getPattern(this.pattern.ordinal()); } @Override public void setPattern(TropicalFish.Pattern pattern) { - if (this.variant == null) { - this.variant = 0; - } - this.variant = CraftTropicalFish.getData(this.getPatternColor(), this.getBodyColor(), pattern); + this.pattern = net.minecraft.world.entity.animal.TropicalFish.Pattern.values()[pattern.ordinal()]; } @Override public boolean hasVariant() { - return this.variant != null; + return this.pattern != null; } @Override @@ -162,7 +196,9 @@ boolean equalsCommon(CraftMetaItem meta) { return false; } if (meta instanceof final CraftMetaTropicalFishBucket other) { - return Objects.equals(this.variant, other.variant) + return Objects.equals(this.pattern, other.pattern) + && Objects.equals(this.patternColor, other.patternColor) + && Objects.equals(this.baseColor, other.baseColor) && Objects.equals(this.entityTag, other.entityTag) && Objects.equals(this.bucketEntityTag, other.bucketEntityTag); } @@ -179,8 +215,14 @@ int applyHash() { final int original; int hash = original = super.applyHash(); - if (this.hasVariant()) { - hash = 61 * hash + this.variant; + if (this.pattern != null) { + hash = 61 * hash + this.pattern.hashCode(); + } + if (this.patternColor != null) { + hash = 61 * hash + this.patternColor.hashCode(); + } + if (this.baseColor != null) { + hash = 61 * hash + this.baseColor.hashCode(); } if (this.entityTag != null) { hash = 61 * hash + this.entityTag.hashCode(); @@ -202,6 +244,15 @@ public CraftMetaTropicalFishBucket clone() { if (this.bucketEntityTag != null) { clone.bucketEntityTag = this.bucketEntityTag.copy(); } + if (this.patternColor != null) { + clone.patternColor = this.patternColor; + } + if (this.baseColor != null) { + clone.baseColor = this.baseColor; + } + if (this.pattern != null) { + clone.pattern = this.pattern; + } return clone; } @@ -210,10 +261,34 @@ public CraftMetaTropicalFishBucket clone() { ImmutableMap.Builder serialize(ImmutableMap.Builder builder) { super.serialize(builder); - if (this.hasVariant()) { - builder.put(CraftMetaTropicalFishBucket.VARIANT.BUKKIT, this.variant); + if (this.pattern != null) { + builder.put(CraftMetaTropicalFishBucket.PATTERN.BUKKIT, this.pattern.name()); + } + if (this.patternColor != null) { + builder.put(CraftMetaTropicalFishBucket.PATTERN_COLOR.BUKKIT, this.patternColor.name()); + } + if (this.baseColor != null) { + builder.put(CraftMetaTropicalFishBucket.BASE_COLOR.BUKKIT, this.baseColor.name()); } return builder; } + + private static net.minecraft.world.item.DyeColor getBaseColor(int variant) { + final int id = variant >> 16 & 0xFF; + return net.minecraft.world.item.DyeColor.byId(id); + } + + private static net.minecraft.world.item.DyeColor getPatternColor(int variant) { + final int id = variant >> 24 & 0xFF; + return net.minecraft.world.item.DyeColor.byId(id); + } + + private static net.minecraft.world.entity.animal.TropicalFish.Pattern getPattern(int variant) { + final int id = variant & 65535; + if (id == 0) { + return net.minecraft.world.entity.animal.TropicalFish.Pattern.KOB; + } + return net.minecraft.world.entity.animal.TropicalFish.Pattern.byId(id); + } } From c5bbf61f4991727e6f4f1757f88f5161e8cdf8ce Mon Sep 17 00:00:00 2001 From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Date: Tue, 18 Nov 2025 21:54:35 +0100 Subject: [PATCH 2/6] update axolotl meta --- .../inventory/meta/AxolotlBucketMeta.java | 5 +- .../meta/TropicalFishBucketMeta.java | 2 +- .../inventory/CraftMetaAxolotlBucket.java | 59 +++++---- .../craftbukkit/inventory/CraftMetaItem.java | 4 +- .../CraftMetaTropicalFishBucket.java | 115 ++++++++---------- 5 files changed, 91 insertions(+), 94 deletions(-) diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java index f7d457ab1e67..c68ba20a7a42 100644 --- a/paper-api/src/main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java +++ b/paper-api/src/main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java @@ -11,8 +11,9 @@ public interface AxolotlBucketMeta extends ItemMeta { /** * Get the variant of the axolotl in the bucket. *

- * Plugins should check that hasVariant() returns true before + * Plugins should check that hasVariant() returns {@code true} before * calling this method. + * * @return axolotl variant */ @NotNull @@ -26,7 +27,7 @@ public interface AxolotlBucketMeta extends ItemMeta { void setVariant(@NotNull Axolotl.Variant variant); /** - * Checks for existence of a variant tag indicating a specific axolotl will be + * Checks for existence of a variant indicating a specific axolotl will be * spawned. * * @return if there is a variant diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java index ad4073711b7e..c389937d924f 100644 --- a/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java +++ b/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java @@ -59,7 +59,7 @@ public interface TropicalFishBucketMeta extends ItemMeta { * spawned. * * @return if there is a variant - * @deprecated The colors and pattern are separate components now + * @deprecated the variant tag is no longer used and instead split into its own set of components */ @Deprecated(forRemoval = true, since = "1.21.10") boolean hasVariant(); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaAxolotlBucket.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaAxolotlBucket.java index d1af96d8649e..244ac33734db 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaAxolotlBucket.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaAxolotlBucket.java @@ -13,17 +13,24 @@ import org.bukkit.configuration.serialization.DelegateDeserialization; import org.bukkit.entity.Axolotl; import org.bukkit.inventory.meta.AxolotlBucketMeta; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @DelegateDeserialization(SerializableMeta.class) public class CraftMetaAxolotlBucket extends CraftMetaItem implements AxolotlBucketMeta { + @Deprecated static final ItemMetaKey VARIANT = new ItemMetaKey("Variant", "axolotl-variant"); + static final ItemMetaKeyType>> ENTITY_TAG = new ItemMetaKeyType<>(DataComponents.ENTITY_DATA, "entity-tag"); static final ItemMetaKeyType BUCKET_ENTITY_TAG = new ItemMetaKeyType<>(DataComponents.BUCKET_ENTITY_DATA, "bucket-entity-tag"); - private Integer variant; - private CompoundTag entityTag; - private CompoundTag bucketEntityTag; + static final ItemMetaKeyType AXOLOTL_VARIANT = new ItemMetaKeyType<>(DataComponents.AXOLOTL_VARIANT, "axolotl-variant"); + + private net.minecraft.world.entity.animal.axolotl.Axolotl.@Nullable Variant variant; + private @Nullable CompoundTag entityTag; + private @Nullable CompoundTag bucketEntityTag; CraftMetaAxolotlBucket(CraftMetaItem meta) { super(meta); @@ -42,20 +49,29 @@ public class CraftMetaAxolotlBucket extends CraftMetaItem implements AxolotlBuck getOrEmpty(tag, CraftMetaAxolotlBucket.ENTITY_TAG).ifPresent((nbt) -> { this.entityTag = nbt.copyTagWithEntityId(); - this.entityTag.getInt(CraftMetaAxolotlBucket.VARIANT.NBT).ifPresent(variant -> this.variant = variant); + this.entityTag.getInt(CraftMetaAxolotlBucket.VARIANT.NBT).ifPresent(variantId -> { + this.variant = net.minecraft.world.entity.animal.axolotl.Axolotl.Variant.byId(variantId); + }); }); getOrEmpty(tag, CraftMetaAxolotlBucket.BUCKET_ENTITY_TAG).ifPresent((nbt) -> { this.bucketEntityTag = nbt.copyTag(); - this.bucketEntityTag.getInt(CraftMetaAxolotlBucket.VARIANT.NBT).ifPresent(variant -> this.variant = variant); + this.bucketEntityTag.getInt(CraftMetaAxolotlBucket.VARIANT.NBT).ifPresent(variantId -> { + this.variant = net.minecraft.world.entity.animal.axolotl.Axolotl.Variant.byId(variantId); + }); + }); + getOrEmpty(tag, CraftMetaAxolotlBucket.AXOLOTL_VARIANT).ifPresent((variant) -> { + this.variant = variant; }); } CraftMetaAxolotlBucket(Map map) { super(map); - Integer variant = SerializableMeta.getObject(Integer.class, map, CraftMetaAxolotlBucket.VARIANT.BUKKIT, true); - if (variant != null) { - this.variant = variant; + Object variant = SerializableMeta.getObject(Object.class, map, CraftMetaAxolotlBucket.AXOLOTL_VARIANT.BUKKIT, true); + if (variant instanceof String variantName) { + this.variant = net.minecraft.world.entity.animal.axolotl.Axolotl.Variant.valueOf(variantName); + } else if (variant instanceof Integer variantId) { // legacy + this.variant = net.minecraft.world.entity.animal.axolotl.Axolotl.Variant.byId(variantId); } } @@ -85,16 +101,12 @@ void applyToItem(CraftMetaItem.Applicator tag) { tag.put(CraftMetaAxolotlBucket.ENTITY_TAG, TypedEntityData.decodeEntity(this.entityTag)); } - CompoundTag bucketEntityTag = (this.bucketEntityTag != null) ? this.bucketEntityTag.copy() : null; - if (this.hasVariant()) { - if (bucketEntityTag == null) { - bucketEntityTag = new CompoundTag(); - } - bucketEntityTag.putInt(CraftMetaAxolotlBucket.VARIANT.NBT, this.variant); + if (this.bucketEntityTag != null) { + tag.put(CraftMetaAxolotlBucket.BUCKET_ENTITY_TAG, CustomData.of(this.bucketEntityTag)); } - if (bucketEntityTag != null) { - tag.put(CraftMetaAxolotlBucket.BUCKET_ENTITY_TAG, CustomData.of(bucketEntityTag)); + if (this.variant != null) { + tag.put(CraftMetaAxolotlBucket.AXOLOTL_VARIANT, this.variant); } } @@ -109,14 +121,14 @@ boolean isBucketEmpty() { @Override public Axolotl.Variant getVariant() { - com.google.common.base.Preconditions.checkState(this.hasVariant(), "Variant is absent, check hasVariant first!"); - return Axolotl.Variant.values()[this.variant]; + com.google.common.base.Preconditions.checkState(this.variant != null, "Variant is absent, check hasVariant first!"); + return Axolotl.Variant.values()[this.variant.ordinal()]; } @Override public void setVariant(Axolotl.Variant variant) { com.google.common.base.Preconditions.checkArgument(variant != null, "Variant cannot be null!"); - this.variant = variant.ordinal(); + this.variant = net.minecraft.world.entity.animal.axolotl.Axolotl.Variant.byId(variant.ordinal()); } @Override @@ -147,8 +159,8 @@ int applyHash() { final int original; int hash = original = super.applyHash(); - if (this.hasVariant()) { - hash = 61 * hash + this.variant; + if (this.variant != null) { + hash = 61 * hash + this.variant.hashCode(); } if (this.entityTag != null) { hash = 61 * hash + this.entityTag.hashCode(); @@ -170,6 +182,7 @@ public CraftMetaAxolotlBucket clone() { if (this.bucketEntityTag != null) { clone.bucketEntityTag = this.bucketEntityTag.copy(); } + clone.variant = this.variant; return clone; } @@ -178,8 +191,8 @@ public CraftMetaAxolotlBucket clone() { ImmutableMap.Builder serialize(ImmutableMap.Builder builder) { super.serialize(builder); - if (this.hasVariant()) { - builder.put(CraftMetaAxolotlBucket.VARIANT.BUKKIT, this.variant); + if (this.variant != null) { + builder.put(CraftMetaAxolotlBucket.AXOLOTL_VARIANT.BUKKIT, this.variant.name()); } return builder; diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java index c0f44885f4dc..6ba547cd2256 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java @@ -2436,7 +2436,7 @@ public static Set> getTopLevelHandledDcts(final Class, Set>> map = new HashMap<>(); map.put(CraftMetaArmor.class, Set.of(CraftMetaArmor.TRIM.TYPE)); map.put(CraftMetaArmorStand.class, Set.of(CraftMetaArmorStand.ENTITY_TAG.TYPE)); - map.put(CraftMetaAxolotlBucket.class, Set.of(CraftMetaAxolotlBucket.ENTITY_TAG.TYPE, CraftMetaAxolotlBucket.BUCKET_ENTITY_TAG.TYPE)); + map.put(CraftMetaAxolotlBucket.class, Set.of(CraftMetaAxolotlBucket.ENTITY_TAG.TYPE, CraftMetaAxolotlBucket.BUCKET_ENTITY_TAG.TYPE, CraftMetaAxolotlBucket.AXOLOTL_VARIANT.TYPE)); map.put(CraftMetaBanner.class, Set.of(CraftMetaBanner.PATTERNS.TYPE)); // banner uses same tag as block state map.put(CraftMetaShield.class, Set.of(CraftMetaShield.BASE_COLOR.TYPE, CraftMetaBanner.PATTERNS.TYPE)); map.put(CraftMetaBlockState.class, Set.of(CraftMetaBlockState.BLOCK_ENTITY_TAG.TYPE)); @@ -2459,7 +2459,7 @@ public static Set> getTopLevelHandledDcts(final Class, Set>> entry : map.entrySet()) { final ArrayList> topLevelTags = new ArrayList<>(entry.getValue()); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java index bfa85fe1cd0a..c4f1ce09b160 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.inventory; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import java.util.Map; import java.util.Objects; @@ -12,26 +13,31 @@ import net.minecraft.world.item.component.TypedEntityData; import org.bukkit.DyeColor; import org.bukkit.configuration.serialization.DelegateDeserialization; -import org.bukkit.craftbukkit.entity.CraftTropicalFish; import org.bukkit.entity.TropicalFish; import org.bukkit.inventory.meta.TropicalFishBucketMeta; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @DelegateDeserialization(SerializableMeta.class) class CraftMetaTropicalFishBucket extends CraftMetaItem implements TropicalFishBucketMeta { @Deprecated static final ItemMetaKey VARIANT = new ItemMetaKey("BucketVariantTag", "fish-variant"); + static final ItemMetaKeyType PATTERN = new ItemMetaKeyType<>(DataComponents.TROPICAL_FISH_PATTERN, "fish-pattern"); - static final ItemMetaKeyType BASE_COLOR = new ItemMetaKeyType<>(DataComponents.TROPICAL_FISH_BASE_COLOR, "fish-base-color"); static final ItemMetaKeyType PATTERN_COLOR = new ItemMetaKeyType<>(DataComponents.TROPICAL_FISH_PATTERN_COLOR, "fish-pattern-color"); + static final ItemMetaKeyType BASE_COLOR = new ItemMetaKeyType<>(DataComponents.TROPICAL_FISH_BASE_COLOR, "fish-base-color"); + static final ItemMetaKeyType>> ENTITY_TAG = new ItemMetaKeyType<>(DataComponents.ENTITY_DATA, "entity-tag"); static final ItemMetaKeyType BUCKET_ENTITY_TAG = new ItemMetaKeyType<>(DataComponents.BUCKET_ENTITY_DATA, "bucket-entity-tag"); - private net.minecraft.world.entity.animal.TropicalFish.Pattern pattern; - private net.minecraft.world.item.DyeColor baseColor; - private net.minecraft.world.item.DyeColor patternColor; - private CompoundTag entityTag; - private CompoundTag bucketEntityTag; + private net.minecraft.world.entity.animal.TropicalFish.@Nullable Pattern pattern; + private net.minecraft.world.item.@Nullable DyeColor patternColor; + private net.minecraft.world.item.@Nullable DyeColor baseColor; + + private @Nullable CompoundTag entityTag; + private @Nullable CompoundTag bucketEntityTag; CraftMetaTropicalFishBucket(CraftMetaItem meta) { super(meta); @@ -53,17 +59,17 @@ class CraftMetaTropicalFishBucket extends CraftMetaItem implements TropicalFishB getOrEmpty(tag, CraftMetaTropicalFishBucket.ENTITY_TAG).ifPresent((nbt) -> { this.entityTag = nbt.copyTagWithEntityId(); this.entityTag.getInt(CraftMetaTropicalFishBucket.VARIANT.NBT).ifPresent(variant -> { - this.pattern = getPattern(variant); - this.baseColor = getBaseColor(variant); - this.patternColor = getPatternColor(variant); + this.pattern = net.minecraft.world.entity.animal.TropicalFish.getPattern(variant); + this.baseColor = net.minecraft.world.entity.animal.TropicalFish.getBaseColor(variant); + this.patternColor = net.minecraft.world.entity.animal.TropicalFish.getPatternColor(variant); }); }); getOrEmpty(tag, CraftMetaTropicalFishBucket.BUCKET_ENTITY_TAG).ifPresent((nbt) -> { this.bucketEntityTag = nbt.copyTag(); this.bucketEntityTag.getInt(CraftMetaTropicalFishBucket.VARIANT.NBT).ifPresent(variant -> { - this.pattern = getPattern(variant); - this.baseColor = getBaseColor(variant); - this.patternColor = getPatternColor(variant); + this.pattern = net.minecraft.world.entity.animal.TropicalFish.getPattern(variant); + this.baseColor = net.minecraft.world.entity.animal.TropicalFish.getBaseColor(variant); + this.patternColor = net.minecraft.world.entity.animal.TropicalFish.getPatternColor(variant); }); }); getOrEmpty(tag, CraftMetaTropicalFishBucket.PATTERN).ifPresent((pattern) -> { @@ -81,25 +87,25 @@ class CraftMetaTropicalFishBucket extends CraftMetaItem implements TropicalFishB super(map); Integer variant = SerializableMeta.getObject(Integer.class, map, CraftMetaTropicalFishBucket.VARIANT.BUKKIT, true); - if (variant != null) { - this.pattern = getPattern(variant); - this.baseColor = getBaseColor(variant); - this.patternColor = getPatternColor(variant); - } - - String pattern = SerializableMeta.getString(map, CraftMetaTropicalFishBucket.PATTERN.BUKKIT, true); - if (pattern != null) { - this.setPattern(TropicalFish.Pattern.valueOf(pattern)); - } - - String bodyColor = SerializableMeta.getString(map, CraftMetaTropicalFishBucket.BASE_COLOR.BUKKIT, true); - if (bodyColor != null) { - this.setBodyColor(DyeColor.valueOf(bodyColor)); - } - - String patternColor = SerializableMeta.getString(map, CraftMetaTropicalFishBucket.PATTERN_COLOR.BUKKIT, true); - if (patternColor != null) { - this.setPatternColor(DyeColor.valueOf(patternColor)); + if (variant != null) { // legacy + this.pattern = net.minecraft.world.entity.animal.TropicalFish.getPattern(variant); + this.baseColor = net.minecraft.world.entity.animal.TropicalFish.getBaseColor(variant); + this.patternColor = net.minecraft.world.entity.animal.TropicalFish.getPatternColor(variant); + } else { + String pattern = SerializableMeta.getString(map, CraftMetaTropicalFishBucket.PATTERN.BUKKIT, true); + if (pattern != null) { + this.pattern = net.minecraft.world.entity.animal.TropicalFish.Pattern.valueOf(pattern); + } + + String bodyColor = SerializableMeta.getString(map, CraftMetaTropicalFishBucket.BASE_COLOR.BUKKIT, true); + if (bodyColor != null) { + this.baseColor = net.minecraft.world.item.DyeColor.valueOf(bodyColor); + } + + String patternColor = SerializableMeta.getString(map, CraftMetaTropicalFishBucket.PATTERN_COLOR.BUKKIT, true); + if (patternColor != null) { + this.patternColor = net.minecraft.world.item.DyeColor.valueOf(patternColor); + } } } @@ -129,9 +135,8 @@ void applyToItem(CraftMetaItem.Applicator tag) { tag.put(CraftMetaTropicalFishBucket.ENTITY_TAG, TypedEntityData.decodeEntity(this.entityTag)); } - CompoundTag bucketEntityTag = (this.bucketEntityTag != null) ? this.bucketEntityTag.copy() : null; - if (bucketEntityTag != null) { - tag.put(CraftMetaTropicalFishBucket.BUCKET_ENTITY_TAG, CustomData.of(bucketEntityTag)); + if (this.bucketEntityTag != null) { + tag.put(CraftMetaTropicalFishBucket.BUCKET_ENTITY_TAG, CustomData.of(this.bucketEntityTag)); } if (this.pattern != null) { @@ -143,7 +148,6 @@ void applyToItem(CraftMetaItem.Applicator tag) { if (this.baseColor != null) { tag.put(CraftMetaTropicalFishBucket.BASE_COLOR, this.baseColor); } - } @Override @@ -152,11 +156,12 @@ boolean isEmpty() { } boolean isBucketEmpty() { - return !(this.pattern != null || this.entityTag != null || this.bucketEntityTag != null); + return !(this.hasVariant() || this.entityTag != null || this.bucketEntityTag != null); } @Override public DyeColor getPatternColor() { + Preconditions.checkState(this.patternColor != null); // todo nullable? return DyeColor.values()[this.patternColor.ordinal()]; } @@ -167,6 +172,7 @@ public void setPatternColor(DyeColor color) { @Override public DyeColor getBodyColor() { + Preconditions.checkState(this.baseColor != null); return DyeColor.values()[this.baseColor.ordinal()]; } @@ -177,7 +183,8 @@ public void setBodyColor(DyeColor color) { @Override public TropicalFish.Pattern getPattern() { - return CraftTropicalFish.getPattern(this.pattern.ordinal()); + Preconditions.checkState(this.pattern != null); + return TropicalFish.Pattern.values()[this.pattern.ordinal()]; } @Override @@ -187,7 +194,7 @@ public void setPattern(TropicalFish.Pattern pattern) { @Override public boolean hasVariant() { - return this.pattern != null; + return this.pattern != null || this.patternColor != null || this.baseColor != null; } @Override @@ -244,15 +251,9 @@ public CraftMetaTropicalFishBucket clone() { if (this.bucketEntityTag != null) { clone.bucketEntityTag = this.bucketEntityTag.copy(); } - if (this.patternColor != null) { - clone.patternColor = this.patternColor; - } - if (this.baseColor != null) { - clone.baseColor = this.baseColor; - } - if (this.pattern != null) { - clone.pattern = this.pattern; - } + clone.patternColor = this.patternColor; + clone.baseColor = this.baseColor; + clone.pattern = this.pattern; return clone; } @@ -273,22 +274,4 @@ ImmutableMap.Builder serialize(ImmutableMap.Builder> 16 & 0xFF; - return net.minecraft.world.item.DyeColor.byId(id); - } - - private static net.minecraft.world.item.DyeColor getPatternColor(int variant) { - final int id = variant >> 24 & 0xFF; - return net.minecraft.world.item.DyeColor.byId(id); - } - - private static net.minecraft.world.entity.animal.TropicalFish.Pattern getPattern(int variant) { - final int id = variant & 65535; - if (id == 0) { - return net.minecraft.world.entity.animal.TropicalFish.Pattern.KOB; - } - return net.minecraft.world.entity.animal.TropicalFish.Pattern.byId(id); - } } From c4333a58daaa1424fa848f0ac8db9276349e2c9d Mon Sep 17 00:00:00 2001 From: Doc Date: Tue, 18 Nov 2025 22:22:31 -0300 Subject: [PATCH 3/6] Minor docs change for AxolotlBucketMeta --- .../main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java index c68ba20a7a42..df48e1b59310 100644 --- a/paper-api/src/main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java +++ b/paper-api/src/main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java @@ -27,7 +27,7 @@ public interface AxolotlBucketMeta extends ItemMeta { void setVariant(@NotNull Axolotl.Variant variant); /** - * Checks for existence of a variant indicating a specific axolotl will be + * Checks for the existence of a variant indicating a specific axolotl will be * spawned. * * @return if there is a variant From 4c45756161c3844d7ef557beaecbb1486824d2cd Mon Sep 17 00:00:00 2001 From: Doc Date: Tue, 18 Nov 2025 22:25:40 -0300 Subject: [PATCH 4/6] Add has methods for states in TropicalFishBucketMeta --- .../meta/TropicalFishBucketMeta.java | 39 ++++++++++++++----- .../CraftMetaTropicalFishBucket.java | 28 ++++++++++--- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java index c389937d924f..4bc65e48e43d 100644 --- a/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java +++ b/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java @@ -2,19 +2,20 @@ import org.bukkit.DyeColor; import org.bukkit.entity.TropicalFish; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * Represents a bucket of tropical fish. */ +@NullMarked public interface TropicalFishBucketMeta extends ItemMeta { /** * Gets the color of the fish's pattern. * * @return pattern color + * @throws IllegalStateException if no pattern color is set */ - @NotNull DyeColor getPatternColor(); /** @@ -22,14 +23,14 @@ public interface TropicalFishBucketMeta extends ItemMeta { * * @param color pattern color */ - void setPatternColor(@NotNull DyeColor color); + void setPatternColor(DyeColor color); /** * Gets the color of the fish's body. * * @return pattern color + * @throws IllegalStateException if no body color is set */ - @NotNull DyeColor getBodyColor(); /** @@ -37,14 +38,14 @@ public interface TropicalFishBucketMeta extends ItemMeta { * * @param color body color */ - void setBodyColor(@NotNull DyeColor color); + void setBodyColor(DyeColor color); /** * Gets the fish's pattern. * * @return pattern + * @throws IllegalStateException if no pattern is set */ - @NotNull TropicalFish.Pattern getPattern(); /** @@ -52,10 +53,10 @@ public interface TropicalFishBucketMeta extends ItemMeta { * * @param pattern new pattern */ - void setPattern(@NotNull TropicalFish.Pattern pattern); + void setPattern(TropicalFish.Pattern pattern); /** - * Checks for existence of a variant tag indicating a specific fish will be + * Checks for the existence of a variant tag indicating a specific fish will be * spawned. * * @return if there is a variant @@ -64,7 +65,27 @@ public interface TropicalFishBucketMeta extends ItemMeta { @Deprecated(forRemoval = true, since = "1.21.10") boolean hasVariant(); + /** + * Checks for the existence of a pattern. + * + * @return if there is a pattern + */ + boolean hasPattern(); + + /** + * Checks for the existence of a body color. + * + * @return if there is a body color + */ + boolean hasBodyColor(); + + /** + * Checks for the existence of a pattern color. + * + * @return if there is a pattern color + */ + boolean hasPatternColor(); + @Override - @NotNull TropicalFishBucketMeta clone(); } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java index c4f1ce09b160..0badfa1ce173 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java @@ -156,45 +156,63 @@ boolean isEmpty() { } boolean isBucketEmpty() { - return !(this.hasVariant() || this.entityTag != null || this.bucketEntityTag != null); + return !(this.hasPattern() || this.hasPatternColor() || this.hasBodyColor() || this.entityTag != null || this.bucketEntityTag != null); } @Override public DyeColor getPatternColor() { - Preconditions.checkState(this.patternColor != null); // todo nullable? + Preconditions.checkState(this.hasPatternColor()); return DyeColor.values()[this.patternColor.ordinal()]; } @Override public void setPatternColor(DyeColor color) { + Preconditions.checkArgument(color != null, "Pattern color cannot be null!"); this.patternColor = net.minecraft.world.item.DyeColor.byId(color.ordinal()); } @Override public DyeColor getBodyColor() { - Preconditions.checkState(this.baseColor != null); + Preconditions.checkState(this.hasBodyColor()); return DyeColor.values()[this.baseColor.ordinal()]; } @Override public void setBodyColor(DyeColor color) { + Preconditions.checkArgument(color != null, "Body color cannot be null!"); this.baseColor = net.minecraft.world.item.DyeColor.byId(color.ordinal()); } @Override public TropicalFish.Pattern getPattern() { - Preconditions.checkState(this.pattern != null); + Preconditions.checkState(this.hasPattern()); return TropicalFish.Pattern.values()[this.pattern.ordinal()]; } @Override public void setPattern(TropicalFish.Pattern pattern) { + Preconditions.checkArgument(pattern != null, "Pattern cannot be null!"); this.pattern = net.minecraft.world.entity.animal.TropicalFish.Pattern.values()[pattern.ordinal()]; } @Override public boolean hasVariant() { - return this.pattern != null || this.patternColor != null || this.baseColor != null; + return this.hasPattern() || this.hasPatternColor() || this.hasBodyColor(); + } + + @Override + public boolean hasPattern() { + return this.pattern != null; + } + + @Override + public boolean hasBodyColor() { + return this.baseColor != null; + } + + @Override + public boolean hasPatternColor() { + return this.patternColor != null; } @Override From 168407ca1fa2da29f15f9064d41edde05ae54c7b Mon Sep 17 00:00:00 2001 From: Doc Date: Tue, 18 Nov 2025 22:28:19 -0300 Subject: [PATCH 5/6] NullMarked AxolotlBucketMeta --- .../java/org/bukkit/inventory/meta/AxolotlBucketMeta.java | 8 ++++---- .../craftbukkit/inventory/CraftMetaAxolotlBucket.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java index df48e1b59310..37fea0eeef1a 100644 --- a/paper-api/src/main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java +++ b/paper-api/src/main/java/org/bukkit/inventory/meta/AxolotlBucketMeta.java @@ -1,11 +1,12 @@ package org.bukkit.inventory.meta; import org.bukkit.entity.Axolotl; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * Represents a bucket of axolotl. */ +@NullMarked public interface AxolotlBucketMeta extends ItemMeta { /** @@ -15,8 +16,8 @@ public interface AxolotlBucketMeta extends ItemMeta { * calling this method. * * @return axolotl variant + * @throws IllegalStateException if hasVariant() returns {@code false} */ - @NotNull Axolotl.Variant getVariant(); /** @@ -24,7 +25,7 @@ public interface AxolotlBucketMeta extends ItemMeta { * * @param variant axolotl variant */ - void setVariant(@NotNull Axolotl.Variant variant); + void setVariant(Axolotl.Variant variant); /** * Checks for the existence of a variant indicating a specific axolotl will be @@ -35,6 +36,5 @@ public interface AxolotlBucketMeta extends ItemMeta { boolean hasVariant(); @Override - @NotNull AxolotlBucketMeta clone(); } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaAxolotlBucket.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaAxolotlBucket.java index 244ac33734db..d774a5a23502 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaAxolotlBucket.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaAxolotlBucket.java @@ -121,7 +121,7 @@ boolean isBucketEmpty() { @Override public Axolotl.Variant getVariant() { - com.google.common.base.Preconditions.checkState(this.variant != null, "Variant is absent, check hasVariant first!"); + com.google.common.base.Preconditions.checkState(this.hasVariant(), "Variant is absent, check hasVariant first!"); return Axolotl.Variant.values()[this.variant.ordinal()]; } @@ -143,8 +143,8 @@ boolean equalsCommon(CraftMetaItem meta) { } if (meta instanceof final CraftMetaAxolotlBucket other) { return Objects.equals(this.variant, other.variant) - && Objects.equals(this.entityTag, other.entityTag) - && Objects.equals(this.bucketEntityTag, other.bucketEntityTag); + && Objects.equals(this.entityTag, other.entityTag) + && Objects.equals(this.bucketEntityTag, other.bucketEntityTag); } return true; } From fef4e8067ba4724563beac4c8d703a4e8fd2cea5 Mon Sep 17 00:00:00 2001 From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Date: Thu, 20 Nov 2025 18:56:27 +0100 Subject: [PATCH 6/6] update javadoc --- .../meta/TropicalFishBucketMeta.java | 29 ++++++++---- .../inventory/CraftMetaAxolotlBucket.java | 4 +- .../CraftMetaTropicalFishBucket.java | 46 +++++++++---------- 3 files changed, 44 insertions(+), 35 deletions(-) diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java index 4bc65e48e43d..55fcadd548ab 100644 --- a/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java +++ b/paper-api/src/main/java/org/bukkit/inventory/meta/TropicalFishBucketMeta.java @@ -12,6 +12,9 @@ public interface TropicalFishBucketMeta extends ItemMeta { /** * Gets the color of the fish's pattern. + *

+ * Plugins should check that hasPatternColor() returns {@code true} before + * calling this method. * * @return pattern color * @throws IllegalStateException if no pattern color is set @@ -27,6 +30,9 @@ public interface TropicalFishBucketMeta extends ItemMeta { /** * Gets the color of the fish's body. + *

+ * Plugins should check that hasBodyColor() returns {@code true} before + * calling this method. * * @return pattern color * @throws IllegalStateException if no body color is set @@ -42,6 +48,9 @@ public interface TropicalFishBucketMeta extends ItemMeta { /** * Gets the fish's pattern. + *

+ * Plugins should check that hasPattern() returns {@code true} before + * calling this method. * * @return pattern * @throws IllegalStateException if no pattern is set @@ -55,16 +64,6 @@ public interface TropicalFishBucketMeta extends ItemMeta { */ void setPattern(TropicalFish.Pattern pattern); - /** - * Checks for the existence of a variant tag indicating a specific fish will be - * spawned. - * - * @return if there is a variant - * @deprecated the variant tag is no longer used and instead split into its own set of components - */ - @Deprecated(forRemoval = true, since = "1.21.10") - boolean hasVariant(); - /** * Checks for the existence of a pattern. * @@ -86,6 +85,16 @@ public interface TropicalFishBucketMeta extends ItemMeta { */ boolean hasPatternColor(); + /** + * Checks for the existence of a variant tag indicating a specific fish will be + * spawned. + * + * @return if there is a variant + * @deprecated the variant tag is no longer used and instead split into its own set of components + */ + @Deprecated(forRemoval = true, since = "1.21.10") + boolean hasVariant(); + @Override TropicalFishBucketMeta clone(); } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaAxolotlBucket.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaAxolotlBucket.java index d774a5a23502..a93e2c5258d5 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaAxolotlBucket.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaAxolotlBucket.java @@ -143,8 +143,8 @@ boolean equalsCommon(CraftMetaItem meta) { } if (meta instanceof final CraftMetaAxolotlBucket other) { return Objects.equals(this.variant, other.variant) - && Objects.equals(this.entityTag, other.entityTag) - && Objects.equals(this.bucketEntityTag, other.bucketEntityTag); + && Objects.equals(this.entityTag, other.entityTag) + && Objects.equals(this.bucketEntityTag, other.bucketEntityTag); } return true; } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java index 0badfa1ce173..2036788d31bf 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java @@ -33,8 +33,8 @@ class CraftMetaTropicalFishBucket extends CraftMetaItem implements TropicalFishB static final ItemMetaKeyType BUCKET_ENTITY_TAG = new ItemMetaKeyType<>(DataComponents.BUCKET_ENTITY_DATA, "bucket-entity-tag"); private net.minecraft.world.entity.animal.TropicalFish.@Nullable Pattern pattern; - private net.minecraft.world.item.@Nullable DyeColor patternColor; private net.minecraft.world.item.@Nullable DyeColor baseColor; + private net.minecraft.world.item.@Nullable DyeColor patternColor; private @Nullable CompoundTag entityTag; private @Nullable CompoundTag bucketEntityTag; @@ -97,9 +97,9 @@ class CraftMetaTropicalFishBucket extends CraftMetaItem implements TropicalFishB this.pattern = net.minecraft.world.entity.animal.TropicalFish.Pattern.valueOf(pattern); } - String bodyColor = SerializableMeta.getString(map, CraftMetaTropicalFishBucket.BASE_COLOR.BUKKIT, true); - if (bodyColor != null) { - this.baseColor = net.minecraft.world.item.DyeColor.valueOf(bodyColor); + String baseColor = SerializableMeta.getString(map, CraftMetaTropicalFishBucket.BASE_COLOR.BUKKIT, true); + if (baseColor != null) { + this.baseColor = net.minecraft.world.item.DyeColor.valueOf(baseColor); } String patternColor = SerializableMeta.getString(map, CraftMetaTropicalFishBucket.PATTERN_COLOR.BUKKIT, true); @@ -142,12 +142,12 @@ void applyToItem(CraftMetaItem.Applicator tag) { if (this.pattern != null) { tag.put(CraftMetaTropicalFishBucket.PATTERN, this.pattern); } - if (this.patternColor != null) { - tag.put(CraftMetaTropicalFishBucket.PATTERN_COLOR, this.patternColor); - } if (this.baseColor != null) { tag.put(CraftMetaTropicalFishBucket.BASE_COLOR, this.baseColor); } + if (this.patternColor != null) { + tag.put(CraftMetaTropicalFishBucket.PATTERN_COLOR, this.patternColor); + } } @Override @@ -156,12 +156,12 @@ boolean isEmpty() { } boolean isBucketEmpty() { - return !(this.hasPattern() || this.hasPatternColor() || this.hasBodyColor() || this.entityTag != null || this.bucketEntityTag != null); + return !(this.hasPattern() || this.hasBodyColor() || this.hasPatternColor() || this.entityTag != null || this.bucketEntityTag != null); } @Override public DyeColor getPatternColor() { - Preconditions.checkState(this.hasPatternColor()); + Preconditions.checkState(this.hasPatternColor(), "Pattern color is absent, check hasPatternColor first!"); return DyeColor.values()[this.patternColor.ordinal()]; } @@ -173,7 +173,7 @@ public void setPatternColor(DyeColor color) { @Override public DyeColor getBodyColor() { - Preconditions.checkState(this.hasBodyColor()); + Preconditions.checkState(this.hasBodyColor(), "Body color is absent, check hasBodyColor first!"); return DyeColor.values()[this.baseColor.ordinal()]; } @@ -185,7 +185,7 @@ public void setBodyColor(DyeColor color) { @Override public TropicalFish.Pattern getPattern() { - Preconditions.checkState(this.hasPattern()); + Preconditions.checkState(this.hasPattern(), "Pattern is absent, check hasPattern first!"); return TropicalFish.Pattern.values()[this.pattern.ordinal()]; } @@ -195,11 +195,6 @@ public void setPattern(TropicalFish.Pattern pattern) { this.pattern = net.minecraft.world.entity.animal.TropicalFish.Pattern.values()[pattern.ordinal()]; } - @Override - public boolean hasVariant() { - return this.hasPattern() || this.hasPatternColor() || this.hasBodyColor(); - } - @Override public boolean hasPattern() { return this.pattern != null; @@ -215,6 +210,11 @@ public boolean hasPatternColor() { return this.patternColor != null; } + @Override + public boolean hasVariant() { + return this.hasPattern() || this.hasBodyColor() || this.hasPatternColor(); + } + @Override boolean equalsCommon(CraftMetaItem meta) { if (!super.equalsCommon(meta)) { @@ -222,8 +222,8 @@ boolean equalsCommon(CraftMetaItem meta) { } if (meta instanceof final CraftMetaTropicalFishBucket other) { return Objects.equals(this.pattern, other.pattern) - && Objects.equals(this.patternColor, other.patternColor) && Objects.equals(this.baseColor, other.baseColor) + && Objects.equals(this.patternColor, other.patternColor) && Objects.equals(this.entityTag, other.entityTag) && Objects.equals(this.bucketEntityTag, other.bucketEntityTag); } @@ -243,12 +243,12 @@ int applyHash() { if (this.pattern != null) { hash = 61 * hash + this.pattern.hashCode(); } - if (this.patternColor != null) { - hash = 61 * hash + this.patternColor.hashCode(); - } if (this.baseColor != null) { hash = 61 * hash + this.baseColor.hashCode(); } + if (this.patternColor != null) { + hash = 61 * hash + this.patternColor.hashCode(); + } if (this.entityTag != null) { hash = 61 * hash + this.entityTag.hashCode(); } @@ -283,12 +283,12 @@ ImmutableMap.Builder serialize(ImmutableMap.Builder