Skip to content

Commit be96926

Browse files
Inject packets at channel start
1 parent 3511034 commit be96926

3 files changed

Lines changed: 24 additions & 8 deletions

File tree

invui/src/main/java/xyz/xenondevs/invui/internal/menu/CustomContainerMenu.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,7 @@ public void sendChangesToRemote() {
205205
}
206206
}
207207

208-
var bundle = new ClientboundBundlePacket(packets);
209-
PacketListener.getInstance().injectOutgoing(player, bundle);
208+
PacketListener.getInstance().injectOutgoing(player, packets);
210209
}
211210

212211
/**
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package xyz.xenondevs.invui.internal.network;
2+
3+
import io.netty.channel.Channel;
4+
import io.netty.channel.DefaultChannelPromise;
5+
6+
/**
7+
* A channel promise for outgoing packets that directs {@link PacketListener} to not intercept the packet.
8+
*/
9+
class ForceChannelPromise extends DefaultChannelPromise {
10+
11+
ForceChannelPromise(Channel channel) {
12+
super(channel);
13+
}
14+
15+
}

invui/src/main/java/xyz/xenondevs/invui/internal/network/PacketListener.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,14 @@ public void stopDiscard(Player player, Class<? extends Packet<ClientGamePacketLi
4848
getPacketHandler(player.getUniqueId()).discardRules.remove(clazz);
4949
}
5050

51-
public void injectOutgoing(Player player, Packet<ClientGamePacketListener> packet) {
52-
getPacketHandler(player.getUniqueId()).injectOutgoing(packet);
51+
public void injectOutgoing(Player player, List<Packet<? super ClientGamePacketListener>> packets) {
52+
if (packets.isEmpty())
53+
return;
54+
injectOutgoing(player, new ClientboundBundlePacket(packets));
5355
}
5456

55-
public void injectOutgoing(Player player, List<Packet<? super ClientGamePacketListener>> packets) {
56-
getPacketHandler(player.getUniqueId()).injectOutgoing(new ClientboundBundlePacket(packets));
57+
public void injectOutgoing(Player player, Packet<ClientGamePacketListener> packet) {
58+
getPacketHandler(player.getUniqueId()).injectOutgoing(packet);
5759
}
5860

5961
@SuppressWarnings("unchecked")
@@ -116,7 +118,7 @@ public void injectOutgoing(Packet<ClientGamePacketListener> packet) {
116118

117119
try {
118120
print(packet, "injected");
119-
super.write(channel.pipeline().context(this), packet, channel.newPromise());
121+
channel.writeAndFlush(packet, new ForceChannelPromise(channel));
120122
} catch (Exception e) {
121123
throw new RuntimeException(e);
122124
}
@@ -125,7 +127,7 @@ public void injectOutgoing(Packet<ClientGamePacketListener> packet) {
125127
@SuppressWarnings("unchecked")
126128
@Override
127129
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
128-
if (msg instanceof Packet<?> packet) {
130+
if (msg instanceof Packet<?> packet && !(promise instanceof ForceChannelPromise)) {
129131
if (packet instanceof ClientboundBundlePacket bundle) {
130132
var subPackets = StreamSupport.stream(bundle.subPackets().spliterator(), false)
131133
.<Packet<? super ClientGamePacketListener>>map(this::singleWrite)

0 commit comments

Comments
 (0)