diff --git a/src/main/java/mekanism/client/ClientProxy.java b/src/main/java/mekanism/client/ClientProxy.java index bf7b2a46c..08fea90fe 100644 --- a/src/main/java/mekanism/client/ClientProxy.java +++ b/src/main/java/mekanism/client/ClientProxy.java @@ -216,7 +216,6 @@ public class ClientProxy extends CommonProxy entityplayer.openContainer.windowId = windowId; } else { - SoundHandler.playSound("random.chestopen"); ItemStack stack = entityplayer.getCurrentEquippedItem(); if(stack != null && stack.getItem() instanceof IElectricChest && MachineType.get(stack) == MachineType.ELECTRIC_CHEST) diff --git a/src/main/java/mekanism/client/ClientTickHandler.java b/src/main/java/mekanism/client/ClientTickHandler.java index 7eba923d7..871a6e738 100644 --- a/src/main/java/mekanism/client/ClientTickHandler.java +++ b/src/main/java/mekanism/client/ClientTickHandler.java @@ -15,6 +15,8 @@ import mekanism.client.sound.SoundHandler; import mekanism.common.KeySync; import mekanism.common.Mekanism; import mekanism.common.ObfuscatedNames; +import mekanism.common.block.BlockMachine.MachineType; +import mekanism.common.item.ItemBlockMachine; import mekanism.common.item.ItemConfigurator; import mekanism.common.item.ItemElectricBow; import mekanism.common.item.ItemFreeRunners; @@ -27,6 +29,7 @@ import mekanism.common.network.PacketConfiguratorState.ConfiguratorStateMessage; import mekanism.common.network.PacketElectricBowState.ElectricBowStateMessage; import mekanism.common.network.PacketJetpackData.JetpackDataMessage; import mekanism.common.network.PacketJetpackData.JetpackPacket; +import mekanism.common.network.PacketPortableTankState.PortableTankStateMessage; import mekanism.common.network.PacketScubaTankData.ScubaTankDataMessage; import mekanism.common.network.PacketScubaTankData.ScubaTankPacket; import mekanism.common.network.PacketWalkieTalkieState.WalkieTalkieStateMessage; @@ -38,9 +41,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.ChatComponentText; import net.minecraft.util.StringUtils; - -import org.lwjgl.input.Keyboard; - import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent; @@ -261,6 +261,27 @@ public class ClientTickHandler lastTickUpdate = false; } } + else if(mc.thePlayer.isSneaking() && StackUtils.getItem(mc.thePlayer.getCurrentEquippedItem()) instanceof ItemBlockMachine) + { + ItemBlockMachine item = (ItemBlockMachine)mc.thePlayer.getCurrentEquippedItem().getItem(); + + if(MachineType.get(mc.thePlayer.getCurrentEquippedItem()) == MachineType.PORTABLE_TANK) + { + if(MekanismKeyHandler.modeSwitchKey.getIsKeyPressed()) + { + if(!lastTickUpdate) + { + item.setBucketMode(stack, !item.getBucketMode(stack)); + Mekanism.packetHandler.sendToServer(new PortableTankStateMessage(item.getBucketMode(stack))); + mc.thePlayer.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism] " + EnumColor.GREY + "Bucket Mode: " + (item.getBucketMode(stack) ? (EnumColor.DARK_GREEN + "ON") : (EnumColor.DARK_RED + "OFF")))); + lastTickUpdate = true; + } + } + else { + lastTickUpdate = false; + } + } + } else if(mc.thePlayer.isSneaking() && StackUtils.getItem(mc.thePlayer.getCurrentEquippedItem()) instanceof ItemWalkieTalkie) { ItemWalkieTalkie item = (ItemWalkieTalkie)mc.thePlayer.getCurrentEquippedItem().getItem(); diff --git a/src/main/java/mekanism/client/gui/GuiElectricChest.java b/src/main/java/mekanism/client/gui/GuiElectricChest.java index daacc8322..605ce9b94 100644 --- a/src/main/java/mekanism/client/gui/GuiElectricChest.java +++ b/src/main/java/mekanism/client/gui/GuiElectricChest.java @@ -50,17 +50,6 @@ public class GuiElectricChest extends GuiMekanism isBlock = false; } - @Override - public void onGuiClosed() - { - super.onGuiClosed(); - - if(!isBlock) - { - mc.theWorld.playSoundEffect(tileEntity.xCoord + 0.5, tileEntity.yCoord + 0.5, tileEntity.zCoord + 0.5, "random.chestopen", 0.5f, mc.theWorld.rand.nextFloat() * 0.1F + 0.9F); - } - } - @Override public void initGui() { diff --git a/src/main/java/mekanism/client/render/item/ItemRenderingHandler.java b/src/main/java/mekanism/client/render/item/ItemRenderingHandler.java index ec69caeb5..857fd677f 100644 --- a/src/main/java/mekanism/client/render/item/ItemRenderingHandler.java +++ b/src/main/java/mekanism/client/render/item/ItemRenderingHandler.java @@ -21,7 +21,7 @@ import mekanism.client.render.RenderGlowPanel; import mekanism.client.render.RenderPartTransmitter; import mekanism.client.render.entity.RenderBalloon; import mekanism.client.render.tileentity.RenderBin; -import mekanism.common.IElectricChest; +import mekanism.client.render.tileentity.RenderPortableTank; import mekanism.common.IEnergyCube; import mekanism.common.Mekanism; import mekanism.common.Tier.EnergyCubeTier; @@ -40,6 +40,7 @@ import mekanism.common.multipart.ItemGlowPanel; import mekanism.common.multipart.ItemPartTransmitter; import mekanism.common.multipart.TransmitterType; import mekanism.common.tile.TileEntityBin; +import mekanism.common.tile.TileEntityPortableTank; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; import net.minecraft.block.Block; @@ -58,6 +59,7 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraftforge.client.IItemRenderer; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; import org.lwjgl.opengl.GL11; @@ -84,6 +86,7 @@ public class ItemRenderingHandler implements IItemRenderer private final RenderBalloon balloonRenderer = new RenderBalloon(); private final RenderBin binRenderer = (RenderBin)TileEntityRendererDispatcher.instance.mapSpecialRenderers.get(TileEntityBin.class); + private final RenderPortableTank portableTankRenderer = (RenderPortableTank)TileEntityRendererDispatcher.instance.mapSpecialRenderers.get(TileEntityPortableTank.class); private final RenderItem renderItem = (RenderItem)RenderManager.instance.getEntityClassRenderObject(EntityItem.class); @Override @@ -306,7 +309,7 @@ public class ItemRenderingHandler implements IItemRenderer } else if(MachineType.get(item) == MachineType.ELECTRIC_CHEST) { - IElectricChest chest = (IElectricChest)item.getItem(); + ItemBlockMachine chest = (ItemBlockMachine)item.getItem(); GL11.glRotatef(90F, 0.0F, 1.0F, 0.0F); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); @@ -315,11 +318,6 @@ public class ItemRenderingHandler implements IItemRenderer Minecraft.getMinecraft().renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "ElectricChest.png")); - float lidangle = chest.getPrevLidAngle(item) + (chest.getLidAngle(item) - chest.getPrevLidAngle(item)) * MekanismRenderer.getPartialTick(); - lidangle = 1.0F - lidangle; - lidangle = 1.0F - lidangle * lidangle * lidangle; - electricChest.chestLid.rotateAngleX = -((lidangle * 3.141593F) / 2.0F); - electricChest.renderAll(); } else if(item.getItem() instanceof ItemRobit) @@ -439,11 +437,12 @@ public class ItemRenderingHandler implements IItemRenderer } else if(MachineType.get(item) == MachineType.PORTABLE_TANK) { - GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); GL11.glRotatef(270F, 0.0F, -1.0F, 0.0F); - GL11.glTranslatef(0.0F, -1.06F, 0.05F); Minecraft.getMinecraft().renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "PortableTank.png")); - portableTank.render(0.0625F); + + ItemBlockMachine itemMachine = (ItemBlockMachine)item.getItem(); + Fluid fluid = itemMachine.getFluidStack(item) != null ? itemMachine.getFluidStack(item).getFluid() : null; + portableTankRenderer.render(fluid, itemMachine.getPrevScale(item), false, -0.5, -0.5, -0.5); } else { if(item.getItem() instanceof ItemBlockMachine) diff --git a/src/main/java/mekanism/client/render/tileentity/RenderPortableTank.java b/src/main/java/mekanism/client/render/tileentity/RenderPortableTank.java index 6c868ded9..d86cd7c4d 100644 --- a/src/main/java/mekanism/client/render/tileentity/RenderPortableTank.java +++ b/src/main/java/mekanism/client/render/tileentity/RenderPortableTank.java @@ -1,11 +1,19 @@ package mekanism.client.render.tileentity; +import java.util.HashMap; +import java.util.Map; + import mekanism.client.model.ModelPortableTank; +import mekanism.client.render.MekanismRenderer; +import mekanism.client.render.MekanismRenderer.DisplayInteger; +import mekanism.client.render.MekanismRenderer.Model3D; import mekanism.common.tile.TileEntityPortableTank; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.init.Blocks; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.Fluid; import org.lwjgl.opengl.GL11; @@ -15,6 +23,10 @@ import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class RenderPortableTank extends TileEntitySpecialRenderer { + private static Map cachedCenterFluids = new HashMap(); + + private static int stages = 1400; + private ModelPortableTank model = new ModelPortableTank(); @Override @@ -25,21 +37,102 @@ public class RenderPortableTank extends TileEntitySpecialRenderer private void renderAModelAt(TileEntityPortableTank tileEntity, double x, double y, double z, float partialTick) { + Fluid fluid = tileEntity.fluidTank.getFluid() != null ? tileEntity.fluidTank.getFluid().getFluid() : null; + render(fluid, tileEntity.prevScale, tileEntity.isActive, x, y, z); + } + + public void render(Fluid fluid, float fluidScale, boolean active, double x, double y, double z) + { + if(fluidScale > 0) + { + push(); + + bindTexture(MekanismRenderer.getBlocksTexture()); + GL11.glTranslated(x, y, z); + + MekanismRenderer.glowOn(fluid.getLuminosity()); + + DisplayInteger[] displayList = getListAndRender(fluid); + + if(fluid.isGaseous()) + { + GL11.glColor4f(1F, 1F, 1F, Math.min(1, fluidScale+0.3F)); + displayList[stages-1].render(); + } + else { + displayList[Math.min(stages-1, (int)(fluidScale*((float)stages-1)))].render(); + } + + MekanismRenderer.glowOff(); + + pop(); + } + GL11.glPushMatrix(); GL11.glTranslatef((float)x + 0.5F, (float)y + 1.5F, (float)z + 0.5F); - - bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "PortableTank" + (tileEntity.isActive ? "On" : "") + ".png")); - - switch(tileEntity.facing) - { - case 2: GL11.glRotatef(0, 0.0F, 1.0F, 0.0F); break; - case 3: GL11.glRotatef(180, 0.0F, 1.0F, 0.0F); break; - case 4: GL11.glRotatef(90, 0.0F, 1.0F, 0.0F); break; - case 5: GL11.glRotatef(270, 0.0F, 1.0F, 0.0F); break; - } + bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "PortableTank" + (active ? "On" : "") + ".png")); GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); model.render(0.0625F); GL11.glPopMatrix(); } + + private void pop() + { + GL11.glPopAttrib(); + MekanismRenderer.glowOff(); + MekanismRenderer.blendOff(); + GL11.glPopMatrix(); + } + + private void push() + { + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_ENABLE_BIT); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_LIGHTING); + MekanismRenderer.glowOn(); + MekanismRenderer.blendOn(); + } + + private DisplayInteger[] getListAndRender(Fluid fluid) + { + if(cachedCenterFluids.containsKey(fluid)) + { + return cachedCenterFluids.get(fluid); + } + + Model3D toReturn = new Model3D(); + toReturn.baseBlock = Blocks.water; + toReturn.setTexture(fluid.getIcon()); + + DisplayInteger[] displays = new DisplayInteger[stages]; + cachedCenterFluids.put(fluid, displays); + + MekanismRenderer.colorFluid(fluid); + + for(int i = 0; i < stages; i++) + { + displays[i] = DisplayInteger.createAndStart(); + + if(fluid.getIcon() != null) + { + toReturn.minX = 0.125 + .01; + toReturn.minY = 0.0625 + .01; + toReturn.minZ = 0.125 + .01; + + toReturn.maxX = 0.875 - .01; + toReturn.maxY = 0.0625 + ((float)i/(float)stages)*0.875 - .01; + toReturn.maxZ = 0.875 - .01; + + MekanismRenderer.renderObject(toReturn); + } + + GL11.glEndList(); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + return displays; + } } diff --git a/src/main/java/mekanism/common/IElectricChest.java b/src/main/java/mekanism/common/IElectricChest.java index 56599deaa..e151d654e 100644 --- a/src/main/java/mekanism/common/IElectricChest.java +++ b/src/main/java/mekanism/common/IElectricChest.java @@ -64,32 +64,4 @@ public interface IElectricChest * @return open value */ public boolean getOpen(ItemStack itemStack); - - /** - * Sets the 'lidAngle' value of this electric chest to a new value. - * @param itemStack - electric chest ItemStack - * @param lidAngle - new value - */ - public void setLidAngle(ItemStack itemStack, float lidAngle); - - /** - * Retrieves the 'lidAngle' value of this electric chest. - * @param itemStack - electric chest ItemStack - * @return lidAngle value - */ - public float getLidAngle(ItemStack itemStack); - - /** - * Sets the 'prevLidAngle' value of this electric chest to a new value. - * @param itemStack - electric chest ItemStack - * @param prevLidAngle - new value - */ - public void setPrevLidAngle(ItemStack itemStack, float prevLidAngle); - - /** - * Retrieves the 'prevLidAngle' value of this electric chest. - * @param itemStack - electric chest ItemStack - * @return prevLidAngle value - */ - public float getPrevLidAngle(ItemStack itemStack); } diff --git a/src/main/java/mekanism/common/PacketHandler.java b/src/main/java/mekanism/common/PacketHandler.java index 514bf5d18..f10c1baf0 100644 --- a/src/main/java/mekanism/common/PacketHandler.java +++ b/src/main/java/mekanism/common/PacketHandler.java @@ -33,6 +33,8 @@ import mekanism.common.network.PacketLogisticalSorterGui; import mekanism.common.network.PacketLogisticalSorterGui.LogisticalSorterGuiMessage; import mekanism.common.network.PacketNewFilter; import mekanism.common.network.PacketNewFilter.NewFilterMessage; +import mekanism.common.network.PacketPortableTankState; +import mekanism.common.network.PacketPortableTankState.PortableTankStateMessage; import mekanism.common.network.PacketPortableTeleport; import mekanism.common.network.PacketPortableTeleport.PortableTeleportMessage; import mekanism.common.network.PacketPortalFX; @@ -112,6 +114,7 @@ public class PacketHandler netHandler.registerMessage(PacketScubaTankData.class, ScubaTankDataMessage.class, 22, Side.SERVER); netHandler.registerMessage(PacketConfigSync.class, ConfigSyncMessage.class, 23, Side.CLIENT); netHandler.registerMessage(PacketBoxBlacklist.class, BoxBlacklistMessage.class, 24, Side.CLIENT); + netHandler.registerMessage(PacketPortableTankState.class, PortableTankStateMessage.class, 25, Side.SERVER); } /** diff --git a/src/main/java/mekanism/common/block/BlockMachine.java b/src/main/java/mekanism/common/block/BlockMachine.java index 4e8996643..fc261d529 100644 --- a/src/main/java/mekanism/common/block/BlockMachine.java +++ b/src/main/java/mekanism/common/block/BlockMachine.java @@ -67,6 +67,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -80,6 +81,8 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; import buildcraft.api.tools.IToolWrench; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -250,7 +253,7 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds, IPer @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityElectricBlock tileEntity = (TileEntityElectricBlock)world.getTileEntity(x, y, z); + TileEntityBasicBlock tileEntity = (TileEntityBasicBlock)world.getTileEntity(x, y, z); if(tileEntity instanceof IBoundingBlock) { @@ -709,7 +712,9 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds, IPer if(tileEntity != null) { - if(metadata == MachineType.ELECTRIC_CHEST.meta) + MachineType type = MachineType.get(this, metadata); + + if(type == MachineType.ELECTRIC_CHEST) { TileEntityElectricChest electricChest = (TileEntityElectricChest)tileEntity; @@ -730,16 +735,28 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds, IPer return true; } } - else if(metadata == MachineType.LOGISTICAL_SORTER.meta) + else if(type == MachineType.PORTABLE_TANK) + { + if(!entityplayer.isSneaking()) + { + manageInventory(entityplayer, (TileEntityPortableTank)tileEntity); + } + else { + entityplayer.openGui(Mekanism.instance, type.guiId, world, x, y, z); + } + + return true; + } + else if(type == MachineType.LOGISTICAL_SORTER) { TileEntityLogisticalSorter sorter = (TileEntityLogisticalSorter)tileEntity; LogisticalSorterGuiMessage.openServerGui(SorterGuiPacket.SERVER, 0, world, (EntityPlayerMP)entityplayer, Coord4D.get(tileEntity), -1); return true; } else { - if(!entityplayer.isSneaking() && MachineType.get(this, metadata).guiId != -1) + if(!entityplayer.isSneaking() && type.guiId != -1) { - entityplayer.openGui(Mekanism.instance, MachineType.get(this, metadata).guiId, world, x, y, z); + entityplayer.openGui(Mekanism.instance, type.guiId, world, x, y, z); return true; } } @@ -822,6 +839,105 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds, IPer return world.setBlockToAir(x, y, z); } + + private boolean manageInventory(EntityPlayer player, TileEntityPortableTank tileEntity) + { + ItemStack itemStack = player.getCurrentEquippedItem(); + + if(itemStack != null) + { + if(FluidContainerRegistry.isEmptyContainer(itemStack)) + { + if(tileEntity.fluidTank.getFluid() != null && tileEntity.fluidTank.getFluid().amount >= FluidContainerRegistry.BUCKET_VOLUME) + { + ItemStack filled = FluidContainerRegistry.fillFluidContainer(tileEntity.fluidTank.getFluid(), itemStack); + + if(filled != null) + { + if(player.capabilities.isCreativeMode) + { + tileEntity.fluidTank.drain(FluidContainerRegistry.getFluidForFilledItem(filled).amount, true); + + return true; + } + + if(itemStack.stackSize > 1) + { + for(int i = 0; i < player.inventory.mainInventory.length; i++) + { + if(player.inventory.mainInventory[i] == null) + { + player.inventory.mainInventory[i] = filled; + itemStack.stackSize--; + + tileEntity.fluidTank.drain(FluidContainerRegistry.getFluidForFilledItem(filled).amount, true); + + return true; + } + else if(player.inventory.mainInventory[i].isItemEqual(filled)) + { + if(filled.getMaxStackSize() > player.inventory.mainInventory[i].stackSize) + { + player.inventory.mainInventory[i].stackSize++; + itemStack.stackSize--; + + tileEntity.fluidTank.drain(FluidContainerRegistry.getFluidForFilledItem(filled).amount, true); + + return true; + } + } + } + } + else if(itemStack.stackSize == 1) + { + player.setCurrentItemOrArmor(0, filled); + + tileEntity.fluidTank.drain(FluidContainerRegistry.getFluidForFilledItem(filled).amount, true); + + return true; + } + } + } + } + else if(FluidContainerRegistry.isFilledContainer(itemStack)) + { + FluidStack itemFluid = FluidContainerRegistry.getFluidForFilledItem(itemStack); + int max = tileEntity.fluidTank.getCapacity(); + + if(tileEntity.fluidTank.getFluid() == null || (tileEntity.fluidTank.getFluid().isFluidEqual(itemFluid) && (tileEntity.fluidTank.getFluid().amount+itemFluid.amount <= max))) + { + if(FluidContainerRegistry.isBucket(itemStack)) + { + tileEntity.fluidTank.fill(itemFluid, true); + + if(!player.capabilities.isCreativeMode) + { + player.setCurrentItemOrArmor(0, new ItemStack(Items.bucket)); + } + + return true; + } + else { + if(!player.capabilities.isCreativeMode) + { + itemStack.stackSize--; + } + + if(itemStack.stackSize == 0) + { + player.setCurrentItemOrArmor(0, null); + } + + tileEntity.fluidTank.fill(itemFluid, true); + + return true; + } + } + } + } + + return false; + } @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block block) @@ -1102,7 +1218,10 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds, IPer if(!world.isRemote) { - ((TileEntityElectricBlock)tileEntity).register(); + if(tileEntity instanceof TileEntityElectricBlock) + { + ((TileEntityElectricBlock)tileEntity).register(); + } } } diff --git a/src/main/java/mekanism/common/item/ItemBlockMachine.java b/src/main/java/mekanism/common/item/ItemBlockMachine.java index c1cd2746b..ee6049595 100644 --- a/src/main/java/mekanism/common/item/ItemBlockMachine.java +++ b/src/main/java/mekanism/common/item/ItemBlockMachine.java @@ -7,6 +7,7 @@ import ic2.api.item.ISpecialElectricItem; import java.util.List; +import mekanism.api.Coord4D; import mekanism.api.EnumColor; import mekanism.api.energy.EnergizedItemManager; import mekanism.api.energy.IEnergizedItem; @@ -27,6 +28,7 @@ import mekanism.common.inventory.InventoryElectricChest; import mekanism.common.miner.MinerFilter; import mekanism.common.network.PacketElectricChest.ElectricChestMessage; import mekanism.common.network.PacketElectricChest.ElectricChestPacketType; +import mekanism.common.tile.TileEntityBasicBlock; import mekanism.common.tile.TileEntityChemicalInfuser; import mekanism.common.tile.TileEntityChemicalOxidizer; import mekanism.common.tile.TileEntityDigitalMiner; @@ -34,12 +36,14 @@ import mekanism.common.tile.TileEntityElectricBlock; import mekanism.common.tile.TileEntityElectricChest; import mekanism.common.tile.TileEntityFactory; import mekanism.common.tile.TileEntityLogisticalSorter; +import mekanism.common.tile.TileEntityPortableTank; import mekanism.common.tile.TileEntityRotaryCondensentrator; import mekanism.common.transporter.TransporterFilter; import mekanism.common.util.LangUtils; import mekanism.common.util.MekanismUtils; import mekanism.common.util.TransporterUtils; import net.minecraft.block.Block; +import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -50,8 +54,11 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; @@ -178,8 +185,10 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata) { boolean place = true; + + MachineType type = MachineType.get(stack); - if(MachineType.get(stack) == MachineType.DIGITAL_MINER) + if(type == MachineType.DIGITAL_MINER) { for(int xPos = x-1; xPos <= x+1; xPos++) { @@ -190,18 +199,29 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec Block b = world.getBlock(xPos, yPos, zPos); if(yPos > 255) + { place = false; + } if(!b.isAir(world, xPos, yPos, zPos) && !b.isReplaceable(world, xPos, yPos, zPos)) + { return false; + } } } } } + else if(type == MachineType.PORTABLE_TANK) + { + if(getBucketMode(stack)) + { + return false; + } + } if(place && super.placeBlockAt(stack, player, world, x, y, z, side, hitX, hitY, hitZ, metadata)) { - TileEntityElectricBlock tileEntity = (TileEntityElectricBlock)world.getTileEntity(x, y, z); + TileEntityBasicBlock tileEntity = (TileEntityBasicBlock)world.getTileEntity(x, y, z); if(tileEntity instanceof IUpgradeManagement) { @@ -339,7 +359,10 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec ((ISustainedInventory)tileEntity).setInventory(getInventory(stack)); - tileEntity.electricityStored = getEnergy(stack); + if(tileEntity instanceof TileEntityElectricBlock) + { + ((TileEntityElectricBlock)tileEntity).electricityStored = getEnergy(stack); + } return true; } @@ -374,7 +397,9 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec @Override public void onUpdate(ItemStack itemstack, World world, Entity entity, int i, boolean flag) { - if(MachineType.get(itemstack) == MachineType.ELECTRIC_CHEST) + MachineType type = MachineType.get(itemstack); + + if(type == MachineType.ELECTRIC_CHEST) { if(world != null && !world.isRemote) { @@ -421,6 +446,18 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec } } } + else if(type == MachineType.PORTABLE_TANK) + { + if(world.isRemote) + { + float targetScale = (float)(getFluidStack(itemstack) != null ? getFluidStack(itemstack).amount : 0)/TileEntityPortableTank.MAX_FLUID; + + if(Math.abs(getPrevScale(itemstack) - targetScale) > 0.01) + { + setPrevScale(itemstack, (9*getPrevScale(itemstack) + targetScale)/10); + } + } + } } @Override @@ -512,12 +549,52 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec return false; } + public boolean tryPlaceContainedLiquid(World world, ItemStack itemstack, int x, int y, int z) + { + if(getFluidStack(itemstack) == null) + { + return false; + } + else { + Material material = world.getBlock(x, y, z).getMaterial(); + boolean flag = !material.isSolid(); + + if(!world.isAirBlock(x, y, z) && !flag) + { + return false; + } + else { + if(world.provider.isHellWorld && getFluidStack(itemstack).getFluid() == FluidRegistry.WATER) + { + world.playSoundEffect(x + 0.5F, y + 0.5F, z + 0.5F, "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + + for(int l = 0; l < 8; l++) + { + world.spawnParticle("largesmoke", x + Math.random(), y + Math.random(), z + Math.random(), 0.0D, 0.0D, 0.0D); + } + } + else { + if(!world.isRemote && flag && !material.isLiquid()) + { + world.func_147480_a(x, y, z, true); + } + + world.setBlock(x, y, z, getFluidStack(itemstack).getFluid().getBlock(), 0, 3); + } + + return true; + } + } + } + @Override public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer) { - if(!world.isRemote) + MachineType type = MachineType.get(itemstack); + + if(MachineType.get(itemstack) == MachineType.ELECTRIC_CHEST) { - if(MachineType.get(itemstack) == MachineType.ELECTRIC_CHEST) + if(!world.isRemote) { if(!getAuthenticated(itemstack)) { @@ -533,6 +610,83 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec } } } + else if(type == MachineType.PORTABLE_TANK && getBucketMode(itemstack)) + { + MovingObjectPosition pos = getMovingObjectPositionFromPlayer(world, entityplayer, !entityplayer.isSneaking()); + + if(pos == null) + { + return itemstack; + } + else { + if(pos.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + Coord4D coord = new Coord4D(pos.blockX, pos.blockY, pos.blockZ, world.provider.dimensionId); + + if(!world.canMineBlock(entityplayer, coord.xCoord, coord.yCoord, coord.zCoord)) + { + return itemstack; + } + + if(!entityplayer.isSneaking()) + { + if(!entityplayer.canPlayerEdit(coord.xCoord, coord.yCoord, coord.zCoord, pos.sideHit, itemstack)) + { + return itemstack; + } + + FluidStack fluid = MekanismUtils.getFluid(world, coord.xCoord, coord.yCoord, coord.zCoord); + + if(fluid != null && (getFluidStack(itemstack) == null || getFluidStack(itemstack).isFluidEqual(fluid))) + { + int needed = TileEntityPortableTank.MAX_FLUID-(getFluidStack(itemstack) != null ? getFluidStack(itemstack).amount : 0); + + if(fluid.amount > needed) + { + return itemstack; + } + + if(getFluidStack(itemstack) == null) + { + setFluidStack(fluid, itemstack); + } + else { + FluidStack newStack = getFluidStack(itemstack); + newStack.amount += fluid.amount; + setFluidStack(newStack, itemstack); + } + + world.setBlockToAir(coord.xCoord, coord.yCoord, coord.zCoord); + } + } + else { + FluidStack stored = getFluidStack(itemstack); + + if(stored == null || stored.amount < FluidContainerRegistry.BUCKET_VOLUME) + { + return itemstack; + } + + Coord4D trans = coord.getFromSide(ForgeDirection.getOrientation(pos.sideHit)); + + if(!entityplayer.canPlayerEdit(trans.xCoord, trans.yCoord, trans.zCoord, pos.sideHit, itemstack)) + { + return itemstack; + } + + if(tryPlaceContainedLiquid(world, itemstack, trans.xCoord, trans.yCoord, trans.zCoord) && !entityplayer.capabilities.isCreativeMode) + { + FluidStack newStack = stored.copy(); + newStack.amount -= FluidContainerRegistry.BUCKET_VOLUME; + + setFluidStack(newStack.amount > 0 ? newStack : null, itemstack); + } + } + } + + return itemstack; + } + } return itemstack; } @@ -596,11 +750,6 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec @Override public void setFluidStack(FluidStack fluidStack, Object... data) { - if(fluidStack == null || fluidStack.amount == 0 || fluidStack.fluidID == 0) - { - return; - } - if(data[0] instanceof ItemStack) { ItemStack itemStack = (ItemStack)data[0]; @@ -609,8 +758,14 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec { itemStack.setTagCompound(new NBTTagCompound()); } - - itemStack.stackTagCompound.setTag("fluidTank", fluidStack.writeToNBT(new NBTTagCompound())); + + if(fluidStack == null || fluidStack.amount == 0 || fluidStack.fluidID == 0) + { + itemStack.stackTagCompound.setTag("fluidTank", null); + } + else { + itemStack.stackTagCompound.setTag("fluidTank", fluidStack.writeToNBT(new NBTTagCompound())); + } } } @@ -638,8 +793,15 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec @Override public boolean hasTank(Object... data) { - return data[0] instanceof ItemStack && ((ItemStack)data[0]).getItem() instanceof ISustainedTank && (MachineType.get((ItemStack)data[0]) == MachineType.ELECTRIC_PUMP - || MachineType.get((ItemStack)data[0]) == MachineType.ROTARY_CONDENSENTRATOR); + if(!(data[0] instanceof ItemStack) || !(((ItemStack)data[0]).getItem() instanceof ISustainedTank)) + { + return false; + } + + MachineType type = MachineType.get((ItemStack)data[0]); + + return type == MachineType.ELECTRIC_PUMP || type == MachineType.ROTARY_CONDENSENTRATOR + || type == MachineType.PORTABLE_TANK; } @Override @@ -730,48 +892,44 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec return itemStack.stackTagCompound.getBoolean("open"); } - @Override - public void setLidAngle(ItemStack itemStack, float lidAngle) + public void setPrevScale(ItemStack itemStack, float prevLidAngle) { if(itemStack.stackTagCompound == null) { itemStack.setTagCompound(new NBTTagCompound()); } - itemStack.stackTagCompound.setFloat("lidAngle", lidAngle); + itemStack.stackTagCompound.setFloat("prevScale", prevLidAngle); } - @Override - public float getLidAngle(ItemStack itemStack) + public float getPrevScale(ItemStack itemStack) { if(itemStack.stackTagCompound == null) { return 0.0F; } - return itemStack.stackTagCompound.getFloat("lidAngle"); + return itemStack.stackTagCompound.getFloat("prevScale"); } - - @Override - public void setPrevLidAngle(ItemStack itemStack, float prevLidAngle) + + public void setBucketMode(ItemStack itemStack, boolean bucketMode) { if(itemStack.stackTagCompound == null) { itemStack.setTagCompound(new NBTTagCompound()); } - itemStack.stackTagCompound.setFloat("prevLidAngle", prevLidAngle); + itemStack.stackTagCompound.setBoolean("bucketMode", bucketMode); } - - @Override - public float getPrevLidAngle(ItemStack itemStack) + + public boolean getBucketMode(ItemStack itemStack) { if(itemStack.stackTagCompound == null) { - return 0.0F; + return false; } - return itemStack.stackTagCompound.getFloat("prevLidAngle"); + return itemStack.stackTagCompound.getBoolean("bucketMode"); } @Override diff --git a/src/main/java/mekanism/common/network/PacketPortableTankState.java b/src/main/java/mekanism/common/network/PacketPortableTankState.java new file mode 100644 index 000000000..c04a30158 --- /dev/null +++ b/src/main/java/mekanism/common/network/PacketPortableTankState.java @@ -0,0 +1,50 @@ +package mekanism.common.network; + +import io.netty.buffer.ByteBuf; +import mekanism.common.PacketHandler; +import mekanism.common.item.ItemBlockMachine; +import mekanism.common.network.PacketPortableTankState.PortableTankStateMessage; +import net.minecraft.item.ItemStack; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; + +public class PacketPortableTankState implements IMessageHandler +{ + @Override + public IMessage onMessage(PortableTankStateMessage message, MessageContext context) + { + ItemStack itemstack = PacketHandler.getPlayer(context).getCurrentEquippedItem(); + + if(itemstack != null && itemstack.getItem() instanceof ItemBlockMachine) + { + ((ItemBlockMachine)itemstack.getItem()).setBucketMode(itemstack, message.bucketMode); + } + + return null; + } + + public static class PortableTankStateMessage implements IMessage + { + public boolean bucketMode; + + public PortableTankStateMessage() {} + + public PortableTankStateMessage(boolean state) + { + bucketMode = state; + } + + @Override + public void toBytes(ByteBuf dataStream) + { + dataStream.writeBoolean(bucketMode); + } + + @Override + public void fromBytes(ByteBuf dataStream) + { + bucketMode = dataStream.readBoolean(); + } + } +} \ No newline at end of file diff --git a/src/main/java/mekanism/common/tile/TileEntityPortableTank.java b/src/main/java/mekanism/common/tile/TileEntityPortableTank.java index e37908b8a..b975733c6 100644 --- a/src/main/java/mekanism/common/tile/TileEntityPortableTank.java +++ b/src/main/java/mekanism/common/tile/TileEntityPortableTank.java @@ -30,10 +30,16 @@ public class TileEntityPortableTank extends TileEntityContainerBlock implements public boolean clientActive; - public FluidTank fluidTank = new FluidTank(14000); + public static final int MAX_FLUID = 14000; + + public FluidTank fluidTank = new FluidTank(MAX_FLUID); public int updateDelay; + public int prevAmount; + + public float prevScale; + public TileEntityPortableTank() { super("PortableTank"); @@ -62,8 +68,32 @@ public class TileEntityPortableTank extends TileEntityContainerBlock implements MekanismUtils.updateBlock(worldObj, xCoord, yCoord, zCoord); } } + + float targetScale = (float)(fluidTank.getFluid() != null ? fluidTank.getFluid().amount : 0)/fluidTank.getCapacity(); + + if(Math.abs(prevScale - targetScale) > 0.01) + { + prevScale = (9*prevScale + targetScale)/10; + } } else { + if(updateDelay > 0) + { + updateDelay--; + + if(updateDelay == 0 && clientActive != isActive) + { + Mekanism.packetHandler.sendToAllAround(new TileEntityMessage(Coord4D.get(this), getNetworkedData(new ArrayList())), Coord4D.get(this).getTargetPoint(50)); + } + } + + if(fluidTank.getFluidAmount() != prevAmount) + { + Mekanism.packetHandler.sendToAllAround(new TileEntityMessage(Coord4D.get(this), getNetworkedData(new ArrayList())), Coord4D.get(this).getTargetPoint(50)); + } + + prevAmount = fluidTank.getFluidAmount(); + if(inventory[0] != null) { manageInventory(); diff --git a/src/main/java/mekanism/common/util/MekanismUtils.java b/src/main/java/mekanism/common/util/MekanismUtils.java index 14b303338..5b7ab45fa 100644 --- a/src/main/java/mekanism/common/util/MekanismUtils.java +++ b/src/main/java/mekanism/common/util/MekanismUtils.java @@ -721,11 +721,11 @@ public final class MekanismUtils return null; } - if(block == Blocks.water && meta == 0) + if((block == Blocks.water || block == Blocks.flowing_water) && meta == 0) { return new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME); } - else if(block == Blocks.lava && meta == 0) + else if((block == Blocks.lava || block == Blocks.flowing_lava) && meta == 0) { return new FluidStack(FluidRegistry.LAVA, FluidContainerRegistry.BUCKET_VOLUME); } @@ -760,11 +760,11 @@ public final class MekanismUtils return 0; } - if(block == Blocks.water) + if(block == Blocks.water || block == Blocks.flowing_water) { return FluidRegistry.WATER.getID(); } - else if(block == Blocks.lava) + else if(block == Blocks.lava || block == Blocks.flowing_lava) { return FluidRegistry.LAVA.getID(); } @@ -798,11 +798,11 @@ public final class MekanismUtils return false; } - if(block == Blocks.water && meta != 0) + if((block == Blocks.water || block == Blocks.flowing_water) && meta != 0) { return true; } - else if(block == Blocks.lava && meta != 0) + else if((block == Blocks.lava || block == Blocks.flowing_lava) && meta != 0) { return true; } diff --git a/src/main/resources/assets/mekanism/lang/en_US.lang b/src/main/resources/assets/mekanism/lang/en_US.lang index cefb1e78a..bc3142690 100644 --- a/src/main/resources/assets/mekanism/lang/en_US.lang +++ b/src/main/resources/assets/mekanism/lang/en_US.lang @@ -101,6 +101,7 @@ tile.MachineBlock2.ChemicalCrystallizer.name=Chemical Crystallizer tile.MachineBlock2.SeismicVibrator.name=Seismic Vibrator tile.MachineBlock2.PressurizedReactionChamber.name=Pressurized Reaction Chamber tile.MachineBlock2.PressurizedReactionChamber.short.name=PRC +tile.MachineBlock2.PortableTank.name=Portable Tank //Plastic tile.PlasticBlock.name=Plastic Block