/** * 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.builders.patterns; import net.minecraft.world.World; import buildcraft.api.blueprints.SchematicMask; import buildcraft.api.statements.IStatementParameter; import buildcraft.core.Box; import buildcraft.core.blueprints.Template; public class PatternPyramid extends FillerPattern { private static final int[] MODIFIERS = { 0x0101, 0x1101, 0x1001, 0x0111, 0x1111, 0x1011, 0x0110, 0x1110, 0x1010 }; public PatternPyramid() { super("pyramid"); } @Override public int maxParameters() { return 2; } @Override public int minParameters() { return 2; } @Override public IStatementParameter createParameter(int index) { return index == 1 ? new PatternParameterCenter(4) : new PatternParameterYDir(true); } @Override public Template getTemplate(Box box, World world, IStatementParameter[] parameters) { int xMin = (int) box.pMin().x; int yMin = (int) box.pMin().y; int zMin = (int) box.pMin().z; int xMax = (int) box.pMax().x; int yMax = (int) box.pMax().y; int zMax = (int) box.pMax().z; Template bpt = new Template(xMax - xMin + 1, yMax - yMin + 1, zMax - zMin + 1); int[] modifiers = new int[4]; int height; int stepY; if (parameters.length >= 1 && parameters[0] != null && !(((PatternParameterYDir) parameters[0]).up)) { stepY = -1; } else { stepY = 1; } int center = 4; if (parameters.length >= 2 && parameters[1] != null) { center = ((PatternParameterCenter) parameters[1]).getDirection(); } modifiers[0] = (MODIFIERS[center] >> 12) & 1; modifiers[1] = (MODIFIERS[center] >> 8) & 1; modifiers[2] = (MODIFIERS[center] >> 4) & 1; modifiers[3] = (MODIFIERS[center]) & 1; if (stepY == 1) { height = yMin; } else { height = yMax; } int x1 = xMin; int x2 = xMax; int z1 = zMin; int z2 = zMax; while (height >= yMin && height <= yMax) { for (int x = x1; x <= x2; ++x) { for (int z = z1; z <= z2; ++z) { bpt.put(x - xMin, height - yMin, z - zMin, new SchematicMask(true)); } } x1 += modifiers[0]; x2 -= modifiers[1]; z1 += modifiers[2]; z2 -= modifiers[3]; height += stepY; if (x1 > x2 || z1 > z2) { break; } } return bpt; } }