From 409573cd4eb95687533d751c944a221c8123a55e Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Sat, 22 Nov 2025 15:32:52 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0=E4=BA=86=E8=BF=9C?= =?UTF-8?q?=E7=A8=8BMaven=E4=BB=93=E5=BA=93=EF=BC=8C=E5=A6=82=E4=BD=95?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=A7=81=20README.MD=202.=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=BA=86Forge=20Server=E7=AB=AF=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E6=9C=AC=E6=A8=A1=E7=BB=84=E4=BC=9A=E5=AF=BC=E8=87=B4=E9=9D=9E?= =?UTF-8?q?=E6=B3=95=E7=9A=84=E7=B1=BB=E5=8A=A0=E8=BD=BD=E9=94=99=E8=AF=AF?= =?UTF-8?q?=203.=20=E6=9B=B4=E6=94=B9=E4=BA=86=E7=89=88=E6=9C=AC=E5=91=BD?= =?UTF-8?q?=E5=90=8D=EF=BC=8C=E7=8E=B0=E5=9C=A8=E6=98=AF=20jsonem-?= =?UTF-8?q?=E6=A8=A1=E7=BB=84=E5=8A=A0=E8=BD=BD=E5=99=A8=E7=AB=AF-mc?= =?UTF-8?q?=E7=89=88=E6=9C=AC-=E6=A8=A1=E7=BB=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.MD | 29 +++++++++++++++++++ build.gradle | 29 +++++++++++++++++-- fabric/build.gradle | 2 +- fabric/src/main/resources/fabric.mod.json | 2 +- forge/build.gradle | 2 +- .../jsonem/forge/JsonEmForge.java | 9 ++++-- .../jsonem/forge/mixin/EntityModelsMixin.java | 26 +++++++++++++++++ .../forge/platform/EntityModelImpl.java | 11 +++++++ .../forge/platform/ForgePlatformHelper.java | 15 ++++++++-- forge/src/main/resources/META-INF/mods.toml | 4 +-- .../main/resources/jsonem-forge.mixins.json | 3 +- gradle.properties | 6 ++-- 12 files changed, 121 insertions(+), 17 deletions(-) create mode 100644 forge/src/main/java/com/leisuretimedock/jsonem/forge/mixin/EntityModelsMixin.java create mode 100644 forge/src/main/java/com/leisuretimedock/jsonem/forge/platform/EntityModelImpl.java diff --git a/README.MD b/README.MD index b3e4e67..e86b589 100644 --- a/README.MD +++ b/README.MD @@ -3,5 +3,34 @@ Port from [JsonEM](https://github.com/FoundationGames/JsonEM) Support Forge Mod Loader (Recommended FML Version is 1.20.1-47.4.1) +# For Developer +You can integrate and automatically download JsonEM for your mod project using Gradle. +Just add the following to your build script (`build.gradle`): + +## Repositories +```gradle +repositories { + maven { + name = "LTD Maven" + url = "https://nexus.bot.leisuretimedock.top/repository/maven-public/" + } +} +``` +### Forge +```gradle +dependencies { + implementation fg.deobf("com.leisuretimedock:jsonem-forge-${minecraft_version}:${jsonem_version})" +} +``` +### Fabric And Quilt +```gradle +dependencies { + modImplementation "com.leisuretimedock:jsonem-fabric-${minecraft_version}:${jsonem_version}" +} +``` +### Choose a Version + +`${mc_version}` gets replaced by the current Minecraft version. (i.e. `1.20.1`) +`${jsonem_version}` gets replaced by the version of JEI you want to use (i.e `0.2.4`) # License MIT \ No newline at end of file diff --git a/build.gradle b/build.gradle index c2ede8f..ded07ac 100644 --- a/build.gradle +++ b/build.gradle @@ -43,7 +43,7 @@ subprojects { base { // Set up a suffixed format for the mod jar names, e.g. `example-fabric`. - archivesName = "${mod_id}-mc${minecraft_version}" + archivesName = "${mod_id}-${minecraft_version}" } repositories { @@ -87,8 +87,25 @@ subprojects { publishing { publications { mavenJava(MavenPublication) { - artifactId = base.archivesName.get() from components.java + artifactId = "${mod_id}-${project.name}-${minecraft_version}" + + pom { + name = rootProject.mod_id + description = "The json definition for entity" + url = rootProject.mod_source + licenses { + license { + name = rootProject.mod_licence + } + } + developers { + developer { + id = rootProject.mod_id + name = rootProject.mod_authors + } + } + } } } @@ -98,6 +115,14 @@ subprojects { // Notice: This block does NOT have the same function as the block in the top level. // The repositories here will be used for publishing your artifact, not for // retrieving dependencies. + maven { + name = 'LTDNexus' + url = 'https://nexus.bot.leisuretimedock.top/repository/maven-releases/' + credentials { + username = System.getenv('LTDNexusUsername') ?: '' + password = System.getenv('LTDNexusPassword') ?: '' + } + } } } } diff --git a/fabric/build.gradle b/fabric/build.gradle index 18f6fc0..fea1742 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -45,6 +45,6 @@ shadowJar { remapJar { input.set shadowJar.archiveFile dependsOn shadowJar - archiveBaseName.set "${rootProject.archives_base_name}-${project.name}" +// archiveBaseName.set "${rootProject.archives_base_name}-${project.name}" archiveClassifier.set null } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index f54e3ae..5cccbd7 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -13,7 +13,7 @@ }, "license": "${mod_licence}", "icon": "icon.png", - "environment": "*", + "environment": "client", "entrypoints": { "client": [ "com.leisuretimedock.jsonem.fabric.JsonEmFabric" diff --git a/forge/build.gradle b/forge/build.gradle index 084630f..e3b0246 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -63,7 +63,7 @@ shadowJar { remapJar { input.set shadowJar.archiveFile dependsOn shadowJar - archiveBaseName.set "${rootProject.archives_base_name}-${project.name}" +// archiveBaseName.set "${rootProject.archives_base_name}-${project.name}" archiveClassifier.set null } jar { diff --git a/forge/src/main/java/com/leisuretimedock/jsonem/forge/JsonEmForge.java b/forge/src/main/java/com/leisuretimedock/jsonem/forge/JsonEmForge.java index 1f4ea6f..4d225ae 100644 --- a/forge/src/main/java/com/leisuretimedock/jsonem/forge/JsonEmForge.java +++ b/forge/src/main/java/com/leisuretimedock/jsonem/forge/JsonEmForge.java @@ -7,13 +7,16 @@ import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.loading.FMLEnvironment; @Mod(JsonEm.MOD_ID) public final class JsonEmForge { public JsonEmForge() { FMLJavaModLoadingContext fmlJavaModLoadingContext = FMLJavaModLoadingContext.get(); - ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, JsonEmConfig.spec, "jsonem.toml"); - JsonEm.commonSetUp(); - fmlJavaModLoadingContext.getModEventBus().register(ForgePlatformHelper.class); + if (FMLEnvironment.dist.isClient()) { + ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, JsonEmConfig.spec, "jsonem.toml"); + JsonEm.commonSetUp(); + fmlJavaModLoadingContext.getModEventBus().register(ForgePlatformHelper.class); + } } } diff --git a/forge/src/main/java/com/leisuretimedock/jsonem/forge/mixin/EntityModelsMixin.java b/forge/src/main/java/com/leisuretimedock/jsonem/forge/mixin/EntityModelsMixin.java new file mode 100644 index 0000000..6363f6d --- /dev/null +++ b/forge/src/main/java/com/leisuretimedock/jsonem/forge/mixin/EntityModelsMixin.java @@ -0,0 +1,26 @@ +package com.leisuretimedock.jsonem.forge.mixin; + +import java.util.Map; + +import com.google.common.collect.ImmutableMap; +import com.leisuretimedock.jsonem.forge.platform.EntityModelImpl; +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.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import net.minecraft.client.model.geom.LayerDefinitions; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.builders.LayerDefinition; + +@Mixin(LayerDefinitions.class) +abstract class EntityModelsMixin { + @SuppressWarnings("InvalidInjectorMethodSignature") + @Inject(method = "createRoots", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/ImmutableMap$Builder;build()Lcom/google/common/collect/ImmutableMap;", remap = false), locals = LocalCapture.CAPTURE_FAILEXCEPTION) + private static void registerExtraModelData(CallbackInfoReturnable> cir, ImmutableMap.Builder builder) { + for (Map.Entry entry : EntityModelImpl.PROVIDERS.entrySet()) { + builder.put(entry.getKey(), entry.getValue()); + } + } +} diff --git a/forge/src/main/java/com/leisuretimedock/jsonem/forge/platform/EntityModelImpl.java b/forge/src/main/java/com/leisuretimedock/jsonem/forge/platform/EntityModelImpl.java new file mode 100644 index 0000000..e2b2333 --- /dev/null +++ b/forge/src/main/java/com/leisuretimedock/jsonem/forge/platform/EntityModelImpl.java @@ -0,0 +1,11 @@ +package com.leisuretimedock.jsonem.forge.platform; + +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.builders.LayerDefinition; + +import java.util.HashMap; +import java.util.Map; + +public class EntityModelImpl { + public static final Map PROVIDERS = new HashMap<>(); +} diff --git a/forge/src/main/java/com/leisuretimedock/jsonem/forge/platform/ForgePlatformHelper.java b/forge/src/main/java/com/leisuretimedock/jsonem/forge/platform/ForgePlatformHelper.java index 1f26698..77ae9b2 100644 --- a/forge/src/main/java/com/leisuretimedock/jsonem/forge/platform/ForgePlatformHelper.java +++ b/forge/src/main/java/com/leisuretimedock/jsonem/forge/platform/ForgePlatformHelper.java @@ -11,9 +11,11 @@ import net.minecraft.client.model.geom.builders.MeshDefinition; import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.loading.FMLPaths; +import org.jetbrains.annotations.NotNull; import java.nio.file.Path; import java.util.Map; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; @@ -37,7 +39,7 @@ public class ForgePlatformHelper implements IPlatFormHelper { public void registerModelLayer(ModelLayerLocation layer) { DEFINITIONS.put(layer, ForgePlatformHelper::createPlaceholderDefinition); } - private static LayerDefinition createPlaceholderDefinition() { + private static @NotNull LayerDefinition createPlaceholderDefinition() { MeshDefinition mesh = new MeshDefinition(); var root = mesh.getRoot(); // 加入 main root,防止 bakeLayer().getChild("main") 为 null @@ -48,9 +50,16 @@ public class ForgePlatformHelper implements IPlatFormHelper { @SubscribeEvent public static void registerLayerDefinitions(EntityRenderersEvent.RegisterLayerDefinitions event) { for (Map.Entry> modelLayerLocationSupplierEntry : DEFINITIONS.entrySet()) { - event.registerLayerDefinition(modelLayerLocationSupplierEntry.getKey(), modelLayerLocationSupplierEntry.getValue()); - EntityModelLayersAccessor.getLayers().add(modelLayerLocationSupplierEntry.getKey()); + registerModelLayer(modelLayerLocationSupplierEntry.getKey(), modelLayerLocationSupplierEntry.getValue().get()); } } + private static void registerModelLayer(ModelLayerLocation layer, LayerDefinition definition) { + Objects.requireNonNull(layer, "EntityModelLayer cannot be null"); + Objects.requireNonNull(definition, "ModelLayerDefinition cannot be null"); + if (EntityModelImpl.PROVIDERS.putIfAbsent(layer, definition) != null) { + throw new IllegalArgumentException(String.format("Cannot replace registration for entity model layer \"%s\"", layer)); + } + EntityModelLayersAccessor.getLayers().add(layer); + } } diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 2ce250a..442aaa7 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -20,11 +20,11 @@ modId = "forge" mandatory = true versionRange = "[47,)" ordering = "NONE" -side = "BOTH" +side = "CLIENT" [[dependencies.jsonem]] modId = "minecraft" mandatory = true versionRange = "[1.20.1,)" ordering = "NONE" -side = "BOTH" \ No newline at end of file +side = "CLIENT" \ No newline at end of file diff --git a/forge/src/main/resources/jsonem-forge.mixins.json b/forge/src/main/resources/jsonem-forge.mixins.json index 79f00d0..4a43123 100644 --- a/forge/src/main/resources/jsonem-forge.mixins.json +++ b/forge/src/main/resources/jsonem-forge.mixins.json @@ -4,7 +4,8 @@ "compatibilityLevel": "JAVA_17", "minVersion": "0.8", "client": [ - "EntityModelLayersAccessor" + "EntityModelLayersAccessor", + "EntityModelsMixin" ], "mixins": [ ], diff --git a/gradle.properties b/gradle.properties index 7b90ce5..5c42e3d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,15 +4,15 @@ org.gradle.parallel=true # Mod properties mod_id=jsonem mod_name=jsonEM -mod_version=0.2.1+1.20-fabrge +mod_version=0.2.4 mod_source=https://github.com/LeisureTimeDock/JsonEM_Neo_Forge mod_credits= mod_authors= FoundationGames, R3944Realms mod_description=Migrate from Fabric 1.20.1 [Json Entity Models] mod_licence=MIT maven_group=com.leisuretimedock -archives_name=jsonem_fabrge -archives_base_name=jsonem_1.20.1_fabrge +archives_name=jsonem +archives_base_name=jsonem enabled_platforms=fabric,forge # Minecraft properties minecraft_version=1.20.1