diff --git a/build.gradle b/build.gradle index c68c126..08b1b61 100644 --- a/build.gradle +++ b/build.gradle @@ -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 @@ -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 { @@ -24,6 +19,10 @@ repositories { name = 'TerraformersMC' url = 'https://maven.terraformersmc.com/releases' } + maven { + name = 'Nucleoid' + url = 'https://maven.nucleoid.xyz/' + } } dependencies { @@ -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 { @@ -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 } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index a900c16..27c86ee 100644 --- a/gradle.properties +++ b/gradle.properties @@ -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 \ No newline at end of file +cloth_config=17.0.144 +modmenu_version=13.0.0-beta.1 +placeholder_api=2.5.1+1.21.3 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ffed3a2..4f0b015 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -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 \ No newline at end of file diff --git a/src/main/java/schauweg/timetolive/CountdownRenderer.java b/src/main/java/schauweg/timetolive/CountdownRenderer.java index 78b150b..faea4b9 100644 --- a/src/main/java/schauweg/timetolive/CountdownRenderer.java +++ b/src/main/java/schauweg/timetolive/CountdownRenderer.java @@ -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 void renderCountdown(E entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider immediate, EntityRenderer 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){ diff --git a/src/main/java/schauweg/timetolive/mixin/EntityRenderDispatcherMixin.java b/src/main/java/schauweg/timetolive/mixin/EntityRenderDispatcherMixin.java new file mode 100644 index 0000000..c1c3acd --- /dev/null +++ b/src/main/java/schauweg/timetolive/mixin/EntityRenderDispatcherMixin.java @@ -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 void drawCountdown(E entity, double x, double y, double z, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci, @Local EntityRenderer entityRenderer) { + if (!TTLConfigManger.getConfig().isOverlayActive()) return; + CountdownRenderer.renderCountdown(entity, tickDelta, matrices, vertexConsumers, entityRenderer); + } +} diff --git a/src/main/java/schauweg/timetolive/mixin/WorldRendererMixin.java b/src/main/java/schauweg/timetolive/mixin/WorldRendererMixin.java deleted file mode 100644 index 955e08f..0000000 --- a/src/main/java/schauweg/timetolive/mixin/WorldRendererMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package schauweg.timetolive.mixin; - -import net.minecraft.client.render.*; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.Matrix4f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -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(WorldRenderer.class) -public class WorldRendererMixin { - - @Shadow - private Frustum capturedFrustum; - - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;checkEmpty(Lnet/minecraft/client/util/math/MatrixStack;)V", ordinal = 0)) - private void render(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f projection, CallbackInfo ci) { - if (!TTLConfigManger.getConfig().isOverlayActive()) return; - CountdownRenderer.render(matrices, tickDelta, camera, projection, this.capturedFrustum); - } - -} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index dac0f00..121b0c3 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -23,7 +23,7 @@ "depends": { "fabricloader": ">=0.14.8", "fabric": "*", - "minecraft": "1.19.x", + "minecraft": "1.21.x", "java": ">=17" } } diff --git a/src/main/resources/timetolive.mixins.json b/src/main/resources/timetolive.mixins.json index 7f95398..96eb6f1 100644 --- a/src/main/resources/timetolive.mixins.json +++ b/src/main/resources/timetolive.mixins.json @@ -3,8 +3,8 @@ "minVersion": "0.8", "package": "schauweg.timetolive.mixin", "client": [ - "WorldRendererMixin", - "CreeperEntityMixin" + "CreeperEntityMixin", + "EntityRenderDispatcherMixin" ], "injectors": { "defaultRequire": 1