Skip to content

Commit 1bcbfff

Browse files
committed
mcpforge: independent 1.12.2/MCP plugin
1 parent 846b2d7 commit 1bcbfff

45 files changed

Lines changed: 4076 additions & 41 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
.gradle
2+
.gradle-user-home/
23
build/
4+
run/
35
!gradle/wrapper/gradle-wrapper.jar
46
!**/src/main/**/build/
57
!**/src/test/**/build/

LEGACY.md

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# ModDevGradle Legacy Forge Plugin
22
ModDevGradle has a secondary plugin (ID: `net.neoforged.moddev.legacyforge`, released alongside the normal plugin with the same version)
3-
that adds support for developing mods against MinecraftForge and Vanilla Minecraft versions 1.17 up to 1.20.1.
3+
that adds support for developing mods against MinecraftForge and Vanilla Minecraft versions 1.12.2 up to 1.20.1.
44

55
The legacy plugin is an "addon" plugin, meaning it operates on top of the normal plugin. This means that the APIs normally used
66
are also available when using the legacy plugin.
@@ -41,6 +41,30 @@ legacyForge {
4141
}
4242
```
4343

44+
For Minecraft 1.12.2, use a Forge version such as:
45+
46+
```groovy
47+
legacyForge {
48+
version = "1.12.2-14.23.5.2860"
49+
}
50+
```
51+
52+
MDG will use Forge's `userdev3` artifact for 1.12.2. This requires an NFRT build with legacy MCP support
53+
(`--mcp-mappings` and the legacy MCP mapping result IDs). Until that NFRT release is the MDG default, set
54+
`neoForge.neoFormRuntime.version` to a compatible published version or substitute a local NFRT legacy build.
55+
56+
NFRT's 1.12.2 legacy MCP pipeline uses `de.oceanlabs.mcp:mcp_stable:39-1.12@zip` by default; if you need a
57+
different MCP CSV mapping zip, configure it explicitly:
58+
59+
```groovy
60+
legacyForge {
61+
enable {
62+
forgeVersion = "1.12.2-14.23.5.2860"
63+
mcpMappings = "de.oceanlabs.mcp:mcp_stable:39-1.12@zip"
64+
}
65+
}
66+
```
67+
4468
## Reobfuscating artifacts
4569
Forge used SRG mappings as intermediary mappings in 1.20.1 and below. While your mod is developed against the mappings provided
4670
by Mojang (known as official mappings), you need to reobfuscate it to SRG mappings for it to work in production.

build.gradle

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,12 @@ sourceSets {
7171
runtimeClasspath += java8.output
7272
}
7373
legacy
74+
mcpforge
7475
test {
7576
compileClasspath += legacy.output
7677
runtimeClasspath += legacy.output
78+
compileClasspath += mcpforge.output
79+
runtimeClasspath += mcpforge.output
7780
}
7881
}
7982

@@ -83,6 +86,7 @@ configurations {
8386
// Place shaded dependencies into `compileOnly` so that they do not leak into our publications' dependencies.
8487
compileOnly.extendsFrom shaded
8588
legacyCompileOnly.extendsFrom shaded
89+
mcpforgeCompileOnly.extendsFrom shaded
8690
testCompileOnly.extendsFrom shaded
8791
testRuntimeOnly.extendsFrom shaded
8892
shadowRuntimeElements {
@@ -113,6 +117,8 @@ dependencies {
113117
compileOnly "com.intellij:annotations:9.0.4"
114118
testCompileOnly "com.intellij:annotations:9.0.4"
115119
shaded "com.google.code.gson:gson:2.11.0"
120+
shaded "org.ow2.asm:asm-commons:9.7.1"
121+
shaded "org.tukaani:xz:1.10"
116122
implementation "gradle.plugin.org.jetbrains.gradle.plugin.idea-ext:gradle-idea-ext:1.2"
117123
shaded "net.neoforged:EclipseLaunchConfigs:0.1.11"
118124
shaded "net.neoforged:VscLaunchConfigs:1.0.8"
@@ -134,6 +140,11 @@ dependencies {
134140
legacyImplementation(sourceSets.main.output)
135141
legacyImplementation(sourceSets.java8.output)
136142
legacyImplementation gradleApi()
143+
144+
mcpforgeImplementation(sourceSets.main.output)
145+
mcpforgeImplementation(sourceSets.legacy.output)
146+
mcpforgeImplementation(sourceSets.java8.output)
147+
mcpforgeImplementation gradleApi()
137148
}
138149

139150
java {
@@ -147,13 +158,15 @@ jar {
147158
archiveClassifier = 'slim'
148159
from sourceSets.java8.output
149160
from sourceSets.legacy.output
161+
from sourceSets.mcpforge.output
150162
}
151163

152164
shadowJar {
153165
archiveClassifier = "" // Required for the Plugin Publish Plugin to publish this jar
154166

155167
from sourceSets.java8.output
156168
from sourceSets.legacy.output
169+
from sourceSets.mcpforge.output
157170

158171
configurations = [project.configurations.shaded]
159172
enableRelocation = true
@@ -164,8 +177,9 @@ assemble.dependsOn shadowJar
164177

165178
tasks.named("compileJava8Java").configure {
166179
javaCompiler = javaToolchains.compilerFor {
167-
languageVersion = JavaLanguageVersion.of(8)
180+
languageVersion = JavaLanguageVersion.of(17)
168181
}
182+
options.release = 8
169183
}
170184

171185
javadoc {
@@ -205,7 +219,7 @@ gradlePlugin {
205219
id = 'net.neoforged.moddev.legacyforge'
206220
implementationClass = 'net.neoforged.moddevgradle.boot.LegacyForgeModDevPlugin'
207221
displayName = "Mod Development Plugin for Legacy Forge"
208-
description = "This plugin helps you create Minecraft mods using the Forge platform, up to 1.20.1"
222+
description = "This plugin helps you create Minecraft mods using the Forge platform, from 1.12.2 up to 1.20.1"
209223
tags = ["minecraft", "neoforge", "forge", "java", "mod"]
210224
}
211225
repositories {
@@ -219,9 +233,16 @@ gradlePlugin {
219233
id = 'net.neoforged.moddev.legacyforge.repositories'
220234
implementationClass = 'net.neoforged.moddevgradle.boot.LegacyRepositoriesPlugin'
221235
displayName = "Mod Development Repositories Plugin for Legacy Forge"
222-
description = "This plugin adds the repositories needed for developing Minecraft mods using the Forge platform, up to 1.20.1. It is applied automatically by the legacyforge plugin, but can be applied manually in settings.gradle to make use of Gradle dependency management."
236+
description = "This plugin adds the repositories needed for developing Minecraft mods using the Forge platform, from 1.12.2 up to 1.20.1. It is applied automatically by the legacyforge plugin, but can be applied manually in settings.gradle to make use of Gradle dependency management."
223237
tags = ["minecraft", "neoforge", "forge", "java", "mod"]
224238
}
239+
mcpforge {
240+
id = 'net.neoforged.moddev.mcpforge'
241+
implementationClass = 'net.neoforged.moddevgradle.boot.McpForgePlugin'
242+
displayName = "Mod Development Plugin for Legacy Forge 1.12.2 (MCP)"
243+
description = "This plugin helps you create Minecraft mods using the Forge platform for 1.12.2 (MCP mappings). It is the isolated home for the 1.12.2/MCP-specific toolchain, distinct from legacyforge."
244+
tags = ["minecraft", "forge", "java", "mod", "1.12.2", "mcp"]
245+
}
225246
}
226247
}
227248

@@ -337,6 +358,9 @@ abstract class GenerateRepoFilter extends DefaultTask {
337358
artifacts.add(new Artifact(location[0], location[1]))
338359
}
339360
}
361+
// Required by Forge 1.12.2 and still hosted on Mojang's libraries maven, but not
362+
// referenced by Mojang's vanilla version manifests.
363+
artifacts.add(new Artifact('lzma', 'lzma'))
340364
final artifactList = artifacts.toList()
341365
Collections.sort(artifactList)
342366
final clazz = """

legacytest/forge1122/build.gradle

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
plugins {
2+
id 'net.neoforged.moddev.legacyforge'
3+
}
4+
5+
repositories {
6+
// The Forge 1.12.2 smoke can use a locally published NFRT build until a compatible release is default.
7+
mavenLocal()
8+
}
9+
10+
java {
11+
toolchain {
12+
languageVersion = JavaLanguageVersion.of(8)
13+
}
14+
}
15+
16+
neoFormRuntime {
17+
version = '2.0.19-legacy'
18+
}
19+
20+
legacyForge {
21+
enable {
22+
forgeVersion = '1.12.2-14.23.5.2860'
23+
mcpMappings = 'de.oceanlabs.mcp:mcp_stable:39-1.12@zip'
24+
// Recompilation now works end-to-end: NFRT runs ForgeFlower/MCPCleanup/recompile, with the legacy
25+
// Java-8 toolchain auto-provisioned by Gradle (Azul Zulu on aarch64) and the legacy Maven repositories
26+
// (Maven Central, Mojang libraries, Forge Maven) passed to NFRT via CreateMinecraftArtifacts.
27+
disableRecompilation = false
28+
}
29+
runs {
30+
client {
31+
client()
32+
}
33+
}
34+
mods {
35+
mymod1122 {
36+
sourceSet(sourceSets.main)
37+
}
38+
}
39+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package mymod1122;
2+
3+
import net.minecraftforge.fml.common.Mod;
4+
5+
@Mod(modid = MyMod1122.MOD_ID, name = "Legacy 1.12.2 Smoke Test", version = "1.0.0")
6+
public class MyMod1122 {
7+
public static final String MOD_ID = "mymod1122";
8+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[
2+
{
3+
"modid": "mymod1122",
4+
"name": "Legacy 1.12.2 Smoke Test",
5+
"description": "Minimal Forge 1.12.2 fixture for ModDevGradle.",
6+
"version": "1.0.0",
7+
"mcversion": "1.12.2",
8+
"url": "",
9+
"updateUrl": "",
10+
"authorList": [],
11+
"credits": "",
12+
"logoFile": "",
13+
"screenshots": [],
14+
"dependencies": []
15+
}
16+
]
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"pack": {
3+
"pack_format": 3,
4+
"description": "Legacy 1.12.2 smoke test resources"
5+
}
6+
}

legacytest/settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ plugins {
66
includeBuild '..'
77

88
include 'forge'
9+
include 'forge1122'
910
include 'forgedownstream'
1011
include 'nonmc'

src/generated/java/net/neoforged/moddevgradle/internal/generated/MojangRepositoryFilter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public static void filter(org.gradle.api.artifacts.repositories.RepositoryConten
5858
filter.includeModule("io.netty", "netty-transport-native-unix-common");
5959
filter.includeModule("it.unimi.dsi", "fastutil");
6060
filter.includeModule("java3d", "vecmath");
61+
filter.includeModule("lzma", "lzma");
6162
filter.includeModule("net.java.dev.jna", "jna");
6263
filter.includeModule("net.java.dev.jna", "jna-platform");
6364
filter.includeModule("net.java.dev.jna", "platform");
@@ -92,6 +93,7 @@ public static void filter(org.gradle.api.artifacts.repositories.RepositoryConten
9293
filter.includeModule("org.lwjgl.lwjgl", "lwjgl");
9394
filter.includeModule("org.lwjgl.lwjgl", "lwjgl-platform");
9495
filter.includeModule("org.lwjgl.lwjgl", "lwjgl_util");
96+
filter.includeModule("org.lwjgl.lwjgl", "parent");
9597
filter.includeModule("org.lz4", "lz4-java");
9698
filter.includeModule("org.ow2.asm", "asm");
9799
filter.includeModule("org.ow2.asm", "asm-all");
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package net.neoforged.moddevgradle.boot;
2+
3+
import org.gradle.api.Project;
4+
5+
/**
6+
* Boot trampoline for the {@code net.neoforged.moddev.mcpforge} plugin (the isolated 1.12.2/MCP toolchain).
7+
* Mirrors {@link LegacyForgeModDevPlugin}. Kept in the java8 source set so it can be loaded by the
8+
* bootstrap classloader before the main plugin classpath is wired up.
9+
*/
10+
public class McpForgePlugin extends TrampolinePlugin<Project> {
11+
public McpForgePlugin() {
12+
super("net.neoforged.moddevgradle.mcpforge.internal.McpForgeModDevPlugin");
13+
}
14+
}

0 commit comments

Comments
 (0)