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;
}