Just about done with the Calcinator

This commit is contained in:
pahimar 2014-01-11 18:47:17 -05:00
parent b07d70a84e
commit 07bd30b254
7 changed files with 78 additions and 170 deletions

View file

@ -1,4 +1,4 @@
package com.pahimar.ee3.helper;
package com.pahimar.ee3.client.helper;
import java.util.regex.Pattern;
@ -6,23 +6,6 @@ public class ColourUtils
{
private static final Pattern HEX_COLOUR_PATTERN = Pattern.compile("[0-9a-fA-F]{6}");
@SuppressWarnings("unused")
public static byte[] convertHexColorToByteArray(String hexColor)
{
if (HEX_COLOUR_PATTERN.matcher(hexColor).matches())
{
byte[] colourByteArray = new byte[3];
colourByteArray[0] = (byte) Integer.parseInt(hexColor.substring(0, 2), 16);
colourByteArray[1] = (byte) Integer.parseInt(hexColor.substring(2, 4), 16);
colourByteArray[2] = (byte) Integer.parseInt(hexColor.substring(4, 6), 16);
return colourByteArray;
}
return null;
}
public static byte[] convertIntColourToByteArray(int intColour)
{
byte[] colourByteArray = new byte[3];
@ -45,63 +28,6 @@ public class ColourUtils
return colourFloatArray;
}
public static float[] convertByteArrayToFloatArray(byte[] byteArray)
{
float[] colourFloatArray = new float[3];
colourFloatArray[0] = (float) byteArray[0] / 255F;
colourFloatArray[1] = (float) byteArray[1] / 255F;
colourFloatArray[2] = (float) byteArray[2] / 255F;
return colourFloatArray;
}
@SuppressWarnings("unused")
public static byte[] getBlendedColours(String firstColour, String secondColour)
{
byte[] firstColourByteArray = convertHexColorToByteArray(firstColour);
byte[] secondColourByteArray = convertHexColorToByteArray(secondColour);
if (firstColourByteArray != null && secondColourByteArray != null)
{
return getBlendedColours(firstColourByteArray, secondColourByteArray);
}
else
{
return null;
}
}
@SuppressWarnings("unused")
public static byte[] getBlendedColours(byte[] firstColour, byte[] secondColour)
{
byte[][] blendedColours = getByteBlendedColours(firstColour, secondColour, 3);
if (blendedColours.length == 3)
{
return blendedColours[1];
}
else
{
return null;
}
}
public static byte[][] getByteBlendedColours(String firstColour, String secondColour, int steps)
{
byte[] firstColourByteArray = convertHexColorToByteArray(firstColour);
byte[] secondColourByteArray = convertHexColorToByteArray(secondColour);
if (firstColourByteArray != null && secondColourByteArray != null)
{
return getByteBlendedColours(firstColourByteArray, secondColourByteArray, steps);
}
else
{
return null;
}
}
public static byte[][] getByteBlendedColours(byte[] firstColour, byte[] secondColour, int steps)
{
if (firstColour.length == 3 && secondColour.length == 3 && steps > 0)
@ -150,21 +76,6 @@ public class ColourUtils
}
}
public static float[][] getFloatBlendedColours(String firstColour, String secondColour, int steps)
{
byte[] firstColourByteArray = convertHexColorToByteArray(firstColour);
byte[] secondColourByteArray = convertHexColorToByteArray(secondColour);
if (firstColourByteArray != null && secondColourByteArray != null)
{
return getFloatBlendedColours(firstColourByteArray, secondColourByteArray, steps);
}
else
{
return null;
}
}
public static float[][] getFloatBlendedColours(int firstColour, int secondColour, int steps)
{
byte[] firstColourByteArray = convertIntColourToByteArray(firstColour);

View file

@ -1,7 +1,7 @@
package com.pahimar.ee3.client.renderer.tileentity;
import com.pahimar.ee3.client.helper.ColourUtils;
import com.pahimar.ee3.client.model.ModelCalcinator;
import com.pahimar.ee3.helper.ColourUtils;
import com.pahimar.ee3.lib.Textures;
import com.pahimar.ee3.tileentity.TileCalcinator;
import cpw.mods.fml.client.FMLClientHandler;
@ -55,7 +55,9 @@ public class TileEntityCalcinatorRenderer extends TileEntitySpecialRenderer
// Render
modelCalcinator.renderPart("Calcinator");
if (tileCalcinator.dustStackSize > 0)
int dustStackSize = tileCalcinator.leftStackSize + tileCalcinator.rightStackSize;
if (dustStackSize > 0)
{
GL11.glPushMatrix();
@ -63,15 +65,15 @@ public class TileEntityCalcinatorRenderer extends TileEntitySpecialRenderer
GL11.glRotatef(90F, 1F, 0F, 0F);
GL11.glRotatef(-45F, 0F, 1F, 0F);
float[] dustColour = ColourUtils.convertByteArrayToFloatArray(new byte[]{tileCalcinator.dustColourRedChannel, tileCalcinator.dustColourGreenChannel, tileCalcinator.dustColourBlueChannel});
float[] dustColour = getBlendedDustColour(tileCalcinator.leftStackSize, tileCalcinator.leftStackColour, tileCalcinator.rightStackSize, tileCalcinator.rightStackColour);
GL11.glColor4f(dustColour[0], dustColour[1], dustColour[2], 1F);
if (tileCalcinator.dustStackSize <= 32)
if (dustStackSize <= 32)
{
GL11.glScalef(0.25F, 0.25F, 0.25F);
GL11.glTranslatef(0.0F, 2.20F, -2.1125F);
}
else if (tileCalcinator.dustStackSize <= 64)
else if (dustStackSize <= 64)
{
GL11.glScalef(0.5F, 0.5F, 0.5F);
GL11.glTranslatef(-0.0125F, 0.75F, -0.7125F);
@ -90,4 +92,30 @@ public class TileEntityCalcinatorRenderer extends TileEntitySpecialRenderer
GL11.glPopMatrix();
}
}
private static float[] getBlendedDustColour(int leftStackSize, int leftStackColour, int rightStackSize, int rightStackColour)
{
if (leftStackSize > 0 && rightStackSize > 0)
{
int stackSizeStepRange = 8;
int factoredLeftStackSize = leftStackSize / stackSizeStepRange;
int factoredRightStackSize = rightStackSize / stackSizeStepRange;
float[][] blendedColours = ColourUtils.getFloatBlendedColours(leftStackColour, rightStackColour, 2 * stackSizeStepRange - 1);
return blendedColours[stackSizeStepRange + (factoredLeftStackSize - factoredRightStackSize)];
}
else if (leftStackSize > 0)
{
return ColourUtils.convertIntColourToFloatArray(leftStackColour);
}
else if (rightStackSize > 0)
{
return ColourUtils.convertIntColourToFloatArray(rightStackColour);
}
else
{
return new float[]{1F, 1F, 1F};
}
}
}

