From 29ba77dea30980b6fe3b982ec104dac1e2ade0b6 Mon Sep 17 00:00:00 2001 From: Fortifier42 Date: Sun, 31 Jan 2016 16:37:35 +1100 Subject: [PATCH 01/13] Update player inventory to properly show item durability in ItemDamageEvent. Correct some monkeyMeta. --- .../player/PlayerItemTakesDamageScriptEvent.java | 10 ++++++++++ .../scripts/commands/BukkitCommandRegistry.java | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/aufdemrand/denizen/events/player/PlayerItemTakesDamageScriptEvent.java b/src/main/java/net/aufdemrand/denizen/events/player/PlayerItemTakesDamageScriptEvent.java index 82a2651ea9..040e191246 100644 --- a/src/main/java/net/aufdemrand/denizen/events/player/PlayerItemTakesDamageScriptEvent.java +++ b/src/main/java/net/aufdemrand/denizen/events/player/PlayerItemTakesDamageScriptEvent.java @@ -13,6 +13,7 @@ import net.aufdemrand.denizencore.scripts.containers.ScriptContainer; import net.aufdemrand.denizencore.utilities.CoreUtilities; import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerItemDamageEvent; @@ -125,5 +126,14 @@ public void onPlayerItemTakesDamage(PlayerItemDamageEvent event) { fire(); event.setCancelled(cancelled); event.setDamage(damage.asInt()); + final Player p = event.getPlayer(); + if (cancelled) { + Bukkit.getScheduler().scheduleSyncDelayedTask(DenizenAPI.getCurrentInstance(), new Runnable() { + @Override + public void run() { + p.updateInventory(); + } + }, 1); + } } } diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java index acb87c1d89..60f6b0ebb6 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java @@ -1934,11 +1934,11 @@ public void registerCoreMembers() { // None // @Usage - // Use to play a midi song file on the current player/ + // Use to play a midi song file on the current player. // - midi file:Denizen // @Usage - // Use to play a midi song file at a given location/ + // Use to play a midi song file at a given location. // - midi file:Denizen // @Usage From 4fadff7cad84d2ec810b021f1d98ad247ec40c8e Mon Sep 17 00:00:00 2001 From: Fortifier42 Date: Tue, 26 Jan 2016 12:30:57 +1100 Subject: [PATCH 02/13] Add money command. Again. fixes #1291 --- .../commands/BukkitCommandRegistry.java | 36 +++++++ .../scripts/commands/player/MoneyCommand.java | 96 +++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 src/main/java/net/aufdemrand/denizen/scripts/commands/player/MoneyCommand.java diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java index 60f6b0ebb6..fede358208 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java @@ -1950,6 +1950,42 @@ public void registerCoreMembers() { "MIDI", "midi (cancel) [] (/|...) (tempo:<#.#>) (volume:<#.#>)", 1); + // <--[command] + // @Name Money + // @Syntax money [give/take/set] (quantity:<#.#>) (to/from:|...) + // @Required 1 + // @Stable stable + // @Short Manage a player's money. + // @Author Fortifier42 + // @Group player + // @Plugin Vault + // @Description + // Give money to, take money from, and set the balance of a player. + // If no quantity is specified it defaults to '1'. You can specify a list of + // players to give to or take from. If no player(s) are specified defaults to the attached player. + // NOTE: This requires an economy plugin. May work for offline players depending on economy plugin. + // @Tags + // + // @Usage + // Use to give 1 money to the player. + // - money give + // @Usage + // Use to take 10 money from a player. + // - money take quantity:10 from:p@mcmonkey4eva + // @Usage + // Use to give all players on the server 100 money. + // - money give quantity:100 to: + + // @Usage + // Use to set the money of all online players to 250. + // - money set quantity:250 to: + // --> + if (Depends.economy != null) { + registerCoreMember(MoneyCommand.class, + "MONEY", "money [give/take] (quantity:<#.#>) (to/from:|...)", 1); + } + + // <--[command] // @Name Mount // @Syntax mount (cancel) [|...] () diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/player/MoneyCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/player/MoneyCommand.java new file mode 100644 index 0000000000..638f19f203 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/player/MoneyCommand.java @@ -0,0 +1,96 @@ +package net.aufdemrand.denizen.scripts.commands.player; + +import net.aufdemrand.denizen.BukkitScriptEntryData; +import net.aufdemrand.denizen.objects.dPlayer; +import net.aufdemrand.denizen.utilities.depends.Depends; +import net.aufdemrand.denizencore.exceptions.CommandExecutionException; +import net.aufdemrand.denizencore.exceptions.InvalidArgumentsException; +import net.aufdemrand.denizencore.objects.Element; +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 net.aufdemrand.denizencore.utilities.debugging.dB; +import net.milkbowl.vault.economy.Economy; + +import java.util.Arrays; +import java.util.List; + +public class MoneyCommand extends AbstractCommand { + + enum Action { + GIVE, + TAKE, + SET + } + + @Override + public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { + for (aH.Argument arg : aH.interpret(scriptEntry.getArguments())) { + if (!scriptEntry.hasObject("action") && arg.matchesEnum(Action.values())) { + scriptEntry.addObject("action", arg.asElement()); + } + else if (!scriptEntry.hasObject("quantity") && arg.matchesPrefix("quantity", "qty", "q") + && arg.matchesPrimitive(aH.PrimitiveType.Double)) { + scriptEntry.addObject("quantity", arg.asElement()); + } + else if (!scriptEntry.hasObject("players") && arg.matchesPrefix("to", "from") && + arg.matchesArgumentList(dPlayer.class)) { + scriptEntry.addObject("players", arg.asType(dList.class).filter(dPlayer.class)); + } + else { + arg.reportUnhandled(); + } + } + + scriptEntry.defaultObject("quantity", new Element(1)); + + if (!scriptEntry.hasObject("players")) { + if (!((BukkitScriptEntryData) scriptEntry.entryData).hasPlayer()) { + throw new InvalidArgumentsException("This command must have a player attached!"); + } + else { + scriptEntry.addObject("players", + Arrays.asList(((BukkitScriptEntryData) scriptEntry.entryData).getPlayer())); + } + } + else if (!scriptEntry.hasObject("action")) { + throw new InvalidArgumentsException("Must specify a valid action!"); + } + } + + @Override + public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { + Element action = scriptEntry.getElement("action"); + Element quantity = scriptEntry.getElement("quantity"); + List players = (List) scriptEntry.getObject("players"); + + dB.report(scriptEntry, getName(), aH.debugList("Player(s)", players) + action.debug() + quantity.debug()); + Economy eco = Depends.economy; + double amt = quantity.asDouble(); + switch (Action.valueOf(action.asString().toUpperCase())) { + case GIVE: + for (dPlayer player : players) { + eco.depositPlayer(player.getOfflinePlayer(), amt); + } + break; + + case TAKE: + for (dPlayer player : players) { + eco.withdrawPlayer(player.getOfflinePlayer(), amt); + } + break; + + case SET: + for (dPlayer player : players) { + double balance = eco.getBalance(player.getOfflinePlayer()); + if (amt > balance) { + eco.depositPlayer(player.getOfflinePlayer(), amt - balance); + } + else { + eco.withdrawPlayer(player.getOfflinePlayer(), balance - amt); + } + } + } + } +} From a1084c27671abc433bd725d063262abbf5d951ab Mon Sep 17 00:00:00 2001 From: Fortifier42 Date: Tue, 26 Jan 2016 14:08:45 +1100 Subject: [PATCH 03/13] Improve dEntity matches to string. fixes #1253 --- .../aufdemrand/denizen/objects/dEntity.java | 20 +++++++++++++++++++ .../aufdemrand/denizen/objects/dLocation.java | 12 +++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/aufdemrand/denizen/objects/dEntity.java b/src/main/java/net/aufdemrand/denizen/objects/dEntity.java index 16f23d264d..199a6b60f5 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dEntity.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dEntity.java @@ -1181,6 +1181,26 @@ public int comparesTo(dEntity entity) { return 0; } + public boolean comparedTo(String compare) { + compare = CoreUtilities.toLowerCase(compare); + if (compare.equals("entity")) { + return true; + } + else if (compare.equals("player")) { + return isPlayer(); + } + else if (compare.equals("npc")) { + return isCitizensNPC() || isNPC(); + } + else if (getEntityScript() != null && compare.equals(CoreUtilities.toLowerCase(getEntityScript()))) { + return true; + } + else if (compare.equals(getEntityType().getLowercaseName())) { + return true; + } + return false; + } + ///////////////////// // dObject Methods diff --git a/src/main/java/net/aufdemrand/denizen/objects/dLocation.java b/src/main/java/net/aufdemrand/denizen/objects/dLocation.java index 2d047bb1e7..7e33c2f84b 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dLocation.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dLocation.java @@ -36,9 +36,9 @@ import org.bukkit.material.Lever; import org.bukkit.material.MaterialData; import org.bukkit.util.*; +import org.bukkit.util.BlockIterator; import java.util.*; -import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -1289,11 +1289,7 @@ else if (attribute.startsWith("entities") && attribute.hasContext(2)) { dList ent_list = new dList(); if (attribute.hasContext(1)) { - for (String ent : dList.valueOf(attribute.getContext(1))) { - if (dEntity.matches(ent)) { - ent_list.add(ent.toUpperCase()); - } - } + ent_list = dList.valueOf(attribute.getContext(1)); } ArrayList found = new ArrayList(); double radius = aH.matchesDouble(attribute.getContext(2)) ? attribute.getDoubleContext(2) : 10; @@ -1302,10 +1298,8 @@ else if (attribute.startsWith("entities") if (Utilities.checkLocation(this, entity.getLocation(), radius)) { dEntity current = new dEntity(entity); if (!ent_list.isEmpty()) { - String type = current.getEntityType().getName(); for (String ent : ent_list) { - if ((type.equals(ent) || - current.identify().equalsIgnoreCase(ent)) && entity.isValid()) { + if (current.comparedTo(ent)) { found.add(current); break; } From 4910879d19b88c9828266aecdc19c2bd3c228a49 Mon Sep 17 00:00:00 2001 From: Fortifier42 Date: Tue, 26 Jan 2016 20:19:08 +1100 Subject: [PATCH 04/13] add --- src/main/java/net/aufdemrand/denizen/objects/dNPC.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/net/aufdemrand/denizen/objects/dNPC.java b/src/main/java/net/aufdemrand/denizen/objects/dNPC.java index 39af1e7a80..e5de2f70a9 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dNPC.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dNPC.java @@ -531,6 +531,16 @@ public String getAttribute(Attribute attribute) { } } + // <--[tag] + // @attribute + // @returns Element(Boolean) + // @description + // Returns whether the NPC is pushable. + // --> + if (attribute.startsWith("pushable") || attribute.startsWith("is_pushable")) { + return new Element(getPushableTrait().isPushable()).getAttribute(attribute.fulfill(1)); + } + // <--[tag] // @attribute ]> // @returns Element(Boolean) From dac4f17dd8aa63889356b339c82a5d968f6034d5 Mon Sep 17 00:00:00 2001 From: Fortifier42 Date: Wed, 27 Jan 2016 11:03:34 +1100 Subject: [PATCH 05/13] Add definition argument to shoot and push commands. Add some meta to commands. --- .../commands/BukkitCommandRegistry.java | 38 +++++++++++++------ .../scripts/commands/entity/PushCommand.java | 30 +++++++++++++-- .../scripts/commands/entity/ShootCommand.java | 30 +++++++++++++-- .../scripts/commands/player/MoneyCommand.java | 2 +- 4 files changed, 79 insertions(+), 21 deletions(-) diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java index fede358208..4f555b802a 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java @@ -1952,7 +1952,7 @@ public void registerCoreMembers() { // <--[command] // @Name Money - // @Syntax money [give/take/set] (quantity:<#.#>) (to/from:|...) + // @Syntax money [give/take/set] (quantity:<#.#>) (players:|...) // @Required 1 // @Stable stable // @Short Manage a player's money. @@ -1966,23 +1966,26 @@ public void registerCoreMembers() { // NOTE: This requires an economy plugin. May work for offline players depending on economy plugin. // @Tags // + // @Usage // Use to give 1 money to the player. // - money give + // @Usage // Use to take 10 money from a player. // - money take quantity:10 from:p@mcmonkey4eva + // @Usage // Use to give all players on the server 100 money. // - money give quantity:100 to: // @Usage // Use to set the money of all online players to 250. - // - money set quantity:250 to: + // - money set quantity:250 players: // --> if (Depends.economy != null) { registerCoreMember(MoneyCommand.class, - "MONEY", "money [give/take] (quantity:<#.#>) (to/from:|...)", 1); + "MONEY", "money [give/take/set] (quantity:<#.#>) (players:|...)", 1); } @@ -2091,13 +2094,20 @@ public void registerCoreMembers() { // @Description // TODO: Document Command Details // @Tags - // TODO: Document Command Details + // ]> + // + // + // + // // @Usage // Use to add a notable cuboid. // - note cu@1,2,3,world|4,5,6,world as:mycuboid // @Usage // Use to remove a notable cuboid. // - note remove as:mycuboid + // @Usage + // Use to note a location. + // - note l@10,5,10,world as:mylocation // --> registerCoreMember(NoteCommand.class, "NOTE", "note [/remove] [as:]", 2); @@ -2165,7 +2175,7 @@ public void registerCoreMembers() { // TODO: Document Command Details // See <@link language Particle Effects> for a list of valid effect names. // @Tags - // TODO: Document Command Details + // None // @Usage // TODO: Document Command Details // --> @@ -2185,7 +2195,7 @@ public void registerCoreMembers() { // TODO: Document Command Details // Optionally, specify 'custom' to play a custom sound added by a resource pack, changing the sound string to something like 'random.click' // @Tags - // TODO: Document Command Details + // None // @Usage // TODO: Document Command Details // --> @@ -2267,16 +2277,20 @@ public void registerCoreMembers() { // <--[command] // @Name Push - // @Syntax push [|...] (origin:/) (destination:) (speed:<#.#>) (duration:) (