Merge remote-tracking branch 'origin/ble' into dev_gioth

# Conflicts:
#	src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java
dev_gioth
Pygot 3 weeks ago
commit a84d6ece02
  1. 19
      pom.xml
  2. 23
      src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java
  3. 116
      src/main/java/xyz/soukup/ecoCraftCore/commands/GuiCommand.java
  4. 100
      src/main/java/xyz/soukup/ecoCraftCore/commands/MoneyCommand.java
  5. 87
      src/main/java/xyz/soukup/ecoCraftCore/commands/ShopCommand.java
  6. 17
      src/main/java/xyz/soukup/ecoCraftCore/database/DaoRegistry.java
  7. 5
      src/main/java/xyz/soukup/ecoCraftCore/database/objects/Account.java
  8. 116
      src/main/java/xyz/soukup/ecoCraftCore/database/objects/Island.java
  9. 8
      src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java
  10. 9
      src/main/java/xyz/soukup/ecoCraftCore/database/objects/Transaction.java
  11. 17
      src/main/java/xyz/soukup/ecoCraftCore/events/InventoryActionCancel.java
  12. 2
      src/main/java/xyz/soukup/ecoCraftCore/events/PreparePlayer.java
  13. 174
      src/main/java/xyz/soukup/ecoCraftCore/events/ShopLogic.java
  14. 2
      src/main/java/xyz/soukup/ecoCraftCore/events/VirtualChestLogic.java
  15. 37
      src/main/java/xyz/soukup/ecoCraftCore/gui/GuiItemBuilder.java
  16. 2
      src/main/java/xyz/soukup/ecoCraftCore/inventory/InventoryUtils.java
  17. 11
      src/main/java/xyz/soukup/ecoCraftCore/inventory/VirtualChest.java
  18. 32
      src/main/java/xyz/soukup/ecoCraftCore/islands/IslandCommand.java
  19. 97
      src/main/java/xyz/soukup/ecoCraftCore/islands/IslandLoader.java
  20. 86
      src/main/java/xyz/soukup/ecoCraftCore/islands/IslandManager.java
  21. 4
      src/main/java/xyz/soukup/ecoCraftCore/islands/UnloadWorld.java
  22. 4
      src/main/java/xyz/soukup/ecoCraftCore/messages/Messages.java
  23. 6
      src/main/java/xyz/soukup/ecoCraftCore/messages/PHHM.java
  24. 4
      src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerCommand.java
  25. 6
      src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerMarking.java
  26. 25
      src/main/resources/messages.yml

@ -43,10 +43,9 @@
</execution> </execution>
</executions> </executions>
<configuration> <configuration>
<packages>xyz.soukup.ecoCraftCore.objects.**</packages> <packages>xyz.soukup.ecoCraftCore.database.objects.**</packages>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>
@ -60,8 +59,8 @@
<configuration> <configuration>
<relocations> <relocations>
<relocation> <relocation>
<pattern>dev.triumphteam.gui</pattern> <pattern>com.github.stefvanschie.inventoryframework</pattern>
<shadedPattern>xyz.soukup.gui</shadedPattern> <!-- Replace package here here --> <shadedPattern>xyz.soukup.inventoryframework</shadedPattern>
</relocation> </relocation>
<relocation> <relocation>
<pattern>org.avaje</pattern> <pattern>org.avaje</pattern>
@ -128,17 +127,17 @@
<artifactId>mysql-connector-j</artifactId> <artifactId>mysql-connector-j</artifactId>
<version>9.3.0</version> <version>9.3.0</version>
</dependency> </dependency>
<dependency>
<groupId>dev.triumphteam</groupId>
<artifactId>triumph-gui</artifactId>
<version>3.1.12</version>
</dependency>
<dependency> <dependency>
<groupId>io.papermc.paper</groupId> <groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId> <artifactId>paper-api</artifactId>
<version>1.21.3-R0.1-SNAPSHOT</version> <version>1.21.10-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.github.stefvanschie.inventoryframework</groupId>
<artifactId>IF</artifactId>
<version>0.11.6</version>
</dependency>
<dependency> <dependency>
<groupId>com.github.MatrixCreations</groupId> <groupId>com.github.MatrixCreations</groupId>
<artifactId>MatrixColorAPI</artifactId> <artifactId>MatrixColorAPI</artifactId>

