mirror of
https://github.com/PrismarineJS/node-minecraft-protocol.git
synced 2024-12-04 13:01:14 -05:00
Complete the HandshakeAck exchange
This commit is contained in:
parent
06f8a5fe28
commit
e80471753b
1 changed files with 56 additions and 8 deletions
|
@ -38,6 +38,8 @@ proto.addType("string", ["pstring", {
|
||||||
|
|
||||||
|
|
||||||
// http://wiki.vg/Minecraft_Forge_Handshake
|
// http://wiki.vg/Minecraft_Forge_Handshake
|
||||||
|
// TODO: refactor to use one big switch like https://github.com/PrismarineJS/node-minecraft-protocol/blob/master/src/transforms/serializer.js#L21
|
||||||
|
// and with a mapper for symbolic names https://github.com/PrismarineJS/prismarine-nbt/blob/master/nbt.json#L48
|
||||||
proto.addType('FML|HS',
|
proto.addType('FML|HS',
|
||||||
[
|
[
|
||||||
'container',
|
'container',
|
||||||
|
@ -135,6 +137,35 @@ proto.addType('FML|HS',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// RegistryData
|
||||||
|
{
|
||||||
|
"name": "hasMore",
|
||||||
|
"type": [
|
||||||
|
"switch",
|
||||||
|
{
|
||||||
|
"compareTo": "discriminator",
|
||||||
|
"fields": {
|
||||||
|
"3": "boolean"
|
||||||
|
},
|
||||||
|
"default": "void"
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
/* TODO: support all fields
|
||||||
|
"name": "registryName",
|
||||||
|
"type": [
|
||||||
|
"switch",
|
||||||
|
{
|
||||||
|
"compareTo": "discriminator",
|
||||||
|
"fields": {
|
||||||
|
"3": "string"
|
||||||
|
},
|
||||||
|
"default": "void"
|
||||||
|
},
|
||||||
|
],
|
||||||
|
*/
|
||||||
|
},
|
||||||
|
|
||||||
// HandshakeAck
|
// HandshakeAck
|
||||||
{
|
{
|
||||||
"name": "phase",
|
"name": "phase",
|
||||||
|
@ -153,6 +184,17 @@ proto.addType('FML|HS',
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
function writeAck(client, phase) {
|
||||||
|
var ackData = proto.createPacketBuffer('FML|HS', {
|
||||||
|
discriminator: -1, // HandshakeAck,
|
||||||
|
phase: 2 // WAITINGSERVERDATA
|
||||||
|
});
|
||||||
|
client.write('custom_payload', {
|
||||||
|
channel: 'FML|HS',
|
||||||
|
data: ackData
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
client.on('custom_payload', function(packet) {
|
client.on('custom_payload', function(packet) {
|
||||||
var channel = packet.channel;
|
var channel = packet.channel;
|
||||||
var data = packet.data;
|
var data = packet.data;
|
||||||
|
@ -199,18 +241,24 @@ client.on('custom_payload', function(packet) {
|
||||||
channel: 'FML|HS',
|
channel: 'FML|HS',
|
||||||
data: modList
|
data: modList
|
||||||
});
|
});
|
||||||
|
writeAck(client, 2); // WAITINGSERVERDATA
|
||||||
} else if (parsed.data.discriminator === 2) { // ModList
|
} else if (parsed.data.discriminator === 2) { // ModList
|
||||||
console.log('Server ModList:',parsed.data.mods);
|
console.log('Server ModList:',parsed.data.mods);
|
||||||
// TODO: client/server check if mods compatible
|
// TODO: client/server check if mods compatible
|
||||||
|
|
||||||
var ackWaitingServerData = proto.createPacketBuffer('FML|HS', {
|
} else if (parsed.data.discriminator === 3) { // RegistryData
|
||||||
discriminator: -1, // HandshakeAck,
|
console.log('RegistryData',parsed.data);
|
||||||
phase: 2 // WAITINGSERVERDATA
|
if (!parsed.data.hasMore) {
|
||||||
});
|
console.log('LAST RegistryData');
|
||||||
client.write('custom_payload', {
|
|
||||||
channel: 'FML|HS',
|
writeAck(client, 3); // WAITINGSERVERCOMPLETE
|
||||||
data: ackWaitingServerData
|
}
|
||||||
});
|
} else if (parsed.data.discriminator === -1) { // HandshakeAck
|
||||||
|
if (parsed.data.phase === 2) { // WAITINGCACK
|
||||||
|
writeAck(client, 4); // PENDINGCOMPLETE
|
||||||
|
} else if (parsed.data.phase === 3) { // COMPLETE
|
||||||
|
console.log('HandshakeAck Complete!');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue