/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * BuildCraft is distributed under the terms of the Minecraft Mod Public * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.core.blueprints; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.SchematicMask; import buildcraft.api.core.BuildCraftAPI; import buildcraft.core.lib.utils.NBTUtils; /** * Use the template system to describe fillers */ public class Template extends BlueprintBase { public Template() { id.extension = "tpl"; } public Template(int sizeX, int sizeY, int sizeZ) { super(sizeX, sizeY, sizeZ); id.extension = "tpl"; } @Override public void readFromWorld(IBuilderContext context, TileEntity anchorTile, int x, int y, int z) { int posX = (int) (x - context.surroundingBox().pMin().x); int posY = (int) (y - context.surroundingBox().pMin().y); int posZ = (int) (z - context.surroundingBox().pMin().z); if (!BuildCraftAPI.isSoftBlock(anchorTile.getWorldObj(), x, y, z)) { put(posX, posY, posZ, new SchematicMask(true)); } } @Override public void saveContents(NBTTagCompound nbt) { // Note: this way of storing data is suboptimal, we really need a bit // per mask entry, not a byte. However, this is fine, as compression // will fix it. byte[] data = new byte[sizeX * sizeY * sizeZ]; int ind = 0; for (int x = 0; x < sizeX; ++x) { for (int y = 0; y < sizeY; ++y) { for (int z = 0; z < sizeZ; ++z) { data[ind] = (byte) ((get(x, y, z) == null) ? 0 : 1); ind++; } } } nbt.setByteArray("mask", data); } @Override public void loadContents(NBTTagCompound nbt) throws BptError { byte[] data = nbt.getByteArray("mask"); int ind = 0; for (int x = 0; x < sizeX; ++x) { for (int y = 0; y < sizeY; ++y) { for (int z = 0; z < sizeZ; ++z) { if (data[ind] == 1) { put(x, y, z, new SchematicMask(true)); } ind++; } } } } @Override public ItemStack getStack() { Item item = (Item) Item.itemRegistry.getObject("BuildCraft|Builders:templateItem"); ItemStack stack = new ItemStack(item, 1); NBTTagCompound nbt = NBTUtils.getItemData(stack); id.write(nbt); nbt.setString("author", author); nbt.setString("name", id.name); return stack; } }