diff --git a/dependencies.gradle b/dependencies.gradle index aa3f074c..12fb2e62 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,8 +1,8 @@ // Add your dependencies here dependencies { - compile('com.github.GTNewHorizons:NotEnoughItems:2.3.20-GTNH:dev') - compile('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-143-GTNH:dev') + compile('com.github.GTNewHorizons:NotEnoughItems:2.3.21-GTNH:dev') + compile('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-148-GTNH-pre:dev') compile('curse.maven:cofh-core-69162:2388751') compile('com.github.GTNewHorizons:waila:1.5.22:dev') compileOnly('com.github.GTNewHorizons:ExtraCells2:2.5.25:dev') { transitive = false } diff --git a/src/main/java/com/glodblock/github/common/item/ItemFluidConversionMonitor.java b/src/main/java/com/glodblock/github/common/item/ItemFluidConversionMonitor.java new file mode 100644 index 00000000..454f1b7e --- /dev/null +++ b/src/main/java/com/glodblock/github/common/item/ItemFluidConversionMonitor.java @@ -0,0 +1,58 @@ +package com.glodblock.github.common.item; + +import appeng.api.AEApi; +import appeng.api.parts.IPartItem; +import com.glodblock.github.FluidCraft; +import com.glodblock.github.common.parts.PartFluidConversionMonitor; +import com.glodblock.github.common.tabs.FluidCraftingTabs; +import com.glodblock.github.util.NameConst; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemFluidConversionMonitor extends FCBaseItem implements IPartItem { + + public ItemFluidConversionMonitor() { + this.setMaxStackSize(64); + this.setUnlocalizedName(NameConst.ITEM_PART_FLUID_CONVERSION_MONITOR); + AEApi.instance().partHelper().setItemBusRenderer(this); + } + + @Override + public boolean onItemUse( + ItemStack stack, + EntityPlayer player, + World world, + int x, + int y, + int z, + int side, + float xOffset, + float yOffset, + float zOffset) { + return AEApi.instance().partHelper().placeBus(player.getHeldItem(), x, y, z, side, player, world); + } + + @Override + public ItemFluidConversionMonitor register() { + GameRegistry.registerItem(this, NameConst.ITEM_PART_FLUID_CONVERSION_MONITOR, FluidCraft.MODID); + setCreativeTab(FluidCraftingTabs.INSTANCE); + return this; + } + + public void registerIcons(IIconRegister _iconRegister) {} + + @SideOnly(Side.CLIENT) + public int getSpriteNumber() { + return 0; + } + + @Override + public PartFluidConversionMonitor createPartFromItemStack(ItemStack is) { + return new PartFluidConversionMonitor(is); + } +} diff --git a/src/main/java/com/glodblock/github/common/item/ItemFluidStorageMonitor.java b/src/main/java/com/glodblock/github/common/item/ItemFluidStorageMonitor.java new file mode 100644 index 00000000..d1be434b --- /dev/null +++ b/src/main/java/com/glodblock/github/common/item/ItemFluidStorageMonitor.java @@ -0,0 +1,58 @@ +package com.glodblock.github.common.item; + +import appeng.api.AEApi; +import appeng.api.parts.IPartItem; +import com.glodblock.github.FluidCraft; +import com.glodblock.github.common.parts.PartFluidStorageMonitor; +import com.glodblock.github.common.tabs.FluidCraftingTabs; +import com.glodblock.github.util.NameConst; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemFluidStorageMonitor extends FCBaseItem implements IPartItem { + + public ItemFluidStorageMonitor() { + this.setMaxStackSize(64); + this.setUnlocalizedName(NameConst.ITEM_PART_FLUID_STORAGE_MONITOR); + AEApi.instance().partHelper().setItemBusRenderer(this); + } + + @Override + public boolean onItemUse( + ItemStack stack, + EntityPlayer player, + World world, + int x, + int y, + int z, + int side, + float xOffset, + float yOffset, + float zOffset) { + return AEApi.instance().partHelper().placeBus(player.getHeldItem(), x, y, z, side, player, world); + } + + @Override + public ItemFluidStorageMonitor register() { + GameRegistry.registerItem(this, NameConst.ITEM_PART_FLUID_STORAGE_MONITOR, FluidCraft.MODID); + setCreativeTab(FluidCraftingTabs.INSTANCE); + return this; + } + + public void registerIcons(IIconRegister _iconRegister) {} + + @SideOnly(Side.CLIENT) + public int getSpriteNumber() { + return 0; + } + + @Override + public PartFluidStorageMonitor createPartFromItemStack(ItemStack is) { + return new PartFluidStorageMonitor(is); + } +} diff --git a/src/main/java/com/glodblock/github/common/parts/PartFluidConversionMonitor.java b/src/main/java/com/glodblock/github/common/parts/PartFluidConversionMonitor.java new file mode 100644 index 00000000..b9c6b934 --- /dev/null +++ b/src/main/java/com/glodblock/github/common/parts/PartFluidConversionMonitor.java @@ -0,0 +1,162 @@ +package com.glodblock.github.common.parts; + +import appeng.api.config.Actionable; +import appeng.api.networking.energy.IEnergySource; +import appeng.api.networking.security.PlayerSource; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.data.IAEFluidStack; +import appeng.me.GridAccessException; +import appeng.util.InventoryAdaptor; +import appeng.util.Platform; +import com.glodblock.github.common.item.ItemFluidPacket; +import com.glodblock.github.util.Util; +import java.util.Collections; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Vec3; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidContainerItem; +import org.apache.commons.lang3.tuple.MutablePair; + +public class PartFluidConversionMonitor extends PartFluidStorageMonitor { + public PartFluidConversionMonitor(ItemStack is) { + super(is); + } + + @Override + public boolean onPartShiftActivate(final EntityPlayer player, final Vec3 pos) { + if (Platform.isClient()) { + return true; + } + + if (!this.getProxy().isActive()) { + return false; + } + + if (!Platform.hasPermissions(this.getLocation(), player)) { + return false; + } + FluidStack fluidStack; + ItemStack item = player.getCurrentEquippedItem(); + if (item != null && item.getItem() instanceof ItemFluidPacket) { + fluidStack = ItemFluidPacket.getFluidStack(item); + } else { + fluidStack = Util.FluidUtil.getFluidFromContainer(item); + } + if (this.getDisplayed() == null + || fluidStack == null + || fluidStack.getFluid() != ((IAEFluidStack) this.getDisplayed()).getFluid()) { + return false; + } + + try { + if (!this.getProxy().isActive()) { + return false; + } + final IEnergySource energy = this.getProxy().getEnergy(); + final IMEMonitor cell = this.getProxy().getStorage().getFluidInventory(); + final IAEFluidStack input = + (IAEFluidStack) this.getDisplayed().copy().setStackSize(fluidStack.amount); + final IAEFluidStack failedToInsert = + Platform.poweredInsert(energy, cell, input, new PlayerSource(player, this)); + if (failedToInsert != null && failedToInsert.getStackSize() == input.getStackSize()) { + return false; + } else if (failedToInsert == null || failedToInsert.getStackSize() != input.getStackSize()) { + if (item.getItem() instanceof ItemFluidPacket) { + if (failedToInsert != null) { + player.getCurrentEquippedItem() + .setTagCompound( + ItemFluidPacket.newStack(failedToInsert).getTagCompound()); + return true; + } + } else { + ItemStack tmp = item.copy(); + tmp.stackSize = 1; + ItemStack tank = null; + if (failedToInsert == null) { + tank = Util.FluidUtil.clearFluid(tmp); + } else { + if (tmp.getItem() instanceof IFluidContainerItem) { + tank = Util.FluidUtil.setFluidContainerAmount(tmp, (int) failedToInsert.getStackSize()); + } else if (FluidContainerRegistry.isContainer(tmp)) { + IAEFluidStack insertedFluid = input.copy(); + insertedFluid.decStackSize(failedToInsert.getStackSize()); + this.getProxy() + .getStorage() + .getFluidInventory() + .extractItems(insertedFluid, Actionable.MODULATE, new PlayerSource(player, this)); + return false; + } + } + if (tank != null && !player.inventory.addItemStackToInventory(tank)) { + player.entityDropItem(tank, 0); + } + } + item.stackSize--; + if (item.stackSize <= 0) { + player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + } + } + + } catch (final GridAccessException e) { + // :P + } + return true; + } + + @Override + protected void extractItem(final EntityPlayer player) { + final IAEFluidStack input = (IAEFluidStack) this.getDisplayed(); + ItemStack eq = player.getCurrentEquippedItem(); + if (input != null && Util.FluidUtil.isFluidContainer(eq) && Util.FluidUtil.isEmpty(eq)) { + try { + if (!this.getProxy().isActive()) { + return; + } + + final IEnergySource energy = this.getProxy().getEnergy(); + final IMEMonitor cell = + this.getProxy().getStorage().getFluidInventory(); + ItemStack tank = eq.copy(); + tank.stackSize = 1; + MutablePair fillStack = Util.FluidUtil.fillStack(tank, input.getFluidStack()); + input.setStackSize(fillStack.left); + + final IAEFluidStack retrieved = + Platform.poweredExtraction(energy, cell, input, new PlayerSource(player, this)); + if (retrieved != null) { + if (!player.inventory.addItemStackToInventory(fillStack.right)) { + player.entityDropItem(fillStack.right.copy(), 0); + } + eq.stackSize--; + if (eq.stackSize <= 0) { + player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + } + final InventoryAdaptor adaptor = InventoryAdaptor.getAdaptor(player, ForgeDirection.UNKNOWN); + ItemStack newItems = adaptor.addItems( + Util.FluidUtil.setFluidContainerAmount(fillStack.right, (int) retrieved.getStackSize())); + if (newItems != null) { + final TileEntity te = this.getTile(); + final List list = Collections.singletonList(newItems); + Platform.spawnDrops( + player.worldObj, + te.xCoord + this.getSide().offsetX, + te.yCoord + this.getSide().offsetY, + te.zCoord + this.getSide().offsetZ, + list); + } + + if (player.openContainer != null) { + player.openContainer.detectAndSendChanges(); + } + } + } catch (final GridAccessException e) { + // :P + } + } + } +} diff --git a/src/main/java/com/glodblock/github/common/parts/PartFluidStorageMonitor.java b/src/main/java/com/glodblock/github/common/parts/PartFluidStorageMonitor.java new file mode 100644 index 00000000..8ffb6f58 --- /dev/null +++ b/src/main/java/com/glodblock/github/common/parts/PartFluidStorageMonitor.java @@ -0,0 +1,35 @@ +package com.glodblock.github.common.parts; + +import appeng.client.texture.CableBusTextures; +import appeng.helpers.Reflected; +import com.glodblock.github.common.parts.base.FCPartMonitor; +import net.minecraft.item.ItemStack; + +public class PartFluidStorageMonitor extends FCPartMonitor { + + private static final CableBusTextures FRONT_BRIGHT_ICON = CableBusTextures.PartStorageMonitor_Bright; + private static final CableBusTextures FRONT_DARK_ICON = CableBusTextures.PartStorageMonitor_Dark; + private static final CableBusTextures FRONT_COLORED_ICON = CableBusTextures.PartStorageMonitor_Colored; + private static final CableBusTextures FRONT_COLORED_ICON_LOCKED = + CableBusTextures.PartStorageMonitor_Colored_Locked; + + @Reflected + public PartFluidStorageMonitor(final ItemStack is) { + super(is); + } + + @Override + public CableBusTextures getFrontBright() { + return FRONT_BRIGHT_ICON; + } + + @Override + public CableBusTextures getFrontColored() { + return this.isLocked() ? FRONT_COLORED_ICON_LOCKED : FRONT_COLORED_ICON; + } + + @Override + public CableBusTextures getFrontDark() { + return FRONT_DARK_ICON; + } +} diff --git a/src/main/java/com/glodblock/github/common/parts/base/FCPartMonitor.java b/src/main/java/com/glodblock/github/common/parts/base/FCPartMonitor.java new file mode 100644 index 00000000..0d8ab321 --- /dev/null +++ b/src/main/java/com/glodblock/github/common/parts/base/FCPartMonitor.java @@ -0,0 +1,467 @@ +package com.glodblock.github.common.parts.base; + +import appeng.api.implementations.parts.IPartStorageMonitor; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.storage.IStackWatcher; +import appeng.api.networking.storage.IStackWatcherHost; +import appeng.api.parts.IPartRenderHelper; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEStack; +import appeng.api.storage.data.IItemList; +import appeng.client.ClientHelper; +import appeng.client.texture.CableBusTextures; +import appeng.core.AELog; +import appeng.core.localization.PlayerMessages; +import appeng.helpers.Reflected; +import appeng.me.GridAccessException; +import appeng.parts.reporting.AbstractPartDisplay; +import appeng.parts.reporting.PartPanel; +import appeng.util.IWideReadableNumberConverter; +import appeng.util.Platform; +import appeng.util.ReadableNumberConverter; +import appeng.util.item.AEFluidStack; +import com.glodblock.github.client.textures.FCPartsTexture; +import com.glodblock.github.common.item.ItemFluidPacket; +import com.glodblock.github.util.Util; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import java.io.IOException; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraftforge.common.util.ForgeDirection; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public abstract class FCPartMonitor extends AbstractPartDisplay implements IPartStorageMonitor, IStackWatcherHost { + private static final IWideReadableNumberConverter NUMBER_CONVERTER = ReadableNumberConverter.INSTANCE; + + private IAEFluidStack configuredFluid; + private String lastHumanReadableText; + private boolean isLocked; + private IStackWatcher myWatcher; + + @SideOnly(Side.CLIENT) + private boolean updateList; + + @SideOnly(Side.CLIENT) + private Integer dspList; + + @Reflected + public FCPartMonitor(ItemStack is) { + super(is); + } + + @Override + public void readFromNBT(final NBTTagCompound data) { + super.readFromNBT(data); + + this.isLocked = data.getBoolean("isLocked"); + + final NBTTagCompound myItem = data.getCompoundTag("configuredItem"); + this.configuredFluid = Util.loadFluidStackFromNBT(myItem); + } + + @Override + public void writeToNBT(final NBTTagCompound data) { + super.writeToNBT(data); + + data.setBoolean("isLocked", this.isLocked); + + final NBTTagCompound myItem = new NBTTagCompound(); + if (this.configuredFluid != null) { + this.configuredFluid.writeToNBT(myItem); + } + + data.setTag("configuredItem", myItem); + } + + @Override + public void writeToStream(final ByteBuf data) throws IOException { + super.writeToStream(data); + + data.writeBoolean(this.isLocked); + data.writeBoolean(this.configuredFluid != null); + if (this.configuredFluid != null) { + this.configuredFluid.writeToPacket(data); + } + } + + @Override + public boolean readFromStream(final ByteBuf data) throws IOException { + boolean needRedraw = super.readFromStream(data); + + final boolean isLocked = data.readBoolean(); + needRedraw = this.isLocked != isLocked; + + this.isLocked = isLocked; + + final boolean val = data.readBoolean(); + if (val) { + this.configuredFluid = AEFluidStack.loadFluidStackFromPacket(data); + } else { + this.configuredFluid = null; + } + + this.updateList = true; + + return needRedraw; + } + + @Override + public boolean onPartActivate(final EntityPlayer player, final Vec3 pos) { + if (Platform.isClient()) { + return true; + } + + if (!this.getProxy().isActive()) { + return false; + } + + if (!Platform.hasPermissions(this.getLocation(), player)) { + return false; + } + + final TileEntity te = this.getTile(); + final ItemStack eq = player.getCurrentEquippedItem(); + + if (Platform.isWrench(player, eq, te.xCoord, te.yCoord, te.zCoord)) { + this.isLocked = !this.isLocked; + player.addChatMessage((this.isLocked ? PlayerMessages.isNowLocked : PlayerMessages.isNowUnlocked).get()); + this.getHost().markForUpdate(); + } else if (!this.isLocked) { + this.configuredFluid = AEFluidStack.create(Util.FluidUtil.getFluidFromContainer(eq)); + this.configureWatchers(); + this.getHost().markForUpdate(); + } else { + this.extractItem(player); + } + + return true; + } + + // update the system... + private void configureWatchers() { + if (this.myWatcher != null) { + this.myWatcher.clear(); + } + + try { + if (this.configuredFluid != null) { + if (this.myWatcher != null) { + this.myWatcher.add(this.configuredFluid); + } + + this.updateReportingValue(this.getProxy().getStorage().getFluidInventory()); + } + } catch (final GridAccessException e) { + // >.> + } + } + + protected void extractItem(final EntityPlayer player) {} + + private void updateReportingValue(final IMEMonitor fluidInventory) { + if (this.configuredFluid != null) { + final IAEFluidStack result = fluidInventory.getStorageList().findPrecise(this.configuredFluid); + if (result == null) { + this.configuredFluid.setStackSize(0); + } else { + this.configuredFluid.setStackSize(result.getStackSize()); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + protected void finalize() throws Throwable { + super.finalize(); + + if (this.dspList != null) { + GLAllocation.deleteDisplayLists(this.dspList); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void renderDynamic( + final double x, final double y, final double z, final IPartRenderHelper rh, final RenderBlocks renderer) { + if (this.dspList == null) { + this.dspList = GLAllocation.generateDisplayLists(1); + } + + final Tessellator tess = Tessellator.instance; + + if ((this.getClientFlags() & (PartPanel.POWERED_FLAG | PartPanel.CHANNEL_FLAG)) + != (PartPanel.POWERED_FLAG | PartPanel.CHANNEL_FLAG)) { + return; + } + + final IAEFluidStack ais = (IAEFluidStack) this.getDisplayed(); + + if (ais != null) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); + + if (this.updateList) { + this.updateList = false; + GL11.glNewList(this.dspList, GL11.GL_COMPILE_AND_EXECUTE); + this.tesrRenderScreen(tess, ais); + GL11.glEndList(); + } else { + GL11.glCallList(this.dspList); + } + + GL11.glPopMatrix(); + } + } + + @Override + public boolean requireDynamicRender() { + return true; + } + + @Override + public IAEStack getDisplayed() { + return this.configuredFluid; + } + + private void tesrRenderScreen(final Tessellator tess, final IAEFluidStack ais) { + // GL11.glPushAttrib( GL11.GL_ALL_ATTRIB_BITS ); + + final ForgeDirection d = this.getSide(); + + GL11.glTranslated(d.offsetX * 0.77, d.offsetY * 0.77, d.offsetZ * 0.77); + + switch (d) { + case UP: + GL11.glScalef(1.0f, -1.0f, 1.0f); + GL11.glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + GL11.glRotatef(this.getSpin() * 90.0F, 0, 0, 1); + break; + case DOWN: + GL11.glScalef(1.0f, -1.0f, 1.0f); + GL11.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); + GL11.glRotatef(this.getSpin() * -90.0F, 0, 0, 1); + break; + case EAST: + GL11.glScalef(-1.0f, -1.0f, -1.0f); + GL11.glRotatef(-90.0f, 0.0f, 1.0f, 0.0f); + break; + case WEST: + GL11.glScalef(-1.0f, -1.0f, -1.0f); + GL11.glRotatef(90.0f, 0.0f, 1.0f, 0.0f); + break; + case NORTH: + GL11.glScalef(-1.0f, -1.0f, -1.0f); + break; + case SOUTH: + GL11.glScalef(-1.0f, -1.0f, -1.0f); + GL11.glRotatef(180.0f, 0.0f, 1.0f, 0.0f); + break; + + default: + break; + } + final ItemStack sis = ItemFluidPacket.newDisplayStack(ais.getFluidStack()); + + try { + final int br = 16 << 20 | 16 << 4; + final int var11 = br % 65536; + final int var12 = br / 65536; + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, var11 * 0.8F, var12 * 0.8F); + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + // RenderHelper.enableGUIStandardItemLighting(); + tess.setColorOpaque_F(1.0f, 1.0f, 1.0f); + + ClientHelper.proxy.doRenderItem(sis, this.getTile().getWorldObj()); + } catch (final Exception e) { + AELog.debug(e); + } finally { + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + } + if (sis != null) { + GL11.glTranslatef(0.0f, 0.14f, -0.24f); + GL11.glScalef(1.0f / 62.0f, 1.0f / 62.0f, 1.0f / 62.0f); + + final long stackSize = ais.getStackSize(); + final String renderedStackSize = NUMBER_CONVERTER.toWideReadableForm(stackSize); + + final FontRenderer fr = Minecraft.getMinecraft().fontRenderer; + final int width = fr.getStringWidth(renderedStackSize); + GL11.glTranslatef(-0.5f * width, 0.0f, -1.0f); + fr.drawString(renderedStackSize, 0, 0, 0); + } + // GL11.glPopAttrib(); + } + + @Override + public boolean isLocked() { + return this.isLocked; + } + + @Override + public void updateWatcher(final IStackWatcher newWatcher) { + this.myWatcher = newWatcher; + this.configureWatchers(); + } + + @Override + public void onStackChange( + final IItemList o, + final IAEStack fullStack, + final IAEStack diffStack, + final BaseActionSource src, + final StorageChannel chan) { + if (this.configuredFluid != null) { + if (fullStack == null) { + this.configuredFluid.setStackSize(0); + } else { + this.configuredFluid.setStackSize(fullStack.getStackSize()); + } + + final long stackSize = this.configuredFluid.getStackSize(); + final String humanReadableText = NUMBER_CONVERTER.toWideReadableForm(stackSize); + + if (!humanReadableText.equals(this.lastHumanReadableText)) { + this.lastHumanReadableText = humanReadableText; + this.getHost().markForUpdate(); + } + } + } + + @Override + public boolean showNetworkInfo(final MovingObjectPosition where) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public void renderInventory(final IPartRenderHelper rh, final RenderBlocks renderer) { + rh.setBounds(2, 2, 14, 14, 14, 16); + + final IIcon sideTexture = CableBusTextures.PartMonitorSides.getIcon(); + final IIcon backTexture = CableBusTextures.PartMonitorBack.getIcon(); + + rh.setTexture( + sideTexture, + sideTexture, + backTexture, + FCPartsTexture.PartTerminalBroad.getIcon(), + sideTexture, + sideTexture); + rh.renderInventoryBox(renderer); + + rh.setInvColor(this.getColor().whiteVariant); + rh.renderInventoryFace(this.getFrontBright().getIcon(), ForgeDirection.SOUTH, renderer); + + rh.setInvColor(this.getColor().mediumVariant); + rh.renderInventoryFace(this.getFrontDark().getIcon(), ForgeDirection.SOUTH, renderer); + + rh.setInvColor(this.getColor().blackVariant); + rh.renderInventoryFace(this.getFrontColored().getIcon(), ForgeDirection.SOUTH, renderer); + + rh.setBounds(4, 4, 13, 12, 12, 14); + rh.renderInventoryBox(renderer); + } + + @Override + @SideOnly(Side.CLIENT) + public void renderStatic( + final int x, final int y, final int z, final IPartRenderHelper rh, final RenderBlocks renderer) { + this.setRenderCache(rh.useSimplifiedRendering(x, y, z, this, this.getRenderCache())); + + final IIcon sideTexture = CableBusTextures.PartMonitorSides.getIcon(); + final IIcon backTexture = CableBusTextures.PartMonitorBack.getIcon(); + + rh.setTexture( + sideTexture, + sideTexture, + backTexture, + FCPartsTexture.PartTerminalBroad.getIcon(), + sideTexture, + sideTexture); + + rh.setBounds(2, 2, 14, 14, 14, 16); + rh.renderBlock(x, y, z, renderer); + + if (this.getLightLevel() > 0) { + final int l = 13; + Tessellator.instance.setBrightness(l << 20 | l << 4); + } + + renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = + renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = this.getSpin(); + + Tessellator.instance.setColorOpaque_I(this.getColor().whiteVariant); + rh.renderFace(x, y, z, this.getFrontBright().getIcon(), ForgeDirection.SOUTH, renderer); + + Tessellator.instance.setColorOpaque_I(this.getColor().mediumVariant); + rh.renderFace(x, y, z, this.getFrontDark().getIcon(), ForgeDirection.SOUTH, renderer); + + Tessellator.instance.setColorOpaque_I(this.getColor().blackVariant); + rh.renderFace(x, y, z, this.getFrontColored().getIcon(), ForgeDirection.SOUTH, renderer); + + renderer.uvRotateBottom = renderer.uvRotateEast = + renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0; + + final IIcon sideStatusTexture = CableBusTextures.PartMonitorSidesStatus.getIcon(); + + rh.setTexture( + sideStatusTexture, + sideStatusTexture, + backTexture, + FCPartsTexture.PartTerminalBroad.getIcon(), + sideStatusTexture, + sideStatusTexture); + + rh.setBounds(4, 4, 13, 12, 12, 14); + rh.renderBlock(x, y, z, renderer); + + final boolean hasChan = (this.getClientFlags() & (PartPanel.POWERED_FLAG | PartPanel.CHANNEL_FLAG)) + == (PartPanel.POWERED_FLAG | PartPanel.CHANNEL_FLAG); + final boolean hasPower = (this.getClientFlags() & PartPanel.POWERED_FLAG) == PartPanel.POWERED_FLAG; + + if (hasChan) { + final int l = 14; + Tessellator.instance.setBrightness(l << 20 | l << 4); + Tessellator.instance.setColorOpaque_I(this.getColor().blackVariant); + } else if (hasPower) { + final int l = 9; + Tessellator.instance.setBrightness(l << 20 | l << 4); + Tessellator.instance.setColorOpaque_I(this.getColor().whiteVariant); + } else { + Tessellator.instance.setBrightness(0); + Tessellator.instance.setColorOpaque_I(0x000000); + } + + final IIcon sideStatusLightTexture = CableBusTextures.PartMonitorSidesStatusLights.getIcon(); + + rh.renderFace(x, y, z, sideStatusLightTexture, ForgeDirection.EAST, renderer); + rh.renderFace(x, y, z, sideStatusLightTexture, ForgeDirection.WEST, renderer); + rh.renderFace(x, y, z, sideStatusLightTexture, ForgeDirection.UP, renderer); + rh.renderFace(x, y, z, sideStatusLightTexture, ForgeDirection.DOWN, renderer); + } + + public IAEFluidStack getAEStoreFluidStack() { + return this.configuredFluid; + } +} diff --git a/src/main/java/com/glodblock/github/crossmod/waila/PartWailaDataProvider.java b/src/main/java/com/glodblock/github/crossmod/waila/PartWailaDataProvider.java index 4e969ff7..07159c84 100644 --- a/src/main/java/com/glodblock/github/crossmod/waila/PartWailaDataProvider.java +++ b/src/main/java/com/glodblock/github/crossmod/waila/PartWailaDataProvider.java @@ -5,6 +5,7 @@ import appeng.integration.modules.waila.part.IPartWailaDataProvider; import appeng.integration.modules.waila.part.PartAccessor; import appeng.integration.modules.waila.part.Tracer; import com.glodblock.github.crossmod.waila.part.FluidInvWailaDataProvider; +import com.glodblock.github.crossmod.waila.part.FluidMonitorWailaDataProvider; import com.glodblock.github.crossmod.waila.part.SpeedWailaDataProvider; import com.google.common.base.Optional; import com.google.common.collect.Lists; @@ -27,7 +28,8 @@ public class PartWailaDataProvider implements IWailaDataProvider { public PartWailaDataProvider() { final IPartWailaDataProvider speed = new SpeedWailaDataProvider(); final IPartWailaDataProvider fluidInv = new FluidInvWailaDataProvider(); - this.providers = Lists.newArrayList(speed, fluidInv); + final IPartWailaDataProvider fluidMonitor = new FluidMonitorWailaDataProvider(); + this.providers = Lists.newArrayList(speed, fluidInv, fluidMonitor); } @Override diff --git a/src/main/java/com/glodblock/github/crossmod/waila/part/FluidMonitorWailaDataProvider.java b/src/main/java/com/glodblock/github/crossmod/waila/part/FluidMonitorWailaDataProvider.java new file mode 100644 index 00000000..7f53e495 --- /dev/null +++ b/src/main/java/com/glodblock/github/crossmod/waila/part/FluidMonitorWailaDataProvider.java @@ -0,0 +1,54 @@ +package com.glodblock.github.crossmod.waila.part; + +import appeng.api.parts.IPart; +import appeng.api.storage.data.IAEFluidStack; +import appeng.integration.modules.waila.part.BasePartWailaDataProvider; +import com.glodblock.github.common.parts.PartFluidLevelEmitter; +import com.glodblock.github.common.parts.base.FCPartMonitor; +import com.glodblock.github.crossmod.waila.Tooltip; +import com.glodblock.github.util.Util; +import java.util.List; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class FluidMonitorWailaDataProvider extends BasePartWailaDataProvider { + private final String key = "fluidStore"; + + @Override + public List getWailaBody( + final IPart part, + final List currentToolTip, + final IWailaDataAccessor accessor, + final IWailaConfigHandler config) { + if (part instanceof FCPartMonitor && accessor.getNBTData().hasKey(key)) { + IAEFluidStack iaeFluidStack = + Util.loadFluidStackFromNBT(accessor.getNBTData().getCompoundTag(key)); + if (iaeFluidStack != null) + currentToolTip.add( + Tooltip.fluidFormat(iaeFluidStack.getFluid().getLocalizedName(), iaeFluidStack.getStackSize())); + } + return currentToolTip; + } + + @Override + public NBTTagCompound getNBTData( + final EntityPlayerMP player, + final IPart part, + final TileEntity te, + final NBTTagCompound tag, + final World world, + final int x, + final int y, + final int z) { + if (part instanceof FCPartMonitor && ((FCPartMonitor) part).getAEStoreFluidStack() != null) { + NBTTagCompound data = new NBTTagCompound(); + ((FCPartMonitor) part).getAEStoreFluidStack().writeToNBT(data); + tag.setTag(key, data); + } + return tag; + } +} diff --git a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java index 5d376b55..ff3887d5 100644 --- a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java +++ b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java @@ -27,6 +27,8 @@ public class ItemAndBlockHolder { public static ItemFluidExportBus FLUID_EXPORT_BUS = new ItemFluidExportBus().register(); public static ItemPartFluidStorageBus FLUID_STORAGE_BUS = new ItemPartFluidStorageBus().register(); public static ItemFluidLevelEmitter FLUID_LEVEL_EMITTER = new ItemFluidLevelEmitter().register(); + public static ItemFluidStorageMonitor FLUID_STORAGE_MONITOR = new ItemFluidStorageMonitor().register(); + public static ItemFluidConversionMonitor FLUID_CONVERSION_MONITOR = new ItemFluidConversionMonitor().register(); public static ItemFluidPacket PACKET = new ItemFluidPacket().register(); public static ItemBasicFluidStorageCell CELL1K = new ItemBasicFluidStorageCell(CellType.Cell1kPart, 1).register(); public static ItemBasicFluidStorageCell CELL4K = new ItemBasicFluidStorageCell(CellType.Cell4kPart, 4).register(); diff --git a/src/main/java/com/glodblock/github/loader/RecipeLoader.java b/src/main/java/com/glodblock/github/loader/RecipeLoader.java index 673a9c7d..6e9ecb28 100644 --- a/src/main/java/com/glodblock/github/loader/RecipeLoader.java +++ b/src/main/java/com/glodblock/github/loader/RecipeLoader.java @@ -123,6 +123,25 @@ public class RecipeLoader implements Runnable { AE2_WORK_BENCH)); GameRegistry.addShapelessRecipe(FLUID_STORAGE_BUS.stack(), FLUID_INTERFACE, STICKY_PISTON, PISTON); GameRegistry.addShapelessRecipe(FLUID_STORAGE_BUS.stack(), INTERFACE, STICKY_PISTON, PISTON); + GameRegistry.addRecipe(new ShapedOreRecipe( + FLUID_STORAGE_MONITOR.stack(), + "EIP", + "P ", + 'I', + "itemIlluminatedPanel", + 'E', + FLUID_LEVEL_EMITTER, + 'P', + "dyeBlue")); + GameRegistry.addRecipe(new ShapedOreRecipe( + FLUID_CONVERSION_MONITOR.stack(), + "ASF", + 'A', + AE2_CORE_ANN, + 'S', + FLUID_STORAGE_MONITOR, + 'F', + AE2_CORE_FOM)); GameRegistry.addShapelessRecipe(FLUID_TERMINAL.stack(), AE2_PATTERN_TERM, ENCODER); GameRegistry.addShapelessRecipe( FLUID_TERMINAL_EX.stack(), FLUID_TERMINAL.stack(), AE2_PROCESS_CAL, AE2_PROCESS_ENG, AE2_PROCESS_LOG); diff --git a/src/main/java/com/glodblock/github/util/NameConst.java b/src/main/java/com/glodblock/github/util/NameConst.java index 86e7c95e..17ed2f07 100644 --- a/src/main/java/com/glodblock/github/util/NameConst.java +++ b/src/main/java/com/glodblock/github/util/NameConst.java @@ -19,6 +19,8 @@ public class NameConst { public static final String ITEM_FLUID_DROP = "fluid_drop"; public static final String ITEM_FLUID_ENCODED_PATTERN = "fluid_encoded_pattern"; + public static final String ITEM_PART_FLUID_STORAGE_MONITOR = "part_fluid_storage_monitor"; + public static final String ITEM_PART_FLUID_CONVERSION_MONITOR = "part_fluid_conversion_monitor"; public static final String ITEM_PART_FLUID_TERMINAL = "part_fluid_terminal"; public static final String ITEM_PART_FLUID_PATTERN_TERMINAL = "part_fluid_pattern_terminal"; public static final String ITEM_PART_FLUID_PATTERN_TERMINAL_EX = "part_fluid_pattern_terminal_ex"; diff --git a/src/main/java/com/glodblock/github/util/Util.java b/src/main/java/com/glodblock/github/util/Util.java index 1d1910cb..414eed79 100644 --- a/src/main/java/com/glodblock/github/util/Util.java +++ b/src/main/java/com/glodblock/github/util/Util.java @@ -150,6 +150,7 @@ public final class Util { public static IAEFluidStack loadFluidStackFromNBT(final NBTTagCompound i) { // Fuck ae2 final FluidStack t = FluidRegistry.getFluidStack(i.getString("FluidName"), 1); + if (t == null) return null; final AEFluidStack fluid = AEFluidStack.create(t); fluid.setStackSize(i.getLong("Cnt")); fluid.setCountRequestable(i.getLong("Req")); diff --git a/src/main/resources/assets/ae2fc/lang/en_US.lang b/src/main/resources/assets/ae2fc/lang/en_US.lang index cd18c2c3..cff6bebf 100644 --- a/src/main/resources/assets/ae2fc/lang/en_US.lang +++ b/src/main/resources/assets/ae2fc/lang/en_US.lang @@ -8,6 +8,8 @@ item.part_fluid_import.name=ME Fluid Import Bus item.part_fluid_export.name=ME Fluid Export Bus item.part_fluid_storage_bus.name=ME Fluid Storage Bus item.part_fluid_level_emitter.name=ME Fluid Level Emitter +item.part_fluid_storage_monitor.name=ME Fluid Storage Monitor +item.part_fluid_conversion_monitor.name=ME Fluid Conversion Monitor item.fluid_packet.name=Fluid Packet item.fluid_storage.1.name=1k ME Fluid Storage Cell item.fluid_storage.4.name=4k ME Fluid Storage Cell diff --git a/src/main/resources/assets/ae2fc/lang/zh_CN.lang b/src/main/resources/assets/ae2fc/lang/zh_CN.lang index bbbc0f3a..7eb183ee 100644 --- a/src/main/resources/assets/ae2fc/lang/zh_CN.lang +++ b/src/main/resources/assets/ae2fc/lang/zh_CN.lang @@ -6,7 +6,10 @@ item.part_fluid_pattern_terminal_ex.name=ME增广流体样板终端 item.part_fluid_interface.name=ME二合一接口 item.part_fluid_import.name=ME流体输入总线 item.part_fluid_export.name=ME流体输出总线 +item.part_fluid_storage_bus.name=ME流体存储总线 item.part_fluid_level_emitter.name=ME流体发信器 +item.part_fluid_storage_monitor.name=ME流体存储监控器 +item.part_fluid_conversion_monitor.name=ME流体交换监控器 item.fluid_packet.name=流体封包 item.fluid_storage.1.name=1k-ME流体存储元件 item.fluid_storage.4.name=4k-ME流体存储元件