• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

CyclopsMC / IntegratedDynamics / 16552051255

27 Jul 2025 01:58PM UTC coverage: 53.206% (+8.0%) from 45.161%
16552051255

push

github

rubensworks
Resolve minor TODOs

2888 of 8740 branches covered (33.04%)

Branch coverage included in aggregate %.

17341 of 29280 relevant lines covered (59.22%)

3.08 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

13.64
/src/main/java/org/cyclops/integrateddynamics/block/BlockDryingBasin.java
1
package org.cyclops.integrateddynamics.block;
2

3
import com.mojang.serialization.MapCodec;
4
import net.minecraft.core.BlockPos;
5
import net.minecraft.server.level.ServerLevel;
6
import net.minecraft.world.Containers;
7
import net.minecraft.world.InteractionResult;
8
import net.minecraft.world.entity.player.Player;
9
import net.minecraft.world.item.ItemStack;
10
import net.minecraft.world.level.BlockGetter;
11
import net.minecraft.world.level.Level;
12
import net.minecraft.world.level.block.BaseEntityBlock;
13
import net.minecraft.world.level.block.entity.BlockEntity;
14
import net.minecraft.world.level.block.entity.BlockEntityTicker;
15
import net.minecraft.world.level.block.entity.BlockEntityType;
16
import net.minecraft.world.level.block.state.BlockState;
17
import net.minecraft.world.phys.BlockHitResult;
18
import net.minecraft.world.phys.shapes.BooleanOp;
19
import net.minecraft.world.phys.shapes.CollisionContext;
20
import net.minecraft.world.phys.shapes.Shapes;
21
import net.minecraft.world.phys.shapes.VoxelShape;
22
import net.neoforged.neoforge.fluids.FluidActionResult;
23
import net.neoforged.neoforge.fluids.FluidUtil;
24
import net.neoforged.neoforge.fluids.capability.IFluidHandler;
25
import org.cyclops.cyclopscore.block.BlockWithEntityGui;
26
import org.cyclops.cyclopscore.fluid.SingleUseTank;
27
import org.cyclops.cyclopscore.helper.IModHelpers;
28
import org.cyclops.integrateddynamics.RegistryEntries;
29
import org.cyclops.integrateddynamics.blockentity.BlockEntityDryingBasin;
30

31
import javax.annotation.Nullable;
32

33
/**
34
 * A block for drying stuff.
35
 * @author rubensworks
36
 */
37
public class BlockDryingBasin extends BlockWithEntityGui {
38

39
    public static final MapCodec<BlockDryingBasin> CODEC = simpleCodec(BlockDryingBasin::new);
3✔
40
    private static final VoxelShape SHAPE_RAYTRACE = box(2.0D, 4.0D, 2.0D, 14.0D, 16.0D, 14.0D);
8✔
41
    private static final VoxelShape SHAPE = Shapes.join(Shapes.block(), Shapes.or(
12✔
42
            box(0.0D, 0.0D, 4.0D, 16.0D, 3.0D, 12.0D),
11✔
43
            new VoxelShape[]{
44
                    box(4.0D, 0.0D, 0.0D, 12.0D, 3.0D, 16.0D),
10✔
45
                    box(2.0D, 0.0D, 2.0D, 14.0D, 3.0D, 14.0D),
6✔
46
                    SHAPE_RAYTRACE
47
            }), BooleanOp.ONLY_FIRST);
48

49
    public BlockDryingBasin(Properties properties) {
50
        super(properties, BlockEntityDryingBasin::new);
4✔
51
    }
1✔
52

53
    @Override
54
    protected MapCodec<? extends BaseEntityBlock> codec() {
55
        return CODEC;
×
56
    }
57

58
    @Override
59
    @Nullable
60
    public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState blockState, BlockEntityType<T> blockEntityType) {
61
        return createTickerHelper(blockEntityType, RegistryEntries.BLOCK_ENTITY_DRYING_BASIN.get(), level.isClientSide ? new BlockEntityDryingBasin.TickerClient() : new BlockEntityDryingBasin.TickerServer());
12!
62
    }
63

64
    @Override
