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 ext
final Map, 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 ext
map.put(CraftMetaSkull.class, Set.of(CraftMetaSkull.SKULL_PROFILE.TYPE, CraftMetaSkull.NOTE_BLOCK_SOUND.TYPE));
map.put(CraftMetaSpawnEgg.class, Set.of(CraftMetaSpawnEgg.ENTITY_TAG.TYPE));
map.put(CraftMetaSuspiciousStew.class, Set.of(CraftMetaSuspiciousStew.EFFECTS.TYPE));
- map.put(CraftMetaTropicalFishBucket.class, Set.of(CraftMetaTropicalFishBucket.ENTITY_TAG.TYPE, CraftMetaTropicalFishBucket.BUCKET_ENTITY_TAG.TYPE));
+ map.put(CraftMetaTropicalFishBucket.class, Set.of(CraftMetaTropicalFishBucket.ENTITY_TAG.TYPE, CraftMetaTropicalFishBucket.BUCKET_ENTITY_TAG.TYPE, CraftMetaTropicalFishBucket.PATTERN.TYPE, CraftMetaTropicalFishBucket.PATTERN_COLOR.TYPE, CraftMetaTropicalFishBucket.BASE_COLOR.TYPE));
for (final Map.Entry, 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;