From 836da0c6d466f077844e3b2f9b7551a3bfab7c89 Mon Sep 17 00:00:00 2001 From: HardiReady Date: Sun, 10 Feb 2019 15:22:57 +0100 Subject: [PATCH] Add log parsing for transport data into player object (CC-33) --- server/apib/data_structures/_player.apib | 3 ++- server/models/player.js | 20 ++++++++++++----- server/tools/log-parse-tool.js | 28 +++++++++++++++++++++--- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/server/apib/data_structures/_player.apib b/server/apib/data_structures/_player.apib index a7bf118..16949e3 100644 --- a/server/apib/data_structures/_player.apib +++ b/server/apib/data_structures/_player.apib @@ -14,6 +14,8 @@ Basic player statistic information object + respawn: 2 (number, required) - sum of respawns + flagTouch: 1 (number, required) - sum of flag captures + revive: 0 (number, required) - sum of revives ++ travelDistance: 16535 (number, optional) - sum of transport meters as passenger ++ driverDistance: 1250 (number, optional) - sum of transport meters as pilot/driver # WarPlayer (BasicPlayer) @@ -23,7 +25,6 @@ A player campaign statistics object + _id: `5ab68d42f547ed304064e5f7` (string, required) - unique id of the army member + warId: `5abf65ae3fc5fa349ffd5ca3` (string, required) - war in which this player took part + steamUUID: 76561192214911200 (number, optional) - unique ID for STEAM platform account -+ sort: 1 (number, required) - sorting number calculated by (kill + revive + flagTouch - friendlyFire - death - respawn) + performance: `5abf65ae3fc5fa349ffd5cs2` (string, optional) - id of corresponding performance log entry + timestamp: `2018-02-24T01:01:25.825Z` - the entity creation timestamp + updatedAt: `2018-02-24T01:01:25.825Z` - the version timestamp diff --git a/server/models/player.js b/server/models/player.js index da3f07d..d1c0109 100644 --- a/server/models/player.js +++ b/server/models/player.js @@ -72,11 +72,6 @@ const PlayerSchema = new Schema({ set: (v) => Math.round(v), required: true, }, - sort: { - type: Number, - get: (v) => Math.round(v), - set: (v) => Math.round(v), - }, steamUUID: { type: Number, get: (v) => Math.round(v), @@ -87,7 +82,20 @@ const PlayerSchema = new Schema({ ref: 'LogServerFpsSchema', required: false, }, -}, { + travelDistance: { + type: Number, + get: (v) => Math.round(v), + set: (v) => Math.round(v), + required: false, + }, + driverDistance: { + type: Number, + get: (v) => Math.round(v), + set: (v) => Math.round(v), + required: false, + }, +}, +{ collection: 'player', timestamps: {createdAt: 'timestamp'}, }); diff --git a/server/tools/log-parse-tool.js b/server/tools/log-parse-tool.js index d81210a..c28cf9d 100644 --- a/server/tools/log-parse-tool.js +++ b/server/tools/log-parse-tool.js @@ -354,9 +354,31 @@ const parseWarLog = (lineArray, war) => { stats.players[i]['flagTouch'] = stats.flag.filter((flag) => flag.player === playerName).length; - stats.players[i]['sort'] = stats.players[i]['kill'] + stats.players[i]['revive'] + - stats.players[i]['flagTouch'] - - stats.players[i]['friendlyFire'] - stats.players[i]['death'] - stats.players[i]['respawn']; + let playerTravelDistance = stats.transport.filter((transport) => transport.passenger === playerName) + .map((transport) => transport.distance) + .reduce((total, num) => total + Math.round(num), 0); + if (playerTravelDistance > 0) { + stats.players[i]['travelDistance'] = playerTravelDistance; + } + + let driverDistance = 0; + const driverTransports = stats.transport.filter((transport) => transport.driver === playerName); + for (let i = 0; i < driverTransports.length; i++) { + const curr = driverTransports[i]; + if (i < driverTransports.length - 1) { + const next = driverTransports[i + 1]; + if ((next.time.getTime() - curr.time.getTime()) < 2 * 60000) { // only track once in 2 min range + continue; + } + driverDistance += curr.distance; + } else { + driverDistance += curr.distance; + } + } + + if (driverDistance > 0) { + stats.players[i]['driverDistance'] = driverDistance; + } } stats.war.playersBlufor = stats.players.filter((player) => player.fraction === 'BLUFOR').length;