- Island List

- Regiony skoro hotové
island-experimenty
jakub 1 week ago
parent 0b55d67829
commit bc92a70025
  1. 96
      src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java
  2. 12
      src/main/java/xyz/soukup/ecoCraftCore/database/objects/Island.java
  3. 7
      src/main/java/xyz/soukup/ecoCraftCore/database/objects/Region.java
  4. 2
      src/main/java/xyz/soukup/ecoCraftCore/database/objects/RegionMember.java
  5. 15
      src/main/java/xyz/soukup/ecoCraftCore/gui/GuiItemBuilder.java
  6. 5
      src/main/java/xyz/soukup/ecoCraftCore/islands/IslandAdminCommand.java
  7. 188
      src/main/java/xyz/soukup/ecoCraftCore/islands/IslandSelectorCommand.java
  8. 44
      src/main/java/xyz/soukup/ecoCraftCore/islands/generators/FlatGrass.java
  9. 2
      src/main/java/xyz/soukup/ecoCraftCore/money/MoneyCommand.java
  10. 9
      src/main/java/xyz/soukup/ecoCraftCore/positionMarker/MarkerCommand.java
  11. 2
      src/main/java/xyz/soukup/ecoCraftCore/positionMarker/MarkerEvent.java
  12. 33
      src/main/java/xyz/soukup/ecoCraftCore/regions/RegionAdminCommand.java
  13. 34
      src/main/java/xyz/soukup/ecoCraftCore/regions/RegionManager.java
  14. 9
      src/main/java/xyz/soukup/ecoCraftCore/shop/ShopCommand.java
  15. 11
      src/main/resources/messages.yml

