package net.minecraft.client.renderer.fog.environment; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.fog.FogData; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.material.FogType; import org.jetbrains.annotations.Nullable; @Environment(EnvType.CLIENT) public class AtmosphericFogEnvironment extends AirBasedFogEnvironment { private static final int MIN_RAIN_FOG_SKY_LIGHT = 8; private static final float RAIN_FOG_START_OFFSET = -160.0F; private static final float RAIN_FOG_END_OFFSET = -256.0F; private float rainFogMultiplier; @Override public void setupFog(FogData fogData, Entity entity, BlockPos pos, ClientLevel level, float renderDistance, DeltaTracker deltaTracker) { Biome biome = level.getBiome(pos).value(); float f = deltaTracker.getGameTimeDeltaTicks(); boolean bl = biome.hasPrecipitation(); float g = Mth.clamp((level.getLightEngine().getLayerListener(LightLayer.SKY).getLightValue(pos) - 8.0F) / 7.0F, 0.0F, 1.0F); float h = level.getRainLevel(deltaTracker.getGameTimeDeltaPartialTick(false)) * g * (bl ? 1.0F : 0.5F); this.rainFogMultiplier = this.rainFogMultiplier + (h - this.rainFogMultiplier) * f * 0.2F; fogData.environmentalStart = this.rainFogMultiplier * -160.0F; fogData.environmentalEnd = 1024.0F + -256.0F * this.rainFogMultiplier; fogData.skyEnd = renderDistance; fogData.cloudEnd = Minecraft.getInstance().options.cloudRange().get() * 16; } @Override public boolean isApplicable(@Nullable FogType fogType, Entity entity) { return fogType == FogType.ATMOSPHERIC; } }