Properly handle reloads on Spigot.
The code is getting uglier and uglier ...
Dieser Commit ist enthalten in:
Ursprung
a4f81e5e9f
Commit
47a5382709
@ -22,6 +22,7 @@ import java.lang.reflect.Method;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
@ -271,39 +272,58 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
|
|||||||
// They must reference each other
|
// They must reference each other
|
||||||
delayed.setAsynchronousManager(asyncManager);
|
delayed.setAsynchronousManager(asyncManager);
|
||||||
asyncManager.setManager(delayed);
|
asyncManager.setManager(delayed);
|
||||||
|
|
||||||
Futures.addCallback(BukkitFutures.nextEvent(library, WorldInitEvent.class), new FutureCallback<WorldInitEvent>() {
|
final Callable<Object> registerSpigot = new Callable<Object>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(WorldInitEvent event) {
|
public Object call() throws Exception {
|
||||||
// Nevermind
|
// Now we are probably able to check for Netty
|
||||||
if (delayed.isClosed())
|
InjectedServerConnection inspector = new InjectedServerConnection(reporter, null, server, null);
|
||||||
return;
|
Object connection = inspector.getServerConnection();
|
||||||
|
|
||||||
|
// Use netty if we have a non-standard ServerConnection class
|
||||||
|
boolean useNetty = !MinecraftReflection.isMinecraftObject(connection);
|
||||||
|
|
||||||
try {
|
// Switch to the standard manager
|
||||||
// Now we are probably able to check for Netty
|
delayed.setDelegate(new PacketFilterManager(
|
||||||
InjectedServerConnection inspector = new InjectedServerConnection(reporter, null, server, null);
|
classLoader, server, library, asyncManager, mcVersion, unhookTask, reporter, useNetty)
|
||||||
Object connection = inspector.getServerConnection();
|
);
|
||||||
|
|
||||||
|
// Reference this manager directly
|
||||||
|
asyncManager.setManager(delayed.getDelegate());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Use netty if we have a non-standard ServerConnection class
|
// If the server hasn't loaded yet - wait
|
||||||
boolean useNetty = !MinecraftReflection.isMinecraftObject(connection);
|
if (server.getWorlds().size() == 0) {
|
||||||
|
Futures.addCallback(BukkitFutures.nextEvent(library, WorldInitEvent.class), new FutureCallback<WorldInitEvent>() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(WorldInitEvent event) {
|
||||||
|
// Nevermind
|
||||||
|
if (delayed.isClosed())
|
||||||
|
return;
|
||||||
|
|
||||||
// Switch to the standard manager
|
try {
|
||||||
delayed.setDelegate(new PacketFilterManager(
|
registerSpigot.call();
|
||||||
classLoader, server, library, asyncManager, mcVersion, unhookTask, reporter, useNetty)
|
} catch (Exception e) {
|
||||||
);
|
onFailure(e);
|
||||||
// Reference this manager directly
|
}
|
||||||
asyncManager.setManager(delayed.getDelegate());
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
onFailure(e);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Throwable error) {
|
||||||
|
reporter.reportWarning(PacketFilterManager.class, Report.newBuilder(REPORT_TEMPORARY_EVENT_ERROR).error(error));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
@Override
|
} else {
|
||||||
public void onFailure(Throwable error) {
|
// Do it now
|
||||||
reporter.reportWarning(PacketFilterManager.class, Report.newBuilder(REPORT_TEMPORARY_EVENT_ERROR).error(error));
|
try {
|
||||||
|
registerSpigot.call();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
// Let plugins use this version instead
|
// Let plugins use this version instead
|
||||||
return delayed;
|
return delayed;
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren