diff --git a/server/routes/players.js b/server/routes/players.js
index 3ec0610..fd2bd23 100644
--- a/server/routes/players.js
+++ b/server/routes/players.js
@@ -26,92 +26,100 @@ campaignPlayer.route('/ranking/:campaignId')
const warIds = wars.map((obj) => {
return obj._id;
});
- PlayerModel.find({warId: {'$in': warIds}}, (err, items) => {
- if (err) return next(err);
- if (!items || items.length === 0) {
- const err = new Error('No players for given campaignId');
- err.status = codes.notfound;
- return next(err);
- }
-
- const rankingItems = [];
-
- // check only first player to have valid steamUUID - then decide if tracked by name or by ID
- const usesUUID = isSteamUUID(items[0].steamUUID);
-
- new Set(items.map(usesUUID ? (x) => x.steamUUID : (x) => x.name))
- .forEach((player) => {
- const playerInstances = items.filter(
- usesUUID ? (p) => p.steamUUID === player : (p) => p.name === player);
- const resItem = {
- name: usesUUID ? playerInstances[playerInstances.length - 1].name : player,
- kill: 0,
- vehicleLight: 0,
- vehicleHeavy: 0,
- vehicleAir: 0,
- death: 0,
- friendlyFire: 0,
- revive: 0,
- respawn: 0,
- flagTouch: 0,
- travelDistance: 0,
- driverDistance: 0,
- };
- for (let i = 0; i < playerInstances.length; i++) {
- const player = playerInstances[i];
- resItem.kill += player.kill;
- resItem.death += player.death;
- resItem.friendlyFire += player.friendlyFire;
- resItem.vehicleLight += player.vehicleLight;
- resItem.vehicleHeavy += player.vehicleHeavy;
- resItem.vehicleAir += player.vehicleAir;
- resItem.revive += player.revive;
- resItem.respawn += player.respawn;
- resItem.flagTouch += player.flagTouch;
- if (player.travelDistance) {
- resItem.travelDistance += Math.round(player.travelDistance / 1000); // meters -> km
- }
- if (player.driverDistance) {
- resItem.driverDistance += Math.round(player.driverDistance / 1000); // meters -> km
- }
- }
- resItem.warCount = playerInstances.length;
- resItem.fraction = playerInstances[playerInstances.length - 1].fraction;
- rankingItems.push(resItem);
- });
-
- const getSortedField = (fieldName) => {
- let num = 1;
- const filteredSortResult = rankingItems.map((item) => {
- return {
- name: item.name,
- fraction: item.fraction,
- [fieldName]: item[fieldName],
- };
- })
- .sort((a, b) => b[fieldName] - a[fieldName]);
- const res = JSON.parse(JSON.stringify(filteredSortResult));
- for (const entity of res) {
- entity.num = num++;
+ WarModel.findOne({campaign: req.params.campaignId}, {}, {sort: {'date': -1}}, (err, latestWar) => {
+ PlayerModel.find({warId: {'$in': warIds}}, (err, items) => {
+ if (err) return next(err);
+ if (!items || items.length === 0) {
+ const err = new Error('No players for given campaignId');
+ err.status = codes.notfound;
+ return next(err);
}
- return res;
- };
- res.locals.items = {
- kill: getSortedField('kill'),
- death: getSortedField('death'),
- friendlyFire: getSortedField('friendlyFire'),
- vehicleLight: getSortedField('vehicleLight'),
- vehicleHeavy: getSortedField('vehicleHeavy'),
- vehicleAir: getSortedField('vehicleAir'),
- revive: getSortedField('revive'),
- respawn: getSortedField('respawn'),
- flagTouch: getSortedField('flagTouch'),
- travelDistance: getSortedField('travelDistance'),
- driverDistance: getSortedField('driverDistance'),
- warCount: getSortedField('warCount'),
- };
- next();
+ const rankingItems = [];
+
+ // check only first player to have valid steamUUID - then decide if tracked by name or by ID
+ const usesUUID = isSteamUUID(items[0].steamUUID);
+
+ new Set(items.map(usesUUID ? (x) => x.steamUUID : (x) => x.name))
+ .forEach((player) => {
+ const playerInstances = items.filter(
+ usesUUID ? (p) => p.steamUUID === player : (p) => p.name === player);
+ const resItem = {
+ name: usesUUID ? playerInstances[playerInstances.length - 1].name : player,
+ kill: 0,
+ vehicleLight: 0,
+ vehicleHeavy: 0,
+ vehicleAir: 0,
+ death: 0,
+ friendlyFire: 0,
+ revive: 0,
+ respawn: 0,
+ flagTouch: 0,
+ travelDistance: 0,
+ driverDistance: 0,
+ };
+ for (let i = 0; i < playerInstances.length; i++) {
+ const player = playerInstances[i];
+ resItem.kill += player.kill;
+ resItem.death += player.death;
+ resItem.friendlyFire += player.friendlyFire;
+ resItem.vehicleLight += player.vehicleLight;
+ resItem.vehicleHeavy += player.vehicleHeavy;
+ resItem.vehicleAir += player.vehicleAir;
+ resItem.revive += player.revive;
+ resItem.respawn += player.respawn;
+ resItem.flagTouch += player.flagTouch;
+ if (player.travelDistance) {
+ resItem.travelDistance += Math.round(player.travelDistance / 1000); // meters -> km
+ }
+ if (player.driverDistance) {
+ resItem.driverDistance += Math.round(player.driverDistance / 1000); // meters -> km
+ }
+ }
+ resItem.warCount = playerInstances.length;
+
+ const latestPlayerFraction = playerInstances[playerInstances.length - 1].fraction;
+ resItem.fraction =
+ (latestPlayerFraction === 'OPFOR') ?
+ latestWar.fractionMappingOpfor :
+ latestWar.fractionMappingBlufor;
+
+ rankingItems.push(resItem);
+ });
+
+ const getSortedField = (fieldName) => {
+ let num = 1;
+ const filteredSortResult = rankingItems.map((item) => {
+ return {
+ name: item.name,
+ fraction: item.fraction,
+ [fieldName]: item[fieldName],
+ };
+ })
+ .sort((a, b) => b[fieldName] - a[fieldName]);
+ const res = JSON.parse(JSON.stringify(filteredSortResult));
+ for (const entity of res) {
+ entity.num = num++;
+ }
+ return res;
+ };
+
+ res.locals.items = {
+ kill: getSortedField('kill'),
+ death: getSortedField('death'),
+ friendlyFire: getSortedField('friendlyFire'),
+ vehicleLight: getSortedField('vehicleLight'),
+ vehicleHeavy: getSortedField('vehicleHeavy'),
+ vehicleAir: getSortedField('vehicleAir'),
+ revive: getSortedField('revive'),
+ respawn: getSortedField('respawn'),
+ flagTouch: getSortedField('flagTouch'),
+ travelDistance: getSortedField('travelDistance'),
+ driverDistance: getSortedField('driverDistance'),
+ warCount: getSortedField('warCount'),
+ };
+ next();
+ });
});
});
})
diff --git a/static/src/app/statistic/campaign/highscore/highscore.component.html b/static/src/app/statistic/campaign/highscore/highscore.component.html
index 6992cc8..05aae0e 100644
--- a/static/src/app/statistic/campaign/highscore/highscore.component.html
+++ b/static/src/app/statistic/campaign/highscore/highscore.component.html
@@ -28,7 +28,7 @@
{{'stats.highscore.header.name' | translate}}
+ [style.color]="fractionHelpers.getFractionColor(element['fraction'])">
{{element.name}}