65
    public InteractionResult useWithoutItem(BlockState blockState, Level world, BlockPos blockPos, Player player,
66
                                             BlockHitResult rayTraceResult) {
67
        return IModHelpers.get().getBlockEntityHelpers().get(world, blockPos, BlockEntityDryingBasin.class)
×
68
                .map(tile -> {
×
69
                    ItemStack itemStack = player.getInventory().getSelectedItem();
×
70
                    IFluidHandler itemFluidHandler = FluidUtil.getFluidHandler(itemStack).orElse(null);
×
71
                    SingleUseTank tank = tile.getTank();
×
72
                    ItemStack tileStack = tile.getInventory().getItem(0);
×
73

74
                    if (itemStack.isEmpty() && !tileStack.isEmpty()) {
×
75
                        player.getInventory().setItem(player.getInventory().getSelectedSlot(), tileStack);
×
76
                        tile.getInventory().setItem(0, ItemStack.EMPTY);
×
77
                        tile.sendUpdate();
×
78
                        return InteractionResult.SUCCESS;
×
79
                    } else if(player.getInventory().add(tileStack)){
×
80
                        tile.getInventory().setItem(0, ItemStack.EMPTY);
×
81
                        tile.sendUpdate();
×
82
                        return InteractionResult.SUCCESS;
×
83
                    } else if (itemFluidHandler != null && !tank.isFull()
×
84
                            && !itemFluidHandler.drain(Integer.MAX_VALUE, IFluidHandler.FluidAction.SIMULATE).isEmpty()) {
×
85
                        FluidActionResult fluidAction = FluidUtil.tryEmptyContainer(itemStack, tank, Integer.MAX_VALUE, player, true);
×
86
                        if (fluidAction.isSuccess()) {
×
87
                            ItemStack newItemStack = fluidAction.getResult();
×
88
                            IModHelpers.get().getInventoryHelpers().tryReAddToStack(player, itemStack, newItemStack, player.getUsedItemHand());
×
89
                            tile.sendUpdate();
×
90
                        }
91
                        return InteractionResult.SUCCESS;
×
92
                    } else if (itemFluidHandler != null && !tank.isEmpty() &&
×
93
                            itemFluidHandler.fill(tank.getFluid(), IFluidHandler.FluidAction.SIMULATE) > 0) {
×
94
                        FluidActionResult fluidAction = FluidUtil.tryFillContainer(itemStack, tank, Integer.MAX_VALUE, player, true);
×
95
                        if (fluidAction.isSuccess()) {
×
96
                            ItemStack newItemStack = fluidAction.getResult();
×
97
                            IModHelpers.get().getInventoryHelpers().tryReAddToStack(player, itemStack, newItemStack, player.getUsedItemHand());
×
98
                        }
99
                        return InteractionResult.SUCCESS;
×
100
                    } else if (!itemStack.isEmpty() && tileStack.isEmpty()) {
×
101
                        tile.getInventory().setItem(0, itemStack.split(1));
×
102
                        if(itemStack.getCount() <= 0) player.getInventory().setItem(player.getInventory().getSelectedSlot(), ItemStack.EMPTY);
×
103
                        tile.sendUpdate();
×
104
                        return InteractionResult.SUCCESS;
×
105
                    }
106
                    return InteractionResult.PASS;
×
107
                })
108
                .orElse(InteractionResult.PASS);
×
109
    }
110

111
    @SuppressWarnings("deprecation")
112
    @Override
113
    public boolean hasAnalogOutputSignal(BlockState blockState) {
114
        return true;
2✔
115
    }
116

117
    @SuppressWarnings("deprecation")
118
    @Override
119
    public int getAnalogOutputSignal(BlockState blockState, Level world, BlockPos blockPos) {
120
        return IModHelpers.get().getBlockEntityHelpers().get(world, blockPos, BlockEntityDryingBasin.class)
×
121
                .map(tile -> tile.getInventory().getItem(0) != null ? 15 : 0)
×
122
                .orElse(0);
×
123
    }
124

125
    @Override
126
    public VoxelShape getShape(BlockState blockState, BlockGetter world, BlockPos blockPos, CollisionContext selectionContext) {
127
        return SHAPE;
2✔
128
    }
129

130
    @Override
131
    public VoxelShape getInteractionShape(BlockState blockState, BlockGetter world, BlockPos blockPos) {
132
        return SHAPE_RAYTRACE;
×
133
    }
134

135
    @Override
136
    protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) {
137
        super.affectNeighborsAfterRemoval(state, level, pos, movedByPiston);
×
138
        Containers.updateNeighboursAfterDestroy(state, level, pos);
×
139
    }
×
140
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc