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

feat(network): 补充漏掉的包

This commit is contained in:
jhqwqmc
2025-05-27 12:49:32 +08:00
parent 55db41382d
commit 825d7908b1
6 changed files with 75 additions and 0 deletions

View File

@@ -180,6 +180,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerByteBufPacketConsumer(PacketConsumers.SET_EQUIPMENT, this.packetIds.clientboundSetEquipmentPacket());
registerByteBufPacketConsumer(PacketConsumers.SET_PLAYER_INVENTORY, this.packetIds.clientboundSetPlayerInventoryPacket());
registerByteBufPacketConsumer(PacketConsumers.SET_CREATIVE_MODE_SLOT, this.packetIds.serverboundSetCreativeModeSlotPacket());
registerByteBufPacketConsumer(PacketConsumers.CONTAINER_CLICK, this.packetIds.serverboundContainerClickPacket());
}
public static BukkitNetworkManager instance() {

View File

@@ -4,6 +4,9 @@ import com.google.common.collect.Lists;
import com.mojang.datafixers.util.Either;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntList;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TranslationArgument;
@@ -2310,6 +2313,57 @@ public class PacketConsumers {
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> CONTAINER_CLICK = (user, event) -> {
try {
if (VersionHelper.isOrAbove1_21_5()) return; // 1.21.5+需要其他办法解决同步问题
FriendlyByteBuf buf = event.getBuffer();
boolean changed = false;
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
int containerId = buf.readContainerId();
int stateId = buf.readVarInt();
short slotNum = buf.readShort();
byte buttonNum = buf.readByte();
int clickType = buf.readVarInt();
int i = buf.readVarInt();
Int2ObjectMap<ItemStack> changedSlots = new Int2ObjectOpenHashMap<>(i);
for(int j = 0; j < i; ++j) {
int k = buf.readShort();
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
Optional<ItemStack> optional = BukkitItemManager.instance().c2s(itemStack, context);
if (optional.isPresent()) {
changed = true;
itemStack = optional.get();
}
changedSlots.put(k, itemStack);
}
ItemStack carriedItem = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
Optional<ItemStack> optional = BukkitItemManager.instance().c2s(carriedItem, context);
if (optional.isPresent()) {
changed = true;
carriedItem = optional.get();
}
if (changed) {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeContainerId(containerId);
buf.writeVarInt(stateId);
buf.writeShort(slotNum);
buf.writeByte(buttonNum);
buf.writeVarInt(clickType);
buf.writeVarInt(changedSlots.size());
changedSlots.forEach((k, v) -> {
buf.writeShort(k);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(buf, v);
});
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(buf, carriedItem);
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ServerboundContainerClickPacket", e);
}
};
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> RESOURCE_PACK_PUSH = (user, event, packet) -> {
try {
if (!VersionHelper.isOrAbove1_20_2()) return;

View File

@@ -52,5 +52,7 @@ public interface PacketIds {
int clientboundSetPlayerInventoryPacket();
int serverboundContainerClickPacket();
int serverboundSetCreativeModeSlotPacket();
}

View File

@@ -130,6 +130,11 @@ public class PacketIds1_20 implements PacketIds {
return PacketIdFinder.clientboundByClazz(Reflections.clazz$ClientboundSetPlayerInventoryPacket);
}
@Override
public int serverboundContainerClickPacket() {
return PacketIdFinder.serverboundByClazz(Reflections.clazz$ServerboundContainerClickPacket);
}
@Override
public int serverboundSetCreativeModeSlotPacket() {
return PacketIdFinder.serverboundByClazz(Reflections.clazz$ServerboundSetCreativeModeSlotPacket);

View File

@@ -130,6 +130,11 @@ public class PacketIds1_20_5 implements PacketIds {
return PacketIdFinder.clientboundByName("minecraft:set_player_inventory");
}
@Override
public int serverboundContainerClickPacket() {
return PacketIdFinder.serverboundByName("minecraft:container_click");
}
@Override
public int serverboundSetCreativeModeSlotPacket() {
return PacketIdFinder.serverboundByName("minecraft:set_creative_mode_slot");

View File

@@ -6848,4 +6848,11 @@ public class Reflections {
ReflectionUtils.getClazz(
BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetPlayerInventoryPacket")
);
public static final Class<?> clazz$ServerboundContainerClickPacket = requireNonNull(
BukkitReflectionUtils.findReobfOrMojmapClass(
"network.protocol.game.PacketPlayInWindowClick",
"network.protocol.game.ServerboundContainerClickPacket"
)
);
}