Add a dedicated restart packet

I don't reccommend using this packet over the start & stop combination because of the lack of feedback you get in comparision.

However, if the server sending the packet is requesting to restart itself then this is your only option, so that's why it's here.
This commit is contained in:
ME1312 2019-01-20 17:49:12 -05:00
parent cd5bdbaa35
commit 361acf7b17
No known key found for this signature in database
GPG Key ID: FEFFE2F698E88FA8
19 changed files with 443 additions and 8 deletions

View File

@ -133,7 +133,7 @@ public class Client {
*/
public void sendPacket(PacketOut packet) {
if (Util.isNull(packet)) throw new NullPointerException();
try {
if (!isClosed()) try {
out.packValue(subdata.getCipher().encrypt(subdata.plugin.config.get().getSection("Settings").getSection("SubData").getRawString("Password"), SubDataServer.encodePacket(this, packet)));
out.flush();
} catch (Throwable e) {

View File

@ -0,0 +1,107 @@
package net.ME1312.SubServers.Bungee.Network.Packet;
import net.ME1312.SubServers.Bungee.Host.Server;
import net.ME1312.SubServers.Bungee.Host.SubServer;
import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection;
import net.ME1312.SubServers.Bungee.Library.Util;
import net.ME1312.SubServers.Bungee.Library.Version.Version;
import net.ME1312.SubServers.Bungee.Network.Client;
import net.ME1312.SubServers.Bungee.Network.PacketIn;
import net.ME1312.SubServers.Bungee.Network.PacketOut;
import net.ME1312.SubServers.Bungee.SubAPI;
import net.ME1312.SubServers.Bungee.SubPlugin;
import java.util.Map;
/**
* Restart Server Packet
*/
public class PacketRestartServer implements PacketIn, PacketOut {
private SubPlugin plugin;
private int response;
private String message;
private String id;
/**
* New PacketRestartServer (In)
*
* @param plugin SubPlugin
*/
public PacketRestartServer(SubPlugin plugin) {
if (Util.isNull(plugin)) throw new NullPointerException();
this.plugin = plugin;
}
/**
* New PacketRestartServer (Out)
*
* @param response Response ID
* @param message Message
* @param id Receiver ID
*/
public PacketRestartServer(int response, String message, String id) {
if (Util.isNull(response, message)) throw new NullPointerException();
this.response = response;
this.message = message;
this.id = id;
}
@Override
public YAMLSection generate() {
YAMLSection json = new YAMLSection();
if (id != null) json.set("id", id);
json.set("r", response);
json.set("m", message);
return json;
}
@Override
public void execute(Client client, YAMLSection data) {
try {
Runnable starter = () -> {
Map<String, Server> servers = plugin.api.getServers();
if (!servers.keySet().contains(data.getRawString("server").toLowerCase())) {
} else if (!(servers.get(data.getRawString("server").toLowerCase()) instanceof SubServer)) {
} else if (!((SubServer) servers.get(data.getRawString("server").toLowerCase())).getHost().isAvailable()) {
} else if (!((SubServer) servers.get(data.getRawString("server").toLowerCase())).getHost().isEnabled()) {
} else if (!((SubServer) servers.get(data.getRawString("server").toLowerCase())).isEnabled()) {
} else if (((SubServer) servers.get(data.getRawString("server").toLowerCase())).isRunning()) {
} else if (((SubServer) servers.get(data.getRawString("server").toLowerCase())).getCurrentIncompatibilities().size() != 0) {
} else {
((SubServer) servers.get(data.getRawString("server").toLowerCase())).start((data.contains("player"))?data.getUUID("player"):null);
}
};
Map<String, Server> servers = plugin.api.getServers();
if (!servers.keySet().contains(data.getRawString("server").toLowerCase())) {
client.sendPacket(new PacketRestartServer(3, "There is no server with that name", (data.contains("id"))?data.getRawString("id"):null));
} else if (!(servers.get(data.getRawString("server").toLowerCase()) instanceof SubServer)) {
client.sendPacket(new PacketRestartServer(4, "That Server is not a SubServer", (data.contains("id"))?data.getRawString("id"):null));
} else {
client.sendPacket(new PacketRestartServer(0, "Restarting SubServer", (data.contains("id"))?data.getRawString("id"):null));
if (((SubServer) servers.get(data.getRawString("server").toLowerCase())).isRunning()) {
new Thread(() -> {
try {
((SubServer) servers.get(data.getRawString("server").toLowerCase())).stop();
((SubServer) servers.get(data.getRawString("server").toLowerCase())).waitFor();
Thread.sleep(100);
starter.run();
} catch (Exception e) {
e.printStackTrace();
}
}, "SubServers.Bungee::Server_Restart_Packet_Handler(" + servers.get(data.getRawString("server").toLowerCase()).getName() + ')').start();
} else {
starter.run();
}
}
} catch (Throwable e) {
client.sendPacket(new PacketRestartServer(2, e.getClass().getCanonicalName() + ": " + e.getMessage(), (data.contains("id"))?data.getRawString("id"):null));
e.printStackTrace();
}
}
@Override
public Version getVersion() {
return new Version("2.11.0a");
}
}

View File

@ -106,6 +106,7 @@ public final class SubDataServer {
registerPacket(new PacketLinkExHost(plugin), "SubServers", "LinkExHost");
registerPacket(new PacketLinkProxy(plugin), "SubServers", "LinkProxy");
registerPacket(new PacketLinkServer(plugin), "SubServers", "LinkServer");
registerPacket(new PacketRestartServer(plugin), "SubServers", "RestartServer");
registerPacket(new PacketStartServer(plugin), "SubServers", "StartServer");
registerPacket(new PacketStopServer(plugin), "SubServers", "StopServer");
@ -133,6 +134,7 @@ public final class SubDataServer {
registerPacket(PacketOutRunEvent.class, "SubServers", "RunEvent");
registerPacket(PacketOutReload.class, "SubServers", "Reload");
registerPacket(PacketOutReset.class, "SubServers", "Reset");
registerPacket(PacketRestartServer.class, "SubServers", "RestartServer");
registerPacket(PacketStartServer.class, "SubServers", "StartServer");
registerPacket(PacketStopServer.class, "SubServers", "StopServer");
}

View File

@ -455,7 +455,7 @@ public final class SubCommand extends CommandX {
e.printStackTrace();
}
}, "SubServers.Bungee::Server_Restart_Command_Handler(" + servers.get(args[1].toLowerCase()).getName() + ')').start();
} else {
} else {
starter.run();
}
} else {
@ -639,7 +639,7 @@ public final class SubCommand extends CommandX {
String last = (args.length > 0)?args[args.length - 1].toLowerCase():"";
if (args.length <= 1) {
List<String> cmds = new ArrayList<>();
cmds.addAll(Arrays.asList("help", "list", "info", "status", "version", "start", "stop", "kill", "terminate", "cmd", "command", "create"));
cmds.addAll(Arrays.asList("help", "list", "info", "status", "version", "start", "stop", "restart", "kill", "terminate", "cmd", "command", "create"));
if (!(sender instanceof ProxiedPlayer)) cmds.addAll(Arrays.asList("reload", "sudo", "screen", "delete"));
if (last.length() == 0) {
return new NamedContainer<>(null, cmds);

View File

@ -0,0 +1,62 @@
package net.ME1312.SubServers.Client.Bukkit.Network.Packet;
import net.ME1312.SubServers.Client.Bukkit.Library.Callback;
import net.ME1312.SubServers.Client.Bukkit.Library.Config.YAMLSection;
import net.ME1312.SubServers.Client.Bukkit.Library.Util;
import net.ME1312.SubServers.Client.Bukkit.Library.Version.Version;
import net.ME1312.SubServers.Client.Bukkit.Network.PacketIn;
import net.ME1312.SubServers.Client.Bukkit.Network.PacketOut;
import java.util.HashMap;
import java.util.UUID;
/**
* Restart Server Packet
*/
public class PacketRestartServer implements PacketIn, PacketOut {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>();
private UUID player;
private String server;
private String id;
/**
* New PacketRestartServer (In)
*/
public PacketRestartServer() {}
/**
* New PacketRestartServer (Out)
*
* @param player Player Starting
* @param server Server
* @param callback Callbacks
*/
@SafeVarargs
public PacketRestartServer(UUID player, String server, Callback<YAMLSection>... callback) {
if (Util.isNull(server, callback)) throw new NullPointerException();
this.player = player;
this.server = server;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString();
callbacks.put(id, callback);
}
@Override
public YAMLSection generate() {
YAMLSection data = new YAMLSection();
data.set("id", id);
if (player != null) data.set("player", player.toString());
data.set("server", server);
return data;
}
@Override
public void execute(YAMLSection data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data);
callbacks.remove(data.getRawString("id"));
}
@Override
public Version getVersion() {
return new Version("2.11.0a");
}
}

View File

@ -10,6 +10,9 @@ import net.ME1312.SubServers.Client.Bukkit.Network.PacketOut;
import java.util.HashMap;
import java.util.UUID;
/**
* Stop Server Packet
*/
public class PacketStopServer implements PacketIn, PacketOut {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>();
private UUID player;
@ -17,8 +20,19 @@ public class PacketStopServer implements PacketIn, PacketOut {
private String server;
private String id;
/**
* New PacketStopServer (In)
*/
public PacketStopServer() {}
/**
* New PacketStopServer (Out)
*
* @param player Player Starting
* @param server Server
* @param force Force Stop
* @param callback Callbacks
*/
@SafeVarargs
public PacketStopServer(UUID player, String server, boolean force, Callback<YAMLSection>... callback) {
if (Util.isNull(server, force, callback)) throw new NullPointerException();

View File

@ -113,6 +113,7 @@ public final class SubDataClient {
registerPacket(new PacketInReload(plugin), "SubServers", "Reload");
registerPacket(new PacketInReset(), "SubServers", "Reset");
registerPacket(new PacketLinkServer(plugin), "SubServers", "LinkServer");
registerPacket(new PacketRestartServer(), "SubServers", "RestartServer");
registerPacket(new PacketStartServer(), "SubServers", "StartServer");
registerPacket(new PacketStopServer(), "SubServers", "StopServer");
@ -128,6 +129,7 @@ public final class SubDataClient {
registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo");
registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo");
registerPacket(PacketLinkServer.class, "SubServers", "LinkServer");
registerPacket(PacketRestartServer.class, "SubServers", "RestartServer");
registerPacket(PacketStartServer.class, "SubServers", "StartServer");
registerPacket(PacketStopServer.class, "SubServers", "StopServer");
}

View File

@ -414,7 +414,7 @@ public final class SubCommand implements CommandExecutor {
}
});
plugin.subdata.sendPacket(new PacketStopServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], false, data -> {
Callback<YAMLSection> stopper = data -> {
if (data.getInt("r") != 0) listening.set(false);
switch (data.getInt("r")) {
case 3:
@ -433,7 +433,14 @@ public final class SubCommand implements CommandExecutor {
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Restart"));
break;
}
}));
};
if (plugin.subdata.getName().equalsIgnoreCase(args[1])) {
listening.set(false);
plugin.subdata.sendPacket(new PacketRestartServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], stopper));
} else {
plugin.subdata.sendPacket(new PacketStopServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], false, stopper));
}
} else if (!(sender.hasPermission("subservers.subserver.stop.*") || sender.hasPermission("subservers.subserver.stop." + args[1].toLowerCase()))) {
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.stop." + args[1].toLowerCase()));
} else {

View File

@ -0,0 +1,62 @@
package net.ME1312.SubServers.Client.Sponge.Network.Packet;
import net.ME1312.SubServers.Client.Sponge.Library.Callback;
import net.ME1312.SubServers.Client.Sponge.Library.Config.YAMLSection;
import net.ME1312.SubServers.Client.Sponge.Library.Util;
import net.ME1312.SubServers.Client.Sponge.Library.Version.Version;
import net.ME1312.SubServers.Client.Sponge.Network.PacketIn;
import net.ME1312.SubServers.Client.Sponge.Network.PacketOut;
import java.util.HashMap;
import java.util.UUID;
/**
* Restart Server Packet
*/
public class PacketRestartServer implements PacketIn, PacketOut {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>();
private UUID player;
private String server;
private String id;
/**
* New PacketRestartServer (In)
*/
public PacketRestartServer() {}
/**
* New PacketRestartServer (Out)
*
* @param player Player Starting
* @param server Server
* @param callback Callbacks
*/
@SafeVarargs
public PacketRestartServer(UUID player, String server, Callback<YAMLSection>... callback) {
if (Util.isNull(server, callback)) throw new NullPointerException();
this.player = player;
this.server = server;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString();
callbacks.put(id, callback);
}
@Override
public YAMLSection generate() {
YAMLSection data = new YAMLSection();
data.set("id", id);
if (player != null) data.set("player", player.toString());
data.set("server", server);
return data;
}
@Override
public void execute(YAMLSection data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data);
callbacks.remove(data.getRawString("id"));
}
@Override
public Version getVersion() {
return new Version("2.11.0a");
}
}

