From 9a68fd6c34fc99f3dcf20f8582fe482609d28dba Mon Sep 17 00:00:00 2001 From: deathcap Date: Sat, 30 Jan 2016 22:50:24 -0800 Subject: [PATCH] Support options.version==false in createClient() to auto-detect version --- examples/client_auto/client_auto.js | 2 +- src/client/autoVersion.js | 24 +++++++++++++----------- src/createClient.js | 6 +++++- src/index.js | 2 -- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/examples/client_auto/client_auto.js b/examples/client_auto/client_auto.js index 99701ae..fdc586d 100644 --- a/examples/client_auto/client_auto.js +++ b/examples/client_auto/client_auto.js @@ -5,7 +5,7 @@ if(process.argv.length < 4 || process.argv.length > 6) { process.exit(1); } -var client = mc.createClientAuto({ +var client = mc.createClient({version: false, host: process.argv[2], port: parseInt(process.argv[3]), username: process.argv[4] ? process.argv[4] : "echo", diff --git a/src/client/autoVersion.js b/src/client/autoVersion.js index b88463f..83cae2c 100644 --- a/src/client/autoVersion.js +++ b/src/client/autoVersion.js @@ -1,9 +1,9 @@ 'use strict'; -var ping = require('./ping'); +var ping = require('../ping'); +var debug = require('../debug'); +var states = require('../states'); var assert = require('assert'); -var debug = require('./debug'); -var createClient = require('./createClient'); var minecraft_data = require('minecraft-data'); // Get the minecraft-data version string for a protocol version @@ -14,19 +14,18 @@ function protocolVersion2MinecraftVersion(n) { var version = minecraft_data.versions[i]; if (version.version === Math.abs(n) && version.usesNetty === usesNetty) { console.log(version); - return version.minecraftVersion; + return [version.minecraftVersion, version.majorVersion]; } } throw new Error(`unsupported/unknown protocol version: ${n}, update minecraft-data`); } -function createClientAuto(options) { - assert.ok(options, 'options is required'); +module.exports = function(client) { + var options = client.options; debug('creating client'); - options.wait_connect = true; // don't let createClient / src/client/setProtocol proceed on socket 'connect' until 'connect_allowed' - var client = createClient(options); // vanilla + options.wait_connect = true; // don't let src/client/setProtocol proceed on socket 'connect' until 'connect_allowed' debug('pinging',options.host); // TODO: detect ping timeout, https://github.com/PrismarineJS/node-minecraft-protocol/issues/329 ping(options, function(err, response) { @@ -46,12 +45,17 @@ function createClientAuto(options) { // Note that versionName is a descriptive version stirng like '1.8.9' on vailla, but other // servers add their own name (Spigot 1.8.8, Glowstone++ 1.8.9) so we cannot use it directly, // even though it is in a format accepted by minecraft-data. Instead, translate the protocol. - client.options.version = protocolVersion2MinecraftVersion(protocolVersion); + var [minecraftVersion, majorVersion] = protocolVersion2MinecraftVersion(protocolVersion); + client.options.version = minecraftVersion; // Use the exact same protocol version // Requires https://github.com/PrismarineJS/node-minecraft-protocol/pull/330 client.options.protocolVersion = protocolVersion; + // reinitialize client object with new version TODO: move out of its constructor + client.version = majorVersion; + client.setSerializer(states.HANDSHAKING); + if (response.modinfo && response.modinfo.type === 'FML') { // Use the list of Forge mods from the server ping, so client will match server var forgeMods = response.modinfo.modList; @@ -66,5 +70,3 @@ function createClientAuto(options) { }); return client; } - -module.exports = createClientAuto; diff --git a/src/createClient.js b/src/createClient.js index 5d7c342..0a68c7c 100644 --- a/src/createClient.js +++ b/src/createClient.js @@ -8,6 +8,7 @@ var caseCorrect = require('./client/caseCorrect'); var setProtocol = require('./client/setProtocol'); var play = require('./client/play'); var tcp_dns = require('./client/tcp_dns'); +var autoVersion = require('./client/autoVersion'); module.exports=createClient; @@ -15,8 +16,10 @@ function createClient(options) { assert.ok(options, "options is required"); assert.ok(options.username, "username is required"); + // TODO: avoid setting default version if autoVersion is enabled var optVersion = options.version || require("./version").defaultVersion; var mcData=require("minecraft-data")(optVersion); + if (!mcData) throw new Error(`unsupported protocol version: ${optVersion}`); var version = mcData.version; options.majorVersion = version.majorVersion; options.protocolVersion = version.version; @@ -25,12 +28,13 @@ function createClient(options) { client.options = options; tcp_dns(client); + caseCorrect(client); + if (options.version === false) autoVersion(client); setProtocol(client); keepalive(client); encrypt(client); play(client); compress(client); - caseCorrect(client); return client; } diff --git a/src/index.js b/src/index.js index 697c657..8d90027 100644 --- a/src/index.js +++ b/src/index.js @@ -2,12 +2,10 @@ var Client = require('./client'); var Server = require('./server'); var serializer = require("./transforms/serializer"); var createClient = require("./createClient"); -var createClientAuto = require("./createClientAuto"); var createServer = require("./createServer"); module.exports = { createClient: createClient, - createClientAuto: createClientAuto, createServer: createServer, Client: Client, Server: Server,