diff --git a/build.gradle b/build.gradle index a653907..74a4e22 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.7-SNAPSHOT' + id 'fabric-loom' version '1.10-SNAPSHOT' id 'maven-publish' } diff --git a/gradle.properties b/gradle.properties index 6700b19..d1dd5bc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,16 +4,16 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.21.4 -yarn_mappings=1.21.4+build.8 -loader_version=0.16.13 +minecraft_version=1.21.5 +yarn_mappings=1.21.5+build.1 +loader_version=0.16.14 # Mod Properties -mod_version=2.4.0 +mod_version=2.5.0-devbuild maven_group=uk.cloudmc.swrc archives_base_name=swrc # Dependencies -fabric_version=0.119.2+1.21.4 -modmenu_version=13.0.3 -cloth_config_version=17.0.144 \ No newline at end of file +fabric_version=0.125.0+1.21.5 +modmenu_version=14.0.0-rc.2 +cloth_config_version=18.0.145 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a441313..cea7a79 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ 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 networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/client/java/uk/cloudmc/swrc/SWRC.java b/src/client/java/uk/cloudmc/swrc/SWRC.java index 64178a4..160a327 100644 --- a/src/client/java/uk/cloudmc/swrc/SWRC.java +++ b/src/client/java/uk/cloudmc/swrc/SWRC.java @@ -19,7 +19,7 @@ public class SWRC implements ClientModInitializer { public static Logger LOGGER = LoggerFactory.getLogger("SWRC"); public static final String NAMESPACE = "swrc"; - public static final String VERSION = "2.4.0"; + public static final String VERSION = "2.5.0"; public static final MinecraftClient instance = MinecraftClient.getInstance(); diff --git a/src/client/java/uk/cloudmc/swrc/hud/BestLap.java b/src/client/java/uk/cloudmc/swrc/hud/BestLap.java index 0995a01..c4e2eef 100644 --- a/src/client/java/uk/cloudmc/swrc/hud/BestLap.java +++ b/src/client/java/uk/cloudmc/swrc/hud/BestLap.java @@ -45,8 +45,6 @@ public void render(DrawContext graphics, float tickDelta) { this.scaledHeight = SWRC.instance.getWindow().getScaledHeight(); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); int u = 32; int v = 0; @@ -61,7 +59,6 @@ public void render(DrawContext graphics, float tickDelta) { graphics.drawTexture(RenderLayer::getGuiTextured, WIDGETS_TEXTURE, scaledWidth / 2 - w / 2, animationHeight - h, u, v, w, h, 256, 256); - RenderSystem.disableBlend(); } public void show() { diff --git a/src/client/java/uk/cloudmc/swrc/hud/QualiLeaderboard.java b/src/client/java/uk/cloudmc/swrc/hud/QualiLeaderboard.java index 0ed3144..7e53865 100644 --- a/src/client/java/uk/cloudmc/swrc/hud/QualiLeaderboard.java +++ b/src/client/java/uk/cloudmc/swrc/hud/QualiLeaderboard.java @@ -36,8 +36,6 @@ public void render(DrawContext graphics, float tickDelta) { this.scaledHeight = SWRC.instance.getWindow().getScaledHeight(); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); int width = 200; int body_height = SWRC.getRace().raceLeaderboardPositions.size() * 9 + 2; @@ -73,8 +71,6 @@ public void render(DrawContext graphics, float tickDelta) { offset += 1; } - - RenderSystem.disableBlend(); } public String msToTimeString(long ms) { diff --git a/src/client/java/uk/cloudmc/swrc/hud/RaceLeaderboard.java b/src/client/java/uk/cloudmc/swrc/hud/RaceLeaderboard.java index f637bc1..b86c3d2 100644 --- a/src/client/java/uk/cloudmc/swrc/hud/RaceLeaderboard.java +++ b/src/client/java/uk/cloudmc/swrc/hud/RaceLeaderboard.java @@ -3,8 +3,12 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.PlayerSkinDrawer; +import net.minecraft.client.network.PlayerListEntry; import net.minecraft.client.realms.util.TextRenderingUtils; import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.Identifier; import org.joml.Matrix4f; import uk.cloudmc.swrc.Race; @@ -13,6 +17,7 @@ import uk.cloudmc.swrc.net.packets.S2CUpdatePacket; import java.text.DecimalFormat; +import java.util.HashMap; public class RaceLeaderboard implements Hud { @@ -24,8 +29,14 @@ public class RaceLeaderboard implements Hud { private static final DecimalFormat decimalFormat = new DecimalFormat("00.000"); + private static final HashMap rowHeight = new HashMap<>(); + public RaceLeaderboard() {} + private double lerp(double a, double b, double t) { + return a + (b - a) * t; + } + @Override public boolean shouldRender() { return SWRC.getRace() != null && SWRC.getRace().getRaceState() != Race.RaceState.QUALI; @@ -39,8 +50,6 @@ public void render(DrawContext graphics, float tickDelta) { this.scaledHeight = SWRC.instance.getWindow().getScaledHeight(); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); int width = 200; int body_height = SWRC.getRace().raceLeaderboardPositions.size() * 9 + 2; @@ -61,30 +70,40 @@ public void render(DrawContext graphics, float tickDelta) { if (offset == 1) pos_color = 0xB2B1BD; if (offset == 2) pos_color = 0x805B2B; - renderText(graphics, String.format("%s", offset + 1), x + 4, y + 14 + offset * 9 + 4, pos_color); - renderText(graphics, String.format("%s", position.player_name), x + 22, y + 14 + offset * 9 + 4, race.getFlap() != null && race.getFlap().getPlayer_name().equals(position.player_name) ? 0x9803FC : 0xFFFFFF); + double precise_targeted_height = lerp(rowHeight.getOrDefault(position.player_name, (double) offset * 9), offset * 9, 0.05); + int derived_height = (int) precise_targeted_height; + + PlayerListEntry playerListEntry = SWRC.instance.getNetworkHandler().getPlayerListEntry(position.player_name); + + if (playerListEntry != null) { + PlayerSkinDrawer.draw(graphics, playerListEntry.getSkinTextures(), x + 12 + 6, y + 14 + derived_height + 4, 8); + } + + renderText(graphics, String.format("%s", offset + 1), x + 4, y + 14 + derived_height + 4, pos_color); + renderText(graphics, String.format("%s", position.player_name), x + 22 + 6, y + 14 + derived_height + 4, race.getFlap() != null && race.getFlap().getPlayer_name().equals(position.player_name) ? 0x9803FC : 0xFFFFFF); if (position.in_pit) { int start_pos = width - widthOfText("IN PIT") - 2; - renderText(graphics, "IN PIT", x + start_pos, y + 14 + offset * 9 + 4, 0x888888 ); + renderText(graphics, "IN PIT", x + start_pos + 6, y + 14 + derived_height + 4, 0x888888 ); } else { int start_pos = width - widthOfText("-" + msToTimeString(position.time_delta)) - 2; - renderText(graphics, String.format("%s%s", position.time_delta > 0 ? "+" : "" , msToTimeString(position.time_delta)), x + start_pos, y + 14 + offset * 9 + 4, position.time_delta >= 0 ? 0x00FF00 : 0xFF0000 ); + renderText(graphics, String.format("%s%s", position.time_delta > 0 ? "+" : "" , msToTimeString(position.time_delta)), x + start_pos + 6, y + 14 + derived_height + 4, position.time_delta >= 0 ? 0x00FF00 : 0xFF0000 ); } int pits = race.pits.getOrDefault(position.player_name, 0); - renderText(graphics, String.format("%s", pits), x + width - 57, y + 14 + offset * 9 + 4, 0x00FFFF ); - renderText(graphics, String.format("%s", race.laps.getOrDefault(position.player_name, 0)), x + width - 70, y + 14 + offset * 9 + 4, 0xFFFF00 ); + renderText(graphics, String.format("%s", pits), x + width - 57 + 6, y + 14 + derived_height + 4, 0x00FFFF ); + renderText(graphics, String.format("%s", race.laps.getOrDefault(position.player_name, 0)), x + width - 70 + 6, y + 14 + derived_height + 4, 0xFFFF00 ); + + rowHeight.put(position.player_name, precise_targeted_height); offset += 1; } if (race.getFlap() != null) { renderText(graphics, String.format("%s: %s", race.getFlap().getPlayer_name(), msToTimeString(race.getFlap().getTime())), x + 22, y + 14 + offset * 9 + 4, 0xAFFF14); } - RenderSystem.disableBlend(); } public String msToTimeString(long ms) { diff --git a/src/client/java/uk/cloudmc/swrc/hud/SplitTime.java b/src/client/java/uk/cloudmc/swrc/hud/SplitTime.java index 25b68cb..644c45f 100644 --- a/src/client/java/uk/cloudmc/swrc/hud/SplitTime.java +++ b/src/client/java/uk/cloudmc/swrc/hud/SplitTime.java @@ -41,10 +41,6 @@ public void render(DrawContext graphics, float tickDelta) { this.scaledHeight = SWRC.instance.getWindow().getScaledHeight(); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - - int x = this.scaledWidth / 2; int y = (int) (this.scaledHeight * 0.6); @@ -85,8 +81,6 @@ public void render(DrawContext graphics, float tickDelta) { renderText(graphics, time_text, x + 1, y + 1, 0xFFFFFF); renderText(graphics, split_text, x + widthOfText(time_text) + 3, y + 1, 0xFFFFFF); renderText(graphics, split_text, x + widthOfText(time_text) + 3, y + 1, 0xFFFFFF); - - RenderSystem.disableBlend(); } public String msToTimeString(long ms) { diff --git a/src/client/java/uk/cloudmc/swrc/hud/TimerHud.java b/src/client/java/uk/cloudmc/swrc/hud/TimerHud.java index edd87ed..12b4473 100644 --- a/src/client/java/uk/cloudmc/swrc/hud/TimerHud.java +++ b/src/client/java/uk/cloudmc/swrc/hud/TimerHud.java @@ -46,8 +46,6 @@ public void render(DrawContext context, float tickDelta) { long time_remaining = Math.min(Math.max(SWRC.getRace().getDuration() * 1000 - (time_current - SWRC.getRace().getStartTime()), 0), SWRC.getRace().getDuration() * 1000); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); context.drawText( SWRC.instance.textRenderer, diff --git a/src/client/java/uk/cloudmc/swrc/render/RenderUtils.java b/src/client/java/uk/cloudmc/swrc/render/RenderUtils.java new file mode 100644 index 0000000..623b341 --- /dev/null +++ b/src/client/java/uk/cloudmc/swrc/render/RenderUtils.java @@ -0,0 +1,23 @@ +package uk.cloudmc.swrc.render; + +import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.platform.DepthTestFunction; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.client.gl.RenderPipelines; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.RenderPhase; +import net.minecraft.client.render.VertexFormats; + +import java.util.OptionalDouble; + +public class RenderUtils { + public static final RenderPipeline DEBUG_LINES = RenderPipelines.register( + RenderPipeline.builder(RenderPipelines.POSITION_COLOR_SNIPPET) + .withLocation("pipeline/debug_lines") + .withVertexFormat(VertexFormats.POSITION_COLOR, VertexFormat.DrawMode.DEBUG_LINES) + .withCull(true) + .withoutBlend() + .withDepthTestFunction(DepthTestFunction.LEQUAL_DEPTH_TEST) + .build() + ); +} diff --git a/src/client/java/uk/cloudmc/swrc/render/TrackBuilderRenderer.java b/src/client/java/uk/cloudmc/swrc/render/TrackBuilderRenderer.java index 5b08fce..d74ac9a 100644 --- a/src/client/java/uk/cloudmc/swrc/render/TrackBuilderRenderer.java +++ b/src/client/java/uk/cloudmc/swrc/render/TrackBuilderRenderer.java @@ -1,10 +1,10 @@ package uk.cloudmc.swrc.render; +import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.VertexFormat; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; -import net.minecraft.client.gl.ShaderProgram; -import net.minecraft.client.gl.ShaderProgramKeys; import net.minecraft.client.render.*; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.Vec3d; @@ -16,17 +16,20 @@ import uk.cloudmc.swrc.track.Trap; import java.util.ArrayList; +import java.util.OptionalDouble; public class TrackBuilderRenderer implements WorldRenderEvents.DebugRender { + private static final RenderLayer renderLayer = RenderLayer.of( + "debug_lines", + 1536, + RenderUtils.DEBUG_LINES, + RenderLayer.MultiPhaseParameters.builder().lineWidth(new RenderPhase.LineWidth(OptionalDouble.of(1))).build(false) + ); + public void renderCheckpoint(MatrixStack matrixStack, Camera camera, Vec3d left, Vec3d right, int color) { Tessellator tessellator = Tessellator.getInstance(); - RenderSystem.disableCull(); - RenderSystem.disableScissor(); - RenderSystem.enableBlend(); - RenderSystem.setShader(ShaderProgramKeys.POSITION_COLOR); - float prevLineWidth = RenderSystem.getShaderLineWidth(); RenderSystem.lineWidth(3f); @@ -45,7 +48,7 @@ public void renderCheckpoint(MatrixStack matrixStack, Camera camera, Vec3d left, checkpointLine.vertex(matrix, fLeft.x, fLeft.y, fLeft.z).color(color & 0xFFFFFFFF); checkpointLine.vertex(matrix, fRight.x, fRight.y, fRight.z).color(color & 0xFFFFFFFF); - BufferRenderer.drawWithGlobalProgram(checkpointLine.end()); + renderLayer.draw(checkpointLine.end()); // Render line on left checkpoint showing detection height BufferBuilder leftHeightLine = tessellator.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION_COLOR); @@ -53,7 +56,7 @@ public void renderCheckpoint(MatrixStack matrixStack, Camera camera, Vec3d left, leftHeightLine.vertex(matrix, fLeft.x, fLeft.y - 2, fLeft.z).color(color & 0xFFFFFF00); leftHeightLine.vertex(matrix, fLeft.x, fLeft.y + 2, fLeft.z).color(color & 0xFFFFFFFF); - BufferRenderer.drawWithGlobalProgram(leftHeightLine.end()); + renderLayer.draw(leftHeightLine.end()); // Render line on right checkpoint showing detection height BufferBuilder rightHeightLine = tessellator.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION_COLOR); @@ -61,7 +64,7 @@ public void renderCheckpoint(MatrixStack matrixStack, Camera camera, Vec3d left, rightHeightLine.vertex(matrix, fRight.x, fRight.y - 2, fRight.z).color(color & 0xFFFFFF00); rightHeightLine.vertex(matrix, fRight.x, fRight.y + 2, fRight.z).color(color & 0xFFFFFFFF); - BufferRenderer.drawWithGlobalProgram(rightHeightLine.end()); + renderLayer.draw(rightHeightLine.end()); // Render line on left checkpoint showing direction BufferBuilder leftDirectionLine = tessellator.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION_COLOR); @@ -69,7 +72,7 @@ public void renderCheckpoint(MatrixStack matrixStack, Camera camera, Vec3d left, leftDirectionLine.vertex(matrix, fLeft.x, fLeft.y, fLeft.z).color(color & 0xFFFFFFFF); leftDirectionLine.vertex(matrix, fLeft.x + checkpointDirection.x, fLeft.y + checkpointDirection.y, fLeft.z + checkpointDirection.z).color(color & 0xFFFFFFFF); - BufferRenderer.drawWithGlobalProgram(leftDirectionLine.end()); + renderLayer.draw(leftDirectionLine.end()); // Render line on right checkpoint showing direction BufferBuilder rightDirectionLine = tessellator.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION_COLOR); @@ -77,20 +80,15 @@ public void renderCheckpoint(MatrixStack matrixStack, Camera camera, Vec3d left, rightDirectionLine.vertex(matrix, fRight.x, fRight.y, fRight.z).color(color & 0xFFFFFFFF); rightDirectionLine.vertex(matrix, fRight.x + checkpointDirection.x, fRight.y + checkpointDirection.y, fRight.z + checkpointDirection.z).color(color & 0xFFFFFFFF); - BufferRenderer.drawWithGlobalProgram(rightDirectionLine.end()); + renderLayer.draw(rightDirectionLine.end()); - RenderSystem.enableCull(); - RenderSystem.disableBlend(); RenderSystem.lineWidth(prevLineWidth); } public void renderPole(MatrixStack matrixStack, Camera camera, Vec3d pos, int color) { Tessellator tessellator = Tessellator.getInstance(); - RenderSystem.disableCull(); RenderSystem.disableScissor(); - RenderSystem.enableBlend(); - RenderSystem.setShader(ShaderProgramKeys.POSITION_COLOR); float prevLineWidth = RenderSystem.getShaderLineWidth(); @@ -106,20 +104,15 @@ public void renderPole(MatrixStack matrixStack, Camera camera, Vec3d pos, int co line.vertex(matrix, fPos.x, fPos.y - 2, fPos.z).color(color & 0xFFFFFF00); line.vertex(matrix, fPos.x, fPos.y + 2, fPos.z).color(color & 0xFFFFFFFF); - BufferRenderer.drawWithGlobalProgram(line.end()); + renderLayer.draw(line.end()); - RenderSystem.enableCull(); - RenderSystem.disableBlend(); RenderSystem.lineWidth(prevLineWidth); } public void renderLine(MatrixStack matrixStack, Camera camera, Vec3d pos1, Vec3d pos2, int color) { Tessellator tessellator = Tessellator.getInstance(); - RenderSystem.disableCull(); RenderSystem.disableScissor(); - RenderSystem.enableBlend(); - RenderSystem.setShader(ShaderProgramKeys.POSITION_COLOR); float prevLineWidth = RenderSystem.getShaderLineWidth(); @@ -136,14 +129,9 @@ public void renderLine(MatrixStack matrixStack, Camera camera, Vec3d pos1, Vec3d line.vertex(matrix, fPos1.x, fPos1.y, fPos1.z).color(color & 0xFFFFFF00); line.vertex(matrix, fPos2.x, fPos2.y, fPos2.z).color(color & 0xFFFFFFFF); - BufferRenderer.drawWithGlobalProgram(line.end()); - - RenderSystem.enableCull(); - RenderSystem.disableBlend(); - RenderSystem.lineWidth(prevLineWidth); + renderLayer.draw(line.end()); } - @Override public void beforeDebugRender(WorldRenderContext context) { TrackBuilder trackBuilder = SWRC.getTrackBuilder(); diff --git a/src/client/resources/fabric.mod.json b/src/client/resources/fabric.mod.json index def7a73..0a83305 100644 --- a/src/client/resources/fabric.mod.json +++ b/src/client/resources/fabric.mod.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "id": "swrc", - "version": "2.4.0", + "version": "2.5.0", "name": "SW Race Control", "description": "Mod for timing and controlling races on Stoneworks @ Formula Abex", "authors": [