• 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

0.0
/src/main/java/org/cyclops/integrateddynamics/client/render/level/PartOffsetsOverlayRenderer.java
1
package org.cyclops.integrateddynamics.client.render.level;
2

3
import com.google.common.collect.Lists;
4
import com.mojang.blaze3d.vertex.PoseStack;
5
import com.mojang.blaze3d.vertex.VertexConsumer;
6
import net.minecraft.client.Minecraft;
7
import net.minecraft.client.renderer.*;
8
import net.minecraft.world.InteractionHand;
9
import net.minecraft.world.entity.player.Player;
10
import net.minecraft.world.phys.AABB;
11
import net.minecraft.world.phys.Vec3;
12
import net.neoforged.bus.api.SubscribeEvent;
13
import net.neoforged.neoforge.client.event.RenderLevelStageEvent;
14
import org.cyclops.integrateddynamics.IntegratedDynamics;
15
import org.cyclops.integrateddynamics.Reference;
16
import org.cyclops.integrateddynamics.core.helper.WrenchHelpers;
17
import org.cyclops.integrateddynamics.core.network.PartOffsetsClientNotifier;
18
import org.cyclops.integrateddynamics.network.packet.PartOffsetsSubscribePacket;
19

20
import java.util.List;
21
import java.util.OptionalDouble;
22
import java.util.Random;
23

24
/**
25
 * @author rubensworks
26
 */
