Added support for closing asynchronous listeners by packet listener.
Dieser Commit ist enthalten in:
Ursprung
d717ff1586
Commit
f378b7bbd9
@ -50,6 +50,12 @@ public interface AsynchronousManager {
|
|||||||
*/
|
*/
|
||||||
public abstract void unregisterAsyncHandler(AsyncListenerHandler handler);
|
public abstract void unregisterAsyncHandler(AsyncListenerHandler handler);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregisters and closes the first asynchronous handler associated with the given listener.
|
||||||
|
* @param handler - asynchronous handler.
|
||||||
|
*/
|
||||||
|
public abstract void unregisterAsyncHandler(PacketListener listener);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unregisters every asynchronous handler associated with this plugin.
|
* Unregisters every asynchronous handler associated with this plugin.
|
||||||
* @param plugin - the original plugin.
|
* @param plugin - the original plugin.
|
||||||
|
@ -175,12 +175,15 @@ public class AsyncFilterManager implements AsynchronousManager {
|
|||||||
ListeningWhitelist sendingWhitelist = listener.getSendingWhitelist();
|
ListeningWhitelist sendingWhitelist = listener.getSendingWhitelist();
|
||||||
ListeningWhitelist receivingWhitelist = listener.getReceivingWhitelist();
|
ListeningWhitelist receivingWhitelist = listener.getReceivingWhitelist();
|
||||||
|
|
||||||
|
if (!hasValidWhitelist(sendingWhitelist) && !hasValidWhitelist(receivingWhitelist)) {
|
||||||
|
throw new IllegalArgumentException("Listener has an empty sending and receiving whitelist.");
|
||||||
|
}
|
||||||
|
|
||||||
// Add listener to either or both processing queue
|
// Add listener to either or both processing queue
|
||||||
if (hasValidWhitelist(sendingWhitelist)) {
|
if (hasValidWhitelist(sendingWhitelist)) {
|
||||||
PacketFilterManager.verifyWhitelist(listener, sendingWhitelist);
|
PacketFilterManager.verifyWhitelist(listener, sendingWhitelist);
|
||||||
serverProcessingQueue.addListener(handler, sendingWhitelist);
|
serverProcessingQueue.addListener(handler, sendingWhitelist);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasValidWhitelist(receivingWhitelist)) {
|
if (hasValidWhitelist(receivingWhitelist)) {
|
||||||
PacketFilterManager.verifyWhitelist(listener, receivingWhitelist);
|
PacketFilterManager.verifyWhitelist(listener, receivingWhitelist);
|
||||||
clientProcessingQueue.addListener(handler, receivingWhitelist);
|
clientProcessingQueue.addListener(handler, receivingWhitelist);
|
||||||
@ -191,7 +194,6 @@ public class AsyncFilterManager implements AsynchronousManager {
|
|||||||
handler.setNullPacketListener(new NullPacketListener(listener));
|
handler.setNullPacketListener(new NullPacketListener(listener));
|
||||||
manager.addPacketListener(handler.getNullPacketListener());
|
manager.addPacketListener(handler.getNullPacketListener());
|
||||||
}
|
}
|
||||||
|
|
||||||
return handler;
|
return handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,6 +216,35 @@ public class AsyncFilterManager implements AsynchronousManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unregisterAsyncHandler(PacketListener listener) {
|
||||||
|
if (listener == null)
|
||||||
|
throw new IllegalArgumentException("listener cannot be NULL.");
|
||||||
|
|
||||||
|
AsyncListenerHandler handler =
|
||||||
|
findHandler(serverProcessingQueue, listener.getSendingWhitelist(), listener);
|
||||||
|
|
||||||
|
if (handler == null) {
|
||||||
|
handler = findHandler(clientProcessingQueue, listener.getReceivingWhitelist(), listener);
|
||||||
|
}
|
||||||
|
unregisterAsyncHandler(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search for the first correct handler
|
||||||
|
private AsyncListenerHandler findHandler(PacketProcessingQueue queue, ListeningWhitelist search, PacketListener target) {
|
||||||
|
if (ListeningWhitelist.isEmpty(search))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
for (PacketType type : search.getTypes()) {
|
||||||
|
for (PrioritizedListener<AsyncListenerHandler> element : queue.getListener(type)) {
|
||||||
|
if (element.getListener().getAsyncListener() == target) {
|
||||||
|
return element.getListener();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void unregisterAsyncHandler(AsyncListenerHandler handler) {
|
public void unregisterAsyncHandler(AsyncListenerHandler handler) {
|
||||||
if (handler == null)
|
if (handler == null)
|
||||||
|
@ -218,7 +218,7 @@ public class ListeningWhitelist {
|
|||||||
else if (whitelist == null)
|
else if (whitelist == null)
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
return whitelist.getWhitelist().isEmpty();
|
return whitelist.getTypes().isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -294,9 +294,10 @@ public class ListeningWhitelist {
|
|||||||
* @author Kristian
|
* @author Kristian
|
||||||
*/
|
*/
|
||||||
public static class Builder {
|
public static class Builder {
|
||||||
private ListenerPriority priority;
|
// Default values
|
||||||
|
private ListenerPriority priority = ListenerPriority.NORMAL;
|
||||||
private Set<PacketType> types = Sets.newHashSet();
|
private Set<PacketType> types = Sets.newHashSet();
|
||||||
private GamePhase gamePhase;
|
private GamePhase gamePhase = GamePhase.PLAYING;
|
||||||
private Set<ListenerOptions> options = Sets.newHashSet();
|
private Set<ListenerOptions> options = Sets.newHashSet();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren