4343import com .comphenix .protocol .injector .collection .InboundPacketListenerSet ;
4444import com .comphenix .protocol .injector .collection .OutboundPacketListenerSet ;
4545import com .comphenix .protocol .injector .collection .PacketListenerSet ;
46+ import com .comphenix .protocol .injector .netty .Injector ;
4647import com .comphenix .protocol .injector .netty .WirePacket ;
4748import com .comphenix .protocol .injector .netty .manager .NetworkManagerInjector ;
4849import com .comphenix .protocol .injector .packet .PacketRegistry ;
@@ -151,29 +152,20 @@ public void sendServerPacket(Player receiver, PacketContainer packet, boolean fi
151152
152153 @ Override
153154 public void sendServerPacket (Player receiver , PacketContainer packet , NetworkMarker marker , boolean filters ) {
154- if (!this .closed ) {
155- // if we skip the packet events later when actually writing into the pipeline we at least notify all
156- // monitor listeners before doing so - they will not be able to change the event tho
157- if (!filters ) {
158- // ensure we are on the main thread if any listener requires that
159- if (this .hasMainThreadListener (packet .getType ()) && !this .server .isPrimaryThread ()) {
160- NetworkMarker copy = marker ; // okay fine
161- ProtocolLibrary .getScheduler ().scheduleSyncDelayedTask (
162- () -> this .sendServerPacket (receiver , packet , copy , false ), 1L );
163- return ;
164- }
165-
166- // construct the event and post to all monitor listeners
155+ if (this .closed ) {
156+ return ;
157+ }
158+
159+ // A monitor listener should never modify a packet/event so we can simply invoke monitor listeners
160+ // independently of our injector pipeline
161+ if (!filters ) {
162+ this .runMonitorListeners (packet , () -> {
167163 PacketEvent event = PacketEvent .fromServer (this , packet , marker , receiver , false );
168164 this .outboundListeners .invoke (event , ListenerPriority .MONITOR );
169-
170- // update the marker of the event without accidentally constructing it
171- marker = NetworkMarker .getNetworkMarker (event );
172- }
173-
174- // process outbound
175- this .networkManagerInjector .getInjector (receiver ).sendClientboundPacket (packet .getHandle (), marker , filters );
165+ });
176166 }
167+
168+ this .networkManagerInjector .getInjector (receiver ).sendClientboundPacket (packet .getHandle (), marker , filters );
177169 }
178170
179171 @ Override
@@ -200,34 +192,40 @@ public void receiveClientPacket(Player sender, PacketContainer packet, boolean f
200192
201193 @ Override
202194 public void receiveClientPacket (Player sender , PacketContainer packet , NetworkMarker marker , boolean filters ) {
203- if (!this .closed ) {
204- // make sure we are on the main thread if any listener of the packet needs it
205- if (this .hasMainThreadListener (packet .getType ()) && !this .server .isPrimaryThread ()) {
206- ProtocolLibrary .getScheduler ().runTask (
207- () -> this .receiveClientPacket (sender , packet , marker , filters ));
195+ if (this .closed ) {
196+ return ;
197+ }
198+
199+ // make sure we are on the main thread if any listener of the packet needs it
200+ if (filters && this .requiresMainThread (packet )) {
201+ ProtocolLibrary .getScheduler ().runTask (
202+ () -> this .receiveClientPacket (sender , packet , marker , filters ));
203+ return ;
204+ }
205+
206+ Object nmsPacket = packet .getHandle ();
207+
208+ if (filters ) {
209+ PacketEvent event = PacketEvent .fromClient (this , packet , marker , sender , false );
210+ this .invokeInboundPacketListeners (event );
211+
212+ if (event .isCancelled ()) {
208213 return ;
209214 }
210215
211- Object nmsPacket = packet .getHandle ();
212- // check to which listeners we need to post the packet
213- if (filters ) {
214- // post to all listeners
215- PacketEvent event = PacketEvent .fromClient (this .networkManagerInjector , packet , null , sender );
216- this .invokeInboundPacketListeners (event );
217- if (event .isCancelled ()) {
218- return ;
219- }
220-
221- // prevent possible de-sync
222- nmsPacket = event .getPacket ().getHandle ();
223- } else {
216+ // Prevent possible de-sync if the packet was replaced by a listener.
217+ nmsPacket = event .getPacket ().getHandle ();
218+ } else {
219+ // A monitor listener should never modify a packet/event so we can simply invoke monitor listeners
220+ // independently of our injector pipeline
221+ this .runMonitorListeners (packet , () -> {
224222 PacketEvent event = PacketEvent .fromClient (this , packet , marker , sender , false );
225223 this .inboundListeners .invoke (event , ListenerPriority .MONITOR );
226- }
227-
228- // post to the player inject, reset our cancel state change
229- this .networkManagerInjector .getInjector (sender ).readServerboundPacket (nmsPacket );
224+ });
230225 }
226+
227+ // post to the player inject, reset our cancel state change
228+ this .networkManagerInjector .getInjector (sender ).readServerboundPacket (nmsPacket );
231229 }
232230
233231 @ Override
@@ -516,12 +514,25 @@ public void invokeOutboundPacketListeners(PacketEvent event) {
516514 this .postPacketToListeners (this .outboundListeners , event , true );
517515 }
518516 }
517+
518+ private boolean requiresMainThread (PacketContainer packet ) {
519+ return this .hasMainThreadListener (packet .getType ()) && !this .server .isPrimaryThread ();
520+ }
521+
522+ private void runMonitorListeners (PacketContainer packet , Runnable notifyMonitor ) {
523+ if (this .requiresMainThread (packet )) {
524+ ProtocolLibrary .getScheduler ().runTask (notifyMonitor );
525+ } else {
526+ notifyMonitor .run ();
527+ }
528+ }
519529
520530 private void postPacketToListeners (PacketListenerSet listeners , PacketEvent event , boolean outbound ) {
521531 try {
522532 // append async marker if any async listener for the packet was registered
523533 if (this .asyncFilterManager .hasAsynchronousListeners (event )) {
524- event .setAsyncMarker (this .asyncFilterManager .createAsyncMarker ());
534+ Injector injector = this .networkManagerInjector .getInjector (event .getPlayer ());
535+ event .setAsyncMarker (this .asyncFilterManager .createAsyncMarker (injector ));
525536 }
526537
527538 // post to sync listeners
0 commit comments