6 Commits

Author SHA1 Message Date
b808d48bd3 Excludes proxies when adding garbage collector flags
All checks were successful
KnarCraft/Minecraft-Server-Launcher/pipeline/head This commit looks good
2022-02-10 01:51:47 +01:00
c3ea85c20b Adds garbage collection flags to improve server performance
All checks were successful
KnarCraft/Minecraft-Server-Launcher/pipeline/head This commit looks good
2022-02-10 01:47:10 +01:00
c83b5a2edd Adds minecraft server ram sizes up to 24 gigabytes 2022-02-10 01:46:25 +01:00
ee99312a12 Updates paper and vanilla versions to 1.18.1
All checks were successful
KnarCraft/Minecraft-Server-Launcher/pipeline/head This commit looks good
2021-12-16 21:11:30 +01:00
545e7bacc6 Updates Paper, Vanilla and Waterfall verisions to 1.18
All checks were successful
KnarCraft/Minecraft-Server-Launcher/pipeline/head This commit looks good
2021-11-30 23:28:46 +01:00
b142b6d05e Small fix to use Paper/Travertine/Waterfall's updated API for downloading .jar files
All checks were successful
KnarCraft/Minecraft-Server-Launcher/pipeline/head This commit looks good
Additionally fixes some formatting mistakes
Updates version to 1.4.1
2021-11-24 19:54:59 +01:00
21 changed files with 145 additions and 155 deletions

View File

@ -1,13 +1,14 @@
# Minecraft-Server-Launcher # Minecraft-Server-Launcher
I originally created this software in 2013 using AutoIt. After learning Java, I recreated it in Java.
The original version can be found at: https://archive.knarcraft.net/Scripts/BungeeMinecraftServerLauncher/ I originally created this software in 2013 using AutoIt. After learning Java, I recreated it in Java. The original
version can be found at: https://archive.knarcraft.net/Scripts/BungeeMinecraftServerLauncher/
This version's goal is to do everything the original does, just better. The original is 1595 lines of code repetition This version's goal is to do everything the original does, just better. The original is 1595 lines of code repetition
and dirty code. I had no prior programming experience when I first started working on the original, which is why it and dirty code. I had no prior programming experience when I first started working on the original, which is why it
became such a mess. became such a mess.
The software is in a fully working stage with a functional updater. The software is still in beta because there are still The software is in a fully working stage with a functional updater. The software is still in beta because there are
a lot of things I want to change and small annoyances. The software is fully portable. Make sure to put it in its own still a lot of things I want to change and small annoyances. The software is fully portable. Make sure to put it in its
folder as it will create lots of files. own folder as it will create lots of files.
The updater will move the new version to minecraft-server-launcher.jar, so you should rename the downloaded The updater will move the new version to minecraft-server-launcher.jar, so you should rename the downloaded file to this
file to this if it's named something else to avoid confusion. if it's named something else to avoid confusion.

View File

@ -1,3 +1,3 @@
As this is a personal one-man project, I prefer to stay in charge of the code. As this is a personal one-man project, I prefer to stay in charge of the code. I appreciate code fixing mistakes, or
I appreciate code fixing mistakes, or code improvements, but the software's functionality or purpose, should not be changed. code improvements, but the software's functionality or purpose, should not be changed. I might change anything at any
I might change anything at any time, so you might want to keep that in mind before doing big changes yourself. time, so you might want to keep that in mind before doing big changes yourself.

View File

@ -1,6 +1,7 @@
Fixes # . Fixes # .
Proposed changes: Proposed changes:
- -
- -
- -

View File

@ -1,10 +1,10 @@
package net.knarcraft.minecraftserverlauncher.utility; package net.knarcraft.minecraftserverlauncher.server;
import net.knarcraft.minecraftserverlauncher.Main; import net.knarcraft.minecraftserverlauncher.Main;
import net.knarcraft.minecraftserverlauncher.profile.ServerLauncherController; import net.knarcraft.minecraftserverlauncher.profile.ServerLauncherController;
import net.knarcraft.minecraftserverlauncher.server.ServerVersionContainer;
import net.knarcraft.minecraftserverlauncher.userinterface.GUI; import net.knarcraft.minecraftserverlauncher.userinterface.GUI;
import net.knarcraft.minecraftserverlauncher.userinterface.ServerLauncherGUI; import net.knarcraft.minecraftserverlauncher.userinterface.ServerLauncherGUI;
import net.knarcraft.minecraftserverlauncher.utility.CommonFunctions;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.BufferedWriter; import java.io.BufferedWriter;

