2.3 KiB
2.3 KiB
创建客户端
public fun main() = runBlocking {
val client = createMinecraftClient(
"127.0.0.1", 25566, "MyBot",
generateOfflineUuid("MyBot"),
accessToken = null,
context = DefaultProtocolContext.withCustom {
socketEngine = KtorNetworkEngine()
}
)
client.launch { client.connect() }
while (true) {
delay(5.seconds)
}
}
在上面的示例代码中, 创建了一个
MinecraftClient, 这个客户端将会使用MyBot作为玩家名称连接到127.0.0.1:25565的离线服务器, 并且将底层TCP Socket实现替换为了基于ktor-network实现的TCP Socket. (有关如何创建SocketEngine请参阅实现TCP Socket, 有关如何创建Context请参阅需要实现的API)MinecraftClient实现了CoroutineContext, 使用client.connect()后将会切换到后台线程执行, 添加阻塞线程代码以免程序直接退出.
连接到在线服务器
private val accessToken = "eyJraWQiOiIw..."
public fun main() = runBlocking {
val client = createMinecraftClient(
// 其他参数
username = "RTAkland",
uuid = Uuid.parse("bb033844-e68e-4909-a636-1a5d1821ddc4"),
accessToken = accessToken,
// 其他参数
)
}
上面的示例代码中, 将会使用
RTAkland作为玩家名称连接到服务器
快速获取AccessToken
打开minecraft.net并登录后按下F12, 在Console内输入
console.log(`; ${document.cookie}`.split('; bearer_token=').pop().split(';').shift())
AccessToken的有效期为24小时
监听数据包
// 监听接收到的指定类型的数据包, 必须以Clientbound开头
client.onPacket<ClientboundLoginSuccessPacket> {
println(it)
}
// 监听所有接收到的数据包
client.on { packet, direction ->
println("$direction -> $packet")
}
// 监听被发送出去的数据包, 必须以Serverbound开头
cli.onSent<ServerboundPongConfigurationPacket> {
println(it)
}
发送数据包
// 必须以Serverbound开头的数据包才可以被发送, 否则将会抛出UnsupportedOperationException异常
client.networkChannel.sendPacket(
ServerboundChatCommandPacket(command = "say Hello from libmc")
)