mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-18 10:32:30 +00:00
Improvements to structure load command
This commit is contained in:
parent
e5c5557398
commit
9125590a02
@ -1,5 +1,6 @@
|
|||||||
package com.dfsek.terra.command.structure;
|
package com.dfsek.terra.command.structure;
|
||||||
|
|
||||||
|
import com.dfsek.terra.command.structure.load.LoadCommand;
|
||||||
import com.dfsek.terra.config.lang.LangUtil;
|
import com.dfsek.terra.config.lang.LangUtil;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
@ -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<String> getStructureNames() {
|
||||||
|
List<String> 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<org.polydev.gaea.command.Command> getSubCommands() {
|
||||||
|
return Arrays.asList(new LoadRawCommand(this), new LoadFullCommand(this, true), new LoadFullCommand(this, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int arguments() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
@ -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.Terra;
|
||||||
import com.dfsek.terra.config.lang.LangUtil;
|
import com.dfsek.terra.config.lang.LangUtil;
|
||||||
@ -15,14 +15,19 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class LoadCommand extends PlayerCommand implements DebugCommand {
|
public class LoadFullCommand extends PlayerCommand implements DebugCommand {
|
||||||
public LoadCommand(org.polydev.gaea.command.Command parent) {
|
private final boolean chunk;
|
||||||
|
|
||||||
|
public LoadFullCommand(org.polydev.gaea.command.Command parent, boolean chunk) {
|
||||||
super(parent);
|
super(parent);
|
||||||
|
this.chunk = chunk;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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 {
|
try {
|
||||||
Rotation r;
|
Rotation r;
|
||||||
try {
|
try {
|
||||||
@ -32,8 +37,8 @@ public class LoadCommand extends PlayerCommand implements DebugCommand {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
Structure struc = Structure.load(new File(Terra.getInstance().getDataFolder() + File.separator + "export" + File.separator + "structures", args[0] + ".tstructure"));
|
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);
|
if(chunk) struc.paste(sender.getLocation(), sender.getLocation().getChunk(), r);
|
||||||
else struc.paste(sender.getLocation(), sender.getLocation().getChunk(), r);
|
else struc.paste(sender.getLocation(), r);
|
||||||
//sender.sendMessage(String.valueOf(struc.checkSpawns(sender.getLocation(), r)));
|
//sender.sendMessage(String.valueOf(struc.checkSpawns(sender.getLocation(), r)));
|
||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -44,7 +49,7 @@ public class LoadCommand extends PlayerCommand implements DebugCommand {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return "load";
|
return chunk ? "chunk" : "full";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -54,11 +59,17 @@ public class LoadCommand extends PlayerCommand implements DebugCommand {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int arguments() {
|
public int arguments() {
|
||||||
return 3;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) {
|
public List<String> 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();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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<org.polydev.gaea.command.Command> getSubCommands() {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int arguments() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> 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();
|
||||||
|
}
|
||||||
|
}
|
@ -144,6 +144,10 @@ public class Structure implements Serializable {
|
|||||||
return (Structure) o;
|
return (Structure) o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public StructureContainedBlock[][][] getRawStructure() {
|
||||||
|
return structure;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Paste the structure at a Location, ignoring chunk boundaries.
|
* Paste the structure at a Location, ignoring chunk boundaries.
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user