From 19232b92e5b1ec0adc5c1855290ea2eb0d55d277 Mon Sep 17 00:00:00 2001 From: GlodBlock <1356392126@qq.com> Date: Wed, 11 May 2022 19:40:19 +0800 Subject: [PATCH] add part version of fluid interface --- .../client/textures/FCPartsTexture.java | 3 +- .../common/item/ItemPartFluidInterface.java | 53 +++++++ .../common/parts/PartFluidInterface.java | 130 ++++++++++++++++++ .../common/storage/FluidCellHandler.java | 16 +++ .../FluidConvertingInventoryAdaptor.java | 5 +- .../github/loader/ItemAndBlockHolder.java | 1 + .../glodblock/github/loader/RecipeLoader.java | 8 ++ .../github/util/ModAndClassUtil.java | 3 + .../com/glodblock/github/util/NameConst.java | 1 + .../resources/assets/ae2fc/lang/en_US.lang | 1 + 10 files changed, 219 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/glodblock/github/common/item/ItemPartFluidInterface.java create mode 100644 src/main/java/com/glodblock/github/common/parts/PartFluidInterface.java create mode 100644 src/main/java/com/glodblock/github/loader/RecipeLoader.java diff --git a/src/main/java/com/glodblock/github/client/textures/FCPartsTexture.java b/src/main/java/com/glodblock/github/client/textures/FCPartsTexture.java index b65c06d1..40bd6e41 100644 --- a/src/main/java/com/glodblock/github/client/textures/FCPartsTexture.java +++ b/src/main/java/com/glodblock/github/client/textures/FCPartsTexture.java @@ -12,7 +12,8 @@ public enum FCPartsTexture { PartFluidPatternTerminal_Bright("pattern_terminal_bright"), PartFluidPatternTerminal_Dark("pattern_terminal_dark"), PartFluidPatternTerminal_Colored("pattern_terminal_medium"), PartTerminalBroad("terminal_broad"), - BlockFluidInterfaceAlternate_Arrow("fluid_interface_arrow"), BlockInterfaceAlternate("fluid_interface_a"); + BlockFluidInterfaceAlternate_Arrow("fluid_interface_arrow"), BlockInterfaceAlternate("fluid_interface_a"), + BlockInterface_Face("fluid_interface"); private final String name; public net.minecraft.util.IIcon IIcon; diff --git a/src/main/java/com/glodblock/github/common/item/ItemPartFluidInterface.java b/src/main/java/com/glodblock/github/common/item/ItemPartFluidInterface.java new file mode 100644 index 00000000..8015d27c --- /dev/null +++ b/src/main/java/com/glodblock/github/common/item/ItemPartFluidInterface.java @@ -0,0 +1,53 @@ +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.PartFluidInterface; +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.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import javax.annotation.Nullable; + +public class ItemPartFluidInterface extends Item implements IPartItem { + + public ItemPartFluidInterface() { + this.setMaxStackSize(64); + this.setUnlocalizedName(NameConst.ITEM_PART_FLUID_INTERFACE); + AEApi.instance().partHelper().setItemBusRenderer(this); + } + + @Nullable + @Override + public PartFluidInterface createPartFromItemStack(ItemStack is) { + return new PartFluidInterface(is); + } + + @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); + } + + public ItemPartFluidInterface register() { + GameRegistry.registerItem(this, NameConst.ITEM_PART_FLUID_INTERFACE, FluidCraft.MODID); + return this; + } + + @Override + public void registerIcons(IIconRegister _iconRegister) { + } + + @Override + @SideOnly(Side.CLIENT) + public int getSpriteNumber() { + return 0; + } + +} diff --git a/src/main/java/com/glodblock/github/common/parts/PartFluidInterface.java b/src/main/java/com/glodblock/github/common/parts/PartFluidInterface.java new file mode 100644 index 00000000..ca7d88fb --- /dev/null +++ b/src/main/java/com/glodblock/github/common/parts/PartFluidInterface.java @@ -0,0 +1,130 @@ +package com.glodblock.github.common.parts; + +import appeng.api.config.Actionable; +import appeng.api.networking.energy.IEnergyGrid; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.MachineSource; +import appeng.api.networking.storage.IStorageGrid; +import appeng.api.parts.IPartRenderHelper; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.data.IAEFluidStack; +import appeng.client.texture.CableBusTextures; +import appeng.me.GridAccessException; +import appeng.parts.misc.PartInterface; +import appeng.util.Platform; +import appeng.util.item.AEFluidStack; +import com.glodblock.github.client.textures.FCPartsTexture; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; + +public class PartFluidInterface extends PartInterface implements IFluidHandler { + + private final BaseActionSource ownActionSource = new MachineSource(this); + + public PartFluidInterface(ItemStack is) { + super(is); + } + + @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() ) ); + rh.setTexture( CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorBack.getIcon(), FCPartsTexture.BlockInterface_Face.getIcon(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon() ); + + rh.setBounds( 2, 2, 14, 14, 14, 16 ); + rh.renderBlock( x, y, z, renderer ); + + rh.setTexture( CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorBack.getIcon(), FCPartsTexture.BlockInterface_Face.getIcon(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon() ); + + rh.setBounds( 5, 5, 12, 11, 11, 13 ); + rh.renderBlock( x, y, z, renderer ); + + rh.setTexture( CableBusTextures.PartMonitorSidesStatus.getIcon(), CableBusTextures.PartMonitorSidesStatus.getIcon(), CableBusTextures.PartMonitorBack.getIcon(), FCPartsTexture.BlockInterface_Face.getIcon(), CableBusTextures.PartMonitorSidesStatus.getIcon(), CableBusTextures.PartMonitorSidesStatus.getIcon() ); + + rh.setBounds( 5, 5, 13, 11, 11, 14 ); + rh.renderBlock( x, y, z, renderer ); + + this.renderLights( x, y, z, rh, renderer ); + } + + @Override + @SideOnly( Side.CLIENT ) + public void renderInventory( final IPartRenderHelper rh, final RenderBlocks renderer ) + { + rh.setTexture( CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorBack.getIcon(), FCPartsTexture.BlockInterface_Face.getIcon(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon() ); + + rh.setBounds( 2, 2, 14, 14, 14, 16 ); + rh.renderInventoryBox( renderer ); + + rh.setBounds( 5, 5, 12, 11, 11, 13 ); + rh.renderInventoryBox( renderer ); + + rh.setBounds( 5, 5, 13, 11, 11, 14 ); + rh.renderInventoryBox( renderer ); + } + + private IMEMonitor getFluidGrid() { + try { + return getProxy().getGrid().getCache(IStorageGrid.class).getFluidInventory(); + } catch (GridAccessException e) { + return null; + } + } + + private IEnergyGrid getEnergyGrid() { + try { + return getProxy().getGrid().getCache(IEnergyGrid.class); + } catch (GridAccessException e) { + return null; + } + } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + IMEMonitor fluidGrid = getFluidGrid(); + IEnergyGrid energyGrid = getEnergyGrid(); + if (energyGrid == null || fluidGrid == null || resource == null) + return 0; + int ori = resource.amount; + IAEFluidStack remove; + if (doFill) { + remove = Platform.poweredInsert(energyGrid, fluidGrid, AEFluidStack.create(resource), ownActionSource); + } else { + remove = fluidGrid.injectItems(AEFluidStack.create(resource), Actionable.SIMULATE, ownActionSource); + } + return remove == null ? ori : (int) (ori - remove.getStackSize()); + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + return null; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + return null; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) { + return true; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) { + return false; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + return new FluidTankInfo[]{new FluidTankInfo(null, 0)}; + } +} diff --git a/src/main/java/com/glodblock/github/common/storage/FluidCellHandler.java b/src/main/java/com/glodblock/github/common/storage/FluidCellHandler.java index 240cdeb6..c11f324c 100644 --- a/src/main/java/com/glodblock/github/common/storage/FluidCellHandler.java +++ b/src/main/java/com/glodblock/github/common/storage/FluidCellHandler.java @@ -1,11 +1,16 @@ package com.glodblock.github.common.storage; import appeng.api.implementations.tiles.IChestOrDrive; +import appeng.api.implementations.tiles.IMEChest; +import appeng.api.networking.security.PlayerSource; import appeng.api.storage.*; import appeng.client.texture.ExtraBlockTextures; +import com.glodblock.github.util.ModAndClassUtil; +import extracells.network.GuiHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; +import net.minecraftforge.common.util.ForgeDirection; public class FluidCellHandler implements ICellHandler { @@ -47,6 +52,17 @@ public class FluidCellHandler implements ICellHandler @Override public void openChestGui(final EntityPlayer player, final IChestOrDrive chest, final ICellHandler cellHandler, final IMEInventoryHandler inv, final ItemStack is, final StorageChannel chan ) { + if (ModAndClassUtil.EC2) { + if (chan == StorageChannel.FLUIDS) { + IStorageMonitorable monitorable = null; + if (chest != null) { + monitorable = ((IMEChest)chest).getMonitorable(ForgeDirection.UNKNOWN, new PlayerSource(player, chest)); + } + if (monitorable != null) { + GuiHandler.launchGui(GuiHandler.getGuiId(0), player, new Object[]{monitorable.getFluidInventory()}); + } + } + } } @Override diff --git a/src/main/java/com/glodblock/github/inventory/FluidConvertingInventoryAdaptor.java b/src/main/java/com/glodblock/github/inventory/FluidConvertingInventoryAdaptor.java index 69e5c2e1..fe176a4e 100644 --- a/src/main/java/com/glodblock/github/inventory/FluidConvertingInventoryAdaptor.java +++ b/src/main/java/com/glodblock/github/inventory/FluidConvertingInventoryAdaptor.java @@ -1,10 +1,12 @@ package com.glodblock.github.inventory; import appeng.api.config.FuzzyMode; +import appeng.tile.networking.TileCableBus; import appeng.util.InventoryAdaptor; import appeng.util.inv.IInventoryDestination; import appeng.util.inv.ItemSlot; import com.glodblock.github.common.item.ItemFluidPacket; +import com.glodblock.github.common.parts.PartFluidInterface; import com.glodblock.github.common.tile.TileFluidInterface; import com.glodblock.github.util.Ae2Reflect; import com.glodblock.github.util.Util; @@ -27,7 +29,8 @@ public class FluidConvertingInventoryAdaptor extends InventoryAdaptor { // sometimes i wish 1.7.10 has cap system. ForgeDirection f = Util.from(face); TileEntity inter = capProvider.getWorldObj().getTileEntity(capProvider.xCoord + f.offsetX, capProvider.yCoord + f.offsetY, capProvider.zCoord + f.offsetZ); - if (!(inter instanceof TileFluidInterface)) return InventoryAdaptor.getAdaptor(capProvider, f); + if (!(inter instanceof TileFluidInterface || (inter instanceof TileCableBus && ((TileCableBus) inter).getPart(f.getOpposite()) instanceof PartFluidInterface))) + return InventoryAdaptor.getAdaptor(capProvider, f); IInventory item = capProvider instanceof IInventory ? (IInventory) capProvider : null; IFluidHandler fluid = capProvider instanceof IFluidHandler ? (IFluidHandler) capProvider : null; return new FluidConvertingInventoryAdaptor(item, fluid, face); diff --git a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java index 2b7dcffe..3b59ee88 100644 --- a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java +++ b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java @@ -12,6 +12,7 @@ public class ItemAndBlockHolder { public static ItemFluidDrop DROP = new ItemFluidDrop().register(); public static ItemFluidEncodedPattern PATTERN = new ItemFluidEncodedPattern().register(); public static ItemPartFluidPatternTerminal FLUID_TERMINAL = new ItemPartFluidPatternTerminal().register(); + public static ItemPartFluidInterface FLUID_INTERFACE = new ItemPartFluidInterface().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 new file mode 100644 index 00000000..fe3e8adc --- /dev/null +++ b/src/main/java/com/glodblock/github/loader/RecipeLoader.java @@ -0,0 +1,8 @@ +package com.glodblock.github.loader; + +public class RecipeLoader implements Runnable { + @Override + public void run() { + + } +} diff --git a/src/main/java/com/glodblock/github/util/ModAndClassUtil.java b/src/main/java/com/glodblock/github/util/ModAndClassUtil.java index a13d63cd..53acd8ee 100644 --- a/src/main/java/com/glodblock/github/util/ModAndClassUtil.java +++ b/src/main/java/com/glodblock/github/util/ModAndClassUtil.java @@ -12,6 +12,7 @@ public final class ModAndClassUtil { public static boolean GT5 = false; public static boolean GT6 = false; + public static boolean EC2 = false; public static boolean isDoubleButton; public static boolean isSaveText; @@ -65,6 +66,8 @@ public final class ModAndClassUtil { GT5 = true; if (Loader.isModLoaded("gregapi") && Loader.isModLoaded("gregapi_post")) GT6 = true; + if (Loader.isModLoaded("extracells")) + EC2 = true; } diff --git a/src/main/java/com/glodblock/github/util/NameConst.java b/src/main/java/com/glodblock/github/util/NameConst.java index f591a9b4..31b02a6b 100644 --- a/src/main/java/com/glodblock/github/util/NameConst.java +++ b/src/main/java/com/glodblock/github/util/NameConst.java @@ -12,6 +12,7 @@ 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_PATTERN_TERMINAL = "part_fluid_pattern_terminal"; + public static final String ITEM_PART_FLUID_INTERFACE = "part_fluid_interface"; public static final String ITEM_FLUID_PACKET = "fluid_packet"; public static final String ITEM_FLUID_STORAGE = "fluid_storage"; public static final String ITEM_FLUID_PART = "fluid_part"; diff --git a/src/main/resources/assets/ae2fc/lang/en_US.lang b/src/main/resources/assets/ae2fc/lang/en_US.lang index 17c865f8..5f0666e2 100644 --- a/src/main/resources/assets/ae2fc/lang/en_US.lang +++ b/src/main/resources/assets/ae2fc/lang/en_US.lang @@ -1,6 +1,7 @@ item.fluid_drop.name=drop of %s item.fluid_encoded_pattern.name=Encode Pattern item.part_fluid_pattern_terminal.name=ME Fluid Pattern Terminal +item.part_fluid_interface.name=Fluid Interface 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