allow custom Channel type to be wrapped in InjectionFactory#fromChannel

This commit is contained in:
Trần Nguyễn Ngọc Quang 2024-01-24 05:07:54 +07:00
parent 80aa420099
commit 034f753b9c
No known key found for this signature in database
GPG Key ID: C8DDBFDC5E9DC988

View File

@ -168,11 +168,19 @@ public class InjectionFactory {
Object netManager = this.findNetworkManager(channel); Object netManager = this.findNetworkManager(channel);
Player temporaryPlayer = playerFactory.createTemporaryPlayer(this.server); Player temporaryPlayer = playerFactory.createTemporaryPlayer(this.server);
// Use the channel field from an already found network manager to prevent our channel injector given in
// this method from overwriting initialized custom channel implementation in some spigot forks
Channel wrappedChannel = FuzzyReflection.getFieldValue(netManager, Channel.class, true);
if (wrappedChannel == null) {
// Use the channel straight from ChannelHandlerContext as fallback if the field has null value
wrappedChannel = channel;
}
NettyChannelInjector injector = new NettyChannelInjector( NettyChannelInjector injector = new NettyChannelInjector(
temporaryPlayer, temporaryPlayer,
this.server, this.server,
netManager, netManager,
channel, wrappedChannel,
listener, listener,
this, this,
this.errorReporter); this.errorReporter);