Added color modifier support to Facades

This commit is contained in:
CovertJaguar 2013-06-30 23:21:55 -07:00
parent 8867512f38
commit 3cdcf094db
3 changed files with 226 additions and 204 deletions

View file

@ -1,12 +1,10 @@
/** /**
* Copyright (c) SpaceToad, 2011 * Copyright (c) SpaceToad, 2011 http://www.mod-buildcraft.com
* http://www.mod-buildcraft.com
* *
* BuildCraft is distributed under the terms of the Minecraft Mod Public * BuildCraft is distributed under the terms of the Minecraft Mod Public License
* License 1.0, or MMPL. Please check the contents of the license located in * 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt * http://www.mod-buildcraft.com/MMPL-1.0.txt
*/ */
package buildcraft.transport; package buildcraft.transport;
import java.util.ArrayList; import java.util.ArrayList;
@ -51,27 +49,26 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
public class BlockGenericPipe extends BlockContainer { public class BlockGenericPipe extends BlockContainer {
static enum Part { static enum Part {
Pipe, Pipe,
Gate Gate
} }
static class RaytraceResult { static class RaytraceResult {
RaytraceResult(Part hitPart, MovingObjectPosition movingObjectPosition) { RaytraceResult(Part hitPart, MovingObjectPosition movingObjectPosition) {
this.hitPart = hitPart; this.hitPart = hitPart;
this.movingObjectPosition = movingObjectPosition; this.movingObjectPosition = movingObjectPosition;
} }
public Part hitPart; public Part hitPart;
public MovingObjectPosition movingObjectPosition; public MovingObjectPosition movingObjectPosition;
} }
private static Random rand = new Random(); private static Random rand = new Random();
private boolean skippedFirstIconRegister; private boolean skippedFirstIconRegister;
/* Defined subprograms ************************************************* */ /* Defined subprograms ************************************************* */
public BlockGenericPipe(int i) { public BlockGenericPipe(int i) {
super(i, Material.glass); super(i, Material.glass);
@ -263,15 +260,15 @@ public class BlockGenericPipe extends BlockContainer {
double pitch = Math.toRadians(entityPlayer.rotationPitch); double pitch = Math.toRadians(entityPlayer.rotationPitch);
double yaw = Math.toRadians(entityPlayer.rotationYaw); double yaw = Math.toRadians(entityPlayer.rotationYaw);
double dirX = -Math.sin(yaw) * Math.cos(pitch); double dirX = -Math.sin(yaw) * Math.cos(pitch);
double dirY = -Math.sin(pitch); double dirY = -Math.sin(pitch);
double dirZ = Math.cos(yaw) * Math.cos(pitch); double dirZ = Math.cos(yaw) * Math.cos(pitch);
double reachDistance = 5; double reachDistance = 5;
if (entityPlayer instanceof EntityPlayerMP) { if (entityPlayer instanceof EntityPlayerMP) {
reachDistance = ((EntityPlayerMP) entityPlayer).theItemInWorldManager.getBlockReachDistance(); reachDistance = ((EntityPlayerMP) entityPlayer).theItemInWorldManager.getBlockReachDistance();
} }
Vec3 origin = Vec3.fakePool.getVecFromPool(entityPlayer.posX, entityPlayer.posY + 1.62 - entityPlayer.yOffset, entityPlayer.posZ); Vec3 origin = Vec3.fakePool.getVecFromPool(entityPlayer.posX, entityPlayer.posY + 1.62 - entityPlayer.yOffset, entityPlayer.posZ);
Vec3 direction = origin.addVector(dirX * reachDistance, dirY * reachDistance, dirZ * reachDistance); Vec3 direction = origin.addVector(dirX * reachDistance, dirY * reachDistance, dirZ * reachDistance);
@ -290,9 +287,10 @@ public class BlockGenericPipe extends BlockContainer {
} }
/** /**
* pipe hits along x, y, and z axis, gate (all 6 sides) [and wires+facades] * pipe hits along x, y, and z axis, gate (all 6 sides) [and
* wires+facades]
*/ */
MovingObjectPosition[] hits = new MovingObjectPosition[] { null, null, null, null, null, null, null, null, null }; MovingObjectPosition[] hits = new MovingObjectPosition[]{null, null, null, null, null, null, null, null, null};
boolean needAxisCheck = false; boolean needAxisCheck = false;
boolean needCenterCheck = true; boolean needCenterCheck = true;
@ -390,7 +388,8 @@ public class BlockGenericPipe extends BlockContainer {
for (int i = 0; i < hits.length; i++) { for (int i = 0; i < hits.length; i++) {
MovingObjectPosition hit = hits[i]; MovingObjectPosition hit = hits[i];
if (hit == null) continue; if (hit == null)
continue;
double lengthSquared = hit.hitVec.squareDistanceTo(origin); double lengthSquared = hit.hitVec.squareDistanceTo(origin);
@ -424,24 +423,24 @@ public class BlockGenericPipe extends BlockContainer {
float max = Utils.pipeMaxPos - 0.05F; float max = Utils.pipeMaxPos - 0.05F;
switch (dir) { switch (dir) {
case DOWN: case DOWN:
setBlockBounds(min, Utils.pipeMinPos - 0.10F, min, max, Utils.pipeMinPos, max); setBlockBounds(min, Utils.pipeMinPos - 0.10F, min, max, Utils.pipeMinPos, max);
break; break;
case UP: case UP:
setBlockBounds(min, Utils.pipeMaxPos, min, max, Utils.pipeMaxPos + 0.10F, max); setBlockBounds(min, Utils.pipeMaxPos, min, max, Utils.pipeMaxPos + 0.10F, max);
break; break;
case NORTH: case NORTH:
setBlockBounds(min, min, Utils.pipeMinPos - 0.10F, max, max, Utils.pipeMinPos); setBlockBounds(min, min, Utils.pipeMinPos - 0.10F, max, max, Utils.pipeMinPos);
break; break;
case SOUTH: case SOUTH:
setBlockBounds(min, min, Utils.pipeMaxPos, max, max, Utils.pipeMaxPos + 0.10F); setBlockBounds(min, min, Utils.pipeMaxPos, max, max, Utils.pipeMaxPos + 0.10F);
break; break;
case WEST: case WEST:
setBlockBounds(Utils.pipeMinPos - 0.10F, min, min, Utils.pipeMinPos, max, max); setBlockBounds(Utils.pipeMinPos - 0.10F, min, min, Utils.pipeMinPos, max, max);
break; break;
case EAST: case EAST:
setBlockBounds(Utils.pipeMaxPos, min, min, Utils.pipeMaxPos + 0.10F, max, max); setBlockBounds(Utils.pipeMaxPos, min, min, Utils.pipeMaxPos + 0.10F, max, max);
break; break;
} }
} }
@ -503,6 +502,7 @@ public class BlockGenericPipe extends BlockContainer {
} }
return list; return list;
} }
public TileEntity createNewTileEntity(World var1) { public TileEntity createNewTileEntity(World var1) {
return new TileGenericPipe(); return new TileGenericPipe();
} }
@ -554,7 +554,6 @@ public class BlockGenericPipe extends BlockContainer {
} }
/* Wrappers ************************************************************ */ /* Wrappers ************************************************************ */
@Override @Override
public void onNeighborBlockChange(World world, int x, int y, int z, int l) { public void onNeighborBlockChange(World world, int x, int y, int z, int l) {
super.onNeighborBlockChange(world, x, y, z, l); super.onNeighborBlockChange(world, x, y, z, l);
@ -607,7 +606,6 @@ public class BlockGenericPipe extends BlockContainer {
return stripEquipment(pipe); return stripEquipment(pipe);
} else if (entityplayer.getCurrentEquippedItem() == null) { } else if (entityplayer.getCurrentEquippedItem() == null) {
// Fall through the end of the test // Fall through the end of the test
} else if (entityplayer.getCurrentEquippedItem().itemID == Item.sign.itemID) } else if (entityplayer.getCurrentEquippedItem().itemID == Item.sign.itemID)
// Sign will be placed anyway, so lets show the sign gui // Sign will be placed anyway, so lets show the sign gui
@ -694,7 +692,7 @@ public class BlockGenericPipe extends BlockContainer {
private boolean stripEquipment(Pipe pipe) { private boolean stripEquipment(Pipe pipe) {
// Try to strip wires first, starting with yellow. // Try to strip wires first, starting with yellow.
for (IPipe.WireColor color : IPipe.WireColor.values()) for (IPipe.WireColor color : IPipe.WireColor.values()) {
if (pipe.wireSet[color.reverse().ordinal()]) { if (pipe.wireSet[color.reverse().ordinal()]) {
if (!CoreProxy.proxy.isRenderWorld(pipe.worldObj)) { if (!CoreProxy.proxy.isRenderWorld(pipe.worldObj)) {
dropWire(color.reverse(), pipe.worldObj, pipe.xCoord, pipe.yCoord, pipe.zCoord); dropWire(color.reverse(), pipe.worldObj, pipe.xCoord, pipe.yCoord, pipe.zCoord);
@ -704,6 +702,7 @@ public class BlockGenericPipe extends BlockContainer {
pipe.container.scheduleRenderUpdate(); pipe.container.scheduleRenderUpdate();
return true; return true;
} }
}
// Try to strip gate next // Try to strip gate next
if (pipe.hasGate()) { if (pipe.hasGate()) {
@ -726,23 +725,23 @@ public class BlockGenericPipe extends BlockContainer {
Item wireItem; Item wireItem;
switch (color) { switch (color) {
case Red: case Red:
wireItem = BuildCraftTransport.redPipeWire; wireItem = BuildCraftTransport.redPipeWire;
break; break;
case Blue: case Blue:
wireItem = BuildCraftTransport.bluePipeWire; wireItem = BuildCraftTransport.bluePipeWire;
break; break;
case Green: case Green:
wireItem = BuildCraftTransport.greenPipeWire; wireItem = BuildCraftTransport.greenPipeWire;
break; break;
default: default:
wireItem = BuildCraftTransport.yellowPipeWire; wireItem = BuildCraftTransport.yellowPipeWire;
} }
Utils.dropItems(world, new ItemStack(wireItem), i, j, k); Utils.dropItems(world, new ItemStack(wireItem), i, j, k);
} }
@SuppressWarnings({ "all" }) @SuppressWarnings({"all"})
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public Icon getBlockTexture(IBlockAccess iblockaccess, int i, int j, int k, int l) { public Icon getBlockTexture(IBlockAccess iblockaccess, int i, int j, int k, int l) {
@ -811,7 +810,7 @@ public class BlockGenericPipe extends BlockContainer {
return 0; return 0;
} }
@SuppressWarnings({ "all" }) @SuppressWarnings({"all"})
@Override @Override
public void randomDisplayTick(World world, int i, int j, int k, Random random) { public void randomDisplayTick(World world, int i, int j, int k, Random random) {
Pipe pipe = getPipe(world, i, j, k); Pipe pipe = getPipe(world, i, j, k);
@ -822,9 +821,7 @@ public class BlockGenericPipe extends BlockContainer {
} }
/* Registration ******************************************************** */ /* Registration ******************************************************** */
public static Map<Integer, Class<? extends Pipe>> pipes = new HashMap<Integer, Class<? extends Pipe>>(); public static Map<Integer, Class<? extends Pipe>> pipes = new HashMap<Integer, Class<? extends Pipe>>();
static long lastRemovedDate = -1; static long lastRemovedDate = -1;
public static Map<BlockIndex, Pipe> pipeRemoved = new HashMap<BlockIndex, Pipe>(); public static Map<BlockIndex, Pipe> pipeRemoved = new HashMap<BlockIndex, Pipe>();
@ -899,17 +896,16 @@ public class BlockGenericPipe extends BlockContainer {
@Override @Override
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public void registerIcons(IconRegister iconRegister) public void registerIcons(IconRegister iconRegister) {
{ if (!skippedFirstIconRegister) {
if (!skippedFirstIconRegister){
skippedFirstIconRegister = true; skippedFirstIconRegister = true;
return; return;
} }
BuildCraftTransport.instance.gateIconProvider.registerIcons(iconRegister); BuildCraftTransport.instance.gateIconProvider.registerIcons(iconRegister);
BuildCraftTransport.instance.wireIconProvider.registerIcons(iconRegister); BuildCraftTransport.instance.wireIconProvider.registerIcons(iconRegister);
for (int i : pipes.keySet()){ for (int i : pipes.keySet()) {
Pipe dummyPipe = createPipe(i); Pipe dummyPipe = createPipe(i);
if (dummyPipe != null){ if (dummyPipe != null) {
dummyPipe.getIconProvider().registerIcons(iconRegister); dummyPipe.getIconProvider().registerIcons(iconRegister);
} }
} }
@ -922,102 +918,113 @@ public class BlockGenericPipe extends BlockContainer {
} }
/** /**
* Spawn a digging particle effect in the world, this is a wrapper around * Spawn a digging particle effect in the world, this is a wrapper around
* EffectRenderer.addBlockHitEffects to allow the block more control over * EffectRenderer.addBlockHitEffects to allow the block more control over
* the particles. Useful when you have entirely different texture sheets for * the particles. Useful when you have entirely different texture sheets for
* different sides/locations in the world. * different sides/locations in the world.
* *
* @param world The current world * @param world The current world
* @param target The target the player is looking at {x/y/z/side/sub} * @param target The target the player is looking at {x/y/z/side/sub}
* @param effectRenderer A reference to the current effect renderer. * @param effectRenderer A reference to the current effect renderer.
* @return True to prevent vanilla digging particles form spawning. * @return True to prevent vanilla digging particles form spawning.
*/ */
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
@Override @Override
public boolean addBlockHitEffects(World worldObj, MovingObjectPosition target, EffectRenderer effectRenderer) { public boolean addBlockHitEffects(World worldObj, MovingObjectPosition target, EffectRenderer effectRenderer) {
int x = target.blockX; int x = target.blockX;
int y = target.blockY; int y = target.blockY;
int z = target.blockZ; int z = target.blockZ;
Pipe pipe = getPipe(worldObj, x, y, z); Pipe pipe = getPipe(worldObj, x, y, z);
if (pipe == null) return false; if (pipe == null)
return false;
Icon icon = pipe.getIconProvider().getIcon(pipe.getIconIndexForItem()); Icon icon = pipe.getIconProvider().getIcon(pipe.getIconIndexForItem());
int sideHit = target.sideHit; int sideHit = target.sideHit;
Block block = BuildCraftTransport.genericPipeBlock; Block block = BuildCraftTransport.genericPipeBlock;
float b = 0.1F; float b = 0.1F;
double px = x + rand.nextDouble() * (block.getBlockBoundsMaxX() - block.getBlockBoundsMinX() - (b * 2.0F)) + b + block.getBlockBoundsMinX(); double px = x + rand.nextDouble() * (block.getBlockBoundsMaxX() - block.getBlockBoundsMinX() - (b * 2.0F)) + b + block.getBlockBoundsMinX();
double py = y + rand.nextDouble() * (block.getBlockBoundsMaxY() - block.getBlockBoundsMinY() - (b * 2.0F)) + b + block.getBlockBoundsMinY(); double py = y + rand.nextDouble() * (block.getBlockBoundsMaxY() - block.getBlockBoundsMinY() - (b * 2.0F)) + b + block.getBlockBoundsMinY();
double pz = z + rand.nextDouble() * (block.getBlockBoundsMaxZ() - block.getBlockBoundsMinZ() - (b * 2.0F)) + b + block.getBlockBoundsMinZ(); double pz = z + rand.nextDouble() * (block.getBlockBoundsMaxZ() - block.getBlockBoundsMinZ() - (b * 2.0F)) + b + block.getBlockBoundsMinZ();
if (sideHit == 0) { if (sideHit == 0) {
py = (double) y + block.getBlockBoundsMinY() - (double) b; py = (double) y + block.getBlockBoundsMinY() - (double) b;
} }
if (sideHit == 1) { if (sideHit == 1) {
py = (double) y + block.getBlockBoundsMaxY() + (double) b; py = (double) y + block.getBlockBoundsMaxY() + (double) b;
} }
if (sideHit == 2) { if (sideHit == 2) {
pz = (double) z + block.getBlockBoundsMinZ() - (double) b; pz = (double) z + block.getBlockBoundsMinZ() - (double) b;
} }
if (sideHit == 3) { if (sideHit == 3) {
pz = (double) z + block.getBlockBoundsMaxZ() + (double) b; pz = (double) z + block.getBlockBoundsMaxZ() + (double) b;
} }
if (sideHit == 4) { if (sideHit == 4) {
px = (double) x + block.getBlockBoundsMinX() - (double) b; px = (double) x + block.getBlockBoundsMinX() - (double) b;
} }
if (sideHit == 5) { if (sideHit == 5) {
px = (double) x + block.getBlockBoundsMaxX() + (double) b; px = (double) x + block.getBlockBoundsMaxX() + (double) b;
} }
EntityDiggingFX fx = new EntityDiggingFX(worldObj, px, py, pz, 0.0D, 0.0D, 0.0D, block, sideHit, worldObj.getBlockMetadata(x, y, z), Minecraft.getMinecraft().renderEngine); EntityDiggingFX fx = new EntityDiggingFX(worldObj, px, py, pz, 0.0D, 0.0D, 0.0D, block, sideHit, worldObj.getBlockMetadata(x, y, z), Minecraft.getMinecraft().renderEngine);
fx.setParticleIcon(Minecraft.getMinecraft().renderEngine, icon); fx.setParticleIcon(Minecraft.getMinecraft().renderEngine, icon);
effectRenderer.addEffect(fx.func_70596_a(x, y, z).multiplyVelocity(0.2F).multipleParticleScaleBy(0.6F)); effectRenderer.addEffect(fx.func_70596_a(x, y, z).multiplyVelocity(0.2F).multipleParticleScaleBy(0.6F));
return true; return true;
} }
/** /**
* Spawn particles for when the block is destroyed. Due to the nature of how * Spawn particles for when the block is destroyed. Due to the nature of how
* this is invoked, the x/y/z locations are not always guaranteed to host * this is invoked, the x/y/z locations are not always guaranteed to host
* your block. So be sure to do proper sanity checks before assuming that * your block. So be sure to do proper sanity checks before assuming that
* the location is this block. * the location is this block.
* *
* @param world The current world * @param world The current world
* @param x X position to spawn the particle * @param x X position to spawn the particle
* @param y Y position to spawn the particle * @param y Y position to spawn the particle
* @param z Z position to spawn the particle * @param z Z position to spawn the particle
* @param meta The metadata for the block before it was destroyed. * @param meta The metadata for the block before it was destroyed.
* @param effectRenderer A reference to the current effect renderer. * @param effectRenderer A reference to the current effect renderer.
* @return True to prevent vanilla break particles from spawning. * @return True to prevent vanilla break particles from spawning.
*/ */
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
@Override @Override
public boolean addBlockDestroyEffects(World worldObj, int x, int y, int z, int meta, EffectRenderer effectRenderer) { public boolean addBlockDestroyEffects(World worldObj, int x, int y, int z, int meta, EffectRenderer effectRenderer) {
Pipe pipe = getPipe(worldObj, x, y, z); Pipe pipe = getPipe(worldObj, x, y, z);
if (pipe == null) return false; if (pipe == null)
return false;
Icon icon = pipe.getIconProvider().getIcon(pipe.getIconIndexForItem()); Icon icon = pipe.getIconProvider().getIcon(pipe.getIconIndexForItem());
byte its = 4; byte its = 4;
for (int i = 0; i < its; ++i) { for (int i = 0; i < its; ++i) {
for (int j = 0; j < its; ++j) { for (int j = 0; j < its; ++j) {
for (int k = 0; k < its; ++k) { for (int k = 0; k < its; ++k) {
double px = x + (i + 0.5D) / (double) its; double px = x + (i + 0.5D) / (double) its;
double py = y + (j + 0.5D) / (double) its; double py = y + (j + 0.5D) / (double) its;
double pz = z + (k + 0.5D) / (double) its; double pz = z + (k + 0.5D) / (double) its;
int random = rand.nextInt(6); int random = rand.nextInt(6);
EntityDiggingFX fx = new EntityDiggingFX(worldObj, px, py, pz, px - x - 0.5D, py - y - 0.5D, pz - z - 0.5D, BuildCraftTransport.genericPipeBlock, random, meta, Minecraft.getMinecraft().renderEngine); EntityDiggingFX fx = new EntityDiggingFX(worldObj, px, py, pz, px - x - 0.5D, py - y - 0.5D, pz - z - 0.5D, BuildCraftTransport.genericPipeBlock, random, meta, Minecraft.getMinecraft().renderEngine);
fx.setParticleIcon(Minecraft.getMinecraft().renderEngine, icon); fx.setParticleIcon(Minecraft.getMinecraft().renderEngine, icon);
effectRenderer.addEffect(fx.func_70596_a(x, y, z)); effectRenderer.addEffect(fx.func_70596_a(x, y, z));
} }
} }
} }
return true; return true;
} }
public static int facadeRenderColor = -1;
@Override
public int colorMultiplier(IBlockAccess world, int x, int y, int z) {
if (facadeRenderColor != -1) {
return facadeRenderColor;
}
return super.colorMultiplier(world, x, y, z);
}
} }

View file

@ -13,6 +13,7 @@ import buildcraft.BuildCraftTransport;
import buildcraft.core.utils.Utils; import buildcraft.core.utils.Utils;
import buildcraft.transport.ItemFacade; import buildcraft.transport.ItemFacade;
import buildcraft.transport.PipeIconProvider; import buildcraft.transport.PipeIconProvider;
import net.minecraft.item.Item;
public class FacadeItemRenderer implements IItemRenderer { public class FacadeItemRenderer implements IItemRenderer {
@ -21,6 +22,15 @@ public class FacadeItemRenderer implements IItemRenderer {
int decodedMeta = ItemFacade.getMetaData(item); int decodedMeta = ItemFacade.getMetaData(item);
int decodedBlockId = ItemFacade.getBlockId(item); int decodedBlockId = ItemFacade.getBlockId(item);
try {
int color = Item.itemsList[decodedBlockId].getColorFromItemStack(new ItemStack(decodedBlockId, 1, decodedMeta), 0);
float r = (float) (color >> 16 & 0xff) / 255F;
float g = (float) (color >> 8 & 0xff) / 255F;
float b = (float) (color & 0xff) / 255F;
GL11.glColor4f(r, g, b, 1.0F);
} catch (Throwable error) {
}
Tessellator tessellator = Tessellator.instance; Tessellator tessellator = Tessellator.instance;
Block block = Block.blocksList[decodedBlockId]; Block block = Block.blocksList[decodedBlockId];
@ -100,14 +110,14 @@ public class FacadeItemRenderer implements IItemRenderer {
@Override @Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) { public boolean handleRenderType(ItemStack item, ItemRenderType type) {
switch (type) { switch (type) {
case ENTITY: case ENTITY:
return true; return true;
case EQUIPPED: case EQUIPPED:
return true; return true;
case INVENTORY: case INVENTORY:
return true; return true;
default: default:
return false; return false;
} }
} }
@ -120,19 +130,18 @@ public class FacadeItemRenderer implements IItemRenderer {
public void renderItem(ItemRenderType type, ItemStack item, Object... data) { public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
switch (type) { switch (type) {
case ENTITY: case ENTITY:
GL11.glScalef(0.50F, 0.50F, 0.50F); GL11.glScalef(0.50F, 0.50F, 0.50F);
renderFacadeItem((RenderBlocks) data[0], item, -0.6F, 0f, -0.6F); renderFacadeItem((RenderBlocks) data[0], item, -0.6F, 0f, -0.6F);
break; break;
case EQUIPPED: case EQUIPPED:
renderFacadeItem((RenderBlocks) data[0], item, 0F, 0F, 0f); renderFacadeItem((RenderBlocks) data[0], item, 0F, 0F, 0f);
break; break;
case INVENTORY: case INVENTORY:
GL11.glScalef(1.1F, 1.1F, 1.1F); GL11.glScalef(1.1F, 1.1F, 1.1F);
renderFacadeItem((RenderBlocks) data[0], item, -0.3f, -0.35f, -0.7f); renderFacadeItem((RenderBlocks) data[0], item, -0.3f, -0.35f, -0.7f);
break; break;
default: default:
} }
} }
} }

View file

@ -10,11 +10,14 @@ import buildcraft.api.core.IIconProvider;
import buildcraft.api.transport.IPipe; import buildcraft.api.transport.IPipe;
import buildcraft.api.transport.IPipe.WireColor; import buildcraft.api.transport.IPipe.WireColor;
import buildcraft.core.utils.Utils; import buildcraft.core.utils.Utils;
import buildcraft.transport.BlockGenericPipe;
import buildcraft.transport.IPipeRenderState; import buildcraft.transport.IPipeRenderState;
import buildcraft.transport.PipeIconProvider; import buildcraft.transport.PipeIconProvider;
import buildcraft.transport.PipeRenderState; import buildcraft.transport.PipeRenderState;
import buildcraft.transport.TransportProxy; import buildcraft.transport.TransportProxy;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
public class PipeWorldRenderer implements ISimpleBlockRenderingHandler { public class PipeWorldRenderer implements ISimpleBlockRenderingHandler {
@ -32,11 +35,11 @@ public class PipeWorldRenderer implements ISimpleBlockRenderingHandler {
} }
/** /**
* Shifts the coordinates around effectivly rotating something. Zero state is DOWN then -> NORTH -> WEST Note - To obtain Pos, do a mirrorY() before * Shifts the coordinates around effectivly rotating something. Zero state
* is DOWN then -> NORTH -> WEST Note - To obtain Pos, do a mirrorY() before
* rotating * rotating
* *
* @param targetArray * @param targetArray the array that should be rotated
* the array that should be rotated
*/ */
private void rotate(float[][] targetArray) { private void rotate(float[][] targetArray) {
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
@ -48,8 +51,7 @@ public class PipeWorldRenderer implements ISimpleBlockRenderingHandler {
} }
/** /**
* @param targetArray * @param targetArray the array that should be transformed
* the array that should be transformed
* @param direction * @param direction
*/ */
private void transform(float[][] targetArray, ForgeDirection direction) { private void transform(float[][] targetArray, ForgeDirection direction) {
@ -65,8 +67,7 @@ public class PipeWorldRenderer implements ISimpleBlockRenderingHandler {
/** /**
* Clones both dimensions of a float[][] * Clones both dimensions of a float[][]
* *
* @param source * @param source the float[][] to deepClone
* the float[][] to deepClone
* @return * @return
*/ */
private float[][] deepClone(float[][] source) { private float[][] deepClone(float[][] source) {
@ -84,7 +85,8 @@ public class PipeWorldRenderer implements ISimpleBlockRenderingHandler {
PipeRenderState state = renderState.getRenderState(); PipeRenderState state = renderState.getRenderState();
IIconProvider icons = renderState.getPipeIcons(); IIconProvider icons = renderState.getPipeIcons();
if (icons == null) return; if (icons == null)
return;
state.currentTexture = icons.getIcon(state.textureMatrix.getTextureIndex(ForgeDirection.UNKNOWN)); state.currentTexture = icons.getIcon(state.textureMatrix.getTextureIndex(ForgeDirection.UNKNOWN));
@ -182,25 +184,28 @@ public class PipeWorldRenderer implements ISimpleBlockRenderingHandler {
zeroState[2][1] = 1.0F; zeroState[2][1] = 1.0F;
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
if (state.facadeMatrix.getFacadeBlockId(direction) != 0) { int facadeId = state.facadeMatrix.getFacadeBlockId(direction);
Block renderBlock = Block.blocksList[state.facadeMatrix.getFacadeBlockId(direction)]; if (facadeId != 0) {
int renderMeta = state.facadeMatrix.getFacadeMetaId(direction); Block renderBlock = Block.blocksList[facadeId];
state.currentTexture = renderBlock.getIcon(direction.ordinal(), renderMeta); int renderMeta = state.facadeMatrix.getFacadeMetaId(direction);
state.currentTexture = renderBlock.getIcon(direction.ordinal(), renderMeta);
if (renderBlock.getRenderType() == 31) { try {
if ((renderMeta & 12) == 4) BlockGenericPipe.facadeRenderColor = Item.itemsList[state.facadeMatrix.getFacadeBlockId(direction)].getColorFromItemStack(new ItemStack(facadeId, 1, renderMeta), 0);
{ } catch (Throwable error) {
renderblocks.uvRotateEast = 1; }
renderblocks.uvRotateWest = 1;
renderblocks.uvRotateTop = 1; if (renderBlock.getRenderType() == 31) {
renderblocks.uvRotateBottom = 1; if ((renderMeta & 12) == 4) {
} renderblocks.uvRotateEast = 1;
else if ((renderMeta & 12) == 8) renderblocks.uvRotateWest = 1;
{ renderblocks.uvRotateTop = 1;
renderblocks.uvRotateSouth = 1; renderblocks.uvRotateBottom = 1;
renderblocks.uvRotateNorth = 1; } else if ((renderMeta & 12) == 8) {
} renderblocks.uvRotateSouth = 1;
} renderblocks.uvRotateNorth = 1;
}
}
// Hollow facade // Hollow facade
if (state.pipeConnectionMatrix.isConnected(direction)) { if (state.pipeConnectionMatrix.isConnected(direction)) {
@ -246,15 +251,17 @@ public class PipeWorldRenderer implements ISimpleBlockRenderingHandler {
renderblocks.renderStandardBlock(block, x, y, z); renderblocks.renderStandardBlock(block, x, y, z);
} }
if (renderBlock.getRenderType() == 31) { if (renderBlock.getRenderType() == 31) {
renderblocks.uvRotateSouth = 0; renderblocks.uvRotateSouth = 0;
renderblocks.uvRotateEast = 0; renderblocks.uvRotateEast = 0;
renderblocks.uvRotateWest = 0; renderblocks.uvRotateWest = 0;
renderblocks.uvRotateNorth = 0; renderblocks.uvRotateNorth = 0;
renderblocks.uvRotateTop = 0; renderblocks.uvRotateTop = 0;
renderblocks.uvRotateBottom = 0; renderblocks.uvRotateBottom = 0;
} }
} }
BlockGenericPipe.facadeRenderColor = -1;
} }
// X START - END // X START - END
@ -310,14 +317,14 @@ public class PipeWorldRenderer implements ISimpleBlockRenderingHandler {
} }
// X START - END // X START - END
zeroState[0][0] = 0.25F + 0.125F/2 + zFightOffset; zeroState[0][0] = 0.25F + 0.125F / 2 + zFightOffset;
zeroState[0][1] = 0.75F - 0.125F/2 + zFightOffset; zeroState[0][1] = 0.75F - 0.125F / 2 + zFightOffset;
// Y START - END // Y START - END
zeroState[1][0] = 0.25F; zeroState[1][0] = 0.25F;
zeroState[1][1] = 0.25F + 0.125F; zeroState[1][1] = 0.25F + 0.125F;
// Z START - END // Z START - END
zeroState[2][0] = 0.25F + 0.125F/2; zeroState[2][0] = 0.25F + 0.125F / 2;
zeroState[2][1] = 0.75F - 0.125F/2; zeroState[2][1] = 0.75F - 0.125F / 2;
state.currentTexture = BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.PipeStructureCobblestone); // Structure Pipe state.currentTexture = BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.PipeStructureCobblestone); // Structure Pipe
@ -503,14 +510,13 @@ public class PipeWorldRenderer implements ISimpleBlockRenderingHandler {
} }
} }
private boolean shouldRenderNormalPipeSide(PipeRenderState state, ForgeDirection direction){ private boolean shouldRenderNormalPipeSide(PipeRenderState state, ForgeDirection direction) {
return !state.pipeConnectionMatrix.isConnected(direction) && state.facadeMatrix.getFacadeBlockId(direction) == 0 && !state.plugMatrix.isConnected(direction); return !state.pipeConnectionMatrix.isConnected(direction) && state.facadeMatrix.getFacadeBlockId(direction) == 0 && !state.plugMatrix.isConnected(direction);
} }
@Override @Override
public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override