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

CyclopsMC / IntegratedDynamics / 19640668712

24 Nov 2025 03:59PM UTC coverage: 53.038% (-0.02%) from 53.061%
19640668712

push

github

rubensworks
Merge remote-tracking branch 'origin/master-1.21-lts' into master-1.21

2876 of 8776 branches covered (32.77%)

Branch coverage included in aggregate %.

17359 of 29376 relevant lines covered (59.09%)

3.07 hits per line

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

79.34
/src/main/java/org/cyclops/integrateddynamics/core/network/PartNetwork.java
1
package org.cyclops.integrateddynamics.core.network;
2

3
import com.google.common.collect.Lists;
4
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
5
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
6
import lombok.Getter;
7
import lombok.Setter;
8
import net.minecraft.core.Direction;
9
import net.minecraft.world.level.block.entity.BlockEntity;
10
import net.minecraft.world.level.block.state.BlockState;
11
import org.cyclops.cyclopscore.datastructure.CompositeMap;
12
import org.cyclops.cyclopscore.datastructure.DimPos;
13
import org.cyclops.cyclopscore.helper.IModHelpersNeoForge;
14
import org.cyclops.integrateddynamics.Capabilities;
15
import org.cyclops.integrateddynamics.IntegratedDynamics;
16
import org.cyclops.integrateddynamics.api.block.IVariableContainer;
17
import org.cyclops.integrateddynamics.api.evaluate.variable.IValue;
18
import org.cyclops.integrateddynamics.api.evaluate.variable.IVariable;
19
import org.cyclops.integrateddynamics.api.item.IVariableFacade;
20
import org.cyclops.integrateddynamics.api.network.FullNetworkListenerAdapter;
21
import org.cyclops.integrateddynamics.api.network.INetwork;
22
import org.cyclops.integrateddynamics.api.network.INetworkElement;
23
import org.cyclops.integrateddynamics.api.network.IPartNetwork;
24
import org.cyclops.integrateddynamics.api.part.*;
25
import org.cyclops.integrateddynamics.api.part.aspect.IAspectRead;
26
import org.cyclops.integrateddynamics.api.part.read.IPartStateReader;
27
import org.cyclops.integrateddynamics.api.part.read.IPartTypeReader;
28
import org.cyclops.integrateddynamics.api.path.IPathElement;
29
import org.cyclops.integrateddynamics.core.helper.PartHelpers;
30

31
import java.util.Iterator;
32
import java.util.List;
33
import java.util.Map;
34

35
/**
36
 * A network that can hold parts.
37
 * Note that this network only contains references to the relevant data, it does not contain the actual information.
38
 * @author rubensworks
39
 */
