Skip to content
Open
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
67 changes: 8 additions & 59 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
plugins {
id 'fabric-loom' version '1.0-SNAPSHOT'
id 'fabric-loom' version '1.9-SNAPSHOT'
id 'maven-publish'

id "com.modrinth.minotaur" version "2.+"
id 'com.matthewprenger.cursegradle' version '1.4.0'
}

sourceCompatibility = JavaVersion.VERSION_17
Expand All @@ -12,8 +9,6 @@ targetCompatibility = JavaVersion.VERSION_17
archivesBaseName = "${project.mod_name} ${project.mod_version} (${project.minecraft_version})"
version = project.mod_version
group = project.maven_group
def CHANGELOG = new File("./gradle", "CHANGELOG.md").text
def SUPPORTED_VERSIONS = Arrays.asList(project.supported_versions.split(','))

repositories {
maven {
Expand All @@ -24,6 +19,10 @@ repositories {
name = 'TerraformersMC'
url = 'https://maven.terraformersmc.com/releases'
}
maven {
name = 'Nucleoid'
url = 'https://maven.nucleoid.xyz/'
}
}

dependencies {
Expand All @@ -34,16 +33,9 @@ dependencies {
// Fabric API. This is technically optional, but you probably want it anyway.
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"

//Cloth Config
modApi("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config}") {
exclude(group: "net.fabricmc.fabric-api")
}
include("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config}")

//Modmenu
modImplementation("com.terraformersmc:modmenu:${project.modmenu}") {
exclude(group: "net.fabricmc.fabric-api")
}
modApi "me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config}"
modImplementation("com.terraformersmc:modmenu:${project.modmenu_version}")
modImplementation(include("eu.pb4:placeholder-api:${project.placeholder_api}"))
}

processResources {
Expand Down Expand Up @@ -93,46 +85,3 @@ publishing {
// retrieving dependencies.
}
}

import com.modrinth.minotaur.dependencies.ModDependency
if (System.getenv().MODRINTH_TOKEN) modrinth {
projectId = project.modrinth_id
versionName = archivesBaseName
versionNumber = "${project.mod_version}-${project.minecraft_version}"
versionType = "beta"
uploadFile = tasks.remapJar
gameVersions = [project.minecraft_version]
loaders = ["fabric"]
dependencies = [
new ModDependency("fabric-api", "required"),
new ModDependency("cloth-config", "embedded"),
new ModDependency("modmenu", "optional")
]
}

if (System.getenv().CURSEFORGE_API_KEY) curseforge {
apiKey = System.getenv().CURSEFORGE_API_KEY

project {
id = project.curseforge_id
addGameVersion "Fabric"
for (final def cf_ver in SUPPORTED_VERSIONS) addGameVersion cf_ver

changelog = CHANGELOG
releaseType = "beta"

mainArtifact(remapJar) {
displayName = archivesBaseName
relations {
requiredDependency "fabric-api"
embeddedLibrary "cloth-config"

optionalDependency 'modmenu'
}
}

afterEvaluate { uploadTask.dependsOn(remapJar) }
}

options { forgeGradleIntegration = false }
}
26 changes: 11 additions & 15 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,20 @@ org.gradle.jvmargs=-Xmx3G

# Fabric Properties
# check these on https://fabricmc.net/versions.html
minecraft_version=1.19.2
yarn_mappings=1.19.2+build.28
loader_version=0.14.10
minecraft_version=1.21.4
yarn_mappings=1.21.4+build.2
loader_version=0.16.9

#Fabric api
fabric_version=0.64.0+1.19.2
fabric_version=0.112.2+1.21.4

# Mod Properties
mod_version = 0.4
maven_group = schauweg
archives_base_name = timetolive
mod_name = Time To Live
mod_version = 0.4.1
maven_group = schauweg
archives_base_name = timetolive
mod_name = Time To Live

# Dependencies
cloth_config=8.0.75
modmenu=4.0.5

# Upload configs
curseforge_id = 357220
modrinth_id = rCeI5tOW
supported_versions=1.19.2
cloth_config=17.0.144
modmenu_version=13.0.0-beta.1
placeholder_api=2.5.1+1.21.3
6 changes: 1 addition & 5 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.11-bin.zip
87 changes: 34 additions & 53 deletions src/main/java/schauweg/timetolive/CountdownRenderer.java
Original file line number Diff line number Diff line change
@@ -1,82 +1,63 @@
package schauweg.timetolive;

import com.google.common.collect.Iterables;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.render.Camera;
import net.minecraft.client.render.Frustum;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.Entity;
import net.minecraft.entity.TntEntity;
import net.minecraft.entity.mob.CreeperEntity;
import net.minecraft.util.math.Matrix4f;
import net.minecraft.util.math.Quaternion;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import org.joml.Matrix4f;
import schauweg.timetolive.config.TTLConfigManger;
import schauweg.timetolive.mixin.CreeperEntityMixin;

import java.util.stream.StreamSupport;

public class CountdownRenderer {
public static <E extends Entity> void renderCountdown(E entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider immediate, EntityRenderer<? super E, ?> renderer) {
if (entity instanceof TntEntity || entity instanceof CreeperEntity) {
double x = MathHelper.lerp(tickDelta, entity.lastRenderX, entity.getX());
double y = MathHelper.lerp(tickDelta, entity.lastRenderY, entity.getY());
double z = MathHelper.lerp(tickDelta, entity.lastRenderZ, entity.getZ());

public static void render(MatrixStack matrices, float partialTicks, Camera camera, Matrix4f projection, Frustum capturedFrustum) {
MinecraftClient mc = MinecraftClient.getInstance();
if(mc.world == null || !MinecraftClient.isHudEnabled()) {
return;
}
final Entity cameraEntity = camera.getFocusedEntity() != null ? camera.getFocusedEntity() : mc.player; //possible fix for optifine (see https://github.com/UpcraftLP/Orderly/issues/3)
assert cameraEntity != null : "Camera Entity must not be null!";

Vec3d cameraPos = camera.getPos();
final Frustum frustum;
if(capturedFrustum != null) {
frustum = capturedFrustum;
}
else {
frustum = new Frustum(matrices.peek().getPositionMatrix(), projection);
frustum.setPosition(cameraPos.getX(), cameraPos.getY(), cameraPos.getZ());
}

StreamSupport.stream(mc.world.getEntities().spliterator(), false).filter(entity -> entity instanceof CreeperEntity && entity != cameraEntity && entity.isAlive() && Iterables.isEmpty(entity.getPassengersDeep()) && entity.shouldRender(cameraPos.getX(), cameraPos.getY(), cameraPos.getZ()) && (entity.ignoreCameraFrustum || frustum.isVisible(entity.getBoundingBox()))).map(CreeperEntity.class::cast).forEach(entity -> {
Vec3d pos = new Vec3d(x, y, z);

if (entity.isIgnited()){
int fuse = ((CreeperEntityMixin)entity).getFuseTime() - ((CreeperEntityMixin)entity).getCurrentFuseTime();
renderCountdown(entity, matrices, partialTicks, camera, cameraEntity, fuse);
}
MinecraftClient client = MinecraftClient.getInstance();
Camera camera = client.gameRenderer.getCamera();

});
Vec3d vec3d = pos.subtract(camera.getPos());

StreamSupport.stream(mc.world.getEntities().spliterator(), false).filter(entity -> entity instanceof TntEntity && entity != cameraEntity && entity.isAlive() && Iterables.isEmpty(entity.getPassengersDeep()) && entity.shouldRender(cameraPos.getX(), cameraPos.getY(), cameraPos.getZ()) && (entity.ignoreCameraFrustum || frustum.isVisible(entity.getBoundingBox()))).map(TntEntity.class::cast).forEach(entity -> renderCountdown(entity, matrices, partialTicks, camera, cameraEntity, entity.getFuse()));
}
matrices.push();

int fuse = 0;

@SuppressWarnings( "deprecation" )
private static void renderCountdown(Entity passedEntity, MatrixStack matrices, float partialTicks, Camera camera, Entity viewPoint, int fuse){
MinecraftClient mc = MinecraftClient.getInstance();
if (entity instanceof TntEntity) {
fuse = ((TntEntity) entity).getFuse();
matrices.translate(vec3d.x, vec3d.y + entity.getHeight() + 0.5, vec3d.z);
} else if (entity instanceof CreeperEntity) {
if (((CreeperEntity) entity).isIgnited()) {
fuse = ((CreeperEntityMixin)entity).getFuseTime() - ((CreeperEntityMixin)entity).getCurrentFuseTime();
matrices.translate(vec3d.x, vec3d.y + entity.getHeight() + 0.5, vec3d.z);
}
}

matrices.push();
double x = passedEntity.prevX + (passedEntity.getX() - passedEntity.prevX) * partialTicks;
double y = passedEntity.prevY + (passedEntity.getY() - passedEntity.prevY) * partialTicks;
double z = passedEntity.prevZ + (passedEntity.getZ() - passedEntity.prevZ) * partialTicks;
matrices.multiplyPositionMatrix(new Matrix4f().rotation(camera.getRotation()));
matrices.scale(0.025F, -0.025F, 0.025F);
Matrix4f matrix4f = matrices.peek().getPositionMatrix();
TextRenderer textRenderer = renderer.getTextRenderer();

EntityRenderDispatcher renderManager = MinecraftClient.getInstance().getEntityRenderDispatcher();
matrices.translate(x - renderManager.camera.getPos().x, y - renderManager.camera.getPos().y + passedEntity.getHeight() + 0.5F, z - renderManager.camera.getPos().z);

VertexConsumerProvider.Immediate immediate = mc.getBufferBuilders().getEntityVertexConsumers();
Quaternion rotation = camera.getRotation().copy();
rotation.scale(-1.0F);
matrices.multiply(rotation);
String time = TTLConfigManger.getConfig().isDisplayInTicks() ? fuse + " t" : ticksToTime(fuse);

matrices.scale(-0.025F, -0.025F, 0.025F);
float f = (float)(-textRenderer.getWidth(time)) / 2.0F;

String time = TTLConfigManger.getConfig().isDisplayInTicks() ? fuse + " t" : ticksToTime(fuse);
float offset = (float)(-mc.textRenderer.getWidth(time)/2);
Matrix4f modelViewMatrix = matrices.peek().getPositionMatrix();
mc.textRenderer.draw(time, offset, 0, 553648127, false, modelViewMatrix, immediate, true, 1056964608, 15728640);
mc.textRenderer.draw(time, offset, 0, -1, false, modelViewMatrix, immediate, false, 0, 15728640);
textRenderer.draw(time, f, 0, 553648127, false, matrix4f, immediate, TextRenderer.TextLayerType.SEE_THROUGH, 1056964608, 15728640);
textRenderer.draw(time, f, 0, -1, false, matrix4f, immediate, TextRenderer.TextLayerType.NORMAL, 0, 15728640);

matrices.pop();
matrices.pop();
}
}

private static String ticksToTime(int ticks){
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package schauweg.timetolive.mixin;

import com.llamalad7.mixinextras.sugar.Local;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import schauweg.timetolive.CountdownRenderer;
import schauweg.timetolive.config.TTLConfigManger;

@Mixin(EntityRenderDispatcher.class)
public class EntityRenderDispatcherMixin {
@Inject(
method = "render",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/render/entity/EntityRenderDispatcher;render(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
shift = At.Shift.AFTER
)
)
private <E extends Entity> void drawCountdown(E entity, double x, double y, double z, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci, @Local EntityRenderer<? super E, ?> entityRenderer) {
if (!TTLConfigManger.getConfig().isOverlayActive()) return;
CountdownRenderer.renderCountdown(entity, tickDelta, matrices, vertexConsumers, entityRenderer);
}
}
26 changes: 0 additions & 26 deletions src/main/java/schauweg/timetolive/mixin/WorldRendererMixin.java

This file was deleted.

2 changes: 1 addition & 1 deletion src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"depends": {
"fabricloader": ">=0.14.8",
"fabric": "*",
"minecraft": "1.19.x",
"minecraft": "1.21.x",
"java": ">=17"
}
}
4 changes: 2 additions & 2 deletions src/main/resources/timetolive.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
"minVersion": "0.8",
"package": "schauweg.timetolive.mixin",
"client": [
"WorldRendererMixin",
"CreeperEntityMixin"
"CreeperEntityMixin",
"EntityRenderDispatcherMixin"
],
"injectors": {
"defaultRequire": 1
Expand Down