Display book names above book stands
Build / build (push) Canceled after 0s

This commit is contained in:
dnorberg committed 2026-09-21 07:53:43 -04:00
1 parent d7fb1855a8
commit ec82296624
4 files changed
+60 -4

No files matched your search

@@ -4,6 +4,9 @@ import net.dnorberg.rivencraft.registry.ModBlockEntities;
import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientGamePacketListener;
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
@@ -22,16 +25,33 @@ public final class BookStandBlockEntity extends BlockEntity {
public void setBook(ItemStack book) {
this.book = book;
setChanged();
setChangedAndSync();
}
public ItemStack takeBook() {
ItemStack result = book;
book = ItemStack.EMPTY;
setChanged();
setChangedAndSync();
return result;
}
@Override
public Packet<ClientGamePacketListener> getUpdatePacket() {
return ClientboundBlockEntityDataPacket.create(this);
}
@Override
public CompoundTag getUpdateTag(HolderLookup.Provider registries) {
return saveWithoutMetadata(registries);
}
private void setChangedAndSync() {
setChanged();
if (level != null && !level.isClientSide) {
level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 2);
}
}
@Override
protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) {
super.loadAdditional(tag, registries);
@@ -7,18 +7,27 @@ import net.dnorberg.rivencraft.block.BookStandBlock;
import net.dnorberg.rivencraft.block.entity.BookStandBlockEntity;
import net.minecraft.client.model.BookModel;
import net.minecraft.client.model.geom.ModelLayers;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.client.renderer.blockentity.EnchantTableRenderer;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.network.chat.Component;
import net.minecraft.world.level.block.state.BlockState;
import org.joml.Matrix4f;
public final class BookStandRenderer implements BlockEntityRenderer<BookStandBlockEntity> {
private final BookModel bookModel;
private final Font font;
private final EntityRenderDispatcher entityRenderer;
public BookStandRenderer(BlockEntityRendererProvider.Context context) {
bookModel = new BookModel(context.bakeLayer(ModelLayers.BOOK));
font = context.getFont();
entityRenderer = context.getEntityRenderer();
}
@Override
@@ -45,5 +54,28 @@ public final class BookStandRenderer implements BlockEntityRenderer<BookStandBlo
VertexConsumer consumer = EnchantTableRenderer.BOOK_LOCATION.buffer(bufferSource, RenderType::entitySolid);
bookModel.render(poseStack, consumer, packedLight, packedOverlay, -1);
poseStack.popPose();
if (!blockEntity.getBook().isEmpty()) {
renderName(blockEntity.getBook().getHoverName(), poseStack, bufferSource, packedLight);
}
}
private void renderName(
Component name,
PoseStack poseStack,
MultiBufferSource bufferSource,
int packedLight
) {
poseStack.pushPose();
poseStack.translate(0.5F, 1.6F, 0.5F);
poseStack.mulPose(entityRenderer.cameraOrientation());
poseStack.scale(-0.025F, -0.025F, 0.025F);
Matrix4f matrix = poseStack.last().pose();
float x = -font.width(name) / 2.0F;
int background = (int)(Minecraft.getInstance().options.getBackgroundOpacity(0.25F) * 255.0F) << 24;
font.drawInBatch(name, x, 0.0F, 0xFFFFFFFF, false, matrix, bufferSource,
Font.DisplayMode.NORMAL, background, packedLight);
poseStack.popPose();
}
}