diff --git a/src/main/java/com/dfsek/terra/Terra.java b/src/main/java/com/dfsek/terra/Terra.java index 17cf02586..3f5d3b989 100644 --- a/src/main/java/com/dfsek/terra/Terra.java +++ b/src/main/java/com/dfsek/terra/Terra.java @@ -1,5 +1,6 @@ package com.dfsek.terra; +import com.dfsek.terra.command.TerraCommand; import com.dfsek.terra.config.ConfigUtil; import com.dfsek.terra.generation.TerraChunkGenerator; import com.mojang.brigadier.tree.LiteralCommandNode; diff --git a/src/main/java/com/dfsek/terra/TerraCommand.java b/src/main/java/com/dfsek/terra/TerraCommand.java deleted file mode 100644 index 735815729..000000000 --- a/src/main/java/com/dfsek/terra/TerraCommand.java +++ /dev/null @@ -1,206 +0,0 @@ -package com.dfsek.terra; - -import com.dfsek.terra.biome.TerraBiomeGrid; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.config.ConfigUtil; -import com.dfsek.terra.config.WorldConfig; -import com.dfsek.terra.config.genconfig.BiomeConfig; -import com.dfsek.terra.config.genconfig.OreConfig; -import com.dfsek.terra.generation.TerraChunkGenerator; -import com.dfsek.terra.image.WorldImageGenerator; -import com.dfsek.terra.structure.GaeaStructure; -import com.dfsek.terra.structure.InitializationException; -import com.dfsek.terra.procgen.GridSpawn; -import com.sk89q.worldedit.IncompleteRegionException; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.regions.Region; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.generation.GenerationPhase; -import org.polydev.gaea.profiler.WorldProfiler; - -import java.io.File; -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Random; - -public class TerraCommand implements CommandExecutor, TabExecutor { - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - try { - switch(args[0]) { - case "reload": - ConfigUtil.loadConfig(Terra.getInstance()); - sender.sendMessage("Reloaded Terra config."); - return true; - case "biome": - if(! (sender instanceof Player)) return false; - sender.sendMessage("You are in " + BiomeConfig.fromBiome((UserDefinedBiome) TerraBiomeGrid.fromWorld(((Player) sender).getWorld()).getBiome(((Player) sender).getLocation(), GenerationPhase.POPULATE)).getID()); - return true; - case "profile": - if(! (sender instanceof Player)) { - sender.sendMessage("Command is for players only."); - return true; - } - Player p = (Player) sender; - if(p.getWorld().getGenerator() instanceof TerraChunkGenerator) { - WorldProfiler profile = TerraProfiler.fromWorld(p.getWorld()); - if(args.length > 1 && "query".equals(args[1])) { - sender.sendMessage(profile.getResultsFormatted()); - return true; - } else if(args.length > 1 && "reset".equals(args[1])) { - profile.reset(); - sender.sendMessage("Profiler has been reset."); - return true; - } else if(args.length > 1 && "start".equals(args[1])) { - profile.setProfiling(true); - sender.sendMessage("Profiler has started."); - return true; - } else if(args.length > 1 && "stop".equals(args[1])) { - profile.setProfiling(false); - sender.sendMessage("Profiler has stopped."); - return true; - } - } else sender.sendMessage("World is not a Terra world!"); - break; - case "ore": - if(! (sender instanceof Player)) { - sender.sendMessage("Command is for players only."); - return true; - } - Block bl = ((Player) sender).getTargetBlockExact(25); - OreConfig ore = OreConfig.fromID(args[1]); - if(ore == null) { - sender.sendMessage("Unable to find Ore"); - return true; - } - ore.doVein(bl.getLocation(), new Random()); - return true; - case "image": - if("render".equals(args[1])) { - if(! (sender instanceof Player)) { - sender.sendMessage("Command is for players only."); - return true; - } - Player pl = (Player) sender; - if(args.length != 4) return false; - try { - WorldImageGenerator g = new WorldImageGenerator(pl.getWorld(), Integer.parseInt(args[2]), Integer.parseInt(args[3])); - g.drawWorld(pl.getLocation().getBlockX(), pl.getLocation().getBlockZ()); - File file = new File(Terra.getInstance().getDataFolder() + File.separator + "export" + File.separator + "map" + File.separator + "map_" + System.currentTimeMillis() + ".png"); - file.mkdirs(); - file.createNewFile(); - g.save(file); - sender.sendMessage("Saved image to " + file.getPath()); - return true; - } catch(Exception e) { - e.printStackTrace(); - return false; - } - } else if("gui".equals(args[1])) { - if(! (sender instanceof Player)) { - sender.sendMessage("Command is for players only."); - return true; - } - Player pl = (Player) sender; - try { - if("raw".equals(args[2])) - WorldConfig.fromWorld(pl.getWorld()).imageLoader.debug(false, pl.getWorld()); - else if("step".equals(args[2])) - WorldConfig.fromWorld(pl.getWorld()).imageLoader.debug(true, pl.getWorld()); - else return false; - return true; - } catch(NullPointerException e) { - return false; - } - } - break; - case "save-data": - TerraChunkGenerator.saveAll(); - sender.sendMessage("Saved population data."); - return true; - case "structure": - if(! (sender instanceof Player)) { - sender.sendMessage("Command is for players only."); - return true; - } - - Player pl = (Player) sender; - if("export".equals(args[1])) { - WorldEditPlugin we = WorldEditUtil.getWorldEdit(); - if(we == null) { - sender.sendMessage("WorldEdit is not installed! Please install WorldEdit before attempting to export structures."); - return true; - } - Region selection; - try { - selection = we.getSession(pl).getSelection(BukkitAdapter.adapt(pl.getWorld())); - } catch(IncompleteRegionException e) { - sender.sendMessage("Invalid/incomplete selection!"); - return true; - } - BukkitAdapter.adapt(pl); - if(selection == null) { - sender.sendMessage("Please make a selection before attempting to export!"); - return true; - } - BlockVector3 min = selection.getMinimumPoint(); - BlockVector3 max = selection.getMaximumPoint(); - Location l1 = new Location(pl.getWorld(), min.getBlockX(), min.getBlockY(), min.getBlockZ()); - Location l2 = new Location(pl.getWorld(), max.getBlockX(), max.getBlockY(), max.getBlockZ()); - GaeaStructure structure = null; - try { - structure = new GaeaStructure(l1, l2, args[2]); - } catch(InitializationException e) { - sender.sendMessage(e.getMessage()); - return true; - } - try { - File file = new File(Terra.getInstance().getDataFolder() + File.separator + "export" + File.separator + "structures", args[2] + ".tstructure"); - file.getParentFile().mkdirs(); - file.createNewFile(); - structure.save(file); - sender.sendMessage("Saved structure with ID " + structure.getId() + ", UUID: " + structure.getUuid().toString() + " to " + file.getPath()); - } catch(IOException e) { - e.printStackTrace(); - } - return true; - } else if("load".equals(args[1])) { - try { - GaeaStructure.Rotation r = GaeaStructure.Rotation.fromDegrees(Integer.parseInt(args[3])); - GaeaStructure struc = GaeaStructure.load(new File(Terra.getInstance().getDataFolder() + File.separator + "export" + File.separator + "structures", args[2] + ".tstructure")); - if("true".equals(args[4])) struc.paste(pl.getLocation(), r, Collections.emptyList()); - else struc.paste(pl.getLocation(), pl.getLocation().getChunk(), r, Collections.emptyList()); - } catch(IOException e) { - e.printStackTrace(); - sender.sendMessage("Structure not found."); - } - return true; - } else if("getspawn".equals(args[1])) { - Vector v = new GridSpawn(250, 250).getNearestSpawn(pl.getLocation().getBlockX(), pl.getLocation().getBlockZ(), pl.getWorld().getSeed()); - sender.sendMessage(v.getBlockX() + ":" + v.getBlockZ()); - } - } - } catch(ArrayIndexOutOfBoundsException e) { - e.printStackTrace(); - } - return false; - } - @Override - public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - //System.out.println("Label " + label + " args: " + Arrays.toString(args)); - if(args[0].equals("tpbiome")) return BiomeConfig.getBiomeIDs(); - else if(args[0].equals("ore")) return OreConfig.getOreIDs(); - else return Collections.emptyList(); - } -} diff --git a/src/main/java/com/dfsek/terra/command/BiomeCommand.java b/src/main/java/com/dfsek/terra/command/BiomeCommand.java new file mode 100644 index 000000000..e4de4046a --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/BiomeCommand.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.command; + +import com.dfsek.terra.biome.TerraBiomeGrid; +import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.config.genconfig.BiomeConfig; +import org.bukkit.command.Command; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.polydev.gaea.generation.GenerationPhase; + +import java.util.Collections; +import java.util.List; + +public class BiomeCommand extends PlayerCommand { + @Override + public boolean onCommand(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + TerraBiomeGrid grid = TerraBiomeGrid.fromWorld(sender.getWorld()); + if(grid == null) { + sender.sendMessage("Not a Terra world!"); + return true; + } + UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(sender.getLocation(), GenerationPhase.POPULATE); + sender.sendMessage("You are in " + BiomeConfig.fromBiome(biome).getID()); + return true; + } + + @Override + public String getName() { + return "biome"; + } + + @Override + public List getSubCommands() { + return Collections.emptyList(); + } +} diff --git a/src/main/java/com/dfsek/terra/command/Command.java b/src/main/java/com/dfsek/terra/command/Command.java new file mode 100644 index 000000000..d88355d4b --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/Command.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.command; + +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.List; + +public abstract class Command { + public abstract String getName(); + public abstract List getSubCommands(); + public abstract boolean onCommand(@NotNull CommandSender sender, @NotNull org.bukkit.command.Command command, @NotNull String label, @NotNull String[] args); + public final boolean execute(@NotNull CommandSender sender, @NotNull org.bukkit.command.Command command, @NotNull String label, @NotNull String[] args) { + if(args.length > 0) { + for(com.dfsek.terra.command.Command c : getSubCommands()) { + if(c.getName().equals(args[0])) return c.execute(sender, command, label, Arrays.stream(args, 1, args.length).toArray(String[]::new)); + } + sender.sendMessage("Invalid command."); + return true; + } else { + onCommand(sender, command, label, args); + } + return true; + } +} diff --git a/src/main/java/com/dfsek/terra/command/OreCommand.java b/src/main/java/com/dfsek/terra/command/OreCommand.java new file mode 100644 index 000000000..0b4818db3 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/OreCommand.java @@ -0,0 +1,39 @@ +package com.dfsek.terra.command; + +import com.dfsek.terra.config.genconfig.OreConfig; +import org.bukkit.block.Block; +import org.bukkit.command.Command; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class OreCommand extends PlayerCommand { + @Override + public boolean onCommand(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + Block bl = sender.getTargetBlockExact(25); + OreConfig ore = OreConfig.fromID(args[0]); + if(ore == null) { + sender.sendMessage("Unable to find Ore"); + return true; + } + if(bl == null) { + sender.sendMessage("Block out of range"); + return true; + } + ore.doVein(bl.getLocation(), new Random()); + return true; + } + + @Override + public List getSubCommands() { + return Collections.emptyList(); + } + + @Override + public String getName() { + return "ore"; + } +} diff --git a/src/main/java/com/dfsek/terra/command/PlayerCommand.java b/src/main/java/com/dfsek/terra/command/PlayerCommand.java new file mode 100644 index 000000000..239fb95a2 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/PlayerCommand.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.command; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public abstract class PlayerCommand extends Command { + @Override + public boolean onCommand(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(!(sender instanceof Player)) { + sender.sendMessage("Command is for players only."); + return true; + } + Player p = (Player) sender; + return onCommand(p, command, label, args); + } + public abstract boolean onCommand(@NotNull Player sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args); +} diff --git a/src/main/java/com/dfsek/terra/command/ReloadCommand.java b/src/main/java/com/dfsek/terra/command/ReloadCommand.java new file mode 100644 index 000000000..1bce84130 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/ReloadCommand.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.command; + +import com.dfsek.terra.Terra; +import com.dfsek.terra.config.ConfigUtil; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +public class ReloadCommand extends Command { + @Override + public String getName() { + return "reload"; + } + + @Override + public List getSubCommands() { + return Collections.emptyList(); + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { + ConfigUtil.loadConfig(Terra.getInstance()); + sender.sendMessage("Reloaded Terra config."); + return true; + } +} diff --git a/src/main/java/com/dfsek/terra/command/SaveDataCommand.java b/src/main/java/com/dfsek/terra/command/SaveDataCommand.java new file mode 100644 index 000000000..bee10c3c3 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/SaveDataCommand.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.command; + +import com.dfsek.terra.generation.TerraChunkGenerator; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +public class SaveDataCommand extends Command { + @Override + public String getName() { + return "save-data"; + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { + TerraChunkGenerator.saveAll(); + sender.sendMessage("Saved population data."); + return true; + } + + @Override + public List getSubCommands() { + return Collections.emptyList(); + } +} diff --git a/src/main/java/com/dfsek/terra/command/TerraCommand.java b/src/main/java/com/dfsek/terra/command/TerraCommand.java new file mode 100644 index 000000000..e7fa84439 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/TerraCommand.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.command; + +import com.dfsek.terra.command.profile.ProfileCommand; +import com.dfsek.terra.command.structure.StructureCommand; +import com.dfsek.terra.config.genconfig.BiomeConfig; +import com.dfsek.terra.config.genconfig.OreConfig; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class TerraCommand implements CommandExecutor, TabExecutor { + private final List commands = Arrays.asList(new ReloadCommand(), + new BiomeCommand(), + new OreCommand(), + new ProfileCommand(), + new SaveDataCommand(), + new StructureCommand()); + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(args.length > 0) { + for(com.dfsek.terra.command.Command c : commands) { + if(c.getName().equals(args[0])) return c.execute(sender, command, label, Arrays.stream(args, 1, args.length).toArray(String[]::new)); + } + sender.sendMessage("Invalid command."); + return true; + } else { + sender.sendMessage("--------------------Terra--------------------"); + sender.sendMessage("reload - Reload configuration data"); + sender.sendMessage("biome - Get current biome"); + sender.sendMessage("ore - Generate an ore vein at the location you are facing (For debugging)"); + sender.sendMessage("save-data - Save population data"); + sender.sendMessage("structure - Load and export structures"); + sender.sendMessage("profile - Profiler options"); + } + return false; + } + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(args[0].equals("tpbiome")) return BiomeConfig.getBiomeIDs(); + else if(args[0].equals("ore")) return OreConfig.getOreIDs(); + else return Collections.emptyList(); + } +} diff --git a/src/main/java/com/dfsek/terra/command/WorldCommand.java b/src/main/java/com/dfsek/terra/command/WorldCommand.java new file mode 100644 index 000000000..911a07f99 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/WorldCommand.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.command; + +import com.dfsek.terra.generation.TerraChunkGenerator; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public abstract class WorldCommand extends PlayerCommand { + @Override + public boolean onCommand(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(sender.getWorld().getGenerator() instanceof TerraChunkGenerator) { + return onCommand(sender, command, label, args, sender.getWorld()); + } + return true; + } + + public abstract boolean onCommand(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world); + + @Override + public String getName() { + return null; + } + + @Override + public List getSubCommands() { + return null; + } +} diff --git a/src/main/java/com/dfsek/terra/command/image/ImageCommand.java b/src/main/java/com/dfsek/terra/command/image/ImageCommand.java new file mode 100644 index 000000000..02448b150 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/image/ImageCommand.java @@ -0,0 +1,59 @@ +package com.dfsek.terra.command.image; + +import com.dfsek.terra.Terra; +import com.dfsek.terra.command.PlayerCommand; +import com.dfsek.terra.config.WorldConfig; +import com.dfsek.terra.image.WorldImageGenerator; +import org.bukkit.command.Command; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.Collections; +import java.util.List; + +public class ImageCommand extends PlayerCommand { + @Override + public boolean onCommand(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if("render".equals(args[0])) { + if(args.length != 4) return false; + try { + WorldImageGenerator g = new WorldImageGenerator(sender.getWorld(), Integer.parseInt(args[2]), Integer.parseInt(args[3])); + g.drawWorld(sender.getLocation().getBlockX(), sender.getLocation().getBlockZ()); + File file = new File(Terra.getInstance().getDataFolder() + File.separator + "export" + File.separator + "map" + File.separator + "map_" + System.currentTimeMillis() + ".png"); + file.mkdirs(); + file.createNewFile(); + g.save(file); + sender.sendMessage("Saved image to " + file.getPath()); + return true; + } catch(Exception e) { + e.printStackTrace(); + return false; + } + } else if("gui".equals(args[0])) { + try { + if("raw".equals(args[1])) + WorldConfig.fromWorld(sender.getWorld()).imageLoader.debug(false, sender.getWorld()); + else if("step".equals(args[1])) + WorldConfig.fromWorld(sender.getWorld()).imageLoader.debug(true, sender.getWorld()); + else { + return true; + } + return true; + } catch(NullPointerException e) { + return true; + } + } + return true; + } + + @Override + public List getSubCommands() { + return Collections.emptyList(); + } + + @Override + public String getName() { + return "image"; + } +} diff --git a/src/main/java/com/dfsek/terra/command/profile/ProfileCommand.java b/src/main/java/com/dfsek/terra/command/profile/ProfileCommand.java new file mode 100644 index 000000000..9ae92a507 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/profile/ProfileCommand.java @@ -0,0 +1,45 @@ +package com.dfsek.terra.command.profile; + +import com.dfsek.terra.TerraProfiler; +import com.dfsek.terra.command.WorldCommand; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.polydev.gaea.profiler.WorldProfiler; + +import java.util.List; + +public class ProfileCommand extends WorldCommand { + @Override + public boolean onCommand(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World w) { + WorldProfiler profile = TerraProfiler.fromWorld(w); + if(args.length > 1 && "query".equals(args[1])) { + sender.sendMessage(profile.getResultsFormatted()); + return true; + } else if(args.length > 1 && "reset".equals(args[1])) { + profile.reset(); + sender.sendMessage("Profiler has been reset."); + return true; + } else if(args.length > 1 && "start".equals(args[1])) { + profile.setProfiling(true); + sender.sendMessage("Profiler has started."); + return true; + } else if(args.length > 1 && "stop".equals(args[1])) { + profile.setProfiling(false); + sender.sendMessage("Profiler has stopped."); + return true; + } + return true; + } + + @Override + public String getName() { + return null; + } + + @Override + public List getSubCommands() { + return null; + } +} diff --git a/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java b/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java new file mode 100644 index 000000000..73ed832c4 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java @@ -0,0 +1,30 @@ +package com.dfsek.terra.command.profile; + +import com.dfsek.terra.TerraProfiler; +import com.dfsek.terra.command.PlayerCommand; +import org.bukkit.command.Command; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.polydev.gaea.profiler.WorldProfiler; + +import java.util.Collections; +import java.util.List; + +public class QueryCommand extends PlayerCommand { + @Override + public boolean onCommand(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + WorldProfiler profile = TerraProfiler.fromWorld(sender.getWorld()); + sender.sendMessage(profile.getResultsFormatted()); + return true; + } + + @Override + public String getName() { + return "query"; + } + + @Override + public List getSubCommands() { + return Collections.emptyList(); + } +} diff --git a/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java b/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java new file mode 100644 index 000000000..c68289cd4 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java @@ -0,0 +1,75 @@ +package com.dfsek.terra.command.structure; + +import com.dfsek.terra.Terra; +import com.dfsek.terra.WorldEditUtil; +import com.dfsek.terra.command.PlayerCommand; +import com.dfsek.terra.structure.GaeaStructure; +import com.dfsek.terra.structure.InitializationException; +import com.sk89q.worldedit.IncompleteRegionException; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.bukkit.WorldEditPlugin; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.regions.Region; +import org.bukkit.Location; +import org.bukkit.command.Command; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +public class ExportCommand extends PlayerCommand { + @Override + public boolean onCommand(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + WorldEditPlugin we = WorldEditUtil.getWorldEdit(); + if(we == null) { + sender.sendMessage("WorldEdit is not installed! Please install WorldEdit before attempting to export structures."); + return true; + } + Region selection; + try { + selection = we.getSession(sender).getSelection(BukkitAdapter.adapt(sender.getWorld())); + } catch(IncompleteRegionException e) { + sender.sendMessage("Invalid/incomplete selection!"); + return true; + } + BukkitAdapter.adapt(sender); + if(selection == null) { + sender.sendMessage("Please make a selection before attempting to export!"); + return true; + } + BlockVector3 min = selection.getMinimumPoint(); + BlockVector3 max = selection.getMaximumPoint(); + Location l1 = new Location(sender.getWorld(), min.getBlockX(), min.getBlockY(), min.getBlockZ()); + Location l2 = new Location(sender.getWorld(), max.getBlockX(), max.getBlockY(), max.getBlockZ()); + GaeaStructure structure = null; + try { + structure = new GaeaStructure(l1, l2, args[0]); + } catch(InitializationException e) { + sender.sendMessage(e.getMessage()); + return true; + } + try { + File file = new File(Terra.getInstance().getDataFolder() + File.separator + "export" + File.separator + "structures", args[0] + ".tstructure"); + file.getParentFile().mkdirs(); + file.createNewFile(); + structure.save(file); + sender.sendMessage("Saved structure with ID " + structure.getId() + ", UUID: " + structure.getUuid().toString() + " to " + file.getPath()); + } catch(IOException e) { + e.printStackTrace(); + } + return true; + } + + @Override + public String getName() { + return "export"; + } + + @Override + public List getSubCommands() { + return Collections.emptyList(); + } +} diff --git a/src/main/java/com/dfsek/terra/command/structure/LoadCommand.java b/src/main/java/com/dfsek/terra/command/structure/LoadCommand.java new file mode 100644 index 000000000..04c1dc22b --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/structure/LoadCommand.java @@ -0,0 +1,39 @@ +package com.dfsek.terra.command.structure; + +import com.dfsek.terra.Terra; +import com.dfsek.terra.command.PlayerCommand; +import com.dfsek.terra.structure.GaeaStructure; +import org.bukkit.command.Command; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +public class LoadCommand extends PlayerCommand { + @Override + public boolean onCommand(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + try { + GaeaStructure.Rotation r = GaeaStructure.Rotation.fromDegrees(Integer.parseInt(args[1])); + GaeaStructure struc = GaeaStructure.load(new File(Terra.getInstance().getDataFolder() + File.separator + "export" + File.separator + "structures", args[0] + ".tstructure")); + if("true".equals(args[2])) struc.paste(sender.getLocation(), r, Collections.emptyList()); + else struc.paste(sender.getLocation(), sender.getLocation().getChunk(), r, Collections.emptyList()); + } catch(IOException e) { + e.printStackTrace(); + sender.sendMessage("Structure not found."); + } + return true; + } + + @Override + public String getName() { + return "load"; + } + + @Override + public List getSubCommands() { + return Collections.emptyList(); + } +} diff --git a/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java b/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java new file mode 100644 index 000000000..d9a34d498 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.command.structure; + +import com.dfsek.terra.command.PlayerCommand; +import org.bukkit.command.Command; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.List; + +public class StructureCommand extends PlayerCommand { + @Override + public boolean onCommand(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + sender.sendMessage("---------------Terra/structure---------------"); + sender.sendMessage("export - Export your current WorldEdit selection as a Terra structure."); + sender.sendMessage("load - Load a Terra structure"); + return true; + } + + @Override + public List getSubCommands() { + return Arrays.asList(new ExportCommand(), new LoadCommand()); + } + + @Override + public String getName() { + return "structure"; + } +}