From 89058448cf490588f4c904daff89f5c5ae8ec9ae Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Thu, 6 Aug 2020 00:46:20 +0200 Subject: [PATCH] Merged most recent master. --- src/api/java/appeng/api/parts/IPart.java | 2 +- .../appeng/client/gui/widgets/TabButton.java | 2 +- .../parts/FluidAnnihilationPlanePart.java | 2 +- .../fluids/parts/SharedFluidBusPart.java | 2 +- src/main/java/appeng/parts/AEBasePart.java | 2 +- .../java/appeng/parts/CableBusContainer.java | 3 +- .../AbstractFormationPlanePart.java | 2 +- .../automation/AnnihilationPlanePart.java | 2 +- .../parts/automation/FormationPlanePart.java | 100 ++++---- .../automation/PlaneConnectionHelper.java | 43 ++-- .../parts/automation/SharedItemBusPart.java | 2 +- .../appeng/parts/misc/CableAnchorPart.java | 2 +- .../parts/misc/SharedStorageBusPart.java | 2 +- .../appeng/parts/misc/StorageBusPart.java | 2 +- .../java/appeng/parts/misc/ToggleBusPart.java | 2 +- .../appeng/parts/p2p/FluidP2PTunnelPart.java | 220 ++++++------------ .../appeng/parts/p2p/ItemP2PTunnelPart.java | 2 +- .../appeng/parts/p2p/LightP2PTunnelPart.java | 2 +- .../parts/p2p/RedstoneP2PTunnelPart.java | 2 +- .../reporting/AbstractReportingPart.java | 2 +- 20 files changed, 165 insertions(+), 233 deletions(-) diff --git a/src/api/java/appeng/api/parts/IPart.java b/src/api/java/appeng/api/parts/IPart.java index ca4a11bf1..68f40168f 100644 --- a/src/api/java/appeng/api/parts/IPart.java +++ b/src/api/java/appeng/api/parts/IPart.java @@ -135,7 +135,7 @@ public interface IPart extends ICustomCableConnection { /** * a block around the bus's host has been changed. */ - void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor); + void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor); /** * @return output redstone on facing side diff --git a/src/main/java/appeng/client/gui/widgets/TabButton.java b/src/main/java/appeng/client/gui/widgets/TabButton.java index adc907cf4..e487d799b 100644 --- a/src/main/java/appeng/client/gui/widgets/TabButton.java +++ b/src/main/java/appeng/client/gui/widgets/TabButton.java @@ -93,7 +93,7 @@ public class TabButton extends ButtonWidget implements ITooltip { } @Override - public ITextComponent getTooltipMessage() { + public Text getTooltipMessage() { return getMessage(); } diff --git a/src/main/java/appeng/fluids/parts/FluidAnnihilationPlanePart.java b/src/main/java/appeng/fluids/parts/FluidAnnihilationPlanePart.java index b4e09ec2a..b2a6017c4 100644 --- a/src/main/java/appeng/fluids/parts/FluidAnnihilationPlanePart.java +++ b/src/main/java/appeng/fluids/parts/FluidAnnihilationPlanePart.java @@ -89,7 +89,7 @@ public class FluidAnnihilationPlanePart extends BasicStatePart implements IGridT } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { if (pos.offset(this.getSide().getFacing()).equals(neighbor)) { this.refresh(); } else { diff --git a/src/main/java/appeng/fluids/parts/SharedFluidBusPart.java b/src/main/java/appeng/fluids/parts/SharedFluidBusPart.java index 3a1ce02af..7a7b028e3 100644 --- a/src/main/java/appeng/fluids/parts/SharedFluidBusPart.java +++ b/src/main/java/appeng/fluids/parts/SharedFluidBusPart.java @@ -67,7 +67,7 @@ public abstract class SharedFluidBusPart extends UpgradeablePart implements IGri } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { this.updateState(); if (this.lastRedstone != this.getHost().hasRedstone(this.getSide())) { this.lastRedstone = !this.lastRedstone; diff --git a/src/main/java/appeng/parts/AEBasePart.java b/src/main/java/appeng/parts/AEBasePart.java index e4f408d61..a716552e3 100644 --- a/src/main/java/appeng/parts/AEBasePart.java +++ b/src/main/java/appeng/parts/AEBasePart.java @@ -193,7 +193,7 @@ public abstract class AEBasePart implements IPart, IGridProxyable, IActionHost, } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { } diff --git a/src/main/java/appeng/parts/CableBusContainer.java b/src/main/java/appeng/parts/CableBusContainer.java index 402738a90..cac28ae44 100644 --- a/src/main/java/appeng/parts/CableBusContainer.java +++ b/src/main/java/appeng/parts/CableBusContainer.java @@ -29,7 +29,6 @@ import javax.annotation.Nullable; import net.fabricmc.fabric.api.util.NbtType; import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; @@ -685,7 +684,7 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I for (final AEPartLocation s : AEPartLocation.values()) { final IPart part = this.getPart(s); if (part != null) { - part.onneighborUpdate(w, pos, neighbor); + part.onNeighborUpdate(w, pos, neighbor); } } diff --git a/src/main/java/appeng/parts/automation/AbstractFormationPlanePart.java b/src/main/java/appeng/parts/automation/AbstractFormationPlanePart.java index e2af8a42c..3c58b5e5e 100644 --- a/src/main/java/appeng/parts/automation/AbstractFormationPlanePart.java +++ b/src/main/java/appeng/parts/automation/AbstractFormationPlanePart.java @@ -71,7 +71,7 @@ public abstract class AbstractFormationPlanePart> extends } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { if (pos.offset(this.getSide().getFacing()).equals(neighbor)) { final BlockEntity te = this.getHost().getTile(); final AEPartLocation side = this.getSide(); diff --git a/src/main/java/appeng/parts/automation/AnnihilationPlanePart.java b/src/main/java/appeng/parts/automation/AnnihilationPlanePart.java index bb4841428..a711d67d8 100644 --- a/src/main/java/appeng/parts/automation/AnnihilationPlanePart.java +++ b/src/main/java/appeng/parts/automation/AnnihilationPlanePart.java @@ -132,7 +132,7 @@ public class AnnihilationPlanePart extends BasicStatePart implements IGridTickab } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { if (pos.offset(this.getSide().getFacing()).equals(neighbor)) { this.refresh(); } else { diff --git a/src/main/java/appeng/parts/automation/FormationPlanePart.java b/src/main/java/appeng/parts/automation/FormationPlanePart.java index 52b354a47..a07b0f482 100644 --- a/src/main/java/appeng/parts/automation/FormationPlanePart.java +++ b/src/main/java/appeng/parts/automation/FormationPlanePart.java @@ -18,34 +18,14 @@ package appeng.parts.automation; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Random; - -import javax.annotation.Nullable; - -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.*; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - import alexiil.mc.lib.attributes.item.FixedItemInv; - -import appeng.api.config.*; +import appeng.api.config.AccessRestriction; +import appeng.api.config.Actionable; +import appeng.api.config.FuzzyMode; +import appeng.api.config.IncludeExclude; +import appeng.api.config.Settings; +import appeng.api.config.Upgrades; +import appeng.api.config.YesNo; import appeng.api.networking.events.MENetworkCellArrayUpdate; import appeng.api.networking.events.MENetworkChannelsChanged; import appeng.api.networking.events.MENetworkEventSubscribe; @@ -73,6 +53,30 @@ import appeng.util.Platform; import appeng.util.inv.InvOperation; import appeng.util.prioritylist.FuzzyPriorityList; import appeng.util.prioritylist.PrecisePriorityList; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.ItemEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.AutomaticItemPlacementContext; +import net.minecraft.item.Item; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; public class FormationPlanePart extends AbstractFormationPlanePart { @@ -232,7 +236,7 @@ public class FormationPlanePart extends AbstractFormationPlanePart PlaneDirectionalPlaceContext context = new PlaneDirectionalPlaceContext(w, player, placePos, lookDirection, is, lookDirection.getOpposite()); - i.onItemUse(context); + i.useOnBlock(context); maxStorage -= is.getCount(); } else { @@ -357,49 +361,49 @@ public class FormationPlanePart extends AbstractFormationPlanePart } /** - * A custom {@link DirectionalPlaceContext} which also accepts a player needed + * A custom {@link AutomaticItemPlacementContext} which also accepts a player needed * various blocks like seeds. *

- * Also removed {@link DirectionalPlaceContext#replacingClickedOnBlock} as this + * Also removed {@link AutomaticItemPlacementContext#canReplaceExisting} as this * can cause a {@link StackOverflowError} for certain replaceable blocks. */ - private static class PlaneDirectionalPlaceContext extends BlockItemUseContext { + private static class PlaneDirectionalPlaceContext extends ItemPlacementContext { private final Direction lookDirection; public PlaneDirectionalPlaceContext(World world, PlayerEntity player, BlockPos pos, Direction lookDirection, - ItemStack itemStack, Direction facing) { + ItemStack itemStack, Direction facing) { super(world, player, Hand.MAIN_HAND, itemStack, - new BlockRayTraceResult(Vector3d.copyCenteredHorizontally(pos), facing, pos, false)); + new BlockHitResult(Vec3d.ofBottomCenter(pos), facing, pos, false)); this.lookDirection = lookDirection; } @Override - public BlockPos getPos() { - return this.rayTraceResult.getPos(); + public BlockPos getBlockPos() { + return this.method_30344().getBlockPos(); } @Override public boolean canPlace() { - return this.world.getBlockState(this.rayTraceResult.getPos()).isReplaceable(this); + return this.getWorld().getBlockState(this.method_30344().getBlockPos()).canReplace(this); } @Override - public Direction getNearestLookingDirection() { + public Direction getPlayerLookDirection() { return Direction.DOWN; } @Override - public Direction[] getNearestLookingDirections() { + public Direction[] getPlacementDirections() { switch (this.lookDirection) { case DOWN: default: - return new Direction[] { Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.SOUTH, - Direction.WEST, Direction.UP }; + return new Direction[]{Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.SOUTH, + Direction.WEST, Direction.UP}; case UP: - return new Direction[] { Direction.DOWN, Direction.UP, Direction.NORTH, Direction.EAST, - Direction.SOUTH, Direction.WEST }; + return new Direction[]{Direction.DOWN, Direction.UP, Direction.NORTH, Direction.EAST, + Direction.SOUTH, Direction.WEST}; case NORTH: - return new Direction[] { Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.WEST, + return new Direction[]{Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.WEST, Direction.UP, Direction.SOUTH }; case SOUTH: return new Direction[] { Direction.DOWN, Direction.SOUTH, Direction.EAST, Direction.WEST, @@ -414,18 +418,18 @@ public class FormationPlanePart extends AbstractFormationPlanePart } @Override - public Direction getPlacementHorizontalFacing() { - return this.lookDirection.getAxis() == Axis.Y ? Direction.NORTH : this.lookDirection; + public Direction getPlayerFacing() { + return this.lookDirection.getAxis() == Direction.Axis.Y ? Direction.NORTH : this.lookDirection; } @Override - public boolean func_225518_g_() { + public boolean shouldCancelInteraction() { return false; } @Override - public float getPlacementYaw() { - return (float) (this.lookDirection.getHorizontalIndex() * 90); + public float getPlayerYaw() { + return (float) (this.lookDirection.getHorizontal() * 90); } } } diff --git a/src/main/java/appeng/parts/automation/PlaneConnectionHelper.java b/src/main/java/appeng/parts/automation/PlaneConnectionHelper.java index 31d7ee5a8..a7f52e5cc 100644 --- a/src/main/java/appeng/parts/automation/PlaneConnectionHelper.java +++ b/src/main/java/appeng/parts/automation/PlaneConnectionHelper.java @@ -2,9 +2,9 @@ package appeng.parts.automation; import javax.annotation.Nullable; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; import net.minecraft.world.World; import appeng.api.parts.IPart; @@ -31,7 +31,7 @@ public final class PlaneConnectionHelper { * to */ public PlaneConnections getConnections() { - TileEntity hostTileEntity = getHostTileEntity(); + BlockEntity hostTileEntity = getHostBlockEntity(); AEPartLocation side = part.getSide(); final Direction facingRight, facingUp; @@ -71,19 +71,19 @@ public final class PlaneConnectionHelper { World world = hostTileEntity.getWorld(); BlockPos pos = hostTileEntity.getPos(); - if (isCompatiblePlaneAdjacent(world.getTileEntity(pos.offset(facingRight.getOpposite())))) { + if (isCompatiblePlaneAdjacent(world.getBlockEntity(pos.offset(facingRight.getOpposite())))) { left = true; } - if (isCompatiblePlaneAdjacent(world.getTileEntity(pos.offset(facingRight)))) { + if (isCompatiblePlaneAdjacent(world.getBlockEntity(pos.offset(facingRight)))) { right = true; } - if (isCompatiblePlaneAdjacent(world.getTileEntity(pos.offset(facingUp.getOpposite())))) { + if (isCompatiblePlaneAdjacent(world.getBlockEntity(pos.offset(facingUp.getOpposite())))) { down = true; } - if (isCompatiblePlaneAdjacent(world.getTileEntity(pos.offset(facingUp)))) { + if (isCompatiblePlaneAdjacent(world.getBlockEntity(pos.offset(facingUp)))) { up = true; } } @@ -100,28 +100,28 @@ public final class PlaneConnectionHelper { int maxX = 15; int maxY = 15; - TileEntity hostTile = getHostTileEntity(); - if (hostTile != null) { - World world = hostTile.getWorld(); + BlockEntity hostEntity = getHostBlockEntity(); + if (hostEntity != null) { + World world = hostEntity.getWorld(); - final BlockPos pos = hostTile.getPos(); + final BlockPos pos = hostEntity.getPos(); final Direction e = bch.getWorldX(); final Direction u = bch.getWorldY(); - if (isCompatiblePlaneAdjacent(world.getTileEntity(pos.offset(e.getOpposite())))) { + if (isCompatiblePlaneAdjacent(world.getBlockEntity(pos.offset(e.getOpposite())))) { minX = 0; } - if (isCompatiblePlaneAdjacent(world.getTileEntity(pos.offset(e)))) { + if (isCompatiblePlaneAdjacent(world.getBlockEntity(pos.offset(e)))) { maxX = 16; } - if (isCompatiblePlaneAdjacent(world.getTileEntity(pos.offset(u.getOpposite())))) { + if (isCompatiblePlaneAdjacent(world.getBlockEntity(pos.offset(u.getOpposite())))) { minY = 0; } - if (isCompatiblePlaneAdjacent(world.getTileEntity(pos.offset(u)))) { + if (isCompatiblePlaneAdjacent(world.getBlockEntity(pos.offset(u)))) { maxY = 16; } } @@ -135,21 +135,18 @@ public final class PlaneConnectionHelper { * recalculated. */ public void updateConnections() { - TileEntity hostTile = getHostTileEntity(); - if (hostTile != null) { - hostTile.requestModelDataUpdate(); - } + // Not needed in Fabric, since model data is automatically updated } - private boolean isCompatiblePlaneAdjacent(@Nullable TileEntity adjacentTileEntity) { - if (adjacentTileEntity instanceof IPartHost) { - final IPart p = ((IPartHost) adjacentTileEntity).getPart(part.getSide()); + private boolean isCompatiblePlaneAdjacent(@Nullable BlockEntity adjacentBlockEntity) { + if (adjacentBlockEntity instanceof IPartHost) { + final IPart p = ((IPartHost) adjacentBlockEntity).getPart(part.getSide()); return p != null && p.getClass() == part.getClass(); } return false; } - private TileEntity getHostTileEntity() { + private BlockEntity getHostBlockEntity() { IPartHost host = part.getHost(); if (host != null) { return host.getTile(); diff --git a/src/main/java/appeng/parts/automation/SharedItemBusPart.java b/src/main/java/appeng/parts/automation/SharedItemBusPart.java index 5306286e0..033b53f88 100644 --- a/src/main/java/appeng/parts/automation/SharedItemBusPart.java +++ b/src/main/java/appeng/parts/automation/SharedItemBusPart.java @@ -71,7 +71,7 @@ public abstract class SharedItemBusPart extends UpgradeablePart implements IGrid } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { this.updateState(); if (this.lastRedstone != this.getHost().hasRedstone(this.getSide())) { this.lastRedstone = !this.lastRedstone; diff --git a/src/main/java/appeng/parts/misc/CableAnchorPart.java b/src/main/java/appeng/parts/misc/CableAnchorPart.java index dd43557c8..bea66b70b 100644 --- a/src/main/java/appeng/parts/misc/CableAnchorPart.java +++ b/src/main/java/appeng/parts/misc/CableAnchorPart.java @@ -117,7 +117,7 @@ public class CableAnchorPart implements IPart { } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { } diff --git a/src/main/java/appeng/parts/misc/SharedStorageBusPart.java b/src/main/java/appeng/parts/misc/SharedStorageBusPart.java index 1412d32cf..3d5a2d4e7 100644 --- a/src/main/java/appeng/parts/misc/SharedStorageBusPart.java +++ b/src/main/java/appeng/parts/misc/SharedStorageBusPart.java @@ -134,7 +134,7 @@ public abstract class SharedStorageBusPart extends UpgradeablePart } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { if (pos.offset(this.getSide().getFacing()).equals(neighbor)) { this.resetCache(false); } diff --git a/src/main/java/appeng/parts/misc/StorageBusPart.java b/src/main/java/appeng/parts/misc/StorageBusPart.java index fd9a9a01e..a2d98cb16 100644 --- a/src/main/java/appeng/parts/misc/StorageBusPart.java +++ b/src/main/java/appeng/parts/misc/StorageBusPart.java @@ -255,7 +255,7 @@ public class StorageBusPart extends UpgradeablePart } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { if (pos.offset(this.getSide().getFacing()).equals(neighbor)) { final BlockEntity te = w.getBlockEntity(neighbor); diff --git a/src/main/java/appeng/parts/misc/ToggleBusPart.java b/src/main/java/appeng/parts/misc/ToggleBusPart.java index 4189c0163..0457380a6 100644 --- a/src/main/java/appeng/parts/misc/ToggleBusPart.java +++ b/src/main/java/appeng/parts/misc/ToggleBusPart.java @@ -99,7 +99,7 @@ public class ToggleBusPart extends BasicStatePart { } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { final boolean oldHasRedstone = this.hasRedstone; this.hasRedstone = this.getHost().hasRedstone(this.getSide()); diff --git a/src/main/java/appeng/parts/p2p/FluidP2PTunnelPart.java b/src/main/java/appeng/parts/p2p/FluidP2PTunnelPart.java index ff530ac21..317585231 100644 --- a/src/main/java/appeng/parts/p2p/FluidP2PTunnelPart.java +++ b/src/main/java/appeng/parts/p2p/FluidP2PTunnelPart.java @@ -18,32 +18,38 @@ package appeng.parts.p2p; -import java.util.List; - -import javax.annotation.Nonnull; - -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockReader; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler; - +import alexiil.mc.lib.attributes.Attribute; +import alexiil.mc.lib.attributes.AttributeList; +import alexiil.mc.lib.attributes.SearchOptions; +import alexiil.mc.lib.attributes.Simulation; +import alexiil.mc.lib.attributes.fluid.FluidAttributes; +import alexiil.mc.lib.attributes.fluid.FluidExtractable; +import alexiil.mc.lib.attributes.fluid.FluidInsertable; +import alexiil.mc.lib.attributes.fluid.amount.FluidAmount; +import alexiil.mc.lib.attributes.fluid.filter.FluidFilter; +import alexiil.mc.lib.attributes.fluid.impl.EmptyFluidExtractable; +import alexiil.mc.lib.attributes.fluid.impl.RejectingFluidInsertable; +import alexiil.mc.lib.attributes.fluid.volume.FluidKey; +import alexiil.mc.lib.attributes.fluid.volume.FluidVolume; import appeng.api.config.PowerUnits; import appeng.api.parts.IPartModel; import appeng.items.parts.PartModels; import appeng.me.GridAccessException; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; + +import java.util.List; public class FluidP2PTunnelPart extends P2PTunnelPart { private static final P2PModels MODELS = new P2PModels("part/p2p/p2p_tunnel_fluids"); - private static final IFluidHandler NULL_FLUID_HANDLER = new NullFluidHandler(); - private final IFluidHandler inputHandler = new InputFluidHandler(); - private final IFluidHandler outputHandler = new OutputFluidHandler(); + private final FluidInsertable inputHandler = new InputFluidHandler(); + private final FluidExtractable outputHandler = new OutputFluidHandler(); public FluidP2PTunnelPart(final ItemStack is) { super(is); @@ -63,7 +69,7 @@ public class FluidP2PTunnelPart extends P2PTunnelPart { } @Override - public void onNeighborChanged(IBlockReader w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { if (this.isOutput()) { final FluidP2PTunnelPart in = this.getInput(); if (in != null) { @@ -72,17 +78,13 @@ public class FluidP2PTunnelPart extends P2PTunnelPart { } } - @SuppressWarnings("unchecked") @Override - public LazyOptional getCapability(Capability capabilityClass) { - if (capabilityClass == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { - if (this.isOutput()) { - return (LazyOptional) LazyOptional.of(() -> this.outputHandler); - } - return (LazyOptional) LazyOptional.of(() -> this.inputHandler); + public void addAllAttributes(AttributeList to) { + if (this.isOutput()) { + to.offer(this.outputHandler); + } else { + to.offer(this.inputHandler); } - - return super.getCapability(capabilityClass); } @Override @@ -90,173 +92,103 @@ public class FluidP2PTunnelPart extends P2PTunnelPart { return MODELS.getModel(this.isPowered(), this.isActive()); } - private IFluidHandler getAttachedFluidHandler() { - LazyOptional fluidHandler = LazyOptional.empty(); + // Gets the given attribute (or the defaultValue) of the block that this part attaches to + private T getAttachedAttribute(Attribute attribute, T defaultValue) { + T result = null; if (this.isActive()) { - final TileEntity self = this.getTile(); - final TileEntity te = self.getWorld().getTileEntity(self.getPos().offset(this.getSide().getFacing())); - - if (te != null) { - fluidHandler = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, - this.getSide().getOpposite().getFacing()); - } + final BlockEntity self = this.getTile(); + Direction direction = this.getSide().getFacing(); + BlockPos targetPos = self.getPos().offset(direction); + World world = self.getWorld(); + result = attribute.getFirstOrNull(world, targetPos, SearchOptions.inDirection(direction)); } - return fluidHandler.orElse(NULL_FLUID_HANDLER); + return result != null ? result : defaultValue; } - private class InputFluidHandler implements IFluidHandler { + private FluidInsertable getAttachedOutput() { + return getAttachedAttribute(FluidAttributes.INSERTABLE, RejectingFluidInsertable.NULL); + } + + private FluidExtractable getAttachedInput() { + return getAttachedAttribute(FluidAttributes.EXTRACTABLE, EmptyFluidExtractable.NULL); + } + + private class InputFluidHandler implements FluidInsertable { @Override - public int getTanks() { - return 1; - } - - @Override - @Nonnull - public FluidStack getFluidInTank(int tank) { - return FluidStack.EMPTY; - } - - @Override - public int getTankCapacity(int tank) { - return Integer.MAX_VALUE; - } - - @Override - public boolean isFluidValid(int tank, @Nonnull FluidStack stack) { - return true; - } - - @Override - public int fill(FluidStack resource, FluidAction action) { - int total = 0; + public FluidVolume attemptInsertion(FluidVolume fluidVolume, Simulation simulation) { + FluidAmount overflowAmount = FluidAmount.ZERO; try { final int outputTunnels = FluidP2PTunnelPart.this.getOutputs().size(); - final int amount = resource.getAmount(); + final FluidAmount amount = fluidVolume.amount(); - if (outputTunnels == 0 || amount == 0) { - return 0; + if (outputTunnels == 0 || amount.isZero()) { + return fluidVolume; } - final int amountPerOutput = Math.max(1, amount / outputTunnels); - int overflow = amountPerOutput == 0 ? amount : amount % amountPerOutput; + final FluidAmount amountPerOutput = amount.div(outputTunnels); for (FluidP2PTunnelPart target : FluidP2PTunnelPart.this.getOutputs()) { - final IFluidHandler output = target.getAttachedFluidHandler(); - final int toSend = amountPerOutput + overflow; - final FluidStack fillWithFluidStack = resource.copy(); - fillWithFluidStack.setAmount(toSend); + final FluidInsertable output = target.getAttachedOutput(); + final FluidVolume fillWithFluidStack = fluidVolume.withAmount(amountPerOutput.add(overflowAmount)); - final int received = output.fill(fillWithFluidStack, action); - - overflow = toSend - received; - total += received; + overflowAmount = output.attemptInsertion(fillWithFluidStack, simulation).amount(); } - if (action == FluidAction.EXECUTE) { - FluidP2PTunnelPart.this.queueTunnelDrain(PowerUnits.RF, total); + if (simulation.isAction()) { + FluidP2PTunnelPart.this.queueTunnelDrain(PowerUnits.RF, amount.sub(overflowAmount).asInexactDouble() * 1000); } } catch (GridAccessException ignored) { } - return total; - } - - @Override - @Nonnull - public FluidStack drain(FluidStack resource, FluidAction action) { - return FluidStack.EMPTY; - } - - @Override - @Nonnull - public FluidStack drain(int maxDrain, FluidAction action) { - return FluidStack.EMPTY; + return fluidVolume.withAmount(overflowAmount); } } - private class OutputFluidHandler implements IFluidHandler { + private class OutputFluidHandler implements FluidExtractable { @Override - public int getTanks() { - return FluidP2PTunnelPart.this.getAttachedFluidHandler().getTanks(); + public FluidVolume attemptExtraction(FluidFilter filter, FluidAmount maxAmount, Simulation simulation) { + return getAttachedInput().attemptExtraction(filter, maxAmount, simulation); } @Override - @Nonnull - public FluidStack getFluidInTank(int tank) { - return FluidP2PTunnelPart.this.getAttachedFluidHandler().getFluidInTank(tank); + public FluidVolume attemptAnyExtraction(FluidAmount maxAmount, Simulation simulation) { + return getAttachedInput().attemptAnyExtraction(maxAmount, simulation); } @Override - public int getTankCapacity(int tank) { - return FluidP2PTunnelPart.this.getAttachedFluidHandler().getTankCapacity(tank); + public FluidVolume extract(FluidFilter filter, FluidAmount maxAmount) { + return getAttachedInput().extract(filter, maxAmount); } @Override - public boolean isFluidValid(int tank, @Nonnull FluidStack stack) { - return FluidP2PTunnelPart.this.getAttachedFluidHandler().isFluidValid(tank, stack); + public FluidVolume extract(FluidKey filter, FluidAmount maxAmount) { + return getAttachedInput().extract(filter, maxAmount); } @Override - public int fill(FluidStack resource, FluidAction action) { - return 0; + public FluidVolume extract(FluidAmount maxAmount) { + return getAttachedInput().extract(maxAmount); } @Override - @Nonnull - public FluidStack drain(FluidStack resource, FluidAction action) { - return FluidP2PTunnelPart.this.getAttachedFluidHandler().drain(resource, action); + public boolean couldExtractAnything() { + return getAttachedInput().couldExtractAnything(); } @Override - @Nonnull - public FluidStack drain(int maxDrain, FluidAction action) { - return FluidP2PTunnelPart.this.getAttachedFluidHandler().drain(maxDrain, action); - } - } - - private static class NullFluidHandler implements IFluidHandler { - - @Override - public int getTanks() { - return 0; + public FluidExtractable filtered(FluidFilter filter) { + return getAttachedInput().filtered(filter); } @Override - @Nonnull - public FluidStack getFluidInTank(int tank) { - return FluidStack.EMPTY; + public FluidExtractable getPureExtractable() { + return getAttachedInput().getPureExtractable(); } - @Override - public int getTankCapacity(int tank) { - return 0; - } - - @Override - public boolean isFluidValid(int tank, @Nonnull FluidStack stack) { - return false; - } - - @Override - public int fill(FluidStack resource, FluidAction action) { - return 0; - } - - @Override - @Nonnull - public FluidStack drain(FluidStack resource, FluidAction action) { - return FluidStack.EMPTY; - } - - @Override - @Nonnull - public FluidStack drain(int maxDrain, FluidAction action) { - return FluidStack.EMPTY; - } } } diff --git a/src/main/java/appeng/parts/p2p/ItemP2PTunnelPart.java b/src/main/java/appeng/parts/p2p/ItemP2PTunnelPart.java index 08291ed0f..894686b81 100644 --- a/src/main/java/appeng/parts/p2p/ItemP2PTunnelPart.java +++ b/src/main/java/appeng/parts/p2p/ItemP2PTunnelPart.java @@ -67,7 +67,7 @@ public class ItemP2PTunnelPart extends P2PTunnelPart implemen } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { this.cachedInv = null; this.cachedInvs.clear(); final ItemP2PTunnelPart input = this.getInput(); diff --git a/src/main/java/appeng/parts/p2p/LightP2PTunnelPart.java b/src/main/java/appeng/parts/p2p/LightP2PTunnelPart.java index 442f11711..eb9dc80b2 100644 --- a/src/main/java/appeng/parts/p2p/LightP2PTunnelPart.java +++ b/src/main/java/appeng/parts/p2p/LightP2PTunnelPart.java @@ -113,7 +113,7 @@ public class LightP2PTunnelPart extends P2PTunnelPart implem } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { if (this.isOutput() && pos.offset(this.getSide().getFacing()).equals(neighbor)) { this.opacity = -1; this.getHost().markForUpdate(); diff --git a/src/main/java/appeng/parts/p2p/RedstoneP2PTunnelPart.java b/src/main/java/appeng/parts/p2p/RedstoneP2PTunnelPart.java index 244a53e60..2200fe1d5 100644 --- a/src/main/java/appeng/parts/p2p/RedstoneP2PTunnelPart.java +++ b/src/main/java/appeng/parts/p2p/RedstoneP2PTunnelPart.java @@ -128,7 +128,7 @@ public class RedstoneP2PTunnelPart extends P2PTunnelPart } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { if (!this.isOutput()) { final BlockPos target = this.getTile().getPos().offset(this.getSide().getFacing()); diff --git a/src/main/java/appeng/parts/reporting/AbstractReportingPart.java b/src/main/java/appeng/parts/reporting/AbstractReportingPart.java index 0b73891f1..94c3bfbef 100644 --- a/src/main/java/appeng/parts/reporting/AbstractReportingPart.java +++ b/src/main/java/appeng/parts/reporting/AbstractReportingPart.java @@ -105,7 +105,7 @@ public abstract class AbstractReportingPart extends AEBasePart implements IMonit } @Override - public void onneighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { + public void onNeighborUpdate(BlockView w, BlockPos pos, BlockPos neighbor) { if (pos.offset(this.getSide().getFacing()).equals(neighbor)) { this.opacity = -1; this.getHost().markForUpdate();