From e2677d6ee5c3f74d5f547ca48bf6641f047a2a1e Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Sun, 3 Nov 2024 01:24:24 +0100 Subject: 1.21.3 WIP --- build.gradle.kts | 54 +- gradle/libs.versions.toml | 42 +- src/compat/sodium/java/SodiumChunkReloader.kt | 2 +- .../sodium/AccessorSodiumWorldRenderer.java | 8 +- .../PatchBlockModelInSodiumChunkGenerator.java | 4 +- .../firmament/mixins/CustomDurabilityBarPatch.java | 6 +- .../firmament/mixins/CustomModelBakerPatch.java | 49 -- .../firmament/mixins/CustomModelEventPatch.java | 18 +- .../firmament/mixins/CustomSkullTexturePatch.java | 9 +- .../nea/firmament/mixins/DFUEntityIdFixPatch.java | 1 + .../mixins/InjectCustomShaderPrograms.java | 31 - .../nea/firmament/mixins/MixinHandledScreen.java | 22 +- .../mixins/ReplaceTextColorInHandledScreen.java | 9 +- .../nea/firmament/mixins/SlotUpdateListener.java | 8 +- .../mixins/WorldRenderLastEventPatch.java | 31 +- .../mixins/accessor/AccessorGameRenderer.java | 14 - .../mixins/customgui/PatchHandledScreen.java | 24 +- .../custommodels/ApplyHeadModelInItemRenderer.java | 40 +- .../custommodels/GlobalModelOverridePatch.java | 18 +- .../custommodels/HeadModelReplacerPatch.java | 55 ++ .../custommodels/ItemRendererTintContextPatch.java | 16 +- .../custommodels/JsonUnbakedModelDataHolder.java | 31 +- .../mixins/custommodels/PatchArmorTexture.java | 28 +- .../custommodels/PatchHeadFeatureRenderer.java | 45 -- .../custommodels/PatchLegacyArmorLayerSupport.java | 22 + .../custommodels/PatchOverrideDeserializer.java | 46 +- .../custommodels/ReferenceCustomModelsPatch.java | 37 ++ .../TestForFirmamentOverridePredicatesPatch.java | 56 +- src/main/kotlin/events/BakeExtraModelsEvent.kt | 25 +- src/main/kotlin/events/CustomItemModelEvent.kt | 46 +- .../kotlin/events/FinalizeResourceManagerEvent.kt | 41 +- src/main/kotlin/events/IsSlotProtectedEvent.kt | 2 +- .../kotlin/events/RegisterCustomShadersEvent.kt | 24 - src/main/kotlin/events/SlotRenderEvents.kt | 15 +- src/main/kotlin/features/chat/ChatLinks.kt | 3 + .../kotlin/features/debug/DeveloperFeatures.kt | 4 +- src/main/kotlin/features/debug/PowerUserTools.kt | 17 +- .../kotlin/features/inventory/CraftingOverlay.kt | 2 +- .../features/inventory/ItemRarityCosmetics.kt | 16 +- src/main/kotlin/features/inventory/PetFeatures.kt | 5 +- src/main/kotlin/features/inventory/SlotLocking.kt | 25 +- .../features/inventory/buttons/InventoryButton.kt | 5 +- .../inventory/buttons/InventoryButtonEditor.kt | 1 - .../storageoverlay/StorageBackingHandle.kt | 1 + .../storageoverlay/StorageOverlayScreen.kt | 7 +- .../storageoverlay/StorageOverviewScreen.kt | 2 +- .../kotlin/features/mining/CommissionFeatures.kt | 8 +- src/main/kotlin/features/mining/HotmPresets.kt | 7 +- .../features/texturepack/CustomBlockTextures.kt | 4 +- .../texturepack/CustomGlobalArmorOverrides.kt | 213 ++++--- .../features/texturepack/CustomGlobalTextures.kt | 2 +- src/main/kotlin/features/world/Waypoints.kt | 499 ++++++++------- src/main/kotlin/gui/BarComponent.kt | 182 +++--- src/main/kotlin/gui/entity/EntityRenderer.kt | 3 +- src/main/kotlin/gui/entity/FakeWorld.kt | 695 ++++++++------------- src/main/kotlin/gui/entity/ModifyHorse.kt | 11 +- src/main/kotlin/repo/RepoDownloadManager.kt | 2 +- src/main/kotlin/repo/RepoManager.kt | 6 +- src/main/kotlin/util/MC.kt | 2 +- src/main/kotlin/util/data/IDataHolder.kt | 112 ++-- src/main/kotlin/util/render/DrawContextExt.kt | 50 +- .../kotlin/util/render/FacingThePlayerContext.kt | 7 +- src/main/kotlin/util/render/FirmamentShaders.kt | 19 +- .../kotlin/util/render/RenderCircleProgress.kt | 140 ++--- .../kotlin/util/render/RenderInWorldContext.kt | 32 +- .../firmament/shaders/code/rendertype_lines.fsh | 18 + .../firmament/shaders/code/rendertype_lines.json | 17 + .../firmament/shaders/code/rendertype_lines.vsh | 62 ++ .../shaders/core/firmament_rendertype_lines.fsh | 18 - .../shaders/core/firmament_rendertype_lines.json | 17 - .../shaders/core/firmament_rendertype_lines.vsh | 62 -- src/main/resources/firmament.accesswidener | 3 +- src/main/resources/firmament.mixins.json | 13 +- 73 files changed, 1527 insertions(+), 1644 deletions(-) delete mode 100644 src/main/java/moe/nea/firmament/mixins/CustomModelBakerPatch.java delete mode 100644 src/main/java/moe/nea/firmament/mixins/InjectCustomShaderPrograms.java delete mode 100644 src/main/java/moe/nea/firmament/mixins/accessor/AccessorGameRenderer.java create mode 100644 src/main/java/moe/nea/firmament/mixins/custommodels/HeadModelReplacerPatch.java delete mode 100644 src/main/java/moe/nea/firmament/mixins/custommodels/PatchHeadFeatureRenderer.java create mode 100644 src/main/java/moe/nea/firmament/mixins/custommodels/PatchLegacyArmorLayerSupport.java create mode 100644 src/main/java/moe/nea/firmament/mixins/custommodels/ReferenceCustomModelsPatch.java delete mode 100644 src/main/kotlin/events/RegisterCustomShadersEvent.kt create mode 100644 src/main/resources/assets/firmament/shaders/code/rendertype_lines.fsh create mode 100644 src/main/resources/assets/firmament/shaders/code/rendertype_lines.json create mode 100644 src/main/resources/assets/firmament/shaders/code/rendertype_lines.vsh delete mode 100644 src/main/resources/assets/minecraft/shaders/core/firmament_rendertype_lines.fsh delete mode 100644 src/main/resources/assets/minecraft/shaders/core/firmament_rendertype_lines.json delete mode 100644 src/main/resources/assets/minecraft/shaders/core/firmament_rendertype_lines.vsh diff --git a/build.gradle.kts b/build.gradle.kts index 64d80fe..70f20f6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -21,7 +21,9 @@ plugins { alias(libs.plugins.kotlin.plugin.serialization) alias(libs.plugins.kotlin.plugin.powerassert) alias(libs.plugins.kotlin.plugin.ksp) - alias(libs.plugins.loom) + // alias(libs.plugins.loom) + // TODO: use arch loom once they update to 1.8 + id("fabric-loom") version "1.8.9" id("com.github.johnrengelman.shadow") version "8.1.1" id("moe.nea.licenseextractificator") id("moe.nea.mc-auto-translations") version "0.0.1" @@ -113,7 +115,7 @@ fun innerJarsOf(name: String, dependency: Dependency): Provider { }) } unpackAllJars { dependsOn(task) } - println("Constructed innerJars task: ${project.files(task).asFileTree.toList().map {it to it.exists()}}") + println("Constructed innerJars task: ${project.files(task).asFileTree.toList().map { it to it.exists() }}") return project.provider { project.files(task).asFileTree } @@ -125,15 +127,32 @@ val collectTranslations by tasks.registering(CollectTranslations::class) { } val compatSourceSets: MutableSet = mutableSetOf() -fun createIsolatedSourceSet(name: String, path: String = "compat/$name"): SourceSet { +fun createIsolatedSourceSet(name: String, path: String = "compat/$name", isEnabled: Boolean = true): SourceSet { val ss = sourceSets.create(name) { - this.java.setSrcDirs(listOf(layout.projectDirectory.dir("src/$path/java"))) - this.kotlin.setSrcDirs(listOf(layout.projectDirectory.dir("src/$path/java"))) + if (isEnabled) { + this.java.setSrcDirs(listOf(layout.projectDirectory.dir("src/$path/java"))) + this.kotlin.setSrcDirs(listOf(layout.projectDirectory.dir("src/$path/java"))) + } else { + this.java.setSrcDirs(listOf()) + this.kotlin.setSrcDirs(listOf()) + } } - compatSourceSets.add(ss) - loom.createRemapConfigurations(ss) val mainSS = sourceSets.main.get() val upperName = ss.name.capitalizeN() + afterEvaluate { + tasks.named("ksp${upperName}Kotlin", KspTaskJvm::class) { + this.options.add(SubpluginOption("apoption", "firmament.sourceset=${ss.name}")) + } + tasks.named("compile${upperName}Kotlin", KotlinCompile::class) { + this.enabled = isEnabled + } + tasks.named("compile${upperName}Java", JavaCompile::class) { + this.enabled = isEnabled + } + } + compatSourceSets.add(ss) + loom.createRemapConfigurations(ss) + if (!isEnabled) return ss configurations { (ss.implementationConfigurationName) { extendsFrom(getByName(mainSS.compileClasspathConfigurationName)) @@ -148,11 +167,6 @@ fun createIsolatedSourceSet(name: String, path: String = "compat/$name"): Source extendsFrom(ksp.get()) } } - afterEvaluate { - tasks.named("ksp${upperName}Kotlin", KspTaskJvm::class) { - this.options.add(SubpluginOption("apoption", "firmament.sourceset=${ss.name}")) - } - } dependencies { runtimeOnly(ss.output) (ss.implementationConfigurationName)(sourceSets.main.get().output) @@ -195,14 +209,16 @@ val nonModImplentation by configurations.creating { } -val configuredSourceSet = createIsolatedSourceSet("configured") +val configuredSourceSet = createIsolatedSourceSet("configured", + isEnabled = false) // Wait for update (also low prio, because configured sucks) val sodiumSourceSet = createIsolatedSourceSet("sodium") -val citResewnSourceSet = createIsolatedSourceSet("citresewn") +val citResewnSourceSet = createIsolatedSourceSet("citresewn", isEnabled = false) // TODO: Wait for update val yaclSourceSet = createIsolatedSourceSet("yacl") -val explosiveEnhancementSourceSet = createIsolatedSourceSet("explosiveEnhancement") -val wildfireGenderSourceSet = createIsolatedSourceSet("wildfireGender") +val explosiveEnhancementSourceSet = createIsolatedSourceSet("explosiveEnhancement", isEnabled = false) // TODO: wait for their port +val wildfireGenderSourceSet = createIsolatedSourceSet("wildfireGender", isEnabled = false) // TODO: wait on their port val modmenuSourceSet = createIsolatedSourceSet("modmenu") -val reiSourceSet = createIsolatedSourceSet("rei") +val reiSourceSet = + createIsolatedSourceSet("rei", isEnabled = false) // TODO: read through https://hackmd.io/@shedaniel/rei17_primer dependencies { // Minecraft dependencies @@ -299,7 +315,7 @@ loom { compatSourceSets.joinToString(File.pathSeparator) { File(it.output.classesDirs.asPath).absolutePath }) - property("mixin.debug", "true") + property("mixin.debug.export", "true") parseEnvFile(file(".env")).forEach { (t, u) -> environmentVariable(t, u) @@ -360,7 +376,7 @@ tasks.shadowJar { } tasks.remapJar { - injectAccessWidener.set(true) +// injectAccessWidener.set(true) inputFile.set(tasks.shadowJar.flatMap { it.archiveFile }) dependsOn(tasks.shadowJar) archiveClassifier.set("") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c11d939..b25717e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,36 +3,36 @@ # SPDX-License-Identifier: CC0-1.0 [versions] -minecraft = "1.21" +minecraft = "1.21.3" # Update from https://kotlinlang.org/ -kotlin = "2.0.20" +kotlin = "2.0.21" # Update from https://github.com/google/ksp/releases -kotlin_ksp = "2.0.20-1.0.24" +kotlin_ksp = "2.0.21-1.0.26" # Update from https://linkie.shedaniel.me/dependencies?loader=fabric -fabric_loader = "0.16.3" -fabric_api = "0.100.4+1.21" -fabric_kotlin = "1.11.0+kotlin.2.0.0" -yarn = "1.21+build.7" -rei = "16.0.729" -modmenu = "11.0.1" -architectury = "13.0.3" +fabric_loader = "0.16.9" +fabric_api = "0.107.0+1.21.3" +fabric_kotlin = "1.12.3+kotlin.2.0.21" +yarn = "1.21.3+build.2" +rei = "17.0.789" +modmenu = "12.0.0-beta.1" +architectury = "14.0.4" # Update from https://maven.architectury.dev/dev/architectury/loom/dev.architectury.loom.gradle.plugin/ -loom = "1.7.412" +loom = "1.7.414" # Update from https://modrinth.com/mod/qolify/versions?l=fabric qolify = "1.6.0-1.21.1" # Update from https://modrinth.com/mod/sodium/versions?l=fabric -sodium = "mc1.21-0.5.11" +sodium = "mc1.21.3-0.6.0-beta.4-fabric" # Update from https://modrinth.com/mod/freecam/versions?l=fabric freecammod = "vomskVK3" # Update from https://modrinth.com/mod/no-chat-reports/versions?l=fabric -ncr = "Fabric-1.21-v2.8.0" +ncr = "Fabric-1.21.3-v2.10.0" # Update from https://modrinth.com/mod/female-gender/versions?l=fabric femalegender = "kJmjQvAS" @@ -49,7 +49,7 @@ citresewn = "1.2.0+1.21" devauth = "1.2.0" # Update from https://ktor.io/ -ktor = "2.3.12" +ktor = "3.0.1" # Update from https://repo.nea.moe/#/releases/moe/nea/neurepoparser neurepoparser = "1.6.0" @@ -58,10 +58,10 @@ neurepoparser = "1.6.0" hotswap_agent = "1.4.2-SNAPSHOT" # Update from https://github.com/LlamaLad7/MixinExtras/tags -mixinextras = "0.3.5" +mixinextras = "0.4.1" jarvis = "1.1.3" -nealisp = "1.0.0" +nealisp = "1.1.0" # Update from https://github.com/NotEnoughUpdates/MoulConfig/tags moulconfig = "3.0.0-beta.15" @@ -77,7 +77,7 @@ hypixelmodapi_fabric = "1.0.1+build.1+mc1.21" manninghamMills = "2.4.1" # Update from https://docs.isxander.dev/yet-another-config-lib/installing-yacl -yacl = "3.5.0+1.21-fabric" +yacl = "3.6.1+1.21.2-fabric" # Update from https://maven.shedaniel.me/me/shedaniel/cloth/basic-math/0.6.1/ basicMath = "0.6.1" @@ -120,10 +120,8 @@ basicMath = { module = "me.shedaniel.cloth:basic-math", version.ref = "basicMath [bundles] runtime_required = [ - "architectury_fabric", - "rei_fabric", - "notenoughanimations", - "femalegender", +# "rei_fabric", +# "notenoughanimations", "hypixelmodapi_fabric", ] runtime_optional = [ @@ -132,7 +130,7 @@ runtime_optional = [ # "sodium", # "qolify", "ncr", - "citresewn", +# "citresewn", ] [plugins] diff --git a/src/compat/sodium/java/SodiumChunkReloader.kt b/src/compat/sodium/java/SodiumChunkReloader.kt index 932c338..0256b88 100644 --- a/src/compat/sodium/java/SodiumChunkReloader.kt +++ b/src/compat/sodium/java/SodiumChunkReloader.kt @@ -1,6 +1,6 @@ package moe.nea.firmament.compat.sodium -import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer +import net.caffeinemc.mods.sodium.client.render.SodiumWorldRenderer import moe.nea.firmament.mixins.accessor.sodium.AccessorSodiumWorldRenderer class SodiumChunkReloader : Runnable { diff --git a/src/compat/sodium/java/moe/nea/firmament/mixins/accessor/sodium/AccessorSodiumWorldRenderer.java b/src/compat/sodium/java/moe/nea/firmament/mixins/accessor/sodium/AccessorSodiumWorldRenderer.java index d585cbc..f75874d 100644 --- a/src/compat/sodium/java/moe/nea/firmament/mixins/accessor/sodium/AccessorSodiumWorldRenderer.java +++ b/src/compat/sodium/java/moe/nea/firmament/mixins/accessor/sodium/AccessorSodiumWorldRenderer.java @@ -1,7 +1,7 @@ package moe.nea.firmament.mixins.accessor.sodium; -import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; +import net.caffeinemc.mods.sodium.client.render.SodiumWorldRenderer; +import net.caffeinemc.mods.sodium.client.render.chunk.RenderSectionManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; import org.spongepowered.asm.mixin.gen.Accessor; @@ -9,6 +9,6 @@ import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(SodiumWorldRenderer.class) @Pseudo public interface AccessorSodiumWorldRenderer { - @Accessor(value = "renderSectionManager", remap = false) - RenderSectionManager getRenderSectionManager_firmament(); + @Accessor(value = "renderSectionManager", remap = false) + RenderSectionManager getRenderSectionManager_firmament(); } diff --git a/src/compat/sodium/java/moe/nea/firmament/mixins/custommodels/PatchBlockModelInSodiumChunkGenerator.java b/src/compat/sodium/java/moe/nea/firmament/mixins/custommodels/PatchBlockModelInSodiumChunkGenerator.java index 90f20bc..fe87310 100644 --- a/src/compat/sodium/java/moe/nea/firmament/mixins/custommodels/PatchBlockModelInSodiumChunkGenerator.java +++ b/src/compat/sodium/java/moe/nea/firmament/mixins/custommodels/PatchBlockModelInSodiumChunkGenerator.java @@ -3,8 +3,8 @@ package moe.nea.firmament.mixins.custommodels; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; -import me.jellysquid.mods.sodium.client.render.chunk.compile.tasks.ChunkBuilderMeshingTask; import moe.nea.firmament.features.texturepack.CustomBlockTextures; +import net.caffeinemc.mods.sodium.client.render.chunk.compile.tasks.ChunkBuilderMeshingTask; import net.minecraft.block.BlockState; import net.minecraft.client.render.block.BlockModels; import net.minecraft.client.render.model.BakedModel; @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(ChunkBuilderMeshingTask.class) public class PatchBlockModelInSodiumChunkGenerator { @WrapOperation( - method = "execute(Lme/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildContext;Lme/jellysquid/mods/sodium/client/util/task/CancellationToken;)Lme/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildOutput;", + method = "execute(Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/ChunkBuildContext;Lnet/caffeinemc/mods/sodium/client/util/task/CancellationToken;)Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/ChunkBuildOutput;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/block/BlockModels;getModel(Lnet/minecraft/block/BlockState;)Lnet/minecraft/client/render/model/BakedModel;")) private BakedModel replaceBlockModel(BlockModels instance, BlockState state, Operation original, @Local(name = "blockPos") BlockPos.Mutable pos) { diff --git a/src/main/java/moe/nea/firmament/mixins/CustomDurabilityBarPatch.java b/src/main/java/moe/nea/firmament/mixins/CustomDurabilityBarPatch.java index 0f4d324..fde3580 100644 --- a/src/main/java/moe/nea/firmament/mixins/CustomDurabilityBarPatch.java +++ b/src/main/java/moe/nea/firmament/mixins/CustomDurabilityBarPatch.java @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(DrawContext.class) public class CustomDurabilityBarPatch { @WrapOperation( - method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", + method = "drawItemBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isItemBarVisible()Z") ) private boolean onIsItemBarVisible( @@ -29,7 +29,7 @@ public class CustomDurabilityBarPatch { return barOverride.get() != null; } - @WrapOperation(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", + @WrapOperation(method = "drawItemBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;getItemBarStep()I")) private int overrideItemStep( ItemStack instance, Operation original, @@ -40,7 +40,7 @@ public class CustomDurabilityBarPatch { return original.call(instance); } - @WrapOperation(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", + @WrapOperation(method = "drawItemBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;getItemBarColor()I")) private int overrideItemColor( ItemStack instance, Operation original, diff --git a/src/main/java/moe/nea/firmament/mixins/CustomModelBakerPatch.java b/src/main/java/moe/nea/firmament/mixins/CustomModelBakerPatch.java deleted file mode 100644 index c1e359d..0000000 --- a/src/main/java/moe/nea/firmament/mixins/CustomModelBakerPatch.java +++ /dev/null @@ -1,49 +0,0 @@ -package moe.nea.firmament.mixins; - -import moe.nea.firmament.events.BakeExtraModelsEvent; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.render.model.UnbakedModel; -import net.minecraft.client.util.ModelIdentifier; -import net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Map; - -@Mixin(ModelLoader.class) -public abstract class CustomModelBakerPatch { - - @Shadow - @Final - private Map modelsToBake; - - @Shadow - protected abstract void loadItemModel(ModelIdentifier id); - - @Shadow - abstract UnbakedModel getOrLoadModel(Identifier id); - - @Shadow - protected abstract void add(ModelIdentifier id, UnbakedModel model); - - @Unique - private void loadNonItemModel(ModelIdentifier identifier) { - UnbakedModel unbakedModel = this.getOrLoadModel(identifier.id()); - this.add(identifier, unbakedModel); - } - - - @Inject(method = "bake", at = @At("HEAD")) - public void onBake(ModelLoader.SpriteGetter spliteGetter, CallbackInfo ci) { - BakeExtraModelsEvent.Companion.publish(new BakeExtraModelsEvent(this::loadItemModel, this::loadNonItemModel)); - modelsToBake.values().forEach(model -> model.setParents(this::getOrLoadModel)); -// modelsToBake.keySet().stream() -// .filter(it -> !it.id().getNamespace().equals("minecraft")) -// .forEach(it -> System.out.println("Non minecraft texture is being loaded: " + it)); - } -} diff --git a/src/main/java/moe/nea/firmament/mixins/CustomModelEventPatch.java b/src/main/java/moe/nea/firmament/mixins/CustomModelEventPatch.java index 61fc82e..e7207f4 100644 --- a/src/main/java/moe/nea/firmament/mixins/CustomModelEventPatch.java +++ b/src/main/java/moe/nea/firmament/mixins/CustomModelEventPatch.java @@ -7,6 +7,7 @@ import net.minecraft.client.render.item.ItemModels; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.BakedModelManager; import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -14,16 +15,15 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.Map; + @Mixin(ItemModels.class) public class CustomModelEventPatch { - @Shadow - @Final - private BakedModelManager modelManager; - @Inject(method = "getModel(Lnet/minecraft/item/ItemStack;)Lnet/minecraft/client/render/model/BakedModel;", at = @At("HEAD"), cancellable = true) - public void onGetModel(ItemStack stack, CallbackInfoReturnable cir) { - var model = CustomItemModelEvent.getModel(stack, modelManager); - if (model != null) - cir.setReturnValue(model); - } + @Inject(method = "getModel(Lnet/minecraft/item/ItemStack;)Lnet/minecraft/client/render/model/BakedModel;", at = @At("HEAD"), cancellable = true) + public void onGetModel(ItemStack stack, CallbackInfoReturnable cir) { + var model = CustomItemModelEvent.getModel(stack, (ItemModels) (Object) this); + if (model != null) + cir.setReturnValue(model); + } } diff --git a/src/main/java/moe/nea/firmament/mixins/CustomSkullTexturePatch.java b/src/main/java/moe/nea/firmament/mixins/CustomSkullTexturePatch.java index 4b3f3c3..f3b616a 100644 --- a/src/main/java/moe/nea/firmament/mixins/CustomSkullTexturePatch.java +++ b/src/main/java/moe/nea/firmament/mixins/CustomSkullTexturePatch.java @@ -2,7 +2,6 @@ package moe.nea.firmament.mixins; -import com.mojang.authlib.GameProfile; import moe.nea.firmament.features.texturepack.CustomSkyBlockTextures; import net.minecraft.block.SkullBlock; import net.minecraft.client.render.RenderLayer; @@ -15,8 +14,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(SkullBlockEntityRenderer.class) public class CustomSkullTexturePatch { - @Inject(method = "getRenderLayer", at = @At("HEAD"), cancellable = true) - private static void onGetRenderLayer(SkullBlock.SkullType type, ProfileComponent profile, CallbackInfoReturnable cir) { - CustomSkyBlockTextures.INSTANCE.modifySkullTexture(type, profile, cir); - } + @Inject(method = "getRenderLayer", at = @At("HEAD"), cancellable = true) + private static void onGetRenderLayer(SkullBlock.SkullType type, ProfileComponent profile, CallbackInfoReturnable cir) { + CustomSkyBlockTextures.INSTANCE.modifySkullTexture(type, profile, cir); + } } diff --git a/src/main/java/moe/nea/firmament/mixins/DFUEntityIdFixPatch.java b/src/main/java/moe/nea/firmament/mixins/DFUEntityIdFixPatch.java index da04ca2..717d404 100644 --- a/src/main/java/moe/nea/firmament/mixins/DFUEntityIdFixPatch.java +++ b/src/main/java/moe/nea/firmament/mixins/DFUEntityIdFixPatch.java @@ -17,6 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Map; +// TODO: rework this @Mixin(EntityIdFix.class) public abstract class DFUEntityIdFixPatch extends DataFix { @Shadow diff --git a/src/main/java/moe/nea/firmament/mixins/InjectCustomShaderPrograms.java b/src/main/java/moe/nea/firmament/mixins/InjectCustomShaderPrograms.java deleted file mode 100644 index 5306e42..0000000 --- a/src/main/java/moe/nea/firmament/mixins/InjectCustomShaderPrograms.java +++ /dev/null @@ -1,31 +0,0 @@ -package moe.nea.firmament.mixins; - -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.datafixers.util.Pair; -import moe.nea.firmament.events.RegisterCustomShadersEvent; -import net.minecraft.client.gl.ShaderProgram; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.resource.ResourceFactory; -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 java.util.List; -import java.util.function.Consumer; - -@Mixin(GameRenderer.class) -public class InjectCustomShaderPrograms { - - @Inject(method = "loadPrograms", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;loadBlurPostProcessor(Lnet/minecraft/resource/ResourceFactory;)V", - shift = At.Shift.AFTER)) - void addFirmamentShaders( - ResourceFactory resourceFactory, CallbackInfo ci, - @Local(index = 3) List>> list - ) { - var event = new RegisterCustomShadersEvent(list, resourceFactory); - RegisterCustomShadersEvent.Companion.publish(event); - } -} diff --git a/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java b/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java index fd50c72..1034a12 100644 --- a/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java +++ b/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java @@ -2,6 +2,9 @@ package moe.nea.firmament.mixins; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; import moe.nea.firmament.events.*; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.HandledScreen; @@ -21,6 +24,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import java.util.Iterator; + @Mixin(HandledScreen.class) public abstract class MixinHandledScreen { @@ -90,15 +95,12 @@ public abstract class MixinHandledScreen { } - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawSlot(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/screen/slot/Slot;)V", shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD) - public void onAfterDrawSlot(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci, int i, int j, int k, Slot slot) { - SlotRenderEvents.After event = new SlotRenderEvents.After(context, slot, mouseX, mouseY, delta); - SlotRenderEvents.After.Companion.publish(event); - } - - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawSlot(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/screen/slot/Slot;)V", shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD) - public void onBeforeDrawSlot(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci, int i, int j, int k, Slot slot) { - SlotRenderEvents.Before event = new SlotRenderEvents.Before(context, slot, mouseX, mouseY, delta); - SlotRenderEvents.Before.Companion.publish(event); + @WrapOperation(method = "drawSlots", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawSlot(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/screen/slot/Slot;)V")) + public void onDrawSlots(HandledScreen instance, DrawContext context, Slot slot, Operation original) { + var before = new SlotRenderEvents.Before(context, slot); + SlotRenderEvents.Before.Companion.publish(before); + original.call(instance, context, slot); + var after = new SlotRenderEvents.After(context, slot); + SlotRenderEvents.After.Companion.publish(after); } } diff --git a/src/main/java/moe/nea/firmament/mixins/ReplaceTextColorInHandledScreen.java b/src/main/java/moe/nea/firmament/mixins/ReplaceTextColorInHandledScreen.java index 190fda0..c9fb073 100644 --- a/src/main/java/moe/nea/firmament/mixins/ReplaceTextColorInHandledScreen.java +++ b/src/main/java/moe/nea/firmament/mixins/ReplaceTextColorInHandledScreen.java @@ -20,12 +20,16 @@ import org.spongepowered.asm.mixin.injection.At; AnvilScreen.class, BeaconScreen.class}) public class ReplaceTextColorInHandledScreen { + // To my future self: double check those mixins, but don't be too concerned about errors. Some of the wrapopertions + // only apply in some of the specified subclasses. + @WrapOperation( method = "drawForeground", at = @At( value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawText(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/text/Text;IIIZ)I"), - expect = 0) + expect = 0, + require = 0) private int replaceTextColorWithVariableShadow(DrawContext instance, TextRenderer textRenderer, Text text, int x, int y, int color, boolean shadow, Operation original) { return original.call(instance, textRenderer, text, x, y, CustomTextColors.INSTANCE.mapTextColor(text, color), shadow); } @@ -35,7 +39,8 @@ public class ReplaceTextColorInHandledScreen { at = @At( value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTextWithShadow(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/text/Text;III)I"), - expect = 0) + expect = 0, + require = 0) private int replaceTextColorWithShadow(DrawContext instance, TextRenderer textRenderer, Text text, int x, int y, int color, Operation original) { return original.call(instance, textRenderer, text, x, y, CustomTextColors.INSTANCE.mapTextColor(text, color)); } diff --git a/src/main/java/moe/nea/firmament/mixins/SlotUpdateListener.java b/src/main/java/moe/nea/firmament/mixins/SlotUpdateListener.java index 6c854d4..06ecbd4 100644 --- a/src/main/java/moe/nea/firmament/mixins/SlotUpdateListener.java +++ b/src/main/java/moe/nea/firmament/mixins/SlotUpdateListener.java @@ -23,14 +23,13 @@ public abstract class SlotUpdateListener extends ClientCommonNetworkHandler { @Inject( method = "onScreenHandlerSlotUpdate", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/tutorial/TutorialManager;onSlotUpdate(Lnet/minecraft/item/ItemStack;)V")) + at = @At(value = "TAIL")) private void onSingleSlotUpdate( ScreenHandlerSlotUpdateS2CPacket packet, CallbackInfo ci) { var player = this.client.player; assert player != null; - if (packet.getSyncId() == ScreenHandlerSlotUpdateS2CPacket.UPDATE_PLAYER_INVENTORY_SYNC_ID - || packet.getSyncId() == 0) { + if (packet.getSyncId() == 0) { PlayerInventoryUpdate.Companion.publish(new PlayerInventoryUpdate.Single(packet.getSlot(), packet.getStack())); } else if (packet.getSyncId() == player.currentScreenHandler.syncId) { ChestInventoryUpdateEvent.Companion.publish( @@ -40,8 +39,7 @@ public abstract class SlotUpdateListener extends ClientCommonNetworkHandler { } @Inject(method = "onInventory", - at = @At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkThreadUtils;forceMainThread(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/listener/PacketListener;Lnet/minecraft/util/thread/ThreadExecutor;)V", - shift = At.Shift.AFTER)) + at = @At("TAIL")) private void onMultiSlotUpdate(InventoryS2CPacket packet, CallbackInfo ci) { var player = this.client.player; assert player != null; diff --git a/src/main/java/moe/nea/firmament/mixins/WorldRenderLastEventPatch.java b/src/main/java/moe/nea/firmament/mixins/WorldRenderLastEventPatch.java index 2ff4560..158576a 100644 --- a/src/main/java/moe/nea/firmament/mixins/WorldRenderLastEventPatch.java +++ b/src/main/java/moe/nea/firmament/mixins/WorldRenderLastEventPatch.java @@ -2,11 +2,10 @@ package moe.nea.firmament.mixins; -import com.llamalad7.mixinextras.sugar.Local; import moe.nea.firmament.events.WorldRenderLastEvent; import net.minecraft.client.render.*; +import net.minecraft.client.util.ObjectAllocator; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.world.tick.TickManager; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -17,21 +16,17 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(WorldRenderer.class) public class WorldRenderLastEventPatch { - @Shadow - @Final - private BufferBuilderStorage bufferBuilders; + @Shadow + @Final + private BufferBuilderStorage bufferBuilders; - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderChunkDebugInfo(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;Lnet/minecraft/client/render/Camera;)V", shift = At.Shift.BEFORE)) - public void onWorldRenderLast( - RenderTickCounter tickCounter, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, - LightmapTextureManager lightmapTextureManager, Matrix4f matrix4f, Matrix4f matrix4f2, - CallbackInfo ci, @Local MatrixStack matrixStack - ) { - var event = new WorldRenderLastEvent( - matrixStack, tickCounter, renderBlockOutline, - camera, gameRenderer, lightmapTextureManager, - this.bufferBuilders.getEntityVertexConsumers() - ); - WorldRenderLastEvent.Companion.publish(event); - } + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderLateDebug(Lnet/minecraft/client/render/FrameGraphBuilder;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/client/render/Fog;)V", shift = At.Shift.BEFORE)) + public void onWorldRenderLast(ObjectAllocator allocator, RenderTickCounter tickCounter, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f positionMatrix, Matrix4f projectionMatrix, CallbackInfo ci) { + var event = new WorldRenderLastEvent( + new MatrixStack(), tickCounter, renderBlockOutline, + camera, gameRenderer, lightmapTextureManager, + this.bufferBuilders.getEntityVertexConsumers() + ); + WorldRenderLastEvent.Companion.publish(event); + } } diff --git a/src/main/java/moe/nea/firmament/mixins/accessor/AccessorGameRenderer.java b/src/main/java/moe/nea/firmament/mixins/accessor/AccessorGameRenderer.java deleted file mode 100644 index f5d2202..0000000 --- a/src/main/java/moe/nea/firmament/mixins/accessor/AccessorGameRenderer.java +++ /dev/null @@ -1,14 +0,0 @@ - - -package moe.nea.firmament.mixins.accessor; - -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.GameRenderer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(GameRenderer.class) -public interface AccessorGameRenderer { - @Invoker("getFov") - double getFov_firmament(Camera camera, float tickDelta, boolean changingFov); -} diff --git a/src/main/java/moe/nea/firmament/mixins/customgui/PatchHandledScreen.java b/src/main/java/moe/nea/firmament/mixins/customgui/PatchHandledScreen.java index deac0a4..814f172 100644 --- a/src/main/java/moe/nea/firmament/mixins/customgui/PatchHandledScreen.java +++ b/src/main/java/moe/nea/firmament/mixins/customgui/PatchHandledScreen.java @@ -14,7 +14,6 @@ import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; -import net.minecraft.util.collection.DefaultedList; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -88,29 +87,18 @@ public class PatchHandledScreen extends Screen implemen } - @Unique - private Slot didBeforeSlotRender; - @WrapOperation( - method = "render", + method = "drawSlots", at = @At( value = "INVOKE", - target = "Lnet/minecraft/util/collection/DefaultedList;get(I)Ljava/lang/Object;")) - private Object beforeSlotRender(DefaultedList instance, int index, Operation original, @Local(argsOnly = true) DrawContext context) { - var slot = (Slot) original.call(instance, index); + target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawSlot(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/screen/slot/Slot;)V")) + private void beforeSlotRender(HandledScreen instance, DrawContext context, Slot slot, Operation original) { if (override != null) { - didBeforeSlotRender = slot; override.beforeSlotRender(context, slot); } - return slot; - } - - @Inject(method = "render", - at = @At(value = "INVOKE", target = "Lnet/minecraft/util/collection/DefaultedList;size()I")) - private void afterSlotRender(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { - if (override != null && didBeforeSlotRender != null) { - override.afterSlotRender(context, didBeforeSlotRender); - didBeforeSlotRender = null; + original.call(instance, context, slot); + if (override != null) { + override.afterSlotRender(context, slot); } } diff --git a/src/main/java/moe/nea/firmament/mixins/custommodels/ApplyHeadModelInItemRenderer.java b/src/main/java/moe/nea/firmament/mixins/custommodels/ApplyHeadModelInItemRenderer.java index 64b358f..ffa59c6 100644 --- a/src/main/java/moe/nea/firmament/mixins/custommodels/ApplyHeadModelInItemRenderer.java +++ b/src/main/java/moe/nea/firmament/mixins/custommodels/ApplyHeadModelInItemRenderer.java @@ -1,33 +1,35 @@ package moe.nea.firmament.mixins.custommodels; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; import moe.nea.firmament.features.texturepack.BakedModelExtra; +import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.json.ModelTransformationMode; -import net.minecraft.entity.LivingEntity; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; -import net.minecraft.world.World; +import net.minecraft.item.ModelTransformationMode; 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; @Mixin(ItemRenderer.class) public class ApplyHeadModelInItemRenderer { - @WrapOperation(method = "renderItem(Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/render/model/json/ModelTransformationMode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;Lnet/minecraft/world/World;III)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/item/ItemRenderer;getModel(Lnet/minecraft/item/ItemStack;Lnet/minecraft/world/World;Lnet/minecraft/entity/LivingEntity;I)Lnet/minecraft/client/render/model/BakedModel;")) - private BakedModel applyHeadModel(ItemRenderer instance, ItemStack stack, World world, LivingEntity entity, int seed, Operation original, - @Local(argsOnly = true) ModelTransformationMode modelTransformationMode) { - var model = original.call(instance, stack, world, entity, seed); - if (modelTransformationMode == ModelTransformationMode.HEAD - && model instanceof BakedModelExtra extra) { - var headModel = extra.getHeadModel_firmament(); - if (headModel != null) { - model = headModel; - } - } - return model; - } + @Inject(method = "renderItem(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ModelTransformationMode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/render/model/BakedModel;ZF)V", + at = @At("HEAD")) + private void applyHeadModel(ItemStack stack, ModelTransformationMode transformationMode, boolean leftHanded, + MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, + BakedModel model, boolean useInventoryModel, float z, CallbackInfo ci, + @Local(argsOnly = true) LocalRef modelMut + ) { + if (transformationMode == ModelTransformationMode.HEAD + && model instanceof BakedModelExtra extra) { + var headModel = extra.getHeadModel_firmament(); + if (headModel != null) { + modelMut.set(headModel); + } + } + } } diff --git a/src/main/java/moe/nea/firmament/mixins/custommodels/GlobalModelOverridePatch.java b/src/main/java/moe/nea/firmament/mixins/custommodels/GlobalModelOverridePatch.java index eee7557..c708862 100644 --- a/src/main/java/moe/nea/firmament/mixins/custommodels/GlobalModelOverridePatch.java +++ b/src/main/java/moe/nea/firmament/mixins/custommodels/GlobalModelOverridePatch.java @@ -8,6 +8,7 @@ import net.minecraft.client.render.model.BakedModel; import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -17,13 +18,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ItemRenderer.class) public abstract class GlobalModelOverridePatch { - @Shadow - public abstract ItemModels getModels(); + @Shadow + @Final + private ItemModels models; - @Inject(method = "getModel", at = @At("HEAD"), cancellable = true) - private void overrideGlobalModel( - ItemStack stack, World world, LivingEntity entity, - int seed, CallbackInfoReturnable cir) { - CustomGlobalTextures.replaceGlobalModel(this.getModels(), stack, cir); - } + @Inject(method = "getModel(Lnet/minecraft/item/ItemStack;Lnet/minecraft/world/World;Lnet/minecraft/entity/LivingEntity;I)Lnet/minecraft/client/render/model/BakedModel;", at = @At("HEAD"), cancellable = true) + private void overrideGlobalModel( + ItemStack stack, World world, LivingEntity entity, + int seed, CallbackInfoReturnable cir) { + CustomGlobalTextures.replaceGlobalModel(this.models, stack, cir); + } } diff --git a/src/main/java/moe/nea/firmament/mixins/custommodels/HeadModelReplacerPatch.java b/src/main/java/moe/nea/firmament/mixins/custommodels/HeadModelReplacerPatch.java new file mode 100644 index 0000000..7518041 --- /dev/null +++ b/src/main/java/moe/nea/firmament/mixins/custommodels/HeadModelReplacerPatch.java @@ -0,0 +1,55 @@ + +package moe.nea.firmament.mixins.custommodels; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import moe.nea.firmament.features.texturepack.BakedModelExtra; +import net.minecraft.block.AbstractSkullBlock; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.entity.feature.HeadFeatureRenderer; +import net.minecraft.client.render.entity.model.EntityModel; +import net.minecraft.client.render.entity.model.ModelWithHead; +import net.minecraft.client.render.entity.state.LivingEntityRenderState; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(HeadFeatureRenderer.class) +public class HeadModelReplacerPatch & ModelWithHead> { + /** + * This class serves to disable the replacing of head models with the vanilla block model. Vanilla first selects loads + * the model containing the head model regularly in {@link LivingEntityRenderer#updateRenderState}, but then discards + * the model in {@link HeadFeatureRenderer#render(MatrixStack, VertexConsumerProvider, int, LivingEntityRenderState, float, float)} + * if it detects a skull block. This serves to disable that functionality if a head model override is present. + */ + @WrapOperation(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/state/LivingEntityRenderState;FF)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/item/BlockItem;getBlock()Lnet/minecraft/block/Block;")) + private Block replaceSkull(BlockItem instance, Operation original, @Local BakedModel bakedModel) { + var oldBlock = original.call(instance); + if (oldBlock instanceof AbstractSkullBlock) { + if (bakedModel instanceof BakedModelExtra extra && extra.getHeadModel_firmament() != null) + return Blocks.ENCHANTING_TABLE; // Any non skull block. Let's choose the enchanting table because it is very distinct. + } + return oldBlock; + } + + /** + * We disable the has model override, since texture packs get precedent to server data. + */ + @WrapOperation(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/state/LivingEntityRenderState;FF)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/feature/ArmorFeatureRenderer;hasModel(Lnet/minecraft/item/ItemStack;Lnet/minecraft/entity/EquipmentSlot;)Z")) + private boolean replaceHasModel(ItemStack stack, EquipmentSlot slot, Operation original, + @Local BakedModel bakedModel) { + if (bakedModel instanceof BakedModelExtra extra && extra.getHeadModel_firmament() != null) + return false; + return original.call(stack, slot); + } +} diff --git a/src/main/java/moe/nea/firmament/mixins/custommodels/ItemRendererTintContextPatch.java b/src/main/java/moe/nea/firmament/mixins/custommodels/ItemRendererTintContextPatch.java index 5ed0fbe..66feced 100644 --- a/src/main/java/moe/nea/firmament/mixins/custommodels/ItemRendererTintContextPatch.java +++ b/src/main/java/moe/nea/firmament/mixins/custommodels/ItemRendererTintContextPatch.java @@ -5,27 +5,27 @@ import moe.nea.firmament.features.texturepack.TintOverrides; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.json.ModelTransformationMode; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; +import net.minecraft.item.ModelTransformationMode; 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; -@Mixin(ItemRenderer.class) +@Mixin(value = ItemRenderer.class, priority = 1010) public class ItemRendererTintContextPatch { - @Inject(method = "renderItem(Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/render/model/json/ModelTransformationMode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/render/model/BakedModel;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/model/BakedModel;getTransformation()Lnet/minecraft/client/render/model/json/ModelTransformation;"), allow = 1) - private void onStartRendering(ItemStack stack, ModelTransformationMode renderMode, boolean leftHanded, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, BakedModel model, CallbackInfo ci) { + @Inject(method = "renderItem(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ModelTransformationMode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/render/model/BakedModel;ZF)V", + at = @At(value = "HEAD"), allow = 1) + private void onStartRendering(ItemStack stack, ModelTransformationMode transformationMode, boolean leftHanded, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, BakedModel model, boolean useInventoryModel, float z, CallbackInfo ci) { if (model instanceof BakedModelExtra extra) { TintOverrides.Companion.enter(extra.getTintOverrides_firmament()); } } - @Inject(method = "renderItem(Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/render/model/json/ModelTransformationMode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/render/model/BakedModel;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;pop()V"), allow = 1) - private void onEndRendering(ItemStack stack, ModelTransformationMode renderMode, boolean leftHanded, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, BakedModel model, CallbackInfo ci) { + @Inject(method = "renderItem(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ModelTransformationMode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/render/model/BakedModel;ZF)V", + at = @At("TAIL"), allow = 1) + private void onEndRendering(ItemStack stack, ModelTransformationMode transformationMode, boolean leftHanded, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, BakedModel model, boolean useInventoryModel, float z, CallbackInfo ci) { if (model instanceof BakedModelExtra extra) { TintOverrides.Companion.exit(extra.getTintOverrides_firmament()); } diff --git a/src/main/java/moe/nea/firmament/mixins/custommodels/JsonUnbakedModelDataHolder.java b/src/main/java/moe/nea/firmament/mixins/custommodels/JsonUnbakedModelDataHolder.java index 20c69e2..12eea5b 100644 --- a/src/main/java/moe/nea/firmament/mixins/custommodels/JsonUnbakedModelDataHolder.java +++ b/src/main/java/moe/nea/firmament/mixins/custommodels/JsonUnbakedModelDataHolder.java @@ -1,6 +1,5 @@ package moe.nea.firmament.mixins.custommodels; -import com.google.gson.annotations.SerializedName; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; import moe.nea.firmament.features.texturepack.BakedModelExtra; @@ -18,15 +17,20 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.Collection; import java.util.Objects; @Mixin(JsonUnbakedModel.class) -public class JsonUnbakedModelDataHolder implements JsonUnbakedModelFirmExtra { +public abstract class JsonUnbakedModelDataHolder implements JsonUnbakedModelFirmExtra { @Shadow @Nullable protected JsonUnbakedModel parent; + + @Shadow + public abstract String toString(); + @Unique @Nullable public Identifier headModel; @@ -67,30 +71,29 @@ public class JsonUnbakedModelDataHolder implements JsonUnbakedModelFirmExtra { return ((JsonUnbakedModelFirmExtra) this.parent).getHeadModel_firmament(); } - @ModifyReturnValue(method = "getModelDependencies", at = @At("RETURN")) - private Collection addDependencies(Collection original) { + @Inject(method = "resolve", at = @At("HEAD")) + private void addDependencies(UnbakedModel.Resolver resolver, CallbackInfo ci) { var headModel = getHeadModel_firmament(); if (headModel != null) { - original.add(headModel); + resolver.resolve(headModel); } - return original; } @ModifyReturnValue( - method = "bake(Lnet/minecraft/client/render/model/Baker;Lnet/minecraft/client/render/model/json/JsonUnbakedModel;Ljava/util/function/Function;Lnet/minecraft/client/render/model/ModelBakeSettings;Z)Lnet/minecraft/client/render/model/BakedModel;", + method = "bake(Lnet/minecraft/client/render/model/Baker;Ljava/util/function/Function;Lnet/minecraft/client/render/model/ModelBakeSettings;)Lnet/minecraft/client/render/model/BakedModel;", at = @At(value = "RETURN")) private BakedModel bakeExtraInfo(BakedModel original, @Local(argsOnly = true) Baker baker) { + if (!this.toString().contains("minecraft") && this.toString().contains("crimson")) { + System.out.println("Found non minecraft model " + this); + } if (original instanceof BakedModelExtra extra) { var headModel = getHeadModel_firmament(); if (headModel != null) { - UnbakedModel unbakedModel = baker.getOrLoadModel(headModel); - extra.setHeadModel_firmament( - Objects.equals(unbakedModel, parent) - ? null - : baker.bake(headModel, ModelRotation.X0_Y0)); + extra.setHeadModel_firmament(baker.bake(headModel, ModelRotation.X0_Y0)); } - if (getTintOverrides_firmament().hasOverrides()) + if (getTintOverrides_firmament().hasOverrides()) { extra.setTintOverrides_firmament(getTintOverrides_firmament()); + } } return original; } diff --git a/src/main/java/moe/nea/firmament/mixins/custommodels/PatchArmorTexture.java b/src/main/java/moe/nea/firmament/mixins/custommodels/PatchArmorTexture.java index 7c6f69e..4468150 100644 --- a/src/main/java/moe/nea/firmament/mixins/custommodels/PatchArmorTexture.java +++ b/src/main/java/moe/nea/firmament/mixins/custommodels/PatchArmorTexture.java @@ -6,26 +6,24 @@ import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; import moe.nea.firmament.features.texturepack.CustomGlobalArmorOverrides; import net.minecraft.client.render.entity.feature.ArmorFeatureRenderer; -import net.minecraft.item.ArmorMaterial; +import net.minecraft.component.type.EquippableComponent; import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import java.util.List; +import java.util.Optional; @Mixin(ArmorFeatureRenderer.class) public class PatchArmorTexture { - @WrapOperation( - method = "renderArmor", - at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ArmorMaterial;layers()Ljava/util/List;")) - private List overrideLayers( - ArmorMaterial instance, - Operation> original, - @Local ItemStack itemStack - ) { - var overrides = CustomGlobalArmorOverrides.overrideArmor(itemStack); - if (overrides == null) - return original.call(instance); - return overrides; - } + @WrapOperation( + method = "renderArmor", + at = @At(value = "INVOKE", target = "Lnet/minecraft/component/type/EquippableComponent;model()Ljava/util/Optional;")) + private Optional overrideLayers( + EquippableComponent instance, Operation> original, @Local(argsOnly = true) ItemStack itemStack + ) { + // TODO: check that all armour items are naturally equippable and have the equppable component. otherwise our call here will not be reached. + var overrides = CustomGlobalArmorOverrides.overrideArmor(itemStack); + return overrides.or(() -> original.call(instance)); + } } diff --git a/src/main/java/moe/nea/firmament/mixins/custommodels/PatchHeadFeatureRenderer.java b/src/main/java/moe/nea/firmament/mixins/custommodels/PatchHeadFeatureRenderer.java deleted file mode 100644 index 610a106..0000000 --- a/src/main/java/moe/nea/firmament/mixins/custommodels/PatchHeadFeatureRenderer.java +++ /dev/null @@ -1,45 +0,0 @@ - -package moe.nea.firmament.mixins.custommodels; - -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.llamalad7.mixinextras.sugar.Local; -import moe.nea.firmament.features.texturepack.BakedModelExtra; -import net.minecraft.block.AbstractSkullBlock; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.client.render.entity.feature.HeadFeatureRenderer; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.client.render.item.HeldItemRenderer; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(HeadFeatureRenderer.class) -public class PatchHeadFeatureRenderer> { - - @Shadow - @Final - private HeldItemRenderer heldItemRenderer; - - @WrapOperation(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/entity/LivingEntity;FFFFFF)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/item/BlockItem;getBlock()Lnet/minecraft/block/Block;")) - private Block replaceSkull(BlockItem instance, Operation original, @Local ItemStack itemStack, @Local(argsOnly = true) T entity) { - var oldBlock = original.call(instance); - if (oldBlock instanceof AbstractSkullBlock) { - var bakedModel = this.heldItemRenderer.itemRenderer - .getModel(itemStack, entity.getWorld(), entity, 0); - if (bakedModel instanceof BakedModelExtra extra && extra.getHeadModel_firmament() != null) - return Blocks.ENCHANTING_TABLE; // Any non skull block. Let's choose the enchanting table because it is very distinct. - } - return oldBlock; - } - - - - -} diff --git a/src/main/java/moe/nea/firmament/mixins/custommodels/PatchLegacyArmorLayerSupport.java b/src/main/java/moe/nea/firmament/mixins/custommodels/PatchLegacyArmorLayerSupport.java new file mode 100644 index 0000000..8c0b3f8 --- /dev/null +++ b/src/main/java/moe/nea/firmament/mixins/custommodels/PatchLegacyArmorLayerSupport.java @@ -0,0 +1,22 @@ +package moe.nea.firmament.mixins.custommodels; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import moe.nea.firmament.features.texturepack.CustomGlobalArmorOverrides; +import net.minecraft.client.render.entity.equipment.EquipmentModelLoader; +import net.minecraft.client.render.entity.equipment.EquipmentRenderer; +import net.minecraft.item.equipment.EquipmentModel; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(EquipmentRenderer.class) +public class PatchLegacyArmorLayerSupport { + @WrapOperation(method = "render(Lnet/minecraft/item/equipment/EquipmentModel$LayerType;Lnet/minecraft/util/Identifier;Lnet/minecraft/client/model/Model;Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/util/Identifier;)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/equipment/EquipmentModelLoader;get(Lnet/minecraft/util/Identifier;)Lnet/minecraft/item/equipment/EquipmentModel;")) + private EquipmentModel patchModelLayers(EquipmentModelLoader instance, Identifier id, Operation original) { + var modelOverride = CustomGlobalArmorOverrides.overrideArmorLayer(id); + if (modelOverride != null) return modelOverride; + return original.call(instance, id); + } +} diff --git a/src/main/java/moe/nea/firmament/mixins/custommodels/PatchOverrideDeserializer.java b/src/main/java/moe/nea/firmament/mixins/custommodels/PatchOverrideDeserializer.java index 938d14d..abb1792 100644 --- a/src/main/java/moe/nea/firmament/mixins/custommodels/PatchOverrideDeserializer.java +++ b/src/main/java/moe/nea/firmament/mixins/custommodels/PatchOverrideDeserializer.java @@ -22,29 +22,29 @@ import java.util.Map; @Mixin(ModelOverride.Deserializer.class) public class PatchOverrideDeserializer { - @ModifyReturnValue( - method = "deserialize(Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lnet/minecraft/client/render/model/json/ModelOverride;", - at = @At(value = "RETURN")) - private ModelOverride addCustomOverrides(ModelOverride original, @Local JsonObject jsonObject) { - var originalData = (ModelOverrideData) original; - originalData.setFirmamentOverrides(CustomModelOverrideParser.parseCustomModelOverrides(jsonObject)); - return original; - } + @ModifyReturnValue( + method = "deserialize(Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lnet/minecraft/client/render/model/json/ModelOverride;", + at = @At(value = "RETURN")) + private ModelOverride addCustomOverrides(ModelOverride original, @Local JsonObject jsonObject) { + var originalData = (ModelOverrideData) (Object) original; + originalData.setFirmamentOverrides(CustomModelOverrideParser.parseCustomModelOverrides(jsonObject)); + return original; + } - @ModifyExpressionValue( - method = "deserializeMinPropertyValues(Lcom/google/gson/JsonObject;)Ljava/util/List;", - at = @At(value = "INVOKE", target = "Ljava/util/Map$Entry;getValue()Ljava/lang/Object;")) - private Object removeFirmamentPredicatesFromJsonIteration(Object original, @Local Map.Entry entry) { - if (entry.getKey().startsWith("firmament:")) return new JsonPrimitive(0F); - return original; - } + @ModifyExpressionValue( + method = "deserializeMinPropertyValues(Lcom/google/gson/JsonObject;)Ljava/util/List;", + at = @At(value = "INVOKE", target = "Ljava/util/Map$Entry;getValue()Ljava/lang/Object;")) + private Object removeFirmamentPredicatesFromJsonIteration(Object original, @Local Map.Entry entry) { + if (entry.getKey().startsWith("firmament:")) return new JsonPrimitive(0F); + return original; + } - @Inject( - method = "deserializeMinPropertyValues", - at = @At(value = "INVOKE", target = "Ljava/util/Map;entrySet()Ljava/util/Set;") - ) - private void whatever(JsonObject object, CallbackInfoReturnable> cir, -