9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-30 20:39:10 +00:00

修复网络包压缩

This commit is contained in:
XiaoMoMi
2025-05-28 18:13:04 +08:00
parent 09078e695e
commit 684b1e9792
8 changed files with 91 additions and 30 deletions

View File

@@ -70,6 +70,11 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
Bukkit.getPluginManager().registerEvents(this.armorEventListener, this.plugin.bootstrap());
}
@Override
public NetworkItemHandler<ItemStack> networkItemHandler() {
return this.networkItemHandler;
}
public static BukkitItemManager instance() {
return instance;
}

View File

@@ -30,7 +30,7 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
if (json == null) {
item.resetComponent(ComponentTypes.CUSTOM_NAME);
} else {
item.setSparrowNBTComponent(ComponentTypes.CUSTOM_NAME, NBTComponentSerializer.nbt().serialize(AdventureHelper.jsonToComponent(json)));
item.setSparrowNBTComponent(ComponentTypes.CUSTOM_NAME, AdventureHelper.componentToNbt(AdventureHelper.jsonToComponent(json)));
}
}
@@ -44,7 +44,7 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
if (component == null) {
item.resetComponent(ComponentTypes.CUSTOM_NAME);
} else {
item.setSparrowNBTComponent(ComponentTypes.CUSTOM_NAME, NBTComponentSerializer.nbt().serialize(component));
item.setSparrowNBTComponent(ComponentTypes.CUSTOM_NAME, AdventureHelper.componentToNbt(component));
}
}
@@ -58,7 +58,7 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
if (json == null) {
item.resetComponent(ComponentTypes.ITEM_NAME);
} else {
item.setSparrowNBTComponent(ComponentTypes.ITEM_NAME, NBTComponentSerializer.nbt().serialize(AdventureHelper.jsonToComponent(json)));
item.setSparrowNBTComponent(ComponentTypes.ITEM_NAME, AdventureHelper.componentToNbt(AdventureHelper.jsonToComponent(json)));
}
}
@@ -67,7 +67,7 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
if (component == null) {
item.resetComponent(ComponentTypes.ITEM_NAME);
} else {
item.setSparrowNBTComponent(ComponentTypes.ITEM_NAME, NBTComponentSerializer.nbt().serialize(component));
item.setSparrowNBTComponent(ComponentTypes.ITEM_NAME, AdventureHelper.componentToNbt(component));
}
}
@@ -95,7 +95,7 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
} else {
List<Tag> loreTags = new ArrayList<>();
for (Component component : lore) {
loreTags.add(NBTComponentSerializer.nbt().serialize(component));
loreTags.add(AdventureHelper.componentToTag(component));
}
item.setSparrowNBTComponent(ComponentTypes.LORE, new ListTag(loreTags));
}
@@ -108,7 +108,7 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
} else {
List<Tag> loreTags = new ArrayList<>();
for (String json : lore) {
loreTags.add(NBTComponentSerializer.nbt().serialize(AdventureHelper.jsonToComponent(json)));
loreTags.add(AdventureHelper.componentToTag(AdventureHelper.jsonToComponent(json)));
}
item.setSparrowNBTComponent(ComponentTypes.LORE, new ListTag(loreTags));
}

View File

