Skip to content

Commit c12cbd4

Browse files
committed
allow render simple blockentity with overlay module
1 parent def401c commit c12cbd4

6 files changed

Lines changed: 59 additions & 10 deletions

File tree

‎src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java‎

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,40 @@
55
import de.srendi.advancedperipherals.client.APRenderTypes;
66
import de.srendi.advancedperipherals.client.RenderUtil;
77
import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject;
8+
import de.srendi.advancedperipherals.common.util.fakelevel.FakeLevel;
89
import net.minecraft.client.Minecraft;
910
import net.minecraft.client.color.block.BlockColors;
11+
import net.minecraft.client.multiplayer.ClientLevel;
1012
import net.minecraft.client.renderer.LightTexture;
1113
import net.minecraft.client.renderer.MultiBufferSource;
1214
import net.minecraft.client.renderer.block.BlockRenderDispatcher;
1315
import net.minecraft.client.renderer.block.model.BakedQuad;
16+
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
17+
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
1418
import net.minecraft.client.renderer.texture.OverlayTexture;
1519
import net.minecraft.client.resources.model.BakedModel;
20+
import net.minecraft.core.BlockPos;
1621
import net.minecraft.core.Direction;
1722
import net.minecraft.util.RandomSource;
23+
import net.minecraft.world.level.block.EntityBlock;
24+
import net.minecraft.world.level.block.entity.BlockEntity;
1825
import net.minecraft.world.level.block.state.BlockState;
1926
import net.minecraft.world.phys.Vec3;
2027
import net.minecraftforge.client.event.RenderLevelStageEvent;
2128
import org.joml.Quaternionf;
2229

2330
import java.util.List;
31+
import java.util.WeakHashMap;
2432

2533
public 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
}

‎src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AEApi.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ public static long getUsedExternalFluidStorage(IGrid grid) {
645645
/**
646646
* Calculates the available external item storage of a given grid node.
647647
*
648-
* @param gird The grid for which to calculate the available external item storage.
648+
* @param grid The grid for which to calculate the available external item storage.
649649
* @return The available external item storage.
650650
*/
651651
public static double getAvailableExternalItemStorage(IGrid grid) {

‎src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesInterfaceItem.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public InteractionResultHolder<ItemStack> use(Level level, Player player, Intera
4545
PlatformHelper.get().openMenu(
4646
player,
4747
glasses.getHoverName(),
48-
new SmartGlassesMenuProvider(computer, glasses, itemHandler)::createMenu,
48+
new SmartGlassesMenuProvider(computer, glasses, itemHandler),
4949
new ComputerContainerData(computer, glasses)
5050
);
5151

‎src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,6 @@
6565

6666
public class SmartGlassesItem extends ArmorItem implements IComputerItem, IMedia {
6767

68-
private static final String NBT_UPGRADE = "Upgrade";
69-
private static final String NBT_UPGRADE_INFO = "UpgradeInfo";
7068
public static final String NBT_LIGHT = "Light";
7169
public static final String NBT_ON = "On";
7270

@@ -272,7 +270,7 @@ public InteractionResultHolder<ItemStack> use(Level level, Player player, Intera
272270
PlatformHelper.get().openMenu(
273271
player,
274272
glasses.getHoverName(),
275-
new SmartGlassesMenuProvider(computer, glasses, itemHandler)::createMenu,
273+
new SmartGlassesMenuProvider(computer, glasses, itemHandler),
276274
new ComputerContainerData(computer, glasses)
277275
);
278276
return InteractionResultHolder.consume(glasses);

‎src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,18 +76,19 @@ public static <T extends Entity> void registerEntityConverter(Class<T> clazz, En
7676
public interface EntityConverter<T extends Entity> {
7777
void entityToMap(T entity, Map<String, Object> data, Context ctx);
7878

79-
record Context(boolean detailed, ItemStack itemInHand, Vec3 position, Matrix3dc orientation) {}
79+
record Context(boolean detailed, @NotNull ItemStack itemInHand, Vec3 position, Matrix3dc orientation) {}
8080
}
8181

82-
private static final EntityConverter.Context EMPTY_ENTITY_CONVERTER_CONTEXT = new EntityConverter.Context(false, null, null, null);
82+
private static final EntityConverter.Context EMPTY_ENTITY_CONVERTER_CONTEXT = new EntityConverter.Context(false, ItemStack.EMPTY, null, null);
8383

8484
public static EntityContextBuilder entityContextBuilder() {
8585
return new EntityContextBuilder();
8686
}
8787

8888
public static final class EntityContextBuilder {
8989
private boolean detailed = false;
90-
private ItemStack itemInHand = null;
90+
@NotNull
91+
private ItemStack itemInHand = ItemStack.EMPTY;
9192
private Vec3 position = null;
9293
private Matrix3dc orientation = null;
9394

@@ -100,7 +101,7 @@ public EntityContextBuilder detailed() {
100101
return this.detailed(true);
101102
}
102103

103-
public EntityContextBuilder itemInHand(ItemStack stack) {
104+
public EntityContextBuilder itemInHand(@NotNull ItemStack stack) {
104105
this.itemInHand = stack;
105106
return this;
106107
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package de.srendi.advancedperipherals.common.util.fakelevel;
2+
3+
import net.minecraft.client.multiplayer.ClientLevel;
4+
import net.minecraft.client.multiplayer.ClientPacketListener;
5+
6+
public class FakeLevel extends ClientLevel {
7+
public FakeLevel(ClientPacketListener connection, ClientLevel level) {
8+
super(
9+
connection,
10+
level.getLevelData(),
11+
level.dimension(),
12+
level.dimensionTypeRegistration(),
13+
2,
14+
1,
15+
level.getProfilerSupplier(),
16+
null,
17+
false,
18+
0
19+
);
20+
}
21+
}

0 commit comments

Comments
 (0)