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

CyclopsMC / IntegratedDynamics / 18595223322

17 Oct 2025 02:07PM UTC coverage: 53.038% (+0.01%) from 53.024%
18595223322

push

github

rubensworks
Fix broken block-update-based aspect invalidation

Was caused by 9bdd91138

2875 of 8772 branches covered (32.77%)

Branch coverage included in aggregate %.

17335 of 29333 relevant lines covered (59.1%)

3.07 hits per line

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

4.11
/src/main/java/org/cyclops/integrateddynamics/part/PartTypePanelLightDynamic.java
1
package org.cyclops.integrateddynamics.part;
2

3
import net.minecraft.core.BlockPos;
4
import net.minecraft.core.Direction;
5
import net.minecraft.network.chat.Component;
6
import net.minecraft.world.level.BlockGetter;
7
import net.minecraft.world.level.Level;
8
import net.minecraft.world.level.block.Block;
9
import net.minecraft.world.level.block.Blocks;
10
import net.minecraft.world.level.block.state.BlockBehaviour;
11
import org.cyclops.cyclopscore.config.extendedconfig.BlockConfigCommon;
12
import org.cyclops.cyclopscore.helper.IModHelpers;
13
import org.cyclops.cyclopscore.helper.IModHelpersNeoForge;
14
import org.cyclops.integrateddynamics.Capabilities;
15
import org.cyclops.integrateddynamics.GeneralConfig;
16
import org.cyclops.integrateddynamics.RegistryEntries;
17
import org.cyclops.integrateddynamics.api.evaluate.InvalidValueTypeException;
18
import org.cyclops.integrateddynamics.api.evaluate.variable.IValue;
19
import org.cyclops.integrateddynamics.api.network.INetwork;
20
import org.cyclops.integrateddynamics.api.network.IPartNetwork;
21
import org.cyclops.integrateddynamics.api.part.PartTarget;
22
import org.cyclops.integrateddynamics.block.BlockInvisibleLight;
23
import org.cyclops.integrateddynamics.block.BlockInvisibleLightConfig;
24
import org.cyclops.integrateddynamics.core.block.IgnoredBlockStatus;
25
import org.cyclops.integrateddynamics.core.evaluate.variable.ValueTypeLightLevels;
26
import org.cyclops.integrateddynamics.core.helper.L10NValues;
27
import org.cyclops.integrateddynamics.core.part.panel.PartTypePanelVariableDriven;
28

29
import javax.annotation.Nullable;
30

31
/**
32
 * A part that can display variables.
33
 * @author rubensworks
34
 */
