44 */
55package net .minecraftforge .forgedev ;
66
7- import org .gradle .api .Project ;
7+ import net .minecraftforge .forgedev .legacy .values .MavenInfo ;
8+ import net .minecraftforge .forgedev .tasks .mcp .MCPSetupFiles ;
9+ import net .minecraftforge .gradleutils .shared .EnhancedProblems ;
10+ import net .minecraftforge .util .data .json .JsonData ;
11+ import org .gradle .api .Transformer ;
12+ import org .gradle .api .file .RegularFile ;
813import org .gradle .api .model .ObjectFactory ;
914import org .gradle .api .provider .Property ;
1015import org .gradle .api .provider .Provider ;
1116import org .gradle .api .provider .ProviderFactory ;
17+ import org .gradle .jvm .toolchain .JavaLauncher ;
1218
1319import javax .inject .Inject ;
20+ import java .util .ArrayList ;
21+ import java .util .HashMap ;
22+ import java .util .List ;
23+ import java .util .Locale ;
24+ import java .util .Map ;
1425
1526public abstract class LegacyMCPExtension {
1627 public static final String EXTENSION_NAME = "mcp" ;
1728
1829 private final Property <String > config = this .getObjects ().property (String .class );
1930 private final Property <String > version = this .getObjects ().property (String .class ).value (
20- config .map (s -> ( s . endsWith ( "@zip" ) ? s . substring ( 0 , s . length () - "@zip" . length ()) : s ). split ( ":" )[ 2 ] )
31+ config .map (s -> MavenInfo . from ( s ). art (). version () )
2132 );
33+ private final Map <String , MinecraftFiles > files = new HashMap <>();
34+ private final ForgeDevPlugin plugin ;
2235
2336 protected abstract @ Inject ObjectFactory getObjects ();
24-
2537 protected abstract @ Inject ProviderFactory getProviders ();
2638
39+ private final Problems problems = getObjects ().newInstance (Problems .class );
40+ public static abstract class Problems extends EnhancedProblems {
41+ @ Inject
42+ public Problems () {
43+ super (ForgeDevPlugin .NAME + '.' + EXTENSION_NAME , ForgeDevPlugin .DISPLAY_NAME + " - MCP" );
44+ }
45+ }
46+
2747 @ Inject
28- public LegacyMCPExtension () { }
48+ public LegacyMCPExtension (ForgeDevPlugin plugin ) {
49+ this .plugin = plugin ;
50+ }
2951
3052 public Property <String > getConfig () {
3153 return this .config ;
@@ -50,4 +72,113 @@ public void setConfig(String value) {
5072 }
5173
5274 public abstract Property <String > getPipeline ();
75+
76+ public String getArtifact () {
77+ return this .getConfig ().get ();
78+ }
79+
80+ public Provider <String > getArtifact (String classifier ) {
81+ return getArtifact (classifier , "jar" );
82+ }
83+ public Provider <String > getArtifact (String classifier , String extension ) {
84+ return this .getConfig ().map (str -> {
85+ var info = MavenInfo .from (str ).art ();
86+ var _new = MavenInfo .from (info .group (), info .name (), info .version (), classifier , extension );
87+ return _new .name ();
88+ });
89+ }
90+
91+ public MinecraftFiles getFiles () {
92+ return getFiles (getVersion ().get ());
93+ }
94+ public MinecraftFiles getFiles (String version ) {
95+ var ret = this .files .get (version );
96+ if (ret == null ) {
97+ //var client = mavenizer("client", version, false);
98+ //var server = mavenizer("server", version, false);
99+ var joined = mavenizer ("joined" , version , false );
100+
101+ ret = getObjects ().newInstance (MinecraftFiles .class , plugin , joined );
102+ this .files .put (version , ret );
103+ }
104+ return ret ;
105+ }
106+
107+ private Provider <MCPSetupFiles > mavenizer (String pipeline , String version , boolean searge ) {
108+ var fileName = "mavenizer/mcp-" + version + "-files-" + pipeline ;
109+ if (searge )
110+ fileName += "-searge" ;
111+ // TODO: [ForgeDevPlugin] Make single mavenizer task to get the 'vanilla' files we need
112+ // We also need a way to get the 'slim' artifacts for older versions which don't use bundled server jar
113+ // Could still name it 'serverExtracted' in the json
114+ var output = this .plugin .localCaches ().file ("mavenizer/" + fileName + ".jar" ).get ().getAsFile ();
115+ var outputJson = this .plugin .localCaches ().file ("mavenizer/" + fileName + ".json" ).get ().getAsFile ();
116+
117+ return this .getProviders ().of (MavenizerValueSource .class , spec -> {
118+ spec .parameters (params -> {
119+ var tool = this .plugin .getTool (Tools .MAVENIZER );
120+ params .getClasspath ().setFrom (tool .getClasspath ());
121+ params .getJavaLauncher ().set (tool .getJavaLauncher ().map (JavaLauncher ::getExecutablePath ));
122+ params .getArguments ().set (this .getProviders ().provider (() -> {
123+ var toolCache = this .plugin .globalCaches ()
124+ .dir (tool .getName ().toLowerCase (Locale .ENGLISH ))
125+ .map (this .problems .ensureFileLocation ());
126+ var cache = toolCache .get ().dir ("caches" ).getAsFile ().getAbsolutePath ();
127+
128+ var ret = new ArrayList <>(List .of (
129+ "--mcp" ,
130+ "--cache" , cache ,
131+ "--jdk-cache" , cache ,
132+ "--version" , version ,
133+ "--raw" ,
134+ "--pipeline" , pipeline ,
135+ "--output" , output .getAbsolutePath (),
136+ "--output-files" , outputJson .getAbsolutePath ()
137+ ));
138+ if (searge )
139+ ret .add ("--searge" );
140+ return ret ;
141+ }));
142+ });
143+ })
144+ .map (v -> JsonData .fromJson (outputJson , MCPSetupFiles .class ));
145+ }
146+
147+ public static abstract class MinecraftFiles {
148+ private final ForgeDevPlugin plugin ;
149+ private final Provider <MCPSetupFiles > info ;
150+ protected abstract @ Inject ObjectFactory getObjects ();
151+ protected abstract @ Inject ProviderFactory getProviders ();
152+
153+ @ Inject
154+ public MinecraftFiles (ForgeDevPlugin plugin , Provider <MCPSetupFiles > info ) {
155+ this .plugin = plugin ;
156+ this .info = info ;
157+ }
158+
159+ private Provider <RegularFile > get (Transformer <String , MCPSetupFiles > field ) {
160+ return this .info .map (field ).flatMap (this .plugin .rootProjectDirectory ()::file );
161+ }
162+ public Provider <RegularFile > getLauncherManifest () {
163+ return get (info -> info .versionManifest );
164+ }
165+ public Provider <RegularFile > getVersionJson () {
166+ return get (info -> info .versionJson );
167+ }
168+ public Provider <RegularFile > getClient () {
169+ return get (info -> info .clientRaw );
170+ }
171+ public Provider <RegularFile > getClientMappings () {
172+ return get (info -> info .clientMappings );
173+ }
174+ public Provider <RegularFile > getServer () {
175+ return get (info -> info .serverRaw );
176+ }
177+ public Provider <RegularFile > getServerExtracted () {
178+ return get (info -> info .serverExtracted );
179+ }
180+ public Provider <RegularFile > getServerMappings () {
181+ return get (info -> info .serverMappings );
182+ }
183+ }
53184}
0 commit comments