package me.lethunderhawk.world.command; import me.lethunderhawk.fluxapi.FluxService; import me.lethunderhawk.fluxapi.util.command.CommandNode; import me.lethunderhawk.fluxapi.util.command.CustomCommand; import me.lethunderhawk.fluxapi.util.interfaces.BazaarFluxModule; import me.lethunderhawk.main.BazaarFlux; import me.lethunderhawk.world.manager.NestedWorldStorageManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; public class WorldCommand extends CustomCommand { private Map locations = new HashMap<>(); public WorldCommand(BazaarFluxModule module) { super(new CommandNode("world", "Hop between worlds!", null), module); populateLocationMap(); } private void populateLocationMap() { locations.clear(); initMatchingWorldLocationFromSpawn("hub", "world"); } private void initMatchingWorldLocationFromSpawn(String... worldNames){ for(String worldName : worldNames){ initMatchingWorldLocationFromSpawn(worldName); } } private void initMatchingWorldLocationFromSpawn(String worldName) { World world = Bukkit.getWorld(worldName); if(world == null){ FluxService.get(BazaarFlux.class).getLogger().warning("World not found: " + worldName); return; } Location worldLoc = world.getBlockAt(0,100,0).getLocation(); locations.put(worldName, worldLoc); } @Override public void createCommands() { registerCommand("island", "Warp to your island", this::warpToIsland); registerCommand("overworld", "Warp to the overworld", this::warpOverworld); registerCommand("reload", "Reload this module", this::reload); registerCommand("deleteIslands", "delete all worlds in island folder", this::deleteAllIslands); registerAllDefaultWorldCommands(); } private void deleteAllIslands(CommandSender sender, String[] strings) { NestedWorldStorageManager manager = FluxService.get(NestedWorldStorageManager.class); for(String worldFolder : manager.listWorlds("islands")){ manager.deleteWorld("islands", worldFolder); } } private void reload(CommandSender sender, String[] strings) { module.reload(sender, strings); } private void registerAllDefaultWorldCommands() { if(locations == null || locations.isEmpty()) return; for(Map.Entry entry : locations.entrySet()){ String locationName = entry.getKey(); registerCommand(locationName, "Warp to " + locationName, warpToLocation(entry.getValue())); } } private BiConsumer warpToLocation(Location value) { return (sender, args) -> { warptoLocation(sender, args, value); }; } private void warptoLocation(CommandSender sender, String[] strings, Location location) { if(!(sender instanceof Player p)) return; p.teleport(location); } private void warpOverworld(CommandSender sender, String[] strings) { if(!(sender instanceof Player player)) return; FluxService.get(NestedWorldStorageManager.class).warpToWorld(player,"world"); } private void warpToIsland(CommandSender sender, String[] args) { if (!(sender instanceof Player player)) return; NestedWorldStorageManager manager = FluxService.get(NestedWorldStorageManager.class); String worldName = "island_" + player.getName(); World world = manager.loadIfExists("islands", worldName); if (world == null) { module.sendText(player, Component.text("You are new here! Let us create an island first...", NamedTextColor.GREEN)); world = manager.createIslandWorld(worldName); } module.sendText(player, Component.text("Warping to island...", NamedTextColor.GREEN)); player.teleportAsync(world.getSpawnLocation()); } }