diff --git a/pom.xml b/pom.xml
index a9f47966..8d71b5d8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -123,6 +123,13 @@
CodeMC
https://repo.codemc.org/repository/maven-public
+
+
+
+ jitpack.io
+ https://jitpack.io
+
+
@@ -142,5 +149,11 @@
1.8
compile
+
+ com.github.MilkBowl
+ VaultAPI
+ 1.7.1
+ provided
+
diff --git a/src/main/java/fr/moribus/imageonmap/ImageOnMap.java b/src/main/java/fr/moribus/imageonmap/ImageOnMap.java
index 321c3de4..c4d4104e 100644
--- a/src/main/java/fr/moribus/imageonmap/ImageOnMap.java
+++ b/src/main/java/fr/moribus/imageonmap/ImageOnMap.java
@@ -46,6 +46,7 @@
import fr.moribus.imageonmap.commands.maptool.NewCommand;
import fr.moribus.imageonmap.commands.maptool.RenameCommand;
import fr.moribus.imageonmap.commands.maptool.UpdateCommand;
+import fr.moribus.imageonmap.economy.EconomyComponent;
import fr.moribus.imageonmap.image.ImageIOExecutor;
import fr.moribus.imageonmap.image.ImageRendererExecutor;
import fr.moribus.imageonmap.image.MapInitEvent;
@@ -113,8 +114,15 @@ public void onEnable() {
saveDefaultConfig();
commandWorker = loadComponent(CommandWorkers.class);
- loadComponents(I18n.class, Gui.class, Commands.class, PluginConfiguration.class, ImageIOExecutor.class,
- ImageRendererExecutor.class);
+ loadComponents(
+ I18n.class,
+ Gui.class,
+ Commands.class,
+ PluginConfiguration.class,
+ ImageIOExecutor.class,
+ ImageRendererExecutor.class,
+ EconomyComponent.class
+ );
//Init all the things !
I18n.setPrimaryLocale(PluginConfiguration.LANG.get());
@@ -122,6 +130,7 @@ public void onEnable() {
MapManager.init();
MapInitEvent.init();
MapItemManager.init();
+ EconomyComponent.init();
Commands.register(
diff --git a/src/main/java/fr/moribus/imageonmap/PluginConfiguration.java b/src/main/java/fr/moribus/imageonmap/PluginConfiguration.java
index c5f0bae5..61f60cc5 100644
--- a/src/main/java/fr/moribus/imageonmap/PluginConfiguration.java
+++ b/src/main/java/fr/moribus/imageonmap/PluginConfiguration.java
@@ -64,4 +64,9 @@ public final class PluginConfiguration extends Configuration {
public static ConfigurationList IMAGES_HOSTNAMES_WHITELIST =
list("images-hostnames-whitelist", String.class);
-}
+ public static ConfigurationItem ENABLE_ECONOMY = item("enable-economy", false);
+ public static ConfigurationItem SCALE_MAP_COST = item("scale-map-cost", true);
+ public static ConfigurationItem COST_PER_MAP = item("cost-per-map", 100);
+ public static ConfigurationItem SCALE_COPY_COST = item("scale-copy-cost", false);
+ public static ConfigurationItem COST_PER_COPY = item("cost-per-copy", 50);
+}
\ No newline at end of file
diff --git a/src/main/java/fr/moribus/imageonmap/commands/maptool/GetCommand.java b/src/main/java/fr/moribus/imageonmap/commands/maptool/GetCommand.java
index e527a31d..4acc894b 100644
--- a/src/main/java/fr/moribus/imageonmap/commands/maptool/GetCommand.java
+++ b/src/main/java/fr/moribus/imageonmap/commands/maptool/GetCommand.java
@@ -39,6 +39,8 @@
import fr.moribus.imageonmap.ImageOnMap;
import fr.moribus.imageonmap.Permissions;
import fr.moribus.imageonmap.commands.IoMCommand;
+import fr.moribus.imageonmap.economy.EconomyNotEnabledException;
+import fr.moribus.imageonmap.economy.InsufficientFundsException;
import fr.moribus.imageonmap.map.ImageMap;
import fr.moribus.imageonmap.map.MapManager;
import fr.zcraft.quartzlib.components.commands.CommandException;
@@ -96,10 +98,19 @@ protected void run() throws CommandException {
return;
}
- if (map.give(sender)) {
- info(I.t("The requested map was too big to fit in your inventory."));
- info(I.t("Use '/maptool getremaining' to get the remaining maps."));
+ try {
+ if (map.give(sender)) {
+ info(I.t("The requested map was too big to fit in your inventory."));
+ info(I.t("Use '/maptool getremaining' to get the remaining maps."));
+ }
+ } catch (EconomyNotEnabledException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InsufficientFundsException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
+
});
}
diff --git a/src/main/java/fr/moribus/imageonmap/commands/maptool/GetRemainingCommand.java b/src/main/java/fr/moribus/imageonmap/commands/maptool/GetRemainingCommand.java
index 7a8c29f5..d5b17a72 100644
--- a/src/main/java/fr/moribus/imageonmap/commands/maptool/GetRemainingCommand.java
+++ b/src/main/java/fr/moribus/imageonmap/commands/maptool/GetRemainingCommand.java
@@ -38,6 +38,8 @@
import fr.moribus.imageonmap.Permissions;
import fr.moribus.imageonmap.commands.IoMCommand;
+import fr.moribus.imageonmap.economy.EconomyNotEnabledException;
+import fr.moribus.imageonmap.economy.InsufficientFundsException;
import fr.moribus.imageonmap.ui.MapItemManager;
import fr.zcraft.quartzlib.components.commands.CommandException;
import fr.zcraft.quartzlib.components.commands.CommandInfo;
@@ -56,14 +58,25 @@ protected void run() throws CommandException {
return;
}
- int givenMaps = MapItemManager.giveCache(player);
-
- if (givenMaps == 0) {
- error(I.t("Your inventory is full! Make some space before requesting the remaining maps."));
- } else {
- info(I.tn("There is {0} map remaining.", "There are {0} maps remaining.",
- MapItemManager.getCacheSize(player)));
+ try {
+ int givenMaps = MapItemManager.giveCache(player);
+ if (givenMaps == 0) {
+ error(I.t("Your inventory is full! Make some space before requesting the remaining maps."));
+ } else {
+ info(I.tn(
+ "There is {0} map remaining.", "There are {0} maps remaining.",
+ MapItemManager.getCacheSize(player)
+ ));
+ }
+ } catch (EconomyNotEnabledException exception) {
+ // TODO Auto-generated catch block
+ exception.printStackTrace();
+ } catch (InsufficientFundsException exception) {
+ // TODO Auto-generated catch block
+ exception.printStackTrace();
}
+
+
}
@Override
diff --git a/src/main/java/fr/moribus/imageonmap/commands/maptool/GiveCommand.java b/src/main/java/fr/moribus/imageonmap/commands/maptool/GiveCommand.java
index 2751ab23..6a9cd37f 100644
--- a/src/main/java/fr/moribus/imageonmap/commands/maptool/GiveCommand.java
+++ b/src/main/java/fr/moribus/imageonmap/commands/maptool/GiveCommand.java
@@ -38,6 +38,8 @@
import fr.moribus.imageonmap.Permissions;
import fr.moribus.imageonmap.commands.IoMCommand;
+import fr.moribus.imageonmap.economy.EconomyNotEnabledException;
+import fr.moribus.imageonmap.economy.InsufficientFundsException;
import fr.moribus.imageonmap.map.ImageMap;
import fr.moribus.imageonmap.map.MapManager;
import fr.zcraft.quartzlib.components.commands.CommandException;
@@ -111,11 +113,21 @@ protected void run() throws CommandException {
}
retrieveUUID(playerName, uuid2 -> {
- if (Bukkit.getPlayer((uuid2)) != null && Bukkit.getPlayer((uuid2)).isOnline()
- && map.give(Bukkit.getPlayer(uuid2))) {
- info(I.t("The requested map was too big to fit in your inventory."));
- info(I.t("Use '/maptool getremaining' to get the remaining maps."));
+
+ try {
+ if (Bukkit.getPlayer((uuid2)) != null && Bukkit.getPlayer((uuid2)).isOnline()
+ && map.give(Bukkit.getPlayer(uuid2))) {
+ info(I.t("The requested map was too big to fit in your inventory."));
+ info(I.t("Use '/maptool getremaining' to get the remaining maps."));
+ }
+ } catch (EconomyNotEnabledException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InsufficientFundsException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
+
});
});
diff --git a/src/main/java/fr/moribus/imageonmap/commands/maptool/NewCommand.java b/src/main/java/fr/moribus/imageonmap/commands/maptool/NewCommand.java
index bef3a490..2bbc0374 100644
--- a/src/main/java/fr/moribus/imageonmap/commands/maptool/NewCommand.java
+++ b/src/main/java/fr/moribus/imageonmap/commands/maptool/NewCommand.java
@@ -37,7 +37,10 @@
package fr.moribus.imageonmap.commands.maptool;
import fr.moribus.imageonmap.Permissions;
+import fr.moribus.imageonmap.PluginConfiguration;
import fr.moribus.imageonmap.commands.IoMCommand;
+import fr.moribus.imageonmap.economy.EconomyNotEnabledException;
+import fr.moribus.imageonmap.economy.InsufficientFundsException;
import fr.moribus.imageonmap.image.ImageRendererExecutor;
import fr.moribus.imageonmap.image.ImageUtils;
import fr.moribus.imageonmap.map.ImageMap;
@@ -162,11 +165,20 @@ public void finished(ImageMap result) {
MessageSender
.sendActionBarMessage(player, ChatColor.DARK_GREEN + I.t("Rendering finished!"));
- if (result.give(player)
- && (result instanceof PosterMap && !((PosterMap) result).hasColumnData())) {
- info(I.t("The rendered map was too big to fit in your inventory."));
- info(I.t("Use '/maptool getremaining' to get the remaining maps."));
+ try {
+ if (result.give(player)
+ && (result instanceof PosterMap && !((PosterMap) result).hasColumnData())) {
+ info(I.t("The rendered map was too big to fit in your inventory."));
+ info(I.t("Use '/maptool getremaining' to get the remaining maps."));
+ }
+ } catch (EconomyNotEnabledException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InsufficientFundsException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
+
}
@Override
diff --git a/src/main/java/fr/moribus/imageonmap/economy/EconomyComponent.java b/src/main/java/fr/moribus/imageonmap/economy/EconomyComponent.java
new file mode 100644
index 00000000..59f7df5a
--- /dev/null
+++ b/src/main/java/fr/moribus/imageonmap/economy/EconomyComponent.java
@@ -0,0 +1,34 @@
+package fr.moribus.imageonmap.economy;
+
+import fr.moribus.imageonmap.PluginConfiguration;
+import fr.zcraft.quartzlib.core.QuartzComponent;
+import net.milkbowl.vault.economy.Economy;
+import org.bukkit.Bukkit;
+import org.bukkit.plugin.RegisteredServiceProvider;
+
+public final class EconomyComponent extends QuartzComponent {
+
+ private static Economy economy = null;
+
+ public static void init() {
+ System.out.println("HELLO!");
+ if (PluginConfiguration.ENABLE_ECONOMY.get()
+ && Bukkit.getPluginManager().getPlugin("Vault") != null) {
+ RegisteredServiceProvider rsp = Bukkit.getServicesManager().getRegistration(Economy.class);
+ if (rsp != null) {
+ economy = rsp.getProvider();
+ }
+ }
+ }
+
+ public static Economy getEconomy() throws EconomyNotEnabledException {
+
+ if (economy != null) {
+ return economy;
+ } else {
+ throw new EconomyNotEnabledException();
+ }
+
+ }
+
+}
diff --git a/src/main/java/fr/moribus/imageonmap/economy/EconomyNotEnabledException.java b/src/main/java/fr/moribus/imageonmap/economy/EconomyNotEnabledException.java
new file mode 100644
index 00000000..00cb5710
--- /dev/null
+++ b/src/main/java/fr/moribus/imageonmap/economy/EconomyNotEnabledException.java
@@ -0,0 +1,9 @@
+package fr.moribus.imageonmap.economy;
+
+public class EconomyNotEnabledException extends Exception {
+
+ public EconomyNotEnabledException() {
+ super("The economy is disabled");
+ }
+
+}
diff --git a/src/main/java/fr/moribus/imageonmap/economy/InsufficientFundsException.java b/src/main/java/fr/moribus/imageonmap/economy/InsufficientFundsException.java
new file mode 100644
index 00000000..4c1e56a9
--- /dev/null
+++ b/src/main/java/fr/moribus/imageonmap/economy/InsufficientFundsException.java
@@ -0,0 +1,24 @@
+package fr.moribus.imageonmap.economy;
+
+import org.bukkit.OfflinePlayer;
+
+public class InsufficientFundsException extends Exception {
+
+ private final OfflinePlayer player;
+ private final double cost;
+
+ public InsufficientFundsException(OfflinePlayer player, double cost) {
+ super("Insufficient funds");
+ this.player = player;
+ this.cost = cost;
+ }
+
+ public OfflinePlayer getPlayer() {
+ return player;
+ }
+
+ public double getCost() {
+ return cost;
+ }
+
+}
diff --git a/src/main/java/fr/moribus/imageonmap/gui/MapListGui.java b/src/main/java/fr/moribus/imageonmap/gui/MapListGui.java
index 476ccd7a..df7633e0 100644
--- a/src/main/java/fr/moribus/imageonmap/gui/MapListGui.java
+++ b/src/main/java/fr/moribus/imageonmap/gui/MapListGui.java
@@ -38,6 +38,8 @@
import fr.moribus.imageonmap.Permissions;
import fr.moribus.imageonmap.PluginConfiguration;
+import fr.moribus.imageonmap.economy.EconomyNotEnabledException;
+import fr.moribus.imageonmap.economy.InsufficientFundsException;
import fr.moribus.imageonmap.map.ImageMap;
import fr.moribus.imageonmap.map.MapManager;
import fr.moribus.imageonmap.map.PosterMap;
@@ -143,25 +145,37 @@ protected void onClose() {
@Override
protected ItemStack getPickedUpItem(ImageMap map) {
- if (!Permissions.GET.grantedTo(getPlayer())) {
- return null;
- }
- if (map instanceof SingleMap) {
- return MapItemManager.createMapItem(map.getMapsIDs()[0], map.getName(), false, true);
- } else if (map instanceof PosterMap) {
- PosterMap poster = (PosterMap) map;
+ try {
- if (poster.hasColumnData()) {
- return SplatterMapManager.makeSplatterMap((PosterMap) map);
+ if (!Permissions.GET.grantedTo(getPlayer())) {
+ return null;
}
- MapItemManager.giveParts(getPlayer(), poster);
- return null;
- }
+ if (map instanceof SingleMap) {
+ return MapItemManager.createMapItem(map.getMapsIDs()[0], map.getName(), false, true);
+ } else if (map instanceof PosterMap) {
+ PosterMap poster = (PosterMap) map;
+
+ if (poster.hasColumnData()) {
+ return SplatterMapManager.makeSplatterMap((PosterMap) map);
+ }
- MapItemManager.give(getPlayer(), map);
+ MapItemManager.giveParts(getPlayer(), poster);
+ return null;
+ }
+
+ MapItemManager.give(getPlayer(), map);
+
+ } catch (EconomyNotEnabledException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InsufficientFundsException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
return null;
+
}
@Override
diff --git a/src/main/java/fr/moribus/imageonmap/map/ImageMap.java b/src/main/java/fr/moribus/imageonmap/map/ImageMap.java
index c6c8e5af..858153a0 100644
--- a/src/main/java/fr/moribus/imageonmap/map/ImageMap.java
+++ b/src/main/java/fr/moribus/imageonmap/map/ImageMap.java
@@ -37,6 +37,8 @@
package fr.moribus.imageonmap.map;
import fr.moribus.imageonmap.ImageOnMap;
+import fr.moribus.imageonmap.economy.EconomyNotEnabledException;
+import fr.moribus.imageonmap.economy.InsufficientFundsException;
import fr.moribus.imageonmap.ui.MapItemManager;
import fr.zcraft.quartzlib.components.i18n.I;
import java.io.File;
@@ -168,8 +170,20 @@ public boolean managesMap(ItemStack item) {
//
- public boolean give(Player player) {
- return MapItemManager.give(player, this);
+ public boolean give(Player player, boolean ignoreCost) {
+ try {
+ return MapItemManager.give(player, this, ignoreCost);
+ } catch (EconomyNotEnabledException | InsufficientFundsException exception) {
+ if (ignoreCost) {
+ //TODO it shouldn't get to this state
+ exception.printStackTrace();
+ }
+ return false;
+ }
+ }
+
+ public boolean give(Player player) throws EconomyNotEnabledException, InsufficientFundsException {
+ return give(player, false);
}
protected abstract void postSerialize(Map map);
diff --git a/src/main/java/fr/moribus/imageonmap/map/MapManager.java b/src/main/java/fr/moribus/imageonmap/map/MapManager.java
index 46452245..e8584eee 100644
--- a/src/main/java/fr/moribus/imageonmap/map/MapManager.java
+++ b/src/main/java/fr/moribus/imageonmap/map/MapManager.java
@@ -38,6 +38,8 @@
import fr.moribus.imageonmap.ImageOnMap;
import fr.moribus.imageonmap.PluginConfiguration;
+import fr.moribus.imageonmap.economy.EconomyNotEnabledException;
+import fr.moribus.imageonmap.economy.InsufficientFundsException;
import fr.moribus.imageonmap.image.ImageIOExecutor;
import fr.moribus.imageonmap.image.PosterImage;
import fr.moribus.imageonmap.map.MapManagerException.Reason;
@@ -100,13 +102,15 @@ public static boolean managesMap(ItemStack item) {
return false;
}
- public static ImageMap createMap(UUID playerUUID, int mapID) throws MapManagerException {
+ public static ImageMap createMap(UUID playerUUID, int mapID)
+ throws MapManagerException, EconomyNotEnabledException, InsufficientFundsException {
ImageMap newMap = new SingleMap(playerUUID, mapID);
addMap(newMap);
return newMap;
}
- public static ImageMap createMap(PosterImage image, UUID playerUUID, int[] mapsIDs) throws MapManagerException {
+ public static ImageMap createMap(PosterImage image, UUID playerUUID, int[] mapsIDs)
+ throws MapManagerException, EconomyNotEnabledException, InsufficientFundsException {
ImageMap newMap;
if (image.getImagesCount() == 1) {
@@ -141,7 +145,8 @@ public static int getMapIdFromItemStack(final ItemStack item) {
return ((MapMeta) meta).hasMapId() ? ((MapMeta) meta).getMapId() : 0;
}
- public static void addMap(ImageMap map) throws MapManagerException {
+ public static void addMap(ImageMap map)
+ throws MapManagerException, EconomyNotEnabledException, InsufficientFundsException {
getPlayerMapStore(map.getUserUUID()).addMap(map);
}
diff --git a/src/main/java/fr/moribus/imageonmap/map/PlayerMapStore.java b/src/main/java/fr/moribus/imageonmap/map/PlayerMapStore.java
index 3eb13bec..7ebd8be2 100644
--- a/src/main/java/fr/moribus/imageonmap/map/PlayerMapStore.java
+++ b/src/main/java/fr/moribus/imageonmap/map/PlayerMapStore.java
@@ -38,6 +38,9 @@
import fr.moribus.imageonmap.ImageOnMap;
import fr.moribus.imageonmap.PluginConfiguration;
+import fr.moribus.imageonmap.economy.EconomyComponent;
+import fr.moribus.imageonmap.economy.EconomyNotEnabledException;
+import fr.moribus.imageonmap.economy.InsufficientFundsException;
import fr.moribus.imageonmap.map.MapManagerException.Reason;
import fr.zcraft.quartzlib.tools.PluginLogger;
import java.io.File;
@@ -47,7 +50,11 @@
import java.util.List;
import java.util.Map;
import java.util.UUID;
+import net.milkbowl.vault.economy.EconomyResponse;
+import net.milkbowl.vault.economy.EconomyResponse.ResponseType;
+import org.bukkit.Bukkit;
import org.bukkit.Material;
+import org.bukkit.OfflinePlayer;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
@@ -92,9 +99,42 @@ public synchronized boolean managesMap(ItemStack item) {
return false;
}
- public synchronized void addMap(ImageMap map) throws MapManagerException {
- checkMapLimit(map);
- insertMap(map);
+ public synchronized void addMap(ImageMap map)
+ throws MapManagerException, EconomyNotEnabledException, InsufficientFundsException {
+
+ double cost = 0;
+
+ // withdraw money from account if economy is enabled
+ if (PluginConfiguration.ENABLE_ECONOMY.get()) {
+
+ // calculate the cost of the new map(s)
+ cost = PluginConfiguration.COST_PER_MAP.get();
+ if (PluginConfiguration.SCALE_MAP_COST.get()) {
+ cost *= map.getMapCount();
+ }
+
+ EconomyResponse response = EconomyComponent.getEconomy().withdrawPlayer(getPlayer(), cost);
+ if (response.type == ResponseType.FAILURE) {
+ throw new InsufficientFundsException(getPlayer(), cost);
+ }
+
+ }
+
+ try {
+ checkMapLimit(map);
+ insertMap(map);
+ } catch (MapManagerException exception) {
+ // give back the money if player fails to get the map(s)
+ if (PluginConfiguration.ENABLE_ECONOMY.get()) {
+ EconomyComponent.getEconomy().depositPlayer(getPlayer(), cost);
+ }
+ throw exception;
+ }
+
+ }
+
+ public OfflinePlayer getPlayer() {
+ return Bukkit.getOfflinePlayer(getUUID());
}
public synchronized void insertMap(ImageMap map) {
diff --git a/src/main/java/fr/moribus/imageonmap/ui/MapItemManager.java b/src/main/java/fr/moribus/imageonmap/ui/MapItemManager.java
index 90256f5c..00a5a47e 100644
--- a/src/main/java/fr/moribus/imageonmap/ui/MapItemManager.java
+++ b/src/main/java/fr/moribus/imageonmap/ui/MapItemManager.java
@@ -37,13 +37,16 @@
package fr.moribus.imageonmap.ui;
import fr.moribus.imageonmap.Permissions;
+import fr.moribus.imageonmap.PluginConfiguration;
+import fr.moribus.imageonmap.economy.EconomyComponent;
+import fr.moribus.imageonmap.economy.EconomyNotEnabledException;
+import fr.moribus.imageonmap.economy.InsufficientFundsException;
import fr.moribus.imageonmap.map.ImageMap;
import fr.moribus.imageonmap.map.MapManager;
import fr.moribus.imageonmap.map.PosterMap;
import fr.moribus.imageonmap.map.SingleMap;
import fr.zcraft.quartzlib.components.i18n.I;
import fr.zcraft.quartzlib.core.QuartzLib;
-import fr.zcraft.quartzlib.tools.PluginLogger;
import fr.zcraft.quartzlib.tools.items.ItemStackBuilder;
import fr.zcraft.quartzlib.tools.items.ItemUtils;
import fr.zcraft.quartzlib.tools.runners.RunTask;
@@ -51,6 +54,8 @@
import java.util.HashMap;
import java.util.Queue;
import java.util.UUID;
+import net.milkbowl.vault.economy.EconomyResponse;
+import net.milkbowl.vault.economy.EconomyResponse.ResponseType;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.GameMode;
@@ -86,37 +91,86 @@ public static void exit() {
mapItemCache = null;
}
- public static boolean give(Player player, ImageMap map) {
+ public static boolean give(Player player, ImageMap map, boolean ignoreCost)
+ throws EconomyNotEnabledException, InsufficientFundsException {
if (map instanceof PosterMap) {
- return give(player, (PosterMap) map);
+ return give(player, (PosterMap) map, ignoreCost);
} else if (map instanceof SingleMap) {
- return give(player, (SingleMap) map);
+ return give(player, (SingleMap) map, ignoreCost);
}
return false;
}
- public static boolean give(Player player, SingleMap map) {
- return give(player, createMapItem(map, true));
+ public static boolean give(Player player, ImageMap map)
+ throws EconomyNotEnabledException, InsufficientFundsException {
+ return give(player, map, false);
}
- public static boolean give(Player player, PosterMap map) {
+ public static boolean give(Player player, SingleMap map, boolean ignoreCost)
+ throws EconomyNotEnabledException, InsufficientFundsException {
+ return give(player, createMapItem(map, true), 1, ignoreCost);
+ }
+
+ public static boolean give(Player player, SingleMap map)
+ throws EconomyNotEnabledException, InsufficientFundsException {
+ return give(player, createMapItem(map, true), 1, false);
+ }
+
+ public static boolean give(Player player, PosterMap map, boolean ignoreCost)
+ throws EconomyNotEnabledException, InsufficientFundsException {
if (!map.hasColumnData()) {
return giveParts(player, map);
}
- return give(player, SplatterMapManager.makeSplatterMap(map));
+ return give(player, SplatterMapManager.makeSplatterMap(map), map.getMapCount(), ignoreCost);
}
- private static boolean give(final Player player, final ItemStack item) {
+ public static boolean give(Player player, PosterMap map)
+ throws EconomyNotEnabledException, InsufficientFundsException {
+ return give(player, SplatterMapManager.makeSplatterMap(map), map.getMapCount(), false);
+ }
+
+ private static boolean give(final Player player, final ItemStack item, Integer mapCount, boolean ignoreCost)
+ throws EconomyNotEnabledException, InsufficientFundsException {
+
+ double cost = 0;
+
+ // withdraw money from account if economy is enabled
+ if (PluginConfiguration.ENABLE_ECONOMY.get()
+ && !ignoreCost) {
+
+ // calculate the cost of the new map(s)
+ cost = PluginConfiguration.COST_PER_COPY.get();
+ if (PluginConfiguration.SCALE_COPY_COST.get()) {
+ cost *= mapCount;
+ }
+
+ EconomyResponse response = EconomyComponent.getEconomy().withdrawPlayer(player, cost);
+ if (response.type == ResponseType.FAILURE) {
+ throw new InsufficientFundsException(player, cost);
+ }
+
+ }
+
boolean given = ItemUtils.give(player, item);
if (given) {
player.playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, 1, 1);
+ } else if (PluginConfiguration.ENABLE_ECONOMY.get()
+ && cost > 0) {
+ EconomyComponent.getEconomy().depositPlayer(player, cost);
}
return !given;
+
+ }
+
+ private static boolean give(final Player player, final ItemStack item)
+ throws EconomyNotEnabledException, InsufficientFundsException {
+ return give(player, item, 1, false);
}
- public static boolean giveParts(Player player, PosterMap map) {
+ public static boolean giveParts(Player player, PosterMap map)
+ throws EconomyNotEnabledException, InsufficientFundsException {
boolean inventoryFull = false;
ItemStack mapPartItem;
@@ -129,7 +183,7 @@ public static boolean giveParts(Player player, PosterMap map) {
return inventoryFull;
}
- public static int giveCache(Player player) {
+ public static int giveCache(Player player) throws EconomyNotEnabledException, InsufficientFundsException {
Queue cache = getCache(player);
Inventory inventory = player.getInventory();
int givenItemsCount = 0;
@@ -305,7 +359,7 @@ private static void onItemFrameRemove(ItemFrame frame, Player player, EntityDama
if (player.getGameMode() != GameMode.CREATIVE
|| !SplatterMapManager.hasSplatterMap(player, poster)) {
- poster.give(player);
+ poster.give(player, true);
}
return;
}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 356041c7..08382ffc 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -40,3 +40,25 @@ save-full-image: false
# - cdn.discordapp.com
images-hostnames-whitelist:
+#-------------------------------------------------------------------------------
+# Economy
+
+# Enables Vault-compatible economy plugin (requires Vault and a Vault
+# compatible economy plugin to work) if set to true
+enable-economy: false
+
+# Should the cost to create a splatter map scale with the size of the image?
+# i.e. cost-per-map * width * height
+# If set to false then the cost to create a splatter map is just the
+# cost-per-map no matter what the dimensions of the splatter map are.
+scale-map-cost: true
+
+cost-per-map: 100
+
+# Should the cost to copy a splatter map scale with the size of the image?
+# This is equivalent to scale-map-cost but is applied whenever the player
+# wishes to get a copy of a pre-existing map.
+scale-copy-cost: false
+
+# The cost for each copy of the
+cost-per-copy: 50
\ No newline at end of file
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 58d19cb0..0aee34c0 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -3,6 +3,7 @@ main: fr.moribus.imageonmap.ImageOnMap
version: "4.2.2"
api-version: "1.13"
+softdepend: [Vault]
commands:
tomap:
@@ -42,6 +43,8 @@ permissions:
imageonmap.bypassimagelimit: false
imageonmap.bypasswhitelist: true
imageonmap.placeinvisiblesplattermap: true
+ imageonmap.ignoremapcost: true
+ imageonmap.ignorecopycost: true
imageonmap.userender:
description: "Allows you to use /tomap and related commands (/maptool getremaining). Alias of imageonmap.new."
@@ -130,3 +133,11 @@ permissions:
imageonmap.placeinvisiblesplattermap:
description: "Allows you to make the item frame on which you placed your splatter map invisible."
default: true
+
+ imageonmap.ignoremapcost:
+ description: "Makes making maps free (if economy is enabled)"
+ default: op
+
+ imageonmap.ignorecopycost:
+ description: "Makes making copies of splatter maps free (if economy is enabled)"
+ default: op