Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vanilla client cannot connect to example server #1314

Open
petrificatified opened this issue Aug 10, 2024 · 1 comment
Open

Vanilla client cannot connect to example server #1314

petrificatified opened this issue Aug 10, 2024 · 1 comment

Comments

@petrificatified
Copy link

[ ] 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.

@extremeheat
Copy link
Member

Server example here is not maintained, it might be broken. Hard to know as it's not really possible to create a connectable server without a full server implementation or proxy. I think the best way we can make sure the nmp server implementation is updating flying-squid.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants