mirror of
https://github.com/gamedig/node-gamedig.git
synced 2024-11-03 13:01:04 +01:00
e23aa6cf9c
Added pretty much every game ever Tons of new protocols and game definitions Cleaned up and discovered some new tricks in gamespy3 and quake2
97 lines
2.6 KiB
JavaScript
97 lines
2.6 KiB
JavaScript
module.exports = require('./core').extend({
|
|
init: function() {
|
|
this._super();
|
|
this.pretty = 'Doom 3';
|
|
this.options.port = 27666;
|
|
this.encoding = 'latin1';
|
|
this.isEtqw = false;
|
|
this.hasSpaceBeforeClanTag = false;
|
|
this.hasClanTag = false;
|
|
this.hasTypeFlag = false;
|
|
},
|
|
run: function(state) {
|
|
var self = this;
|
|
|
|
this.udpSend('\xff\xffgetInfo\x00PiNGPoNG\x00',function(buffer) {
|
|
var reader = self.reader(buffer);
|
|
|
|
var header = reader.uint(2);
|
|
if(header != 0xffff) return;
|
|
var header2 = reader.string();
|
|
if(header2 != 'infoResponse') return;
|
|
|
|
var tailSize = 5;
|
|
if(self.isEtqw) {
|
|
var taskId = reader.uint(4);
|
|
}
|
|
|
|
var challenge = reader.uint(4);
|
|
var protoVersion = reader.uint(4);
|
|
state.raw.protocolVersion = (protoVersion>>16)+'.'+(protoVersion&0xffff);
|
|
|
|
if(self.isEtqw) {
|
|
var size = reader.uint(4);
|
|
}
|
|
|
|
while(!reader.done()) {
|
|
var key = reader.string();
|
|
var value = self.stripColors(reader.string());
|
|
if(key == 'si_map') {
|
|
value = value.replace('maps/','');
|
|
value = value.replace('.entities','');
|
|
}
|
|
if(!key) break;
|
|
state.raw[key] = value;
|
|
}
|
|
|
|
var i = 0;
|
|
while(!reader.done()) {
|
|
i++;
|
|
var player = {};
|
|
player.id = reader.uint(1);
|
|
if(player.id == 32) break;
|
|
player.ping = reader.uint(2);
|
|
if(!self.isEtqw) player.rate = reader.uint(4);
|
|
player.name = self.stripColors(reader.string());
|
|
if(self.hasClanTag) {
|
|
if(self.hasSpaceBeforeClanTag) reader.uint(1);
|
|
player.clantag = self.stripColors(reader.string());
|
|
}
|
|
if(self.hasTypeFlag) player.typeflag = reader.uint(1);
|
|
|
|
if(!player.ping || player.typeflag)
|
|
state.bots.push(player);
|
|
else
|
|
state.players.push(player);
|
|
}
|
|
|
|
state.raw.osmask = reader.uint(4);
|
|
if(self.isEtqw) {
|
|
state.raw.ranked = reader.uint(1);
|
|
state.raw.timeleft = reader.uint(4);
|
|
state.raw.gamestate = reader.uint(1);
|
|
state.raw.servertype = reader.uint(1);
|
|
// 0 = regular, 1 = tv
|
|
if(state.raw.servertype == 0) {
|
|
state.raw.interestedClients = reader.uint(1);
|
|
} else if(state.raw.servertype == 1) {
|
|
state.raw.connectedClients = reader.uint(4);
|
|
state.raw.maxClients = reader.uint(4);
|
|
}
|
|
}
|
|
|
|
if(state.raw.si_name) state.name = state.raw.si_name;
|
|
if(state.raw.si_map) state.map = state.raw.si_map;
|
|
if(state.raw.si_maxplayers) state.maxplayers = parseInt(state.raw.si_maxplayers);
|
|
if(state.raw.si_usepass == '1') state.password = true;
|
|
|
|
self.finish(state);
|
|
return true;
|
|
});
|
|
},
|
|
stripColors: function(str) {
|
|
// uses quake 3 color codes
|
|
return str.replace(/\^(X.{6}|.)/g,'');
|
|
}
|
|
});
|