diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/PacketStream.java b/ProtocolLib/src/main/java/com/comphenix/protocol/PacketStream.java index 6d07232c..a243452a 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/PacketStream.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/PacketStream.java @@ -21,6 +21,7 @@ import java.lang.reflect.InvocationTargetException; import org.bukkit.entity.Player; +import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.PacketContainer; /** @@ -43,7 +44,7 @@ public interface PacketStream { * Send a packet to the given player. * @param reciever - the reciever. * @param packet - packet to send. - * @param filters - whether or not to invoke any packet filters. + * @param filters - whether or not to invoke any packet filters below {@link ListenerPriority#MONITOR}. * @throws InvocationTargetException - if an error occured when sending the packet. */ public void sendServerPacket(Player reciever, PacketContainer packet, boolean filters) @@ -63,7 +64,7 @@ public interface PacketStream { * Simulate recieving a certain packet from a given player. * @param sender - the sender. * @param packet - the packet that was sent. - * @param filters - whether or not to invoke any packet filters. + * @param filters - whether or not to invoke any packet filters below {@link ListenerPriority#MONITOR}. * @throws InvocationTargetException If the reflection machinery failed. * @throws IllegalAccessException If the underlying method caused an error. */ diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolManager.java b/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolManager.java index 741c54bc..a9da948f 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolManager.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolManager.java @@ -27,6 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import com.comphenix.protocol.async.AsyncMarker; +import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketListener; import com.comphenix.protocol.injector.PacketConstructor; @@ -47,7 +48,7 @@ public interface ProtocolManager extends PacketStream { * * @param reciever - the reciever. * @param packet - packet to send. - * @param filters - whether or not to invoke any packet filters. + * @param filters - whether or not to invoke any packet filters below {@link ListenerPriority#MONITOR}. * @throws InvocationTargetException - if an error occured when sending the packet. */ @Override @@ -62,7 +63,7 @@ public interface ProtocolManager extends PacketStream { * * @param sender - the sender. * @param packet - the packet that was sent. - * @param filters - whether or not to invoke any packet filters. + * @param filters - whether or not to invoke any packet filters below {@link ListenerPriority#MONITOR}. * @throws InvocationTargetException If the reflection machinery failed. * @throws IllegalAccessException If the underlying method caused an error. */ diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/concurrency/AbstractConcurrentListenerMultimap.java b/ProtocolLib/src/main/java/com/comphenix/protocol/concurrency/AbstractConcurrentListenerMultimap.java index 52d869db..a3fdefac 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/concurrency/AbstractConcurrentListenerMultimap.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/concurrency/AbstractConcurrentListenerMultimap.java @@ -34,7 +34,6 @@ import com.google.common.collect.Iterables; * @author Kristian */ public abstract class AbstractConcurrentListenerMultimap { - // The core of our map private ConcurrentMap>> listeners = new ConcurrentHashMap>>(); @@ -45,7 +44,6 @@ public abstract class AbstractConcurrentListenerMultimap { * @param whitelist - the packet whitelist to use. */ public void addListener(TListener listener, ListeningWhitelist whitelist) { - PrioritizedListener prioritized = new PrioritizedListener(listener, whitelist.getPriority()); for (Integer packetID : whitelist.getWhitelist()) { @@ -55,7 +53,6 @@ public abstract class AbstractConcurrentListenerMultimap { // Add the listener to a specific packet notifcation list private void addListener(Integer packetID, PrioritizedListener listener) { - SortedCopyOnWriteArray> list = listeners.get(packetID); // We don't want to create this for every lookup @@ -84,7 +81,6 @@ public abstract class AbstractConcurrentListenerMultimap { * @return Every packet ID that was removed due to no listeners. */ public List removeListener(TListener listener, ListeningWhitelist whitelist) { - List removedPackets = new ArrayList(); // Again, not terribly efficient. But adding or removing listeners should be a rare event. diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PacketFilterManager.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PacketFilterManager.java index 0bdb1023..28b79198 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PacketFilterManager.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PacketFilterManager.java @@ -537,6 +537,14 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok if (packetCreation.compareAndSet(false, true)) incrementPhases(GamePhase.PLAYING); + // Inform the MONITOR packets + if (!filters) { + sendingListeners.invokePacketSending( + reporter, + PacketEvent.fromServer(this, packet, reciever), + ListenerPriority.MONITOR); + } + playerInjection.sendServerPacket(reciever, packet, filters); } @@ -567,6 +575,13 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok mcPacket = event.getPacket().getHandle(); else return; + + } else { + // Let the monitors know though + recievedListeners.invokePacketSending( + reporter, + PacketEvent.fromClient(this, packet, sender), + ListenerPriority.MONITOR); } playerInjection.recieveClientPacket(sender, mcPacket); diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/SortedPacketListenerList.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/SortedPacketListenerList.java index 9c895e28..9862b3ca 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/SortedPacketListenerList.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/SortedPacketListenerList.java @@ -21,6 +21,7 @@ import java.util.Collection; import com.comphenix.protocol.concurrency.AbstractConcurrentListenerMultimap; import com.comphenix.protocol.error.ErrorReporter; +import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketListener; @@ -30,7 +31,6 @@ import com.comphenix.protocol.events.PacketListener; * @author Kristian */ public final class SortedPacketListenerList extends AbstractConcurrentListenerMultimap { - /** * Invokes the given packet event for every registered listener. * @param reporter - the error reporter that will be used to inform about listener exceptions. @@ -54,6 +54,33 @@ public final class SortedPacketListenerList extends AbstractConcurrentListenerMu } } + /** + * Invokes the given packet event for every registered listener of the given priority. + * @param reporter - the error reporter that will be used to inform about listener exceptions. + * @param event - the packet event to invoke. + * @param priorityFilter - the required priority for a listener to be invoked. + */ + public void invokePacketRecieving(ErrorReporter reporter, PacketEvent event, ListenerPriority priorityFilter) { + Collection> list = getListener(event.getPacketID()); + + if (list == null) + return; + + for (PrioritizedListener element : list) { + final PacketListener listener = element.getListener(); + + try { + if (listener.getReceivingWhitelist().getPriority() == priorityFilter) { + listener.onPacketReceiving(event); + } + } catch (Throwable e) { + // Minecraft doesn't want your Exception. + reporter.reportMinimal(listener.getPlugin(), "onPacketReceiving(PacketEvent)", e, + event.getPacket().getHandle()); + } + } + } + /** * Invokes the given packet event for every registered listener. * @param reporter - the error reporter that will be used to inform about listener exceptions. @@ -76,4 +103,30 @@ public final class SortedPacketListenerList extends AbstractConcurrentListenerMu } } + /** + * Invokes the given packet event for every registered listener of the given priority. + * @param reporter - the error reporter that will be used to inform about listener exceptions. + * @param event - the packet event to invoke. + * @param priorityFilter - the required priority for a listener to be invoked. + */ + public void invokePacketSending(ErrorReporter reporter, PacketEvent event, ListenerPriority priorityFilter) { + Collection> list = getListener(event.getPacketID()); + + if (list == null) + return; + + for (PrioritizedListener element : list) { + final PacketListener listener = element.getListener(); + + try { + if (listener.getSendingWhitelist().getPriority() == priorityFilter) { + listener.onPacketSending(event); + } + } catch (Throwable e) { + // Minecraft doesn't want your Exception. + reporter.reportMinimal(listener.getPlugin(), "onPacketSending(PacketEvent)", e, + event.getPacket().getHandle()); + } + } + } }