数据包监听方法
监听特定数据包
- 在插件主类中使用
self.ListenPacket(packet_id, callback)监听数据包 - 示例:
python
from tooldelta import Plugin
from tooldelta.constants import PacketIDS
class MyPlugin(Plugin):
...
def __init__(self, frame):
super().__init__(frame)
self.ListenPacket(PacketIDS.Text, self.on_packet)
def on_packet(self, packet):
self.print(packet["SourceName"], packet["Message"])1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 关于
ListenPacket:参数 类型 说明 packet_id int 数据包 ID callback (dict) -> bool 监听回调函数,返回表示是否拦截数据包
提示
数据包格式可参考 https://prismarinejs.github.io/minecraft-data/protocol/bedrock/1.21.50 ToolDelta 会将数据包中的类型全部转换为 Python 基本类型 对于详细的属性名和属性类型,可参考 Golang 实现 (https://github.com/Sandertv/gophertunnel/tree/master/minecraft/protocol/packet) 中各个数据包的结构体,它们会被直接序列化为 msgpack(一般情况下) 或 json 格式(备用)供 Python 读取。
警告
由于 Python 的 json 模块性能羸弱,在监听所有数据包时,很可能导致 ToolDelta 严重卡顿。
在 1.0.0 版本中,ToolDelta 移除了监听所有数据包的方法。
等待下一个数据包
- 等待并获得租赁服发送至 ToolDelta 的下一个指定 ID 的数据包。
- 示例:
python
from tooldelta.constants import PacketIDS
class MyPlugin(Plugin):
def do_something(self):
# 等待下一个 Text 数据包
pk = self.frame.packet_handler.wait_next_packet(PacketIDS.Text, 30)
if pk is None:
# 在 30s 内等不到 Text 数据包
# 做点什么...
pass
else:
# 做点什么... (输出数据包内容)
print(pk)1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
关于
wait_next_packet:参数 类型 说明 pkID PacketIDS 要等待的包ID timeout float 等待超时时间,单位为秒 返回类型 说明 dict 数据包内容 None 获取超时