PrismarineJS / PrismarineJS/node-minecraft-protocol
Vanilla client cannot connect to example server
Nobody has claimed this yet.
- Dominant language
- JavaScript
- Stars
- 1.4k
- Forks
- 290
- Avg merge
- 4d 8h
- Merged PRs (30d)
- 7
Description
[ ] The FAQ doesn't contain a resolution to my issue
Versions
- minecraft-protocol: 1.47.0
- server: vanilla/spigot/paper #.#.#
- node: 21.7.3
Detailed description of a problem
When trying to join the example server in examples/server/server.js with a vanilla Minecraft 1.20.1 client, it disconnects with the message Internal Exception: io.netty.handler.codec.DecoderException: com.google.gson.JsonParseException: Don't know how to turn {} into a Component!.
Current code
const mc = require('minecraft-protocol')
const nbt = require('prismarine-nbt')
const options = {
motd: 'Server',
'max-players': 1,
port: 25565,
'online-mode': false,
version: "1.20.1"
}
const server = mc.createServer(options)
const mcData = require('minecraft-data')(server.version)
const loginPacket = mcData.loginPacket
function chatText (text) {
return mcData.supportFeature('chatPacketsUseNbtComponents')
? nbt.comp({ text: nbt.string(text) })
: JSON.stringify({ text })
}
server.on('playerJoin', function (client) {
broadcast(client.username + ' joined the game.')
const addr = client.socket.remoteAddress + ':' + client.socket.remotePort
console.log(client.username + ' connected', '(' + addr + ')')
client.on('end', function () {
broadcast(client.username + ' left the game.', client)
console.log(client.username + ' disconnected', '(' + addr + ')')
})
// send init data so client will start rendering world
client.write('login', {
...loginPacket,
entityId: client.id,
isHardcore: false,
gameMode: 0,
previousGameMode: 1,
hashedSeed: [0, 0],
maxPlayers: server.maxPlayers,
viewDistance: 10,
reducedDebugInfo: false,
enableRespawnScreen: true,
isDebug: false,
isFlat: false
})
client.write('position', {
x: 0,
y: 256,
z: 0,
yaw: 0,
pitch: 0,
flags: 0x00
})
function handleChat (data) {
const message = '<' + client.username + '>' + ' ' + data.message
broadcast(message, null, client.username)
console.log(message)
}
client.on('chat', handleChat) // pre-1.19
client.on('chat_message', handleChat) // post 1.19
})
server.on('error', function (error) {
console.log('Error:', error)
})
server.on('listening', function () {
console.log('Server listening on port', server.socketServer.address().port)
})
function sendBroadcastMessage (server, clients, message, sender) {
if (mcData.supportFeature('signedChat')) {
server.writeToClients(clients, 'player_chat', {
plainMessage: message,
signedChatContent: '',
unsignedChatContent: chatText(message),
type: 0,
senderUuid: 'd3527a0b-bc03-45d5-a878-2aafdd8c8a43', // random
senderName: JSON.stringify({ text: sender }),
senderTeam: undefined,
timestamp: Date.now(),
salt: 0n,
signature: mcData.supportFeature('useChatSessions') ? undefined : Buffer.alloc(0),
previousMessages: [],
filterType: 0,
networkName: JSON.stringify({ text: sender })
})
} else {
server.writeToClients(clients, 'chat', { message: JSON.stringify({ text: message }), position: 0, sender: sender || '0' })
}
}
function broadcast (message, exclude, username) {
sendBroadcastMessage(server, Object.values(server.clients).filter(client => client !== exclude), message)
}
Expected behavior
I expected the client to be able to join the server normally and be able to send messages in the chat.
Additional context
Add any other context about the problem here.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with examples/server/server.js and the chat packet handling around chatText and sendBroadcastMessage. Reproduce the disconnect with a vanilla Minecraft 1.20.1 client, then trace the login and chat packets; done means the client joins normally and can send messages in chat.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, nodejs
- Domain
- networking
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100