@ -21,15 +21,16 @@ import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.soukup.ecoCraftCore.database.objects.*; import xyz.soukup.ecoCraftCore.database.objects.*;
import xyz.soukup.ecoCraftCore.islands.IslandAdminCommand; import xyz.soukup.ecoCraftCore.islands.IslandAdminCommand;
import xyz.soukup.ecoCraftCore.islands.IslandSelectorCommand;
import xyz.soukup.ecoCraftCore.money.MoneyCommand; import xyz.soukup.ecoCraftCore.money.MoneyCommand;
import xyz.soukup.ecoCraftCore.player.OnKill; import xyz.soukup.ecoCraftCore.player.OnKill;
import xyz.soukup.ecoCraftCore.player.PreparePlayer; import xyz.soukup.ecoCraftCore.player.PreparePlayer;
import xyz.soukup.ecoCraftCore.player.TeleportRequestsHandler; 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 xyz.soukup.ecoCraftCore.shop.ShopCommand;
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
import xyz.soukup.ecoCraftCore.inventory.VirtualChest; 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.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.messages.Messages; import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.shop.ShopLogic; import xyz.soukup.ecoCraftCore.shop.ShopLogic;
@ -75,10 +76,7 @@ public final class EcoCraftCore extends JavaPlugin {
registerEvents(); registerEvents();
prepareSlimeWorldsSaver(); prepareSlimeWorldsSaver();
} catch (SQLException e) { }catch (IOException e) {
e.printStackTrace();
getLogger().severe("Failed to initialize database.");
} catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@ -179,39 +177,48 @@ public final class EcoCraftCore extends JavaPlugin {
} }
private void prepareDatabase() throws SQLException { private void prepareDatabase() {
String databaseHost = config.getString("database.host");
String databasePort = config.getString("database.port"); try {
String databaseName = config.getString("database.database"); String databaseHost = config.getString("database.host");
String databaseUsername = config.getString("database.user"); String databasePort = config.getString("database.port");
String databasePassword = config.getString("database.password"); String databaseName = config.getString("database.database");
String databaseUsername = config.getString("database.user");
String databaseUrl = "jdbc:mysql://" + databaseHost + ":" + databasePort + "/" + databaseName; String databasePassword = config.getString("database.password");
connectionSource = new JdbcConnectionSource(databaseUrl, databaseUsername, databasePassword);
Logger.getLogger("com.j256.ormlite.table.TableUtils").setLevel(Level.OFF); String databaseUrl = "jdbc:mysql://" + databaseHost + ":" + databasePort + "/" + databaseName;
connectionSource = new JdbcConnectionSource(databaseUrl, databaseUsername, databasePassword);
TableUtils.createTableIfNotExists(connectionSource, ActiveServer.class); Logger.getLogger("com.j256.ormlite.table.TableUtils").setLevel(Level.OFF);
TableUtils.createTableIfNotExists(connectionSource, Transaction.class);
TableUtils.createTableIfNotExists(connectionSource, Shop.class); TableUtils.createTableIfNotExists(connectionSource, ActiveServer.class);
TableUtils.createTableIfNotExists(connectionSource, VirtualChest.class); TableUtils.createTableIfNotExists(connectionSource, Transaction.class);
TableUtils.createTableIfNotExists(connectionSource, Account.class); TableUtils.createTableIfNotExists(connectionSource, Shop.class);
TableUtils.createTableIfNotExists(connectionSource, Island.class); TableUtils.createTableIfNotExists(connectionSource, VirtualChest.class);
TableUtils.createTableIfNotExists(connectionSource, TeleportRequest.class); TableUtils.createTableIfNotExists(connectionSource, Account.class);
TableUtils.createTableIfNotExists(connectionSource, Region.class); TableUtils.createTableIfNotExists(connectionSource, Island.class);
TableUtils.createTableIfNotExists(connectionSource, RegionMember.class); TableUtils.createTableIfNotExists(connectionSource, TeleportRequest.class);
TableUtils.createTableIfNotExists(connectionSource, Region.class);
DaoRegistry.setActiveServerDao(DaoManager.createDao(connectionSource, ActiveServer.class)); TableUtils.createTableIfNotExists(connectionSource, RegionMember.class);
DaoRegistry.setTransactionDao(DaoManager.createDao(connectionSource, Transaction.class));
DaoRegistry.setIslandDaoo(DaoManager.createDao(connectionSource, Island.class)); DaoRegistry.setActiveServerDao(DaoManager.createDao(connectionSource, ActiveServer.class));
DaoRegistry.setShopDao(DaoManager.createDao(connectionSource, Shop.class)); DaoRegistry.setTransactionDao(DaoManager.createDao(connectionSource, Transaction.class));
DaoRegistry.setVirtualChestDao(DaoManager.createDao(connectionSource, VirtualChest.class)); DaoRegistry.setIslandDaoo(DaoManager.createDao(connectionSource, Island.class));
DaoRegistry.setAccountDao(DaoManager.createDao(connectionSource, Account.class)); DaoRegistry.setShopDao(DaoManager.createDao(connectionSource, Shop.class));
DaoRegistry.setTeleportRequestsDao(DaoManager.createDao(connectionSource, TeleportRequest.class)); DaoRegistry.setVirtualChestDao(DaoManager.createDao(connectionSource, VirtualChest.class));
DaoRegistry.setRegionDao(DaoManager.createDao(connectionSource, Region.class)); DaoRegistry.setAccountDao(DaoManager.createDao(connectionSource, Account.class));
DaoRegistry.setRegionMemberDao(DaoManager.createDao(connectionSource, RegionMember.class)); DaoRegistry.setTeleportRequestsDao(DaoManager.createDao(connectionSource, TeleportRequest.class));
DaoRegistry.setRegionDao(DaoManager.createDao(connectionSource, Region.class));
ActiveServer activeServer = new ActiveServer(config.getString("server.name")); DaoRegistry.setRegionMemberDao(DaoManager.createDao(connectionSource, RegionMember.class));
activeServer.save();
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() { private void registerCommands() {
@NotNull LifecycleEventManager<@NotNull Plugin> lm = this.getLifecycleManager(); @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(ShopCommand.getCommand().build()));
lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(RulerCommand.createCommand().build())); lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MarkerCommand.getCommand().build()));
lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MoneyCommand.createCommand().build())); lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MoneyCommand.getCommand().build()));
lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(IslandAdminCommand.createCommand().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(){ private void registerEvents(){
@ -244,7 +252,7 @@ public final class EcoCraftCore extends JavaPlugin {
pm.registerEvents(new TeleportRequestsHandler(), this); pm.registerEvents(new TeleportRequestsHandler(), this);
pm.registerEvents(new OnKill(), this); pm.registerEvents(new OnKill(), this);
pm.registerEvents(new RulerMarking(), this); pm.registerEvents(new MarkerEvent(), this);
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);

@ -27,12 +27,15 @@ public class Island {
@DatabaseField(canBeNull = false) @DatabaseField(canBeNull = false)
private String owner; private String owner;
@DatabaseField(canBeNull = false) @DatabaseField(columnName = "owner_type", canBeNull = false)
private String ownerType; private String ownerType;
@DatabaseField(canBeNull = false, dataType = DataType.BYTE_ARRAY, columnDefinition = "LONGBLOB") @DatabaseField(canBeNull = false, dataType = DataType.BYTE_ARRAY, columnDefinition = "LONGBLOB")
private byte[] data; private byte[] data;
@DatabaseField(columnName = "is_public", canBeNull = false, defaultValue = "false")
private Boolean isPublic;
@DatabaseField(defaultValue = "", columnName = "active_on") @DatabaseField(defaultValue = "", columnName = "active_on")
private String activeOn; 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) { public void setData(byte[] data) {
this.data = data; this.data = data;
} }

@ -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) { public boolean isInside(int x, int y) {
return x >= this.x1 && x <= this.x2 && y >= this.y1 && y <= this.y2; 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) { public static Region findRegion(int x, int y, String island) {
Region region = null; Region region = null;
Integer highestType = -1; int highestType = -1;
if (!cache.containsKey(island)) { if (!cache.containsKey(island)) {
cacheRegions(island); cacheRegions(island);

@ -12,7 +12,7 @@ public class RegionMember {
@DatabaseField(generatedId = true) @DatabaseField(generatedId = true)
private int id; private int id;
@DatabaseField(foreign = true, foreignAutoRefresh = true, index = true) @DatabaseField(foreign = true, foreignAutoRefresh = true)
private Region region; private Region region;
@DatabaseField(columnName = "member_type", canBeNull = false) @DatabaseField(columnName = "member_type", canBeNull = false)

@ -2,16 +2,19 @@ package xyz.soukup.ecoCraftCore.gui;
import com.github.stefvanschie.inventoryframework.gui.GuiItem; import com.github.stefvanschie.inventoryframework.gui.GuiItem;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
public class GuiItemBuilder { public class GuiItemBuilder {
private ItemStack itemStack; private final ItemStack itemStack;
private ItemMeta itemMeta; private final ItemMeta itemMeta;
public GuiItemBuilder(Material material){ public GuiItemBuilder(Material material){
this.itemStack = new ItemStack(material); this.itemStack = new ItemStack(material);
@ -30,6 +33,14 @@ public class GuiItemBuilder {
return this; return this;
} }
public GuiItemBuilder setRawLore(String rawLore){
List<Component> lore = Arrays.stream(rawLore.split("\\R"))
.map(line -> MiniMessage.miniMessage().deserialize(line))
.collect(Collectors.toList());
itemMeta.lore(lore);
return this;
}
public GuiItem build(){ public GuiItem build(){
this.itemStack.setItemMeta(this.itemMeta); this.itemStack.setItemMeta(this.itemMeta);
return new GuiItem(this.itemStack); return new GuiItem(this.itemStack);

@ -29,7 +29,7 @@ public class IslandAdminCommand {
private final AdvancedSlimePaperAPI asp = AdvancedSlimePaperAPI.instance(); private final AdvancedSlimePaperAPI asp = AdvancedSlimePaperAPI.instance();
public static LiteralArgumentBuilder<CommandSourceStack> createCommand() { public static LiteralArgumentBuilder<CommandSourceStack> getCommand() {
LiteralArgumentBuilder<CommandSourceStack> tp = Commands.literal("tp") LiteralArgumentBuilder<CommandSourceStack> tp = Commands.literal("tp")
@ -219,7 +219,8 @@ public class IslandAdminCommand {
String type = context.getArgument("type", String.class); String type = context.getArgument("type", String.class);
String displayName = context.getArgument("display_name", String.class); String displayName = context.getArgument("display_name", String.class);
String description = context.getArgument("description", 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); context.getSource().getSender().sendMessage("Created island: " + uuid);
return 0; return 0;

@ -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<CommandSourceStack> getCommand(){
return Commands.literal("is")
.executes(IslandSelectorCommand::displayIslandListSelectorGui);
}
private static int displayIslandListSelectorGui(CommandContext<CommandSourceStack> 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<Island> getAllIslands(){
QueryBuilder<Island, Integer> 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<Island> getPublicIslands(){
QueryBuilder<Island, Integer> 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<Island> getMyIslands(Player player){
QueryBuilder<Island, Integer> 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<Island> getSharedIslands(Player player){
QueryBuilder<RegionMember, Integer> memberQb = DaoRegistry.getRegionMemberDao().queryBuilder();
memberQb.selectColumns("region_id");
try {
memberQb.where().eq("member_name", player.getName()).and().eq("member_type", "player");
QueryBuilder<Region, Integer> 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<Island> 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<Island> 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<GuiItem> itemsFromIslands(Player player, List<Island> islands){
List<GuiItem> 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;
}
}

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

@ -19,7 +19,7 @@ import xyz.soukup.ecoCraftCore.messages.PHHM;
public class MoneyCommand { public class MoneyCommand {
public static LiteralArgumentBuilder<CommandSourceStack> createCommand() { public static LiteralArgumentBuilder<CommandSourceStack> getCommand() {
// 1. Send Branch // 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)

@ -11,22 +11,21 @@ import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.messages.Messages; import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.utilities.PDC; import xyz.soukup.ecoCraftCore.utilities.PDC;
public class RulerCommand { public class MarkerCommand {
public static LiteralArgumentBuilder<CommandSourceStack> createCommand() { public static LiteralArgumentBuilder<CommandSourceStack> getCommand() {
return Commands.literal("ruler") return Commands.literal("ruler")
.executes(RulerCommand::obtainRuler); .executes(MarkerCommand::obtainRuler);
} }
private static int obtainRuler(CommandContext<CommandSourceStack> context){ private static int obtainRuler(CommandContext<CommandSourceStack> context){
CommandSender commandSender = context.getSource().getSender(); CommandSender commandSender = context.getSource().getSender();
if (!(commandSender instanceof Player)){ if (!(commandSender instanceof Player player)){
Messages.send(commandSender, "generic.error.not-player"); Messages.send(commandSender, "generic.error.not-player");
return 0; return 0;
} }
Player player = (Player) commandSender;
ItemStack itemStack = new ItemStack(Material.BLAZE_ROD); ItemStack itemStack = new ItemStack(Material.BLAZE_ROD);
PDC.set(itemStack, "ruler", true); PDC.set(itemStack, "ruler", true);

@ -16,7 +16,7 @@ import xyz.soukup.ecoCraftCore.messages.PHHM;
import java.util.HashMap; import java.util.HashMap;
public class RulerMarking implements Listener { public class MarkerEvent implements Listener {
public static HashMap<Player, Location> primaryLocations = new HashMap<>(); public static HashMap<Player, Location> primaryLocations = new HashMap<>();
public static HashMap<Player, Location> secondaryLocations = new HashMap<>(); public static HashMap<Player, Location> secondaryLocations = new HashMap<>();

@ -1,5 +1,38 @@
package xyz.soukup.ecoCraftCore.regions; 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 class RegionAdminCommand {
public static LiteralArgumentBuilder<CommandSourceStack> createCommand() {
LiteralArgumentBuilder<CommandSourceStack> 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<CommandSourceStack> 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;
}
} }

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

@ -9,17 +9,16 @@ 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.positionMarker.RulerMarking; import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent;
import xyz.soukup.ecoCraftCore.database.objects.Shop; import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.inventory.VirtualChest; import xyz.soukup.ecoCraftCore.inventory.VirtualChest;
import xyz.soukup.ecoCraftCore.inventory.InventoryUtils; import xyz.soukup.ecoCraftCore.inventory.InventoryUtils;
import xyz.soukup.ecoCraftCore.messages.Messages; import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.utilities.PDC; import xyz.soukup.ecoCraftCore.utilities.PDC;
@SuppressWarnings("UnstableApiUsage")
public class ShopCommand { public class ShopCommand {
public static LiteralArgumentBuilder<CommandSourceStack> createCommand() { public static LiteralArgumentBuilder<CommandSourceStack> getCommand() {
// Define the argument types // Define the argument types
var amountArg = Commands.argument("amount", IntegerArgumentType.integer(1)); var amountArg = Commands.argument("amount", IntegerArgumentType.integer(1));
var buyPriceArg = Commands.argument("buy_price", FloatArgumentType.floatArg(0.0F)); var buyPriceArg = Commands.argument("buy_price", FloatArgumentType.floatArg(0.0F));
@ -52,8 +51,8 @@ public class ShopCommand {
} }
// 1. Check if blocks are marked // 1. Check if blocks are marked
Chest chest = RulerMarking.chests.get(player); Chest chest = MarkerEvent.chests.get(player);
Sign sign = RulerMarking.signs.get(player); Sign sign = MarkerEvent.signs.get(player);
if (sign == null || chest == null) { if (sign == null || chest == null) {
Messages.send(player, "shop.error.not-marked"); Messages.send(player, "shop.error.not-marked");

@ -1,4 +1,6 @@
generic: generic:
success:
creat ed: <green>Vytvořeno.
error: error:
not-player: "<red>Na tuto akci musíš být hráč" not-player: "<red>Na tuto akci musíš být hráč"
no-funds: no-funds:
@ -10,6 +12,9 @@ generic:
no-item: no-item:
self: "<red>Nemáš dostatek itemů" self: "<red>Nemáš dostatek itemů"
shop: "<red>Obchod nemá dostatek itemů" shop: "<red>Obchod nemá dostatek itemů"
region:
error:
not-marked: "<red>Musíš nejprve označit pozice"
shop: shop:
error: error:
already-shop: "<red>Tato cedule již je obchod" already-shop: "<red>Tato cedule již je obchod"
@ -44,6 +49,12 @@ marker:
primary: "<green>První pozice označena (<x>,<y>,<z>)" primary: "<green>První pozice označena (<x>,<y>,<z>)"
secondary: "<green>Druhá pozice označena (<x>,<y>,<z>)" secondary: "<green>Druhá pozice označena (<x>,<y>,<z>)"
menu: menu:
island-selector:
title: "<green><bold>Výběr ostrovu"
my-islands: "<yellow><bold>Moje ostrovy"
shared-islands: "<blue><bold>Ostrovy sdílené se mnou"
public-islands: "<green><bold>Veřejné Ostrovy"
all-islands: "<red><bold>Všechny ostrovy (Pouze OP)"
shop: shop:
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>$"

Loading…
Cancel
Save