mirror of
https://github.com/unmojang/node-minecraft-protocol.git
synced 2025-09-29 06:03:33 -04:00
Refactoring more code. Fix writing bug
This commit is contained in:
parent
863f329ac0
commit
ab24877359
@ -8,6 +8,7 @@ var net = require('net')
|
|||||||
, oldStylePacket = protocol.oldStylePacket
|
, oldStylePacket = protocol.oldStylePacket
|
||||||
, newStylePacket = protocol.newStylePacket
|
, newStylePacket = protocol.newStylePacket
|
||||||
, parsePacket = protocol.parsePacket
|
, parsePacket = protocol.parsePacket
|
||||||
|
, parsePacketData = protocol.parsePacketData
|
||||||
, parseNewStylePacket = protocol.parseNewStylePacket
|
, parseNewStylePacket = protocol.parseNewStylePacket
|
||||||
, packetIds = protocol.packetIds
|
, packetIds = protocol.packetIds
|
||||||
, packetNames = protocol.packetNames
|
, packetNames = protocol.packetNames
|
||||||
@ -89,7 +90,7 @@ Client.prototype.setSocket = function(socket) {
|
|||||||
}
|
}
|
||||||
if (! parsed) { return; }
|
if (! parsed) { return; }
|
||||||
var packet = parsed.results;
|
var packet = parsed.results;
|
||||||
incomingBuffer = incomingBuffer.slice(parsed.size);
|
//incomingBuffer = incomingBuffer.slice(parsed.size); TODO: Already removed in prepare
|
||||||
|
|
||||||
var packetName = protocol.packetNames[self.state][self.isServer ? 'toServer' : 'toClient'][packet.id];
|
var packetName = protocol.packetNames[self.state][self.isServer ? 'toServer' : 'toClient'][packet.id];
|
||||||
self.emit(packetName, packet);
|
self.emit(packetName, packet);
|
||||||
@ -100,10 +101,19 @@ Client.prototype.setSocket = function(socket) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function prepareParse() {
|
function prepareParse() {
|
||||||
if(self.compressionThreshold == -2)
|
var packetLengthField = protocol.types["varint"][0](incomingBuffer, 0);
|
||||||
afterParse(null, parsePacket(incomingBuffer, self.state, self.isServer, self.packetsToParse));
|
if (packetLengthField && packetLengthField.size + packetLengthField.value <= incomingBuffer.length)
|
||||||
else
|
{
|
||||||
parseNewStylePacket(incomingBuffer, self.state, self.isServer, self.packetsToParse, afterParse);
|
var buf = incomingBuffer.slice(packetLengthField.size, packetLengthField.size + packetLengthField.value);
|
||||||
|
// TODO : Slice as early as possible to avoid processing same data twice.
|
||||||
|
incomingBuffer = incomingBuffer.slice(packetLengthField.size + packetLengthField.value);
|
||||||
|
if (self.compressionThreshold == -2)
|
||||||
|
{
|
||||||
|
afterParse(null, parsePacketData(buf, self.state, self.isServer, self.packetsToParse));
|
||||||
|
} else {
|
||||||
|
parseNewStylePacket(buf, self.state, self.isServer, self.packetsToParse, afterParse);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.socket = socket;
|
self.socket = socket;
|
||||||
@ -171,7 +181,12 @@ Client.prototype.write = function(packetId, params) {
|
|||||||
packetId = packetIds[this.state][this.isServer ? "toClient" : "toServer"][packetId];
|
packetId = packetIds[this.state][this.isServer ? "toClient" : "toServer"][packetId];
|
||||||
var that = this;
|
var that = this;
|
||||||
|
|
||||||
var finishWriting = function(buffer) {
|
var finishWriting = function(err, buffer) {
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
console.log(err);
|
||||||
|
throw err; // TODO : Handle errors gracefully, if possible
|
||||||
|
}
|
||||||
var packetName = packetNames[that.state][that.isServer ? "toClient" : "toServer"][packetId];
|
var packetName = packetNames[that.state][that.isServer ? "toClient" : "toServer"][packetId];
|
||||||
debug("writing packetId " + that.state + "." + packetName + " (0x" + packetId.toString(16) + ")");
|
debug("writing packetId " + that.state + "." + packetName + " (0x" + packetId.toString(16) + ")");
|
||||||
debug(params);
|
debug(params);
|
||||||
@ -186,10 +201,10 @@ Client.prototype.write = function(packetId, params) {
|
|||||||
compressPacketBuffer(buffer, finishWriting);
|
compressPacketBuffer(buffer, finishWriting);
|
||||||
} else if (this.compressionThreshold >= -1) {
|
} else if (this.compressionThreshold >= -1) {
|
||||||
debug("New-styling packet");
|
debug("New-styling packet");
|
||||||
finishWriting(newStylePacket(buffer));
|
newStylePacket(buffer, finishWriting);
|
||||||
} else {
|
} else {
|
||||||
debug("Old-styling packet");
|
debug("Old-styling packet");
|
||||||
finishWriting(oldStylePacket(buffer));
|
oldStylePacket(buffer, finishWriting);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1434,32 +1434,30 @@ function createPacketBuffer(packetId, state, params, isServer) {
|
|||||||
|
|
||||||
function compressPacketBuffer(buffer, callback) {
|
function compressPacketBuffer(buffer, callback) {
|
||||||
var dataLength = buffer.size;
|
var dataLength = buffer.size;
|
||||||
zlib.deflate(buffer, function(compressedBuffer) {
|
zlib.deflate(buffer, function(err, buf) {
|
||||||
var packetLength = sizeOfVarInt(dataLength) + compressedBuffer.length;
|
if (err)
|
||||||
var size = sizeOfVarInt(packetLength) + packetLength;
|
callback(err);
|
||||||
var packetBuffer = new Buffer(size);
|
else
|
||||||
var offset = writeVarInt(packetLength, packetBuffer, 0);
|
newStylePacket(buffer, callback);
|
||||||
offset = writeVarInt(dataLength, packetBuffer, offset);
|
|
||||||
writeBuffer(compressedBuffer, packetBuffer, offset);
|
|
||||||
callback(packetBuffer);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function oldStylePacket(buffer) {
|
function oldStylePacket(buffer, callback) {
|
||||||
var packet = new Buffer(sizeOfVarInt(buffer.length) + buffer.length);
|
var packet = new Buffer(sizeOfVarInt(buffer.length) + buffer.length);
|
||||||
var cursor = writeVarInt(buffer.length, packet, 0);
|
var cursor = writeVarInt(buffer.length, packet, 0);
|
||||||
writeBuffer(buffer, packet, cursor);
|
writeBuffer(buffer, packet, cursor);
|
||||||
return packet;
|
callback(null, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
function newStylePacket(buffer) {
|
function newStylePacket(buffer, callback) {
|
||||||
var sizeOfO = sizeOfVarInt(0);
|
var sizeOfDataLength = sizeOfVarInt(0);
|
||||||
var size = sizeOfVarInt(buffer.length + sizeOfO) + sizeOfO + buffer.length;
|
var sizeOfLength = sizeOfVarInt(buffer.length + sizeOfDataLength);
|
||||||
|
var size = sizeOfLength + sizeOfDataLength + buffer.length;
|
||||||
var packet = new Buffer(size);
|
var packet = new Buffer(size);
|
||||||
var cursor = writeVarInt(buffer.length, packet, 0);
|
var cursor = writeVarInt(size - sizeOfLength, packet, 0);
|
||||||
cursor = writeVarInt(0, packet, cursor);
|
cursor = writeVarInt(0, packet, cursor);
|
||||||
writeBuffer(buffer, packet, cursor);
|
writeBuffer(buffer, packet, cursor);
|
||||||
return packet;
|
callback(null, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
function parsePacketData(buffer, state, isServer, packetsToParse) {
|
function parsePacketData(buffer, state, isServer, packetsToParse) {
|
||||||
@ -1536,29 +1534,19 @@ function parsePacket(buffer, state, isServer, packetsToParse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function parseNewStylePacket(buffer, state, isServer, packetsToParse, cb) {
|
function parseNewStylePacket(buffer, state, isServer, packetsToParse, cb) {
|
||||||
if (state == null) state = states.PLAY;
|
var dataLengthField = readVarInt(buffer, 0);
|
||||||
var cursor = 0;
|
var buf = buffer.slice(dataLengthField.size);
|
||||||
var lengthField = readVarInt(buffer, 0);
|
|
||||||
if (!!!lengthField) return null;
|
|
||||||
var length = lengthField.value;
|
|
||||||
cursor += lengthField.size;
|
|
||||||
if (length >= buffer.length - cursor) { return null };
|
|
||||||
var dataLengthField = readVarInt(buffer, cursor);
|
|
||||||
cursor += dataLengthField.size;
|
|
||||||
if(dataLengthField.value != 0) {
|
if(dataLengthField.value != 0) {
|
||||||
var bufToDecompress = buffer.slice(cursor);
|
zlib.inflate(buf, function(err, newbuf) {
|
||||||
zlib.inflate(bufToDecompress, function(err, newbuf) {
|
|
||||||
if (err) {
|
if (err) {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
cb(err);
|
cb(err);
|
||||||
} else {
|
} else {
|
||||||
var result = parsePacketData(newbuf, state, isServer, packetsToParse);
|
|
||||||
result.size = lengthField.size + length;
|
|
||||||
cb(null, parsePacketData(newbuf, state, isServer, packetsToParse));
|
cb(null, parsePacketData(newbuf, state, isServer, packetsToParse));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
cb(null, parsePacketData(buffer.slice(cursor, cursor + length), state, isServer, packetsToParse));
|
cb(null, parsePacketData(buf, state, isServer, packetsToParse));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1567,6 +1555,7 @@ module.exports = {
|
|||||||
minecraftVersion: '1.8.1',
|
minecraftVersion: '1.8.1',
|
||||||
sessionVersion: 13,
|
sessionVersion: 13,
|
||||||
parsePacket: parsePacket,
|
parsePacket: parsePacket,
|
||||||
|
parsePacketData: parsePacketData,
|
||||||
parseNewStylePacket: parseNewStylePacket,
|
parseNewStylePacket: parseNewStylePacket,
|
||||||
createPacketBuffer: createPacketBuffer,
|
createPacketBuffer: createPacketBuffer,
|
||||||
compressPacketBuffer: compressPacketBuffer,
|
compressPacketBuffer: compressPacketBuffer,
|
||||||
@ -1577,6 +1566,7 @@ module.exports = {
|
|||||||
packetNames: packetNames,
|
packetNames: packetNames,
|
||||||
packetFields: packetFields,
|
packetFields: packetFields,
|
||||||
packetStates: packetStates,
|
packetStates: packetStates,
|
||||||
|
types: types,
|
||||||
states: states,
|
states: states,
|
||||||
get: get,
|
get: get,
|
||||||
debug: debug,
|
debug: debug,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user