General cleanup by making use of java 16 features (#397)
* General cleanup by making use of java 16 features * use jackson-databind in place of gson when reading to a record * Fixes * cleanup * dep updates * Replace commons IOUtils usage with native java * Update fernflowerdev/0.11
parent
2f38c747a1
commit
9fb167d506
|
@ -6,8 +6,8 @@ A [Gradle](https://gradle.org/) plugin to setup a deobfuscated development envir
|
||||||
* Utilises the Fernflower and CFR decompilers to generate source code with comments.
|
* Utilises the Fernflower and CFR decompilers to generate source code with comments.
|
||||||
* Designed to support modern versions of Minecraft (Tested with 1.14.4 and upwards)
|
* Designed to support modern versions of Minecraft (Tested with 1.14.4 and upwards)
|
||||||
* Built in support for IntelliJ IDEA, Eclipse and Visual Studio Code to generate run configurations for Minecraft.
|
* Built in support for IntelliJ IDEA, Eclipse and Visual Studio Code to generate run configurations for Minecraft.
|
||||||
* Loom targets a wide range of Gradle versions. _Tested with 4.9 up to 6.7_
|
* Loom targets the latest version of Gradle 7 or newer
|
||||||
* Supports the latest version of Java all the way down to Java 8
|
* Supports Java 16 upwards
|
||||||
|
|
||||||
## Use Loom to develop mods
|
## Use Loom to develop mods
|
||||||
|
|
||||||
|
|
13
build.gradle
13
build.gradle
|
@ -46,6 +46,7 @@ dependencies {
|
||||||
implementation ('commons-io:commons-io:2.8.0')
|
implementation ('commons-io:commons-io:2.8.0')
|
||||||
implementation ('org.zeroturnaround:zt-zip:1.14')
|
implementation ('org.zeroturnaround:zt-zip:1.14')
|
||||||
implementation ('com.google.code.gson:gson:2.8.6')
|
implementation ('com.google.code.gson:gson:2.8.6')
|
||||||
|
implementation ('com.fasterxml.jackson.core:jackson-databind:2.12.3')
|
||||||
implementation ('com.google.guava:guava:30.1-jre')
|
implementation ('com.google.guava:guava:30.1-jre')
|
||||||
implementation ('org.ow2.asm:asm:9.1')
|
implementation ('org.ow2.asm:asm:9.1')
|
||||||
implementation ('org.ow2.asm:asm-analysis:9.1')
|
implementation ('org.ow2.asm:asm-analysis:9.1')
|
||||||
|
@ -70,21 +71,21 @@ dependencies {
|
||||||
implementation ('org.cadixdev:lorenz-io-proguard:0.5.6')
|
implementation ('org.cadixdev:lorenz-io-proguard:0.5.6')
|
||||||
|
|
||||||
// decompilers
|
// decompilers
|
||||||
implementation ('net.fabricmc:fabric-fernflower:1.3.0')
|
implementation ('net.fabricmc:fabric-fernflower:1.4.0')
|
||||||
implementation ('org.benf:cfr:0.150')
|
implementation ('org.benf:cfr:0.151')
|
||||||
|
|
||||||
// source code remapping
|
// source code remapping
|
||||||
implementation ('org.cadixdev:mercury:0.1.0-rc1')
|
implementation ('org.cadixdev:mercury:0.1.0-rc1')
|
||||||
|
|
||||||
// Kapt integration
|
// Kapt integration
|
||||||
compileOnly('org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.32')
|
compileOnly('org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.0')
|
||||||
|
|
||||||
// Testing
|
// Testing
|
||||||
testImplementation(gradleTestKit())
|
testImplementation(gradleTestKit())
|
||||||
testImplementation('org.spockframework:spock-core:2.0-M5-groovy-3.0') {
|
testImplementation('org.spockframework:spock-core:2.0-M5-groovy-3.0') {
|
||||||
exclude module: 'groovy-all'
|
exclude module: 'groovy-all'
|
||||||
}
|
}
|
||||||
testImplementation 'io.javalin:javalin:3.13.4'
|
testImplementation 'io.javalin:javalin:3.13.7'
|
||||||
|
|
||||||
compileOnly 'org.jetbrains:annotations:20.1.0'
|
compileOnly 'org.jetbrains:annotations:20.1.0'
|
||||||
}
|
}
|
||||||
|
@ -115,11 +116,11 @@ license {
|
||||||
|
|
||||||
checkstyle {
|
checkstyle {
|
||||||
configFile = file('checkstyle.xml')
|
configFile = file('checkstyle.xml')
|
||||||
toolVersion = '8.41.1'
|
toolVersion = '8.42'
|
||||||
}
|
}
|
||||||
|
|
||||||
codenarc {
|
codenarc {
|
||||||
toolVersion = "2.0.0"
|
toolVersion = "2.1.0"
|
||||||
configFile = file("codenarc.groovy")
|
configFile = file("codenarc.groovy")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
package net.fabricmc.loom;
|
package net.fabricmc.loom;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
|
@ -41,6 +43,7 @@ import net.fabricmc.loom.task.LoomTasks;
|
||||||
public class LoomGradlePlugin implements Plugin<Project> {
|
public class LoomGradlePlugin implements Plugin<Project> {
|
||||||
public static boolean refreshDeps;
|
public static boolean refreshDeps;
|
||||||
public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
|
public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
|
||||||
|
public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void apply(Project project) {
|
public void apply(Project project) {
|
||||||
|
|
|
@ -27,14 +27,5 @@ package net.fabricmc.loom.api.decompilers;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
public class DecompilationMetadata {
|
public record DecompilationMetadata(int numberOfThreads, Path javaDocs, Collection<Path> libraries) {
|
||||||
public final int numberOfThreads;
|
|
||||||
public final Path javaDocs;
|
|
||||||
public final Collection<Path> libraries;
|
|
||||||
|
|
||||||
public DecompilationMetadata(int numberOfThreads, Path javaDocs, Collection<Path> libraries) {
|
|
||||||
this.numberOfThreads = numberOfThreads;
|
|
||||||
this.javaDocs = javaDocs;
|
|
||||||
this.libraries = libraries;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,7 @@ public class ModCompileRemapper {
|
||||||
|
|
||||||
for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) {
|
for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) {
|
||||||
data.getLazyConfigurationProvider(entry.getRemappedConfiguration()).configure(remappedConfig -> {
|
data.getLazyConfigurationProvider(entry.getRemappedConfiguration()).configure(remappedConfig -> {
|
||||||
Configuration sourceConfig = project.getConfigurations().getByName(entry.getSourceConfiguration());
|
Configuration sourceConfig = project.getConfigurations().getByName(entry.sourceConfiguration());
|
||||||
Configuration regularConfig = project.getConfigurations().getByName(entry.getTargetConfiguration(project.getConfigurations()));
|
Configuration regularConfig = project.getConfigurations().getByName(entry.getTargetConfiguration(project.getConfigurations()));
|
||||||
|
|
||||||
List<ModDependencyInfo> modDependencies = new ArrayList<>();
|
List<ModDependencyInfo> modDependencies = new ArrayList<>();
|
||||||
|
@ -149,8 +149,8 @@ public class ModCompileRemapper {
|
||||||
Dependency dep = dependencies.module(artifact.getModuleVersion().toString()
|
Dependency dep = dependencies.module(artifact.getModuleVersion().toString()
|
||||||
+ (artifact.getClassifier() == null ? "" : ':' + artifact.getClassifier())); // the owning module of the artifact
|
+ (artifact.getClassifier() == null ? "" : ':' + artifact.getClassifier())); // the owning module of the artifact
|
||||||
|
|
||||||
if (dep instanceof ModuleDependency) {
|
if (dep instanceof ModuleDependency moduleDependency) {
|
||||||
((ModuleDependency) dep).setTransitive(false);
|
moduleDependency.setTransitive(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies.add(regularCompile.getName(), dep);
|
dependencies.add(regularCompile.getName(), dep);
|
||||||
|
|
|
@ -71,7 +71,7 @@ public abstract class AnnotationProcessorInvoker<T extends Task> {
|
||||||
private void passMixinArguments(T task) {
|
private void passMixinArguments(T task) {
|
||||||
try {
|
try {
|
||||||
LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
|
LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
|
||||||
Map<String, String> args = new HashMap<String, String>() {{
|
Map<String, String> args = new HashMap<>() {{
|
||||||
put(Constants.MixinArguments.IN_MAP_FILE_NAMED_INTERMEDIARY, extension.getMappingsProvider().tinyMappings.getCanonicalPath());
|
put(Constants.MixinArguments.IN_MAP_FILE_NAMED_INTERMEDIARY, extension.getMappingsProvider().tinyMappings.getCanonicalPath());
|
||||||
put(Constants.MixinArguments.OUT_MAP_FILE_NAMED_INTERMEDIARY, extension.getNextMixinMappings().getCanonicalPath());
|
put(Constants.MixinArguments.OUT_MAP_FILE_NAMED_INTERMEDIARY, extension.getNextMixinMappings().getCanonicalPath());
|
||||||
put(Constants.MixinArguments.OUT_REFMAP_FILE, getRefmapDestination(task, extension));
|
put(Constants.MixinArguments.OUT_REFMAP_FILE, getRefmapDestination(task, extension));
|
||||||
|
|
|
@ -29,13 +29,7 @@ import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class MergedNestedJarProvider implements NestedJarProvider {
|
public record MergedNestedJarProvider(NestedJarProvider... parents) implements NestedJarProvider {
|
||||||
private final NestedJarProvider[] parents;
|
|
||||||
|
|
||||||
public MergedNestedJarProvider(NestedJarProvider... parents) {
|
|
||||||
this.parents = parents;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<File> provide() {
|
public Collection<File> provide() {
|
||||||
return Arrays.stream(parents)
|
return Arrays.stream(parents)
|
||||||
|
|
|
@ -80,13 +80,12 @@ public final class NestedDependencyProvider implements NestedJarProvider {
|
||||||
DependencySet dependencies = configuration.getDependencies();
|
DependencySet dependencies = configuration.getDependencies();
|
||||||
|
|
||||||
for (Dependency dependency : dependencies) {
|
for (Dependency dependency : dependencies) {
|
||||||
if (dependency instanceof ProjectDependency) {
|
if (dependency instanceof ProjectDependency projectDependency) {
|
||||||
ProjectDependency projectDependency = (ProjectDependency) dependency;
|
|
||||||
Project dependencyProject = projectDependency.getDependencyProject();
|
Project dependencyProject = projectDependency.getDependencyProject();
|
||||||
|
|
||||||
for (Task task : dependencyProject.getTasksByName("remapJar", false)) {
|
for (Task task : dependencyProject.getTasksByName("remapJar", false)) {
|
||||||
if (task instanceof RemapJarTask) {
|
if (task instanceof RemapJarTask remapJarTask) {
|
||||||
remapTasks.add((RemapJarTask) task);
|
remapTasks.add(remapJarTask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,8 +98,7 @@ public final class NestedDependencyProvider implements NestedJarProvider {
|
||||||
List<DependencyInfo<ProjectDependency>> fileList = new ArrayList<>();
|
List<DependencyInfo<ProjectDependency>> fileList = new ArrayList<>();
|
||||||
|
|
||||||
for (Dependency dependency : configuration.getDependencies()) {
|
for (Dependency dependency : configuration.getDependencies()) {
|
||||||
if (dependency instanceof ProjectDependency) {
|
if (dependency instanceof ProjectDependency projectDependency) {
|
||||||
ProjectDependency projectDependency = (ProjectDependency) dependency;
|
|
||||||
Project dependencyProject = projectDependency.getDependencyProject();
|
Project dependencyProject = projectDependency.getDependencyProject();
|
||||||
|
|
||||||
visited.add(dependency.getGroup() + ":" + dependency.getName() + ":" + dependency.getVersion());
|
visited.add(dependency.getGroup() + ":" + dependency.getName() + ":" + dependency.getVersion());
|
||||||
|
@ -110,11 +108,11 @@ public final class NestedDependencyProvider implements NestedJarProvider {
|
||||||
Collection<Task> jarTasks = dependencyProject.getTasksByName("jar", false);
|
Collection<Task> jarTasks = dependencyProject.getTasksByName("jar", false);
|
||||||
|
|
||||||
for (Task task : remapJarTasks.isEmpty() ? jarTasks : remapJarTasks) {
|
for (Task task : remapJarTasks.isEmpty() ? jarTasks : remapJarTasks) {
|
||||||
if (task instanceof RemapJarTask) {
|
if (task instanceof RemapJarTask remapJarTask) {
|
||||||
File file = ((RemapJarTask) task).getArchivePath();
|
File file = remapJarTask.getArchiveFile().get().getAsFile();
|
||||||
fileList.add(new DependencyInfo<>(projectDependency, new ProjectDependencyMetaExtractor(), file));
|
fileList.add(new DependencyInfo<>(projectDependency, new ProjectDependencyMetaExtractor(), file));
|
||||||
} else if (task instanceof AbstractArchiveTask) {
|
} else if (task instanceof AbstractArchiveTask abstractArchiveTask) {
|
||||||
File file = ((AbstractArchiveTask) task).getArchivePath();
|
File file = abstractArchiveTask.getArchiveFile().get().getAsFile();
|
||||||
fileList.add(new DependencyInfo<>(projectDependency, new ProjectDependencyMetaExtractor(), file));
|
fileList.add(new DependencyInfo<>(projectDependency, new ProjectDependencyMetaExtractor(), file));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,17 +206,7 @@ public final class NestedDependencyProvider implements NestedJarProvider {
|
||||||
return LoomGradlePlugin.GSON.toJson(jsonObject);
|
return LoomGradlePlugin.GSON.toJson(jsonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class DependencyInfo<D> {
|
private record DependencyInfo<D>(D dependency, DependencyMetaExtractor<D> metaExtractor, File file) {
|
||||||
final D dependency;
|
|
||||||
final DependencyMetaExtractor<D> metaExtractor;
|
|
||||||
final File file;
|
|
||||||
|
|
||||||
DependencyInfo(D dependency, DependencyMetaExtractor<D> metaExtractor, File file) {
|
|
||||||
this.dependency = dependency;
|
|
||||||
this.metaExtractor = metaExtractor;
|
|
||||||
this.file = file;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void validateInputs() {
|
public void validateInputs() {
|
||||||
if (!file.exists()) {
|
if (!file.exists()) {
|
||||||
throw new RuntimeException("Failed to include nested jars, as it could not be found @ " + file.getAbsolutePath());
|
throw new RuntimeException("Failed to include nested jars, as it could not be found @ " + file.getAbsolutePath());
|
||||||
|
|
|
@ -67,7 +67,7 @@ public final class CompileConfiguration {
|
||||||
data.createLazyConfiguration(Constants.Configurations.UNPICK_CLASSPATH);
|
data.createLazyConfiguration(Constants.Configurations.UNPICK_CLASSPATH);
|
||||||
|
|
||||||
for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) {
|
for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) {
|
||||||
data.createLazyConfiguration(entry.getSourceConfiguration())
|
data.createLazyConfiguration(entry.sourceConfiguration())
|
||||||
.configure(configuration -> configuration.setTransitive(true));
|
.configure(configuration -> configuration.setTransitive(true));
|
||||||
|
|
||||||
// Don't get transitive deps of already remapped mods
|
// Don't get transitive deps of already remapped mods
|
||||||
|
@ -77,7 +77,7 @@ public final class CompileConfiguration {
|
||||||
extendsFrom(entry.getTargetConfiguration(configurations), entry.getRemappedConfiguration(), project);
|
extendsFrom(entry.getTargetConfiguration(configurations), entry.getRemappedConfiguration(), project);
|
||||||
|
|
||||||
if (entry.isOnModCompileClasspath()) {
|
if (entry.isOnModCompileClasspath()) {
|
||||||
extendsFrom(Constants.Configurations.MOD_COMPILE_CLASSPATH, entry.getSourceConfiguration(), project);
|
extendsFrom(Constants.Configurations.MOD_COMPILE_CLASSPATH, entry.sourceConfiguration(), project);
|
||||||
extendsFrom(Constants.Configurations.MOD_COMPILE_CLASSPATH_MAPPED, entry.getRemappedConfiguration(), project);
|
extendsFrom(Constants.Configurations.MOD_COMPILE_CLASSPATH_MAPPED, entry.getRemappedConfiguration(), project);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,8 +100,8 @@ public abstract class DependencyProvider {
|
||||||
private String resolvedVersion = null;
|
private String resolvedVersion = null;
|
||||||
|
|
||||||
public static DependencyInfo create(Project project, Dependency dependency, Configuration sourceConfiguration) {
|
public static DependencyInfo create(Project project, Dependency dependency, Configuration sourceConfiguration) {
|
||||||
if (dependency instanceof SelfResolvingDependency) {
|
if (dependency instanceof SelfResolvingDependency selfResolvingDependency) {
|
||||||
return new FileDependencyInfo(project, (SelfResolvingDependency) dependency, sourceConfiguration);
|
return new FileDependencyInfo(project, selfResolvingDependency, sourceConfiguration);
|
||||||
} else {
|
} else {
|
||||||
return new DependencyInfo(project, dependency, sourceConfiguration);
|
return new DependencyInfo(project, dependency, sourceConfiguration);
|
||||||
}
|
}
|
||||||
|
@ -138,8 +138,8 @@ public abstract class DependencyProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<File> resolve() {
|
public Set<File> resolve() {
|
||||||
if (dependency instanceof SelfResolvingDependency) {
|
if (dependency instanceof SelfResolvingDependency selfResolvingDependency) {
|
||||||
return ((SelfResolvingDependency) dependency).resolve();
|
return selfResolvingDependency.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
return sourceConfiguration.files(dependency);
|
return sourceConfiguration.files(dependency);
|
||||||
|
@ -189,14 +189,11 @@ public abstract class DependencyProvider {
|
||||||
Set<File> files = dependency.resolve();
|
Set<File> files = dependency.resolve();
|
||||||
this.resolvedFiles = files;
|
this.resolvedFiles = files;
|
||||||
switch (files.size()) {
|
switch (files.size()) {
|
||||||
case 0: //Don't think Gradle would ever let you do this
|
case 0 -> //Don't think Gradle would ever let you do this
|
||||||
throw new IllegalStateException("Empty dependency?");
|
throw new IllegalStateException("Empty dependency?");
|
||||||
|
case 1 -> //Single file dependency
|
||||||
case 1: //Single file dependency
|
|
||||||
classifierToFile.put("", Iterables.getOnlyElement(files));
|
classifierToFile.put("", Iterables.getOnlyElement(files));
|
||||||
break;
|
default -> { //File collection, try work out the classifiers
|
||||||
|
|
||||||
default: //File collection, try work out the classifiers
|
|
||||||
List<File> sortedFiles = files.stream().sorted(Comparator.comparing(File::getName, Comparator.comparingInt(String::length))).collect(Collectors.toList());
|
List<File> sortedFiles = files.stream().sorted(Comparator.comparing(File::getName, Comparator.comparingInt(String::length))).collect(Collectors.toList());
|
||||||
//First element in sortedFiles is the one with the shortest name, we presume all the others are different classifier types of this
|
//First element in sortedFiles is the one with the shortest name, we presume all the others are different classifier types of this
|
||||||
File shortest = sortedFiles.remove(0);
|
File shortest = sortedFiles.remove(0);
|
||||||
|
@ -223,6 +220,7 @@ public abstract class DependencyProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (dependency.getGroup() != null && dependency.getVersion() != null) {
|
if (dependency.getGroup() != null && dependency.getVersion() != null) {
|
||||||
group = dependency.getGroup();
|
group = dependency.getGroup();
|
||||||
|
|
|
@ -51,7 +51,7 @@ public final class MavenPublication {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Configuration compileModsConfig = p.getConfigurations().getByName(entry.getSourceConfiguration());
|
Configuration compileModsConfig = p.getConfigurations().getByName(entry.sourceConfiguration());
|
||||||
|
|
||||||
// add modsCompile to maven-publish
|
// add modsCompile to maven-publish
|
||||||
PublishingExtension mavenPublish = p.getExtensions().findByType(PublishingExtension.class);
|
PublishingExtension mavenPublish = p.getExtensions().findByType(PublishingExtension.class);
|
||||||
|
@ -92,7 +92,7 @@ public final class MavenPublication {
|
||||||
depNode.appendNode("groupId", dependency.getGroup());
|
depNode.appendNode("groupId", dependency.getGroup());
|
||||||
depNode.appendNode("artifactId", dependency.getName());
|
depNode.appendNode("artifactId", dependency.getName());
|
||||||
depNode.appendNode("version", dependency.getVersion());
|
depNode.appendNode("version", dependency.getVersion());
|
||||||
depNode.appendNode("scope", entry.getMavenScope());
|
depNode.appendNode("scope", entry.mavenScope());
|
||||||
|
|
||||||
if (!(dependency instanceof ModuleDependency)) {
|
if (!(dependency instanceof ModuleDependency)) {
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -27,35 +27,11 @@ package net.fabricmc.loom.configuration;
|
||||||
import org.gradle.api.artifacts.ConfigurationContainer;
|
import org.gradle.api.artifacts.ConfigurationContainer;
|
||||||
import org.gradle.api.plugins.JavaPlugin;
|
import org.gradle.api.plugins.JavaPlugin;
|
||||||
|
|
||||||
public class RemappedConfigurationEntry {
|
public record RemappedConfigurationEntry(String sourceConfiguration, String targetConfiguration, boolean isOnModCompileClasspath, String mavenScope) {
|
||||||
private final String sourceConfiguration;
|
|
||||||
private final String targetConfiguration;
|
|
||||||
private final String mavenScope;
|
|
||||||
private final boolean isOnModCompileClasspath;
|
|
||||||
|
|
||||||
public RemappedConfigurationEntry(String sourceConfiguration, String targetConfiguration, boolean isOnModCompileClasspath, String mavenScope) {
|
|
||||||
this.sourceConfiguration = sourceConfiguration;
|
|
||||||
this.targetConfiguration = targetConfiguration;
|
|
||||||
this.isOnModCompileClasspath = isOnModCompileClasspath;
|
|
||||||
this.mavenScope = mavenScope;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMavenScope() {
|
|
||||||
return mavenScope;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasMavenScope() {
|
public boolean hasMavenScope() {
|
||||||
return mavenScope != null && !mavenScope.isEmpty();
|
return mavenScope != null && !mavenScope.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isOnModCompileClasspath() {
|
|
||||||
return isOnModCompileClasspath;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSourceConfiguration() {
|
|
||||||
return sourceConfiguration;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRemappedConfiguration() {
|
public String getRemappedConfiguration() {
|
||||||
return sourceConfiguration + "Mapped";
|
return sourceConfiguration + "Mapped";
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,6 @@ import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.gradle.api.Project;
|
import org.gradle.api.Project;
|
||||||
import org.gradle.api.tasks.SourceSet;
|
import org.gradle.api.tasks.SourceSet;
|
||||||
import org.gradle.plugins.ide.eclipse.model.EclipseModel;
|
import org.gradle.plugins.ide.eclipse.model.EclipseModel;
|
||||||
|
@ -222,7 +221,7 @@ public class RunConfig {
|
||||||
String dummyConfig;
|
String dummyConfig;
|
||||||
|
|
||||||
try (InputStream input = SetupIntelijRunConfigs.class.getClassLoader().getResourceAsStream(dummy)) {
|
try (InputStream input = SetupIntelijRunConfigs.class.getClassLoader().getResourceAsStream(dummy)) {
|
||||||
dummyConfig = IOUtils.toString(input, StandardCharsets.UTF_8);
|
dummyConfig = new String(input.readAllBytes(), StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
|
|
||||||
dummyConfig = dummyConfig.replace("%NAME%", configName);
|
dummyConfig = dummyConfig.replace("%NAME%", configName);
|
||||||
|
|
|
@ -42,7 +42,6 @@ import java.util.stream.Collectors;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.gradle.api.Project;
|
import org.gradle.api.Project;
|
||||||
import org.objectweb.asm.commons.Remapper;
|
import org.objectweb.asm.commons.Remapper;
|
||||||
import org.zeroturnaround.zip.ZipUtil;
|
import org.zeroturnaround.zip.ZipUtil;
|
||||||
|
@ -156,7 +155,7 @@ public class ModProcessor {
|
||||||
final Map<ModDependencyInfo, byte[]> accessWidenerMap = new HashMap<>();
|
final Map<ModDependencyInfo, byte[]> accessWidenerMap = new HashMap<>();
|
||||||
|
|
||||||
for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) {
|
for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) {
|
||||||
for (File inputFile : project.getConfigurations().getByName(entry.getSourceConfiguration()).getFiles()) {
|
for (File inputFile : project.getConfigurations().getByName(entry.sourceConfiguration()).getFiles()) {
|
||||||
if (remapList.stream().noneMatch(info -> info.getInputFile().equals(inputFile))) {
|
if (remapList.stream().noneMatch(info -> info.getInputFile().equals(inputFile))) {
|
||||||
project.getLogger().debug("Adding " + inputFile + " onto the remap classpath");
|
project.getLogger().debug("Adding " + inputFile + " onto the remap classpath");
|
||||||
|
|
||||||
|
@ -229,7 +228,7 @@ public class ModProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
try (InputStream inputstream = jarFile.getInputStream(entry)) {
|
try (InputStream inputstream = jarFile.getInputStream(entry)) {
|
||||||
jsonStr = IOUtils.toString(inputstream, StandardCharsets.UTF_8);
|
jsonStr = new String(inputstream.readAllBytes(), StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@ import java.util.jar.JarFile;
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.gradle.api.artifacts.Configuration;
|
import org.gradle.api.artifacts.Configuration;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
@ -80,7 +79,7 @@ public class ModDependencyInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
public File getRemappedDir() {
|
public File getRemappedDir() {
|
||||||
return new File(remapData.modStore, String.format("%s/%s/%s", getGroup().replace(".", "/"), name, version));
|
return new File(remapData.modStore(), String.format("%s/%s/%s", getGroup().replace(".", "/"), name, version));
|
||||||
}
|
}
|
||||||
|
|
||||||
public File getRemappedOutput() {
|
public File getRemappedOutput() {
|
||||||
|
@ -96,7 +95,7 @@ public class ModDependencyInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getGroup() {
|
private String getGroup() {
|
||||||
return getMappingsPrefix(remapData.mappingsSuffix) + "." + group;
|
return getMappingsPrefix(remapData.mappingsSuffix()) + "." + group;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getMappingsPrefix(String mappings) {
|
public static String getMappingsPrefix(String mappings) {
|
||||||
|
@ -121,7 +120,7 @@ public class ModDependencyInfo {
|
||||||
String pomTemplate;
|
String pomTemplate;
|
||||||
|
|
||||||
try (InputStream input = ModDependencyInfo.class.getClassLoader().getResourceAsStream("mod_compile_template.pom")) {
|
try (InputStream input = ModDependencyInfo.class.getClassLoader().getResourceAsStream("mod_compile_template.pom")) {
|
||||||
pomTemplate = IOUtils.toString(input, StandardCharsets.UTF_8);
|
pomTemplate = new String(input.readAllBytes(), StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
|
|
||||||
pomTemplate = pomTemplate
|
pomTemplate = pomTemplate
|
||||||
|
|
|
@ -26,12 +26,5 @@ package net.fabricmc.loom.configuration.processors.dependency;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
public class RemapData {
|
public record RemapData(String mappingsSuffix, File modStore) {
|
||||||
public final String mappingsSuffix;
|
|
||||||
public final File modStore;
|
|
||||||
|
|
||||||
public RemapData(String mappingsSuffix, File modStore) {
|
|
||||||
this.mappingsSuffix = mappingsSuffix;
|
|
||||||
this.modStore = modStore;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,7 @@ public class LaunchProvider extends DependencyProvider {
|
||||||
.property("client", "org.lwjgl.librarypath", getExtension().getNativesDirectory().getAbsolutePath())
|
.property("client", "org.lwjgl.librarypath", getExtension().getNativesDirectory().getAbsolutePath())
|
||||||
|
|
||||||
.argument("client", "--assetIndex")
|
.argument("client", "--assetIndex")
|
||||||
.argument("client", getExtension().getMinecraftProvider().getVersionInfo().getAssetIndex().getFabricId(getExtension().getMinecraftProvider().getMinecraftVersion()))
|
.argument("client", getExtension().getMinecraftProvider().getVersionInfo().assetIndex().fabricId(getExtension().getMinecraftProvider().getMinecraftVersion()))
|
||||||
.argument("client", "--assetsDir")
|
.argument("client", "--assetsDir")
|
||||||
.argument("client", new File(getExtension().getUserCache(), "assets").getAbsolutePath());
|
.argument("client", new File(getExtension().getUserCache(), "assets").getAbsolutePath());
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ public class LaunchProvider extends DependencyProvider {
|
||||||
private void writeRemapClassPath() {
|
private void writeRemapClassPath() {
|
||||||
List<String> inputConfigurations = new ArrayList<>();
|
List<String> inputConfigurations = new ArrayList<>();
|
||||||
inputConfigurations.add(Constants.Configurations.LOADER_DEPENDENCIES);
|
inputConfigurations.add(Constants.Configurations.LOADER_DEPENDENCIES);
|
||||||
inputConfigurations.addAll(Constants.MOD_COMPILE_ENTRIES.stream().map(RemappedConfigurationEntry::getSourceConfiguration).collect(Collectors.toList()));
|
inputConfigurations.addAll(Constants.MOD_COMPILE_ENTRIES.stream().map(RemappedConfigurationEntry::sourceConfiguration).collect(Collectors.toList()));
|
||||||
|
|
||||||
List<File> remapClasspath = new ArrayList<>();
|
List<File> remapClasspath = new ArrayList<>();
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ public class LaunchProvider extends DependencyProvider {
|
||||||
.collect(Collectors.joining(File.pathSeparator));
|
.collect(Collectors.joining(File.pathSeparator));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Files.write(getRemapClasspathFile().toPath(), str.getBytes(StandardCharsets.UTF_8));
|
Files.writeString(getRemapClasspathFile().toPath(), str);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException("Failed to generate remap classpath", e);
|
throw new RuntimeException("Failed to generate remap classpath", e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,6 @@ import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
import org.gradle.api.GradleException;
|
import org.gradle.api.GradleException;
|
||||||
import org.gradle.api.Project;
|
import org.gradle.api.Project;
|
||||||
import org.gradle.api.logging.Logger;
|
import org.gradle.api.logging.Logger;
|
||||||
|
@ -75,7 +74,7 @@ public class MinecraftProvider extends DependencyProvider {
|
||||||
downloadMcJson(offline);
|
downloadMcJson(offline);
|
||||||
|
|
||||||
try (FileReader reader = new FileReader(minecraftJson)) {
|
try (FileReader reader = new FileReader(minecraftJson)) {
|
||||||
versionInfo = LoomGradlePlugin.GSON.fromJson(reader, MinecraftVersionMeta.class);
|
versionInfo = LoomGradlePlugin.OBJECT_MAPPER.readValue(reader, MinecraftVersionMeta.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add Loom as an annotation processor
|
// Add Loom as an annotation processor
|
||||||
|
@ -140,7 +139,7 @@ public class MinecraftProvider extends DependencyProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
String versionManifest = Files.asCharSource(versionManifestJson, StandardCharsets.UTF_8).read();
|
String versionManifest = Files.asCharSource(versionManifestJson, StandardCharsets.UTF_8).read();
|
||||||
ManifestVersion mcManifest = new GsonBuilder().create().fromJson(versionManifest, ManifestVersion.class);
|
ManifestVersion mcManifest = LoomGradlePlugin.OBJECT_MAPPER.readValue(versionManifest, ManifestVersion.class);
|
||||||
|
|
||||||
Optional<ManifestVersion.Versions> optionalVersion = Optional.empty();
|
Optional<ManifestVersion.Versions> optionalVersion = Optional.empty();
|
||||||
|
|
||||||
|
@ -153,7 +152,7 @@ public class MinecraftProvider extends DependencyProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!optionalVersion.isPresent()) {
|
if (!optionalVersion.isPresent()) {
|
||||||
optionalVersion = mcManifest.versions.stream().filter(versions -> versions.id.equalsIgnoreCase(minecraftVersion)).findFirst();
|
optionalVersion = mcManifest.versions().stream().filter(versions -> versions.id.equalsIgnoreCase(minecraftVersion)).findFirst();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (optionalVersion.isPresent()) {
|
if (optionalVersion.isPresent()) {
|
||||||
|
@ -197,8 +196,8 @@ public class MinecraftProvider extends DependencyProvider {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ManifestVersion manifest = new GsonBuilder().create().fromJson(Files.asCharSource(versionManifestJson, StandardCharsets.UTF_8).read(), ManifestVersion.class);
|
ManifestVersion manifest = LoomGradlePlugin.OBJECT_MAPPER.readValue(Files.asCharSource(versionManifestJson, StandardCharsets.UTF_8).read(), ManifestVersion.class);
|
||||||
Optional<ManifestVersion.Versions> version = manifest.versions.stream().filter(versions -> versions.id.equalsIgnoreCase(minecraftVersion)).findFirst();
|
Optional<ManifestVersion.Versions> version = manifest.versions().stream().filter(versions -> versions.id.equalsIgnoreCase(minecraftVersion)).findFirst();
|
||||||
|
|
||||||
// fail if the expected mc version was not found, will download the file again.
|
// fail if the expected mc version was not found, will download the file again.
|
||||||
return version.isPresent();
|
return version.isPresent();
|
||||||
|
@ -209,11 +208,11 @@ public class MinecraftProvider extends DependencyProvider {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MinecraftVersionMeta.Download client = versionInfo.getDownload("client");
|
MinecraftVersionMeta.Download client = versionInfo.download("client");
|
||||||
MinecraftVersionMeta.Download server = versionInfo.getDownload("server");
|
MinecraftVersionMeta.Download server = versionInfo.download("server");
|
||||||
|
|
||||||
HashedDownloadUtil.downloadIfInvalid(new URL(client.getUrl()), minecraftClientJar, client.getSha1(), logger, false);
|
HashedDownloadUtil.downloadIfInvalid(new URL(client.url()), minecraftClientJar, client.sha1(), logger, false);
|
||||||
HashedDownloadUtil.downloadIfInvalid(new URL(server.getUrl()), minecraftServerJar, server.getSha1(), logger, false);
|
HashedDownloadUtil.downloadIfInvalid(new URL(server.url()), minecraftServerJar, server.sha1(), logger, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mergeJars(Logger logger) throws IOException {
|
private void mergeJars(Logger logger) throws IOException {
|
||||||
|
|
|
@ -28,7 +28,6 @@ import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.nio.file.FileSystem;
|
import java.nio.file.FileSystem;
|
||||||
import java.nio.file.FileSystems;
|
import java.nio.file.FileSystems;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
@ -259,7 +258,7 @@ public class MappingsProvider extends DependencyProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
private UnpickMetadata parseUnpickMetadata(Path input) throws IOException {
|
private UnpickMetadata parseUnpickMetadata(Path input) throws IOException {
|
||||||
JsonObject jsonObject = LoomGradlePlugin.GSON.fromJson(new String(Files.readAllBytes(input), StandardCharsets.UTF_8), JsonObject.class);
|
JsonObject jsonObject = LoomGradlePlugin.GSON.fromJson(Files.readString(input), JsonObject.class);
|
||||||
|
|
||||||
if (!jsonObject.has("version") || jsonObject.get("version").getAsInt() != 1) {
|
if (!jsonObject.has("version") || jsonObject.get("version").getAsInt() != 1) {
|
||||||
throw new UnsupportedOperationException("Unsupported unpick version");
|
throw new UnsupportedOperationException("Unsupported unpick version");
|
||||||
|
@ -409,13 +408,6 @@ public class MappingsProvider extends DependencyProvider {
|
||||||
return hasUnpickDefinitions;
|
return hasUnpickDefinitions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class UnpickMetadata {
|
public record UnpickMetadata(String unpickGroup, String unpickVersion) {
|
||||||
public final String unpickGroup;
|
|
||||||
public final String unpickVersion;
|
|
||||||
|
|
||||||
public UnpickMetadata(String unpickGroup, String unpickVersion) {
|
|
||||||
this.unpickGroup = unpickGroup;
|
|
||||||
this.unpickVersion = unpickVersion;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,15 +123,15 @@ public class MojangMappingsDependency implements SelfResolvingDependency {
|
||||||
private MappingSet getMappingsSet(Path clientMappings, Path serverMappings) throws IOException {
|
private MappingSet getMappingsSet(Path clientMappings, Path serverMappings) throws IOException {
|
||||||
MinecraftVersionMeta versionInfo = extension.getMinecraftProvider().getVersionInfo();
|
MinecraftVersionMeta versionInfo = extension.getMinecraftProvider().getVersionInfo();
|
||||||
|
|
||||||
if (versionInfo.getDownload(MANIFEST_CLIENT_MAPPINGS) == null) {
|
if (versionInfo.download(MANIFEST_CLIENT_MAPPINGS) == null) {
|
||||||
throw new RuntimeException("Failed to find official mojang mappings for " + getVersion());
|
throw new RuntimeException("Failed to find official mojang mappings for " + getVersion());
|
||||||
}
|
}
|
||||||
|
|
||||||
MinecraftVersionMeta.Download clientMappingsDownload = versionInfo.getDownload(MANIFEST_CLIENT_MAPPINGS);
|
MinecraftVersionMeta.Download clientMappingsDownload = versionInfo.download(MANIFEST_CLIENT_MAPPINGS);
|
||||||
MinecraftVersionMeta.Download serverMappingsDownload = versionInfo.getDownload(MANIFEST_CLIENT_MAPPINGS);
|
MinecraftVersionMeta.Download serverMappingsDownload = versionInfo.download(MANIFEST_CLIENT_MAPPINGS);
|
||||||
|
|
||||||
HashedDownloadUtil.downloadIfInvalid(new URL(clientMappingsDownload.getUrl()), clientMappings.toFile(), clientMappingsDownload.getSha1(), project.getLogger(), false);
|
HashedDownloadUtil.downloadIfInvalid(new URL(clientMappingsDownload.url()), clientMappings.toFile(), clientMappingsDownload.sha1(), project.getLogger(), false);
|
||||||
HashedDownloadUtil.downloadIfInvalid(new URL(serverMappingsDownload.getUrl()), serverMappings.toFile(), clientMappingsDownload.getSha1(), project.getLogger(), false);
|
HashedDownloadUtil.downloadIfInvalid(new URL(serverMappingsDownload.url()), serverMappings.toFile(), clientMappingsDownload.sha1(), project.getLogger(), false);
|
||||||
|
|
||||||
MappingSet mappings = MappingSet.create();
|
MappingSet mappings = MappingSet.create();
|
||||||
|
|
||||||
|
@ -208,8 +208,8 @@ public class MojangMappingsDependency implements SelfResolvingDependency {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean contentEquals(Dependency dependency) {
|
public boolean contentEquals(Dependency dependency) {
|
||||||
if (dependency instanceof MojangMappingsDependency) {
|
if (dependency instanceof MojangMappingsDependency mojangMappingsDependency) {
|
||||||
return ((MojangMappingsDependency) dependency).extension.getMinecraftProvider().getMinecraftVersion().equals(getVersion());
|
return mojangMappingsDependency.extension.getMinecraftProvider().getMinecraftVersion().equals(getVersion());
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -24,12 +24,10 @@
|
||||||
|
|
||||||
package net.fabricmc.loom.configuration.providers.minecraft;
|
package net.fabricmc.loom.configuration.providers.minecraft;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class ManifestVersion {
|
public record ManifestVersion(List<Versions> versions, Map<String, String> latest) {
|
||||||
public List<Versions> versions = new ArrayList<>();
|
|
||||||
|
|
||||||
public static class Versions {
|
public static class Versions {
|
||||||
public String id, url, sha1;
|
public String id, url, sha1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,9 +40,9 @@ public class MinecraftLibraryProvider {
|
||||||
|
|
||||||
initFiles(project, minecraftProvider);
|
initFiles(project, minecraftProvider);
|
||||||
|
|
||||||
for (MinecraftVersionMeta.Library library : versionInfo.getLibraries()) {
|
for (MinecraftVersionMeta.Library library : versionInfo.libraries()) {
|
||||||
if (library.isValidForOS() && !library.hasNatives() && library.getArtifact() != null) {
|
if (library.isValidForOS() && !library.hasNatives() && library.artifact() != null) {
|
||||||
project.getDependencies().add(Constants.Configurations.MINECRAFT_DEPENDENCIES, project.getDependencies().module(library.getName()));
|
project.getDependencies().add(Constants.Configurations.MINECRAFT_DEPENDENCIES, project.getDependencies().module(library.name()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,11 +89,11 @@ public class MinecraftNativesProvider {
|
||||||
|
|
||||||
nativesDir.mkdirs();
|
nativesDir.mkdirs();
|
||||||
|
|
||||||
for (MinecraftVersionMeta.Classifier library : getNatives()) {
|
for (MinecraftVersionMeta.Download library : getNatives()) {
|
||||||
File libJarFile = library.getRelativeFile(jarStore);
|
File libJarFile = library.relativeFile(jarStore);
|
||||||
|
|
||||||
if (!offline) {
|
if (!offline) {
|
||||||
HashedDownloadUtil.downloadIfInvalid(new URL(library.getUrl()), libJarFile, library.getSha1(), project.getLogger(), false);
|
HashedDownloadUtil.downloadIfInvalid(new URL(library.url()), libJarFile, library.sha1(), project.getLogger(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!libJarFile.exists()) {
|
if (!libJarFile.exists()) {
|
||||||
|
@ -104,19 +104,19 @@ public class MinecraftNativesProvider {
|
||||||
|
|
||||||
// Store a file containing the hash of the extracted natives, used on subsequent runs to skip extracting all the natives if they haven't changed
|
// Store a file containing the hash of the extracted natives, used on subsequent runs to skip extracting all the natives if they haven't changed
|
||||||
File libSha1File = new File(nativesDir, libJarFile.getName() + ".sha1");
|
File libSha1File = new File(nativesDir, libJarFile.getName() + ".sha1");
|
||||||
FileUtils.writeStringToFile(libSha1File, library.getSha1(), StandardCharsets.UTF_8);
|
FileUtils.writeStringToFile(libSha1File, library.sha1(), StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean requiresExtract() {
|
private boolean requiresExtract() {
|
||||||
List<MinecraftVersionMeta.Classifier> natives = getNatives();
|
List<MinecraftVersionMeta.Download> natives = getNatives();
|
||||||
|
|
||||||
if (natives.isEmpty()) {
|
if (natives.isEmpty()) {
|
||||||
throw new IllegalStateException("No natives found for the current system");
|
throw new IllegalStateException("No natives found for the current system");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (MinecraftVersionMeta.Classifier library : natives) {
|
for (MinecraftVersionMeta.Download library : natives) {
|
||||||
File libJarFile = library.getRelativeFile(jarStore);
|
File libJarFile = library.relativeFile(jarStore);
|
||||||
File libSha1File = new File(nativesDir, libJarFile.getName() + ".sha1");
|
File libSha1File = new File(nativesDir, libJarFile.getName() + ".sha1");
|
||||||
|
|
||||||
if (!libSha1File.exists()) {
|
if (!libSha1File.exists()) {
|
||||||
|
@ -126,7 +126,7 @@ public class MinecraftNativesProvider {
|
||||||
try {
|
try {
|
||||||
String sha1 = FileUtils.readFileToString(libSha1File, StandardCharsets.UTF_8);
|
String sha1 = FileUtils.readFileToString(libSha1File, StandardCharsets.UTF_8);
|
||||||
|
|
||||||
if (!sha1.equalsIgnoreCase(library.getSha1())) {
|
if (!sha1.equalsIgnoreCase(library.sha1())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
@ -139,10 +139,10 @@ public class MinecraftNativesProvider {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<MinecraftVersionMeta.Classifier> getNatives() {
|
private List<MinecraftVersionMeta.Download> getNatives() {
|
||||||
return extension.getMinecraftProvider().getVersionInfo().getLibraries().stream()
|
return extension.getMinecraftProvider().getVersionInfo().libraries().stream()
|
||||||
.filter((MinecraftVersionMeta.Library::hasNativesForOS))
|
.filter((MinecraftVersionMeta.Library::hasNativesForOS))
|
||||||
.map(MinecraftVersionMeta.Library::getClassifierForOS)
|
.map(MinecraftVersionMeta.Library::classifierForOS)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,108 +29,35 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
|
|
||||||
import net.fabricmc.loom.util.OperatingSystem;
|
import net.fabricmc.loom.util.OperatingSystem;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public final class MinecraftVersionMeta {
|
public record MinecraftVersionMeta(
|
||||||
private JsonObject arguments;
|
Object arguments,
|
||||||
private AssetIndex assetIndex;
|
AssetIndex assetIndex,
|
||||||
private String assets;
|
String assets,
|
||||||
private int complianceLevel;
|
int complianceLevel,
|
||||||
private Map<String, Download> downloads;
|
Map<String, Download> downloads,
|
||||||
private String id;
|
String id,
|
||||||
private List<Library> libraries;
|
List<Library> libraries,
|
||||||
private JsonObject logging;
|
Object logging,
|
||||||
private String mainClass;
|
String mainClass,
|
||||||
private int minimumLauncherVersion;
|
int minimumLauncherVersion,
|
||||||
private String releaseTime;
|
String releaseTime,
|
||||||
private String time;
|
String time,
|
||||||
private String type;
|
String type
|
||||||
|
) {
|
||||||
public Download getDownload(String key) {
|
public Download download(String key) {
|
||||||
return getDownloads().get(key);
|
return downloads().get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public JsonObject getArguments() {
|
public record AssetIndex(String id, long totalSize, String path, String sha1, long size, String url) {
|
||||||
return arguments;
|
public String fabricId(String version) {
|
||||||
}
|
|
||||||
|
|
||||||
public AssetIndex getAssetIndex() {
|
|
||||||
return assetIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAssets() {
|
|
||||||
return assets;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getComplianceLevel() {
|
|
||||||
return complianceLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, Download> getDownloads() {
|
|
||||||
return downloads;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Library> getLibraries() {
|
|
||||||
return libraries;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JsonObject getLogging() {
|
|
||||||
return logging;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMainClass() {
|
|
||||||
return mainClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMinimumLauncherVersion() {
|
|
||||||
return minimumLauncherVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getReleaseTime() {
|
|
||||||
return releaseTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTime() {
|
|
||||||
return time;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getType() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class AssetIndex extends Downloadable {
|
|
||||||
private String id;
|
|
||||||
private long totalSize;
|
|
||||||
|
|
||||||
public String getFabricId(String version) {
|
|
||||||
return id.equals(version) ? version : version + "-" + id;
|
return id.equals(version) ? version : version + "-" + id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getTotalSize() {
|
public record Library(Downloads downloads, String name, Map<String, String> natives, List<Rule> rules, Object extract) {
|
||||||
return totalSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class Download extends Downloadable {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class Library {
|
|
||||||
private Downloads downloads;
|
|
||||||
private String name;
|
|
||||||
private Map<String, String> natives;
|
|
||||||
private List<Rule> rules;
|
|
||||||
|
|
||||||
public boolean isValidForOS() {
|
public boolean isValidForOS() {
|
||||||
if (rules == null || rules.isEmpty()) {
|
if (rules == null || rules.isEmpty()) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -161,117 +88,45 @@ public final class MinecraftVersionMeta {
|
||||||
return isValidForOS();
|
return isValidForOS();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Classifier getClassifierForOS() {
|
public Download classifierForOS() {
|
||||||
return getDownloads().getClassifier(natives.get(OperatingSystem.getOS()));
|
return downloads().classifier(natives.get(OperatingSystem.getOS()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Downloads getDownloads() {
|
public Download artifact() {
|
||||||
return downloads;
|
if (downloads() == null) {
|
||||||
}
|
|
||||||
|
|
||||||
public Artifact getArtifact() {
|
|
||||||
if (getDownloads() == null) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return getDownloads().getArtifact();
|
return downloads().artifact();
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, String> getNatives() {
|
|
||||||
return natives;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Rule> getRules() {
|
|
||||||
return rules;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class Downloads {
|
public record Downloads(Download artifact, Map<String, Download> classifiers) {
|
||||||
private Artifact artifact;
|
public Download classifier(String os) {
|
||||||
private Map<String, Classifier> classifiers;
|
|
||||||
|
|
||||||
public Classifier getClassifier(String os) {
|
|
||||||
return classifiers.get(os);
|
return classifiers.get(os);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Artifact getArtifact() {
|
|
||||||
return artifact;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, Classifier> getClassifiers() {
|
public record Rule(String action, OS os) {
|
||||||
return classifiers;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class Artifact extends Downloadable {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class Classifier extends Downloadable {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class Rule {
|
|
||||||
private String action;
|
|
||||||
private OS os;
|
|
||||||
|
|
||||||
public boolean appliesToOS() {
|
public boolean appliesToOS() {
|
||||||
return getOS() == null || getOS().isValidForOS();
|
return os() == null || os().isValidForOS();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isAllowed() {
|
public boolean isAllowed() {
|
||||||
return getAction().equals("allow");
|
return action().equals("allow");
|
||||||
}
|
|
||||||
|
|
||||||
public String getAction() {
|
|
||||||
return action;
|
|
||||||
}
|
|
||||||
|
|
||||||
public OS getOS() {
|
|
||||||
return os;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class OS {
|
public record OS(String name) {
|
||||||
private String name;
|
|
||||||
|
|
||||||
public boolean isValidForOS() {
|
public boolean isValidForOS() {
|
||||||
return getName() == null || getName().equalsIgnoreCase(OperatingSystem.getOS());
|
return name() == null || name().equalsIgnoreCase(OperatingSystem.getOS());
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// A base class for everything that can be downloaded
|
public record Download(String path, String sha1, long size, String url) {
|
||||||
public abstract class Downloadable {
|
public File relativeFile(File baseDirectory) {
|
||||||
private String path;
|
Objects.requireNonNull(path(), "Cannot get relative file from a null path");
|
||||||
private String sha1;
|
return new File(baseDirectory, path());
|
||||||
private long size;
|
|
||||||
private String url;
|
|
||||||
|
|
||||||
public File getRelativeFile(File baseDirectory) {
|
|
||||||
Objects.requireNonNull(getPath(), "Cannot get relative file from a null path");
|
|
||||||
return new File(baseDirectory, getPath());
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPath() {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSha1() {
|
|
||||||
return sha1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getSize() {
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUrl() {
|
|
||||||
return url;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,23 +30,12 @@ import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class AssetIndex {
|
public record AssetIndex(Map<String, AssetObject> objects, boolean virtual) {
|
||||||
private final Map<String, AssetObject> objects;
|
|
||||||
private boolean virtual;
|
|
||||||
|
|
||||||
public AssetIndex() {
|
public AssetIndex() {
|
||||||
this.objects = new LinkedHashMap<>();
|
this(new LinkedHashMap<>(), false);
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, AssetObject> getFileMap() {
|
|
||||||
return this.objects;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<AssetObject> getUniqueObjects() {
|
public Set<AssetObject> getUniqueObjects() {
|
||||||
return new HashSet<>(this.objects.values());
|
return new HashSet<>(this.objects.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVirtual() {
|
|
||||||
return this.virtual;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,34 +25,5 @@
|
||||||
package net.fabricmc.loom.configuration.providers.minecraft.assets;
|
package net.fabricmc.loom.configuration.providers.minecraft.assets;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class AssetObject {
|
public record AssetObject(String hash, long size) {
|
||||||
private String hash;
|
|
||||||
private long size;
|
|
||||||
|
|
||||||
public String getHash() {
|
|
||||||
return this.hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getSize() {
|
|
||||||
return this.size;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
} else if ((o == null) || (getClass() != o.getClass())) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
AssetObject that = (AssetObject) o;
|
|
||||||
return this.size == that.size && this.hash.equals(that.hash);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int result = this.hash.hashCode();
|
|
||||||
result = 31 * result + (int) (this.size ^ this.size >>> 32);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,7 @@ public class MinecraftAssetsProvider {
|
||||||
boolean offline = project.getGradle().getStartParameter().isOffline();
|
boolean offline = project.getGradle().getStartParameter().isOffline();
|
||||||
|
|
||||||
MinecraftVersionMeta versionInfo = minecraftProvider.getVersionInfo();
|
MinecraftVersionMeta versionInfo = minecraftProvider.getVersionInfo();
|
||||||
MinecraftVersionMeta.AssetIndex assetIndex = versionInfo.getAssetIndex();
|
MinecraftVersionMeta.AssetIndex assetIndex = versionInfo.assetIndex();
|
||||||
|
|
||||||
// get existing cache files
|
// get existing cache files
|
||||||
File assets = new File(extension.getUserCache(), "assets");
|
File assets = new File(extension.getUserCache(), "assets");
|
||||||
|
@ -62,7 +62,7 @@ public class MinecraftAssetsProvider {
|
||||||
assets.mkdirs();
|
assets.mkdirs();
|
||||||
}
|
}
|
||||||
|
|
||||||
File assetsInfo = new File(assets, "indexes" + File.separator + assetIndex.getFabricId(minecraftProvider.getMinecraftVersion()) + ".json");
|
File assetsInfo = new File(assets, "indexes" + File.separator + assetIndex.fabricId(minecraftProvider.getMinecraftVersion()) + ".json");
|
||||||
|
|
||||||
project.getLogger().info(":downloading asset index");
|
project.getLogger().info(":downloading asset index");
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ public class MinecraftAssetsProvider {
|
||||||
throw new GradleException("Asset index not found at " + assetsInfo.getAbsolutePath());
|
throw new GradleException("Asset index not found at " + assetsInfo.getAbsolutePath());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
HashedDownloadUtil.downloadIfInvalid(new URL(assetIndex.getUrl()), assetsInfo, assetIndex.getSha1(), project.getLogger(), false);
|
HashedDownloadUtil.downloadIfInvalid(new URL(assetIndex.url()), assetsInfo, assetIndex.sha1(), project.getLogger(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Deque<ProgressLogger> loggers = new ConcurrentLinkedDeque<>();
|
Deque<ProgressLogger> loggers = new ConcurrentLinkedDeque<>();
|
||||||
|
@ -84,16 +84,16 @@ public class MinecraftAssetsProvider {
|
||||||
AssetIndex index;
|
AssetIndex index;
|
||||||
|
|
||||||
try (FileReader fileReader = new FileReader(assetsInfo)) {
|
try (FileReader fileReader = new FileReader(assetsInfo)) {
|
||||||
index = LoomGradlePlugin.GSON.fromJson(fileReader, AssetIndex.class);
|
index = LoomGradlePlugin.OBJECT_MAPPER.readValue(fileReader, AssetIndex.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
Stopwatch stopwatch = Stopwatch.createStarted();
|
Stopwatch stopwatch = Stopwatch.createStarted();
|
||||||
|
|
||||||
Map<String, AssetObject> parent = index.getFileMap();
|
Map<String, AssetObject> parent = index.objects();
|
||||||
|
|
||||||
for (Map.Entry<String, AssetObject> entry : parent.entrySet()) {
|
for (Map.Entry<String, AssetObject> entry : parent.entrySet()) {
|
||||||
AssetObject object = entry.getValue();
|
AssetObject object = entry.getValue();
|
||||||
String sha1 = object.getHash();
|
String sha1 = object.hash();
|
||||||
String filename = "objects" + File.separator + sha1.substring(0, 2) + File.separator + sha1;
|
String filename = "objects" + File.separator + sha1.substring(0, 2) + File.separator + sha1;
|
||||||
File file = new File(assets, filename);
|
File file = new File(assets, filename);
|
||||||
|
|
||||||
|
|
|
@ -89,7 +89,7 @@ public class LineNumberRemapper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void process(ProgressLogger logger, Path input, Path output) throws IOException {
|
public void process(ProgressLogger logger, Path input, Path output) throws IOException {
|
||||||
Files.walkFileTree(input, new SimpleFileVisitor<Path>() {
|
Files.walkFileTree(input, new SimpleFileVisitor<>() {
|
||||||
@Override
|
@Override
|
||||||
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
||||||
String rel = input.relativize(file).toString();
|
String rel = input.relativize(file).toString();
|
||||||
|
|
|
@ -54,7 +54,6 @@ import java.util.zip.ZipFile;
|
||||||
|
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.io.ByteStreams;
|
|
||||||
import org.benf.cfr.reader.api.CfrDriver;
|
import org.benf.cfr.reader.api.CfrDriver;
|
||||||
import org.benf.cfr.reader.api.ClassFileSource;
|
import org.benf.cfr.reader.api.ClassFileSource;
|
||||||
import org.benf.cfr.reader.api.OutputSinkFactory;
|
import org.benf.cfr.reader.api.OutputSinkFactory;
|
||||||
|
@ -134,36 +133,29 @@ public class FabricCFRDecompiler implements LoomDecompiler {
|
||||||
}
|
}
|
||||||
|
|
||||||
try (InputStream inputStream = inputZip.getInputStream(zipEntry)) {
|
try (InputStream inputStream = inputZip.getInputStream(zipEntry)) {
|
||||||
return Pair.make(ByteStreams.toByteArray(inputStream), path);
|
return Pair.make(inputStream.readAllBytes(), path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.withOutputSink(new OutputSinkFactory() {
|
.withOutputSink(new OutputSinkFactory() {
|
||||||
@Override
|
@Override
|
||||||
public List<SinkClass> getSupportedSinks(SinkType sinkType, Collection<SinkClass> available) {
|
public List<SinkClass> getSupportedSinks(SinkType sinkType, Collection<SinkClass> available) {
|
||||||
switch (sinkType) {
|
return switch (sinkType) {
|
||||||
case PROGRESS:
|
case PROGRESS -> Collections.singletonList(SinkClass.STRING);
|
||||||
return Collections.singletonList(SinkClass.STRING);
|
case JAVA -> Collections.singletonList(SinkClass.DECOMPILED);
|
||||||
case JAVA:
|
default -> Collections.emptyList();
|
||||||
return Collections.singletonList(SinkClass.DECOMPILED);
|
};
|
||||||
default:
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public <T> Sink<T> getSink(SinkType sinkType, SinkClass sinkClass) {
|
public <T> Sink<T> getSink(SinkType sinkType, SinkClass sinkClass) {
|
||||||
switch (sinkType) {
|
return switch (sinkType) {
|
||||||
case PROGRESS:
|
case PROGRESS -> (p) -> project.getLogger().debug((String) p);
|
||||||
return (p) -> project.getLogger().debug((String) p);
|
case JAVA -> (Sink<T>) decompiledSink(jos, addedDirectories);
|
||||||
case JAVA:
|
case EXCEPTION -> (e) -> project.getLogger().error((String) e);
|
||||||
return (Sink<T>) decompiledSink(jos, addedDirectories);
|
default -> null;
|
||||||
case EXCEPTION:
|
};
|
||||||
return (e) -> project.getLogger().error((String) e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
|
@ -173,7 +165,7 @@ public class FabricCFRDecompiler implements LoomDecompiler {
|
||||||
.filter(input -> input.endsWith(".class"))
|
.filter(input -> input.endsWith(".class"))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
ExecutorService executorService = Executors.newFixedThreadPool(metaData.numberOfThreads);
|
ExecutorService executorService = Executors.newFixedThreadPool(metaData.numberOfThreads());
|
||||||
List<Future<?>> futures = new LinkedList<>();
|
List<Future<?>> futures = new LinkedList<>();
|
||||||
|
|
||||||
for (String clazz : classes) {
|
for (String clazz : classes) {
|
||||||
|
|
|
@ -65,12 +65,12 @@ public abstract class AbstractFernFlowerDecompiler implements LoomDecompiler {
|
||||||
|
|
||||||
project.getLogging().captureStandardOutput(LogLevel.LIFECYCLE);
|
project.getLogging().captureStandardOutput(LogLevel.LIFECYCLE);
|
||||||
|
|
||||||
Map<String, Object> options = new HashMap<String, Object>() {{
|
Map<String, Object> options = new HashMap<>() {{
|
||||||
put(IFernflowerPreferences.DECOMPILE_GENERIC_SIGNATURES, "1");
|
put(IFernflowerPreferences.DECOMPILE_GENERIC_SIGNATURES, "1");
|
||||||
put(IFernflowerPreferences.BYTECODE_SOURCE_MAPPING, "1");
|
put(IFernflowerPreferences.BYTECODE_SOURCE_MAPPING, "1");
|
||||||
put(IFernflowerPreferences.REMOVE_SYNTHETIC, "1");
|
put(IFernflowerPreferences.REMOVE_SYNTHETIC, "1");
|
||||||
put(IFernflowerPreferences.LOG_LEVEL, "trace");
|
put(IFernflowerPreferences.LOG_LEVEL, "trace");
|
||||||
put(IFernflowerPreferences.THREADS, metaData.numberOfThreads);
|
put(IFernflowerPreferences.THREADS, metaData.numberOfThreads());
|
||||||
}};
|
}};
|
||||||
|
|
||||||
List<String> args = new ArrayList<>();
|
List<String> args = new ArrayList<>();
|
||||||
|
@ -79,10 +79,10 @@ public abstract class AbstractFernFlowerDecompiler implements LoomDecompiler {
|
||||||
args.add(absolutePathOf(compiledJar));
|
args.add(absolutePathOf(compiledJar));
|
||||||
args.add("-o=" + absolutePathOf(sourcesDestination));
|
args.add("-o=" + absolutePathOf(sourcesDestination));
|
||||||
args.add("-l=" + absolutePathOf(linemapDestination));
|
args.add("-l=" + absolutePathOf(linemapDestination));
|
||||||
args.add("-m=" + absolutePathOf(metaData.javaDocs));
|
args.add("-m=" + absolutePathOf(metaData.javaDocs()));
|
||||||
|
|
||||||
// TODO, Decompiler breaks on jemalloc, J9 module-info.class?
|
// TODO, Decompiler breaks on jemalloc, J9 module-info.class?
|
||||||
for (Path library : metaData.libraries) {
|
for (Path library : metaData.libraries()) {
|
||||||
args.add("-e=" + absolutePathOf(library));
|
args.add("-e=" + absolutePathOf(library));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,13 +30,11 @@ import java.nio.charset.StandardCharsets;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.gradle.api.Project;
|
import org.gradle.api.Project;
|
||||||
import org.gradle.api.tasks.TaskAction;
|
import org.gradle.api.tasks.TaskAction;
|
||||||
|
|
||||||
import net.fabricmc.loom.LoomGradleExtension;
|
import net.fabricmc.loom.LoomGradlePlugin;
|
||||||
import net.fabricmc.loom.configuration.ide.RunConfig;
|
import net.fabricmc.loom.configuration.ide.RunConfig;
|
||||||
import net.fabricmc.loom.configuration.ide.RunConfigSettings;
|
import net.fabricmc.loom.configuration.ide.RunConfigSettings;
|
||||||
|
|
||||||
|
@ -48,7 +46,6 @@ public class GenVsCodeProjectTask extends AbstractLoomTask {
|
||||||
@TaskAction
|
@TaskAction
|
||||||
public void genRuns() {
|
public void genRuns() {
|
||||||
Project project = getProject();
|
Project project = getProject();
|
||||||
LoomGradleExtension extension = getExtension();
|
|
||||||
File projectDir = project.file(".vscode");
|
File projectDir = project.file(".vscode");
|
||||||
|
|
||||||
if (!projectDir.exists()) {
|
if (!projectDir.exists()) {
|
||||||
|
@ -72,8 +69,7 @@ public class GenVsCodeProjectTask extends AbstractLoomTask {
|
||||||
settings.makeRunDir();
|
settings.makeRunDir();
|
||||||
}
|
}
|
||||||
|
|
||||||
Gson gson = new GsonBuilder().setPrettyPrinting().create();
|
String json = LoomGradlePlugin.GSON.toJson(launch);
|
||||||
String json = gson.toJson(launch);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
FileUtils.writeStringToFile(launchJson, json, StandardCharsets.UTF_8);
|
FileUtils.writeStringToFile(launchJson, json, StandardCharsets.UTF_8);
|
||||||
|
|
|
@ -34,7 +34,7 @@ import net.fabricmc.loom.configuration.RemappedConfigurationEntry;
|
||||||
|
|
||||||
public class Constants {
|
public class Constants {
|
||||||
public static final String LIBRARIES_BASE = "https://libraries.minecraft.net/";
|
public static final String LIBRARIES_BASE = "https://libraries.minecraft.net/";
|
||||||
public static final String RESOURCES_BASE = "http://resources.download.minecraft.net/";
|
public static final String RESOURCES_BASE = "https://resources.download.minecraft.net/";
|
||||||
public static final String VERSION_MANIFESTS = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json";
|
public static final String VERSION_MANIFESTS = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json";
|
||||||
|
|
||||||
public static final String SYSTEM_ARCH = System.getProperty("os.arch").equals("64") ? "64" : "32";
|
public static final String SYSTEM_ARCH = System.getProperty("os.arch").equals("64") ? "64" : "32";
|
||||||
|
|
|
@ -36,8 +36,8 @@ public final class GroovyXmlUtil {
|
||||||
|
|
||||||
public static Node getOrCreateNode(Node parent, String name) {
|
public static Node getOrCreateNode(Node parent, String name) {
|
||||||
for (Object object : parent.children()) {
|
for (Object object : parent.children()) {
|
||||||
if (object instanceof Node && isSameName(((Node) object).name(), name)) {
|
if (object instanceof Node node && isSameName(node.name(), name)) {
|
||||||
return (Node) object;
|
return node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,8 +46,8 @@ public final class GroovyXmlUtil {
|
||||||
|
|
||||||
public static Optional<Node> getNode(Node parent, String name) {
|
public static Optional<Node> getNode(Node parent, String name) {
|
||||||
for (Object object : parent.children()) {
|
for (Object object : parent.children()) {
|
||||||
if (object instanceof Node && isSameName(((Node) object).name(), name)) {
|
if (object instanceof Node node && isSameName(node.name(), name)) {
|
||||||
return Optional.of((Node) object);
|
return Optional.of(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,13 +59,13 @@ public final class GroovyXmlUtil {
|
||||||
return nodeName.equals(givenName);
|
return nodeName.equals(givenName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nodeName instanceof QName) {
|
if (nodeName instanceof QName qName) {
|
||||||
return ((QName) nodeName).matches(givenName);
|
return qName.matches(givenName);
|
||||||
}
|
}
|
||||||
|
|
||||||
// New groovy 3 (gradle 7) class
|
// New groovy 3 (gradle 7) class
|
||||||
if (nodeName instanceof groovy.namespace.QName) {
|
if (nodeName instanceof groovy.namespace.QName qName) {
|
||||||
return ((groovy.namespace.QName) nodeName).matches(givenName);
|
return qName.matches(givenName);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new UnsupportedOperationException("Cannot determine if " + nodeName.getClass() + " is the same as a String");
|
throw new UnsupportedOperationException("Cannot determine if " + nodeName.getClass() + " is the same as a String");
|
||||||
|
|
|
@ -234,7 +234,7 @@ public class SourceRemapper {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) {
|
for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) {
|
||||||
for (File inputFile : project.getConfigurations().getByName(entry.getSourceConfiguration()).getFiles()) {
|
for (File inputFile : project.getConfigurations().getByName(entry.sourceConfiguration()).getFiles()) {
|
||||||
m.getClassPath().add(inputFile.toPath());
|
m.getClassPath().add(inputFile.toPath());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,8 +61,8 @@ public final class StaticPathWatcher {
|
||||||
for (WatchEvent<?> event : key.pollEvents()) {
|
for (WatchEvent<?> event : key.pollEvents()) {
|
||||||
Object ctx = event.context();
|
Object ctx = event.context();
|
||||||
|
|
||||||
if (ctx instanceof Path) {
|
if (ctx instanceof Path path) {
|
||||||
changeCache.put(((Path) ctx).toAbsolutePath(), true);
|
changeCache.put(path.toAbsolutePath(), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue