mirror of
https://github.com/PrismarineJS/node-minecraft-protocol.git
synced 2024-11-14 19:04:59 -05:00
fix autoversion in online mode.
Explanation: in this specific case, we were changing the state of the client to hanshaking (in autoVersion.js) before a connection was made (using setSocket), the consequence is the serializer was already piped to the framer when setSocket was called, and setSocket doesn't unpipe before piping. The consequence of that was the framer was piped 2 times, the packet was sent 2 times and the server kicked us. My solution is piping the serializer to the framer in Client constructor. Then if the state is changed, it will anyway automatically unpipe before repiping. Other places correctly unpipe before piping. Autoversion is now the default in nmp too
This commit is contained in:
parent
2d4f4a05e1
commit
eb5764e7ab
3 changed files with 19 additions and 18 deletions
|
@ -7,7 +7,8 @@ if(process.argv.length < 4 || process.argv.length > 6) {
|
|||
process.exit(1);
|
||||
}
|
||||
|
||||
var client = mc.createClient({version: false,
|
||||
var client = mc.createClient({
|
||||
version: false,
|
||||
host: process.argv[2],
|
||||
port: parseInt(process.argv[3]),
|
||||
username: process.argv[4] ? process.argv[4] : "echo",
|
||||
|
|
|
@ -18,7 +18,6 @@ class Client extends EventEmitter
|
|||
this.version=version;
|
||||
this.isServer = !!isServer;
|
||||
this.splitter=framing.createSplitter();
|
||||
this.setSerializer(states.HANDSHAKING);
|
||||
this.packetsToParse={};
|
||||
this.serializer;
|
||||
this.compressor=null;
|
||||
|
@ -28,7 +27,6 @@ class Client extends EventEmitter
|
|||
this.decompressor=null;
|
||||
this.deserializer;
|
||||
this.isServer;
|
||||
this.protocolState=states.HANDSHAKING;
|
||||
this.ended=true;
|
||||
this.latency=0;
|
||||
|
||||
|
@ -41,6 +39,8 @@ class Client extends EventEmitter
|
|||
const direction = this.isServer ? 'toServer' : 'toClient';
|
||||
this.packetsToParse[event] -= 1;
|
||||
});
|
||||
|
||||
this.state=states.HANDSHAKING;
|
||||
}
|
||||
|
||||
get state(){
|
||||
|
@ -109,19 +109,19 @@ class Client extends EventEmitter
|
|||
const oldProperty = this.protocolState;
|
||||
this.protocolState = newProperty;
|
||||
|
||||
if(!this.compressor)
|
||||
{
|
||||
this.serializer.unpipe(this.framer);
|
||||
this.splitter.unpipe(this.deserializer);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.serializer.unpipe(this.compressor);
|
||||
this.decompressor.unpipe(this.deserializer);
|
||||
}
|
||||
if(this.serializer) {
|
||||
if (!this.compressor) {
|
||||
this.serializer.unpipe();
|
||||
this.splitter.unpipe(this.deserializer);
|
||||
}
|
||||
else {
|
||||
this.serializer.unpipe(this.compressor);
|
||||
this.decompressor.unpipe(this.deserializer);
|
||||
}
|
||||
|
||||
this.serializer.removeAllListeners();
|
||||
this.deserializer.removeAllListeners();
|
||||
this.serializer.removeAllListeners();
|
||||
this.deserializer.removeAllListeners();
|
||||
}
|
||||
this.setSerializer(this.protocolState);
|
||||
|
||||
if(!this.compressor)
|
||||
|
@ -180,8 +180,8 @@ class Client extends EventEmitter
|
|||
this.framer.on('error', onError);
|
||||
this.splitter.on('error', onError);
|
||||
|
||||
this.socket.pipe(this.splitter).pipe(this.deserializer);
|
||||
this.serializer.pipe(this.framer).pipe(this.socket);
|
||||
this.socket.pipe(this.splitter);
|
||||
this.framer.pipe(this.socket);
|
||||
}
|
||||
|
||||
end(reason) {
|
||||
|
|
|
@ -40,7 +40,7 @@ function ping(options, cb) {
|
|||
// TODO: refactor with src/client/setProtocol.js
|
||||
client.on('connect', function() {
|
||||
client.write('set_protocol', {
|
||||
protocolVersion: options.protocolVersion,
|
||||
protocolVersion: -1,
|
||||
serverHost: options.host,
|
||||
serverPort: options.port,
|
||||
nextState: 1
|
||||
|
|
Loading…
Reference in a new issue