package net.minecraft.client.renderer.blockentity; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.SpawnerBlockEntity; import net.minecraft.world.phys.Vec3; @Environment(EnvType.CLIENT) public class SpawnerRenderer implements BlockEntityRenderer { private final EntityRenderDispatcher entityRenderer; public SpawnerRenderer(Context context) { this.entityRenderer = context.getEntityRenderer(); } public void render(SpawnerBlockEntity spawnerBlockEntity, float f, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, int j, Vec3 vec3) { Level level = spawnerBlockEntity.getLevel(); if (level != null) { BaseSpawner baseSpawner = spawnerBlockEntity.getSpawner(); Entity entity = baseSpawner.getOrCreateDisplayEntity(level, spawnerBlockEntity.getBlockPos()); if (entity != null) { renderEntityInSpawner(f, poseStack, multiBufferSource, i, entity, this.entityRenderer, baseSpawner.getoSpin(), baseSpawner.getSpin()); } } } public static void renderEntityInSpawner( float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight, Entity entity, EntityRenderDispatcher entityRenderer, double oSpin, double spin ) { poseStack.pushPose(); poseStack.translate(0.5F, 0.0F, 0.5F); float f = 0.53125F; float g = Math.max(entity.getBbWidth(), entity.getBbHeight()); if (g > 1.0) { f /= g; } poseStack.translate(0.0F, 0.4F, 0.0F); poseStack.mulPose(Axis.YP.rotationDegrees((float)Mth.lerp((double)partialTick, oSpin, spin) * 10.0F)); poseStack.translate(0.0F, -0.2F, 0.0F); poseStack.mulPose(Axis.XP.rotationDegrees(-30.0F)); poseStack.scale(f, f, f); entityRenderer.render(entity, 0.0, 0.0, 0.0, partialTick, poseStack, buffer, packedLight); poseStack.popPose(); } }