parse fabric-installer.json for mod devenvs, add loaderLaunchMethod param for that purpose, tweak LineNumberAdjustmentVisitor
parent
1445b8240a
commit
79ec748a12
|
@ -24,6 +24,7 @@
|
|||
|
||||
package net.fabricmc.loom;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import net.fabricmc.loom.providers.MappingsProvider;
|
||||
import net.fabricmc.loom.providers.MinecraftMappedProvider;
|
||||
import net.fabricmc.loom.providers.MinecraftProvider;
|
||||
|
@ -41,6 +42,7 @@ import java.util.Objects;
|
|||
public class LoomGradleExtension {
|
||||
public String runDir = "run";
|
||||
public String refmapName;
|
||||
public String loaderLaunchMethod;
|
||||
public boolean remapMod = true;
|
||||
public boolean autoGenIDERuns = true;
|
||||
|
||||
|
@ -49,6 +51,8 @@ public class LoomGradleExtension {
|
|||
//Not to be set in the build.gradle
|
||||
private Project project;
|
||||
private LoomDependencyManager dependencyManager;
|
||||
private JsonObject installerJson;
|
||||
private int installerJsonPriority = Integer.MAX_VALUE; // 0+, higher = less prioritized
|
||||
|
||||
public LoomGradleExtension(Project project) {
|
||||
this.project = project;
|
||||
|
@ -62,6 +66,17 @@ public class LoomGradleExtension {
|
|||
return Collections.unmodifiableList(unmappedModsBuilt);
|
||||
}
|
||||
|
||||
public void setInstallerJson(JsonObject object, int priority) {
|
||||
if (installerJson == null || priority <= installerJsonPriority) {
|
||||
this.installerJson = object;
|
||||
this.installerJsonPriority = priority;
|
||||
}
|
||||
}
|
||||
|
||||
public JsonObject getInstallerJson() {
|
||||
return installerJson;
|
||||
}
|
||||
|
||||
public File getUserCache() {
|
||||
File userCache = new File(project.getGradle().getGradleUserHomeDir(), "caches" + File.separator + "fabric-loom");
|
||||
if (!userCache.exists()) {
|
||||
|
@ -96,6 +111,10 @@ public class LoomGradleExtension {
|
|||
return null;
|
||||
}
|
||||
|
||||
public String getLoaderLaunchMethod() {
|
||||
return loaderLaunchMethod != null ? loaderLaunchMethod : "";
|
||||
}
|
||||
|
||||
public LoomDependencyManager getDependencyManager() {
|
||||
return dependencyManager;
|
||||
}
|
||||
|
|
|
@ -58,13 +58,11 @@ public class MappingsProvider extends DependencyProvider {
|
|||
project.getLogger().lifecycle(":setting up mappings (" + dependency.getDependency().getName() + " " + dependency.getResolvedVersion() + ")");
|
||||
|
||||
String version = dependency.getResolvedVersion();
|
||||
String[] split = version.split("\\.");
|
||||
|
||||
File mappingsJar = dependency.resolveFile();
|
||||
|
||||
this.mappingsName = dependency.getDependency().getName();
|
||||
this.minecraftVersion = split[0];
|
||||
this.mappingsVersion = split[1];
|
||||
this.minecraftVersion = version.substring(0, version.lastIndexOf('.'));
|
||||
this.mappingsVersion = version.substring(version.lastIndexOf('.') + 1);
|
||||
|
||||
initFiles(project);
|
||||
|
||||
|
|
|
@ -40,20 +40,19 @@ public class LineNumberAdjustmentVisitor extends ClassVisitor {
|
|||
@Override
|
||||
public void visitLineNumber(final int line, final Label start) {
|
||||
int tLine = line;
|
||||
/* while (tLine >= 1 && !lineNumberMap.containsKey(tLine)) {
|
||||
tLine--;
|
||||
} */
|
||||
while (tLine <= maxLine && !lineNumberMap.containsKey(tLine)) {
|
||||
if (tLine <= 0) {
|
||||
super.visitLineNumber(1, start);
|
||||
} else if (tLine >= maxLine) {
|
||||
super.visitLineNumber(maxLineDst, start);
|
||||
} else {
|
||||
Integer matchedLine = null;
|
||||
|
||||
while (tLine <= maxLine && ((matchedLine = lineNumberMap.get(tLine)) == null)) {
|
||||
tLine++;
|
||||
}
|
||||
if (tLine <= 0) {
|
||||
tLine = 1;
|
||||
} else if (tLine >= maxLine) {
|
||||
tLine = maxLineDst;
|
||||
} else {
|
||||
tLine = lineNumberMap.get(tLine);
|
||||
|
||||
super.visitLineNumber(matchedLine != null ? matchedLine : maxLineDst, start);
|
||||
}
|
||||
super.visitLineNumber(tLine, start);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ public class RunClientTask extends JavaExec {
|
|||
}
|
||||
|
||||
classpath(libs);
|
||||
args("--tweakClass", Constants.FABRIC_CLIENT_TWEAKER, "--assetIndex", minecraftVersionInfo.assetIndex.getFabricId(extension.getMinecraftProvider().minecraftVersion), "--assetsDir", new File(extension.getUserCache(), "assets").getAbsolutePath());
|
||||
args("--tweakClass", Constants.DEFAULT_FABRIC_CLIENT_TWEAKER, "--assetIndex", minecraftVersionInfo.assetIndex.getFabricId(extension.getMinecraftProvider().minecraftVersion), "--assetsDir", new File(extension.getUserCache(), "assets").getAbsolutePath());
|
||||
|
||||
setWorkingDir(new File(getProject().getRootDir(), "run"));
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@ public class RunServerTask extends JavaExec {
|
|||
}
|
||||
classpath(libs);
|
||||
|
||||
args("--tweakClass", Constants.FABRIC_SERVER_TWEAKER);
|
||||
args("--tweakClass", Constants.DEFAULT_FABRIC_SERVER_TWEAKER);
|
||||
|
||||
setWorkingDir(new File(getProject().getRootDir(), "run"));
|
||||
|
||||
|
|
|
@ -27,8 +27,8 @@ package net.fabricmc.loom.util;
|
|||
|
||||
public class Constants {
|
||||
|
||||
public static final String FABRIC_CLIENT_TWEAKER = "net.fabricmc.loader.launch.FabricClientTweaker";
|
||||
public static final String FABRIC_SERVER_TWEAKER = "net.fabricmc.loader.launch.FabricServerTweaker";
|
||||
public static final String DEFAULT_FABRIC_CLIENT_TWEAKER = "net.fabricmc.loader.launch.FabricClientTweaker";
|
||||
public static final String DEFAULT_FABRIC_SERVER_TWEAKER = "net.fabricmc.loader.launch.FabricServerTweaker";
|
||||
|
||||
public static final String LIBRARIES_BASE = "https://libraries.minecraft.net/";
|
||||
public static final String RESOURCES_BASE = "http://resources.download.minecraft.net/";
|
||||
|
|
|
@ -24,9 +24,12 @@
|
|||
|
||||
package net.fabricmc.loom.util;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import net.fabricmc.loom.LoomGradleExtension;
|
||||
import org.gradle.api.Project;
|
||||
import org.gradle.api.artifacts.Configuration;
|
||||
import org.gradle.api.artifacts.ExternalModuleDependency;
|
||||
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashSet;
|
||||
|
@ -78,7 +81,36 @@ public class LoomDependencyManager {
|
|||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (extension.getInstallerJson() != null) {
|
||||
handleInstallerJson(extension.getInstallerJson(), project);
|
||||
} else {
|
||||
project.getLogger().warn("fabric-installer.json not found in classpath!");
|
||||
}
|
||||
}
|
||||
|
||||
private static void handleInstallerJson(JsonObject jsonObject, Project project){
|
||||
JsonObject libraries = jsonObject.get("libraries").getAsJsonObject();
|
||||
libraries.get("common").getAsJsonArray().forEach(jsonElement -> {
|
||||
String name = jsonElement.getAsJsonObject().get("name").getAsString();
|
||||
|
||||
Configuration configuration = project.getConfigurations().getByName("compile");
|
||||
ExternalModuleDependency modDep = (ExternalModuleDependency) project.getDependencies().create(name);
|
||||
modDep.setTransitive(false);
|
||||
configuration.getDependencies().add(modDep);
|
||||
|
||||
if(jsonElement.getAsJsonObject().has("url")){
|
||||
String url = jsonElement.getAsJsonObject().get("url").getAsString();
|
||||
long count = project.getRepositories().stream()
|
||||
.filter(artifactRepository -> artifactRepository instanceof MavenArtifactRepository)
|
||||
.map(artifactRepository -> (MavenArtifactRepository) artifactRepository)
|
||||
.filter(mavenArtifactRepository -> mavenArtifactRepository.getUrl().toString().equalsIgnoreCase(url)).count();
|
||||
if(count == 0){
|
||||
project.getRepositories().maven(mavenArtifactRepository -> mavenArtifactRepository.setUrl(jsonElement.getAsJsonObject().get("url").getAsString()));
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,17 +50,14 @@ import java.util.jar.JarFile;
|
|||
import java.util.zip.ZipEntry;
|
||||
|
||||
public class ModProcessor {
|
||||
private static final Gson GSON = new Gson();
|
||||
|
||||
public static void handleMod(File input, File output, Project project){
|
||||
if(output.exists()){
|
||||
output.delete();
|
||||
}
|
||||
remapJar(input, output, project);
|
||||
|
||||
JsonObject jsonObject = readInstallerJson(input);
|
||||
if(jsonObject != null){
|
||||
handleInstallerJson(jsonObject, project);
|
||||
}
|
||||
readInstallerJson(input, project);
|
||||
}
|
||||
|
||||
private static void remapJar(File input, File output, Project project){
|
||||
|
@ -120,48 +117,39 @@ public class ModProcessor {
|
|||
}
|
||||
}
|
||||
|
||||
private static void handleInstallerJson(JsonObject jsonObject, Project project){
|
||||
JsonObject libraries = jsonObject.get("libraries").getAsJsonObject();
|
||||
libraries.get("common").getAsJsonArray().forEach(jsonElement -> {
|
||||
String name = jsonElement.getAsJsonObject().get("name").getAsString();
|
||||
|
||||
Configuration configuration = project.getConfigurations().getByName("compile");
|
||||
ExternalModuleDependency modDep = (ExternalModuleDependency) project.getDependencies().create(name);
|
||||
modDep.setTransitive(false);
|
||||
configuration.getDependencies().add(modDep);
|
||||
|
||||
if(jsonElement.getAsJsonObject().has("url")){
|
||||
String url = jsonElement.getAsJsonObject().get("url").getAsString();
|
||||
long count = project.getRepositories().stream()
|
||||
.filter(artifactRepository -> artifactRepository instanceof MavenArtifactRepository)
|
||||
.map(artifactRepository -> (MavenArtifactRepository) artifactRepository)
|
||||
.filter(mavenArtifactRepository -> mavenArtifactRepository.getUrl().toString().equalsIgnoreCase(url)).count();
|
||||
if(count == 0){
|
||||
project.getRepositories().maven(mavenArtifactRepository -> mavenArtifactRepository.setUrl(jsonElement.getAsJsonObject().get("url").getAsString()));
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static JsonObject readInstallerJson(File file){
|
||||
private static void readInstallerJson(File file, Project project){
|
||||
try {
|
||||
JarFile jarFile = new JarFile(file);
|
||||
ZipEntry entry = jarFile.getEntry("fabric-installer.json");
|
||||
|
||||
LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
|
||||
String launchMethod = extension.getLoaderLaunchMethod();
|
||||
|
||||
int priority = 0;
|
||||
|
||||
ZipEntry entry = null;
|
||||
if (!launchMethod.isEmpty()) {
|
||||
entry = jarFile.getEntry("fabric-installer." + launchMethod + ".json");
|
||||
if (entry == null) {
|
||||
project.getLogger().warn("Could not find loader launch method '" + launchMethod + "', falling back");
|
||||
}
|
||||
}
|
||||
|
||||
if(entry == null){
|
||||
return null;
|
||||
entry = jarFile.getEntry("fabric-installer.json");
|
||||
priority = 1;
|
||||
if (entry == null) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
InputStream inputstream = jarFile.getInputStream(entry);
|
||||
String jsonStr = IOUtils.toString(inputstream, StandardCharsets.UTF_8);
|
||||
inputstream.close();
|
||||
jarFile.close();
|
||||
|
||||
JsonObject jsonObject = new Gson().fromJson(jsonStr, JsonObject.class);
|
||||
return jsonObject;
|
||||
JsonObject jsonObject = GSON.fromJson(jsonStr, JsonObject.class);
|
||||
extension.setInstallerJson(jsonObject, priority);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -26,6 +26,9 @@ package net.fabricmc.loom.util;
|
|||
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.strobel.collections.ImmutableList;
|
||||
import net.fabricmc.loom.LoomGradleExtension;
|
||||
import net.fabricmc.loom.providers.MinecraftProvider;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
@ -40,6 +43,8 @@ import java.io.File;
|
|||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
public class RunConfig {
|
||||
|
@ -82,18 +87,72 @@ public class RunConfig {
|
|||
return e;
|
||||
}
|
||||
|
||||
private static void populate(Project project, LoomGradleExtension extension, RunConfig runConfig, String mode) {
|
||||
runConfig.projectName = project.getName();
|
||||
runConfig.runDir = "file://$PROJECT_DIR$/" + extension.runDir;
|
||||
runConfig.vmArgs = "-Dfabric.development=true";
|
||||
|
||||
switch (extension.getLoaderLaunchMethod()) {
|
||||
case "launchwrapper":
|
||||
runConfig.mainClass = "net.minecraft.launchwrapper.Launch";
|
||||
runConfig.programArgs = "--tweakClass " + ("client".equals(mode) ? Constants.DEFAULT_FABRIC_CLIENT_TWEAKER : Constants.DEFAULT_FABRIC_SERVER_TWEAKER);
|
||||
break;
|
||||
default:
|
||||
runConfig.mainClass = "net.fabricmc.loader.launch.knot.Knot" + mode.substring(0, 1).toUpperCase(Locale.ROOT) + mode.substring(1).toLowerCase(Locale.ROOT);
|
||||
runConfig.programArgs = "";
|
||||
break;
|
||||
}
|
||||
|
||||
// if installer.json found...
|
||||
JsonObject installerJson = extension.getInstallerJson();
|
||||
if (installerJson != null) {
|
||||
List<String> sideKeys = ImmutableList.of(mode, "common");
|
||||
|
||||
// copy main class
|
||||
if (installerJson.has("mainClass")) {
|
||||
JsonElement mainClassJson = installerJson.get("mainClass");
|
||||
if (mainClassJson.isJsonObject()) {
|
||||
JsonObject mainClassesJson = mainClassJson.getAsJsonObject();
|
||||
for (String s : sideKeys) {
|
||||
if (mainClassesJson.has(s)) {
|
||||
runConfig.mainClass = mainClassesJson.get(s).getAsString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
runConfig.mainClass = mainClassJson.getAsString();
|
||||
}
|
||||
}
|
||||
|
||||
// copy launchwrapper tweakers
|
||||
if (installerJson.has("launchwrapper")) {
|
||||
JsonObject launchwrapperJson = installerJson.getAsJsonObject("launchwrapper");
|
||||
if (launchwrapperJson.has("tweakers")) {
|
||||
JsonObject tweakersJson = launchwrapperJson.getAsJsonObject("tweakers");
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (String s : sideKeys) {
|
||||
if (tweakersJson.has(s)) {
|
||||
for (JsonElement element : tweakersJson.getAsJsonArray(s)) {
|
||||
builder.append(" --tweakClass ").append(element.getAsString());
|
||||
}
|
||||
}
|
||||
}
|
||||
runConfig.programArgs += builder.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static RunConfig clientRunConfig(Project project){
|
||||
LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
|
||||
MinecraftProvider minecraftProvider = extension.getMinecraftProvider();
|
||||
MinecraftVersionInfo minecraftVersionInfo = minecraftProvider.versionInfo;
|
||||
|
||||
RunConfig ideaClient = new RunConfig();
|
||||
ideaClient.mainClass = "net.minecraft.launchwrapper.Launch";
|
||||
ideaClient.projectName = project.getName();
|
||||
populate(project, extension, ideaClient, "client");
|
||||
ideaClient.configName = "Minecraft Client";
|
||||
ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir;
|
||||
ideaClient.vmArgs = "-Dfabric.development=true" + getOSClientJVMArgs();
|
||||
ideaClient.programArgs = "--tweakClass " + Constants.FABRIC_CLIENT_TWEAKER + " --assetIndex " + minecraftVersionInfo.assetIndex.getFabricId(extension.getMinecraftProvider().minecraftVersion) + " --assetsDir \"" + new File(extension.getUserCache(), "assets").getAbsolutePath() + "\"";
|
||||
ideaClient.programArgs += " --assetIndex " + minecraftVersionInfo.assetIndex.getFabricId(extension.getMinecraftProvider().minecraftVersion) + " --assetsDir \"" + new File(extension.getUserCache(), "assets").getAbsolutePath() + "\"";
|
||||
ideaClient.vmArgs += getOSClientJVMArgs();
|
||||
|
||||
return ideaClient;
|
||||
}
|
||||
|
@ -102,12 +161,8 @@ public class RunConfig {
|
|||
LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
|
||||
|
||||
RunConfig ideaServer = new RunConfig();
|
||||
ideaServer.mainClass = "net.minecraft.launchwrapper.Launch";
|
||||
ideaServer.projectName = project.getName();
|
||||
populate(project, extension, ideaServer, "server");
|
||||
ideaServer.configName = "Minecraft Server";
|
||||
ideaServer.runDir = "file://$PROJECT_DIR$/" + extension.runDir;
|
||||
ideaServer.vmArgs = "-Dfabric.development=true";
|
||||
ideaServer.programArgs = "--tweakClass " + Constants.FABRIC_SERVER_TWEAKER;
|
||||
|
||||
return ideaServer;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue