Search in sources :

Example 1 with ByteArrayTag

use of com.sk89q.jnbt.ByteArrayTag in project FastAsyncWorldEdit by IntellectualSites.

the class SpongeSchematicReader method readBiomes.

private void readBiomes(BlockArrayClipboard clipboard, Map<String, Tag> schematic) throws IOException {
    ByteArrayTag dataTag = requireTag(schematic, "BiomeData", ByteArrayTag.class);
    IntTag maxTag = requireTag(schematic, "BiomePaletteMax", IntTag.class);
    CompoundTag paletteTag = requireTag(schematic, "BiomePalette", CompoundTag.class);
    Map<Integer, BiomeType> palette = new HashMap<>();
    if (maxTag.getValue() != paletteTag.getValue().size()) {
        throw new IOException("Biome palette size does not match expected size.");
    }
    for (Entry<String, Tag> palettePart : paletteTag.getValue().entrySet()) {
        String key = palettePart.getKey();
        if (fixer != null) {
            key = fixer.fixUp(DataFixer.FixTypes.BIOME, key, dataVersion);
        }
        BiomeType biome = BiomeTypes.get(key);
        if (biome == null) {
            LOGGER.warn("Unknown biome type :" + key + " in palette. Are you missing a mod or using a schematic made in a newer version of Minecraft?");
        }
        Tag idTag = palettePart.getValue();
        if (!(idTag instanceof IntTag)) {
            throw new IOException("Biome mapped to non-Int tag.");
        }
        palette.put(((IntTag) idTag).getValue(), biome);
    }
    int width = clipboard.getDimensions().getX();
    byte[] biomes = dataTag.getValue();
    int biomeIndex = 0;
    int biomeJ = 0;
    int bVal;
    int varIntLength;
    BlockVector3 min = clipboard.getMinimumPoint();
    while (biomeJ < biomes.length) {
        bVal = 0;
        varIntLength = 0;
        while (true) {
            bVal |= (biomes[biomeJ] & 127) << (varIntLength++ * 7);
            if (varIntLength > 5) {
                throw new IOException("VarInt too big (probably corrupted data)");
            }
            if (((biomes[biomeJ] & 128) != 128)) {
                biomeJ++;
                break;
            }
            biomeJ++;
        }
        int z = biomeIndex / width;
        int x = biomeIndex % width;
        BiomeType type = palette.get(bVal);
        for (int y = 0; y < clipboard.getRegion().getHeight(); y++) {
            clipboard.setBiome(min.add(x, y, z), type);
        }
        biomeIndex++;
    }
}
Also used : HashMap(java.util.HashMap) IOException(java.io.IOException) BlockVector3(com.sk89q.worldedit.math.BlockVector3) BiomeType(com.sk89q.worldedit.world.biome.BiomeType) StringTag(com.sk89q.jnbt.StringTag) ShortTag(com.sk89q.jnbt.ShortTag) IntArrayTag(com.sk89q.jnbt.IntArrayTag) ListTag(com.sk89q.jnbt.ListTag) IntTag(com.sk89q.jnbt.IntTag) NamedTag(com.sk89q.jnbt.NamedTag) ByteArrayTag(com.sk89q.jnbt.ByteArrayTag) CompoundTag(com.sk89q.jnbt.CompoundTag) Tag(com.sk89q.jnbt.Tag) IntTag(com.sk89q.jnbt.IntTag) CompoundTag(com.sk89q.jnbt.CompoundTag) ByteArrayTag(com.sk89q.jnbt.ByteArrayTag)

Example 2 with ByteArrayTag

use of com.sk89q.jnbt.ByteArrayTag in project FastAsyncWorldEdit by IntellectualSites.

the class SpongeSchematicWriter method writeBiomes.