@ -9,19 +9,21 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull; 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.events.*;
import xyz.soukup.ecoCraftCore.objects.Account; import xyz.soukup.ecoCraftCore.database.objects.Account;
import xyz.soukup.ecoCraftCore.objects.Shop; import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.objects.Transaction; import xyz.soukup.ecoCraftCore.database.objects.Transaction;
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
import xyz.soukup.ecoCraftCore.objects.VirtualChest; import xyz.soukup.ecoCraftCore.inventory.VirtualChest;
import xyz.soukup.ecoCraftCore.utilities.DaoRegistry; import xyz.soukup.ecoCraftCore.positionMarker.RulerMarking;
import xyz.soukup.ecoCraftCore.utilities.Messages; import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.messages.Messages;
import java.io.IOException; import java.io.IOException;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.Duration;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -70,7 +72,7 @@ public final class EcoCraftCore extends JavaPlugin {
} }
private void prepareDatabase() throws SQLException { 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"); connectionSource = new JdbcConnectionSource(databaseUrl, "ecc", "ecc");
Logger.getLogger("com.j256.ormlite.table.TableUtils").setLevel(Level.OFF); 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(ShopCommand.createCommand().build()));
lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(RulerCommand.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(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(){ private void registerEvents(){
@ -104,7 +104,6 @@ public final class EcoCraftCore extends JavaPlugin {
pm.registerEvents(new VirtualChestLogic(), this); pm.registerEvents(new VirtualChestLogic(), this);
pm.registerEvents(new ShopLogic(), this); pm.registerEvents(new ShopLogic(), this);
pm.registerEvents(new PreparePlayer(), this); pm.registerEvents(new PreparePlayer(), this);
pm.registerEvents(new InventoryActionCancel(), this);
} }

@ -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<CommandSourceStack> createCommand() {
return Commands.literal("gopen")
.then(Commands.argument("id", StringArgumentType.string())
.executes(GuiCommand::openGui))
.executes(GuiCommand::getAll);
}
private static int openGui(CommandContext<CommandSourceStack> 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<CommandSourceStack> 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<String, Gui> 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<String, Gui> guiMap, CommandSender commandSender){
HashMap<String, String> stringGuis = new HashMap<>();
int index = 1;
for (Map.Entry<String, Gui> 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);
}
}

@ -1,10 +1,8 @@
package xyz.soukup.ecoCraftCore.commands; package xyz.soukup.ecoCraftCore.commands;
import com.mojang.brigadier.LiteralMessage;
import com.mojang.brigadier.arguments.FloatArgumentType; import com.mojang.brigadier.arguments.FloatArgumentType;
import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import io.papermc.paper.command.brigadier.CommandSourceStack; import io.papermc.paper.command.brigadier.CommandSourceStack;
@ -13,63 +11,60 @@ import io.papermc.paper.command.brigadier.argument.ArgumentTypes;
import io.papermc.paper.command.brigadier.argument.resolvers.selector.PlayerSelectorArgumentResolver; import io.papermc.paper.command.brigadier.argument.resolvers.selector.PlayerSelectorArgumentResolver;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import xyz.soukup.ecoCraftCore.objects.Account; import xyz.soukup.ecoCraftCore.database.objects.Account;
import xyz.soukup.ecoCraftCore.objects.Transaction; import xyz.soukup.ecoCraftCore.database.objects.Transaction;
import xyz.soukup.ecoCraftCore.utilities.Messages; import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.utilities.PHHM; import xyz.soukup.ecoCraftCore.messages.PHHM;
@SuppressWarnings("UnstableApiUsage")
public class MoneyCommand {
public static LiteralArgumentBuilder<CommandSourceStack> createCommand() {
RequiredArgumentBuilder<CommandSourceStack, PlayerSelectorArgumentResolver> playerArgument = Commands.argument("player", ArgumentTypes.player());
RequiredArgumentBuilder<CommandSourceStack, Float> amountArgument = Commands.argument("amount", FloatArgumentType.floatArg(0.1F));
RequiredArgumentBuilder<CommandSourceStack, String> ownerArgument = Commands.argument("owner", StringArgumentType.word());
RequiredArgumentBuilder<CommandSourceStack, String> typeArgument = Commands.argument("type", StringArgumentType.word());
public class MoneyCommand {
public static LiteralArgumentBuilder<CommandSourceStack> createCommand() {
// 1. Send Branch
LiteralArgumentBuilder<CommandSourceStack> send = Commands.literal("send") LiteralArgumentBuilder<CommandSourceStack> send = Commands.literal("send")
.requires(source -> source.getSender() instanceof Player) .requires(source -> source.getSender() instanceof Player)
.then(playerArgument.then(amountArgument.executes(MoneyCommand::sendMoney))); .then(Commands.argument("player", ArgumentTypes.player())
.then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
.executes(MoneyCommand::sendMoney)));
RequiredArgumentBuilder<CommandSourceStack, Float> selfGive = amountArgument
.requires(source -> source.getSender() instanceof Player)
.executes(MoneyCommand::giveMoneySelf);
RequiredArgumentBuilder<CommandSourceStack, PlayerSelectorArgumentResolver> playerGive = playerArgument
.then(amountArgument.executes(MoneyCommand::giveMoneyPlayer));
RequiredArgumentBuilder<CommandSourceStack, String> giveOther = typeArgument.then(ownerArgument.then(amountArgument.executes(MoneyCommand::giveMoneyOther)));
// 2. Give Branch
LiteralArgumentBuilder<CommandSourceStack> give = Commands.literal("give") LiteralArgumentBuilder<CommandSourceStack> give = Commands.literal("give")
.then(selfGive) // Case: /money give <player> <amount>
.then(playerGive) .then(Commands.argument("player", ArgumentTypes.player())
.then(giveOther); .then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
.executes(MoneyCommand::giveMoneyPlayer)))
// Case: /money give <amount> (Self)
RequiredArgumentBuilder<CommandSourceStack, Float> removeSelf = amountArgument .then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
.requires(source -> source.getSender() instanceof Player) .requires(source -> source.getSender() instanceof Player)
.executes(MoneyCommand::removeMoneySelf); .executes(MoneyCommand::giveMoneySelf))
// Case: /money give <type> <owner> <amount>
RequiredArgumentBuilder<CommandSourceStack, PlayerSelectorArgumentResolver> removePlayer = playerArgument .then(Commands.argument("type", StringArgumentType.word())
.then(amountArgument.executes(MoneyCommand::removeMoneyPlayer)); .then(Commands.argument("owner", StringArgumentType.word())
.then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
RequiredArgumentBuilder<CommandSourceStack, String> removeOther = typeArgument .executes(MoneyCommand::giveMoneyOther))));
.then(ownerArgument
.then(amountArgument.executes(MoneyCommand::removeMoneyOther))); // 3. Remove Branch
LiteralArgumentBuilder<CommandSourceStack> remove = Commands.literal("remove") LiteralArgumentBuilder<CommandSourceStack> remove = Commands.literal("remove")
.then(removeSelf) // Case: /money remove <player> <amount>
.then(removePlayer) .then(Commands.argument("player", ArgumentTypes.player())
.then(removeOther); .then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
.executes(MoneyCommand::removeMoneyPlayer)))
// Case: /money remove <amount> (Self)
.then(Commands.argument("amount", FloatArgumentType.floatArg(0.1F))
.requires(source -> source.getSender() instanceof Player)
.executes(MoneyCommand::removeMoneySelf))
// Case: /money remove <type> <owner> <amount>
.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") return Commands.literal("money")
.then(send) .then(send)
.then(give) .then(give)
.then(remove) .then(remove)
.executes(MoneyCommand::getBalance); .executes(MoneyCommand::getBalance);
} }
private static int getBalance(CommandContext<CommandSourceStack> context) { private static int getBalance(CommandContext<CommandSourceStack> context) {
@ -81,10 +76,8 @@ public class MoneyCommand {
Account account = Account.getOrCreate(player); Account account = Account.getOrCreate(player);
Messages.send(player, "money.balance.self", PHHM.get(account)); Messages.send(player, "money.balance.self", PHHM.get(account));
return 1; return 1;
} }
private static int sendMoney(CommandContext<CommandSourceStack> context) throws CommandSyntaxException { private static int sendMoney(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
PlayerSelectorArgumentResolver receiverResolver = context.getArgument("player", PlayerSelectorArgumentResolver.class); PlayerSelectorArgumentResolver receiverResolver = context.getArgument("player", PlayerSelectorArgumentResolver.class);
Player receiver = receiverResolver.resolve(context.getSource()).getFirst(); Player receiver = receiverResolver.resolve(context.getSource()).getFirst();
@ -110,17 +103,14 @@ public class MoneyCommand {
private static int giveMoneyPlayer(CommandContext<CommandSourceStack> context) throws CommandSyntaxException { private static int giveMoneyPlayer(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
CommandSender commandSender = context.getSource().getSender(); CommandSender commandSender = context.getSource().getSender();
PlayerSelectorArgumentResolver receiverResolver = context.getArgument("player", PlayerSelectorArgumentResolver.class); PlayerSelectorArgumentResolver receiverResolver = context.getArgument("player", PlayerSelectorArgumentResolver.class);
Player receiver = receiverResolver.resolve(context.getSource()).getFirst(); Player receiver = receiverResolver.resolve(context.getSource()).getFirst();
Float amount = context.getArgument("amount", Float.class); 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(); transaction.process();
Messages.send(commandSender, "money.give.player", PHHM.get(transaction)); Messages.send(commandSender, "money.give.player", PHHM.get(transaction));
return 1; return 1;
} }
@ -132,7 +122,6 @@ public class MoneyCommand {
transaction.process(); transaction.process();
Messages.send(player, "money.give.self", PHHM.get(transaction)); Messages.send(player, "money.give.self", PHHM.get(transaction));
return 1; return 1;
} }
@ -146,24 +135,22 @@ public class MoneyCommand {
transaction.process(); transaction.process();
Messages.send(commandSender, "money.give.other", PHHM.get(transaction)); Messages.send(commandSender, "money.give.other", PHHM.get(transaction));
return 1; return 1;
} }
private static int removeMoneyPlayer(CommandContext<CommandSourceStack> context) throws CommandSyntaxException { private static int removeMoneyPlayer(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
CommandSender commandSender = context.getSource().getSender(); CommandSender commandSender = context.getSource().getSender();
PlayerSelectorArgumentResolver senderResolver = context.getArgument("player", PlayerSelectorArgumentResolver.class); PlayerSelectorArgumentResolver senderResolver = context.getArgument("player", PlayerSelectorArgumentResolver.class);
Player sender = senderResolver.resolve(context.getSource()).getFirst(); Player sender = senderResolver.resolve(context.getSource()).getFirst();
Float amount = context.getArgument("amount", Float.class); 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(); transaction.process();
Messages.send(commandSender, "money.remove.player", PHHM.get(transaction)); Messages.send(commandSender, "money.remove.player", PHHM.get(transaction));
return 1; return 1;
} }
private static int removeMoneySelf(CommandContext<CommandSourceStack> context) { private static int removeMoneySelf(CommandContext<CommandSourceStack> context) {
Player player = (Player) context.getSource().getSender(); Player player = (Player) context.getSource().getSender();
Float amount = context.getArgument("amount", Float.class); Float amount = context.getArgument("amount", Float.class);
@ -172,9 +159,9 @@ public class MoneyCommand {
transaction.process(); transaction.process();
Messages.send(player, "money.remove.self", PHHM.get(transaction)); Messages.send(player, "money.remove.self", PHHM.get(transaction));
return 1; return 1;
} }
private static int removeMoneyOther(CommandContext<CommandSourceStack> context) { private static int removeMoneyOther(CommandContext<CommandSourceStack> context) {
CommandSender commandSender = context.getSource().getSender(); CommandSender commandSender = context.getSource().getSender();
Float amount = context.getArgument("amount", Float.class); Float amount = context.getArgument("amount", Float.class);
@ -185,7 +172,6 @@ public class MoneyCommand {
transaction.process(); transaction.process();
Messages.send(commandSender, "money.remove.other", PHHM.get(transaction)); Messages.send(commandSender, "money.remove.other", PHHM.get(transaction));
return 1; return 1;
} }
} }

@ -9,32 +9,38 @@ import org.bukkit.block.Chest;
import org.bukkit.block.Sign; import org.bukkit.block.Sign;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.events.RulerMarking; import xyz.soukup.ecoCraftCore.positionMarker.RulerMarking;
import xyz.soukup.ecoCraftCore.objects.Shop; import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.objects.VirtualChest; import xyz.soukup.ecoCraftCore.inventory.VirtualChest;
import xyz.soukup.ecoCraftCore.utilities.InventoryUtils; import xyz.soukup.ecoCraftCore.inventory.InventoryUtils;
import xyz.soukup.ecoCraftCore.utilities.Messages; import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.utilities.PDC; import xyz.soukup.ecoCraftCore.utilities.PDC;
@SuppressWarnings("UnstableApiUsage") @SuppressWarnings("UnstableApiUsage")
public class ShopCommand { public class ShopCommand {
public static LiteralArgumentBuilder<CommandSourceStack> createCommand() {
FloatArgumentType floatArgType = FloatArgumentType.floatArg(0.1F);
LiteralArgumentBuilder<CommandSourceStack> buy = Commands.literal("buy")
.then(Commands.argument("buy_price", floatArgType).executes(ShopCommand::createShop));
LiteralArgumentBuilder<CommandSourceStack> sell = Commands.literal("sell") public static LiteralArgumentBuilder<CommandSourceStack> createCommand() {
.then(Commands.argument("sell_price", floatArgType).executes(ShopCommand::createShop)); // 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 <amount> ...
return Commands.literal("shop") return Commands.literal("shop")
.then(Commands.argument("amount", IntegerArgumentType.integer(1)) .then(amountArg
.then(buy.then(sell)) // Branch 1: ... buy <price> [sell <price>]
.then(sell.then(buy))); .then(Commands.literal("buy")
.then(buyPriceArg
.executes(ShopCommand::createShop)
.then(Commands.literal("sell")
.then(sellPriceArg.executes(ShopCommand::createShop)))))
// Branch 2: ... sell <price> [buy <price>]
.then(Commands.literal("sell")
.then(sellPriceArg
.executes(ShopCommand::createShop)
.then(Commands.literal("buy")
.then(buyPriceArg.executes(ShopCommand::createShop))))));
} }
private static int createShop(CommandContext<CommandSourceStack> ctx) { private static int createShop(CommandContext<CommandSourceStack> ctx) {
@ -45,61 +51,56 @@ public class ShopCommand {
return 0; return 0;
} }
// 1. Check if blocks are marked
Chest chest = RulerMarking.chests.get(player); Chest chest = RulerMarking.chests.get(player);
Sign sign = RulerMarking.signs.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"); Messages.send(player, "shop.error.not-marked");
return 0; return 0;
} }
// 2. Validate Item in Hand
ItemStack item = player.getInventory().getItemInMainHand(); ItemStack item = player.getInventory().getItemInMainHand();
if (item.isEmpty()) { if (item.isEmpty()) {
Messages.send(player, "shop.error.empty-hand"); Messages.send(player, "shop.error.empty-hand");
return 0; return 0;
} }
// 3. Check if already a shop
if (PDC.getInteger(sign, "shop") != null) { if (PDC.getInteger(sign, "shop") != null) {
Messages.send(player, "shop.error.already-shop"); Messages.send(player, "shop.error.already-shop");
return 0; return 0;
} }
// 4. Parse Arguments Safely
int amount = ctx.getArgument("amount", Integer.class);
VirtualChest virtualChest = VirtualChest.getOrCreate(chest); float buyPrice = 0.0F;
virtualChest.databaseSave(); 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 freeSpace = InventoryUtils.getSpaceLeft(chest.getInventory(), item);
int stock = InventoryUtils.getCount(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 shop = new Shop(player, item, stock, freeSpace, amount, buyPrice, sellPrice, virtualChest.getId());
shop.save(); shop.save();
shop.writeIntoSign(sign); shop.writeIntoSign(sign);
Messages.send(player, "shop.created"); Messages.send(player, "shop.created");
return 1; return 1;
} }
} }