View File

@ -370,16 +370,32 @@ public class Server {
private String getJavaCommand() { private String getJavaCommand() {
ServerLauncherController controller = ServerLauncherController.getInstance(); ServerLauncherController controller = ServerLauncherController.getInstance();
if (serverVersion.toLowerCase().contains("latest")) { if (versionAtLeast("1.17")) {
return controller.getJavaCommand(); return controller.getJavaCommand();
} else {
return controller.getOldJavaCommand();
}
}
/**
* Checks if the current server version is at least the given version
*
* @param version <p>The version to require</p>
* @return <p>True if the server version is at least the given version</p>
*/
private boolean versionAtLeast(String version) {
if (serverVersion.toLowerCase().contains("latest")) {
return true;
} else if (serverVersion.contains(".") && serverVersion.split("\\.").length >= 2) { } else if (serverVersion.contains(".") && serverVersion.split("\\.").length >= 2) {
try { try {
if (Integer.parseInt(serverVersion.split("\\.")[1]) >= 17) { return Integer.parseInt(serverVersion.split("\\.")[0]) >=
return controller.getJavaCommand(); Integer.parseInt(version.split("\\.")[0]) &&
Integer.parseInt(serverVersion.split("\\.")[1]) >=
Integer.parseInt(version.split("\\.")[1]);
} catch (NumberFormatException ignored) {
} }
} catch (NumberFormatException ignored) {}
} }
return controller.getOldJavaCommand(); return false;
} }
/** /**
@ -388,17 +404,7 @@ public class Server {
* @throws IOException <p>If the process cannot be started</p> * @throws IOException <p>If the process cannot be started</p>
*/ */
private void startServerProcess() throws IOException { private void startServerProcess() throws IOException {
ProcessBuilder builder; ProcessBuilder builder = new ProcessBuilder(generateServerProcessArguments());
String serverPath;
//Decide the path of the .jar file to be executed
if (type.getName().equals("Custom")) {
serverPath = this.path + File.separator + serverVersion;
} else {
serverPath = jarDirectory + this.type.getName() + serverVersion + ".jar";
}
builder = new ProcessBuilder(getJavaCommand(), "-Xmx" + this.maxRam, "-Xms512M",
"-Djline.terminal=jline.UnsupportedTerminal", "-Dcom.mojang.eula.agree=true", "-jar", serverPath,
"nogui");
builder.directory(new File(this.path)); builder.directory(new File(this.path));
builder.redirectErrorStream(true); builder.redirectErrorStream(true);
this.process = builder.start(); this.process = builder.start();
@ -416,6 +422,64 @@ public class Server {
}, 10, 500, TimeUnit.MILLISECONDS); }, 10, 500, TimeUnit.MILLISECONDS);
} }
/**
* Generates the process arguments required for starting this Minecraft server
*
* @return <p>The process arguments required for starting this Minecraft server</p>
*/
private List<String> generateServerProcessArguments() {
//Decide the path of the .jar file to be executed
String serverPath;
if (type.getName().equalsIgnoreCase("Custom")) {
serverPath = this.path + File.separator + serverVersion;
} else {
serverPath = jarDirectory + this.type.getName() + serverVersion + ".jar";
}
List<String> processArguments = new ArrayList<>(20);
processArguments.add(getJavaCommand());
processArguments.add("-Xmx" + this.maxRam);
processArguments.add("-Xms512M");
if (versionAtLeast("1.8") && !getType().isProxy()) {
addGarbageCollectorFlags(processArguments);
}
processArguments.add("-Djline.terminal=jline.UnsupportedTerminal");
processArguments.add("-Dcom.mojang.eula.agree=true");
processArguments.add("-jar");
processArguments.add(serverPath);
processArguments.add("nogui");
return processArguments;
}
/**
* Adds garbage collector flags to the server process arguments to improve performance
*
* @param processArguments <p>The process arguments to add the flags to</p>
*/
private void addGarbageCollectorFlags(List<String> processArguments) {
processArguments.add("-XX:+UseG1GC");
processArguments.add("-XX:+ParallelRefProcEnabled");
processArguments.add("-XX:MaxGCPauseMillis=200");
processArguments.add("-XX:+UnlockExperimentalVMOptions");
processArguments.add("-XX:+DisableExplicitGC");
processArguments.add("-XX:+AlwaysPreTouch");
boolean excessiveRam = Integer.parseInt(this.maxRam.substring(0, this.maxRam.length() - 1)) > 11;
processArguments.add("-XX:G1NewSizePercent=" + (excessiveRam ? 40 : 30));
processArguments.add("-XX:G1MaxNewSizePercent=" + (excessiveRam ? 50 : 40));
processArguments.add("-XX:G1HeapRegionSize=" + (excessiveRam ? "16M" : "8M"));
processArguments.add("-XX:G1ReservePercent=" + (excessiveRam ? 15 : 20));
processArguments.add("-XX:G1HeapWastePercent=5");
processArguments.add("-XX:G1MixedGCCountTarget=4");
processArguments.add("-XX:InitiatingHeapOccupancyPercent=" + (excessiveRam ? 20 : 15));
processArguments.add("-XX:G1MixedGCLiveThresholdPercent=90");
processArguments.add("-XX:G1RSetUpdatingPauseTimePercent=5");
processArguments.add("-XX:SurvivorRatio=32");
processArguments.add("-XX:+PerfDisableSharedMem");
processArguments.add("-XX:MaxTenuringThreshold=1");
processArguments.add("-Dusing.aikars.flags=https://mcflags.emc.gs");
processArguments.add("-Daikars.new.flags=true");
}
/** /**
* Updates a single console with process output * Updates a single console with process output
* *
@ -579,4 +643,5 @@ public class Server {
this.getMaxRam() this.getMaxRam()
); );
} }
} }

View File

@ -16,7 +16,7 @@ public class ServerHandler {
* Available ram sizes. For ServerLauncherGUI combo * Available ram sizes. For ServerLauncherGUI combo
*/ */
private static final String[] ramList = {"512M", "1G", "2G", "3G", "4G", "5G", "6G", "7G", "8G", "9G", "10G", private static final String[] ramList = {"512M", "1G", "2G", "3G", "4G", "5G", "6G", "7G", "8G", "9G", "10G",
"11G", "12G", "13G", "14G", "15G", "16G"}; "11G", "12G", "13G", "14G", "15G", "16G", "17G", "18G", "19G", "20G", "21G", "22G", "23G", "24G"};
private static boolean stoppingServers = false; private static boolean stoppingServers = false;
private static final ServerLauncherGUI gui = Main.getController().getGUI(); private static final ServerLauncherGUI gui = Main.getController().getGUI();

