diff --git a/plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java b/plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java index 4b1a08cb6d..6a7cac798a 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java @@ -1096,6 +1096,20 @@ else if (attribute.startsWith("uuid") && !isOnline()) // STATE ATTRIBUTES ///////////////// + // <--[tag] + // @attribute ]> + // @returns Duration + // @description + // Returns the cooldown duration remaining on player's material. + // --> + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_11_R1) && attribute.startsWith("item_cooldown")) { + dMaterial mat = new Element(attribute.getContext(1)).asType(dMaterial.class); + if (mat != null) { + return new Duration((long) getPlayerEntity().getCooldown(mat.getMaterial())) + .getAttribute(attribute.fulfill(1)); + } + } + // <--[tag] // @attribute // @returns Duration diff --git a/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java b/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java index 3fee8dfb54..d56079c209 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java @@ -1972,6 +1972,34 @@ public void registerCoreMembers() { registerCoreMember(InvisibleCommand.class, "INVISIBLE", "invisible [] (state:true/false/toggle)", 1); + // <--[command] + // @Name ItemCooldown + // @Syntax itemcooldown [|...] (duration:) + // @Required 1 + // @Stable stable + // @Short Places a cooldown on a material in a player's inventory. + // @Author Mergu + // @Group player + // + // @Description + // Places a cooldown on a material in a player's inventory. + // + // @Tags + // ]> + // + // @Usage + // Places a 1 second cooldown on using an ender pearl. + // - itemcooldown ender_pearl + // + // @Usage + // Places a 10 minute cooldown on using golden apples. + // - itemcooldown golden_apple d:10m + // + // --> + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_11_R1)) { + registerCoreMember(ItemCooldownCommand.class, + "ITEMCOOLDOWN", "itemcooldown [|...] (duration:)", 1); + } // <--[command] // @Name kick diff --git a/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/player/ItemCooldownCommand.java b/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/player/ItemCooldownCommand.java new file mode 100644 index 0000000000..3d72b26b16 --- /dev/null +++ b/plugin/src/main/java/net/aufdemrand/denizen/scripts/commands/player/ItemCooldownCommand.java @@ -0,0 +1,66 @@ +package net.aufdemrand.denizen.scripts.commands.player; + +import net.aufdemrand.denizen.BukkitScriptEntryData; +import net.aufdemrand.denizen.objects.dMaterial; +import net.aufdemrand.denizen.objects.dPlayer; +import net.aufdemrand.denizen.utilities.debugging.dB; +import net.aufdemrand.denizencore.exceptions.CommandExecutionException; +import net.aufdemrand.denizencore.exceptions.InvalidArgumentsException; +import net.aufdemrand.denizencore.objects.Duration; +import net.aufdemrand.denizencore.objects.aH; +import net.aufdemrand.denizencore.objects.dList; +import net.aufdemrand.denizencore.scripts.ScriptEntry; +import net.aufdemrand.denizencore.scripts.commands.AbstractCommand; + +import java.util.ArrayList; + +public class ItemCooldownCommand extends AbstractCommand { + + @Override + public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { + + for (aH.Argument arg : aH.interpret(scriptEntry.getArguments())) { + + if (!scriptEntry.hasObject("materials") + && (arg.matchesArgumentType(dMaterial.class) + || arg.matchesArgumentType(dList.class))) { + scriptEntry.addObject("materials", arg.asType(dList.class).filter(dMaterial.class)); + } + + else if (!scriptEntry.hasObject("duration") + && arg.matchesPrefix("d", "duration") + && arg.matchesArgumentType(Duration.class)) { + scriptEntry.addObject("duration", arg.asType(Duration.class)); + } + + else { + arg.reportUnhandled(); + } + } + + if (!scriptEntry.hasObject("materials")) { + throw new InvalidArgumentsException("Missing materials argument!"); + } + + scriptEntry.defaultObject("duration", new Duration(1)); + } + + @Override + public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { + + ArrayList materials = (ArrayList) scriptEntry.getObject("materials"); + Duration duration = scriptEntry.getdObject("duration"); + dPlayer player = ((BukkitScriptEntryData) scriptEntry.entryData).getPlayer(); + + if (player == null) { + dB.echoError("Invalid linked player."); + return; + } + + dB.report(scriptEntry, getName(), aH.debugList("materials", materials) + duration.debug()); + + for (dMaterial mat : materials) { + player.getPlayerEntity().setCooldown(mat.getMaterial(), duration.getTicksAsInt()); + } + } +}