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

CyclopsMC / IntegratedDynamics / 24034486947

06 Apr 2026 01:51PM UTC coverage: 53.645% (-0.08%) from 53.721%
24034486947

push

github

rubensworks
Update to MC 26.1.1

3052 of 8931 branches covered (34.17%)

Branch coverage included in aggregate %.

18680 of 31580 relevant lines covered (59.15%)

3.07 hits per line

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

70.0
/src/main/java/org/cyclops/integrateddynamics/blockentity/BlockEntityCoalGenerator.java
1
package org.cyclops.integrateddynamics.blockentity;
2

3
import net.minecraft.core.BlockPos;
4
import net.minecraft.network.chat.Component;
5
import net.minecraft.world.MenuProvider;
6
import net.minecraft.world.entity.player.Inventory;
7
import net.minecraft.world.entity.player.Player;
8
import net.minecraft.world.inventory.AbstractContainerMenu;
9
import net.minecraft.world.item.ItemStack;
10
import net.minecraft.world.item.ItemStackTemplate;
11
import net.minecraft.world.item.crafting.RecipeType;
12
import net.minecraft.world.level.Level;
13
import net.minecraft.world.level.block.entity.BlockEntityType;
14
import net.minecraft.world.level.block.state.BlockState;
15
import net.neoforged.neoforge.server.ServerLifecycleHooks;
16
import net.neoforged.neoforge.transfer.energy.EnergyHandler;
17
import net.neoforged.neoforge.transfer.energy.SimpleEnergyHandler;
18
import org.cyclops.cyclopscore.datastructure.DataSlotSupplied;
19
import org.cyclops.cyclopscore.datastructure.DimPos;
20
import org.cyclops.cyclopscore.helper.IModHelpers;
21
import org.cyclops.cyclopscore.persist.nbt.NBTPersist;
22
import org.cyclops.integrateddynamics.Capabilities;
23
import org.cyclops.integrateddynamics.RegistryEntries;
24
import org.cyclops.integrateddynamics.api.network.IEnergyNetwork;
25
import org.cyclops.integrateddynamics.api.network.INetworkElement;
26
import org.cyclops.integrateddynamics.api.network.INetworkElementProvider;
27
import org.cyclops.integrateddynamics.api.network.IPositionedAddonsNetwork;
28
import org.cyclops.integrateddynamics.block.BlockCoalGenerator;
29
import org.cyclops.integrateddynamics.capability.networkelementprovider.NetworkElementProviderSingleton;
30
import org.cyclops.integrateddynamics.core.blockentity.BlockEntityCableConnectableInventory;
31
import org.cyclops.integrateddynamics.core.helper.EnergyHelpers;
32
import org.cyclops.integrateddynamics.core.helper.NetworkHelpers;
33
import org.cyclops.integrateddynamics.inventory.container.ContainerCoalGenerator;
34
import org.cyclops.integrateddynamics.network.CoalGeneratorNetworkElement;
35

36
import javax.annotation.Nullable;
37
import java.util.Optional;
38
import java.util.function.Supplier;
39

40
/**
41
 * A part entity for the coal energy generator.
42
 * @author rubensworks
43
 */
