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; |
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; |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue