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..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,21 +1,23 @@ 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 { /** * 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 + * @throws IllegalStateException if hasVariant() returns {@code false} */ - @NotNull Axolotl.Variant getVariant(); /** @@ -23,10 +25,10 @@ public interface AxolotlBucketMeta extends ItemMeta { * * @param variant axolotl variant */ - void setVariant(@NotNull Axolotl.Variant variant); + void setVariant(Axolotl.Variant variant); /** - * Checks for existence of a variant tag 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 @@ -34,6 +36,5 @@ public interface AxolotlBucketMeta extends ItemMeta { boolean hasVariant(); @Override - @NotNull AxolotlBucketMeta clone(); } 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..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 @@ -2,85 +2,99 @@ 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. *

- * Plugins should check that hasVariant() returns true before + * Plugins should check that hasPatternColor() returns {@code true} before * calling this method. * * @return pattern color + * @throws IllegalStateException if no pattern color is set */ - @NotNull DyeColor getPatternColor(); /** * 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 */ - void setPatternColor(@NotNull DyeColor color); + void setPatternColor(DyeColor color); /** * Gets the color of the fish's body. *

- * Plugins should check that hasVariant() returns true before + * Plugins should check that hasBodyColor() returns {@code true} before * calling this method. * * @return pattern color + * @throws IllegalStateException if no body color is set */ - @NotNull DyeColor getBodyColor(); /** * 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 */ - void setBodyColor(@NotNull DyeColor color); + void setBodyColor(DyeColor color); /** * Gets the fish's pattern. *

- * Plugins should check that hasVariant() returns true before + * Plugins should check that hasPattern() returns {@code true} before * calling this method. * * @return pattern + * @throws IllegalStateException if no pattern is set */ - @NotNull TropicalFish.Pattern getPattern(); /** * Sets the fish's pattern. - *

- * Setting this when hasVariant() returns false will initialize - * all other values to unspecified defaults. * * @param pattern new pattern */ - void setPattern(@NotNull TropicalFish.Pattern pattern); + void setPattern(TropicalFish.Pattern pattern); + + /** + * 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(); /** - * 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 + * @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 - @NotNull 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 d1af96d8649e..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 @@ -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); } } @@ -110,13 +122,13 @@ 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]; + 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 4fdd196c0bb6..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 @@ -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,20 +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 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 Integer variant; - private CompoundTag entityTag; - private CompoundTag bucketEntityTag; + private net.minecraft.world.entity.animal.TropicalFish.@Nullable Pattern pattern; + private net.minecraft.world.item.@Nullable DyeColor baseColor; + private net.minecraft.world.item.@Nullable DyeColor patternColor; + + private @Nullable CompoundTag entityTag; + private @Nullable CompoundTag bucketEntityTag; CraftMetaTropicalFishBucket(CraftMetaItem meta) { super(meta); @@ -34,7 +46,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 +58,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 = 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.variant = variant); + this.bucketEntityTag.getInt(CraftMetaTropicalFishBucket.VARIANT.NBT).ifPresent(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) -> { + this.pattern = pattern; + }); + getOrEmpty(tag, CraftMetaTropicalFishBucket.BASE_COLOR).ifPresent((bodyColor) -> { + this.baseColor = bodyColor; + }); + getOrEmpty(tag, CraftMetaTropicalFishBucket.PATTERN_COLOR).ifPresent((patternColor) -> { + this.patternColor = patternColor; }); } @@ -56,8 +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.variant = variant; + 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 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); + if (patternColor != null) { + this.patternColor = net.minecraft.world.item.DyeColor.valueOf(patternColor); + } } } @@ -87,16 +135,18 @@ void applyToItem(CraftMetaItem.Applicator tag) { tag.put(CraftMetaTropicalFishBucket.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(CraftMetaTropicalFishBucket.VARIANT.NBT, this.variant); + if (this.bucketEntityTag != null) { + tag.put(CraftMetaTropicalFishBucket.BUCKET_ENTITY_TAG, CustomData.of(this.bucketEntityTag)); } - if (bucketEntityTag != null) { - tag.put(CraftMetaTropicalFishBucket.BUCKET_ENTITY_TAG, CustomData.of(bucketEntityTag)); + if (this.pattern != null) { + tag.put(CraftMetaTropicalFishBucket.PATTERN, this.pattern); + } + if (this.baseColor != null) { + tag.put(CraftMetaTropicalFishBucket.BASE_COLOR, this.baseColor); + } + if (this.patternColor != null) { + tag.put(CraftMetaTropicalFishBucket.PATTERN_COLOR, this.patternColor); } } @@ -106,54 +156,63 @@ boolean isEmpty() { } boolean isBucketEmpty() { - return !(this.hasVariant() || this.entityTag != null || this.bucketEntityTag != null); + return !(this.hasPattern() || this.hasBodyColor() || this.hasPatternColor() || 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); + Preconditions.checkState(this.hasPatternColor(), "Pattern color is absent, check hasPatternColor first!"); + 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 + Preconditions.checkArgument(color != null, "Pattern color cannot be null!"); + 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); + Preconditions.checkState(this.hasBodyColor(), "Body color is absent, check hasBodyColor first!"); + 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()); + Preconditions.checkArgument(color != null, "Body color cannot be null!"); + 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); + Preconditions.checkState(this.hasPattern(), "Pattern is absent, check hasPattern first!"); + return TropicalFish.Pattern.values()[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); + Preconditions.checkArgument(pattern != null, "Pattern cannot be null!"); + this.pattern = net.minecraft.world.entity.animal.TropicalFish.Pattern.values()[pattern.ordinal()]; + } + + @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 public boolean hasVariant() { - return this.variant != null; + return this.hasPattern() || this.hasBodyColor() || this.hasPatternColor(); } @Override @@ -162,7 +221,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.baseColor, other.baseColor) + && Objects.equals(this.patternColor, other.patternColor) && Objects.equals(this.entityTag, other.entityTag) && Objects.equals(this.bucketEntityTag, other.bucketEntityTag); } @@ -179,8 +240,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.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(); @@ -202,6 +269,9 @@ public CraftMetaTropicalFishBucket clone() { if (this.bucketEntityTag != null) { clone.bucketEntityTag = this.bucketEntityTag.copy(); } + clone.patternColor = this.patternColor; + clone.baseColor = this.baseColor; + clone.pattern = this.pattern; return clone; } @@ -210,8 +280,14 @@ 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.baseColor != null) { + builder.put(CraftMetaTropicalFishBucket.BASE_COLOR.BUKKIT, this.baseColor.name()); + } + if (this.patternColor != null) { + builder.put(CraftMetaTropicalFishBucket.PATTERN_COLOR.BUKKIT, this.patternColor.name()); } return builder;