27
public class PartOffsetsOverlayRenderer {
28

29
    public static final RenderType RENDER_TYPE_LINE = RenderType.create(Reference.MOD_ID + "line",
×
30
            128,
31
            RenderPipelines.SECONDARY_BLOCK_OUTLINE,
32
            RenderType.CompositeState.builder()
×
33
                    .setLineState(new RenderStateShard.LineStateShard(OptionalDouble.of(2)))
×
34
                    .setLayeringState(RenderStateShard.VIEW_OFFSET_Z_LAYERING)
×
35
                    .setOutputState(RenderStateShard.ITEM_ENTITY_TARGET)
×
36
                    .createCompositeState(false));
×
37

38
    private static final PartOffsetsOverlayRenderer _INSTANCE = new PartOffsetsOverlayRenderer();
×
39

40
    private boolean subscribedToServerChanges = false;
×
41

42
    private List<PartOffsetsClientNotifier.Entry> data = Lists.newArrayList();
×
43

44
    private PartOffsetsOverlayRenderer() {
×
45

46
    }
×
47

48
    public static PartOffsetsOverlayRenderer getInstance() {
49
        return _INSTANCE;
×
50
    }
51

52
    private void subscribeToServerChanges() {
53
        IntegratedDynamics._instance.getPacketHandler().sendToServer(new PartOffsetsSubscribePacket(true));
×
54
        this.subscribedToServerChanges = true;
×
55
    }
×
56

57
    private void unsubscribeToServerChanges() {
58
        IntegratedDynamics._instance.getPacketHandler().sendToServer(new PartOffsetsSubscribePacket(false));
×
59
        this.subscribedToServerChanges = false;
×
60
    }
×
61

62
    public void clear() {
63
        this.data.clear();
×
64
    }
×
65

66
    public void setData(List<PartOffsetsClientNotifier.Entry> data) {
67
        this.data = data;
×
68
    }
×
69

70
    @SubscribeEvent
71
    public void onRender(RenderLevelStageEvent.AfterTranslucentBlocks event) {
72
        // If the player is holding a wrench, show the offsets of parts
73
        // Only do this for parts with non-default target side or non-default offset
74
        Player player = Minecraft.getInstance().player;
×
75
        if (player.getItemInHand(InteractionHand.MAIN_HAND).is(WrenchHelpers.TAG_WRENCH)
×
76
                || player.getItemInHand(InteractionHand.OFF_HAND).is(WrenchHelpers.TAG_WRENCH)) {
×
77
            if (!subscribedToServerChanges) {
×
78
                this.subscribeToServerChanges();
×
79
            }
80

81
            Vec3 eyePos = event.getCamera().getPosition();
×
82
            for (PartOffsetsClientNotifier.Entry entry : this.data) {
×
83
                this.renderOffset(event.getPoseStack(), Minecraft.getInstance().renderBuffers().outlineBufferSource(), entry, eyePos);
×
84
            }
×
85

86
        } else if (subscribedToServerChanges) {
×
87
            this.data.clear();
×
88
            this.unsubscribeToServerChanges();
×
89
        }
90
    }
×
91

92
    private void renderOffset(PoseStack matrixStack, MultiBufferSource renderTypeBuffer, PartOffsetsClientNotifier.Entry entry, Vec3 eyePos) {
93
        double offsetX = eyePos.x;
×
94
        double offsetY = eyePos.y;
×
95
        double offsetZ = eyePos.z;
×
96

97
        Random posRand = new Random(entry.source().asLong());
×
98
        float r = 0.5F + posRand.nextFloat() / 2;
×
99
        float g = 0.5F + posRand.nextFloat() / 2;
×
100
        float b = 0.5F + posRand.nextFloat() / 2;
×
101
        float a = 0.90F;
×
102

103
        // Draw line from center to target
104
        VertexConsumer vb = renderTypeBuffer.getBuffer(RENDER_TYPE_LINE);
×
105
        float minX = entry.source().getX() - (float) offsetX + 0.5F + entry.sourceSide().getStepX() * 0.5F;
×
106
        float minY = entry.source().getY() - (float) offsetY + 0.5F + entry.sourceSide().getStepY() * 0.5F;
×
107
        float minZ = entry.source().getZ() - (float) offsetZ + 0.5F + entry.sourceSide().getStepZ() * 0.5F;
×
108
        float maxX = entry.source().getX() - (float) offsetX + 0.5F + entry.targetOffset().getX() + (entry.targetSide().getAxis() != entry.sourceSide().getAxis() ? entry.targetSide().getStepX() * 0.5F : 0);
×
109
        float maxY = entry.source().getY() - (float) offsetY + 0.5F + entry.targetOffset().getY() + (entry.targetSide().getAxis() != entry.sourceSide().getAxis() ? entry.targetSide().getStepY() * 0.5F : 0);
×
110
        float maxZ = entry.source().getZ() - (float) offsetZ + 0.5F + entry.targetOffset().getZ() + (entry.targetSide().getAxis() != entry.sourceSide().getAxis() ? entry.targetSide().getStepZ() * 0.5F : 0);
×
111
        vb.addVertex(matrixStack.last().pose(), minX, minY, minZ).setColor(r, g, b, a).setNormal(0.0F, 0.0F, 0.0F);
×
112
        vb.addVertex(matrixStack.last().pose(), maxX, maxY, maxZ).setColor(r, g, b, a).setNormal(0.0F, 0.0F, 0.0F);
×
113

114
        // Draw target face
115
        AABB bb = new AABB(entry.targetSide().getStepX() == 1 ? 0.9 : 0, entry.targetSide().getStepY() == 1 ? 0.9 : 0, entry.targetSide().getStepZ() == 1 ? 0.9 : 0,
×
116
                entry.targetSide().getStepX() == -1 ? 0.1 : 1, entry.targetSide().getStepY() == -1 ? 0.1 : 1, entry.targetSide().getStepZ() == -1 ? 0.1 : 1);
×
117
        bb = bb
×
118
                .move(entry.source())
×
119
                .move(entry.targetOffset().getX(), entry.targetOffset().getY(), entry.targetOffset().getZ())
×
120
                .move(-offsetX, -offsetY, -offsetZ)
×
121
                .inflate(0.05, 0.05, 0.05)
×
122
                .inflate(-0.05, -0.05, -0.05);
×
123
        ShapeRenderer.renderLineBox(matrixStack, renderTypeBuffer.getBuffer(RenderType.lines()),
×
124
                bb, r, g, b, a);
125
    }
×
126

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