mirror of
https://github.com/PrismarineJS/node-minecraft-protocol.git
synced 2024-12-04 13:01:14 -05:00
Forge client example pings server to get forgeMods list
Avoids the need to hardcode the mod list in the client, in order to successfully connect to arbitrary Forge servers (with various mods).
This commit is contained in:
parent
0b45b439bc
commit
283b75d694
1 changed files with 64 additions and 42 deletions
|
@ -7,38 +7,10 @@ if(process.argv.length < 4 || process.argv.length > 6) {
|
|||
process.exit(1);
|
||||
}
|
||||
|
||||
var client = mc.createClient({
|
||||
forge: true,
|
||||
// Client/server mods installed on the client
|
||||
// TODO: send from ServerListPing packet
|
||||
forgeMods:
|
||||
[
|
||||
{modid:'IronChest', version:'6.0.121.768'}
|
||||
],
|
||||
host: process.argv[2],
|
||||
port: parseInt(process.argv[3]),
|
||||
username: process.argv[4] ? process.argv[4] : "echo",
|
||||
password: process.argv[5]
|
||||
});
|
||||
|
||||
client.on('connect', function() {
|
||||
console.info('connected');
|
||||
});
|
||||
client.on('disconnect', function(packet) {
|
||||
console.log('disconnected: '+ packet.reason);
|
||||
});
|
||||
client.on('end', function(err) {
|
||||
console.log('Connection lost');
|
||||
});
|
||||
client.on('chat', function(packet) {
|
||||
var jsonMsg = JSON.parse(packet.message);
|
||||
if(jsonMsg.translate == 'chat.type.announcement' || jsonMsg.translate == 'chat.type.text') {
|
||||
var username = jsonMsg.with[0].text;
|
||||
var msg = jsonMsg.with[1];
|
||||
if(username === client.username) return;
|
||||
client.write('chat', {message: msg});
|
||||
}
|
||||
});
|
||||
var host = process.argv[2];
|
||||
var port = parseInt(process.argv[3]);
|
||||
var username = process.argv[4] ? process.argv[4] : "echo";
|
||||
var password = process.argv[5];
|
||||
|
||||
var proto = new ProtoDef();
|
||||
// copied from ../../dist/transforms/serializer.js TODO: refactor
|
||||
|
@ -299,16 +271,66 @@ function fmlHandshakeStep(client, data)
|
|||
}
|
||||
}
|
||||
|
||||
client.on('custom_payload', function(packet) {
|
||||
var channel = packet.channel;
|
||||
var data = packet.data;
|
||||
//var forgeMods; // = [ {modid:'IronChest', version:'6.0.121.768'} ];
|
||||
|
||||
if (channel === 'REGISTER') {
|
||||
var channels = data.toString().split('\0');
|
||||
console.log('Server-side registered channels:',channels);
|
||||
// TODO: do something?
|
||||
// expect: [ 'FML|HS', 'FML', 'FML|MP', 'FML', 'FORGE' ]
|
||||
} else if (channel === 'FML|HS') {
|
||||
fmlHandshakeStep(client, data);
|
||||
mc.ping({host, port}, function(err, response) {
|
||||
if (err) throw err;
|
||||
console.log('ping response',response);
|
||||
if (!response.modinfo || response.modinfo.type !== 'FML') {
|
||||
throw new Error('not an FML server, aborting connection');
|
||||
// TODO: gracefully connect non-FML
|
||||
// TODO: could also use ping pre-connect to save description, type, negotiate protocol etc.
|
||||
}
|
||||
// Use the list of Forge mods from the server ping, so client will match server
|
||||
var forgeMods = response.modinfo.modList;
|
||||
console.log('Using forgeMods:',forgeMods);
|
||||
|
||||
var client = mc.createClient({
|
||||
forge: true,
|
||||
forgeMods: forgeMods,
|
||||
// Client/server mods installed on the client
|
||||
// if not specified, pings server and uses its list
|
||||
/*
|
||||
forgeMods:
|
||||
*/
|
||||
host: host,
|
||||
port: port,
|
||||
username: username,
|
||||
password: password
|
||||
});
|
||||
|
||||
client.on('connect', function() {
|
||||
console.info('connected');
|
||||
});
|
||||
client.on('disconnect', function(packet) {
|
||||
console.log('disconnected: '+ packet.reason);
|
||||
});
|
||||
client.on('end', function(err) {
|
||||
console.log('Connection lost');
|
||||
});
|
||||
client.on('chat', function(packet) {
|
||||
var jsonMsg = JSON.parse(packet.message);
|
||||
if(jsonMsg.translate == 'chat.type.announcement' || jsonMsg.translate == 'chat.type.text') {
|
||||
var username = jsonMsg.with[0].text;
|
||||
var msg = jsonMsg.with[1];
|
||||
if(username === client.username) return;
|
||||
client.write('chat', {message: msg});
|
||||
}
|
||||
});
|
||||
|
||||
client.on('custom_payload', function(packet) {
|
||||
var channel = packet.channel;
|
||||
var data = packet.data;
|
||||
|
||||
if (channel === 'REGISTER') {
|
||||
var channels = data.toString().split('\0');
|
||||
console.log('Server-side registered channels:',channels);
|
||||
// TODO: do something?
|
||||
// expect: [ 'FML|HS', 'FML', 'FML|MP', 'FML', 'FORGE' ]
|
||||
} else if (channel === 'FML|HS') {
|
||||
fmlHandshakeStep(client, data);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue