Added Admin Shops

Admin Shops are basically the same as infinite shops, but the vendor
won't get money and won't get a message if someone bought from or sold
to it.
As I rewrote the buy and sell methods, I also fixed a bug that you had
to pay even though you didn't have enough space in your inventory and
that the vendor had to pay even though his shop's inventory was full
This commit is contained in:
Eric 2016-04-13 17:30:34 +02:00
parent c7aa1feb18
commit ecf48629e5
10 changed files with 232 additions and 92 deletions

View File

@ -135,8 +135,11 @@ messages:
# ... when the shop is infinite. # ... when the shop is infinite.
is-infinite: "&6Type: Infinite" is-infinite: "&6Type: Infinite"
# ... when the shop is not infinite. # ... when the shop is normal.
is-not-infinite: "&6Type: Normal" is-normal: "&6Type: Normal"
# ... when the shop is an admin shop.
is-admin: "&6Type: Admin"
# Set the message when the clicked block is not a chest. # Set the message when the clicked block is not a chest.
block-no-chest: "&cBlock is not a chest" block-no-chest: "&cBlock is not a chest"
@ -148,10 +151,18 @@ messages:
# Usable regex: %AMOUNT%, %ITEMNAME%, %BUY-PRICE%, %CURRENCY-SYMBOL%, %VENDOR% # Usable regex: %AMOUNT%, %ITEMNAME%, %BUY-PRICE%, %CURRENCY-SYMBOL%, %VENDOR%
buy-success: "&aYou bought &6%AMOUNT% x %ITEMNAME%&a for &6%BUY-PRICE%%CURRENCY-SYMBOL%&a from &6%VENDOR%&a." buy-success: "&aYou bought &6%AMOUNT% x %ITEMNAME%&a for &6%BUY-PRICE%%CURRENCY-SYMBOL%&a from &6%VENDOR%&a."
# Set the message when the player successfully bought something from an admin shop.
# Usable regex: %AMOUNT%, %ITEMNAME%, %BUY-PRICE%, %CURRENCY-SYMBOL%
buy-success-admin: "&aYou bought &6%AMOUNT% x %ITEMNAME%&a for &6%BUY-PRICE%%CURRENCY-SYMBOL%&a."
# Set the message when the player successfully sold something. # Set the message when the player successfully sold something.
# Usable regex: %AMOUNT%, %ITEMNAME%, %SELL-PRICE%, %CURRENCY-SYMBOL%, %VENDOR% # Usable regex: %AMOUNT%, %ITEMNAME%, %SELL-PRICE%, %CURRENCY-SYMBOL%, %VENDOR%
sell-success: "&aYou sold &6%AMOUNT% x %ITEMNAME%&a for &6%SELL-PRICE%%CURRENCY-SYMBOL%&a to &6%VENDOR%&a." sell-success: "&aYou sold &6%AMOUNT% x %ITEMNAME%&a for &6%SELL-PRICE%%CURRENCY-SYMBOL%&a to &6%VENDOR%&a."
# Set the message when the player successfully sold something to an admin shop.
# Usable regex: %AMOUNT%, %ITEMNAME%, %SELL-PRICE%, %CURRENCY-SYMBOL%
sell-success-admin: "&aYou sold &6%AMOUNT% x %ITEMNAME%&a for &6%SELL-PRICE%%CURRENCY-SYMBOL%&a."
# Set the message when a player bought something from the players' shop. # Set the message when a player bought something from the players' shop.
# Usable regex: %AMOUNT%, %ITEMNAME%, %BUY-PRICE%, %CURRENCY-SYMBOL%, %PLAYER% # Usable regex: %AMOUNT%, %ITEMNAME%, %BUY-PRICE%, %CURRENCY-SYMBOL%, %PLAYER%
someone-bought: "&6%PLAYER% &abought &6%AMOUNT% x %ITEMNAME%&a for &6%BUY-PRICE%%CURRENCY-SYMBOL%&a from your shop." someone-bought: "&6%PLAYER% &abought &6%AMOUNT% x %ITEMNAME%&a for &6%BUY-PRICE%%CURRENCY-SYMBOL%&a from your shop."

View File

