From e6cdf545e84b831c4a10101d037ecb555e84139c Mon Sep 17 00:00:00 2001 From: Pygot Date: Tue, 24 Mar 2026 19:48:08 +0100 Subject: [PATCH] https://git.soukup.xyz/EcoCraft/plugin/issues/10 --- pom.xml | 29 ++++- .../xyz/soukup/ecoCraftCore/EcoCraftCore.java | 2 + .../ecoCraftCore/database/objects/Shop.java | 9 +- .../ecoCraftCore/shop/ShopAdminCommand.java | 107 ++++++++++++++++++ .../soukup/ecoCraftCore/shop/ShopLogic.java | 6 +- 5 files changed, 144 insertions(+), 9 deletions(-) create mode 100644 src/main/java/xyz/soukup/ecoCraftCore/shop/ShopAdminCommand.java diff --git a/pom.xml b/pom.xml index 5cb3fe3..0ccf7d8 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,7 @@ clean package + org.apache.maven.plugins @@ -46,6 +47,7 @@ xyz.soukup.ecoCraftCore.database.objects.** + org.apache.maven.plugins maven-shade-plugin @@ -81,10 +83,10 @@ src/main/resources - true - + false + @@ -92,24 +94,26 @@ codemc-releases https://repo.codemc.io/repository/maven-releases/ + is-releases https://repo.infernalsuite.com/repository/maven-releases/ + papermc-repo https://repo.papermc.io/repository/maven-public/ + sonatype https://oss.sonatype.org/content/groups/public/ + jitpack.io https://jitpack.io - - @@ -117,44 +121,57 @@ com.infernalsuite.asp api 4.0.0 - provided + com.j256.ormlite ormlite-core 6.1 + com.j256.ormlite ormlite-jdbc 6.1 + com.mysql mysql-connector-j 9.3.0 + io.papermc.paper paper-api 1.21.10-R0.1-SNAPSHOT provided + com.github.stefvanschie.inventoryframework IF 0.11.6 + com.github.MatrixCreations MatrixColorAPI v1.0.7 + com.github.retrooper packetevents-spigot 2.11.2 provided + + + com.zaxxer + HikariCP + 6.2.1 + - + + \ No newline at end of file diff --git a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java index 93c70d4..4d6ae15 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java @@ -27,6 +27,7 @@ import xyz.soukup.ecoCraftCore.player.OnKill; import xyz.soukup.ecoCraftCore.player.PreparePlayer; import xyz.soukup.ecoCraftCore.player.TeleportRequestsHandler; import xyz.soukup.ecoCraftCore.positionMarker.MarkerCommand; +import xyz.soukup.ecoCraftCore.shop.ShopAdminCommand; import xyz.soukup.ecoCraftCore.shop.ShopCommand; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import xyz.soukup.ecoCraftCore.inventory.VirtualChest; @@ -240,6 +241,7 @@ public final class EcoCraftCore extends JavaPlugin { private void registerCommands() { @NotNull LifecycleEventManager<@NotNull Plugin> lm = this.getLifecycleManager(); + lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(ShopAdminCommand.getCommand().build())); lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(ShopCommand.getCommand().build())); lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MarkerCommand.getCommand().build())); lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MoneyCommand.getCommand().build())); diff --git a/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java index 6317a3c..f51bda6 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java @@ -28,7 +28,6 @@ public class Shop { @DatabaseField(canBeNull = false) private String ownerType; - @DatabaseField(canBeNull = false) private String itemName; @@ -78,6 +77,14 @@ public class Shop { this.virtualChestID = virtualChestID; } + public void setOwnerType(String ownerType) { + this.ownerType = ownerType; + } + + public void setOwner(String username) { + this.owner = username; + } + public void setItemName(String itemName) { this.itemName = itemName; } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/shop/ShopAdminCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/shop/ShopAdminCommand.java new file mode 100644 index 0000000..b7709cb --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/shop/ShopAdminCommand.java @@ -0,0 +1,107 @@ +package xyz.soukup.ecoCraftCore.shop; + +import com.mojang.brigadier.arguments.*; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import io.papermc.paper.command.brigadier.CommandSourceStack; +import io.papermc.paper.command.brigadier.Commands; +import org.bukkit.block.Chest; +import org.bukkit.block.Sign; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent; +import xyz.soukup.ecoCraftCore.database.objects.Shop; +import xyz.soukup.ecoCraftCore.inventory.VirtualChest; +import xyz.soukup.ecoCraftCore.inventory.InventoryUtils; +import xyz.soukup.ecoCraftCore.messages.Messages; +import xyz.soukup.ecoCraftCore.utilities.PDC; + +public class ShopAdminCommand { + + public static LiteralArgumentBuilder getCommand() { + // Define the argument types + var amountArg = Commands.argument("amount", IntegerArgumentType.integer(1)); + var buyPriceArg = Commands.argument("buy_price", FloatArgumentType.floatArg(0.0F)); + var sellPriceArg = Commands.argument("sell_price", FloatArgumentType.floatArg(0.0F)); + + // Path: /shop ... + return Commands.literal("shop-admin") + .then(amountArg + // Branch 1: ... buy [sell ] + .then(Commands.literal("buy") + .then(buyPriceArg + .executes(ShopAdminCommand::createShop) + .then(Commands.literal("sell") + .then(sellPriceArg.executes(ShopAdminCommand::createShop))))) + + // Branch 2: ... sell [buy ] + .then(Commands.literal("sell") + .then(sellPriceArg + .executes(ShopAdminCommand::createShop) + .then(Commands.literal("buy") + .then(buyPriceArg.executes(ShopAdminCommand::createShop)))))); + } + + private static int createShop(CommandContext ctx) { + CommandSourceStack source = ctx.getSource(); + + if (!(source.getSender() instanceof Player player)) { + Messages.send(source.getSender(), "generic.error.not-player"); + return 0; + } + + // 1. Check if blocks are marked + Chest chest = MarkerEvent.chests.get(player); + Sign sign = MarkerEvent.signs.get(player); + + if (sign == null || chest == null) { + Messages.send(player, "shop.error.not-marked"); + return 0; + } + + // 2. Validate Item in Hand + ItemStack item = player.getInventory().getItemInMainHand(); + if (item.isEmpty()) { + Messages.send(player, "shop.error.empty-hand"); + return 0; + } + + // 3. Check if already a shop + if (PDC.getInteger(sign, "shop") != null) { + Messages.send(player, "shop.error.already-shop"); + return 0; + } + + // 4. Parse Arguments Safely + int amount = ctx.getArgument("amount", Integer.class); + + float buyPrice = 0.0F; + try { + buyPrice = ctx.getArgument("buy_price", Float.class); + } catch (IllegalArgumentException ignored) {} + + float sellPrice = 0.0F; + try { + sellPrice = ctx.getArgument("sell_price", Float.class); + } catch (IllegalArgumentException ignored) {} + + // 5. Database and PDC Logic + VirtualChest virtualChest = VirtualChest.getOrCreate(chest); + virtualChest.databaseSave(); + PDC.set(chest, "virtual", virtualChest.getId()); + + // 6. Inventory Calculations + int freeSpace = InventoryUtils.getSpaceLeft(chest.getInventory(), item); + int stock = InventoryUtils.getCount(chest.getInventory(), item); + + // 7. Final Creation + Shop shop = new Shop(player, item, stock, freeSpace, amount, buyPrice, sellPrice, virtualChest.getId()); + shop.setOwnerType("admin"); + shop.setOwner("admin"); + shop.save(); + shop.writeIntoSign(sign); + + Messages.send(player, "shop.created"); + return 1; + } +} \ No newline at end of file diff --git a/src/main/java/xyz/soukup/ecoCraftCore/shop/ShopLogic.java b/src/main/java/xyz/soukup/ecoCraftCore/shop/ShopLogic.java index e9905a6..720a53e 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/shop/ShopLogic.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/shop/ShopLogic.java @@ -219,6 +219,7 @@ public class ShopLogic implements Listener { return; } + boolean isAdminType = shop.getOwnerType().equals("admin"); int amount = shop.getAmount() * multiplier; float price = shop.getPriceBuy() * multiplier; ItemStack itemStack = shop.getItemStack(); @@ -226,7 +227,7 @@ public class ShopLogic implements Listener { Account account = Account.getOrCreate(player); - if (price > account.getBalance()){ + if (!isAdminType && price > account.getBalance()){ Messages.send(player, "generic.error.no-money.self"); return; } @@ -308,6 +309,7 @@ public class ShopLogic implements Listener { return; } + boolean isAdminType = shop.getOwnerType().equals("admin"); int amount = shop.getAmount() * multiplier; float price = shop.getPriceSell() * multiplier; ItemStack itemStack = shop.getItemStack(); @@ -315,7 +317,7 @@ public class ShopLogic implements Listener { Account account = Account.getOrCreate(shop.getOwnerType(), shop.getOwner()); - if (price > account.getBalance()){ + if (!isAdminType && price > account.getBalance()){ Messages.send(player, "generic.error.no-money.self"); return; }