View file

@ -16,15 +16,15 @@ public class PacketTileCalcinator extends PacketEE
public byte orientation;
public byte state;
public String customName;
public int dustStackSize;
public byte redChannel, greenChannel, blueChannel;
public int leftStackSize, leftStackColour;
public int rightStackSize, rightStackColour;
public PacketTileCalcinator()
{
super(PacketTypeHandler.TILE_CALCINATOR, true);
}
public PacketTileCalcinator(int x, int y, int z, ForgeDirection orientation, byte state, String customName, int dustStackSize, byte redChannel, byte greenChannel, byte blueChannel)
public PacketTileCalcinator(int x, int y, int z, ForgeDirection orientation, byte state, String customName, int leftStackSize, int leftStackColour, int rightStackSize, int rightStackColour)
{
super(PacketTypeHandler.TILE_CALCINATOR, true);
this.x = x;
@ -33,10 +33,10 @@ public class PacketTileCalcinator extends PacketEE
this.orientation = (byte) orientation.ordinal();
this.state = state;
this.customName = customName;
this.dustStackSize = dustStackSize;
this.redChannel = redChannel;
this.greenChannel = greenChannel;
this.blueChannel = blueChannel;
this.leftStackSize = leftStackSize;
this.leftStackColour = leftStackColour;
this.rightStackSize = rightStackSize;
this.rightStackColour = rightStackColour;
}
@Override
@ -48,10 +48,10 @@ public class PacketTileCalcinator extends PacketEE
data.writeByte(orientation);
data.writeByte(state);
data.writeUTF(customName);
data.writeInt(dustStackSize);
data.writeByte(redChannel);
data.writeByte(greenChannel);
data.writeByte(blueChannel);
data.writeInt(leftStackSize);
data.writeInt(leftStackColour);
data.writeInt(rightStackSize);
data.writeInt(rightStackColour);
}
@Override
@ -63,15 +63,15 @@ public class PacketTileCalcinator extends PacketEE
orientation = data.readByte();
state = data.readByte();
customName = data.readUTF();
dustStackSize = data.readInt();
redChannel = data.readByte();
greenChannel = data.readByte();
blueChannel = data.readByte();
leftStackSize = data.readInt();
leftStackColour = data.readInt();
rightStackSize = data.readInt();
rightStackColour = data.readInt();
}
@Override
public void execute(INetworkManager manager, Player player)
{
EquivalentExchange3.proxy.handleTileCalcinatorPacket(x, y, z, ForgeDirection.getOrientation(orientation), state, customName, dustStackSize, redChannel, greenChannel, blueChannel);
EquivalentExchange3.proxy.handleTileCalcinatorPacket(x, y, z, ForgeDirection.getOrientation(orientation), state, customName, leftStackSize, leftStackColour, rightStackSize, rightStackColour);
}
}

