Fully Implemented Crafting CPU Monitors

This commit is contained in:
AlgorithmX2
2014-07-10 00:44:01 -05:00
parent 42840d6936
commit d5989750b4
5 changed files with 269 additions and 8 deletions
+13
View File
@@ -6,6 +6,10 @@ import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.AEApi;
import appeng.client.render.BaseBlockRender;
import appeng.client.render.blocks.RenderBlockCraftingMonitor;
import appeng.client.texture.ExtraBlockTextures; import appeng.client.texture.ExtraBlockTextures;
import appeng.tile.crafting.TileCraftingMonitorTile; import appeng.tile.crafting.TileCraftingMonitorTile;
@@ -17,9 +21,18 @@ public class BlockCraftingMonitor extends BlockCraftingUnit
setTileEntiy( TileCraftingMonitorTile.class ); setTileEntiy( TileCraftingMonitorTile.class );
} }
@Override
protected Class<? extends BaseBlockRender> getRenderer()
{
return RenderBlockCraftingMonitor.class;
}
@Override @Override
public IIcon getIcon(int direction, int metadata) public IIcon getIcon(int direction, int metadata)
{ {
if ( direction != ForgeDirection.SOUTH.ordinal() )
return AEApi.instance().blocks().blockCraftingUnit.block().getIcon( direction, metadata );
switch (metadata) switch (metadata)
{ {
default: default:
@@ -9,6 +9,7 @@ import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.AEApi;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.block.crafting.BlockCraftingMonitor; import appeng.block.crafting.BlockCraftingMonitor;
import appeng.block.crafting.BlockCraftingUnit; import appeng.block.crafting.BlockCraftingUnit;
@@ -32,9 +33,7 @@ public class RenderBlockCrafting extends BaseBlockRender
@Override @Override
public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type, Object[] obj) public void renderInventory(AEBaseBlock blk, ItemStack is, RenderBlocks renderer, ItemRenderType type, Object[] obj)
{ {
renderer.setOverrideBlockTexture( blk.getIcon( 0, is.getItemDamage() ) );
super.renderInventory( blk, is, renderer, type, obj ); super.renderInventory( blk, is, renderer, type, obj );
renderer.setOverrideBlockTexture( null );
} }
@Override @Override
@@ -53,7 +52,11 @@ public class RenderBlockCrafting extends BaseBlockRender
int meta = w.getBlockMetadata( x, y, z ) & 3; int meta = w.getBlockMetadata( x, y, z ) & 3;
boolean isMonitor = blk.getClass() == BlockCraftingMonitor.class; boolean isMonitor = blk.getClass() == BlockCraftingMonitor.class;
theIcon = blk.getIcon( 0, meta | (formed ? 8 : 0) ); theIcon = blk.getIcon( ForgeDirection.SOUTH.ordinal(), meta | (formed ? 8 : 0) );
IIcon nonForward = theIcon;
if ( blk instanceof BlockCraftingMonitor )
nonForward = AEApi.instance().blocks().blockCraftingUnit.block().getIcon( 0, meta | (formed ? 8 : 0) );
if ( formed ) if ( formed )
{ {
@@ -97,7 +100,7 @@ public class RenderBlockCrafting extends BaseBlockRender
fso( side, highX, ForgeDirection.EAST ), fso( side, highY, ForgeDirection.UP ), fso( side, highZ, ForgeDirection.SOUTH ) ); fso( side, highX, ForgeDirection.EAST ), fso( side, highY, ForgeDirection.UP ), fso( side, highZ, ForgeDirection.SOUTH ) );
i.prepareBounds( renderer ); i.prepareBounds( renderer );
handleSide( blk, meta, x, y, z, i, renderer, theIcon, emitsLight, isMonitor, side, w ); handleSide( blk, meta, x, y, z, i, renderer, ct.getForward().equals( side ) ? theIcon : nonForward, emitsLight, isMonitor, side, w );
} }
i.setFacesToRender( EnumSet.allOf( ForgeDirection.class ) ); i.setFacesToRender( EnumSet.allOf( ForgeDirection.class ) );
@@ -107,12 +110,10 @@ public class RenderBlockCrafting extends BaseBlockRender
} }
else else
{ {
renderer.setOverrideBlockTexture( theIcon );
double a = 0.0 / 16.0; double a = 0.0 / 16.0;
double o = 16.0 / 16.0; double o = 16.0 / 16.0;
renderer.setRenderBounds( a, a, a, o, o, o ); renderer.setRenderBounds( a, a, a, o, o, o );
boolean out = renderer.renderStandardBlock( blk, x, y, z ); boolean out = renderer.renderStandardBlock( blk, x, y, z );
renderer.overrideBlockTexture = null;
return out; return out;
} }
@@ -164,6 +165,8 @@ public class RenderBlockCrafting extends BaseBlockRender
return; return;
i.setFacesToRender( EnumSet.of( side ) ); i.setFacesToRender( EnumSet.of( side ) );
renderer = BusRenderer.instance.renderer;
renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateWest = renderer.uvRotateTop = 0;
if ( meta == 0 && blk.getClass() == BlockCraftingUnit.class ) if ( meta == 0 && blk.getClass() == BlockCraftingUnit.class )
{ {
@@ -1,9 +1,24 @@
package appeng.client.render.blocks; package appeng.client.render.blocks;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.GLAllocation;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import appeng.api.storage.data.IAEItemStack;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.client.ClientHelper;
import appeng.core.AELog;
import appeng.tile.AEBaseTile; import appeng.tile.AEBaseTile;
import appeng.tile.crafting.TileCraftingMonitorTile;
import appeng.util.Platform;
public class RenderBlockCraftingMonitor extends RenderBlockCrafting public class RenderBlockCraftingMonitor extends RenderBlockCrafting
{ {
@@ -15,7 +30,138 @@ public class RenderBlockCraftingMonitor extends RenderBlockCrafting
@Override @Override
public void renderTile(AEBaseBlock block, AEBaseTile tile, Tessellator tess, double x, double y, double z, float f, RenderBlocks renderer) public void renderTile(AEBaseBlock block, AEBaseTile tile, Tessellator tess, double x, double y, double z, float f, RenderBlocks renderer)
{ {
if ( Platform.isDrawing( tess ) )
return;
if ( tile instanceof TileCraftingMonitorTile )
{
TileCraftingMonitorTile cmt = (TileCraftingMonitorTile) tile;
IAEItemStack ais = (IAEItemStack) cmt.getJobProgress();
if ( cmt.dspList == null )
{
cmt.updateList = true;
cmt.dspList = GLAllocation.generateDisplayLists( 1 );
}
if ( ais != null )
{
GL11.glPushMatrix();
GL11.glTranslated( x + 0.5, y + 0.5, z + 0.5 );
if ( cmt.updateList )
{
cmt.updateList = false;
GL11.glNewList( cmt.dspList, GL11.GL_COMPILE_AND_EXECUTE );
tesrRenderScreen( tess, cmt, ais );
GL11.glEndList();
}
else
GL11.glCallList( cmt.dspList );
GL11.glPopMatrix();
}
}
}
private void tesrRenderScreen(Tessellator tess, TileCraftingMonitorTile cmt, IAEItemStack ais)
{
ForgeDirection side = cmt.getForward();
int spin = 0;
GL11.glPushAttrib( GL11.GL_ALL_ATTRIB_BITS );
ForgeDirection d = side;
GL11.glTranslated( d.offsetX * 0.69, d.offsetY * 0.69, d.offsetZ * 0.69 );
float scale = 0.7f;
GL11.glScalef( scale, scale, scale );
if ( d == ForgeDirection.UP )
{
GL11.glScalef( 1.0f, -1.0f, 1.0f );
GL11.glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
GL11.glRotatef( (float) spin * 90.0F, 0, 0, 1 );
}
if ( d == ForgeDirection.DOWN )
{
GL11.glScalef( 1.0f, -1.0f, 1.0f );
GL11.glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
GL11.glRotatef( (float) spin * -90.0F, 0, 0, 1 );
}
if ( d == ForgeDirection.EAST )
{
GL11.glScalef( -1.0f, -1.0f, -1.0f );
GL11.glRotatef( -90.0f, 0.0f, 1.0f, 0.0f );
}
if ( d == ForgeDirection.WEST )
{
GL11.glScalef( -1.0f, -1.0f, -1.0f );
GL11.glRotatef( 90.0f, 0.0f, 1.0f, 0.0f );
}
if ( d == ForgeDirection.NORTH )
{
GL11.glScalef( -1.0f, -1.0f, -1.0f );
}
if ( d == ForgeDirection.SOUTH )
{
GL11.glScalef( -1.0f, -1.0f, -1.0f );
GL11.glRotatef( 180.0f, 0.0f, 1.0f, 0.0f );
}
GL11.glPushMatrix();
try
{
ItemStack sis = ais.getItemStack();
sis.stackSize = 1;
int br = 16 << 20 | 16 << 4;
int var11 = br % 65536;
int var12 = br / 65536;
OpenGlHelper.setLightmapTextureCoords( OpenGlHelper.lightmapTexUnit, var11 * 0.8F, var12 * 0.8F );
GL11.glColor4f( 1.0F, 1.0F, 1.0F, 1.0F );
GL11.glDisable( GL11.GL_LIGHTING );
GL11.glDisable( GL12.GL_RESCALE_NORMAL );
// RenderHelper.enableGUIStandardItemLighting();
tess.setColorOpaque_F( 1.0f, 1.0f, 1.0f );
ClientHelper.proxy.doRenderItem( sis, cmt.getWorldObj() );
}
catch (Exception e)
{
AELog.error( e );
}
GL11.glPopMatrix();
GL11.glTranslatef( 0.0f, 0.14f, -0.24f );
GL11.glScalef( 1.0f / 62.0f, 1.0f / 62.0f, 1.0f / 62.0f );
long qty = ais.getStackSize();
if ( qty > 999999999999L )
qty = 999999999999L;
String msg = Long.toString( qty );
if ( qty > 1000000000 )
msg = Long.toString( qty / 1000000000 ) + "B";
else if ( qty > 1000000 )
msg = Long.toString( qty / 1000000 ) + "M";
else if ( qty > 9999 )
msg = Long.toString( qty / 1000 ) + "K";
FontRenderer fr = Minecraft.getMinecraft().fontRenderer;
int width = fr.getStringWidth( msg );
GL11.glTranslatef( -0.5f * width, 0.0f, -1.0f );
fr.drawString( msg, 0, 0, 0 );
GL11.glPopAttrib();
} }
} }
@@ -47,6 +47,7 @@ import appeng.crafting.CraftingLink;
import appeng.crafting.MECraftingInventory; import appeng.crafting.MECraftingInventory;
import appeng.me.cache.CraftingGridCache; import appeng.me.cache.CraftingGridCache;
import appeng.me.cluster.IAECluster; import appeng.me.cluster.IAECluster;
import appeng.tile.crafting.TileCraftingMonitorTile;
import appeng.tile.crafting.TileCraftingTile; import appeng.tile.crafting.TileCraftingTile;
import appeng.util.Platform; import appeng.util.Platform;
import appeng.util.item.AEItemStack; import appeng.util.item.AEItemStack;
@@ -76,7 +77,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
// instance sate // instance sate
private LinkedList<TileCraftingTile> tiles = new LinkedList(); private LinkedList<TileCraftingTile> tiles = new LinkedList();
private LinkedList<TileCraftingTile> storage = new LinkedList<TileCraftingTile>(); private LinkedList<TileCraftingTile> storage = new LinkedList<TileCraftingTile>();
private LinkedList<TileCraftingTile> status = new LinkedList<TileCraftingTile>(); private LinkedList<TileCraftingMonitorTile> status = new LinkedList<TileCraftingMonitorTile>();
long availableStorage = 0; long availableStorage = 0;
public ICraftingLink myLastLink; public ICraftingLink myLastLink;
@@ -251,7 +252,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
storage.add( te ); storage.add( te );
} }
else if ( te.isStatus() ) else if ( te.isStatus() )
status.add( te ); status.add( (TileCraftingMonitorTile) te );
else if ( te.isAccelerator() ) else if ( te.isAccelerator() )
accelerator++; accelerator++;
} }
@@ -335,6 +336,8 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
if ( finalOutput.getStackSize() <= 0 ) if ( finalOutput.getStackSize() <= 0 )
completeJob(); completeJob();
updateCPU();
if ( myLastLink != null ) if ( myLastLink != null )
return ((CraftingLink) myLastLink).injectItems( (IAEItemStack) input, type ); return ((CraftingLink) myLastLink).injectItems( (IAEItemStack) input, type );
@@ -357,6 +360,8 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
if ( finalOutput.getStackSize() <= 0 ) if ( finalOutput.getStackSize() <= 0 )
completeJob(); completeJob();
updateCPU();
if ( myLastLink != null ) if ( myLastLink != null )
{ {
what.add( ((CraftingLink) myLastLink).injectItems( (IAEItemStack) insert.copy(), type ) ); what.add( ((CraftingLink) myLastLink).injectItems( (IAEItemStack) insert.copy(), type ) );
@@ -379,6 +384,12 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
return input; return input;
} }
private void updateCPU()
{
for (TileCraftingMonitorTile t : status)
t.setJob( finalOutput );
}
public IGrid getGrid() public IGrid getGrid()
{ {
for (TileCraftingTile r : tiles) for (TileCraftingTile r : tiles)
@@ -704,6 +715,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
isComplete = false; isComplete = false;
markDirty(); markDirty();
updateCPU();
String craftID = generateCraftingID(); String craftID = generateCraftingID();
myLastLink = new CraftingLink( generateLinkData( craftID, requestingMachine == null, false ), this ); myLastLink = new CraftingLink( generateLinkData( craftID, requestingMachine == null, false ), this );
@@ -952,6 +964,8 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
readFromNBT( core.previousState ); readFromNBT( core.previousState );
core.previousState = null; core.previousState = null;
} }
updateCPU();
} }
@Override @Override
@@ -1,8 +1,65 @@
package appeng.tile.crafting; package appeng.tile.crafting;
import io.netty.buffer.ByteBuf;
import java.io.IOException;
import appeng.api.storage.data.IAEItemStack;
import appeng.tile.events.AETileEventHandler;
import appeng.tile.events.TileEventType;
import appeng.util.item.AEItemStack;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class TileCraftingMonitorTile extends TileCraftingTile public class TileCraftingMonitorTile extends TileCraftingTile
{ {
@SideOnly(Side.CLIENT)
public Integer dspList;
@SideOnly(Side.CLIENT)
public boolean updateList;
IAEItemStack dspPlay;
class CraftingMonitorHandler extends AETileEventHandler
{
public CraftingMonitorHandler() {
super( TileEventType.NETWORK );
}
@Override
public boolean readFromStream(ByteBuf data) throws IOException
{
boolean hasItem = data.readBoolean();
if ( hasItem )
dspPlay = AEItemStack.loadItemStackFromPacket( data );
else
dspPlay = null;
updateList = true;
return false; // tesr!
}
@Override
public void writeToStream(ByteBuf data) throws IOException
{
if ( dspPlay == null )
data.writeBoolean( false );
else
{
data.writeBoolean( true );
dspPlay.writeToPacket( data );
}
}
};
public TileCraftingMonitorTile() {
addNewHandler( new CraftingMonitorHandler() );
}
public boolean isAccelerator() public boolean isAccelerator()
{ {
return false; return false;
@@ -13,4 +70,32 @@ public class TileCraftingMonitorTile extends TileCraftingTile
return true; return true;
} }
public void setJob(IAEItemStack is)
{
if ( (is == null) != (dspPlay == null) )
{
dspPlay = is == null ? null : is.copy();
markForUpdate();
}
else if ( is != null && dspPlay != null )
{
if ( is.getStackSize() != dspPlay.getStackSize() )
{
dspPlay = is == null ? null : is.copy();
markForUpdate();
}
}
}
public IAEItemStack getJobProgress()
{
return dspPlay;// AEItemStack.create( new ItemStack( Items.diamond, 64 ) );
}
@Override
public boolean requiresTESR()
{
return getJobProgress() != null;
}
} }