diff --git a/pom.xml b/pom.xml index 738aa5b..acf154a 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.maxgamer QuickShop - 1.8.3 + 1.8.4 快捷商店重置版本... ${project.name} @@ -56,7 +56,11 @@ http://ci.citycraft.cn:8080 DEBUG &a全新版本 &c虚拟悬浮物(橙子提供 对 就是那个汉化COI的逗比) &e7老板修复逗比BUG... - &b1.8.3 - &c修复漏斗传输NPE错误...;&b1.8.2 - &c修复箱子的标题为Null是产生的报错...;&b1.8.1 - &c修复PlayerInteractEvent错误参数导致GuiShopManager的报错...; + + &b1.8.4 - &c清理多余的监听事件...; + &b1.8.3 - &c修复漏斗传输NPE错误...; + &b1.8.2 - &c修复箱子的标题为Null是产生的报错...; + &b1.8.1 - &c修复PlayerInteractEvent错误参数导致GuiShopManager的报错...; UTF-8 diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandBuy.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandBuy.java deleted file mode 100644 index 52cf178..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandBuy.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import org.bukkit.block.Block; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.util.BlockIterator; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Shop.Shop; -import org.maxgamer.QuickShop.Shop.ShopType; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; - -public class CommandBuy extends BaseCommand { - QuickShop plugin; - - public CommandBuy(final QuickShop plugin) { - super("b"); - this.plugin = plugin; - setOnlyPlayerExecutable(); - setPermission("quickshop.create.buy"); - setDescription(MsgUtil.p("command.description.buy")); - } - - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - final BlockIterator bIt = new BlockIterator((Player) sender, 10); - while (bIt.hasNext()) { - final Block b = bIt.next(); - final Shop shop = plugin.getShopManager().getShop(b.getLocation()); - if (shop != null && shop.getOwner().equals(((Player) sender).getName())) { - shop.setShopType(ShopType.BUYING); - shop.setSignText(); - shop.update(); - sender.sendMessage(MsgUtil.p("command.now-buying", shop.getDataName())); - return; - } - } - sender.sendMessage(MsgUtil.p("not-looking-at-shop")); - return; - } - -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandClean.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandClean.java deleted file mode 100644 index 7a69fca..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandClean.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import java.util.Iterator; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Shop.ContainerShop; -import org.maxgamer.QuickShop.Shop.Shop; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; - -public class CommandClean extends BaseCommand { - QuickShop plugin; - - public CommandClean(final QuickShop plugin) { - super("c"); - this.plugin = plugin; - setPermission("quickshop.clean"); - setDescription(MsgUtil.p("command.description.clean")); - } - - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - sender.sendMessage(MsgUtil.p("command.cleaning")); - final Iterator shIt = plugin.getShopManager().getShopIterator(); - int i = 0; - while (shIt.hasNext()) { - final Shop shop = shIt.next(); - try { - if (shop.getLocation().getWorld() != null && shop.isSelling() && shop.getRemainingStock() == 0 && shop instanceof ContainerShop) { - final ContainerShop cs = (ContainerShop) shop; - if (cs.isDoubleShop()) { - continue; - } - shIt.remove(); // Is selling, but has no stock, and is a chest shop, but is not a double shop. Can be deleted safely. - i++; - } - } catch (final IllegalStateException e) { - // shIt.remove(); // The shop is not there anymore, remove it - } - } - MsgUtil.clean(); - sender.sendMessage(MsgUtil.p("command.cleaned", "" + i)); - return; - } -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandEmpty.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandEmpty.java deleted file mode 100644 index b97a873..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandEmpty.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import org.bukkit.block.Block; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.util.BlockIterator; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Shop.ContainerShop; -import org.maxgamer.QuickShop.Shop.Shop; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; - -public class CommandEmpty extends BaseCommand { - QuickShop plugin; - - public CommandEmpty(final QuickShop plugin) { - super("e"); - this.plugin = plugin; - setPermission("quickshop.empty"); - setDescription(MsgUtil.p("command.description.empty")); - } - - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - final BlockIterator bIt = new BlockIterator((Player) sender, 10); - while (bIt.hasNext()) { - final Block b = bIt.next(); - final Shop shop = plugin.getShopManager().getShop(b.getLocation()); - if (shop != null) { - if (shop instanceof ContainerShop) { - final ContainerShop cs = (ContainerShop) shop; - cs.getInventory().clear(); - sender.sendMessage(MsgUtil.p("empty-success")); - } else { - sender.sendMessage(MsgUtil.p("not-looking-at-shop")); - } - return; - } - } - sender.sendMessage(MsgUtil.p("not-looking-at-shop")); - return; - } -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandExport.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandExport.java deleted file mode 100644 index 2c66912..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandExport.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import java.io.File; - -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.ConfigurationSection; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Database.Database; -import org.maxgamer.QuickShop.Database.MySQLCore; -import org.maxgamer.QuickShop.Database.SQLiteCore; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; - -public class CommandExport extends BaseCommand { - QuickShop plugin; - - public CommandExport(final QuickShop plugin) { - super("export"); - this.plugin = plugin; - setPermission("quickshop.export"); - setMinimumArguments(1); - setPossibleArguments("[mysql|sqlite]"); - setDescription(MsgUtil.p("command.description.export")); - } - - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - final String type = args[0].toLowerCase(); - if (type.startsWith("mysql")) { - if (plugin.getDB().getCore() instanceof MySQLCore) { - sender.sendMessage(ChatColor.RED + "数据已保存在 MySQL 无需转换!"); - return; - } - final ConfigurationSection cfg = plugin.getConfig().getConfigurationSection("database"); - final String host = cfg.getString("host"); - final String port = cfg.getString("port"); - final String user = cfg.getString("user"); - final String pass = cfg.getString("password"); - final String name = cfg.getString("database"); - final MySQLCore core = new MySQLCore(host, user, pass, name, port); - Database target; - try { - target = new Database(core); - QuickShop.instance.getDB().copyTo(target); - sender.sendMessage(ChatColor.GREEN + "导出成功 - 数据已保存至 MySQL " + user + "@" + host + "." + name); - } catch (final Exception e) { - e.printStackTrace(); - sender.sendMessage(ChatColor.RED + "导出数据到 MySQL 失败 " + user + "@" + host + "." + name + ChatColor.DARK_RED + " 由于: " + e.getMessage()); - } - return; - } - if (type.startsWith("sql") || type.contains("file")) { - if (plugin.getDB().getCore() instanceof SQLiteCore) { - sender.sendMessage(ChatColor.RED + "数据已保存在 SQLite 无需转换!"); - return; - } - final File file = new File(plugin.getDataFolder(), "shops.db"); - if (file.exists()) { - if (file.delete() == false) { - sender.sendMessage(ChatColor.RED + "警告: 删除旧的数据文件 shops.db 失败. 可能会导致部分信息错误."); - } - } - final SQLiteCore core = new SQLiteCore(file); - try { - final Database target = new Database(core); - QuickShop.instance.getDB().copyTo(target); - sender.sendMessage(ChatColor.GREEN + "导出成功 - 数据已保存至 SQLite: " + file.toString()); - } catch (final Exception e) { - e.printStackTrace(); - sender.sendMessage(ChatColor.RED + "导出数据到 SQLite: " + file.toString() + " 失败 由于: " + e.getMessage()); - } - return; - } - } -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandFind.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandFind.java deleted file mode 100644 index 296920e..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandFind.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import java.util.HashMap; - -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Shop.Shop; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; -import cn.citycraft.PluginHelper.utils.StringUtil; - -public class CommandFind extends BaseCommand { - QuickShop plugin; - - public CommandFind(final QuickShop plugin) { - super("f"); - this.plugin = plugin; - setMinimumArguments(2); - setOnlyPlayerExecutable(); - setPermission("quickshop.find"); - setDescription(MsgUtil.p("command.description.find")); - } - - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - String lookFor = StringUtil.consolidateStrings(args, 0); - lookFor = lookFor.toLowerCase(); - final Player p = (Player) sender; - final Location loc = p.getEyeLocation().clone(); - final double minDistance = plugin.getConfig().getInt("shop.find-distance"); - double minDistanceSquared = minDistance * minDistance; - final int chunkRadius = (int) minDistance / 16 + 1; - Shop closest = null; - final Chunk c = loc.getChunk(); - for (int x = -chunkRadius + c.getX(); x < chunkRadius + c.getX(); x++) { - for (int z = -chunkRadius + c.getZ(); z < chunkRadius + c.getZ(); z++) { - final Chunk d = c.getWorld().getChunkAt(x, z); - final HashMap inChunk = plugin.getShopManager().getShops(d); - if (inChunk == null) { - continue; - } - for (final Shop shop : inChunk.values()) { - if (shop.getDataName().toLowerCase().contains(lookFor) && shop.getLocation().distanceSquared(loc) < minDistanceSquared) { - closest = shop; - minDistanceSquared = shop.getLocation().distanceSquared(loc); - } - } - } - } - if (closest == null) { - sender.sendMessage(MsgUtil.p("no-nearby-shop", args[0])); - return; - } - final Location lookat = closest.getLocation().clone().add(0.5, 0.5, 0.5); - // Hack fix to make /qs find not used by /back - p.teleport(this.lookAt(loc, lookat).add(0, -1.62, 0), TeleportCause.PLUGIN); - p.sendMessage(MsgUtil.p("nearby-shop-this-way", "" + (int) Math.floor(Math.sqrt(minDistanceSquared)))); - return; - } - - /** - * Returns loc with modified pitch/yaw angles so it faces lookat - * - * @param loc - * The location a players head is - * @param lookat - * The location they should be looking - * @return The location the player should be facing to have their crosshairs - * on the location lookAt Kudos to bergerkiller for most of this - * function - */ - public Location lookAt(Location loc, final Location lookat) { - // Clone the loc to prevent applied changes to the input loc - loc = loc.clone(); - // Values of change in distance (make it relative) - final double dx = lookat.getX() - loc.getX(); - final double dy = lookat.getY() - loc.getY(); - final double dz = lookat.getZ() - loc.getZ(); - // Set yaw - if (dx != 0) { - // Set yaw start value based on dx - if (dx < 0) { - loc.setYaw((float) (1.5 * Math.PI)); - } else { - loc.setYaw((float) (0.5 * Math.PI)); - } - loc.setYaw(loc.getYaw() - (float) Math.atan(dz / dx)); - } else if (dz < 0) { - loc.setYaw((float) Math.PI); - } - // Get the distance from dx/dz - final double dxz = Math.sqrt(Math.pow(dx, 2) + Math.pow(dz, 2)); - final float pitch = (float) -Math.atan(dy / dxz); - // Set values, convert to degrees - // Minecraft yaw (vertical) angles are inverted (negative) - loc.setYaw(-loc.getYaw() * 180f / (float) Math.PI + 360); - // But pitch angles are normal - loc.setPitch(pitch * 180f / (float) Math.PI); - return loc; - } -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandInfo.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandInfo.java deleted file mode 100644 index 5610a61..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandInfo.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import java.util.HashMap; - -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Shop.ContainerShop; -import org.maxgamer.QuickShop.Shop.Shop; -import org.maxgamer.QuickShop.Shop.ShopChunk; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; - -public class CommandInfo extends BaseCommand { - QuickShop plugin; - - public CommandInfo(final QuickShop plugin) { - super("i"); - this.plugin = plugin; - setPermission("quickshop.info"); - setDescription(MsgUtil.p("command.description.info")); - } - - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - int buying, selling, doubles, chunks, worlds, unlimited; - buying = selling = doubles = chunks = worlds = unlimited = 0; - int nostock = 0; - sender.sendMessage(ChatColor.RED + "开始检索商店信息中..."); - for (final HashMap> inWorld : plugin.getShopManager().getShops().values()) { - worlds++; - for (final HashMap inChunk : inWorld.values()) { - chunks++; - for (final Shop shop : inChunk.values()) { - if (shop.isUnlimited()) { - unlimited++; - } - if (shop.isBuying()) { - buying++; - } else if (shop.isSelling()) { - selling++; - } - if (shop instanceof ContainerShop && ((ContainerShop) shop).isDoubleShop()) { - doubles++; - } else if (shop.isSelling() && shop.getRemainingStock() == 0) { - nostock++; - } - } - } - } - sender.sendMessage(MsgUtil.p("info.title", chunks, buying + selling, worlds)); - sender.sendMessage(MsgUtil.p("info.selling", selling)); - sender.sendMessage(MsgUtil.p("info.buying", buying)); - sender.sendMessage(MsgUtil.p("info.unlimited", unlimited)); - sender.sendMessage(MsgUtil.p("info.double", doubles)); - sender.sendMessage(MsgUtil.p("info.canclean", nostock)); - } -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandPrice.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandPrice.java deleted file mode 100644 index 8ee4ae0..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandPrice.java +++ /dev/null @@ -1,99 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import org.bukkit.block.Block; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.util.BlockIterator; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Shop.ContainerShop; -import org.maxgamer.QuickShop.Shop.Shop; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; - -public class CommandPrice extends BaseCommand { - QuickShop plugin; - - public CommandPrice(final QuickShop plugin) { - super("p"); - this.plugin = plugin; - setMinimumArguments(1); - setOnlyPlayerExecutable(); - setPossibleArguments("<价格>"); - setPermission("quickshop.create.changeprice"); - setDescription(MsgUtil.p("command.description.price")); - } - - @SuppressWarnings("deprecation") - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - final Player p = (Player) sender; - double price; - try { - price = Double.parseDouble(args[0]); - } catch (final NumberFormatException e) { - sender.sendMessage(MsgUtil.p("thats-not-a-number")); - return; - } - if (price < 0.01) { - sender.sendMessage(MsgUtil.p("price-too-cheap")); - return; - } - double fee = 0; - if (plugin.getConfigManager().isPriceChangeRequiresFee()) { - fee = plugin.getConfigManager().getFeeForPriceChange(); - if (fee > 0 && plugin.getEcon().getBalance(p.getName()) < fee) { - sender.sendMessage(MsgUtil.p("you-cant-afford-to-change-price", plugin.getEcon().format(fee))); - return; - } - } - final BlockIterator bIt = new BlockIterator(p, 10); - // Loop through every block they're looking at upto 10 blocks away - while (bIt.hasNext()) { - final Block b = bIt.next(); - final Shop shop = plugin.getShopManager().getShop(b.getLocation()); - if (shop != null && (shop.getOwner().equals(p.getName()) || sender.hasPermission("quickshop.other.price"))) { - if (shop.getPrice() == price) { - // Stop here if there isn't a price change - sender.sendMessage(MsgUtil.p("no-price-change")); - return; - } - if (fee > 0) { - if (!plugin.getEcon().withdraw(p.getName(), fee)) { - sender.sendMessage(MsgUtil.p("you-cant-afford-to-change-price", plugin.getEcon().format(fee))); - return; - } - sender.sendMessage(MsgUtil.p("fee-charged-for-price-change", plugin.getEcon().format(fee))); - plugin.getEcon().deposit(plugin.getConfig().getString("tax-account"), fee); - } - // Update the shop - shop.setPrice(price); - shop.setSignText(); - shop.update(); - sender.sendMessage(MsgUtil.p("price-is-now", plugin.getEcon().format(shop.getPrice()))); - // Chest shops can be double shops. - if (shop instanceof ContainerShop) { - final ContainerShop cs = (ContainerShop) shop; - if (cs.isDoubleShop()) { - final Shop nextTo = cs.getAttachedShop(); - if (cs.isSelling()) { - if (cs.getPrice() < nextTo.getPrice()) { - sender.sendMessage(MsgUtil.p("buying-more-than-selling")); - } - } else { - // Buying - if (cs.getPrice() > nextTo.getPrice()) { - sender.sendMessage(MsgUtil.p("buying-more-than-selling")); - } - } - } - } - return; - } - } - sender.sendMessage(MsgUtil.p("not-looking-at-shop")); - return; - } -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandRefill.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandRefill.java deleted file mode 100644 index 23f681e..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandRefill.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import org.bukkit.block.Block; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.util.BlockIterator; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Shop.Shop; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; - -public class CommandRefill extends BaseCommand { - QuickShop plugin; - - public CommandRefill(final QuickShop plugin) { - super("r"); - this.plugin = plugin; - setMinimumArguments(1); - setPossibleArguments("<数量>"); - setPermission("quickshop.refill"); - setDescription(MsgUtil.p("command.description.refill")); - } - - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - int add; - try { - add = Integer.parseInt(args[0]); - } catch (final NumberFormatException e) { - sender.sendMessage(MsgUtil.p("thats-not-a-number")); - return; - } - final BlockIterator bIt = new BlockIterator((Player) sender, 10); - while (bIt.hasNext()) { - final Block b = bIt.next(); - final Shop shop = plugin.getShopManager().getShop(b.getLocation()); - if (shop != null) { - shop.add(shop.getItem(), add); - sender.sendMessage(MsgUtil.p("refill-success")); - return; - } - } - sender.sendMessage(MsgUtil.p("not-looking-at-shop")); - return; - } -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandReload.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandReload.java deleted file mode 100644 index 7a59a8c..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandReload.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; - -public class CommandReload extends BaseCommand { - QuickShop plugin; - - public CommandReload(final QuickShop plugin) { - super("reload"); - this.plugin = plugin; - setPermission("quickshop.reload"); - setDescription(MsgUtil.p("command.description.reload")); - } - - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - sender.sendMessage(MsgUtil.p("command.reloading")); - plugin.reloadConfig(); - Bukkit.getPluginManager().disablePlugin(plugin); - Bukkit.getPluginManager().enablePlugin(plugin); - return; - } -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandRemove.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandRemove.java deleted file mode 100644 index c17580f..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandRemove.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import org.bukkit.ChatColor; -import org.bukkit.block.Block; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.util.BlockIterator; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Shop.Shop; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; - -public class CommandRemove extends BaseCommand { - QuickShop plugin; - - public CommandRemove(final QuickShop plugin) { - super("r"); - this.plugin = plugin; - setOnlyPlayerExecutable(); - setPermission("quickshop.delete"); - setDescription(MsgUtil.p("command.description.remove")); - } - - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - final Player p = (Player) sender; - final BlockIterator bIt = new BlockIterator(p, 10); - while (bIt.hasNext()) { - final Block b = bIt.next(); - final Shop shop = plugin.getShopManager().getShop(b.getLocation()); - if (shop != null) { - if (shop.getOwner().equals(p.getName())) { - shop.delete(); - sender.sendMessage(ChatColor.GREEN + "商店已成功移除"); - } else { - p.sendMessage(ChatColor.RED + "这个不是你的商店!"); - } - return; - } - } - p.sendMessage(ChatColor.RED + "未找到商店!"); - } -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandSell.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandSell.java deleted file mode 100644 index 844e811..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandSell.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import org.bukkit.block.Block; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.util.BlockIterator; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Shop.Shop; -import org.maxgamer.QuickShop.Shop.ShopType; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; - -public class CommandSell extends BaseCommand { - QuickShop plugin; - - public CommandSell(final QuickShop plugin) { - super("s"); - this.plugin = plugin; - setPermission("quickshop.create.sell"); - setOnlyPlayerExecutable(); - setDescription(MsgUtil.p("command.description.sell")); - } - - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - final BlockIterator bIt = new BlockIterator((Player) sender, 10); - while (bIt.hasNext()) { - final Block b = bIt.next(); - final Shop shop = plugin.getShopManager().getShop(b.getLocation()); - if (shop != null && shop.getOwner().equals(((Player) sender).getName())) { - shop.setShopType(ShopType.SELLING); - shop.setSignText(); - shop.update(); - sender.sendMessage(MsgUtil.p("command.now-selling", shop.getDataName())); - return; - } - } - sender.sendMessage(MsgUtil.p("not-looking-at-shop")); - return; - } -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandSetOwner.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandSetOwner.java deleted file mode 100644 index dfd31b5..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandSetOwner.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import org.bukkit.block.Block; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.util.BlockIterator; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Shop.Shop; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; - -public class CommandSetOwner extends BaseCommand { - QuickShop plugin; - - public CommandSetOwner(final QuickShop plugin) { - super("so"); - this.plugin = plugin; - setOnlyPlayerExecutable(); - setMinimumArguments(1); - setPermission("quickshop.setowner"); - setDescription(MsgUtil.p("command.description.setowner")); - } - - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - final BlockIterator bIt = new BlockIterator((Player) sender, 10); - while (bIt.hasNext()) { - final Block b = bIt.next(); - final Shop shop = plugin.getShopManager().getShop(b.getLocation()); - if (shop != null) { - shop.setOwner(args[0]); - shop.update(); - sender.sendMessage(MsgUtil.p("command.new-owner", args[0])); - return; - } - } - sender.sendMessage(MsgUtil.p("not-looking-at-shop")); - return; - } - -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/CommandUnlimited.java b/src/main/java/org/maxgamer/QuickShop/Command/CommandUnlimited.java deleted file mode 100644 index 380ec88..0000000 --- a/src/main/java/org/maxgamer/QuickShop/Command/CommandUnlimited.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.maxgamer.QuickShop.Command; - -import org.bukkit.block.Block; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.util.BlockIterator; -import org.maxgamer.QuickShop.QuickShop; -import org.maxgamer.QuickShop.Shop.Shop; -import org.maxgamer.QuickShop.Util.MsgUtil; - -import cn.citycraft.PluginHelper.commands.BaseCommand; - -public class CommandUnlimited extends BaseCommand { - QuickShop plugin; - - public CommandUnlimited(final QuickShop plugin) { - super("u"); - this.plugin = plugin; - setOnlyPlayerExecutable(); - setPermission("quickshop.unlimited"); - setDescription(MsgUtil.p("command.description.unlimited")); - } - - @Override - public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException { - final BlockIterator bIt = new BlockIterator((Player) sender, 10); - while (bIt.hasNext()) { - final Block b = bIt.next(); - final Shop shop = plugin.getShopManager().getShop(b.getLocation()); - if (shop != null) { - shop.setUnlimited(!shop.isUnlimited()); - shop.update(); - sender.sendMessage(MsgUtil.p("command.toggle-unlimited", (shop.isUnlimited() ? "无限模式" : "有限模式"))); - return; - } - } - sender.sendMessage(MsgUtil.p("not-looking-at-shop")); - return; - } - -} diff --git a/src/main/java/org/maxgamer/QuickShop/Command/QuickShopCommands.java b/src/main/java/org/maxgamer/QuickShop/Command/QuickShopCommands.java index 8208e64..6b48e79 100644 --- a/src/main/java/org/maxgamer/QuickShop/Command/QuickShopCommands.java +++ b/src/main/java/org/maxgamer/QuickShop/Command/QuickShopCommands.java @@ -1,39 +1,459 @@ package org.maxgamer.QuickShop.Command; -import org.bukkit.command.Command; -import org.bukkit.command.CommandException; +import java.io.File; +import java.util.HashMap; +import java.util.Iterator; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.block.Block; import org.bukkit.command.CommandSender; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.util.BlockIterator; import org.maxgamer.QuickShop.QuickShop; +import org.maxgamer.QuickShop.Database.Database; +import org.maxgamer.QuickShop.Database.MySQLCore; +import org.maxgamer.QuickShop.Database.SQLiteCore; +import org.maxgamer.QuickShop.Shop.ContainerShop; +import org.maxgamer.QuickShop.Shop.Shop; +import org.maxgamer.QuickShop.Shop.ShopChunk; +import org.maxgamer.QuickShop.Shop.ShopType; +import org.maxgamer.QuickShop.Util.MsgUtil; -import cn.citycraft.PluginHelper.commands.DefaultCommand; -import cn.citycraft.PluginHelper.commands.HandlerSubCommand; +import cn.citycraft.PluginHelper.commands.HandlerCommand; +import cn.citycraft.PluginHelper.commands.HandlerCommands; +import cn.citycraft.PluginHelper.commands.HandlerDescription; +import cn.citycraft.PluginHelper.commands.InvokeCommandEvent; +import cn.citycraft.PluginHelper.commands.InvokeSubCommand; +import cn.citycraft.PluginHelper.utils.StringUtil; -public class QuickShopCommands implements DefaultCommand { - HandlerSubCommand hsc; +public class QuickShopCommands implements HandlerCommands, HandlerDescription { QuickShop plugin; public QuickShopCommands(final QuickShop plugin) { this.plugin = plugin; - hsc = new HandlerSubCommand(plugin, "qs"); - hsc.setDefaultCommand(this); - hsc.registerCommand(new CommandClean(plugin)); - hsc.registerCommand(new CommandEmpty(plugin)); - hsc.registerCommand(new CommandExport(plugin)); - hsc.registerCommand(new CommandFind(plugin)); - hsc.registerCommand(new CommandInfo(plugin)); - hsc.registerCommand(new CommandPrice(plugin)); - hsc.registerCommand(new CommandRefill(plugin)); - hsc.registerCommand(new CommandReload(plugin)); - hsc.registerCommand(new CommandRemove(plugin)); - hsc.registerCommand(new CommandBuy(plugin)); - hsc.registerCommand(new CommandSetOwner(plugin)); - hsc.registerCommand(new CommandSell(plugin)); - hsc.registerCommand(new CommandUnlimited(plugin)); + final InvokeSubCommand ics = new InvokeSubCommand(plugin, "qs"); + ics.registerCommands(this); + ics.setHandlerDescription(this); + } + + @HandlerCommand(name = "buy", aliases = { "b" }, permission = "quickshop.create.buy", onlyPlayerExecutable = true, description = "command.description.buy") + public void buy(final InvokeCommandEvent e) { + changeShopType(e.getSender(), ShopType.BUYING); + } + + @HandlerCommand(name = "clean", aliases = "c", permission = "quickshop.clean", description = "command.description.clean") + public void clean(final InvokeCommandEvent e) { + final CommandSender sender = e.getSender(); + sender.sendMessage(MsgUtil.p("command.cleaning")); + final Iterator shIt = plugin.getShopManager().getShopIterator(); + int i = 0; + while (shIt.hasNext()) { + final Shop shop = shIt.next(); + try { + if (shop.getLocation().getWorld() != null && shop.isSelling() && shop.getRemainingStock() == 0 && shop instanceof ContainerShop) { + final ContainerShop cs = (ContainerShop) shop; + if (cs.isDoubleShop()) { + continue; + } + shIt.remove(); // Is selling, but has no stock, and is a chest shop, but is not a double shop. Can be deleted safely. + i++; + } + } catch (final IllegalStateException ex) { + // shIt.remove(); // The shop is not there anymore, remove it + } + } + MsgUtil.clean(); + sender.sendMessage(MsgUtil.p("command.cleaned", "" + i)); + } + + @HandlerCommand(name = "empty", aliases = "e", permission = "quickshop.empty", description = "command.description.empty") + public void empty(final InvokeCommandEvent e) { + final CommandSender sender = e.getSender(); + final BlockIterator bIt = new BlockIterator((Player) sender, 10); + while (bIt.hasNext()) { + final Block b = bIt.next(); + final Shop shop = plugin.getShopManager().getShop(b.getLocation()); + if (shop != null) { + if (shop instanceof ContainerShop) { + final ContainerShop cs = (ContainerShop) shop; + cs.getInventory().clear(); + sender.sendMessage(MsgUtil.p("empty-success")); + } else { + sender.sendMessage(MsgUtil.p("not-looking-at-shop")); + } + return; + } + } + sender.sendMessage(MsgUtil.p("not-looking-at-shop")); + return; + } + + @HandlerCommand(name = "export", minimumArguments = 1, possibleArguments = "[mysql|sqlite]", permission = "quickshop.export", description = "command.description.export") + public void export(final InvokeCommandEvent e) { + final CommandSender sender = e.getSender(); + final String type = e.getArgs()[0].toLowerCase(); + if (type.startsWith("mysql")) { + if (plugin.getDB().getCore() instanceof MySQLCore) { + sender.sendMessage(ChatColor.RED + "数据已保存在 MySQL 无需转换!"); + return; + } + final ConfigurationSection cfg = plugin.getConfig().getConfigurationSection("database"); + final String host = cfg.getString("host"); + final String port = cfg.getString("port"); + final String user = cfg.getString("user"); + final String pass = cfg.getString("password"); + final String name = cfg.getString("database"); + final MySQLCore core = new MySQLCore(host, user, pass, name, port); + Database target; + try { + target = new Database(core); + QuickShop.instance.getDB().copyTo(target); + sender.sendMessage(ChatColor.GREEN + "导出成功 - 数据已保存至 MySQL " + user + "@" + host + "." + name); + } catch (final Exception ex) { + ex.printStackTrace(); + sender.sendMessage(ChatColor.RED + "导出数据到 MySQL 失败 " + user + "@" + host + "." + name + ChatColor.DARK_RED + " 由于: " + ex.getMessage()); + } + return; + } + if (type.startsWith("sql") || type.contains("file")) { + if (plugin.getDB().getCore() instanceof SQLiteCore) { + sender.sendMessage(ChatColor.RED + "数据已保存在 SQLite 无需转换!"); + return; + } + final File file = new File(plugin.getDataFolder(), "shops.db"); + if (file.exists()) { + if (file.delete() == false) { + sender.sendMessage(ChatColor.RED + "警告: 删除旧的数据文件 shops.db 失败. 可能会导致部分信息错误."); + } + } + final SQLiteCore core = new SQLiteCore(file); + try { + final Database target = new Database(core); + QuickShop.instance.getDB().copyTo(target); + sender.sendMessage(ChatColor.GREEN + "导出成功 - 数据已保存至 SQLite: " + file.toString()); + } catch (final Exception ex) { + ex.printStackTrace(); + sender.sendMessage(ChatColor.RED + "导出数据到 SQLite: " + file.toString() + " 失败 由于: " + ex.getMessage()); + } + return; + } + } + + @HandlerCommand(name = "find", aliases = "f", minimumArguments = 2, onlyPlayerExecutable = true, permission = "quickshop.find", description = "command.description.find") + public void find(final InvokeCommandEvent e) { + final CommandSender sender = e.getSender(); + String lookFor = StringUtil.consolidateStrings(e.getArgs(), 0); + lookFor = lookFor.toLowerCase(); + final Player p = (Player) sender; + final Location loc = p.getEyeLocation().clone(); + final double minDistance = plugin.getConfig().getInt("shop.find-distance"); + double minDistanceSquared = minDistance * minDistance; + final int chunkRadius = (int) minDistance / 16 + 1; + Shop closest = null; + final Chunk c = loc.getChunk(); + for (int x = -chunkRadius + c.getX(); x < chunkRadius + c.getX(); x++) { + for (int z = -chunkRadius + c.getZ(); z < chunkRadius + c.getZ(); z++) { + final Chunk d = c.getWorld().getChunkAt(x, z); + final HashMap inChunk = plugin.getShopManager().getShops(d); + if (inChunk == null) { + continue; + } + for (final Shop shop : inChunk.values()) { + if (shop.getDataName().toLowerCase().contains(lookFor) && shop.getLocation().distanceSquared(loc) < minDistanceSquared) { + closest = shop; + minDistanceSquared = shop.getLocation().distanceSquared(loc); + } + } + } + } + if (closest == null) { + sender.sendMessage(MsgUtil.p("no-nearby-shop", e.getArgs()[0])); + return; + } + final Location lookat = closest.getLocation().clone().add(0.5, 0.5, 0.5); + // Hack fix to make /qs find not used by /back + p.teleport(this.lookAt(loc, lookat).add(0, -1.62, 0), TeleportCause.PLUGIN); + p.sendMessage(MsgUtil.p("nearby-shop-this-way", "" + (int) Math.floor(Math.sqrt(minDistanceSquared)))); + return; } @Override - public void defaultExecute(final CommandSender sender, final Command command, final String label) throws CommandException { - hsc.sendHelp(sender, label); + public String handler(final String arg0) { + return MsgUtil.p(arg0); + } + + @HandlerCommand(name = "info", aliases = "i", permission = "quickshop.info", description = "command.description.info") + public void info(final InvokeCommandEvent e) { + final CommandSender sender = e.getSender(); + int buying, selling, doubles, chunks, worlds, unlimited; + buying = selling = doubles = chunks = worlds = unlimited = 0; + int nostock = 0; + sender.sendMessage(ChatColor.RED + "开始检索商店信息中..."); + for (final HashMap> inWorld : plugin.getShopManager().getShops().values()) { + worlds++; + for (final HashMap inChunk : inWorld.values()) { + chunks++; + for (final Shop shop : inChunk.values()) { + if (shop.isUnlimited()) { + unlimited++; + } + if (shop.isBuying()) { + buying++; + } else if (shop.isSelling()) { + selling++; + } + if (shop instanceof ContainerShop && ((ContainerShop) shop).isDoubleShop()) { + doubles++; + } else if (shop.isSelling() && shop.getRemainingStock() == 0) { + nostock++; + } + } + } + } + sender.sendMessage(MsgUtil.p("info.title", chunks, buying + selling, worlds)); + sender.sendMessage(MsgUtil.p("info.selling", selling)); + sender.sendMessage(MsgUtil.p("info.buying", buying)); + sender.sendMessage(MsgUtil.p("info.unlimited", unlimited)); + sender.sendMessage(MsgUtil.p("info.double", doubles)); + sender.sendMessage(MsgUtil.p("info.canclean", nostock)); + } + + @HandlerCommand(name = "price", aliases = "p", minimumArguments = 1, onlyPlayerExecutable = true, possibleArguments = "<价格>", permission = "quickshop.create.changeprice", description = "command.description.price") + public void price(final InvokeCommandEvent e) { + final CommandSender sender = e.getSender(); + final Player p = (Player) sender; + double price; + try { + price = Double.parseDouble(e.getArgs()[0]); + } catch (final NumberFormatException ex) { + sender.sendMessage(MsgUtil.p("thats-not-a-number")); + return; + } + if (price < 0.01) { + sender.sendMessage(MsgUtil.p("price-too-cheap")); + return; + } + double fee = 0; + if (plugin.getConfigManager().isPriceChangeRequiresFee()) { + fee = plugin.getConfigManager().getFeeForPriceChange(); + if (fee > 0 && plugin.getEcon().getBalance(p.getName()) < fee) { + sender.sendMessage(MsgUtil.p("you-cant-afford-to-change-price", plugin.getEcon().format(fee))); + return; + } + } + final BlockIterator bIt = new BlockIterator(p, 10); + // Loop through every block they're looking at upto 10 blocks away + while (bIt.hasNext()) { + final Block b = bIt.next(); + final Shop shop = plugin.getShopManager().getShop(b.getLocation()); + if (shop != null && (shop.getOwner().equals(p.getName()) || sender.hasPermission("quickshop.other.price"))) { + if (shop.getPrice() == price) { + // Stop here if there isn't a price change + sender.sendMessage(MsgUtil.p("no-price-change")); + return; + } + if (fee > 0) { + if (!plugin.getEcon().withdraw(p.getName(), fee)) { + sender.sendMessage(MsgUtil.p("you-cant-afford-to-change-price", plugin.getEcon().format(fee))); + return; + } + sender.sendMessage(MsgUtil.p("fee-charged-for-price-change", plugin.getEcon().format(fee))); + plugin.getEcon().deposit(plugin.getConfig().getString("tax-account"), fee); + } + // Update the shop + shop.setPrice(price); + shop.setSignText(); + shop.update(); + sender.sendMessage(MsgUtil.p("price-is-now", plugin.getEcon().format(shop.getPrice()))); + // Chest shops can be double shops. + if (shop instanceof ContainerShop) { + final ContainerShop cs = (ContainerShop) shop; + if (cs.isDoubleShop()) { + final Shop nextTo = cs.getAttachedShop(); + if (cs.isSelling()) { + if (cs.getPrice() < nextTo.getPrice()) { + sender.sendMessage(MsgUtil.p("buying-more-than-selling")); + } + } else { + // Buying + if (cs.getPrice() > nextTo.getPrice()) { + sender.sendMessage(MsgUtil.p("buying-more-than-selling")); + } + } + } + } + return; + } + } + sender.sendMessage(MsgUtil.p("not-looking-at-shop")); + return; + } + + @HandlerCommand(name = "refill", minimumArguments = 1, possibleArguments = "<数量>", permission = "quickshop.refill", description = "command.description.refill") + public void refill(final InvokeCommandEvent e) { + final CommandSender sender = e.getSender(); + int add; + try { + add = Integer.parseInt(e.getArgs()[0]); + } catch (final NumberFormatException ex) { + sender.sendMessage(MsgUtil.p("thats-not-a-number")); + return; + } + final BlockIterator bIt = new BlockIterator((Player) sender, 10); + while (bIt.hasNext()) { + final Block b = bIt.next(); + final Shop shop = plugin.getShopManager().getShop(b.getLocation()); + if (shop != null) { + shop.add(shop.getItem(), add); + sender.sendMessage(MsgUtil.p("refill-success")); + return; + } + } + sender.sendMessage(MsgUtil.p("not-looking-at-shop")); + return; + } + + @HandlerCommand(name = "reload", permission = "quickshop.reload", description = "command.description.reload") + public void reload(final InvokeCommandEvent e) { + final CommandSender sender = e.getSender(); + sender.sendMessage(MsgUtil.p("command.reloading")); + plugin.reloadConfig(); + Bukkit.getPluginManager().disablePlugin(plugin); + Bukkit.getPluginManager().enablePlugin(plugin); + return; + } + + @HandlerCommand(name = "remove", aliases = "r", onlyPlayerExecutable = true, permission = "quickshop.delete", description = "command.description.remove") + public void remove(final InvokeCommandEvent e) { + final Player p = (Player) e.getSender(); + final BlockIterator bIt = new BlockIterator(p, 10); + while (bIt.hasNext()) { + final Block b = bIt.next(); + final Shop shop = plugin.getShopManager().getShop(b.getLocation()); + if (shop != null) { + if (shop.getOwner().equals(p.getName())) { + shop.delete(); + p.sendMessage(ChatColor.GREEN + "商店已成功移除"); + } else { + p.sendMessage(ChatColor.RED + "这个不是你的商店!"); + } + return; + } + } + p.sendMessage(ChatColor.RED + "未找到商店!"); + } + + @HandlerCommand(name = "sell", aliases = { "s" }, permission = "quickshop.create.sell", onlyPlayerExecutable = true, description = "command.description.sell") + public void sell(final InvokeCommandEvent e) { + changeShopType(e.getSender(), ShopType.SELLING); + } + + @HandlerCommand(name = "setowner", aliases = "so", onlyPlayerExecutable = true, minimumArguments = 1, permission = "quickshop.setowner", description = "command.description.setowner") + public void setowner(final InvokeCommandEvent e) { + final CommandSender sender = e.getSender(); + final String owner = e.getArgs()[0]; + final BlockIterator bIt = new BlockIterator((Player) sender, 10); + while (bIt.hasNext()) { + final Block b = bIt.next(); + final Shop shop = plugin.getShopManager().getShop(b.getLocation()); + if (shop != null) { + shop.setOwner(owner); + shop.update(); + sender.sendMessage(MsgUtil.p("command.new-owner", owner)); + return; + } + } + sender.sendMessage(MsgUtil.p("not-looking-at-shop")); + return; + } + + @HandlerCommand(name = "unlimited", onlyPlayerExecutable = true, permission = "quickshop.unlimited", description = "command.description.unlimited") + public void unlimited(final InvokeCommandEvent e) { + final CommandSender sender = e.getSender(); + final BlockIterator bIt = new BlockIterator((Player) sender, 10); + while (bIt.hasNext()) { + final Block b = bIt.next(); + final Shop shop = plugin.getShopManager().getShop(b.getLocation()); + if (shop != null) { + shop.setUnlimited(!shop.isUnlimited()); + shop.update(); + sender.sendMessage(MsgUtil.p("command.toggle-unlimited", (shop.isUnlimited() ? "无限模式" : "有限模式"))); + return; + } + } + sender.sendMessage(MsgUtil.p("not-looking-at-shop")); + return; + } + + private void changeShopType(final CommandSender sender, final ShopType shopType) { + final BlockIterator bIt = new BlockIterator((Player) sender, 10); + while (bIt.hasNext()) { + final Block b = bIt.next(); + final Shop shop = plugin.getShopManager().getShop(b.getLocation()); + if (shop != null && shop.getOwner().equals(((Player) sender).getName())) { + shop.setShopType(shopType); + shop.setSignText(); + shop.update(); + String msgtype = ""; + switch (shopType) { + case BUYING: + msgtype = "command.now-buying"; + break; + case SELLING: + msgtype = "command.now-selling"; + break; + } + sender.sendMessage(MsgUtil.p(msgtype, shop.getDataName())); + return; + } + } + sender.sendMessage(MsgUtil.p("not-looking-at-shop")); + } + + /** + * Returns loc with modified pitch/yaw angles so it faces lookat + * + * @param loc + * The location a players head is + * @param lookat + * The location they should be looking + * @return The location the player should be facing to have their crosshairs + * on the location lookAt Kudos to bergerkiller for most of this + * function + */ + private Location lookAt(Location loc, final Location lookat) { + // Clone the loc to prevent applied changes to the input loc + loc = loc.clone(); + // Values of change in distance (make it relative) + final double dx = lookat.getX() - loc.getX(); + final double dy = lookat.getY() - loc.getY(); + final double dz = lookat.getZ() - loc.getZ(); + // Set yaw + if (dx != 0) { + // Set yaw start value based on dx + if (dx < 0) { + loc.setYaw((float) (1.5 * Math.PI)); + } else { + loc.setYaw((float) (0.5 * Math.PI)); + } + loc.setYaw(loc.getYaw() - (float) Math.atan(dz / dx)); + } else if (dz < 0) { + loc.setYaw((float) Math.PI); + } + // Get the distance from dx/dz + final double dxz = Math.sqrt(Math.pow(dx, 2) + Math.pow(dz, 2)); + final float pitch = (float) -Math.atan(dy / dxz); + // Set values, convert to degrees + // Minecraft yaw (vertical) angles are inverted (negative) + loc.setYaw(-loc.getYaw() * 180f / (float) Math.PI + 360); + // But pitch angles are normal + loc.setPitch(pitch * 180f / (float) Math.PI); + return loc; } } \ No newline at end of file diff --git a/src/main/java/org/maxgamer/QuickShop/Listeners/PlayerListener.java b/src/main/java/org/maxgamer/QuickShop/Listeners/PlayerListener.java index 9407105..0a9b7c5 100644 --- a/src/main/java/org/maxgamer/QuickShop/Listeners/PlayerListener.java +++ b/src/main/java/org/maxgamer/QuickShop/Listeners/PlayerListener.java @@ -16,7 +16,6 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.util.BlockIterator; @@ -75,7 +74,12 @@ public class PlayerListener implements Listener { return; } // Handles creating shops - else if (shop == null && item != null && item.getType() != Material.AIR && p.hasPermission("quickshop.create.sell") && Util.canBeShop(b) && p.getGameMode() != GameMode.CREATIVE + else if (shop == null + && item != null + && item.getType() != Material.AIR + && p.hasPermission("quickshop.create.sell") + && Util.canBeShop(b) + && p.getGameMode() != GameMode.CREATIVE && (plugin.getConfigManager().isSneakCreate() == p.isSneaking())) { if (!plugin.getShopManager().canBuildShop(p, b, e.getBlockFace())) { // As of the new checking system, most plugins will tell the @@ -192,10 +196,4 @@ public class PlayerListener implements Listener { } } } - - @EventHandler(ignoreCancelled = true) - public void onTeleport(final PlayerTeleportEvent e) { - final PlayerMoveEvent me = new PlayerMoveEvent(e.getPlayer(), e.getFrom(), e.getTo()); - onMove(me); - } } \ No newline at end of file diff --git a/src/main/java/org/maxgamer/QuickShop/QuickShop.java b/src/main/java/org/maxgamer/QuickShop/QuickShop.java index 05a5a4f..32f804b 100644 --- a/src/main/java/org/maxgamer/QuickShop/QuickShop.java +++ b/src/main/java/org/maxgamer/QuickShop/QuickShop.java @@ -285,15 +285,14 @@ public class QuickShop extends JavaPlugin { @Override public void onEnable() { - instance = this; if (loadEcon() == false) { return; } + configManager = new ConfigManager(this); LocalUtil.init(this); // Initialize Util Util.initialize(); // Create the shop manager. - configManager = new ConfigManager(this); shopManager = new ShopManager(this); if (configManager.isLogAction()) { // Logger Handler @@ -307,7 +306,7 @@ public class QuickShop extends JavaPlugin { try { final ConfigurationSection dbCfg = getConfig().getConfigurationSection("database"); DatabaseCore dbCore; - if (dbCfg.getBoolean("mysql")) { + if (dbCfg != null && dbCfg.getBoolean("mysql")) { getLogger().info("启用MySQL 开始连接数据库..."); // MySQL database - Required database be created first. final String user = dbCfg.getString("user"); @@ -371,6 +370,7 @@ public class QuickShop extends JavaPlugin { @Override public void onLoad() { + instance = this; config = new FileConfig(this); MsgUtil.init(this); } diff --git a/src/main/java/org/maxgamer/QuickShop/Util/Util.java b/src/main/java/org/maxgamer/QuickShop/Util/Util.java index 60ea6a5..179c44a 100644 --- a/src/main/java/org/maxgamer/QuickShop/Util/Util.java +++ b/src/main/java/org/maxgamer/QuickShop/Util/Util.java @@ -218,7 +218,6 @@ public class Util { blacklist.clear(); shoppables.clear(); transparent.clear(); - plugin = QuickShop.instance; for (final String s : plugin.getConfig().getStringList("shop-blocks")) { Material mat = Material.getMaterial(s.toUpperCase());