mirror of
https://github.com/gamedig/node-gamedig.git
synced 2024-11-17 17:25:19 +01:00
Improve player / bot separation in valve games
This commit is contained in:
parent
1b85fda837
commit
e2c734577a
2 changed files with 29 additions and 43 deletions
|
@ -86,7 +86,7 @@ contactjack|Contact J.A.C.K.|gamespy1|port_query=27888
|
||||||
cs16|Counter-Strike 1.6|valve
|
cs16|Counter-Strike 1.6|valve
|
||||||
cscz|Counter-Strike: Condition Zero|valve
|
cscz|Counter-Strike: Condition Zero|valve
|
||||||
css|Counter-Strike: Source|valve
|
css|Counter-Strike: Source|valve
|
||||||
csgo|Counter-Strike: Global Offensive|valve||isCsGo,doc_notes=csgo
|
csgo|Counter-Strike: Global Offensive|valve||doc_notes=csgo
|
||||||
|
|
||||||
crossracing|Cross Racing Championship|ase|port=12321,port_query_offset=123
|
crossracing|Cross Racing Championship|ase|port=12321,port_query_offset=123
|
||||||
|
|
||||||
|
|
|
@ -20,10 +20,6 @@ class Valve extends require('./core') {
|
||||||
// at all, use the old dedicated challenge query if needed
|
// at all, use the old dedicated challenge query if needed
|
||||||
this.legacyChallenge = false;
|
this.legacyChallenge = false;
|
||||||
|
|
||||||
// cs:go provides an annoying additional bot that looks exactly like a player,
|
|
||||||
// but is always named "Max Players"
|
|
||||||
this.isCsGo = false;
|
|
||||||
|
|
||||||
// 2006 engines don't pass packet switching size in split packet header
|
// 2006 engines don't pass packet switching size in split packet header
|
||||||
// while all others do, this need is detected automatically
|
// while all others do, this need is detected automatically
|
||||||
this._skipSizeInSplitHeader = false;
|
this._skipSizeInSplitHeader = false;
|
||||||
|
@ -143,6 +139,7 @@ class Valve extends require('./core') {
|
||||||
}
|
}
|
||||||
|
|
||||||
queryPlayers(state,c) {
|
queryPlayers(state,c) {
|
||||||
|
state.raw.players = [];
|
||||||
this.sendPacket(0x55,true,false,0x44,(b) => {
|
this.sendPacket(0x55,true,false,0x44,(b) => {
|
||||||
const reader = this.reader(b);
|
const reader = this.reader(b);
|
||||||
const num = reader.uint(1);
|
const num = reader.uint(1);
|
||||||
|
@ -157,46 +154,19 @@ class Valve extends require('./core') {
|
||||||
// connecting players don't count as players.
|
// connecting players don't count as players.
|
||||||
if(!name) continue;
|
if(!name) continue;
|
||||||
|
|
||||||
(time === -1 ? state.bots : state.players).push({
|
// CSGO sometimes adds a bot named 'Max Players' if host_players_show is not 2
|
||||||
|
if (state.raw.steamappid === 730 && name === 'Max Players') continue;
|
||||||
|
|
||||||
|
state.raw.players.push({
|
||||||
name:name, score:score, time:time
|
name:name, score:score, time:time
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(this.isCsGo && state.players.length === 1 && state.players[0].name === 'Max Players') {
|
|
||||||
if(this.debug) console.log("CSGO server using limited player details");
|
|
||||||
state.players = [];
|
|
||||||
for(let i = 0; i < state.raw.numplayers; i++) {
|
|
||||||
state.players.push({});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we didn't find the bots, iterate
|
|
||||||
// through and guess which ones they are
|
|
||||||
if(!state.bots.length && state.raw.numbots) {
|
|
||||||
let maxTime = 0;
|
|
||||||
for (const player of state.players) {
|
|
||||||
maxTime = Math.max(player.time,maxTime);
|
|
||||||
}
|
|
||||||
for(let i = 0; i < state.players.length; i++) {
|
|
||||||
const player = state.players[i];
|
|
||||||
if(state.bots.length >= state.raw.numbots) continue;
|
|
||||||
if(player.time !== maxTime) continue;
|
|
||||||
state.bots.push(player);
|
|
||||||
state.players.splice(i, 1);
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
c();
|
c();
|
||||||
}, () => {
|
}, () => {
|
||||||
// no players were returned after timeout --
|
// CSGO doesn't even respond sometimes if host_players_show is not 2
|
||||||
// csgo seems to do this sometimes if host_players_show is not 2
|
// Ignore timeouts in only this case
|
||||||
if (this.isCsGo) {
|
if (state.raw.steamappid === 730) {
|
||||||
if(this.debug) console.log("CSGO server didn't respond with player list");
|
|
||||||
state.players = [];
|
|
||||||
for(let i = 0; i < state.raw.numplayers; i++) {
|
|
||||||
state.players.push({});
|
|
||||||
}
|
|
||||||
c();
|
c();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -230,10 +200,6 @@ class Valve extends require('./core') {
|
||||||
delete state.raw.rules.bat_name_s;
|
delete state.raw.rules.bat_name_s;
|
||||||
if ('bat_player_count_s' in state.raw.rules) {
|
if ('bat_player_count_s' in state.raw.rules) {
|
||||||
state.raw.numplayers = parseInt(state.raw.rules.bat_player_count_s);
|
state.raw.numplayers = parseInt(state.raw.rules.bat_player_count_s);
|
||||||
state.players = [];
|
|
||||||
for(let i = 0; i < state.raw.numplayers; i++) {
|
|
||||||
state.players.push({});
|
|
||||||
}
|
|
||||||
delete state.raw.rules.bat_player_count_s;
|
delete state.raw.rules.bat_player_count_s;
|
||||||
}
|
}
|
||||||
if ('bat_max_players_i' in state.raw.rules) {
|
if ('bat_max_players_i' in state.raw.rules) {
|
||||||
|
@ -248,6 +214,26 @@ class Valve extends require('./core') {
|
||||||
delete state.raw.rules.bat_map_s;
|
delete state.raw.rules.bat_map_s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Organize players / hidden players into player / bot arrays
|
||||||
|
const botProbability = (p) => {
|
||||||
|
if (p.time === -1) return Number.MAX_VALUE;
|
||||||
|
return p.time;
|
||||||
|
};
|
||||||
|
const sortedPlayers = state.raw.players.sort((a,b) => {
|
||||||
|
return botProbability(a) - botProbability(b);
|
||||||
|
});
|
||||||
|
delete state.raw.players;
|
||||||
|
const numBots = state.raw.numbots;
|
||||||
|
const numPlayers = state.raw.numplayers - numBots;
|
||||||
|
while(state.bots.length < numBots) {
|
||||||
|
if (sortedPlayers.length) state.bots.push(sortedPlayers.pop());
|
||||||
|
else state.bots.push({});
|
||||||
|
}
|
||||||
|
while(state.players.length < numPlayers || sortedPlayers.length) {
|
||||||
|
if (sortedPlayers.length) state.players.push(sortedPlayers.pop());
|
||||||
|
else state.players.push({});
|
||||||
|
}
|
||||||
|
|
||||||
c();
|
c();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue