From eb9b40aa61217c5ce88ffa81bf68005fa678517f Mon Sep 17 00:00:00 2001 From: jakub Date: Sun, 8 Jun 2025 21:07:31 +0200 Subject: [PATCH] ik --- pom.xml | 47 ++--- .../xyz/soukup/ecoCraftCore/EcoCraftCore.java | 9 + .../commands/TransactionCommand.java | 9 +- .../ecoCraftCore/events/PreparePlayer.java | 15 ++ .../soukup/ecoCraftCore/events/ShopLogic.java | 162 ++++++++++++++++++ .../events/VirtualChestLogic.java | 58 ++++++- .../soukup/ecoCraftCore/objects/Account.java | 109 ++++++++++++ .../ecoCraftCore/objects/Transaction.java | 23 ++- .../ecoCraftCore/objects/VirtualChest.java | 24 +++ .../ecoCraftCore/utilities/Converter.java | 17 ++ .../ecoCraftCore/utilities/DaoRegistry.java | 10 ++ 11 files changed, 449 insertions(+), 34 deletions(-) create mode 100644 src/main/java/xyz/soukup/ecoCraftCore/events/PreparePlayer.java create mode 100644 src/main/java/xyz/soukup/ecoCraftCore/events/ShopLogic.java create mode 100644 src/main/java/xyz/soukup/ecoCraftCore/objects/Account.java diff --git a/pom.xml b/pom.xml index b2759e2..6916d91 100644 --- a/pom.xml +++ b/pom.xml @@ -60,12 +60,8 @@ - io.ebean - xyz.soukup.shaded.io.ebean - - - io.ebeaninternal - xyz.soukup.shaded.io.ebeaninternal + dev.triumphteam.gui + xyz.soukup.gui org.avaje @@ -100,38 +96,43 @@ sonatype https://oss.sonatype.org/content/groups/public/ + + jitpack.io + https://jitpack.io + - - - com.j256.ormlite - ormlite-core - 6.1 - - - com.j256.ormlite - ormlite-jdbc - 6.1 - - + + com.j256.ormlite + ormlite-core + 6.1 + + + com.j256.ormlite + ormlite-jdbc + 6.1 + com.mysql mysql-connector-j 9.3.0 - - io.github.odalita-developments.odalitamenus - core - 0.6.2 + dev.triumphteam + triumph-gui + 3.1.12 - io.papermc.paper paper-api 1.21.3-R0.1-SNAPSHOT provided + + com.github.MatrixCreations + MatrixColorAPI + v1.0.7 + diff --git a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java index 249d7e7..073d520 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java @@ -12,8 +12,11 @@ import org.jetbrains.annotations.NotNull; import xyz.soukup.ecoCraftCore.commands.RulerCommand; import xyz.soukup.ecoCraftCore.commands.ShopCommand; import xyz.soukup.ecoCraftCore.commands.TransactionCommand; +import xyz.soukup.ecoCraftCore.events.PreparePlayer; import xyz.soukup.ecoCraftCore.events.RulerMarking; +import xyz.soukup.ecoCraftCore.events.ShopLogic; import xyz.soukup.ecoCraftCore.events.VirtualChestLogic; +import xyz.soukup.ecoCraftCore.objects.Account; import xyz.soukup.ecoCraftCore.objects.Shop; import xyz.soukup.ecoCraftCore.objects.Transaction; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; @@ -62,10 +65,12 @@ public final class EcoCraftCore extends JavaPlugin { TableUtils.createTableIfNotExists(connectionSource, Transaction.class); TableUtils.createTableIfNotExists(connectionSource, Shop.class); TableUtils.createTableIfNotExists(connectionSource, VirtualChest.class); + TableUtils.createTableIfNotExists(connectionSource, Account.class); DaoRegistry.setTransactionDao(DaoManager.createDao(connectionSource, Transaction.class)); DaoRegistry.setShopDao(DaoManager.createDao(connectionSource, Shop.class)); DaoRegistry.setVirtualChestDao(DaoManager.createDao(connectionSource, VirtualChest.class)); + DaoRegistry.setAccountDao(DaoManager.createDao(connectionSource, Account.class)); } @@ -82,5 +87,9 @@ public final class EcoCraftCore extends JavaPlugin { pm.registerEvents(new RulerMarking(), this); pm.registerEvents(new VirtualChestLogic(), this); + pm.registerEvents(new ShopLogic(), this); + pm.registerEvents(new PreparePlayer(), this); } + + } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/commands/TransactionCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/commands/TransactionCommand.java index 884e0c9..a69658a 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/commands/TransactionCommand.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/commands/TransactionCommand.java @@ -1,14 +1,11 @@ package xyz.soukup.ecoCraftCore.commands; -import com.j256.ormlite.dao.Dao; -import com.j256.ormlite.dao.DaoManager; -import com.mojang.brigadier.arguments.DoubleArgumentType; +import com.mojang.brigadier.arguments.FloatArgumentType; 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; -import xyz.soukup.ecoCraftCore.EcoCraftCore; import xyz.soukup.ecoCraftCore.objects.Transaction; public class TransactionCommand { @@ -18,14 +15,14 @@ public class TransactionCommand { .then(Commands.literal("simulate") .then(Commands.argument("sender", StringArgumentType.word()) .then(Commands.argument("receiver", StringArgumentType.word()) - .then(Commands.argument("amount", DoubleArgumentType.doubleArg(0.1)) + .then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F)) .executes(TransactionCommand::simulateTransaction))))); } private static int simulateTransaction(CommandContext ctx) { String sender = StringArgumentType.getString(ctx, "sender"); String receiver = StringArgumentType.getString(ctx, "receiver"); - double amount = DoubleArgumentType.getDouble(ctx, "amount"); + Float amount = FloatArgumentType.getFloat(ctx, "amount"); Transaction tx = new Transaction(amount, "player", sender, "player", receiver, "command"); diff --git a/src/main/java/xyz/soukup/ecoCraftCore/events/PreparePlayer.java b/src/main/java/xyz/soukup/ecoCraftCore/events/PreparePlayer.java new file mode 100644 index 0000000..966d5d3 --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/events/PreparePlayer.java @@ -0,0 +1,15 @@ +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; + +public class PreparePlayer implements Listener { + + @EventHandler + public void preparePlayer(PlayerJoinEvent event){ + Account account = Account.getOrCreate(event.getPlayer()); + account.save(); + } +} diff --git a/src/main/java/xyz/soukup/ecoCraftCore/events/ShopLogic.java b/src/main/java/xyz/soukup/ecoCraftCore/events/ShopLogic.java new file mode 100644 index 0000000..00c7906 --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/events/ShopLogic.java @@ -0,0 +1,162 @@ +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 org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.Sign; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +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.PDC; + +public class ShopLogic implements Listener { + + @EventHandler + public void openShop(PlayerInteractEvent event){ + + if (event.getAction() != Action.RIGHT_CLICK_BLOCK){ + return; + } + + Block block = event.getClickedBlock(); + + assert block != null; + if (!(block.getState() instanceof Sign sign)){ + return; + } + + Integer id = PDC.getInteger(sign, "shop"); + + if (id == null){ + return; + } + + Shop shop = Shop.findById(id); + + if (shop == null){ + return; + } + + event.setCancelled(true); + + Player player = event.getPlayer(); + + Gui gui = buildShopGui(player, shop); + + gui.open(player); + + + } + + public static Gui buildShopGui(Player player, Shop shop){ + + Gui gui = Gui.gui() + .title(Component.text("Obchod")) + .rows(1) + .create(); + + Float buyPrice = shop.getPriceBuy(); + Float sellPrice = shop.getPriceSell(); + int amount = shop.getAmount(); + + if (buyPrice != 0){ + GuiItem one = ItemBuilder + .from(Material.LIME_WOOL) + .name(Converter.toComponent("&aKoupit " + amount + "ks za " + String.format("%.2f", buyPrice))) + .asGuiItem(); + one.setAction(event -> { + event.setCancelled(true); + ShopLogic.buy(shop, player, 1); + }); + + GuiItem eight = ItemBuilder + .from(Material.LIME_WOOL) + .name(Converter.toComponent("&aKoupit " + amount*8 + "ks za " + String.format("%.2f", buyPrice*8))) + .asGuiItem(); + eight.setAction(event -> { + event.setCancelled(true); + ShopLogic.buy(shop, player, 8); + }); + gui.setItem(0, one); + gui.setItem(1, eight); + + + } + + if (sellPrice != 0){ + GuiItem one = ItemBuilder + .from(Material.YELLOW_WOOL) + .name(Converter.toComponent("&eProdat " + amount + "ks za " + String.format("%.2f", sellPrice))) + .asGuiItem(); + + GuiItem eight = ItemBuilder + .from(Material.YELLOW_WOOL) + .name(Converter.toComponent("&eProdat " + amount*8 + "ks za " + String.format("%.2f", sellPrice*8))) + .asGuiItem(); + + gui.setItem(7, one); + gui.setItem(8, eight); + + } + + GuiItem item = new GuiItem(shop.getItemStack()); + + gui.setItem(4, item); + + gui.setDefaultClickAction(event -> { + event.setCancelled(true); + }); + return gui; + } + + public static void buy(Shop shop, Player player, int multiplier){ + int amount = shop.getAmount() * multiplier; + float price = shop.getPriceBuy() * multiplier; + ItemStack itemStack = shop.getItemStack(); + itemStack.setAmount(amount); + + Account account = Account.getOrCreate(player); + + if (price > account.getBalance()){ + player.sendPlainMessage("nemaš dost mony"); + return; + } + + VirtualChest virtualChest = VirtualChest.findById(shop.getVirtualChestID()); + + if (virtualChest == null){ + return; + } + + Inventory playerInventory = player.getInventory(); + + if (InventoryUtils.getSpaceLeft(playerInventory, itemStack) < amount){ + player.sendPlainMessage("Nemáš dost místa v invu"); + return; + } + + if (!virtualChest.removeItem(itemStack)){ + player.sendPlainMessage("není dost věcí v chestce"); + return; + } + + playerInventory.removeItem(itemStack); + + new Transaction(price, "player", player.getName(), "player", shop.getOwner(), "playerShop", shop.getItemName() ,Integer.toString(amount)); + + + } +} diff --git a/src/main/java/xyz/soukup/ecoCraftCore/events/VirtualChestLogic.java b/src/main/java/xyz/soukup/ecoCraftCore/events/VirtualChestLogic.java index ac3b175..94a609b 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/events/VirtualChestLogic.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/events/VirtualChestLogic.java @@ -8,10 +8,13 @@ import org.bukkit.block.TileState; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.inventory.HopperInventorySearchEvent; import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; import xyz.soukup.ecoCraftCore.objects.VirtualChest; import xyz.soukup.ecoCraftCore.utilities.PDC; @@ -96,8 +99,61 @@ public class VirtualChestLogic implements Listener { return; } - openedChests.remove(id); + VirtualChest virtualChest = VirtualChest.findById(id); + + if (virtualChest == null){ + return; + } + + virtualChest.setOpened(false); + virtualChest.setInventory(event.getInventory()); + virtualChest.save(); + } + + @EventHandler + public void hopperInsert(InventoryMoveItemEvent event){ + + InventoryHolder initiator = event.getInitiator().getHolder(); + InventoryHolder source = event.getSource().getHolder(); + InventoryHolder destination = event.getDestination().getHolder(); + + InventoryHolder inventoryHolder; + + assert initiator != null; + if (initiator.equals(source)){ + inventoryHolder = destination; + }else{ + inventoryHolder = source; + } + + Integer id; + + if (inventoryHolder instanceof Chest chest){ + id = PDC.getInteger(chest, "virtual"); + } else if (inventoryHolder instanceof DoubleChest doubleChest) { + id = PDC.getInteger((TileState) doubleChest.getRightSide(), "virtual"); + }else { + return; + } + + VirtualChest virtualChest = VirtualChest.findById(id); + + if (virtualChest == null){ + return; + } + + ItemStack itemStack = event.getItem(); + + if (inventoryHolder.equals(destination)){ + virtualChest.addItem(itemStack); + }else { + virtualChest.removeItem(itemStack); + } + + virtualChest.save(); + + } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/objects/Account.java b/src/main/java/xyz/soukup/ecoCraftCore/objects/Account.java new file mode 100644 index 0000000..293f1a4 --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/objects/Account.java @@ -0,0 +1,109 @@ +package xyz.soukup.ecoCraftCore.objects; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.stmt.QueryBuilder; +import com.j256.ormlite.table.DatabaseTable; + +import org.bukkit.entity.Player; +import xyz.soukup.ecoCraftCore.EcoCraftCore; +import xyz.soukup.ecoCraftCore.utilities.DaoRegistry; + +import java.sql.SQLException; + +@DatabaseTable(tableName = "accounts") +public class Account { + @DatabaseField(generatedId = true) + private int id; + + @DatabaseField(canBeNull = false) + private String owner; + + @DatabaseField(canBeNull = false) + private String type; + + @DatabaseField(canBeNull = false, defaultValue = "0") + private float balance; + + public Account(){ + + } + + public Account(String owner, String type){ + this.owner = owner; + this.type = type; + } + + public String getOwner() { + return owner; + } + + public String getType() { + return type; + } + + public float getBalance() { + return balance; + } + + public int getId() { + return id; + } + + public void setBalance(float balance) { + this.balance = balance; + } + + public void deposit(float amount){ + this.balance += amount; + } + + public void withdraw(float amount){ + this.balance -= amount; + } + + public static Account getOrCreate(String type, String owner){ + QueryBuilder queryBuilder = DaoRegistry.getAccountDao().queryBuilder(); + try { + queryBuilder.where() + .eq("type", type) + .and() + .eq("owner", owner); + Account account = DaoRegistry.getAccountDao().queryForFirst(queryBuilder.prepare()); + + if (account == null){ + account = new Account(owner, type); + } + return account; + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public static Account getOrCreate(Player player){ + QueryBuilder queryBuilder = DaoRegistry.getAccountDao().queryBuilder(); + try { + queryBuilder.where() + .eq("type", "player") + .and() + .eq("owner", player.getName()); + Account account = DaoRegistry.getAccountDao().queryForFirst(queryBuilder.prepare()); + + if (account == null){ + account = new Account(player.getName(), "player"); + } + return account; + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public void save(){ + try { + DaoRegistry.getAccountDao().createOrUpdate(this); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + +} diff --git a/src/main/java/xyz/soukup/ecoCraftCore/objects/Transaction.java b/src/main/java/xyz/soukup/ecoCraftCore/objects/Transaction.java index 865be3c..3db2425 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/objects/Transaction.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/objects/Transaction.java @@ -2,6 +2,7 @@ package xyz.soukup.ecoCraftCore.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 java.sql.SQLException; @@ -14,7 +15,7 @@ public class Transaction { private long id; @DatabaseField(canBeNull = false) - private double amount; + private float amount; @DatabaseField(canBeNull = false, columnName = "sender_type") private String senderType; @@ -53,6 +54,19 @@ public class Transaction { } } + public void process(){ + Account senderAccount = Account.getOrCreate(this.senderType, this.sender); + Account receiverAccount = Account.getOrCreate(this.receiverType, this.receiver); + + senderAccount.withdraw(this.amount); + receiverAccount.deposit(this.amount); + + senderAccount.save(); + receiverAccount.save(); + + save(); + } + public static Transaction findById(int id) { try { return DaoRegistry.getTransactionDao().queryForId(id); @@ -61,7 +75,7 @@ public class Transaction { } } - public Transaction(double amount, String senderType, String sender, String receiverType, String receiver, String type) { + public Transaction(float amount, String senderType, String sender, String receiverType, String receiver, String type) { this.amount = amount; this.senderType = senderType; this.sender = sender; @@ -70,16 +84,17 @@ public class Transaction { this.type = type; } - public Transaction(double amount, String senderType, String sender, String receiverType, String receiver, String type, String primaryInfo) { + 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; } - public Transaction(double amount, String senderType, String sender, String receiverType, String receiver, String type, String primaryInfo, String secondaryInfo) { + public Transaction(float amount, String senderType, String sender, String receiverType, String receiver, String type, String primaryInfo, String secondaryInfo) { this(amount, senderType, sender, receiverType, receiver, type, primaryInfo); this.secondaryInfo = secondaryInfo; } + // Getters public long getId() { return id; } public Timestamp getTimestamp() { return timestamp; } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/objects/VirtualChest.java b/src/main/java/xyz/soukup/ecoCraftCore/objects/VirtualChest.java index d110091..0d557bb 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/objects/VirtualChest.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/objects/VirtualChest.java @@ -5,8 +5,10 @@ import com.j256.ormlite.field.DatabaseField; 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.utilities.Converter; +import xyz.soukup.ecoCraftCore.utilities.InventoryUtils; import xyz.soukup.ecoCraftCore.utilities.PDC; import java.sql.SQLException; @@ -75,6 +77,28 @@ public class VirtualChest { } } + public void setInventory(Inventory inventory) { + this.inventory = inventory; + } + + public boolean addItem(ItemStack itemStack){ + int spaceLeft = InventoryUtils.getSpaceLeft(this.inventory, itemStack); + if (spaceLeft < itemStack.getAmount()){ + return false; + } + getInventory().addItem(itemStack); + return true; + } + + public boolean removeItem(ItemStack itemStack){ + int count = InventoryUtils.getCount(getInventory(), itemStack); + if (count < itemStack.getAmount()){ + return false; + } + getInventory().removeItem(itemStack); + return true; + } + public Inventory getInventory(){ if (this.inventory == null){ this.inventory = Converter.inventoryFromString(this.inventoryString); diff --git a/src/main/java/xyz/soukup/ecoCraftCore/utilities/Converter.java b/src/main/java/xyz/soukup/ecoCraftCore/utilities/Converter.java index 00d7599..25a1e7c 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/utilities/Converter.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/utilities/Converter.java @@ -1,10 +1,14 @@ package xyz.soukup.ecoCraftCore.utilities; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.matrixcreations.libraries.MatrixColorAPI; import org.bukkit.Bukkit; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.configuration.file.YamlConfiguration; +import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; @@ -65,5 +69,18 @@ public class Converter { return inv; } + + public static Component toComponent(String text){ + return LegacyComponentSerializer.legacySection().deserialize(MatrixColorAPI.process(text)).asComponent(); + } + public static List toComponentList(List list){ + List componentList = new ArrayList<>(); + + for (String string : list){ + componentList.add(toComponent(string)); + } + + return componentList; + } } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/utilities/DaoRegistry.java b/src/main/java/xyz/soukup/ecoCraftCore/utilities/DaoRegistry.java index 60bac6c..812aa14 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/utilities/DaoRegistry.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/utilities/DaoRegistry.java @@ -1,6 +1,7 @@ package xyz.soukup.ecoCraftCore.utilities; 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; @@ -9,6 +10,7 @@ public class DaoRegistry { private static Dao shopDao; private static Dao transactionDao; private static Dao virtualChestDao; + private static Dao accountDao; public static Dao getShopDao() { @@ -34,4 +36,12 @@ public class DaoRegistry { public static void setVirtualChestDao(Dao virtualChestDao) { DaoRegistry.virtualChestDao = virtualChestDao; } + + public static Dao getAccountDao() { + return accountDao; + } + + public static void setAccountDao(Dao accountDao) { + DaoRegistry.accountDao = accountDao; + } }