View File

@ -10,6 +10,9 @@ import net.ME1312.SubServers.Client.Sponge.Network.PacketOut;
import java.util.HashMap;
import java.util.UUID;
/**
* Stop Server Packet
*/
public class PacketStopServer implements PacketIn, PacketOut {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>();
private UUID player;
@ -17,8 +20,19 @@ public class PacketStopServer implements PacketIn, PacketOut {
private String server;
private String id;
/**
* New PacketStopServer (In)
*/
public PacketStopServer() {}
/**
* New PacketStopServer (Out)
*
* @param player Player Starting
* @param server Server
* @param force Force Stop
* @param callback Callbacks
*/
@SafeVarargs
public PacketStopServer(UUID player, String server, boolean force, Callback<YAMLSection>... callback) {
if (Util.isNull(server, force, callback)) throw new NullPointerException();

View File

@ -117,6 +117,7 @@ public final class SubDataClient {
registerPacket(new PacketInReload(plugin), "SubServers", "Reload");
registerPacket(new PacketInReset(), "SubServers", "Reset");
registerPacket(new PacketLinkServer(plugin), "SubServers", "LinkServer");
registerPacket(new PacketRestartServer(), "SubServers", "RestartServer");
registerPacket(new PacketStartServer(), "SubServers", "StartServer");
registerPacket(new PacketStopServer(), "SubServers", "StopServer");
@ -132,6 +133,7 @@ public final class SubDataClient {
registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo");
registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo");
registerPacket(PacketLinkServer.class, "SubServers", "LinkServer");
registerPacket(PacketRestartServer.class, "SubServers", "RestartServer");
registerPacket(PacketStartServer.class, "SubServers", "StartServer");
registerPacket(PacketStopServer.class, "SubServers", "StopServer");
}

View File

@ -737,7 +737,7 @@ public final class SubCommand implements CommandExecutor {
}
});
plugin.subdata.sendPacket(new PacketStopServer((sender instanceof Player) ? ((Player) sender).getUniqueId():null, subserver.get(), false, data -> {
Callback<YAMLSection> stopper = data -> {
if (data.getInt("r") != 0) listening.set(false);
switch (data.getInt("r")) {
case 3:
@ -756,7 +756,14 @@ public final class SubCommand implements CommandExecutor {
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Restart")));
break;
}
}));
};
if (plugin.subdata.getName().equalsIgnoreCase(subserver.get())) {
listening.set(false);
plugin.subdata.sendPacket(new PacketRestartServer((sender instanceof Player)?((Player) sender).getUniqueId():null, subserver.get(), stopper));
} else {
plugin.subdata.sendPacket(new PacketStopServer((sender instanceof Player)?((Player) sender).getUniqueId():null, subserver.get(), false, stopper));
}
return CommandResult.builder().successCount(1).build();
} else if (!sender.hasPermission("subservers.subserver.stop." + subserver.get().toLowerCase())) {
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.stop." + subserver.get().toLowerCase())));

View File

@ -0,0 +1,62 @@
package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubServers.Host.Network.PacketIn;
import net.ME1312.SubServers.Host.Network.PacketOut;
import java.util.HashMap;
import java.util.UUID;
/**
* Restart Server Packet
*/
public class PacketRestartServer implements PacketIn, PacketOut {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>();
private UUID player;
private String server;
private String id;
/**
* New PacketRestartServer (In)
*/
public PacketRestartServer() {}
/**
* New PacketRestartServer (Out)
*
* @param player Player Starting
* @param server Server
* @param callback Callbacks
*/
@SafeVarargs
public PacketRestartServer(UUID player, String server, Callback<YAMLSection>... callback) {
if (Util.isNull(server, callback)) throw new NullPointerException();
this.player = player;
this.server = server;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString();
callbacks.put(id, callback);
}
@Override
public YAMLSection generate() {
YAMLSection data = new YAMLSection();
data.set("id", id);
if (player != null) data.set("player", player.toString());
data.set("server", server);
return data;
}
@Override
public void execute(YAMLSection data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data);
callbacks.remove(data.getRawString("id"));
}
@Override
public Version getVersion() {
return new Version("2.11.0a");
}
}

View File

@ -10,6 +10,9 @@ import net.ME1312.SubServers.Host.Network.PacketOut;
import java.util.HashMap;
import java.util.UUID;
/**
* Stop Server Packet
*/
public class PacketStopServer implements PacketIn, PacketOut {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>();
private UUID player;
@ -17,8 +20,19 @@ public class PacketStopServer implements PacketIn, PacketOut {
private String server;
private String id;
/**
* New PacketStopServer (In)
*/
public PacketStopServer() {}
/**
* New PacketStopServer (Out)
*
* @param player Player Starting
* @param server Server
* @param force Force Stop
* @param callback Callbacks
*/
@SafeVarargs
public PacketStopServer(UUID player, String server, boolean force, Callback<YAMLSection>... callback) {
if (Util.isNull(server, force, callback)) throw new NullPointerException();

View File

@ -128,6 +128,7 @@ public final class SubDataClient {
registerPacket(new PacketInReset(host), "SubServers", "Reset");
registerPacket(new PacketInRunEvent(), "SubServers", "RunEvent");
registerPacket(new PacketLinkExHost(host), "SubServers", "LinkExHost");
registerPacket(new PacketRestartServer(), "SubServers", "RestartServer");
registerPacket(new PacketStartServer(), "SubServers", "StartServer");
registerPacket(new PacketStopServer(), "SubServers", "StopServer");
@ -152,6 +153,7 @@ public final class SubDataClient {
registerPacket(PacketLinkExHost.class, "SubServers", "LinkExHost");
registerPacket(PacketOutExLogMessage.class, "SubServers", "ExLogMessage");
registerPacket(PacketOutExRequestQueue.class, "SubServers", "ExRequestQueue");
registerPacket(PacketRestartServer.class, "SubServers", "RestartServer");
registerPacket(PacketStartServer.class, "SubServers", "StartServer");
registerPacket(PacketStopServer.class, "SubServers", "StopServer");
}

View File

@ -0,0 +1,62 @@
package net.ME1312.SubServers.Sync.Network.Packet;
import net.ME1312.SubServers.Sync.Library.Callback;
import net.ME1312.SubServers.Sync.Library.Config.YAMLSection;
import net.ME1312.SubServers.Sync.Library.Util;
import net.ME1312.SubServers.Sync.Library.Version.Version;
import net.ME1312.SubServers.Sync.Network.PacketIn;
import net.ME1312.SubServers.Sync.Network.PacketOut;
import java.util.HashMap;
import java.util.UUID;
/**
* Restart Server Packet
*/
public class PacketRestartServer implements PacketIn, PacketOut {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>();
private UUID player;
private String server;
private String id;
/**
* New PacketRestartServer (In)
*/
public PacketRestartServer() {}
/**
* New PacketRestartServer (Out)
*
* @param player Player Starting
* @param server Server
* @param callback Callbacks
*/
@SafeVarargs
public PacketRestartServer(UUID player, String server, Callback<YAMLSection>... callback) {
if (Util.isNull(server, callback)) throw new NullPointerException();
this.player = player;
this.server = server;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString();
callbacks.put(id, callback);
}
@Override
public YAMLSection generate() {
YAMLSection data = new YAMLSection();
data.set("id", id);
if (player != null) data.set("player", player.toString());
data.set("server", server);
return data;
}
@Override
public void execute(YAMLSection data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data);
callbacks.remove(data.getRawString("id"));
}
@Override
public Version getVersion() {
return new Version("2.11.0a");
}
}

View File

@ -10,6 +10,9 @@ import net.ME1312.SubServers.Sync.Network.PacketOut;
import java.util.HashMap;
import java.util.UUID;
/**
* Stop Server Packet
*/
public class PacketStopServer implements PacketIn, PacketOut {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>();
private UUID player;
@ -17,8 +20,19 @@ public class PacketStopServer implements PacketIn, PacketOut {
private String server;
private String id;
/**
* New PacketStopServer (In)
*/
public PacketStopServer() {}
/**
* New PacketStopServer (Out)
*
* @param player Player Starting
* @param server Server
* @param force Force Stop
* @param callback Callbacks
*/
@SafeVarargs
public PacketStopServer(UUID player, String server, boolean force, Callback<YAMLSection>... callback) {
if (Util.isNull(server, force, callback)) throw new NullPointerException();

View File

@ -146,6 +146,7 @@ public final class SubDataClient {
registerPacket(new PacketInRunEvent(plugin), "SubServers", "RunEvent");
registerPacket(new PacketInReset(), "SubServers", "Reset");
registerPacket(new PacketLinkProxy(plugin), "SubServers", "LinkProxy");
registerPacket(new PacketRestartServer(), "SubServers", "RestartServer");
registerPacket(new PacketStartServer(), "SubServers", "StartServer");
registerPacket(new PacketStopServer(), "SubServers", "StopServer");
@ -161,6 +162,7 @@ public final class SubDataClient {
registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo");
registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo");
registerPacket(PacketLinkProxy.class, "SubServers", "LinkProxy");
registerPacket(PacketRestartServer.class, "SubServers", "RestartServer");
registerPacket(PacketStartServer.class, "SubServers", "StartServer");
registerPacket(PacketStopServer.class, "SubServers", "StopServer");
}

View File

@ -608,7 +608,7 @@ public final class SubCommand extends CommandX {
public NamedContainer<String, List<String>> suggestArguments(CommandSender sender, String[] args) {
String last = (args.length > 0)?args[args.length - 1].toLowerCase():"";
if (args.length <= 1) {
List<String> cmds = Arrays.asList("help", "list", "info", "status", "version", "start", "stop", "kill", "terminate", "cmd", "command", "create");
List<String> cmds = Arrays.asList("help", "list", "info", "status", "version", "start", "restart", "stop", "kill", "terminate", "cmd", "command", "create");
if (last.length() == 0) {
return new NamedContainer<>(null, cmds);
} else {