Merge branch 'master' into lluiscab/fix-client_echo

This commit is contained in:
Romain Beaumont 2018-09-24 22:09:46 +02:00 committed by GitHub
commit 26267ab043
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 232 additions and 92 deletions

View File

@ -27,6 +27,6 @@ client.on('chat', function (packet) {
const username = jsonMsg.with[0].text const username = jsonMsg.with[0].text
const msg = jsonMsg.with[1] const msg = jsonMsg.with[1]
if (username === client.username) return if (username === client.username) return
client.write('chat', {message: msg}) client.write('chat', { message: msg })
} }
}) })

View File

@ -111,7 +111,7 @@ client.on('error', function (err) {
client.on('state', function (newState) { client.on('state', function (newState) {
if (newState === states.PLAY) { if (newState === states.PLAY) {
chats.forEach(function (chat) { chats.forEach(function (chat) {
client.write('chat', {message: chat}) client.write('chat', { message: chat })
}) })
} }
}) })
@ -127,7 +127,7 @@ rl.on('line', function (line) {
console.info('Forcibly ended client') console.info('Forcibly ended client')
process.exit(0) process.exit(0)
} }
if (!client.write('chat', {message: line})) { if (!client.write('chat', { message: line })) {
chats.push(line) chats.push(line)
} }
}) })

View File

@ -27,7 +27,7 @@ client.on('chat', function (packet) {
const username = jsonMsg.with[0].text const username = jsonMsg.with[0].text
const msg = jsonMsg.with[1] const msg = jsonMsg.with[1]
if (username === client.username) return if (username === client.username) return
if (msg.text) client.write('chat', {message: msg.text}) if (msg.text) client.write('chat', { message: msg.text})
else client.write('chat', {message: msg}) else client.write('chat', { message: msg})
} }
}) })

View File

@ -43,6 +43,6 @@ client.on('chat', function (packet) {
const username = jsonMsg.with[0].text const username = jsonMsg.with[0].text
const msg = jsonMsg.with[1] const msg = jsonMsg.with[1]
if (username === client.username) return if (username === client.username) return
client.write('chat', {message: msg}) client.write('chat', { message: msg })
} }
}) })

View File

@ -50,6 +50,6 @@ client.on('chat', function (packet) {
const username = jsonMsg.with[0].text const username = jsonMsg.with[0].text
const msg = jsonMsg.with[1] const msg = jsonMsg.with[1]
if (username === client.username) return if (username === client.username) return
client.write('chat', {message: msg}) client.write('chat', { message: msg })
} }
}) })

View File