40
public class PartNetwork extends FullNetworkListenerAdapter implements IPartNetwork {
2✔
41

42
    @Getter
×
43
    @Setter
×
44
    private INetwork network;
45
    private Int2ObjectMap<PartPos> partPositions = new Int2ObjectOpenHashMap<>();
5✔
46
    private List<DimPos> variableContainerPositions = Lists.newArrayList();
3✔
47
    private Map<Integer, IVariableFacade> compositeVariableCache = null;
3✔
48
    private Int2ObjectMap<IValue> lazyExpressionValueCache = new Int2ObjectOpenHashMap<>();
5✔
49
    private Int2ObjectMap<DimPos> proxyPositions = new Int2ObjectOpenHashMap<>();
5✔
50

51
    private volatile boolean partsChanged = false;
4✔
52

53
    @Override
54
    public boolean addPart(int partId, PartPos partPos) {
55
        if(partPositions.containsKey(partId)) {
5!
56
            return false;
×
57
        }
58
        compositeVariableCache = null;
3✔
59
        partPositions.put(partId, partPos);
6✔
60
        return true;
2✔
61
    }
62

63
    @Override
64
    public IPartState getPartState(int partId) {
65
        PartPos partPos = partPositions.get(partId);
6✔
66
        return PartHelpers.getPartContainerChecked(partPos.getPos(), partPos.getSide()).getPartState(partPos.getSide());
9✔
67
    }
68

69
    @Override
70
    public IPartType getPartType(int partId) {
71
        PartPos partPos = partPositions.get(partId);
6✔
72
        return PartHelpers.getPartContainerChecked(partPos.getPos(), partPos.getSide()).getPart(partPos.getSide());
9✔
73
    }
74

75
    @Override
76
    public void removePart(int partId) {
77
        compositeVariableCache = null;
3✔
78
        partPositions.remove(partId);
5✔
79
    }
1✔
80

81
    @Override
82
    public boolean hasPart(int partId) {
83
        if(!partPositions.containsKey(partId)) {
5✔
84
            return false;
2✔
85
        }
86
        PartPos partPos = partPositions.get(partId);
6✔
87
        return PartHelpers.getPartContainer(partPos.getPos(), partPos.getSide())
8✔
88
                .map(partContainer -> partContainer.hasPart(partPos.getSide()))
8✔
89
                .orElse(false);
4✔
90
    }
91

92
    @Override
93
    public <V extends IValue> boolean hasPartVariable(int partId, IAspectRead<V, ?> aspect) {
94
        if(!hasPart(partId)) {
4✔
95
            return false;
2✔
96
        }
97
        IPartState partState = getPartState(partId);
4✔
98
        if(!(partState instanceof IPartStateReader)) {
3!
99
            return false;
×
100
        }
101
        IPartType partType = getPartType(partId);
4✔
102
        if(!(partType instanceof IPartTypeReader)) {
3!
103
            return false;
×
104
        }
105
        try {
106
            return ((IPartTypeReader) partType).getVariable(partType.getTarget(partPositions.get(partId), partState),
18!
107
                    (IPartStateReader) partState, aspect) != null;
108
        } catch (IllegalArgumentException e) {
×
109
            return false;
×
110
        }
111
    }
112

113
    @Override
114
    public <V extends IValue> IVariable<V> getPartVariable(int partId, IAspectRead<V, ?> aspect) {
115
        return ((IPartStateReader) getPartState(partId)).getVariable(aspect);
7✔
116
    }
117

118
    protected Map<Integer, IVariableFacade> getVariableCache() {
119
        if(compositeVariableCache == null) {
3✔
120
            // Create a new composite map view on the existing variable containers in this network.
121
            CompositeMap<Integer, IVariableFacade> compositeMap = new CompositeMap<>();
4✔
122
            for(Iterator<DimPos> it = variableContainerPositions.iterator(); it.hasNext();) {
7✔
123
                DimPos dimPos = it.next();
4✔
124
                if (dimPos.isLoaded()) {
3!
125
                    IVariableContainer variableContainer = IModHelpersNeoForge.get().getCapabilityHelpers().getCapability(dimPos, null, Capabilities.VariableContainer.BLOCK).orElse(null);
10✔
126
                    if (variableContainer != null) {
2!
127
                        compositeMap.addElement(variableContainer.getVariableCache());
5✔
128
                    } else {
129
                        IntegratedDynamics.clog(org.apache.logging.log4j.Level.ERROR, "The variable container at " + dimPos + " was invalid, skipping.");
×
130
                        it.remove();
×
131
                    }
132
                }
133
            }
1✔
134
            // Also check parts
135
            for(PartPos partPos : partPositions.values()) {
12✔
136
                if (partPos.getPos().isLoaded()) {
4!
137
                    IPartContainer partContainer = PartHelpers.getPartContainerChecked(partPos.getPos(), partPos.getSide());
6✔
138
                    partContainer.getCapability(Capabilities.VariableContainer.PART, network, this, PartTarget.fromCenter(partPos))
10✔
139
                            .ifPresent(variableContainer -> compositeMap.addElement(variableContainer.getVariableCache()));
6✔
140
                }
141
            }
1✔
142
            compositeVariableCache = compositeMap;
3✔
143
        }
144
        return compositeVariableCache;
3✔
145
    }
146

147
    @Override
148
    public boolean hasVariableFacade(int variableId) {
149
        return getVariableCache().containsKey(variableId);
6✔
150
    }
151

152
    @Override
153
    public IVariableFacade getVariableFacade(int variableId) {
154
        return getVariableCache().get(variableId);
7✔
155
    }
156

157
    @Override
158
    public void setValue(int id, IValue value) {
159
        lazyExpressionValueCache.put(id, value);
6✔
160
    }
1✔
161

162
    @Override
163
    public boolean hasValue(int id) {
164
        return lazyExpressionValueCache.containsKey(id);
5✔
165
    }
166

167
    @Override
168
    public IValue getValue(int id) {
169
        return lazyExpressionValueCache.get(id);
6✔
170
    }
171

172
    @Override
173
    public void removeValue(int id) {
174
        lazyExpressionValueCache.remove(id);
5✔
175
    }
1✔
176

177
    @Override
178
    public boolean addVariableContainer(DimPos dimPos) {
179
        compositeVariableCache = null;
3✔
180
        return variableContainerPositions.add(dimPos);
5✔
181
    }
182

183
    @Override
184
    public void removeVariableContainer(DimPos dimPos) {
185
        compositeVariableCache = null;
3✔
186
        variableContainerPositions.remove(dimPos);
5✔
187
    }
1✔
188

189
    @Override
190
    public boolean addProxy(int proxyId, DimPos dimPos) {
191
        if(proxyPositions.containsKey(proxyId)) {
5!
192
            return false;
×
193
        }
194
        proxyPositions.put(proxyId, dimPos);
6✔
195
        return true;
2✔
196
    }
197

198
    @Override
199
    public void removeProxy(int proxyId) {
200
        proxyPositions.remove(proxyId);
5✔
201
    }
1✔
202

203
    @Override
204
    public DimPos getProxy(int proxyId) {
205
        return proxyPositions.get(proxyId);
6✔
206
    }
207

208
    @Override
209
    public void notifyPartsChanged() {
210
        this.partsChanged = true;
3✔
211
    }
1✔
212

213
    private void onPartsChanged() {
214

215
    }
×
216

217
    @Override
218
    public void update() {
219
        // Signal parts of any changes
220
        if (partsChanged) {
3!
221
            this.partsChanged = false;
×
222
            onPartsChanged();
×
223
        }
224
    }
1✔
225

226
    @Override
227
    public boolean removePathElement(IPathElement pathElement, Direction side, BlockState blockState, BlockEntity blockEntity) {
228
        notifyPartsChanged();
2✔
229
        return true;
2✔
230
    }
231

232
    @Override
233
    public void invalidateElement(INetworkElement element) {
234
        compositeVariableCache = null;
3✔
235
        super.invalidateElement(element);
3✔
236
    }
1✔
237

238
    @Override
239
    public void revalidateElement(INetworkElement element) {
240
        compositeVariableCache = null;
×
241
        super.revalidateElement(element);
×
242
    }
×
243
}
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