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 $" +