diff --git a/pom.xml b/pom.xml
index 4468d7c..59f0843 100644
--- a/pom.xml
+++ b/pom.xml
@@ -43,10 +43,9 @@
- xyz.soukup.ecoCraftCore.objects.**
+ xyz.soukup.ecoCraftCore.database.objects.**
-
org.apache.maven.plugins
maven-shade-plugin
@@ -60,8 +59,8 @@
- dev.triumphteam.gui
- xyz.soukup.gui
+ com.github.stefvanschie.inventoryframework
+ xyz.soukup.inventoryframework
org.avaje
@@ -128,17 +127,17 @@
mysql-connector-j
9.3.0
-
- dev.triumphteam
- triumph-gui
- 3.1.12
-
io.papermc.paper
paper-api
- 1.21.3-R0.1-SNAPSHOT
+ 1.21.10-R0.1-SNAPSHOT
provided
+
+ com.github.stefvanschie.inventoryframework
+ IF
+ 0.11.6
+
com.github.MatrixCreations
MatrixColorAPI
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java
index aec9593..372486b 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java
@@ -9,19 +9,21 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
-import xyz.soukup.ecoCraftCore.commands.*;
+import xyz.soukup.ecoCraftCore.commands.MoneyCommand;
+import xyz.soukup.ecoCraftCore.positionMarker.RulerCommand;
+import xyz.soukup.ecoCraftCore.commands.ShopCommand;
import xyz.soukup.ecoCraftCore.events.*;
-import xyz.soukup.ecoCraftCore.objects.Account;
-import xyz.soukup.ecoCraftCore.objects.Shop;
-import xyz.soukup.ecoCraftCore.objects.Transaction;
+import xyz.soukup.ecoCraftCore.database.objects.Account;
+import xyz.soukup.ecoCraftCore.database.objects.Shop;
+import xyz.soukup.ecoCraftCore.database.objects.Transaction;
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
-import xyz.soukup.ecoCraftCore.objects.VirtualChest;
-import xyz.soukup.ecoCraftCore.utilities.DaoRegistry;
-import xyz.soukup.ecoCraftCore.utilities.Messages;
+import xyz.soukup.ecoCraftCore.inventory.VirtualChest;
+import xyz.soukup.ecoCraftCore.positionMarker.RulerMarking;
+import xyz.soukup.ecoCraftCore.database.DaoRegistry;
+import xyz.soukup.ecoCraftCore.messages.Messages;
import java.io.IOException;
import java.sql.SQLException;
-import java.time.Duration;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -70,7 +72,7 @@ public final class EcoCraftCore extends JavaPlugin {
}
private void prepareDatabase() throws SQLException {
- String databaseUrl = "jdbc:mysql://soukup.xyz:3306/ecc";
+ String databaseUrl = "jdbc:mysql://localhost:3306/ecc";
connectionSource = new JdbcConnectionSource(databaseUrl, "ecc", "ecc");
Logger.getLogger("com.j256.ormlite.table.TableUtils").setLevel(Level.OFF);
@@ -93,8 +95,6 @@ public final class EcoCraftCore extends JavaPlugin {
lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(ShopCommand.createCommand().build()));
lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(RulerCommand.createCommand().build()));
lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MoneyCommand.createCommand().build()));
- lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(GuiCommand.createCommand().build()));
- lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(ShopEditCommand.createCommand().build()));
}
private void registerEvents(){
@@ -104,7 +104,6 @@ public final class EcoCraftCore extends JavaPlugin {
pm.registerEvents(new VirtualChestLogic(), this);
pm.registerEvents(new ShopLogic(), this);
pm.registerEvents(new PreparePlayer(), this);
- pm.registerEvents(new InventoryActionCancel(), this);
}
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/commands/GuiCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/commands/GuiCommand.java
deleted file mode 100644
index 20a69cd..0000000
--- a/src/main/java/xyz/soukup/ecoCraftCore/commands/GuiCommand.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package xyz.soukup.ecoCraftCore.commands;
-
-import com.mojang.brigadier.arguments.StringArgumentType;
-import dev.triumphteam.gui.builder.item.ItemBuilder;
-import dev.triumphteam.gui.guis.GuiItem;
-import io.papermc.paper.command.brigadier.CommandSourceStack;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import io.papermc.paper.command.brigadier.Commands;
-import com.mojang.brigadier.context.CommandContext;
-import xyz.soukup.ecoCraftCore.utilities.Messages;
-import net.kyori.adventure.text.Component;
-import org.bukkit.command.CommandSender;
-import dev.triumphteam.gui.guis.Gui;
-import org.bukkit.entity.Player;
-import org.bukkit.Material;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class GuiCommand {
- public static LiteralArgumentBuilder createCommand() {
- return Commands.literal("gopen")
- .then(Commands.argument("id", StringArgumentType.string())
- .executes(GuiCommand::openGui))
- .executes(GuiCommand::getAll);
- }
-
- private static int openGui(CommandContext context){
- CommandSender commandSender = context.getSource().getSender();
- String guiId = context.getArgument("id", String.class);
-
- if (!(commandSender instanceof Player)){
- Messages.send(commandSender, "generic.error.not-player");
- return 0;
- }
-
- Gui gui = getGui(guiId, false, commandSender); // Pokud najdeme gui vrátíme ho, pokud ne vrátíme default gui
- gui.open((Player) commandSender);
- return 1;
- }
-
- private static int getAll(CommandContext context){
- CommandSender commandSender = context.getSource().getSender();
-
- if (!(commandSender instanceof Player)){
- Messages.send(commandSender, "generic.error.not-player");
- return 0;
- }
-
- getGui("", true, commandSender); // Pokud najdeme gui vrátíme ho, pokud ne vrátíme default gui
- return 1;
- }
-
- private static Gui getGui(String guiId, Boolean getAll, CommandSender commandSender){
- // Mapa gui objektů
- Map guiMap = new HashMap<>();
-
- // Default gui
- Gui gui1 = Gui.gui() // U custom gui dávat vždycky "GUI -" -> ../events/InventoryActionCancel
- .title(Component.text("GUI - Default"))
- .rows(6)
- .create();
-
- // Shop Admin gui
- Gui shopAdminGui = Gui.gui()
- .title(Messages.get("gui.shopadmin.title"))
- .rows(3)
- .create();
- shopAdminGui.getFiller().fill(ItemBuilder.from(Material.BLACK_STAINED_GLASS_PANE)
- .name(Messages.get("gui.shopadmin.items.background")).asGuiItem());
- GuiItem deleteShop = ItemBuilder.from(Material.BARRIER).name(Messages.get("gui.shopadmin.items.deleteshop"))
- .asGuiItem(event -> {
- // Zde delete shop
- });
- GuiItem changeSellPrice = ItemBuilder.from(Material.OAK_SIGN).name(Messages.get("gui.shopadmin.items.changesellprice"))
- .asGuiItem(event -> {
- // Zde change sell price
- });
- GuiItem changeBuyPrice = ItemBuilder.from(Material.DARK_OAK_SIGN).name(Messages.get("gui.shopadmin.items.changebuyprice"))
- .asGuiItem(event -> {
- // Zde change buy price
- });
- GuiItem changeAmounts = ItemBuilder.from(Material.GOLD_BLOCK).name(Messages.get("gui.shopadmin.items.changeamounts"))
- .asGuiItem(event -> {
- // Zde change amounts
- });
-
- shopAdminGui.setItem(22, deleteShop);
- shopAdminGui.setItem(15, changeBuyPrice);
- shopAdminGui.setItem(11, changeSellPrice);
- shopAdminGui.setItem(13, changeAmounts);
-
- guiMap.put("default", gui1);
- guiMap.put("shop-admin", shopAdminGui);
-
- if (getAll){
- printAll(guiMap, commandSender);
- }
-
- return guiMap.getOrDefault(guiId, gui1);
- }
-
- private static void printAll(Map guiMap, CommandSender commandSender){
- HashMap stringGuis = new HashMap<>();
- int index = 1;
-
- for (Map.Entry entry : guiMap.entrySet()) {
- String guiName = entry.getKey();
- stringGuis.put(String.valueOf(index), guiName);
- index++; // Každý číslo je placeholder v messages, pokud se změní počet gui musí se editnout i messages.yml
- }
-
- Messages.send(commandSender, "gui.all", stringGuis);
- }
-}
-
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/commands/MoneyCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/commands/MoneyCommand.java
index a938632..3921bb1 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/commands/MoneyCommand.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/commands/MoneyCommand.java
@@ -1,10 +1,8 @@
package xyz.soukup.ecoCraftCore.commands;
-import com.mojang.brigadier.LiteralMessage;
import com.mojang.brigadier.arguments.FloatArgumentType;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import io.papermc.paper.command.brigadier.CommandSourceStack;
@@ -13,78 +11,73 @@ import io.papermc.paper.command.brigadier.argument.ArgumentTypes;
import io.papermc.paper.command.brigadier.argument.resolvers.selector.PlayerSelectorArgumentResolver;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import xyz.soukup.ecoCraftCore.objects.Account;
-import xyz.soukup.ecoCraftCore.objects.Transaction;
-import xyz.soukup.ecoCraftCore.utilities.Messages;
-import xyz.soukup.ecoCraftCore.utilities.PHHM;
+import xyz.soukup.ecoCraftCore.database.objects.Account;
+import xyz.soukup.ecoCraftCore.database.objects.Transaction;
+import xyz.soukup.ecoCraftCore.messages.Messages;
+import xyz.soukup.ecoCraftCore.messages.PHHM;
-@SuppressWarnings("UnstableApiUsage")
-public class MoneyCommand {
- public static LiteralArgumentBuilder createCommand() {
-
- RequiredArgumentBuilder playerArgument = Commands.argument("player", ArgumentTypes.player());
- RequiredArgumentBuilder amountArgument = Commands.argument("amount", FloatArgumentType.floatArg(0.1F));
- RequiredArgumentBuilder ownerArgument = Commands.argument("owner", StringArgumentType.word());
- RequiredArgumentBuilder typeArgument = Commands.argument("type", StringArgumentType.word());
+public class MoneyCommand {
+ public static LiteralArgumentBuilder createCommand() {
+ // 1. Send Branch
LiteralArgumentBuilder send = Commands.literal("send")
.requires(source -> source.getSender() instanceof Player)
- .then(playerArgument.then(amountArgument.executes(MoneyCommand::sendMoney)));
-
-
- RequiredArgumentBuilder selfGive = amountArgument
- .requires(source -> source.getSender() instanceof Player)
- .executes(MoneyCommand::giveMoneySelf);
-
- RequiredArgumentBuilder playerGive = playerArgument
- .then(amountArgument.executes(MoneyCommand::giveMoneyPlayer));
-
- RequiredArgumentBuilder giveOther = typeArgument.then(ownerArgument.then(amountArgument.executes(MoneyCommand::giveMoneyOther)));
+ .then(Commands.argument("player", ArgumentTypes.player())
+ .then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
+ .executes(MoneyCommand::sendMoney)));
+ // 2. Give Branch
LiteralArgumentBuilder give = Commands.literal("give")
- .then(selfGive)
- .then(playerGive)
- .then(giveOther);
-
-
- RequiredArgumentBuilder removeSelf = amountArgument
- .requires(source -> source.getSender() instanceof Player)
- .executes(MoneyCommand::removeMoneySelf);
-
- RequiredArgumentBuilder removePlayer = playerArgument
- .then(amountArgument.executes(MoneyCommand::removeMoneyPlayer));
-
- RequiredArgumentBuilder removeOther = typeArgument
- .then(ownerArgument
- .then(amountArgument.executes(MoneyCommand::removeMoneyOther)));
-
+ // Case: /money give
+ .then(Commands.argument("player", ArgumentTypes.player())
+ .then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
+ .executes(MoneyCommand::giveMoneyPlayer)))
+ // Case: /money give (Self)
+ .then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
+ .requires(source -> source.getSender() instanceof Player)
+ .executes(MoneyCommand::giveMoneySelf))
+ // Case: /money give
+ .then(Commands.argument("type", StringArgumentType.word())
+ .then(Commands.argument("owner", StringArgumentType.word())
+ .then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
+ .executes(MoneyCommand::giveMoneyOther))));
+
+ // 3. Remove Branch
LiteralArgumentBuilder remove = Commands.literal("remove")
- .then(removeSelf)
- .then(removePlayer)
- .then(removeOther);
-
+ // Case: /money remove
+ .then(Commands.argument("player", ArgumentTypes.player())
+ .then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
+ .executes(MoneyCommand::removeMoneyPlayer)))
+ // Case: /money remove (Self)
+ .then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
+ .requires(source -> source.getSender() instanceof Player)
+ .executes(MoneyCommand::removeMoneySelf))
+ // Case: /money remove
+ .then(Commands.argument("type", StringArgumentType.word())
+ .then(Commands.argument("owner", StringArgumentType.word())
+ .then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
+ .executes(MoneyCommand::removeMoneyOther))));
+
+ // Main command: /money
return Commands.literal("money")
.then(send)
.then(give)
.then(remove)
.executes(MoneyCommand::getBalance);
-
}
- private static int getBalance(CommandContext context){
+ private static int getBalance(CommandContext context) {
CommandSender commandSender = context.getSource().getSender();
- if (!(commandSender instanceof Player player)){
+ if (!(commandSender instanceof Player player)) {
Messages.send(commandSender, "generic.error.not-player");
return 0;
}
Account account = Account.getOrCreate(player);
Messages.send(player, "money.balance.self", PHHM.get(account));
return 1;
-
}
-
private static int sendMoney(CommandContext context) throws CommandSyntaxException {
PlayerSelectorArgumentResolver receiverResolver = context.getArgument("player", PlayerSelectorArgumentResolver.class);
Player receiver = receiverResolver.resolve(context.getSource()).getFirst();
@@ -94,12 +87,12 @@ public class MoneyCommand {
Account senderAccount = Account.getOrCreate(sender);
- if (amount > senderAccount.getBalance()){
+ if (amount > senderAccount.getBalance()) {
Messages.send(sender, "generic.error.no-funds");
return 0;
}
- Transaction transaction = new Transaction(amount,"player", sender.getName(), "player", receiver.getName(), "player");
+ Transaction transaction = new Transaction(amount, "player", sender .getName(), "player", receiver.getName(), "player");
transaction.process();
Messages.send(sender, "money.send.player", PHHM.get(transaction));
@@ -110,82 +103,75 @@ public class MoneyCommand {
private static int giveMoneyPlayer(CommandContext context) throws CommandSyntaxException {
CommandSender commandSender = context.getSource().getSender();
-
PlayerSelectorArgumentResolver receiverResolver = context.getArgument("player", PlayerSelectorArgumentResolver.class);
Player receiver = receiverResolver.resolve(context.getSource()).getFirst();
-
Float amount = context.getArgument("amount", Float.class);
- Transaction transaction = new Transaction(amount,"admin", commandSender.getName(), "player", receiver.getName(), "admin");
+ Transaction transaction = new Transaction(amount, "admin", commandSender.getName(), "player", receiver.getName(), "admin");
transaction.process();
Messages.send(commandSender, "money.give.player", PHHM.get(transaction));
-
return 1;
}
- private static int giveMoneySelf(CommandContext context){
+ private static int giveMoneySelf(CommandContext context) {
Player player = (Player) context.getSource().getSender();
Float amount = context.getArgument("amount", Float.class);
- Transaction transaction = new Transaction(amount,"admin", player.getName(), "player", player.getName(), "admin");
+ Transaction transaction = new Transaction(amount, "admin", player.getName(), "player", player.getName(), "admin");
transaction.process();
Messages.send(player, "money.give.self", PHHM.get(transaction));
-
return 1;
}
- private static int giveMoneyOther(CommandContext context){
+ private static int giveMoneyOther(CommandContext context) {
CommandSender commandSender = context.getSource().getSender();
Float amount = context.getArgument("amount", Float.class);
String owner = context.getArgument("owner", String.class);
String type = context.getArgument("type", String.class);
- Transaction transaction = new Transaction(amount,"admin", commandSender.getName(), type, owner, "admin");
+ Transaction transaction = new Transaction(amount, "admin", commandSender.getName(), type, owner, "admin");
transaction.process();
Messages.send(commandSender, "money.give.other", PHHM.get(transaction));
-
return 1;
}
+
private static int removeMoneyPlayer(CommandContext context) throws CommandSyntaxException {
CommandSender commandSender = context.getSource().getSender();
-
PlayerSelectorArgumentResolver senderResolver = context.getArgument("player", PlayerSelectorArgumentResolver.class);
Player sender = senderResolver.resolve(context.getSource()).getFirst();
-
Float amount = context.getArgument("amount", Float.class);
- Transaction transaction = new Transaction(amount, "player", sender.getName(),"admin", commandSender.getName(), "admin");
+ Transaction transaction = new Transaction(amount, "player", sender.getName(), "admin", commandSender.getName(), "admin");
transaction.process();
Messages.send(commandSender, "money.remove.player", PHHM.get(transaction));
-
return 1;
}
- private static int removeMoneySelf(CommandContext context){
+
+ private static int removeMoneySelf(CommandContext context) {
Player player = (Player) context.getSource().getSender();
Float amount = context.getArgument("amount", Float.class);
- Transaction transaction = new Transaction(amount,"player", player.getName(),"admin", player.getName(), "admin");
+ Transaction transaction = new Transaction(amount, "player", player.getName(), "admin", player.getName(), "admin");
transaction.process();
Messages.send(player, "money.remove.self", PHHM.get(transaction));
-
return 1;
}
- private static int removeMoneyOther(CommandContext context){
+
+ private static int removeMoneyOther(CommandContext context) {
CommandSender commandSender = context.getSource().getSender();
Float amount = context.getArgument("amount", Float.class);
String owner = context.getArgument("owner", String.class);
String type = context.getArgument("type", String.class);
- Transaction transaction = new Transaction(amount, type, owner,"admin", commandSender.getName(), "admin");
+ Transaction transaction = new Transaction(amount, type, owner, "admin", commandSender.getName(), "admin");
transaction.process();
Messages.send(commandSender, "money.remove.other", PHHM.get(transaction));
-
return 1;
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/commands/ShopCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/commands/ShopCommand.java
index d2f5997..a768b3a 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/commands/ShopCommand.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/commands/ShopCommand.java
@@ -9,97 +9,98 @@ import org.bukkit.block.Chest;
import org.bukkit.block.Sign;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
-import xyz.soukup.ecoCraftCore.events.RulerMarking;
-import xyz.soukup.ecoCraftCore.objects.Shop;
-import xyz.soukup.ecoCraftCore.objects.VirtualChest;
-import xyz.soukup.ecoCraftCore.utilities.InventoryUtils;
-import xyz.soukup.ecoCraftCore.utilities.Messages;
+import xyz.soukup.ecoCraftCore.positionMarker.RulerMarking;
+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;
@SuppressWarnings("UnstableApiUsage")
public class ShopCommand {
- public static LiteralArgumentBuilder createCommand() {
-
- FloatArgumentType floatArgType = FloatArgumentType.floatArg(0.1F);
-
-
- LiteralArgumentBuilder buy = Commands.literal("buy")
- .then(Commands.argument("buy_price", floatArgType).executes(ShopCommand::createShop));
- LiteralArgumentBuilder sell = Commands.literal("sell")
- .then(Commands.argument("sell_price", floatArgType).executes(ShopCommand::createShop));
+ public static LiteralArgumentBuilder createCommand() {
+ // 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")
- .then(Commands.argument("amount", IntegerArgumentType.integer(1))
- .then(buy.then(sell))
- .then(sell.then(buy)));
-
-
+ .then(amountArg
+ // Branch 1: ... buy [sell ]
+ .then(Commands.literal("buy")
+ .then(buyPriceArg
+ .executes(ShopCommand::createShop)
+ .then(Commands.literal("sell")
+ .then(sellPriceArg.executes(ShopCommand::createShop)))))
+
+ // Branch 2: ... sell [buy ]
+ .then(Commands.literal("sell")
+ .then(sellPriceArg
+ .executes(ShopCommand::createShop)
+ .then(Commands.literal("buy")
+ .then(buyPriceArg.executes(ShopCommand::createShop))))));
}
- private static int createShop(CommandContext ctx){
+ private static int createShop(CommandContext ctx) {
CommandSourceStack source = ctx.getSource();
- if (!(source.getSender() instanceof Player player)){
+ if (!(source.getSender() instanceof Player player)) {
Messages.send(source.getSender(), "generic.error.not-player");
return 0;
}
+ // 1. Check if blocks are marked
Chest chest = RulerMarking.chests.get(player);
Sign sign = RulerMarking.signs.get(player);
- Integer amount = ctx.getArgument("amount", Integer.class);
-
- Float buyPrice;
- try {
- buyPrice = ctx.getArgument("buy_price", Float.class);
- } catch (IllegalArgumentException e) {
- buyPrice = (Float) 0F;
- }
-
- Float sellPrice;
- try {
- sellPrice = ctx.getArgument("sell_price", Float.class);
- }catch (IllegalArgumentException e){
- sellPrice = (Float) 0F;
- }
-
-
- if (sign == null || chest == null){
+ 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()){
+ if (item.isEmpty()) {
Messages.send(player, "shop.error.empty-hand");
return 0;
}
- if (PDC.getInteger(sign, "shop") != null){
+ // 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);
- VirtualChest virtualChest = VirtualChest.getOrCreate(chest);
- virtualChest.databaseSave();
+ 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) {}
- PDC.set(chest, "virtual", Integer.valueOf(virtualChest.getId()));
+ // 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.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/utilities/DaoRegistry.java b/src/main/java/xyz/soukup/ecoCraftCore/database/DaoRegistry.java
similarity index 72%
rename from src/main/java/xyz/soukup/ecoCraftCore/utilities/DaoRegistry.java
rename to src/main/java/xyz/soukup/ecoCraftCore/database/DaoRegistry.java
index 812aa14..46c9389 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/utilities/DaoRegistry.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/database/DaoRegistry.java
@@ -1,16 +1,15 @@
-package xyz.soukup.ecoCraftCore.utilities;
+package xyz.soukup.ecoCraftCore.database;
import com.j256.ormlite.dao.Dao;
-import xyz.soukup.ecoCraftCore.objects.Account;
-import xyz.soukup.ecoCraftCore.objects.Shop;
-import xyz.soukup.ecoCraftCore.objects.Transaction;
-import xyz.soukup.ecoCraftCore.objects.VirtualChest;
+import xyz.soukup.ecoCraftCore.database.objects.*;
+import xyz.soukup.ecoCraftCore.inventory.VirtualChest;
-public class DaoRegistry {
+public class DaoRegistry {
private static Dao shopDao;
private static Dao transactionDao;
private static Dao virtualChestDao;
private static Dao accountDao;
+ private static Dao islandDao;
public static Dao getShopDao() {
@@ -44,4 +43,12 @@ public class DaoRegistry {
public static void setAccountDao(Dao accountDao) {
DaoRegistry.accountDao = accountDao;
}
+
+ public static Dao getIslandDao() {
+ return islandDao;
+ }
+
+ public static void setIslandDaoo(Dao islandDao) {
+ DaoRegistry.islandDao = islandDao;
+ }
}
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/objects/Account.java b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Account.java
similarity index 97%
rename from src/main/java/xyz/soukup/ecoCraftCore/objects/Account.java
rename to src/main/java/xyz/soukup/ecoCraftCore/database/objects/Account.java
index d174a84..50d7954 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/objects/Account.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Account.java
@@ -1,4 +1,4 @@
-package xyz.soukup.ecoCraftCore.objects;
+package xyz.soukup.ecoCraftCore.database.objects;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.misc.TransactionManager;
@@ -7,8 +7,7 @@ import com.j256.ormlite.stmt.UpdateBuilder;
import com.j256.ormlite.table.DatabaseTable;
import org.bukkit.entity.Player;
-import xyz.soukup.ecoCraftCore.EcoCraftCore;
-import xyz.soukup.ecoCraftCore.utilities.DaoRegistry;
+import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import java.sql.SQLException;
import java.util.HashMap;
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Island.java b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Island.java
new file mode 100644
index 0000000..edd47c5
--- /dev/null
+++ b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Island.java
@@ -0,0 +1,116 @@
+package xyz.soukup.ecoCraftCore.database.objects;
+
+import com.j256.ormlite.field.DataType;
+import com.j256.ormlite.field.DatabaseField;
+import com.j256.ormlite.table.DatabaseTable;
+import xyz.soukup.ecoCraftCore.database.DaoRegistry;
+
+import java.sql.SQLException;
+
+@DatabaseTable(tableName = "islands")
+public class Island {
+ @DatabaseField(generatedId = true)
+ private int id;
+
+ @DatabaseField(canBeNull = false, unique = true)
+ private String uuid;
+
+ @DatabaseField(canBeNull = false, unique = true)
+ private String name;
+
+
+ @DatabaseField(columnName = "display_name")
+ private String displayName;
+
+ @DatabaseField()
+ private String descritpion;
+
+ @DatabaseField(canBeNull = false)
+ private String owner;
+
+ @DatabaseField(canBeNull = false)
+ private String ownerType;
+
+ @DatabaseField(canBeNull = false, dataType = DataType.BYTE_ARRAY, columnDefinition = "LONGBLOB")
+ private byte[] data;
+
+ @DatabaseField(defaultValue = "", columnName = "active_on")
+ private String activeOn;
+
+ public Island(){
+
+ }
+
+ public Island(String name, String uuid, String displayName, String descritpion, String owner, String ownerType, byte[] data) {
+ this.name = name;
+ this.uuid = uuid;
+ this.displayName = displayName;
+ this.descritpion = descritpion;
+ this.owner = owner;
+ this.ownerType = ownerType;
+ this.data = data;
+
+ }
+
+ public void setData(byte[] data) {
+ this.data = data;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public String getDescritpion() {
+ return descritpion;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public String getOwnerType() {
+ return ownerType;
+ }
+
+ public byte[] getData() {
+ return data;
+ }
+
+ public String getActiveOn() {
+ return activeOn;
+ }
+
+ public static Island findById(int id) {
+
+
+ try {
+ return DaoRegistry.getIslandDao().queryForId(id);
+ } catch (SQLException e) {
+ return null;
+ }
+ }
+
+
+
+ public void save(){
+ try {
+ DaoRegistry.getIslandDao().createOrUpdate(this);
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+
+ public String getUuid() {
+ return uuid;
+ }
+}
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/objects/Shop.java b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java
similarity index 95%
rename from src/main/java/xyz/soukup/ecoCraftCore/objects/Shop.java
rename to src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java
index b41ac1c..6317a3c 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/objects/Shop.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java
@@ -1,4 +1,4 @@
-package xyz.soukup.ecoCraftCore.objects;
+package xyz.soukup.ecoCraftCore.database.objects;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import net.kyori.adventure.text.Component;
@@ -8,7 +8,7 @@ import org.bukkit.block.sign.SignSide;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import xyz.soukup.ecoCraftCore.utilities.DaoRegistry;
+import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.utilities.Converter;
import xyz.soukup.ecoCraftCore.utilities.PDC;
@@ -82,8 +82,8 @@ public class Shop {
this.itemName = itemName;
}
- public void setItemStackString(String itemStackString) {
- this.itemStackString = itemStackString;
+ public void setItemStack(ItemStack itemStack) {
+ this.itemStackString = Converter.toString(itemStack);
}
public void setAmount(int amount) {
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/objects/Transaction.java b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Transaction.java
similarity index 94%
rename from src/main/java/xyz/soukup/ecoCraftCore/objects/Transaction.java
rename to src/main/java/xyz/soukup/ecoCraftCore/database/objects/Transaction.java
index c2bff31..bd13d04 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/objects/Transaction.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Transaction.java
@@ -1,13 +1,11 @@
-package xyz.soukup.ecoCraftCore.objects;
+package xyz.soukup.ecoCraftCore.database.objects;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
-import org.bukkit.entity.Player;
-import xyz.soukup.ecoCraftCore.utilities.DaoRegistry;
+import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import java.sql.SQLException;
import java.sql.Timestamp;
-import java.util.Objects;
@DatabaseTable(tableName = "transactions")
public class Transaction {
@@ -81,11 +79,14 @@ public class Transaction {
this.receiverType = receiverType;
this.receiver = receiver;
this.type = type;
+ this.primaryInfo = "";
+ this.secondaryInfo = "";
}
public Transaction(float amount, String senderType, String sender, String receiverType, String receiver, String type, String primaryInfo) {
this(amount, senderType, sender, receiverType, receiver, type);
this.primaryInfo = primaryInfo;
+ this.secondaryInfo = "";
}
public Transaction(float amount, String senderType, String sender, String receiverType, String receiver, String type, String primaryInfo, String secondaryInfo) {
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/events/InventoryActionCancel.java b/src/main/java/xyz/soukup/ecoCraftCore/events/InventoryActionCancel.java
deleted file mode 100644
index 6b77ec9..0000000
--- a/src/main/java/xyz/soukup/ecoCraftCore/events/InventoryActionCancel.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package xyz.soukup.ecoCraftCore.events;
-
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-
-public class InventoryActionCancel implements Listener {
- @EventHandler
- public void onInventoryClick(InventoryClickEvent event) {
- if (event.getView().getTitle().contains("GUI -")) {
- if (!ClickType.valueOf(event.getClick().name()).toString().isEmpty()) {
- event.setCancelled(true);
- }
- }
- }
-}
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/events/PreparePlayer.java b/src/main/java/xyz/soukup/ecoCraftCore/events/PreparePlayer.java
index a6509a7..c960d5b 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/events/PreparePlayer.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/events/PreparePlayer.java
@@ -3,7 +3,7 @@ package xyz.soukup.ecoCraftCore.events;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
-import xyz.soukup.ecoCraftCore.objects.Account;
+import xyz.soukup.ecoCraftCore.database.objects.Account;
public class PreparePlayer implements Listener {
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/events/ShopLogic.java b/src/main/java/xyz/soukup/ecoCraftCore/events/ShopLogic.java
index a166176..ddb250b 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/events/ShopLogic.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/events/ShopLogic.java
@@ -1,9 +1,16 @@
package xyz.soukup.ecoCraftCore.events;
-
-import dev.triumphteam.gui.builder.item.ItemBuilder;
-import dev.triumphteam.gui.guis.Gui;
-import dev.triumphteam.gui.guis.GuiItem;
-import net.kyori.adventure.text.Component;
+import com.github.stefvanschie.inventoryframework.gui.GuiItem;
+import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
+import com.github.stefvanschie.inventoryframework.pane.StaticPane;
+import io.papermc.paper.dialog.Dialog;
+import io.papermc.paper.dialog.DialogResponseView;
+import io.papermc.paper.registry.data.dialog.ActionButton;
+import io.papermc.paper.registry.data.dialog.DialogBase;
+import io.papermc.paper.registry.data.dialog.action.DialogAction;
+import io.papermc.paper.registry.data.dialog.input.DialogInput;
+import io.papermc.paper.registry.data.dialog.type.DialogType;
+import net.kyori.adventure.audience.Audience;
+import net.kyori.adventure.text.event.ClickCallback;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
@@ -14,17 +21,21 @@ import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
-import xyz.soukup.ecoCraftCore.objects.Account;
-import xyz.soukup.ecoCraftCore.objects.Shop;
-import xyz.soukup.ecoCraftCore.objects.Transaction;
-import xyz.soukup.ecoCraftCore.objects.VirtualChest;
-import xyz.soukup.ecoCraftCore.utilities.Converter;
-import xyz.soukup.ecoCraftCore.utilities.InventoryUtils;
-import xyz.soukup.ecoCraftCore.utilities.Messages;
-import xyz.soukup.ecoCraftCore.utilities.PDC;
+import org.bukkit.inventory.PlayerInventory;
+import xyz.soukup.ecoCraftCore.gui.GuiItemBuilder;
+import xyz.soukup.ecoCraftCore.inventory.InventoryUtils;
+import xyz.soukup.ecoCraftCore.messages.Messages;
+import xyz.soukup.ecoCraftCore.database.objects.Account;
+import xyz.soukup.ecoCraftCore.database.objects.Shop;
+import xyz.soukup.ecoCraftCore.database.objects.Transaction;
+import xyz.soukup.ecoCraftCore.inventory.VirtualChest;
+import xyz.soukup.ecoCraftCore.utilities.*;
import java.util.HashMap;
+import java.util.List;
+import java.util.Objects;
+@SuppressWarnings("UnstableApiUsage")
public class ShopLogic implements Listener {
@EventHandler
@@ -64,20 +75,28 @@ public class ShopLogic implements Listener {
//ZDE Přídat otevíraní shop edit gui
+ if (shop.getOwnerType().equals("player") && shop.getOwner().equals(player.getName())){
+ Dialog dialog = buildEditDialog(shop);
+ player.showDialog(dialog);
+ return;
+ }
- Gui gui = buildShopGui(player, shop);
+ ChestGui gui = buildShopGui(player, shop);
- gui.open(player);
+ gui.show(player);
}
- public static Gui buildShopGui(Player player, Shop shop){
+ public static ChestGui buildShopGui(Player player, Shop shop){
- Gui gui = Gui.gui()
- .title(Component.text("Obchod"))
- .rows(1)
- .create();
+ ChestGui gui = new ChestGui(1, Messages.getAsString("gui.shop.title"));
+
+ gui.setOnGlobalClick(inventoryClickEvent -> {
+ inventoryClickEvent.setCancelled(true);
+ });
+
+ StaticPane staticPane = new StaticPane(9, 1);
Float buyPrice = shop.getPriceBuy();
Float sellPrice = shop.getPriceSell();
@@ -89,10 +108,10 @@ public class ShopLogic implements Listener {
hashMap.put("amount", Integer.toString(amount));
hashMap.put("price", String.format("%.2f", buyPrice));
- GuiItem one = ItemBuilder
- .from(Material.LIME_WOOL)
- .name(Messages.get("menu.shop.buy", hashMap))
- .asGuiItem();
+ GuiItem one = new GuiItemBuilder(Material.LIME_WOOL)
+ .setName(Messages.get("gui.shop.buy", hashMap))
+ .build();
+
one.setAction(event -> {
event.setCancelled(true);
ShopLogic.buy(shop, player, 1);
@@ -101,16 +120,17 @@ public class ShopLogic implements Listener {
hashMap.put("amount", Integer.toString(amount*8));
hashMap.put("price", String.format("%.2f", buyPrice*8));
- GuiItem eight = ItemBuilder
- .from(Material.LIME_WOOL)
- .name(Messages.get("menu.shop.buy", hashMap))
- .asGuiItem();
+ GuiItem eight = new GuiItemBuilder(Material.LIME_WOOL)
+ .setName(Messages.get("gui.shop.buy", hashMap))
+ .build();
+
eight.setAction(event -> {
event.setCancelled(true);
ShopLogic.buy(shop, player, 8);
});
- gui.setItem(0, one);
- gui.setItem(1, eight);
+
+ staticPane.addItem(one, 0,0);
+ staticPane.addItem(eight, 1,0);
}
@@ -121,10 +141,9 @@ public class ShopLogic implements Listener {
hashMap.put("amount", Integer.toString(amount));
hashMap.put("price", String.format("%.2f", sellPrice));
- GuiItem one = ItemBuilder
- .from(Material.YELLOW_WOOL)
- .name(Messages.get("menu.shop.sell", hashMap))
- .asGuiItem();
+ GuiItem one = new GuiItemBuilder(Material.YELLOW_WOOL)
+ .setName(Messages.get("gui.shop.sell", hashMap))
+ .build();
one.setAction(event -> {
event.setCancelled(true);
@@ -135,31 +154,63 @@ public class ShopLogic implements Listener {
hashMap.put("amount", Integer.toString(amount*8));
hashMap.put("price", String.format("%.2f", sellPrice*8));
- GuiItem eight = ItemBuilder
- .from(Material.YELLOW_WOOL)
- .name(Messages.get("menu.shop.sell", hashMap))
- .asGuiItem();
+ GuiItem eight = new GuiItemBuilder(Material.YELLOW_WOOL)
+ .setName(Messages.get("gui.shop.sell", hashMap))
+ .build();
eight.setAction(event -> {
event.setCancelled(true);
ShopLogic.sell(shop, player, 8);
});
- gui.setItem(7, one);
- gui.setItem(8, eight);
+ staticPane.addItem(one, 7,0);
+ staticPane.addItem(eight, 8, 0);
}
GuiItem item = new GuiItem(shop.getItemStack());
- gui.setItem(4, item);
+ staticPane.addItem(item, 4, 0);
+ gui.addPane(staticPane);
- gui.setDefaultClickAction(event -> {
- event.setCancelled(true);
- });
return gui;
}
+ public static Dialog buildEditDialog(Shop shop){
+ return Dialog.create(builder -> builder.empty()
+ .base(DialogBase.builder(Messages.get("gui.shop-edit.title"))
+ .inputs(List.of(
+ DialogInput.text("count", Messages.get("gui.shop-edit.inputs.count"))
+ .initial(String.valueOf(shop.getAmount()))
+ .build(),
+ DialogInput.text("sellprice", Messages.get("gui.shop-edit.inputs.price-sell"))
+ .initial(String.valueOf(shop.getPriceSell()))
+ .build(),
+ DialogInput.text("buyprice", Messages.get("gui.shop-edit.inputs.price-buy"))
+ .initial(String.valueOf(shop.getPriceBuy()))
+ .build(),
+ DialogInput.bool("changeitem", Messages.get("gui.shop-edit.inputs.change-item"))
+ .build()
+
+ ))
+ .build())
+ .type(DialogType.confirmation(
+ ActionButton.builder(Messages.get("gui.shop-edit.button.confirm"))
+ .action(DialogAction.customClick(
+ (view, audience) -> {
+ changeShopParameters(view, audience, shop);
+ audience.closeDialog();
+ },
+ ClickCallback.Options.builder()
+ .build()
+ ))
+ .build(),
+ ActionButton.builder(Messages.get("gui.shop-edit.button.cancel")).build()
+ ))
+
+ );
+ }
+
public static void buy(Shop shop, Player player, int multiplier){
if (VirtualChestLogic.openedChests.containsKey(shop.getVirtualChestID())){
@@ -214,6 +265,41 @@ public class ShopLogic implements Listener {
}
+ public static void changeShopParameters(DialogResponseView response, Audience audience, Shop shop){
+ if (!(audience instanceof Player)){
+ return;
+ }
+
+ Player player = (Player) audience;
+
+ if (Boolean.TRUE.equals(response.getBoolean("changeitem"))){
+
+ PlayerInventory playerInventory = player.getInventory();
+ ItemStack itemStack = playerInventory.getItemInMainHand();
+
+ shop.setItemStack(itemStack);
+ }
+
+ float sellPrice;
+ float buyPrice;
+ int count;
+
+ try {
+ sellPrice = Float.parseFloat(Objects.requireNonNull(response.getText("sellprice")));
+ buyPrice = Float.parseFloat(Objects.requireNonNull(response.getText("buyprice")));
+ count = Integer.parseInt(Objects.requireNonNull(response.getText("count")));
+ } catch (NumberFormatException exception) {
+ Messages.send(player, "gui.error.invalid-input");
+ return;
+ }
+
+ shop.setAmount(count);
+ shop.setPriceSell(sellPrice);
+ shop.setPriceBuy(buyPrice);
+ shop.save();
+
+ }
+
public static void sell(Shop shop, Player player, int multiplier){
if (VirtualChestLogic.openedChests.containsKey(shop.getVirtualChestID())){
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/events/VirtualChestLogic.java b/src/main/java/xyz/soukup/ecoCraftCore/events/VirtualChestLogic.java
index 5ac6fc7..2699dfa 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/events/VirtualChestLogic.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/events/VirtualChestLogic.java
@@ -11,7 +11,7 @@ import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
-import xyz.soukup.ecoCraftCore.objects.VirtualChest;
+import xyz.soukup.ecoCraftCore.inventory.VirtualChest;
import xyz.soukup.ecoCraftCore.utilities.PDC;
import java.util.HashMap;
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/gui/GuiItemBuilder.java b/src/main/java/xyz/soukup/ecoCraftCore/gui/GuiItemBuilder.java
new file mode 100644
index 0000000..66f95c2
--- /dev/null
+++ b/src/main/java/xyz/soukup/ecoCraftCore/gui/GuiItemBuilder.java
@@ -0,0 +1,37 @@
+package xyz.soukup.ecoCraftCore.gui;
+
+import com.github.stefvanschie.inventoryframework.gui.GuiItem;
+import net.kyori.adventure.text.Component;
+import org.bukkit.Material;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.List;
+import java.util.Objects;
+
+public class GuiItemBuilder {
+ private ItemStack itemStack;
+ private ItemMeta itemMeta;
+
+ public GuiItemBuilder(Material material){
+ this.itemStack = new ItemStack(material);
+ this.itemMeta = this.itemStack.getItemMeta();
+ }
+
+ public GuiItemBuilder setName(Component component){
+ this.itemMeta.displayName(component);
+ return this;
+ }
+
+ public GuiItemBuilder addLore(Component component){
+ List lore = itemMeta.lore();
+ Objects.requireNonNull(lore).add(component);
+ itemMeta.lore(lore);
+ return this;
+ }
+
+ public GuiItem build(){
+ this.itemStack.setItemMeta(this.itemMeta);
+ return new GuiItem(this.itemStack);
+ }
+}
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/utilities/InventoryUtils.java b/src/main/java/xyz/soukup/ecoCraftCore/inventory/InventoryUtils.java
similarity index 95%
rename from src/main/java/xyz/soukup/ecoCraftCore/utilities/InventoryUtils.java
rename to src/main/java/xyz/soukup/ecoCraftCore/inventory/InventoryUtils.java
index a3ab141..403b7f4 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/utilities/InventoryUtils.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/inventory/InventoryUtils.java
@@ -1,4 +1,4 @@
-package xyz.soukup.ecoCraftCore.utilities;
+package xyz.soukup.ecoCraftCore.inventory;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/objects/VirtualChest.java b/src/main/java/xyz/soukup/ecoCraftCore/inventory/VirtualChest.java
similarity index 95%
rename from src/main/java/xyz/soukup/ecoCraftCore/objects/VirtualChest.java
rename to src/main/java/xyz/soukup/ecoCraftCore/inventory/VirtualChest.java
index 92464e9..5a09a87 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/objects/VirtualChest.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/inventory/VirtualChest.java
@@ -1,4 +1,4 @@
-package xyz.soukup.ecoCraftCore.objects;
+package xyz.soukup.ecoCraftCore.inventory;
import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
@@ -6,9 +6,8 @@ import com.j256.ormlite.table.DatabaseTable;
import org.bukkit.block.Chest;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
-import xyz.soukup.ecoCraftCore.utilities.DaoRegistry;
+import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.utilities.Converter;
-import xyz.soukup.ecoCraftCore.utilities.InventoryUtils;
import xyz.soukup.ecoCraftCore.utilities.PDC;
import java.sql.SQLException;
@@ -146,3 +145,9 @@ public class VirtualChest {
this.activeServer = activeServer;
}
}
+
+
+
+
+
+
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandCommand.java
new file mode 100644
index 0000000..283b225
--- /dev/null
+++ b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandCommand.java
@@ -0,0 +1,32 @@
+package xyz.soukup.ecoCraftCore.islands;
+
+import com.mojang.brigadier.arguments.StringArgumentType;
+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;
+
+
+public class IslandCommand {
+
+ LiteralArgumentBuilder tp = Commands.literal("tp")
+ .then(Commands.argument("uuid", StringArgumentType.word())
+ .executes(IslandCommand::teleport));
+
+ LiteralArgumentBuilder create = Commands.literal("create")
+ .then(Commands.argument("name", StringArgumentType.word())
+ .then(Commands.argument("display_name", StringArgumentType.string())));
+
+ private static int teleport(CommandContext context) {
+ return 0;
+ }
+
+ private static int createWorld(CommandContext context) {
+ return 0;
+ }
+
+ private static int loadWorld(CommandContext context) {
+ return 0;
+ }
+
+}
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandLoader.java b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandLoader.java
new file mode 100644
index 0000000..1431f76
--- /dev/null
+++ b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandLoader.java
@@ -0,0 +1,97 @@
+package xyz.soukup.ecoCraftCore.islands;
+import com.infernalsuite.asp.api.exceptions.UnknownWorldException;
+import com.infernalsuite.asp.api.loaders.SlimeLoader;
+import com.j256.ormlite.stmt.DeleteBuilder;
+import xyz.soukup.ecoCraftCore.database.objects.Island;
+import xyz.soukup.ecoCraftCore.database.DaoRegistry;
+
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class IslandLoader implements SlimeLoader {
+
+
+ @Override
+ public byte[] readWorld(String worldName) throws UnknownWorldException, IOException {
+
+ Island island;
+
+ try {
+ island = DaoRegistry.getIslandDao().queryBuilder().where().eq("uuid", worldName).queryForFirst();
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+
+ if (island == null){
+ throw new UnknownWorldException(worldName);
+ }
+
+ return island.getData();
+ }
+
+ @Override
+ public boolean worldExists(String worldName) throws IOException {
+ try {
+ long count = DaoRegistry.getIslandDao().queryBuilder()
+ .setCountOf(true)
+ .where()
+ .eq("uuid", worldName)
+ .countOf();
+
+ return count > 0;
+
+ } catch (NumberFormatException | SQLException e) {
+ return false;
+ }
+ }
+
+ @Override
+ public void saveWorld(String worldName, byte[] serializedWorld) throws IOException {
+ try {
+ Island island = DaoRegistry.getIslandDao().queryBuilder().where().eq("uuid", worldName).queryForFirst();
+
+ if (island != null) {
+ island.setData(serializedWorld);
+ island.save();
+ } else {
+ throw new IOException("Island " + worldName + " not found in DB.");
+ }
+ } catch (NumberFormatException | SQLException e) {
+ throw new IOException("Failed to save island : " + worldName, e);
+ }
+ }
+
+ @Override
+ public void deleteWorld(String worldName) throws IOException {
+ try {
+ DeleteBuilder deleteBuilder = DaoRegistry.getIslandDao().deleteBuilder();
+ deleteBuilder.where().eq("uuid", worldName);
+ deleteBuilder.delete();
+
+ } catch (NumberFormatException | SQLException e) {
+ throw new IOException("Failed to delete: " + worldName, e);
+ }
+ }
+
+ @Override
+ public List listWorlds() throws IOException {
+ try {
+ return DaoRegistry.getIslandDao().queryBuilder()
+ .selectColumns("uuid") // Only fetch the ID column
+ .query() // This returns Island objects with ONLY the ID field populated
+ .stream()
+ .map(Island::getUuid)
+ .collect(Collectors.toList());
+ } catch (SQLException e) {
+ throw new IOException("Failed to list islands", e);
+ }
+ }
+
+
+
+
+
+
+}
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandManager.java b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandManager.java
new file mode 100644
index 0000000..939b960
--- /dev/null
+++ b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandManager.java
@@ -0,0 +1,86 @@
+package xyz.soukup.ecoCraftCore.islands;
+
+import com.infernalsuite.asp.api.AdvancedSlimePaperAPI;
+import com.infernalsuite.asp.api.world.SlimeWorld;
+import com.infernalsuite.asp.api.world.properties.SlimeProperties;
+import com.infernalsuite.asp.api.world.properties.SlimePropertyMap;
+import org.bukkit.Bukkit;
+import xyz.soukup.ecoCraftCore.database.objects.Island;
+import xyz.soukup.ecoCraftCore.database.DaoRegistry;
+
+import java.sql.SQLException;
+import java.util.UUID;
+
+import static xyz.soukup.ecoCraftCore.EcoCraftCore.plugin;
+
+public class IslandManager {
+ private final AdvancedSlimePaperAPI asp = AdvancedSlimePaperAPI.instance();
+ private final IslandLoader loader = new IslandLoader();
+
+
+ public void createIsland(String name, String displayName, String descritpion, String owner, String ownerType) {
+ String uuid = UUID.randomUUID().toString();
+
+
+ SlimePropertyMap props = new SlimePropertyMap();
+ props.setValue(SlimeProperties.ENVIRONMENT, "overworld");
+ props.setValue(SlimeProperties.WORLD_TYPE, "flat");
+
+ // Create empty world in ASWM
+ try {
+ // Note: createEmptyWorld is fast, so we can run some parts sync if needed,
+ // but it's best to run the whole chain async.
+ Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
+ try {
+ // Create the database entry first so the loader has a row to update
+
+
+ Island island = new Island(name, uuid, displayName, descritpion, owner, ownerType, null);
+ island.save();
+ SlimeWorld slimeWorld = asp.createEmptyWorld(uuid, false, props, loader);
+
+
+ Bukkit.getScheduler().runTask(plugin, () -> {
+ asp.loadWorld(slimeWorld, true);
+ });
+ } catch (Exception e) { e.printStackTrace(); }
+ });
+ } catch (Exception e) { e.printStackTrace(); }
+ }
+
+ // 2. Retrieve and Load existing island
+ public int loadIsland(String uuid) {
+
+ if (Bukkit.getWorld(uuid) != null) {
+ return 0;
+ }
+
+ try {
+ Island island = DaoRegistry.getIslandDao().queryBuilder()
+ .selectColumns("active_on")
+ .where()
+ .eq("uuid", uuid)
+ .queryForFirst();
+
+ if (!island.getActiveOn().isEmpty()){
+ return 1;
+ }
+ } catch (SQLException e) {
+ return 2;
+ }
+
+
+ Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
+ try {
+
+ SlimeWorld slimeWorld = asp.readWorld(loader, uuid, false, new SlimePropertyMap());
+ Bukkit.getScheduler().runTask(plugin, () -> {
+ asp.loadWorld(slimeWorld, true);
+ });
+ } catch (Exception e) { e.printStackTrace(); }
+ });
+ return 0;
+ }
+
+
+}
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/islands/UnloadWorld.java b/src/main/java/xyz/soukup/ecoCraftCore/islands/UnloadWorld.java
new file mode 100644
index 0000000..63977a8
--- /dev/null
+++ b/src/main/java/xyz/soukup/ecoCraftCore/islands/UnloadWorld.java
@@ -0,0 +1,4 @@
+package xyz.soukup.ecoCraftCore.islands;
+
+public class UnloadWorld {
+}
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/utilities/Messages.java b/src/main/java/xyz/soukup/ecoCraftCore/messages/Messages.java
similarity index 95%
rename from src/main/java/xyz/soukup/ecoCraftCore/utilities/Messages.java
rename to src/main/java/xyz/soukup/ecoCraftCore/messages/Messages.java
index 8ec0439..2371064 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/utilities/Messages.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/messages/Messages.java
@@ -1,13 +1,11 @@
-package xyz.soukup.ecoCraftCore.utilities;
+package xyz.soukup.ecoCraftCore.messages;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.command.CommandSender;
-import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.entity.Player;
import java.io.File;
import java.io.IOException;
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/utilities/PHHM.java b/src/main/java/xyz/soukup/ecoCraftCore/messages/PHHM.java
similarity index 90%
rename from src/main/java/xyz/soukup/ecoCraftCore/utilities/PHHM.java
rename to src/main/java/xyz/soukup/ecoCraftCore/messages/PHHM.java
index fee94d5..0116993 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/utilities/PHHM.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/messages/PHHM.java
@@ -1,9 +1,9 @@
-package xyz.soukup.ecoCraftCore.utilities;
+package xyz.soukup.ecoCraftCore.messages;
import org.bukkit.Location;
-import xyz.soukup.ecoCraftCore.objects.Account;
-import xyz.soukup.ecoCraftCore.objects.Transaction;
+import xyz.soukup.ecoCraftCore.database.objects.Account;
+import xyz.soukup.ecoCraftCore.database.objects.Transaction;
import java.util.HashMap;
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/commands/RulerCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerCommand.java
similarity index 92%
rename from src/main/java/xyz/soukup/ecoCraftCore/commands/RulerCommand.java
rename to src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerCommand.java
index 3240456..dd09626 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/commands/RulerCommand.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerCommand.java
@@ -1,4 +1,4 @@
-package xyz.soukup.ecoCraftCore.commands;
+package xyz.soukup.ecoCraftCore.positionMarker;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
@@ -8,7 +8,7 @@ import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
-import xyz.soukup.ecoCraftCore.utilities.Messages;
+import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.utilities.PDC;
public class RulerCommand {
diff --git a/src/main/java/xyz/soukup/ecoCraftCore/events/RulerMarking.java b/src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerMarking.java
similarity index 95%
rename from src/main/java/xyz/soukup/ecoCraftCore/events/RulerMarking.java
rename to src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerMarking.java
index c9f642a..2f47d46 100644
--- a/src/main/java/xyz/soukup/ecoCraftCore/events/RulerMarking.java
+++ b/src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerMarking.java
@@ -1,4 +1,4 @@
-package xyz.soukup.ecoCraftCore.events;
+package xyz.soukup.ecoCraftCore.positionMarker;
import org.bukkit.Location;
import org.bukkit.block.Block;
@@ -10,9 +10,9 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
-import xyz.soukup.ecoCraftCore.utilities.Messages;
+import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.utilities.PDC;
-import xyz.soukup.ecoCraftCore.utilities.PHHM;
+import xyz.soukup.ecoCraftCore.messages.PHHM;
import java.util.HashMap;
diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml
index 163d1f2..c0c4e10 100644
--- a/src/main/resources/messages.yml
+++ b/src/main/resources/messages.yml
@@ -53,12 +53,21 @@ menu:
buy: "Koupit ks za $"
sell: "Prodat ks za $"
gui:
+ error:
+ invalid-input: "Vámi zadané hodnoty nejsou platné."
all: "Seznam guis: <1>, <2>"
- shopadmin:
- title: "GUI - Shop Admin"
- items:
- background: " "
- deleteshop: "Smazat Obchod"
- changesellprice: "Změnit Prodávající Cenu"
- changebuyprice: "Změnit Kupující Cenu"
- changeamounts: "Změnit Množství Prodeje a Výkupu"
+ shop-edit:
+ title: "Editace Obchodu"
+ inputs:
+ count: "Množství"
+ price-sell: "Cena pro výkup"
+ price-buy: "Cena pro prodej"
+ change-item: "Změň item na ten co držíš v ruce"
+ button:
+ confirm: "Zapsat změny"
+ cancel: "Zrušit"
+ shop:
+ title: "Obchod"
+ buy: "Koupit ks za $"
+ sell: "Prodat ks za $"
+