diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubStartedEvent.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubStartedEvent.java
new file mode 100644
index 00000000..4ec87cef
--- /dev/null
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubStartedEvent.java
@@ -0,0 +1,34 @@
+package net.ME1312.SubServers.Bungee.Event;
+
+import net.ME1312.Galaxi.Library.Util;
+import net.ME1312.SubServers.Bungee.Host.SubServer;
+import net.ME1312.SubServers.Bungee.Library.SubEvent;
+import net.md_5.bungee.api.plugin.Cancellable;
+import net.md_5.bungee.api.plugin.Event;
+
+import java.util.UUID;
+
+/**
+ * Server Started Event
+ */
+public class SubStartedEvent extends Event implements SubEvent {
+ private SubServer server;
+
+ /**
+ * Server Started Event
+ * This event can only be called when a SubData connection is made!
+ *
+ * @param server Server Starting
+ */
+ public SubStartedEvent(SubServer server) {
+ if (Util.isNull(server)) throw new NullPointerException();
+ this.server = server;
+ }
+
+ /**
+ * Gets the Server Effected
+ *
+ * @return The Server Effected
+ */
+ public SubServer getServer() { return server; }
+}
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java
index aa1223fb..991f9935 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java
@@ -195,7 +195,7 @@ public class ExternalSubCreator extends SubCreator {
String name = server.getName();
String prefix = name + File.separator + "Updater";
- Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("lock"), server, true));
+ Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("updating"), server, true));
ExternalSubLogger logger = new ExternalSubLogger(this, prefix, log, null);
thread.put(name.toLowerCase(), new NamedContainer<>(server.getAddress().getPort(), logger));
@@ -204,7 +204,7 @@ public class ExternalSubCreator extends SubCreator {
if (!event.isCancelled()) {
logger.start();
host.queue(new PacketExCreateServer(server, version, logger.getExternalAddress(), data -> {
- Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("lock"), server, false));
+ Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("updating"), server, false));
try {
if (data.getInt(0x0001) == 0) {
Logger.get(prefix).info("Saving...");
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java
index f5ca062a..e9c4deb9 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java
@@ -79,6 +79,7 @@ public class ExternalSubServer extends SubServerContainer {
lock = false;
if (!event.isCancelled()) {
Logger.get("SubServers").info("Now starting " + getName());
+ started = false;
running = true;
logger.start();
host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.START, logger.getExternalAddress().toString()));
@@ -105,12 +106,12 @@ public class ExternalSubServer extends SubServerContainer {
} else return false;
}
private void stopped(Boolean allowrestart) {
- SubStoppedEvent event = new SubStoppedEvent(this);
- host.plugin.getPluginManager().callEvent(event);
- Logger.get("SubServers").info(getName() + " has stopped");
logger.stop();
history.clear();
running = false;
+ SubStoppedEvent event = new SubStoppedEvent(this);
+ host.plugin.getPluginManager().callEvent(event);
+ Logger.get("SubServers").info(getName() + " has stopped");
if (stopaction == StopAction.REMOVE_SERVER || stopaction == StopAction.RECYCLE_SERVER || stopaction == StopAction.DELETE_SERVER) {
try {
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java
index c6af0830..cbd4b23b 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java
@@ -380,10 +380,10 @@ public class InternalSubCreator extends SubCreator {
if (host.isAvailable() && host.isEnabled() && host == server.getHost() && server.isAvailable() && !server.isRunning() && server.getTemplate() != null && server.getTemplate().isEnabled() && server.getTemplate().canUpdate() && (version != null || !server.getTemplate().requiresVersion())) {
StackTraceElement[] origin = new Exception().getStackTrace();
- Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("lock"), server, true));
+ Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("updating"), server, true));
CreatorTask task = new CreatorTask(player, server, version, x -> {
- Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("lock"), server, false));
+ Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("updating"), server, false));
if (callback != null && x != null) try {
callback.run(x);
} catch (Throwable e) {
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java
index 66ba44d2..82c3f4d7 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java
@@ -119,6 +119,7 @@ public class InternalSubServer extends SubServerContainer {
private void run() {
allowrestart = true;
+ started = false;
try {
ProcessBuilder pb = new ProcessBuilder().command(Executable.parse(host.getCreator().getBashDirectory(), executable)).directory(directory);
pb.environment().put("name", getName());
@@ -142,13 +143,14 @@ public class InternalSubServer extends SubServerContainer {
allowrestart = false;
}
- SubStoppedEvent event = new SubStoppedEvent(this);
- host.plugin.getPluginManager().callEvent(event);
Logger.get("SubServers").info(getName() + " has stopped");
process = null;
command = null;
history.clear();
+ SubStoppedEvent event = new SubStoppedEvent(this);
+ host.plugin.getPluginManager().callEvent(event);
+
if (stopaction == StopAction.REMOVE_SERVER || stopaction == StopAction.RECYCLE_SERVER || stopaction == StopAction.DELETE_SERVER) {
try {
if (stopaction == StopAction.RECYCLE_SERVER) {
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java
index d21ee1df..85efc917 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java
@@ -16,7 +16,8 @@ import java.util.*;
public abstract class SubServerContainer extends ServerContainer implements SubServer {
private List> incompatibilities = new ArrayList>();
private String template = null;
- private boolean lock;
+ protected boolean started;
+ private boolean updating;
/**
* Creates a SubServer
@@ -59,7 +60,7 @@ public abstract class SubServerContainer extends ServerContainer implements SubS
@Override
public boolean isAvailable() {
- return !lock && getHost().isAvailable();
+ return !updating && getHost().isAvailable();
}
@Override
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java
index f2e5b2e3..af60b46f 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java
@@ -25,12 +25,18 @@ public abstract class SubServerController {
control = new SubServerContainer(host, name, port, motd, hidden, restricted) {
@Override
public boolean start() {
- return SubServerController.this.start();
+ if (SubServerController.this.start()) {
+ started = false;
+ return true;
+ } else return false;
}
@Override
public boolean start(UUID player) {
- return SubServerController.this.start(player);
+ if (SubServerController.this.start(player)) {
+ started = false;
+ return true;
+ } else return false;
}
@Override
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java
index 08a68fd2..99a1331a 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java
@@ -3,6 +3,7 @@ package net.ME1312.SubServers.Bungee.Network.Packet;
import net.ME1312.SubData.Server.DataClient;
import net.ME1312.SubData.Server.Protocol.Initial.InitialPacket;
import net.ME1312.SubData.Server.SubDataClient;
+import net.ME1312.SubServers.Bungee.Event.SubStartedEvent;
import net.ME1312.SubServers.Bungee.Host.Server;
import net.ME1312.SubServers.Bungee.Host.ServerContainer;
import net.ME1312.SubServers.Bungee.Host.SubServer;
@@ -10,8 +11,10 @@ import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Server.Protocol.PacketObjectIn;
import net.ME1312.SubData.Server.Protocol.PacketObjectOut;
+import net.ME1312.SubServers.Bungee.Host.SubServerContainer;
import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger;
import net.ME1312.SubServers.Bungee.SubPlugin;
+import net.md_5.bungee.api.ProxyServer;
import java.net.InetSocketAddress;
import java.util.HashMap;
@@ -106,6 +109,11 @@ public class PacketLinkServer implements InitialPacket, PacketObjectIn,
Logger.get("SubServers").info("Sending shutdown signal to rogue SubServer: " + server.getName());
client.sendPacket(new PacketOutExReset("Rogue SubServer Detected"));
} else {
+ if (server instanceof SubServer && !Util.getDespiteException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("started"), server), true)) {
+ Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("started"), server, true));
+ SubStartedEvent event = new SubStartedEvent((SubServer) server);
+ ProxyServer.getInstance().getPluginManager().callEvent(event);
+ }
client.sendPacket(new PacketLinkServer(server.getName(), 0, null));
}
setReady(client, true);
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExRunEvent.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExRunEvent.java
index 592341da..ab4e0a93 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExRunEvent.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExRunEvent.java
@@ -114,6 +114,7 @@ public class PacketOutExRunEvent implements Listener, PacketObjectOut {
broadcast(new PacketOutExRunEvent(event.getClass(), args));
}
}
+
@EventHandler(priority = Byte.MAX_VALUE)
public void event(SubSendCommandEvent event) {
if (!event.isCancelled()) {
@@ -147,6 +148,14 @@ public class PacketOutExRunEvent implements Listener, PacketObjectOut {
broadcast(new PacketOutExRunEvent(event.getClass(), args));
}
}
+ @EventHandler(priority = Byte.MAX_VALUE)
+ public void event(SubStartedEvent event) {
+ ObjectMap args = new ObjectMap();
+ args.set("server", event.getServer().getName());
+ broadcast(event.getServer(), new PacketOutExRunEvent(event.getClass(), args));
+
+ }
+
@EventHandler(priority = Byte.MAX_VALUE)
public void event(SubStopEvent event) {
if (!event.isCancelled()) {
@@ -162,9 +171,10 @@ public class PacketOutExRunEvent implements Listener, PacketObjectOut {
public void event(SubStoppedEvent event) {
ObjectMap args = new ObjectMap();
args.set("server", event.getServer().getName());
- broadcast(new PacketOutExRunEvent(event.getClass(), args));
+ broadcast(event.getServer(), new PacketOutExRunEvent(event.getClass(), args));
}
+
@EventHandler(priority = Byte.MAX_VALUE)
public void event(SubRemoveServerEvent event) {
if (!event.isCancelled()) {
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Event/SubStartedEvent.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Event/SubStartedEvent.java
new file mode 100644
index 00000000..c6731f14
--- /dev/null
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Event/SubStartedEvent.java
@@ -0,0 +1,40 @@
+package net.ME1312.SubServers.Client.Bukkit.Event;
+
+import net.ME1312.Galaxi.Library.Util;
+import net.ME1312.SubServers.Client.Bukkit.Library.SubEvent;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+
+/**
+ * Server Started Event
+ */
+public class SubStartedEvent extends Event implements SubEvent {
+ private String server;
+
+ /**
+ * Server Started Event
+ * This event can only be called when a SubData connection is made!
+ *
+ * @param server Server that Started
+ */
+ public SubStartedEvent(String server) {
+ if (Util.isNull(server)) throw new NullPointerException();
+ this.server = server;
+ }
+
+ /**
+ * Gets the Server Effected
+ *
+ * @return The Server Effected
+ */
+ public String getServer() { return server; }
+
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+ private static HandlerList handlers = new HandlerList();
+}
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExRunEvent.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExRunEvent.java
index 8374201f..80fb748e 100644
--- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExRunEvent.java
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExRunEvent.java
@@ -89,6 +89,15 @@ public class PacketInExRunEvent implements PacketObjectIn {
}
}
});
+ callback("SubStartedEvent", new Callback>() {
+ @Override
+ public void run(ObjectMap data) {
+ if (plugin.isEnabled()) {
+ Bukkit.getPluginManager().callEvent(new SubStartedEvent(data.getString("server")));
+ callback("SubStartedEvent", this);
+ }
+ }
+ });
callback("SubStopEvent", new Callback>() {
@Override
public void run(ObjectMap data) {
diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStartedEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStartedEvent.java
new file mode 100644
index 00000000..ae2165b3
--- /dev/null
+++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStartedEvent.java
@@ -0,0 +1,43 @@
+package net.ME1312.SubServers.Client.Sponge.Event;
+
+import net.ME1312.Galaxi.Library.Util;
+import net.ME1312.SubServers.Client.Sponge.Library.SubEvent;
+import org.spongepowered.api.event.cause.Cause;
+import org.spongepowered.api.event.impl.AbstractEvent;
+
+/**
+ * Server Started Event
+ */
+public class SubStartedEvent extends AbstractEvent implements SubEvent {
+ private String server;
+
+ /**
+ * Server Started Event
+ * This event can only be called when a SubData connection is made!
+ *
+ * @param server Server that Started
+ */
+ public SubStartedEvent(String server) {
+ if (Util.isNull(server)) throw new NullPointerException();
+ this.server = server;
+ }
+
+ /**
+ * Gets the Server Effected
+ *
+ * @return The Server Effected
+ */
+ public String getServer() { return server; }
+
+ /**
+ * Gets the cause of this Event
+ *
+ * @deprecated Use simplified methods where available
+ * @return An empty cause list
+ */
+ @Override
+ @Deprecated
+ public Cause getCause() {
+ return Cause.builder().build(getContext());
+ }
+}
diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/Packet/PacketInExRunEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/Packet/PacketInExRunEvent.java
index b5d455c2..1ad63b2f 100644
--- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/Packet/PacketInExRunEvent.java
+++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/Packet/PacketInExRunEvent.java
@@ -75,6 +75,13 @@ public class PacketInExRunEvent implements PacketObjectIn {
callback("SubStartEvent", this);
}
});
+ callback("SubStartedEvent", new Callback>() {
+ @Override
+ public void run(ObjectMap data) {
+ Sponge.getEventManager().post(new SubStartedEvent(data.getString("server")));
+ callback("SubStartedEvent", this);
+ }
+ });
callback("SubStopEvent", new Callback>() {
@Override
public void run(ObjectMap data) {
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Event/SubStartedEvent.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Event/SubStartedEvent.java
new file mode 100644
index 00000000..3faeb8bd
--- /dev/null
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Event/SubStartedEvent.java
@@ -0,0 +1,31 @@
+package net.ME1312.SubServers.Host.Event;
+
+import net.ME1312.Galaxi.Library.Event.Event;
+import net.ME1312.Galaxi.Library.Util;
+
+/**
+ * Server Started Event
+ */
+public class SubStartedEvent extends Event {
+ private String server;
+
+ /**
+ * Server Started Event
+ * This event can only be called when a SubData connection is made!
+ *
+ * @param server Server that Started
+ */
+ public SubStartedEvent(String server) {
+ if (Util.isNull(server)) throw new NullPointerException();
+ this.server = server;
+ }
+
+ /**
+ * Gets the Server Effected
+ *
+ * @return The Server Effected
+ */
+ public String getServer() {
+ return server;
+ }
+}
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketInExRunEvent.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketInExRunEvent.java
index ef4db73c..d19993b4 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketInExRunEvent.java
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketInExRunEvent.java
@@ -73,6 +73,13 @@ public class PacketInExRunEvent implements PacketObjectIn {
callback("SubStartEvent", this);
}
});
+ callback("SubStartedEvent", new Callback>() {
+ @Override
+ public void run(ObjectMap data) {
+ GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubStartedEvent(data.getRawString("server")));
+ callback("SubStartedEvent", this);
+ }
+ });
callback("SubStopEvent", new Callback>() {
@Override
public void run(ObjectMap data) {
diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Event/SubStartedEvent.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Event/SubStartedEvent.java
new file mode 100644
index 00000000..aec5e61c
--- /dev/null
+++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Event/SubStartedEvent.java
@@ -0,0 +1,32 @@
+package net.ME1312.SubServers.Sync.Event;
+
+import net.ME1312.Galaxi.Library.Util;
+import net.ME1312.SubServers.Sync.Library.SubEvent;
+import net.md_5.bungee.api.plugin.Event;
+
+/**
+ * Server Started Event
+ */
+public class SubStartedEvent extends Event implements SubEvent {
+ private String server;
+
+ /**
+ * Server Started Event
+ * This event can only be called when a SubData connection is made!
+ *
+ * @param server Server that Started
+ */
+ public SubStartedEvent(String server) {
+ if (Util.isNull(server)) throw new NullPointerException();
+ this.server = server;
+ }
+
+ /**
+ * Gets the Server Effected
+ *
+ * @return The Server Effected
+ */
+ public String getServer() {
+ return server;
+ }
+}
diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketInExRunEvent.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketInExRunEvent.java
index fb4edfe2..453e28e5 100644
--- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketInExRunEvent.java
+++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketInExRunEvent.java
@@ -75,6 +75,13 @@ public class PacketInExRunEvent implements PacketObjectIn {
callback("SubStartEvent", this);
}
});
+ callback("SubStartedEvent", new Callback>() {
+ @Override
+ public void run(ObjectMap data) {
+ ProxyServer.getInstance().getPluginManager().callEvent(new SubStartedEvent(data.getRawString("server")));
+ callback("SubStartedEvent", this);
+ }
+ });
callback("SubNetworkConnectEvent", new Callback>() {
@Override
public void run(ObjectMap data) {
diff --git a/pom.xml b/pom.xml
index 4f9d8f94..469e58b6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,5 +13,6 @@
SubServers.Console
SubServers.Host
SubServers.Sync
+ SubServers.Test
\ No newline at end of file