diff --git a/nmshandler/src/main/java/net/aufdemrand/denizen/nms/interfaces/ItemHelper.java b/nmshandler/src/main/java/net/aufdemrand/denizen/nms/interfaces/ItemHelper.java index c631f73f03..315898d77c 100644 --- a/nmshandler/src/main/java/net/aufdemrand/denizen/nms/interfaces/ItemHelper.java +++ b/nmshandler/src/main/java/net/aufdemrand/denizen/nms/interfaces/ItemHelper.java @@ -5,8 +5,11 @@ import net.aufdemrand.denizen.nms.util.PlayerProfile; import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag; import net.aufdemrand.denizen.nms.util.jnbt.Tag; +import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import java.util.List; import java.util.Map; @@ -32,4 +35,6 @@ public interface ItemHelper { Map> getAttributeModifiers(ItemStack itemStack); ItemStack setAttributeModifiers(ItemStack itemStack, Map> modifiers); + + PotionEffect getPotionEffect(PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, Color color, boolean icon); } diff --git a/plugin/src/main/java/net/aufdemrand/denizen/objects/properties/item/ItemPotion.java b/plugin/src/main/java/net/aufdemrand/denizen/objects/properties/item/ItemPotion.java index 8edfdd8162..867ad323bb 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/objects/properties/item/ItemPotion.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/objects/properties/item/ItemPotion.java @@ -2,16 +2,25 @@ import net.aufdemrand.denizen.nms.NMSHandler; import net.aufdemrand.denizen.nms.NMSVersion; +import net.aufdemrand.denizen.nms.interfaces.ItemHelper; import net.aufdemrand.denizen.objects.dColor; import net.aufdemrand.denizen.objects.dItem; import net.aufdemrand.denizen.utilities.debugging.dB; -import net.aufdemrand.denizencore.objects.*; +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 org.bukkit.Color; import org.bukkit.Material; import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.potion.*; +import org.bukkit.potion.Potion; +import org.bukkit.potion.PotionData; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.potion.PotionType; public class ItemPotion implements Property { @@ -99,7 +108,7 @@ public String getAttribute(Attribute attribute) { PotionMeta meta = ((PotionMeta) item.getItemStack().getItemMeta()); return new Element(meta.getBasePotionData().getType().name() + "," + (meta.getBasePotionData().isUpgraded() ? 2 : 1) + "," + meta.getBasePotionData().isExtended() + "," + (item.getItemStack().getType() == Material.SPLASH_POTION) - + (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_12_R1) && meta.hasColor() ? "," + new dColor(meta.getColor()).identify() : "") + + (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_11_R1) && meta.hasColor() ? "," + new dColor(meta.getColor()).identify() : "") ).getAttribute(attribute.fulfill(1)); } @@ -186,12 +195,33 @@ public String getAttribute(Attribute attribute) { // @group properties // @description // Returns the potion effect's color. + // NOTE: Not supported as of Minecraft version 1.13. // --> if (attribute.startsWith("color")) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_13_R2)) { + dB.echoError("Custom effects with the color option are not supported as of Minecraft version 1.13."); + return null; + } + else if (!NMSHandler.getVersion().isAtLeast(NMSVersion.v1_9_R2)) { + dB.echoError("Custom effects with the color option are not supported before Minecraft version 1.9."); + return null; + } return new dColor(meta.getCustomEffects().get(potN).getColor()) .getAttribute(attribute.fulfill(1)); } + // <--[tag] + // @attribute ].icon> + // @returns Element(Boolean) + // @mechanism dItem.potion_effects + // @group properties + // @description + // Returns the potion effect shows an icon. + // --> + if (attribute.startsWith("icon") && NMSHandler.getVersion().isAtLeast(NMSVersion.v1_13_R2)) { + return new Element(meta.getCustomEffects().get(potN).hasIcon()).getAttribute(attribute.fulfill(1)); + } + // <--[tag] // @attribute ].has_particles> // @returns Element(Boolean) @@ -277,8 +307,9 @@ public void adjust(Mechanism mechanism) { // @input dList // @description // Sets the potion's potion effect(s). - // Input is a formed like: Effect,Upgraded,Extended(,Color)|Type,Amplifier,Duration,Ambient,Particles(,Color)|... - // For example: SPEED,true,false|SPEED,2,200,false,true,red + // Input is a formed like: Effect,Upgraded,Extended(,Color)|Type,Amplifier,Duration,Ambient,Particles(,Icon)|... + // For example: SPEED,true,false|SPEED,2,200,false,true,true + // NOTE: In pre-1.13 Minecraft versions, you could set a color in the custom effects list instead of "icon". // @tags // ]> // ].type> @@ -287,6 +318,7 @@ public void adjust(Mechanism mechanism) { // ].is_ambient> // ].has_particles> // ].color> + // ].icon> // --> if (mechanism.matches("potion_effects")) { dList data = mechanism.getValue().asType(dList.class); @@ -296,16 +328,46 @@ public void adjust(Mechanism mechanism) { CoreUtilities.toLowerCase(d1[2]).equals("true"), CoreUtilities.toLowerCase(d1[1]).equals("true"))); if (d1.length > 3) { - meta.setColor(dColor.valueOf(d1[3]).getColor()); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_11_R1)) { + meta.setColor(dColor.valueOf(d1[3]).getColor()); + } + else { + dB.echoError("Potion effect color is not supported before Minecraft version 1.11."); + } } meta.clearCustomEffects(); + ItemHelper itemHelper = NMSHandler.getInstance().getItemHelper(); for (int i = 1; i < data.size(); i++) { String[] d2 = data.get(i).split(","); - meta.addCustomEffect(new PotionEffect(PotionEffectType.getByName(d2[0].toUpperCase()), - new Element(d2[2]).asInt(), new Element(d2[1]).asInt(), new Element(d2[3]).asBoolean(), - new Element(d2[4]).asBoolean(), //d2.length > 5 ? dColor.valueOf(d2[5].replace("&comma", ",")).getColor() : null), - false), false); - // TODO: 1.13.1 - color has been removed from PotionEffect, icon has been added. this needs an NMS-specific method + PotionEffectType type = PotionEffectType.getByName(d2[0].toUpperCase()); + // NOTE: amplifier and duration are swapped around in the input format + // as compared to the PotionEffect constructor! + int duration = new Element(d2[2]).asInt(); + int amplifier = new Element(d2[1]).asInt(); + boolean ambient = new Element(d2[3]).asBoolean(); + boolean particles = new Element(d2[4]).asBoolean(); + Color color = null; + boolean icon = false; + if (d2.length > 5) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_9_R2)) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_13_R2)) { + Element check = new Element(d2[5]); + if (check.isBoolean()) { + icon = check.asBoolean(); + } + else { + dB.echoError("Custom effects with the color option are not supported as of Minecraft version 1.13."); + } + } + else { + String check = d2[5].replace("&comma", ","); + if (dColor.matches(check)) { + color = dColor.valueOf(check).getColor(); + } + } + } + } + meta.addCustomEffect(itemHelper.getPotionEffect(type, duration, amplifier, ambient, particles, color, icon), false); } item.getItemStack().setItemMeta(meta); } diff --git a/v1_10_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_10_R1.java b/v1_10_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_10_R1.java index f8d4145e9c..aeb1e9d268 100644 --- a/v1_10_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_10_R1.java +++ b/v1_10_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_10_R1.java @@ -12,9 +12,12 @@ import net.minecraft.server.v1_10_R1.GameProfileSerializer; import net.minecraft.server.v1_10_R1.NBTTagCompound; import org.bukkit.Bukkit; +import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import java.util.ArrayList; import java.util.HashMap; @@ -149,4 +152,9 @@ public ItemStack setAttributeModifiers(ItemStack itemStack, Map