Fluid Planes (#424)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
lc-1337andgithub-actions[bot] authored and GitHub committed 2026-04-30 20:10:34 +00:00
1 parent 31a9034b8e
commit 387c740dcb
14 files changed
+403 -1

No files matched your search

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