diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index 7554e1d..19f25a0 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -29,63 +29,15 @@ import net.fabricmc.loom.providers.MappingsProvider; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.MinecraftVersionInfo; import net.fabricmc.loom.util.OperatingSystem; +import net.fabricmc.loom.util.RunConfig; import org.gradle.api.tasks.JavaExec; import java.io.File; import java.util.ArrayList; import java.util.List; -public class RunClientTask extends JavaExec { +public class RunClientTask extends RunTaskBase { public RunClientTask() { - setGroup("fabric"); + super(RunConfig::clientRunConfig); } - - @Override - public void exec() { - LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - MinecraftVersionInfo minecraftVersionInfo = extension.getMinecraftProvider().versionInfo; - MappingsProvider mappingsProvider = extension.getMappingsProvider(); - - List libs = new ArrayList<>(); - for (File file : getProject().getConfigurations().getByName("compile").getFiles()) { - libs.add(file.getAbsolutePath()); - } - for (File file : extension.getUnmappedMods()) { - if (file.isFile()) { - libs.add(file.getAbsolutePath()); - } - } - - classpath(libs); - 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")); - - super.exec(); - } - - @Override - public void setWorkingDir(File dir) { - if(!dir.exists()){ - dir.mkdirs(); - } - super.setWorkingDir(dir); - } - - @Override - public String getMain() { - return "net.minecraft.launchwrapper.Launch"; - } - - @Override - public List getJvmArgs() { - LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - List args = new ArrayList<>(super.getJvmArgs()); - args.add("-Dfabric.development=true"); - if(OperatingSystem.getOS().equalsIgnoreCase("osx")){ - args.add("-XstartOnFirstThread"); - } - return args; - } - } diff --git a/src/main/java/net/fabricmc/loom/task/RunServerTask.java b/src/main/java/net/fabricmc/loom/task/RunServerTask.java index e7d34c4..40eb45e 100644 --- a/src/main/java/net/fabricmc/loom/task/RunServerTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunServerTask.java @@ -26,58 +26,15 @@ package net.fabricmc.loom.task; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.RunConfig; import org.gradle.api.tasks.JavaExec; import java.io.File; import java.util.ArrayList; import java.util.List; -public class RunServerTask extends JavaExec { +public class RunServerTask extends RunTaskBase { public RunServerTask() { - setGroup("fabric"); + super(RunConfig::serverRunConfig); } - - @Override - public void exec() { - LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - - List libs = new ArrayList<>(); - for (File file : getProject().getConfigurations().getByName("compile").getFiles()) { - libs.add(file.getAbsolutePath()); - } - for (File file : extension.getUnmappedMods()) { - if (file.isFile()) { - libs.add(file.getAbsolutePath()); - } - } - classpath(libs); - - args("--tweakClass", Constants.DEFAULT_FABRIC_SERVER_TWEAKER); - - setWorkingDir(new File(getProject().getRootDir(), "run")); - - super.exec(); - } - - @Override - public String getMain() { - return "net.minecraft.launchwrapper.Launch"; - } - - @Override - public void setWorkingDir(File dir) { - if(!dir.exists()){ - dir.mkdirs(); - } - super.setWorkingDir(dir); - } - - @Override - public List getJvmArgs() { - LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - List args = new ArrayList<>(super.getJvmArgs()); - args.add("-Dfabric.development=true"); - return args; - } - } diff --git a/src/main/java/net/fabricmc/loom/task/RunTaskBase.java b/src/main/java/net/fabricmc/loom/task/RunTaskBase.java new file mode 100644 index 0000000..e2f4ed0 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/task/RunTaskBase.java @@ -0,0 +1,137 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.task; + +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.providers.MappingsProvider; +import net.fabricmc.loom.util.MinecraftVersionInfo; +import net.fabricmc.loom.util.OperatingSystem; +import net.fabricmc.loom.util.RunConfig; +import org.gradle.api.Project; +import org.gradle.api.tasks.JavaExec; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; + +public abstract class RunTaskBase extends JavaExec { + private final Function configProvider; + private RunConfig config; + + public RunTaskBase(Function config) { + super(); + setGroup("fabric"); + this.configProvider = config; + } + + @Override + public void exec() { + if (config == null) { + config = configProvider.apply(getProject()); + } + + LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); + MinecraftVersionInfo minecraftVersionInfo = extension.getMinecraftProvider().versionInfo; + MappingsProvider mappingsProvider = extension.getMappingsProvider(); + + List libs = new ArrayList<>(); + for (File file : getProject().getConfigurations().getByName("compile").getFiles()) { + libs.add(file.getAbsolutePath()); + } + for (File file : extension.getUnmappedMods()) { + if (file.isFile()) { + libs.add(file.getAbsolutePath()); + } + } + + classpath(libs); + List argsSplit = new ArrayList<>(); + String[] args = config.programArgs.split(" "); + int partPos = -1; + for (int i = 0; i < args.length; i++) { + if (partPos < 0) { + if (args[i].startsWith("\"")) { + if (args[i].endsWith("\"")) { + argsSplit.add(args[i].substring(1, args[i].length() - 1)); + } else { + partPos = i; + } + } else { + argsSplit.add(args[i]); + } + } else if (args[i].endsWith("\"")) { + StringBuilder builder = new StringBuilder(args[partPos].substring(1)); + for (int j = partPos + 1; j < i; j++) { + builder.append(" ").append(args[j]); + } + builder.append(" ").append(args[i], 0, args[i].length() - 1); + argsSplit.add(builder.toString()); + partPos = -1; + } + } + + args(argsSplit); + setWorkingDir(new File(config.runDir)); + + super.exec(); + } + + @Override + public void setWorkingDir(File dir) { + if (config == null) { + config = configProvider.apply(getProject()); + } + + if(!dir.exists()){ + dir.mkdirs(); + } + super.setWorkingDir(dir); + } + + @Override + public String getMain() { + if (config == null) { + config = configProvider.apply(getProject()); + } + + return config.mainClass; + } + + @Override + public List getJvmArgs() { + if (config == null) { + config = configProvider.apply(getProject()); + } + + LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); + List superArgs = super.getJvmArgs(); + List args = new ArrayList<>(superArgs != null ? superArgs : Collections.emptyList()); + args.addAll(Arrays.asList(config.vmArgs.split(" "))); + return args; + } +}