@ -16,6 +16,7 @@ import de.epiceric.shopchest.config.Config;
import de.epiceric.shopchest.interfaces.JsonBuilder; import de.epiceric.shopchest.interfaces.JsonBuilder;
import de.epiceric.shopchest.interfaces.Utils; import de.epiceric.shopchest.interfaces.Utils;
import de.epiceric.shopchest.interfaces.jsonbuilder.*; import de.epiceric.shopchest.interfaces.jsonbuilder.*;
import de.epiceric.shopchest.shop.Shop.ShopType;
import de.epiceric.shopchest.utils.ClickType; import de.epiceric.shopchest.utils.ClickType;
import de.epiceric.shopchest.utils.ClickType.EnumClickType; import de.epiceric.shopchest.utils.ClickType.EnumClickType;
import de.epiceric.shopchest.utils.ShopUtils; import de.epiceric.shopchest.utils.ShopUtils;
@ -61,7 +62,7 @@ public class Commands extends BukkitCommand {
if (args.length == 4) { if (args.length == 4) {
create(args, false, p); create(args, ShopType.NORMAL, p);
return true; return true;
@ -71,7 +72,7 @@ public class Commands extends BukkitCommand {
if (perm.has(p, "shopchest.create.infinite")) { if (perm.has(p, "shopchest.create.infinite")) {
create(args, true, p); create(args, ShopType.INFINITE, p);
return true; return true;
} else { } else {
@ -83,9 +84,15 @@ public class Commands extends BukkitCommand {
} else if (args[4].equalsIgnoreCase("normal")){ } else if (args[4].equalsIgnoreCase("normal")){
create(args, false, p); create(args, ShopType.NORMAL, p);
return true; return true;
} else if (args[4].equalsIgnoreCase("admin")) {
create(args, ShopType.ADMIN, p);
return true;
} else { } else {
sendBasicHelpMessage(p); sendBasicHelpMessage(p);
@ -200,7 +207,7 @@ public class Commands extends BukkitCommand {
} }
private void create(String[] args, boolean infinite, Player p) { private void create(String[] args, ShopType shopType, Player p) {
int amount; int amount;
double buyPrice, sellPrice; double buyPrice, sellPrice;
@ -298,7 +305,7 @@ public class Commands extends BukkitCommand {
} }
} }
ClickType.addPlayerClickType(p, new ClickType(EnumClickType.CREATE, itemStack, buyPrice, sellPrice, infinite)); ClickType.addPlayerClickType(p, new ClickType(EnumClickType.CREATE, itemStack, buyPrice, sellPrice, shopType));
p.sendMessage(Config.click_chest_to_create()); p.sendMessage(Config.click_chest_to_create());
} }
@ -315,7 +322,7 @@ public class Commands extends BukkitCommand {
private void sendBasicHelpMessage(Player player) { private void sendBasicHelpMessage(Player player) {
player.sendMessage(ChatColor.GREEN + "/" + Config.main_command_name() + " create <amount> <buy-price> <sell-price> [infinite|normal]- " + Config.cmdDesc_create()); player.sendMessage(ChatColor.GREEN + "/" + Config.main_command_name() + " create <amount> <buy-price> <sell-price> [infinite|normal|admin] - " + Config.cmdDesc_create());
player.sendMessage(ChatColor.GREEN + "/" + Config.main_command_name() + " remove - " + Config.cmdDesc_remove()); player.sendMessage(ChatColor.GREEN + "/" + Config.main_command_name() + " remove - " + Config.cmdDesc_remove());
player.sendMessage(ChatColor.GREEN + "/" + Config.main_command_name() + " info - " + Config.cmdDesc_info()); player.sendMessage(ChatColor.GREEN + "/" + Config.main_command_name() + " info - " + Config.cmdDesc_info());
player.sendMessage(ChatColor.GREEN + "/" + Config.main_command_name() + " reload - " + Config.cmdDesc_reload()); player.sendMessage(ChatColor.GREEN + "/" + Config.main_command_name() + " reload - " + Config.cmdDesc_reload());

View File

@ -29,6 +29,7 @@ import de.epiceric.shopchest.event.UpdateHolograms;
import de.epiceric.shopchest.interfaces.Utils; import de.epiceric.shopchest.interfaces.Utils;
import de.epiceric.shopchest.interfaces.utils.*; import de.epiceric.shopchest.interfaces.utils.*;
import de.epiceric.shopchest.shop.Shop; import de.epiceric.shopchest.shop.Shop;
import de.epiceric.shopchest.shop.Shop.ShopType;
import de.epiceric.shopchest.sql.SQLite; import de.epiceric.shopchest.sql.SQLite;
import de.epiceric.shopchest.interfaces.JsonBuilder; import de.epiceric.shopchest.interfaces.JsonBuilder;
import de.epiceric.shopchest.interfaces.jsonbuilder.*; import de.epiceric.shopchest.interfaces.jsonbuilder.*;
@ -110,7 +111,7 @@ public class ShopChest extends JavaPlugin{
int value = 0; int value = 0;
for (Shop shop : ShopUtils.getShops()) { for (Shop shop : ShopUtils.getShops()) {
if (shop.isInfinite()) value++; if (shop.getShopType() == ShopType.INFINITE) value++;
} }
return value; return value;
@ -124,7 +125,7 @@ public class ShopChest extends JavaPlugin{
int value = 0; int value = 0;
for (Shop shop : ShopUtils.getShops()) { for (Shop shop : ShopUtils.getShops()) {
if (!shop.isInfinite()) value++; if (shop.getShopType() == ShopType.NORMAL) value++;
} }
return value; return value;
@ -132,6 +133,22 @@ public class ShopChest extends JavaPlugin{
}); });
shopType.addPlotter(new Plotter("Admin") {
@Override
public int getValue() {
int value = 0;
for (Shop shop : ShopUtils.getShops()) {
if (shop.getShopType() == ShopType.ADMIN) value++;
}
return value;
}
});
metrics.start(); metrics.start();
} catch (IOException e) { } catch (IOException e) {
logger.severe("Could not submit stats."); logger.severe("Could not submit stats.");

View File

@ -49,7 +49,8 @@ public class Config {
public static String cmdDesc_update() { return plugin.getConfig().getString("messages.command-description.update").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");} public static String cmdDesc_update() { return plugin.getConfig().getString("messages.command-description.update").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");}
public static String cmdDesc_limits() { return plugin.getConfig().getString("messages.command-description.limits").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");} public static String cmdDesc_limits() { return plugin.getConfig().getString("messages.command-description.limits").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");}
public static String shopInfo_isInfinite() { return plugin.getConfig().getString("messages.shop-info.is-infinite").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");}; public static String shopInfo_isInfinite() { return plugin.getConfig().getString("messages.shop-info.is-infinite").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");};
public static String shopInfo_isNormal() { return plugin.getConfig().getString("messages.shop-info.is-not-infinite").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");}; public static String shopInfo_isNormal() { return plugin.getConfig().getString("messages.shop-info.is-normal").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");};
public static String shopInfo_isAdmin() { return plugin.getConfig().getString("messages.shop-info.is-admin").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");};
public static String noPermission_create() { return plugin.getConfig().getString("messages.no-permission.create").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");} public static String noPermission_create() { return plugin.getConfig().getString("messages.no-permission.create").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");}
public static String noPermission_createInfinite() { return plugin.getConfig().getString("messages.no-permission.create-infinite").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");} public static String noPermission_createInfinite() { return plugin.getConfig().getString("messages.no-permission.create-infinite").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");}
public static String noPermission_openOthers() { return plugin.getConfig().getString("messages.no-permission.open-others").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");} public static String noPermission_openOthers() { return plugin.getConfig().getString("messages.no-permission.open-others").replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");}
@ -142,10 +143,18 @@ public class Config {
return plugin.getConfig().getString("messages.buy-success").replace(Regex.currencySymbol, currency_symbol()).replace(Regex.amount, String.valueOf(amount)).replace(Regex.itemName, itemName).replace(Regex.buyPrice, String.valueOf(buyPrice)).replace(Regex.vendor, vendor).replaceAll("(&([a-f0-9k-or]))", "\u00A7$2"); return plugin.getConfig().getString("messages.buy-success").replace(Regex.currencySymbol, currency_symbol()).replace(Regex.amount, String.valueOf(amount)).replace(Regex.itemName, itemName).replace(Regex.buyPrice, String.valueOf(buyPrice)).replace(Regex.vendor, vendor).replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");
} }
public static String buy_success_admin(int amount, String itemName, double buyPrice) {
return plugin.getConfig().getString("messages.buy-success-admin").replace(Regex.currencySymbol, currency_symbol()).replace(Regex.amount, String.valueOf(amount)).replace(Regex.itemName, itemName).replace(Regex.buyPrice, String.valueOf(buyPrice)).replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");
}
public static String sell_success(int amount, String itemName, double sellPrice, String vendor) { public static String sell_success(int amount, String itemName, double sellPrice, String vendor) {
return plugin.getConfig().getString("messages.sell-success").replace(Regex.currencySymbol, currency_symbol()).replace(Regex.amount, String.valueOf(amount)).replace(Regex.itemName, itemName).replace(Regex.sellPrice, String.valueOf(sellPrice)).replace(Regex.vendor, vendor).replaceAll("(&([a-f0-9k-or]))", "\u00A7$2"); return plugin.getConfig().getString("messages.sell-success").replace(Regex.currencySymbol, currency_symbol()).replace(Regex.amount, String.valueOf(amount)).replace(Regex.itemName, itemName).replace(Regex.sellPrice, String.valueOf(sellPrice)).replace(Regex.vendor, vendor).replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");
} }
public static String sell_success_admin(int amount, String itemName, double sellPrice) {
return plugin.getConfig().getString("messages.sell-success-admin").replace(Regex.currencySymbol, currency_symbol()).replace(Regex.amount, String.valueOf(amount)).replace(Regex.itemName, itemName).replace(Regex.sellPrice, String.valueOf(sellPrice)).replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");
}
public static String someone_bought(int amount, String itemName, double buyPrice, String player) { public static String someone_bought(int amount, String itemName, double buyPrice, String player) {
return plugin.getConfig().getString("messages.someone-bought").replace(Regex.currencySymbol, currency_symbol()).replace(Regex.amount, String.valueOf(amount)).replace(Regex.itemName, itemName).replace(Regex.buyPrice, String.valueOf(buyPrice)).replace(Regex.player, player).replaceAll("(&([a-f0-9k-or]))", "\u00A7$2"); return plugin.getConfig().getString("messages.someone-bought").replace(Regex.currencySymbol, currency_symbol()).replace(Regex.amount, String.valueOf(amount)).replace(Regex.itemName, itemName).replace(Regex.buyPrice, String.valueOf(buyPrice)).replace(Regex.player, player).replaceAll("(&([a-f0-9k-or]))", "\u00A7$2");
} }

