Skip to content

Commit

Permalink
ItemTag.color: tipped arrow support (#2569)
Browse files Browse the repository at this point in the history
* Tipped arrow color support

* removed null checks, added editmeta call, changed meta

* Meta change

* Updated meta to account for colorless maps.

* Mech & tag registered separately, accounted for weird behavior.

* property

* Update ItemColor.java

* Update ItemColor.java

* Update ItemColor.java
  • Loading branch information
heypr committed Apr 11, 2024
1 parent 7af5b1b commit e85051d
Showing 1 changed file with 49 additions and 122 deletions.
Expand Up @@ -3,156 +3,83 @@
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.objects.properties.bukkit.BukkitColorExtensions;
import com.denizenscript.denizencore.objects.Mechanism;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ColorTag;
import com.denizenscript.denizencore.objects.properties.Property;
import com.denizenscript.denizencore.tags.Attribute;
import com.denizenscript.denizencore.objects.properties.PropertyParser;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.inventory.meta.MapMeta;
import org.bukkit.inventory.meta.PotionMeta;

public class ItemColor implements Property {

public static boolean describes(ObjectTag item) {
if (!(item instanceof ItemTag)) {
return false;
}
Material mat = ((ItemTag) item).getBukkitMaterial();
// Leather armor, potions, and filled map
return mat == Material.LEATHER_BOOTS
|| mat == Material.LEATHER_CHESTPLATE
|| mat == Material.LEATHER_HELMET
|| mat == Material.LEATHER_LEGGINGS
|| mat == Material.LEATHER_HORSE_ARMOR
|| mat == Material.POTION
|| mat == Material.SPLASH_POTION
|| mat == Material.LINGERING_POTION
|| mat == Material.FILLED_MAP;
public class ItemColor extends ItemProperty<ColorTag> {

// <--[property]
// @object ItemTag
// @name color
// @input ColorTag
// @description
// The color of a leather armor, potion, filled map, or tipped arrow item.
// For the tag: will return a white <@link objecttype ColorTag> if the given potion item doesn't have a color.
// For the tag: will return null if the given map item doesn't have a color.
// -->

public static boolean describes(ItemTag item) {
return item.getItemMeta() instanceof LeatherArmorMeta
|| item.getItemMeta() instanceof MapMeta
|| item.getItemMeta() instanceof PotionMeta;
}

public static ItemColor getFrom(ObjectTag _item) {
if (!describes(_item)) {
return null;
}
else {
return new ItemColor((ItemTag) _item);
}
}

public static final String[] handledTags = new String[] {
"color", "dye_color"
};

public static final String[] handledMechs = new String[] {
"color", "dye_color", "dye"
};

public ItemColor(ItemTag _item) {
item = _item;
}

ItemTag item;

@Override
public ObjectTag getObjectAttribute(Attribute attribute) {

if (attribute == null) {
return null;
public ColorTag getPropertyValue() {
if (getItemMeta() instanceof LeatherArmorMeta leatherArmorMeta) {
return BukkitColorExtensions.fromColor(leatherArmorMeta.getColor());
}

// <--[tag]
// @attribute <ItemTag.color>
// @returns ColorTag
// @mechanism ItemTag.color
// @group properties
// @description
// Returns the color of the leather armor item, potion item, or filled map item.
// -->
if (attribute.startsWith("color") || attribute.startsWith("dye_color")) {
Material mat = item.getBukkitMaterial();
if (mat == Material.POTION
|| mat == Material.LINGERING_POTION
|| mat == Material.SPLASH_POTION) {
PotionMeta pm = (PotionMeta) item.getItemMeta();
if (!pm.hasColor()) {
return BukkitColorExtensions.fromColor(Color.WHITE).getObjectAttribute(attribute.fulfill((1)));
}
return BukkitColorExtensions.fromColor(pm.getColor()).getObjectAttribute(attribute.fulfill((1)));
if (getItemMeta() instanceof MapMeta mapMeta) {
if (!mapMeta.hasColor()) {
return null;
}
if (mat == Material.FILLED_MAP) {
MapMeta mapMeta = (MapMeta) item.getItemMeta();
if (!mapMeta.hasColor()) {
return null;
}
return BukkitColorExtensions.fromColor(mapMeta.getColor()).getObjectAttribute(attribute.fulfill(1));
return BukkitColorExtensions.fromColor(mapMeta.getColor());
}
if (getItemMeta() instanceof PotionMeta potionMeta) {
if (!potionMeta.hasColor()) {
return null;
}
return BukkitColorExtensions.fromColor(((LeatherArmorMeta) item.getItemMeta()).getColor()).getObjectAttribute(attribute.fulfill(1));
return BukkitColorExtensions.fromColor(potionMeta.getColor());
}

return null;
}

@Override
public String getPropertyString() {
Material mat = item.getBukkitMaterial();
if (mat == Material.POTION
|| mat == Material.LINGERING_POTION
|| mat == Material.SPLASH_POTION) {
PotionMeta pm = (PotionMeta) item.getItemMeta();
if (!pm.hasColor()) {
return null;
}
return BukkitColorExtensions.fromColor(pm.getColor()).identify();
public void setPropertyValue(ColorTag color, Mechanism mechanism) {
if (getItemMeta() instanceof LeatherArmorMeta leatherArmorMeta) {
leatherArmorMeta.setColor(BukkitColorExtensions.getColor(color));
setItemMeta(leatherArmorMeta);
return;
}
if (mat == Material.FILLED_MAP) {
MapMeta mapMeta = (MapMeta) item.getItemMeta();
if (!mapMeta.hasColor()) {
return null;
}
return BukkitColorExtensions.fromColor(mapMeta.getColor()).identify();
if (getItemMeta() instanceof MapMeta mapMeta) {
mapMeta.setColor(BukkitColorExtensions.getColor(color));
setItemMeta(mapMeta);
return;
}
return BukkitColorExtensions.fromColor(((LeatherArmorMeta) item.getItemMeta()).getColor()).identify();
editMeta(PotionMeta.class, meta -> meta.setColor(BukkitColorExtensions.getColor(color)));
}

@Override
public String getPropertyId() {
return "color";
}

@Override
public void adjust(Mechanism mechanism) {

// <--[mechanism]
// @object ItemTag
// @name color
// @input ColorTag
// @description
// Sets the leather armor item's dye color, potion item's color, or filled map item's color.
// @tags
// <ItemTag.color>
// -->
if ((mechanism.matches("dye") || mechanism.matches("dye_color")
|| mechanism.matches("color")) && (mechanism.requireObject(ColorTag.class))) {
ColorTag color = mechanism.valueAsType(ColorTag.class);
Material mat = item.getBukkitMaterial();
if (mat == Material.POTION || mat == Material.LINGERING_POTION || mat == Material.SPLASH_POTION) {
PotionMeta meta = (PotionMeta) item.getItemMeta();
meta.setColor(BukkitColorExtensions.getColor(color));
item.setItemMeta(meta);
return;
public static void register() {
PropertyParser.registerTag(ItemColor.class, ColorTag.class, "color", (attribute, item) -> {
if (item.getItemMeta() instanceof PotionMeta potionMeta && !potionMeta.hasColor()) {
return BukkitColorExtensions.fromColor(Color.WHITE);
}
if (mat == Material.FILLED_MAP) {
MapMeta meta = (MapMeta) item.getItemMeta();
meta.setColor(BukkitColorExtensions.getColor(color));
item.setItemMeta(meta);
return;
else {
return item.getPropertyValue();
}
LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta();
meta.setColor(BukkitColorExtensions.getColor(color));
item.setItemMeta(meta);
}
}, "dye_color");

PropertyParser.registerMechanism(ItemColor.class, ColorTag.class, "color", (item, mechanism, color) -> {
item.setPropertyValue(color, mechanism);
}, "dye", "dye_color");
}
}

0 comments on commit e85051d

Please sign in to comment.