mirror of
https://github.com/unmojang/node-minecraft-protocol.git
synced 2025-09-27 05:03:50 -04:00
Merge branch 'master' into lluiscab/fix-client_echo
This commit is contained in:
commit
26267ab043
@ -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 })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -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})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -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 })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -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 })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -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'))
|
||||||
|
@ -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) {
|
||||||
|
@ -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",
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
@ -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
138
src/index.d.ts
vendored
Normal 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[]
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
|
@ -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()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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++) {
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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 }
|
||||||
|
@ -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 }
|
||||||
|
@ -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 })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user