parent
0b55d67829
commit
bc92a70025
15 changed files with 362 additions and 107 deletions
@ -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); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
@ -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<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; |
||||
} |
||||
} |
||||
Loading…
Reference in new issue