package net.minecraft.client.renderer; import com.mojang.blaze3d.ProjectionType; import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.resource.CrossFrameResourcePool; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.logging.LogUtils; import com.mojang.math.Axis; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Locale; import javax.annotation.Nullable; import net.minecraft.CrashReport; import net.minecraft.CrashReportCategory; import net.minecraft.ReportedException; import net.minecraft.Util; import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; import net.minecraft.client.Screenshot; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.server.IntegratedServer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceProvider; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.util.profiling.Profiler; import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.util.profiling.Zone; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntitySelector; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.monster.Creeper; import net.minecraft.world.entity.monster.EnderMan; import net.minecraft.world.entity.monster.Spider; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.ProjectileUtil; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.pattern.BlockInWorld; import net.minecraft.world.level.material.FogType; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.joml.Matrix4f; import org.joml.Matrix4fStack; import org.joml.Quaternionf; import org.joml.Vector3f; import org.slf4j.Logger; @OnlyIn(Dist.CLIENT) public class GameRenderer implements AutoCloseable { private static final ResourceLocation BLUR_POST_CHAIN_ID = ResourceLocation.withDefaultNamespace("blur"); public static final int MAX_BLUR_RADIUS = 10; private static final Logger LOGGER = LogUtils.getLogger(); private static final boolean DEPTH_BUFFER_DEBUG = false; public static final float PROJECTION_Z_NEAR = 0.05F; private static final float GUI_Z_NEAR = 1000.0F; private final Minecraft minecraft; private final ResourceManager resourceManager; private final RandomSource random = RandomSource.create(); private float renderDistance; public final ItemInHandRenderer itemInHandRenderer; private final RenderBuffers renderBuffers; private int confusionAnimationTick; private float fovModifier; private float oldFovModifier; private float darkenWorldAmount; private float darkenWorldAmountO; private boolean renderHand = true; private boolean renderBlockOutline = true; private long lastScreenshotAttempt; private boolean hasWorldScreenshot; private long lastActiveTime = Util.getMillis(); private final LightTexture lightTexture; private final OverlayTexture overlayTexture = new OverlayTexture(); private boolean panoramicMode; private float zoom = 1.0F; private float zoomX; private float zoomY; public static final int ITEM_ACTIVATION_ANIMATION_LENGTH = 40; @Nullable private ItemStack itemActivationItem; private int itemActivationTicks; private float itemActivationOffX; private float itemActivationOffY; private final CrossFrameResourcePool resourcePool = new CrossFrameResourcePool(3); @Nullable private ResourceLocation postEffectId; private boolean effectActive; private final Camera mainCamera = new Camera(); public GameRenderer(Minecraft p_234219_, ItemInHandRenderer p_234220_, ResourceManager p_234221_, RenderBuffers p_234222_) { this.minecraft = p_234219_; this.resourceManager = p_234221_; this.itemInHandRenderer = p_234220_; this.lightTexture = new LightTexture(this, p_234219_); this.renderBuffers = p_234222_; } @Override public void close() { this.lightTexture.close(); this.overlayTexture.close(); this.resourcePool.close(); } public void setRenderHand(boolean p_172737_) { this.renderHand = p_172737_; } public void setRenderBlockOutline(boolean p_172776_) { this.renderBlockOutline = p_172776_; } public void setPanoramicMode(boolean p_172780_) { this.panoramicMode = p_172780_; } public boolean isPanoramicMode() { return this.panoramicMode; } public void clearPostEffect() { this.postEffectId = null; } public void togglePostEffect() { this.effectActive = !this.effectActive; } public void checkEntityPostEffect(@Nullable Entity p_109107_) { this.postEffectId = null; if (p_109107_ instanceof Creeper) { this.setPostEffect(ResourceLocation.withDefaultNamespace("creeper")); } else if (p_109107_ instanceof Spider) { this.setPostEffect(ResourceLocation.withDefaultNamespace("spider")); } else if (p_109107_ instanceof EnderMan) { this.setPostEffect(ResourceLocation.withDefaultNamespace("invert")); } } private void setPostEffect(ResourceLocation p_367260_) { this.postEffectId = p_367260_; this.effectActive = true; } public void processBlurEffect() { float f = (float)this.minecraft.options.getMenuBackgroundBlurriness(); if (!(f < 1.0F)) { PostChain postchain = this.minecraft.getShaderManager().getPostChain(BLUR_POST_CHAIN_ID, LevelTargetBundle.MAIN_TARGETS); if (postchain != null) { postchain.setUniform("Radius", f); postchain.process(this.minecraft.getMainRenderTarget(), this.resourcePool); } } } public void preloadUiShader(ResourceProvider p_172723_) { try { this.minecraft.getShaderManager().preloadForStartup(p_172723_, CoreShaders.RENDERTYPE_GUI, CoreShaders.RENDERTYPE_GUI_OVERLAY, CoreShaders.POSITION_TEX_COLOR); } catch (ShaderManager.CompilationException | IOException ioexception) { throw new RuntimeException("Could not preload shaders for loading UI", ioexception); } } public void tick() { this.tickFov(); this.lightTexture.tick(); if (this.minecraft.getCameraEntity() == null) { this.minecraft.setCameraEntity(this.minecraft.player); } this.mainCamera.tick(); this.itemInHandRenderer.tick(); this.confusionAnimationTick++; if (this.minecraft.level.tickRateManager().runsNormally()) { this.minecraft.levelRenderer.tickParticles(this.mainCamera); this.darkenWorldAmountO = this.darkenWorldAmount; if (this.minecraft.gui.getBossOverlay().shouldDarkenScreen()) { this.darkenWorldAmount += 0.05F; if (this.darkenWorldAmount > 1.0F) { this.darkenWorldAmount = 1.0F; } } else if (this.darkenWorldAmount > 0.0F) { this.darkenWorldAmount -= 0.0125F; } if (this.itemActivationTicks > 0) { this.itemActivationTicks--; if (this.itemActivationTicks == 0) { this.itemActivationItem = null; } } } } @Nullable public ResourceLocation currentPostEffect() { return this.postEffectId; } public void resize(int p_109098_, int p_109099_) { this.resourcePool.clear(); this.minecraft.levelRenderer.resize(p_109098_, p_109099_); } public void pick(float p_109088_) { Entity entity = this.minecraft.getCameraEntity(); if (entity != null) { if (this.minecraft.level != null && this.minecraft.player != null) { Profiler.get().push("pick"); double d0 = this.minecraft.player.blockInteractionRange(); double d1 = this.minecraft.player.entityInteractionRange(); HitResult hitresult = this.pick(entity, d0, d1, p_109088_); this.minecraft.hitResult = hitresult; this.minecraft.crosshairPickEntity = hitresult instanceof EntityHitResult entityhitresult ? entityhitresult.getEntity() : null; Profiler.get().pop(); } } } private HitResult pick(Entity p_328026_, double p_328198_, double p_332188_, float p_336363_) { double d0 = Math.max(p_328198_, p_332188_); double d1 = Mth.square(d0); Vec3 vec3 = p_328026_.getEyePosition(p_336363_); HitResult hitresult = p_328026_.pick(d0, p_336363_, false); double d2 = hitresult.getLocation().distanceToSqr(vec3); if (hitresult.getType() != HitResult.Type.MISS) { d1 = d2; d0 = Math.sqrt(d2); } Vec3 vec31 = p_328026_.getViewVector(p_336363_); Vec3 vec32 = vec3.add(vec31.x * d0, vec31.y * d0, vec31.z * d0); float f = 1.0F; AABB aabb = p_328026_.getBoundingBox().expandTowards(vec31.scale(d0)).inflate(1.0, 1.0, 1.0); EntityHitResult entityhitresult = ProjectileUtil.getEntityHitResult(p_328026_, vec3, vec32, aabb, EntitySelector.CAN_BE_PICKED, d1); return entityhitresult != null && entityhitresult.getLocation().distanceToSqr(vec3) < d2 ? filterHitResult(entityhitresult, vec3, p_332188_) : filterHitResult(hitresult, vec3, p_328198_); } private static HitResult filterHitResult(HitResult p_333216_, Vec3 p_336005_, double p_334240_) { Vec3 vec3 = p_333216_.getLocation(); if (!vec3.closerThan(p_336005_, p_334240_)) { Vec3 vec31 = p_333216_.getLocation(); Direction direction = Direction.getApproximateNearest( vec31.x - p_336005_.x, vec31.y - p_336005_.y, vec31.z - p_336005_.z ); return BlockHitResult.miss(vec31, direction, BlockPos.containing(vec31)); } else { return p_333216_; } } private void tickFov() { float f; if (this.minecraft.getCameraEntity() instanceof AbstractClientPlayer abstractclientplayer) { Options options = this.minecraft.options; boolean flag = options.getCameraType().isFirstPerson(); float f1 = options.fovEffectScale().get().floatValue(); f = abstractclientplayer.getFieldOfViewModifier(flag, f1); } else { f = 1.0F; } this.oldFovModifier = this.fovModifier; this.fovModifier = this.fovModifier + (f - this.fovModifier) * 0.5F; this.fovModifier = Mth.clamp(this.fovModifier, 0.1F, 1.5F); } private float getFov(Camera p_109142_, float p_109143_, boolean p_109144_) { if (this.panoramicMode) { return 90.0F; } else { float f = 70.0F; if (p_109144_) { f = (float)this.minecraft.options.fov().get().intValue(); f *= Mth.lerp(p_109143_, this.oldFovModifier, this.fovModifier); } if (p_109142_.getEntity() instanceof LivingEntity livingentity && livingentity.isDeadOrDying()) { float f1 = Math.min((float)livingentity.deathTime + p_109143_, 20.0F); f /= (1.0F - 500.0F / (f1 + 500.0F)) * 2.0F + 1.0F; } FogType fogtype = p_109142_.getFluidInCamera(); if (fogtype == FogType.LAVA || fogtype == FogType.WATER) { float f2 = this.minecraft.options.fovEffectScale().get().floatValue(); f *= Mth.lerp(f2, 1.0F, 0.85714287F); } return f; } } private void bobHurt(PoseStack p_109118_, float p_109119_) { if (this.minecraft.getCameraEntity() instanceof LivingEntity livingentity) { float f2 = (float)livingentity.hurtTime - p_109119_; if (livingentity.isDeadOrDying()) { float f = Math.min((float)livingentity.deathTime + p_109119_, 20.0F); p_109118_.mulPose(Axis.ZP.rotationDegrees(40.0F - 8000.0F / (f + 200.0F))); } if (f2 < 0.0F) { return; } f2 /= (float)livingentity.hurtDuration; f2 = Mth.sin(f2 * f2 * f2 * f2 * (float) Math.PI); float f3 = livingentity.getHurtDir(); p_109118_.mulPose(Axis.YP.rotationDegrees(-f3)); float f1 = (float)((double)(-f2) * 14.0 * this.minecraft.options.damageTiltStrength().get()); p_109118_.mulPose(Axis.ZP.rotationDegrees(f1)); p_109118_.mulPose(Axis.YP.rotationDegrees(f3)); } } private void bobView(PoseStack p_109139_, float p_109140_) { if (this.minecraft.getCameraEntity() instanceof AbstractClientPlayer abstractclientplayer) { float f2 = abstractclientplayer.walkDist - abstractclientplayer.walkDistO; float $$5 = -(abstractclientplayer.walkDist + f2 * p_109140_); float $$6 = Mth.lerp(p_109140_, abstractclientplayer.oBob, abstractclientplayer.bob); p_109139_.translate(Mth.sin($$5 * (float) Math.PI) * $$6 * 0.5F, -Math.abs(Mth.cos($$5 * (float) Math.PI) * $$6), 0.0F); p_109139_.mulPose(Axis.ZP.rotationDegrees(Mth.sin($$5 * (float) Math.PI) * $$6 * 3.0F)); p_109139_.mulPose(Axis.XP.rotationDegrees(Math.abs(Mth.cos($$5 * (float) Math.PI - 0.2F) * $$6) * 5.0F)); } } public void renderZoomed(float p_172719_, float p_172720_, float p_172721_) { this.zoom = p_172719_; this.zoomX = p_172720_; this.zoomY = p_172721_; this.setRenderBlockOutline(false); this.setRenderHand(false); this.renderLevel(DeltaTracker.ZERO); this.zoom = 1.0F; } private void renderItemInHand(Camera p_109122_, float p_109123_, Matrix4f p_331664_) { if (!this.panoramicMode) { Matrix4f matrix4f = this.getProjectionMatrix(this.getFov(p_109122_, p_109123_, false)); RenderSystem.setProjectionMatrix(matrix4f, ProjectionType.PERSPECTIVE); PoseStack posestack = new PoseStack(); posestack.pushPose(); posestack.mulPose(p_331664_.invert(new Matrix4f())); Matrix4fStack matrix4fstack = RenderSystem.getModelViewStack(); matrix4fstack.pushMatrix().mul(p_331664_); this.bobHurt(posestack, p_109123_); if (this.minecraft.options.bobView().get()) { this.bobView(posestack, p_109123_); } boolean flag = this.minecraft.getCameraEntity() instanceof LivingEntity && ((LivingEntity)this.minecraft.getCameraEntity()).isSleeping(); if (this.minecraft.options.getCameraType().isFirstPerson() && !flag && !this.minecraft.options.hideGui && this.minecraft.gameMode.getPlayerMode() != GameType.SPECTATOR) { this.lightTexture.turnOnLightLayer(); this.itemInHandRenderer .renderHandsWithItems( p_109123_, posestack, this.renderBuffers.bufferSource(), this.minecraft.player, this.minecraft.getEntityRenderDispatcher().getPackedLightCoords(this.minecraft.player, p_109123_) ); this.lightTexture.turnOffLightLayer(); } matrix4fstack.popMatrix(); posestack.popPose(); if (this.minecraft.options.getCameraType().isFirstPerson() && !flag) { MultiBufferSource.BufferSource multibuffersource$buffersource = this.renderBuffers.bufferSource(); ScreenEffectRenderer.renderScreenEffect(this.minecraft, posestack, multibuffersource$buffersource); multibuffersource$buffersource.endBatch(); } } } public Matrix4f getProjectionMatrix(float p_364788_) { Matrix4f matrix4f = new Matrix4f(); if (this.zoom != 1.0F) { matrix4f.translate(this.zoomX, -this.zoomY, 0.0F); matrix4f.scale(this.zoom, this.zoom, 1.0F); } return matrix4f.perspective( p_364788_ * (float) (Math.PI / 180.0), (float)this.minecraft.getWindow().getWidth() / (float)this.minecraft.getWindow().getHeight(), 0.05F, this.getDepthFar() ); } public float getDepthFar() { return this.renderDistance * 4.0F; } public static float getNightVisionScale(LivingEntity p_109109_, float p_109110_) { MobEffectInstance mobeffectinstance = p_109109_.getEffect(MobEffects.NIGHT_VISION); return !mobeffectinstance.endsWithin(200) ? 1.0F : 0.7F + Mth.sin(((float)mobeffectinstance.getDuration() - p_109110_) * (float) Math.PI * 0.2F) * 0.3F; } public void render(DeltaTracker p_343467_, boolean p_109096_) { if (!this.minecraft.isWindowActive() && this.minecraft.options.pauseOnLostFocus && (!this.minecraft.options.touchscreen().get() || !this.minecraft.mouseHandler.isRightPressed())) { if (Util.getMillis() - this.lastActiveTime > 500L) { this.minecraft.pauseGame(false); } } else { this.lastActiveTime = Util.getMillis(); } if (!this.minecraft.noRender) { ProfilerFiller profilerfiller = Profiler.get(); boolean flag = this.minecraft.isGameLoadFinished(); int i = (int)(this.minecraft.mouseHandler.xpos() * (double)this.minecraft.getWindow().getGuiScaledWidth() / (double)this.minecraft.getWindow().getScreenWidth()); int j = (int)(this.minecraft.mouseHandler.ypos() * (double)this.minecraft.getWindow().getGuiScaledHeight() / (double)this.minecraft.getWindow().getScreenHeight()); RenderSystem.viewport(0, 0, this.minecraft.getWindow().getWidth(), this.minecraft.getWindow().getHeight()); if (flag && p_109096_ && this.minecraft.level != null) { profilerfiller.push("level"); this.renderLevel(p_343467_); this.tryTakeScreenshotIfNeeded(); this.minecraft.levelRenderer.doEntityOutline(); if (this.postEffectId != null && this.effectActive) { RenderSystem.disableBlend(); RenderSystem.disableDepthTest(); RenderSystem.resetTextureMatrix(); PostChain postchain = this.minecraft.getShaderManager().getPostChain(this.postEffectId, LevelTargetBundle.MAIN_TARGETS); if (postchain != null) { postchain.process(this.minecraft.getMainRenderTarget(), this.resourcePool); } } this.minecraft.getMainRenderTarget().bindWrite(true); } Window window = this.minecraft.getWindow(); RenderSystem.clear(256); Matrix4f matrix4f = new Matrix4f() .setOrtho( 0.0F, (float)((double)window.getWidth() / window.getGuiScale()), (float)((double)window.getHeight() / window.getGuiScale()), 0.0F, 1000.0F, 21000.0F ); RenderSystem.setProjectionMatrix(matrix4f, ProjectionType.ORTHOGRAPHIC); Matrix4fStack matrix4fstack = RenderSystem.getModelViewStack(); matrix4fstack.pushMatrix(); matrix4fstack.translation(0.0F, 0.0F, -11000.0F); Lighting.setupFor3DItems(); GuiGraphics guigraphics = new GuiGraphics(this.minecraft, this.renderBuffers.bufferSource()); if (flag && p_109096_ && this.minecraft.level != null) { profilerfiller.popPush("gui"); if (!this.minecraft.options.hideGui) { this.renderItemActivationAnimation(guigraphics, p_343467_.getGameTimeDeltaPartialTick(false)); } this.minecraft.gui.render(guigraphics, p_343467_); guigraphics.flush(); RenderSystem.clear(256); profilerfiller.pop(); } if (this.minecraft.getOverlay() != null) { try { this.minecraft.getOverlay().render(guigraphics, i, j, p_343467_.getGameTimeDeltaTicks()); } catch (Throwable throwable2) { CrashReport crashreport = CrashReport.forThrowable(throwable2, "Rendering overlay"); CrashReportCategory crashreportcategory = crashreport.addCategory("Overlay render details"); crashreportcategory.setDetail("Overlay name", () -> this.minecraft.getOverlay().getClass().getCanonicalName()); throw new ReportedException(crashreport); } } else if (flag && this.minecraft.screen != null) { try { this.minecraft.screen.renderWithTooltip(guigraphics, i, j, p_343467_.getGameTimeDeltaTicks()); } catch (Throwable throwable1) { CrashReport crashreport1 = CrashReport.forThrowable(throwable1, "Rendering screen"); CrashReportCategory crashreportcategory1 = crashreport1.addCategory("Screen render details"); crashreportcategory1.setDetail("Screen name", () -> this.minecraft.screen.getClass().getCanonicalName()); crashreportcategory1.setDetail( "Mouse location", () -> String.format( Locale.ROOT, "Scaled: (%d, %d). Absolute: (%f, %f)", i, j, this.minecraft.mouseHandler.xpos(), this.minecraft.mouseHandler.ypos() ) ); crashreportcategory1.setDetail( "Screen size", () -> String.format( Locale.ROOT, "Scaled: (%d, %d). Absolute: (%d, %d). Scale factor of %f", this.minecraft.getWindow().getGuiScaledWidth(), this.minecraft.getWindow().getGuiScaledHeight(), this.minecraft.getWindow().getWidth(), this.minecraft.getWindow().getHeight(), this.minecraft.getWindow().getGuiScale() ) ); throw new ReportedException(crashreport1); } try { if (this.minecraft.screen != null) { this.minecraft.screen.handleDelayedNarration(); } } catch (Throwable throwable) { CrashReport crashreport2 = CrashReport.forThrowable(throwable, "Narrating screen"); CrashReportCategory crashreportcategory2 = crashreport2.addCategory("Screen details"); crashreportcategory2.setDetail("Screen name", () -> this.minecraft.screen.getClass().getCanonicalName()); throw new ReportedException(crashreport2); } } if (flag && p_109096_ && this.minecraft.level != null) { this.minecraft.gui.renderSavingIndicator(guigraphics, p_343467_); } if (flag) { try (Zone zone = profilerfiller.zone("toasts")) { this.minecraft.getToastManager().render(guigraphics); } } guigraphics.flush(); matrix4fstack.popMatrix(); this.resourcePool.endFrame(); } } private void tryTakeScreenshotIfNeeded() { if (!this.hasWorldScreenshot && this.minecraft.isLocalServer()) { long i = Util.getMillis(); if (i - this.lastScreenshotAttempt >= 1000L) { this.lastScreenshotAttempt = i; IntegratedServer integratedserver = this.minecraft.getSingleplayerServer(); if (integratedserver != null && !integratedserver.isStopped()) { integratedserver.getWorldScreenshotFile().ifPresent(p_234239_ -> { if (Files.isRegularFile(p_234239_)) { this.hasWorldScreenshot = true; } else { this.takeAutoScreenshot(p_234239_); } }); } } } } private void takeAutoScreenshot(Path p_182643_) { if (this.minecraft.levelRenderer.countRenderedSections() > 10 && this.minecraft.levelRenderer.hasRenderedAllSections()) { NativeImage nativeimage = Screenshot.takeScreenshot(this.minecraft.getMainRenderTarget()); Util.ioPool().execute(() -> { int i = nativeimage.getWidth(); int j = nativeimage.getHeight(); int k = 0; int l = 0; if (i > j) { k = (i - j) / 2; i = j; } else { l = (j - i) / 2; j = i; } try (NativeImage nativeimage1 = new NativeImage(64, 64, false)) { nativeimage.resizeSubRectTo(k, l, i, j, nativeimage1); nativeimage1.writeToFile(p_182643_); } catch (IOException ioexception) { LOGGER.warn("Couldn't save auto screenshot", (Throwable)ioexception); } finally { nativeimage.close(); } }); } } private boolean shouldRenderBlockOutline() { if (!this.renderBlockOutline) { return false; } else { Entity entity = this.minecraft.getCameraEntity(); boolean flag = entity instanceof Player && !this.minecraft.options.hideGui; if (flag && !((Player)entity).getAbilities().mayBuild) { ItemStack itemstack = ((LivingEntity)entity).getMainHandItem(); HitResult hitresult = this.minecraft.hitResult; if (hitresult != null && hitresult.getType() == HitResult.Type.BLOCK) { BlockPos blockpos = ((BlockHitResult)hitresult).getBlockPos(); BlockState blockstate = this.minecraft.level.getBlockState(blockpos); if (this.minecraft.gameMode.getPlayerMode() == GameType.SPECTATOR) { flag = blockstate.getMenuProvider(this.minecraft.level, blockpos) != null; } else { BlockInWorld blockinworld = new BlockInWorld(this.minecraft.level, blockpos, false); Registry registry = this.minecraft.level.registryAccess().lookupOrThrow(Registries.BLOCK); flag = !itemstack.isEmpty() && (itemstack.canBreakBlockInAdventureMode(blockinworld) || itemstack.canPlaceOnBlockInAdventureMode(blockinworld)); } } } return flag; } } public void renderLevel(DeltaTracker p_342230_) { float f = p_342230_.getGameTimeDeltaPartialTick(true); this.lightTexture.updateLightTexture(f); if (this.minecraft.getCameraEntity() == null) { this.minecraft.setCameraEntity(this.minecraft.player); } this.pick(f); ProfilerFiller profilerfiller = Profiler.get(); profilerfiller.push("center"); boolean flag = this.shouldRenderBlockOutline(); profilerfiller.popPush("camera"); Camera camera = this.mainCamera; Entity entity = (Entity)(this.minecraft.getCameraEntity() == null ? this.minecraft.player : this.minecraft.getCameraEntity()); float f1 = this.minecraft.level.tickRateManager().isEntityFrozen(entity) ? 1.0F : f; camera.setup(this.minecraft.level, entity, !this.minecraft.options.getCameraType().isFirstPerson(), this.minecraft.options.getCameraType().isMirrored(), f1); this.renderDistance = (float)(this.minecraft.options.getEffectiveRenderDistance() * 16); float f2 = this.getFov(camera, f, true); Matrix4f matrix4f = this.getProjectionMatrix(f2); PoseStack posestack = new PoseStack(); this.bobHurt(posestack, camera.getPartialTickTime()); if (this.minecraft.options.bobView().get()) { this.bobView(posestack, camera.getPartialTickTime()); } matrix4f.mul(posestack.last().pose()); float f3 = this.minecraft.options.screenEffectScale().get().floatValue(); float f4 = Mth.lerp(f, this.minecraft.player.oSpinningEffectIntensity, this.minecraft.player.spinningEffectIntensity) * f3 * f3; if (f4 > 0.0F) { int i = this.minecraft.player.hasEffect(MobEffects.CONFUSION) ? 7 : 20; float f5 = 5.0F / (f4 * f4 + 5.0F) - f4 * 0.04F; f5 *= f5; Vector3f vector3f = new Vector3f(0.0F, Mth.SQRT_OF_TWO / 2.0F, Mth.SQRT_OF_TWO / 2.0F); float f6 = ((float)this.confusionAnimationTick + f) * (float)i * (float) (Math.PI / 180.0); matrix4f.rotate(f6, vector3f); matrix4f.scale(1.0F / f5, 1.0F, 1.0F); matrix4f.rotate(-f6, vector3f); } float f7 = Math.max(f2, (float)this.minecraft.options.fov().get().intValue()); Matrix4f matrix4f1 = this.getProjectionMatrix(f7); RenderSystem.setProjectionMatrix(matrix4f, ProjectionType.PERSPECTIVE); Quaternionf quaternionf = camera.rotation().conjugate(new Quaternionf()); Matrix4f matrix4f2 = new Matrix4f().rotation(quaternionf); this.minecraft.levelRenderer.prepareCullFrustum(camera.getPosition(), matrix4f2, matrix4f1); this.minecraft.getMainRenderTarget().bindWrite(true); this.minecraft.levelRenderer.renderLevel(this.resourcePool, p_342230_, flag, camera, this, matrix4f2, matrix4f); profilerfiller.popPush("hand"); if (this.renderHand) { RenderSystem.clear(256); this.renderItemInHand(camera, f, matrix4f2); } profilerfiller.pop(); } public void resetData() { this.itemActivationItem = null; this.minecraft.getMapTextureManager().resetData(); this.mainCamera.reset(); this.hasWorldScreenshot = false; } public void displayItemActivation(ItemStack p_109114_) { this.itemActivationItem = p_109114_; this.itemActivationTicks = 40; this.itemActivationOffX = this.random.nextFloat() * 2.0F - 1.0F; this.itemActivationOffY = this.random.nextFloat() * 2.0F - 1.0F; } private void renderItemActivationAnimation(GuiGraphics p_342383_, float p_109103_) { if (this.itemActivationItem != null && this.itemActivationTicks > 0) { int i = 40 - this.itemActivationTicks; float f = ((float)i + p_109103_) / 40.0F; float f1 = f * f; float f2 = f * f1; float f3 = 10.25F * f2 * f1 - 24.95F * f1 * f1 + 25.5F * f2 - 13.8F * f1 + 4.0F * f; float f4 = f3 * (float) Math.PI; float f5 = this.itemActivationOffX * (float)(p_342383_.guiWidth() / 4); float f6 = this.itemActivationOffY * (float)(p_342383_.guiHeight() / 4); PoseStack posestack = p_342383_.pose(); posestack.pushPose(); posestack.translate( (float)(p_342383_.guiWidth() / 2) + f5 * Mth.abs(Mth.sin(f4 * 2.0F)), (float)(p_342383_.guiHeight() / 2) + f6 * Mth.abs(Mth.sin(f4 * 2.0F)), -50.0F ); float f7 = 50.0F + 175.0F * Mth.sin(f4); posestack.scale(f7, -f7, f7); posestack.mulPose(Axis.YP.rotationDegrees(900.0F * Mth.abs(Mth.sin(f4)))); posestack.mulPose(Axis.XP.rotationDegrees(6.0F * Mth.cos(f * 8.0F))); posestack.mulPose(Axis.ZP.rotationDegrees(6.0F * Mth.cos(f * 8.0F))); p_342383_.drawSpecial( p_357824_ -> this.minecraft .getItemRenderer() .renderStatic( this.itemActivationItem, ItemDisplayContext.FIXED, 15728880, OverlayTexture.NO_OVERLAY, posestack, p_357824_, this.minecraft.level, 0 ) ); posestack.popPose(); } } public Minecraft getMinecraft() { return this.minecraft; } public float getDarkenWorldAmount(float p_109132_) { return Mth.lerp(p_109132_, this.darkenWorldAmountO, this.darkenWorldAmount); } public float getRenderDistance() { return this.renderDistance; } public Camera getMainCamera() { return this.mainCamera; } public LightTexture lightTexture() { return this.lightTexture; } public OverlayTexture overlayTexture() { return this.overlayTexture; } }