From c70b7ac1ca250f031664a68b54f8c6862cfdbe68 Mon Sep 17 00:00:00 2001 From: fkloft Date: Thu, 5 Dec 2013 19:03:55 +0100 Subject: [PATCH 1/3] Fix guess-player-levels (Under certain circumstances, flipped portals weren't detected correctly. Also, guessing has improved: Resonators not deployed by the owner can safely be used for level guessing) --- plugins/guess-player-levels.user.js | 52 ++++++++++++++++++----------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/plugins/guess-player-levels.user.js b/plugins/guess-player-levels.user.js index 920a2295..78089cba 100644 --- a/plugins/guess-player-levels.user.js +++ b/plugins/guess-player-levels.user.js @@ -119,33 +119,47 @@ window.plugin.guessPlayerLevels.extractPortalData = function(data) { var r = data.details.resonatorArray.resonators; - //due to the Jarvis Virus/ADA Refactor it's possible for a player to own resonators on a portal - //at a higher level than the player themselves. It is not possible to detect for sure when this - //has happened, but in many cases it will result in an impossible deployment arrangement - //(over 1 L8/7 res, over 2 L6/5 res, etc). if we detect this case, ignore all resonators owned - //by that player on the portal + /* Due to the Jarvis Virus/ADA Refactor it's possible for a player to own resonators on a portal at a higher level + than the player themselves. It is not possible to detect for sure when this has happened, but in many cases it will + result in an impossible deployment arrangement (more than 1 L8/7 res, more than 2 L6/5 res, etc). If we detect this + case, we ignore all resonators owned by that player on the portal + Hint: This can only happen to the owner of the portal, so resonators by other players can be used to determine + their minimal level */ -// TODO? go further, and just ignore all resonators owned by the portal owner? -// or; have a 'guessed' level and a 'certain' level. 'certain' comes from res from non-owner, and COMM deploy -// while 'guessed' comes from resonators of the portal owner + var owner = data.details.captured && data.details.captured.capturingPlayerId || ""; - var perPlayerResMaxLevel = {}; - var perPlayerResMaxLevelCount = {}; + var players = {}; $.each(r, function(ind, reso) { if(!reso) return true; - if(!perPlayerResMaxLevel[reso.ownerGuid] || reso.level > perPlayerResMaxLevel[reso.ownerGuid]) { - perPlayerResMaxLevel[reso.ownerGuid] = reso.level; - perPlayerResMaxLevelCount[reso.ownerGuid] = 0; - } - if (reso.level == perPlayerResMaxLevel[reso.ownerGuid]) perPlayerResMaxLevelCount[reso.ownerGuid]++; + if(!players[reso.ownerGuid]) players[reso.ownerGuid] = []; + + if(players[reso.ownerGuid][reso.level] === undefined) + players[reso.ownerGuid][reso.level] = 1 + else + players[reso.ownerGuid][reso.level]++; }); - $.each(perPlayerResMaxLevel, function(guid, level) { - if (perPlayerResMaxLevelCount[guid] <= window.MAX_RESO_PER_PLAYER[level]) { - window.plugin.guessPlayerLevels.savePlayerLevel(guid, level); - } + for(nickname in players) { + var ignore = false; + var minLevel = 0; + + players[nickname].forEach(function(count, level) { + if(MAX_RESO_PER_PLAYER[level] < count) { + ignore = true; + + if(count > 0) + minLevel = level; + }); + + if(ignore) + return; + + if(nickname == owner) + window.plugin.guessPlayerLevels.savePlayerLevel(nickname, minLevel); + else // not deployed by owner - player must be at least that level + window.plugin.guessPlayerLevels.savePlayerLevel(nickname, minLevel, true); }); } From 82705a14fcdf557813f98c7e4dd957c8cc3ec8d4 Mon Sep 17 00:00:00 2001 From: fkloft Date: Thu, 5 Dec 2013 19:13:38 +0100 Subject: [PATCH 2/3] bump version --- plugins/guess-player-levels.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/guess-player-levels.user.js b/plugins/guess-player-levels.user.js index 78089cba..570415cf 100644 --- a/plugins/guess-player-levels.user.js +++ b/plugins/guess-player-levels.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-guess-player-levels@breunigs // @name IITC plugin: guess player level // @category Info -// @version 0.5.0.@@DATETIMEVERSION@@ +// @version 0.5.1.@@DATETIMEVERSION@@ // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL @@UPDATEURL@@ // @downloadURL @@DOWNLOADURL@@ From 74518673244dd4d5c8f33ad324d8c87e6852a450 Mon Sep 17 00:00:00 2001 From: fkloft Date: Thu, 5 Dec 2013 23:06:26 +0100 Subject: [PATCH 3/3] Count mods by capturing player; more than two --> portal was flipped --- plugins/guess-player-levels.user.js | 60 +++++++++++++++++------------ 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/plugins/guess-player-levels.user.js b/plugins/guess-player-levels.user.js index 570415cf..4e24bbc0 100644 --- a/plugins/guess-player-levels.user.js +++ b/plugins/guess-player-levels.user.js @@ -127,6 +127,11 @@ window.plugin.guessPlayerLevels.extractPortalData = function(data) { their minimal level */ var owner = data.details.captured && data.details.captured.capturingPlayerId || ""; + var ownerModCount = 0; + data.details.portalV2.linkedModArray.forEach(function(mod) { + if(mod && mod.installingUser == owner) + ownerModCount++; + }); var players = {}; @@ -145,8 +150,16 @@ window.plugin.guessPlayerLevels.extractPortalData = function(data) { var ignore = false; var minLevel = 0; + if(nickname == owner) { + if(ownerModCount > 2) // more than 2 mods by capturing player --> portal was flipped, ignore their resonators + continue; + var certain = false; + } else { // not deployed by owner - player must be at least that level + var certain = true; + } + players[nickname].forEach(function(count, level) { - if(MAX_RESO_PER_PLAYER[level] < count) { + if(MAX_RESO_PER_PLAYER[level] < count) ignore = true; if(count > 0) @@ -154,35 +167,32 @@ window.plugin.guessPlayerLevels.extractPortalData = function(data) { }); if(ignore) - return; + continue; - if(nickname == owner) - window.plugin.guessPlayerLevels.savePlayerLevel(nickname, minLevel); - else // not deployed by owner - player must be at least that level - window.plugin.guessPlayerLevels.savePlayerLevel(nickname, minLevel, true); - }); + window.plugin.guessPlayerLevels.savePlayerLevel(nickname, minLevel, certain); + } } window.plugin.guessPlayerLevels.extractChatData = function(data) { - data.raw.result.forEach(function(msg) { - var plext = msg[2].plext; - if(plext.plextType == 'SYSTEM_BROADCAST' - && plext.markup.length==5 - && plext.markup[0][0] == 'PLAYER' - && plext.markup[1][0] == 'TEXT' - && plext.markup[1][1].plain == ' deployed an ' - && plext.markup[2][0] == 'TEXT' - && plext.markup[2][0] == 'TEXT' - && plext.markup[3][0] == 'TEXT' - && plext.markup[3][1].plain == ' Resonator on ') { - var nick = plext.markup[0][1].plain; - var lvl = parseInt(plext.markup[2][1].plain.substr(1)); - window.plugin.guessPlayerLevels.savePlayerLevel(nick, lvl, true); - } - }); + data.raw.result.forEach(function(msg) { + var plext = msg[2].plext; + if(plext.plextType == 'SYSTEM_BROADCAST' + && plext.markup.length==5 + && plext.markup[0][0] == 'PLAYER' + && plext.markup[1][0] == 'TEXT' + && plext.markup[1][1].plain == ' deployed an ' + && plext.markup[2][0] == 'TEXT' + && plext.markup[2][0] == 'TEXT' + && plext.markup[3][0] == 'TEXT' + && plext.markup[3][1].plain == ' Resonator on ') { + var nick = plext.markup[0][1].plain; + var lvl = parseInt(plext.markup[2][1].plain.substr(1)); + window.plugin.guessPlayerLevels.savePlayerLevel(nick, lvl, true); + } + }); }; -window.plugin.guessPlayerLevels.savePlayerLevel = function(nick, level, safe) { +window.plugin.guessPlayerLevels.savePlayerLevel = function(nick, level, certain) { var cache = window.plugin.guessPlayerLevels._loadLevels(); var details = cache['#' + nick]; @@ -191,7 +201,7 @@ window.plugin.guessPlayerLevels.savePlayerLevel = function(nick, level, safe) { if(typeof details === 'number') details = {min: 1, guessed: details}; - if(safe) { + if(certain) { if(details.min >= level) return;