From 10bf8c7123a4082fdd6ee51aaa91a4ecd797cb8c Mon Sep 17 00:00:00 2001 From: YuTian <2953516620@qq.com> Date: Sun, 21 Jul 2024 01:10:25 +0800 Subject: [PATCH] 0.1 --- pom.xml | 9 ++- .../io/yutian/auchestshop/AuChestShop.java | 23 ++++++ .../auchestshop/command/subs/CommandTest.java | 30 ++------ .../io/yutian/auchestshop/database/SQLIO.java | 20 +++-- .../yutian/auchestshop/gui/CreateShopGui.java | 4 +- .../auchestshop/listener/ShopListener.java | 49 ++++++++---- .../manager/InteractiveManager.java | 48 +++++++++++- .../auchestshop/manager/ShopManager.java | 65 +++++++++++++++- .../com/io/yutian/auchestshop/shop/Shop.java | 39 ++++++++++ .../yutian/auchestshop/shop/ShopAction.java | 8 ++ .../io/yutian/auchestshop/shop/ShopChunk.java | 3 + .../auchestshop/shop/ShopInteractiveInfo.java | 20 ++++- .../auchestshop/util/ItemStackUtil.java | 77 +++++++++++++++++++ .../io/yutian/auchestshop/util/ShopUtil.java | 12 +++ src/main/resources/lang.yml | 16 +++- 15 files changed, 368 insertions(+), 55 deletions(-) create mode 100644 src/main/java/com/io/yutian/auchestshop/shop/ShopAction.java create mode 100644 src/main/java/com/io/yutian/auchestshop/util/ItemStackUtil.java diff --git a/pom.xml b/pom.xml index c3abade..561c61e 100644 --- a/pom.xml +++ b/pom.xml @@ -35,11 +35,18 @@ com.io.yutian pixelpaper 1.18.2 + provided com.io.yutian AuLib - 1.4.1 + 1.7 + provided + + + net.milkbowl + Vault + 1.7.3 provided diff --git a/src/main/java/com/io/yutian/auchestshop/AuChestShop.java b/src/main/java/com/io/yutian/auchestshop/AuChestShop.java index 49b2091..826e3a4 100644 --- a/src/main/java/com/io/yutian/auchestshop/AuChestShop.java +++ b/src/main/java/com/io/yutian/auchestshop/AuChestShop.java @@ -6,11 +6,18 @@ import com.io.yutian.auchestshop.listener.ShopListener; import com.io.yutian.auchestshop.manager.InteractiveManager; import com.io.yutian.auchestshop.manager.ShopManager; import com.io.yutian.aulib.lang.Lang; +import net.milkbowl.vault.Vault; +import net.milkbowl.vault.economy.Economy; +import org.bukkit.Bukkit; +import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; +import java.math.BigInteger; + public class AuChestShop extends JavaPlugin { private static AuChestShop instance; + private static Economy economy; private static SQLIO sqlIO; private static ShopManager shopManager; @@ -21,6 +28,17 @@ public class AuChestShop extends JavaPlugin { public void onEnable() { instance = this; + RegisteredServiceProvider economyProvider = null; + try { + economyProvider = Bukkit.getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); + } catch (Exception e) { + e.printStackTrace(); + } + + if (economyProvider != null) { + economy = economyProvider.getProvider(); + } + sqlIO = new SQLIO(); commandManager = new CommandManager(); shopManager = new ShopManager(); @@ -37,6 +55,7 @@ public class AuChestShop extends JavaPlugin { e.printStackTrace(); } shopManager.loadAll(sqlIO); + } public void reload() { @@ -56,6 +75,10 @@ public class AuChestShop extends JavaPlugin { return sqlIO; } + public static Economy getEconomy() { + return economy; + } + public static ShopManager getShopManager() { return shopManager; } diff --git a/src/main/java/com/io/yutian/auchestshop/command/subs/CommandTest.java b/src/main/java/com/io/yutian/auchestshop/command/subs/CommandTest.java index a003387..81d4298 100644 --- a/src/main/java/com/io/yutian/auchestshop/command/subs/CommandTest.java +++ b/src/main/java/com/io/yutian/auchestshop/command/subs/CommandTest.java @@ -1,19 +1,17 @@ package com.io.yutian.auchestshop.command.subs; -import com.io.yutian.auchestshop.AuChestShop; import com.io.yutian.auchestshop.shop.Shop; -import com.io.yutian.auchestshop.shop.ShopLocation; -import com.io.yutian.auchestshop.shop.ShopType; -import com.io.yutian.auchestshop.shop.log.ShopLog; +import com.io.yutian.auchestshop.util.ItemStackUtil; import com.io.yutian.aulib.command.CommandContext; import com.io.yutian.aulib.command.ICommand; import com.io.yutian.aulib.command.argument.Argument; import com.io.yutian.aulib.command.argument.ArgumentTypes; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.List; -import java.util.UUID; public class CommandTest extends ICommand { @@ -28,23 +26,11 @@ public class CommandTest extends ICommand { public void executes(CommandContext commandContext) { CommandSender sender = commandContext.getSender(); String type = commandContext.getArgumentsValue("type").getString(); - if (type.equalsIgnoreCase("create")) { - Shop shop = new Shop(UUID.randomUUID(), UUID.randomUUID(), new ShopLocation("world", 0, 10, 0), null, 10, ShopType.BUYING, false, new ShopLog()); - shops.add(shop); - sender.sendMessage("Shop created!"); - } else if (type.equalsIgnoreCase("save")) { - AuChestShop.getSQLIO().saveAllShops(shops); - sender.sendMessage("Shop saved!"); - } else if (type.equalsIgnoreCase("list")) { - System.out.println(shops); - for (Shop shop : shops) { - sender.sendMessage(shop.getUUID()); - sender.sendMessage(shop.getOwner()); - } - } else if (type.equalsIgnoreCase("load")) { - shops = AuChestShop.getSQLIO().loadAllShops(); - System.out.println(shops); - sender.sendMessage("Loaded all shops!"); + if (type.equalsIgnoreCase("eq")) { + Player player = (Player) sender; + ItemStack itemStack = player.getInventory().getItemInMainHand(); + ItemStack itemStack1 = player.getInventory().getItemInOffHand(); + sender.sendMessage("result: "+ItemStackUtil.matches(itemStack, itemStack1)); } } diff --git a/src/main/java/com/io/yutian/auchestshop/database/SQLIO.java b/src/main/java/com/io/yutian/auchestshop/database/SQLIO.java index 075840b..fb9bf76 100644 --- a/src/main/java/com/io/yutian/auchestshop/database/SQLIO.java +++ b/src/main/java/com/io/yutian/auchestshop/database/SQLIO.java @@ -40,7 +40,7 @@ public class SQLIO { .addColumn("data", "TEXT NOT NULL") .setIndex("uuid", IndexType.PRIMARY_KEY) .setTableSettings("") - .build().execute(null); + .build().executeAsync(null); } public List loadAllShops() { @@ -76,7 +76,7 @@ public class SQLIO { .addCondition("uuid", shop.getUUID().toString()) .setColumnValues("owner", shop.getOwner().toString()) .setColumnValues("data", dataJson.toString()) - .build().execute(); + .build().executeAsync(); } else { insertedShops.add(shop); } @@ -103,10 +103,8 @@ public class SQLIO { JSONObject dataJson = SerializeHelper.serialize(shop); sqlManager.createUpdate("shops") .addCondition("uuid", shop.getUUID().toString()) - .setLimit(1) - .setColumnValues("owner", shop.getOwner().toString()) .setColumnValues("data", dataJson.toString()) - .build().execute(); + .build().executeAsync(); } else { JSONObject dataJson = SerializeHelper.serialize(shop); sqlManager.createInsert("shops").setIgnore(false).setColumnNames("uuid", "owner", "data").setParams(new Object[]{shop.getUUID().toString(), shop.getOwner().toString(), dataJson.toString()}).executeAsync(); @@ -117,6 +115,18 @@ public class SQLIO { } } + public void deleteShop(Shop shop) { + try (SQLQuery sqlQuery = sqlManager.createQuery().inTable("shops").addCondition("uuid", shop.getUUID().toString()).setLimit(1).build().execute()) { + try (ResultSet resultSet = sqlQuery.getResultSet()) { + if (resultSet.next()) { + sqlManager.createDelete("shops").addCondition("uuid", shop.getUUID().toString()).build().executeAsync(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + public void close() { if (sqlManager == null) { return; diff --git a/src/main/java/com/io/yutian/auchestshop/gui/CreateShopGui.java b/src/main/java/com/io/yutian/auchestshop/gui/CreateShopGui.java index e6e42e3..08b50ea 100644 --- a/src/main/java/com/io/yutian/auchestshop/gui/CreateShopGui.java +++ b/src/main/java/com/io/yutian/auchestshop/gui/CreateShopGui.java @@ -38,14 +38,15 @@ public class CreateShopGui extends Gui { addButton(11, new Button(new ItemStackBuilder(Material.DIAMOND).setDisplayName("§a出售").build()).click((player1, clickType) -> { created = true; AuChestShop.getShopManager().createShop(player1, block, ShopType.SELLING); - player1.sendMessage(Lang.get("")); player1.closeInventory(); + player.sendMessage(Lang.get("auchestshop.create-shop.success")); runnable.run(); })); addButton(15, new Button(new ItemStackBuilder(Material.EMERALD).setDisplayName("§a收购").build()).click((player1, clickType) -> { created = true; AuChestShop.getShopManager().createShop(player1, block, ShopType.BUYING); player1.closeInventory(); + player.sendMessage(Lang.get("auchestshop.create-shop.success")); runnable.run(); })); } @@ -56,6 +57,5 @@ public class CreateShopGui extends Gui { block.setType(Material.AIR); PlayerInventoryUtil.giveItemStack(player, itemStack); } - runnable.run(); } } diff --git a/src/main/java/com/io/yutian/auchestshop/listener/ShopListener.java b/src/main/java/com/io/yutian/auchestshop/listener/ShopListener.java index 2140e30..7c1d7f3 100644 --- a/src/main/java/com/io/yutian/auchestshop/listener/ShopListener.java +++ b/src/main/java/com/io/yutian/auchestshop/listener/ShopListener.java @@ -4,9 +4,9 @@ import com.io.yutian.auchestshop.AuChestShop; import com.io.yutian.auchestshop.gui.CreateShopGui; import com.io.yutian.auchestshop.shop.Shop; import com.io.yutian.auchestshop.util.ExpiringSet; +import com.io.yutian.auchestshop.util.ShopUtil; +import com.io.yutian.aulib.lang.Lang; import com.io.yutian.aulib.listener.IListener; -import com.io.yutian.aulib.nbt.NBTItem; -import com.io.yutian.aulib.nbt.NBTString; import it.unimi.dsi.fastutil.Pair; import org.bukkit.GameMode; import org.bukkit.Location; @@ -48,8 +48,9 @@ public class ShopListener extends IListener { if (!AuChestShop.getInteractiveManager().containsKey(uuid)) { return; } - AuChestShop.getInteractiveManager().handler(uuid, event.getMessage()); + AuChestShop.getInteractiveManager().handler(player, event.getMessage()); event.setCancelled(true); + AuChestShop.getInteractiveManager().remove(player.getUniqueId()); } @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) @@ -57,16 +58,18 @@ public class ShopListener extends IListener { Player player = event.getPlayer(); Block block = event.getBlock(); ItemStack itemStack = event.getItemInHand(); - NBTItem nbtItem = new NBTItem(itemStack); - if (nbtItem.has("item_type", NBTString.TYPE_ID)) { - String itemType = (String) nbtItem.get("item_type").getValue(); - if (itemType.equals("chest_shop")) { - CreateShopGui createShopGui = new CreateShopGui(player, block, itemStack, ()->{ - cachedLocations.remove(block.getLocation()); - }); - createShopGui.open(); - cachedLocations.add(block.getLocation()); + if (ShopUtil.isShopItem(itemStack)) { + Block block1 = block.getRelative(BlockFace.UP, 1); + if (!block1.getType().equals(Material.AIR)) { + player.sendMessage(Lang.get("auchestshop.create-shop.up-has-block")); + event.setCancelled(true); + return; } + CreateShopGui createShopGui = new CreateShopGui(player, block, itemStack, ()->{ + cachedLocations.remove(block.getLocation()); + }); + createShopGui.open(); + cachedLocations.add(block.getLocation()); } } @@ -76,7 +79,25 @@ public class ShopListener extends IListener { Block block = event.getBlock(); if (cachedLocations.contains(block.getLocation())) { event.setCancelled(true); + return; } + Pair shopSearched = searchShop(player, block); + if (shopSearched.key() == null || shopSearched.value() == ClickType.AIR) { + return; + } + ClickType clickType = shopSearched.value(); + if (clickType == ClickType.LOWER) { + Block block1 = block.getRelative(BlockFace.UP, 1); + block1.setType(Material.AIR); + } else if (clickType == ClickType.UPPER) { + Block block1 = block.getRelative(BlockFace.DOWN, 1); + block.setType(Material.AIR); + block1.breakNaturally(true); + event.setCancelled(true); + } + Shop shop = shopSearched.key(); + AuChestShop.getShopManager().removeShop(shop); + player.sendMessage(Lang.get("auchestshop.remove-shop")); } @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) @@ -127,7 +148,7 @@ public class ShopListener extends IListener { } Shop shop = shopSearched.key(); ClickType clickType = shopSearched.value(); - System.out.println(shop); + AuChestShop.getShopManager().handleInteract(player, event, shop, clickType); } private Pair searchShop(Player player, Block block) { @@ -154,7 +175,7 @@ public class ShopListener extends IListener { return Pair.of(shop, ClickType.LOWER); } - enum ClickType { + public enum ClickType { UPPER, LOWER, AIR; diff --git a/src/main/java/com/io/yutian/auchestshop/manager/InteractiveManager.java b/src/main/java/com/io/yutian/auchestshop/manager/InteractiveManager.java index a7b1a91..665d3de 100644 --- a/src/main/java/com/io/yutian/auchestshop/manager/InteractiveManager.java +++ b/src/main/java/com/io/yutian/auchestshop/manager/InteractiveManager.java @@ -1,6 +1,13 @@ package com.io.yutian.auchestshop.manager; +import com.io.yutian.auchestshop.AuChestShop; +import com.io.yutian.auchestshop.shop.Shop; +import com.io.yutian.auchestshop.shop.ShopAction; import com.io.yutian.auchestshop.shop.ShopInteractiveInfo; +import com.io.yutian.aulib.lang.Lang; +import com.io.yutian.aulib.util.StringUtil; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import java.util.HashMap; import java.util.Map; @@ -10,9 +17,46 @@ public class InteractiveManager { private final Map actions = new HashMap<>(); - public void handler(UUID uuid, String message) { - ShopInteractiveInfo info = actions.get(uuid); + public void handler(Player player, String message) { + if (message.equalsIgnoreCase("cancel") || message.equalsIgnoreCase("取消")) { + player.sendMessage(Lang.get("auchestshop.action.cancel")); + return; + } + ShopInteractiveInfo info = actions.get(player.getUniqueId()); + ShopAction action = info.getAction(); + String arg = message.trim(); + Shop shop = info.getShop(); + if (AuChestShop.getShopManager().getShop(shop.getUUID()) == null) { + player.sendMessage(Lang.get("auchestshop.action.cancel")); + return; + } + if (action == ShopAction.CREATE) { + if (!StringUtil.isDouble(arg)) { + player.sendMessage(Lang.get("auchestshop.action.error-1")); + return; + } + double i = Double.parseDouble(arg); + if (i <= 0) { + player.sendMessage(Lang.get("auchestshop.action.error-2")); + return; + } + int length = arg.contains(".") ? arg.length() - arg.indexOf(".") + 1 : 0; + if (length >= 3) { + player.sendMessage(Lang.get("auchestshop.action.error-3")); + return; + } + if (i >= Double.MAX_VALUE) { + player.sendMessage(Lang.get("auchestshop.action.error-4")); + return; + } + ItemStack itemStack = info.getItemStack(); + shop.setItem(itemStack); + shop.setPrice(i); + AuChestShop.getSQLIO().saveShop(shop); + player.sendMessage(Lang.get("auchestshop.action.success-create")); + } else if (action == ShopAction.PURCHASE) { + } } public ShopInteractiveInfo put(UUID uuid, ShopInteractiveInfo info) { diff --git a/src/main/java/com/io/yutian/auchestshop/manager/ShopManager.java b/src/main/java/com/io/yutian/auchestshop/manager/ShopManager.java index e0c270b..8d6c568 100644 --- a/src/main/java/com/io/yutian/auchestshop/manager/ShopManager.java +++ b/src/main/java/com/io/yutian/auchestshop/manager/ShopManager.java @@ -4,17 +4,24 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.io.yutian.auchestshop.AuChestShop; import com.io.yutian.auchestshop.database.SQLIO; -import com.io.yutian.auchestshop.shop.Shop; -import com.io.yutian.auchestshop.shop.ShopChunk; -import com.io.yutian.auchestshop.shop.ShopLocation; -import com.io.yutian.auchestshop.shop.ShopType; +import com.io.yutian.auchestshop.listener.ShopListener; +import com.io.yutian.auchestshop.shop.*; +import com.io.yutian.auchestshop.util.ItemStackUtil; import com.io.yutian.auchestshop.util.ShopUtil; +import com.io.yutian.aulib.lang.Lang; import org.apache.commons.lang.StringUtils; import org.bukkit.Chunk; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.type.Chest; import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,9 +47,52 @@ public class ShopManager { Shop shop = new Shop(player.getUniqueId(), shopLocation, shopType); addShop(shop); AuChestShop.getSQLIO().saveShop(shop); + Block block1 = block.getRelative(BlockFace.UP, 1); + block1.setType(block.getType()); + Chest chest = (Chest) block1.getState().getBlockData(); + chest.setDoubleBlockHalf(Chest.ChestDoubleBlockHalfType.UPPER); + chest.setShapeLevel(12); + block1.setBlockData(chest); + Chest chest1 = (Chest) block.getState().getBlockData(); + chest1.setDoubleBlockHalf(Chest.ChestDoubleBlockHalfType.LOWER); + chest1.setShapeLevel(12); + block.setBlockData(chest1); return shop; } + public void handleInteract(Player player, PlayerInteractEvent event, Shop shop, ShopListener.ClickType clickType) { + Action action = event.getAction(); + if (action == Action.LEFT_CLICK_BLOCK) { + if (shop.getItem() == null) { + if (event.getItem() != null && !event.getItem().getType().equals(Material.AIR)) { + ShopInteractiveInfo interactiveInfo = new ShopInteractiveInfo(event.getItem().clone(), shop.getLocation(), shop, ShopAction.CREATE, clickType, System.currentTimeMillis()); + ItemStack item = event.getItem().clone(); + player.sendMessage(Lang.get("auchestshop.action.message-1", ItemStackUtil.getItemName(item))); + AuChestShop.getInteractiveManager().put(player.getUniqueId(), interactiveInfo); + return; + } + return; + } + ItemStack item = shop.getItem(); + Inventory inventory = shop.getInventory(); + int i = shop.getShopType() == ShopType.BUYING ? ItemStackUtil.countSpace(inventory, item) : ItemStackUtil.countItems(inventory, item); + player.sendMessage(Lang.get("auchestshop.action.message-" + (shop.getShopType() == ShopType.BUYING ? 2 : 3), ItemStackUtil.getItemName(item), i)); + ShopInteractiveInfo interactiveInfo = new ShopInteractiveInfo(null, shop.getLocation(), shop, ShopAction.PURCHASE, clickType, System.currentTimeMillis()); + AuChestShop.getInteractiveManager().put(player.getUniqueId(), interactiveInfo); + } else if (action == Action.RIGHT_CLICK_BLOCK) { + if (player.isSneaking() && shop.getOwner().equals(player.getUniqueId())) { + return; + } + ItemStack item = shop.getItem(); + Inventory inventory = shop.getInventory(); + int i = shop.getShopType() == ShopType.BUYING ? ItemStackUtil.countSpace(inventory, item) : ItemStackUtil.countItems(inventory, item); + player.sendMessage(Lang.get("auchestshop.action.message-" + (shop.getShopType() == ShopType.BUYING ? 2 : 3), ItemStackUtil.getItemName(item), i)); + ShopInteractiveInfo interactiveInfo = new ShopInteractiveInfo(null, shop.getLocation(), shop, ShopAction.PURCHASE, clickType, System.currentTimeMillis()); + AuChestShop.getInteractiveManager().put(player.getUniqueId(), interactiveInfo); + event.setCancelled(true); + } + } + public @NotNull List getAllShops() { List shopsCollected = new ArrayList<>(); for (Map> shopMapData : getShops().values()) { @@ -146,7 +196,14 @@ public class ShopManager { } public void removeShop(@NotNull Shop shop) { + ShopLocation location = shop.getLocation(); + ShopChunk shopChunk = ShopChunk.fromLocation(location); + final Map inChunk = getShops(shopChunk); + if (inChunk != null) { + inChunk.remove(location); + } this.loadedShops.remove(shop); + AuChestShop.getSQLIO().deleteShop(shop); } public Set getLoadedShops() { diff --git a/src/main/java/com/io/yutian/auchestshop/shop/Shop.java b/src/main/java/com/io/yutian/auchestshop/shop/Shop.java index 47334ce..a37a04c 100644 --- a/src/main/java/com/io/yutian/auchestshop/shop/Shop.java +++ b/src/main/java/com/io/yutian/auchestshop/shop/Shop.java @@ -1,6 +1,13 @@ package com.io.yutian.auchestshop.shop; import com.io.yutian.auchestshop.shop.log.ShopLog; +import com.io.yutian.aulib.serialize.SerializeIgnore; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.Chest; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import java.util.Objects; @@ -17,6 +24,11 @@ public class Shop { private boolean unlimited; private ShopLog shopLog; + @SerializeIgnore + protected Location chestLocation; + @SerializeIgnore + protected Block chestBlock; + public Shop(UUID owner, ShopLocation location, ShopType shopType) { this(UUID.randomUUID(), owner, location, null, 0, shopType, false, new ShopLog()); } @@ -30,6 +42,33 @@ public class Shop { this.shopType = shopType; this.unlimited = unlimited; this.shopLog = shopLog; + updateChest(); + } + + public void updateChest() { + World world = Bukkit.getWorld(location.getWorld()); + this.chestLocation = new Location(world, location.getX(), location.getY(), location.getZ()); + this.chestBlock = this.chestLocation.getBlock(); + } + + public Inventory getInventory() { + if (chestLocation == null) { + updateChest(); + } + Chest chest = (Chest) chestBlock.getState(); + return chest.getInventory(); + } + + public int getInventoryCount() { + return 0; + } + + public void setItem(ItemStack item) { + this.item = item; + } + + public void setPrice(double price) { + this.price = price; } public UUID getUUID() { diff --git a/src/main/java/com/io/yutian/auchestshop/shop/ShopAction.java b/src/main/java/com/io/yutian/auchestshop/shop/ShopAction.java new file mode 100644 index 0000000..3d0eb2f --- /dev/null +++ b/src/main/java/com/io/yutian/auchestshop/shop/ShopAction.java @@ -0,0 +1,8 @@ +package com.io.yutian.auchestshop.shop; + +public enum ShopAction { + + PURCHASE, + CREATE; + +} diff --git a/src/main/java/com/io/yutian/auchestshop/shop/ShopChunk.java b/src/main/java/com/io/yutian/auchestshop/shop/ShopChunk.java index cf7545f..5b842d9 100644 --- a/src/main/java/com/io/yutian/auchestshop/shop/ShopChunk.java +++ b/src/main/java/com/io/yutian/auchestshop/shop/ShopChunk.java @@ -38,6 +38,9 @@ public class ShopChunk { return equals(world.getName(), x, z); } + public static ShopChunk fromLocation(@NotNull ShopLocation location) { + return new ShopChunk(location.getWorld(), location.getX() >> 4, location.getZ() >> 4); + } public static ShopChunk fromLocation(@NotNull Location location) { return new ShopChunk(location.getWorld().getName(), location.getBlockX() >> 4, location.getBlockZ() >> 4); diff --git a/src/main/java/com/io/yutian/auchestshop/shop/ShopInteractiveInfo.java b/src/main/java/com/io/yutian/auchestshop/shop/ShopInteractiveInfo.java index 346c8bf..fb9e555 100644 --- a/src/main/java/com/io/yutian/auchestshop/shop/ShopInteractiveInfo.java +++ b/src/main/java/com/io/yutian/auchestshop/shop/ShopInteractiveInfo.java @@ -1,19 +1,23 @@ package com.io.yutian.auchestshop.shop; -import org.bukkit.event.block.Action; +import com.io.yutian.auchestshop.listener.ShopListener; import org.bukkit.inventory.ItemStack; public class ShopInteractiveInfo { private ItemStack itemStack; private ShopLocation shopLocation; - private Action action; + private Shop shop; + private ShopAction action; + private ShopListener.ClickType clickType; private long time; - public ShopInteractiveInfo(ItemStack itemStack, ShopLocation shopLocation, Action action, long time) { + public ShopInteractiveInfo(ItemStack itemStack, ShopLocation shopLocation, Shop shop, ShopAction action, ShopListener.ClickType clickType, long time) { this.itemStack = itemStack; this.shopLocation = shopLocation; + this.shop = shop; this.action = action; + this.clickType = clickType; this.time = time; } @@ -25,10 +29,18 @@ public class ShopInteractiveInfo { return shopLocation; } - public Action getAction() { + public Shop getShop() { + return shop; + } + + public ShopAction getAction() { return action; } + public ShopListener.ClickType getClickType() { + return clickType; + } + public long getTime() { return time; } diff --git a/src/main/java/com/io/yutian/auchestshop/util/ItemStackUtil.java b/src/main/java/com/io/yutian/auchestshop/util/ItemStackUtil.java new file mode 100644 index 0000000..ca7bf9b --- /dev/null +++ b/src/main/java/com/io/yutian/auchestshop/util/ItemStackUtil.java @@ -0,0 +1,77 @@ +package com.io.yutian.auchestshop.util; + +import com.io.yutian.aulib.nbt.NBTCompound; +import com.io.yutian.aulib.nbt.NBTItem; +import com.io.yutian.aulib.util.LangUtil; +import org.bukkit.Material; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class ItemStackUtil { + + public static boolean matches(@Nullable ItemStack original, @Nullable ItemStack tester) { + if (original == null || tester == null) { + return false; + } + original = original.clone(); + original.setAmount(1); + tester = tester.clone(); + tester.setAmount(1); + if (!original.isSimilar(tester)) { + return false; + } + NBTItem nbtOriginal = new NBTItem(original); + NBTItem nbtTester = new NBTItem(tester); + NBTCompound nbtCompound0 = nbtOriginal.getTag(); + NBTCompound nbtCompound1 = nbtTester.getTag(); + return nbtCompound0.equals(nbtCompound1); + } + + public static int countItems(Inventory inventory, @NotNull ItemStack item) { + if (inventory == null) { + return 0; + } + int count = 0; + for (ItemStack itemStack : inventory) { + if (itemStack == null || itemStack.getType() == Material.AIR) { + continue; + } + if (matches(item, itemStack)) { + count+= itemStack.getAmount(); + } + } + return count; + } + + public static int countSpace(Inventory inventory, @NotNull ItemStack item) { + if (inventory == null) { + return 0; + } + int count = 0; + int itemMaxStackSize = item.getMaxStackSize(); + for (ItemStack itemStack : inventory) { + if (itemStack == null || itemStack.getType() == Material.AIR) { + count+=itemMaxStackSize; + } else if (matches(item, itemStack)) { + count+=itemStack.getAmount() >= itemMaxStackSize ? 0 : itemMaxStackSize - itemStack.getAmount(); + } + } + return count; + } + + public static String getItemName(ItemStack itemStack) { + ItemMeta meta = itemStack.getItemMeta(); + if (meta != null && meta.hasDisplayName()) { + return meta.getDisplayName(); + } + Material material = itemStack.getType(); + String id = material.name().toLowerCase(); + boolean isBlock = material.isBlock(); + String prefix = isBlock ? "block" : "item"; + return LangUtil.getLang(prefix+".minecraft."+id); + } + +} diff --git a/src/main/java/com/io/yutian/auchestshop/util/ShopUtil.java b/src/main/java/com/io/yutian/auchestshop/util/ShopUtil.java index efb4fe4..dc2a41e 100644 --- a/src/main/java/com/io/yutian/auchestshop/util/ShopUtil.java +++ b/src/main/java/com/io/yutian/auchestshop/util/ShopUtil.java @@ -1,10 +1,13 @@ package com.io.yutian.auchestshop.util; +import com.io.yutian.aulib.nbt.NBTItem; +import com.io.yutian.aulib.nbt.NBTString; import org.bukkit.Material; import org.bukkit.Tag; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Directional; +import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import java.util.EnumSet; @@ -18,6 +21,15 @@ public class ShopUtil { SHOPABLES.add(Material.TRAPPED_CHEST); } + public static boolean isShopItem(ItemStack itemStack) { + NBTItem nbtItem = new NBTItem(itemStack); + if (!nbtItem.has("item_type", NBTString.TYPE_ID)) { + return false; + } + String itemType = (String) nbtItem.get("item_type").getValue(); + return itemType.equalsIgnoreCase("chest_shop"); + } + public static Block getAttached(@NotNull Block block) { BlockData blockData = block.getBlockData(); if (blockData instanceof final Directional directional) { diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml index 4338334..4761aff 100644 --- a/src/main/resources/lang.yml +++ b/src/main/resources/lang.yml @@ -1,3 +1,17 @@ auchestshop: create-shop: - success: "成功创建商店" \ No newline at end of file + up-has-block: "§c创建失败,商店上方存在非法方块" + success: "§a成功创建商店" + error-1: "§c商店创建已取消" + remove-shop: "§a成功移除商店" + action: + cancel: "§a操作已取消" + message-1: "§a请在聊天中输入交易1个§e$0§a所需的价格。" + message-2: "§a聊天栏中输入想出售§e$0§a的物品数量,您现在可以卖出§e$1§a件物品。输入§ball§a来出售全部物品" + message-3: "§a聊天栏中输入想购买§e$0§a的物品数量,您可以购买§e$1§a件物品。输入§ball§a来购买全部物品" + error-1: "§c请输入有效的数字" + error-2: "§c请输入大于0的整数" + error-3: "§c您的价格中的小数点后位数超过上限" + error-4: "§c该值超过了最大值" + error-5: "§c请输入一个有效的价格" + success-create: "§a成功设置商店物品" \ No newline at end of file