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:
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -43,4 +43,14 @@ public interface PacketIds {
|
||||
int clientboundSetScorePacket();
|
||||
|
||||
int clientboundContainerSetContentPacket();
|
||||
|
||||
int clientboundContainerSetSlotPacket();
|
||||
|
||||
int clientboundSetCursorItemPacket();
|
||||
|
||||
int clientboundSetEquipmentPacket();
|
||||
|
||||
int clientboundSetPlayerInventoryPacket();
|
||||
|
||||
int serverboundSetCreativeModeSlotPacket();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user