View File

@ -2,8 +2,8 @@ package net.knarcraft.minecraftserverlauncher.server.servertypes;
import net.knarcraft.minecraftserverlauncher.Main; import net.knarcraft.minecraftserverlauncher.Main;
import net.knarcraft.minecraftserverlauncher.profile.ServerLauncherController; import net.knarcraft.minecraftserverlauncher.profile.ServerLauncherController;
import net.knarcraft.minecraftserverlauncher.server.JarBuilder;
import net.knarcraft.minecraftserverlauncher.userinterface.GUI; import net.knarcraft.minecraftserverlauncher.userinterface.GUI;
import net.knarcraft.minecraftserverlauncher.utility.JarBuilder;
import java.io.File; import java.io.File;
import java.nio.file.Paths; import java.nio.file.Paths;

View File

@ -50,13 +50,21 @@ public class Waterfall extends AbstractServerType {
public boolean downloadJar(String folder, String version) throws IOException { public boolean downloadJar(String folder, String version) throws IOException {
String file = this.getName() + version + ".jar"; String file = this.getName() + version + ".jar";
File filePath = new File(folder + file); File filePath = new File(folder + file);
String newestVersion = stringBetween(readRemoteFile(versionURL + version), srcStart, srcEnd); String versionFileContents = readRemoteFile(versionURL + version);
String fullURL = downloadURL + version + "/" + newestVersion + "/download"; String[] versions = stringBetween(versionFileContents, srcStart, srcEnd).split(",");
String newestVersion = versions[versions.length - 1];
String oldVersion = oldVersionFunction.apply(version); String oldVersion = oldVersionFunction.apply(version);
//The file is already the newest version //The file is already the newest version
if (filePath.isFile() && newestVersion.equals(oldVersion)) { if (filePath.isFile() && newestVersion.equals(oldVersion)) {
return true; return true;
} }
//Get necessary information for downloading the latest version
String newestVersionInfoURL = versionURL + version + "/builds/" + newestVersion;
String fileName = stringBetween(readRemoteFile(newestVersionInfoURL), "\"name\":\"", "\"");
String fullURL = downloadURL + version + "/builds/" + newestVersion + "/downloads/" + fileName;
//The new jar file could not be downloaded //The new jar file could not be downloaded
if (!downloadFile(fullURL, Paths.get(filePath.toURI()))) { if (!downloadFile(fullURL, Paths.get(filePath.toURI()))) {
return false; return false;
@ -64,4 +72,5 @@ public class Waterfall extends AbstractServerType {
versionUpdateFunction.accept(version, newestVersion); versionUpdateFunction.accept(version, newestVersion);
return true; return true;
} }
} }

View File

@ -17,6 +17,7 @@ public class CloseTabActionListener implements ActionListener {
/** /**
* Instantiates a new close tab action listener * Instantiates a new close tab action listener
*
* @param tabPane <p>The tab pane containing all tabs</p> * @param tabPane <p>The tab pane containing all tabs</p>
* @param tabName <p>The name of the tab connected to this action listener</p> * @param tabName <p>The name of the tab connected to this action listener</p>
*/ */

View File

@ -33,6 +33,7 @@ public class ControlPanelTab implements ActionListener {
/** /**
* Sets the text of the status label * Sets the text of the status label
*
* @param text <p>The new text of the status label</p> * @param text <p>The new text of the status label</p>
*/ */
public void setStatusText(String text) { public void setStatusText(String text) {

View File

@ -1,35 +0,0 @@
package net.knarcraft.minecraftserverlauncher.userinterface;
import javax.swing.*;
/**
* An extended JTabbedPane with dockable tabs
*/
public class JDockableTabbedPane extends JTabbedPane {
private String tabbedPaneId;
public JDockableTabbedPane(String tabbedPaneId) {
super();
this.tabbedPaneId = tabbedPaneId;
}
public JDockableTabbedPane(String tabbedPaneId, int tabPlacement) {
super(tabPlacement);
this.tabbedPaneId = tabbedPaneId;
}
public JDockableTabbedPane(String tabbedPaneId, int tabPlacement, int tabLayoutPolicy) {
super(tabPlacement, tabLayoutPolicy);
this.tabbedPaneId = tabbedPaneId;
}
/**
* Gets the id of this tabbed pane
* @return <p>The id of this tabbed pane</p>
*/
public String getTabbedPaneId() {
return tabbedPaneId;
}
}

View File

@ -93,6 +93,7 @@ public class ServerLauncherGUI extends MessageHandler implements ActionListener,
/** /**
* Gets this GUI's control panel tab * Gets this GUI's control panel tab
*
* @return <p>The control panel tab for this GUI</p> * @return <p>The control panel tab for this GUI</p>
*/ */
public ControlPanelTab getControlPanelTab() { public ControlPanelTab getControlPanelTab() {
@ -176,6 +177,7 @@ public class ServerLauncherGUI extends MessageHandler implements ActionListener,
/** /**
* Gets a button for adding a new server * Gets a button for adding a new server
*
* @param displayButtonStyle <p>Whether to show or hide the button's style</p> * @param displayButtonStyle <p>Whether to show or hide the button's style</p>
* @return <p>A new add server button</p> * @return <p>A new add server button</p>
*/ */
@ -193,7 +195,6 @@ public class ServerLauncherGUI extends MessageHandler implements ActionListener,
} }
/** /**
*
* @param serverName <p>The name of the server/tab to add a close button to</p> * @param serverName <p>The name of the server/tab to add a close button to</p>
*/ */
private void addCloseButtonToServerTab(String serverName) { private void addCloseButtonToServerTab(String serverName) {

View File

@ -190,6 +190,7 @@ public class ServerLauncherMenu implements ActionListener {
/** /**
* Asks the user for the new Java path * Asks the user for the new Java path
*
* @param old <p>Whether asking for the path to the old java version</p> * @param old <p>Whether asking for the path to the old java version</p>
*/ */
private void configureJava(boolean old) { private void configureJava(boolean old) {

View File

@ -1,61 +0,0 @@
package net.knarcraft.minecraftserverlauncher.userinterface;
import javax.swing.event.MouseInputAdapter;
import java.awt.*;
import java.awt.event.MouseEvent;
/**
* A listener for detecting the dragging of a tab to make it dock or undock
*/
public class TabDragListener extends MouseInputAdapter {
Point dragStartPoint;
Component draggedComponent;
String draggedTabTitle;
JDockableTabbedPane tabbedPaneToListenTo;
public TabDragListener(JDockableTabbedPane tabbedPaneToListenTo) {
this.tabbedPaneToListenTo = tabbedPaneToListenTo;
}
@Override
public void mousePressed(MouseEvent e) {
dragStartPoint = e.getPoint();
//Loop through tabbed panes to find the dragged one
for (int i = 0; i < tabbedPaneToListenTo.getTabCount(); i++) {
Rectangle bounds = tabbedPaneToListenTo.getBoundsAt(i);
if (bounds.contains(dragStartPoint)) {
draggedComponent = tabbedPaneToListenTo.getComponentAt(i);
draggedTabTitle = tabbedPaneToListenTo.getTitleAt(i);
break;
}
}
}
@Override
public void mouseDragged(MouseEvent e) {
Point dragEndPoint = e.getPoint();
if (draggedComponent != null) {
// check for a significant drag
//TODO: Check if tab is dragged onto another JDockableTabbedPane with the same id
if (Math.abs(dragEndPoint.getY() - dragStartPoint.getY()) > 30) {
//TODO: Undock by creating a new JDockableTabbedPane with the same id
//TODO: If dragging onto another JDockableTabbedPane with the same id, combine
//TODO: Make the listener keep track of all its created windows
//TODO: If a child window is closed, dock its tab to the main window
//TODO: Keep track of the original window vs. the child window
//undock(draggedComponent, draggedTabTitle);
draggedComponent = null;
}
}
}
@Override
public void mouseReleased(MouseEvent arg0) {
draggedComponent = null;
draggedTabTitle = null;
}
}

View File

@ -22,11 +22,15 @@ import java.util.stream.Stream;
/** /**
* A helper class for performing server backup * A helper class for performing server backup
*/ */
public class BackupUtil { public final class BackupUtil {
private static boolean backupAborted; private static boolean backupAborted;
private static boolean backupRunning = false; private static boolean backupRunning = false;
private BackupUtil() {
}
/** /**
* Aborts the currently running backup * Aborts the currently running backup
*/ */
@ -136,6 +140,7 @@ public class BackupUtil {
/** /**
* Performs the actual backup after checks have passed and necessary info is available * Performs the actual backup after checks have passed and necessary info is available
*
* @param gui <p>The GUI to use for informing the user</p> * @param gui <p>The GUI to use for informing the user</p>
* @param serverFolders <p>The folders of the servers to backup</p> * @param serverFolders <p>The folders of the servers to backup</p>
* @param backupFileSize <p>The total size of the folders to backup</p> * @param backupFileSize <p>The total size of the folders to backup</p>

View File

@ -126,6 +126,7 @@ public final class CommonFunctions {
/** /**
* Gets a buffered writer for writing to a given file * Gets a buffered writer for writing to a given file
*
* @param path <p>The path to the file to write to</p> * @param path <p>The path to the file to write to</p>
* @return <p>A buffered writer for writing to the file</p> * @return <p>A buffered writer for writing to the file</p>
* @throws FileNotFoundException <p>If the file does not exist</p> * @throws FileNotFoundException <p>If the file does not exist</p>
@ -243,7 +244,6 @@ public final class CommonFunctions {
} }
/** /**
* Validates that a name is not empty and does not contain invalid characters * Validates that a name is not empty and does not contain invalid characters
* *
@ -259,7 +259,7 @@ public final class CommonFunctions {
* *
* @param target <p>The folder to delete from</p> * @param target <p>The folder to delete from</p>
*/ */
static void removeFilesRecursively(File target) { public static void removeFilesRecursively(File target) {
File[] oldFiles = target.listFiles(); File[] oldFiles = target.listFiles();
if (oldFiles == null) { if (oldFiles == null) {
throw new IllegalArgumentException("Unable to list files in directory"); throw new IllegalArgumentException("Unable to list files in directory");

View File

@ -1,2 +1,2 @@
beta beta
1.4.0 1.4.3
1 beta
2 1.4.0 1.4.3

View File

@ -1,11 +1,11 @@
Vanilla;Latest,Snapshot,1.17.1,1.16.5,1.15.2,1.14.4,1.13.2,1.12.2,1.11.2,1.10.2,1.9.4,1.8.9,1.7.10,1.6.4,1.5.2,1.4.7,1.3.2,1.2.5;https://launchermeta.mojang.com/mc/game/version_manifest.json;"release":";";https://s3.amazonaws.com/Minecraft.Download/versions/ Vanilla;Latest,Snapshot,1.18.1,1.17.1,1.16.5,1.15.2,1.14.4,1.13.2,1.12.2,1.11.2,1.10.2,1.9.4,1.8.9,1.7.10,1.6.4,1.5.2,1.4.7,1.3.2,1.2.5;https://launchermeta.mojang.com/mc/game/version_manifest.json;"release":";";https://s3.amazonaws.com/Minecraft.Download/versions/
Spigot;Latest,1.17.1,1.16.5,1.15.2,1.14.4,1.13.2,1.12.2,1.11.2,1.10.2,1.9.4,1.9.4,1.8.8,1.7.10,1.6.4-R2.1,1.5.2-R1.1,1.4.7-R1.1;https://static.knarcraft.net/archive/downloads/minecraftserverjars/Spigot/;spigot- Spigot;Latest,1.17.1,1.16.5,1.15.2,1.14.4,1.13.2,1.12.2,1.11.2,1.10.2,1.9.4,1.9.4,1.8.8,1.7.10,1.6.4-R2.1,1.5.2-R1.1,1.4.7-R1.1;https://static.knarcraft.net/archive/downloads/minecraftserverjars/Spigot/;spigot-
Paper;1.17.1,1.16.5,1.15.2,1.14.4,1.13.2,1.12.2,1.11.2,1.10.2,1.9.4,1.8.8;https://papermc.io/api/v1/paper/;"latest":;,;https://papermc.io/api/v1/paper/ Paper;1.18.1,1.17.1,1.16.5,1.15.2,1.14.4,1.13.2,1.12.2,1.11.2,1.10.2,1.9.4,1.8.8;https://papermc.io/api/v2/projects/paper/versions/;"builds":[;];https://papermc.io/api/v2/projects/paper/versions/
#SpongeVanilla;1.12.2,1.11.2,1.10.2,1.8.9;https://dl-api.spongepowered.org/v1/org.spongepowered/spongevanilla/downloads?type=stable&minecraft=;"version":";",;https://repo.spongepowered.org/maven/org/spongepowered/spongevanilla/;/spongevanilla- #SpongeVanilla;1.12.2,1.11.2,1.10.2,1.8.9;https://dl-api.spongepowered.org/v1/org.spongepowered/spongevanilla/downloads?type=stable&minecraft=;"version":";",;https://repo.spongepowered.org/maven/org/spongepowered/spongevanilla/;/spongevanilla-
Craftbukkit;Latest,1.17.1,1.16.5,1.15.2,1.14.4,1.13.2,1.12.2,1.11.2,1.10.2,1.9.4,1.8.8,1.7.10-R0.1,1.6.4-R2.0,1.5.2-R1.0,1.4.6-R0.3,1.3.2-R3.0,1.2.5-R2.0,1.1-R6,1.0.1-R1,b1.8.1,b1.7.3;https://static.knarcraft.net/archive/downloads/minecraftserverjars/Bukkit/;craftbukkit- Craftbukkit;Latest,1.17.1,1.16.5,1.15.2,1.14.4,1.13.2,1.12.2,1.11.2,1.10.2,1.9.4,1.8.8,1.7.10-R0.1,1.6.4-R2.0,1.5.2-R1.0,1.4.6-R0.3,1.3.2-R3.0,1.2.5-R2.0,1.1-R6,1.0.1-R1,b1.8.1,b1.7.3;https://static.knarcraft.net/archive/downloads/minecraftserverjars/Bukkit/;craftbukkit-
#SpongeForge;1.12.2,1.11.2,1.10.2;https://dl-api.spongepowered.org/v1/org.spongepowered/spongeforge/downloads?type=stable&minecraft=;"version":";",;https://repo.spongepowered.org/maven/org/spongepowered/spongeforge/;/spongeforge- #SpongeForge;1.12.2,1.11.2,1.10.2;https://dl-api.spongepowered.org/v1/org.spongepowered/spongeforge/downloads?type=stable&minecraft=;"version":";",;https://repo.spongepowered.org/maven/org/spongepowered/spongeforge/;/spongeforge-
MCPCplus;1.6.4,1.6.2,1.5.2,1.4.7;https://static.knarcraft.net/archive/downloads/minecraftserverjars/MCPC+/;mcpcplus MCPCplus;1.6.4,1.6.2,1.5.2,1.4.7;https://static.knarcraft.net/archive/downloads/minecraftserverjars/MCPC+/;mcpcplus
Bungee;Latest,1.7.10,1.6.4,1.5.2,1.4.7;https://ci.md-5.net/job/BungeeCord/lastSuccessfulBuild/artifact/bootstrap/target/;Artifacts of BungeeCord #; ;http://ci.md-5.net/job/BungeeCord/lastSuccessfulBuild/artifact/bootstrap/target/BungeeCord.jar;https://static.knarcraft.net/archive/downloads/minecraftserverjars/BungeeCord/;BungeeCord- Bungee;Latest,1.7.10,1.6.4,1.5.2,1.4.7;https://ci.md-5.net/job/BungeeCord/lastSuccessfulBuild/artifact/bootstrap/target/;Artifacts of BungeeCord #; ;http://ci.md-5.net/job/BungeeCord/lastSuccessfulBuild/artifact/bootstrap/target/BungeeCord.jar;https://static.knarcraft.net/archive/downloads/minecraftserverjars/BungeeCord/;BungeeCord-
Waterfall;1.17,1.16,1.15,1.14,1.13,1.12,1.11;https://papermc.io/api/v1/waterfall/;"latest":;,;https://papermc.io/api/v1/waterfall/ Waterfall;1.18,1.17,1.16,1.15,1.14,1.13,1.12,1.11;https://papermc.io/api/v2/projects/waterfall/versions/;"builds":[;];https://papermc.io/api/v2/projects/waterfall/versions/
Travertine;1.16,1.15,1.14,1.13,1.12;https://papermc.io/api/v1/travertine/;"latest":;,;https://papermc.io/api/v1/travertine/ Travertine;1.16,1.15,1.14,1.13,1.12;https://papermc.io/api/v2/projects/travertine/versions/;"builds":[;];https://papermc.io/api/v2/projects/travertine/versions/
Custom; Custom;
Can't render this file because it contains an unexpected character in line 1 and column 200.

View File

@ -1,8 +1,9 @@
package net.knarcraft.minecraftserverlauncher.utility; package net.knarcraft.minecraftserverlauncher.server;
import net.knarcraft.minecraftserverlauncher.Main; import net.knarcraft.minecraftserverlauncher.Main;
import net.knarcraft.minecraftserverlauncher.profile.ServerLauncherController; import net.knarcraft.minecraftserverlauncher.profile.ServerLauncherController;
import net.knarcraft.minecraftserverlauncher.userinterface.FakeGUI; import net.knarcraft.minecraftserverlauncher.userinterface.FakeGUI;
import net.knarcraft.minecraftserverlauncher.utility.CommonFunctions;
import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;