9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 18:09:27 +00:00

feat(network): 监听更多发包物品

This commit is contained in:
jhqwqmc
2025-05-27 11:39:16 +08:00
parent 36a99d11a2
commit d58e68abb2
8 changed files with 237 additions and 10 deletions

View File

@@ -175,6 +175,11 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket());
registerByteBufPacketConsumer(PacketConsumers.SET_ENTITY_DATA, this.packetIds.clientboundSetEntityDataPacket());
registerByteBufPacketConsumer(PacketConsumers.CONTAINER_SET_CONTENT, this.packetIds.clientboundContainerSetContentPacket());
registerByteBufPacketConsumer(PacketConsumers.CONTAINER_SET_SLOT, this.packetIds.clientboundContainerSetSlotPacket());
registerByteBufPacketConsumer(PacketConsumers.SET_CURSOR_ITEM, this.packetIds.clientboundSetCursorItemPacket());
registerByteBufPacketConsumer(PacketConsumers.SET_EQUIPMENT, this.packetIds.clientboundSetEquipmentPacket());
registerByteBufPacketConsumer(PacketConsumers.SET_PLAYER_INVENTORY, this.packetIds.clientboundSetPlayerInventoryPacket());
registerByteBufPacketConsumer(PacketConsumers.SET_CREATIVE_MODE_SLOT, this.packetIds.serverboundSetCreativeModeSlotPacket());
}
public static BukkitNetworkManager instance() {

View File

@@ -1,5 +1,6 @@
package net.momirealms.craftengine.bukkit.plugin.network;
import com.google.common.collect.Lists;
import com.mojang.datafixers.util.Either;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -1205,7 +1206,7 @@ public class PacketConsumers {
}
};
private static void handlePlayerActionPacketOnMainThread(BukkitServerPlayer player, World world, BlockPos pos, Object packet) throws Exception {
private static void handlePlayerActionPacketOnMainThread(BukkitServerPlayer player, World world, BlockPos pos, Object packet) {
Object action = FastNMS.INSTANCE.field$ServerboundPlayerActionPacket$action(packet);
if (action == Reflections.instance$ServerboundPlayerActionPacket$Action$START_DESTROY_BLOCK) {
Object serverLevel = FastNMS.INSTANCE.field$CraftWorld$ServerLevel(world);
@@ -2177,6 +2178,138 @@ public class PacketConsumers {
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> CONTAINER_SET_SLOT = (user, event) -> {
try {
FriendlyByteBuf buf = event.getBuffer();
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
int containerId = buf.readContainerId();
int stateId = buf.readVarInt();
int slot = buf.readShort();
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
BukkitItemManager.instance().s2c(itemStack, context).ifPresent((newItemStack) -> {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeContainerId(containerId);
buf.writeVarInt(stateId);
buf.writeShort(slot);
Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, newItemStack);
});
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundContainerSetSlotPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_CURSOR_ITEM = (user, event) -> {
try {
FriendlyByteBuf buf = event.getBuffer();
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
BukkitItemManager.instance().s2c(itemStack, context).ifPresent((newItemStack) -> {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, newItemStack);
});
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetCursorItemPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_EQUIPMENT = (user, event) -> {
try {
FriendlyByteBuf buf = event.getBuffer();
boolean changed = false;
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
int entity = buf.readVarInt();
List<com.mojang.datafixers.util.Pair<Object, ItemStack>> slots = Lists.newArrayList();
int _byte;
do {
_byte = buf.readByte();
Object equipmentSlot = Reflections.instance$EquipmentSlot$values[_byte & 127];
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(itemStack, context);
if (optional.isPresent()) {
changed = true;
itemStack = optional.get();
}
slots.add(com.mojang.datafixers.util.Pair.of(equipmentSlot, itemStack));
} while ((_byte & -128) != 0);
if (changed) {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeVarInt(entity);
int i = slots.size();
Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
for(int j = 0; j < i; ++j) {
com.mojang.datafixers.util.Pair<Object, ItemStack> pair = slots.get(j);
Enum<?> equipmentSlot = (Enum<?>) pair.getFirst();
boolean bl = j != i - 1;
int k = equipmentSlot.ordinal();
buf.writeByte(bl ? k | -128 : k);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, pair.getSecond());
}
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEquipmentPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_PLAYER_INVENTORY = (user, event) -> {
try {
FriendlyByteBuf buf = event.getBuffer();
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
int slot = buf.readVarInt();
BukkitItemManager.instance().s2c(itemStack, context).ifPresent((newItemStack) -> {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeVarInt(slot);
Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, newItemStack);
});
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetPlayerInventoryPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_CREATIVE_MODE_SLOT = (user, event) -> {
try {
FriendlyByteBuf buf = event.getBuffer();
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
short slotNum = buf.readShort();
ItemStack itemStack;
if (VersionHelper.isOrAbove1_20_5()) {
itemStack = FastNMS.INSTANCE.method$ServerboundSetCreativeModeSlotPacket$readItem(friendlyBuf);
} else {
itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
}
BukkitItemManager.instance().c2s(itemStack, context).ifPresent((newItemStack) -> {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeShort(slotNum);
Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
if (VersionHelper.isOrAbove1_20_5()) {
FastNMS.INSTANCE.method$ServerboundSetCreativeModeSlotPacket$writeItem(newFriendlyBuf, newItemStack);
} else {
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, newItemStack);
}
});
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ServerboundSetCreativeModeSlotPacket", e);
}
};
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> RESOURCE_PACK_PUSH = (user, event, packet) -> {
try {
if (!VersionHelper.isOrAbove1_20_2()) return;

View File

@@ -43,4 +43,14 @@ public interface PacketIds {
int clientboundSetScorePacket();
int clientboundContainerSetContentPacket();
int clientboundContainerSetSlotPacket();
int clientboundSetCursorItemPacket();
int clientboundSetEquipmentPacket();
int clientboundSetPlayerInventoryPacket();
int serverboundSetCreativeModeSlotPacket();
}

View File

@@ -43,4 +43,12 @@ public class PacketIdFinder {
public static int clientboundByClazz(Class<?> clazz) {
return gamePacketIdsByClazz.get("clientbound").getOrDefault(clazz, -1);
}
public static int serverboundByName(String packetName) {
return gamePacketIdsByName.get("serverbound").getOrDefault(packetName, -1);
}
public static int serverboundByClazz(Class<?> clazz) {
return gamePacketIdsByClazz.get("serverbound").getOrDefault(clazz, -1);
}
}

View File

@@ -109,4 +109,29 @@ public class PacketIds1_20 implements PacketIds {
public int clientboundContainerSetContentPacket() {
return PacketIdFinder.clientboundByClazz(Reflections.clazz$ClientboundContainerSetContentPacket);
}
@Override
public int clientboundContainerSetSlotPacket() {
return PacketIdFinder.clientboundByClazz(Reflections.clazz$ClientboundContainerSetSlotPacket);
}
@Override
public int clientboundSetCursorItemPacket() {
return PacketIdFinder.clientboundByClazz(Reflections.clazz$ClientboundSetCursorItemPacket);
}
@Override
public int clientboundSetEquipmentPacket() {
return PacketIdFinder.clientboundByClazz(Reflections.clazz$ClientboundSetEquipmentPacket);
}
@Override
public int clientboundSetPlayerInventoryPacket() {
return PacketIdFinder.clientboundByClazz(Reflections.clazz$ClientboundSetPlayerInventoryPacket);
}
@Override
public int serverboundSetCreativeModeSlotPacket() {
return PacketIdFinder.serverboundByClazz(Reflections.clazz$ServerboundSetCreativeModeSlotPacket);
}
}

View File

@@ -1,6 +1,7 @@
package net.momirealms.craftengine.bukkit.plugin.network.id;
import net.momirealms.craftengine.bukkit.plugin.network.PacketIds;
import net.momirealms.craftengine.bukkit.util.Reflections;
public class PacketIds1_20_5 implements PacketIds {
@@ -108,4 +109,29 @@ public class PacketIds1_20_5 implements PacketIds {
public int clientboundContainerSetContentPacket() {
return PacketIdFinder.clientboundByName("minecraft:container_set_content");
}
@Override
public int clientboundContainerSetSlotPacket() {
return PacketIdFinder.clientboundByName("minecraft:container_set_slot");
}
@Override
public int clientboundSetCursorItemPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_cursor_item");
}
@Override
public int clientboundSetEquipmentPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_equipment");
}
@Override
public int clientboundSetPlayerInventoryPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_player_inventory");
}
@Override
public int serverboundSetCreativeModeSlotPacket() {
return PacketIdFinder.serverboundByName("minecraft:set_creative_mode_slot");
}
}

View File

@@ -3111,6 +3111,7 @@ public class Reflections {
)
);
public static final Object[] instance$EquipmentSlot$values;
public static final Object instance$EquipmentSlot$MAINHAND;
public static final Object instance$EquipmentSlot$OFFHAND;
public static final Object instance$EquipmentSlot$FEET;
@@ -3121,14 +3122,14 @@ public class Reflections {
static {
try {
Object[] values = (Object[]) method$EquipmentSlot$values.invoke(null);
instance$EquipmentSlot$MAINHAND = values[0];
instance$EquipmentSlot$OFFHAND = values[1];
instance$EquipmentSlot$FEET = values[2];
instance$EquipmentSlot$LEGS = values[3];
instance$EquipmentSlot$CHEST = values[4];
instance$EquipmentSlot$HEAD = values[5];
// instance$EquipmentSlot$BODY = values[6];
instance$EquipmentSlot$values = (Object[]) method$EquipmentSlot$values.invoke(null);
instance$EquipmentSlot$MAINHAND = instance$EquipmentSlot$values[0];
instance$EquipmentSlot$OFFHAND = instance$EquipmentSlot$values[1];
instance$EquipmentSlot$FEET = instance$EquipmentSlot$values[2];
instance$EquipmentSlot$LEGS = instance$EquipmentSlot$values[3];
instance$EquipmentSlot$CHEST = instance$EquipmentSlot$values[4];
instance$EquipmentSlot$HEAD = instance$EquipmentSlot$values[5];
// instance$EquipmentSlot$BODY = instance$EquipmentSlot$values[6];
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
@@ -6828,4 +6829,23 @@ public class Reflections {
"network.protocol.game.ClientboundContainerSetContentPacket"
)
);
public static final Class<?> clazz$ClientboundContainerSetSlotPacket = requireNonNull(
BukkitReflectionUtils.findReobfOrMojmapClass(
"network.protocol.game.PacketPlayOutSetSlot",
"network.protocol.game.ClientboundContainerSetSlotPacket"
)
);
// 1.21.2+
public static final Class<?> clazz$ClientboundSetCursorItemPacket =
ReflectionUtils.getClazz(
BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetCursorItemPacket")
);
// 1.21.2+
public static final Class<?> clazz$ClientboundSetPlayerInventoryPacket =
ReflectionUtils.getClazz(
BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetPlayerInventoryPacket")
);
}

View File

@@ -50,7 +50,7 @@ byte_buddy_version=1.17.5
ahocorasick_version=0.6.3
snake_yaml_version=2.4
anti_grief_version=0.17
nms_helper_version=0.66
nms_helper_version=0.67
evalex_version=3.5.0
reactive_streams_version=1.0.4
amazon_awssdk_version=2.31.23