From d8d7005844f3c3993b9be1cd9e7f3b9d090a979b Mon Sep 17 00:00:00 2001 From: Jessica James Date: Sat, 1 Nov 2025 19:00:24 -0400 Subject: [PATCH 1/2] Port: 1.21.8 --- build.gradle | 2 +- .../civ/snitchmod/common/Renderer.java | 454 ++++++++++-------- .../civ/snitchmod/common/SnitchMod.java | 5 +- .../mixins/MixinClientPacketListener.java | 2 +- .../snitchmod/common/model/SnitchAlert.java | 4 +- .../snitchmod/common/model/SnitchRename.java | 4 +- .../civ/snitchmod/fabric/FabricSnitchMod.java | 4 +- .../civ/snitchmod/forge/ForgeSnitchMod.java | 18 +- .../forge/mixins/LevelRenderMixin.java | 4 +- gradle.properties | 12 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../snitchmod/neoforge/NeoForgeSnitchMod.java | 6 +- 12 files changed, 286 insertions(+), 231 deletions(-) diff --git a/build.gradle b/build.gradle index d075832..5c837a5 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.11-SNAPSHOT" apply false } architectury { minecraft = rootProject.minecraft_version diff --git a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/Renderer.java b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/Renderer.java index c51235c..2fba966 100644 --- a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/Renderer.java +++ b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/Renderer.java @@ -1,22 +1,21 @@ package gjum.minecraft.civ.snitchmod.common; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.BufferUploader; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.blaze3d.vertex.*; import gjum.minecraft.civ.snitchmod.common.Utils.Color; import gjum.minecraft.civ.snitchmod.common.model.Snitch; import gjum.minecraft.civ.snitchmod.common.model.SnitchFieldPreview; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; -import net.minecraft.client.renderer.CoreShaders; +//import net.minecraft.client.renderer.CoreShaders; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.ShapeRenderer; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.Shapes; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.joml.Matrix4f; @@ -39,8 +38,122 @@ public class Renderer { private final static Color YELLOW = new Color(0xEED840); private final static Color ORANGE = new Color(0xEE8140); private final static Color PINK = new Color(0xFC66CC); - - public static void renderOverlays(Matrix4f matrixArg) { + private static PoseStack eventPoseStack = null; + + public static class RenderBufferGuard implements AutoCloseable { + public MultiBufferSource.BufferSource bufferSource; + private static ByteBufferBuilder byteBufferBuilder = new ByteBufferBuilder(256 * 1024); + private static MultiBufferSource.BufferSource sBufferSource = null; + private static RenderBufferGuard current = null; + private RenderBufferGuard parent; + private int referenceCount = 1; + private boolean enableDepthTest; + private boolean enableDepthMask; + private boolean enableCullFace; + private boolean initialDepthTestValue; + private boolean initialDepthMask; + private boolean initialCullFace; + + private RenderBufferGuard(boolean enableDepthTest, boolean enableDepthMask, boolean enableCullFace) { + parent = current; + current = this; + + this.enableDepthTest = enableDepthTest; + this.enableDepthMask = enableDepthMask; + this.enableCullFace = enableCullFace; + initialDepthTestValue = GL11.glIsEnabled(GL11.GL_DEPTH_TEST); + initialDepthMask = GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK); + initialCullFace = GL11.glIsEnabled(GL11.GL_CULL_FACE); + + if (parent != null) { + // There's already an active buffer; flush anything that's pending + sBufferSource.endBatch(); + byteBufferBuilder.clear(); + } + else { + // There's no active buffer + sBufferSource = MultiBufferSource.immediate(byteBufferBuilder); + } + bufferSource = sBufferSource; + + if (enableDepthTest) { + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + else { + GL11.glDisable(GL11.GL_DEPTH_TEST); + } + GL11.glDepthMask(enableDepthMask); + if (enableCullFace) { + GL11.glEnable(GL11.GL_CULL_FACE); + } + else { + GL11.glDisable(GL11.GL_CULL_FACE); + } + } + + public static RenderBufferGuard open(boolean enableDepthTest, boolean enableDepthMask, boolean enableCullFace) { + if (current != null + && current.enableDepthTest == enableDepthTest + && current.enableDepthMask == enableDepthMask + && current.enableCullFace == enableCullFace) { + current.referenceCount += 1; + return current; + } + + return new RenderBufferGuard(enableDepthTest, enableDepthMask, enableCullFace); + } + + public static RenderBufferGuard open() { + if (current != null) { + current.referenceCount += 1; + return current; + } + + return new RenderBufferGuard( + GL11.glIsEnabled(GL11.GL_DEPTH_TEST), + GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK), + GL11.glIsEnabled(GL11.GL_CULL_FACE) + ); + } + + @Override + public void close() { + if (referenceCount > 1) { + // This will be flushed by an outer scope's close(). + referenceCount -= 1; + return; + } + + // All references to this guard have fallen out of scope + current = parent; + + try { + bufferSource.endBatch(); + } + finally { + if (initialDepthTestValue) { + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + else { + GL11.glDisable(GL11.GL_DEPTH_TEST); + } + GL11.glDepthMask(initialDepthMask); + if (initialCullFace) { + GL11.glEnable(GL11.GL_CULL_FACE); + } + else { + GL11.glDisable(GL11.GL_CULL_FACE); + } + + if (parent == null) { + sBufferSource = null; + } + } + } + } + + public static void renderOverlays(PoseStack poseStack) { + eventPoseStack = poseStack; if (mc.player == null) return; if (mc.level == null) return; @@ -50,7 +163,7 @@ public static void renderOverlays(Matrix4f matrixArg) { Vec3 camPos = mc.gameRenderer.getMainCamera().getPosition(); Matrix4fStack modelViewStack = RenderSystem.getModelViewStack(); modelViewStack.pushMatrix(); - modelViewStack.mul(matrixArg); + modelViewStack.mul(eventPoseStack.last().pose()); modelViewStack.translate((float) -camPos.x, (float) -camPos.y, (float) -camPos.z); if (getMod().rangeOverlayVisible) { @@ -74,41 +187,37 @@ public static void renderOverlays(Matrix4f matrixArg) { renderSnitchFieldPreview(getMod().snitchFieldToPreview); } - RenderSystem.enableDepthTest(); - RenderSystem.depthMask(true); - RenderSystem.enableCull(); RenderSystem.lineWidth(1.0F); - RenderSystem.clearColor(1, 1, 1, 1); modelViewStack.popMatrix(); + MultiBufferSource.BufferSource buffers = Minecraft.getInstance().renderBuffers().bufferSource(); + buffers.endBatch(); + eventPoseStack = null; } private static void renderSnitchFieldPreview(SnitchFieldPreview preview) { + final Color color = PINK; + final float boxAlpha = 0.2f; + final float lineAlpha = 1; + final float lineWidth = 2; + final int blockHlDist = 64; final AABB range = preview.field().getRangeAABB(); // inflate/deflate so the box face isn't obscured by adjacent blocks final boolean playerInRange = range.contains(mc.player.position()); AABB rangeBox = playerInRange ? range.inflate(-.01) : range.inflate(.01); - RenderSystem.enableDepthTest(); - RenderSystem.enableBlend(); - RenderSystem.disableCull(); - - final Color color = PINK; - final float boxAlpha = 0.2f; - renderFilledBox(rangeBox, color, boxAlpha); + try (RenderBufferGuard ignored = RenderBufferGuard.open(true, true, false)) { + renderFilledBox(rangeBox, color, boxAlpha); + renderBoxOutline(rangeBox, color, lineAlpha, lineWidth); + renderBoxGuides(rangeBox, color, lineAlpha, lineWidth); + } - final float lineAlpha = 1; - final float lineWidth = 2; - renderBoxOutline(rangeBox, color, lineAlpha, lineWidth); - renderBoxGuides(rangeBox, color, lineAlpha, lineWidth); - - final int blockHlDist = 64; if (preview.field().pos.distSqr(mc.player.blockPosition()) < blockHlDist * blockHlDist) { - RenderSystem.disableDepthTest(); - - // inflate so it isn't obstructed by the snitch block - final AABB blockBox = new AABB(preview.field().pos).inflate(.01); - renderBoxOutline(blockBox, color, lineAlpha, lineWidth); + try (RenderBufferGuard ignored = RenderBufferGuard.open(false, false, false)) { + // inflate so it isn't obstructed by the snitch block + final AABB blockBox = new AABB(preview.field().pos).inflate(.01); + renderBoxOutline(blockBox, color, lineAlpha, lineWidth); + } } } @@ -191,40 +300,39 @@ enum SnitchLiveliness { /* * Render the snitch range box. */ - RenderSystem.enableDepthTest(); - RenderSystem.enableBlend(); - RenderSystem.disableCull(); - renderFilledBox(rangeBox, snitchLiveliness.color, boxAlpha); + final float lineWidth = 2; - final float lineWidth = 2; - if (!snitch.isGone()) { - // Should include renderFilledBox too but that creates a bug, no idea why. When bugged, the snitch box lines - // get rendered pure black when standing close (<~50 blocks?) instead of whatever we configured. + try (RenderBufferGuard ignored = RenderBufferGuard.open(true, true, false)) { + renderFilledBox(rangeBox, snitchLiveliness.color, boxAlpha); + if (!snitch.isGone()) { + // Should include renderFilledBox too but that creates a bug, no idea why. When bugged, the snitch box lines + // get rendered pure black when standing close (<~50 blocks?) instead of whatever we configured. - renderBoxOutline(outlineBox, snitchLiveliness.color, lineAlpha, lineWidth); - } + renderBoxOutline(outlineBox, snitchLiveliness.color, lineAlpha, lineWidth); + } + } /* * Render the snitch box. */ final int blockHlDist = 64; if (snitch.pos.distSqr(mc.player.blockPosition()) < blockHlDist * blockHlDist) { - RenderSystem.disableDepthTest(); - // inflate so it isn't obstructed by the snitch block - final AABB blockBox = new AABB(snitch.pos).inflate(.01); - Color boxOutlineColor = snitchLiveliness.color; - if ( - getMod().snitchFieldToPreview != null - && getMod().snitchFieldToPreview.source().equals(snitch) - ) { - boxOutlineColor = PINK; - } - renderBoxOutline(blockBox, boxOutlineColor, lineAlpha, lineWidth); - - Color boxFillColor = snitch.isGone() ? BLACK : snitchLiveliness.color; - renderFilledBox(blockBox, boxFillColor, boxAlpha); + try (RenderBufferGuard ignored = RenderBufferGuard.open(false, false, false)) { + final AABB blockBox = new AABB(snitch.pos).inflate(.01); + Color boxOutlineColor = snitchLiveliness.color; + if ( + getMod().snitchFieldToPreview != null + && getMod().snitchFieldToPreview.source().equals(snitch) + ) { + boxOutlineColor = PINK; + } + renderBoxOutline(blockBox, boxOutlineColor, lineAlpha, lineWidth); + + Color boxFillColor = snitch.isGone() ? BLACK : snitchLiveliness.color; + renderFilledBox(blockBox, boxFillColor, boxAlpha); + } } /* @@ -359,154 +467,102 @@ private static void renderPlacementHelper(Snitch snitch) { if (playerInRange) return; // only render helper for snitches the player isn't inside of final AABB helperBox = new AABB(snitch.pos).inflate(22.3); - RenderSystem.enableDepthTest(); - RenderSystem.enableBlend(); - RenderSystem.disableCull(); - - Color color = BLUE; - float alpha = 0.2f; - renderFilledBox(helperBox, color, alpha); - } - - private static void renderBoxOutline(AABB box, Color color, float a, float lineWidth) { - RenderSystem.lineWidth(lineWidth); - - Tesselator tesselator = Tesselator.getInstance(); - BufferBuilder bufferBuilder = tesselator.begin(VertexFormat.Mode.DEBUG_LINES, DefaultVertexFormat.POSITION_COLOR); - - GL11.glEnable(GL11.GL_LINE_SMOOTH); - - float r = color.r; - float g = color.g; - float b = color.b; - float minX = (float) box.minX; - float minY = (float) box.minY; - float minZ = (float) box.minZ; - float maxX = (float) box.maxX; - float maxY = (float) box.maxY; - float maxZ = (float) box.maxZ; - - bufferBuilder.addVertex(minX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, maxZ).setColor(r, g, b, a); - - BufferUploader.drawWithShader(bufferBuilder.buildOrThrow()); + try (RenderBufferGuard ignored = RenderBufferGuard.open(true, true, false)) { + renderFilledBox(helperBox, BLUE, 0.2f); + } } - private static void renderFilledBox(AABB box, Color color, float a) { - Tesselator tesselator = Tesselator.getInstance(); - BufferBuilder bufferBuilder = tesselator.begin(VertexFormat.Mode.TRIANGLE_STRIP, DefaultVertexFormat.POSITION_COLOR); - RenderSystem.setShader(CoreShaders.POSITION_COLOR); - - float r = color.r; - float g = color.g; - float b = color.b; - float minX = (float) box.minX; - float minY = (float) box.minY; - float minZ = (float) box.minZ; - float maxX = (float) box.maxX; - float maxY = (float) box.maxY; - float maxZ = (float) box.maxZ; - - bufferBuilder.addVertex(minX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, minY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(minX, maxY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, minZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, maxZ).setColor(r, g, b, a); - bufferBuilder.addVertex(maxX, maxY, maxZ).setColor(r, g, b, a); - - BufferUploader.drawWithShader(bufferBuilder.buildOrThrow()); - } - - private static void renderBoxGuides(AABB box, Color color, float a, float lineWidth) { - RenderSystem.lineWidth(lineWidth); - - Tesselator tesselator = Tesselator.getInstance(); - BufferBuilder bufferBuilder = tesselator.begin(VertexFormat.Mode.DEBUG_LINES, DefaultVertexFormat.POSITION_COLOR); - RenderSystem.setShader(CoreShaders.POSITION_COLOR); - - GL11.glEnable(GL11.GL_LINE_SMOOTH); - - float r = color.r; - float g = color.g; - float b = color.b; - - Vec3 center = box.getCenter(); - double radius = box.maxX - center.x; - - addVertex(bufferBuilder, center.x + 1, center.y, center.z).setColor(r, g, b, a); - addVertex(bufferBuilder, center.x + radius, center.y, center.z).setColor(r, g, b, a); - addVertex(bufferBuilder, center.x - 1, center.y, center.z).setColor(r, g, b, a); - addVertex(bufferBuilder, center.x - radius, center.y, center.z).setColor(r, g, b, a); - - addVertex(bufferBuilder, center.x, center.y + 1, center.z).setColor(r, g, b, a); - addVertex(bufferBuilder, center.x, center.y + radius, center.z).setColor(r, g, b, a); - addVertex(bufferBuilder, center.x, center.y - 1, center.z).setColor(r, g, b, a); - addVertex(bufferBuilder, center.x, center.y - radius, center.z).setColor(r, g, b, a); - - addVertex(bufferBuilder, center.x, center.y, center.z + 1).setColor(r, g, b, a); - addVertex(bufferBuilder, center.x, center.y, center.z + radius).setColor(r, g, b, a); - addVertex(bufferBuilder, center.x, center.y, center.z - 1).setColor(r, g, b, a); - addVertex(bufferBuilder, center.x, center.y, center.z - radius).setColor(r, g, b, a); - - BufferUploader.drawWithShader(bufferBuilder.buildOrThrow()); - } - - // does the double->float cast for us - private static VertexConsumer addVertex(VertexConsumer bufferBuilder, double x, double y, double z) { - return bufferBuilder.addVertex((float) x, (float) y, (float) z); - } + private static void renderBoxOutline(AABB box, Color color, float alpha, float lineWidth) { + //mc.gui.getChat().addMessage(Component.literal("[SnitchMod] renderBoxOutline: " + box)); + try (RenderBufferGuard guard = RenderBufferGuard.open()) { + RenderSystem.lineWidth(lineWidth); + VertexConsumer vertexConsumer = guard.bufferSource.getBuffer(RenderType.debugLineStrip(lineWidth)); + ShapeRenderer.renderLineBox( + eventPoseStack, vertexConsumer, + box.minX, box.minY, box.minZ, + box.maxX, box.maxY, box.maxZ, + color.r, color.g, color.b, alpha + ); + } + } + + private static void renderFilledBox(AABB box, Color color, float alpha) { + //mc.gui.getChat().addMessage(Component.literal("[SnitchMod] renderFilledBox: " + box)); + try (RenderBufferGuard guard = RenderBufferGuard.open()) { + VertexConsumer vertexConsumer = guard.bufferSource.getBuffer(RenderType.debugQuads()); + //ShapeRenderer.renderShape(eventPoseStack, vertexConsumer, Shapes.create(box), box.minX, box.minY, box.minZ, color.hex); + float minX = (float) box.minX; + float minY = (float) box.minY; + float minZ = (float) box.minZ; + float maxX = (float) box.maxX; + float maxY = (float) box.maxY; + float maxZ = (float) box.maxZ; + for (Direction direction : Direction.values()) { + ShapeRenderer.renderFace( + eventPoseStack, vertexConsumer, direction, + minX, minY, minZ, + maxX, maxY, maxZ, + color.r, color.g, color.b, alpha + ); + } + } + } + + private static void renderBoxGuides(AABB box, Color color, float a, float lineWidth) { + boolean initialLineSmooth = GL11.glIsEnabled(GL11.GL_LINE_SMOOTH); + RenderSystem.lineWidth(lineWidth); + + float r = color.r; + float g = color.g; + float b = color.b; + Vec3 center = box.getCenter(); + float radius = (float) (box.maxX - center.x); + try (RenderBufferGuard guard = RenderBufferGuard.open()) { + PoseStack poseStack = new PoseStack(); + PoseStack.Pose pose = poseStack.last(); + GL11.glEnable(GL11.GL_LINE_SMOOTH); + VertexConsumer vertexConsumer = guard.bufferSource.getBuffer(RenderType.debugLineStrip(lineWidth)); + vertexConsumer.addVertex(pose, (float) center.x + 1, (float) center.y, (float) center.z).setColor(r, g, b, a).setNormal(1, 0, 0); + vertexConsumer.addVertex(pose, (float) center.x + radius, (float) center.y, (float) center.z).setColor(r, g, b, a).setNormal(1, 0, 0); + vertexConsumer.addVertex(pose, (float) center.x - 1, (float) center.y, (float) center.z).setColor(r, g, b, a).setNormal(-1, 0, 0); + vertexConsumer.addVertex(pose, (float) center.x - radius, (float) center.y, (float) center.z).setColor(r, g, b, a).setNormal(-1, 0, 0); + vertexConsumer.addVertex(pose, (float) center.x, (float) center.y + 1, (float) center.z).setColor(r, g, b, a).setNormal(0, 1, 0); + vertexConsumer.addVertex(pose, (float) center.x, (float) center.y + radius, (float) center.z).setColor(r, g, b, a).setNormal(1, 0, 0); + vertexConsumer.addVertex(pose, (float) center.x, (float) center.y - 1, (float) center.z).setColor(r, g, b, a).setNormal(0, -1, 0); + vertexConsumer.addVertex(pose, (float) center.x, (float) center.y - radius, (float) center.z).setColor(r, g, b, a).setNormal(-1, 0, 0); + vertexConsumer.addVertex(pose, (float) center.x, (float) center.y, (float) center.z + 1).setColor(r, g, b, a).setNormal(0, 0, 1); + vertexConsumer.addVertex(pose, (float) center.x, (float) center.y, (float) center.z + radius).setColor(r, g, b, a).setNormal(0, 0, 1); + vertexConsumer.addVertex(pose, (float) center.x, (float) center.y, (float) center.z - 1).setColor(r, g, b, a).setNormal(0, 0, -1); + vertexConsumer.addVertex(pose, (float) center.x, (float) center.y, (float) center.z - radius).setColor(r, g, b, a).setNormal(0, 0, -1); + } + finally { + if (!initialLineSmooth) { + GL11.glDisable(GL11.GL_LINE_SMOOTH); + } + } + } /** * middle center of text is at `pos` before moving it down the screen by `offset` */ private static void renderTextFacingCamera(Component text, Vec3 pos, float offset, float scale, int colorAlphaHex) { - var poseStack = new PoseStack(); + float w = mc.font.width(text); + float x = -w / 2f; + float y = -(.5f - offset) * (mc.font.lineHeight + 2); // +2 for background padding, -1 for default line spacing + boolean shadow = false; + scale *= 0.005f * (mc.player.position().distanceTo(pos) / 2.4); + scale = Math.clamp(scale, 0.015f, 0.15f); + Matrix4f matrix = new Matrix4f(eventPoseStack.last().pose()); + matrix.scale(scale, -scale, 1); // third component determines background distance + float bgOpacity = Minecraft.getInstance().options.getBackgroundOpacity(0.25f); + int bgColor = (int) (bgOpacity * 255.0f) << 24; + int flags = 0; + // XXX somehow, the letters farthest from the crosshair render behind the background + try (RenderBufferGuard guard = RenderBufferGuard.open(false, false, false)) { + mc.font.drawInBatch(text, x, y, colorAlphaHex, shadow, matrix, guard.bufferSource, Font.DisplayMode.SEE_THROUGH, bgColor, flags); + } + + /*var poseStack = new PoseStack(); poseStack.translate(pos.x, pos.y, pos.z); poseStack.mulPose(mc.gameRenderer.getMainCamera().rotation()); scale *= 0.005f * (mc.player.position().distanceTo(pos) / 2.4); @@ -526,7 +582,7 @@ private static void renderTextFacingCamera(Component text, Vec3 pos, float offse mc.font.drawInBatch(text, x, y, colorAlphaHex, shadow, matrix, buffer, Font.DisplayMode.SEE_THROUGH, bgColor, flags); poseStack.popPose(); - buffer.endBatch(); + buffer.endBatch();*/ } private static @NotNull String timestampRelativeText(long ts) { diff --git a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/SnitchMod.java b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/SnitchMod.java index ede9c5b..48c68e0 100644 --- a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/SnitchMod.java +++ b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/SnitchMod.java @@ -1,6 +1,7 @@ package gjum.minecraft.civ.snitchmod.common; import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.vertex.PoseStack; import gjum.minecraft.civ.snitchmod.common.model.Direction; import gjum.minecraft.civ.snitchmod.common.model.JalistEntry; import gjum.minecraft.civ.snitchmod.common.model.Snitch; @@ -313,8 +314,8 @@ public void handleWindowItems(List stacks) { } } - public void handleRenderBlockOverlay(Matrix4f matrix) { - Renderer.renderOverlays(matrix); + public void handleRenderBlockOverlay(PoseStack poseStack) { + Renderer.renderOverlays(poseStack); } public Stream streamNearbySnitches(Vec3 playerPos, int distance) { diff --git a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/mixins/MixinClientPacketListener.java b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/mixins/MixinClientPacketListener.java index 30fa4dd..7b88d77 100644 --- a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/mixins/MixinClientPacketListener.java +++ b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/mixins/MixinClientPacketListener.java @@ -33,7 +33,7 @@ protected void onHandleContainerContent(ClientboundContainerSetContentPacket pac return; // continue method normally } try { - getMod().handleWindowItems(packetIn.getItems()); + getMod().handleWindowItems(packetIn.items()); } catch (Throwable e) { e.printStackTrace(); } diff --git a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/model/SnitchAlert.java b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/model/SnitchAlert.java index a3e8b87..2b482d2 100644 --- a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/model/SnitchAlert.java +++ b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/model/SnitchAlert.java @@ -63,9 +63,9 @@ public static SnitchAlert fromChat( String group = null; final HoverEvent hoverEvent = message.getSiblings().get(0).getStyle().getHoverEvent(); - if (hoverEvent != null && hoverEvent.getAction() == HoverEvent.Action.SHOW_TEXT) { + if (hoverEvent != null && hoverEvent.action() == HoverEvent.Action.SHOW_TEXT) { @SuppressWarnings("ConstantConditions") - String hoverText = hoverEvent.getValue(HoverEvent.Action.SHOW_TEXT).getString().replaceAll("§.", ""); + String hoverText = ((HoverEvent.ShowText)hoverEvent).value().getString().replaceAll("§.", ""); Matcher hoverMatch = hoverPattern.matcher(hoverText); if (hoverMatch.matches()) { diff --git a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/model/SnitchRename.java b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/model/SnitchRename.java index 061aada..33bc12d 100644 --- a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/model/SnitchRename.java +++ b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/model/SnitchRename.java @@ -57,10 +57,10 @@ public SnitchRename( String snitchOldName = textMatch.group(2); final HoverEvent hoverEvent = message.getSiblings().get(0).getStyle().getHoverEvent(); - if (hoverEvent == null || hoverEvent.getAction() != HoverEvent.Action.SHOW_TEXT) return null; + if (hoverEvent == null || hoverEvent.action() != HoverEvent.Action.SHOW_TEXT) return null; @SuppressWarnings("ConstantConditions") - String hoverText = hoverEvent.getValue(HoverEvent.Action.SHOW_TEXT).getString().replaceAll("§.", ""); + String hoverText = ((HoverEvent.ShowText)hoverEvent).value().getString().replaceAll("§.", ""); Matcher hoverMatch = hoverPattern.matcher(hoverText); if (!hoverMatch.matches()) return null; diff --git a/fabric/src/main/java/gjum/minecraft/civ/snitchmod/fabric/FabricSnitchMod.java b/fabric/src/main/java/gjum/minecraft/civ/snitchmod/fabric/FabricSnitchMod.java index ee5abe7..fa0c484 100644 --- a/fabric/src/main/java/gjum/minecraft/civ/snitchmod/fabric/FabricSnitchMod.java +++ b/fabric/src/main/java/gjum/minecraft/civ/snitchmod/fabric/FabricSnitchMod.java @@ -22,9 +22,9 @@ public void onInitializeClient() { e.printStackTrace(); } }); - WorldRenderEvents.AFTER_TRANSLUCENT.register(((context) -> { + WorldRenderEvents.LAST.register(((context) -> { try { - handleRenderBlockOverlay(context.matrixStack().last().pose()); + handleRenderBlockOverlay(context.matrixStack()); } catch (Exception e) { e.printStackTrace(); } diff --git a/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/ForgeSnitchMod.java b/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/ForgeSnitchMod.java index fce8f73..8ec1478 100644 --- a/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/ForgeSnitchMod.java +++ b/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/ForgeSnitchMod.java @@ -4,24 +4,24 @@ import net.minecraftforge.client.event.RegisterKeyMappingsEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @Mod("snitchmod") public class ForgeSnitchMod extends SnitchMod { public ForgeSnitchMod(FMLJavaModLoadingContext fmlJavaModLoadingContext) { - fmlJavaModLoadingContext.getModEventBus().addListener(this::registerKeyMappings); MinecraftForge.EVENT_BUS.register(this); } - public void registerKeyMappings(RegisterKeyMappingsEvent event) { - event.register(openGuiKey); - event.register(toggleOverlayKey); - event.register(togglePlacementKey); - event.register(previewSnitchFieldKey); - event.register(toggleSnitchGoneStatusKey); - } + @SubscribeEvent + public static void onRegisterKeyMappings(RegisterKeyMappingsEvent event) { + event.register(openGuiKey); + event.register(toggleOverlayKey); + event.register(togglePlacementKey); + event.register(previewSnitchFieldKey); + event.register(toggleSnitchGoneStatusKey); + } @SubscribeEvent public void onClientTick(TickEvent.ClientTickEvent event) { diff --git a/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/mixins/LevelRenderMixin.java b/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/mixins/LevelRenderMixin.java index c22e53c..d2dfa13 100644 --- a/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/mixins/LevelRenderMixin.java +++ b/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/mixins/LevelRenderMixin.java @@ -12,10 +12,10 @@ @Mixin(LevelRenderer.class) public abstract class LevelRenderMixin { // REMINDER: Forge sucks - @Inject(method = "renderSectionLayer", at = @At("RETURN")) + /*@Inject(method = "renderSectionLayer", at = @At("RETURN")) private void onRenderLevelLast(RenderType arg, double d, double e, double f, Matrix4f matrix4f, Matrix4f matrix4f2, CallbackInfo ci) { if (arg == RenderType.translucent()) { ForgeSnitchMod.getMod().handleRenderBlockOverlay(new PoseStack().last().pose()); } - } + }*/ } diff --git a/gradle.properties b/gradle.properties index 3a72e8a..4b9e0a6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,15 +3,15 @@ org.gradle.jvmargs=-Xmx2048M maven_group=gjum.minecraft.snitchmod archives_base_name=snitchmod -mod_version=1.4.6-mc1.21.3 +mod_version=1.4.7-mc1.21.8 -minecraft_version=1.21.3 +minecraft_version=1.21.8 enabled_platforms=fabric,forge,neoforge # https://fabricmc.net/versions.html -fabric_loader_version=0.16.9 -fabric_api_version=0.112.1+1.21.3 +fabric_loader_version=0.17.3 +fabric_api_version=0.136.0+1.21.8 -forge_version=53.0.25 +forge_version=58.1.0 -neoforge_version=21.3.58 +neoforge_version=21.8.49 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0d18421..d6e308a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/neoforge/src/main/java/gjum/minecraft/civ/snitchmod/neoforge/NeoForgeSnitchMod.java b/neoforge/src/main/java/gjum/minecraft/civ/snitchmod/neoforge/NeoForgeSnitchMod.java index 459bf89..0be57fc 100644 --- a/neoforge/src/main/java/gjum/minecraft/civ/snitchmod/neoforge/NeoForgeSnitchMod.java +++ b/neoforge/src/main/java/gjum/minecraft/civ/snitchmod/neoforge/NeoForgeSnitchMod.java @@ -25,10 +25,8 @@ public void registerKeyMappings(RegisterKeyMappingsEvent event) { } @SubscribeEvent - public void onRenderLevelLast(RenderLevelStageEvent event) { - if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS) { - handleRenderBlockOverlay(event.getPoseStack().last().pose()); - } + public void onAfterTripwire(RenderLevelStageEvent.AfterTripwireBlocks event) { + handleRenderBlockOverlay(event.getPoseStack()); } @SubscribeEvent From 245bbf4986e76b923f9d959f6a81cba8bc3bbe5f Mon Sep 17 00:00:00 2001 From: Gjum Date: Wed, 26 Nov 2025 21:12:34 +0100 Subject: [PATCH 2/2] Update build.yml - upload-artifact@v4 --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 351e7c1..dc38193 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,19 +15,19 @@ jobs: - run: ./gradlew build - name: Upload Forge Build - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: Forge path: dist/*-forge.jar - name: Upload Fabric Build - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: Fabric path: dist/*-fabric.jar - name: Upload Neoforge Build - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: Neoforge path: dist/*-neoforge.jar