1. 添加了远程Maven仓库,如何使用见 README.MD

2. 修复了Forge Server端加载本模组会导致非法的类加载错误
3. 更改了版本命名,现在是 jsonem-模组加载器端-mc版本-模组版本
This commit is contained in:
叁玖领域 2025-11-22 15:32:52 +08:00
parent 9229bbfd71
commit 409573cd4e
12 changed files with 121 additions and 17 deletions

View File

@ -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

View File

@ -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') ?: ''
}
}
}
}
}

View File

@ -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
}

View File

@ -13,7 +13,7 @@
},
"license": "${mod_licence}",
"icon": "icon.png",
"environment": "*",
"environment": "client",
"entrypoints": {
"client": [
"com.leisuretimedock.jsonem.fabric.JsonEmFabric"

View File

@ -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 {

View File

@ -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);
}
}
}

View File

@ -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<Map<ModelLayerLocation, LayerDefinition>> cir, ImmutableMap.Builder<ModelLayerLocation, LayerDefinition> builder) {
for (Map.Entry<ModelLayerLocation, LayerDefinition> entry : EntityModelImpl.PROVIDERS.entrySet()) {
builder.put(entry.getKey(), entry.getValue());
}
}
}

View File

@ -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<ModelLayerLocation, LayerDefinition> PROVIDERS = new HashMap<>();
}

View File

@ -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<ModelLayerLocation, Supplier<LayerDefinition>> 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);
}
}

View File

@ -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"
side = "CLIENT"

View File

@ -4,7 +4,8 @@
"compatibilityLevel": "JAVA_17",
"minVersion": "0.8",
"client": [
"EntityModelLayersAccessor"
"EntityModelLayersAccessor",
"EntityModelsMixin"
],
"mixins": [
],

View File

@ -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