This commit is contained in:
PrototypeTrousers
2022-10-10 19:48:24 -03:00
parent e611b1fb76
commit 63dd035c85
12 changed files with 1127 additions and 55 deletions
@@ -127,9 +127,9 @@ public class GuiFluidTank extends GuiCustomSlot implements ITooltip {
public void slotClicked(ItemStack clickStack, final int mouseButton) {
if (getFluidStack() != null) {
NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.FILL_ITEM, slot, 0));
NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.FILL_ITEM, slot, id));
} else {
NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.EMPTY_ITEM, slot, 0));
NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.EMPTY_ITEM, slot, id));
}
}
@@ -21,9 +21,13 @@ package appeng.fluids.helper;
import appeng.api.AEApi;
import appeng.api.config.Actionable;
import appeng.api.config.Settings;
import appeng.api.config.Upgrades;
import appeng.api.config.YesNo;
import appeng.api.implementations.IUpgradeableHost;
import appeng.api.implementations.tiles.ICraftingMachine;
import appeng.api.networking.GridFlags;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridNode;
import appeng.api.networking.energy.IEnergySource;
import appeng.api.networking.security.IActionHost;
@@ -46,7 +50,10 @@ import appeng.core.settings.TickRates;
import appeng.fluids.util.AEFluidInventory;
import appeng.fluids.util.IAEFluidInventory;
import appeng.fluids.util.IAEFluidTank;
import appeng.helpers.ICustomNameObject;
import appeng.helpers.IInterfaceHost;
import appeng.me.GridAccessException;
import appeng.me.GridNodeCollection;
import appeng.me.helpers.AENetworkProxy;
import appeng.me.helpers.MachineSource;
import appeng.me.storage.MEMonitorIFluidHandler;
@@ -54,24 +61,40 @@ import appeng.me.storage.MEMonitorPassThrough;
import appeng.me.storage.NullInventory;
import appeng.util.ConfigManager;
import appeng.util.IConfigManagerHost;
import appeng.util.InventoryAdaptor;
import appeng.util.Platform;
import gregtech.api.block.machines.BlockMachine;
import gregtech.api.metatileentity.MetaTileEntity;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.items.IItemHandler;
import java.util.Collection;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Optional;
public class DualityFluidInterface implements IGridTickable, IStorageMonitorable, IAEFluidInventory, IUpgradeableHost, IConfigManagerHost, IConfigurableFluidInventory {
public static final int NUMBER_OF_TANKS = 6;
public static final int TANK_CAPACITY = Fluid.BUCKET_VOLUME * 4;
private static final Collection<Block> BAD_BLOCKS = new HashSet<>(100);
private final ConfigManager cm = new ConfigManager(this);
private final AENetworkProxy gridProxy;
private final IFluidInterfaceHost iHost;
@@ -93,6 +116,9 @@ public class DualityFluidInterface implements IGridTickable, IStorageMonitorable
public DualityFluidInterface(final AENetworkProxy networkProxy, final IFluidInterfaceHost ih) {
this.gridProxy = networkProxy;
this.gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL);
this.cm.registerSetting(Settings.INTERFACE_TERMINAL, YesNo.YES);
this.iHost = ih;
this.mySource = new MachineSource(this.iHost);
@@ -192,6 +218,90 @@ public class DualityFluidInterface implements IGridTickable, IStorageMonitorable
return new DimensionalCoord(this.iHost.getTileEntity());
}
private boolean sameGrid(final IGrid grid) throws GridAccessException {
return grid == this.gridProxy.getGrid();
}
public String getTermName() {
final TileEntity hostTile = this.iHost.getTileEntity();
final World hostWorld = hostTile.getWorld();
if (((ICustomNameObject) this.iHost).hasCustomInventoryName()) {
return ((ICustomNameObject) this.iHost).getCustomInventoryName();
}
final EnumSet<EnumFacing> possibleDirections = this.iHost.getTargets();
for (final EnumFacing direction : possibleDirections) {
final BlockPos targ = hostTile.getPos().offset(direction);
final TileEntity directedTile = hostWorld.getTileEntity(targ);
if (directedTile == null) {
continue;
}
if (directedTile instanceof IFluidInterfaceHost) {
try {
if (((IFluidInterfaceHost) directedTile).getDualityFluidInterface().sameGrid(this.gridProxy.getGrid())) {
continue;
}
} catch (final GridAccessException e) {
continue;
}
}
final InventoryAdaptor adaptor = InventoryAdaptor.getAdaptor(directedTile, direction.getOpposite());
if (directedTile instanceof ICraftingMachine || adaptor != null) {
if (adaptor != null && !adaptor.hasSlots()) {
continue;
}
final IBlockState directedBlockState = hostWorld.getBlockState(targ);
final Block directedBlock = directedBlockState.getBlock();
ItemStack what = new ItemStack(directedBlock, 1, directedBlock.getMetaFromState(directedBlockState));
if (Loader.isModLoaded("gregtech") && directedBlock instanceof BlockMachine) {
MetaTileEntity metaTileEntity = Platform.getMetaTileEntity(directedTile.getWorld(), directedTile.getPos());
if (metaTileEntity != null) {
return metaTileEntity.getMetaFullName();
}
}
try {
Vec3d from = new Vec3d(hostTile.getPos().getX() + 0.5, hostTile.getPos().getY() + 0.5, hostTile.getPos().getZ() + 0.5);
from = from.addVector(direction.getFrontOffsetX() * 0.501, direction.getFrontOffsetY() * 0.501, direction.getFrontOffsetZ() * 0.501);
final Vec3d to = from.addVector(direction.getFrontOffsetX(), direction.getFrontOffsetY(), direction.getFrontOffsetZ());
final RayTraceResult mop = hostWorld.rayTraceBlocks(from, to, true);
if (mop != null && !BAD_BLOCKS.contains(directedBlock)) {
if (mop.getBlockPos().equals(directedTile.getPos())) {
final ItemStack g = directedBlock.getPickBlock(directedBlockState, mop, hostWorld, directedTile.getPos(), null);
if (!g.isEmpty()) {
what = g;
}
}
}
} catch (final Throwable t) {
BAD_BLOCKS.add(directedBlock); // nope!
}
if (what.getItem() != Items.AIR) {
return what.getItem().getItemStackDisplayName(what);
}
final Item item = Item.getItemFromBlock(directedBlock);
if (item == Items.AIR) {
return directedBlock.getUnlocalizedName();
}
}
}
return "Nothing";
}
public long getSortValue() {
final TileEntity te = this.iHost.getTileEntity();
return (te.getPos().getZ() << 24) ^ (te.getPos().getX() << 8) ^ te.getPos().getY();
}
public boolean hasCapability(Capability<?> capabilityClass, EnumFacing facing) {
return capabilityClass == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY || capabilityClass == Capabilities.STORAGE_MONITORABLE_ACCESSOR;
}