diff --git a/build.gradle b/build.gradle index 5307e1c..e16bb1d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,11 +1,8 @@ plugins { - id 'fabric-loom' version '1.6-SNAPSHOT' + id 'fabric-loom' version '1.10-SNAPSHOT' id 'maven-publish' } -sourceCompatibility = JavaVersion.VERSION_21 -targetCompatibility = JavaVersion.VERSION_21 - archivesBaseName = project.archives_base_name version = project.mod_version group = project.maven_group @@ -37,8 +34,8 @@ processResources { } tasks.withType(JavaCompile).configureEach { - // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. - it.options.release = 17 + it.options.encoding = "UTF-8" + it.options.release = 21 } java { @@ -46,6 +43,8 @@ java { // if it is present. // If you remove this line, sources will not be generated. withSourcesJar() + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } jar { diff --git a/gradle.properties b/gradle.properties index b375fe1..a645941 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,11 +1,11 @@ org.gradle.jvmargs=-Xmx1G -minecraft_version=1.21 -yarn_mappings=1.21+build.9 -loader_version=0.16.10 +minecraft_version=1.21.8 +yarn_mappings=1.21.8+build.1 +loader_version=0.16.14 -mod_version = 0.3+1.21 +mod_version = 0.3+1.21.8 maven_group = io.github.foundationgames archives_base_name = jsonem -fabric_version=0.102.0+1.21 +fabric_version=0.131.0+1.21.8 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 41d9927..1b33c55 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 53b86f7..e0246c0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ -#Mon Apr 03 00:00:04 CDT 2023 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -HOME +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/io/github/foundationgames/jsonem/mixin/BakedModelManagerMixin.java b/src/main/java/io/github/foundationgames/jsonem/mixin/BakedModelManagerMixin.java new file mode 100644 index 0000000..da6c6f4 --- /dev/null +++ b/src/main/java/io/github/foundationgames/jsonem/mixin/BakedModelManagerMixin.java @@ -0,0 +1,38 @@ +package io.github.foundationgames.jsonem.mixin; + +import com.google.common.collect.ImmutableMap; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import io.github.foundationgames.jsonem.util.JsonEntityModelUtil; +import net.minecraft.client.render.entity.model.LoadedEntityModels; +import net.minecraft.client.render.model.BakedModelManager; +import net.minecraft.resource.ResourceManager; +import net.minecraft.resource.ResourceReloader; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.HashMap; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.function.Supplier; + +@Mixin(BakedModelManager.class) +public class BakedModelManagerMixin { + @SuppressWarnings("unchecked") + @WrapOperation(method = "reload", at = @At(value = "INVOKE", target = "Ljava/util/concurrent/CompletableFuture;supplyAsync(Ljava/util/function/Supplier;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;", ordinal = 0)) + private CompletableFuture jsonem$loadJsonEntityModels(Supplier supplier, Executor executor, Operation> original, ResourceReloader.Synchronizer synchronizer, ResourceManager resourceManager) { + Supplier wrappedSupplier = () -> { + U obj = supplier.get(); + + if (obj instanceof LoadedEntityModels entityModels) { + var modelParts = new HashMap<>(((LoadedEntityModelsAccess) entityModels).jsonem$getModelParts()); + JsonEntityModelUtil.loadModels(resourceManager, modelParts); + return (U) new LoadedEntityModels(ImmutableMap.copyOf(modelParts)); + } else { + return obj; + } + }; + + return original.call(wrappedSupplier, executor); + } +} diff --git a/src/main/java/io/github/foundationgames/jsonem/mixin/EntityModelLoaderMixin.java b/src/main/java/io/github/foundationgames/jsonem/mixin/EntityModelLoaderMixin.java deleted file mode 100644 index 7ef2796..0000000 --- a/src/main/java/io/github/foundationgames/jsonem/mixin/EntityModelLoaderMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.github.foundationgames.jsonem.mixin; - -import io.github.foundationgames.jsonem.util.JsonEntityModelUtil; -import net.minecraft.client.model.TexturedModelData; -import net.minecraft.client.render.entity.model.EntityModelLayer; -import net.minecraft.client.render.entity.model.EntityModelLoader; -import net.minecraft.resource.ResourceManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.HashMap; -import java.util.Map; - -@Mixin(EntityModelLoader.class) -public class EntityModelLoaderMixin { - @Shadow private Map modelParts; - - @Inject(method = "reload", at = @At("TAIL")) - private void jsonem$loadJsonEntityModels(ResourceManager manager, CallbackInfo ci) { - this.modelParts = new HashMap<>(this.modelParts); - JsonEntityModelUtil.loadModels(manager, this.modelParts); - } -} diff --git a/src/main/java/io/github/foundationgames/jsonem/mixin/EntityModelsMixin.java b/src/main/java/io/github/foundationgames/jsonem/mixin/EntityModelsMixin.java index 5524390..bb3790e 100644 --- a/src/main/java/io/github/foundationgames/jsonem/mixin/EntityModelsMixin.java +++ b/src/main/java/io/github/foundationgames/jsonem/mixin/EntityModelsMixin.java @@ -1,6 +1,5 @@ package io.github.foundationgames.jsonem.mixin; -import com.google.common.collect.ImmutableMap; import io.github.foundationgames.jsonem.JsonEM; import io.github.foundationgames.jsonem.util.JsonEntityModelUtil; import net.minecraft.client.model.TexturedModelData; @@ -10,17 +9,16 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import java.io.IOException; import java.util.Map; @Mixin(EntityModels.class) public class EntityModelsMixin { - @Inject(method = "getModels", at = @At(value = "INVOKE", target = "Ljava/util/stream/Stream;filter(Ljava/util/function/Predicate;)Ljava/util/stream/Stream;"), locals = LocalCapture.CAPTURE_FAILSOFT) - private static void jsonem$dumpModels(CallbackInfoReturnable> cir, ImmutableMap.Builder layers) { + @Inject(method = "getModels", at = @At("RETURN")) + private static void jsonem$dumpModels(CallbackInfoReturnable> cir) { if ("true".equals(JsonEM.CONFIG.values.getProperty("dump_models"))) { - layers.build().forEach((layer, data) -> { + cir.getReturnValue().forEach((layer, data) -> { try { JsonEntityModelUtil.dump(layer, data); } catch (IOException e) { diff --git a/src/main/java/io/github/foundationgames/jsonem/mixin/LoadedEntityModelsAccess.java b/src/main/java/io/github/foundationgames/jsonem/mixin/LoadedEntityModelsAccess.java new file mode 100644 index 0000000..93aa224 --- /dev/null +++ b/src/main/java/io/github/foundationgames/jsonem/mixin/LoadedEntityModelsAccess.java @@ -0,0 +1,15 @@ +package io.github.foundationgames.jsonem.mixin; + +import net.minecraft.client.model.TexturedModelData; +import net.minecraft.client.render.entity.model.EntityModelLayer; +import net.minecraft.client.render.entity.model.LoadedEntityModels; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(LoadedEntityModels.class) +public interface LoadedEntityModelsAccess { + @Accessor("modelParts") + Map jsonem$getModelParts(); +} diff --git a/src/main/java/io/github/foundationgames/jsonem/serialization/JsonEMCodecs.java b/src/main/java/io/github/foundationgames/jsonem/serialization/JsonEMCodecs.java index 545fdb5..9eabd02 100644 --- a/src/main/java/io/github/foundationgames/jsonem/serialization/JsonEMCodecs.java +++ b/src/main/java/io/github/foundationgames/jsonem/serialization/JsonEMCodecs.java @@ -45,8 +45,8 @@ public class JsonEMCodecs { public static final Codec MODEL_TRANSFORM = RecordCodecBuilder.create((instance) -> instance.group( - Codecs.VECTOR_3F.optionalFieldOf("origin", new Vector3f(0)).forGetter(obj -> new Vector3f(obj.pivotX, obj.pivotY, obj.pivotZ)), - Codecs.VECTOR_3F.optionalFieldOf("rotation", new Vector3f(0)).forGetter(obj -> new Vector3f(obj.pitch, obj.yaw, obj.roll)) + Codecs.VECTOR_3F.optionalFieldOf("origin", new Vector3f(0)).forGetter(obj -> new Vector3f(obj.x(), obj.y(), obj.z())), + Codecs.VECTOR_3F.optionalFieldOf("rotation", new Vector3f(0)).forGetter(obj -> new Vector3f(obj.pitch(), obj.yaw(), obj.roll())) ).apply(instance, (origin, rot) -> ModelTransform.of(origin.x(), origin.y(), origin.z(), rot.x(), rot.y(), rot.z())) ); @@ -94,21 +94,16 @@ private static Optional> optionalFaceList(Set faces) ).apply(instance, JsonEMCodecs::createCuboidData) ); - private static Codec createPartDataCodec() { - return RecordCodecBuilder.create((instance) -> - instance.group( - MODEL_TRANSFORM.optionalFieldOf("transform", ModelTransform.NONE).forGetter(obj -> ((ModelPartDataAccess) obj).jsonem$transform()), - Codec.list(MODEL_CUBOID_DATA).fieldOf("cuboids").forGetter(obj -> ((ModelPartDataAccess) obj).jsonem$cuboids()), - LazyTypeUnboundedMapCodec.of(Codec.STRING, JsonEMCodecs::createPartDataCodec).optionalFieldOf("children", new HashMap<>()).forGetter(obj -> ((ModelPartDataAccess) obj).jsonem$children()) - ).apply(instance, (transform, cuboids, children) -> { - var data = ModelPartDataAccess.create(cuboids, transform); - ((ModelPartDataAccess) data).jsonem$children().putAll(children); - return data; - }) - ); - } - - public static final Codec MODEL_PART_DATA = createPartDataCodec(); + public static final Codec MODEL_PART_DATA = Codec.recursive("JsonEM Model Part Data", self -> + RecordCodecBuilder.create(i -> i.group( + MODEL_TRANSFORM.optionalFieldOf("transform", ModelTransform.NONE).forGetter(obj -> ((ModelPartDataAccess) obj).jsonem$transform()), + Codec.list(MODEL_CUBOID_DATA).fieldOf("cuboids").forGetter(obj -> ((ModelPartDataAccess) obj).jsonem$cuboids()), + Codec.unboundedMap(Codec.STRING, self).optionalFieldOf("children", new HashMap<>()).forGetter(obj -> ((ModelPartDataAccess) obj).jsonem$children()) + ).apply(i, (transform, cuboids, children) -> { + var data = ModelPartDataAccess.create(cuboids, transform); + ((ModelPartDataAccess) data).jsonem$children().putAll(children); + return data; + }))); public static final Codec TEXTURED_MODEL_DATA = RecordCodecBuilder.create((instance) -> instance.group( diff --git a/src/main/java/io/github/foundationgames/jsonem/serialization/LazyTypeUnboundedMapCodec.java b/src/main/java/io/github/foundationgames/jsonem/serialization/LazyTypeUnboundedMapCodec.java deleted file mode 100644 index 4e6ed27..0000000 --- a/src/main/java/io/github/foundationgames/jsonem/serialization/LazyTypeUnboundedMapCodec.java +++ /dev/null @@ -1,51 +0,0 @@ -package io.github.foundationgames.jsonem.serialization; - -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.DynamicOps; -import com.mojang.serialization.Lifecycle; -import com.mojang.serialization.codecs.BaseMapCodec; - -import java.util.Map; -import java.util.function.Supplier; - -public class LazyTypeUnboundedMapCodec implements BaseMapCodec, Codec> { - private final Codec keyCodec; - private final Supplier> elementCodecProvider; - - private Codec elementCodec; - - public LazyTypeUnboundedMapCodec(Codec keyCodec, Supplier> elementCodecProvider) { - this.keyCodec = keyCodec; - this.elementCodecProvider = elementCodecProvider; - } - - public static LazyTypeUnboundedMapCodec of(Codec keyCodec, Supplier> elementCodecProvider) { - return new LazyTypeUnboundedMapCodec<>(keyCodec, elementCodecProvider); - } - - @Override - public DataResult, T>> decode(DynamicOps ops, T input) { - return ops.getMap(input).setLifecycle(Lifecycle.stable()).flatMap(map -> decode(ops, map)).map(r -> Pair.of(r, input)); - } - - @Override - public DataResult encode(Map input, DynamicOps ops, T prefix) { - return encode(input, ops, ops.mapBuilder()).build(prefix); - } - - @Override - public Codec keyCodec() { - return keyCodec; - } - - @Override - public Codec elementCodec() { - if (elementCodec == null) { - elementCodec = elementCodecProvider.get(); - } - - return elementCodec; - } -} diff --git a/src/main/java/io/github/foundationgames/jsonem/util/JsonEntityModelUtil.java b/src/main/java/io/github/foundationgames/jsonem/util/JsonEntityModelUtil.java index 7daa671..d3c91de 100644 --- a/src/main/java/io/github/foundationgames/jsonem/util/JsonEntityModelUtil.java +++ b/src/main/java/io/github/foundationgames/jsonem/util/JsonEntityModelUtil.java @@ -66,8 +66,8 @@ public static void dump(EntityModelLayer layer, TexturedModelData data) throws I } var modelResult = JsonEMCodecs.TEXTURED_MODEL_DATA.encode(data, JsonOps.INSTANCE, new JsonObject()); - var modelFolder = DUMP_DIR.resolve("assets").resolve(layer.getId().getNamespace()).resolve("models").resolve("entity").resolve(layer.getId().getPath()); - var modelFile = modelFolder.resolve(layer.getName()+".json"); + var modelFolder = DUMP_DIR.resolve("assets").resolve(layer.id().getNamespace()).resolve("models").resolve("entity").resolve(layer.id().getPath()); + var modelFile = modelFolder.resolve(layer.name()+".json"); if (!Files.exists(modelFolder)) { Files.createDirectories(modelFolder); diff --git a/src/main/resources/jsonem.mixins.json b/src/main/resources/jsonem.mixins.json index e2262a5..ecd4e20 100644 --- a/src/main/resources/jsonem.mixins.json +++ b/src/main/resources/jsonem.mixins.json @@ -4,9 +4,10 @@ "package": "io.github.foundationgames.jsonem.mixin", "compatibilityLevel": "JAVA_17", "client": [ + "BakedModelManagerMixin", "DilationAccess", - "EntityModelLoaderMixin", "EntityModelsMixin", + "LoadedEntityModelsAccess", "ModelCuboidDataAccess", "ModelPartDataAccess", "TextureDimensionsAccess",