diff --git a/build.gradle.kts b/build.gradle.kts index b699e6c..6631b4b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - id("net.fabricmc.fabric-loom-remap") version "1.14-SNAPSHOT" + id("dev.kikugie.loom-back-compat") id("org.jetbrains.kotlin.jvm") version "2.3.0" id("dev.deftu.gradle.bloom") version "0.2.0" } @@ -17,10 +17,31 @@ base { } repositories { + mavenCentral() + gradlePluginPortal() + google() + maven("https://maven.parchmentmc.org") maven("https://repo.polyfrost.org/releases") maven("https://repo.polyfrost.org/snapshots") maven("https://maven.gegy.dev/releases") + + maven("https://maven.logix.dev/snapshots") + maven("https://nexus.prsm.wtf/repository/maven-public/maven-repo/releases/") + maven("https://repo.hypixel.net/repository/Hypixel/") + maven("https://maven.deftu.dev/releases") + + maven("https://maven.fabricmc.net/releases") + maven("https://jitpack.io") { + content { includeGroupAndSubgroups("com.github") } + } + maven("https://maven.bawnorton.com/releases") { + content { includeGroup("com.github.bawnorton.mixinsquared") } + } + maven("https://maven.azureaaron.net/releases") { + content { includeGroup("net.azureaaron") } + } + maven("https://redirector.kotlinlang.org/maven/compose-dev") } loom { @@ -34,26 +55,34 @@ loom { dependencies { minecraft("com.mojang:minecraft:${property("minecraft_version")}") - @Suppress("UnstableApiUsage") - mappings(loom.layered { - officialMojangMappings() - optionalProp("${property("parchment_version")}") { - parchment("org.parchmentmc.data:parchment-${property("minecraft_version")}:$it@zip") - } - optionalProp("${property("yalmm_version")}") { - mappings("dev.lambdaurora:yalmm-mojbackward:${property("minecraft_version")}+build.$it") + + val hasOfficialMappings = findProperty("has_official_mappings")?.toString()?.toBoolean() ?: true + if (hasOfficialMappings) { + @Suppress("UnstableApiUsage") + mappings(loom.layered { + officialMojangMappings() + optionalProp("${property("parchment_version")}") { + parchment("org.parchmentmc.data:parchment-${property("minecraft_version")}:$it@zip") + } + optionalProp("${property("yalmm_version")}") { + mappings("dev.lambdaurora:yalmm-mojbackward:${property("minecraft_version")}+build.$it") + } + }) + } else { + findProperty("mappings_version")?.toString()?.takeUnless { it.isBlank() }?.let { + mappings(it) } - }) + } modImplementation("net.fabricmc:fabric-loader:${property("loader_version")}") - modImplementation("org.polyfrost.oneconfig:${property("minecraft_version")}-fabric:1.0.0-alpha.181") - modImplementation("org.polyfrost.oneconfig:commands:1.0.0-alpha.181") - modImplementation("org.polyfrost.oneconfig:config:1.0.0-alpha.181") - modImplementation("org.polyfrost.oneconfig:config-impl:1.0.0-alpha.181") - modImplementation("org.polyfrost.oneconfig:events:1.0.0-alpha.181") - modImplementation("org.polyfrost.oneconfig:internal:1.0.0-alpha.181") - modImplementation("org.polyfrost.oneconfig:ui:1.0.0-alpha.181") - modImplementation("org.polyfrost.oneconfig:utils:1.0.0-alpha.181") - modImplementation("org.polyfrost.oneconfig:hud:1.0.0-alpha.181") + modImplementation("org.polyfrost.oneconfig:${property("minecraft_version")}-fabric:1.0.0-alpha.192") + implementation("org.polyfrost.oneconfig:commands:1.0.0-alpha.192") + implementation("org.polyfrost.oneconfig:config:1.0.0-alpha.192") + implementation("org.polyfrost.oneconfig:config-impl:1.0.0-alpha.192") + implementation("org.polyfrost.oneconfig:events:1.0.0-alpha.192") + implementation("org.polyfrost.oneconfig:internal:1.0.0-alpha.192") + implementation("org.polyfrost.oneconfig:ui:1.0.0-alpha.192") + implementation("org.polyfrost.oneconfig:utils:1.0.0-alpha.192") + implementation("org.polyfrost.oneconfig:hud:1.0.0-alpha.192") } bloom { @@ -78,18 +107,31 @@ tasks.processResources { } } +val javaVersionStr = findProperty("java_version")?.toString() ?: "21" +val javaVersionInt = javaVersionStr.toInt() + +val kotlinJvmTarget = when(javaVersionInt) { + 21 -> JvmTarget.JVM_21 + 22 -> JvmTarget.JVM_22 + 23 -> JvmTarget.JVM_23 + 24 -> JvmTarget.JVM_24 + 25 -> JvmTarget.JVM_25 + else -> JvmTarget.JVM_21 +} + tasks.withType().configureEach { - options.release.set(21) + options.release.set(javaVersionInt) } tasks.withType().configureEach { - compilerOptions.jvmTarget.set(JvmTarget.JVM_21) + compilerOptions.jvmTarget.set(kotlinJvmTarget) } java { withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion.set(JavaLanguageVersion.of(javaVersionInt)) + } } tasks.jar { diff --git a/gradle.properties b/gradle.properties index 0e49fba..b010fea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,18 +3,18 @@ org.gradle.daemon=true org.gradle.parallel=true org.gradle.configureoncommand=true org.gradle.parallel.threads=4 -org.gradle.jvmargs=-Xmx2G +org.gradle.jvmargs=-Xmx4G loom.ignoreDependencyLoomVersionValidation=true # Mod information mod.name=DamageTint mod.id=damagetint -mod.version=3.4.0-alpha.1 +mod.version=3.4.1-alpha.1 mod.group=org.polyfrost # Loom settings, [VERSIONED] means to be overridden in each version's gradle.properties -loom_version=1.14-SNAPSHOT -loader_version=0.18.4 +loomx.loom_version=1.16-SNAPSHOT +loader_version=0.19.2 minecraft_version=[VERSIONED] parchment_version=[VERSIONED] yalmm_version=[VERSIONED] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 23449a2..dbc3ce4 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-9.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle.kts b/settings.gradle.kts index 0c5b847..1c42042 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,16 +11,20 @@ pluginManagement { maven("https://maven.architectury.dev") maven("https://repo.polyfrost.org/releases") maven("https://repo.polyfrost.org/snapshots") + maven("https://maven.kikugie.dev/releases") { name = "KikuGie Releases" } + maven("https://maven.kikugie.dev/snapshots") { name = "KikuGie Snapshots" } } } plugins { - id("dev.kikugie.stonecutter") version "0.7.10" + id("dev.kikugie.stonecutter") version "0.9.4" + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" + id("dev.kikugie.loom-back-compat") version "0.3" } stonecutter { create(rootProject) { - versions("1.21.1", "1.21.4", "1.21.8", "1.21.10") + versions("1.21.1", "1.21.4", "1.21.5", "1.21.8", "1.21.10", "1.21.11", "26.1") vcsVersion = "1.21.10" // primary } diff --git a/src/main/java/org/polyfrost/damagetint/client/DamageTintClient.java b/src/main/java/org/polyfrost/damagetint/client/DamageTintClient.java index d6e0195..15f45e9 100644 --- a/src/main/java/org/polyfrost/damagetint/client/DamageTintClient.java +++ b/src/main/java/org/polyfrost/damagetint/client/DamageTintClient.java @@ -1,22 +1,17 @@ package org.polyfrost.damagetint.client; - -import dev.deftu.omnicore.api.client.commands.OmniClientCommands; -import org.polyfrost.damagetint.DamageTintConstants; import org.polyfrost.oneconfig.api.event.v1.EventManager; import org.polyfrost.oneconfig.api.event.v1.events.InitializationEvent; -import org.polyfrost.oneconfig.utils.v1.dsl.ScreensKt; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - public class DamageTintClient { + public static final DamageTintClient INSTANCE = new DamageTintClient(); public final Logger LOGGER = LoggerFactory.getLogger("DamageTint"); public void initialize() { DamageTintConfig.INSTANCE.preload(); - OmniClientCommands.register(OmniClientCommands.literal(DamageTintConstants.ID).executes(ctx -> ctx.getSource().openScreen(ScreensKt.createScreen(DamageTintConfig.INSTANCE)))); EventManager.register(InitializationEvent.class, () -> DamageTintConfig.updateOverlayColor(DamageTintConfig.color)); } } diff --git a/src/main/java/org/polyfrost/damagetint/client/DamageTintConfig.java b/src/main/java/org/polyfrost/damagetint/client/DamageTintConfig.java index ece54cb..45b5e0c 100644 --- a/src/main/java/org/polyfrost/damagetint/client/DamageTintConfig.java +++ b/src/main/java/org/polyfrost/damagetint/client/DamageTintConfig.java @@ -1,17 +1,13 @@ package org.polyfrost.damagetint.client; -import dev.deftu.omnicore.api.client.OmniClient; -import dev.deftu.omnicore.api.client.OmniClientRuntime; -import dev.deftu.omnicore.api.color.OmniColor; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.OverlayTexture; +import org.polyfrost.compose.render.PolyColor; import org.polyfrost.damagetint.DamageTintConstants; import org.polyfrost.damagetint.client.utils.OverlayModifier; import org.polyfrost.oneconfig.api.config.v1.Config; -import org.polyfrost.oneconfig.api.config.v1.annotations.Button; import org.polyfrost.oneconfig.api.config.v1.annotations.Color; import org.polyfrost.oneconfig.api.config.v1.annotations.Switch; -import org.polyfrost.polyui.color.ColorUtils; -import org.polyfrost.polyui.color.PolyColor; public class DamageTintConfig extends Config { @@ -23,35 +19,29 @@ public class DamageTintConfig extends Config { private static final int defaultColor = 1291780096; @Color(title = "Damage Tint Color") - public static PolyColor color = ColorUtils.toColor(defaultColor); - - @Button(title = "Reset Damage Tint", text = "Reset Color") - private void resetColor() { - color = ColorUtils.asMutable(ColorUtils.toColor(defaultColor)); - save(); - } + public static PolyColor color = new PolyColor(defaultColor); @Switch(title = "Fade Out Damage Tint") public static boolean fade = false; public DamageTintConfig() { super("damagetint.json", "/assets/damagetint/damagetint_dark.svg", DamageTintConstants.NAME, Category.QOL); + addCallback("color", (() -> { + updateOverlayColor(color); + })); save(); } public static void updateOverlayColor(PolyColor newColor) { - OmniClientRuntime.runOnMain(() -> { - int r = newColor.red(); - int g = newColor.green(); - int b = newColor.blue(); + Minecraft.getInstance().execute(() -> { + int r = newColor.getRed(); + int g = newColor.getGreen(); + int b = newColor.getBlue(); // Alpha is flipped for some reason, so 0 is fully opaque and 255 is fully transparent... Why, Mojang? Other developer note: 😭😭😭😭😭 - int a = 255 - newColor.alpha(); - - OmniColor color = new OmniColor(r, g, b, a); - DamageTintClient.INSTANCE.LOGGER.info("updateOverlayColor called"); + int a = 255 - newColor.getAlpha(); - OverlayTexture overlayTexture = OmniClient.get().gameRenderer.overlayTexture(); - ((OverlayModifier)overlayTexture).damageTint$setOverlayColor(color); + OverlayTexture overlayTexture = Minecraft.getInstance().gameRenderer.overlayTexture(); + ((OverlayModifier)overlayTexture).damageTint$setOverlayColor(a, r, g, b); }); } } diff --git a/src/main/java/org/polyfrost/damagetint/client/utils/OverlayModifier.java b/src/main/java/org/polyfrost/damagetint/client/utils/OverlayModifier.java index acf18ef..25df325 100644 --- a/src/main/java/org/polyfrost/damagetint/client/utils/OverlayModifier.java +++ b/src/main/java/org/polyfrost/damagetint/client/utils/OverlayModifier.java @@ -1,7 +1,5 @@ package org.polyfrost.damagetint.client.utils; -import dev.deftu.omnicore.api.color.OmniColor; - public interface OverlayModifier { - void damageTint$setOverlayColor(OmniColor color); + void damageTint$setOverlayColor(int a, int r, int g, int b); } diff --git a/src/main/java/org/polyfrost/damagetint/mixin/client/Mixin_LivingEntityRenderer.java b/src/main/java/org/polyfrost/damagetint/mixin/client/Mixin_LivingEntityRenderer.java new file mode 100644 index 0000000..64354c3 --- /dev/null +++ b/src/main/java/org/polyfrost/damagetint/mixin/client/Mixin_LivingEntityRenderer.java @@ -0,0 +1,70 @@ +package org.polyfrost.damagetint.mixin.client; + +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +//? if >=1.21.4 { +import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; +//?} +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.LivingEntity; +import org.polyfrost.damagetint.client.DamageTintConfig; +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.Unique; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +//? if >=1.21.4 { +import java.util.Map; +import java.util.WeakHashMap; +//?} + +@Mixin(LivingEntityRenderer.class) +public class Mixin_LivingEntityRenderer { + + //? if >=1.21.4 { + @Unique + private static final Map damageTint$hurtTimeMap = java.util.Collections.synchronizedMap(new WeakHashMap<>()); + @Unique + private static final Map damageTint$deathTimeMap = java.util.Collections.synchronizedMap(new WeakHashMap<>()); + + @Inject(method = "extractRenderState(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;F)V", at = @At("HEAD")) + private void onExtractRenderState(LivingEntity entity, LivingEntityRenderState state, float f, CallbackInfo ci) { + damageTint$hurtTimeMap.put(state, entity.hurtTime); + damageTint$deathTimeMap.put(state, entity.deathTime); + } + + @Inject(method = "getOverlayCoords", at = @At("HEAD"), cancellable = true) + private static void onGetOverlayCoords(LivingEntityRenderState state, float f, CallbackInfoReturnable cir) { + if (DamageTintConfig.fade && DamageTintConfig.enabled) { + Integer hurtTimeObj = damageTint$hurtTimeMap.get(state); + Integer deathTimeObj = damageTint$deathTimeMap.get(state); + int hurtTime = hurtTimeObj != null ? hurtTimeObj : 0; + int deathTime = deathTimeObj != null ? deathTimeObj : 0; + + if (hurtTime > 0) { + int row = Math.round((1.0f - (float) hurtTime / 10.0f) * 7.0f); + cir.setReturnValue(OverlayTexture.pack(OverlayTexture.u(f), row)); + } else if (deathTime > 0) { + cir.setReturnValue(OverlayTexture.pack(OverlayTexture.u(f), 0)); + } + } + } + //?} else { + /*// 1.21.1 has an entirely different method sig/approach + @Inject(method = "getOverlayCoords", at = @At("HEAD"), cancellable = true) + private static void onGetOverlayCoords(LivingEntity entity, float f, CallbackInfoReturnable cir) { + if (DamageTintConfig.fade && DamageTintConfig.enabled) { + int hurtTime = entity.hurtTime; + int deathTime = entity.deathTime; + + if (hurtTime > 0) { + int row = Math.round((1.0f - (float) hurtTime / 10.0f) * 7.0f); + cir.setReturnValue(OverlayTexture.pack(OverlayTexture.u(f), row)); + } else if (deathTime > 0) { + cir.setReturnValue(OverlayTexture.pack(OverlayTexture.u(f), 0)); + } + } + } + *///?} +} diff --git a/src/main/java/org/polyfrost/damagetint/mixin/client/Mixin_ModifyTintColor.java b/src/main/java/org/polyfrost/damagetint/mixin/client/Mixin_ModifyTintColor.java index d189b4f..010cdc9 100644 --- a/src/main/java/org/polyfrost/damagetint/mixin/client/Mixin_ModifyTintColor.java +++ b/src/main/java/org/polyfrost/damagetint/mixin/client/Mixin_ModifyTintColor.java @@ -1,12 +1,8 @@ package org.polyfrost.damagetint.mixin.client; import com.mojang.blaze3d.platform.NativeImage; -import dev.deftu.omnicore.api.client.image.OmniImage; -import dev.deftu.omnicore.api.client.image.OmniImages; -import dev.deftu.omnicore.api.color.OmniColor; import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.renderer.texture.OverlayTexture; -import org.polyfrost.damagetint.client.DamageTintClient; import org.polyfrost.damagetint.client.utils.OverlayModifier; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -22,33 +18,30 @@ public class Mixin_ModifyTintColor implements OverlayModifier { @Override @Unique - public void damageTint$setOverlayColor(OmniColor color) { + public void damageTint$setOverlayColor(int a, int r, int g, int b) { NativeImage image = this.texture.getPixels(); if (image == null) { throw new IllegalStateException("Overlay texture's image is null"); } - OmniImage oldImage = OmniImages.from(image); - OmniImage newImage = OmniImages.from(image); - DamageTintClient.INSTANCE.LOGGER.info("updateOverlayColor called in mixin"); - - for (int x = 0; x < newImage.getWidth(); x++) { - for (int y = 0; y < newImage.getHeight(); y++) { - if (y < newImage.getHeight() / 2) { - newImage.set(x, y, color); - } else { - newImage.set(x, y, oldImage.get(x, y)); - } + for (int y = 0; y < image.getHeight() / 2; y++) { + float percent = 1.0f - ((float) y / 7.0f); + int currentAlpha = (int) (255 - ((255 - a) * percent)); + //? if >=1.21.4 { + int packedColor = (currentAlpha << 24 | r << 16 | g << 8 | b); + //?} else { + /*int packedColor = (currentAlpha << 24 | b << 16 | g << 8 | r); + *///?} + + for (int x = 0; x < image.getWidth(); x++) { + //? if >=1.21.4 { + image.setPixel(x, y, packedColor); + //?} else { + /*image.setPixelRGBA(x, y, packedColor); + *///?} } } - try { - oldImage.close(); - } catch (Throwable ignored) {} - - NativeImage nativeImage = newImage.getNative(); - this.texture.setPixels(nativeImage); this.texture.upload(); - image.close(); } } \ No newline at end of file diff --git a/src/main/resources/mixins.damagetint.json b/src/main/resources/mixins.damagetint.json index aa302e5..ff4a7e2 100644 --- a/src/main/resources/mixins.damagetint.json +++ b/src/main/resources/mixins.damagetint.json @@ -1,9 +1,10 @@ { - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_21", "minVersion": "0.7", "package": "org.polyfrost.damagetint.mixin", "refmap": "mixins.${mod_id}.refmap.json", "client": [ - "client.Mixin_ModifyTintColor" + "client.Mixin_ModifyTintColor", + "client.Mixin_LivingEntityRenderer" ] } diff --git a/versions/1.21.11/gradle.properties b/versions/1.21.11/gradle.properties new file mode 100644 index 0000000..2b66964 --- /dev/null +++ b/versions/1.21.11/gradle.properties @@ -0,0 +1,3 @@ +parchment_version=2025.12.20 +yalmm_version=3 +minecraft_version=1.21.11 \ No newline at end of file diff --git a/versions/1.21.5/gradle.properties b/versions/1.21.5/gradle.properties new file mode 100644 index 0000000..cda4312 --- /dev/null +++ b/versions/1.21.5/gradle.properties @@ -0,0 +1,3 @@ +parchment_version=2025.06.15 +yalmm_version=3 +minecraft_version=1.21.5 \ No newline at end of file diff --git a/versions/26.1/gradle.properties b/versions/26.1/gradle.properties new file mode 100644 index 0000000..bb4b398 --- /dev/null +++ b/versions/26.1/gradle.properties @@ -0,0 +1,4 @@ +yalmm_version=3 +minecraft_version=26.1 +has_official_mappings=false +java_version=25 \ No newline at end of file