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