mirror of
https://github.com/PaperMC/Paper.git
synced 2025-03-10 13:49:11 +01:00
#1147: Add experimental armor trim API
By: Parker Hawke <hawkeboyz2@hotmail.com>
This commit is contained in:
parent
ad3da9dbf3
commit
6c852e65e7
@ -14,9 +14,13 @@ import org.bukkit.NamespacedKey;
|
|||||||
import org.bukkit.Registry;
|
import org.bukkit.Registry;
|
||||||
import org.bukkit.craftbukkit.generator.strucutre.CraftStructure;
|
import org.bukkit.craftbukkit.generator.strucutre.CraftStructure;
|
||||||
import org.bukkit.craftbukkit.generator.strucutre.CraftStructureType;
|
import org.bukkit.craftbukkit.generator.strucutre.CraftStructureType;
|
||||||
|
import org.bukkit.craftbukkit.inventory.trim.CraftTrimMaterial;
|
||||||
|
import org.bukkit.craftbukkit.inventory.trim.CraftTrimPattern;
|
||||||
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
|
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
|
||||||
import org.bukkit.generator.structure.Structure;
|
import org.bukkit.generator.structure.Structure;
|
||||||
import org.bukkit.generator.structure.StructureType;
|
import org.bukkit.generator.structure.StructureType;
|
||||||
|
import org.bukkit.inventory.meta.trim.TrimMaterial;
|
||||||
|
import org.bukkit.inventory.meta.trim.TrimPattern;
|
||||||
|
|
||||||
public class CraftRegistry<B extends Keyed, M> implements Registry<B> {
|
public class CraftRegistry<B extends Keyed, M> implements Registry<B> {
|
||||||
|
|
||||||
@ -27,6 +31,12 @@ public class CraftRegistry<B extends Keyed, M> implements Registry<B> {
|
|||||||
if (bukkitClass == StructureType.class) {
|
if (bukkitClass == StructureType.class) {
|
||||||
return new CraftRegistry<>(BuiltInRegistries.STRUCTURE_TYPE, CraftStructureType::new);
|
return new CraftRegistry<>(BuiltInRegistries.STRUCTURE_TYPE, CraftStructureType::new);
|
||||||
}
|
}
|
||||||
|
if (bukkitClass == TrimMaterial.class) {
|
||||||
|
return new CraftRegistry<>(registryHolder.registryOrThrow(Registries.TRIM_MATERIAL), CraftTrimMaterial::new);
|
||||||
|
}
|
||||||
|
if (bukkitClass == TrimPattern.class) {
|
||||||
|
return new CraftRegistry<>(registryHolder.registryOrThrow(Registries.TRIM_PATTERN), CraftTrimPattern::new);
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -79,11 +79,34 @@ public final class CraftItemFactory implements ItemFactory {
|
|||||||
case ZOMBIE_HEAD:
|
case ZOMBIE_HEAD:
|
||||||
case ZOMBIE_WALL_HEAD:
|
case ZOMBIE_WALL_HEAD:
|
||||||
return meta instanceof CraftMetaSkull ? meta : new CraftMetaSkull(meta);
|
return meta instanceof CraftMetaSkull ? meta : new CraftMetaSkull(meta);
|
||||||
|
case CHAINMAIL_HELMET:
|
||||||
|
case CHAINMAIL_CHESTPLATE:
|
||||||
|
case CHAINMAIL_LEGGINGS:
|
||||||
|
case CHAINMAIL_BOOTS:
|
||||||
|
case DIAMOND_HELMET:
|
||||||
|
case DIAMOND_CHESTPLATE:
|
||||||
|
case DIAMOND_LEGGINGS:
|
||||||
|
case DIAMOND_BOOTS:
|
||||||
|
case GOLDEN_HELMET:
|
||||||
|
case GOLDEN_CHESTPLATE:
|
||||||
|
case GOLDEN_LEGGINGS:
|
||||||
|
case GOLDEN_BOOTS:
|
||||||
|
case IRON_HELMET:
|
||||||
|
case IRON_CHESTPLATE:
|
||||||
|
case IRON_LEGGINGS:
|
||||||
|
case IRON_BOOTS:
|
||||||
|
case NETHERITE_HELMET:
|
||||||
|
case NETHERITE_CHESTPLATE:
|
||||||
|
case NETHERITE_LEGGINGS:
|
||||||
|
case NETHERITE_BOOTS:
|
||||||
|
case TURTLE_HELMET:
|
||||||
|
return meta != null && meta.getClass().equals(CraftMetaArmor.class) ? meta : new CraftMetaArmor(meta);
|
||||||
case LEATHER_HELMET:
|
case LEATHER_HELMET:
|
||||||
case LEATHER_HORSE_ARMOR:
|
|
||||||
case LEATHER_CHESTPLATE:
|
case LEATHER_CHESTPLATE:
|
||||||
case LEATHER_LEGGINGS:
|
case LEATHER_LEGGINGS:
|
||||||
case LEATHER_BOOTS:
|
case LEATHER_BOOTS:
|
||||||
|
return meta instanceof CraftMetaColorableArmor ? meta : new CraftMetaColorableArmor(meta);
|
||||||
|
case LEATHER_HORSE_ARMOR:
|
||||||
return meta instanceof CraftMetaLeatherArmor ? meta : new CraftMetaLeatherArmor(meta);
|
return meta instanceof CraftMetaLeatherArmor ? meta : new CraftMetaLeatherArmor(meta);
|
||||||
case POTION:
|
case POTION:
|
||||||
case SPLASH_POTION:
|
case SPLASH_POTION:
|
||||||
|
@ -342,11 +342,34 @@ public final class CraftItemStack extends ItemStack {
|
|||||||
case ZOMBIE_HEAD:
|
case ZOMBIE_HEAD:
|
||||||
case ZOMBIE_WALL_HEAD:
|
case ZOMBIE_WALL_HEAD:
|
||||||
return new CraftMetaSkull(item.getTag());
|
return new CraftMetaSkull(item.getTag());
|
||||||
|
case CHAINMAIL_HELMET:
|
||||||
|
case CHAINMAIL_CHESTPLATE:
|
||||||
|
case CHAINMAIL_LEGGINGS:
|
||||||
|
case CHAINMAIL_BOOTS:
|
||||||
|
case DIAMOND_HELMET:
|
||||||
|
case DIAMOND_CHESTPLATE:
|
||||||
|
case DIAMOND_LEGGINGS:
|
||||||
|
case DIAMOND_BOOTS:
|
||||||
|
case GOLDEN_HELMET:
|
||||||
|
case GOLDEN_CHESTPLATE:
|
||||||
|
case GOLDEN_LEGGINGS:
|
||||||
|
case GOLDEN_BOOTS:
|
||||||
|
case IRON_HELMET:
|
||||||
|
case IRON_CHESTPLATE:
|
||||||
|
case IRON_LEGGINGS:
|
||||||
|
case IRON_BOOTS:
|
||||||
|
case NETHERITE_HELMET:
|
||||||
|
case NETHERITE_CHESTPLATE:
|
||||||
|
case NETHERITE_LEGGINGS:
|
||||||
|
case NETHERITE_BOOTS:
|
||||||
|
case TURTLE_HELMET:
|
||||||
|
return new CraftMetaArmor(item.getTag());
|
||||||
case LEATHER_HELMET:
|
case LEATHER_HELMET:
|
||||||
case LEATHER_HORSE_ARMOR:
|
|
||||||
case LEATHER_CHESTPLATE:
|
case LEATHER_CHESTPLATE:
|
||||||
case LEATHER_LEGGINGS:
|
case LEATHER_LEGGINGS:
|
||||||
case LEATHER_BOOTS:
|
case LEATHER_BOOTS:
|
||||||
|
return new CraftMetaColorableArmor(item.getTag());
|
||||||
|
case LEATHER_HORSE_ARMOR:
|
||||||
return new CraftMetaLeatherArmor(item.getTag());
|
return new CraftMetaLeatherArmor(item.getTag());
|
||||||
case POTION:
|
case POTION:
|
||||||
case SPLASH_POTION:
|
case SPLASH_POTION:
|
||||||
|
@ -0,0 +1,194 @@
|
|||||||
|
package org.bukkit.craftbukkit.inventory;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap.Builder;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
|
import org.bukkit.Registry;
|
||||||
|
import org.bukkit.configuration.serialization.DelegateDeserialization;
|
||||||
|
import org.bukkit.inventory.meta.ArmorMeta;
|
||||||
|
import org.bukkit.inventory.meta.trim.ArmorTrim;
|
||||||
|
import org.bukkit.inventory.meta.trim.TrimMaterial;
|
||||||
|
import org.bukkit.inventory.meta.trim.TrimPattern;
|
||||||
|
|
||||||
|
@DelegateDeserialization(CraftMetaItem.SerializableMeta.class)
|
||||||
|
public class CraftMetaArmor extends CraftMetaItem implements ArmorMeta {
|
||||||
|
|
||||||
|
private static final Set<Material> ARMOR_MATERIALS = Sets.newHashSet(
|
||||||
|
Material.CHAINMAIL_HELMET,
|
||||||
|
Material.CHAINMAIL_CHESTPLATE,
|
||||||
|
Material.CHAINMAIL_LEGGINGS,
|
||||||
|
Material.CHAINMAIL_BOOTS,
|
||||||
|
Material.DIAMOND_HELMET,
|
||||||
|
Material.DIAMOND_CHESTPLATE,
|
||||||
|
Material.DIAMOND_LEGGINGS,
|
||||||
|
Material.DIAMOND_BOOTS,
|
||||||
|
Material.GOLDEN_HELMET,
|
||||||
|
Material.GOLDEN_CHESTPLATE,
|
||||||
|
Material.GOLDEN_LEGGINGS,
|
||||||
|
Material.GOLDEN_BOOTS,
|
||||||
|
Material.IRON_HELMET,
|
||||||
|
Material.IRON_CHESTPLATE,
|
||||||
|
Material.IRON_LEGGINGS,
|
||||||
|
Material.IRON_BOOTS,
|
||||||
|
Material.LEATHER_HELMET,
|
||||||
|
Material.LEATHER_CHESTPLATE,
|
||||||
|
Material.LEATHER_LEGGINGS,
|
||||||
|
Material.LEATHER_BOOTS,
|
||||||
|
Material.NETHERITE_HELMET,
|
||||||
|
Material.NETHERITE_CHESTPLATE,
|
||||||
|
Material.NETHERITE_LEGGINGS,
|
||||||
|
Material.NETHERITE_BOOTS,
|
||||||
|
Material.TURTLE_HELMET
|
||||||
|
);
|
||||||
|
|
||||||
|
static final ItemMetaKey TRIM = new ItemMetaKey("Trim", "trim");
|
||||||
|
static final ItemMetaKey TRIM_MATERIAL = new ItemMetaKey("material");
|
||||||
|
static final ItemMetaKey TRIM_PATTERN = new ItemMetaKey("pattern");
|
||||||
|
|
||||||
|
private ArmorTrim trim;
|
||||||
|
|
||||||
|
CraftMetaArmor(CraftMetaItem meta) {
|
||||||
|
super(meta);
|
||||||
|
|
||||||
|
if (meta instanceof CraftMetaArmor armorMeta) {
|
||||||
|
this.trim = armorMeta.trim;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CraftMetaArmor(NBTTagCompound tag) {
|
||||||
|
super(tag);
|
||||||
|
|
||||||
|
if (tag.contains(TRIM.NBT)) {
|
||||||
|
NBTTagCompound trimCompound = tag.getCompound(TRIM.NBT);
|
||||||
|
|
||||||
|
if (trimCompound.contains(TRIM_MATERIAL.NBT) && trimCompound.contains(TRIM_PATTERN.NBT)) {
|
||||||
|
TrimMaterial trimMaterial = Registry.TRIM_MATERIAL.get(NamespacedKey.fromString(trimCompound.getString(TRIM_MATERIAL.NBT)));
|
||||||
|
TrimPattern trimPattern = Registry.TRIM_PATTERN.get(NamespacedKey.fromString(trimCompound.getString(TRIM_PATTERN.NBT)));
|
||||||
|
|
||||||
|
this.trim = new ArmorTrim(trimMaterial, trimPattern);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CraftMetaArmor(Map<String, Object> map) {
|
||||||
|
super(map);
|
||||||
|
|
||||||
|
Map<?, ?> trimData = SerializableMeta.getObject(Map.class, map, TRIM.BUKKIT, true);
|
||||||
|
if (trimData != null) {
|
||||||
|
String materialKeyString = SerializableMeta.getString(trimData, TRIM_MATERIAL.BUKKIT, true);
|
||||||
|
String patternKeyString = SerializableMeta.getString(trimData, TRIM_PATTERN.BUKKIT, true);
|
||||||
|
|
||||||
|
if (materialKeyString != null && patternKeyString != null) {
|
||||||
|
NamespacedKey materialKey = NamespacedKey.fromString(materialKeyString);
|
||||||
|
NamespacedKey patternKey = NamespacedKey.fromString(patternKeyString);
|
||||||
|
|
||||||
|
if (materialKey != null && patternKey != null) {
|
||||||
|
TrimMaterial trimMaterial = Registry.TRIM_MATERIAL.get(materialKey);
|
||||||
|
TrimPattern trimPattern = Registry.TRIM_PATTERN.get(patternKey);
|
||||||
|
|
||||||
|
if (trimMaterial != null && trimPattern != null) {
|
||||||
|
this.trim = new ArmorTrim(trimMaterial, trimPattern);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void applyToItem(NBTTagCompound itemTag) {
|
||||||
|
super.applyToItem(itemTag);
|
||||||
|
|
||||||
|
if (hasTrim()) {
|
||||||
|
NBTTagCompound trimCompound = new NBTTagCompound();
|
||||||
|
trimCompound.putString(TRIM_MATERIAL.NBT, trim.getMaterial().getKey().toString());
|
||||||
|
trimCompound.putString(TRIM_PATTERN.NBT, trim.getPattern().getKey().toString());
|
||||||
|
itemTag.put(TRIM.NBT, trimCompound);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean applicableTo(Material type) {
|
||||||
|
return ARMOR_MATERIALS.contains(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean equalsCommon(CraftMetaItem that) {
|
||||||
|
if (!super.equalsCommon(that)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (that instanceof CraftMetaArmor armorMeta) {
|
||||||
|
return Objects.equals(trim, armorMeta.trim);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean notUncommon(CraftMetaItem meta) {
|
||||||
|
return super.notUncommon(meta) && (meta instanceof CraftMetaArmor || isArmorEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean isEmpty() {
|
||||||
|
return super.isEmpty() && isArmorEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isArmorEmpty() {
|
||||||
|
return !hasTrim();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
int applyHash() {
|
||||||
|
final int original;
|
||||||
|
int hash = original = super.applyHash();
|
||||||
|
|
||||||
|
if (hasTrim()) {
|
||||||
|
hash = 61 * hash + trim.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
return original != hash ? CraftMetaArmor.class.hashCode() ^ hash : hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CraftMetaArmor clone() {
|
||||||
|
CraftMetaArmor meta = (CraftMetaArmor) super.clone();
|
||||||
|
meta.trim = this.trim;
|
||||||
|
return meta;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Builder<String, Object> serialize(Builder<String, Object> builder) {
|
||||||
|
super.serialize(builder);
|
||||||
|
|
||||||
|
if (hasTrim()) {
|
||||||
|
Map<String, String> trimData = new HashMap<>();
|
||||||
|
trimData.put(TRIM_MATERIAL.BUKKIT, trim.getMaterial().getKey().toString());
|
||||||
|
trimData.put(TRIM_PATTERN.BUKKIT, trim.getPattern().getKey().toString());
|
||||||
|
builder.put(TRIM.BUKKIT, trimData);
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasTrim() {
|
||||||
|
return trim != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTrim(ArmorTrim trim) {
|
||||||
|
this.trim = trim;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArmorTrim getTrim() {
|
||||||
|
return trim;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,118 @@
|
|||||||
|
package org.bukkit.craftbukkit.inventory;
|
||||||
|
|
||||||
|
import static org.bukkit.craftbukkit.inventory.CraftItemFactory.*;
|
||||||
|
import com.google.common.collect.ImmutableMap.Builder;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import org.bukkit.Color;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.configuration.serialization.DelegateDeserialization;
|
||||||
|
import org.bukkit.inventory.meta.ColorableArmorMeta;
|
||||||
|
|
||||||
|
@DelegateDeserialization(CraftMetaItem.SerializableMeta.class)
|
||||||
|
public class CraftMetaColorableArmor extends CraftMetaArmor implements ColorableArmorMeta {
|
||||||
|
|
||||||
|
private static final Set<Material> LEATHER_ARMOR_MATERIALS = Sets.newHashSet(
|
||||||
|
Material.LEATHER_HELMET,
|
||||||
|
Material.LEATHER_CHESTPLATE,
|
||||||
|
Material.LEATHER_LEGGINGS,
|
||||||
|
Material.LEATHER_BOOTS
|
||||||
|
);
|
||||||
|
|
||||||
|
private Color color = DEFAULT_LEATHER_COLOR;
|
||||||
|
|
||||||
|
CraftMetaColorableArmor(CraftMetaItem meta) {
|
||||||
|
super(meta);
|
||||||
|
CraftMetaLeatherArmor.readColor(this, meta);
|
||||||
|
}
|
||||||
|
|
||||||
|
CraftMetaColorableArmor(NBTTagCompound tag) {
|
||||||
|
super(tag);
|
||||||
|
CraftMetaLeatherArmor.readColor(this, tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
CraftMetaColorableArmor(Map<String, Object> map) {
|
||||||
|
super(map);
|
||||||
|
CraftMetaLeatherArmor.readColor(this, map);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void applyToItem(NBTTagCompound itemTag) {
|
||||||
|
super.applyToItem(itemTag);
|
||||||
|
CraftMetaLeatherArmor.applyColor(this, itemTag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean isEmpty() {
|
||||||
|
return super.isEmpty() && isLeatherArmorEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isLeatherArmorEmpty() {
|
||||||
|
return !(hasColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean applicableTo(Material type) {
|
||||||
|
return LEATHER_ARMOR_MATERIALS.contains(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CraftMetaColorableArmor clone() {
|
||||||
|
CraftMetaColorableArmor clone = (CraftMetaColorableArmor) super.clone();
|
||||||
|
clone.color = this.color;
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Color getColor() {
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setColor(Color color) {
|
||||||
|
this.color = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean hasColor() {
|
||||||
|
return CraftMetaLeatherArmor.hasColor(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Builder<String, Object> serialize(Builder<String, Object> builder) {
|
||||||
|
super.serialize(builder);
|
||||||
|
|
||||||
|
CraftMetaLeatherArmor.serialize(this, builder);
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean equalsCommon(CraftMetaItem meta) {
|
||||||
|
if (!super.equalsCommon(meta)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (meta instanceof CraftMetaColorableArmor) {
|
||||||
|
CraftMetaColorableArmor that = (CraftMetaColorableArmor) meta;
|
||||||
|
|
||||||
|
return color.equals(that.color);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean notUncommon(CraftMetaItem meta) {
|
||||||
|
return super.notUncommon(meta) && (meta instanceof CraftMetaColorableArmor || isLeatherArmorEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
int applyHash() {
|
||||||
|
final int original;
|
||||||
|
int hash = original = super.applyHash();
|
||||||
|
if (hasColor()) {
|
||||||
|
hash ^= color.hashCode();
|
||||||
|
}
|
||||||
|
return original != hash ? CraftMetaColorableArmor.class.hashCode() ^ hash : hash;
|
||||||
|
}
|
||||||
|
}
|
@ -137,6 +137,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
|||||||
|
|
||||||
static {
|
static {
|
||||||
classMap = ImmutableMap.<Class<? extends CraftMetaItem>, String>builder()
|
classMap = ImmutableMap.<Class<? extends CraftMetaItem>, String>builder()
|
||||||
|
.put(CraftMetaArmor.class, "ARMOR")
|
||||||
.put(CraftMetaArmorStand.class, "ARMOR_STAND")
|
.put(CraftMetaArmorStand.class, "ARMOR_STAND")
|
||||||
.put(CraftMetaBanner.class, "BANNER")
|
.put(CraftMetaBanner.class, "BANNER")
|
||||||
.put(CraftMetaBlockState.class, "TILE_ENTITY")
|
.put(CraftMetaBlockState.class, "TILE_ENTITY")
|
||||||
@ -144,6 +145,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
|||||||
.put(CraftMetaBookSigned.class, "BOOK_SIGNED")
|
.put(CraftMetaBookSigned.class, "BOOK_SIGNED")
|
||||||
.put(CraftMetaSkull.class, "SKULL")
|
.put(CraftMetaSkull.class, "SKULL")
|
||||||
.put(CraftMetaLeatherArmor.class, "LEATHER_ARMOR")
|
.put(CraftMetaLeatherArmor.class, "LEATHER_ARMOR")
|
||||||
|
.put(CraftMetaColorableArmor.class, "COLORABLE_ARMOR")
|
||||||
.put(CraftMetaMap.class, "MAP")
|
.put(CraftMetaMap.class, "MAP")
|
||||||
.put(CraftMetaPotion.class, "POTION")
|
.put(CraftMetaPotion.class, "POTION")
|
||||||
.put(CraftMetaSpawnEgg.class, "SPAWN_EGG")
|
.put(CraftMetaSpawnEgg.class, "SPAWN_EGG")
|
||||||
@ -1391,6 +1393,9 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
|||||||
ATTRIBUTES_UUID_HIGH.NBT,
|
ATTRIBUTES_UUID_HIGH.NBT,
|
||||||
ATTRIBUTES_UUID_LOW.NBT,
|
ATTRIBUTES_UUID_LOW.NBT,
|
||||||
ATTRIBUTES_SLOT.NBT,
|
ATTRIBUTES_SLOT.NBT,
|
||||||
|
CraftMetaArmor.TRIM.NBT,
|
||||||
|
CraftMetaArmor.TRIM_MATERIAL.NBT,
|
||||||
|
CraftMetaArmor.TRIM_PATTERN.NBT,
|
||||||
CraftMetaMap.MAP_SCALING.NBT,
|
CraftMetaMap.MAP_SCALING.NBT,
|
||||||
CraftMetaMap.MAP_COLOR.NBT,
|
CraftMetaMap.MAP_COLOR.NBT,
|
||||||
CraftMetaMap.MAP_ID.NBT,
|
CraftMetaMap.MAP_ID.NBT,
|
||||||
|
@ -30,40 +30,23 @@ class CraftMetaLeatherArmor extends CraftMetaItem implements LeatherArmorMeta {
|
|||||||
|
|
||||||
CraftMetaLeatherArmor(CraftMetaItem meta) {
|
CraftMetaLeatherArmor(CraftMetaItem meta) {
|
||||||
super(meta);
|
super(meta);
|
||||||
if (!(meta instanceof CraftMetaLeatherArmor)) {
|
readColor(this, meta);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CraftMetaLeatherArmor armorMeta = (CraftMetaLeatherArmor) meta;
|
|
||||||
this.color = armorMeta.color;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CraftMetaLeatherArmor(NBTTagCompound tag) {
|
CraftMetaLeatherArmor(NBTTagCompound tag) {
|
||||||
super(tag);
|
super(tag);
|
||||||
if (tag.contains(DISPLAY.NBT)) {
|
readColor(this, tag);
|
||||||
NBTTagCompound display = tag.getCompound(DISPLAY.NBT);
|
|
||||||
if (display.contains(COLOR.NBT)) {
|
|
||||||
try {
|
|
||||||
color = Color.fromRGB(display.getInt(COLOR.NBT));
|
|
||||||
} catch (IllegalArgumentException ex) {
|
|
||||||
// Invalid colour
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CraftMetaLeatherArmor(Map<String, Object> map) {
|
CraftMetaLeatherArmor(Map<String, Object> map) {
|
||||||
super(map);
|
super(map);
|
||||||
setColor(SerializableMeta.getObject(Color.class, map, COLOR.BUKKIT, true));
|
readColor(this, map);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void applyToItem(NBTTagCompound itemTag) {
|
void applyToItem(NBTTagCompound itemTag) {
|
||||||
super.applyToItem(itemTag);
|
super.applyToItem(itemTag);
|
||||||
|
applyColor(this, itemTag);
|
||||||
if (hasColor()) {
|
|
||||||
setDisplayTag(itemTag, COLOR.NBT, NBTTagInt.valueOf(color.asRGB()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -96,16 +79,14 @@ class CraftMetaLeatherArmor extends CraftMetaItem implements LeatherArmorMeta {
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean hasColor() {
|
boolean hasColor() {
|
||||||
return !DEFAULT_LEATHER_COLOR.equals(color);
|
return hasColor(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
Builder<String, Object> serialize(Builder<String, Object> builder) {
|
Builder<String, Object> serialize(Builder<String, Object> builder) {
|
||||||
super.serialize(builder);
|
super.serialize(builder);
|
||||||
|
|
||||||
if (hasColor()) {
|
serialize(this, builder);
|
||||||
builder.put(COLOR.BUKKIT, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
@ -135,6 +116,47 @@ class CraftMetaLeatherArmor extends CraftMetaItem implements LeatherArmorMeta {
|
|||||||
if (hasColor()) {
|
if (hasColor()) {
|
||||||
hash ^= color.hashCode();
|
hash ^= color.hashCode();
|
||||||
}
|
}
|
||||||
return original != hash ? CraftMetaSkull.class.hashCode() ^ hash : hash;
|
return original != hash ? CraftMetaLeatherArmor.class.hashCode() ^ hash : hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void readColor(LeatherArmorMeta meta, CraftMetaItem other) {
|
||||||
|
if (!(other instanceof CraftMetaLeatherArmor armorMeta)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
meta.setColor(armorMeta.color);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void readColor(LeatherArmorMeta meta, NBTTagCompound tag) {
|
||||||
|
if (tag.contains(DISPLAY.NBT)) {
|
||||||
|
NBTTagCompound display = tag.getCompound(DISPLAY.NBT);
|
||||||
|
if (display.contains(COLOR.NBT)) {
|
||||||
|
try {
|
||||||
|
meta.setColor(Color.fromRGB(display.getInt(COLOR.NBT)));
|
||||||
|
} catch (IllegalArgumentException ex) {
|
||||||
|
// Invalid colour
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void readColor(LeatherArmorMeta meta, Map<String, Object> map) {
|
||||||
|
meta.setColor(SerializableMeta.getObject(Color.class, map, COLOR.BUKKIT, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean hasColor(LeatherArmorMeta meta) {
|
||||||
|
return !DEFAULT_LEATHER_COLOR.equals(meta.getColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void applyColor(LeatherArmorMeta meta, NBTTagCompound tag) {
|
||||||
|
if (hasColor(meta)) {
|
||||||
|
((CraftMetaItem) meta).setDisplayTag(tag, COLOR.NBT, NBTTagInt.valueOf(meta.getColor().asRGB()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void serialize(LeatherArmorMeta meta, Builder<String, Object> builder) {
|
||||||
|
if (hasColor(meta)) {
|
||||||
|
builder.put(COLOR.BUKKIT, meta.getColor());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
package org.bukkit.craftbukkit.inventory.trim;
|
||||||
|
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
|
import org.bukkit.inventory.meta.trim.TrimMaterial;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public class CraftTrimMaterial implements TrimMaterial {
|
||||||
|
|
||||||
|
private final NamespacedKey key;
|
||||||
|
private final net.minecraft.world.item.armortrim.TrimMaterial handle;
|
||||||
|
|
||||||
|
public CraftTrimMaterial(NamespacedKey key, net.minecraft.world.item.armortrim.TrimMaterial handle) {
|
||||||
|
this.key = key;
|
||||||
|
this.handle = handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NotNull
|
||||||
|
public NamespacedKey getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public net.minecraft.world.item.armortrim.TrimMaterial getHandle() {
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package org.bukkit.craftbukkit.inventory.trim;
|
||||||
|
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
|
import org.bukkit.inventory.meta.trim.TrimPattern;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public class CraftTrimPattern implements TrimPattern {
|
||||||
|
|
||||||
|
private final NamespacedKey key;
|
||||||
|
private final net.minecraft.world.item.armortrim.TrimPattern handle;
|
||||||
|
|
||||||
|
public CraftTrimPattern(NamespacedKey key, net.minecraft.world.item.armortrim.TrimPattern handle) {
|
||||||
|
this.key = key;
|
||||||
|
this.handle = handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NotNull
|
||||||
|
public NamespacedKey getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public net.minecraft.world.item.armortrim.TrimPattern getHandle() {
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
}
|
@ -35,12 +35,14 @@ import org.bukkit.enchantments.Enchantment;
|
|||||||
import org.bukkit.entity.Axolotl;
|
import org.bukkit.entity.Axolotl;
|
||||||
import org.bukkit.entity.TropicalFish;
|
import org.bukkit.entity.TropicalFish;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ArmorMeta;
|
||||||
import org.bukkit.inventory.meta.AxolotlBucketMeta;
|
import org.bukkit.inventory.meta.AxolotlBucketMeta;
|
||||||
import org.bukkit.inventory.meta.BannerMeta;
|
import org.bukkit.inventory.meta.BannerMeta;
|
||||||
import org.bukkit.inventory.meta.BlockDataMeta;
|
import org.bukkit.inventory.meta.BlockDataMeta;
|
||||||
import org.bukkit.inventory.meta.BlockStateMeta;
|
import org.bukkit.inventory.meta.BlockStateMeta;
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
import org.bukkit.inventory.meta.BookMeta;
|
||||||
import org.bukkit.inventory.meta.BundleMeta;
|
import org.bukkit.inventory.meta.BundleMeta;
|
||||||
|
import org.bukkit.inventory.meta.ColorableArmorMeta;
|
||||||
import org.bukkit.inventory.meta.CrossbowMeta;
|
import org.bukkit.inventory.meta.CrossbowMeta;
|
||||||
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
|
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
|
||||||
import org.bukkit.inventory.meta.FireworkEffectMeta;
|
import org.bukkit.inventory.meta.FireworkEffectMeta;
|
||||||
@ -52,6 +54,9 @@ import org.bukkit.inventory.meta.MapMeta;
|
|||||||
import org.bukkit.inventory.meta.PotionMeta;
|
import org.bukkit.inventory.meta.PotionMeta;
|
||||||
import org.bukkit.inventory.meta.SpawnEggMeta;
|
import org.bukkit.inventory.meta.SpawnEggMeta;
|
||||||
import org.bukkit.inventory.meta.TropicalFishBucketMeta;
|
import org.bukkit.inventory.meta.TropicalFishBucketMeta;
|
||||||
|
import org.bukkit.inventory.meta.trim.ArmorTrim;
|
||||||
|
import org.bukkit.inventory.meta.trim.TrimMaterial;
|
||||||
|
import org.bukkit.inventory.meta.trim.TrimPattern;
|
||||||
import org.bukkit.potion.PotionData;
|
import org.bukkit.potion.PotionData;
|
||||||
import org.bukkit.potion.PotionEffectType;
|
import org.bukkit.potion.PotionEffectType;
|
||||||
import org.bukkit.potion.PotionType;
|
import org.bukkit.potion.PotionType;
|
||||||
@ -243,7 +248,15 @@ public class ItemMetaTest extends AbstractTestingBase {
|
|||||||
return cleanStack;
|
return cleanStack;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new StackProvider(Material.LEATHER_BOOTS) {
|
new StackProvider(Material.DIAMOND_CHESTPLATE) {
|
||||||
|
@Override ItemStack operate(final ItemStack cleanStack) {
|
||||||
|
final ArmorMeta meta = (ArmorMeta) cleanStack.getItemMeta();
|
||||||
|
meta.setTrim(new ArmorTrim(TrimMaterial.AMETHYST, TrimPattern.COAST));
|
||||||
|
cleanStack.setItemMeta(meta);
|
||||||
|
return cleanStack;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new StackProvider(Material.LEATHER_HORSE_ARMOR) {
|
||||||
@Override ItemStack operate(final ItemStack cleanStack) {
|
@Override ItemStack operate(final ItemStack cleanStack) {
|
||||||
final LeatherArmorMeta meta = (LeatherArmorMeta) cleanStack.getItemMeta();
|
final LeatherArmorMeta meta = (LeatherArmorMeta) cleanStack.getItemMeta();
|
||||||
meta.setColor(Color.FUCHSIA);
|
meta.setColor(Color.FUCHSIA);
|
||||||
@ -251,6 +264,15 @@ public class ItemMetaTest extends AbstractTestingBase {
|
|||||||
return cleanStack;
|
return cleanStack;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
new StackProvider(Material.LEATHER_CHESTPLATE) {
|
||||||
|
@Override ItemStack operate(final ItemStack cleanStack) {
|
||||||
|
final ColorableArmorMeta meta = (ColorableArmorMeta) cleanStack.getItemMeta();
|
||||||
|
meta.setTrim(new ArmorTrim(TrimMaterial.COPPER, TrimPattern.DUNE));
|
||||||
|
meta.setColor(Color.MAROON);
|
||||||
|
cleanStack.setItemMeta(meta);
|
||||||
|
return cleanStack;
|
||||||
|
}
|
||||||
|
},
|
||||||
new StackProvider(Material.POTION) {
|
new StackProvider(Material.POTION) {
|
||||||
@Override ItemStack operate(final ItemStack cleanStack) {
|
@Override ItemStack operate(final ItemStack cleanStack) {
|
||||||
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
|
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
|
||||||
|
Loading…
Reference in New Issue
Block a user