diff --git a/common/mekanism/client/render/tileentity/RenderBin.java b/common/mekanism/client/render/tileentity/RenderBin.java index 1c9e0b64a..778ec9251 100644 --- a/common/mekanism/client/render/tileentity/RenderBin.java +++ b/common/mekanism/client/render/tileentity/RenderBin.java @@ -49,64 +49,61 @@ public class RenderBin extends TileEntitySpecialRenderer amount = Integer.toString(itemStack.stackSize); } - for(ForgeDirection side : MekanismUtils.SIDE_DIRS) + Object3D obj = Object3D.get(tileEntity).getFromSide(ForgeDirection.getOrientation(tileEntity.facing)); + + if(tileEntity.worldObj.isBlockSolidOnSide(obj.xCoord, obj.yCoord, obj.zCoord, ForgeDirection.getOrientation(tileEntity.facing).getOpposite())) { - Object3D obj = Object3D.get(tileEntity).getFromSide(side); - - if(tileEntity.worldObj.isBlockSolidOnSide(obj.xCoord, obj.yCoord, obj.zCoord, side.getOpposite())) + return; + } + + doLight(tileEntity.worldObj, obj); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240); + + if(itemStack != null) + { + GL11.glPushMatrix(); + + switch(ForgeDirection.getOrientation(tileEntity.facing)) { - continue; + case NORTH: + GL11.glTranslated(x + 0.73, y + 0.83, z - 0.01); + break; + case SOUTH: + GL11.glTranslated(x + 0.27, y + 0.83, z + 1.01); + GL11.glRotatef(180, 0, 1, 0); + break; + case WEST: + GL11.glTranslated(x - 0.01, y + 0.83, z + 0.27); + GL11.glRotatef(90, 0, 1, 0); + break; + case EAST: + GL11.glTranslated(x + 1.01, y + 0.83, z + 0.73); + GL11.glRotatef(-90, 0, 1, 0); + break; + } + + float scale = 0.03125F; + float scaler = 0.9F; + + GL11.glScalef(scale*scaler, scale*scaler, 0); + GL11.glRotatef(180, 0, 0, 1); + + TextureManager renderEngine = Minecraft.getMinecraft().renderEngine; + + GL11.glDisable(2896); + + if(!ForgeHooksClient.renderInventoryItem(renderBlocks, renderEngine, itemStack, true, 0.0F, 0.0F, 0.0F)) + { + renderItem.renderItemIntoGUI(getFontRenderer(), renderEngine, itemStack, 0, 0); } - doLight(tileEntity.worldObj, obj); - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240); + GL11.glEnable(2896); + GL11.glPopMatrix(); + } - if(itemStack != null) - { - GL11.glPushMatrix(); - - switch(side) - { - case NORTH: - GL11.glTranslated(x + 0.73, y + 0.83, z - 0.01); - break; - case SOUTH: - GL11.glTranslated(x + 0.27, y + 0.83, z + 1.01); - GL11.glRotatef(180, 0, 1, 0); - break; - case WEST: - GL11.glTranslated(x - 0.01, y + 0.83, z + 0.27); - GL11.glRotatef(90, 0, 1, 0); - break; - case EAST: - GL11.glTranslated(x + 1.01, y + 0.83, z + 0.73); - GL11.glRotatef(-90, 0, 1, 0); - break; - } - - float scale = 0.03125F; - float scaler = 0.9F; - - GL11.glScalef(scale*scaler, scale*scaler, 0); - GL11.glRotatef(180, 0, 0, 1); - - TextureManager renderEngine = Minecraft.getMinecraft().renderEngine; - - GL11.glDisable(2896); - - if(!ForgeHooksClient.renderInventoryItem(renderBlocks, renderEngine, itemStack, true, 0.0F, 0.0F, 0.0F)) - { - renderItem.renderItemIntoGUI(getFontRenderer(), renderEngine, itemStack, 0, 0); - } - - GL11.glEnable(2896); - GL11.glPopMatrix(); - } - - if(amount != "") - { - renderText(amount, side, 0.02F, x, y - 0.31F, z); - } + if(amount != "") + { + renderText(amount, ForgeDirection.getOrientation(tileEntity.facing), 0.02F, x, y - 0.31F, z); } } } diff --git a/common/mekanism/common/block/BlockBasic.java b/common/mekanism/common/block/BlockBasic.java index f63ffe435..3f2f8578d 100644 --- a/common/mekanism/common/block/BlockBasic.java +++ b/common/mekanism/common/block/BlockBasic.java @@ -5,26 +5,31 @@ import java.util.List; import mekanism.api.Object3D; import mekanism.client.ClientProxy; +import mekanism.common.IActiveState; +import mekanism.common.IBoundingBlock; import mekanism.common.Mekanism; import mekanism.common.PacketHandler; import mekanism.common.PacketHandler.Transmission; import mekanism.common.inventory.InventoryBin; import mekanism.common.network.PacketTileEntity; +import mekanism.common.tileentity.TileEntityBasicBlock; import mekanism.common.tileentity.TileEntityBin; import mekanism.common.tileentity.TileEntityDynamicTank; import mekanism.common.tileentity.TileEntityDynamicValve; +import mekanism.common.util.MekanismUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; +import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -53,7 +58,7 @@ import cpw.mods.fml.relauncher.SideOnly; */ public class BlockBasic extends Block { - public Icon[] icons = new Icon[256]; + public Icon[][] icons = new Icon[256][6]; public BlockBasic(int id) { @@ -81,25 +86,72 @@ public class BlockBasic extends Block @SideOnly(Side.CLIENT) public void registerIcons(IconRegister register) { - icons[0] = register.registerIcon("mekanism:OsmiumBlock"); - icons[1] = register.registerIcon("mekanism:BronzeBlock"); - icons[2] = register.registerIcon("mekanism:RefinedObsidian"); - icons[3] = register.registerIcon("mekanism:CoalBlock"); - icons[4] = register.registerIcon("mekanism:RefinedGlowstone"); - icons[5] = register.registerIcon("mekanism:SteelBlock"); - icons[6] = register.registerIcon("mekanism:Bin"); //TODO texture - icons[7] = register.registerIcon("mekanism:TeleporterFrame"); - icons[8] = register.registerIcon("mekanism:SteelCasing"); - icons[9] = register.registerIcon("mekanism:DynamicTank"); - icons[10] = register.registerIcon("mekanism:DynamicGlass"); - icons[11] = register.registerIcon("mekanism:DynamicValve"); + icons[0][0] = register.registerIcon("mekanism:OsmiumBlock"); + icons[1][0] = register.registerIcon("mekanism:BronzeBlock"); + icons[2][0] = register.registerIcon("mekanism:RefinedObsidian"); + icons[3][0] = register.registerIcon("mekanism:CoalBlock"); + icons[4][0] = register.registerIcon("mekanism:RefinedGlowstone"); + icons[5][0] = register.registerIcon("mekanism:SteelBlock"); + icons[6][0] = register.registerIcon("mekanism:BinSide"); + icons[6][1] = register.registerIcon("mekanism:BinTop"); + icons[6][2] = register.registerIcon("mekanism:BinFront"); + icons[6][3] = register.registerIcon("mekanism:BinTopOn"); + icons[6][4] = register.registerIcon("mekanism:BinFrontOn"); + icons[7][0] = register.registerIcon("mekanism:TeleporterFrame"); + icons[8][0] = register.registerIcon("mekanism:SteelCasing"); + icons[9][0] = register.registerIcon("mekanism:DynamicTank"); + icons[10][0] = register.registerIcon("mekanism:DynamicGlass"); + icons[11][0] = register.registerIcon("mekanism:DynamicValve"); } + @Override + @SideOnly(Side.CLIENT) + public Icon getBlockTexture(IBlockAccess world, int x, int y, int z, int side) + { + int metadata = world.getBlockMetadata(x, y, z); + + if(metadata != 6) + { + return getIcon(side, metadata); + } + else { + TileEntityBasicBlock tileEntity = (TileEntityBasicBlock)world.getBlockTileEntity(x, y, z); + + if(side == 0 || side == 1) + { + return MekanismUtils.isActive(world, x, y, z) ? icons[6][3] : icons[6][1]; + } + else if(side == tileEntity.facing) + { + return MekanismUtils.isActive(world, x, y, z) ? icons[6][4] : icons[6][2]; + } + else { + return icons[6][0]; + } + } + } + @Override @SideOnly(Side.CLIENT) public Icon getIcon(int side, int meta) { - return icons[meta]; + if(meta != 6) + { + return icons[meta][0]; + } + else { + if(side == 0 || side == 1) + { + return icons[6][1]; + } + else if(side == 3) + { + return icons[6][2]; + } + else { + return icons[6][0]; + } + } } @Override @@ -156,6 +208,23 @@ public class BlockBasic extends Block return super.canCreatureSpawn(type, world, x, y, z); } + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) + { + int meta = world.getBlockMetadata(x, y, z); + + if(!world.isRemote && meta == 6) + { + TileEntityBin bin = (TileEntityBin)world.getBlockTileEntity(x, y, z); + + if(bin.getStack() != null) + { + world.spawnEntityInWorld(new EntityItem(world, player.posX, player.posY, player.posZ, bin.getStack().copy())); + bin.setInventorySlotContents(0, null); + } + } + } + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityplayer, int i1, float f1, float f2, float f3) { @@ -357,7 +426,16 @@ public class BlockBasic extends Block @Override public int getLightValue(IBlockAccess world, int x, int y, int z) { + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); int metadata = world.getBlockMetadata(x, y, z); + + if(tileEntity instanceof IActiveState) + { + if(((IActiveState)tileEntity).getActive() && ((IActiveState)tileEntity).lightUpdate()) + { + return 15; + } + } switch(metadata) { @@ -399,10 +477,48 @@ public class BlockBasic extends Block @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityliving, ItemStack itemstack) { + if(world.getBlockTileEntity(x, y, z) instanceof TileEntityBasicBlock) + { + TileEntityBasicBlock tileEntity = (TileEntityBasicBlock)world.getBlockTileEntity(x, y, z); + int side = MathHelper.floor_double((entityliving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; + int height = Math.round(entityliving.rotationPitch); + int change = 3; + + if(tileEntity.canSetFacing(0) && tileEntity.canSetFacing(1)) + { + if(height >= 65) + { + change = 1; + } + else if(height <= -65) + { + change = 0; + } + } + + if(change != 0 && change != 1) + { + switch(side) + { + case 0: change = 2; break; + case 1: change = 5; break; + case 2: change = 3; break; + case 3: change = 4; break; + } + } + + tileEntity.setFacing((short)change); + + if(tileEntity instanceof IBoundingBlock) + { + ((IBoundingBlock)tileEntity).onPlace(); + } + } + world.markBlockForRenderUpdate(x, y, z); world.updateAllLightTypes(x, y, z); - if(world.getBlockTileEntity(x, y, z) != null && !world.isRemote) + if(!world.isRemote && world.getBlockTileEntity(x, y, z) != null) { TileEntity tileEntity = world.getBlockTileEntity(x, y, z); diff --git a/common/mekanism/common/block/BlockMachine.java b/common/mekanism/common/block/BlockMachine.java index 5024f24bd..93e469774 100644 --- a/common/mekanism/common/block/BlockMachine.java +++ b/common/mekanism/common/block/BlockMachine.java @@ -148,7 +148,7 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityliving, ItemStack itemstack) { TileEntityBasicBlock tileEntity = (TileEntityBasicBlock)world.getBlockTileEntity(x, y, z); - int side = MathHelper.floor_double((double)(entityliving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; + int side = MathHelper.floor_double((entityliving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; int height = Math.round(entityliving.rotationPitch); int change = 3; diff --git a/common/mekanism/common/inventory/InventoryBin.java b/common/mekanism/common/inventory/InventoryBin.java index c30c1adc3..24ca64ace 100644 --- a/common/mekanism/common/inventory/InventoryBin.java +++ b/common/mekanism/common/inventory/InventoryBin.java @@ -40,7 +40,7 @@ public class InventoryBin public ItemStack add(ItemStack stack) { - if(stack != null && stack.stackSize > 0) + if(stack != null && stack.stackSize > 0 && stack.isStackable()) { if(getItemType() == null) { diff --git a/common/mekanism/common/item/ItemConfigurator.java b/common/mekanism/common/item/ItemConfigurator.java index 3ff103b39..040f80865 100644 --- a/common/mekanism/common/item/ItemConfigurator.java +++ b/common/mekanism/common/item/ItemConfigurator.java @@ -12,6 +12,7 @@ import mekanism.common.PacketHandler; import mekanism.common.PacketHandler.Transmission; import mekanism.common.network.PacketTileEntity; import mekanism.common.tileentity.TileEntityBasicBlock; +import mekanism.common.tileentity.TileEntityBin; import mekanism.common.tileentity.TileEntityContainerBlock; import mekanism.common.tileentity.TileEntityElectricChest; import mekanism.common.tileentity.TileEntityElectricPump; @@ -21,7 +22,6 @@ import mekanism.common.util.MekanismUtils; import mekanism.common.util.TransporterUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -77,6 +77,13 @@ public class ItemConfigurator extends ItemEnergized player.sendChatToPlayer(ChatMessageComponent.createFromText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " Color bumped to: " + (transporter.color != null ? transporter.color.getName() : EnumColor.BLACK + "None"))); return true; } + else if(world.getBlockTileEntity(x, y, z) instanceof TileEntityBin) + { + TileEntityBin bin = (TileEntityBin)world.getBlockTileEntity(x, y, z); + bin.setActive(!bin.getActive()); + world.playSoundEffect(x, y, z, "random.click", 0.3F, 1); + return true; + } } else if(world.getBlockTileEntity(x, y, z) instanceof ITransmitter) { diff --git a/common/mekanism/common/tileentity/TileEntityBin.java b/common/mekanism/common/tileentity/TileEntityBin.java index c81a5c3a4..2d5baa414 100644 --- a/common/mekanism/common/tileentity/TileEntityBin.java +++ b/common/mekanism/common/tileentity/TileEntityBin.java @@ -2,16 +2,34 @@ package mekanism.common.tileentity; import java.util.ArrayList; +import mekanism.api.Object3D; +import mekanism.common.IActiveState; +import mekanism.common.PacketHandler; +import mekanism.common.PacketHandler.Transmission; +import mekanism.common.network.PacketTileEntity; +import mekanism.common.util.MekanismUtils; +import mekanism.common.util.TransporterUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; import com.google.common.io.ByteArrayDataInput; -public class TileEntityBin extends TileEntityBasicBlock implements ISidedInventory +public class TileEntityBin extends TileEntityBasicBlock implements ISidedInventory, IActiveState { + public boolean isActive; + + public boolean clientActive; + + public final int MAX_DELAY = 10; + + public int delayTicks; + public int itemCount; + public ItemStack itemType; public ItemStack getStack() @@ -28,13 +46,35 @@ public class TileEntityBin extends TileEntityBasicBlock implements ISidedInvento } @Override - public void onUpdate() {} + public void onUpdate() + { + if(!worldObj.isRemote) + { + delayTicks = Math.max(0, delayTicks-1); + + if(getStack() != null && isActive && delayTicks == 0) + { + TileEntity tile = Object3D.get(this).getFromSide(ForgeDirection.getOrientation(0)).getTileEntity(worldObj); + + if(tile instanceof TileEntityLogisticalTransporter) + { + TileEntityLogisticalTransporter transporter = (TileEntityLogisticalTransporter)tile; + + if(TransporterUtils.insert(this, transporter, getStack(), null)) + { + setInventorySlotContents(0, null); + } + } + } + } + } @Override public void writeToNBT(NBTTagCompound nbtTags) { super.writeToNBT(nbtTags); + nbtTags.setBoolean("isActive", isActive); nbtTags.setInteger("itemCount", itemCount); if(itemCount > 0) @@ -48,6 +88,7 @@ public class TileEntityBin extends TileEntityBasicBlock implements ISidedInvento { super.readFromNBT(nbtTags); + isActive = nbtTags.getBoolean("isActive"); itemCount = nbtTags.getInteger("itemCount"); if(itemCount > 0) @@ -61,6 +102,7 @@ public class TileEntityBin extends TileEntityBasicBlock implements ISidedInvento { super.getNetworkedData(data); + data.add(isActive); data.add(itemCount); if(itemCount > 0) @@ -77,12 +119,15 @@ public class TileEntityBin extends TileEntityBasicBlock implements ISidedInvento { super.handlePacketData(dataStream); + isActive = dataStream.readBoolean(); itemCount = dataStream.readInt(); if(itemCount > 0) { itemType = new ItemStack(dataStream.readInt(), 0, dataStream.readInt()); } + + MekanismUtils.updateBlock(worldObj, xCoord, yCoord, zCoord); } @Override @@ -169,6 +214,19 @@ public class TileEntityBin extends TileEntityBasicBlock implements ISidedInvento setItemCount(itemCount + itemstack.stackSize); } } + + onInventoryChanged(); + } + + @Override + public void onInventoryChanged() + { + super.onInventoryChanged(); + + if(!worldObj.isRemote) + { + PacketHandler.sendPacket(Transmission.ALL_CLIENTS, new PacketTileEntity().setParams(Object3D.get(this), getNetworkedData(new ArrayList()))); + } } public void setItemType(ItemStack stack) @@ -253,4 +311,41 @@ public class TileEntityBin extends TileEntityBasicBlock implements ISidedInvento { return itemType != null && itemType.isItemEqual(itemstack); } + + @Override + public boolean canSetFacing(int facing) + { + return facing != 0 && facing != 1; + } + + @Override + public void setActive(boolean active) + { + isActive = active; + + if(clientActive != active) + { + PacketHandler.sendPacket(Transmission.ALL_CLIENTS, new PacketTileEntity().setParams(Object3D.get(this), getNetworkedData(new ArrayList()))); + + clientActive = active; + } + } + + @Override + public boolean getActive() + { + return isActive; + } + + @Override + public boolean renderUpdate() + { + return true; + } + + @Override + public boolean lightUpdate() + { + return true; + } } \ No newline at end of file diff --git a/resources/assets/mekanism/textures/blocks/Bin.png b/resources/assets/mekanism/textures/blocks/BinFront.png similarity index 61% rename from resources/assets/mekanism/textures/blocks/Bin.png rename to resources/assets/mekanism/textures/blocks/BinFront.png index 2b21badfd..984fcb484 100644 Binary files a/resources/assets/mekanism/textures/blocks/Bin.png and b/resources/assets/mekanism/textures/blocks/BinFront.png differ diff --git a/resources/assets/mekanism/textures/blocks/BinFrontOn.png b/resources/assets/mekanism/textures/blocks/BinFrontOn.png new file mode 100644 index 000000000..4278df44e Binary files /dev/null and b/resources/assets/mekanism/textures/blocks/BinFrontOn.png differ diff --git a/resources/assets/mekanism/textures/blocks/BinSide.png b/resources/assets/mekanism/textures/blocks/BinSide.png new file mode 100644 index 000000000..286ea845d Binary files /dev/null and b/resources/assets/mekanism/textures/blocks/BinSide.png differ diff --git a/resources/assets/mekanism/textures/blocks/BinTop.png b/resources/assets/mekanism/textures/blocks/BinTop.png index 3991f091b..84dffc490 100644 Binary files a/resources/assets/mekanism/textures/blocks/BinTop.png and b/resources/assets/mekanism/textures/blocks/BinTop.png differ diff --git a/resources/assets/mekanism/textures/blocks/BinTopOn.png b/resources/assets/mekanism/textures/blocks/BinTopOn.png new file mode 100644 index 000000000..8d8ea5a3c Binary files /dev/null and b/resources/assets/mekanism/textures/blocks/BinTopOn.png differ