private void writeBiomes(Clipboard clipboard, Map<String, Tag> schematic) {
    BlockVector3 min = clipboard.getMinimumPoint();
    int width = clipboard.getRegion().getWidth();
    int length = clipboard.getRegion().getLength();
    ByteArrayOutputStream buffer = new ByteArrayOutputStream(width * length);
    int paletteMax = 0;
    Map<String, Integer> palette = new HashMap<>();
    for (int z = 0; z < length; z++) {
        int z0 = min.getBlockZ() + z;
        for (int x = 0; x < width; x++) {
            int x0 = min.getBlockX() + x;
            BlockVector3 pt = BlockVector3.at(x0, min.getBlockY(), z0);
            BiomeType biome = clipboard.getBiome(pt);
            String biomeKey = biome.getId();
            int biomeId;
            if (palette.containsKey(biomeKey)) {
                biomeId = palette.get(biomeKey);
            } else {
                biomeId = paletteMax;
                palette.put(biomeKey, biomeId);
                paletteMax++;
            }
            while ((biomeId & -128) != 0) {
                buffer.write(biomeId & 127 | 128);
                biomeId >>>= 7;
            }
            buffer.write(biomeId);
        }
    }
    schematic.put("BiomePaletteMax", new IntTag(paletteMax));
    Map<String, Tag> paletteTag = new HashMap<>();
    palette.forEach((key, value) -> paletteTag.put(key, new IntTag(value)));
    schematic.put("BiomePalette", new CompoundTag(paletteTag));
    schematic.put("BiomeData", new ByteArrayTag(buffer.toByteArray()));
}
Also used : HashMap(java.util.HashMap) ByteArrayOutputStream(java.io.ByteArrayOutputStream) BlockVector3(com.sk89q.worldedit.math.BlockVector3) BiomeType(com.sk89q.worldedit.world.biome.BiomeType) StringTag(com.sk89q.jnbt.StringTag) ShortTag(com.sk89q.jnbt.ShortTag) IntArrayTag(com.sk89q.jnbt.IntArrayTag) ListTag(com.sk89q.jnbt.ListTag) IntTag(com.sk89q.jnbt.IntTag) ByteArrayTag(com.sk89q.jnbt.ByteArrayTag) CompoundTag(com.sk89q.jnbt.CompoundTag) Tag(com.sk89q.jnbt.Tag) IntTag(com.sk89q.jnbt.IntTag) CompoundTag(com.sk89q.jnbt.CompoundTag) ByteArrayTag(com.sk89q.jnbt.ByteArrayTag)

Example 3 with ByteArrayTag

use of com.sk89q.jnbt.ByteArrayTag in project FastAsyncWorldEdit by IntellectualSites.

the class SpongeSchematicWriter method write2.

/**
 * Writes a version 2 schematic file.
 *
 * @param clipboard The clipboard
 * @return The schematic map
 */
