Search in sources :

Example 1 with ArchetypeVolume

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");
}
Also used : Player(org.spongepowered.api.entity.living.player.Player) FileInputStream(java.io.FileInputStream) ArchetypeVolume(org.spongepowered.api.world.extent.ArchetypeVolume) GZIPInputStream(java.util.zip.GZIPInputStream) DataContainer(org.spongepowered.api.data.DataContainer) GZIPOutputStream(java.util.zip.GZIPOutputStream) FileOutputStream(java.io.FileOutputStream) Vector3i(com.flowpowered.math.vector.Vector3i) File(java.io.File) Schematic(org.spongepowered.api.world.schematic.Schematic) Listener(org.spongepowered.api.event.Listener)

Aggregations

Vector3i (com.flowpowered.math.vector.Vector3i)1 File (java.io.File)1 FileInputStream (java.io.FileInputStream)1 FileOutputStream (java.io.FileOutputStream)1 GZIPInputStream (java.util.zip.GZIPInputStream)1 GZIPOutputStream (java.util.zip.GZIPOutputStream)1 DataContainer (org.spongepowered.api.data.DataContainer)1 Player (org.spongepowered.api.entity.living.player.Player)1 Listener (org.spongepowered.api.event.Listener)1 ArchetypeVolume (org.spongepowered.api.world.extent.ArchetypeVolume)1 Schematic (org.spongepowered.api.world.schematic.Schematic)1