View file

@ -159,7 +159,7 @@ public class ClientProxy extends CommonProxy
}
@Override
public void handleTileCalcinatorPacket(int x, int y, int z, ForgeDirection orientation, byte state, String customName, int dustStackSize, byte redChannel, byte greenChannel, byte blueChannel)
public void handleTileCalcinatorPacket(int x, int y, int z, ForgeDirection orientation, byte state, String customName, int leftStackSize, int leftStackColour, int rightStackSize, int rightStackColour)
{
World world = FMLClientHandler.instance().getClient().theWorld;
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
@ -168,10 +168,10 @@ public class ClientProxy extends CommonProxy
if (tileEntity instanceof TileCalcinator)
{
((TileCalcinator) tileEntity).dustStackSize = dustStackSize;
((TileCalcinator) tileEntity).dustColourRedChannel = redChannel;
((TileCalcinator) tileEntity).dustColourGreenChannel = greenChannel;
((TileCalcinator) tileEntity).dustColourBlueChannel = blueChannel;
((TileCalcinator) tileEntity).leftStackSize = leftStackSize;
((TileCalcinator) tileEntity).leftStackColour = leftStackColour;
((TileCalcinator) tileEntity).rightStackSize = rightStackSize;
((TileCalcinator) tileEntity).rightStackColour = rightStackColour;
world.updateAllLightTypes(x, y, z);
}
}

View file

@ -29,7 +29,7 @@ public interface IProxy
public abstract void handleTileWithItemPacket(int x, int y, int z, ForgeDirection orientation, byte state, String customName, int itemID, int metaData, int stackSize, int color);
public abstract void handleTileCalcinatorPacket(int x, int y, int z, ForgeDirection orientation, byte state, String customName, int dustStackSize, byte redChannel, byte greenChannel, byte blueChannel);
public abstract void handleTileCalcinatorPacket(int x, int y, int z, ForgeDirection orientation, byte state, String customName, int leftStackSize, int leftStackColour, int rightStackSize, int rightStackColour);
public abstract void transmuteBlock(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int sideHit);
}

View file

@ -70,7 +70,7 @@ public class ServerProxy extends CommonProxy
// NOOP
}
public void handleTileCalcinatorPacket(int x, int y, int z, ForgeDirection orientation, byte state, String customName, int dustStackSize, byte redChannel, byte greenChannel, byte blueChannel)
public void handleTileCalcinatorPacket(int x, int y, int z, ForgeDirection orientation, byte state, String customName, int leftStackSize, int leftStackColour, int rightStackSize, int rightStackColour)
{
// NOOP
}

View file

