Archiviert
13
0

Properly handle reloads on Spigot.

The code is getting uglier and uglier ...
Dieser Commit ist enthalten in:
Kristian S. Stangeland 2013-07-06 08:06:16 +02:00
Ursprung a4f81e5e9f
Commit 47a5382709

Datei anzeigen

@ -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;