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

CyclopsMC / IntegratedDynamics / 22186773560

19 Feb 2026 02:52PM UTC coverage: 52.603% (+0.2%) from 52.363%
22186773560

push

github

web-flow
Remove Lombok dependency (#1604)

2911 of 8664 branches covered (33.6%)

Branch coverage included in aggregate %.

17683 of 30486 relevant lines covered (58.0%)

3.01 hits per line

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

0.0
/src/main/java/org/cyclops/integrateddynamics/core/network/diagnostics/NetworkDataClient.java
1
package org.cyclops.integrateddynamics.core.network.diagnostics;
2

3
import com.google.common.collect.ArrayListMultimap;
4
import com.google.common.collect.Lists;
5
import com.google.common.collect.Multimap;
6
import com.google.common.collect.Sets;
7
import com.google.gson.*;
8
import net.minecraft.client.Minecraft;
9
import net.minecraft.core.BlockPos;
10
import net.minecraft.core.Direction;
11
import net.minecraft.resources.ResourceKey;
12
import net.minecraft.world.level.Level;
13
import org.cyclops.cyclopscore.datastructure.DimPos;
14
import org.cyclops.cyclopscore.helper.IModHelpers;
15
import org.cyclops.integrateddynamics.IntegratedDynamics;
16
import org.cyclops.integrateddynamics.api.part.PartPos;
17
import org.cyclops.integrateddynamics.network.packet.PlayerTeleportPacket;
18

19
import java.util.*;
20

21
/**
22
 * @author rubensworks
23
 */
24
public class NetworkDataClient {
×
25

26
    public static final String[] LOCALIZE_ENTRIES = new String[]{
×
27
            "gui.integrateddynamics.diagnostics.title",
28
            "gui.integrateddynamics.diagnostics.parts",
29
            "gui.integrateddynamics.diagnostics.observers",
30
            "gui.integrateddynamics.diagnostics.table.network",
31
            "gui.integrateddynamics.diagnostics.table.cables",
32
            "gui.integrateddynamics.diagnostics.table.part",
33
            "gui.integrateddynamics.diagnostics.table.ticktime",
34
            "gui.integrateddynamics.diagnostics.table.dimension",
35
            "gui.integrateddynamics.diagnostics.table.position",
36
            "gui.integrateddynamics.diagnostics.table.side",
37
            "gui.integrateddynamics.diagnostics.table.actions"
38
    };
39

40
    private static final Multimap<Integer, ObservablePartData> networkDataParts = ArrayListMultimap.create();
×
41
    private static final Multimap<Integer, ObservableObserverData> networkDataObservers = ArrayListMultimap.create();
×
42

43
    public static void clearNetworkData() {
44
        networkDataParts.clear();
×
45
        networkDataObservers.clear();
×
46
    }
×
47

48
    public static void setNetworkData(int id, RawNetworkData rawNetworkData) {
49
        synchronized (networkDataParts) {
×
50
            Collection<ObservablePartData> previous = networkDataParts.removeAll(id);
×
51

52
            // The positions that were being rendered previously
53
            Set<PartPos> previousPositionsWithRender = Sets.newHashSet();
×
54
            for (ObservablePartData partData : previous) {
×
55
                PartPos pos = partData.toPartPos();
×
56
                if (pos != null && NetworkDiagnosticsPartOverlayRenderer.getInstance().hasPartPos(pos)) {
×
57
                    previousPositionsWithRender.add(pos);
×
58
                }
59
            }
×
60

61
            if (rawNetworkData != null) {
×
62
                List<ObservablePartData> parts = Lists.newArrayList();
×
63
                for (RawPartData rawPartData : rawNetworkData.getParts()) {
×
64
                    ObservablePartData partData = new ObservablePartData(
×
65
                            rawNetworkData.getId(), rawNetworkData.getCables(),
×
66
                            rawPartData.getDimension(), rawPartData.getPos(),
×
67
                            rawPartData.getSide(), rawPartData.getName(),
×
68
                            rawPartData.getLast20TicksDurationNs());
×
69
                    parts.add(partData);
×
70

71
                    // Remove this position from the previously rendered list
72
                    PartPos pos = partData.toPartPos();
×
73
                    if (pos != null) {
×
74
                        previousPositionsWithRender.remove(pos);
×
75
                    }
76
                }
×
77

78
                // Remove all remaining positions from the renderlist,
79
                // because those do not exist anymore.
80
                for (PartPos partPos : previousPositionsWithRender) {
×
81
                    NetworkDiagnosticsPartOverlayRenderer.getInstance().removePos(partPos);
×
82
                }
×
83

84
                networkDataParts.putAll(id, parts);
×
85
            }
86

87
            Collection<ObservableObserverData> previousObservers = networkDataObservers.removeAll(id);
×
88

89
            // The positions that were being rendered previously
90
            Set<PartPos> previousPositionsWithRenderObservers = Sets.newHashSet();
×
91
            for (ObservableObserverData partData : previousObservers) {
×
92
                PartPos pos = partData.toPartPos();
×
93
                if (pos != null && NetworkDiagnosticsPartOverlayRenderer.getInstance().hasPartPos(pos)) {
×
94
                    previousPositionsWithRenderObservers.add(pos);
×
95
                }
96
            }
×
97

98
            if (rawNetworkData != null) {
×
99
                List<ObservableObserverData> observers = Lists.newArrayList();
×
100
                for (RawObserverData rawPartData : rawNetworkData.getObservers()) {
×
101
                    ObservableObserverData partData = new ObservableObserverData(
×
102
                            rawNetworkData.getId(),
×
103
                            rawPartData.getDimension(), rawPartData.getPos(),
×
104
                            rawPartData.getSide(), rawPartData.getName(),
×
105
                            rawPartData.getLast20TicksDurationNs());
×
106
                    observers.add(partData);
×
107

108
                    // Remove this position from the previously rendered list
109
                    PartPos pos = partData.toPartPos();
×
110
                    if (pos != null) {
×
111
                        previousPositionsWithRenderObservers.remove(pos);
×
112
                    }
113
                }
×
114

115
                // Remove all remaining positions from the renderlist,
116
                // because those do not exist anymore.
117
                for (PartPos partPos : previousPositionsWithRenderObservers) {
×
118
                    NetworkDiagnosticsPartOverlayRenderer.getInstance().removePos(partPos);
×
119
                }
×
120

121
                networkDataObservers.putAll(id, observers);
×
122
            }
123
        }
×
124
    }
×
125

126
    public static String getAsJsonString() {
127
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
×
128
        JsonObject responseObject = new JsonObject();
×
129

130
        responseObject.add("localization", getLocalizationJson());
×
131
        responseObject.add("parts", getPartsJson());
×
132
        responseObject.add("observers", getObserversJson());
×
133

134
        return gson.toJson(responseObject) + "\n";
×
135
    }
136

137
    private static JsonElement getLocalizationJson() {
138
        JsonObject jsonObject = new JsonObject();
×
139
        for (String entry : LOCALIZE_ENTRIES) {
×
140
            jsonObject.addProperty(entry, IModHelpers.get().getL10NHelpers().localize(entry));
×
141
        }
142
        return jsonObject;
×
143
    }
144

145
    private static JsonElement getPartsJson() {
146
        JsonArray jsonArray = new JsonArray();
×
147
        synchronized (networkDataParts) {
×
148
            for (Map.Entry<Integer, ObservablePartData> entry : networkDataParts.entries()) {
×
149
                JsonObject jsonPart = new JsonObject();
×
150
                ObservablePartData part = entry.getValue();
×
151
                jsonPart.addProperty("network", part.getNetworkId());
×
152
                jsonPart.addProperty("cables", part.getNetworkCables());
×
153
                jsonPart.addProperty("part", IModHelpers.get().getL10NHelpers().localize(part.getName()));
×
154
                jsonPart.addProperty("ticktime", Float.parseFloat(String.format(Locale.ENGLISH, "%.6f", ((double) part.getLast20TicksDurationNs()) / IModHelpers.get().getMinecraftHelpers().getSecondInTicks() / 1000000)));
×
155
                jsonPart.addProperty("dimension", part.getDimension().identifier().toString());
×
156
                jsonPart.addProperty("position", part.getPos().toShortString());
×
157
                jsonPart.addProperty("side", part.getSide().name());
×
158
                jsonPart.addProperty("highlighted", NetworkDiagnosticsPartOverlayRenderer.getInstance().hasPartPos(part.toPartPos()));
×
159
                jsonArray.add(jsonPart);
×
160
            }
×
161
        }
×
162
        return jsonArray;
×
163
    }
164

165
    private static JsonElement getObserversJson() {
166
        JsonArray jsonArray = new JsonArray();
×
167
        synchronized (networkDataParts) {
×
168
            for (Map.Entry<Integer, ObservableObserverData> entry : networkDataObservers.entries()) {
×
169
                JsonObject jsonPart = new JsonObject();
×
170
                ObservableObserverData observer = entry.getValue();
×
171
                jsonPart.addProperty("network", observer.getNetworkId());
×
172
                jsonPart.addProperty("part", observer.getName());
×
173
                jsonPart.addProperty("ticktime", String.format("%.6f", ((double) observer.getLast20TicksDurationNs()) / IModHelpers.get().getMinecraftHelpers().getSecondInTicks() / 1000000));
×
174
                jsonPart.addProperty("dimension", observer.getDimension().identifier().toString());
×
175
                jsonPart.addProperty("position", observer.getPos().toShortString());
×
176
                jsonPart.addProperty("side", observer.getSide() != null ? observer.getSide().name() : "null");
×
177
                jsonPart.addProperty("highlighted", NetworkDiagnosticsPartOverlayRenderer.getInstance().hasPartPos(observer.toPartPos()));
×
178
                jsonArray.add(jsonPart);
×
179
            }
×
180
        }
×
181
        return jsonArray;
×
182
    }
183

184
    public static void highlightEnable(JsonObject data) {
185
        PartPos pos = parsePosString(data.get("dimension").getAsString(), data.get("position").getAsString(), data.get("side").getAsString());
×
186
        NetworkDiagnosticsPartOverlayRenderer.getInstance().addPos(pos);
×
187
    }
×
188

189
    public static void highlightDisable(JsonObject data) {
190
        PartPos pos = parsePosString(data.get("dimension").getAsString(), data.get("position").getAsString(), data.get("side").getAsString());
×
191
        if (NetworkDiagnosticsPartOverlayRenderer.getInstance().hasPartPos(pos)) {
×
192
            NetworkDiagnosticsPartOverlayRenderer.getInstance().removePos(pos);
×
193
        }
194
    }
×
195

196
    public static void teleport(JsonObject data) {
197
        PartPos pos = parsePosString(data.get("dimension").getAsString(), data.get("position").getAsString(), data.get("side").getAsString());
×
198
        BlockPos blockPos = pos.getPos().getBlockPos();
×
199
        float yaw = 0;
×
200
        if (pos.getSide() != null) {
×
201
            blockPos = blockPos.relative(pos.getSide());
×
202
            yaw = pos.getSide().getOpposite().toYRot();
×
203
        }
204
        IntegratedDynamics._instance.getPacketHandler().sendToServer(new PlayerTeleportPacket(
×
205
                pos.getPos().getLevelKey(),
×
206
                blockPos.getX(),
×
207
                blockPos.getY() - 1,
×
208
                blockPos.getZ(),
×
209
                yaw,
210
                0
211
        ));
212
    }
×
213

214
    private static PartPos parsePosString(String dimensionString, String positionString, String sideString) {
215
        String[] posParts = positionString.split(", ");
×
216
        BlockPos pos = new BlockPos(Integer.parseInt(posParts[0]), Integer.parseInt(posParts[1]), Integer.parseInt(posParts[2]));
×
217
        return PartPos.of(DimPos.of(dimensionString, pos), Direction.byName(sideString.toLowerCase(Locale.ROOT)));
×
218
    }
219

220
    private static class ObservablePartData {
221
        private final int networkId;
222
        private final int networkCables;
223
        private final ResourceKey<Level> dimension;
224
        private final BlockPos pos;
225
        private final Direction side;
226
        private final String name;
227
        private final long last20TicksDurationNs;
228

229
        public ObservablePartData(int networkId, int networkCables, ResourceKey<Level> dimension, BlockPos pos, Direction side, String name, long last20TicksDurationNs) {
×
230
            this.networkId = networkId;
×
231
            this.networkCables = networkCables;
×
232
            this.dimension = dimension;
×
233
            this.pos = pos;
×
234
            this.side = side;
×
235
            this.name = name;
×
236
            this.last20TicksDurationNs = last20TicksDurationNs;
×
237
        }
×
238

239
        public int getNetworkId() {
240
            return networkId;
×
241
        }
242

243
        public int getNetworkCables() {
244
            return networkCables;
×
245
        }
246

247
        public ResourceKey<Level> getDimension() {
248
            return dimension;
×
249
        }
250

251
        public BlockPos getPos() {
252
            return pos;
×
253
        }
254

255
        public Direction getSide() {
256
            return side;
×
257
        }
258

259
        public String getName() {
260
            return name;
×
261
        }
262

263
        public long getLast20TicksDurationNs() {
264
            return last20TicksDurationNs;
×
265
        }
266

267
        public PartPos toPartPos() {
268
            Level world = Minecraft.getInstance().level;
×
269
            if (getDimension().identifier().equals(world.dimension().identifier())) {
×
270
                return PartPos.of(DimPos.of(world, getPos()), getSide());
×
271
            }
272
            return null;
×
273
        }
274
    }
275

276
    private static class ObservableObserverData {
277
        private final int networkId;
278
        private final ResourceKey<Level> dimension;
279
        private final BlockPos pos;
280
        private final Direction side;
281
        private final String name;
282
        private final long last20TicksDurationNs;
283

284
        public ObservableObserverData(int networkId, ResourceKey<Level> dimension, BlockPos pos, Direction side, String name, long last20TicksDurationNs) {
×
285
            this.networkId = networkId;
×
286
            this.dimension = dimension;
×
287
            this.pos = pos;
×
288
            this.side = side;
×
289
            this.name = name;
×
290
            this.last20TicksDurationNs = last20TicksDurationNs;
×
291
        }
×
292

293
        public int getNetworkId() {
294
            return networkId;
×
295
        }
296

297
        public ResourceKey<Level> getDimension() {
298
            return dimension;
×
299
        }
300

301
        public BlockPos getPos() {
302
            return pos;
×
303
        }
304

305
        public Direction getSide() {
306
            return side;
×
307
        }
308

309
        public String getName() {
310
            return name;
×
311
        }
312

313
        public long getLast20TicksDurationNs() {
314
            return last20TicksDurationNs;
×
315
        }
316

317
        public PartPos toPartPos() {
318
            Level world = Minecraft.getInstance().level;
×
319
            if (getDimension().identifier().equals(world.dimension().identifier())) {
×
320
                return PartPos.of(DimPos.of(world, getPos()), getSide());
×
321
            }
322
            return null;
×
323
        }
324
    }
325

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