55import de .srendi .advancedperipherals .client .APRenderTypes ;
66import de .srendi .advancedperipherals .client .RenderUtil ;
77import de .srendi .advancedperipherals .common .smartglasses .modules .overlay .objects .three_dim .BlockObject ;
8+ import de .srendi .advancedperipherals .common .util .fakelevel .FakeLevel ;
89import net .minecraft .client .Minecraft ;
910import net .minecraft .client .color .block .BlockColors ;
11+ import net .minecraft .client .multiplayer .ClientLevel ;
1012import net .minecraft .client .renderer .LightTexture ;
1113import net .minecraft .client .renderer .MultiBufferSource ;
1214import net .minecraft .client .renderer .block .BlockRenderDispatcher ;
1315import net .minecraft .client .renderer .block .model .BakedQuad ;
16+ import net .minecraft .client .renderer .blockentity .BlockEntityRenderDispatcher ;
17+ import net .minecraft .client .renderer .blockentity .BlockEntityRenderer ;
1418import net .minecraft .client .renderer .texture .OverlayTexture ;
1519import net .minecraft .client .resources .model .BakedModel ;
20+ import net .minecraft .core .BlockPos ;
1621import net .minecraft .core .Direction ;
1722import net .minecraft .util .RandomSource ;
23+ import net .minecraft .world .level .block .EntityBlock ;
24+ import net .minecraft .world .level .block .entity .BlockEntity ;
1825import net .minecraft .world .level .block .state .BlockState ;
1926import net .minecraft .world .phys .Vec3 ;
2027import net .minecraftforge .client .event .RenderLevelStageEvent ;
2128import org .joml .Quaternionf ;
2229
2330import java .util .List ;
31+ import java .util .WeakHashMap ;
2432
2533public class BlockRenderer implements IThreeDObjectRenderer <BlockObject > {
34+ private final WeakHashMap <ClientLevel , FakeLevel > fakeLevels = new WeakHashMap <>();
2635
2736 @ Override
2837 public void renderBatch (List <BlockObject > batch , RenderLevelStageEvent event , PoseStack poseStack , Vec3 eyePos , Quaternionf eyeRotation ) {
2938 Minecraft minecraft = Minecraft .getInstance ();
3039 BlockRenderDispatcher blockRenderer = minecraft .getBlockRenderer ();
40+ BlockEntityRenderDispatcher blockEntityRenderer = minecraft .getBlockEntityRenderDispatcher ();
41+ float partialTick = event .getPartialTick ();
3142 MultiBufferSource .BufferSource bufferSource = minecraft .renderBuffers ().bufferSource ();
3243
3344 RandomSource random = RandomSource .create ();
@@ -55,10 +66,10 @@ public void renderBatch(List<BlockObject> batch, RenderLevelStageEvent event, Po
5566 poseStack .translate (block .x , block .y , block .z );
5667 poseStack .mulPose (block .getRotation ());
5768 poseStack .scale (block .sizeX , block .sizeY , block .sizeZ );
58- poseStack .translate (-0.5f , -0.5f , -0.5f );
5969
6070 float alpha = block .opacity ;
6171
72+ poseStack .translate (-0.5f , -0.5f , -0.5f );
6273 renderBlockModel (
6374 poseStack .last (),
6475 bufferBuilder ,
@@ -72,6 +83,24 @@ public void renderBatch(List<BlockObject> batch, RenderLevelStageEvent event, Po
7283 OverlayTexture .NO_OVERLAY ,
7384 random
7485 );
86+ if (!(state .getBlock () instanceof EntityBlock eb )) {
87+ continue ;
88+ }
89+ BlockEntity blockEntity = eb .newBlockEntity (BlockPos .ZERO , state );
90+ if (blockEntity == null ) {
91+ continue ;
92+ }
93+ FakeLevel fakeLevel = this .fakeLevels .computeIfAbsent (minecraft .level , (level ) -> new FakeLevel (minecraft .getConnection (), level ));
94+ fakeLevel .setBlockAndUpdate (BlockPos .ZERO , state );
95+ fakeLevel .setBlockEntity (blockEntity );
96+ blockEntity .setLevel (fakeLevel );
97+ @ SuppressWarnings ("rawtypes" )
98+ BlockEntityRenderer renderer = blockEntityRenderer .getRenderer (blockEntity );
99+ if (renderer == null ) {
100+ continue ;
101+ }
102+ poseStack .translate (0.5f , 0.5f , 0.5f );
103+ renderer .render (blockEntity , partialTick , poseStack , bufferSource , LightTexture .FULL_BRIGHT , OverlayTexture .NO_OVERLAY );
75104 }
76105 poseStack .popPose ();
77106 }
0 commit comments