diff --git a/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java b/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java index 99d7b0a15..af1a7ed74 100644 --- a/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java @@ -1,5 +1,6 @@ package com.dfsek.terra.command.structure; +import com.dfsek.terra.command.structure.load.LoadCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/dfsek/terra/command/structure/load/LoadCommand.java b/src/main/java/com/dfsek/terra/command/structure/load/LoadCommand.java new file mode 100644 index 000000000..7a7eaa441 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/structure/load/LoadCommand.java @@ -0,0 +1,62 @@ +package com.dfsek.terra.command.structure.load; + +import com.dfsek.terra.Terra; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.polydev.gaea.command.DebugCommand; +import org.polydev.gaea.command.PlayerCommand; + +import java.io.File; +import java.io.FilenameFilter; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class LoadCommand extends PlayerCommand implements DebugCommand { + public LoadCommand(org.polydev.gaea.command.Command parent) { + super(parent); + } + + @Override + public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + return true; + } + + @Override + public String getName() { + return "load"; + } + + public static List getStructureNames() { + List names = new ArrayList<>(); + File structureDir = new File(Terra.getInstance().getDataFolder() + File.separator + "export" + File.separator + "structures"); + if(!structureDir.exists()) return Collections.emptyList(); + Path structurePath = structureDir.toPath(); + + FilenameFilter filter = (dir, name) -> name.endsWith(".tstructure"); + for(File f : structureDir.listFiles(filter)) { + String path = structurePath.relativize(f.toPath()).toString(); + names.add(path.substring(0, path.length() - 11)); + } + return names; + } + + @Override + public List getSubCommands() { + return Arrays.asList(new LoadRawCommand(this), new LoadFullCommand(this, true), new LoadFullCommand(this, false)); + } + + @Override + public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { + return Collections.emptyList(); + } + + @Override + public int arguments() { + return 0; + } +} diff --git a/src/main/java/com/dfsek/terra/command/structure/LoadCommand.java b/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java similarity index 61% rename from src/main/java/com/dfsek/terra/command/structure/LoadCommand.java rename to src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java index 51e327f6d..79b130325 100644 --- a/src/main/java/com/dfsek/terra/command/structure/LoadCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.command.structure; +package com.dfsek.terra.command.structure.load; import com.dfsek.terra.Terra; import com.dfsek.terra.config.lang.LangUtil; @@ -15,14 +15,19 @@ import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; -public class LoadCommand extends PlayerCommand implements DebugCommand { - public LoadCommand(org.polydev.gaea.command.Command parent) { +public class LoadFullCommand extends PlayerCommand implements DebugCommand { + private final boolean chunk; + + public LoadFullCommand(org.polydev.gaea.command.Command parent, boolean chunk) { super(parent); + this.chunk = chunk; } @Override - public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { try { Rotation r; try { @@ -32,8 +37,8 @@ public class LoadCommand extends PlayerCommand implements DebugCommand { return true; } Structure struc = Structure.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); - else struc.paste(sender.getLocation(), sender.getLocation().getChunk(), r); + if(chunk) struc.paste(sender.getLocation(), sender.getLocation().getChunk(), r); + else struc.paste(sender.getLocation(), r); //sender.sendMessage(String.valueOf(struc.checkSpawns(sender.getLocation(), r))); } catch(IOException e) { e.printStackTrace(); @@ -44,7 +49,7 @@ public class LoadCommand extends PlayerCommand implements DebugCommand { @Override public String getName() { - return "load"; + return chunk ? "chunk" : "full"; } @Override @@ -54,11 +59,17 @@ public class LoadCommand extends PlayerCommand implements DebugCommand { @Override public int arguments() { - return 3; + return 2; } @Override - public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { + public List getTabCompletions(@NotNull CommandSender commandSender, @NotNull String s, @NotNull String[] args) { + switch(args.length) { + case 1: + return LoadCommand.getStructureNames().stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); + case 2: + return Stream.of("0", "90", "180", "270").filter(string -> string.toUpperCase().startsWith(args[1].toUpperCase())).collect(Collectors.toList()); + } return Collections.emptyList(); } } diff --git a/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java b/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java new file mode 100644 index 000000000..4ad7bd2a9 --- /dev/null +++ b/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java @@ -0,0 +1,113 @@ +package com.dfsek.terra.command.structure.load; + +import com.dfsek.terra.Terra; +import com.dfsek.terra.config.lang.LangUtil; +import com.dfsek.terra.structure.Structure; +import com.dfsek.terra.structure.StructureContainedBlock; +import com.dfsek.terra.structure.StructureInfo; +import com.dfsek.terra.structure.StructureSpawnRequirement; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Sign; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.polydev.gaea.command.DebugCommand; +import org.polydev.gaea.command.PlayerCommand; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class LoadRawCommand extends PlayerCommand implements DebugCommand { + public LoadRawCommand(org.polydev.gaea.command.Command parent) { + super(parent); + } + + private static void setTerraSign(Sign sign, String data) { + sign.setLine(0, "[TERRA]"); + sign.setLine(2, data.substring(0, 16)); + sign.setLine(3, data.substring(16)); + } + + @Override + public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { + try { + Structure struc = Structure.load(new File(Terra.getInstance().getDataFolder() + File.separator + "export" + File.separator + "structures", args[0] + ".tstructure")); + StructureInfo info = struc.getStructureInfo(); + int centerX = info.getCenterX(); + int centerZ = info.getCenterZ(); + for(StructureContainedBlock[][] level0 : struc.getRawStructure()) { + for(StructureContainedBlock[] level1 : level0) { + for(StructureContainedBlock block : level1) { + Location bLocation = sender.getLocation().add(block.getX() - centerX, block.getY(), block.getZ() - centerZ); + if(!block.getPull().equals(StructureContainedBlock.Pull.NONE)) { + bLocation.getBlock().setBlockData(Material.OAK_SIGN.createBlockData(), false); + Sign sign = (Sign) bLocation.getBlock().getState(); + sign.setLine(1, "[PULL=" + block.getPull() + "_" + block.getPullOffset() + "]"); + String data = block.getBlockData().getAsString(true); + setTerraSign(sign, data); + sign.update(); + } else if(!block.getRequirement().equals(StructureSpawnRequirement.BLANK)) { + bLocation.getBlock().setBlockData(Material.OAK_SIGN.createBlockData(), false); + Sign sign = (Sign) bLocation.getBlock().getState(); + sign.setLine(1, "[SPAWN=" + block.getRequirement() + "]"); + String data = block.getBlockData().getAsString(true); + setTerraSign(sign, data); + sign.update(); + } else { + bLocation.getBlock().setBlockData(block.getBlockData(), false); + if(block.getState() != null) { + block.getState().getState(bLocation.getBlock().getState()).update(true, false); + } + } + } + } + } + + for(int y = 0; y < struc.getStructureInfo().getSizeY(); y++) { + StructureContainedBlock block = struc.getRawStructure()[centerX][centerZ][y]; + if(block.getRequirement().equals(StructureSpawnRequirement.BLANK) && block.getPull().equals(StructureContainedBlock.Pull.NONE)) { + Location bLocation = sender.getLocation().add(block.getX() - centerX, block.getY(), block.getZ() - centerZ); + bLocation.getBlock().setBlockData(Material.OAK_SIGN.createBlockData(), false); + Sign sign = (Sign) bLocation.getBlock().getState(); + sign.setLine(1, "[CENTER]"); + String data = block.getBlockData().getAsString(true); + setTerraSign(sign, data); + sign.update(); + break; + } + } + } catch(IOException e) { + e.printStackTrace(); + LangUtil.send("command.structure.invalid", sender, args[0]); + } + return true; + } + + @Override + public String getName() { + return "raw"; + } + + @Override + public List getSubCommands() { + return Collections.emptyList(); + } + + @Override + public int arguments() { + return 1; + } + + @Override + public List getTabCompletions(@NotNull CommandSender commandSender, @NotNull String s, @NotNull String[] args) { + if(args.length == 1) { + return LoadCommand.getStructureNames().stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); + } + return Collections.emptyList(); + } +} diff --git a/src/main/java/com/dfsek/terra/structure/Structure.java b/src/main/java/com/dfsek/terra/structure/Structure.java index bb5e0f0d0..306658f81 100644 --- a/src/main/java/com/dfsek/terra/structure/Structure.java +++ b/src/main/java/com/dfsek/terra/structure/Structure.java @@ -144,6 +144,10 @@ public class Structure implements Serializable { return (Structure) o; } + public StructureContainedBlock[][][] getRawStructure() { + return structure; + } + /** * Paste the structure at a Location, ignoring chunk boundaries. *