mirror of
https://github.com/Ellpeck/PrettyPipes.git
synced 2024-11-22 19:58:35 +01:00
made IPipeConnectable a capability
This commit is contained in:
parent
5cda7beca7
commit
4ff3ac6851
12 changed files with 131 additions and 107 deletions
|
@ -90,6 +90,8 @@ public final class Registry {
|
||||||
|
|
||||||
@CapabilityInject(PipeNetwork.class)
|
@CapabilityInject(PipeNetwork.class)
|
||||||
public static Capability<PipeNetwork> pipeNetworkCapability;
|
public static Capability<PipeNetwork> pipeNetworkCapability;
|
||||||
|
@CapabilityInject(IPipeConnectable.class)
|
||||||
|
public static Capability<IPipeConnectable> pipeConnectableCapability;
|
||||||
|
|
||||||
public static Item wrenchItem;
|
public static Item wrenchItem;
|
||||||
public static Item pipeFrameItem;
|
public static Item pipeFrameItem;
|
||||||
|
@ -203,18 +205,8 @@ public final class Registry {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setup(FMLCommonSetupEvent event) {
|
public static void setup(FMLCommonSetupEvent event) {
|
||||||
CapabilityManager.INSTANCE.register(PipeNetwork.class, new Capability.IStorage<PipeNetwork>() {
|
registerCap(PipeNetwork.class);
|
||||||
@Nullable
|
registerCap(IPipeConnectable.class);
|
||||||
@Override
|
|
||||||
public INBT writeNBT(Capability<PipeNetwork> capability, PipeNetwork instance, Direction side) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void readNBT(Capability<PipeNetwork> capability, PipeNetwork instance, Direction side, INBT nbt) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}, () -> null);
|
|
||||||
PacketHandler.setup();
|
PacketHandler.setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,4 +228,19 @@ public final class Registry {
|
||||||
ScreenManager.registerFactory(craftingModuleContainer, CraftingModuleGui::new);
|
ScreenManager.registerFactory(craftingModuleContainer, CraftingModuleGui::new);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static <T> void registerCap(Class<T> capClass) {
|
||||||
|
CapabilityManager.INSTANCE.register(capClass, new Capability.IStorage<T>() {
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public INBT writeNBT(Capability<T> capability, T instance, Direction side) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readNBT(Capability<T> capability, T instance, Direction side, INBT nbt) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, () -> null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -212,7 +212,7 @@ public class PipeItem implements INBTSerializable<CompoundNBT> {
|
||||||
Direction dir = Utility.getDirectionFromOffset(this.destInventory, this.getDestPipe());
|
Direction dir = Utility.getDirectionFromOffset(this.destInventory, this.getDestPipe());
|
||||||
IPipeConnectable connectable = currPipe.getPipeConnectable(dir);
|
IPipeConnectable connectable = currPipe.getPipeConnectable(dir);
|
||||||
if (connectable != null)
|
if (connectable != null)
|
||||||
return connectable.insertItem(currPipe.getWorld(), currPipe.getPos(), dir, this.stack, false);
|
return connectable.insertItem(currPipe.getPos(), dir, this.stack, false);
|
||||||
IItemHandler handler = currPipe.getItemHandler(dir);
|
IItemHandler handler = currPipe.getItemHandler(dir);
|
||||||
if (handler != null)
|
if (handler != null)
|
||||||
return ItemHandlerHelper.insertItemStacked(handler, this.stack, false);
|
return ItemHandlerHelper.insertItemStacked(handler, this.stack, false);
|
||||||
|
|
|
@ -1,22 +1,18 @@
|
||||||
package de.ellpeck.prettypipes.pipe;
|
package de.ellpeck.prettypipes.pipe;
|
||||||
|
|
||||||
import de.ellpeck.prettypipes.network.PipeItem;
|
|
||||||
import net.minecraft.block.BlockState;
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
|
||||||
import net.minecraftforge.items.IItemHandler;
|
|
||||||
|
|
||||||
public interface IPipeConnectable {
|
public interface IPipeConnectable {
|
||||||
|
|
||||||
ConnectionType getConnectionType(World world, BlockPos pipePos, Direction direction);
|
ConnectionType getConnectionType(BlockPos pipePos, Direction direction);
|
||||||
|
|
||||||
default ItemStack insertItem(World world, BlockPos pipePos, Direction direction, ItemStack stack, boolean simulate) {
|
default ItemStack insertItem(BlockPos pipePos, Direction direction, ItemStack stack, boolean simulate) {
|
||||||
return stack;
|
return stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
default boolean allowsModules(World world, BlockPos pipePos, Direction direction) {
|
default boolean allowsModules(BlockPos pipePos, Direction direction) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package de.ellpeck.prettypipes.pipe;
|
package de.ellpeck.prettypipes.pipe;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import de.ellpeck.prettypipes.Registry;
|
||||||
import de.ellpeck.prettypipes.Utility;
|
import de.ellpeck.prettypipes.Utility;
|
||||||
import de.ellpeck.prettypipes.items.IModule;
|
import de.ellpeck.prettypipes.items.IModule;
|
||||||
import de.ellpeck.prettypipes.network.PipeItem;
|
import de.ellpeck.prettypipes.network.PipeItem;
|
||||||
|
@ -41,7 +42,7 @@ import javax.annotation.Nullable;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class PipeBlock extends ContainerBlock implements IPipeConnectable {
|
public class PipeBlock extends ContainerBlock {
|
||||||
|
|
||||||
public static final Map<Direction, EnumProperty<ConnectionType>> DIRECTIONS = new HashMap<>();
|
public static final Map<Direction, EnumProperty<ConnectionType>> DIRECTIONS = new HashMap<>();
|
||||||
private static final Map<Pair<BlockState, BlockState>, VoxelShape> SHAPE_CACHE = new HashMap<>();
|
private static final Map<Pair<BlockState, BlockState>, VoxelShape> SHAPE_CACHE = new HashMap<>();
|
||||||
|
@ -180,16 +181,16 @@ public class PipeBlock extends ContainerBlock implements IPipeConnectable {
|
||||||
BlockPos offset = pos.offset(direction);
|
BlockPos offset = pos.offset(direction);
|
||||||
if (!world.isBlockLoaded(offset))
|
if (!world.isBlockLoaded(offset))
|
||||||
return ConnectionType.DISCONNECTED;
|
return ConnectionType.DISCONNECTED;
|
||||||
BlockState offState = world.getBlockState(offset);
|
|
||||||
Block block = offState.getBlock();
|
|
||||||
if (block instanceof IPipeConnectable)
|
|
||||||
return ((IPipeConnectable) block).getConnectionType(world, pos, direction);
|
|
||||||
TileEntity tile = world.getTileEntity(offset);
|
TileEntity tile = world.getTileEntity(offset);
|
||||||
if (tile != null) {
|
if (tile != null) {
|
||||||
|
IPipeConnectable connectable = tile.getCapability(Registry.pipeConnectableCapability, direction.getOpposite()).orElse(null);
|
||||||
|
if (connectable != null)
|
||||||
|
return connectable.getConnectionType(pos, direction);
|
||||||
IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction.getOpposite()).orElse(null);
|
IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction.getOpposite()).orElse(null);
|
||||||
if (handler != null)
|
if (handler != null)
|
||||||
return ConnectionType.CONNECTED;
|
return ConnectionType.CONNECTED;
|
||||||
}
|
}
|
||||||
|
BlockState offState = world.getBlockState(offset);
|
||||||
if (hasLegsTo(world, offState, offset, direction)) {
|
if (hasLegsTo(world, offState, offset, direction)) {
|
||||||
if (DIRECTIONS.values().stream().noneMatch(d -> state.get(d) == ConnectionType.LEGS))
|
if (DIRECTIONS.values().stream().noneMatch(d -> state.get(d) == ConnectionType.LEGS))
|
||||||
return ConnectionType.LEGS;
|
return ConnectionType.LEGS;
|
||||||
|
@ -273,12 +274,4 @@ public class PipeBlock extends ContainerBlock implements IPipeConnectable {
|
||||||
public BlockRenderType getRenderType(BlockState state) {
|
public BlockRenderType getRenderType(BlockState state) {
|
||||||
return BlockRenderType.MODEL;
|
return BlockRenderType.MODEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ConnectionType getConnectionType(World world, BlockPos pipePos, Direction direction) {
|
|
||||||
BlockState state = world.getBlockState(pipePos.offset(direction));
|
|
||||||
if (state.get(DIRECTIONS.get(direction.getOpposite())) == ConnectionType.BLOCKED)
|
|
||||||
return ConnectionType.BLOCKED;
|
|
||||||
return ConnectionType.CONNECTED;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,9 +35,12 @@ import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.text.ITextComponent;
|
import net.minecraft.util.text.ITextComponent;
|
||||||
import net.minecraft.util.text.TranslationTextComponent;
|
import net.minecraft.util.text.TranslationTextComponent;
|
||||||
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||||
|
import net.minecraftforge.common.capabilities.Capability;
|
||||||
import net.minecraftforge.common.util.Constants.NBT;
|
import net.minecraftforge.common.util.Constants.NBT;
|
||||||
|
import net.minecraftforge.common.util.LazyOptional;
|
||||||
import net.minecraftforge.items.CapabilityItemHandler;
|
import net.minecraftforge.items.CapabilityItemHandler;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
import net.minecraftforge.items.ItemHandlerHelper;
|
import net.minecraftforge.items.ItemHandlerHelper;
|
||||||
|
@ -53,7 +56,7 @@ import java.util.function.Consumer;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class PipeTileEntity extends TileEntity implements INamedContainerProvider, ITickableTileEntity {
|
public class PipeTileEntity extends TileEntity implements INamedContainerProvider, ITickableTileEntity, IPipeConnectable {
|
||||||
|
|
||||||
public final ItemStackHandler modules = new ItemStackHandler(3) {
|
public final ItemStackHandler modules = new ItemStackHandler(3) {
|
||||||
@Override
|
@Override
|
||||||
|
@ -316,9 +319,9 @@ public class PipeTileEntity extends TileEntity implements INamedContainerProvide
|
||||||
}
|
}
|
||||||
|
|
||||||
public IPipeConnectable getPipeConnectable(Direction dir) {
|
public IPipeConnectable getPipeConnectable(Direction dir) {
|
||||||
BlockState state = this.world.getBlockState(this.pos.offset(dir));
|
TileEntity tile = this.world.getTileEntity(this.pos.offset(dir));
|
||||||
if (state.getBlock() instanceof IPipeConnectable)
|
if (tile != null)
|
||||||
return (IPipeConnectable) state.getBlock();
|
return tile.getCapability(Registry.pipeConnectableCapability, dir.getOpposite()).orElse(null);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,7 +334,7 @@ public class PipeTileEntity extends TileEntity implements INamedContainerProvide
|
||||||
if (this.isConnectedInventory(dir))
|
if (this.isConnectedInventory(dir))
|
||||||
return true;
|
return true;
|
||||||
IPipeConnectable connectable = this.getPipeConnectable(dir);
|
IPipeConnectable connectable = this.getPipeConnectable(dir);
|
||||||
if (connectable != null && connectable.allowsModules(this.world, this.pos, dir))
|
if (connectable != null && connectable.allowsModules(this.pos, dir))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -378,4 +381,19 @@ public class PipeTileEntity extends TileEntity implements INamedContainerProvide
|
||||||
// our render bounding box should always be the full block in case we're covered
|
// our render bounding box should always be the full block in case we're covered
|
||||||
return new AxisAlignedBB(this.pos);
|
return new AxisAlignedBB(this.pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
|
||||||
|
if (cap == Registry.pipeConnectableCapability)
|
||||||
|
return LazyOptional.of(() -> (T) this);
|
||||||
|
return LazyOptional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConnectionType getConnectionType(BlockPos pipePos, Direction direction) {
|
||||||
|
BlockState state = this.world.getBlockState(pipePos.offset(direction));
|
||||||
|
if (state.get(PipeBlock.DIRECTIONS.get(direction.getOpposite())) == ConnectionType.BLOCKED)
|
||||||
|
return ConnectionType.BLOCKED;
|
||||||
|
return ConnectionType.CONNECTED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@ public class CraftingModuleItem extends ModuleItem {
|
||||||
IPipeConnectable connectable = destPipe.getPipeConnectable(dir);
|
IPipeConnectable connectable = destPipe.getPipeConnectable(dir);
|
||||||
if (connectable == null)
|
if (connectable == null)
|
||||||
continue;
|
continue;
|
||||||
ItemStack connectableRemain = connectable.insertItem(tile.getWorld(), destPipe.getPos(), dir, remain, true);
|
ItemStack connectableRemain = connectable.insertItem(destPipe.getPos(), dir, remain, true);
|
||||||
if (connectableRemain.getCount() != remain.getCount()) {
|
if (connectableRemain.getCount() != remain.getCount()) {
|
||||||
ItemStack inserted = remain.copy();
|
ItemStack inserted = remain.copy();
|
||||||
inserted.shrink(connectableRemain.getCount());
|
inserted.shrink(connectableRemain.getCount());
|
||||||
|
|
|
@ -27,7 +27,7 @@ import net.minecraftforge.fml.network.NetworkHooks;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class PressurizerBlock extends ContainerBlock implements IPipeConnectable {
|
public class PressurizerBlock extends ContainerBlock {
|
||||||
public PressurizerBlock() {
|
public PressurizerBlock() {
|
||||||
super(Properties.create(Material.ROCK).hardnessAndResistance(3).sound(SoundType.STONE));
|
super(Properties.create(Material.ROCK).hardnessAndResistance(3).sound(SoundType.STONE));
|
||||||
}
|
}
|
||||||
|
@ -42,11 +42,6 @@ public class PressurizerBlock extends ContainerBlock implements IPipeConnectable
|
||||||
return ActionResultType.SUCCESS;
|
return ActionResultType.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ConnectionType getConnectionType(World world, BlockPos pipePos, Direction direction) {
|
|
||||||
return ConnectionType.CONNECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TileEntity createNewTileEntity(IBlockReader worldIn) {
|
public TileEntity createNewTileEntity(IBlockReader worldIn) {
|
||||||
return new PressurizerTileEntity();
|
return new PressurizerTileEntity();
|
||||||
|
|
|
@ -4,6 +4,8 @@ import de.ellpeck.prettypipes.PrettyPipes;
|
||||||
import de.ellpeck.prettypipes.Registry;
|
import de.ellpeck.prettypipes.Registry;
|
||||||
import de.ellpeck.prettypipes.Utility;
|
import de.ellpeck.prettypipes.Utility;
|
||||||
import de.ellpeck.prettypipes.network.PipeNetwork;
|
import de.ellpeck.prettypipes.network.PipeNetwork;
|
||||||
|
import de.ellpeck.prettypipes.pipe.ConnectionType;
|
||||||
|
import de.ellpeck.prettypipes.pipe.IPipeConnectable;
|
||||||
import de.ellpeck.prettypipes.pipe.PipeTileEntity;
|
import de.ellpeck.prettypipes.pipe.PipeTileEntity;
|
||||||
import de.ellpeck.prettypipes.terminal.containers.ItemTerminalContainer;
|
import de.ellpeck.prettypipes.terminal.containers.ItemTerminalContainer;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
|
@ -22,6 +24,7 @@ import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.text.ITextComponent;
|
import net.minecraft.util.text.ITextComponent;
|
||||||
import net.minecraft.util.text.TranslationTextComponent;
|
import net.minecraft.util.text.TranslationTextComponent;
|
||||||
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.common.capabilities.Capability;
|
import net.minecraftforge.common.capabilities.Capability;
|
||||||
import net.minecraftforge.common.util.LazyOptional;
|
import net.minecraftforge.common.util.LazyOptional;
|
||||||
import net.minecraftforge.energy.CapabilityEnergy;
|
import net.minecraftforge.energy.CapabilityEnergy;
|
||||||
|
@ -30,7 +33,7 @@ import net.minecraftforge.energy.IEnergyStorage;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public class PressurizerTileEntity extends TileEntity implements INamedContainerProvider, ITickableTileEntity {
|
public class PressurizerTileEntity extends TileEntity implements INamedContainerProvider, ITickableTileEntity, IPipeConnectable {
|
||||||
|
|
||||||
private final ModifiableEnergyStorage storage = new ModifiableEnergyStorage(64000, 512, 0);
|
private final ModifiableEnergyStorage storage = new ModifiableEnergyStorage(64000, 512, 0);
|
||||||
private int lastEnergy;
|
private int lastEnergy;
|
||||||
|
@ -98,6 +101,8 @@ public class PressurizerTileEntity extends TileEntity implements INamedContainer
|
||||||
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
|
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
|
||||||
if (cap == CapabilityEnergy.ENERGY) {
|
if (cap == CapabilityEnergy.ENERGY) {
|
||||||
return LazyOptional.of(() -> (T) this.storage);
|
return LazyOptional.of(() -> (T) this.storage);
|
||||||
|
} else if (cap == Registry.pipeConnectableCapability) {
|
||||||
|
return LazyOptional.of(() -> (T) this);
|
||||||
} else {
|
} else {
|
||||||
return LazyOptional.empty();
|
return LazyOptional.empty();
|
||||||
}
|
}
|
||||||
|
@ -127,6 +132,11 @@ public class PressurizerTileEntity extends TileEntity implements INamedContainer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConnectionType getConnectionType(BlockPos pipePos, Direction direction) {
|
||||||
|
return ConnectionType.CONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
private static class ModifiableEnergyStorage extends EnergyStorage {
|
private static class ModifiableEnergyStorage extends EnergyStorage {
|
||||||
|
|
||||||
public ModifiableEnergyStorage(int capacity, int maxReceive, int maxExtract) {
|
public ModifiableEnergyStorage(int capacity, int maxReceive, int maxExtract) {
|
||||||
|
|
|
@ -1,16 +1,7 @@
|
||||||
package de.ellpeck.prettypipes.terminal;
|
package de.ellpeck.prettypipes.terminal;
|
||||||
|
|
||||||
import de.ellpeck.prettypipes.Utility;
|
|
||||||
import de.ellpeck.prettypipes.misc.ItemEqualityType;
|
|
||||||
import de.ellpeck.prettypipes.network.PipeItem;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.Direction;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.world.IBlockReader;
|
import net.minecraft.world.IBlockReader;
|
||||||
import net.minecraft.world.World;
|
|
||||||
import net.minecraftforge.items.ItemHandlerHelper;
|
|
||||||
import net.minecraftforge.items.wrapper.CombinedInvWrapper;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
@ -22,34 +13,4 @@ public class CraftingTerminalBlock extends ItemTerminalBlock {
|
||||||
return new CraftingTerminalTileEntity();
|
return new CraftingTerminalTileEntity();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack insertItem(World world, BlockPos pipePos, Direction direction, ItemStack remain, boolean simulate) {
|
|
||||||
BlockPos pos = pipePos.offset(direction);
|
|
||||||
CraftingTerminalTileEntity tile = Utility.getTileEntity(CraftingTerminalTileEntity.class, world, pos);
|
|
||||||
if (tile != null) {
|
|
||||||
remain = remain.copy();
|
|
||||||
int lowestSlot = -1;
|
|
||||||
do {
|
|
||||||
for (int i = 0; i < tile.craftItems.getSlots(); i++) {
|
|
||||||
ItemStack stack = tile.getRequestedCraftItem(i);
|
|
||||||
int count = tile.isGhostItem(i) ? 0 : stack.getCount();
|
|
||||||
if (!ItemHandlerHelper.canItemStacksStackRelaxed(stack, remain))
|
|
||||||
continue;
|
|
||||||
if (lowestSlot < 0 || !tile.isGhostItem(lowestSlot) && count < tile.getRequestedCraftItem(lowestSlot).getCount())
|
|
||||||
lowestSlot = i;
|
|
||||||
}
|
|
||||||
if (lowestSlot >= 0) {
|
|
||||||
ItemStack copy = remain.copy();
|
|
||||||
copy.setCount(1);
|
|
||||||
remain.shrink(1 - tile.craftItems.insertItem(lowestSlot, copy, simulate).getCount());
|
|
||||||
if (remain.isEmpty())
|
|
||||||
return ItemStack.EMPTY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (lowestSlot >= 0);
|
|
||||||
return ItemHandlerHelper.insertItemStacked(tile.items, remain, simulate);
|
|
||||||
}
|
|
||||||
return remain;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import com.google.common.collect.ArrayListMultimap;
|
||||||
import com.google.common.collect.ListMultimap;
|
import com.google.common.collect.ListMultimap;
|
||||||
import de.ellpeck.prettypipes.PrettyPipes;
|
import de.ellpeck.prettypipes.PrettyPipes;
|
||||||
import de.ellpeck.prettypipes.Registry;
|
import de.ellpeck.prettypipes.Registry;
|
||||||
|
import de.ellpeck.prettypipes.Utility;
|
||||||
import de.ellpeck.prettypipes.misc.EquatableItemStack;
|
import de.ellpeck.prettypipes.misc.EquatableItemStack;
|
||||||
import de.ellpeck.prettypipes.misc.ItemEqualityType;
|
import de.ellpeck.prettypipes.misc.ItemEqualityType;
|
||||||
import de.ellpeck.prettypipes.network.NetworkItem;
|
import de.ellpeck.prettypipes.network.NetworkItem;
|
||||||
|
@ -21,6 +22,7 @@ import net.minecraft.entity.player.PlayerInventory;
|
||||||
import net.minecraft.inventory.container.Container;
|
import net.minecraft.inventory.container.Container;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.text.ITextComponent;
|
import net.minecraft.util.text.ITextComponent;
|
||||||
import net.minecraft.util.text.Style;
|
import net.minecraft.util.text.Style;
|
||||||
|
@ -153,6 +155,36 @@ public class CraftingTerminalTileEntity extends ItemTerminalTileEntity {
|
||||||
return new CraftingTerminalContainer(Registry.craftingTerminalContainer, window, player, this.pos);
|
return new CraftingTerminalContainer(Registry.craftingTerminalContainer, window, player, this.pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack insertItem(BlockPos pipePos, Direction direction, ItemStack remain, boolean simulate) {
|
||||||
|
BlockPos pos = pipePos.offset(direction);
|
||||||
|
CraftingTerminalTileEntity tile = Utility.getTileEntity(CraftingTerminalTileEntity.class, this.world, pos);
|
||||||
|
if (tile != null) {
|
||||||
|
remain = remain.copy();
|
||||||
|
int lowestSlot = -1;
|
||||||
|
do {
|
||||||
|
for (int i = 0; i < tile.craftItems.getSlots(); i++) {
|
||||||
|
ItemStack stack = tile.getRequestedCraftItem(i);
|
||||||
|
int count = tile.isGhostItem(i) ? 0 : stack.getCount();
|
||||||
|
if (!ItemHandlerHelper.canItemStacksStackRelaxed(stack, remain))
|
||||||
|
continue;
|
||||||
|
if (lowestSlot < 0 || !tile.isGhostItem(lowestSlot) && count < tile.getRequestedCraftItem(lowestSlot).getCount())
|
||||||
|
lowestSlot = i;
|
||||||
|
}
|
||||||
|
if (lowestSlot >= 0) {
|
||||||
|
ItemStack copy = remain.copy();
|
||||||
|
copy.setCount(1);
|
||||||
|
remain.shrink(1 - tile.craftItems.insertItem(lowestSlot, copy, simulate).getCount());
|
||||||
|
if (remain.isEmpty())
|
||||||
|
return ItemStack.EMPTY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (lowestSlot >= 0);
|
||||||
|
return ItemHandlerHelper.insertItemStacked(tile.items, remain, simulate);
|
||||||
|
}
|
||||||
|
return remain;
|
||||||
|
}
|
||||||
|
|
||||||
public static int getAvailableCrafts(PipeTileEntity tile, int slots, Function<Integer, ItemStack> inputFunction, Predicate<Integer> isGhost, Function<EquatableItemStack, Collection<NetworkLocation>> locationsFunction, Consumer<ItemStack> unavailableConsumer, ItemEqualityType... equalityTypes) {
|
public static int getAvailableCrafts(PipeTileEntity tile, int slots, Function<Integer, ItemStack> inputFunction, Predicate<Integer> isGhost, Function<EquatableItemStack, Collection<NetworkLocation>> locationsFunction, Consumer<ItemStack> unavailableConsumer, ItemEqualityType... equalityTypes) {
|
||||||
PipeNetwork network = PipeNetwork.get(tile.getWorld());
|
PipeNetwork network = PipeNetwork.get(tile.getWorld());
|
||||||
// the highest amount we can craft with the items we have
|
// the highest amount we can craft with the items we have
|
||||||
|
|
|
@ -30,7 +30,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class ItemTerminalBlock extends ContainerBlock implements IPipeConnectable {
|
public class ItemTerminalBlock extends ContainerBlock {
|
||||||
public ItemTerminalBlock() {
|
public ItemTerminalBlock() {
|
||||||
super(Properties.create(Material.ROCK).hardnessAndResistance(3).sound(SoundType.STONE));
|
super(Properties.create(Material.ROCK).hardnessAndResistance(3).sound(SoundType.STONE));
|
||||||
}
|
}
|
||||||
|
@ -63,25 +63,6 @@ public class ItemTerminalBlock extends ContainerBlock implements IPipeConnectabl
|
||||||
return new ItemTerminalTileEntity();
|
return new ItemTerminalTileEntity();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ConnectionType getConnectionType(World world, BlockPos pipePos, Direction direction) {
|
|
||||||
return ConnectionType.CONNECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack insertItem(World world, BlockPos pipePos, Direction direction, ItemStack stack, boolean simulate) {
|
|
||||||
BlockPos pos = pipePos.offset(direction);
|
|
||||||
ItemTerminalTileEntity tile = Utility.getTileEntity(ItemTerminalTileEntity.class, world, pos);
|
|
||||||
if (tile != null)
|
|
||||||
return ItemHandlerHelper.insertItemStacked(tile.items, stack, simulate);
|
|
||||||
return stack;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean allowsModules(World world, BlockPos pipePos, Direction direction) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockRenderType getRenderType(BlockState state) {
|
public BlockRenderType getRenderType(BlockState state) {
|
||||||
return BlockRenderType.MODEL;
|
return BlockRenderType.MODEL;
|
||||||
|
|
|
@ -9,6 +9,8 @@ import de.ellpeck.prettypipes.misc.ItemOrder;
|
||||||
import de.ellpeck.prettypipes.network.*;
|
import de.ellpeck.prettypipes.network.*;
|
||||||
import de.ellpeck.prettypipes.packets.PacketHandler;
|
import de.ellpeck.prettypipes.packets.PacketHandler;
|
||||||
import de.ellpeck.prettypipes.packets.PacketNetworkItems;
|
import de.ellpeck.prettypipes.packets.PacketNetworkItems;
|
||||||
|
import de.ellpeck.prettypipes.pipe.ConnectionType;
|
||||||
|
import de.ellpeck.prettypipes.pipe.IPipeConnectable;
|
||||||
import de.ellpeck.prettypipes.pipe.PipeTileEntity;
|
import de.ellpeck.prettypipes.pipe.PipeTileEntity;
|
||||||
import de.ellpeck.prettypipes.terminal.containers.ItemTerminalContainer;
|
import de.ellpeck.prettypipes.terminal.containers.ItemTerminalContainer;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
|
@ -30,9 +32,12 @@ import net.minecraft.util.text.TextFormatting;
|
||||||
import net.minecraft.util.text.TranslationTextComponent;
|
import net.minecraft.util.text.TranslationTextComponent;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.server.ServerWorld;
|
import net.minecraft.world.server.ServerWorld;
|
||||||
|
import net.minecraftforge.common.capabilities.Capability;
|
||||||
import net.minecraftforge.common.util.Constants;
|
import net.minecraftforge.common.util.Constants;
|
||||||
import net.minecraftforge.common.util.Constants.NBT;
|
import net.minecraftforge.common.util.Constants.NBT;
|
||||||
|
import net.minecraftforge.common.util.LazyOptional;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
import net.minecraftforge.items.ItemHandlerHelper;
|
||||||
import net.minecraftforge.items.ItemStackHandler;
|
import net.minecraftforge.items.ItemStackHandler;
|
||||||
import org.apache.commons.lang3.mutable.MutableInt;
|
import org.apache.commons.lang3.mutable.MutableInt;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
@ -45,7 +50,7 @@ import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class ItemTerminalTileEntity extends TileEntity implements INamedContainerProvider, ITickableTileEntity {
|
public class ItemTerminalTileEntity extends TileEntity implements INamedContainerProvider, ITickableTileEntity, IPipeConnectable {
|
||||||
|
|
||||||
public final ItemStackHandler items = new ItemStackHandler(12) {
|
public final ItemStackHandler items = new ItemStackHandler(12) {
|
||||||
@Override
|
@Override
|
||||||
|
@ -209,6 +214,32 @@ public class ItemTerminalTileEntity extends TileEntity implements INamedContaine
|
||||||
return new ItemTerminalContainer(Registry.itemTerminalContainer, window, player, this.pos);
|
return new ItemTerminalContainer(Registry.itemTerminalContainer, window, player, this.pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
|
||||||
|
if (cap == Registry.pipeConnectableCapability)
|
||||||
|
return LazyOptional.of(() -> (T) this);
|
||||||
|
return LazyOptional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConnectionType getConnectionType(BlockPos pipePos, Direction direction) {
|
||||||
|
return ConnectionType.CONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack insertItem(BlockPos pipePos, Direction direction, ItemStack stack, boolean simulate) {
|
||||||
|
BlockPos pos = pipePos.offset(direction);
|
||||||
|
ItemTerminalTileEntity tile = Utility.getTileEntity(ItemTerminalTileEntity.class, world, pos);
|
||||||
|
if (tile != null)
|
||||||
|
return ItemHandlerHelper.insertItemStacked(tile.items, stack, simulate);
|
||||||
|
return stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean allowsModules(BlockPos pipePos, Direction direction) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public static Pair<List<NetworkLock>, ItemStack> requestItemLater(World world, BlockPos destPipe, Collection<NetworkLocation> locations, Consumer<ItemStack> unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) {
|
public static Pair<List<NetworkLock>, ItemStack> requestItemLater(World world, BlockPos destPipe, Collection<NetworkLocation> locations, Consumer<ItemStack> unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) {
|
||||||
List<NetworkLock> requests = new ArrayList<>();
|
List<NetworkLock> requests = new ArrayList<>();
|
||||||
ItemStack remain = stack.copy();
|
ItemStack remain = stack.copy();
|
||||||
|
|
Loading…
Reference in a new issue