Portable Buckets...a lot more work than I thought

This commit is contained in:
Aidan C. Brady 2014-06-18 19:42:57 +02:00
parent fd74ee5c92
commit adc8a9bc23
13 changed files with 540 additions and 106 deletions

View file

@ -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)

View file

@ -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();

View file

@ -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()
{

View file

@ -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)

View file

@ -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<Fluid, DisplayInteger[]> cachedCenterFluids = new HashMap<Fluid, DisplayInteger[]>();
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;
}
}

View file

@ -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);
}

View file

@ -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);
}
/**

View file

@ -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();
}
}
}

View file

@ -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

View file

@ -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<PortableTankStateMessage, IMessage>
{
@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();
}
}
}

View file

@ -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();

View file

@ -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;
}

View file

@ -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