22
33import dev .manifold .network .packets .ConstructSectionDataS2CPacket ;
44import dev .manifold .network .packets .PickConstructBlockWithDataS2CPacket ;
5+ import dev .manifold .network .packets .RemoveConstructS2CPacket ;
56import dev .manifold .render .ManifoldRenderChunk ;
67import dev .manifold .render .ManifoldRenderChunkRegion ;
78import io .netty .buffer .Unpooled ;
@@ -80,31 +81,36 @@ public static Optional<ConstructBlockHitResult> pickConstructHit(Vec3 cameraPos,
8081 double closestDistSq = maxDistance * maxDistance ;
8182
8283 for (ConstructRenderCache .CachedConstruct construct : renderer .getRenderedConstructs ().values ()) {
83- //Compute inverse rotation and position
84+ UUID uuid = construct .id ();
85+
86+ // Skip constructs that have been removed to prevent a crash
87+ if (!ConstructManager .INSTANCE .hasConstruct (uuid )) continue ;
88+
89+ // Compute inverse rotation and position
8490 Vec3 interpolatedConstructPosition = construct .prevPosition ().lerp (construct .currentPosition (), alpha );
8591 Quaternionf interpolatedRotation = new Quaternionf (construct .prevRotation ()).slerp (construct .currentRotation (), alpha );
8692 Quaternionf inverseInterpolatedRotation = new Quaternionf (interpolatedRotation ).invert ();
8793 BlockPos simOrigin = construct .origin ();
8894 Vec3 com = construct .centerOfMass ();
8995
90- //Transform ray into construct-local space (un-rotated frame)
96+ // Transform ray into construct-local space (un-rotated frame)
9197 Vec3 localStart = rotateVec (cameraPos .subtract (interpolatedConstructPosition ), inverseInterpolatedRotation );
9298 Vec3 localEnd = rotateVec (rayEnd .subtract (interpolatedConstructPosition ), inverseInterpolatedRotation );
9399
94100 localStart = localStart .add (interpolatedConstructPosition ).add (com );
95101 localEnd = localEnd .add (interpolatedConstructPosition ).add (com );
96102
97- //Shift AABB to construct-local space
98- AABB localAABB = ConstructManager .INSTANCE .getRenderAABB (construct . id () );
103+ // Shift AABB to construct-local space
104+ AABB localAABB = ConstructManager .INSTANCE .getRenderAABB (uuid );
99105
100- //Perform early rejection (stay in local space!)
106+ // Perform early rejection (stay in local space!)
101107 if (!localAABB .contains (localStart ) && localAABB .clip (localStart , localEnd ).isEmpty ()) continue ;
102108
103- //Transform ray back into sim-dimension world space
109+ // Transform ray back into sim-dimension world space
104110 Vec3 simStart = localStart .add (Vec3 .atLowerCornerOf (simOrigin )).subtract (interpolatedConstructPosition );
105111 Vec3 simEnd = localEnd .add (Vec3 .atLowerCornerOf (simOrigin )).subtract (interpolatedConstructPosition );
106112
107- //Perform real sim-dimension raycast
113+ // Perform real sim-dimension raycast
108114 BlockHitResult localHitResult = raycastIntoConstructDimension (simStart , simEnd , player , simLevel );
109115
110116 if (localHitResult .getType () == HitResult .Type .BLOCK ) {
@@ -117,7 +123,7 @@ public static Optional<ConstructBlockHitResult> pickConstructHit(Vec3 cameraPos,
117123 closestDistSq = distSq ;
118124 BlockState state = simLevel .getBlockState (localHitResult .getBlockPos ());
119125 VoxelShape shape = state .getShape (simLevel , localHitResult .getBlockPos ());
120- ManifoldRenderChunkRegion region = regions .get (construct . id () );
126+ ManifoldRenderChunkRegion region = regions .get (uuid );
121127 closestHit = new ConstructBlockHitResult (construct , shape , localHitResult , region );
122128 }
123129 }
@@ -181,6 +187,10 @@ public void onInitializeClient() {
181187 ClientPlayNetworking .registerGlobalReceiver (PickConstructBlockWithDataS2CPacket .TYPE , (packet , context ) ->
182188 context .client ().execute (() -> handlePickConstructData (packet ))
183189 );
190+
191+ ClientPlayNetworking .registerGlobalReceiver (RemoveConstructS2CPacket .TYPE , (packet , context ) ->
192+ context .client ().execute (() -> handleRemoveConstruct (packet ))
193+ );
184194 }
185195
186196 private void handlePickConstructData (PickConstructBlockWithDataS2CPacket packet ) {
@@ -244,4 +254,8 @@ private void handleConstructSectionData(ConstructSectionDataS2CPacket packet) {
244254
245255 renderer .uploadMesh (packet .constructId (), packet .origin (), region );
246256 }
257+
258+ private void handleRemoveConstruct (RemoveConstructS2CPacket packet ) {
259+ renderer .markForRemoval (packet .constructId ());
260+ }
247261}
0 commit comments