44
public class BlockEntityCoalGenerator extends BlockEntityCableConnectableInventory implements MenuProvider {
45

46
    public static final int INVENTORY_SIZE = 1;
47
    public static final int MAX_PROGRESS = 13;
48
    public static final int ENERGY_PER_TICK = 20;
49
    public static final int SLOT_FUEL = 0;
50

51
    @NBTPersist
52
    private int currentlyBurningMax;
53
    @NBTPersist
54
    private int currentlyBurning;
55
    private final EnergyHandler energyHandler;
56

57
    public BlockEntityCoalGenerator(BlockPos blockPos, BlockState blockState) {
58
        super(RegistryEntries.BLOCK_ENTITY_COAL_GENERATOR.get(), blockPos, blockState, BlockEntityCoalGenerator.INVENTORY_SIZE, 64);
9✔
59
        this.energyHandler = new SimpleEnergyHandler(0);
6✔
60
    }
1✔
61

62
    public static class CapabilityRegistrar extends BlockEntityCableConnectableInventory.CapabilityRegistrar<BlockEntityCoalGenerator> {
63
        public CapabilityRegistrar(Supplier<BlockEntityType<? extends BlockEntityCoalGenerator>> blockEntityType) {
64
            super(blockEntityType);
3✔
65
        }
1✔
66

67
        @Override
68
        public void populate() {
69
            super.populate();
2✔
70

71
            add(
4✔
72
                    Capabilities.NetworkElementProvider.BLOCK,
73
                    (blockEntity, context) -> blockEntity.getNetworkElementProvider()
3✔
74
            );
75
            add(
4✔
76
                    net.neoforged.neoforge.capabilities.Capabilities.Energy.BLOCK,
77
                    (blockEntity, context) -> blockEntity.getEnergyHandler()
×
78
            );
79
        }
1✔
80
    }
81

82
    @Override
83
    public INetworkElementProvider getNetworkElementProvider() {
84
        return new NetworkElementProviderSingleton() {
13✔
85
            @Override
86
            public INetworkElement createNetworkElement(Level world, BlockPos blockPos) {
87
                return new CoalGeneratorNetworkElement(DimPos.of(world, blockPos));
7✔
88
            }
89
        };
90
    }
91

92
    public EnergyHandler getEnergyHandler() {
93
        return energyHandler;
×
94
    }
95

96
    public Optional<IEnergyNetwork> getEnergyNetwork() {
97
        return NetworkHelpers.getEnergyNetwork(getNetwork());
4✔
98
    }
99

100
    public void updateBlockState() {
101
        boolean wasBurning = getLevel().getBlockState(getBlockPos()).getValue(BlockCoalGenerator.LIT);
10✔
102
        boolean isBurning = isBurning();
3✔
103
        if (isBurning != wasBurning) {
3!
104
            getLevel().setBlockAndUpdate(getBlockPos(),
7✔
105
                    getLevel().getBlockState(getBlockPos()).setValue(BlockCoalGenerator.LIT, isBurning));
9✔
106
        }
107
    }
1✔
108

109
    public int getProgress() {
110
        float current = currentlyBurning;
×
111
        float max = currentlyBurningMax;
×
112
        if (max == 0) {
×
113
            return -1;
×
114
        }
115
        return Math.round((current / max) * (float) MAX_PROGRESS);
×
116
    }
117

118
    public boolean isBurning() {
119
        return currentlyBurning < currentlyBurningMax;
9✔
120
    }
121

122
    public boolean canAddEnergy(int energy) {
123
        IEnergyNetwork network = getEnergyNetwork().orElse(null);
6✔
124
        if(network != null && network.getChannel(IPositionedAddonsNetwork.DEFAULT_CHANNEL).insert((long) energy, true) == 0) {
15!
125
            return true;
2✔
126
        }
127
        return addEnergyFe(energy, true) == energy;
×
128
    }
129

130
    protected int addEnergy(int energy) {
131
        IEnergyNetwork network = getEnergyNetwork().orElse(null);
6✔
132
        int toFill = energy;
2✔
133
        if(network != null) {
2!
134
            toFill = IModHelpers.get().getBaseHelpers().castSafe(network.getChannel(IPositionedAddonsNetwork.DEFAULT_CHANNEL).insert((long) toFill, false));
14✔
135
        }
136
        if(toFill > 0) {
2!
137
            toFill -= addEnergyFe(toFill, false);
×
138
        }
139
        return energy - toFill;
4✔
140
    }
141

142
    protected int addEnergyFe(int energy, boolean simulate) {
143
        return EnergyHelpers.fillNeigbours(getLevel(), getBlockPos(), energy, simulate);
×
144
    }
145

146
    public static int getFuelTime(ItemStack itemStack) {
147
        return itemStack.getBurnTime(RecipeType.SMELTING, ServerLifecycleHooks.getCurrentServer().fuelValues());
6✔
148
    }
149

150
    @Override
151
    public Component getDisplayName() {
152
        return Component.translatable("block.integrateddynamics.coal_generator");
×
153
    }
154

155
    @Nullable
156
    @Override
157
    public AbstractContainerMenu createMenu(int id, Inventory playerInventory, Player playerEntity) {
158
        return new ContainerCoalGenerator(id, playerInventory, this.getInventory(), new DataSlotSupplied(this::getProgress));
×
159
    }
160

161
    public static class Ticker extends BlockEntityCableConnectableInventory.Ticker<BlockEntityCoalGenerator> {
3✔
162
        @Override
163
        protected void update(Level level, BlockPos pos, BlockState blockState, BlockEntityCoalGenerator blockEntity) {
164
            super.update(level, pos, blockState, blockEntity);
6✔
165

166
            if((!blockEntity.getInventory().getItem(SLOT_FUEL).isEmpty() || blockEntity.isBurning()) && blockEntity.canAddEnergy(BlockEntityCoalGeneratorConfig.energyPerTick)) {
13!
167
                if (blockEntity.isBurning()) {
3✔
168
                    if (blockEntity.currentlyBurning++ >= blockEntity.currentlyBurningMax) {
10!
169
                        blockEntity.currentlyBurning = 0;
×
170
                        blockEntity.currentlyBurningMax = 0;
×
171
                    }
172
                    int toFill = BlockEntityCoalGeneratorConfig.energyPerTick;
2✔
173
                    blockEntity.addEnergy(toFill);
4✔
174
                    blockEntity.setChanged();
2✔
175
                }
176
                if (!blockEntity.isBurning()) {
3✔
177
                    ItemStack fuel;
178
                    if (getFuelTime(blockEntity.getInventory().getItem(SLOT_FUEL)) > 0
7!
179
                            && !(fuel = blockEntity.getInventory().removeItem(SLOT_FUEL, 1)).isEmpty()) {
8!
180
                        if(blockEntity.getInventory().getItem(SLOT_FUEL).isEmpty()) {
6!
181
                            ItemStackTemplate remainder = fuel.getItem().getCraftingRemainder(fuel);
5✔
182
                            if (remainder != null) {
2!
183
                                blockEntity.getInventory().setItem(SLOT_FUEL, remainder.create());
×
184
                            }
185
                        }
186
                        blockEntity.currentlyBurningMax = getFuelTime(fuel);
4✔
187
                        blockEntity.currentlyBurning = 0;
3✔
188
                        blockEntity.setChanged();
2✔
189
                    }
190
                    blockEntity.updateBlockState();
2✔
191
                }
192
            }
193
        }
1✔
194
    }
195
}
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