@@ -3,6 +3,7 @@ package net.momirealms.craftengine.bukkit.plugin.network;
import com.google.gson.JsonObject;
import io.netty.buffer.ByteBuf;
import io.netty.channel.*;
import io.netty.handler.codec.MessageToMessageCodec;
import io.netty.handler.codec.MessageToMessageDecoder;
import io.netty.handler.codec.MessageToMessageEncoder;
import io.netty.util.internal.logging.InternalLogger;
@@ -590,11 +591,16 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
int preProcessIndex = buf.readerIndex();
int packetId = buf.readVarInt();
int preIndex = buf.readerIndex();
ByteBufPacketEvent event = new ByteBufPacketEvent(packetId, buf, preIndex);
BukkitNetworkManager.this.handleS2CByteBufPacket(this.player, event);
if (event.isCancelled()) {
buf.clear();
} else if (!event.changed()) {
try {
ByteBufPacketEvent event = new ByteBufPacketEvent(packetId, buf, preIndex);
BukkitNetworkManager.this.handleS2CByteBufPacket(this.player, event);
if (event.isCancelled()) {
buf.clear();
} else if (!event.changed()) {
buf.readerIndex(preProcessIndex);
}
} catch (Throwable e) {
CraftEngine.instance().logger().warn("An error occurred when writing packet " + packetId, e);
buf.readerIndex(preProcessIndex);
}
}
@@ -603,19 +609,46 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
public class PluginChannelDecoder extends MessageToMessageDecoder<ByteBuf> {
private final NetWorkUser player;
private boolean handledCompression = false;
public PluginChannelDecoder(NetWorkUser player) {
this.player = player;
}
public PluginChannelDecoder(PluginChannelDecoder decoder) {
this.player = decoder.player;
this.handledCompression = decoder.handledCompression;
}
@Override
protected void decode(ChannelHandlerContext context, ByteBuf byteBuf, List<Object> list) {
protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) {
boolean needCompression = !handledCompression && handleCompression(channelHandlerContext, byteBuf);
this.onByteBufReceive(byteBuf);
if (needCompression) {
compress(channelHandlerContext, byteBuf);
}
if (byteBuf.isReadable()) {
list.add(byteBuf.retain());
}
}
private boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) {
if (handledCompression) return false;
int compressIndex = ctx.pipeline().names().indexOf("compress");
if (compressIndex == -1) return false;
handledCompression = true;
int decoderIndex = ctx.pipeline().names().indexOf(PACKET_DECODER);
if (decoderIndex == -1) return false;
if (compressIndex > decoderIndex) {
decompress(ctx, buffer, buffer);
PluginChannelDecoder encoder = (PluginChannelDecoder) ctx.pipeline().remove(PACKET_DECODER);
String decoderName = ctx.pipeline().names().contains("inbound_config") ? "inbound_config" : "decoder";
ctx.pipeline().addBefore(decoderName, PACKET_DECODER, new PluginChannelDecoder(encoder));
return true;
}
return false;
}
private void onByteBufReceive(ByteBuf buffer) {
// I don't care packets before PLAY for the moment
if (player.decoderState() != ConnectionState.PLAY) return;
@@ -625,11 +658,16 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
int preProcessIndex = buf.readerIndex();
int packetId = buf.readVarInt();
int preIndex = buf.readerIndex();
ByteBufPacketEvent event = new ByteBufPacketEvent(packetId, buf, preIndex);
BukkitNetworkManager.this.handleC2SByteBufPacket(this.player, event);
if (event.isCancelled()) {
buf.clear();
} else if (!event.changed()) {
try {
ByteBufPacketEvent event = new ByteBufPacketEvent(packetId, buf, preIndex);
BukkitNetworkManager.this.handleC2SByteBufPacket(this.player, event);
if (event.isCancelled()) {
buf.clear();
} else if (!event.changed()) {
buf.readerIndex(preProcessIndex);
}
} catch (Throwable e) {
CraftEngine.instance().logger().warn("An error occurred when reading packet " + packetId, e);
buf.readerIndex(preProcessIndex);
}
}

View File

@@ -6936,9 +6936,8 @@ public class Reflections {
)
);
public static final Class<?> clazz$JavaOps = requireNonNull(
ReflectionUtils.getClazz("com.mojang.serialization.JavaOps")
);
// 1.20.5+
public static final Class<?> clazz$JavaOps = ReflectionUtils.getClazz("com.mojang.serialization.JavaOps");
public static final Class<?> clazz$NbtOps = requireNonNull(
BukkitReflectionUtils.findReobfOrMojmapClass(
@@ -6962,8 +6961,13 @@ public class Reflections {
try {
Object nbtOps = ReflectionUtils.getDeclaredField(clazz$NbtOps, clazz$NbtOps, 0).get(null);
instance$NBT_OPS = (DynamicOps<Object>) method$RegistryOps$create.invoke(null, nbtOps, instance$MinecraftRegistry);
Object javaOps = ReflectionUtils.getDeclaredField(clazz$JavaOps, clazz$JavaOps, 0).get(null);
instance$JAVA_OPS = (DynamicOps<Object>) method$RegistryOps$create.invoke(null, javaOps, instance$MinecraftRegistry);
if (clazz$JavaOps != null) {
Object javaOps = ReflectionUtils.getDeclaredField(clazz$JavaOps, clazz$JavaOps, 0).get(null);
instance$JAVA_OPS = (DynamicOps<Object>) method$RegistryOps$create.invoke(null, javaOps, instance$MinecraftRegistry);
} else {
// TODO Create a JavaOps
instance$JAVA_OPS = null;
}
instance$JSON_OPS = (DynamicOps<JsonElement>) method$RegistryOps$create.invoke(null, JsonOps.INSTANCE, instance$MinecraftRegistry);
instance$SPARROW_NBT_OPS = (DynamicOps<Tag>) method$RegistryOps$create.invoke(null, NBTOps.INSTANCE, instance$MinecraftRegistry);
} catch (ReflectiveOperationException e) {