@ -1,16 +1,15 @@
package xyz.soukup.ecoCraftCore.utilities; package xyz.soukup.ecoCraftCore.database;
import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.Dao;
import xyz.soukup.ecoCraftCore.objects.Account; import xyz.soukup.ecoCraftCore.database.objects.*;
import xyz.soukup.ecoCraftCore.objects.Shop; import xyz.soukup.ecoCraftCore.inventory.VirtualChest;
import xyz.soukup.ecoCraftCore.objects.Transaction;
import xyz.soukup.ecoCraftCore.objects.VirtualChest;
public class DaoRegistry { public class DaoRegistry {
private static Dao<Shop, Integer> shopDao; private static Dao<Shop, Integer> shopDao;
private static Dao<Transaction, Integer> transactionDao; private static Dao<Transaction, Integer> transactionDao;
private static Dao<VirtualChest, Integer> virtualChestDao; private static Dao<VirtualChest, Integer> virtualChestDao;
private static Dao<Account, Integer> accountDao; private static Dao<Account, Integer> accountDao;
private static Dao<Island, Integer> islandDao;
public static Dao<Shop, Integer> getShopDao() { public static Dao<Shop, Integer> getShopDao() {
@ -44,4 +43,12 @@ public class DaoRegistry {
public static void setAccountDao(Dao<Account, Integer> accountDao) { public static void setAccountDao(Dao<Account, Integer> accountDao) {
DaoRegistry.accountDao = accountDao; DaoRegistry.accountDao = accountDao;
} }
public static Dao<Island, Integer> getIslandDao() {
return islandDao;
}
public static void setIslandDaoo(Dao<Island, Integer> islandDao) {
DaoRegistry.islandDao = islandDao;
}
} }

@ -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.field.DatabaseField;
import com.j256.ormlite.misc.TransactionManager; import com.j256.ormlite.misc.TransactionManager;
@ -7,8 +7,7 @@ import com.j256.ormlite.stmt.UpdateBuilder;
import com.j256.ormlite.table.DatabaseTable; import com.j256.ormlite.table.DatabaseTable;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import xyz.soukup.ecoCraftCore.EcoCraftCore; import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.utilities.DaoRegistry;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.HashMap; import java.util.HashMap;

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

@ -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.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable; import com.j256.ormlite.table.DatabaseTable;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -8,7 +8,7 @@ import org.bukkit.block.sign.SignSide;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; 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.Converter;
import xyz.soukup.ecoCraftCore.utilities.PDC; import xyz.soukup.ecoCraftCore.utilities.PDC;
@ -82,8 +82,8 @@ public class Shop {
this.itemName = itemName; this.itemName = itemName;
} }
public void setItemStackString(String itemStackString) { public void setItemStack(ItemStack itemStack) {
this.itemStackString = itemStackString; this.itemStackString = Converter.toString(itemStack);
} }
public void setAmount(int amount) { public void setAmount(int amount) {

@ -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.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable; import com.j256.ormlite.table.DatabaseTable;
import org.bukkit.entity.Player; import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.utilities.DaoRegistry;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.Objects;
@DatabaseTable(tableName = "transactions") @DatabaseTable(tableName = "transactions")
public class Transaction { public class Transaction {
@ -81,11 +79,14 @@ public class Transaction {
this.receiverType = receiverType; this.receiverType = receiverType;
this.receiver = receiver; this.receiver = receiver;
this.type = type; this.type = type;
this.primaryInfo = "";
this.secondaryInfo = "";
} }
public Transaction(float 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(amount, senderType, sender, receiverType, receiver, type);
this.primaryInfo = primaryInfo; this.primaryInfo = primaryInfo;
this.secondaryInfo = "";
} }
public Transaction(float 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) {

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

@ -3,7 +3,7 @@ package xyz.soukup.ecoCraftCore.events;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import xyz.soukup.ecoCraftCore.objects.Account; import xyz.soukup.ecoCraftCore.database.objects.Account;
public class PreparePlayer implements Listener { public class PreparePlayer implements Listener {

@ -1,9 +1,16 @@
package xyz.soukup.ecoCraftCore.events; package xyz.soukup.ecoCraftCore.events;
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
import dev.triumphteam.gui.builder.item.ItemBuilder; import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
import dev.triumphteam.gui.guis.Gui; import com.github.stefvanschie.inventoryframework.pane.StaticPane;
import dev.triumphteam.gui.guis.GuiItem; import io.papermc.paper.dialog.Dialog;
import net.kyori.adventure.text.Component; 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.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.Sign; import org.bukkit.block.Sign;
@ -14,17 +21,21 @@ import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.objects.Account; import org.bukkit.inventory.PlayerInventory;
import xyz.soukup.ecoCraftCore.objects.Shop; import xyz.soukup.ecoCraftCore.gui.GuiItemBuilder;
import xyz.soukup.ecoCraftCore.objects.Transaction; import xyz.soukup.ecoCraftCore.inventory.InventoryUtils;
import xyz.soukup.ecoCraftCore.objects.VirtualChest; import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.utilities.Converter; import xyz.soukup.ecoCraftCore.database.objects.Account;
import xyz.soukup.ecoCraftCore.utilities.InventoryUtils; import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.utilities.Messages; import xyz.soukup.ecoCraftCore.database.objects.Transaction;
import xyz.soukup.ecoCraftCore.utilities.PDC; import xyz.soukup.ecoCraftCore.inventory.VirtualChest;
import xyz.soukup.ecoCraftCore.utilities.*;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Objects;
@SuppressWarnings("UnstableApiUsage")
public class ShopLogic implements Listener { public class ShopLogic implements Listener {
@EventHandler @EventHandler
@ -64,20 +75,28 @@ public class ShopLogic implements Listener {
//ZDE Přídat otevíraní shop edit gui //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() ChestGui gui = new ChestGui(1, Messages.getAsString("gui.shop.title"));
.title(Component.text("Obchod"))
.rows(1) gui.setOnGlobalClick(inventoryClickEvent -> {
.create(); inventoryClickEvent.setCancelled(true);
});
StaticPane staticPane = new StaticPane(9, 1);
Float buyPrice = shop.getPriceBuy(); Float buyPrice = shop.getPriceBuy();
Float sellPrice = shop.getPriceSell(); Float sellPrice = shop.getPriceSell();
@ -89,10 +108,10 @@ public class ShopLogic implements Listener {
hashMap.put("amount", Integer.toString(amount)); hashMap.put("amount", Integer.toString(amount));
hashMap.put("price", String.format("%.2f", buyPrice)); hashMap.put("price", String.format("%.2f", buyPrice));
GuiItem one = ItemBuilder GuiItem one = new GuiItemBuilder(Material.LIME_WOOL)
.from(Material.LIME_WOOL) .setName(Messages.get("gui.shop.buy", hashMap))
.name(Messages.get("menu.shop.buy", hashMap)) .build();
.asGuiItem();
one.setAction(event -> { one.setAction(event -> {
event.setCancelled(true); event.setCancelled(true);
ShopLogic.buy(shop, player, 1); ShopLogic.buy(shop, player, 1);
@ -101,16 +120,17 @@ public class ShopLogic implements Listener {
hashMap.put("amount", Integer.toString(amount*8)); hashMap.put("amount", Integer.toString(amount*8));
hashMap.put("price", String.format("%.2f", buyPrice*8)); hashMap.put("price", String.format("%.2f", buyPrice*8));
GuiItem eight = ItemBuilder GuiItem eight = new GuiItemBuilder(Material.LIME_WOOL)
.from(Material.LIME_WOOL) .setName(Messages.get("gui.shop.buy", hashMap))
.name(Messages.get("menu.shop.buy", hashMap)) .build();
.asGuiItem();
eight.setAction(event -> { eight.setAction(event -> {
event.setCancelled(true); event.setCancelled(true);
ShopLogic.buy(shop, player, 8); 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("amount", Integer.toString(amount));
hashMap.put("price", String.format("%.2f", sellPrice)); hashMap.put("price", String.format("%.2f", sellPrice));
GuiItem one = ItemBuilder GuiItem one = new GuiItemBuilder(Material.YELLOW_WOOL)
.from(Material.YELLOW_WOOL) .setName(Messages.get("gui.shop.sell", hashMap))
.name(Messages.get("menu.shop.sell", hashMap)) .build();
.asGuiItem();
one.setAction(event -> { one.setAction(event -> {
event.setCancelled(true); event.setCancelled(true);
@ -135,31 +154,63 @@ public class ShopLogic implements Listener {
hashMap.put("amount", Integer.toString(amount*8)); hashMap.put("amount", Integer.toString(amount*8));
hashMap.put("price", String.format("%.2f", sellPrice*8)); hashMap.put("price", String.format("%.2f", sellPrice*8));
GuiItem eight = ItemBuilder GuiItem eight = new GuiItemBuilder(Material.YELLOW_WOOL)
.from(Material.YELLOW_WOOL) .setName(Messages.get("gui.shop.sell", hashMap))
.name(Messages.get("menu.shop.sell", hashMap)) .build();
.asGuiItem();
eight.setAction(event -> { eight.setAction(event -> {
event.setCancelled(true); event.setCancelled(true);
ShopLogic.sell(shop, player, 8); ShopLogic.sell(shop, player, 8);
}); });
gui.setItem(7, one); staticPane.addItem(one, 7,0);
gui.setItem(8, eight); staticPane.addItem(eight, 8, 0);
} }
GuiItem item = new GuiItem(shop.getItemStack()); 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; 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){ public static void buy(Shop shop, Player player, int multiplier){
if (VirtualChestLogic.openedChests.containsKey(shop.getVirtualChestID())){ 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){ public static void sell(Shop shop, Player player, int multiplier){
if (VirtualChestLogic.openedChests.containsKey(shop.getVirtualChestID())){ if (VirtualChestLogic.openedChests.containsKey(shop.getVirtualChestID())){

@ -11,7 +11,7 @@ import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.objects.VirtualChest; import xyz.soukup.ecoCraftCore.inventory.VirtualChest;
import xyz.soukup.ecoCraftCore.utilities.PDC; import xyz.soukup.ecoCraftCore.utilities.PDC;
import java.util.HashMap; import java.util.HashMap;

@ -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<Component> 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);
}
}

@ -1,4 +1,4 @@
package xyz.soukup.ecoCraftCore.utilities; package xyz.soukup.ecoCraftCore.inventory;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;

@ -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.DataType;
import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.field.DatabaseField;
@ -6,9 +6,8 @@ import com.j256.ormlite.table.DatabaseTable;
import org.bukkit.block.Chest; import org.bukkit.block.Chest;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; 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.Converter;
import xyz.soukup.ecoCraftCore.utilities.InventoryUtils;
import xyz.soukup.ecoCraftCore.utilities.PDC; import xyz.soukup.ecoCraftCore.utilities.PDC;
import java.sql.SQLException; import java.sql.SQLException;
@ -146,3 +145,9 @@ public class VirtualChest {
this.activeServer = activeServer; this.activeServer = activeServer;
} }
} }

@ -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<CommandSourceStack> tp = Commands.literal("tp")
.then(Commands.argument("uuid", StringArgumentType.word())
.executes(IslandCommand::teleport));
LiteralArgumentBuilder<CommandSourceStack> create = Commands.literal("create")
.then(Commands.argument("name", StringArgumentType.word())
.then(Commands.argument("display_name", StringArgumentType.string())));
private static int teleport(CommandContext<CommandSourceStack> context) {
return 0;
}
private static int createWorld(CommandContext<CommandSourceStack> context) {
return 0;
}
private static int loadWorld(CommandContext<CommandSourceStack> context) {
return 0;
}
}

@ -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<Island, Integer> 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<String> 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);
}
}
}

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

@ -0,0 +1,4 @@
package xyz.soukup.ecoCraftCore.islands;
public class UnloadWorld {
}

@ -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.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;

@ -1,9 +1,9 @@
package xyz.soukup.ecoCraftCore.utilities; package xyz.soukup.ecoCraftCore.messages;
import org.bukkit.Location; import org.bukkit.Location;
import xyz.soukup.ecoCraftCore.objects.Account; import xyz.soukup.ecoCraftCore.database.objects.Account;
import xyz.soukup.ecoCraftCore.objects.Transaction; import xyz.soukup.ecoCraftCore.database.objects.Transaction;
import java.util.HashMap; import java.util.HashMap;

@ -1,4 +1,4 @@
package xyz.soukup.ecoCraftCore.commands; package xyz.soukup.ecoCraftCore.positionMarker;
import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.context.CommandContext;
@ -8,7 +8,7 @@ import org.bukkit.Material;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; 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.PDC;
public class RulerCommand { public class RulerCommand {

@ -1,4 +1,4 @@
package xyz.soukup.ecoCraftCore.events; package xyz.soukup.ecoCraftCore.positionMarker;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -10,9 +10,9 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack; 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.PDC;
import xyz.soukup.ecoCraftCore.utilities.PHHM; import xyz.soukup.ecoCraftCore.messages.PHHM;
import java.util.HashMap; import java.util.HashMap;

@ -53,12 +53,21 @@ menu:
buy: "<green>Koupit <amount>ks za <price>$" buy: "<green>Koupit <amount>ks za <price>$"
sell: "<yellow>Prodat <amount>ks za <price>$" sell: "<yellow>Prodat <amount>ks za <price>$"
gui: gui:
error:
invalid-input: "<red>Vámi zadané hodnoty nejsou platné."
all: "<green>Seznam guis: <yellow><1>, <2>" all: "<green>Seznam guis: <yellow><1>, <2>"
shopadmin: shop-edit:
title: "GUI - <dark_green>Shop Admin" title: "<green><bold>Editace Obchodu"
items: inputs:
background: " " count: "<yellow>Množství"
deleteshop: "<!italic><red>Smazat Obchod" price-sell: "<yellow>Cena pro výkup"
changesellprice: "<!italic><dark_green>Změnit Prodávající Cenu" price-buy: "<yellow>Cena pro prodej"
changebuyprice: "<!italic><gold>Změnit Kupující Cenu" change-item: "<yellow><bold>Změň item na ten co držíš v ruce"
changeamounts: "<!italic><grey>Změnit Množství <dark_green>Prodeje <grey>a <gold>Výkupu" button:
confirm: "<green><bold>Zapsat změny"
cancel: "<red><bold>Zrušit"
shop:
title: "<dark_green>Obchod"
buy: "<green>Koupit <amount>ks za <price>$"
sell: "<yellow>Prodat <amount>ks za <price>$"

Loading…
Cancel
Save