diff --git a/build.gradle b/build.gradle index 650ad0d1..28c3b300 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.9-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.10-SNAPSHOT" apply false id "maven-publish" id 'com.matthewprenger.cursegradle' version '1.4.0' apply false id 'com.palantir.git-version' version '1.0.0' diff --git a/buildSrc/src/main/groovy/modernfix.common-conventions.gradle b/buildSrc/src/main/groovy/modernfix.common-conventions.gradle index 69569061..1f8db7b8 100644 --- a/buildSrc/src/main/groovy/modernfix.common-conventions.gradle +++ b/buildSrc/src/main/groovy/modernfix.common-conventions.gradle @@ -84,7 +84,7 @@ repositories { exclusiveContent { forRepository { maven { - url = 'https://maven.saps.dev/minecraft' + url = 'https://maven.latvian.dev/releases' } } filter { diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java index a3a0c9fb..6f04cce7 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java @@ -9,11 +9,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.mojang.serialization.JsonOps; import net.minecraft.client.model.geom.EntityModelSet; -import net.minecraft.client.renderer.block.model.BlockModel; -import net.minecraft.client.renderer.block.model.BlockModelDefinition; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.block.model.ItemModelGenerator; -import net.minecraft.client.renderer.block.model.SimpleModelWrapper; +import net.minecraft.client.renderer.block.model.*; import net.minecraft.client.renderer.item.ClientItem; import net.minecraft.client.renderer.item.ItemModel; import net.minecraft.client.renderer.item.MissingItemModel; @@ -33,16 +29,19 @@ import net.minecraft.client.resources.model.ModelState; import net.minecraft.client.resources.model.ResolvedModel; import net.minecraft.client.resources.model.SpriteGetter; import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.core.Direction; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.util.GsonHelper; +import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import org.embeddedt.modernfix.ModernFix; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.Reader; import java.lang.ref.WeakReference; @@ -146,16 +145,46 @@ public class DynamicModelProvider { public SpriteGetter sprites() { return DynamicModelProvider.this.textureGetter; } + + @Override + public T compute(SharedOperationKey key) { + return key.compute(this); + } }; var textureSlots = this.resolvedMissingModel.getTopTextureSlots(); var quadCollection = this.resolvedMissingModel.bakeTopGeometry(textureSlots, missingModelBaker, BlockModelRotation.X0_Y0); var particleSprite = this.resolvedMissingModel.resolveParticleSprite(textureSlots, missingModelBaker); - this.missingModel = new SimpleModelWrapper(quadCollection, resolvedMissingModel.getTopAmbientOcclusion(), particleSprite); + this.missingModel = new BlockStateModel() { + @Override + public void collectParts(RandomSource random, List output) { + output.add(new BlockModelPart() { + @Override + public List getQuads(@Nullable Direction direction) { + return quadCollection.getQuads(direction); + } + + @Override + public boolean useAmbientOcclusion() { + return resolvedMissingModel.getTopAmbientOcclusion(); + } + + @Override + public TextureAtlasSprite particleIcon() { + return particleSprite; + } + }); + } + + @Override + public TextureAtlasSprite particleIcon() { + return particleSprite; + } + }; //SimpleModelWrapper(quadCollection, resolvedMissingModel.getTopAmbientOcclusion(), particleSprite); this.missingItemModel = new MissingItemModel(quadCollection.getAll(), new ModelRenderProperties(resolvedMissingModel.getTopGuiLight().lightLikeBlock(), particleSprite, resolvedMissingModel.getTopTransforms())); try { Class.forName("net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin"); // TODO - //pluginList.add(new FabricDynamicModelHandler(this, this.resourceManager)); + // pluginList.add(new FabricDynamicModelHandler(this, this.resourceManager)); } catch(Exception ignored) { // Fabric API likely not present } @@ -365,7 +394,7 @@ public class DynamicModelProvider { var loadedModels = new HashMap<>(BlockStateModelLoader.loadBlockStateDefinitionStack(location, stateDefinition, loadedDefinitions).models()); if (!pluginList.isEmpty()) { loadedModels.replaceAll((mrl, oldModel) -> { - BlockStateModel.Unbaked ubm = oldModel; + BlockStateModel.UnbakedRoot ubm = oldModel; for (var plugin : pluginList) { ubm = plugin.modifyBlockModelOnLoad(oldModel, mrl); } @@ -375,7 +404,7 @@ public class DynamicModelProvider { return Optional.of(new BlockStateModelLoader.LoadedModels(loadedModels)); } - private BlockStateModel bakeModel(BlockStateModel.Unbaked model, BlockState mrl) { + private BlockStateModel bakeModel(BlockStateModel.UnbakedRoot model, BlockState mrl) { if (DEBUG_DYNAMIC_MODEL_LOADING) { ModernFix.LOGGER.info("Baking model '{}'", mrl); } @@ -385,7 +414,7 @@ public class DynamicModelProvider { for (var plugin : pluginList) { model = plugin.modifyBlockModelBeforeBake(model, mrl, modelBaker); } - var bakedModel = model.bake(modelBaker); + var bakedModel = model.bake(mrl, modelBaker); for (var plugin : pluginList) { bakedModel = plugin.modifyBlockModelAfterBake(bakedModel, model, mrl, modelBaker); } @@ -401,7 +430,8 @@ public class DynamicModelProvider { if (false) { //location.variant().equals("standalone") || location.variant().equals("fabric_resource")) { throw new UnsupportedOperationException(); //return this.loadStandaloneModel(location.id()); } else { - Optional unbakedModelOpt = Optional.ofNullable(this.unbakedBlockStateModelOverrides.get(state)); + Optional unbakedModelOpt = Optional.ofNullable(this.unbakedBlockStateModelOverrides.get(state)) + .map(BlockStateModel.Unbaked::asRoot); if (unbakedModelOpt.isEmpty()) { var optLoadedModels = this.loadedStateDefinitions.getUnchecked(state.getBlock().builtInRegistryHolder().key().location()); unbakedModelOpt = optLoadedModels.map(loadedModels -> loadedModels.models().get(state)); @@ -552,6 +582,11 @@ public class DynamicModelProvider { public SpriteGetter sprites() { return DynamicModelProvider.this.textureGetter; } + + @Override + public T compute(SharedOperationKey key) { + return key.compute(this); + } } public static WeakReference currentReloadingModelProvider = new WeakReference<>(null); @@ -562,12 +597,12 @@ public class DynamicModelProvider { public interface DynamicModelPlugin { Optional modifyModelOnLoad(Optional model, ResourceLocation id); - BlockStateModel.Unbaked modifyBlockModelOnLoad(BlockStateModel.Unbaked model, BlockState state); + BlockStateModel.UnbakedRoot modifyBlockModelOnLoad(BlockStateModel.UnbakedRoot model, BlockState state); UnbakedModel modifyModelBeforeBake(UnbakedModel model, ResourceLocation id, ModelState state, ModelBaker baker); //BakedModel modifyModelAfterBake(BakedModel bakedModel, UnbakedModel model, ResourceLocation id, ModelState state, ModelBaker baker); - BlockStateModel.Unbaked modifyBlockModelBeforeBake(BlockStateModel.Unbaked model, BlockState state, ModelBaker baker); - BlockStateModel modifyBlockModelAfterBake(BlockStateModel bakedModel, BlockStateModel.Unbaked unbaked, BlockState state, ModelBaker baker); + BlockStateModel.UnbakedRoot modifyBlockModelBeforeBake(BlockStateModel.UnbakedRoot model, BlockState state, ModelBaker baker); + BlockStateModel modifyBlockModelAfterBake(BlockStateModel bakedModel, BlockStateModel.UnbakedRoot unbaked, BlockState state, ModelBaker baker); } } diff --git a/gradle.properties b/gradle.properties index 9dd79b73..71ff669d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,22 +5,23 @@ junit_version=5.10.0-M1 mixinextras_version=0.4.1 mod_id=modernfix -minecraft_version=25w07a -enabled_platforms=fabric -forge_version=21.4.47-beta -parchment_version=2024.12.22 -parchment_mc_version=1.21.4 +minecraft_version=1.21.5 +enabled_platforms=neoforge,fabric +forge_version=21.5.81 +parchment_version=2025.06.15 +parchment_mc_version=1.21.5 refined_storage_version=4392788 jei_version=19.0.0.9 rei_version=13.0.678 -ctm_version=1.21-1.2.0+2 +ctm_version=5541286 +# ctm_version=1.21-1.2.0+2 ldlib_version=5782845 -kubejs_version=1902.6.0-build.142 -rhino_version=1902.2.2-build.268 -supported_minecraft_versions=25w07a +kubejs_version=2001.6.5-build.16 +rhino_version=2001.2.3-build.10 +supported_minecraft_versions=1.21.5 fabric_loader_version=0.16.10 -fabric_api_version=0.116.1+1.21.5 +fabric_api_version=0.119.5+1.21.5 continuity_version=3.0.0-beta.4+1.20.2 diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 6fa89b60..ed5f6df1 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -54,7 +54,7 @@ dependencies { modCompileOnly("me.shedaniel:RoughlyEnoughItems-forge:${rei_version}") { transitive false } modCompileOnly("dev.latvian.mods:kubejs-forge:${kubejs_version}") //modRuntimeOnly("curse.maven:ferritecore-429235:4441949") - modCompileOnly("team.chisel.ctm:CTM:${ctm_version}") + modCompileOnly("curse.maven:CTM-267602:${ctm_version}") modCompileOnly("curse.maven:ldlib-626676:${ldlib_version}") modCompileOnly("curse.maven:supermartijncore-454372:4455391") diff --git a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/dynresources/ModelBakeEventHelper.java b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/dynresources/ModelBakeEventHelper.java index 0a717ece..0fbe4ea2 100644 --- a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/dynresources/ModelBakeEventHelper.java +++ b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/dynresources/ModelBakeEventHelper.java @@ -40,12 +40,14 @@ public class ModelBakeEventHelper { public ModelBakery.BakingResult createDynamicResult() { return new ModelBakery.BakingResult( - this.modelRegistry.getMissingBakedModel(), + new ModelBakery.MissingModels( + this.modelRegistry.getMissingBakedModel(), + this.modelRegistry.getMissingItemModel() + ), this.modelRegistry.getTopLevelEmulatedRegistry(), - this.modelRegistry.getMissingItemModel(), this.modelRegistry.getItemModelEmulatedRegistry(), - this.modelRegistry.getItemPropertiesEmulatedRegistry(), - this.modelRegistry.getStandaloneEmulatedRegistry() + this.modelRegistry.getItemPropertiesEmulatedRegistry() + // TODO: Supply the StandaloneModelLoader.BakedModels? ); } } diff --git a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java index ee018ed3..1d82bced 100644 --- a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java +++ b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java @@ -5,11 +5,11 @@ import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import java.util.Deque; +import java.util.List; @Mixin(PoseStack.class) @ClientOnlyMixin public interface PoseStackAccessor { - @Accessor - Deque getPoseStack(); + @Accessor("poses") + List getPoseStack(); } diff --git a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/perf/dynamic_resources/ModelManagerMixinNeo.java b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/perf/dynamic_resources/ModelManagerMixinNeo.java index f2260529..a1342c22 100644 --- a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/perf/dynamic_resources/ModelManagerMixinNeo.java +++ b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/perf/dynamic_resources/ModelManagerMixinNeo.java @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; @Mixin(ModelManager.class) @ClientOnlyMixin public class ModelManagerMixinNeo { - @ModifyArg(method = "loadModels", at = @At(value = "INVOKE", target = "Lnet/neoforged/neoforge/client/ClientHooks;onModifyBakingResult(Lnet/minecraft/client/resources/model/ModelBakery$BakingResult;Ljava/util/Map;Lnet/minecraft/client/resources/model/ModelBakery;)V"), remap = false, index = 0) + @ModifyArg(method = "lambda$loadModels$18", at = @At(value = "INVOKE", target = "Lnet/neoforged/neoforge/client/ClientHooks;onModifyBakingResult(Lnet/minecraft/client/resources/model/ModelBakery$BakingResult;Ljava/util/Map;Lnet/minecraft/client/resources/model/ModelBakery;)V"), remap = false, index = 0) private static ModelBakery.BakingResult useDynamicBakingResult(ModelBakery.BakingResult bakingResult) { var currentReloadingProvider = DynamicModelProvider.currentReloadingModelProvider.get(); if(ModLoader.hasErrors() || currentReloadingProvider == null) { diff --git a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/perf/model_optimizations/OBJLoaderMixin.java b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/perf/model_optimizations/OBJLoaderMixin.java index d7de6de2..bb4611df 100644 --- a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/perf/model_optimizations/OBJLoaderMixin.java +++ b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/perf/model_optimizations/OBJLoaderMixin.java @@ -19,6 +19,7 @@ import java.util.concurrent.ConcurrentHashMap; @Mixin(ObjLoader.class) @ClientOnlyMixin public class OBJLoaderMixin { + /* TODO: Remove if unnecessary @Final @Mutable @Shadow(remap = false) private Map materialCache; @@ -36,4 +37,5 @@ public class OBJLoaderMixin { private void useConcMap2(ObjLoader instance, Map value) { this.modelCache = new ConcurrentHashMap<>(); } + */ } diff --git a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/util/AsyncLoadingScreen.java b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/util/AsyncLoadingScreen.java index 3b11a888..40b080c1 100644 --- a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/util/AsyncLoadingScreen.java +++ b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/util/AsyncLoadingScreen.java @@ -1,6 +1,6 @@ package org.embeddedt.modernfix.neoforge.util; -import net.neoforged.fml.loading.ImmediateWindowHandler; +import net.neoforged.fml.loading.FMLLoader; import org.lwjgl.glfw.GLFW; import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GLCapabilities; @@ -40,7 +40,7 @@ public class AsyncLoadingScreen extends Thread implements AutoCloseable { GL.setCapabilities(caps); while(keepRunning.get()) { LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(50)); - ImmediateWindowHandler.renderTick(); + FMLLoader.progressWindowTick.run(); } GLFW.glfwMakeContextCurrent(0); }