@ -1,6 +1,6 @@
package com.pahimar.ee3.tileentity;
import com.pahimar.ee3.helper.ColourUtils;
import com.pahimar.ee3.lib.Colours;
import com.pahimar.ee3.lib.Strings;
import com.pahimar.ee3.network.PacketTypeHandler;
import com.pahimar.ee3.network.packet.PacketTileCalcinator;
@ -39,8 +39,8 @@ public class TileCalcinator extends TileEE implements IInventory
public int fuelBurnTime; // The fuel value for the currently burning fuel
public int itemCookTime; // How long the current item has been "cooking"
public int dustStackSize;
public byte dustColourRedChannel, dustColourGreenChannel, dustColourBlueChannel;
public int leftStackSize, leftStackColour;
public int rightStackSize, rightStackColour;
public TileCalcinator()
{
@ -215,7 +215,6 @@ public class TileCalcinator extends TileEE implements IInventory
// Start "cooking" a new item, if we can
if (this.deviceCookTime == 0 && this.canCalcinate())
{
// TODO Effect burn speed by fuel quality
this.fuelBurnTime = this.deviceCookTime = TileEntityFurnace.getItemBurnTime(this.inventory[FUEL_INVENTORY_INDEX]);
if (this.deviceCookTime > 0)
@ -263,6 +262,7 @@ public class TileCalcinator extends TileEE implements IInventory
this.onInventoryChanged();
this.state = this.deviceCookTime > 0 ? (byte) 1 : (byte) 0;
this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType().blockID, 1, this.state);
// TODO Send stack sizes and colours on update
}
}
@ -369,56 +369,25 @@ public class TileCalcinator extends TileEE implements IInventory
}
}
public int getCombinedOutputSize()
{
int result = 0;
if (this.inventory[OUTPUT_LEFT_INVENTORY_INDEX] != null)
{
result += this.inventory[OUTPUT_LEFT_INVENTORY_INDEX].stackSize;
}
if (this.inventory[OUTPUT_RIGHT_INVENTORY_INDEX] != null)
{
result += this.inventory[OUTPUT_RIGHT_INVENTORY_INDEX].stackSize;
}
return result;
}
@SideOnly(Side.CLIENT)
public byte[] getBlendedDustColour()
{
if (inventory[OUTPUT_LEFT_INVENTORY_INDEX] != null && inventory[OUTPUT_RIGHT_INVENTORY_INDEX] != null)
{
int leftStackColour = inventory[OUTPUT_LEFT_INVENTORY_INDEX].getItem().getColorFromItemStack(inventory[OUTPUT_LEFT_INVENTORY_INDEX], 1);
int rightStackColour = inventory[OUTPUT_RIGHT_INVENTORY_INDEX].getItem().getColorFromItemStack(inventory[OUTPUT_RIGHT_INVENTORY_INDEX], 1);
int stackSizeStepRange = 8;
int leftStackSize = inventory[OUTPUT_LEFT_INVENTORY_INDEX].stackSize / stackSizeStepRange;
int rightStackSize = inventory[OUTPUT_RIGHT_INVENTORY_INDEX].stackSize / stackSizeStepRange;
byte[][] blendedByteColours = ColourUtils.getByteBlendedColours(ColourUtils.convertIntColourToByteArray(leftStackColour), ColourUtils.convertIntColourToByteArray(rightStackColour), 2 * stackSizeStepRange - 1);
return blendedByteColours[stackSizeStepRange + (leftStackSize - rightStackSize)];
}
else if (inventory[OUTPUT_LEFT_INVENTORY_INDEX] != null)
{
return ColourUtils.convertIntColourToByteArray(inventory[OUTPUT_LEFT_INVENTORY_INDEX].getItem().getColorFromItemStack(inventory[OUTPUT_LEFT_INVENTORY_INDEX], 1));
}
else if (inventory[OUTPUT_RIGHT_INVENTORY_INDEX] != null)
{
return ColourUtils.convertIntColourToByteArray(inventory[OUTPUT_RIGHT_INVENTORY_INDEX].getItem().getColorFromItemStack(inventory[OUTPUT_RIGHT_INVENTORY_INDEX], 1));
}
else
{
return new byte[]{(byte) 255, (byte) 255, (byte) 255};
}
}
@Override
public Packet getDescriptionPacket()
{
byte[] colourChannels = getBlendedDustColour();
return PacketTypeHandler.populatePacket(new PacketTileCalcinator(xCoord, yCoord, zCoord, orientation, state, customName, getCombinedOutputSize(), colourChannels[0], colourChannels[1], colourChannels[2]));
int leftStackSize = 0;
int leftStackColour = Integer.parseInt(Colours.PURE_WHITE, 16);
if (this.inventory[OUTPUT_LEFT_INVENTORY_INDEX] != null)
{
leftStackSize = this.inventory[OUTPUT_LEFT_INVENTORY_INDEX].stackSize;
leftStackColour = this.inventory[OUTPUT_LEFT_INVENTORY_INDEX].getItem().getColorFromItemStack(this.inventory[OUTPUT_LEFT_INVENTORY_INDEX], 1);
}
int rightStackSize = 0;
int rightStackColour = Integer.parseInt(Colours.PURE_WHITE, 16);
if (this.inventory[OUTPUT_RIGHT_INVENTORY_INDEX] != null)
{
rightStackSize = this.inventory[OUTPUT_RIGHT_INVENTORY_INDEX].stackSize;
rightStackColour = this.inventory[OUTPUT_RIGHT_INVENTORY_INDEX].getItem().getColorFromItemStack(this.inventory[OUTPUT_RIGHT_INVENTORY_INDEX], 1);
}
return PacketTypeHandler.populatePacket(new PacketTileCalcinator(xCoord, yCoord, zCoord, orientation, state, customName, leftStackSize, leftStackColour, rightStackSize, rightStackColour));
}
}