package net.minecraft.client.renderer.entity; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MapRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.model.BlockStateModel; import net.minecraft.client.renderer.entity.state.ItemFrameRenderState; import net.minecraft.client.renderer.item.ItemModelResolver; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.resources.model.BlockStateDefinitions; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.decoration.ItemFrame; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.saveddata.maps.MapId; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public class ItemFrameRenderer extends EntityRenderer { public static final int GLOW_FRAME_BRIGHTNESS = 5; public static final int BRIGHT_MAP_LIGHT_ADJUSTMENT = 30; private final ItemModelResolver itemModelResolver; private final MapRenderer mapRenderer; private final BlockRenderDispatcher blockRenderer; public ItemFrameRenderer(EntityRendererProvider.Context p_174204_) { super(p_174204_); this.itemModelResolver = p_174204_.getItemModelResolver(); this.mapRenderer = p_174204_.getMapRenderer(); this.blockRenderer = p_174204_.getBlockRenderDispatcher(); } protected int getBlockLightLevel(T p_174216_, BlockPos p_174217_) { return p_174216_.getType() == EntityType.GLOW_ITEM_FRAME ? Math.max(5, super.getBlockLightLevel(p_174216_, p_174217_)) : super.getBlockLightLevel(p_174216_, p_174217_); } public void render(ItemFrameRenderState p_361692_, PoseStack p_115061_, MultiBufferSource p_115062_, int p_115063_) { super.render(p_361692_, p_115061_, p_115062_, p_115063_); p_115061_.pushPose(); Direction direction = p_361692_.direction; Vec3 vec3 = this.getRenderOffset(p_361692_); p_115061_.translate(-vec3.x(), -vec3.y(), -vec3.z()); double d0 = 0.46875; p_115061_.translate(direction.getStepX() * 0.46875, direction.getStepY() * 0.46875, direction.getStepZ() * 0.46875); float f; float f1; if (direction.getAxis().isHorizontal()) { f = 0.0F; f1 = 180.0F - direction.toYRot(); } else { f = -90 * direction.getAxisDirection().getStep(); f1 = 180.0F; } p_115061_.mulPose(Axis.XP.rotationDegrees(f)); p_115061_.mulPose(Axis.YP.rotationDegrees(f1)); if (!p_361692_.isInvisible) { BlockState blockstate = BlockStateDefinitions.getItemFrameFakeState(p_361692_.isGlowFrame, p_361692_.mapId != null); BlockStateModel blockstatemodel = this.blockRenderer.getBlockModel(blockstate); p_115061_.pushPose(); p_115061_.translate(-0.5F, -0.5F, -0.5F); ModelBlockRenderer.renderModel( p_115061_.last(), p_115062_.getBuffer(RenderType.entitySolidZOffsetForward(TextureAtlas.LOCATION_BLOCKS)), blockstatemodel, 1.0F, 1.0F, 1.0F, p_115063_, OverlayTexture.NO_OVERLAY ); p_115061_.popPose(); } if (p_361692_.isInvisible) { p_115061_.translate(0.0F, 0.0F, 0.5F); } else { p_115061_.translate(0.0F, 0.0F, 0.4375F); } if (p_361692_.mapId != null) { int j = p_361692_.rotation % 4 * 2; p_115061_.mulPose(Axis.ZP.rotationDegrees(j * 360.0F / 8.0F)); p_115061_.mulPose(Axis.ZP.rotationDegrees(180.0F)); float f2 = 0.0078125F; p_115061_.scale(0.0078125F, 0.0078125F, 0.0078125F); p_115061_.translate(-64.0F, -64.0F, 0.0F); p_115061_.translate(0.0F, 0.0F, -1.0F); int i = this.getLightCoords(p_361692_.isGlowFrame, 15728850, p_115063_); this.mapRenderer.render(p_361692_.mapRenderState, p_115061_, p_115062_, true, i); } else if (!p_361692_.item.isEmpty()) { p_115061_.mulPose(Axis.ZP.rotationDegrees(p_361692_.rotation * 360.0F / 8.0F)); int k = this.getLightCoords(p_361692_.isGlowFrame, 15728880, p_115063_); p_115061_.scale(0.5F, 0.5F, 0.5F); p_361692_.item.render(p_115061_, p_115062_, k, OverlayTexture.NO_OVERLAY); } p_115061_.popPose(); } private int getLightCoords(boolean p_368253_, int p_174210_, int p_174211_) { return p_368253_ ? p_174210_ : p_174211_; } public Vec3 getRenderOffset(ItemFrameRenderState p_368370_) { return new Vec3(p_368370_.direction.getStepX() * 0.3F, -0.25, p_368370_.direction.getStepZ() * 0.3F); } protected boolean shouldShowName(T p_115091_, double p_366137_) { return Minecraft.renderNames() && this.entityRenderDispatcher.crosshairPickEntity == p_115091_ && p_115091_.getItem().getCustomName() != null; } protected Component getNameTag(T p_364863_) { return p_364863_.getItem().getHoverName(); } public ItemFrameRenderState createRenderState() { return new ItemFrameRenderState(); } public void extractRenderState(T p_369136_, ItemFrameRenderState p_364469_, float p_366511_) { super.extractRenderState(p_369136_, p_364469_, p_366511_); p_364469_.direction = p_369136_.getDirection(); ItemStack itemstack = p_369136_.getItem(); this.itemModelResolver.updateForNonLiving(p_364469_.item, itemstack, ItemDisplayContext.FIXED, p_369136_); p_364469_.rotation = p_369136_.getRotation(); p_364469_.isGlowFrame = p_369136_.getType() == EntityType.GLOW_ITEM_FRAME; p_364469_.mapId = null; if (!itemstack.isEmpty()) { MapId mapid = p_369136_.getFramedMapId(itemstack); if (mapid != null) { MapItemSavedData mapitemsaveddata = p_369136_.level().getMapData(mapid); if (mapitemsaveddata != null) { this.mapRenderer.extractRenderState(mapid, mapitemsaveddata, p_364469_.mapRenderState); p_364469_.mapId = mapid; } } } } }