Skip to content

Commit

Permalink
1.20.3, 1.20.5 and 1.21.1 support (#669)
Browse files Browse the repository at this point in the history
* 1.20.3, 1.20.5 support

* update test

* 1.21

* Update package.json to debug zlib

* Update package.json revert
  • Loading branch information
extremeheat authored Jan 6, 2025
1 parent 15ebc00 commit 7857fac
Show file tree
Hide file tree
Showing 10 changed files with 72 additions and 23 deletions.
2 changes: 1 addition & 1 deletion config/default-settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@
},
"everybody-op": false,
"max-entities":100,
"version": "1.20.2"
"version": "1.21.1"
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"exit-hook": "^2.2.1",
"flatmap": "^0.0.3",
"long": "^5.1.0",
"minecraft-protocol": "^1.44.0",
"minecraft-protocol": "^1.50.0",
"moment": "^2.10.6",
"needle": "^2.5.0",
"node-gzip": "^1.1.2",
Expand Down
47 changes: 37 additions & 10 deletions src/lib/plugins/chat.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
const nbt = require('prismarine-nbt')

module.exports.server = function (serv) {
serv.broadcast = (message, { whitelist = serv.players, blacklist = [], system = false } = {}) => {
if (whitelist.type === 'player') whitelist = [whitelist]

if (typeof message === 'string') message = serv.parseClassic(message)

whitelist.filter(w => blacklist.indexOf(w) === -1).forEach(player => {
if (!system) player.chat(message)
else player.system(message)
Expand Down Expand Up @@ -43,7 +42,8 @@ module.exports.server = function (serv) {
reset: '&r'
}

serv.parseClassic = (message) => {
// TODO: update and use prismarine-chat (doesn't yet support NBT chat components beyond decoding them)
serv._createJsonChat = (message) => {
if (typeof message === 'object') return message
const messageList = []
let text = ''
Expand Down Expand Up @@ -117,6 +117,32 @@ module.exports.server = function (serv) {
}
} else return { text: '' }
}

serv._createChatComponent = (text) => {
if (serv.supportFeature('chatPacketsUseNbtComponents')) {
if (typeof text !== 'string') {
if (text.text) text = text.text
else {
serv.debug?.('Cannot yet convert JSON chat messages to NBT ; re-call in plaintext: ' + JSON.stringify(text))
text = JSON.stringify(text)
}
}
const tag = nbt.comp({
text: nbt.string(text)
})
tag.toNetworkFormat = () => tag
return tag
} else {
if (typeof text === 'object') {
text.toNetworkFormat = () => JSON.stringify(text)
return text
}
const ret = serv._createJsonChat(text)
ret.toNetworkFormat = () => JSON.stringify(ret)
return ret
}
}
serv._createNetworkEncodedChatComponent = (val) => serv._createChatComponent(val).toNetworkFormat()
}

module.exports.player = function (player, serv) {
Expand Down Expand Up @@ -157,9 +183,9 @@ module.exports.player = function (player, serv) {
whitelist: serv.players,
blacklist: []
}, ({ prefix, text, whitelist, blacklist }) => {
const obj = serv.parseClassic(prefix)
const obj = serv._createJsonChat(prefix)
if (!obj.extra) obj.extra = []
obj.extra.push(serv.parseClassic(text))
obj.extra.push(serv._createJsonChat(text))
serv.broadcast(obj, {
whitelist,
blacklist
Expand All @@ -172,7 +198,7 @@ module.exports.player = function (player, serv) {
if (serv.supportFeature('signedChat')) {
return player.system(message)
} else {
const chatComponent = typeof message === 'string' ? serv.parseClassic(message) : message
const chatComponent = serv._createJsonChat(message)
player._client.write('chat', {
message: JSON.stringify(chatComponent),
position: 0,
Expand All @@ -188,16 +214,17 @@ module.exports.player = function (player, serv) {
}

player.system = message => {
const chatComponent = typeof message === 'string' ? serv.parseClassic(message) : message
const chatComponent = serv._createChatComponent(message)
if (serv.supportFeature('signedChat')) {
player._client.write('system_chat', {
content: JSON.stringify(chatComponent),
// 1.20.3+ writes NBT in chat packets ; below is stringified JSON chat components
content: chatComponent.toNetworkFormat(),
type: 1, // chat
isActionBar: false
})
} else {
player._client.write('chat', {
message: JSON.stringify(chatComponent),
message: chatComponent.toNetworkFormat(),
position: 2,
sender: '0'
})
Expand Down
2 changes: 1 addition & 1 deletion src/lib/plugins/chest.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ module.exports.server = function (serv, { version }) {
player._client.write('open_window', {
windowId: player.windowId,
inventoryType: invType,
windowTitle: JSON.stringify(title)
windowTitle: serv._createChatComponent(title).toNetworkFormat()
})
// Sending container content
player._client.write('window_items', {
Expand Down
12 changes: 8 additions & 4 deletions src/lib/plugins/header.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
module.exports.player = function (player, serv, settings) {
player.playerlistUpdateText = (header, footer) =>
player.playerlistUpdateText = function (header, footer) {
player._client.write('playerlist_header', {
header: JSON.stringify(header),
footer: JSON.stringify(footer)
header: serv._createChatComponent(header).toNetworkFormat(),
footer: serv._createChatComponent(footer).toNetworkFormat()
})
}

const header = settings['player-list-text'].header || ''
const footer = settings['player-list-text'].footer || ''

if (settings['player-list-text']) {
player.playerlistUpdateText(settings['player-list-text'].header || { text: '' }, settings['player-list-text'].footer || { text: '' })
player.playerlistUpdateText(header, footer)
}
}
12 changes: 11 additions & 1 deletion src/lib/plugins/login.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ const plugins = require('./index')
module.exports.server = function (serv, options) {
serv._server.on('connection', (client) => {
client.on('error', error => serv.emit('clientError', client, error))
client.on('state', (now) => {
if (now === 'configuration') {
client.write('feature_flags', { features: ['minecraft:vanilla'] })
client.write('select_known_packs', { packs: [] })
}
})
})

serv._server.on('playerJoin', async (client) => {
Expand Down Expand Up @@ -56,7 +62,10 @@ module.exports.player = async function (player, serv, settings) {
const playerData = player._playerData = await playerDat.read(player.uuid, player.spawnPoint, settings.worldFolder)
for (const key in playerData.player) player[key] = playerData.player[key]

serv.players.push(player)
if (!player.disconnected) {
// it's possible player gets kicked during login process ; don't add them to the server
serv.players.push(player)
}
serv.uuidToPlayer[player.uuid] = player
player.loadedChunks = {}
}
Expand All @@ -83,6 +92,7 @@ module.exports.player = async function (player, serv, settings) {
// send init data so client will start rendering world
player._client.write('login', {
...serv.registry.loginPacket,
enforcesSecureChat: serv._server.options.enforcesSecureChat,
entityId: player.id,
levelType: 'default',
gameMode: player.gameMode,
Expand Down
5 changes: 3 additions & 2 deletions src/lib/plugins/logout.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ module.exports.player = function (player, serv, { worldFolder }) {
})

player._client.on('end', async () => {
if (player && player.username) {
if (!player.disconnected) {
player._unloadAllChunks(true /* becasuePlayerLeft */)
serv.broadcast(serv.color.yellow + player.username + ' left the game.')
if (player.username) serv.broadcast(serv.color.yellow + player.username + ' left the game.')
serv._sendPlayerEventLeave(player)
player.nearbyPlayers().forEach(otherPlayer => otherPlayer.despawnEntities([player]))
delete serv.entities[player.id]
Expand All @@ -28,6 +28,7 @@ module.exports.player = function (player, serv, { worldFolder }) {
serv.players.splice(index, 1)
}
delete serv.uuidToPlayer[player.uuid]
player.disconnected = true
}

player.save()
Expand Down
8 changes: 7 additions & 1 deletion src/lib/plugins/particle.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,13 @@ module.exports.server = function (serv) {
offsetZ: size.z,
particleData: 1.0,
particles: count,
data: []
amount: count, // 1.20.5+
data: [],
velocityOffset: 0, // 1.20.5+
particle: {
type: 'bubble',
data: null
}
}, players.filter(p => blacklist.indexOf(p) === -1))
}

Expand Down
2 changes: 1 addition & 1 deletion src/lib/version.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const testedVersions = ['1.8.8', '1.9.4', '1.10.2', '1.11.2', '1.12.2', '1.13.2', '1.14.4', '1.15.2', '1.16.5', '1.17.1', '1.18', '1.18.2', '1.19', '1.19.2', '1.19.3', '1.19.4', '1.20', '1.20.2']
const testedVersions = ['1.8.8', '1.9.4', '1.10.2', '1.11.2', '1.12.2', '1.13.2', '1.14.4', '1.15.2', '1.16.5', '1.17.1', '1.18', '1.18.2', '1.19', '1.19.2', '1.19.3', '1.19.4', '1.20', '1.20.2', '1.20.3', '1.20.5', '1.21.1']
module.exports = {
testedVersions,
latestSupportedVersion: testedVersions[testedVersions.length - 1],
Expand Down
3 changes: 2 additions & 1 deletion test/mineflayer.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,8 @@ squid.testedVersions.forEach((testedVersion, i) => {
function waitMessagePromise (message) {
return new Promise((resolve) => {
const listener = (msg) => {
if (msg.extra[0].text === message) {
const text = msg.extra?.[0].text ?? msg.text
if (text === message) {
bot.removeListener('message', listener)
resolve()
}
Expand Down

0 comments on commit 7857fac

Please sign in to comment.