diff --git a/src/main/java/com/garbagemule/MobArena/MobArena.java b/src/main/java/com/garbagemule/MobArena/MobArena.java index 6dede31..7070786 100644 --- a/src/main/java/com/garbagemule/MobArena/MobArena.java +++ b/src/main/java/com/garbagemule/MobArena/MobArena.java @@ -5,6 +5,7 @@ import com.garbagemule.MobArena.framework.Arena; import com.garbagemule.MobArena.framework.ArenaMaster; import com.garbagemule.MobArena.listeners.MAGlobalListener; import com.garbagemule.MobArena.listeners.MagicSpellsListener; +import com.garbagemule.MobArena.things.ThingManager; import com.garbagemule.MobArena.util.VersionChecker; import com.garbagemule.MobArena.util.config.ConfigUtils; import com.garbagemule.MobArena.util.inventory.InventoryManager; @@ -58,6 +59,12 @@ public class MobArena extends JavaPlugin public static Random random = new Random(); private Messenger messenger; + private ThingManager thingman; + + @Override + public void onLoad() { + thingman = new ThingManager(this); + } public void onEnable() { // Initialize config-file @@ -316,6 +323,14 @@ public class MobArena extends JavaPlugin return false; } + public boolean giveMoney(Player p, double amount) { + if (economy != null) { + EconomyResponse result = economy.depositPlayer(p, amount); + return (result.type == ResponseType.SUCCESS); + } + return false; + } + public boolean takeMoney(Player p, ItemStack item) { return takeMoney(p, getAmount(item)); } @@ -353,4 +368,8 @@ public class MobArena extends JavaPlugin public Messenger getGlobalMessenger() { return messenger; } + + public ThingManager getThingManager() { + return thingman; + } } \ No newline at end of file diff --git a/src/main/java/com/garbagemule/MobArena/things/ItemStackThing.java b/src/main/java/com/garbagemule/MobArena/things/ItemStackThing.java new file mode 100644 index 0000000..7f4353b --- /dev/null +++ b/src/main/java/com/garbagemule/MobArena/things/ItemStackThing.java @@ -0,0 +1,40 @@ +package com.garbagemule.MobArena.things; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class ItemStackThing implements Thing { + private ItemStack stack; + + public ItemStackThing(ItemStack stack) { + this.stack = stack; + } + + @Override + public boolean giveTo(Player player) { + return player.getInventory().addItem(stack).isEmpty(); + } + + @Override + public boolean takeFrom(Player player) { + return player.getInventory().removeItem(stack).isEmpty(); + } + + @Override + public boolean heldBy(Player player) { + return player.getInventory().containsAtLeast(stack, stack.getAmount()); + } + + @Override + public String toString() { + String item = stack.getType() + .name() + .replace("_", " ") + .toLowerCase(); + + if (stack.getAmount() > 1) { + return stack.getAmount() + "x " + item; + } + return item; + } +} diff --git a/src/main/java/com/garbagemule/MobArena/things/ItemStackThingParser.java b/src/main/java/com/garbagemule/MobArena/things/ItemStackThingParser.java new file mode 100644 index 0000000..2a9fbd1 --- /dev/null +++ b/src/main/java/com/garbagemule/MobArena/things/ItemStackThingParser.java @@ -0,0 +1,15 @@ +package com.garbagemule.MobArena.things; + +import com.garbagemule.MobArena.util.ItemParser; +import org.bukkit.inventory.ItemStack; + +class ItemStackThingParser implements ThingParser { + @Override + public ItemStackThing parse(String s) { + ItemStack stack = ItemParser.parseItem(s, false); + if (stack == null) { + return null; + } + return new ItemStackThing(stack); + } +} diff --git a/src/main/java/com/garbagemule/MobArena/things/MoneyThing.java b/src/main/java/com/garbagemule/MobArena/things/MoneyThing.java new file mode 100644 index 0000000..4881015 --- /dev/null +++ b/src/main/java/com/garbagemule/MobArena/things/MoneyThing.java @@ -0,0 +1,34 @@ +package com.garbagemule.MobArena.things; + +import com.garbagemule.MobArena.MobArena; +import org.bukkit.entity.Player; + +public class MoneyThing implements Thing { + private MobArena plugin; + private double amount; + + public MoneyThing(MobArena plugin, double amount) { + this.plugin = plugin; + this.amount = amount; + } + + @Override + public boolean giveTo(Player player) { + return plugin.giveMoney(player, amount); + } + + @Override + public boolean takeFrom(Player player) { + return plugin.takeMoney(player, amount); + } + + @Override + public boolean heldBy(Player player) { + return plugin.hasEnough(player, amount); + } + + @Override + public String toString() { + return plugin.economyFormat(amount); + } +} diff --git a/src/main/java/com/garbagemule/MobArena/things/MoneyThingParser.java b/src/main/java/com/garbagemule/MobArena/things/MoneyThingParser.java new file mode 100644 index 0000000..a176363 --- /dev/null +++ b/src/main/java/com/garbagemule/MobArena/things/MoneyThingParser.java @@ -0,0 +1,48 @@ +package com.garbagemule.MobArena.things; + +import com.garbagemule.MobArena.MobArena; + +class MoneyThingParser implements ThingParser { + private static final String PREFIX_LONG = "money:"; + private static final String PREFIX_SHORT = "$"; + + private MobArena plugin; + + MoneyThingParser(MobArena plugin) { + this.plugin = plugin; + } + + @Override + public MoneyThing parse(String s) { + String money = trimPrefix(s); + if (money == null) { + return null; + } + + Double value = valueOf(money); + if (value == null) { + return null; + } + + return new MoneyThing(plugin, value); + } + + private String trimPrefix(String s) { + if (s.startsWith(PREFIX_SHORT)) { + return s.substring(PREFIX_SHORT.length()); + } + if (s.startsWith(PREFIX_LONG)) { + return s.substring(PREFIX_LONG.length()); + } + return null; + } + + private Double valueOf(String money) { + try { + return Double.parseDouble(money); + } catch (NumberFormatException e) { + plugin.getLogger().warning("Invalid economy value: " + money); + return null; + } + } +} diff --git a/src/main/java/com/garbagemule/MobArena/things/Thing.java b/src/main/java/com/garbagemule/MobArena/things/Thing.java new file mode 100644 index 0000000..3b73bb7 --- /dev/null +++ b/src/main/java/com/garbagemule/MobArena/things/Thing.java @@ -0,0 +1,40 @@ +package com.garbagemule.MobArena.things; + +import org.bukkit.entity.Player; + +/** + * A thing is something that can be given to a player, taken from a player, + * or something that a player can have or be in possession of. Things may have + * any number of these three properties, which means that just because a thing + * can be given to a player, it doesn't mean that it can also be taken away, + * or that the player is in possession of it. + *
+ * The interface exposes three methods that are all optional operations. An
+ * operation returns false if it fails or if it isn't applicable to the given
+ * thing (which is the same as failing).
+ */
+public interface Thing {
+ /**
+ * Give this thing to the given player.
+ *
+ * @param player a player, non-null
+ * @return true, if this thing was given to the player, false otherwise
+ */
+ boolean giveTo(Player player);
+
+ /**
+ * Take this thing from the given player.
+ *
+ * @param player a player, non-null
+ * @return true, if this thing was taken from the player, false otherwise
+ */
+ boolean takeFrom(Player player);
+
+ /**
+ * Check if the given player has this thing.
+ *
+ * @param player a player, non-null
+ * @return true, if the player has this thing, false otherwise
+ */
+ boolean heldBy(Player player);
+}
diff --git a/src/main/java/com/garbagemule/MobArena/things/ThingManager.java b/src/main/java/com/garbagemule/MobArena/things/ThingManager.java
new file mode 100644
index 0000000..7711c7c
--- /dev/null
+++ b/src/main/java/com/garbagemule/MobArena/things/ThingManager.java
@@ -0,0 +1,55 @@
+package com.garbagemule.MobArena.things;
+
+import com.garbagemule.MobArena.MobArena;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ThingManager implements ThingParser {
+ private List
+ * This is a convenience method for {@link #register(ThingParser, boolean)}
+ * that registers the parser after the core parsers.
+ *
+ * @param parser a thing parser, non-null
+ */
+ public void register(ThingParser parser) {
+ register(parser, false);
+ }
+
+ @Override
+ public Thing parse(String s) {
+ for (ThingParser parser : parsers) {
+ Thing thing = parser.parse(s);
+ if (thing != null) {
+ return thing;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/garbagemule/MobArena/things/ThingParser.java b/src/main/java/com/garbagemule/MobArena/things/ThingParser.java
new file mode 100644
index 0000000..6c20da1
--- /dev/null
+++ b/src/main/java/com/garbagemule/MobArena/things/ThingParser.java
@@ -0,0 +1,16 @@
+package com.garbagemule.MobArena.things;
+
+/**
+ * A thing parser takes a string as input and returns either an instance of
+ * {@link Thing} or null.
+ */
+public interface ThingParser {
+ /**
+ * Parse the given string, returning a {@link Thing} instance on success,
+ * otherwise null.
+ *
+ * @param s a string to parse
+ * @return an instance of {@link Thing}, or null
+ */
+ Thing parse(String s);
+}
diff --git a/src/main/java/com/garbagemule/MobArena/util/ItemParser.java b/src/main/java/com/garbagemule/MobArena/util/ItemParser.java
index f032089..ca91e7b 100644
--- a/src/main/java/com/garbagemule/MobArena/util/ItemParser.java
+++ b/src/main/java/com/garbagemule/MobArena/util/ItemParser.java
@@ -143,6 +143,10 @@ public class ItemParser
}
public static ItemStack parseItem(String item) {
+ return parseItem(item, true);
+ }
+
+ public static ItemStack parseItem(String item, boolean logFailure) {
if (item == null || item.equals(""))
return null;
@@ -164,7 +168,9 @@ public class ItemParser
break;
}
if (result == null || result.getTypeId() == 0) {
- Bukkit.getLogger().warning("[MobArena] Failed to parse item: " + item);
+ if (logFailure) {
+ Bukkit.getLogger().warning("[MobArena] Failed to parse item: " + item);
+ }
return null;
}