Skip to content

Commit c8b9828

Browse files
committed
Move Fabric mod integrations into submods
1 parent 41d7f2d commit c8b9828

File tree

4,620 files changed

+1491
-1037
lines changed

Some content is hidden

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

4,620 files changed

+1491
-1037
lines changed

build-logic/build.gradle.kts

+8-3
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,14 @@ gradlePlugin {
2323
implementationClass = "juuxel.adorn.gradle.DataGeneratorPlugin"
2424
}
2525

26-
register("adorn-data-generator.emi") {
27-
id = "adorn-data-generator.emi"
28-
implementationClass = "juuxel.adorn.gradle.EmiDataGeneratorPlugin"
26+
register("adorn-data-generator.modular") {
27+
id = "adorn-data-generator.modular"
28+
implementationClass = "juuxel.adorn.gradle.ModularDataGeneratorPlugin"
29+
}
30+
31+
register("adorn-compat") {
32+
id = "adorn-compat"
33+
implementationClass = "juuxel.adorn.gradle.CompatPlugin"
2934
}
3035

3136
register("adorn-minify-json") {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package juuxel.adorn.gradle;
2+
3+
import juuxel.adorn.gradle.compat.CompatExtension;
4+
import org.gradle.api.Plugin;
5+
import org.gradle.api.Project;
6+
7+
import java.util.Map;
8+
9+
public final class CompatPlugin implements Plugin<Project> {
10+
public static final String FABRIC_COMPAT_ARTIFACTS_CONFIGURATION = "fabricCompatArtifacts";
11+
public static final String NEOFORGE_COMPAT_ARTIFACTS_CONFIGURATION = "neoForgeCompatArtifacts";
12+
13+
@Override
14+
public void apply(Project project) {
15+
project.getPlugins().apply(ModularDataGeneratorPlugin.class);
16+
project.getConfigurations().consumable(FABRIC_COMPAT_ARTIFACTS_CONFIGURATION);
17+
project.getConfigurations().consumable(NEOFORGE_COMPAT_ARTIFACTS_CONFIGURATION);
18+
project.getExtensions().create("compat", CompatExtension.class, project);
19+
20+
addJijDependency(project.project(":fabric"), project, FABRIC_COMPAT_ARTIFACTS_CONFIGURATION);
21+
addJijDependency(project.project(":forge"), project, NEOFORGE_COMPAT_ARTIFACTS_CONFIGURATION);
22+
}
23+
24+
private static void addJijDependency(Project target, Project owner, String configuration) {
25+
var deps = target.getDependencies();
26+
deps.add("include", deps.project(Map.of("path", owner.getPath(), "configuration", configuration)));
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,24 @@
11
package juuxel.adorn.gradle;
22

33
import juuxel.adorn.gradle.datagen.DataGeneratorExtension;
4-
import juuxel.adorn.gradle.datagen.DeleteDuplicates;
5-
import juuxel.adorn.gradle.datagen.GenerateData;
64
import org.gradle.api.Plugin;
75
import org.gradle.api.Project;
86
import org.gradle.api.plugins.JavaPluginExtension;
7+
import org.gradle.api.tasks.SourceSet;
98

109
public final class DataGeneratorPlugin implements Plugin<Project> {
1110
@Override
1211
public void apply(Project project) {
12+
project.getPlugins().apply(ModularDataGeneratorPlugin.class);
1313
var java = project.getExtensions().getByType(JavaPluginExtension.class);
14-
var extension = project.getExtensions().create("dataGenerator", DataGeneratorExtension.class, project);
15-
extension.getConfigs().register("main", config -> {
16-
config.getFiles().from(project.fileTree("src/data").filter(file -> file.getName().endsWith(".xml")));
17-
});
18-
19-
var generatedResources = project.getLayout().getProjectDirectory().dir("src/main/generatedResources");
20-
var generateMainData = project.getTasks().register("generateMainData", GenerateData.class, task -> {
21-
task.getConfigs().set(extension.getConfigs());
22-
task.getGenerateTags().set(extension.getGenerateTags());
23-
task.getOutput().convention(generatedResources);
24-
});
25-
var generateData = project.getTasks().register("generateData", task -> task.dependsOn(generateMainData));
26-
project.getTasks().named("processResources", task -> task.mustRunAfter(generateData));
27-
project.getTasks().register("deleteDuplicateResources", DeleteDuplicates.class, task -> {
28-
task.getGenerated().convention(generatedResources);
29-
task.getMain().convention(project.getLayout().dir(
30-
java.getSourceSets()
31-
.named("main")
32-
.map(main -> main.getResources().getSrcDirs().iterator().next())
33-
));
34-
});
35-
java.getSourceSets().named("main", main -> {
36-
main.getResources().srcDir(generatedResources);
37-
main.getResources().exclude(".cache");
14+
var extension = project.getExtensions().getByType(DataGeneratorExtension.class);
15+
extension.getSettings().register("adorn", settings -> {
16+
settings.getSourceSet().set(java.getSourceSets().named(SourceSet.MAIN_SOURCE_SET_NAME));
17+
settings.getIncludeCommonFilesInEmi().set(true);
18+
settings.getModId().set("adorn");
19+
settings.getConfigs().register("main", config -> {
20+
config.getFiles().from(project.fileTree("src/data").filter(file -> file.getName().endsWith(".xml")));
21+
});
3822
});
3923
}
4024
}

build-logic/src/main/java/juuxel/adorn/gradle/EmiDataGeneratorPlugin.java

-20
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package juuxel.adorn.gradle;
2+
3+
import juuxel.adorn.gradle.datagen.GenerateData;
4+
import juuxel.adorn.gradle.datagen.GenerateEmi;
5+
import juuxel.adorn.gradle.datagen.DataGeneratorExtension;
6+
import org.gradle.api.Plugin;
7+
import org.gradle.api.Project;
8+
import org.gradle.api.plugins.JavaPluginExtension;
9+
import org.gradle.api.tasks.SourceSetContainer;
10+
11+
import java.io.File;
12+
import java.util.ArrayList;
13+
14+
public final class ModularDataGeneratorPlugin implements Plugin<Project> {
15+
@Override
16+
public void apply(Project project) {
17+
var extension = project.getExtensions().create("dataGenerator", DataGeneratorExtension.class, project);
18+
19+
project.getTasks().register("generateAllData");
20+
21+
project.afterEvaluate(p -> {
22+
for (var config : extension.getSettings()) {
23+
setup(project, config);
24+
}
25+
});
26+
}
27+
28+
private static void setup(Project project, DataGeneratorExtension.Settings settings) {
29+
var sourceSet = settings.getSourceSet().get();
30+
var generatedResources = settings.getGeneratedResources();
31+
var generateMainData = project.getTasks().register(sourceSet.getTaskName("generate", "MainData"), GenerateData.class, task -> {
32+
task.getConfigs().set(settings.getConfigs());
33+
task.getGenerateTags().set(settings.getGenerateTags());
34+
task.getOutput().convention(generatedResources);
35+
});
36+
var generateData = project.getTasks().register(sourceSet.getTaskName("generate", "Data"), task -> task.dependsOn(generateMainData));
37+
project.getTasks().named("generateAllData", task -> task.dependsOn(generateData));
38+
project.getTasks().named(sourceSet.getProcessResourcesTaskName(), task -> task.mustRunAfter(generateData));
39+
sourceSet.getResources().srcDir(generatedResources);
40+
sourceSet.getResources().exclude(".cache");
41+
42+
if (settings.getGenerateEmiFiles().get()) {
43+
var generateEmi = project.getTasks().register(sourceSet.getTaskName("generate", "Emi"), GenerateEmi.class, task -> {
44+
task.mustRunAfter(generateMainData);
45+
task.getOutput().convention(generateMainData.flatMap(GenerateData::getOutput));
46+
task.getModId().set(settings.getModId());
47+
var resourceDirs = new ArrayList<>(sourceSet.getResources().getSrcDirs());
48+
49+
if (settings.getIncludeCommonFilesInEmi().get()) {
50+
resourceDirs.addAll(getSourceSets(project.project(":common")).getByName("main").getResources().getSrcDirs());
51+
}
52+
53+
for (File dir : resourceDirs) {
54+
task.getRecipes().from(project.fileTree(dir, tree -> {
55+
tree.include("data/adorn/recipe/**");
56+
57+
// The unpacking recipes create "uncraftable" vanilla items like
58+
// nether wart, so exclude them.
59+
tree.exclude("data/adorn/recipe/crates/unpack/**");
60+
}));
61+
}
62+
});
63+
generateData.configure(task -> task.dependsOn(generateEmi));
64+
}
65+
}
66+
67+
private static SourceSetContainer getSourceSets(Project project) {
68+
return project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets();
69+
}
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package juuxel.adorn.gradle.compat;
2+
3+
import juuxel.adorn.gradle.CompatPlugin;
4+
import juuxel.adorn.gradle.action.MinifyJson;
5+
import juuxel.adorn.gradle.datagen.DataGeneratorExtension;
6+
import org.gradle.api.Project;
7+
import org.gradle.api.plugins.JavaPluginExtension;
8+
import org.gradle.api.tasks.SourceSet;
9+
import org.gradle.api.tasks.bundling.Jar;
10+
11+
import javax.inject.Inject;
12+
13+
public abstract class CompatExtension {
14+
private final Project project;
15+
private final JavaPluginExtension java;
16+
private final DataGeneratorExtension dataGenerator;
17+
18+
@Inject
19+
public CompatExtension(Project project) {
20+
this.project = project;
21+
this.java = project.getExtensions().getByType(JavaPluginExtension.class);
22+
this.dataGenerator = project.getExtensions().getByType(DataGeneratorExtension.class);
23+
}
24+
25+
public void registerTargetMod(String modId, String modName, boolean fabric, boolean neo) {
26+
var compatSourceSet = java.getSourceSets().create(modId, sourceSet -> {
27+
var main = java.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME);
28+
sourceSet.setCompileClasspath(sourceSet.getCompileClasspath().plus(main.getCompileClasspath()));
29+
sourceSet.setRuntimeClasspath(sourceSet.getRuntimeClasspath().plus(main.getRuntimeClasspath()));
30+
sourceSet.setAnnotationProcessorPath(sourceSet.getAnnotationProcessorPath().plus(main.getAnnotationProcessorPath()));
31+
});
32+
33+
var jar = project.getTasks().register(modId + "Jar", Jar.class, task -> {
34+
task.from(compatSourceSet.getOutput());
35+
task.getArchiveClassifier().set(modId.replace('_', '-'));
36+
task.doLast(new MinifyJson());
37+
});
38+
39+
var dataSettings = dataGenerator.getSettings().register(modId, settings -> {
40+
settings.getSourceSet().set(compatSourceSet);
41+
settings.getModId().set("adorn_integrations_" + modId);
42+
settings.getConfigs().register("main", config -> {
43+
config.getFiles().from("src/data/" + modId + ".xml");
44+
});
45+
});
46+
47+
if (fabric) {
48+
project.getArtifacts().add(CompatPlugin.FABRIC_COMPAT_ARTIFACTS_CONFIGURATION, jar);
49+
50+
var generateFmj = project.getTasks().register(compatSourceSet.getTaskName("generate", "FabricModJson"), GenerateFabricModJson.class, task -> {
51+
task.getTargetModId().set(modId);
52+
task.getTargetModName().set(modName);
53+
task.getOutputFile().set(dataSettings.get().getGeneratedResources().file("fabric.mod.json"));
54+
});
55+
56+
project.afterEvaluate(p -> {
57+
generateFmj.configure(task -> task.dependsOn(compatSourceSet.getTaskName("generate", "MainData")));
58+
project.getTasks().named(compatSourceSet.getTaskName("generate", "Data"), task -> task.dependsOn(generateFmj));
59+
});
60+
}
61+
62+
if (neo) {
63+
project.getArtifacts().add(CompatPlugin.NEOFORGE_COMPAT_ARTIFACTS_CONFIGURATION, jar);
64+
}
65+
}
66+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package juuxel.adorn.gradle.compat;
2+
3+
import org.gradle.api.DefaultTask;
4+
import org.gradle.api.file.RegularFileProperty;
5+
import org.gradle.api.provider.Property;
6+
import org.gradle.api.tasks.Input;
7+
import org.gradle.api.tasks.OutputFile;
8+
import org.gradle.api.tasks.TaskAction;
9+
10+
import javax.inject.Inject;
11+
import java.io.IOException;
12+
import java.nio.file.Files;
13+
import java.util.Objects;
14+
15+
public abstract class GenerateFabricModJson extends DefaultTask {
16+
@Input
17+
public abstract Property<String> getVersion();
18+
19+
@Input
20+
public abstract Property<String> getModId();
21+
22+
@Input
23+
public abstract Property<String> getTargetModName();
24+
25+
@Input
26+
public abstract Property<String> getTargetModId();
27+
28+
@OutputFile
29+
public abstract RegularFileProperty getOutputFile();
30+
31+
@Inject
32+
public GenerateFabricModJson() {
33+
getVersion().convention(getProject().provider(() -> Objects.toString(getProject().getVersion())));
34+
getModId().convention(getTargetModId().map(modId -> "adorn_integrations_" + modId));
35+
}
36+
37+
@TaskAction
38+
public void run() throws IOException {
39+
var fmj = """
40+
{
41+
"schemaVersion": 1,
42+
"id": "%s",
43+
"name": "Adorn Integrations: %s",
44+
"version": "%s",
45+
"description": "Integrates materials from %s into Adorn.",
46+
"authors": ["Juuz"],
47+
"license": "MIT",
48+
"contact": {
49+
"homepage": "https://modrinth.com/mod/adorn",
50+
"sources": "https://github.com/Juuxel/Adorn",
51+
"issues": "https://github.com/Juuxel/Adorn/issues"
52+
},
53+
"icon": "assets/adorn/icon.png",
54+
55+
"depends": {
56+
"adorn": "*",
57+
"%s": "*"
58+
}
59+
}
60+
""".formatted(
61+
getModId().get(),
62+
getTargetModName().get(),
63+
getVersion().get(),
64+
getTargetModName().get(),
65+
getTargetModId().get()
66+
);
67+
var output = getOutputFile().get().getAsFile().toPath();
68+
Files.createDirectories(output.getParent());
69+
Files.writeString(output, fmj);
70+
}
71+
}
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,57 @@
11
package juuxel.adorn.gradle.datagen;
22

33
import org.gradle.api.Action;
4+
import org.gradle.api.Named;
45
import org.gradle.api.NamedDomainObjectContainer;
56
import org.gradle.api.Project;
7+
import org.gradle.api.file.DirectoryProperty;
68
import org.gradle.api.provider.Property;
9+
import org.gradle.api.tasks.SourceSet;
710

811
import javax.inject.Inject;
912

1013
public abstract class DataGeneratorExtension {
11-
public abstract Property<Boolean> getGenerateTags();
12-
13-
private final NamedDomainObjectContainer<DataConfig> configs;
14+
private final NamedDomainObjectContainer<Settings> settings;
1415

1516
@Inject
1617
public DataGeneratorExtension(Project project) {
17-
configs = project.container(DataConfig.class);
18-
getGenerateTags().convention(false);
18+
settings = project.container(Settings.class);
19+
}
20+
21+
public NamedDomainObjectContainer<Settings> getSettings() {
22+
return settings;
1923
}
2024

21-
public NamedDomainObjectContainer<DataConfig> getConfigs() {
22-
return configs;
25+
public void settings(Action<NamedDomainObjectContainer<Settings>> action) {
26+
action.execute(settings);
2327
}
2428

25-
public void configs(Action<NamedDomainObjectContainer<DataConfig>> action) {
26-
action.execute(configs);
29+
public static abstract class Settings implements Named {
30+
private final NamedDomainObjectContainer<DataConfig> configs;
31+
32+
@Inject
33+
public Settings(Project project) {
34+
configs = project.container(DataConfig.class);
35+
getGeneratedResources().convention(getSourceSet().map(sourceSet -> project.getLayout().getProjectDirectory().dir("src/%s/generatedResources".formatted(sourceSet.getName()))));
36+
getGenerateTags().convention(false);
37+
getGenerateEmiFiles().convention(true);
38+
getIncludeCommonFilesInEmi().convention(false);
39+
}
40+
41+
public abstract Property<SourceSet> getSourceSet();
42+
public abstract DirectoryProperty getGeneratedResources();
43+
public abstract Property<String> getModId();
44+
public abstract Property<Boolean> getGenerateTags();
45+
46+
public abstract Property<Boolean> getGenerateEmiFiles();
47+
public abstract Property<Boolean> getIncludeCommonFilesInEmi();
48+
49+
public NamedDomainObjectContainer<DataConfig> getConfigs() {
50+
return configs;
51+
}
52+
53+
public void configs(Action<NamedDomainObjectContainer<DataConfig>> action) {
54+
action.execute(configs);
55+
}
2756
}
2857
}

0 commit comments

Comments
 (0)