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());
+ }
+ }
+}