From 3fa0933ac85b2db10fbf08521e56048282deb290 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 13 Oct 2022 07:51:46 +0700 Subject: [PATCH] Show teleportation location and phase-through blocks --- .../android/feature/EnderTeleporterFeature.kt | 68 +++++++++++--- .../otm/client/render/DynamicBufferSource.kt | 13 ++- .../mc/otm/client/render/RenderHelper.kt | 26 +++++- .../blockentity/MatterReplicatorRenderer.kt | 6 +- .../resources/META-INF/accesstransformer.cfg | 93 +++++++++++++++++++ 5 files changed, 185 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt index 7ea9607be..a61c2ab8a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt @@ -2,9 +2,9 @@ package ru.dbotthepony.mc.otm.android.feature import com.mojang.blaze3d.systems.RenderSystem import com.mojang.blaze3d.vertex.PoseStack -import com.mojang.math.Quaternion import com.mojang.math.Vector3f import net.minecraft.ChatFormatting +import net.minecraft.client.renderer.LevelRenderer import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.nbt.CompoundTag @@ -15,11 +15,11 @@ import net.minecraft.sounds.SoundSource import net.minecraft.world.level.ClipContext import net.minecraft.world.level.block.Block import net.minecraft.world.level.material.Material -import net.minecraft.world.phys.BlockHitResult import net.minecraft.world.phys.HitResult import net.minecraft.world.phys.shapes.CollisionContext import net.minecraftforge.client.event.RenderLevelStageEvent import net.minecraftforge.event.entity.living.LivingDeathEvent +import org.lwjgl.opengl.GL11.GL_ALWAYS import org.lwjgl.opengl.GL11.GL_LESS import ru.dbotthepony.mc.otm.NULLABLE_MINECRAFT_SERVER import ru.dbotthepony.mc.otm.OverdriveThatMatters @@ -29,8 +29,12 @@ import ru.dbotthepony.mc.otm.android.AndroidResearchManager import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.capability.extractEnergyInnerExact import ru.dbotthepony.mc.otm.capability.matteryPlayer +import ru.dbotthepony.mc.otm.client.minecraft +import ru.dbotthepony.mc.otm.client.render.DynamicBufferSource import ru.dbotthepony.mc.otm.client.render.ResearchIcons import ru.dbotthepony.mc.otm.client.render.element +import ru.dbotthepony.mc.otm.client.render.linesIgnoreZRenderType +import ru.dbotthepony.mc.otm.core.ImmutableList import ru.dbotthepony.mc.otm.core.Vector import ru.dbotthepony.mc.otm.core.asVector import ru.dbotthepony.mc.otm.core.component1 @@ -86,7 +90,13 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv return false } - private fun trace(): BlockPos? { + private data class TraceResult(val pos: BlockPos? = null, val phasedBlocks: Collection = listOf()) { + companion object { + val EMPTY = TraceResult() + } + } + + private fun trace(): TraceResult { val headPosition = ply.eyePosition val aimVector = ply.getViewVector(1f) @@ -99,7 +109,7 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv )) if (result.isInside || result.type == HitResult.Type.MISS) { - return null + return TraceResult.EMPTY } if ( @@ -107,18 +117,18 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv isValidPosition(result.blockPos.above()) && shortestDistanceBetween(ply.genericPositions(), result.blockPos.above().asVector()) <= ServerConfig.EnderTeleporter.MAX_DISTANCE ) { - return result.blockPos.above() + return TraceResult(result.blockPos.above()) } for (y in 0 .. ServerConfig.EnderTeleporter.MAX_PHASE_DISTANCE) { val pos = result.blockPos + BlockPos(0, y + 1, 0) if (isValidPosition(pos) && shortestDistanceBetween(ply.genericPositions(), pos.asVector()) <= ServerConfig.EnderTeleporter.MAX_DISTANCE) { - return pos + return TraceResult(pos, if (y != 0) ImmutableList(y + 1) { result.blockPos + BlockPos(0, it, 0) } else listOf()) } } - return null + return TraceResult.EMPTY } override fun activate(isClient: Boolean): Boolean { @@ -126,7 +136,8 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv return false } - val blockPos = trace() ?: return false + val (blockPos) = trace() + blockPos ?: return false cooldown = ServerConfig.EnderTeleporter.COOLDOWN @@ -152,14 +163,19 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv } } + override val previewRenderStage: RenderLevelStageEvent.Stage + get() = RenderLevelStageEvent.Stage.AFTER_PARTICLES + override fun renderPreview(event: RenderLevelStageEvent) { if (!canUse()) return - val pos = trace() + val (pos, phasedBlocks) = trace() if (pos != null) { val (x, y, z) = pos.asVector() val (vx, vy, vz) = event.camera.position - //event.poseStack.translate(x, y, z) + + if (phasedBlocks.isNotEmpty()) + event.poseStack.pushPose() event.poseStack.translate(x - vx, y - vy, z - vz) event.poseStack.mulPose(Vector3f.YP.rotationDegrees(-event.camera.yRot)) @@ -168,12 +184,36 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv val size = 1f + sin((System.nanoTime() / 1_000_000) / 250.0).toFloat() * 0.2f val half = size / -2f - RenderSystem.enableDepthTest() - RenderSystem.depthFunc(GL_LESS) + RenderSystem.disableDepthTest() RenderSystem.setShaderColor(1f, 1f, 1f, 0.5f) SPRITE.render(event.poseStack, x = half, y = half, width = size, height = size) RenderSystem.setShaderColor(1f, 1f, 1f, 1f) + + if (phasedBlocks.isNotEmpty()) { + event.poseStack.popPose() + val collisionContext = CollisionContext.of(ply) + val builder = source.getBuffer(linesIgnoreZRenderType) + + for (blockPos in phasedBlocks) { + val blockState = ply.level.getBlockState(blockPos) + val shape = blockState.getShape(ply.level, blockPos, collisionContext) + + LevelRenderer.renderShape( + event.poseStack, + builder, + shape, + blockPos.x - vx, + blockPos.y - vy, + blockPos.z - vz, + 1f, 1f, 1f, 1f + ) + } + + source.endBatch(linesIgnoreZRenderType) + } + + RenderSystem.enableDepthTest() } } @@ -190,6 +230,10 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv } companion object { + private val source by lazy { + DynamicBufferSource(maximalInitialBufferSize = 256) + } + val SPRITE = ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/item/black_hole.png").element(0f, 0f, 16f, 16f, 16f, 16f) val POWER_COST_DESCRIPTION = diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/DynamicBufferSource.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/DynamicBufferSource.kt index 5a2a0c346..2e54a7fee 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/DynamicBufferSource.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/DynamicBufferSource.kt @@ -62,7 +62,12 @@ private fun equals(existing: ImmutableList?, types: ImmutableList= 0) { "Invalid minimal buffer size $minimalInitialBufferSize" } + require(maximalInitialBufferSize >= minimalInitialBufferSize) { "Maximal buffer size $maximalInitialBufferSize must be greater or equal to minimal buffer size $minimalInitialBufferSize" } + } + private inner class State( val type: RenderType, var after: ImmutableList? = null, @@ -95,7 +100,7 @@ class DynamicBufferSource(val minimalBufferSize: Int = 0) : MultiBufferSource { var priority = -1 var dirty: Boolean = false val builder by lazy(LazyThreadSafetyMode.NONE) { - BufferBuilder(type.bufferSize().coerceAtLeast(minimalBufferSize)) + BufferBuilder(type.bufferSize().coerceAtLeast(minimalInitialBufferSize).coerceAtMost(maximalInitialBufferSize)) } } @@ -387,8 +392,8 @@ class DynamicBufferSource(val minimalBufferSize: Int = 0) : MultiBufferSource { } companion object { - val GUI = DynamicBufferSource() - val WORLD = DynamicBufferSource(2 shl 16) + val GUI = DynamicBufferSource(maximalInitialBufferSize = 2 shl 8) + val WORLD = DynamicBufferSource(minimalInitialBufferSize = 2 shl 12) /** * Called from LevelRenderer diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/RenderHelper.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/RenderHelper.kt index 65e926319..c46958a16 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/RenderHelper.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/RenderHelper.kt @@ -6,13 +6,15 @@ import com.mojang.blaze3d.vertex.* import com.mojang.math.Matrix4f import net.minecraft.client.renderer.GameRenderer import net.minecraft.client.renderer.RenderStateShard +import net.minecraft.client.renderer.RenderStateShard.LineStateShard import net.minecraft.client.renderer.RenderType import net.minecraft.client.renderer.texture.TextureAtlasSprite -import org.lwjgl.opengl.GL11 import org.lwjgl.opengl.GL11.GL_ALWAYS import org.lwjgl.opengl.GL11.GL_LESS import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.core.RGBAColor +import java.util.* +import kotlin.collections.ArrayDeque import kotlin.math.PI import kotlin.math.acos import kotlin.math.cos @@ -692,6 +694,28 @@ val coloredRectRenderType by lazy { builder.createCompositeState(false)) as RenderType } +val linesIgnoreZRenderType by lazy { + @Suppress("INACCESSIBLE_TYPE") + RenderType.create( + "lines_ignore_z", + DefaultVertexFormat.POSITION_COLOR_NORMAL, + VertexFormat.Mode.LINES, + 256, + false, + false, + RenderType.CompositeState.builder() + .setShaderState(RenderStateShard.RENDERTYPE_LINES_SHADER) + .setLineState(LineStateShard(OptionalDouble.empty())) + .setLayeringState(RenderStateShard.VIEW_OFFSET_Z_LAYERING) + .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) + .setOutputState(RenderStateShard.ITEM_ENTITY_TARGET) + .setWriteMaskState(RenderStateShard.COLOR_DEPTH_WRITE) + .setCullState(RenderStateShard.NO_CULL) + .setDepthTestState(RenderStateShard.NO_DEPTH_TEST) + .createCompositeState(false) + ) as RenderType +} + fun VertexConsumer.quad( pose: PoseStack, x: Float, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/MatterReplicatorRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/MatterReplicatorRenderer.kt index 0032621da..42205bffa 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/MatterReplicatorRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/MatterReplicatorRenderer.kt @@ -22,6 +22,7 @@ import ru.dbotthepony.mc.otm.NULLABLE_MINECRAFT_SERVER import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.block.entity.matter.MatterReplicatorBlockEntity import ru.dbotthepony.mc.otm.client.minecraft +import ru.dbotthepony.mc.otm.client.render.DynamicBufferSource import ru.dbotthepony.mc.otm.client.render.lockBlendFunc import ru.dbotthepony.mc.otm.client.render.popScissorRect import ru.dbotthepony.mc.otm.client.render.pushScissorRect @@ -37,6 +38,7 @@ class MatterReplicatorRenderer(private val context: BlockEntityRendererProvider. companion object { private val smoke = DustParticleOptions(Vector3f(1f, 1f, 1f), 1f) private val rand = XoroshiroRandomSource(System.nanoTime(), System.currentTimeMillis()) + private val source = DynamicBufferSource(maximalInitialBufferSize = 2 shl 10) } override fun render( @@ -85,10 +87,6 @@ class MatterReplicatorRenderer(private val context: BlockEntityRendererProvider. 0 ) - val source = minecraft.renderBuffers().bufferSource() - - source.endBatch() - context.itemRenderer.render( item, ItemTransforms.TransformType.NONE, diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 06aa86123..dcd9ed97f 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -79,3 +79,96 @@ public com.mojang.math.Matrix3f f_8142_ # m22 public-f net.minecraft.world.inventory.Slot f_40220_ # x public-f net.minecraft.world.inventory.Slot f_40221_ # y + +public net.minecraft.client.renderer.LevelRenderer m_109782_(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;Lnet/minecraft/world/phys/shapes/VoxelShape;DDDFFFF)V # renderShape + +public net.minecraft.client.renderer.RenderStateShard f_110135_ # ADDITIVE_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard f_173097_ # BLOCK_SHADER +public net.minecraft.client.renderer.RenderStateShard f_110146_ # BLOCK_SHEET +public net.minecraft.client.renderer.RenderStateShard f_110145_ # BLOCK_SHEET_MIPPED +public net.minecraft.client.renderer.RenderStateShard f_110128_ # CLOUDS_TARGET +public net.minecraft.client.renderer.RenderStateShard f_110114_ # COLOR_DEPTH_WRITE +public net.minecraft.client.renderer.RenderStateShard f_110115_ # COLOR_WRITE +public net.minecraft.client.renderer.RenderStateShard f_110138_ # CRUMBLING_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard f_110158_ # CULL +public net.minecraft.client.renderer.RenderStateShard f_110130_ # DEFAULT_LINE +public net.minecraft.client.renderer.RenderStateShard f_110148_ # DEFAULT_TEXTURING +public net.minecraft.client.renderer.RenderStateShard f_110116_ # DEPTH_WRITE +public net.minecraft.client.renderer.RenderStateShard f_110151_ # ENTITY_GLINT_TEXTURING +public net.minecraft.client.renderer.RenderStateShard f_110112_ # EQUAL_DEPTH_TEST +public net.minecraft.client.renderer.RenderStateShard f_110150_ # GLINT_TEXTURING +public net.minecraft.client.renderer.RenderStateShard f_110137_ # GLINT_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard f_110129_ # ITEM_ENTITY_TARGET +public net.minecraft.client.renderer.RenderStateShard f_110113_ # LEQUAL_DEPTH_TEST +public net.minecraft.client.renderer.RenderStateShard f_110152_ # LIGHTMAP +public net.minecraft.client.renderer.RenderStateShard f_110136_ # LIGHTNING_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard f_110123_ # MAIN_TARGET +public net.minecraft.client.renderer.RenderStateShard f_173098_ # NEW_ENTITY_SHADER +public net.minecraft.client.renderer.RenderStateShard f_110110_ # NO_CULL +public net.minecraft.client.renderer.RenderStateShard f_110111_ # NO_DEPTH_TEST +public net.minecraft.client.renderer.RenderStateShard f_110117_ # NO_LAYERING +public net.minecraft.client.renderer.RenderStateShard f_110153_ # NO_LIGHTMAP +public net.minecraft.client.renderer.RenderStateShard f_110155_ # NO_OVERLAY +public net.minecraft.client.renderer.RenderStateShard f_173096_ # NO_SHADER +public net.minecraft.client.renderer.RenderStateShard f_110147_ # NO_TEXTURE +public net.minecraft.client.renderer.RenderStateShard f_110134_ # NO_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard f_110124_ # OUTLINE_TARGET +public net.minecraft.client.renderer.RenderStateShard f_110154_ # OVERLAY +public net.minecraft.client.renderer.RenderStateShard f_110126_ # PARTICLES_TARGET +public net.minecraft.client.renderer.RenderStateShard f_110118_ # POLYGON_OFFSET_LAYERING +public net.minecraft.client.renderer.RenderStateShard f_173099_ # POSITION_COLOR_LIGHTMAP_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173104_ # POSITION_COLOR_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173103_ # POSITION_COLOR_TEX_LIGHTMAP_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173101_ # POSITION_COLOR_TEX_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173100_ # POSITION_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173102_ # POSITION_TEX_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173111_ # RENDERTYPE_ARMOR_CUTOUT_NO_CULL_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173079_ # RENDERTYPE_ARMOR_ENTITY_GLINT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173078_ # RENDERTYPE_ARMOR_GLINT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173068_ # RENDERTYPE_BEACON_BEAM_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173085_ # RENDERTYPE_CRUMBLING_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173106_ # RENDERTYPE_CUTOUT_MIPPED_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173107_ # RENDERTYPE_CUTOUT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173094_ # RENDERTYPE_END_GATEWAY_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173093_ # RENDERTYPE_END_PORTAL_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173074_ # RENDERTYPE_ENERGY_SWIRL_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173072_ # RENDERTYPE_ENTITY_ALPHA_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173114_ # RENDERTYPE_ENTITY_CUTOUT_NO_CULL_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173063_ # RENDERTYPE_ENTITY_CUTOUT_NO_CULL_Z_OFFSET_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173113_ # RENDERTYPE_ENTITY_CUTOUT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173069_ # RENDERTYPE_ENTITY_DECAL_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173084_ # RENDERTYPE_ENTITY_GLINT_DIRECT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173083_ # RENDERTYPE_ENTITY_GLINT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173070_ # RENDERTYPE_ENTITY_NO_OUTLINE_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173071_ # RENDERTYPE_ENTITY_SHADOW_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173067_ # RENDERTYPE_ENTITY_SMOOTH_CUTOUT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173112_ # RENDERTYPE_ENTITY_SOLID_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173065_ # RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER +public net.minecraft.client.renderer.RenderStateShard f_234323_ # RENDERTYPE_ENTITY_TRANSLUCENT_EMISSIVE_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173066_ # RENDERTYPE_ENTITY_TRANSLUCENT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173073_ # RENDERTYPE_EYES_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173082_ # RENDERTYPE_GLINT_DIRECT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173081_ # RENDERTYPE_GLINT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173080_ # RENDERTYPE_GLINT_TRANSLUCENT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173064_ # RENDERTYPE_ITEM_ENTITY_TRANSLUCENT_CULL_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173075_ # RENDERTYPE_LEASH_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173091_ # RENDERTYPE_LIGHTNING_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173095_ # RENDERTYPE_LINES_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173077_ # RENDERTYPE_OUTLINE_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173105_ # RENDERTYPE_SOLID_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173090_ # RENDERTYPE_TEXT_INTENSITY_SEE_THROUGH_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173087_ # RENDERTYPE_TEXT_INTENSITY_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173088_ # RENDERTYPE_TEXT_SEE_THROUGH_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173086_ # RENDERTYPE_TEXT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173109_ # RENDERTYPE_TRANSLUCENT_MOVING_BLOCK_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173110_ # RENDERTYPE_TRANSLUCENT_NO_CRUMBLING_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173108_ # RENDERTYPE_TRANSLUCENT_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173092_ # RENDERTYPE_TRIPWIRE_SHADER +public net.minecraft.client.renderer.RenderStateShard f_173076_ # RENDERTYPE_WATER_MASK_SHADER +public net.minecraft.client.renderer.RenderStateShard f_110125_ # TRANSLUCENT_TARGET +public net.minecraft.client.renderer.RenderStateShard f_110139_ # TRANSLUCENT_TRANSPARENCY +public net.minecraft.client.renderer.RenderStateShard f_110119_ # VIEW_OFFSET_Z_LAYERING +public net.minecraft.client.renderer.RenderStateShard f_173089_ # VIEW_SCALE_Z_EPSILON +public net.minecraft.client.renderer.RenderStateShard f_110127_ # WEATHER_TARGET + +public net.minecraft.client.renderer.RenderStateShard$LineStateShard