@ -127,7 +127,7 @@ srv.on('login', function (client) {
targetClient.on('raw', function (buffer, meta) { targetClient.on('raw', function (buffer, meta) {
if (client.state !== states.PLAY || meta.state !== states.PLAY) { return } if (client.state !== states.PLAY || meta.state !== states.PLAY) { return }
const packetData = targetClient.deserializer.parsePacketBuffer(buffer).data.params const packetData = targetClient.deserializer.parsePacketBuffer(buffer).data.params
const packetBuff = client.serializer.createPacketBuffer({name: meta.name, params: packetData}) const packetBuff = client.serializer.createPacketBuffer({ name: meta.name, params: packetData })
if (!bufferEqual(buffer, packetBuff)) { if (!bufferEqual(buffer, packetBuff)) {
console.log('client<-server: Error in packet ' + meta.state + '.' + meta.name) console.log('client<-server: Error in packet ' + meta.state + '.' + meta.name)
console.log('received buffer', buffer.toString('hex')) console.log('received buffer', buffer.toString('hex'))
@ -146,7 +146,7 @@ srv.on('login', function (client) {
client.on('raw', function (buffer, meta) { client.on('raw', function (buffer, meta) {
if (meta.state !== states.PLAY || targetClient.state !== states.PLAY) { return } if (meta.state !== states.PLAY || targetClient.state !== states.PLAY) { return }
const packetData = client.deserializer.parsePacketBuffer(buffer).data.params const packetData = client.deserializer.parsePacketBuffer(buffer).data.params
const packetBuff = targetClient.serializer.createPacketBuffer({name: meta.name, params: packetData}) const packetBuff = targetClient.serializer.createPacketBuffer({ name: meta.name, params: packetData })
if (!bufferEqual(buffer, packetBuff)) { if (!bufferEqual(buffer, packetBuff)) {
console.log('client->server: Error in packet ' + meta.state + '.' + meta.name) console.log('client->server: Error in packet ' + meta.state + '.' + meta.name)
console.log('received buffer', buffer.toString('hex')) console.log('received buffer', buffer.toString('hex'))

View File

@ -45,7 +45,7 @@ server.on('login', function (client) {
'Hello, world!' 'Hello, world!'
] ]
} }
client.write('chat', {message: JSON.stringify(msg), position: 0}) client.write('chat', { message: JSON.stringify(msg), position: 0 })
}) })
server.on('error', function (error) { server.on('error', function (error) {

View File

@ -3,6 +3,7 @@
"version": "1.8.0", "version": "1.8.0",
"description": "Parse and serialize minecraft packets, plus authentication and encryption.", "description": "Parse and serialize minecraft packets, plus authentication and encryption.",
"main": "src/index.js", "main": "src/index.js",
"types": "src/index.d.ts",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git://github.com/PrismarineJS/node-minecraft-protocol.git" "url": "git://github.com/PrismarineJS/node-minecraft-protocol.git"
@ -30,17 +31,18 @@
}, },
"browser": "src/browser.js", "browser": "src/browser.js",
"devDependencies": { "devDependencies": {
"@types/node": "^10.5.8",
"espower-loader": "^1.0.0", "espower-loader": "^1.0.0",
"intelli-espower-loader": "^1.0.0", "intelli-espower-loader": "^1.0.0",
"minecraft-wrap": "^1.2.0", "minecraft-wrap": "^1.2.0",
"mocha": "^5.0.5", "mocha": "^5.0.5",
"power-assert": "^1.0.0", "power-assert": "^1.0.0",
"require-self": "^0.2.1", "require-self": "^0.2.1",
"standard": "^11.0.1" "standard": "^12.0.0"
}, },
"dependencies": { "dependencies": {
"buffer-equal": "^1.0.0", "buffer-equal": "^1.0.0",
"debug": "^3.0.0", "debug": "^4.0.0",
"endian-toggle": "^0.0.0", "endian-toggle": "^0.0.0",
"lodash.get": "^4.1.2", "lodash.get": "^4.1.2",
"lodash.merge": "^4.3.0", "lodash.merge": "^4.3.0",

View File

@ -35,13 +35,13 @@ class Client extends EventEmitter {
} }
setSerializer (state) { setSerializer (state) {
this.serializer = createSerializer({isServer: this.isServer, version: this.version, state: state, customPackets: this.customPackets}) this.serializer = createSerializer({ isServer: this.isServer, version: this.version, state: state, customPackets: this.customPackets })
this.deserializer = createDeserializer({isServer: this.isServer, this.deserializer = createDeserializer({ isServer: this.isServer,
version: this.version, version: this.version,
state: state, state: state,
packetsToParse: packetsToParse:
this.packetsToParse, this.packetsToParse,
customPackets: this.customPackets}) customPackets: this.customPackets })
this.splitter.recognizeLegacyPing = state === states.HANDSHAKING this.splitter.recognizeLegacyPing = state === states.HANDSHAKING
@ -208,7 +208,7 @@ class Client extends EventEmitter {
// TCP/IP-specific (not generic Stream) method for backwards-compatibility // TCP/IP-specific (not generic Stream) method for backwards-compatibility
connect (port, host) { connect (port, host) {
const options = {port, host} const options = { port, host }
if (!this.options) this.options = options if (!this.options) this.options = options
require('./client/tcp_dns')(this, options) require('./client/tcp_dns')(this, options)
options.connect(this) options.connect(this)

View File

@ -42,8 +42,8 @@ module.exports = function (client, options) {
function sendEncryptionKeyResponse () { function sendEncryptionKeyResponse () {
const pubKey = mcPubKeyToPem(packet.publicKey) const pubKey = mcPubKeyToPem(packet.publicKey)
const encryptedSharedSecretBuffer = crypto.publicEncrypt({key: pubKey, padding: crypto.constants.RSA_PKCS1_PADDING}, sharedSecret) const encryptedSharedSecretBuffer = crypto.publicEncrypt({ key: pubKey, padding: crypto.constants.RSA_PKCS1_PADDING }, sharedSecret)
const encryptedVerifyTokenBuffer = crypto.publicEncrypt({key: pubKey, padding: crypto.constants.RSA_PKCS1_PADDING}, packet.verifyToken) const encryptedVerifyTokenBuffer = crypto.publicEncrypt({ key: pubKey, padding: crypto.constants.RSA_PKCS1_PADDING }, packet.verifyToken)
client.write('encryption_begin', { client.write('encryption_begin', {
sharedSecret: encryptedSharedSecretBuffer, sharedSecret: encryptedSharedSecretBuffer,
verifyToken: encryptedVerifyTokenBuffer verifyToken: encryptedVerifyTokenBuffer

View File

@ -36,7 +36,7 @@ function createServer (options = {}) {
server.playerCount = 0 server.playerCount = 0
server.onlineModeExceptions = {} server.onlineModeExceptions = {}
server.favicon = favicon server.favicon = favicon
server.serverKey = new NodeRSA({b: 1024}) server.serverKey = new NodeRSA({ b: 1024 })
server.on('connection', function (client) { server.on('connection', function (client) {
plugins.forEach(plugin => plugin(client, server, options)) plugins.forEach(plugin => plugin(client, server, options))

View File

@ -42,7 +42,7 @@ function sizeOfNbt (value) {
function readOptionalNbt (buffer, offset) { function readOptionalNbt (buffer, offset) {
if (offset + 1 > buffer.length) { throw new PartialReadError() } if (offset + 1 > buffer.length) { throw new PartialReadError() }
if (buffer.readInt8(offset) === 0) return {size: 1} if (buffer.readInt8(offset) === 0) return { size: 1 }
return nbt.proto.read(buffer, offset, 'nbt') return nbt.proto.read(buffer, offset, 'nbt')
} }
@ -63,7 +63,7 @@ function sizeOfOptionalNbt (value) {
function readCompressedNbt (buffer, offset) { function readCompressedNbt (buffer, offset) {
if (offset + 2 > buffer.length) { throw new PartialReadError() } if (offset + 2 > buffer.length) { throw new PartialReadError() }
const length = buffer.readInt16BE(offset) const length = buffer.readInt16BE(offset)
if (length === -1) return {size: 2} if (length === -1) return { size: 2 }
if (offset + 2 + length > buffer.length) { throw new PartialReadError() } if (offset + 2 + length > buffer.length) { throw new PartialReadError() }
const compressedNbt = buffer.slice(offset + 2, offset + 2 + length) const compressedNbt = buffer.slice(offset + 2, offset + 2 + length)
@ -120,7 +120,7 @@ function sizeOfRestBuffer (value) {
return value.length return value.length
} }
function readEntityMetadata (buffer, offset, {type, endVal}) { function readEntityMetadata (buffer, offset, { type, endVal }) {
let cursor = offset let cursor = offset
const metadata = [] const metadata = []
let item let item
@ -139,7 +139,7 @@ function readEntityMetadata (buffer, offset, {type, endVal}) {
} }
} }
function writeEntityMetadata (value, buffer, offset, {type, endVal}) { function writeEntityMetadata (value, buffer, offset, { type, endVal }) {
const self = this const self = this
value.forEach(function (item) { value.forEach(function (item) {
offset = self.write(item, buffer, offset, type, {}) offset = self.write(item, buffer, offset, type, {})
@ -148,7 +148,7 @@ function writeEntityMetadata (value, buffer, offset, {type, endVal}) {
return offset + 1 return offset + 1
} }
function sizeOfEntityMetadata (value, {type}) { function sizeOfEntityMetadata (value, { type }) {
let size = 1 let size = 1
for (let i = 0; i < value.length; ++i) { for (let i = 0; i < value.length; ++i) {
size += this.sizeOf(value[i], type, {}) size += this.sizeOf(value[i], type, {})

138
src/index.d.ts vendored Normal file
View File

@ -0,0 +1,138 @@
import {Socket} from 'net'
import * as Stream from 'stream'
import EventEmitter = NodeJS.EventEmitter
declare enum EnumStates {
HANDSHAKING = 'handshaking',
STATUS = 'status',
LOGIN = 'login',
PLAY = 'play',
}
export interface IPacketMeta {
name: string
state: EnumStates
}
export declare class Client extends EventEmitter {
constructor(isServer: boolean, version: string, customPackets?: any)
write(name: string, params: any)
end(reason: string)
state: EnumStates
isServer: boolean
socket: Socket
uuid: string
username: string
session: any
profile: any
latency: number
on(event: 'packet', handler: (data: any, packetMeta: IPacketMeta) => any)
on(event: 'raw', handler: (data: any, packetMeta: IPacketMeta) => any)
on(event: 'state', handler: (newState: EnumStates, oldState: EnumStates) => any)
on(event: 'session', handler: (session: any) => any)
writeChannel(channel: any, params: any)
registerChannel(name: string, typeDefinition: any, custom?: boolean)
unregisterChannel(name: string)
}
interface IClientsMap {
[key: string]: Client
}
export declare class Server extends EventEmitter {
constructor(version: string, customPackets?: any)
onlineModeExceptions: object
clients: IClientsMap
playerCount: number
maxPlayers: number
motd: string
favicon: string
on(event: 'connection', handler: (client: Client) => any)
on(event: 'login', handler: (client: Client) => any)
}
export interface ICreateServerOptions {
host?: string
port?: number
kickTimeout?: number
checkTimeoutInterval?: number
'online-mode'?: boolean
motd?: string
maxPlayers?: number
keepAlive?: boolean
version?: string
customPackets?: any
stream?: Stream
beforePing?: (response: any, client: Client, callback?: (result: any) => any) => any
errorHandler?: (client: Client, error: Error) => any
connect?: (client: Client) => any
hideErrors?: boolean
}
export interface ICreateClientOptions {
username: string
port?: number
password?: string
host?: string
clientToken?: string
accessToken?: string
keepAlive?: boolean
checkTimeoutInterval?: number
version?: string
customPackets?: any
hideErrors?: boolean
}
export interface ICreateSerializerOptions {
state?: EnumStates
isServer?: boolean
version: string
customPackets: any
}
export interface IPingOptions {
host?: string
port?: number
version?: string
majorVersion?: string
protocolVersion?: string
}
export interface IPingOldResult {
prefix: string
protocol: string
version: string
motd: string
playerCount: number
maxPlayers: number,
}
export interface IPingNewResult {
description: string
players: {
max: number
online: number
sample: {
id: string
name: string
}[]
}
version: {
name: string
protocol: string
}
favicon: string
latency: number
}
export declare function createServer(options: ICreateServerOptions): Server
export declare function createClient(options: ICreateClientOptions): Client
export const state: EnumStates
export declare function createSerializer({state, isServer, version, customPackets}: ICreateSerializerOptions)
export declare function createDeserializer({state, isServer, version, customPackets}: ICreateSerializerOptions)
export declare function ping(options: IPingOptions, callback: (err: Error, result: IPingOldResult | IPingNewResult) => any);
export const supportedVersions: string[]

View File

@ -28,7 +28,7 @@ function ping (options, cb) {
cb(null, data) cb(null, data)
client.end() client.end()
}) })
client.write('ping', {time: [0, 0]}) client.write('ping', { time: [0, 0] })
}) })
client.on('state', function (newState) { client.on('state', function (newState) {

View File

@ -27,9 +27,9 @@ class Server extends EventEmitter {
client.end = function end (endReason) { client.end = function end (endReason) {
endReason = '{"text":"' + endReason + '"}' endReason = '{"text":"' + endReason + '"}'
if (client.state === states.PLAY) { if (client.state === states.PLAY) {
client.write('kick_disconnect', {reason: endReason}) client.write('kick_disconnect', { reason: endReason })
} else if (client.state === states.LOGIN) { } else if (client.state === states.LOGIN) {
client.write('disconnect', {reason: endReason}) client.write('disconnect', { reason: endReason })
} }
client._end(endReason) client._end(endReason)
} }

View File

@ -1,6 +1,6 @@
const states = require('../states') const states = require('../states')
module.exports = function (client, server, {version}) { module.exports = function (client, server, { version }) {
client.once('set_protocol', onHandshake) client.once('set_protocol', onHandshake)
function onHandshake (packet) { function onHandshake (packet) {

View File

@ -56,12 +56,12 @@ module.exports = function (client, server, options) {
function onEncryptionKeyResponse (packet) { function onEncryptionKeyResponse (packet) {
let sharedSecret let sharedSecret
try { try {
const verifyToken = crypto.privateDecrypt({key: server.serverKey.exportKey(), padding: crypto.constants.RSA_PKCS1_PADDING}, packet.verifyToken) const verifyToken = crypto.privateDecrypt({ key: server.serverKey.exportKey(), padding: crypto.constants.RSA_PKCS1_PADDING }, packet.verifyToken)
if (!bufferEqual(client.verifyToken, verifyToken)) { if (!bufferEqual(client.verifyToken, verifyToken)) {
client.end('DidNotEncryptVerifyTokenProperly') client.end('DidNotEncryptVerifyTokenProperly')
return return
} }
sharedSecret = crypto.privateDecrypt({key: server.serverKey.exportKey(), padding: crypto.constants.RSA_PKCS1_PADDING}, packet.sharedSecret) sharedSecret = crypto.privateDecrypt({ key: server.serverKey.exportKey(), padding: crypto.constants.RSA_PKCS1_PADDING }, packet.sharedSecret)
} catch (e) { } catch (e) {
client.end('DidNotEncryptVerifyTokenProperly') client.end('DidNotEncryptVerifyTokenProperly')
return return
@ -111,7 +111,7 @@ module.exports = function (client, server, options) {
client.write('compress', { threshold: 256 }) // Default threshold is 256 client.write('compress', { threshold: 256 }) // Default threshold is 256
client.compressionThreshold = 256 client.compressionThreshold = 256
} }
client.write('success', {uuid: client.uuid, username: client.username}) client.write('success', { uuid: client.uuid, username: client.username })
client.state = states.PLAY client.state = states.PLAY
clearTimeout(loginKickTimer) clearTimeout(loginKickTimer)

View File

@ -1,6 +1,6 @@
const endianToggle = require('endian-toggle') const endianToggle = require('endian-toggle')
module.exports = function (client, server, {beforePing = null}) { module.exports = function (client, server, { beforePing = null }) {
client.once('ping_start', onPing) client.once('ping_start', onPing)
client.once('legacy_server_list_ping', onLegacyPing) client.once('legacy_server_list_ping', onLegacyPing)
@ -15,13 +15,13 @@ module.exports = function (client, server, {beforePing = null}) {
'online': server.playerCount, 'online': server.playerCount,
'sample': [] 'sample': []
}, },
'description': {'text': server.motd}, 'description': { 'text': server.motd },
'favicon': server.favicon 'favicon': server.favicon
} }
function answerToPing (err, response) { function answerToPing (err, response) {
if (err) return if (err) return
client.write('server_info', {response: JSON.stringify(response)}) client.write('server_info', { response: JSON.stringify(response) })
} }
if (beforePing) { if (beforePing) {
@ -35,7 +35,7 @@ module.exports = function (client, server, {beforePing = null}) {
} }
client.once('ping', function (packet) { client.once('ping', function (packet) {
client.write('ping', {time: packet.time}) client.write('ping', { time: packet.time })
client.end() client.end()
}) })
} }

View File

@ -48,7 +48,7 @@ class Splitter extends Transform {
let value, size let value, size
let stop = false let stop = false
try { try {
({value, size} = readVarInt(this.buffer, offset)) ({ value, size } = readVarInt(this.buffer, offset))
} catch (e) { } catch (e) {
if (!(e.partialReadError)) { if (!(e.partialReadError)) {
throw e throw e
@ -59,7 +59,7 @@ class Splitter extends Transform {
try { try {
this.push(this.buffer.slice(offset + size, offset + size + value)) this.push(this.buffer.slice(offset + size, offset + size + value))
offset += size + value; offset += size + value;
({value, size} = readVarInt(this.buffer, offset)) ({ value, size } = readVarInt(this.buffer, offset))
} catch (e) { } catch (e) {
if (e.partialReadError) { if (e.partialReadError) {
break break

View File

@ -22,11 +22,11 @@ function createProtocol (state, direction, version, customPackets) {
return proto return proto
} }
function createSerializer ({state = states.HANDSHAKING, isServer = false, version, customPackets} = {}) { function createSerializer ({ state = states.HANDSHAKING, isServer = false, version, customPackets } = {}) {
return new Serializer(createProtocol(state, !isServer ? 'toServer' : 'toClient', version, customPackets), 'packet') return new Serializer(createProtocol(state, !isServer ? 'toServer' : 'toClient', version, customPackets), 'packet')
} }
function createDeserializer ({state = states.HANDSHAKING, isServer = false, version, customPackets} = {}) { function createDeserializer ({ state = states.HANDSHAKING, isServer = false, version, customPackets } = {}) {
return new Parser(createProtocol(state, isServer ? 'toServer' : 'toClient', version, customPackets), 'packet') return new Parser(createProtocol(state, isServer ? 'toServer' : 'toClient', version, customPackets), 'packet')
} }

View File

@ -6,14 +6,14 @@ const mc = require('../')
const states = mc.states const states = mc.states
const testDataWrite = [ const testDataWrite = [
{name: 'keep_alive', params: {keepAliveId: 957759560}}, { name: 'keep_alive', params: { keepAliveId: 957759560 } },
{name: 'chat', params: {message: '<Bob> Hello World!'}}, { name: 'chat', params: { message: '<Bob> Hello World!' } },
{name: 'position_look', params: {x: 6.5, y: 65.62, stance: 67.24, z: 7.5, yaw: 0, pitch: 0, onGround: true}} { name: 'position_look', params: { x: 6.5, y: 65.62, stance: 67.24, z: 7.5, yaw: 0, pitch: 0, onGround: true } }
// TODO: add more packets for better quality data // TODO: add more packets for better quality data
] ]
const {firstVersion, lastVersion} = require('./common/parallel') const { firstVersion, lastVersion } = require('./common/parallel')
console.log({firstVersion, lastVersion}) console.log({ firstVersion, lastVersion })
mc.supportedVersions.forEach(function (supportedVersion, i) { mc.supportedVersions.forEach(function (supportedVersion, i) {
if (!(i >= firstVersion && i <= lastVersion)) { return } if (!(i >= firstVersion && i <= lastVersion)) { return }
@ -24,7 +24,7 @@ mc.supportedVersions.forEach(function (supportedVersion, i) {
this.timeout(60 * 1000) this.timeout(60 * 1000)
const inputData = [] const inputData = []
it('bench serializing', function (done) { it('bench serializing', function (done) {
const serializer = mc.createSerializer({state: states.PLAY, isServer: false, version: version.minecraftVersion}) const serializer = mc.createSerializer({ state: states.PLAY, isServer: false, version: version.minecraftVersion })
let start, i, j let start, i, j
console.log('Beginning write test') console.log('Beginning write test')
start = Date.now() start = Date.now()
@ -39,7 +39,7 @@ mc.supportedVersions.forEach(function (supportedVersion, i) {
}) })
it('bench parsing', function (done) { it('bench parsing', function (done) {
const deserializer = mc.createDeserializer({state: states.PLAY, isServer: true, version: version.minecraftVersion}) const deserializer = mc.createDeserializer({ state: states.PLAY, isServer: true, version: version.minecraftVersion })
console.log('Beginning read test') console.log('Beginning read test')
const start = Date.now() const start = Date.now()
for (let j = 0; j < inputData.length; j++) { for (let j = 0; j < inputData.length; j++) {

View File

@ -9,7 +9,7 @@ const MC_SERVER_PATH = path.join(__dirname, 'server')
const Wrap = require('minecraft-wrap').Wrap const Wrap = require('minecraft-wrap').Wrap
const {firstVersion, lastVersion} = require('./common/parallel') const { firstVersion, lastVersion } = require('./common/parallel')
const download = require('minecraft-wrap').download const download = require('minecraft-wrap').download

View File

@ -10,11 +10,11 @@ const mc = require('../../')
// (3,4,10) -> (9,9) // (3,4,10) -> (9,9)
function testedRange (nodeIndex, nodeTotal, numberOfVersions) { function testedRange (nodeIndex, nodeTotal, numberOfVersions) {
const nbFirsts = Math.ceil(numberOfVersions / nodeTotal) const nbFirsts = Math.ceil(numberOfVersions / nodeTotal)
if (nodeIndex === (nodeTotal - 1)) { return {firstVersion: nbFirsts * nodeIndex, lastVersion: numberOfVersions - 1} } if (nodeIndex === (nodeTotal - 1)) { return { firstVersion: nbFirsts * nodeIndex, lastVersion: numberOfVersions - 1 } }
return {firstVersion: nodeIndex * nbFirsts, lastVersion: (nodeIndex + 1) * nbFirsts - 1} return { firstVersion: nodeIndex * nbFirsts, lastVersion: (nodeIndex + 1) * nbFirsts - 1 }
} }
console.log({nodeIndex, nodeTotal, versions: mc.supportedVersions.length}) console.log({ nodeIndex, nodeTotal, versions: mc.supportedVersions.length })
const {firstVersion, lastVersion} = parallel ? testedRange(nodeIndex, nodeTotal, mc.supportedVersions.length) : {firstVersion: 0, lastVersion: mc.supportedVersions.length - 1} const { firstVersion, lastVersion } = parallel ? testedRange(nodeIndex, nodeTotal, mc.supportedVersions.length) : { firstVersion: 0, lastVersion: mc.supportedVersions.length - 1 }
module.exports = {firstVersion, lastVersion} module.exports = { firstVersion, lastVersion }

View File

@ -21,13 +21,13 @@ const slotValue = {
type: 'compound', type: 'compound',
name: 'test', name: 'test',
value: { value: {
test1: {type: 'int', value: 4}, test1: { type: 'int', value: 4 },
test2: {type: 'long', value: [12, 42]}, test2: { type: 'long', value: [12, 42] },
test3: {type: 'byteArray', value: [32]}, test3: { type: 'byteArray', value: [32] },
test4: {type: 'string', value: 'ohi'}, test4: { type: 'string', value: 'ohi' },
test5: {type: 'list', value: {type: 'int', value: [4]}}, test5: { type: 'list', value: { type: 'int', value: [4] } },
test6: {type: 'compound', value: {test: {type: 'int', value: 4}}}, test6: { type: 'compound', value: { test: { type: 'int', value: 4 } } },
test7: {type: 'intArray', value: [12, 42]} test7: { type: 'intArray', value: [12, 42] }
} }
} }
} }
@ -85,45 +85,45 @@ const values = {
type: 'compound', type: 'compound',
name: 'test', name: 'test',
value: { value: {
test1: {type: 'int', value: 4}, test1: { type: 'int', value: 4 },
test2: {type: 'long', value: [12, 42]}, test2: { type: 'long', value: [12, 42] },
test3: {type: 'byteArray', value: [32]}, test3: { type: 'byteArray', value: [32] },
test4: {type: 'string', value: 'ohi'}, test4: { type: 'string', value: 'ohi' },
test5: {type: 'list', value: {type: 'int', value: [4]}}, test5: { type: 'list', value: { type: 'int', value: [4] } },
test6: {type: 'compound', value: {test: {type: 'int', value: 4}}}, test6: { type: 'compound', value: { test: { type: 'int', value: 4 } } },
test7: {type: 'intArray', value: [12, 42]} test7: { type: 'intArray', value: [12, 42] }
} }
}, },
'optionalNbt': { 'optionalNbt': {
type: 'compound', type: 'compound',
name: 'test', name: 'test',
value: { value: {
test1: {type: 'int', value: 4}, test1: { type: 'int', value: 4 },
test2: {type: 'long', value: [12, 42]}, test2: { type: 'long', value: [12, 42] },
test3: {type: 'byteArray', value: [32]}, test3: { type: 'byteArray', value: [32] },
test4: {type: 'string', value: 'ohi'}, test4: { type: 'string', value: 'ohi' },
test5: {type: 'list', value: {type: 'int', value: [4]}}, test5: { type: 'list', value: { type: 'int', value: [4] } },
test6: {type: 'compound', value: {test: {type: 'int', value: 4}}}, test6: { type: 'compound', value: { test: { type: 'int', value: 4 } } },
test7: {type: 'intArray', value: [12, 42]} test7: { type: 'intArray', value: [12, 42] }
} }
}, },
'compressedNbt': { 'compressedNbt': {
type: 'compound', type: 'compound',
name: 'test', name: 'test',
value: { value: {
test1: {type: 'int', value: 4}, test1: { type: 'int', value: 4 },
test2: {type: 'long', value: [12, 42]}, test2: { type: 'long', value: [12, 42] },
test3: {type: 'byteArray', value: [32]}, test3: { type: 'byteArray', value: [32] },
test4: {type: 'string', value: 'ohi'}, test4: { type: 'string', value: 'ohi' },
test5: {type: 'list', value: {type: 'int', value: [4]}}, test5: { type: 'list', value: { type: 'int', value: [4] } },
test6: {type: 'compound', value: {test: {type: 'int', value: 4}}}, test6: { type: 'compound', value: { test: { type: 'int', value: 4 } } },
test7: {type: 'intArray', value: [12, 42]} test7: { type: 'intArray', value: [12, 42] }
} }
}, },
'i64': [0, 1], 'i64': [0, 1],
'u64': [0, 1], 'u64': [0, 1],
'entityMetadata': [ 'entityMetadata': [
{key: 17, value: 0, type: 0} { key: 17, value: 0, type: 0 }
], ],
'objectData': { 'objectData': {
intField: 9, intField: 9,
@ -132,10 +132,10 @@ const values = {
velocityZ: 3 velocityZ: 3
}, },
'UUID': '00112233-4455-6677-8899-aabbccddeeff', 'UUID': '00112233-4455-6677-8899-aabbccddeeff',
'position': {x: 12, y: 100, z: 4382821}, 'position': { x: 12, y: 100, z: 4382821 },
'position_ibi': {x: 12, y: 100, z: 4382821}, 'position_ibi': { x: 12, y: 100, z: 4382821 },
'position_isi': {x: 12, y: 100, z: 4382821}, 'position_isi': { x: 12, y: 100, z: 4382821 },
'position_iii': {x: 12, y: 100, z: 4382821}, 'position_iii': { x: 12, y: 100, z: 4382821 },
'restBuffer': Buffer.alloc(0), 'restBuffer': Buffer.alloc(0),
'switch': function (typeArgs, context) { 'switch': function (typeArgs, context) {
const i = typeArgs.fields[getField(typeArgs.compareTo, context)] const i = typeArgs.fields[getField(typeArgs.compareTo, context)]
@ -158,7 +158,7 @@ const values = {
}) })
return results return results
}, },
'tags': [{'tagName': 'hi', 'entries': [1, 2, 3, 4, 5]}], 'tags': [{ 'tagName': 'hi', 'entries': [1, 2, 3, 4, 5] }],
'ingredient': [slotValue], 'ingredient': [slotValue],
'particleData': null 'particleData': null
} }
@ -174,7 +174,7 @@ function getValue (_type, packet) {
} }
} }
const {firstVersion, lastVersion} = require('./common/parallel') const { firstVersion, lastVersion } = require('./common/parallel')
mc.supportedVersions.forEach(function (supportedVersion, i) { mc.supportedVersions.forEach(function (supportedVersion, i) {
if (!(i >= firstVersion && i <= lastVersion)) { return } if (!(i >= firstVersion && i <= lastVersion)) { return }

View File

@ -3,7 +3,7 @@
const mc = require('../') const mc = require('../')
const assert = require('power-assert') const assert = require('power-assert')
const {firstVersion, lastVersion} = require('./common/parallel') const { firstVersion, lastVersion } = require('./common/parallel')
mc.supportedVersions.forEach(function (supportedVersion, i) { mc.supportedVersions.forEach(function (supportedVersion, i) {
if (!(i >= firstVersion && i <= lastVersion)) { return } if (!(i >= firstVersion && i <= lastVersion)) { return }
@ -124,7 +124,7 @@ mc.supportedVersions.forEach(function (supportedVersion, i) {
online: 0, online: 0,
sample: [] sample: []
}, },
description: {text: 'test1234'} description: { text: 'test1234' }
}) })
server.close() server.close()
}) })
@ -192,9 +192,9 @@ mc.supportedVersions.forEach(function (supportedVersion, i) {
player2.end() player2.end()
} }
player1.write('chat', {message: 'hello'}) player1.write('chat', { message: 'hello' })
}) })
player2.write('chat', {message: 'hi'}) player2.write('chat', { message: 'hi' })
}) })
const player2 = mc.createClient({ const player2 = mc.createClient({
username: 'player2', username: 'player2',
@ -211,7 +211,7 @@ mc.supportedVersions.forEach(function (supportedVersion, i) {
if (!server.clients.hasOwnProperty(clientId)) continue if (!server.clients.hasOwnProperty(clientId)) continue
client = server.clients[clientId] client = server.clients[clientId]
if (client !== exclude) client.write('chat', {message: JSON.stringify({text: message}), position: 0}) if (client !== exclude) client.write('chat', { message: JSON.stringify({ text: message }), position: 0 })
} }
} }
}) })