package net.aufdemrand.denizen.objects.properties.item; import net.aufdemrand.denizen.nms.NMSHandler; import net.aufdemrand.denizen.nms.util.PlayerProfile; import net.aufdemrand.denizen.objects.dItem; import net.aufdemrand.denizencore.objects.Element; import net.aufdemrand.denizencore.objects.Mechanism; import net.aufdemrand.denizencore.objects.dList; import net.aufdemrand.denizencore.objects.dObject; import net.aufdemrand.denizencore.objects.properties.Property; import net.aufdemrand.denizencore.tags.Attribute; import net.aufdemrand.denizencore.utilities.CoreUtilities; import net.aufdemrand.denizencore.utilities.debugging.dB; import org.bukkit.inventory.meta.SkullMeta; import java.util.UUID; public class ItemSkullskin implements Property { public static boolean describes(dObject item) { return item instanceof dItem && ((dItem) item).getItemStack().getItemMeta() instanceof SkullMeta; } public static ItemSkullskin getFrom(dObject _item) { if (!describes(_item)) { return null; } else { return new ItemSkullskin((dItem) _item); } } private ItemSkullskin(dItem _item) { item = _item; } dItem item; @Override public String getAttribute(Attribute attribute) { if (attribute == null) { return null; } // <--[tag] // @attribute <i@item.skin> // @returns Element // @mechanism dItem.skull_skin // @group properties // @description // Returns the UUID of the player whose skin a skull item uses. // Note: Item must be a 'skull_item' with a skin. // --> // <--[tag] // @attribute <i@item.skin.full> // @returns Element|Element // @mechanism dItem.skull_skin // @group properties // @description // Returns the UUID of the player whose skin a skull item uses, along // with the permanently cached texture property. // Note: Item must be a 'skull_item' with a skin. // --> if (attribute.startsWith("skin")) { String skin = getPropertyString(); if (item.getItemStack().getDurability() == 3 && skin != null) { attribute = attribute.fulfill(1); if (attribute.startsWith("full")) { return new Element(skin).getAttribute(attribute.fulfill(1)); } return new Element(CoreUtilities.split(skin, '|').get(0)).getAttribute(attribute); } else { dB.echoError("This skull_item does not have a skin set!"); } } // <--[tag] // @attribute <i@item.has_skin> // @returns Element(Boolean) // @mechanism dItem.skull_skin // @group properties // @description // Returns whether the item has a custom skin set. // (Only for human 'skull_item's) // --> if (attribute.startsWith("has_skin")) { return new Element(item.getItemStack().getDurability() == 3 && getPropertyString() != null) .getAttribute(attribute.fulfill(1)); } return null; } @Override public String getPropertyString() { if (item.getItemStack().getDurability() == 3) { PlayerProfile playerProfile = NMSHandler.getInstance().getItemHelper().getSkullSkin(item.getItemStack()); if (playerProfile != null) { String name = playerProfile.getName(); UUID uuid = playerProfile.getUniqueId(); return (uuid != null ? uuid : name) + (playerProfile.hasTexture() ? "|" + playerProfile.getTexture() + (uuid != null && name != null ? "|" + name : "") : ""); } } return null; } @Override public String getPropertyId() { return "skull_skin"; } @Override public void adjust(Mechanism mechanism) { // <--[mechanism] // @object dItem // @name skull_skin // @input Element(|Element(|Element)) // @description // Sets the player skin on a skull_item. // The first Element is a UUID. // Optionally, use the second Element for the skin texture cache. // Optionally, use the third Element for a player name. // @tags // <i@item.skin> // <i@item.skin.full> // <i@item.has_skin> // --> if (mechanism.matches("skull_skin")) { if (item.getItemStack().getDurability() != 3) { item.getItemStack().setDurability((short) 3); } dList list = mechanism.getValue().asType(dList.class); String idString = list.get(0); String texture = null; if (list.size() > 1) { texture = list.get(1); } PlayerProfile profile; if (idString.contains("-")) { UUID uuid = UUID.fromString(idString); String name = null; if (list.size() > 2) { name = list.get(2); } profile = new PlayerProfile(name, uuid, texture); } else { profile = new PlayerProfile(idString, null, texture); } profile = NMSHandler.getInstance().fillPlayerProfile(profile); if (texture != null) { // Ensure we didn't get overwritten profile.setTexture(texture); } item.setItemStack(NMSHandler.getInstance().getItemHelper().setSkullSkin(item.getItemStack(), profile)); } } }