Skip to content

数据包处理

你可以直接操作 Minecraft 原始数据包来实现高级功能。

1. 监听数据包

创建一个继承自 SessionAdapter 的类。请使用 getLogger() 记录日志。

java
import org.geysermc.mcprotocollib.network.event.session.SessionAdapter;
import org.geysermc.mcprotocollib.network.packet.Packet;
import org.geysermc.mcprotocollib.network.session.Session;
import xin.bbtt.mcbot.plugin.Plugin;

public class MyPacketListener extends SessionAdapter {
    private final Plugin plugin;

    public MyPacketListener(Plugin plugin) {
        this.plugin = plugin;
    }

    @Override
    public void packetReceived(Session session, Packet packet) {
        // 使用日志记录收到的包名
        plugin.getLogger().debug("收到包: {}", packet.getClass().getSimpleName());
    }
}

2. 发送数据包 (以重生为例)

当你监听到特定事件或者收到数据包时,你可以通过传入的 session 参数(或者获取全局的 Bot.Instance.getSession())向服务器发送数据包。

下面是在事件回调中发送“重生”请求(ServerboundClientCommandPacket)的正确方式:

java
import org.geysermc.mcprotocollib.network.session.Session;
import org.geysermc.mcprotocollib.protocol.data.game.ClientCommand;
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.ServerboundClientCommandPacket;

// 假设这段代码在一个能获取到 session 实例的方法内
// 比如在 packetReceived(Session session, Packet packet) 方法中:
session.send(new ServerboundClientCommandPacket(
    ClientCommand.RESPAWN
));

3. 注册监听器

在插件的 onEnable() 中注册:

java
@Override
public void onEnable() {
    Bot.Instance.addPacketListener(new MyPacketListener(this), this);
}

Released under the GPL-3.0 License.