18
18
19
19
package io .github .retrooper .packetevents .sponge .injector .handlers ;
20
20
21
+ import com .github .retrooper .packetevents .PacketEvents ;
21
22
import com .github .retrooper .packetevents .exception .PacketProcessException ;
23
+ import com .github .retrooper .packetevents .netty .buffer .ByteBufHelper ;
22
24
import com .github .retrooper .packetevents .protocol .ConnectionState ;
23
25
import com .github .retrooper .packetevents .protocol .player .User ;
24
26
import com .github .retrooper .packetevents .util .ExceptionUtil ;
25
27
import com .github .retrooper .packetevents .util .PacketEventsImplHelper ;
28
+ import com .github .retrooper .packetevents .wrapper .play .server .WrapperPlayServerDisconnect ;
26
29
import io .github .retrooper .packetevents .sponge .injector .connection .ServerConnectionInitializer ;
27
30
import io .github .retrooper .packetevents .sponge .util .SpongeReflectionUtil ;
28
31
import io .netty .buffer .ByteBuf ;
29
32
import io .netty .channel .ChannelHandlerContext ;
30
33
import io .netty .handler .codec .MessageToMessageDecoder ;
34
+ import net .kyori .adventure .text .Component ;
35
+ import org .spongepowered .api .Sponge ;
31
36
import org .spongepowered .api .entity .living .player .server .ServerPlayer ;
37
+ import org .spongepowered .api .scheduler .Task ;
38
+ import org .spongepowered .plugin .PluginContainer ;
32
39
33
40
import java .util .List ;
34
41
@@ -49,8 +56,8 @@ public PacketEventsDecoder(PacketEventsDecoder decoder) {
49
56
}
50
57
51
58
public void read (ChannelHandlerContext ctx , ByteBuf input , List <Object > out ) throws Exception {
52
- PacketEventsImplHelper .handleServerBoundPacket (ctx .channel (), user , player , input , true );
53
- out .add (input .retain ());
59
+ Object buffer = PacketEventsImplHelper .handleServerBoundPacket (ctx .channel (), user , player , input , true );
60
+ out .add (ByteBufHelper .retain (buffer ));
54
61
}
55
62
56
63
@ Override
@@ -68,7 +75,25 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E
68
75
if (ExceptionUtil .isException (cause , PacketProcessException .class )
69
76
&& !SpongeReflectionUtil .isMinecraftServerInstanceDebugging ()
70
77
&& (user != null && user .getDecoderState () != ConnectionState .HANDSHAKING )) {
71
- cause .printStackTrace ();
78
+ if (PacketEvents .getAPI ().getSettings ().isFullStackTraceEnabled ()) {
79
+ cause .printStackTrace ();
80
+ } else {
81
+ PacketEvents .getAPI ().getLogManager ().warn (cause .getMessage ());
82
+ }
83
+
84
+ if (PacketEvents .getAPI ().getSettings ().isKickOnPacketExceptionEnabled ()) {
85
+ try {
86
+ user .sendPacket (new WrapperPlayServerDisconnect (Component .text ("Invalid packet" )));
87
+ } catch (Exception ignored ) { // There may (?) be an exception if the player is in the wrong state...
88
+ // Do nothing.
89
+ }
90
+ user .closeConnection ();
91
+ if (player != null ) {
92
+ Sponge .server ().scheduler ().submit (Task .builder ().plugin ((PluginContainer ) PacketEvents .getAPI ().getPlugin ()).execute (() -> player .kick (Component .text ("Invalid packet" ))).build ());
93
+ }
94
+
95
+ PacketEvents .getAPI ().getLogManager ().warn ("Disconnected " + user .getProfile ().getName () + " due to invalid packet!" );
96
+ }
72
97
}
73
98
}
74
99
0 commit comments