88import net .minecraftforge .forgedev .tasks .compat .LegacyMergeFilesTask ;
99import net .minecraftforge .forgedev .tasks .filtering .LegacyFilterNewJar ;
1010import net .minecraftforge .forgedev .tasks .generation .GeneratePatcherConfigV2 ;
11+ import net .minecraftforge .forgedev .tasks .launcher .SlimeLauncherExec ;
1112import net .minecraftforge .forgedev .tasks .mappings .LegacyApplyMappings ;
1213import net .minecraftforge .forgedev .tasks .mappings .LegacyGenerateSRG ;
1314import net .minecraftforge .forgedev .tasks .mcp .MavenizerMCPDataTask ;
2627import org .gradle .api .Action ;
2728import org .gradle .api .Project ;
2829import org .gradle .api .artifacts .ExternalModuleDependency ;
30+ import org .gradle .api .artifacts .ModuleIdentifier ;
2931import org .gradle .api .artifacts .repositories .MavenArtifactRepository ;
3032import org .gradle .api .attributes .Attribute ;
3133import org .gradle .api .file .Directory ;
3234import org .gradle .api .file .DirectoryProperty ;
35+ import org .gradle .api .file .ProjectLayout ;
3336import org .gradle .api .model .ObjectFactory ;
3437import org .gradle .api .plugins .JavaPlugin ;
3538import org .gradle .api .plugins .JavaPluginExtension ;
4144import org .gradle .api .tasks .bundling .Jar ;
4245import org .gradle .api .tasks .bundling .Zip ;
4346import org .gradle .api .tasks .compile .JavaCompile ;
47+ import org .gradle .plugins .ide .eclipse .model .EclipseModel ;
4448import org .jetbrains .annotations .VisibleForTesting ;
4549
4650import javax .inject .Inject ;
4751import java .io .File ;
4852import java .io .IOException ;
4953import java .nio .file .Files ;
54+ import java .util .List ;
5055import java .util .function .Function ;
5156
5257// TODO [ForgeDev] Hide this and make a public interface
@@ -66,6 +71,8 @@ public abstract class ForgeDevExtension {
6671
6772 protected abstract @ Inject ProviderFactory getProviders ();
6873
74+ protected abstract @ Inject ProjectLayout getProjectLayout ();
75+
6976 @ Inject
7077 public ForgeDevExtension (ForgeDevPlugin plugin , Project project ) {
7178 this .mavenizerRepo .set (plugin .globalCaches ().dir ("repo" ).map (this .problems .ensureFileLocation ()));
@@ -101,8 +108,10 @@ private void setup(ForgeDevPlugin plugin, Project project) {
101108 var setupMCP = tasks .register ("setupMCP" , MavenizerMCPSetup .class );
102109
103110 var syncMavenizer = tasks .register ("syncMavenizer" , MavenizerMCPMaven .class );
111+ var syncMavenizerForExtra = tasks .register ("syncMavenizerForExtra" , MavenizerMCPMaven .class );
104112 var syncMappingsMaven = tasks .register ("syncMappingsMaven" , MavenizerSyncMappings .class );
105113 Util .runFirst (project , syncMavenizer );
114+ Util .runFirst (project , syncMavenizerForExtra );
106115 Util .runFirst (project , syncMappingsMaven );
107116 var mappingsConfiguration = project .getConfigurations ().detachedConfiguration ();
108117 var mappingsZipFile = this .getProviders ().provider (mappingsConfiguration ::getSingleFile );
@@ -246,6 +255,25 @@ private void setup(ForgeDevPlugin plugin, Project project) {
246255 });
247256 var release = tasks .register ("release" , task -> task .dependsOn (srgSourcesJar , universalJar , userdevJar ));
248257
258+ var sourceSetsDir = this .getObjects ().directoryProperty ().value (this .getProjectLayout ().getBuildDirectory ().dir ("sourceSets" ));
259+ var mergeSourceSets = this .problems .test ("net.minecraftforge.gradle.merge-source-sets" );
260+ project .getExtensions ().getByType (JavaPluginExtension .class ).getSourceSets ().configureEach (sourceSet -> {
261+ if (mergeSourceSets ) {
262+ // This is documented in SourceSetOutput's javadoc comment
263+ var unifiedDir = sourceSetsDir .dir (sourceSet .getName ());
264+ sourceSet .getOutput ().setResourcesDir (unifiedDir );
265+ sourceSet .getJava ().getDestinationDirectory ().set (unifiedDir );
266+ }
267+
268+ project .getPluginManager ().withPlugin ("eclipse" , eclipsePlugin -> {
269+ var eclipse = project .getExtensions ().getByType (EclipseModel .class );
270+ if (mergeSourceSets )
271+ eclipse .getClasspath ().setDefaultOutputDir (sourceSetsDir .getAsFile ().get ());
272+ else
273+ System .out .println ("WARNING: Source set will not be merged for " + sourceSet .getName () + "!" );
274+ });
275+ });
276+
249277 project .afterEvaluate (p -> {
250278 // TODO Add mappings as a dependency to FG7???
251279 // Add mappings so that it can be used by reflection tools.
@@ -263,9 +291,15 @@ private void setup(ForgeDevPlugin plugin, Project project) {
263291 });
264292 })
265293 );
294+ var minecraftExtraDependency = project .getDependencies ().create (
295+ "net.minecraft:client-extra:%s" .formatted (legacyMcp .getVersion ().get ()),
296+ Closures .<ExternalModuleDependency >consumer (dependency -> dependency .setTransitive (false ))
297+ );
266298 syncMavenizer .configure (task -> task .getArtifact ().set (legacyMcp .getVersion ()));
299+ syncMavenizerForExtra .configure (task -> task .getArtifact ().set (legacyMcp .getVersion ().map (v -> "net.minecraft:client-extra:" + v )));
267300 syncMappingsMaven .configure (task -> task .getVersion ().set (legacyPatcher .getMappingVersion ()));
268301 project .getDependencies ().add (JavaPlugin .IMPLEMENTATION_CONFIGURATION_NAME , minecraftDependency );
302+ project .getDependencies ().add (JavaPlugin .IMPLEMENTATION_CONFIGURATION_NAME , minecraftExtraDependency );
269303 project .getDependencies ().add (JavaPlugin .IMPLEMENTATION_CONFIGURATION_NAME , mappingsDependency );
270304 mappingsConfiguration .withDependencies (d -> d .add (mappingsDependency ));
271305
@@ -316,6 +350,10 @@ private void setup(ForgeDevPlugin plugin, Project project) {
316350 }
317351 }
318352
353+ setupMCP .configure (task -> {
354+ task .getSideAnnotationStripperConfig ().fileProvider (getProviders ().provider (() -> legacyPatcher .getSideAnnotationStrippers ().getSingleFile ()));
355+ });
356+
319357 // TODO SAS! Used MCPFunction in FG6, I DON'T GIVE A SHIT RIGHT NOW!!!
320358
321359 if (!legacyPatcher .getExtraMappings ().isEmpty ()) {
@@ -405,6 +443,35 @@ private void setup(ForgeDevPlugin plugin, Project project) {
405443 });
406444 }
407445 }
446+
447+ // TODO Clean up please
448+ record SimpleModuleIdentifier (String getGroup , String getName ) implements ModuleIdentifier {
449+ SimpleModuleIdentifier () {
450+ this ("net.minecraft" , "joined" );
451+ }
452+ }
453+
454+ if (!legacyPatcher .runs .isEmpty ()) {
455+ var genEclipseRuns = project .getTasks ().register ("genEclipseRuns" , task -> {
456+ task .setGroup ("IDE" );
457+ task .setDescription ("Generates the run configuration launch files for Eclipse." );
458+ });
459+
460+ File eclipseOutputDir ;
461+ var eclipse = project .getExtensions ().findByType (EclipseModel .class );
462+ if (eclipse != null ) {
463+ eclipse .synchronizationTasks (genEclipseRuns );
464+ eclipseOutputDir = eclipse .getClasspath ().getDefaultOutputDir ();
465+ } else {
466+ eclipseOutputDir = getProjectLayout ().getProjectDirectory ().dir ("bin" ).getAsFile ();
467+ }
468+
469+ for (var sourceSet : List .of (main .get (), java .getSourceSets ().named (SourceSet .TEST_SOURCE_SET_NAME ).get ())) {
470+ legacyPatcher .runs .forEach (options -> {
471+ var task = SlimeLauncherExec .register (project , sourceSet , options , new SimpleModuleIdentifier (), legacyMcp .getVersion ().get (), eclipseOutputDir );
472+ });
473+ }
474+ }
408475 });
409476 }
410477}
0 commit comments