35
public class PartTypePanelLightDynamic extends PartTypePanelVariableDriven<PartTypePanelLightDynamic, PartTypePanelLightDynamic.State> {
36

37
    public PartTypePanelLightDynamic(String name) {
38
        super(name);
3✔
39
    }
1✔
40

41
    @Override
42
    public boolean supportsOffsets() {
43
        return false;
×
44
    }
45

46
    @Override
47
    protected Block createBlock(BlockConfigCommon<?> blockConfig, BlockBehaviour.Properties properties) {
48
        return new IgnoredBlockStatus(properties);
5✔
49
    }
50

51
    @Override
52
    public PartTypePanelLightDynamic.State constructDefaultState() {
53
        return new PartTypePanelLightDynamic.State();
×
54
    }
55

56
    @Override
57
    public int getConsumptionRate(State state) {
58
        return GeneralConfig.panelLightDynamicBaseConsumption;
×
59
    }
60

61
    @Override
62
    protected IgnoredBlockStatus.Status getStatus(PartTypePanelVariableDriven.State state) {
63
        IgnoredBlockStatus.Status status = super.getStatus(state);
×
64
        if (status == IgnoredBlockStatus.Status.ACTIVE && state.getDisplayValue() != null
×
65
                && getLightLevel((State) state, state.getDisplayValue()) == 0) {
×
66
            return IgnoredBlockStatus.Status.INACTIVE;
×
67
        }
68
        return status;
×
69
    }
70

71
    @Override
72
    protected void onValueChanged(INetwork network, IPartNetwork partNetwork, PartTarget target, State state, IValue lastValue, IValue newValue) {
73
        super.onValueChanged(network, partNetwork, target, state, lastValue, newValue);
×
74
        int lightLevel = 0;
×
75
        if(newValue != null) {
×
76
            lightLevel = getLightLevel(state, newValue);
×
77
        }
78
        setLightLevel(target, lightLevel);
×
79
        state.sendUpdate();
×
80
    }
×
81

82
    protected int getLightLevel(State state, IValue value) {
83
        try {
84
            return ValueTypeLightLevels.REGISTRY.getLightLevel(value);
×
85
        } catch (InvalidValueTypeException e) {
×
86
            state.addGlobalError(Component.translatable(L10NValues.PART_PANEL_ERROR_INVALIDTYPE,
×
87
                    Component.translatable(value.getType().getTranslationKey())));
×
88
        }
89
        return 0;
×
90
    }
91

92
    @Override
93
    public void onNetworkRemoval(INetwork network, IPartNetwork partNetwork, PartTarget target, State state) {
94
        super.onNetworkRemoval(network, partNetwork, target, state);
×
95
        PartTypePanelLightDynamic.setLightLevel(target, 0);
×
96
    }
×
97

98
    @Override
99
    public void onPostRemoved(INetwork network, IPartNetwork partNetwork, PartTarget target, State state) {
100
        super.onPostRemoved(network, partNetwork, target, state);
×
101
        setLightLevel(target, 0);
×
102
    }
×
103

104
    @Override
105
    public void onBlockNeighborChange(INetwork network, IPartNetwork partNetwork, PartTarget target, State state,
106
                                      BlockGetter world, @Nullable Direction side) {
107
        super.onBlockNeighborChange(network, partNetwork, target, state, world, side);
×
108
        setLightLevel(target, state.getDisplayValue() == null ? 0 : getLightLevel(state, state.getDisplayValue()));
×
109
    }
×
110

111
    @Override
112
    public void postUpdate(INetwork network, IPartNetwork partNetwork, PartTarget target, State state, boolean updated) {
113
        boolean wasEnabled = isEnabled(state);
×
114
        super.postUpdate(network, partNetwork, target, state, updated);
×
115
        boolean isEnabled = isEnabled(state);
×
116
        if(wasEnabled != isEnabled) {
×
117
            setLightLevel(target, isEnabled ? getLightLevel(state, state.getDisplayValue()) : 0);
×
118
        }
119
    }
×
120

121
    public static void setLightLevel(PartTarget target, int lightLevel) {
122
        if (BlockInvisibleLightConfig.invisibleLightBlock) {
×
123
            Level world = target.getTarget().getPos().getLevel(true);
×
124
            BlockPos pos = target.getTarget().getPos().getBlockPos();
×
125
            if(world.isEmptyBlock(pos) || world.getBlockState(pos).getBlock() == RegistryEntries.BLOCK_INVISIBLE_LIGHT.get()) {
×
126
                if(lightLevel > 0) {
×
127
                    world.setBlockAndUpdate(pos, RegistryEntries.BLOCK_INVISIBLE_LIGHT.get().defaultBlockState()
×
128
                            .setValue(BlockInvisibleLight.LIGHT, lightLevel));
×
129
                } else {
130
                    world.setBlock(pos, Blocks.AIR.defaultBlockState(), IModHelpers.get().getMinecraftHelpers().getBlockNotifyClient());
×
131
                }
132
            }
133
        } else {
×
134
            IModHelpersNeoForge.get().getCapabilityHelpers().getCapability(target.getCenter().getPos(), target.getCenter().getSide(), Capabilities.DynamicLight.BLOCK)
×
135
                    .ifPresent(dynamicLight -> dynamicLight.setLightLevel(lightLevel));
×
136
        }
137
    }
×
138

139
    public static class State extends PartTypePanelVariableDriven.State<PartTypePanelLightDynamic, PartTypePanelLightDynamic.State> {
×
140

141
    }
142

143
}
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