View File

@ -25,6 +25,7 @@ import com.griefcraft.model.Protection;
import de.epiceric.shopchest.ShopChest; import de.epiceric.shopchest.ShopChest;
import de.epiceric.shopchest.config.Config; import de.epiceric.shopchest.config.Config;
import de.epiceric.shopchest.shop.Shop; import de.epiceric.shopchest.shop.Shop;
import de.epiceric.shopchest.shop.Shop.ShopType;
import de.epiceric.shopchest.sql.SQLite; import de.epiceric.shopchest.sql.SQLite;
import de.epiceric.shopchest.utils.ClickType; import de.epiceric.shopchest.utils.ClickType;
import de.epiceric.shopchest.utils.EnchantmentNames; import de.epiceric.shopchest.utils.EnchantmentNames;
@ -92,9 +93,9 @@ public class InteractShop implements Listener{
ItemStack product = clickType.getProduct(); ItemStack product = clickType.getProduct();
double buyPrice = clickType.getBuyPrice(); double buyPrice = clickType.getBuyPrice();
double sellPrice = clickType.getSellPrice(); double sellPrice = clickType.getSellPrice();
boolean infinite = clickType.isInfinite(); ShopType shopType = clickType.getShopType();
create(p, b.getLocation(), product, buyPrice, sellPrice, infinite); create(p, b.getLocation(), product, buyPrice, sellPrice, shopType);
} else { } else {
p.sendMessage(Config.chest_already_shop()); p.sendMessage(Config.chest_already_shop());
} }
@ -165,7 +166,7 @@ public class InteractShop implements Listener{
e.setCancelled(true); e.setCancelled(true);
if (perm.has(p, "shopchest.buy")) { if (perm.has(p, "shopchest.buy")) {
if (shop.isInfinite()) { if (shop.getShopType() == ShopType.INFINITE || shop.getShopType() == ShopType.ADMIN) {
buy(p, shop); buy(p, shop);
} else { } else {
Chest c = (Chest) b.getState(); Chest c = (Chest) b.getState();
@ -224,9 +225,9 @@ public class InteractShop implements Listener{
} }
private void create(Player executor, Location location, ItemStack product, double buyPrice, double sellPrice, boolean infinite) { private void create(Player executor, Location location, ItemStack product, double buyPrice, double sellPrice, ShopType shopType) {
Shop shop = new Shop(plugin, executor, product, location, buyPrice, sellPrice, infinite); Shop shop = new Shop(plugin, executor, product, location, buyPrice, sellPrice, shopType);
shop.createHologram(); shop.createHologram();
shop.createItem(); shop.createItem();
@ -263,9 +264,13 @@ public class InteractShop implements Listener{
String product = Config.shopInfo_product(shop.getProduct().getAmount(), ItemNames.lookup(shop.getProduct())); String product = Config.shopInfo_product(shop.getProduct().getAmount(), ItemNames.lookup(shop.getProduct()));
String enchantmentString = ""; String enchantmentString = "";
String price = Config.shopInfo_price(shop.getBuyPrice(), shop.getSellPrice()); String price = Config.shopInfo_price(shop.getBuyPrice(), shop.getSellPrice());
String infinite = (shop.isInfinite() ? Config.shopInfo_isInfinite() : Config.shopInfo_isNormal()); String shopType;
String stock = Config.shopInfo_stock(amount); String stock = Config.shopInfo_stock(amount);
if (shop.getShopType() == ShopType.NORMAL) shopType = Config.shopInfo_isNormal();
else if (shop.getShopType() == ShopType.INFINITE) shopType = Config.shopInfo_isInfinite();
else shopType = Config.shopInfo_isAdmin();
Map<Enchantment, Integer> enchantmentMap; Map<Enchantment, Integer> enchantmentMap;
if (shop.getProduct().getItemMeta() instanceof EnchantmentStorageMeta) { if (shop.getProduct().getItemMeta() instanceof EnchantmentStorageMeta) {
@ -295,7 +300,7 @@ public class InteractShop implements Listener{
executor.sendMessage(stock); executor.sendMessage(stock);
if (enchantmentString.length() > 0) executor.sendMessage(Config.shopInfo_enchantment(enchantmentString)); if (enchantmentString.length() > 0) executor.sendMessage(Config.shopInfo_enchantment(enchantmentString));
executor.sendMessage(price); executor.sendMessage(price);
executor.sendMessage(infinite); executor.sendMessage(shopType);
executor.sendMessage(" "); executor.sendMessage(" ");
@ -334,21 +339,23 @@ public class InteractShop implements Listener{
freeAmount += value; freeAmount += value;
} }
EconomyResponse r = econ.withdrawPlayer(executor, shop.getBuyPrice()); if (freeAmount >= leftAmount) {
EconomyResponse r2 = econ.depositPlayer(shop.getVendor(), shop.getBuyPrice());
if (r.transactionSuccess()) { EconomyResponse r = econ.withdrawPlayer(executor, shop.getBuyPrice());
if (r2.transactionSuccess()) { EconomyResponse r2 = null;
if (freeAmount >= leftAmount) { if (shop.getShopType() != ShopType.ADMIN) r2 = econ.depositPlayer(shop.getVendor(), shop.getBuyPrice());
for (int slot : slotFree.keySet()) {
if (leftAmount >= 0) { if (r.transactionSuccess()) {
int amountInSlot = -(slotFree.get(slot) - product.getMaxStackSize()); if (r2 != null) {
if (amountInSlot == -0) amountInSlot = 0; if (r2.transactionSuccess()) {
for (int i = amountInSlot; i < product.getMaxStackSize() + 1; i++) { for (int slot : slotFree.keySet()) {
int amountInSlot = product.getMaxStackSize() - slotFree.get(slot);
for (int i = amountInSlot; i < product.getMaxStackSize(); i++) {
if (leftAmount > 0) { if (leftAmount > 0) {
ItemStack boughtProduct = new ItemStack(product.clone().getType(), 1, product.clone().getDurability()); ItemStack boughtProduct = new ItemStack(product.clone().getType(), 1, product.clone().getDurability());
boughtProduct.setItemMeta(product.clone().getItemMeta()); boughtProduct.setItemMeta(product.clone().getItemMeta());
if (!shop.isInfinite()) c.getInventory().removeItem(boughtProduct); if (shop.getShopType() == ShopType.NORMAL) c.getInventory().removeItem(boughtProduct);
inventory.addItem(boughtProduct); inventory.addItem(boughtProduct);
executor.updateInventory(); executor.updateInventory();
leftAmount--; leftAmount--;
@ -359,17 +366,33 @@ public class InteractShop implements Listener{
} }
} }
} }
} else {
executor.sendMessage(Config.error_occurred(r2.errorMessage));
} }
} else { } else {
executor.sendMessage(Config.not_enough_inventory_space()); for (int slot : slotFree.keySet()) {
int amountInSlot = product.getMaxStackSize() - slotFree.get(slot);
for (int i = amountInSlot; i < product.getMaxStackSize(); i++) {
if (leftAmount > 0) {
ItemStack boughtProduct = new ItemStack(product.clone().getType(), 1, product.clone().getDurability());
boughtProduct.setItemMeta(product.clone().getItemMeta());
inventory.addItem(boughtProduct);
executor.updateInventory();
leftAmount--;
} else if (leftAmount == 0) {
executor.sendMessage(Config.buy_success_admin(product.getAmount(), ItemNames.lookup(product), shop.getBuyPrice()));
return;
}
}
}
} }
} else { } else {
executor.sendMessage(Config.error_occurred(r2.errorMessage)); executor.sendMessage(Config.error_occurred(r.errorMessage));
} }
} else { } else {
executor.sendMessage(Config.error_occurred(r.errorMessage)); executor.sendMessage(Config.not_enough_inventory_space());
} }
} else { } else {
executor.sendMessage(Config.not_enough_money()); executor.sendMessage(Config.not_enough_money());
} }
@ -409,22 +432,24 @@ public class InteractShop implements Listener{
freeAmount += value; freeAmount += value;
} }
EconomyResponse r = econ.withdrawPlayer(shop.getVendor(), shop.getSellPrice()); if (freeAmount >= leftAmount) {
EconomyResponse r2 = econ.depositPlayer(executor, shop.getSellPrice());
if (r.transactionSuccess()) { EconomyResponse r = econ.depositPlayer(executor, shop.getSellPrice());
if (r2.transactionSuccess()) { EconomyResponse r2 = null;
if (freeAmount >= leftAmount) { if (shop.getShopType() != ShopType.ADMIN) r2 = econ.withdrawPlayer(shop.getVendor(), shop.getSellPrice());
for (int slot : slotFree.keySet()) {
if (leftAmount >= 0) { if (r.transactionSuccess()) {
int amountInSlot = -(slotFree.get(slot) - product.getMaxStackSize()); if (r2 != null) {
if (amountInSlot == -0) amountInSlot = 0; if (r2.transactionSuccess()) {
for (int i = amountInSlot; i < product.getMaxStackSize() + 1; i++) { for (int slot : slotFree.keySet()) {
int amountInSlot = product.getMaxStackSize() - slotFree.get(slot);
for (int i = amountInSlot; i < product.getMaxStackSize(); i++) {
if (leftAmount > 0) { if (leftAmount > 0) {
ItemStack boughtProduct = new ItemStack(product.clone().getType(), 1, product.clone().getDurability()); ItemStack soldProduct = new ItemStack(product.clone().getType(), 1, product.clone().getDurability());
boughtProduct.setItemMeta(product.clone().getItemMeta()); soldProduct.setItemMeta(product.clone().getItemMeta());
if (!shop.isInfinite()) inventory.addItem(boughtProduct); if (shop.getShopType() == ShopType.NORMAL) inventory.addItem(soldProduct);
executor.getInventory().removeItem(boughtProduct); executor.getInventory().removeItem(soldProduct);
executor.updateInventory(); executor.updateInventory();
leftAmount--; leftAmount--;
} else if (leftAmount == 0) { } else if (leftAmount == 0) {
@ -434,15 +459,32 @@ public class InteractShop implements Listener{
} }
} }
} }
} else {
executor.sendMessage(Config.error_occurred(r2.errorMessage));
} }
} else { } else {
executor.sendMessage(Config.chest_not_enough_inventory_space()); for (int slot : slotFree.keySet()) {
int amountInSlot = product.getMaxStackSize() - slotFree.get(slot);
for (int i = amountInSlot; i < product.getMaxStackSize(); i++) {
if (leftAmount > 0) {
ItemStack soldProduct = new ItemStack(product.clone().getType(), 1, product.clone().getDurability());
soldProduct.setItemMeta(product.clone().getItemMeta());
executor.getInventory().removeItem(soldProduct);
executor.updateInventory();
leftAmount--;
} else if (leftAmount == 0) {
executor.sendMessage(Config.sell_success_admin(product.getAmount(), ItemNames.lookup(product), shop.getSellPrice()));
return;
}
}
}
} }
} else { } else {
executor.sendMessage(Config.error_occurred(r2.errorMessage)); executor.sendMessage(Config.error_occurred(r.errorMessage));
} }
} else { } else {
executor.sendMessage(Config.error_occurred(r.errorMessage)); executor.sendMessage(Config.chest_not_enough_inventory_space());
} }
} else { } else {
executor.sendMessage(Config.vendor_not_enough_money()); executor.sendMessage(Config.vendor_not_enough_money());

View File

@ -88,7 +88,7 @@ public class ProtectChest implements Listener {
if (shop.hasItem()) shop.getItem().remove(); if (shop.hasItem()) shop.getItem().remove();
Shop newShop = new Shop(ShopChest.getInstance(), shop.getVendor(), shop.getProduct(), shop.getLocation(), shop.getBuyPrice(), shop.getSellPrice(), shop.isInfinite()); Shop newShop = new Shop(ShopChest.getInstance(), shop.getVendor(), shop.getProduct(), shop.getLocation(), shop.getBuyPrice(), shop.getSellPrice(), shop.getShopType());
newShop.createHologram(); newShop.createHologram();
newShop.createItem(); newShop.createItem();
ShopUtils.addShop(newShop); ShopUtils.addShop(newShop);

View File

@ -26,6 +26,12 @@ import de.epiceric.shopchest.utils.ItemNames;
public class Shop { public class Shop {
public enum ShopType {
NORMAL,
INFINITE,
ADMIN;
}
private ShopChest plugin; private ShopChest plugin;
private OfflinePlayer vendor; private OfflinePlayer vendor;
private ItemStack product; private ItemStack product;
@ -34,16 +40,16 @@ public class Shop {
private Item item; private Item item;
private double buyPrice; private double buyPrice;
private double sellPrice; private double sellPrice;
private boolean infinite; private ShopType shopType;
public Shop(ShopChest plugin, OfflinePlayer vendor, ItemStack product, Location location, double buyPrice, double sellPrice, boolean infinite) { public Shop(ShopChest plugin, OfflinePlayer vendor, ItemStack product, Location location, double buyPrice, double sellPrice, ShopType shopType) {
this.plugin = plugin; this.plugin = plugin;
this.vendor = vendor; this.vendor = vendor;
this.product = product; this.product = product;
this.location = location; this.location = location;
this.buyPrice = buyPrice; this.buyPrice = buyPrice;
this.sellPrice = sellPrice; this.sellPrice = sellPrice;
this.infinite = infinite; this.shopType = shopType;
} }
public void removeHologram() { public void removeHologram() {
@ -175,8 +181,8 @@ public class Shop {
return sellPrice; return sellPrice;
} }
public boolean isInfinite() { public ShopType getShopType() {
return infinite; return shopType;
} }
public Hologram getHologram() { public Hologram getHologram() {

View File

@ -4,6 +4,7 @@ import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
@ -16,9 +17,25 @@ import org.bukkit.inventory.ItemStack;
import de.epiceric.shopchest.ShopChest; import de.epiceric.shopchest.ShopChest;
import de.epiceric.shopchest.interfaces.Utils; import de.epiceric.shopchest.interfaces.Utils;
import de.epiceric.shopchest.shop.Shop; import de.epiceric.shopchest.shop.Shop;
import de.epiceric.shopchest.shop.Shop.ShopType;
import de.epiceric.shopchest.utils.ShopUtils; import de.epiceric.shopchest.utils.ShopUtils;
public abstract class Database { public abstract class Database {
public String SQLiteCreateTokensTable = "CREATE TABLE IF NOT EXISTS shop_list (" +
"`id` int(11) NOT NULL," +
"`vendor` varchar(32) NOT NULL," +
"`product` varchar(32) NOT NULL," +
"`world` varchar(32) NOT NULL," +
"`x` int(11) NOT NULL," +
"`y` int(11) NOT NULL," +
"`z` int(11) NOT NULL," +
"`buyprice` float(32) NOT NULL," +
"`sellprice` float(32) NOT NULL," +
"`shoptype` varchar(32) NOT NULL," +
"PRIMARY KEY (`id`)" +
");";
ShopChest plugin; ShopChest plugin;
Connection connection; Connection connection;
// The name of the table we created back in SQLite class. // The name of the table we created back in SQLite class.
@ -30,7 +47,7 @@ public abstract class Database {
public Location location = null; public Location location = null;
public double buyPrice = 0; public double buyPrice = 0;
public double sellPrice = 0; public double sellPrice = 0;
public boolean infinite = false; public ShopType shopType = ShopType.NORMAL;
public Database(ShopChest instance){ public Database(ShopChest instance){
plugin = instance; plugin = instance;
@ -52,6 +69,38 @@ public abstract class Database {
} }
} }
public void renameColumnInfiniteToShopType() {
Connection conn = null;
Statement s = null;
try {
conn = getSQLConnection();
s = conn.createStatement();
s.execute("ALTER TABLE " + table + " RENAME TO " + table + "_old");
s.close();
s.execute(SQLiteCreateTokensTable);
s.close();
s.execute("INSERT INTO " + table + "(id, vendor, product, world, x, y, z, buyprice, sellprice, shoptype) SELECT id, vendor, product, world, x, y, z, buyprice, sellprice, infinite FROM " + table + "_old");
s.close();
conn.close();
conn = getSQLConnection();
s = conn.createStatement();
s.execute("DROP TABLE " + table + "_old");
s.close();
} catch (SQLException ex) {
plugin.getLogger().log(Level.SEVERE, Errors.sqlConnectionExecute(), ex);
} finally {
try {
if (s != null)
s.close();
if (conn != null)
conn.close();
} catch (SQLException ex) {
plugin.getLogger().log(Level.SEVERE, Errors.sqlConnectionClose(), ex);
}
}
}
public int getNextFreeID() { public int getNextFreeID() {
for (int i = 1; i < getHighestID() + 1; i++) { for (int i = 1; i < getHighestID() + 1; i++) {
if (getProduct(i) == null) { if (getProduct(i) == null) {
@ -389,7 +438,7 @@ public abstract class Database {
return 0; return 0;
} }
public boolean isInfinite(int id) { public ShopType getShopType(int id) {
Connection conn = null; Connection conn = null;
PreparedStatement ps = null; PreparedStatement ps = null;
ResultSet rs = null; ResultSet rs = null;
@ -400,10 +449,22 @@ public abstract class Database {
rs = ps.executeQuery(); rs = ps.executeQuery();
while(rs.next()){ while(rs.next()){
if(rs.getInt("id") == id){ if(rs.getInt("id") == id){
return rs.getBoolean("infinite"); if (rs.getString("shoptype").equals("0") || rs.getString("shoptype").equals("1")) {
ps = conn.prepareStatement("UPDATE " + table + " SET shoptype = REPLACE(shoptype, '0', 'NORMAL')");
ps.executeUpdate();
ps.close();
ps = conn.prepareStatement("UPDATE " + table + " SET shoptype = REPLACE(shoptype, '1', 'INFINITE')");
ps.executeUpdate();
return getShopType(id);
}
return ShopType.valueOf(rs.getString("shoptype"));
} }
} }
} catch (SQLException ex) { } catch (SQLException ex) {
if (ex.getMessage().equals("no such column: 'shoptype'")){
renameColumnInfiniteToShopType();
return getShopType(id);
}
plugin.getLogger().log(Level.SEVERE, Errors.sqlConnectionExecute(), ex); plugin.getLogger().log(Level.SEVERE, Errors.sqlConnectionExecute(), ex);
} finally { } finally {
try { try {
@ -416,7 +477,7 @@ public abstract class Database {
} }
} }
return false; return ShopType.NORMAL;
} }
public Shop getShop(int id) { public Shop getShop(int id) {
@ -425,10 +486,10 @@ public abstract class Database {
ItemStack product = getProduct(id); ItemStack product = getProduct(id);
double buyPrice = getBuyPrice(id); double buyPrice = getBuyPrice(id);
double sellPrice = getSellPrice(id); double sellPrice = getSellPrice(id);
boolean infinite = isInfinite(id); ShopType shopType = getShopType(id);
if (ShopUtils.isShop(location)) return ShopUtils.getShop(location); if (ShopUtils.isShop(location)) return ShopUtils.getShop(location);
else return new Shop(plugin, vendor, product, location, buyPrice, sellPrice, infinite); else return new Shop(plugin, vendor, product, location, buyPrice, sellPrice, shopType);
} }
@ -437,7 +498,7 @@ public abstract class Database {
PreparedStatement ps = null; PreparedStatement ps = null;
try { try {
conn = getSQLConnection(); conn = getSQLConnection();
ps = conn.prepareStatement("REPLACE INTO " + table + " (id,vendor,product,world,x,y,z,buyprice,sellprice,infinite) VALUES(?,?,?,?,?,?,?,?,?,?)"); ps = conn.prepareStatement("REPLACE INTO " + table + " (id,vendor,product,world,x,y,z,buyprice,sellprice,shoptype) VALUES(?,?,?,?,?,?,?,?,?,?)");
ps.setInt(1, id); ps.setInt(1, id);
ps.setString(2, shop.getVendor().getUniqueId().toString()); ps.setString(2, shop.getVendor().getUniqueId().toString());
@ -448,7 +509,7 @@ public abstract class Database {
ps.setInt(7, shop.getLocation().getBlockZ()); ps.setInt(7, shop.getLocation().getBlockZ());
ps.setDouble(8, shop.getBuyPrice()); ps.setDouble(8, shop.getBuyPrice());
ps.setDouble(9, shop.getSellPrice()); ps.setDouble(9, shop.getSellPrice());
ps.setBoolean(10, shop.isInfinite()); ps.setString(10, shop.getShopType().toString());
ps.executeUpdate(); ps.executeUpdate();
return; return;

View File

@ -19,21 +19,6 @@ public class SQLite extends Database {
dbname = "shops"; dbname = "shops";
} }
public String SQLiteCreateTokensTable = "CREATE TABLE IF NOT EXISTS shop_list (" +
"`id` int(11) NOT NULL," +
"`vendor` varchar(32) NOT NULL," +
"`product` varchar(32) NOT NULL," +
"`world` varchar(32) NOT NULL," +
"`x` int(11) NOT NULL," +
"`y` int(11) NOT NULL," +
"`z` int(11) NOT NULL," +
"`buyprice` float(32) NOT NULL," +
"`sellprice` float(32) NOT NULL," +
"`infinite` boolean NOT NULL," +
"PRIMARY KEY (`id`)" +
");";
// SQL creation stuff, You can leave the below stuff untouched. // SQL creation stuff, You can leave the below stuff untouched.
public Connection getSQLConnection() { public Connection getSQLConnection() {
File dataFolder = new File(plugin.getDataFolder(), dbname+".db"); File dataFolder = new File(plugin.getDataFolder(), dbname+".db");

View File

@ -5,6 +5,8 @@ import java.util.HashMap;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import de.epiceric.shopchest.shop.Shop.ShopType;
public class ClickType { public class ClickType {
private static HashMap<OfflinePlayer, ClickType> playerClickType = new HashMap<>(); private static HashMap<OfflinePlayer, ClickType> playerClickType = new HashMap<>();
@ -32,18 +34,18 @@ public class ClickType {
private ItemStack product; private ItemStack product;
private double buyPrice; private double buyPrice;
private double sellPrice; private double sellPrice;
private boolean infinite; private ShopType shopType;
public ClickType(EnumClickType enumClickType) { public ClickType(EnumClickType enumClickType) {
this.enumClickType = enumClickType; this.enumClickType = enumClickType;
} }
public ClickType(EnumClickType enumClickType, ItemStack product, double buyPrice, double sellPrice, boolean infinite) { public ClickType(EnumClickType enumClickType, ItemStack product, double buyPrice, double sellPrice, ShopType shopType) {
this.enumClickType = enumClickType; this.enumClickType = enumClickType;
this.product = product; this.product = product;
this.sellPrice = sellPrice; this.sellPrice = sellPrice;
this.buyPrice = buyPrice; this.buyPrice = buyPrice;
this.infinite = infinite; this.shopType = shopType;
} }
public EnumClickType getClickType() { public EnumClickType getClickType() {
@ -62,8 +64,8 @@ public class ClickType {
return sellPrice; return sellPrice;
} }
public boolean isInfinite() { public ShopType getShopType() {
return infinite; return shopType;
} }
} }