Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id 'fabric-loom' version '1.7-SNAPSHOT'
id 'fabric-loom' version '1.10-SNAPSHOT'
id 'maven-publish'
}

Expand Down
14 changes: 7 additions & 7 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
fabric_version=0.125.0+1.21.5
modmenu_version=14.0.0-rc.2
cloth_config_version=18.0.145
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/client/java/uk/cloudmc/swrc/SWRC.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
3 changes: 0 additions & 3 deletions src/client/java/uk/cloudmc/swrc/hud/BestLap.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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() {
Expand Down
4 changes: 0 additions & 4 deletions src/client/java/uk/cloudmc/swrc/hud/QualiLeaderboard.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -73,8 +71,6 @@ public void render(DrawContext graphics, float tickDelta) {

offset += 1;
}

RenderSystem.disableBlend();
}

public String msToTimeString(long ms) {
Expand Down
37 changes: 28 additions & 9 deletions src/client/java/uk/cloudmc/swrc/hud/RaceLeaderboard.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -13,6 +17,7 @@
import uk.cloudmc.swrc.net.packets.S2CUpdatePacket;

import java.text.DecimalFormat;
import java.util.HashMap;

public class RaceLeaderboard implements Hud {

Expand All @@ -24,8 +29,14 @@ public class RaceLeaderboard implements Hud {

private static final DecimalFormat decimalFormat = new DecimalFormat("00.000");

private static final HashMap<String, Double> 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;
Expand All @@ -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;
Expand All @@ -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) {
Expand Down
6 changes: 0 additions & 6 deletions src/client/java/uk/cloudmc/swrc/hud/SplitTime.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down
2 changes: 0 additions & 2 deletions src/client/java/uk/cloudmc/swrc/hud/TimerHud.java
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
23 changes: 23 additions & 0 deletions src/client/java/uk/cloudmc/swrc/render/RenderUtils.java
Original file line number Diff line number Diff line change
@@ -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()
);
}
46 changes: 17 additions & 29 deletions src/client/java/uk/cloudmc/swrc/render/TrackBuilderRenderer.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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);
Expand All @@ -45,52 +48,47 @@ 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);

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);

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);

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);

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();

Expand All @@ -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();

Expand All @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion src/client/resources/fabric.mod.json
Original file line number Diff line number Diff line change
@@ -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": [
Expand Down