use of org.spongepowered.api.world.extent.ArchetypeVolume in project SpongeCommon by SpongePowered.
the class CopyPasta method onGamePreInitialization.
@Listener
public void onGamePreInitialization(GamePreInitializationEvent event) {
this.schematicsDir = new File(this.config, "schematics");
this.schematicsDir.mkdirs();
this.logger.info("Saving schematics to " + this.schematicsDir.getAbsolutePath());
Sponge.getCommandManager().register(this, CommandSpec.builder().description(Text.of("Copies a region of the world to your clipboard")).permission(PLUGIN_ID + ".command.copy").executor((src, args) -> {
if (!(src instanceof Player)) {
src.sendMessage(Text.of(TextColors.RED, "Player only."));
return CommandResult.success();
}
Player player = (Player) src;
PlayerData data = get(player);
if (data.getPos1() == null || data.getPos2() == null) {
player.sendMessage(Text.of(TextColors.RED, "You must set both positions before copying"));
return CommandResult.success();
}
Vector3i min = data.getPos1().min(data.getPos2());
Vector3i max = data.getPos1().max(data.getPos2());
ArchetypeVolume volume = player.getWorld().createArchetypeVolume(min, max, player.getLocation().getPosition().toInt());
data.setClipboard(volume);
player.sendMessage(Text.of(TextColors.GREEN, "Saved to clipboard."));
return CommandResult.success();
}).build(), "copy");
Sponge.getCommandManager().register(this, CommandSpec.builder().description(Text.of("Pastes your clipboard at your current position")).permission(PLUGIN_ID + ".command.paste").executor((src, args) -> {
if (!(src instanceof Player)) {
src.sendMessage(Text.of(TextColors.RED, "Player only."));
return CommandResult.success();
}
Player player = (Player) src;
PlayerData data = get(player);
ArchetypeVolume volume = data.getClipboard();
if (volume == null) {
player.sendMessage(Text.of(TextColors.RED, "You must copy something before pasting"));
return CommandResult.success();
}
Sponge.getCauseStackManager().pushCause(this);
volume.apply(player.getLocation(), BlockChangeFlags.ALL);
Sponge.getCauseStackManager().popCause();
player.sendMessage(Text.of(TextColors.GREEN, "Pasted clipboard into world."));
return CommandResult.success();
}).build(), "paste");
Sponge.getCommandManager().register(this, CommandSpec.builder().description(Text.of("Saves your clipboard to disk")).permission(PLUGIN_ID + ".command.save").arguments(seq(string(Text.of("format")), string(Text.of("name")))).executor((src, args) -> {
if (!(src instanceof Player)) {
src.sendMessage(Text.of(TextColors.RED, "Player only."));
return CommandResult.success();
}
String format = args.getOne("format").get().toString();
String name = args.getOne("name").get().toString();
Player player = (Player) src;
PlayerData data = get(player);
ArchetypeVolume volume = data.getClipboard();
if (volume == null) {
player.sendMessage(Text.of(TextColors.RED, "You must copy something before saving"));
return CommandResult.success();
}
if (!"legacy".equalsIgnoreCase(format) && !"sponge".equalsIgnoreCase(format)) {
player.sendMessage(Text.of(TextColors.RED, "Unsupported schematic format, supported formats are [legacy, sponge]"));
return CommandResult.success();
}
Schematic schematic = Schematic.builder().volume(data.getClipboard()).metaValue(Schematic.METADATA_AUTHOR, player.getName()).metaValue(Schematic.METADATA_NAME, name).paletteType(BlockPaletteTypes.LOCAL).build();
DataContainer schematicData = null;
if ("legacy".equalsIgnoreCase(format)) {
schematicData = DataTranslators.LEGACY_SCHEMATIC.translate(schematic);
} else if ("sponge".equalsIgnoreCase(format)) {
schematicData = DataTranslators.SCHEMATIC.translate(schematic);
}
File outputFile = new File(this.schematicsDir, name + ".schematic");
try {
DataFormats.NBT.writeTo(new GZIPOutputStream(new FileOutputStream(outputFile)), schematicData);
player.sendMessage(Text.of(TextColors.GREEN, "Saved schematic to " + outputFile.getAbsolutePath()));
} catch (Exception e) {
e.printStackTrace();
player.sendMessage(Text.of(TextColors.DARK_RED, "Error saving schematic: " + e.getMessage()));
return CommandResult.success();
}
return CommandResult.success();
}).build(), "save");
Sponge.getCommandManager().register(this, CommandSpec.builder().description(Text.of("Loads a schematic from disk to your clipboard")).permission(PLUGIN_ID + ".command.load").arguments(seq(string(Text.of("format")), string(Text.of("name")))).executor((src, args) -> {
if (!(src instanceof Player)) {
src.sendMessage(Text.of(TextColors.RED, "Player only."));
return CommandResult.success();
}
String format = args.getOne("format").get().toString();
String name = args.getOne("name").get().toString();
Player player = (Player) src;
PlayerData data = get(player);
if (!"legacy".equalsIgnoreCase(format) && !"sponge".equalsIgnoreCase(format)) {
player.sendMessage(Text.of(TextColors.RED, "Unsupported schematic format, supported formats are [legacy, sponge]"));
return CommandResult.success();
}
File inputFile = new File(this.schematicsDir, name + ".schematic");
if (!inputFile.exists()) {
player.sendMessage(Text.of(TextColors.RED, "Schematic at " + inputFile.getAbsolutePath() + " not found."));
return CommandResult.success();
}
DataContainer schematicData = null;
try {
schematicData = DataFormats.NBT.readFrom(new GZIPInputStream(new FileInputStream(inputFile)));
} catch (Exception e) {
e.printStackTrace();
player.sendMessage(Text.of(TextColors.DARK_RED, "Error loading schematic: " + e.getMessage()));
return CommandResult.success();
}
Schematic schematic = null;
if ("legacy".equalsIgnoreCase(format)) {
schematic = DataTranslators.LEGACY_SCHEMATIC.translate(schematicData);
} else if ("sponge".equalsIgnoreCase(format)) {
schematic = DataTranslators.SCHEMATIC.translate(schematicData);
}
player.sendMessage(Text.of(TextColors.GREEN, "Loaded schematic from " + inputFile.getAbsolutePath()));
data.setClipboard(schematic);
return CommandResult.success();
}).build(), "load");
}
Aggregations