private Map<String, Tag> write2(Clipboard clipboard) {
    Region region = clipboard.getRegion();
    BlockVector3 origin = clipboard.getOrigin();
    BlockVector3 min = region.getMinimumPoint();
    BlockVector3 offset = min.subtract(origin);
    int width = region.getWidth();
    int height = region.getHeight();
    int length = region.getLength();
    if (width > MAX_SIZE) {
        throw new IllegalArgumentException("Width of region too large for a .schematic");
    }
    if (height > MAX_SIZE) {
        throw new IllegalArgumentException("Height of region too large for a .schematic");
    }
    if (length > MAX_SIZE) {
        throw new IllegalArgumentException("Length of region too large for a .schematic");
    }
    Map<String, Tag> schematic = new HashMap<>();
    schematic.put("Version", new IntTag(CURRENT_VERSION));
    schematic.put("DataVersion", new IntTag(WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getDataVersion()));
    Map<String, Tag> metadata = new HashMap<>();
    metadata.put("WEOffsetX", new IntTag(offset.getBlockX()));
    metadata.put("WEOffsetY", new IntTag(offset.getBlockY()));
    metadata.put("WEOffsetZ", new IntTag(offset.getBlockZ()));
    metadata.put("FAWEVersion", new IntTag(Fawe.instance().getVersion().build));
    schematic.put("Metadata", new CompoundTag(metadata));
    schematic.put("Width", new ShortTag((short) width));
    schematic.put("Height", new ShortTag((short) height));
    schematic.put("Length", new ShortTag((short) length));
    // The Sponge format Offset refers to the 'min' points location in the world. That's our 'Origin'
    schematic.put("Offset", new IntArrayTag(new int[] { min.getBlockX(), min.getBlockY(), min.getBlockZ() }));
    int paletteMax = 0;
    Map<String, Integer> palette = new HashMap<>();
    List<CompoundTag> tileEntities = new ArrayList<>();
    ByteArrayOutputStream buffer = new ByteArrayOutputStream(width * height * length);
    for (int y = 0; y < height; y++) {
        int y0 = min.getBlockY() + y;
        for (int z = 0; z < length; z++) {
            int z0 = min.getBlockZ() + z;
            for (int x = 0; x < width; x++) {
                int x0 = min.getBlockX() + x;
                BlockVector3 point = BlockVector3.at(x0, y0, z0);
                BaseBlock block = clipboard.getFullBlock(point);
                if (block.getNbtData() != null) {
                    Map<String, Tag> values = new HashMap<>(block.getNbtData().getValue());
                    // Remove 'id' if it exists. We want 'Id'
                    values.remove("id");
                    // Positions are kept in NBT, we don't want that.
                    values.remove("x");
                    values.remove("y");
                    values.remove("z");
                    values.put("Id", new StringTag(block.getNbtId()));
                    values.put("Pos", new IntArrayTag(new int[] { x, y, z }));
                    tileEntities.add(new CompoundTag(values));
                }
                String blockKey = block.toImmutableState().getAsString();
                int blockId;
                if (palette.containsKey(blockKey)) {
                    blockId = palette.get(blockKey);
                } else {
                    blockId = paletteMax;
                    palette.put(blockKey, blockId);
                    paletteMax++;
                }
                while ((blockId & -128) != 0) {
                    buffer.write(blockId & 127 | 128);
                    blockId >>>= 7;
                }
                buffer.write(blockId);
            }
        }
    }
    schematic.put("PaletteMax", new IntTag(paletteMax));
    Map<String, Tag> paletteTag = new HashMap<>();
    palette.forEach((key, value) -> paletteTag.put(key, new IntTag(value)));
    schematic.put("Palette", new CompoundTag(paletteTag));
    schematic.put("BlockData", new ByteArrayTag(buffer.toByteArray()));
    schematic.put("BlockEntities", new ListTag(CompoundTag.class, tileEntities));
    // version 2 stuff
    if (clipboard.hasBiomes()) {
        writeBiomes(clipboard, schematic);
    }
    if (!clipboard.getEntities().isEmpty()) {
        writeEntities(clipboard, schematic);
    }
    return schematic;
}
Also used : StringTag(com.sk89q.jnbt.StringTag) IntArrayTag(com.sk89q.jnbt.IntArrayTag) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ByteArrayOutputStream(java.io.ByteArrayOutputStream) BlockVector3(com.sk89q.worldedit.math.BlockVector3) BaseBlock(com.sk89q.worldedit.world.block.BaseBlock) ListTag(com.sk89q.jnbt.ListTag) ShortTag(com.sk89q.jnbt.ShortTag) Region(com.sk89q.worldedit.regions.Region) StringTag(com.sk89q.jnbt.StringTag) ShortTag(com.sk89q.jnbt.ShortTag) IntArrayTag(com.sk89q.jnbt.IntArrayTag) ListTag(com.sk89q.jnbt.ListTag) IntTag(com.sk89q.jnbt.IntTag) ByteArrayTag(com.sk89q.jnbt.ByteArrayTag) CompoundTag(com.sk89q.jnbt.CompoundTag) Tag(com.sk89q.jnbt.Tag) IntTag(com.sk89q.jnbt.IntTag) CompoundTag(com.sk89q.jnbt.CompoundTag) ByteArrayTag(com.sk89q.jnbt.ByteArrayTag)

Aggregations

ByteArrayTag (com.sk89q.jnbt.ByteArrayTag)3 CompoundTag (com.sk89q.jnbt.CompoundTag)3 IntArrayTag (com.sk89q.jnbt.IntArrayTag)3 IntTag (com.sk89q.jnbt.IntTag)3 ListTag (com.sk89q.jnbt.ListTag)3 ShortTag (com.sk89q.jnbt.ShortTag)3 StringTag (com.sk89q.jnbt.StringTag)3 Tag (com.sk89q.jnbt.Tag)3 BlockVector3 (com.sk89q.worldedit.math.BlockVector3)3 HashMap (java.util.HashMap)3 BiomeType (com.sk89q.worldedit.world.biome.BiomeType)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)2 NamedTag (com.sk89q.jnbt.NamedTag)1 Region (com.sk89q.worldedit.regions.Region)1 BaseBlock (com.sk89q.worldedit.world.block.BaseBlock)1 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1