diff --git a/src/main/java/appeng/client/gui/implementations/GuiInterfaceTerminal.java b/src/main/java/appeng/client/gui/implementations/GuiInterfaceTerminal.java index c11f5ea22..8578ed2ad 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiInterfaceTerminal.java +++ b/src/main/java/appeng/client/gui/implementations/GuiInterfaceTerminal.java @@ -217,7 +217,8 @@ public class GuiInterfaceTerminal extends AEBaseGui { BlockPos blockPos = blockPosHashMap.get( guiButtonHashMap.get( this.selectedButton ) ); BlockPos blockPos2 = mc.player.getPosition(); - hilightBlock( blockPos, System.currentTimeMillis() + 500 * BlockPosUtils.getDistance(blockPos, blockPos2) ); + int dimension = mc.world.provider.getDimension(); + hilightBlock( blockPos, System.currentTimeMillis() + 500 * BlockPosUtils.getDistance(blockPos, blockPos2), dimension ); mc.player.sendStatusMessage( new TextComponentString( "The interface is now highlighted at " + "X: " + blockPos.getX() + " Y: " + blockPos.getY() + " Z: " + blockPos.getZ() ), false ); mc.player.closeScreen(); } diff --git a/src/main/java/appeng/client/render/BlockPosHighlighter.java b/src/main/java/appeng/client/render/BlockPosHighlighter.java index 728430ab3..01fd90ff9 100644 --- a/src/main/java/appeng/client/render/BlockPosHighlighter.java +++ b/src/main/java/appeng/client/render/BlockPosHighlighter.java @@ -8,9 +8,14 @@ public class BlockPosHighlighter private static BlockPos hilightedBlock; private static long expireHilight; - public static void hilightBlock( BlockPos c, long expireHilight ) { + + + private static int dimension; + + public static void hilightBlock( BlockPos c, long expireHilight, int dimension ) { hilightedBlock = c; BlockPosHighlighter.expireHilight = expireHilight; + BlockPosHighlighter.dimension = dimension; } public static BlockPos getHilightedBlock() { @@ -21,5 +26,9 @@ public class BlockPosHighlighter return expireHilight; } + public static int getDimension() + { + return dimension; + } } diff --git a/src/main/java/appeng/client/render/TesrRenderHelper.java b/src/main/java/appeng/client/render/TesrRenderHelper.java index 9d20cafe0..c7156aa9e 100644 --- a/src/main/java/appeng/client/render/TesrRenderHelper.java +++ b/src/main/java/appeng/client/render/TesrRenderHelper.java @@ -19,6 +19,7 @@ package appeng.client.render; +import appeng.api.storage.data.IAEFluidStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.GlStateManager; @@ -30,6 +31,7 @@ import net.minecraft.util.EnumFacing; import appeng.api.storage.data.IAEItemStack; import appeng.util.IWideReadableNumberConverter; import appeng.util.ReadableNumberConverter; +import net.minecraftforge.fluids.FluidStack; /** @@ -143,4 +145,23 @@ public class TesrRenderHelper } + public static void renderFluid2dWithAmount( IAEFluidStack fluidStack, float scale, float spacing ) + { + final ItemStack renderStack = fluidStack.asItemStackRepresentation(); + + TesrRenderHelper.renderItem2d( renderStack, scale ); + + final long stackSize = fluidStack.getStackSize() / 1000; + final String renderedStackSize = NUMBER_CONVERTER.toWideReadableForm( stackSize ) + "B"; + + // Render the item count + final FontRenderer fr = Minecraft.getMinecraft().fontRenderer; + final int width = fr.getStringWidth( renderedStackSize ); + GlStateManager.translate( 0.0f, spacing, 0 ); + GlStateManager.scale( 1.0f / 62.0f, 1.0f / 62.0f, 1.0f / 62.0f ); + GlStateManager.translate( -0.5f * width, 0.0f, 0.5f ); + fr.drawString( renderedStackSize, 0, 0, 0 ); + + } + } diff --git a/src/main/java/appeng/helpers/HighlighterHandler.java b/src/main/java/appeng/helpers/HighlighterHandler.java index abd1e3b6d..3c35850a2 100644 --- a/src/main/java/appeng/helpers/HighlighterHandler.java +++ b/src/main/java/appeng/helpers/HighlighterHandler.java @@ -26,10 +26,11 @@ public class HighlighterHandler return; } Minecraft mc = Minecraft.getMinecraft(); + int dimension = mc.world.provider.getDimension(); long time = System.currentTimeMillis(); - if (time > BlockPosHighlighter.getExpireHilight()) { - BlockPosHighlighter.hilightBlock(null, -1); + if (time > BlockPosHighlighter.getExpireHilight() || dimension != BlockPosHighlighter.getDimension()) { + BlockPosHighlighter.hilightBlock(null, -1, BlockPosHighlighter.getDimension() ); return; } diff --git a/src/main/java/appeng/parts/reporting/AbstractPartMonitor.java b/src/main/java/appeng/parts/reporting/AbstractPartMonitor.java index c45c7614e..5c332f41d 100644 --- a/src/main/java/appeng/parts/reporting/AbstractPartMonitor.java +++ b/src/main/java/appeng/parts/reporting/AbstractPartMonitor.java @@ -21,6 +21,10 @@ package appeng.parts.reporting; import java.io.IOException; +import appeng.api.storage.channels.IFluidStorageChannel; +import appeng.api.storage.data.IAEFluidStack; +import appeng.fluids.util.AEFluidStack; +import appeng.util.item.AEStack; import io.netty.buffer.ByteBuf; import net.minecraft.client.renderer.GlStateManager; @@ -31,6 +35,9 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -70,7 +77,9 @@ import appeng.util.item.AEItemStack; public abstract class AbstractPartMonitor extends AbstractPartDisplay implements IPartStorageMonitor, IStackWatcherHost { private static final IWideReadableNumberConverter NUMBER_CONVERTER = ReadableNumberConverter.INSTANCE; + private IAEItemStack configuredItem; + private IAEFluidStack configuredFluid; private String lastHumanReadableText; private boolean isLocked; private IStackWatcher myWatcher; @@ -90,6 +99,9 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements final NBTTagCompound myItem = data.getCompoundTag( "configuredItem" ); this.configuredItem = AEItemStack.fromNBT( myItem ); + + final NBTTagCompound myFluid = data.getCompoundTag( "configuredFluid" ); + this.configuredFluid = AEFluidStack.fromNBT( myFluid ); } @Override @@ -104,8 +116,15 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements { this.configuredItem.writeToNBT( myItem ); } + final NBTTagCompound myFluid = new NBTTagCompound(); + if( this.configuredFluid != null ) + { + this.configuredFluid.writeToNBT( myFluid ); + } data.setTag( "configuredItem", myItem ); + data.setTag( "configuredFluid", myFluid ); + } @Override @@ -114,11 +133,17 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements super.writeToStream( data ); data.writeBoolean( this.isLocked ); - data.writeBoolean( this.configuredItem != null ); + //is configured + data.writeBoolean( this.configuredItem != null); + data.writeBoolean( this.configuredFluid != null); if( this.configuredItem != null ) { this.configuredItem.writeToPacket( data ); } + else if( this.configuredFluid != null ) + { + this.configuredFluid.writeToPacket( data ); + } } @Override @@ -131,14 +156,22 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements this.isLocked = isLocked; - final boolean val = data.readBoolean(); - if( val ) + final boolean isItem = data.readBoolean(); + final boolean isFluid = data.readBoolean(); + if( isItem ) { this.configuredItem = AEItemStack.fromPacket( data ); + this.configuredFluid = null; + } + else if( isFluid ) + { + this.configuredFluid = AEFluidStack.fromPacket( data ); + this.configuredItem = null; } else { this.configuredItem = null; + this.configuredFluid = null; } return needRedraw; @@ -165,7 +198,25 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements if( !this.isLocked ) { final ItemStack eq = player.getHeldItem( hand ); - this.configuredItem = AEItemStack.fromItemStack( eq ); + FluidStack fluidInTank = null; + + if( eq.hasCapability( CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null ) ) + { + IFluidHandlerItem fluidHandlerItem = ( eq.getCapability( CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null ) ); + fluidInTank = fluidHandlerItem.drain( Integer.MAX_VALUE, false ); + } + + if (fluidInTank == null) + { + this.configuredFluid = null; + this.configuredItem = AEItemStack.fromItemStack( eq ); + } + else if( fluidInTank.amount > 0 ) + { + this.configuredFluid = AEFluidStack.fromFluidStack( fluidInTank ); + this.configuredItem = null; + } + this.configureWatchers(); this.getHost().markForSave(); this.getHost().markForUpdate(); @@ -227,6 +278,16 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements this.updateReportingValue( this.getProxy().getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ) ); } + else if ( this.configuredFluid != null ) + { + if( this.myWatcher != null ) + { + this.myWatcher.add( this.configuredFluid ); + } + + this.updateReportingValue( + this.getProxy().getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) ) ); + } } catch( final GridAccessException e ) { @@ -234,11 +295,12 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements } } - private void updateReportingValue( final IMEMonitor itemInventory ) + private > void updateReportingValue ( final IMEMonitor monitor ) { - if( this.configuredItem != null ) + + if( this.configuredItem != null) { - final IAEItemStack result = itemInventory.getStorageList().findPrecise( this.configuredItem ); + final IAEItemStack result = (IAEItemStack) monitor.getStorageList().findPrecise( (T) this.configuredItem ); if( result == null ) { this.configuredItem.setStackSize( 0 ); @@ -248,6 +310,18 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements this.configuredItem.setStackSize( result.getStackSize() ); } } + else if( this.configuredFluid != null) + { + final IAEFluidStack result = (IAEFluidStack) monitor.getStorageList().findPrecise( (T) this.configuredFluid ); + if( result == null ) + { + this.configuredFluid.setStackSize( 0 ); + } + else + { + this.configuredFluid.setStackSize( result.getStackSize() ); + } + } } @Override @@ -260,7 +334,7 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements return; } - final IAEItemStack ais = this.getDisplayed(); + IAEStack ais = this.getDisplayed(); if( ais == null ) { @@ -274,8 +348,10 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements TesrRenderHelper.moveToFace( facing ); TesrRenderHelper.rotateToFace( facing, this.getSpin() ); - TesrRenderHelper.renderItem2dWithAmount( ais, 0.8f, 0.17f ); - + if (ais instanceof IAEItemStack) + TesrRenderHelper.renderItem2dWithAmount( (IAEItemStack) ais, 0.8f, 0.17f ); + if (ais instanceof IAEFluidStack) + TesrRenderHelper.renderFluid2dWithAmount( (IAEFluidStack) ais, 0.8f, 0.17f ); GlStateManager.popMatrix(); } @@ -287,9 +363,13 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements } @Override - public IAEItemStack getDisplayed() + public IAEStack getDisplayed() { + if (this.configuredItem != null) return this.configuredItem; + else if (this.configuredFluid != null) + return this.configuredFluid; + return null; } @Override @@ -322,6 +402,26 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements final long stackSize = this.configuredItem.getStackSize(); final String humanReadableText = NUMBER_CONVERTER.toWideReadableForm( stackSize ); + if( !humanReadableText.equals( this.lastHumanReadableText ) ) + { + this.lastHumanReadableText = humanReadableText; + this.getHost().markForUpdate(); + } + } + else if( this.configuredFluid != null ) + { + if( fullStack == null ) + { + this.configuredFluid.setStackSize( 0 ); + } + else + { + this.configuredFluid.setStackSize( fullStack.getStackSize() ); + } + + final long stackSize = this.configuredFluid.getStackSize() / 1000; + final String humanReadableText = NUMBER_CONVERTER.toWideReadableForm( stackSize ) + "B"; + if( !humanReadableText.equals( this.lastHumanReadableText ) ) { this.lastHumanReadableText = humanReadableText; diff --git a/src/main/java/appeng/parts/reporting/PartConversionMonitor.java b/src/main/java/appeng/parts/reporting/PartConversionMonitor.java index fd2bc5514..121324d0f 100644 --- a/src/main/java/appeng/parts/reporting/PartConversionMonitor.java +++ b/src/main/java/appeng/parts/reporting/PartConversionMonitor.java @@ -19,15 +19,31 @@ package appeng.parts.reporting; +import java.io.IOException; import java.util.Collections; import java.util.List; +import java.util.Objects; +import appeng.api.config.Actionable; +import appeng.api.storage.channels.IFluidStorageChannel; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEStack; +import appeng.core.AELog; +import appeng.core.sync.network.NetworkHandler; +import appeng.core.sync.packets.PacketInventoryAction; +import appeng.fluids.util.AEFluidStack; +import appeng.helpers.InventoryAction; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.Vec3d; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; @@ -92,6 +108,13 @@ public class PartConversionMonitor extends AbstractPartMonitor } final ItemStack eq = player.getHeldItem( hand ); + FluidStack fluidInTank = null; + if( eq.hasCapability( CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null ) ) + { + IFluidHandlerItem fluidHandlerItem = ( eq.getCapability( CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null ) ); + fluidInTank = fluidHandlerItem.drain( Integer.MAX_VALUE, false ); + } + if( this.isLocked() ) { if( eq.isEmpty() ) @@ -103,18 +126,49 @@ public class PartConversionMonitor extends AbstractPartMonitor // wrench it return super.onPartActivate( player, hand, pos ); } + else if( fluidInTank != null && fluidInTank.amount > 0 ) + { + if( this.getDisplayed() != null && getDisplayed().equals( AEFluidStack.fromFluidStack( fluidInTank ) ) ) + { + this.drainFluidContainer( player, hand ); + } + } else { this.insertItem( player, hand, false ); } + } - else if( this.getDisplayed() != null && this.getDisplayed().equals( eq ) ) + + //If its a fluid container, grab its fluidstack. if its empty pass its itemstack; + + if (eq.isEmpty()){ + return super.onPartActivate( player, hand, pos ); + } + if( fluidInTank != null && fluidInTank.amount > 0 ) { - this.insertItem( player, hand, false ); + if( getDisplayed() instanceof IAEItemStack || getDisplayed() == null ) + { + return super.onPartActivate( player, hand, pos ); + } + if( ( (IAEFluidStack) this.getDisplayed() ).equals( AEFluidStack.fromFluidStack( fluidInTank ) ) ) + { + this.drainFluidContainer( player, hand ); + } + else { + return super.onPartActivate( player, hand, pos ); + } } else { - return super.onPartActivate( player, hand, pos ); + if( getDisplayed() instanceof IAEFluidStack || getDisplayed() == null ) + { + return super.onPartActivate( player, hand, pos ); + } + if( ( (IAEItemStack) this.getDisplayed() ).equals( eq ) ) + { + this.insertItem( player, hand, false ); + } } return true; @@ -138,9 +192,14 @@ public class PartConversionMonitor extends AbstractPartMonitor return false; } - if( this.getDisplayed() != null ) + ItemStack eq = player.getHeldItem( hand ); + if( this.getDisplayed() != null && this.getDisplayed() instanceof IAEItemStack ) { - this.extractItem( player, this.getDisplayed().getDefinition().getMaxStackSize() ); + this.extractItem( player, ( (IAEItemStack) this.getDisplayed() ).getDefinition().getMaxStackSize() ); + } + else if( this.getDisplayed() != null && this.getDisplayed() instanceof IAEFluidStack ) + { + this.fillFluidContainer( player,hand ); } return true; @@ -183,9 +242,9 @@ public class PartConversionMonitor extends AbstractPartMonitor if( allItems ) { - if( this.getDisplayed() != null ) + if( this.getDisplayed() != null && this.getDisplayed() instanceof IAEItemStack) { - final IAEItemStack input = this.getDisplayed().copy(); + final IAEItemStack input = (IAEItemStack) this.getDisplayed().copy(); IItemHandler inv = new PlayerMainInvWrapper( player.inventory ); for( int x = 0; x < inv.getSlots(); x++ ) @@ -221,7 +280,9 @@ public class PartConversionMonitor extends AbstractPartMonitor private void extractItem( final EntityPlayer player, int count ) { - final IAEItemStack input = this.getDisplayed(); + if (!(this.getDisplayed() instanceof IAEItemStack)) + return; + final IAEItemStack input = (IAEItemStack) this.getDisplayed(); if( input != null ) { try @@ -265,6 +326,141 @@ public class PartConversionMonitor extends AbstractPartMonitor } } + private void drainFluidContainer( final EntityPlayer player, final EnumHand hand ) { + try + { + final ItemStack held = player.getHeldItem( hand ); + if( held.getCount() != 1 ) + { + // only support stacksize 1 for now + return; + } + + final IFluidHandlerItem fh = FluidUtil.getFluidHandler( held ); + if( fh == null ) + { + // only fluid handlers items + return; + } + + // See how much we can drain from the item + final FluidStack extract = fh.drain( Integer.MAX_VALUE, false ); + if( extract == null || extract.amount < 1 ) + { + return; + } + + // Check if we can push into the system + final IEnergySource energy = this.getProxy().getEnergy(); + final IMEMonitor cell = this.getProxy() + .getStorage() + .getInventory( + AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) ); + final IAEFluidStack notStorable = Platform.poweredInsert( energy, cell, AEFluidStack.fromFluidStack( extract ), new PlayerSource( player, this ), Actionable.SIMULATE ); + + if( notStorable != null && notStorable.getStackSize() > 0 ) + { + final int toStore = (int) ( extract.amount - notStorable.getStackSize() ); + final FluidStack storable = fh.drain( toStore, false ); + + if( storable == null || storable.amount == 0 ) + { + return; + } + else + { + extract.amount = storable.amount; + } + } + + // Actually drain + final FluidStack drained = fh.drain( extract, true ); + extract.amount = drained.amount; + + final IAEFluidStack notInserted = Platform.poweredInsert( energy, cell, AEFluidStack.fromFluidStack( extract ), new PlayerSource( player, this ) ); + + if( notInserted != null && notInserted.getStackSize() > 0 ) + { + AELog.error( "Fluid item [%s] reported a different possible amount to drain than it actually provided.", held.getDisplayName() ); + } + + player.setHeldItem( hand, fh.getContainer() ); + } + catch( GridAccessException e ) + { + e.printStackTrace(); + } + } + + private void fillFluidContainer( final EntityPlayer player, final EnumHand hand ) + { + try + { + final ItemStack held = player.getHeldItem( hand ); + if( held.getCount() != 1 ) + { + // only support stacksize 1 for now + return; + } + + final IFluidHandlerItem fh = FluidUtil.getFluidHandler( held ); + if( fh == null ) + { + // only fluid handlers items + return; + } + + final IAEFluidStack stack = (IAEFluidStack) this.getDisplayed().copy(); + + // Check how much we can store in the item + stack.setStackSize( Integer.MAX_VALUE ); + int amountAllowed = fh.fill( stack.getFluidStack(), false ); + stack.setStackSize( amountAllowed ); + + // Check if we can pull out of the system + final IEnergySource energy = this.getProxy().getEnergy(); + final IMEMonitor cell = this.getProxy() + .getStorage() + .getInventory( + AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) ); + final IAEFluidStack canPull = Platform.poweredExtraction( energy, cell, stack, new PlayerSource( player, this ), Actionable.SIMULATE ); + if( canPull == null || canPull.getStackSize() < 1 ) + { + return; + } + + // How much could fit into the container + final int canFill = fh.fill( canPull.getFluidStack(), false ); + if( canFill == 0 ) + { + return; + } + + // Now actually pull out of the system + stack.setStackSize( canFill ); + final IAEFluidStack pulled = Platform.poweredExtraction( energy, cell, stack, new PlayerSource( player, this ) ); + if( pulled == null || pulled.getStackSize() < 1 ) + { + // Something went wrong + AELog.error( "Unable to pull fluid out of the ME system even though the simulation said yes " ); + return; + } + + // Actually fill + final int used = fh.fill( pulled.getFluidStack(), true ); + + if( used != canFill ) + { + AELog.error( "Fluid item [%s] reported a different possible amount than it actually accepted.", held.getDisplayName() ); + } + player.setHeldItem( hand, fh.getContainer() ); + } + catch( GridAccessException e ) + { + e.printStackTrace(); + } + } + @Override public IPartModel getStaticModels() {