distillery improvements
This commit is contained in:
@@ -1,210 +0,0 @@
|
|||||||
package com.drmangotea.tfmg.content.machines.oil_processing.distillation;
|
|
||||||
|
|
||||||
|
|
||||||
import com.drmangotea.tfmg.registry.TFMGBlockEntities;
|
|
||||||
import com.simibubi.create.AllBlocks;
|
|
||||||
import com.simibubi.create.AllShapes;
|
|
||||||
import com.simibubi.create.Create;
|
|
||||||
import com.simibubi.create.content.equipment.wrench.IWrenchable;
|
|
||||||
import com.simibubi.create.content.fluids.transfer.GenericItemEmptying;
|
|
||||||
import com.simibubi.create.content.fluids.transfer.GenericItemFilling;
|
|
||||||
import com.simibubi.create.content.kinetics.belt.BeltBlockEntity;
|
|
||||||
import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour;
|
|
||||||
import com.simibubi.create.content.logistics.funnel.FunnelBlock;
|
|
||||||
import com.simibubi.create.content.processing.basin.BasinOperatingBlockEntity;
|
|
||||||
import com.simibubi.create.foundation.block.IBE;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
|
|
||||||
import com.simibubi.create.foundation.fluid.FluidHelper;
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.core.Direction;
|
|
||||||
import net.minecraft.sounds.SoundEvents;
|
|
||||||
import net.minecraft.sounds.SoundSource;
|
|
||||||
import net.minecraft.world.InteractionHand;
|
|
||||||
import net.minecraft.world.InteractionResult;
|
|
||||||
import net.minecraft.world.entity.Entity;
|
|
||||||
import net.minecraft.world.entity.item.ItemEntity;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
|
||||||
import net.minecraft.world.item.Items;
|
|
||||||
import net.minecraft.world.level.BlockGetter;
|
|
||||||
import net.minecraft.world.level.Level;
|
|
||||||
import net.minecraft.world.level.LevelReader;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
|
||||||
import net.minecraft.world.level.block.state.StateDefinition;
|
|
||||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
|
||||||
import net.minecraft.world.level.block.state.properties.DirectionProperty;
|
|
||||||
import net.minecraft.world.level.pathfinder.PathComputationType;
|
|
||||||
import net.minecraft.world.phys.BlockHitResult;
|
|
||||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
|
||||||
import net.minecraft.world.phys.shapes.EntityCollisionContext;
|
|
||||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
|
||||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
|
||||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
|
||||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
|
||||||
import net.minecraftforge.items.ItemStackHandler;
|
|
||||||
|
|
||||||
public class DistillationControllerBlock extends Block implements IBE<DistillationControllerBlockEntity>, IWrenchable {
|
|
||||||
|
|
||||||
public static final DirectionProperty FACING = BlockStateProperties.FACING_HOPPER;
|
|
||||||
|
|
||||||
public DistillationControllerBlock(Properties p_i48440_1_) {
|
|
||||||
super(p_i48440_1_);
|
|
||||||
registerDefaultState(defaultBlockState().setValue(FACING, Direction.DOWN));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> p_206840_1_) {
|
|
||||||
super.createBlockStateDefinition(p_206840_1_.add(FACING));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) {
|
|
||||||
BlockEntity tileEntity = world.getBlockEntity(pos.above());
|
|
||||||
if (tileEntity instanceof BasinOperatingBlockEntity)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn,
|
|
||||||
BlockHitResult hit) {
|
|
||||||
ItemStack heldItem = player.getItemInHand(handIn);
|
|
||||||
|
|
||||||
return onBlockEntityUse(worldIn, pos, te -> {
|
|
||||||
if (!heldItem.isEmpty()) {
|
|
||||||
if (FluidHelper.tryEmptyItemIntoBE(worldIn, player, handIn, heldItem, te))
|
|
||||||
return InteractionResult.SUCCESS;
|
|
||||||
if (FluidHelper.tryFillItemFromBE(worldIn, player, handIn, heldItem, te))
|
|
||||||
return InteractionResult.SUCCESS;
|
|
||||||
|
|
||||||
if (GenericItemEmptying.canItemBeEmptied(worldIn, heldItem)
|
|
||||||
|| GenericItemFilling.canItemBeFilled(worldIn, heldItem))
|
|
||||||
return InteractionResult.SUCCESS;
|
|
||||||
if (heldItem.getItem()
|
|
||||||
.equals(Items.SPONGE)
|
|
||||||
&& !te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
|
|
||||||
.map(iFluidHandler -> iFluidHandler.drain(Integer.MAX_VALUE, IFluidHandler.FluidAction.EXECUTE))
|
|
||||||
.orElse(FluidStack.EMPTY)
|
|
||||||
.isEmpty()) {
|
|
||||||
return InteractionResult.SUCCESS;
|
|
||||||
}
|
|
||||||
return InteractionResult.PASS;
|
|
||||||
}
|
|
||||||
|
|
||||||
IItemHandlerModifiable inv = te.itemCapability.orElse(new ItemStackHandler(1));
|
|
||||||
boolean success = false;
|
|
||||||
for (int slot = 0; slot < inv.getSlots(); slot++) {
|
|
||||||
ItemStack stackInSlot = inv.getStackInSlot(slot);
|
|
||||||
if (stackInSlot.isEmpty())
|
|
||||||
continue;
|
|
||||||
player.getInventory()
|
|
||||||
.placeItemBackInInventory(stackInSlot);
|
|
||||||
inv.setStackInSlot(slot, ItemStack.EMPTY);
|
|
||||||
success = true;
|
|
||||||
}
|
|
||||||
if (success)
|
|
||||||
worldIn.playSound(null, pos, SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f,
|
|
||||||
1f + Create.RANDOM.nextFloat());
|
|
||||||
te.onEmptied();
|
|
||||||
return InteractionResult.SUCCESS;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateEntityAfterFallOn(BlockGetter worldIn, Entity entityIn) {
|
|
||||||
super.updateEntityAfterFallOn(worldIn, entityIn);
|
|
||||||
if (!AllBlocks.BASIN.has(worldIn.getBlockState(entityIn.blockPosition())))
|
|
||||||
return;
|
|
||||||
if (!(entityIn instanceof ItemEntity))
|
|
||||||
return;
|
|
||||||
if (!entityIn.isAlive())
|
|
||||||
return;
|
|
||||||
ItemEntity itemEntity = (ItemEntity) entityIn;
|
|
||||||
withBlockEntityDo(worldIn, entityIn.blockPosition(), te -> {
|
|
||||||
|
|
||||||
// Tossed items bypass the quarter-stack limit
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getInteractionShape(BlockState p_199600_1_, BlockGetter p_199600_2_, BlockPos p_199600_3_) {
|
|
||||||
return AllShapes.BASIN_RAYTRACE_SHAPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) {
|
|
||||||
return AllShapes.BASIN_BLOCK_SHAPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getCollisionShape(BlockState state, BlockGetter reader, BlockPos pos, CollisionContext ctx) {
|
|
||||||
if (ctx instanceof EntityCollisionContext && ((EntityCollisionContext) ctx).getEntity() instanceof ItemEntity)
|
|
||||||
return AllShapes.BASIN_COLLISION_SHAPE;
|
|
||||||
return getShape(state, reader, pos, ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
|
||||||
IBE.onRemove(state, worldIn, pos, newState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasAnalogOutputSignal(BlockState state) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<DistillationControllerBlockEntity> getBlockEntityClass() {
|
|
||||||
return DistillationControllerBlockEntity.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BlockEntityType<? extends DistillationControllerBlockEntity> getBlockEntityType() {
|
|
||||||
return TFMGBlockEntities.CAST_IRON_DISTILLATION_CONTROLLER.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean canOutputTo(BlockGetter world, BlockPos basinPos, Direction direction) {
|
|
||||||
BlockPos neighbour = basinPos.relative(direction);
|
|
||||||
BlockPos output = neighbour.below();
|
|
||||||
BlockState blockState = world.getBlockState(neighbour);
|
|
||||||
|
|
||||||
if (FunnelBlock.isFunnel(blockState)) {
|
|
||||||
if (FunnelBlock.getFunnelFacing(blockState) == direction)
|
|
||||||
return false;
|
|
||||||
} else if (!blockState.getCollisionShape(world, neighbour)
|
|
||||||
.isEmpty()) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
BlockEntity tileEntity = world.getBlockEntity(output);
|
|
||||||
if (tileEntity instanceof BeltBlockEntity) {
|
|
||||||
BeltBlockEntity belt = (BeltBlockEntity) tileEntity;
|
|
||||||
return belt.getSpeed() == 0 || belt.getMovementFacing() != direction.getOpposite();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DirectBeltInputBehaviour directBeltInputBehaviour =
|
|
||||||
BlockEntityBehaviour.get(world, output, DirectBeltInputBehaviour.TYPE);
|
|
||||||
if (directBeltInputBehaviour != null)
|
|
||||||
return directBeltInputBehaviour.canInsertFromSide(direction);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
package com.drmangotea.tfmg.content.machines.oil_processing.distillation;
|
|
||||||
|
|
||||||
|
|
||||||
import com.drmangotea.tfmg.registry.TFMGBlockEntities;
|
|
||||||
import com.simibubi.create.AllBlocks;
|
|
||||||
import com.simibubi.create.AllShapes;
|
|
||||||
import com.simibubi.create.foundation.block.IBE;
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.core.Direction;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import net.minecraft.world.level.BlockGetter;
|
|
||||||
import net.minecraft.world.level.LevelReader;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
|
||||||
import net.minecraft.world.level.pathfinder.PathComputationType;
|
|
||||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
|
||||||
import net.minecraft.world.phys.shapes.EntityCollisionContext;
|
|
||||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
|
||||||
|
|
||||||
public class DistillationOutputBlock extends Block implements IBE<DistillationOutputBlockEntity> {
|
|
||||||
|
|
||||||
public DistillationOutputBlock(Properties properties) {
|
|
||||||
super(properties);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canSurvive(BlockState state, LevelReader worldIn, BlockPos pos) {
|
|
||||||
return !AllBlocks.BASIN.has(worldIn.getBlockState(pos.below()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) {
|
|
||||||
if (context instanceof EntityCollisionContext
|
|
||||||
&& ((EntityCollisionContext) context).getEntity() instanceof Player)
|
|
||||||
return AllShapes.CASING_14PX.get(Direction.DOWN);
|
|
||||||
|
|
||||||
return AllShapes.MECHANICAL_PROCESSOR_SHAPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<DistillationOutputBlockEntity> getBlockEntityClass() {
|
|
||||||
return DistillationOutputBlockEntity.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BlockEntityType<? extends DistillationOutputBlockEntity> getBlockEntityType() {
|
|
||||||
return TFMGBlockEntities.CAST_IRON_DISTILLATION_OUTPUT.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,427 +0,0 @@
|
|||||||
package com.drmangotea.tfmg.content.machines.oil_processing.distillation;
|
|
||||||
|
|
||||||
|
|
||||||
import com.drmangotea.tfmg.CreateTFMG;
|
|
||||||
import com.drmangotea.tfmg.recipes.distillation.DistillationRecipe;
|
|
||||||
import com.drmangotea.tfmg.recipes.distillation.ItemlessRecipe;
|
|
||||||
import com.drmangotea.tfmg.registry.TFMGFluids;
|
|
||||||
import com.drmangotea.tfmg.registry.TFMGRecipeTypes;
|
|
||||||
import com.simibubi.create.AllRecipeTypes;
|
|
||||||
import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation;
|
|
||||||
import com.simibubi.create.content.kinetics.press.MechanicalPressBlockEntity;
|
|
||||||
import com.simibubi.create.content.processing.burner.BlazeBurnerBlock;
|
|
||||||
import com.simibubi.create.content.processing.burner.BlazeBurnerBlockEntity;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
|
|
||||||
import com.simibubi.create.foundation.fluid.SmartFluidTank;
|
|
||||||
import com.simibubi.create.foundation.recipe.RecipeFinder;
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.core.Direction;
|
|
||||||
import net.minecraft.nbt.CompoundTag;
|
|
||||||
import net.minecraft.nbt.NbtUtils;
|
|
||||||
import net.minecraft.network.chat.Component;
|
|
||||||
import net.minecraft.world.Container;
|
|
||||||
import net.minecraft.world.item.crafting.CraftingRecipe;
|
|
||||||
import net.minecraft.world.item.crafting.Recipe;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
|
||||||
import net.minecraft.world.level.material.Fluid;
|
|
||||||
import net.minecraft.world.level.material.Fluids;
|
|
||||||
import net.minecraft.world.phys.AABB;
|
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
|
||||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
||||||
import net.minecraftforge.common.capabilities.Capability;
|
|
||||||
import net.minecraftforge.common.crafting.IShapedRecipe;
|
|
||||||
import net.minecraftforge.common.util.LazyOptional;
|
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
|
||||||
import net.minecraftforge.fluids.IFluidTank;
|
|
||||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
|
||||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
|
||||||
import net.minecraftforge.fluids.capability.templates.FluidTank;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class DistillationOutputBlockEntity extends FluidProcessingBlockEntity implements IHaveGoggleInformation {
|
|
||||||
|
|
||||||
protected LazyOptional<IFluidHandler> fluidCapability;
|
|
||||||
public FluidTank tankInventory;
|
|
||||||
protected BlockPos lastKnownPos;
|
|
||||||
|
|
||||||
private static final int SYNC_RATE = 8;
|
|
||||||
protected int syncCooldown;
|
|
||||||
protected boolean queuedSync;
|
|
||||||
|
|
||||||
|
|
||||||
private static final Object DistillationRecipesKey = new Object();
|
|
||||||
|
|
||||||
public boolean running;
|
|
||||||
|
|
||||||
public DistillationOutputBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
|
||||||
super(type, pos, state);
|
|
||||||
tankInventory = createInventory();
|
|
||||||
fluidCapability = LazyOptional.of(() -> tankInventory);
|
|
||||||
refreshCapability();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected <C extends Container> boolean matchItemlessRecipe(Recipe<C> recipe) {
|
|
||||||
if (recipe == null)
|
|
||||||
return false;
|
|
||||||
Optional<DistillationControllerBlockEntity> controller = getController();
|
|
||||||
if (!controller.isPresent())
|
|
||||||
return false;
|
|
||||||
return DistillationRecipe.match(controller.get(), recipe);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean updateController() {
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (level == null || level.isClientSide)
|
|
||||||
return true;
|
|
||||||
Optional<DistillationControllerBlockEntity> basin = getController();
|
|
||||||
|
|
||||||
|
|
||||||
List<Recipe<?>> recipes = getMatchingRecipes();
|
|
||||||
if (recipes.isEmpty())
|
|
||||||
return true;
|
|
||||||
currentRecipe = recipes.get(0);
|
|
||||||
startProcessing();
|
|
||||||
sendData();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
|
|
||||||
super.addBehaviours(behaviours);
|
|
||||||
// registerAwardables(behaviours, AllAdvancements.MIXER);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected AABB createRenderBoundingBox() {
|
|
||||||
return new AABB(worldPosition).expandTowards(0, -1.5, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void read(CompoundTag compound, boolean clientPacket) {
|
|
||||||
running = compound.getBoolean("Running");
|
|
||||||
|
|
||||||
super.read(compound, clientPacket);
|
|
||||||
lastKnownPos = null;
|
|
||||||
|
|
||||||
if (compound.contains("LastKnownPos"))
|
|
||||||
lastKnownPos = NbtUtils.readBlockPos(compound.getCompound("LastKnownPos"));
|
|
||||||
|
|
||||||
|
|
||||||
tankInventory.setCapacity(8000);
|
|
||||||
tankInventory.readFromNBT(compound.getCompound("TankContent"));
|
|
||||||
if (tankInventory.getSpace() < 0)
|
|
||||||
tankInventory.drain(-tankInventory.getSpace(), IFluidHandler.FluidAction.EXECUTE);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void write(CompoundTag compound, boolean clientPacket) {
|
|
||||||
compound.putBoolean("Running", running);
|
|
||||||
if (lastKnownPos != null)
|
|
||||||
compound.put("LastKnownPos", NbtUtils.writeBlockPos(lastKnownPos));
|
|
||||||
|
|
||||||
compound.put("TankContent", tankInventory.writeToNBT(new CompoundTag()));
|
|
||||||
|
|
||||||
super.write(compound, clientPacket);
|
|
||||||
super.write(compound, clientPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void tick() {
|
|
||||||
super.tick();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (level != null) {
|
|
||||||
if ((!level.isClientSide || isVirtual())) {
|
|
||||||
process();
|
|
||||||
sendData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (syncCooldown > 0) {
|
|
||||||
syncCooldown--;
|
|
||||||
if (syncCooldown == 0 && queuedSync)
|
|
||||||
sendData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void process() {
|
|
||||||
updateController();
|
|
||||||
|
|
||||||
if (currentRecipe == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// if((currentRecipe instanceof ShapelessRecipe))
|
|
||||||
// return;
|
|
||||||
|
|
||||||
BlockEntity above1 = level.getBlockEntity(this.getBlockPos().above(1));
|
|
||||||
BlockEntity above2 = level.getBlockEntity(this.getBlockPos().above(2));
|
|
||||||
BlockEntity burner = level.getBlockEntity(this.getBlockPos().below(2));
|
|
||||||
if(!(burner instanceof BlazeBurnerBlockEntity))
|
|
||||||
return;
|
|
||||||
if(((BlazeBurnerBlockEntity) burner).getHeatLevelFromBlock()== BlazeBurnerBlock.HeatLevel.NONE)
|
|
||||||
return;
|
|
||||||
if(((BlazeBurnerBlockEntity) burner).getHeatLevelFromBlock()== BlazeBurnerBlock.HeatLevel.SMOULDERING)
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
if(above1 !=null&& above2 !=null
|
|
||||||
// &&
|
|
||||||
/// tankInventory.getFluidAmount()+
|
|
||||||
/// ((DistillationRecipe)currentRecipe)
|
|
||||||
/// .getFirstFluidResult()
|
|
||||||
/// .getAmount()
|
|
||||||
/// <8000&&
|
|
||||||
// ((DistillationOutputBlockEntity) above1).tankInventory.getFluidAmount()+((DistillationRecipe)currentRecipe).getFluidResults().get(1).getAmount()<((DistillationOutputBlockEntity) above2).tankInventory.getCapacity()&&
|
|
||||||
// ((DistillationOutputBlockEntity) above2).tankInventory.getFluidAmount()+((DistillationRecipe)currentRecipe).getFluidResults().get(2).getAmount()<((DistillationOutputBlockEntity) above2).tankInventory.getCapacity()
|
|
||||||
){
|
|
||||||
Optional<DistillationControllerBlockEntity> optionalController = getController();
|
|
||||||
if (!optionalController.isPresent())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(!(above1 instanceof DistillationOutputBlockEntity)&&
|
|
||||||
!( above2 instanceof DistillationOutputBlockEntity)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CreateTFMG.LOGGER.debug("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEe");
|
|
||||||
|
|
||||||
FluidStack fluidInRecipe1 = ((DistillationRecipe) currentRecipe).getFirstFluidResult();
|
|
||||||
FluidStack fluidInRecipe2 = ((DistillationRecipe) currentRecipe).getSecondFluidResult();
|
|
||||||
FluidStack fluidInRecipe3 = ((DistillationRecipe) currentRecipe).getThirdFluidResult();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (fluidInRecipe1.getFluid() != this.tankInventory.getFluid().getFluid()
|
|
||||||
&& tankInventory.getFluidAmount()!=0
|
|
||||||
)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (fluidInRecipe3.getFluid() != (((DistillationOutputBlockEntity) above1).tankInventory.getFluid().getFluid())
|
|
||||||
&&((DistillationOutputBlockEntity) above1).tankInventory.getFluidAmount()!=0
|
|
||||||
)
|
|
||||||
return;
|
|
||||||
if (fluidInRecipe3.getFluid() != (((DistillationOutputBlockEntity) above2).tankInventory.getFluid().getFluid())
|
|
||||||
&&((DistillationOutputBlockEntity) above2).tankInventory.getFluidAmount()!=0
|
|
||||||
)
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(getController().get().getTanks().get(true).getPrimaryHandler().getFluid().getFluid() != ((DistillationRecipe) currentRecipe).getInputFluid().getMatchingFluidStacks().get(0).getFluid())
|
|
||||||
return;
|
|
||||||
|
|
||||||
DistillationControllerBlockEntity controller = optionalController.get();
|
|
||||||
IFluidHandler availableFluids = controller.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
|
|
||||||
.orElse(null);
|
|
||||||
|
|
||||||
if(controller.outputInventory.getStackInSlot(0).getCount()>=1||
|
|
||||||
controller.outputInventory.getStackInSlot(1).getCount()>=1||
|
|
||||||
controller.outputInventory.getStackInSlot(2).getCount()>=1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!controller.getTanks().get(true).isEmpty()) {
|
|
||||||
if(!level.isClientSide) {
|
|
||||||
// if(((DistillationRecipe)currentRecipe).getInputFluid().getMatchingFluidStacks().get(0).getFluid() != TFMGFluids.HEAVY_OIL.get())
|
|
||||||
// return;
|
|
||||||
|
|
||||||
controller.getTanks().get(true).getPrimaryHandler().drain(((DistillationRecipe) currentRecipe).getFluidIngredients().get(0).getRequiredAmount(), IFluidHandler.FluidAction.EXECUTE);
|
|
||||||
|
|
||||||
if (!(((DistillationRecipe) currentRecipe).getFluidResults().get(0).isEmpty()))
|
|
||||||
tankInventory.setFluid(new FluidStack(((DistillationRecipe) currentRecipe).getFluidResults().get(0).getFluid(), ((DistillationRecipe) currentRecipe).getFluidResults().get(0).getAmount() + this.tankInventory.getFluidAmount()));
|
|
||||||
if (!(((DistillationRecipe) currentRecipe).getFluidResults().get(1).isEmpty()))
|
|
||||||
((DistillationOutputBlockEntity) above1).tankInventory.setFluid(new FluidStack(((DistillationRecipe) currentRecipe).getFluidResults().get(1).getFluid(), ((DistillationRecipe) currentRecipe).getFluidResults().get(1).getAmount() + ((DistillationOutputBlockEntity) above1).tankInventory.getFluidAmount()));
|
|
||||||
if (!(((DistillationRecipe) currentRecipe).getFluidResults().get(2).isEmpty()))
|
|
||||||
((DistillationOutputBlockEntity) above2).tankInventory.setFluid(new FluidStack(((DistillationRecipe) currentRecipe).getFluidResults().get(2).getFluid(), ((DistillationRecipe) currentRecipe).getFluidResults().get(2).getAmount() + ((DistillationOutputBlockEntity) above2).tankInventory.getFluidAmount()));
|
|
||||||
|
|
||||||
|
|
||||||
if (!(((DistillationRecipe) currentRecipe).getFirstItemResult().isEmpty()))
|
|
||||||
controller.outputInventory.setItem(0, ((DistillationRecipe) currentRecipe).getFirstItemResult());
|
|
||||||
|
|
||||||
if (!(((DistillationRecipe) currentRecipe).getSecondItemResult().isEmpty()))
|
|
||||||
controller.outputInventory.setItem(1, ((DistillationRecipe) currentRecipe).getSecondItemResult());
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
if(!(((DistillationRecipe) currentRecipe).getThirdItemResult().isEmpty()))
|
|
||||||
controller.outputInventory.setItem(2,((DistillationRecipe) currentRecipe).getFirstItemResult());
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
controller.notifyChangeOfContents();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected List<Recipe<?>> getMatchingRecipes() {
|
|
||||||
|
|
||||||
|
|
||||||
List<Recipe<?>> list = RecipeFinder.get(getRecipeCacheKey(), level, this::matchStaticFilters);
|
|
||||||
return list.stream()
|
|
||||||
.filter(this::matchItemlessRecipe)
|
|
||||||
.sorted((r1, r2) -> r2.getIngredients()
|
|
||||||
.size()
|
|
||||||
- r1.getIngredients()
|
|
||||||
.size())
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected <C extends Container> boolean matchStaticFilters(Recipe<C> r) {
|
|
||||||
return ((r instanceof CraftingRecipe && !(r instanceof IShapedRecipe<?>)
|
|
||||||
&& r.getIngredients()
|
|
||||||
.size() > 1
|
|
||||||
&& !MechanicalPressBlockEntity.canCompress(r)) && !AllRecipeTypes.shouldIgnoreInAutomation(r)
|
|
||||||
|| r.getType() == TFMGRecipeTypes.DISTILLATION.getType());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void startProcessing() {
|
|
||||||
if (running )
|
|
||||||
return;
|
|
||||||
super.startProcessing();
|
|
||||||
running = true;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean continueWithPreviousRecipe() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onBasinRemoved() {
|
|
||||||
if (!running)
|
|
||||||
return;
|
|
||||||
|
|
||||||
running = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Object getRecipeCacheKey() {
|
|
||||||
return DistillationRecipesKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isRunning() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
@Override
|
|
||||||
protected Optional<CreateAdvancement> getProcessedRecipeTrigger() {
|
|
||||||
return Optional.of(AllAdvancements.MIXER);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
public void tickAudio() {
|
|
||||||
super.tickAudio();
|
|
||||||
|
|
||||||
// SoundEvents.BLOCK_STONE_BREAK
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected SmartFluidTank createInventory() {
|
|
||||||
return new SmartFluidTank(8000, this::onFluidStackChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected void onFluidStackChanged(FluidStack newFluidStack) {
|
|
||||||
if (!hasLevel())
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void sendDataImmediately() {
|
|
||||||
syncCooldown = 0;
|
|
||||||
queuedSync = false;
|
|
||||||
sendData();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void sendData() {
|
|
||||||
if (syncCooldown > 0) {
|
|
||||||
queuedSync = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
super.sendData();
|
|
||||||
queuedSync = false;
|
|
||||||
syncCooldown = SYNC_RATE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void refreshCapability() {
|
|
||||||
LazyOptional<IFluidHandler> oldCap = fluidCapability;
|
|
||||||
fluidCapability = LazyOptional.of(() -> handlerForCapability());
|
|
||||||
oldCap.invalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
private IFluidHandler handlerForCapability() {
|
|
||||||
|
|
||||||
return tankInventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public boolean addToGoggleTooltip(List<Component> tooltip, boolean isPlayerSneaking) {
|
|
||||||
|
|
||||||
return containedFluidTooltip(tooltip, isPlayerSneaking,
|
|
||||||
this.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
|
|
||||||
if (!fluidCapability.isPresent())
|
|
||||||
refreshCapability();
|
|
||||||
if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
|
|
||||||
return fluidCapability.cast();
|
|
||||||
return super.getCapability(cap, side);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public IFluidTank getTankInventory() {
|
|
||||||
return tankInventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public FluidStack getFluid(int tank) {
|
|
||||||
return tankInventory.getFluid()
|
|
||||||
.copy();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery;
|
||||||
|
|
||||||
|
|
||||||
|
import com.drmangotea.tfmg.registry.TFMGBlockEntities;
|
||||||
|
import com.simibubi.create.AllBlocks;
|
||||||
|
import com.simibubi.create.Create;
|
||||||
|
import com.simibubi.create.content.equipment.wrench.IWrenchable;
|
||||||
|
import com.simibubi.create.content.fluids.transfer.GenericItemEmptying;
|
||||||
|
import com.simibubi.create.content.fluids.transfer.GenericItemFilling;
|
||||||
|
import com.simibubi.create.content.kinetics.belt.BeltBlockEntity;
|
||||||
|
import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour;
|
||||||
|
import com.simibubi.create.content.logistics.funnel.FunnelBlock;
|
||||||
|
import com.simibubi.create.content.processing.basin.BasinOperatingBlockEntity;
|
||||||
|
import com.simibubi.create.foundation.block.IBE;
|
||||||
|
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
|
||||||
|
import com.simibubi.create.foundation.fluid.FluidHelper;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.Direction;
|
||||||
|
import net.minecraft.sounds.SoundEvents;
|
||||||
|
import net.minecraft.sounds.SoundSource;
|
||||||
|
import net.minecraft.world.InteractionHand;
|
||||||
|
import net.minecraft.world.InteractionResult;
|
||||||
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.entity.item.ItemEntity;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraft.world.item.Items;
|
||||||
|
import net.minecraft.world.level.BlockGetter;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.LevelReader;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
|
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.block.state.StateDefinition;
|
||||||
|
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
||||||
|
import net.minecraft.world.level.block.state.properties.DirectionProperty;
|
||||||
|
import net.minecraft.world.level.pathfinder.PathComputationType;
|
||||||
|
import net.minecraft.world.phys.BlockHitResult;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
|
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||||
|
import net.minecraftforge.items.ItemStackHandler;
|
||||||
|
|
||||||
|
public class DistilleryControllerBlock extends Block implements IBE<DistilleryControllerBlockEntity>, IWrenchable {
|
||||||
|
|
||||||
|
|
||||||
|
public DistilleryControllerBlock(Properties p_i48440_1_) {
|
||||||
|
super(p_i48440_1_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
||||||
|
IBE.onRemove(state, worldIn, pos, newState);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<DistilleryControllerBlockEntity> getBlockEntityClass() {
|
||||||
|
return DistilleryControllerBlockEntity.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockEntityType<? extends DistilleryControllerBlockEntity> getBlockEntityType() {
|
||||||
|
return TFMGBlockEntities.CAST_IRON_DISTILLATION_CONTROLLER.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,14 +1,12 @@
|
|||||||
package com.drmangotea.tfmg.content.machines.oil_processing.distillation;
|
package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.drmangotea.tfmg.content.machines.oil_processing.distillation.FluidProcessingBlockEntity;
|
||||||
import com.simibubi.create.AllTags;
|
import com.simibubi.create.AllTags;
|
||||||
import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation;
|
import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation;
|
||||||
import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour;
|
import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour;
|
||||||
import com.simibubi.create.content.processing.burner.BlazeBurnerBlock;
|
import com.simibubi.create.content.processing.burner.BlazeBurnerBlock;
|
||||||
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
|
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
|
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTankBehaviour;
|
import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTankBehaviour;
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour;
|
import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour;
|
||||||
import com.simibubi.create.foundation.fluid.CombinedTankWrapper;
|
import com.simibubi.create.foundation.fluid.CombinedTankWrapper;
|
||||||
@@ -22,11 +20,9 @@ import net.minecraft.nbt.StringTag;
|
|||||||
import net.minecraft.nbt.Tag;
|
import net.minecraft.nbt.Tag;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.level.block.Block;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.phys.Vec3;
|
|
||||||
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.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
@@ -41,7 +37,7 @@ import net.minecraftforge.items.wrapper.CombinedInvWrapper;
|
|||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class DistillationControllerBlockEntity extends SmartBlockEntity implements IHaveGoggleInformation {
|
public class DistilleryControllerBlockEntity extends SmartBlockEntity implements IHaveGoggleInformation {
|
||||||
|
|
||||||
public SmartFluidTankBehaviour inputTank;
|
public SmartFluidTankBehaviour inputTank;
|
||||||
protected SmartInventory outputInventory;
|
protected SmartInventory outputInventory;
|
||||||
@@ -49,17 +45,14 @@ public class DistillationControllerBlockEntity extends SmartBlockEntity implemen
|
|||||||
|
|
||||||
private boolean contentsChanged;
|
private boolean contentsChanged;
|
||||||
|
|
||||||
|
|
||||||
private Couple<SmartFluidTankBehaviour> tanks;
|
private Couple<SmartFluidTankBehaviour> tanks;
|
||||||
|
|
||||||
public LazyOptional<IItemHandlerModifiable> itemCapability;
|
public LazyOptional<IItemHandlerModifiable> itemCapability;
|
||||||
protected LazyOptional<IFluidHandler> fluidCapability;
|
protected LazyOptional<IFluidHandler> fluidCapability;
|
||||||
|
|
||||||
|
|
||||||
int recipeBackupCheck;
|
int recipeBackupCheck;
|
||||||
|
|
||||||
|
public DistilleryControllerBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
||||||
public DistillationControllerBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
|
||||||
super(type, pos, state);
|
super(type, pos, state);
|
||||||
|
|
||||||
outputInventory = new SmartInventory(9, this).forbidInsertion()
|
outputInventory = new SmartInventory(9, this).forbidInsertion()
|
||||||
@@ -68,7 +61,9 @@ public class DistillationControllerBlockEntity extends SmartBlockEntity implemen
|
|||||||
itemCapability = LazyOptional.of(() -> new CombinedInvWrapper( outputInventory));
|
itemCapability = LazyOptional.of(() -> new CombinedInvWrapper( outputInventory));
|
||||||
contentsChanged = true;
|
contentsChanged = true;
|
||||||
|
|
||||||
|
|
||||||
tanks = Couple.create(inputTank, outputTank);
|
tanks = Couple.create(inputTank, outputTank);
|
||||||
|
|
||||||
recipeBackupCheck = 20;
|
recipeBackupCheck = 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,8 +71,6 @@ public class DistillationControllerBlockEntity extends SmartBlockEntity implemen
|
|||||||
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
|
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
|
||||||
behaviours.add(new DirectBeltInputBehaviour(this));
|
behaviours.add(new DirectBeltInputBehaviour(this));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inputTank = new SmartFluidTankBehaviour(SmartFluidTankBehaviour.INPUT, this, 2, 1000, true)
|
inputTank = new SmartFluidTankBehaviour(SmartFluidTankBehaviour.INPUT, this, 2, 1000, true)
|
||||||
.whenFluidUpdates(() -> contentsChanged = true);
|
.whenFluidUpdates(() -> contentsChanged = true);
|
||||||
outputTank = new SmartFluidTankBehaviour(SmartFluidTankBehaviour.OUTPUT, this, 2, 1000, true)
|
outputTank = new SmartFluidTankBehaviour(SmartFluidTankBehaviour.OUTPUT, this, 2, 1000, true)
|
||||||
@@ -99,7 +92,6 @@ public class DistillationControllerBlockEntity extends SmartBlockEntity implemen
|
|||||||
|
|
||||||
outputInventory.deserializeNBT(compound.getCompound("OutputItems"));
|
outputInventory.deserializeNBT(compound.getCompound("OutputItems"));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -162,10 +154,6 @@ public class DistillationControllerBlockEntity extends SmartBlockEntity implemen
|
|||||||
recipeBackupCheck = 20;
|
recipeBackupCheck = 20;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -174,7 +162,6 @@ public class DistillationControllerBlockEntity extends SmartBlockEntity implemen
|
|||||||
super.tick();
|
super.tick();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!contentsChanged)
|
if (!contentsChanged)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -185,16 +172,16 @@ public class DistillationControllerBlockEntity extends SmartBlockEntity implemen
|
|||||||
BlockPos toUpdate = worldPosition.above()
|
BlockPos toUpdate = worldPosition.above()
|
||||||
.relative(offset);
|
.relative(offset);
|
||||||
BlockState stateToUpdate = level.getBlockState(toUpdate);
|
BlockState stateToUpdate = level.getBlockState(toUpdate);
|
||||||
if (stateToUpdate.getBlock() instanceof DistillationControllerBlock
|
if (stateToUpdate.getBlock() instanceof DistilleryControllerBlock) {
|
||||||
&& stateToUpdate.getValue(DistillationControllerBlock.FACING) == offset.getOpposite()) {
|
BlockEntity be = level.getBlockEntity(toUpdate);
|
||||||
BlockEntity te = level.getBlockEntity(toUpdate);
|
if (be instanceof DistilleryControllerBlockEntity)
|
||||||
if (te instanceof DistillationControllerBlockEntity)
|
((DistilleryControllerBlockEntity) be).contentsChanged = true;
|
||||||
((DistillationControllerBlockEntity) te).contentsChanged = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private Optional<FluidProcessingBlockEntity> getOperator() {
|
private Optional<FluidProcessingBlockEntity> getOperator() {
|
||||||
if (level == null)
|
if (level == null)
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
@@ -217,106 +204,6 @@ public class DistillationControllerBlockEntity extends SmartBlockEntity implemen
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public boolean acceptOutputs(List<ItemStack> outputItems, List<FluidStack> outputFluids, boolean simulate) {
|
|
||||||
outputInventory.allowInsertion();
|
|
||||||
outputTank.allowInsertion();
|
|
||||||
boolean acceptOutputsInner = acceptOutputsInner(outputItems, outputFluids, simulate);
|
|
||||||
outputInventory.forbidInsertion();
|
|
||||||
outputTank.forbidInsertion();
|
|
||||||
return acceptOutputsInner;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean acceptOutputsInner(List<ItemStack> outputItems, List<FluidStack> outputFluids, boolean simulate) {
|
|
||||||
BlockState blockState = getBlockState();
|
|
||||||
if (!(blockState.getBlock() instanceof DistillationControllerBlock))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
Direction direction = blockState.getValue(DistillationControllerBlock.FACING);
|
|
||||||
if (direction != Direction.DOWN) {
|
|
||||||
|
|
||||||
BlockEntity te = level.getBlockEntity(worldPosition.below()
|
|
||||||
.relative(direction));
|
|
||||||
|
|
||||||
InvManipulationBehaviour inserter =
|
|
||||||
te == null ? null : BlockEntityBehaviour.get(level, te.getBlockPos(), InvManipulationBehaviour.TYPE);
|
|
||||||
IItemHandler targetInv = te == null ? null
|
|
||||||
: te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction.getOpposite())
|
|
||||||
.orElse(inserter == null ? null : inserter.getInventory());
|
|
||||||
IFluidHandler targetTank = te == null ? null
|
|
||||||
: te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, direction.getOpposite())
|
|
||||||
.orElse(null);
|
|
||||||
boolean externalTankNotPresent = targetTank == null;
|
|
||||||
|
|
||||||
if (!outputItems.isEmpty() && targetInv == null)
|
|
||||||
return false;
|
|
||||||
if (!outputFluids.isEmpty() && externalTankNotPresent) {
|
|
||||||
// Special case - fluid outputs but output only accepts items
|
|
||||||
targetTank = outputTank.getCapability()
|
|
||||||
.orElse(null);
|
|
||||||
if (targetTank == null)
|
|
||||||
return false;
|
|
||||||
if (!acceptFluidOutputsIntoBasin(outputFluids, simulate, targetTank))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (simulate)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (!externalTankNotPresent)
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
IItemHandler targetInv = outputInventory;
|
|
||||||
IFluidHandler targetTank = outputTank.getCapability()
|
|
||||||
.orElse(null);
|
|
||||||
|
|
||||||
if (targetInv == null && !outputItems.isEmpty())
|
|
||||||
return false;
|
|
||||||
if (!acceptItemOutputsIntoBasin(outputItems, simulate, targetInv))
|
|
||||||
return false;
|
|
||||||
if (outputFluids.isEmpty())
|
|
||||||
return true;
|
|
||||||
if (targetTank == null)
|
|
||||||
return false;
|
|
||||||
if (!acceptFluidOutputsIntoBasin(outputFluids, simulate, targetTank))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean acceptFluidOutputsIntoBasin(List<FluidStack> outputFluids, boolean simulate,
|
|
||||||
IFluidHandler targetTank) {
|
|
||||||
for (FluidStack fluidStack : outputFluids) {
|
|
||||||
IFluidHandler.FluidAction action = simulate ? IFluidHandler.FluidAction.SIMULATE : IFluidHandler.FluidAction.EXECUTE;
|
|
||||||
int fill = targetTank instanceof SmartFluidTankBehaviour.InternalFluidHandler
|
|
||||||
? ((SmartFluidTankBehaviour.InternalFluidHandler) targetTank).forceFill(fluidStack.copy(), action)
|
|
||||||
: targetTank.fill(fluidStack.copy(), action);
|
|
||||||
if (fill != fluidStack.getAmount())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean acceptItemOutputsIntoBasin(List<ItemStack> outputItems, boolean simulate, IItemHandler targetInv) {
|
|
||||||
for (ItemStack itemStack : outputItems) {
|
|
||||||
// Catalyst items are never consumed
|
|
||||||
if (itemStack.hasCraftingRemainingItem() && itemStack.getCraftingRemainingItem()
|
|
||||||
.sameItem(itemStack))
|
|
||||||
continue;
|
|
||||||
if (!ItemHandlerHelper.insertItemStacked(targetInv, itemStack.copy(), simulate)
|
|
||||||
.isEmpty())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void readOnlyItems(CompoundTag compound) {
|
|
||||||
|
|
||||||
outputInventory.deserializeNBT(compound.getCompound("OutputItems"));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BlazeBurnerBlock.HeatLevel getHeatLevelOf(BlockState state) {
|
public static BlazeBurnerBlock.HeatLevel getHeatLevelOf(BlockState state) {
|
||||||
if (state.hasProperty(BlazeBurnerBlock.HEAT_LEVEL))
|
if (state.hasProperty(BlazeBurnerBlock.HEAT_LEVEL))
|
||||||
return state.getValue(BlazeBurnerBlock.HEAT_LEVEL);
|
return state.getValue(BlazeBurnerBlock.HEAT_LEVEL);
|
||||||
@@ -328,31 +215,11 @@ public class DistillationControllerBlockEntity extends SmartBlockEntity implemen
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// client things
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean addToGoggleTooltip(List<Component> tooltip, boolean isPlayerSneaking) {
|
public boolean addToGoggleTooltip(List<Component> tooltip, boolean isPlayerSneaking) {
|
||||||
return containedFluidTooltip(tooltip, isPlayerSneaking,
|
return containedFluidTooltip(tooltip, isPlayerSneaking,
|
||||||
getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY));
|
getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY));
|
||||||
}
|
}
|
||||||
|
|
||||||
class BasinValueBox extends ValueBoxTransform.Sided {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Vec3 getSouthLocation() {
|
|
||||||
return VecHelper.voxelSpace(8, 12, 15.75);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isSideActive(BlockState state, Direction direction) {
|
|
||||||
return direction.getAxis()
|
|
||||||
.isHorizontal();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery;
|
||||||
|
|
||||||
|
|
||||||
|
import com.drmangotea.tfmg.registry.TFMGBlockEntities;
|
||||||
|
import com.simibubi.create.AllBlocks;
|
||||||
|
import com.simibubi.create.foundation.block.IBE;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.world.level.BlockGetter;
|
||||||
|
import net.minecraft.world.level.LevelReader;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.pathfinder.PathComputationType;
|
||||||
|
|
||||||
|
public class DistilleryOutputBlock extends Block implements IBE<DistilleryOutputBlockEntity> {
|
||||||
|
|
||||||
|
public DistilleryOutputBlock(Properties properties) {
|
||||||
|
super(properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canSurvive(BlockState state, LevelReader worldIn, BlockPos pos) {
|
||||||
|
return !AllBlocks.BASIN.has(worldIn.getBlockState(pos.below()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<DistilleryOutputBlockEntity> getBlockEntityClass() {
|
||||||
|
return DistilleryOutputBlockEntity.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockEntityType<? extends DistilleryOutputBlockEntity> getBlockEntityType() {
|
||||||
|
return TFMGBlockEntities.CAST_IRON_DISTILLATION_OUTPUT.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
package com.drmangotea.tfmg.content.machines.oil_processing.distillation.backup;
|
package com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery;
|
||||||
|
|
||||||
|
|
||||||
import com.drmangotea.tfmg.CreateTFMG;
|
import com.drmangotea.tfmg.CreateTFMG;
|
||||||
|
import com.drmangotea.tfmg.content.machines.oil_processing.distillation.FluidProcessingBlockEntity;
|
||||||
import com.drmangotea.tfmg.recipes.distillation.DistillationRecipe;
|
import com.drmangotea.tfmg.recipes.distillation.DistillationRecipe;
|
||||||
import com.drmangotea.tfmg.registry.TFMGRecipeTypes;
|
import com.drmangotea.tfmg.registry.TFMGRecipeTypes;
|
||||||
import com.simibubi.create.AllRecipeTypes;
|
import com.simibubi.create.AllRecipeTypes;
|
||||||
@@ -41,7 +42,7 @@ import java.util.List;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class DistillationOutputBlockEntity extends FluidProcessingBlockEntity implements IHaveGoggleInformation {
|
public class DistilleryOutputBlockEntity extends FluidProcessingBlockEntity implements IHaveGoggleInformation {
|
||||||
|
|
||||||
protected LazyOptional<IFluidHandler> fluidCapability;
|
protected LazyOptional<IFluidHandler> fluidCapability;
|
||||||
public FluidTank tankInventory;
|
public FluidTank tankInventory;
|
||||||
@@ -56,7 +57,7 @@ public class DistillationOutputBlockEntity extends FluidProcessingBlockEntity im
|
|||||||
|
|
||||||
public boolean running;
|
public boolean running;
|
||||||
|
|
||||||
public DistillationOutputBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
public DistilleryOutputBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
||||||
super(type, pos, state);
|
super(type, pos, state);
|
||||||
tankInventory = createInventory();
|
tankInventory = createInventory();
|
||||||
fluidCapability = LazyOptional.of(() -> tankInventory);
|
fluidCapability = LazyOptional.of(() -> tankInventory);
|
||||||
@@ -66,7 +67,7 @@ public class DistillationOutputBlockEntity extends FluidProcessingBlockEntity im
|
|||||||
protected <C extends Container> boolean matchItemlessRecipe(Recipe<C> recipe) {
|
protected <C extends Container> boolean matchItemlessRecipe(Recipe<C> recipe) {
|
||||||
if (recipe == null)
|
if (recipe == null)
|
||||||
return false;
|
return false;
|
||||||
Optional<DistillationControllerBlockEntity> controller = getController();
|
Optional<DistilleryControllerBlockEntity> controller = getController();
|
||||||
if (!controller.isPresent())
|
if (!controller.isPresent())
|
||||||
return false;
|
return false;
|
||||||
return DistillationRecipe.match(controller.get(), recipe);
|
return DistillationRecipe.match(controller.get(), recipe);
|
||||||
@@ -76,11 +77,8 @@ public class DistillationOutputBlockEntity extends FluidProcessingBlockEntity im
|
|||||||
protected boolean updateController() {
|
protected boolean updateController() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (level == null || level.isClientSide)
|
if (level == null || level.isClientSide)
|
||||||
return true;
|
return true;
|
||||||
Optional<DistillationControllerBlockEntity> basin = getController();
|
|
||||||
|
|
||||||
|
|
||||||
List<Recipe<?>> recipes = getMatchingRecipes();
|
List<Recipe<?>> recipes = getMatchingRecipes();
|
||||||
if (recipes.isEmpty())
|
if (recipes.isEmpty())
|
||||||
@@ -94,7 +92,7 @@ public class DistillationOutputBlockEntity extends FluidProcessingBlockEntity im
|
|||||||
@Override
|
@Override
|
||||||
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
|
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
|
||||||
super.addBehaviours(behaviours);
|
super.addBehaviours(behaviours);
|
||||||
// registerAwardables(behaviours, AllAdvancements.MIXER);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -118,9 +116,7 @@ public class DistillationOutputBlockEntity extends FluidProcessingBlockEntity im
|
|||||||
if (tankInventory.getSpace() < 0)
|
if (tankInventory.getSpace() < 0)
|
||||||
tankInventory.drain(-tankInventory.getSpace(), IFluidHandler.FluidAction.EXECUTE);
|
tankInventory.drain(-tankInventory.getSpace(), IFluidHandler.FluidAction.EXECUTE);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(CompoundTag compound, boolean clientPacket) {
|
public void write(CompoundTag compound, boolean clientPacket) {
|
||||||
compound.putBoolean("Running", running);
|
compound.putBoolean("Running", running);
|
||||||
@@ -158,8 +154,6 @@ public class DistillationOutputBlockEntity extends FluidProcessingBlockEntity im
|
|||||||
if (currentRecipe == null)
|
if (currentRecipe == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// if((currentRecipe instanceof ShapelessRecipe))
|
// if((currentRecipe instanceof ShapelessRecipe))
|
||||||
// return;
|
// return;
|
||||||
|
|
||||||
@@ -184,16 +178,20 @@ if(above1 !=null&& above2 !=null
|
|||||||
// ((DistillationOutputBlockEntity) above1).tankInventory.getFluidAmount()+((DistillationRecipe)currentRecipe).getFluidResults().get(1).getAmount()<((DistillationOutputBlockEntity) above2).tankInventory.getCapacity()&&
|
// ((DistillationOutputBlockEntity) above1).tankInventory.getFluidAmount()+((DistillationRecipe)currentRecipe).getFluidResults().get(1).getAmount()<((DistillationOutputBlockEntity) above2).tankInventory.getCapacity()&&
|
||||||
// ((DistillationOutputBlockEntity) above2).tankInventory.getFluidAmount()+((DistillationRecipe)currentRecipe).getFluidResults().get(2).getAmount()<((DistillationOutputBlockEntity) above2).tankInventory.getCapacity()
|
// ((DistillationOutputBlockEntity) above2).tankInventory.getFluidAmount()+((DistillationRecipe)currentRecipe).getFluidResults().get(2).getAmount()<((DistillationOutputBlockEntity) above2).tankInventory.getCapacity()
|
||||||
){
|
){
|
||||||
Optional<DistillationControllerBlockEntity> optionalController = getController();
|
Optional<DistilleryControllerBlockEntity> optionalController = getController();
|
||||||
if (!optionalController.isPresent())
|
if (!optionalController.isPresent())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(!(above1 instanceof DistillationOutputBlockEntity)&&
|
if(!(above1 instanceof DistilleryOutputBlockEntity)&&
|
||||||
!( above2 instanceof DistillationOutputBlockEntity)) {
|
!( above2 instanceof DistilleryOutputBlockEntity)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CreateTFMG.LOGGER.debug("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEe");
|
if(!(above1 instanceof DistilleryOutputBlockEntity))
|
||||||
|
return;
|
||||||
|
if(!(above2 instanceof DistilleryOutputBlockEntity))
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
FluidStack fluidInRecipe1 = ((DistillationRecipe) currentRecipe).getFirstFluidResult();
|
FluidStack fluidInRecipe1 = ((DistillationRecipe) currentRecipe).getFirstFluidResult();
|
||||||
FluidStack fluidInRecipe2 = ((DistillationRecipe) currentRecipe).getSecondFluidResult();
|
FluidStack fluidInRecipe2 = ((DistillationRecipe) currentRecipe).getSecondFluidResult();
|
||||||
@@ -207,12 +205,12 @@ if(above1 !=null&& above2 !=null
|
|||||||
)
|
)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (fluidInRecipe3.getFluid() != (((DistillationOutputBlockEntity) above1).tankInventory.getFluid().getFluid())
|
if (fluidInRecipe2.getFluid() != (((DistilleryOutputBlockEntity) above1).tankInventory.getFluid().getFluid())
|
||||||
&&((DistillationOutputBlockEntity) above1).tankInventory.getFluidAmount()!=0
|
&&((DistilleryOutputBlockEntity) above1).tankInventory.getFluidAmount()!=0
|
||||||
)
|
)
|
||||||
return;
|
return;
|
||||||
if (fluidInRecipe3.getFluid() != (((DistillationOutputBlockEntity) above2).tankInventory.getFluid().getFluid())
|
if (fluidInRecipe3.getFluid() != (((DistilleryOutputBlockEntity) above2).tankInventory.getFluid().getFluid())
|
||||||
&&((DistillationOutputBlockEntity) above2).tankInventory.getFluidAmount()!=0
|
&&((DistilleryOutputBlockEntity) above2).tankInventory.getFluidAmount()!=0
|
||||||
)
|
)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -222,7 +220,7 @@ if(above1 !=null&& above2 !=null
|
|||||||
if(getController().get().getTanks().get(true).getPrimaryHandler().getFluid().getFluid() != ((DistillationRecipe) currentRecipe).getInputFluid().getMatchingFluidStacks().get(0).getFluid())
|
if(getController().get().getTanks().get(true).getPrimaryHandler().getFluid().getFluid() != ((DistillationRecipe) currentRecipe).getInputFluid().getMatchingFluidStacks().get(0).getFluid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DistillationControllerBlockEntity controller = optionalController.get();
|
DistilleryControllerBlockEntity controller = optionalController.get();
|
||||||
IFluidHandler availableFluids = controller.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
|
IFluidHandler availableFluids = controller.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
|
|
||||||
@@ -241,9 +239,9 @@ if(above1 !=null&& above2 !=null
|
|||||||
if (!(((DistillationRecipe) currentRecipe).getFluidResults().get(0).isEmpty()))
|
if (!(((DistillationRecipe) currentRecipe).getFluidResults().get(0).isEmpty()))
|
||||||
tankInventory.setFluid(new FluidStack(((DistillationRecipe) currentRecipe).getFluidResults().get(0).getFluid(), ((DistillationRecipe) currentRecipe).getFluidResults().get(0).getAmount() + this.tankInventory.getFluidAmount()));
|
tankInventory.setFluid(new FluidStack(((DistillationRecipe) currentRecipe).getFluidResults().get(0).getFluid(), ((DistillationRecipe) currentRecipe).getFluidResults().get(0).getAmount() + this.tankInventory.getFluidAmount()));
|
||||||
if (!(((DistillationRecipe) currentRecipe).getFluidResults().get(1).isEmpty()))
|
if (!(((DistillationRecipe) currentRecipe).getFluidResults().get(1).isEmpty()))
|
||||||
((DistillationOutputBlockEntity) above1).tankInventory.setFluid(new FluidStack(((DistillationRecipe) currentRecipe).getFluidResults().get(1).getFluid(), ((DistillationRecipe) currentRecipe).getFluidResults().get(1).getAmount() + ((DistillationOutputBlockEntity) above1).tankInventory.getFluidAmount()));
|
((DistilleryOutputBlockEntity) above1).tankInventory.setFluid(new FluidStack(((DistillationRecipe) currentRecipe).getFluidResults().get(1).getFluid(), ((DistillationRecipe) currentRecipe).getFluidResults().get(1).getAmount() + ((DistilleryOutputBlockEntity) above1).tankInventory.getFluidAmount()));
|
||||||
if (!(((DistillationRecipe) currentRecipe).getFluidResults().get(2).isEmpty()))
|
if (!(((DistillationRecipe) currentRecipe).getFluidResults().get(2).isEmpty()))
|
||||||
((DistillationOutputBlockEntity) above2).tankInventory.setFluid(new FluidStack(((DistillationRecipe) currentRecipe).getFluidResults().get(2).getFluid(), ((DistillationRecipe) currentRecipe).getFluidResults().get(2).getAmount() + ((DistillationOutputBlockEntity) above2).tankInventory.getFluidAmount()));
|
((DistilleryOutputBlockEntity) above2).tankInventory.setFluid(new FluidStack(((DistillationRecipe) currentRecipe).getFluidResults().get(2).getFluid(), ((DistillationRecipe) currentRecipe).getFluidResults().get(2).getAmount() + ((DistilleryOutputBlockEntity) above2).tankInventory.getFluidAmount()));
|
||||||
|
|
||||||
|
|
||||||
if (!(((DistillationRecipe) currentRecipe).getFirstItemResult().isEmpty()))
|
if (!(((DistillationRecipe) currentRecipe).getFirstItemResult().isEmpty()))
|
||||||
@@ -259,10 +257,6 @@ if(!(((DistillationRecipe) currentRecipe).getThirdItemResult().isEmpty()))
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
controller.notifyChangeOfContents();
|
controller.notifyChangeOfContents();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -330,16 +324,7 @@ if(!(((DistillationRecipe) currentRecipe).getThirdItemResult().isEmpty()))
|
|||||||
return Optional.of(AllAdvancements.MIXER);
|
return Optional.of(AllAdvancements.MIXER);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
public void tickAudio() {
|
|
||||||
super.tickAudio();
|
|
||||||
|
|
||||||
// SoundEvents.BLOCK_STONE_BREAK
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected SmartFluidTank createInventory() {
|
protected SmartFluidTank createInventory() {
|
||||||
@@ -355,11 +340,6 @@ if(!(((DistillationRecipe) currentRecipe).getThirdItemResult().isEmpty()))
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void sendDataImmediately() {
|
|
||||||
syncCooldown = 0;
|
|
||||||
queuedSync = false;
|
|
||||||
sendData();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendData() {
|
public void sendData() {
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
package com.drmangotea.tfmg.recipes.distillation;
|
package com.drmangotea.tfmg.recipes.distillation;
|
||||||
|
|
||||||
import com.drmangotea.tfmg.CreateTFMG;
|
import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryControllerBlockEntity;
|
||||||
import com.drmangotea.tfmg.content.machines.oil_processing.distillation.DistillationControllerBlockEntity;
|
|
||||||
import com.drmangotea.tfmg.registry.TFMGFluids;
|
|
||||||
import com.simibubi.create.content.processing.burner.BlazeBurnerBlock;
|
import com.simibubi.create.content.processing.burner.BlazeBurnerBlock;
|
||||||
import com.simibubi.create.content.processing.recipe.ProcessingRecipe;
|
import com.simibubi.create.content.processing.recipe.ProcessingRecipe;
|
||||||
import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder;
|
import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder;
|
||||||
@@ -11,12 +9,10 @@ import com.simibubi.create.foundation.fluid.FluidIngredient;
|
|||||||
import com.simibubi.create.foundation.item.SmartInventory;
|
import com.simibubi.create.foundation.item.SmartInventory;
|
||||||
import com.simibubi.create.foundation.recipe.IRecipeTypeInfo;
|
import com.simibubi.create.foundation.recipe.IRecipeTypeInfo;
|
||||||
import com.simibubi.create.foundation.utility.Iterate;
|
import com.simibubi.create.foundation.utility.Iterate;
|
||||||
import net.minecraft.world.item.Item;
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.item.crafting.Ingredient;
|
import net.minecraft.world.item.crafting.Ingredient;
|
||||||
import net.minecraft.world.item.crafting.Recipe;
|
import net.minecraft.world.item.crafting.Recipe;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.material.Fluid;
|
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
@@ -31,7 +27,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public class ItemlessRecipe extends ProcessingRecipe<SmartInventory> {
|
public class ItemlessRecipe extends ProcessingRecipe<SmartInventory> {
|
||||||
|
|
||||||
public static boolean match(DistillationControllerBlockEntity controller, Recipe<?> recipe) {
|
public static boolean match(DistilleryControllerBlockEntity controller, Recipe<?> recipe) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -48,11 +44,11 @@ public class ItemlessRecipe extends ProcessingRecipe<SmartInventory> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean apply(DistillationControllerBlockEntity basin, Recipe<?> recipe) {
|
public static boolean apply(DistilleryControllerBlockEntity basin, Recipe<?> recipe) {
|
||||||
return apply(basin, recipe, false);
|
return apply(basin, recipe, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean apply(DistillationControllerBlockEntity controller, Recipe<?> recipe, boolean test) {
|
private static boolean apply(DistilleryControllerBlockEntity controller, Recipe<?> recipe, boolean test) {
|
||||||
boolean isItemlessRecipe = recipe instanceof ItemlessRecipe;
|
boolean isItemlessRecipe = recipe instanceof ItemlessRecipe;
|
||||||
IItemHandler availableItems = controller.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
|
IItemHandler availableItems = controller.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
@@ -62,7 +58,7 @@ public class ItemlessRecipe extends ProcessingRecipe<SmartInventory> {
|
|||||||
if (availableItems == null || availableFluids == null)
|
if (availableItems == null || availableFluids == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
BlazeBurnerBlock.HeatLevel heat = DistillationControllerBlockEntity.getHeatLevelOf(controller.getLevel()
|
BlazeBurnerBlock.HeatLevel heat = DistilleryControllerBlockEntity.getHeatLevelOf(controller.getLevel()
|
||||||
.getBlockState(controller.getBlockPos()
|
.getBlockState(controller.getBlockPos()
|
||||||
.below(1)));
|
.below(1)));
|
||||||
if (isItemlessRecipe && !((ItemlessRecipe) recipe).getRequiredHeat()
|
if (isItemlessRecipe && !((ItemlessRecipe) recipe).getRequiredHeat()
|
||||||
@@ -72,7 +68,7 @@ public class ItemlessRecipe extends ProcessingRecipe<SmartInventory> {
|
|||||||
List<ItemStack> recipeOutputItems = new ArrayList<>();
|
List<ItemStack> recipeOutputItems = new ArrayList<>();
|
||||||
List<FluidStack> recipeOutputFluids = new ArrayList<>();
|
List<FluidStack> recipeOutputFluids = new ArrayList<>();
|
||||||
|
|
||||||
List<Ingredient> ingredients = new LinkedList<>(recipe.getIngredients());
|
|
||||||
List<FluidIngredient> fluidIngredients =
|
List<FluidIngredient> fluidIngredients =
|
||||||
isItemlessRecipe ? ((ItemlessRecipe) recipe).getFluidIngredients() : Collections.emptyList();
|
isItemlessRecipe ? ((ItemlessRecipe) recipe).getFluidIngredients() : Collections.emptyList();
|
||||||
if(!fluidIngredients.isEmpty())
|
if(!fluidIngredients.isEmpty())
|
||||||
@@ -85,28 +81,8 @@ public class ItemlessRecipe extends ProcessingRecipe<SmartInventory> {
|
|||||||
if (!simulate && test)
|
if (!simulate && test)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
int[] extractedItemsFromSlot = new int[availableItems.getSlots()];
|
|
||||||
int[] extractedFluidsFromTank = new int[availableFluids.getTanks()];
|
int[] extractedFluidsFromTank = new int[availableFluids.getTanks()];
|
||||||
|
|
||||||
Ingredients: for (int i = 0; i < ingredients.size(); i++) {
|
|
||||||
Ingredient ingredient = ingredients.get(i);
|
|
||||||
|
|
||||||
for (int slot = 0; slot < availableItems.getSlots(); slot++) {
|
|
||||||
if (simulate && availableItems.getStackInSlot(slot)
|
|
||||||
.getCount() <= extractedItemsFromSlot[slot])
|
|
||||||
continue;
|
|
||||||
ItemStack extracted = availableItems.extractItem(slot, 1, true);
|
|
||||||
if (!ingredient.test(extracted))
|
|
||||||
continue;
|
|
||||||
if (!simulate)
|
|
||||||
availableItems.extractItem(slot, 1, false);
|
|
||||||
extractedItemsFromSlot[slot]++;
|
|
||||||
continue Ingredients;
|
|
||||||
}
|
|
||||||
|
|
||||||
// something wasn't found
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean fluidsAffected = false;
|
boolean fluidsAffected = false;
|
||||||
FluidIngredients: for (int i = 0; i < fluidIngredients.size(); i++) {
|
FluidIngredients: for (int i = 0; i < fluidIngredients.size(); i++) {
|
||||||
@@ -150,17 +126,9 @@ public class ItemlessRecipe extends ProcessingRecipe<SmartInventory> {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
recipeOutputItems.add(recipe.getResultItem());
|
recipeOutputItems.add(recipe.getResultItem());
|
||||||
/*
|
|
||||||
if (recipe instanceof CraftingRecipe craftingRecipe) {
|
|
||||||
recipeOutputItems.addAll(craftingRecipe.getRemainingItems(new DummyCraftingContainer(availableItems, extractedItemsFromSlot)));
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!controller.acceptOutputs(recipeOutputItems, recipeOutputFluids, simulate))
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -190,7 +158,7 @@ public class ItemlessRecipe extends ProcessingRecipe<SmartInventory> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int getMaxFluidOutputCount() {
|
protected int getMaxFluidOutputCount() {
|
||||||
return 3;
|
return 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package com.drmangotea.tfmg.recipes.distillation.advanced;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import com.drmangotea.tfmg.recipes.distillation.ItemlessRecipe;
|
||||||
|
import com.drmangotea.tfmg.registry.TFMGRecipeTypes;
|
||||||
|
import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder;
|
||||||
|
import com.simibubi.create.foundation.fluid.FluidIngredient;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
|
||||||
|
public class AdvancedDistillationRecipe extends ItemlessRecipe {
|
||||||
|
|
||||||
|
public AdvancedDistillationRecipe(ProcessingRecipeBuilder.ProcessingRecipeParams params) {
|
||||||
|
super(TFMGRecipeTypes.ADVANCED_DISTILLATION, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FluidIngredient getInputFluid(){
|
||||||
|
return getFluidIngredients().get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FluidStack getFirstFluidResult(){
|
||||||
|
return fluidResults.get(0);
|
||||||
|
}
|
||||||
|
public FluidStack getSecondFluidResult(){
|
||||||
|
return fluidResults.get(1);
|
||||||
|
}
|
||||||
|
public FluidStack getThirdFluidResult(){
|
||||||
|
return fluidResults.get(2);
|
||||||
|
}
|
||||||
|
public FluidStack getFourthFluidResult(){
|
||||||
|
return fluidResults.get(3);
|
||||||
|
}
|
||||||
|
public FluidStack getFifthFluidResult(){
|
||||||
|
return fluidResults.get(4);
|
||||||
|
}
|
||||||
|
public FluidStack getSixthFluidResult(){
|
||||||
|
return fluidResults.get(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStack getFirstItemResult(){
|
||||||
|
return results.get(0).getStack();
|
||||||
|
}
|
||||||
|
public ItemStack getSecondItemResult(){
|
||||||
|
return results.get(1).getStack();
|
||||||
|
}
|
||||||
|
public ItemStack getThirdItemResult(){
|
||||||
|
return results.get(2).getStack();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,8 +7,8 @@ import com.drmangotea.tfmg.content.decoration.doors.TFMGSlidingDoorRenderer;
|
|||||||
import com.drmangotea.tfmg.content.deposits.FluidDepositBlockEntity;
|
import com.drmangotea.tfmg.content.deposits.FluidDepositBlockEntity;
|
||||||
import com.drmangotea.tfmg.content.deposits.surface_scanner.SurfaceScannerRenderer;
|
import com.drmangotea.tfmg.content.deposits.surface_scanner.SurfaceScannerRenderer;
|
||||||
import com.drmangotea.tfmg.content.deposits.surface_scanner.SurfaceScannerTileEntity;
|
import com.drmangotea.tfmg.content.deposits.surface_scanner.SurfaceScannerTileEntity;
|
||||||
import com.drmangotea.tfmg.content.machines.oil_processing.distillation.DistillationControllerBlockEntity;
|
import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryControllerBlockEntity;
|
||||||
import com.drmangotea.tfmg.content.machines.oil_processing.distillation.DistillationOutputBlockEntity;
|
import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryOutputBlockEntity;
|
||||||
import com.drmangotea.tfmg.content.machines.pipes.normal.LockablePipeBlockEntity;
|
import com.drmangotea.tfmg.content.machines.pipes.normal.LockablePipeBlockEntity;
|
||||||
import com.drmangotea.tfmg.content.machines.tanks.SteelFluidTankRenderer;
|
import com.drmangotea.tfmg.content.machines.tanks.SteelFluidTankRenderer;
|
||||||
import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlockEntity;
|
import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlockEntity;
|
||||||
@@ -102,13 +102,13 @@ public class TFMGBlockEntities {
|
|||||||
.register();
|
.register();
|
||||||
|
|
||||||
|
|
||||||
public static final BlockEntityEntry<DistillationOutputBlockEntity> CAST_IRON_DISTILLATION_OUTPUT = REGISTRATE
|
public static final BlockEntityEntry<DistilleryOutputBlockEntity> CAST_IRON_DISTILLATION_OUTPUT = REGISTRATE
|
||||||
.blockEntity("distiller", DistillationOutputBlockEntity::new)
|
.blockEntity("distiller", DistilleryOutputBlockEntity::new)
|
||||||
.validBlocks(TFMGBlocks.CAST_IRON_DISTILLATION_OUTPUT)
|
.validBlocks(TFMGBlocks.CAST_IRON_DISTILLATION_OUTPUT)
|
||||||
.register();
|
.register();
|
||||||
|
|
||||||
public static final BlockEntityEntry<DistillationControllerBlockEntity> CAST_IRON_DISTILLATION_CONTROLLER = REGISTRATE
|
public static final BlockEntityEntry<DistilleryControllerBlockEntity> CAST_IRON_DISTILLATION_CONTROLLER = REGISTRATE
|
||||||
.blockEntity("distiller_controller", DistillationControllerBlockEntity::new)
|
.blockEntity("distiller_controller", DistilleryControllerBlockEntity::new)
|
||||||
.validBlocks(TFMGBlocks.CAST_IRON_DISTILLATION_CONTROLLER)
|
.validBlocks(TFMGBlocks.CAST_IRON_DISTILLATION_CONTROLLER)
|
||||||
.register();
|
.register();
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ import com.drmangotea.tfmg.content.gadgets.explosives.napalm.NapalmBombBlock;
|
|||||||
import com.drmangotea.tfmg.content.items.CoalCokeBlockItem;
|
import com.drmangotea.tfmg.content.items.CoalCokeBlockItem;
|
||||||
import com.drmangotea.tfmg.content.items.FossilstoneItem;
|
import com.drmangotea.tfmg.content.items.FossilstoneItem;
|
||||||
import com.drmangotea.tfmg.content.deposits.surface_scanner.SurfaceScannerBlock;
|
import com.drmangotea.tfmg.content.deposits.surface_scanner.SurfaceScannerBlock;
|
||||||
import com.drmangotea.tfmg.content.machines.oil_processing.distillation.DistillationControllerBlock;
|
import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryControllerBlock;
|
||||||
import com.drmangotea.tfmg.content.machines.oil_processing.distillation.DistillationOutputBlock;
|
import com.drmangotea.tfmg.content.machines.oil_processing.distillation.distillery.DistilleryOutputBlock;
|
||||||
import com.drmangotea.tfmg.content.machines.pipes.normal.steel.EncasedSteelPipeBlock;
|
import com.drmangotea.tfmg.content.machines.pipes.normal.steel.EncasedSteelPipeBlock;
|
||||||
import com.drmangotea.tfmg.content.machines.pipes.normal.steel.GlassSteelPipeBlock;
|
import com.drmangotea.tfmg.content.machines.pipes.normal.steel.GlassSteelPipeBlock;
|
||||||
import com.drmangotea.tfmg.content.machines.pipes.normal.steel.SteelPipeAttachmentModel;
|
import com.drmangotea.tfmg.content.machines.pipes.normal.steel.SteelPipeAttachmentModel;
|
||||||
@@ -239,8 +239,8 @@ public class TFMGBlocks {
|
|||||||
//Distillation
|
//Distillation
|
||||||
|
|
||||||
|
|
||||||
public static final BlockEntry<DistillationOutputBlock> CAST_IRON_DISTILLATION_OUTPUT =
|
public static final BlockEntry<DistilleryOutputBlock> CAST_IRON_DISTILLATION_OUTPUT =
|
||||||
REGISTRATE.block("cast_iron_distillation_output", DistillationOutputBlock::new)
|
REGISTRATE.block("cast_iron_distillation_output", DistilleryOutputBlock::new)
|
||||||
.initialProperties(SharedProperties::copperMetal)
|
.initialProperties(SharedProperties::copperMetal)
|
||||||
.properties(p -> p.color(MaterialColor.STONE))
|
.properties(p -> p.color(MaterialColor.STONE))
|
||||||
.properties(BlockBehaviour.Properties::noOcclusion)
|
.properties(BlockBehaviour.Properties::noOcclusion)
|
||||||
@@ -248,12 +248,15 @@ public class TFMGBlocks {
|
|||||||
.item(AssemblyOperatorBlockItem::new)
|
.item(AssemblyOperatorBlockItem::new)
|
||||||
.build()
|
.build()
|
||||||
.register();
|
.register();
|
||||||
public static final BlockEntry<DistillationControllerBlock> CAST_IRON_DISTILLATION_CONTROLLER =
|
public static final BlockEntry<DistilleryControllerBlock> CAST_IRON_DISTILLATION_CONTROLLER =
|
||||||
REGISTRATE.block("cast_iron_distillation_controller", DistillationControllerBlock::new)
|
REGISTRATE.block("cast_iron_distillation_controller", DistilleryControllerBlock::new)
|
||||||
.initialProperties(SharedProperties::copperMetal)
|
.initialProperties(SharedProperties::copperMetal)
|
||||||
.item()
|
.item()
|
||||||
.build()
|
.build()
|
||||||
.register();
|
.register();
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//////
|
//////
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.drmangotea.tfmg.registry;
|
|||||||
|
|
||||||
import com.drmangotea.tfmg.CreateTFMG;
|
import com.drmangotea.tfmg.CreateTFMG;
|
||||||
import com.drmangotea.tfmg.recipes.distillation.DistillationRecipe;
|
import com.drmangotea.tfmg.recipes.distillation.DistillationRecipe;
|
||||||
|
import com.drmangotea.tfmg.recipes.distillation.advanced.AdvancedDistillationRecipe;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder.ProcessingRecipeFactory;
|
import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder.ProcessingRecipeFactory;
|
||||||
import com.simibubi.create.content.processing.recipe.ProcessingRecipeSerializer;
|
import com.simibubi.create.content.processing.recipe.ProcessingRecipeSerializer;
|
||||||
@@ -28,7 +29,8 @@ import java.util.function.Supplier;
|
|||||||
|
|
||||||
public enum TFMGRecipeTypes implements IRecipeTypeInfo {
|
public enum TFMGRecipeTypes implements IRecipeTypeInfo {
|
||||||
|
|
||||||
DISTILLATION(DistillationRecipe::new);
|
DISTILLATION(DistillationRecipe::new),
|
||||||
|
ADVANCED_DISTILLATION(AdvancedDistillationRecipe::new);
|
||||||
|
|
||||||
private final ResourceLocation id;
|
private final ResourceLocation id;
|
||||||
private final RegistryObject<RecipeSerializer<?>> serializerObject;
|
private final RegistryObject<RecipeSerializer<?>> serializerObject;
|
||||||
|
|||||||
@@ -1,210 +0,0 @@
|
|||||||
package com.drmangotea.tfmg.content.machines.oil_processing.distillation.backup;
|
|
||||||
|
|
||||||
|
|
||||||
import com.drmangotea.tfmg.registry.TFMGBlockEntities;
|
|
||||||
import com.simibubi.create.AllBlocks;
|
|
||||||
import com.simibubi.create.AllShapes;
|
|
||||||
import com.simibubi.create.Create;
|
|
||||||
import com.simibubi.create.content.equipment.wrench.IWrenchable;
|
|
||||||
import com.simibubi.create.content.fluids.transfer.GenericItemEmptying;
|
|
||||||
import com.simibubi.create.content.fluids.transfer.GenericItemFilling;
|
|
||||||
import com.simibubi.create.content.kinetics.belt.BeltBlockEntity;
|
|
||||||
import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour;
|
|
||||||
import com.simibubi.create.content.logistics.funnel.FunnelBlock;
|
|
||||||
import com.simibubi.create.content.processing.basin.BasinOperatingBlockEntity;
|
|
||||||
import com.simibubi.create.foundation.block.IBE;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
|
|
||||||
import com.simibubi.create.foundation.fluid.FluidHelper;
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.core.Direction;
|
|
||||||
import net.minecraft.sounds.SoundEvents;
|
|
||||||
import net.minecraft.sounds.SoundSource;
|
|
||||||
import net.minecraft.world.InteractionHand;
|
|
||||||
import net.minecraft.world.InteractionResult;
|
|
||||||
import net.minecraft.world.entity.Entity;
|
|
||||||
import net.minecraft.world.entity.item.ItemEntity;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
|
||||||
import net.minecraft.world.item.Items;
|
|
||||||
import net.minecraft.world.level.BlockGetter;
|
|
||||||
import net.minecraft.world.level.Level;
|
|
||||||
import net.minecraft.world.level.LevelReader;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
|
||||||
import net.minecraft.world.level.block.state.StateDefinition;
|
|
||||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
|
||||||
import net.minecraft.world.level.block.state.properties.DirectionProperty;
|
|
||||||
import net.minecraft.world.level.pathfinder.PathComputationType;
|
|
||||||
import net.minecraft.world.phys.BlockHitResult;
|
|
||||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
|
||||||
import net.minecraft.world.phys.shapes.EntityCollisionContext;
|
|
||||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
|
||||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
|
||||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
|
||||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
|
||||||
import net.minecraftforge.items.ItemStackHandler;
|
|
||||||
|
|
||||||
public class DistillationControllerBlock extends Block implements IBE<DistillationControllerBlockEntity>, IWrenchable {
|
|
||||||
|
|
||||||
public static final DirectionProperty FACING = BlockStateProperties.FACING_HOPPER;
|
|
||||||
|
|
||||||
public DistillationControllerBlock(Properties p_i48440_1_) {
|
|
||||||
super(p_i48440_1_);
|
|
||||||
registerDefaultState(defaultBlockState().setValue(FACING, Direction.DOWN));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> p_206840_1_) {
|
|
||||||
super.createBlockStateDefinition(p_206840_1_.add(FACING));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) {
|
|
||||||
BlockEntity tileEntity = world.getBlockEntity(pos.above());
|
|
||||||
if (tileEntity instanceof BasinOperatingBlockEntity)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn,
|
|
||||||
BlockHitResult hit) {
|
|
||||||
ItemStack heldItem = player.getItemInHand(handIn);
|
|
||||||
|
|
||||||
return onBlockEntityUse(worldIn, pos, te -> {
|
|
||||||
if (!heldItem.isEmpty()) {
|
|
||||||
if (FluidHelper.tryEmptyItemIntoBE(worldIn, player, handIn, heldItem, te))
|
|
||||||
return InteractionResult.SUCCESS;
|
|
||||||
if (FluidHelper.tryFillItemFromBE(worldIn, player, handIn, heldItem, te))
|
|
||||||
return InteractionResult.SUCCESS;
|
|
||||||
|
|
||||||
if (GenericItemEmptying.canItemBeEmptied(worldIn, heldItem)
|
|
||||||
|| GenericItemFilling.canItemBeFilled(worldIn, heldItem))
|
|
||||||
return InteractionResult.SUCCESS;
|
|
||||||
if (heldItem.getItem()
|
|
||||||
.equals(Items.SPONGE)
|
|
||||||
&& !te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
|
|
||||||
.map(iFluidHandler -> iFluidHandler.drain(Integer.MAX_VALUE, IFluidHandler.FluidAction.EXECUTE))
|
|
||||||
.orElse(FluidStack.EMPTY)
|
|
||||||
.isEmpty()) {
|
|
||||||
return InteractionResult.SUCCESS;
|
|
||||||
}
|
|
||||||
return InteractionResult.PASS;
|
|
||||||
}
|
|
||||||
|
|
||||||
IItemHandlerModifiable inv = te.itemCapability.orElse(new ItemStackHandler(1));
|
|
||||||
boolean success = false;
|
|
||||||
for (int slot = 0; slot < inv.getSlots(); slot++) {
|
|
||||||
ItemStack stackInSlot = inv.getStackInSlot(slot);
|
|
||||||
if (stackInSlot.isEmpty())
|
|
||||||
continue;
|
|
||||||
player.getInventory()
|
|
||||||
.placeItemBackInInventory(stackInSlot);
|
|
||||||
inv.setStackInSlot(slot, ItemStack.EMPTY);
|
|
||||||
success = true;
|
|
||||||
}
|
|
||||||
if (success)
|
|
||||||
worldIn.playSound(null, pos, SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f,
|
|
||||||
1f + Create.RANDOM.nextFloat());
|
|
||||||
te.onEmptied();
|
|
||||||
return InteractionResult.SUCCESS;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateEntityAfterFallOn(BlockGetter worldIn, Entity entityIn) {
|
|
||||||
super.updateEntityAfterFallOn(worldIn, entityIn);
|
|
||||||
if (!AllBlocks.BASIN.has(worldIn.getBlockState(entityIn.blockPosition())))
|
|
||||||
return;
|
|
||||||
if (!(entityIn instanceof ItemEntity))
|
|
||||||
return;
|
|
||||||
if (!entityIn.isAlive())
|
|
||||||
return;
|
|
||||||
ItemEntity itemEntity = (ItemEntity) entityIn;
|
|
||||||
withBlockEntityDo(worldIn, entityIn.blockPosition(), te -> {
|
|
||||||
|
|
||||||
// Tossed items bypass the quarter-stack limit
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getInteractionShape(BlockState p_199600_1_, BlockGetter p_199600_2_, BlockPos p_199600_3_) {
|
|
||||||
return AllShapes.BASIN_RAYTRACE_SHAPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) {
|
|
||||||
return AllShapes.BASIN_BLOCK_SHAPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getCollisionShape(BlockState state, BlockGetter reader, BlockPos pos, CollisionContext ctx) {
|
|
||||||
if (ctx instanceof EntityCollisionContext && ((EntityCollisionContext) ctx).getEntity() instanceof ItemEntity)
|
|
||||||
return AllShapes.BASIN_COLLISION_SHAPE;
|
|
||||||
return getShape(state, reader, pos, ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
|
||||||
IBE.onRemove(state, worldIn, pos, newState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasAnalogOutputSignal(BlockState state) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<DistillationControllerBlockEntity> getBlockEntityClass() {
|
|
||||||
return DistillationControllerBlockEntity.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BlockEntityType<? extends DistillationControllerBlockEntity> getBlockEntityType() {
|
|
||||||
return TFMGBlockEntities.CAST_IRON_DISTILLATION_CONTROLLER.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean canOutputTo(BlockGetter world, BlockPos basinPos, Direction direction) {
|
|
||||||
BlockPos neighbour = basinPos.relative(direction);
|
|
||||||
BlockPos output = neighbour.below();
|
|
||||||
BlockState blockState = world.getBlockState(neighbour);
|
|
||||||
|
|
||||||
if (FunnelBlock.isFunnel(blockState)) {
|
|
||||||
if (FunnelBlock.getFunnelFacing(blockState) == direction)
|
|
||||||
return false;
|
|
||||||
} else if (!blockState.getCollisionShape(world, neighbour)
|
|
||||||
.isEmpty()) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
BlockEntity tileEntity = world.getBlockEntity(output);
|
|
||||||
if (tileEntity instanceof BeltBlockEntity) {
|
|
||||||
BeltBlockEntity belt = (BeltBlockEntity) tileEntity;
|
|
||||||
return belt.getSpeed() == 0 || belt.getMovementFacing() != direction.getOpposite();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DirectBeltInputBehaviour directBeltInputBehaviour =
|
|
||||||
BlockEntityBehaviour.get(world, output, DirectBeltInputBehaviour.TYPE);
|
|
||||||
if (directBeltInputBehaviour != null)
|
|
||||||
return directBeltInputBehaviour.canInsertFromSide(direction);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,588 +0,0 @@
|
|||||||
package com.drmangotea.tfmg.content.machines.oil_processing.distillation.backup;
|
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import com.simibubi.create.AllTags;
|
|
||||||
import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation;
|
|
||||||
import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour;
|
|
||||||
import com.simibubi.create.content.processing.burner.BlazeBurnerBlock;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTankBehaviour;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour;
|
|
||||||
import com.simibubi.create.foundation.fluid.CombinedTankWrapper;
|
|
||||||
import com.simibubi.create.foundation.item.SmartInventory;
|
|
||||||
import com.simibubi.create.foundation.utility.*;
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.core.Direction;
|
|
||||||
import net.minecraft.nbt.CompoundTag;
|
|
||||||
import net.minecraft.nbt.ListTag;
|
|
||||||
import net.minecraft.nbt.StringTag;
|
|
||||||
import net.minecraft.nbt.Tag;
|
|
||||||
import net.minecraft.network.chat.Component;
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
|
||||||
import net.minecraft.world.phys.Vec3;
|
|
||||||
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 net.minecraftforge.items.CapabilityItemHandler;
|
|
||||||
import net.minecraftforge.items.IItemHandler;
|
|
||||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
|
||||||
import net.minecraftforge.items.ItemHandlerHelper;
|
|
||||||
import net.minecraftforge.items.wrapper.CombinedInvWrapper;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
public class DistillationControllerBlockEntity extends SmartBlockEntity implements IHaveGoggleInformation {
|
|
||||||
|
|
||||||
public SmartFluidTankBehaviour inputTank;
|
|
||||||
protected SmartInventory outputInventory;
|
|
||||||
protected SmartFluidTankBehaviour outputTank;
|
|
||||||
|
|
||||||
private boolean contentsChanged;
|
|
||||||
|
|
||||||
|
|
||||||
private Couple<SmartFluidTankBehaviour> tanks;
|
|
||||||
|
|
||||||
public LazyOptional<IItemHandlerModifiable> itemCapability;
|
|
||||||
protected LazyOptional<IFluidHandler> fluidCapability;
|
|
||||||
|
|
||||||
List<Direction> disabledSpoutputs;
|
|
||||||
Direction preferredSpoutput;
|
|
||||||
protected List<ItemStack> spoutputBuffer;
|
|
||||||
protected List<FluidStack> spoutputFluidBuffer;
|
|
||||||
int recipeBackupCheck;
|
|
||||||
|
|
||||||
public static final int OUTPUT_ANIMATION_TIME = 10;
|
|
||||||
List<IntAttached<ItemStack>> visualizedOutputItems;
|
|
||||||
List<IntAttached<FluidStack>> visualizedOutputFluids;
|
|
||||||
|
|
||||||
public DistillationControllerBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
|
||||||
super(type, pos, state);
|
|
||||||
|
|
||||||
outputInventory = new SmartInventory(9, this).forbidInsertion()
|
|
||||||
.withMaxStackSize(64);
|
|
||||||
|
|
||||||
itemCapability = LazyOptional.of(() -> new CombinedInvWrapper( outputInventory));
|
|
||||||
contentsChanged = true;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
tanks = Couple.create(inputTank, outputTank);
|
|
||||||
visualizedOutputItems = Collections.synchronizedList(new ArrayList<>());
|
|
||||||
visualizedOutputFluids = Collections.synchronizedList(new ArrayList<>());
|
|
||||||
disabledSpoutputs = new ArrayList<>();
|
|
||||||
preferredSpoutput = null;
|
|
||||||
spoutputBuffer = new ArrayList<>();
|
|
||||||
spoutputFluidBuffer = new ArrayList<>();
|
|
||||||
recipeBackupCheck = 20;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
|
|
||||||
behaviours.add(new DirectBeltInputBehaviour(this));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inputTank = new SmartFluidTankBehaviour(SmartFluidTankBehaviour.INPUT, this, 2, 1000, true)
|
|
||||||
.whenFluidUpdates(() -> contentsChanged = true);
|
|
||||||
outputTank = new SmartFluidTankBehaviour(SmartFluidTankBehaviour.OUTPUT, this, 2, 1000, true)
|
|
||||||
.whenFluidUpdates(() -> contentsChanged = true)
|
|
||||||
.forbidInsertion();
|
|
||||||
behaviours.add(inputTank);
|
|
||||||
behaviours.add(outputTank);
|
|
||||||
|
|
||||||
fluidCapability = LazyOptional.of(() -> {
|
|
||||||
LazyOptional<? extends IFluidHandler> inputCap = inputTank.getCapability();
|
|
||||||
LazyOptional<? extends IFluidHandler> outputCap = outputTank.getCapability();
|
|
||||||
return new CombinedTankWrapper(outputCap.orElse(null), inputCap.orElse(null));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void read(CompoundTag compound, boolean clientPacket) {
|
|
||||||
super.read(compound, clientPacket);
|
|
||||||
|
|
||||||
outputInventory.deserializeNBT(compound.getCompound("OutputItems"));
|
|
||||||
|
|
||||||
preferredSpoutput = null;
|
|
||||||
if (compound.contains("PreferredSpoutput"))
|
|
||||||
preferredSpoutput = NBTHelper.readEnum(compound, "PreferredSpoutput", Direction.class);
|
|
||||||
disabledSpoutputs.clear();
|
|
||||||
ListTag disabledList = compound.getList("DisabledSpoutput", Tag.TAG_STRING);
|
|
||||||
disabledList.forEach(d -> disabledSpoutputs.add(Direction.valueOf(((StringTag) d).getAsString())));
|
|
||||||
spoutputBuffer = NBTHelper.readItemList(compound.getList("Overflow", Tag.TAG_COMPOUND));
|
|
||||||
spoutputFluidBuffer = NBTHelper.readCompoundList(compound.getList("FluidOverflow", Tag.TAG_COMPOUND),
|
|
||||||
FluidStack::loadFluidStackFromNBT);
|
|
||||||
|
|
||||||
if (!clientPacket)
|
|
||||||
return;
|
|
||||||
|
|
||||||
NBTHelper.iterateCompoundList(compound.getList("VisualizedItems", Tag.TAG_COMPOUND),
|
|
||||||
c -> visualizedOutputItems.add(IntAttached.with(OUTPUT_ANIMATION_TIME, ItemStack.of(c))));
|
|
||||||
NBTHelper.iterateCompoundList(compound.getList("VisualizedFluids", Tag.TAG_COMPOUND),
|
|
||||||
c -> visualizedOutputFluids
|
|
||||||
.add(IntAttached.with(OUTPUT_ANIMATION_TIME, FluidStack.loadFluidStackFromNBT(c))));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void write(CompoundTag compound, boolean clientPacket) {
|
|
||||||
super.write(compound, clientPacket);
|
|
||||||
|
|
||||||
compound.put("OutputItems", outputInventory.serializeNBT());
|
|
||||||
|
|
||||||
if (preferredSpoutput != null)
|
|
||||||
NBTHelper.writeEnum(compound, "PreferredSpoutput", preferredSpoutput);
|
|
||||||
ListTag disabledList = new ListTag();
|
|
||||||
disabledSpoutputs.forEach(d -> disabledList.add(StringTag.valueOf(d.name())));
|
|
||||||
compound.put("DisabledSpoutput", disabledList);
|
|
||||||
compound.put("Overflow", NBTHelper.writeItemList(spoutputBuffer));
|
|
||||||
compound.put("FluidOverflow",
|
|
||||||
NBTHelper.writeCompoundList(spoutputFluidBuffer, fs -> fs.writeToNBT(new CompoundTag())));
|
|
||||||
|
|
||||||
if (!clientPacket)
|
|
||||||
return;
|
|
||||||
|
|
||||||
compound.put("VisualizedItems", NBTHelper.writeCompoundList(visualizedOutputItems, ia -> ia.getValue()
|
|
||||||
.serializeNBT()));
|
|
||||||
compound.put("VisualizedFluids", NBTHelper.writeCompoundList(visualizedOutputFluids, ia -> ia.getValue()
|
|
||||||
.writeToNBT(new CompoundTag())));
|
|
||||||
visualizedOutputItems.clear();
|
|
||||||
visualizedOutputFluids.clear();
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
@Override
|
|
||||||
public void destroy() {
|
|
||||||
super.destroy();
|
|
||||||
|
|
||||||
ItemHelper.dropContents(level, worldPosition, outputInventory);
|
|
||||||
spoutputBuffer.forEach(is -> Block.popResource(level, worldPosition, is));
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void remove() {
|
|
||||||
super.remove();
|
|
||||||
onEmptied();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onEmptied() {
|
|
||||||
getOperator().ifPresent(te -> te.basinRemoved = true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void invalidate() {
|
|
||||||
super.invalidate();
|
|
||||||
itemCapability.invalidate();
|
|
||||||
fluidCapability.invalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, Direction side) {
|
|
||||||
if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
|
|
||||||
return itemCapability.cast();
|
|
||||||
if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
|
|
||||||
return fluidCapability.cast();
|
|
||||||
return super.getCapability(cap, side);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void notifyUpdate() {
|
|
||||||
super.notifyUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void lazyTick() {
|
|
||||||
super.lazyTick();
|
|
||||||
notifyUpdate();
|
|
||||||
if (!level.isClientSide) {
|
|
||||||
updateSpoutput();
|
|
||||||
if (recipeBackupCheck-- > 0)
|
|
||||||
return;
|
|
||||||
recipeBackupCheck = 20;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void updateSpoutput() {
|
|
||||||
BlockState blockState = getBlockState();
|
|
||||||
Direction currentFacing = blockState.getValue(DistillationControllerBlock.FACING);
|
|
||||||
Direction newFacing = Direction.DOWN;
|
|
||||||
for (Direction test : Iterate.horizontalDirections) {
|
|
||||||
boolean canOutputTo = DistillationControllerBlock.canOutputTo(level, worldPosition, test);
|
|
||||||
if (canOutputTo && !disabledSpoutputs.contains(test))
|
|
||||||
newFacing = test;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (preferredSpoutput != null && DistillationControllerBlock.canOutputTo(level, worldPosition, preferredSpoutput)
|
|
||||||
&& preferredSpoutput != Direction.UP)
|
|
||||||
newFacing = preferredSpoutput;
|
|
||||||
|
|
||||||
if (newFacing == currentFacing)
|
|
||||||
return;
|
|
||||||
|
|
||||||
level.setBlockAndUpdate(worldPosition, blockState.setValue(DistillationControllerBlock.FACING, newFacing));
|
|
||||||
|
|
||||||
if (newFacing.getAxis()
|
|
||||||
.isVertical())
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (int slot = 0; slot < outputInventory.getSlots(); slot++) {
|
|
||||||
ItemStack extractItem = outputInventory.extractItem(slot, 64, true);
|
|
||||||
if (extractItem.isEmpty())
|
|
||||||
continue;
|
|
||||||
if (acceptOutputs(ImmutableList.of(extractItem), Collections.emptyList(), true))
|
|
||||||
acceptOutputs(ImmutableList.of(outputInventory.extractItem(slot, 64, false)), Collections.emptyList(),
|
|
||||||
false);
|
|
||||||
}
|
|
||||||
|
|
||||||
IFluidHandler handler = outputTank.getCapability()
|
|
||||||
.orElse(null);
|
|
||||||
for (int slot = 0; slot < handler.getTanks(); slot++) {
|
|
||||||
FluidStack fs = handler.getFluidInTank(slot)
|
|
||||||
.copy();
|
|
||||||
if (fs.isEmpty())
|
|
||||||
continue;
|
|
||||||
if (acceptOutputs(Collections.emptyList(), ImmutableList.of(fs), true)) {
|
|
||||||
handler.drain(fs, IFluidHandler.FluidAction.EXECUTE);
|
|
||||||
acceptOutputs(Collections.emptyList(), ImmutableList.of(fs), false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
notifyChangeOfContents();
|
|
||||||
notifyUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void tick() {
|
|
||||||
super.tick();
|
|
||||||
|
|
||||||
if (level.isClientSide) {
|
|
||||||
tickVisualizedOutputs();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((!spoutputBuffer.isEmpty() || !spoutputFluidBuffer.isEmpty()) && !level.isClientSide)
|
|
||||||
tryClearingSpoutputOverflow();
|
|
||||||
if (!contentsChanged)
|
|
||||||
return;
|
|
||||||
|
|
||||||
contentsChanged = false;
|
|
||||||
getOperator().ifPresent(te -> te.basinChecker.scheduleUpdate());
|
|
||||||
|
|
||||||
for (Direction offset : Iterate.horizontalDirections) {
|
|
||||||
BlockPos toUpdate = worldPosition.above()
|
|
||||||
.relative(offset);
|
|
||||||
BlockState stateToUpdate = level.getBlockState(toUpdate);
|
|
||||||
if (stateToUpdate.getBlock() instanceof DistillationControllerBlock
|
|
||||||
&& stateToUpdate.getValue(DistillationControllerBlock.FACING) == offset.getOpposite()) {
|
|
||||||
BlockEntity te = level.getBlockEntity(toUpdate);
|
|
||||||
if (te instanceof DistillationControllerBlockEntity)
|
|
||||||
((DistillationControllerBlockEntity) te).contentsChanged = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void tryClearingSpoutputOverflow() {
|
|
||||||
BlockState blockState = getBlockState();
|
|
||||||
if (!(blockState.getBlock() instanceof DistillationControllerBlock))
|
|
||||||
return;
|
|
||||||
Direction direction = blockState.getValue(DistillationControllerBlock.FACING);
|
|
||||||
BlockEntity te = level.getBlockEntity(worldPosition.below()
|
|
||||||
.relative(direction));
|
|
||||||
|
|
||||||
FilteringBehaviour filter = null;
|
|
||||||
InvManipulationBehaviour inserter = null;
|
|
||||||
if (te != null) {
|
|
||||||
filter = BlockEntityBehaviour.get(level, te.getBlockPos(), FilteringBehaviour.TYPE);
|
|
||||||
inserter = BlockEntityBehaviour.get(level, te.getBlockPos(), InvManipulationBehaviour.TYPE);
|
|
||||||
}
|
|
||||||
|
|
||||||
IItemHandler targetInv = te == null ? null
|
|
||||||
: te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction.getOpposite())
|
|
||||||
.orElse(inserter == null ? null : inserter.getInventory());
|
|
||||||
|
|
||||||
IFluidHandler targetTank = te == null ? null
|
|
||||||
: te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, direction.getOpposite())
|
|
||||||
.orElse(null);
|
|
||||||
|
|
||||||
boolean update = false;
|
|
||||||
|
|
||||||
for (Iterator<ItemStack> iterator = spoutputBuffer.iterator(); iterator.hasNext();) {
|
|
||||||
ItemStack itemStack = iterator.next();
|
|
||||||
|
|
||||||
if (direction == Direction.DOWN) {
|
|
||||||
Block.popResource(level, worldPosition, itemStack);
|
|
||||||
iterator.remove();
|
|
||||||
update = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (targetInv == null)
|
|
||||||
break;
|
|
||||||
if (!ItemHandlerHelper.insertItemStacked(targetInv, itemStack, true)
|
|
||||||
.isEmpty())
|
|
||||||
continue;
|
|
||||||
// if (filter != null && !filter.test(itemStack))
|
|
||||||
// continue;
|
|
||||||
|
|
||||||
update = true;
|
|
||||||
ItemHandlerHelper.insertItemStacked(targetInv, itemStack.copy(), false);
|
|
||||||
iterator.remove();
|
|
||||||
visualizedOutputItems.add(IntAttached.withZero(itemStack));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Iterator<FluidStack> iterator = spoutputFluidBuffer.iterator(); iterator.hasNext();) {
|
|
||||||
FluidStack fluidStack = iterator.next();
|
|
||||||
|
|
||||||
if (direction == Direction.DOWN) {
|
|
||||||
iterator.remove();
|
|
||||||
update = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (targetTank == null)
|
|
||||||
break;
|
|
||||||
|
|
||||||
for (boolean simulate : Iterate.trueAndFalse) {
|
|
||||||
IFluidHandler.FluidAction action = simulate ? IFluidHandler.FluidAction.SIMULATE : IFluidHandler.FluidAction.EXECUTE;
|
|
||||||
int fill = targetTank instanceof SmartFluidTankBehaviour.InternalFluidHandler
|
|
||||||
? ((SmartFluidTankBehaviour.InternalFluidHandler) targetTank).forceFill(fluidStack.copy(), action)
|
|
||||||
: targetTank.fill(fluidStack.copy(), action);
|
|
||||||
if (fill != fluidStack.getAmount())
|
|
||||||
break;
|
|
||||||
if (simulate)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
update = true;
|
|
||||||
iterator.remove();
|
|
||||||
visualizedOutputFluids.add(IntAttached.withZero(fluidStack));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (update) {
|
|
||||||
notifyChangeOfContents();
|
|
||||||
sendData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getTotalFluidUnits(float partialTicks) {
|
|
||||||
int renderedFluids = 0;
|
|
||||||
float totalUnits = 0;
|
|
||||||
|
|
||||||
for (SmartFluidTankBehaviour behaviour : getTanks()) {
|
|
||||||
if (behaviour == null)
|
|
||||||
continue;
|
|
||||||
for (SmartFluidTankBehaviour.TankSegment tankSegment : behaviour.getTanks()) {
|
|
||||||
if (tankSegment.getRenderedFluid()
|
|
||||||
.isEmpty())
|
|
||||||
continue;
|
|
||||||
float units = tankSegment.getTotalUnits(partialTicks);
|
|
||||||
if (units < 1)
|
|
||||||
continue;
|
|
||||||
totalUnits += units;
|
|
||||||
renderedFluids++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (renderedFluids == 0)
|
|
||||||
return 0;
|
|
||||||
if (totalUnits < 1)
|
|
||||||
return 0;
|
|
||||||
return totalUnits;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Optional<FluidProcessingBlockEntity> getOperator() {
|
|
||||||
if (level == null)
|
|
||||||
return Optional.empty();
|
|
||||||
BlockEntity te = level.getBlockEntity(worldPosition.above());
|
|
||||||
if (te instanceof FluidProcessingBlockEntity)
|
|
||||||
return Optional.of((FluidProcessingBlockEntity) te);
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void notifyChangeOfContents() {
|
|
||||||
contentsChanged = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public SmartInventory getOutputInventory() {
|
|
||||||
return outputInventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean canContinueProcessing() {
|
|
||||||
return spoutputBuffer.isEmpty() && spoutputFluidBuffer.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean acceptOutputs(List<ItemStack> outputItems, List<FluidStack> outputFluids, boolean simulate) {
|
|
||||||
outputInventory.allowInsertion();
|
|
||||||
outputTank.allowInsertion();
|
|
||||||
boolean acceptOutputsInner = acceptOutputsInner(outputItems, outputFluids, simulate);
|
|
||||||
outputInventory.forbidInsertion();
|
|
||||||
outputTank.forbidInsertion();
|
|
||||||
return acceptOutputsInner;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean acceptOutputsInner(List<ItemStack> outputItems, List<FluidStack> outputFluids, boolean simulate) {
|
|
||||||
BlockState blockState = getBlockState();
|
|
||||||
if (!(blockState.getBlock() instanceof DistillationControllerBlock))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
Direction direction = blockState.getValue(DistillationControllerBlock.FACING);
|
|
||||||
if (direction != Direction.DOWN) {
|
|
||||||
|
|
||||||
BlockEntity te = level.getBlockEntity(worldPosition.below()
|
|
||||||
.relative(direction));
|
|
||||||
|
|
||||||
InvManipulationBehaviour inserter =
|
|
||||||
te == null ? null : BlockEntityBehaviour.get(level, te.getBlockPos(), InvManipulationBehaviour.TYPE);
|
|
||||||
IItemHandler targetInv = te == null ? null
|
|
||||||
: te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction.getOpposite())
|
|
||||||
.orElse(inserter == null ? null : inserter.getInventory());
|
|
||||||
IFluidHandler targetTank = te == null ? null
|
|
||||||
: te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, direction.getOpposite())
|
|
||||||
.orElse(null);
|
|
||||||
boolean externalTankNotPresent = targetTank == null;
|
|
||||||
|
|
||||||
if (!outputItems.isEmpty() && targetInv == null)
|
|
||||||
return false;
|
|
||||||
if (!outputFluids.isEmpty() && externalTankNotPresent) {
|
|
||||||
// Special case - fluid outputs but output only accepts items
|
|
||||||
targetTank = outputTank.getCapability()
|
|
||||||
.orElse(null);
|
|
||||||
if (targetTank == null)
|
|
||||||
return false;
|
|
||||||
if (!acceptFluidOutputsIntoBasin(outputFluids, simulate, targetTank))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (simulate)
|
|
||||||
return true;
|
|
||||||
for (ItemStack itemStack : outputItems) {
|
|
||||||
if (itemStack.hasCraftingRemainingItem() && itemStack.getCraftingRemainingItem()
|
|
||||||
.sameItem(itemStack))
|
|
||||||
continue;
|
|
||||||
spoutputBuffer.add(itemStack.copy());
|
|
||||||
}
|
|
||||||
if (!externalTankNotPresent)
|
|
||||||
for (FluidStack fluidStack : outputFluids)
|
|
||||||
spoutputFluidBuffer.add(fluidStack.copy());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
IItemHandler targetInv = outputInventory;
|
|
||||||
IFluidHandler targetTank = outputTank.getCapability()
|
|
||||||
.orElse(null);
|
|
||||||
|
|
||||||
if (targetInv == null && !outputItems.isEmpty())
|
|
||||||
return false;
|
|
||||||
if (!acceptItemOutputsIntoBasin(outputItems, simulate, targetInv))
|
|
||||||
return false;
|
|
||||||
if (outputFluids.isEmpty())
|
|
||||||
return true;
|
|
||||||
if (targetTank == null)
|
|
||||||
return false;
|
|
||||||
if (!acceptFluidOutputsIntoBasin(outputFluids, simulate, targetTank))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean acceptFluidOutputsIntoBasin(List<FluidStack> outputFluids, boolean simulate,
|
|
||||||
IFluidHandler targetTank) {
|
|
||||||
for (FluidStack fluidStack : outputFluids) {
|
|
||||||
IFluidHandler.FluidAction action = simulate ? IFluidHandler.FluidAction.SIMULATE : IFluidHandler.FluidAction.EXECUTE;
|
|
||||||
int fill = targetTank instanceof SmartFluidTankBehaviour.InternalFluidHandler
|
|
||||||
? ((SmartFluidTankBehaviour.InternalFluidHandler) targetTank).forceFill(fluidStack.copy(), action)
|
|
||||||
: targetTank.fill(fluidStack.copy(), action);
|
|
||||||
if (fill != fluidStack.getAmount())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean acceptItemOutputsIntoBasin(List<ItemStack> outputItems, boolean simulate, IItemHandler targetInv) {
|
|
||||||
for (ItemStack itemStack : outputItems) {
|
|
||||||
// Catalyst items are never consumed
|
|
||||||
if (itemStack.hasCraftingRemainingItem() && itemStack.getCraftingRemainingItem()
|
|
||||||
.sameItem(itemStack))
|
|
||||||
continue;
|
|
||||||
if (!ItemHandlerHelper.insertItemStacked(targetInv, itemStack.copy(), simulate)
|
|
||||||
.isEmpty())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void readOnlyItems(CompoundTag compound) {
|
|
||||||
|
|
||||||
outputInventory.deserializeNBT(compound.getCompound("OutputItems"));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BlazeBurnerBlock.HeatLevel getHeatLevelOf(BlockState state) {
|
|
||||||
if (state.hasProperty(BlazeBurnerBlock.HEAT_LEVEL))
|
|
||||||
return state.getValue(BlazeBurnerBlock.HEAT_LEVEL);
|
|
||||||
return AllTags.AllBlockTags.PASSIVE_BOILER_HEATERS.matches(state) ? BlazeBurnerBlock.HeatLevel.SMOULDERING : BlazeBurnerBlock.HeatLevel.NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Couple<SmartFluidTankBehaviour> getTanks() {
|
|
||||||
return tanks;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// client things
|
|
||||||
|
|
||||||
private void tickVisualizedOutputs() {
|
|
||||||
visualizedOutputFluids.forEach(IntAttached::decrement);
|
|
||||||
visualizedOutputItems.forEach(IntAttached::decrement);
|
|
||||||
visualizedOutputFluids.removeIf(IntAttached::isOrBelowZero);
|
|
||||||
visualizedOutputItems.removeIf(IntAttached::isOrBelowZero);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean addToGoggleTooltip(List<Component> tooltip, boolean isPlayerSneaking) {
|
|
||||||
return containedFluidTooltip(tooltip, isPlayerSneaking,
|
|
||||||
getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY));
|
|
||||||
}
|
|
||||||
|
|
||||||
class BasinValueBox extends ValueBoxTransform.Sided {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Vec3 getSouthLocation() {
|
|
||||||
return VecHelper.voxelSpace(8, 12, 15.75);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isSideActive(BlockState state, Direction direction) {
|
|
||||||
return direction.getAxis()
|
|
||||||
.isHorizontal();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
package com.drmangotea.tfmg.content.machines.oil_processing.distillation.backup;
|
|
||||||
|
|
||||||
|
|
||||||
import com.drmangotea.tfmg.registry.TFMGBlockEntities;
|
|
||||||
import com.simibubi.create.AllBlocks;
|
|
||||||
import com.simibubi.create.AllShapes;
|
|
||||||
import com.simibubi.create.foundation.block.IBE;
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.core.Direction;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import net.minecraft.world.level.BlockGetter;
|
|
||||||
import net.minecraft.world.level.LevelReader;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
|
||||||
import net.minecraft.world.level.pathfinder.PathComputationType;
|
|
||||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
|
||||||
import net.minecraft.world.phys.shapes.EntityCollisionContext;
|
|
||||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
|
||||||
|
|
||||||
public class DistillationOutputBlock extends Block implements IBE<DistillationOutputBlockEntity> {
|
|
||||||
|
|
||||||
public DistillationOutputBlock(Properties properties) {
|
|
||||||
super(properties);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canSurvive(BlockState state, LevelReader worldIn, BlockPos pos) {
|
|
||||||
return !AllBlocks.BASIN.has(worldIn.getBlockState(pos.below()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) {
|
|
||||||
if (context instanceof EntityCollisionContext
|
|
||||||
&& ((EntityCollisionContext) context).getEntity() instanceof Player)
|
|
||||||
return AllShapes.CASING_14PX.get(Direction.DOWN);
|
|
||||||
|
|
||||||
return AllShapes.MECHANICAL_PROCESSOR_SHAPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<DistillationOutputBlockEntity> getBlockEntityClass() {
|
|
||||||
return DistillationOutputBlockEntity.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BlockEntityType<? extends DistillationOutputBlockEntity> getBlockEntityType() {
|
|
||||||
return TFMGBlockEntities.CAST_IRON_DISTILLATION_OUTPUT.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,156 +0,0 @@
|
|||||||
package com.drmangotea.tfmg.content.machines.oil_processing.distillation.backup;
|
|
||||||
|
|
||||||
|
|
||||||
import com.drmangotea.tfmg.recipes.distillation.ItemlessRecipe;
|
|
||||||
import com.simibubi.create.content.kinetics.base.KineticBlockEntity;
|
|
||||||
import com.simibubi.create.foundation.advancement.CreateAdvancement;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
|
|
||||||
import com.simibubi.create.foundation.blockEntity.behaviour.simple.DeferralBehaviour;
|
|
||||||
import com.simibubi.create.foundation.recipe.RecipeFinder;
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.world.Container;
|
|
||||||
import net.minecraft.world.item.crafting.Recipe;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public abstract class FluidProcessingBlockEntity extends KineticBlockEntity {
|
|
||||||
|
|
||||||
public DeferralBehaviour basinChecker;
|
|
||||||
public boolean basinRemoved;
|
|
||||||
protected Recipe<?> currentRecipe;
|
|
||||||
|
|
||||||
public FluidProcessingBlockEntity(BlockEntityType<?> typeIn, BlockPos pos, BlockState state) {
|
|
||||||
super(typeIn, pos, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
|
|
||||||
super.addBehaviours(behaviours);
|
|
||||||
basinChecker = new DeferralBehaviour(this, this::updateController);
|
|
||||||
behaviours.add(basinChecker);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSpeedChanged(float prevSpeed) {
|
|
||||||
super.onSpeedChanged(prevSpeed);
|
|
||||||
if (getSpeed() == 0)
|
|
||||||
basinRemoved = true;
|
|
||||||
basinRemoved = false;
|
|
||||||
basinChecker.scheduleUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void tick() {
|
|
||||||
if (basinRemoved) {
|
|
||||||
basinRemoved = false;
|
|
||||||
onBasinRemoved();
|
|
||||||
sendData();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
super.tick();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean updateController() {
|
|
||||||
|
|
||||||
|
|
||||||
if (isRunning())
|
|
||||||
return true;
|
|
||||||
if (level == null || level.isClientSide)
|
|
||||||
return true;
|
|
||||||
Optional<DistillationControllerBlockEntity> basin = getController();
|
|
||||||
if (!basin.filter(DistillationControllerBlockEntity::canContinueProcessing)
|
|
||||||
.isPresent())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
List<Recipe<?>> recipes = getMatchingRecipes();
|
|
||||||
if (recipes.isEmpty())
|
|
||||||
return true;
|
|
||||||
currentRecipe = recipes.get(0);
|
|
||||||
// if(currentRecipe instanceof DistillationRecipe) {
|
|
||||||
// if (((DistillationRecipe) currentRecipe).getInputFluid().getMatchingFluidStacks().get(0).getFluid() != TFMGFluids.HEAVY_OIL.get()) {
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
startProcessing();
|
|
||||||
sendData();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract boolean isRunning();
|
|
||||||
|
|
||||||
public void startProcessing() {}
|
|
||||||
|
|
||||||
public boolean continueWithPreviousRecipe() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected <C extends Container> boolean matchItemlessRecipe(Recipe<C> recipe) {
|
|
||||||
if (recipe == null)
|
|
||||||
return false;
|
|
||||||
Optional<DistillationControllerBlockEntity> basin = getController();
|
|
||||||
if (!basin.isPresent())
|
|
||||||
return false;
|
|
||||||
return ItemlessRecipe.match(basin.get(), recipe);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void applyItemlessRecipe() {
|
|
||||||
if (currentRecipe == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Optional<DistillationControllerBlockEntity> optionalBasin = getController();
|
|
||||||
if (!optionalBasin.isPresent())
|
|
||||||
return;
|
|
||||||
DistillationControllerBlockEntity basin = optionalBasin.get();
|
|
||||||
boolean wasEmpty = basin.canContinueProcessing();
|
|
||||||
if (!ItemlessRecipe.apply(basin, currentRecipe))
|
|
||||||
return;
|
|
||||||
getProcessedRecipeTrigger().ifPresent(this::award);
|
|
||||||
basin.inputTank.sendDataImmediately();
|
|
||||||
|
|
||||||
// Continue mixing
|
|
||||||
if (wasEmpty && matchItemlessRecipe(currentRecipe)) {
|
|
||||||
continueWithPreviousRecipe();
|
|
||||||
sendData();
|
|
||||||
}
|
|
||||||
|
|
||||||
basin.notifyChangeOfContents();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected List<Recipe<?>> getMatchingRecipes() {
|
|
||||||
|
|
||||||
|
|
||||||
List<Recipe<?>> list = RecipeFinder.get(getRecipeCacheKey(), level, this::matchStaticFilters);
|
|
||||||
return list.stream()
|
|
||||||
.filter(this::matchItemlessRecipe)
|
|
||||||
.sorted((r1, r2) -> r2.getIngredients()
|
|
||||||
.size()
|
|
||||||
- r1.getIngredients()
|
|
||||||
.size())
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract void onBasinRemoved();
|
|
||||||
|
|
||||||
protected Optional<DistillationControllerBlockEntity> getController() {
|
|
||||||
if (level == null)
|
|
||||||
return Optional.empty();
|
|
||||||
BlockEntity basinTE = level.getBlockEntity(worldPosition.below(1));
|
|
||||||
if (!(basinTE instanceof DistillationControllerBlockEntity))
|
|
||||||
return Optional.empty();
|
|
||||||
return Optional.of((DistillationControllerBlockEntity) basinTE);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Optional<CreateAdvancement> getProcessedRecipeTrigger() {
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract <C extends Container> boolean matchStaticFilters(Recipe<C> recipe);
|
|
||||||
|
|
||||||
protected abstract Object getRecipeCacheKey();
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user