Я создаю и внедряю сервер Minecraft для Minecraft Beta 1.7.3 в Node.JS. Я получил базовую обработку пакетов, но мне действительно нужен хороший способ для чтения данных, передаваемых между клиентом и сервером. Я не очень много знаю о пакетах (и это, вероятно, не очень хорошая вещь), но мне просто нужен какой-то совет относительно того, как создать этот сервер.
Я просмотрел протокол для этой конкретной версии Minecraft и заметил, что у каждого пакета есть свой собственный идентификатор. Я создал некоторый код для определения идентификатора пакета и ответа на то, что отправляет сервер. Вот текущий код:
const net = require('net')
const parser = require('binary-parser').Parser
const server = net.createServer()
server.on('connection', (socket) => {
socket.on('data', (buffer) => {
let table = new parser()
.int8("id")
// Parse packet and do the thing based on the packet
let id = table.parse(Buffer.from(buffer, 'hex'))
console.log(`Packet ID: ${id.id}`)
switch (id.id) {
case 1:
var map = new parser()
.int8('id')
.int32('protocol')
.string('username')
.int32('unused1')
.int32('unused2')
.int8('unused3')
.int8('unused4')
.uint8('unused5')
.uint8('unused6')
console.log(Buffer.from(buffer, 'hex'))
var data = map.parse(Buffer.from(buffer, 'hex'))
console.log(data.id)
console.log(data.protocol)
console.log(data.username)
case 2:
socket.write(Buffer.from([0x02, 0, 1, 0, 0x2d]))
}
})
socket.on('error', (error) => {
console.error(error)
})
})
server.listen("25565", "localhost")
Я могу видеть буфер с тем, что выглядит просто как необработанные данные, но я не знаю, как преобразовать это в пригодные для использования данные:
В принципе, когда, скажем, пакет 2 (рукопожатие) получен, он отправляет правильную вещь обратно. Я использую модуль для определения идентификатора пакета, но я уверен, что это неправильный способ сделать это.
Так как бы мне извлечь данные из пакета с Node.JS? Мне нужно было бы создать какую-то систему обработки пакетов и как-то рассылать пакеты. Я не совсем уверен, с чего начать, и чувствую, что моя реализация сейчас очень хакерская. Так что любая помощь или предложения будут с благодарностью!