From 387c740dcb16c6136a7fb4e6066e414d1f816305 Mon Sep 17 00:00:00 2001 From: lc-1337 <62835225+lc-1337@users.noreply.github.com> Date: Thu, 30 Apr 2026 23:10:34 +0300 Subject: [PATCH] Fluid Planes (#424) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../client/textures/FCPartsTexture.java | 6 +- .../item/ItemFluidAnnihilationPlane.java | 58 ++++++++ .../common/item/ItemFluidFormationPlane.java | 58 ++++++++ .../parts/PartFluidAnnihilationPlane.java | 86 +++++++++++ .../common/parts/PartFluidFormationPlane.java | 140 ++++++++++++++++++ .../github/loader/ItemAndBlockHolder.java | 5 + .../com/glodblock/github/util/NameConst.java | 2 + .../resources/assets/ae2fc/lang/en_US.lang | 3 + .../blocks/fluid_annihilation_plane.png | Bin 0 -> 532 bytes .../blocks/fluid_annihilation_plane_on.png | Bin 0 -> 445 bytes .../fluid_annihilation_plane_on.png.mcmeta | 23 +++ .../textures/blocks/fluid_formation_plane.png | Bin 0 -> 532 bytes .../blocks/fluid_formation_plane_on.png | Bin 0 -> 445 bytes .../fluid_formation_plane_on.png.mcmeta | 23 +++ 14 files changed, 403 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/glodblock/github/common/item/ItemFluidAnnihilationPlane.java create mode 100644 src/main/java/com/glodblock/github/common/item/ItemFluidFormationPlane.java create mode 100644 src/main/java/com/glodblock/github/common/parts/PartFluidAnnihilationPlane.java create mode 100644 src/main/java/com/glodblock/github/common/parts/PartFluidFormationPlane.java create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/fluid_annihilation_plane.png create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/fluid_annihilation_plane_on.png create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/fluid_annihilation_plane_on.png.mcmeta create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/fluid_formation_plane.png create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/fluid_formation_plane_on.png create mode 100644 src/main/resources/assets/ae2fc/textures/blocks/fluid_formation_plane_on.png.mcmeta 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 daf003f1..a49621f2 100644 --- a/src/main/java/com/glodblock/github/client/textures/FCPartsTexture.java +++ b/src/main/java/com/glodblock/github/client/textures/FCPartsTexture.java @@ -30,7 +30,11 @@ public enum FCPartsTexture { BlockInterface_Face("fluid_interface"), PartFluidLevelEmitter("fluid_level_emitter"), BlockLevelMaintainer("level_maintainer"), - BlockLevelMaintainer_Active("level_maintainer_active"); + BlockLevelMaintainer_Active("level_maintainer_active"), + PartFluidFormationPlane("fluid_formation_plane"), + PartFluidAnnihilationPlane("fluid_annihilation_plane"), + PartFluidFormationPlaneOn("fluid_formation_plane_on"), + PartFluidAnnihilationPlaneOn("fluid_annihilation_plane_on"),; private final String name; public net.minecraft.util.IIcon IIcon; diff --git a/src/main/java/com/glodblock/github/common/item/ItemFluidAnnihilationPlane.java b/src/main/java/com/glodblock/github/common/item/ItemFluidAnnihilationPlane.java new file mode 100644 index 00000000..a829a57f --- /dev/null +++ b/src/main/java/com/glodblock/github/common/item/ItemFluidAnnihilationPlane.java @@ -0,0 +1,58 @@ +package com.glodblock.github.common.item; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import com.glodblock.github.FluidCraft; +import com.glodblock.github.client.textures.FCPartsTexture; +import com.glodblock.github.common.parts.PartFluidAnnihilationPlane; +import com.glodblock.github.common.tabs.FluidCraftingTabs; +import com.glodblock.github.util.NameConst; + +import appeng.api.AEApi; +import appeng.api.parts.IPartItem; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemFluidAnnihilationPlane extends FCBaseItem implements IPartItem { + + public ItemFluidAnnihilationPlane() { + this.setMaxStackSize(64); + this.setUnlocalizedName(NameConst.ITEM_PART_FLUID_ANNIHILATION_PLANE); + 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(stack, x, y, z, side, player, world); + } + + @Override + public ItemFluidAnnihilationPlane register() { + GameRegistry.registerItem(this, NameConst.ITEM_PART_FLUID_ANNIHILATION_PLANE, FluidCraft.MODID); + setCreativeTab(FluidCraftingTabs.INSTANCE); + return this; + } + + @Override + public IIcon getIconIndex(ItemStack p_77650_1_) { + return FCPartsTexture.PartFluidAnnihilationPlane.getIcon(); + } + + public void registerIcons(IIconRegister _iconRegister) {} + + @SideOnly(Side.CLIENT) + public int getSpriteNumber() { + return 0; + } + + @Override + public PartFluidAnnihilationPlane createPartFromItemStack(ItemStack is) { + return new PartFluidAnnihilationPlane(is); + } +} diff --git a/src/main/java/com/glodblock/github/common/item/ItemFluidFormationPlane.java b/src/main/java/com/glodblock/github/common/item/ItemFluidFormationPlane.java new file mode 100644 index 00000000..0f6bc361 --- /dev/null +++ b/src/main/java/com/glodblock/github/common/item/ItemFluidFormationPlane.java @@ -0,0 +1,58 @@ +package com.glodblock.github.common.item; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import com.glodblock.github.FluidCraft; +import com.glodblock.github.client.textures.FCPartsTexture; +import com.glodblock.github.common.parts.PartFluidFormationPlane; +import com.glodblock.github.common.tabs.FluidCraftingTabs; +import com.glodblock.github.util.NameConst; + +import appeng.api.AEApi; +import appeng.api.parts.IPartItem; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemFluidFormationPlane extends FCBaseItem implements IPartItem { + + public ItemFluidFormationPlane() { + this.setMaxStackSize(64); + this.setUnlocalizedName(NameConst.ITEM_PART_FLUID_FORMATION_PLANE); + 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(stack, x, y, z, side, player, world); + } + + @Override + public ItemFluidFormationPlane register() { + GameRegistry.registerItem(this, NameConst.ITEM_PART_FLUID_FORMATION_PLANE, FluidCraft.MODID); + setCreativeTab(FluidCraftingTabs.INSTANCE); + return this; + } + + @Override + public IIcon getIconIndex(ItemStack p_77650_1_) { + return FCPartsTexture.PartFluidFormationPlane.getIcon(); + } + + public void registerIcons(IIconRegister _iconRegister) {} + + @SideOnly(Side.CLIENT) + public int getSpriteNumber() { + return 0; + } + + @Override + public PartFluidFormationPlane createPartFromItemStack(ItemStack is) { + return new PartFluidFormationPlane(is); + } +} diff --git a/src/main/java/com/glodblock/github/common/parts/PartFluidAnnihilationPlane.java b/src/main/java/com/glodblock/github/common/parts/PartFluidAnnihilationPlane.java new file mode 100644 index 00000000..465d905b --- /dev/null +++ b/src/main/java/com/glodblock/github/common/parts/PartFluidAnnihilationPlane.java @@ -0,0 +1,86 @@ +package com.glodblock.github.common.parts; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidBlock; + +import com.glodblock.github.client.textures.FCPartsTexture; +import com.glodblock.github.util.Util; + +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.storage.IMEMonitor; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.util.DimensionalCoord; +import appeng.me.GridAccessException; +import appeng.parts.automation.PartBaseAnnihilationPlane; +import appeng.util.Platform; + +public class PartFluidAnnihilationPlane extends PartBaseAnnihilationPlane { + + public PartFluidAnnihilationPlane(ItemStack is) { + super(is); + } + + @Override + public void onNeighborChanged() { + final DimensionalCoord self = this.getLocation(); + final IMEMonitor monitor; + final IEnergyGrid power; + + try { + monitor = this.getProxy().getStorage().getFluidInventory(); + power = this.getProxy().getEnergy(); + } catch (GridAccessException ignored) { + return; + } + + if (monitor == null || power == null) return; + final World world = this.tile.getWorldObj(); + final ForgeDirection side = getSide(); + final Block fluidBlock = world.getBlock(self.x + side.offsetX, self.y + side.offsetY, self.z + side.offsetZ); + final int meta = world.getBlockMetadata(self.x + side.offsetX, self.y + side.offsetY, self.z + side.offsetZ); + final BaseActionSource src = new MachineSource(this); + + if (fluidBlock instanceof IFluidBlock block) { + final FluidStack drained = block + .drain(world, self.x + side.offsetX, self.y + side.offsetY, self.z + side.offsetZ, false); + if (drained == null) return; + final IAEFluidStack toInject = Util.FluidUtil.createAEFluidStack(drained); + final IAEFluidStack notInjected = Platform + .poweredInsert(power, monitor, toInject, src, Actionable.SIMULATE); + if (notInjected != null) return; + Platform.poweredInsert(power, monitor, toInject, src, Actionable.MODULATE); + block.drain(world, self.x + side.offsetX, self.y + side.offsetY, self.z + side.offsetZ, true); + } else if (meta == 0) { + if (fluidBlock == Blocks.flowing_water) { + final IAEFluidStack toInject = Util.FluidUtil.createAEFluidStack(FluidRegistry.WATER); + final IAEFluidStack notInjected = Platform + .poweredInsert(power, monitor, toInject, src, Actionable.SIMULATE); + if (notInjected != null) return; + Platform.poweredInsert(power, monitor, toInject, src, Actionable.MODULATE); + world.setBlockToAir(self.x + side.offsetX, self.y + side.offsetY, self.z + side.offsetZ); + } else if (fluidBlock == Blocks.flowing_lava) { + final IAEFluidStack toInject = Util.FluidUtil.createAEFluidStack(FluidRegistry.LAVA); + final IAEFluidStack notInjected = Platform + .poweredInsert(power, monitor, toInject, src, Actionable.SIMULATE); + if (notInjected != null) return; + Platform.poweredInsert(power, monitor, toInject, src, Actionable.MODULATE); + world.setBlockToAir(self.x + side.offsetX, self.y + side.offsetY, self.z + side.offsetZ); + } + } + } + + @Override + public IIcon getActiveIcon() { + return FCPartsTexture.PartFluidAnnihilationPlaneOn.getIcon(); + } +} diff --git a/src/main/java/com/glodblock/github/common/parts/PartFluidFormationPlane.java b/src/main/java/com/glodblock/github/common/parts/PartFluidFormationPlane.java new file mode 100644 index 00000000..a64c2dd6 --- /dev/null +++ b/src/main/java/com/glodblock/github/common/parts/PartFluidFormationPlane.java @@ -0,0 +1,140 @@ +package com.glodblock.github.common.parts; + +import static appeng.util.item.AEFluidStackType.FLUID_STACK_TYPE; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; + +import com.glodblock.github.client.textures.FCPartsTexture; + +import appeng.api.config.Actionable; +import appeng.api.networking.IGridNode; +import appeng.api.networking.energy.IEnergyGrid; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.MachineSource; +import appeng.api.networking.ticking.IGridTickable; +import appeng.api.networking.ticking.TickRateModulation; +import appeng.api.networking.ticking.TickingRequest; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEStackType; +import appeng.api.util.DimensionalCoord; +import appeng.me.GridAccessException; +import appeng.parts.automation.PartBaseFormationPlane; +import appeng.util.Platform; + +public class PartFluidFormationPlane extends PartBaseFormationPlane implements IGridTickable { + + public PartFluidFormationPlane(ItemStack is) { + super(is); + } + + @Override + public TickingRequest getTickingRequest(IGridNode iGridNode) { + return new TickingRequest(2, 120, false, true); + } + + @Override + public TickRateModulation tickingRequest(IGridNode iGridNode, int ing) { + return this.doWork() ? TickRateModulation.SLEEP : TickRateModulation.SAME; + + } + + @Override + public void onNeighborChanged() { + final TileEntity te = this.getHost().getTile(); + final World w = te.getWorldObj(); + if (w == null) return; + final ForgeDirection side = this.getSide(); + + final int x = te.xCoord + side.offsetX; + final int y = te.yCoord + side.offsetY; + final int z = te.zCoord + side.offsetZ; + + final Block worldBlock = w.getBlock(x, y, z); + this.blocked = worldBlock != null && worldBlock != Blocks.air; + + if (!this.blocked) { + try { + this.getProxy().getTick().alertDevice(this.getProxy().getNode()); + } catch (GridAccessException ignored) {} + } + } + + @Override + protected void updateHandler() { + this.onNeighborChanged(); + } + + public boolean doWork() { + if (this.blocked) return true; + + final DimensionalCoord self = this.getLocation(); + final int x = self.x + side.offsetX; + final int y = self.y + side.offsetY; + final int z = self.z + side.offsetZ; + + final World world = this.tile.getWorldObj(); + final Block worldBlock = world.getBlock(x, y, z); + if (worldBlock != null && worldBlock != Blocks.air) return this.blocked = true; + + final IMEMonitor monitor; + final IEnergyGrid power; + + try { + monitor = this.getProxy().getStorage().getFluidInventory(); + power = this.getProxy().getEnergy(); + } catch (GridAccessException ignored) { + return true; + } + + if (monitor == null || power == null) return true; + + final BaseActionSource src = new MachineSource(this); + + boolean stockOut = false; + + for (int i = 0; i < this.Config.getSizeInventory(); i++) { + if (!(this.Config.getAEStackInSlot(i) instanceof IAEFluidStack ifs)) continue; + final IAEFluidStack fluid = ifs.copy().setStackSize(FluidContainerRegistry.BUCKET_VOLUME); + final IAEFluidStack canDrain = Platform.poweredExtraction(power, monitor, fluid, src, Actionable.SIMULATE); + if (canDrain == null || canDrain.getStackSize() < FluidContainerRegistry.BUCKET_VOLUME) { + stockOut = true; + continue; + } + Platform.poweredExtraction(power, monitor, fluid, src, Actionable.MODULATE); + final Block fluidWorldBlock = fluid.getFluid().getBlock(); + world.setBlock(x, y, z, fluidWorldBlock); + world.markBlockForUpdate(x, y, z); + return true; + } + + return !stockOut; + } + + @Override + public IAEStackType getStackType() { + return FLUID_STACK_TYPE; + } + + @Override + public boolean supportItemDrop() { + return false; + } + + @Override + public boolean supportFuzzy() { + return false; + } + + @Override + public IIcon getActiveIcon() { + return FCPartsTexture.PartFluidFormationPlaneOn.getIcon(); + } +} diff --git a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java index 2d32efb9..ec153e02 100644 --- a/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java +++ b/src/main/java/com/glodblock/github/loader/ItemAndBlockHolder.java @@ -17,11 +17,13 @@ import com.glodblock.github.common.item.ItemBasicFluidStorageCell; import com.glodblock.github.common.item.ItemBasicFluidStoragePart; import com.glodblock.github.common.item.ItemCreativeFluidStorageCell; import com.glodblock.github.common.item.ItemEnergyCard; +import com.glodblock.github.common.item.ItemFluidAnnihilationPlane; import com.glodblock.github.common.item.ItemFluidConversionMonitor; import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.common.item.ItemFluidEncodedPattern; import com.glodblock.github.common.item.ItemFluidExportBus; import com.glodblock.github.common.item.ItemFluidExtremeStorageCell; +import com.glodblock.github.common.item.ItemFluidFormationPlane; import com.glodblock.github.common.item.ItemFluidImportBus; import com.glodblock.github.common.item.ItemFluidLevelEmitter; import com.glodblock.github.common.item.ItemFluidPacket; @@ -84,6 +86,9 @@ public class ItemAndBlockHolder { public static ItemWirelessUltraTerminal WIRELESS_ULTRA_TERM = new ItemWirelessUltraTerminal().register(); public static ItemWirelessInterfaceTerminal WIRELESS_INTERFACE_TERM = new ItemWirelessInterfaceTerminal() .register(); + public static ItemFluidFormationPlane FLUID_FORMATION_PLANE = new ItemFluidFormationPlane().register(); + public static ItemFluidAnnihilationPlane FLUID_ANNIHILATION_PLANE = new ItemFluidAnnihilationPlane().register(); + public static ItemFluidPacket PACKET = new ItemFluidPacket().register(); public static ItemBasicFluidStorageCell CELL1K = new ItemBasicFluidStorageCell(CellType.Cell1kPart, 0, 1) .register(); diff --git a/src/main/java/com/glodblock/github/util/NameConst.java b/src/main/java/com/glodblock/github/util/NameConst.java index 5152ec86..d80be028 100644 --- a/src/main/java/com/glodblock/github/util/NameConst.java +++ b/src/main/java/com/glodblock/github/util/NameConst.java @@ -55,6 +55,8 @@ public class NameConst { public static final String ITEM_FLUID_STORAGE_HOUSING = "fluid_storage_housing"; public static final String ITEM_QUANTUM_BRIDGE_CARD = "quantum_bridge_card"; public static final String ITEM_ENERGY_CARD = "energy_card"; + public static final String ITEM_PART_FLUID_FORMATION_PLANE = "part_fluid_formation_plane"; + public static final String ITEM_PART_FLUID_ANNIHILATION_PLANE = "part_fluid_annihilation_plane"; public static final String TT_KEY = FluidCraft.MODID + ".tooltip."; public static final String TT_FLUID_TERMINAL = TT_KEY + "fluid_terminal"; diff --git a/src/main/resources/assets/ae2fc/lang/en_US.lang b/src/main/resources/assets/ae2fc/lang/en_US.lang index 89f8d9c4..5fff165f 100644 --- a/src/main/resources/assets/ae2fc/lang/en_US.lang +++ b/src/main/resources/assets/ae2fc/lang/en_US.lang @@ -26,6 +26,9 @@ item.wireless_ultra_terminal.INTERFACE.name=Universal Wireless Terminal - Interf item.fluid_packet.name=Fluid Packet item.quantum_bridge_card.name=Quantum Bridge Card item.energy_card.name=Energy Card +item.part_fluid_formation_plane.name=Fluid Formation Plane +item.part_fluid_annihilation_plane.name=Fluid Annihilation Plane + item.creative_fluid_storage.name=Creative ME Fluid Storage Cell item.fluid_storage.1.name=%s1k%s ME Fluid Storage Cell item.fluid_storage.4.name=%s4k%s ME Fluid Storage Cell diff --git a/src/main/resources/assets/ae2fc/textures/blocks/fluid_annihilation_plane.png b/src/main/resources/assets/ae2fc/textures/blocks/fluid_annihilation_plane.png new file mode 100644 index 0000000000000000000000000000000000000000..a3aee5d186ee705051b5d44bc0c31fcb14fe8007 GIT binary patch literal 532 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFnAmtPE0&tPG4mmKP99L)joVYcMi{#hHL?Lq;YBK_DFk z#F_0ZVDTIv8w5U;F*3XW`V~f_+seQIl$^lMzyefjU}S8-xBy}<$WGP;5VNKM*&x6K zG?@vkGRV>b$b#xJG%x_kHrMOR6kWJ{AIR+Tba4#fkYzo%mhX^(2-}5z_a9ofdgKe= z9}?3MGH-p(o98-pP=CQXxfK_InBJcAEpH}7(Z_f*>Spk+x4D*H_h35 zndJ9c*7~eaKP~0ak*dohw+ zZU8dW%0mF-}3=C>oU#4*h z`@GNna=iq>B0J~EaDP10s_4IBo2dY@pScbS?83{ F1OWDeUKs!Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2fc/textures/blocks/fluid_annihilation_plane_on.png.mcmeta b/src/main/resources/assets/ae2fc/textures/blocks/fluid_annihilation_plane_on.png.mcmeta new file mode 100644 index 00000000..4dcf4d63 --- /dev/null +++ b/src/main/resources/assets/ae2fc/textures/blocks/fluid_annihilation_plane_on.png.mcmeta @@ -0,0 +1,23 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ] + } +} diff --git a/src/main/resources/assets/ae2fc/textures/blocks/fluid_formation_plane.png b/src/main/resources/assets/ae2fc/textures/blocks/fluid_formation_plane.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9bb5e9dff9bf31449556e35bd2d9860a053b23 GIT binary patch literal 532 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF$};rzvfrHJ@N97j?+^e zzvm29A5MHLjtA=EEbxddW?KPgdGrE@m741lk@J#dc)MDTOa#$Ip7+Dz@fh;c|mWHxHZq{IA28%NR*@lcv z41z#93Wzh?S-|2sKsE^6EMsJN0rV@3Mz@uL0Vp|voq+|Y*1*WvfN=rDT#%it3m|4q z1F}JY31~7CSY?o<1&{^RWoTdkl5N{<5VqwC;|3tJ%hSa%ghQ6~;99;z1|n=1`rUtM z-RhAqe1AwxN65VOId7ip_HEaD z{@pZZ?`4wTYgy~FLjAOqM@OnIkKCFdi=`b}Uh_i?c9eQP-}*>vf&c&j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2fc/textures/blocks/fluid_formation_plane_on.png b/src/main/resources/assets/ae2fc/textures/blocks/fluid_formation_plane_on.png new file mode 100644 index 0000000000000000000000000000000000000000..c402bf0a8683c165ddc948beddc94c126ec26efa GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^0t^g{3@pq*mPgI&S|G((9OUlAuLf