Skip to content

Commit

Permalink
item cooldown support for 1.11.2+ (#90)
Browse files Browse the repository at this point in the history
* Register itemcooldown command

* Add itemcooldown command

* Add item_cooldown tag

* fix a derp
  • Loading branch information
mergu authored and mcmonkey4eva committed Jul 29, 2017
1 parent 2e3fcba commit 3d68ac3
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 0 deletions.
14 changes: 14 additions & 0 deletions plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java
Expand Up @@ -1096,6 +1096,20 @@ else if (attribute.startsWith("uuid") && !isOnline())
// STATE ATTRIBUTES
/////////////////

// <--[tag]
// @attribute <p@player.item_cooldown[<material>]>
// @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 <p@player.first_played>
// @returns Duration
Expand Down
Expand Up @@ -1972,6 +1972,34 @@ public void registerCoreMembers() {
registerCoreMember(InvisibleCommand.class,
"INVISIBLE", "invisible [<entity>] (state:true/false/toggle)", 1);

// <--[command]
// @Name ItemCooldown
// @Syntax itemcooldown [<material>|...] (duration:<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
// <p@player.item_cooldown[<material>]>
//
// @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 [<material>|...] (duration:<duration>)", 1);
}

// <--[command]
// @Name kick
Expand Down
@@ -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<dMaterial> materials = (ArrayList<dMaterial>) 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());
}
}
}

0 comments on commit 3d68ac3

Please sign in to comment.