diff --git a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java index ae099c3..93c70d4 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java @@ -21,15 +21,16 @@ import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; import xyz.soukup.ecoCraftCore.database.objects.*; import xyz.soukup.ecoCraftCore.islands.IslandAdminCommand; +import xyz.soukup.ecoCraftCore.islands.IslandSelectorCommand; import xyz.soukup.ecoCraftCore.money.MoneyCommand; import xyz.soukup.ecoCraftCore.player.OnKill; import xyz.soukup.ecoCraftCore.player.PreparePlayer; import xyz.soukup.ecoCraftCore.player.TeleportRequestsHandler; -import xyz.soukup.ecoCraftCore.positionMarker.RulerCommand; +import xyz.soukup.ecoCraftCore.positionMarker.MarkerCommand; import xyz.soukup.ecoCraftCore.shop.ShopCommand; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import xyz.soukup.ecoCraftCore.inventory.VirtualChest; -import xyz.soukup.ecoCraftCore.positionMarker.RulerMarking; +import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent; import xyz.soukup.ecoCraftCore.database.DaoRegistry; import xyz.soukup.ecoCraftCore.messages.Messages; import xyz.soukup.ecoCraftCore.shop.ShopLogic; @@ -75,10 +76,7 @@ public final class EcoCraftCore extends JavaPlugin { registerEvents(); prepareSlimeWorldsSaver(); - } catch (SQLException e) { - e.printStackTrace(); - getLogger().severe("Failed to initialize database."); - } catch (IOException e) { + }catch (IOException e) { throw new RuntimeException(e); } @@ -179,39 +177,48 @@ public final class EcoCraftCore extends JavaPlugin { } - private void prepareDatabase() throws SQLException { - String databaseHost = config.getString("database.host"); - String databasePort = config.getString("database.port"); - String databaseName = config.getString("database.database"); - String databaseUsername = config.getString("database.user"); - String databasePassword = config.getString("database.password"); - - String databaseUrl = "jdbc:mysql://" + databaseHost + ":" + databasePort + "/" + databaseName; - connectionSource = new JdbcConnectionSource(databaseUrl, databaseUsername, databasePassword); - Logger.getLogger("com.j256.ormlite.table.TableUtils").setLevel(Level.OFF); - - TableUtils.createTableIfNotExists(connectionSource, ActiveServer.class); - TableUtils.createTableIfNotExists(connectionSource, Transaction.class); - TableUtils.createTableIfNotExists(connectionSource, Shop.class); - TableUtils.createTableIfNotExists(connectionSource, VirtualChest.class); - TableUtils.createTableIfNotExists(connectionSource, Account.class); - TableUtils.createTableIfNotExists(connectionSource, Island.class); - TableUtils.createTableIfNotExists(connectionSource, TeleportRequest.class); - TableUtils.createTableIfNotExists(connectionSource, Region.class); - TableUtils.createTableIfNotExists(connectionSource, RegionMember.class); - - DaoRegistry.setActiveServerDao(DaoManager.createDao(connectionSource, ActiveServer.class)); - DaoRegistry.setTransactionDao(DaoManager.createDao(connectionSource, Transaction.class)); - DaoRegistry.setIslandDaoo(DaoManager.createDao(connectionSource, Island.class)); - DaoRegistry.setShopDao(DaoManager.createDao(connectionSource, Shop.class)); - DaoRegistry.setVirtualChestDao(DaoManager.createDao(connectionSource, VirtualChest.class)); - DaoRegistry.setAccountDao(DaoManager.createDao(connectionSource, Account.class)); - DaoRegistry.setTeleportRequestsDao(DaoManager.createDao(connectionSource, TeleportRequest.class)); - DaoRegistry.setRegionDao(DaoManager.createDao(connectionSource, Region.class)); - DaoRegistry.setRegionMemberDao(DaoManager.createDao(connectionSource, RegionMember.class)); - - ActiveServer activeServer = new ActiveServer(config.getString("server.name")); - activeServer.save(); + private void prepareDatabase() { + + try { + String databaseHost = config.getString("database.host"); + String databasePort = config.getString("database.port"); + String databaseName = config.getString("database.database"); + String databaseUsername = config.getString("database.user"); + String databasePassword = config.getString("database.password"); + + String databaseUrl = "jdbc:mysql://" + databaseHost + ":" + databasePort + "/" + databaseName; + connectionSource = new JdbcConnectionSource(databaseUrl, databaseUsername, databasePassword); + Logger.getLogger("com.j256.ormlite.table.TableUtils").setLevel(Level.OFF); + + TableUtils.createTableIfNotExists(connectionSource, ActiveServer.class); + TableUtils.createTableIfNotExists(connectionSource, Transaction.class); + TableUtils.createTableIfNotExists(connectionSource, Shop.class); + TableUtils.createTableIfNotExists(connectionSource, VirtualChest.class); + TableUtils.createTableIfNotExists(connectionSource, Account.class); + TableUtils.createTableIfNotExists(connectionSource, Island.class); + TableUtils.createTableIfNotExists(connectionSource, TeleportRequest.class); + TableUtils.createTableIfNotExists(connectionSource, Region.class); + TableUtils.createTableIfNotExists(connectionSource, RegionMember.class); + + DaoRegistry.setActiveServerDao(DaoManager.createDao(connectionSource, ActiveServer.class)); + DaoRegistry.setTransactionDao(DaoManager.createDao(connectionSource, Transaction.class)); + DaoRegistry.setIslandDaoo(DaoManager.createDao(connectionSource, Island.class)); + DaoRegistry.setShopDao(DaoManager.createDao(connectionSource, Shop.class)); + DaoRegistry.setVirtualChestDao(DaoManager.createDao(connectionSource, VirtualChest.class)); + DaoRegistry.setAccountDao(DaoManager.createDao(connectionSource, Account.class)); + DaoRegistry.setTeleportRequestsDao(DaoManager.createDao(connectionSource, TeleportRequest.class)); + DaoRegistry.setRegionDao(DaoManager.createDao(connectionSource, Region.class)); + DaoRegistry.setRegionMemberDao(DaoManager.createDao(connectionSource, RegionMember.class)); + + + ActiveServer activeServer = new ActiveServer(config.getString("server.name")); + activeServer.save(); + } catch (SQLException e) { + e.printStackTrace(); + + } + + } @@ -233,10 +240,11 @@ public final class EcoCraftCore extends JavaPlugin { private void registerCommands() { @NotNull LifecycleEventManager<@NotNull Plugin> lm = this.getLifecycleManager(); - 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(IslandAdminCommand.createCommand().build())); + lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(ShopCommand.getCommand().build())); + lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MarkerCommand.getCommand().build())); + lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MoneyCommand.getCommand().build())); + lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(IslandAdminCommand.getCommand().build())); + lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(IslandSelectorCommand.getCommand().build())); } private void registerEvents(){ @@ -244,7 +252,7 @@ public final class EcoCraftCore extends JavaPlugin { pm.registerEvents(new TeleportRequestsHandler(), this); pm.registerEvents(new OnKill(), this); - pm.registerEvents(new RulerMarking(), this); + pm.registerEvents(new MarkerEvent(), 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/database/objects/Island.java b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Island.java index 002f8cf..0d10702 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Island.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Island.java @@ -27,12 +27,15 @@ public class Island { @DatabaseField(canBeNull = false) private String owner; - @DatabaseField(canBeNull = false) + @DatabaseField(columnName = "owner_type", canBeNull = false) private String ownerType; @DatabaseField(canBeNull = false, dataType = DataType.BYTE_ARRAY, columnDefinition = "LONGBLOB") private byte[] data; + @DatabaseField(columnName = "is_public", canBeNull = false, defaultValue = "false") + private Boolean isPublic; + @DatabaseField(defaultValue = "", columnName = "active_on") private String activeOn; @@ -53,6 +56,13 @@ public class Island { } + public Boolean getPublic() { + return isPublic; + } + public void setPublic(Boolean isPublic) { + this.isPublic = isPublic; + } + public void setData(byte[] data) { this.data = data; } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Region.java b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Region.java index 3a60612..212a496 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Region.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Region.java @@ -107,6 +107,11 @@ public class Region { } } + public void addRegionMember(String memberType, String member, String membershipType){ + RegionMember regionMember = new RegionMember(this, memberType, member, membershipType); + regionMember.save(); + } + public boolean isInside(int x, int y) { return x >= this.x1 && x <= this.x2 && y >= this.y1 && y <= this.y2; } @@ -134,7 +139,7 @@ public class Region { public static Region findRegion(int x, int y, String island) { Region region = null; - Integer highestType = -1; + int highestType = -1; if (!cache.containsKey(island)) { cacheRegions(island); diff --git a/src/main/java/xyz/soukup/ecoCraftCore/database/objects/RegionMember.java b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/RegionMember.java index 148a40c..610d47a 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/database/objects/RegionMember.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/RegionMember.java @@ -12,7 +12,7 @@ public class RegionMember { @DatabaseField(generatedId = true) private int id; - @DatabaseField(foreign = true, foreignAutoRefresh = true, index = true) + @DatabaseField(foreign = true, foreignAutoRefresh = true) private Region region; @DatabaseField(columnName = "member_type", canBeNull = false) diff --git a/src/main/java/xyz/soukup/ecoCraftCore/gui/GuiItemBuilder.java b/src/main/java/xyz/soukup/ecoCraftCore/gui/GuiItemBuilder.java index 66f95c2..3c38f46 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/gui/GuiItemBuilder.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/gui/GuiItemBuilder.java @@ -2,16 +2,19 @@ package xyz.soukup.ecoCraftCore.gui; import com.github.stefvanschie.inventoryframework.gui.GuiItem; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; public class GuiItemBuilder { - private ItemStack itemStack; - private ItemMeta itemMeta; + private final ItemStack itemStack; + private final ItemMeta itemMeta; public GuiItemBuilder(Material material){ this.itemStack = new ItemStack(material); @@ -30,6 +33,14 @@ public class GuiItemBuilder { return this; } + public GuiItemBuilder setRawLore(String rawLore){ + List lore = Arrays.stream(rawLore.split("\\R")) + .map(line -> MiniMessage.miniMessage().deserialize(line)) + .collect(Collectors.toList()); + 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/islands/IslandAdminCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandAdminCommand.java index ee6ada0..5d7cd81 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandAdminCommand.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandAdminCommand.java @@ -29,7 +29,7 @@ public class IslandAdminCommand { private final AdvancedSlimePaperAPI asp = AdvancedSlimePaperAPI.instance(); - public static LiteralArgumentBuilder createCommand() { + public static LiteralArgumentBuilder getCommand() { LiteralArgumentBuilder tp = Commands.literal("tp") @@ -219,7 +219,8 @@ public class IslandAdminCommand { String type = context.getArgument("type", String.class); String displayName = context.getArgument("display_name", String.class); String description = context.getArgument("description", String.class); - String uuid = islandManager.createIsland(type, displayName, description, "n", "n"); + String owner = context.getSource().getSender().getName(); + String uuid = islandManager.createIsland(type, displayName, description, owner, "player"); context.getSource().getSender().sendMessage("Created island: " + uuid); return 0; diff --git a/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandSelectorCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandSelectorCommand.java new file mode 100644 index 0000000..546e875 --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandSelectorCommand.java @@ -0,0 +1,188 @@ +package xyz.soukup.ecoCraftCore.islands; + +import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; +import com.github.stefvanschie.inventoryframework.gui.type.HopperGui; +import com.github.stefvanschie.inventoryframework.pane.OutlinePane; +import com.github.stefvanschie.inventoryframework.pane.PaginatedPane; +import com.github.stefvanschie.inventoryframework.pane.component.PagingButtons; +import com.github.stefvanschie.inventoryframework.pane.util.Slot; +import com.j256.ormlite.stmt.QueryBuilder; +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 net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import xyz.soukup.ecoCraftCore.database.DaoRegistry; +import xyz.soukup.ecoCraftCore.database.objects.Island; +import xyz.soukup.ecoCraftCore.database.objects.Region; +import xyz.soukup.ecoCraftCore.database.objects.RegionMember; +import xyz.soukup.ecoCraftCore.gui.GuiItemBuilder; +import xyz.soukup.ecoCraftCore.messages.Messages; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class IslandSelectorCommand { + + public static LiteralArgumentBuilder getCommand(){ + return Commands.literal("is") + .executes(IslandSelectorCommand::displayIslandListSelectorGui); + } + + private static int displayIslandListSelectorGui(CommandContext context) { + String title = LegacyComponentSerializer.legacySection().serialize(Messages.get("menu.island-selector.title")); + HopperGui hopperGui = new HopperGui(title); + hopperGui.setOnGlobalClick(event -> event.setCancelled(true)); + + OutlinePane outlinePane = new OutlinePane(0, 0, 5, 1); + Player player = (Player) context.getSource().getSender(); + + outlinePane.addItem(selectorItem("menu.island-selector.my-islands", Material.GRASS_BLOCK, getMyIslands(player))); + outlinePane.addItem(selectorItem("menu.island-selector.shared-islands", Material.MOSS_BLOCK, getSharedIslands(player))); + outlinePane.addItem(selectorItem("menu.island-selector.public-islands", Material.SAND, getPublicIslands())); + + hopperGui.getSlotsComponent().addPane(outlinePane); + + if (player.isOp()){ + outlinePane.addItem(selectorItem("menu.island-selector.all-islands", Material.CRIMSON_NYLIUM, getAllIslands())); + } + + hopperGui.show(player); + return 0; + } + + private static List getAllIslands(){ + QueryBuilder queryBuilder = DaoRegistry.getIslandDao().queryBuilder(); + queryBuilder.selectColumns("display_name", "uuid", "descritpion", "type"); + try { + return queryBuilder.query(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + private static List getPublicIslands(){ + QueryBuilder queryBuilder = DaoRegistry.getIslandDao().queryBuilder(); + queryBuilder.selectColumns("display_name", "uuid", "descritpion", "type"); + try { + queryBuilder.where().eq("is_public", true); + return queryBuilder.query(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + private static List getMyIslands(Player player){ + QueryBuilder queryBuilder = DaoRegistry.getIslandDao().queryBuilder(); + queryBuilder.selectColumns("display_name", "uuid", "descritpion", "type"); + try { + queryBuilder.where().eq("owner", player.getName()).and().eq("owner_type", "player"); + return queryBuilder.query(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + private static List getSharedIslands(Player player){ + QueryBuilder memberQb = DaoRegistry.getRegionMemberDao().queryBuilder(); + memberQb.selectColumns("region_id"); + try { + memberQb.where().eq("member_name", player.getName()).and().eq("member_type", "player"); + + QueryBuilder regionQb = DaoRegistry.getRegionDao().queryBuilder(); + regionQb.selectColumns("island"); + regionQb.where().in("id", memberQb); + + return DaoRegistry.getIslandDao().queryBuilder() + .where() + .in("uuid", regionQb) + .query(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + + } + + public static GuiItem selectorItem(String key, Material material, List islands){ + GuiItemBuilder guiItemBuilder = new GuiItemBuilder(material); + guiItemBuilder.setName(Messages.get(key)); + GuiItem guiItem = guiItemBuilder.build(); + guiItem.setAction(event -> openIslandListGui((Player) event.getWhoClicked(), islands)); + return guiItem; + } + + + private static void openIslandListGui(Player player, List islands){ + String title = LegacyComponentSerializer.legacySection().serialize(Messages.get("menu.island-selector.title")); + ChestGui chestGui = new ChestGui(4, title); + chestGui.setOnGlobalClick(event -> event.setCancelled(true)); + + PaginatedPane paginatedPane = new PaginatedPane(0, 0, 9, 3); + + paginatedPane.populateWithGuiItems(itemsFromIslands(player, islands)); + PagingButtons pagingButtons = new PagingButtons(Slot.fromXY(0, 3), 9, paginatedPane); + + chestGui.addPane(paginatedPane); + chestGui.addPane(pagingButtons); + + chestGui.show(player); + } + + + private static List itemsFromIslands(Player player, List islands){ + List guiItems = new ArrayList<>(); + IslandManager islandManager = new IslandManager(); + for (Island island : islands){ + Material material; + TextColor color; + + switch (island.getType()){ + case "flat_grass": + material = Material.GRASS_BLOCK; + color = TextColor.color(0x02bd02); + break; + case "flat_sand": + material = Material.SAND; + color = TextColor.color(0xfccf03); + break; + case "flat_hell": + material = Material.SOUL_SAND; + color = TextColor.color(0xf00707); + break; + case "void": + material = Material.GLASS; + color = TextColor.color(0xffffff); + break; + default: + material = Material.WHITE_WOOL; + color = TextColor.color(0xffffff); + break; + } + + + GuiItemBuilder guiItemBuilder = new GuiItemBuilder(material); + guiItemBuilder.setName(Component.text(island.getDisplayName(), color)); + guiItemBuilder.setRawLore(island.getDescritpion()); + + GuiItem guiItem = guiItemBuilder.build(); + guiItem.setAction(event -> { + try { + islandManager.teleport(player, island.getUuid()); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + + guiItems.add(guiItem); + + } + return guiItems; + } +} diff --git a/src/main/java/xyz/soukup/ecoCraftCore/islands/generators/FlatGrass.java b/src/main/java/xyz/soukup/ecoCraftCore/islands/generators/FlatGrass.java deleted file mode 100644 index e8a20c1..0000000 --- a/src/main/java/xyz/soukup/ecoCraftCore/islands/generators/FlatGrass.java +++ /dev/null @@ -1,44 +0,0 @@ -package xyz.soukup.ecoCraftCore.islands.generators; - -import org.bukkit.Material; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.generator.WorldInfo; -import org.jetbrains.annotations.NotNull; - -import java.util.Random; - -public class FlatGrass extends ChunkGenerator { - - - @Override - public void generateNoise(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ, @NotNull ChunkData chunkData) { - - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = worldInfo.getMinHeight(); y < 0; y++) { - chunkData.setBlock(x, y, z, Material.WATER); - } - } - } - } - - @Override - public void generateSurface(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ, @NotNull ChunkData chunkData) { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - - int worldX = (chunkX * 16) + x; - int worldZ = (chunkZ * 16) + z; - - if (worldX >= -50 && worldX < 50 && worldZ >= -50 && worldZ < 50) { - chunkData.setBlock(x, 1, z, Material.STONE); - } - if (worldX >= -51 && worldX < 51 && worldZ >= -51 && worldZ < 51) { - chunkData.setBlock(x, 0, z, Material.STONE); - chunkData.setBlock(x, -1, z, Material.STONE); - } - } - } - } - -} diff --git a/src/main/java/xyz/soukup/ecoCraftCore/money/MoneyCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/money/MoneyCommand.java index 2590e1c..8129bc1 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/money/MoneyCommand.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/money/MoneyCommand.java @@ -19,7 +19,7 @@ import xyz.soukup.ecoCraftCore.messages.PHHM; public class MoneyCommand { - public static LiteralArgumentBuilder createCommand() { + public static LiteralArgumentBuilder getCommand() { // 1. Send Branch LiteralArgumentBuilder send = Commands.literal("send") .requires(source -> source.getSender() instanceof Player) diff --git a/src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/positionMarker/MarkerCommand.java similarity index 79% rename from src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerCommand.java rename to src/main/java/xyz/soukup/ecoCraftCore/positionMarker/MarkerCommand.java index dd09626..d70f180 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerCommand.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/positionMarker/MarkerCommand.java @@ -11,22 +11,21 @@ import org.bukkit.inventory.ItemStack; import xyz.soukup.ecoCraftCore.messages.Messages; import xyz.soukup.ecoCraftCore.utilities.PDC; -public class RulerCommand { - public static LiteralArgumentBuilder createCommand() { +public class MarkerCommand { + public static LiteralArgumentBuilder getCommand() { return Commands.literal("ruler") - .executes(RulerCommand::obtainRuler); + .executes(MarkerCommand::obtainRuler); } private static int obtainRuler(CommandContext context){ CommandSender commandSender = context.getSource().getSender(); - if (!(commandSender instanceof Player)){ + if (!(commandSender instanceof Player player)){ Messages.send(commandSender, "generic.error.not-player"); return 0; } - Player player = (Player) commandSender; ItemStack itemStack = new ItemStack(Material.BLAZE_ROD); PDC.set(itemStack, "ruler", true); diff --git a/src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerMarking.java b/src/main/java/xyz/soukup/ecoCraftCore/positionMarker/MarkerEvent.java similarity index 98% rename from src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerMarking.java rename to src/main/java/xyz/soukup/ecoCraftCore/positionMarker/MarkerEvent.java index 2f47d46..caba5ab 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/positionMarker/RulerMarking.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/positionMarker/MarkerEvent.java @@ -16,7 +16,7 @@ import xyz.soukup.ecoCraftCore.messages.PHHM; import java.util.HashMap; -public class RulerMarking implements Listener { +public class MarkerEvent implements Listener { public static HashMap primaryLocations = new HashMap<>(); public static HashMap secondaryLocations = new HashMap<>(); diff --git a/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionAdminCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionAdminCommand.java index 6cdd22a..0817148 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionAdminCommand.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionAdminCommand.java @@ -1,5 +1,38 @@ package xyz.soukup.ecoCraftCore.regions; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import io.papermc.paper.command.brigadier.CommandSourceStack; +import io.papermc.paper.command.brigadier.Commands; +import org.bukkit.entity.Player; +import xyz.soukup.ecoCraftCore.messages.Messages; + public class RegionAdminCommand { + public static LiteralArgumentBuilder createCommand() { + LiteralArgumentBuilder create = Commands.literal("create") + .then(Commands.argument("type", IntegerArgumentType.integer(0, 1))) + .executes(RegionAdminCommand::createRegion); + + return Commands.literal("region") + .then(create); + } + + private static int createRegion(CommandContext context) { + Integer type = context.getArgument("type", Integer.class); + if(!(context.getSource().getSender() instanceof Player player)){ + Messages.send(context.getSource().getSender(), "generic.error.not-player"); + return 0; + }; + + int status = RegionManager.createRegion(player, type, player.getName(), "player"); + + switch (status){ + case 0 -> Messages.send(player, "generic.success.created"); + case 1 -> Messages.send(player, "region.error.not-marked"); + case 2 -> Messages.send(player, "region.error.not-same-world"); + } + return 0; + } } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionManager.java b/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionManager.java new file mode 100644 index 0000000..47800c0 --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionManager.java @@ -0,0 +1,34 @@ +package xyz.soukup.ecoCraftCore.regions; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import xyz.soukup.ecoCraftCore.database.objects.Region; +import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent; + +public class RegionManager { + public static int createRegion(Player player, Integer type, String owner, String ownerType){ + Location primaryLocation = MarkerEvent.primaryLocations.get(player); + Location secondaryLocation = MarkerEvent.secondaryLocations.get(player); + + if (primaryLocation == null || secondaryLocation == null){ + return 1; + } + + if (primaryLocation.getWorld() != secondaryLocation.getWorld()){ + return 2; + } + + String worldName = primaryLocation.getWorld().getName(); + int x1 = primaryLocation.getBlockX(); + int y1 = primaryLocation.getBlockZ(); + int x2 = secondaryLocation.getBlockX(); + int y2 = secondaryLocation.getBlockZ(); + + Region region = new Region(worldName, type, x1, y1, x2, y2); + region.save(); + + region.addRegionMember(ownerType, owner, "owner"); + + return 0; + } +} diff --git a/src/main/java/xyz/soukup/ecoCraftCore/shop/ShopCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/shop/ShopCommand.java index 591003e..c53fbe0 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/shop/ShopCommand.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/shop/ShopCommand.java @@ -9,17 +9,16 @@ import org.bukkit.block.Chest; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import xyz.soukup.ecoCraftCore.positionMarker.RulerMarking; +import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent; import xyz.soukup.ecoCraftCore.database.objects.Shop; import xyz.soukup.ecoCraftCore.inventory.VirtualChest; import xyz.soukup.ecoCraftCore.inventory.InventoryUtils; import xyz.soukup.ecoCraftCore.messages.Messages; import xyz.soukup.ecoCraftCore.utilities.PDC; -@SuppressWarnings("UnstableApiUsage") public class ShopCommand { - public static LiteralArgumentBuilder createCommand() { + public static LiteralArgumentBuilder getCommand() { // Define the argument types var amountArg = Commands.argument("amount", IntegerArgumentType.integer(1)); var buyPriceArg = Commands.argument("buy_price", FloatArgumentType.floatArg(0.0F)); @@ -52,8 +51,8 @@ public class ShopCommand { } // 1. Check if blocks are marked - Chest chest = RulerMarking.chests.get(player); - Sign sign = RulerMarking.signs.get(player); + Chest chest = MarkerEvent.chests.get(player); + Sign sign = MarkerEvent.signs.get(player); if (sign == null || chest == null) { Messages.send(player, "shop.error.not-marked"); diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index 36219f0..f8336df 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -1,4 +1,6 @@ generic: + success: + creat ed: Vytvořeno. error: not-player: "Na tuto akci musíš být hráč" no-funds: @@ -10,6 +12,9 @@ generic: no-item: self: "Nemáš dostatek itemů" shop: "Obchod nemá dostatek itemů" +region: + error: + not-marked: "Musíš nejprve označit pozice" shop: error: already-shop: "Tato cedule již je obchod" @@ -44,6 +49,12 @@ marker: primary: "První pozice označena (,,)" secondary: "Druhá pozice označena (,,)" menu: + island-selector: + title: "Výběr ostrovu" + my-islands: "Moje ostrovy" + shared-islands: "Ostrovy sdílené se mnou" + public-islands: "Veřejné Ostrovy" + all-islands: "Všechny ostrovy (Pouze OP)" shop: buy: "Koupit ks za $" sell: "Prodat ks za $"