Merge branch 'master' of https://github.com/parabola949/ingress-intel-total-conversion into parabola949-master
This commit is contained in:
commit
2ea55630b3
329
plugins/layer-farms-find.user.js
Normal file
329
plugins/layer-farms-find.user.js
Normal file
@ -0,0 +1,329 @@
|
||||
// ==UserScript==
|
||||
// @id iitc-plugin-farms@949
|
||||
// @name IITC plugin: Show farms by level
|
||||
// @category Info
|
||||
// @version 1.2.1.@@DATETIMEVERSION@@
|
||||
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
|
||||
// @updateURL @@UPDATEURL@@
|
||||
// @downloadURL @@DOWNLOADURL@@
|
||||
// @description [@@BUILDNAME@@-@@BUILDDATE@@] Find farms by minimum level
|
||||
// @include https://www.ingress.com/intel*
|
||||
// @include http://www.ingress.com/intel*
|
||||
// @match https://www.ingress.com/intel*
|
||||
// @match http://www.ingress.com/intel*
|
||||
// @grant none
|
||||
// ==/UserScript==
|
||||
|
||||
//CHANGELOG
|
||||
/*
|
||||
v1.2.1
|
||||
Fixed dropdown location overlap
|
||||
|
||||
v1.2.0
|
||||
Circle is sent to back on mouseover
|
||||
Clicking on circle displays portal counts for farm (including portals of level lower than farm)
|
||||
|
||||
v1.1.2
|
||||
Fixed the portal counts (shown in console)
|
||||
|
||||
v1.1.1
|
||||
Changed circle stroke weight and opacity, making it easier to see when zoomed out.
|
||||
|
||||
v1.1.0
|
||||
Changed radius function and center function -
|
||||
Center is now the midpoint of the max and min long and lat coords
|
||||
Radius is distance from center to furthest portal (i.e., now the circle will be limited to portals in the farm)
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
@@PLUGINSTART@@
|
||||
|
||||
|
||||
// use own namespace for plugin
|
||||
window.plugin.farmFind = function() {};
|
||||
|
||||
window.plugin.farmFind.getNearbyPortalCount = function(portal){
|
||||
|
||||
var circle = new google.maps.Circle();
|
||||
var center = new google.maps.LatLng(portal.getLatLng().lat, portal.getLatLng().lng);
|
||||
circle.setCenter(center);
|
||||
circle.setRadius(window.plugin.farmFind.Radius);
|
||||
|
||||
|
||||
var nearby8Portals = 0;
|
||||
|
||||
$.each(window.portals, function(i, otherPortal) {
|
||||
var thisPortal = new google.maps.LatLng(otherPortal.getLatLng().lat, otherPortal.getLatLng().lng);
|
||||
if (circle.getBounds().contains(thisPortal))
|
||||
if (getPortalLevel(otherPortal.options.details) >= window.plugin.farmFind.minLevel) nearby8Portals++;
|
||||
});
|
||||
//console.log(nearby8Portals);
|
||||
return nearby8Portals;
|
||||
};
|
||||
|
||||
window.plugin.farmFind.checkPortals = function(){
|
||||
possibleFarmPortals = [];
|
||||
window.plugin.farmFind.levelLayerGroup.clearLayers();
|
||||
//console.log(window.portals.length);
|
||||
$.each(window.portals, function(i, portal) {
|
||||
|
||||
if (window.plugin.farmFind.getNearbyPortalCount(portal) > window.plugin.farmFind.minNearby)
|
||||
{
|
||||
//console.log("Farm identified");
|
||||
possibleFarmPortals.push(portal);
|
||||
}
|
||||
});
|
||||
console.log("Farm Portals: " + possibleFarmPortals.length);
|
||||
var farms = [];
|
||||
for (i = 0; i< possibleFarmPortals.length;i++)
|
||||
{
|
||||
//console.log("Checking portal " + i);
|
||||
var thisPortal = possibleFarmPortals[i];
|
||||
var alreadyInFarm = false;
|
||||
for (x = 0; x< farms.length;x++)
|
||||
{
|
||||
//console.log(alreadyInFarm);
|
||||
if (thisPortal in farms[x]) alreadyInFarm = true;
|
||||
}
|
||||
|
||||
//console.log("Portal " + i + " already in farm: " + alreadyInFarm);
|
||||
|
||||
if (!alreadyInFarm)
|
||||
{
|
||||
var portalsInFarm = [];
|
||||
var circle = new google.maps.Circle();
|
||||
var center = new google.maps.LatLng(thisPortal.getLatLng().lat, thisPortal.getLatLng().lng);
|
||||
circle.setCenter(center);
|
||||
circle.setRadius(window.plugin.farmFind.Radius);
|
||||
portalsInFarm.push(thisPortal);
|
||||
for (p = 0; p< possibleFarmPortals.length;p++)
|
||||
{
|
||||
//console.log("Checking distance from portal " + p);
|
||||
var portalLoc = new google.maps.LatLng(possibleFarmPortals[p].getLatLng().lat, possibleFarmPortals[p].getLatLng().lng);
|
||||
|
||||
var farmIndex = 0;
|
||||
if (circle.getBounds().contains(portalLoc) && possibleFarmPortals[p] != thisPortal)
|
||||
{
|
||||
var alreadyInAnotherFarm = false;
|
||||
for (x = 0; x< farms.length;x++)
|
||||
{
|
||||
//console.log(alreadyInFarm);
|
||||
for (o = 0; o< farms[x].length; o++)
|
||||
{
|
||||
if (possibleFarmPortals[p] == farms[x][o])
|
||||
{
|
||||
//console.log("Portal " + p + " in farm " + (x+1) + " at index " + o);
|
||||
alreadyInAnotherFarm = true;
|
||||
farmIndex = x;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
//console.log("Already in another farm: " + alreadyInAnotherFarm);
|
||||
|
||||
if (alreadyInAnotherFarm == false)
|
||||
{
|
||||
//console.log("Farm " + (farms.length + 1) + " adding portal " + p);
|
||||
portalsInFarm.push(possibleFarmPortals[p]);
|
||||
}
|
||||
else
|
||||
{
|
||||
//hmmm... portal is in range, but portal is in another farm, so let's extend this farm
|
||||
for(prt = 0; prt < portalsInFarm.length; prt++)
|
||||
{
|
||||
farms[farmIndex].push(portalsInFarm[prt]);
|
||||
}
|
||||
|
||||
//console.log("Farm " + (farmIndex + 1) + " now has " + farms[farmIndex].length + " portals");
|
||||
p = 6000;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!alreadyInAnotherFarm)
|
||||
{
|
||||
farms.push(portalsInFarm);
|
||||
//console.log("Farm " + (farms.length) + ": " + portalsInFarm.length + " portals");
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
//console.log(farms.length);
|
||||
for (i = 0; i < farms.length; i++)
|
||||
{
|
||||
farms[i] = findUnique(farms[i]);
|
||||
console.log("Farm " + (i+1) + ": " + farms[i].length + " portals");
|
||||
|
||||
}
|
||||
//console.log(farms);
|
||||
|
||||
|
||||
|
||||
window.plugin.farmFind.drawnItems = new L.FeatureGroup();
|
||||
|
||||
|
||||
for (farm = 0; farm < farms.length; farm++)
|
||||
{
|
||||
window.plugin.farmFind.drawCircle(farms[farm]);
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
findUnique = function(farm) {
|
||||
var unique = [];
|
||||
for(p = 0; p < farm.length; p++)
|
||||
{
|
||||
//console.log(farm[p].options.guid);
|
||||
var found = false;
|
||||
for (u = 0; u < unique.length; u++)
|
||||
{
|
||||
//console.log(unique[u].options.guid);
|
||||
if (farm[p].options.guid == unique[u].options.guid)
|
||||
found = true;
|
||||
}
|
||||
if (!found)
|
||||
unique.push(farm[p]);
|
||||
}
|
||||
|
||||
return unique;
|
||||
}
|
||||
|
||||
window.plugin.farmFind.drawCircle = function(farm)
|
||||
{
|
||||
var latArray = [];
|
||||
var lngArray = [];
|
||||
var countArray = [];
|
||||
//console.log("Find Center");
|
||||
for (p = 0; p < farm.length; p++)
|
||||
{
|
||||
latArray.push(farm[p].getLatLng().lat);
|
||||
lngArray.push(farm[p].getLatLng().lng);
|
||||
var level = Math.floor(farm[p].options.level);
|
||||
if (countArray[level] == null)
|
||||
countArray[level] = 0;
|
||||
countArray[level]++;
|
||||
}
|
||||
|
||||
console.log(countArray);
|
||||
var popupMsg = "Portal Count<br>";
|
||||
for (i = 1; i < 9; i++)
|
||||
{
|
||||
if (countArray[i] != null)
|
||||
popupMsg += "Level " + i + ": " + countArray[i] + "<br>";
|
||||
}
|
||||
|
||||
var north = Math.max.apply(null, lngArray);
|
||||
var south = Math.min.apply(null, lngArray);
|
||||
var east = Math.max.apply(null, latArray);
|
||||
var west = Math.min.apply(null, latArray);
|
||||
|
||||
var center = new google.maps.LatLng(((east + west) / 2), ((north + south) / 2));
|
||||
//console.log(center);
|
||||
//console.log("Find Radius");
|
||||
var radius = 0;
|
||||
for (p = 0; p < farm.length; p++)
|
||||
{
|
||||
var temp = center.distanceFrom(farm[p].getLatLng());
|
||||
if (temp > radius)
|
||||
radius = temp;
|
||||
}
|
||||
|
||||
//console.log(radius);
|
||||
//((20 - map._zoom) * 1000) / map._zoom
|
||||
|
||||
var latlng = new L.LatLng(center.lat(), center.lng());
|
||||
//console.log("latlng: " + latlng);
|
||||
var optCircle = {color:'red',opacity:0.7,fill:true,fillColor:'red',fillOpacity:0.7,weight:15,clickable:true};
|
||||
var circle = new L.Circle(latlng, radius, optCircle);
|
||||
circle.bindPopup(popupMsg);
|
||||
|
||||
|
||||
circle.on('mouseover', function(e) {
|
||||
circle.bringToBack();
|
||||
});
|
||||
circle.on('click', function(e) {
|
||||
circle.bringToBack();
|
||||
});
|
||||
//console.log("circle: " + circle);
|
||||
circle.addTo(window.plugin.farmFind.levelLayerGroup);
|
||||
};
|
||||
|
||||
google.maps.LatLng.prototype.distanceFrom = function(newLatLng) {
|
||||
|
||||
// setup our variables
|
||||
var lat1 = this.lat();
|
||||
var radianLat1 = lat1 * ( Math.PI / 180 );
|
||||
|
||||
var lng1 = this.lng();
|
||||
var radianLng1 = lng1 * ( Math.PI / 180 );
|
||||
|
||||
var lat2 = newLatLng.lat;
|
||||
var radianLat2 = lat2 * ( Math.PI / 180 );
|
||||
|
||||
var lng2 = newLatLng.lng;
|
||||
var radianLng2 = lng2 * ( Math.PI / 180 );
|
||||
|
||||
// sort out the radius, MILES or KM?
|
||||
var earth_radius = 6378.1; // (km = 6378.1) OR (miles = 3959) - radius of the earth
|
||||
|
||||
// sort our the differences
|
||||
var diffLat = ( radianLat1 - radianLat2 );
|
||||
var diffLng = ( radianLng1 - radianLng2 );
|
||||
// put on a wave (hey the earth is round after all)
|
||||
var sinLat = Math.sin( diffLat / 2 );
|
||||
var sinLng = Math.sin( diffLng / 2 );
|
||||
|
||||
// maths - borrowed from http://www.opensourceconnections.com/wp-content/uploads/2009/02/clientsidehaversinecalculation.html
|
||||
var a = Math.pow(sinLat, 2.0) + Math.cos(radianLat1) * Math.cos(radianLat2) * Math.pow(sinLng, 2.0);
|
||||
|
||||
// work out the distance
|
||||
var distance = earth_radius * 2 * Math.asin(Math.min(1, Math.sqrt(a)));
|
||||
|
||||
// return the distance
|
||||
return distance * 1000;
|
||||
};
|
||||
|
||||
window.plugin.farmFind.setupCSS = function() {
|
||||
$("<style>").prop("type", "text/css").html(
|
||||
""
|
||||
+ "#farm_level_select {"
|
||||
+ " position: absolute;"
|
||||
+ " top: 5px;"
|
||||
+ " left:180px;"
|
||||
+ " z-index: 2500;"
|
||||
+ " font-size:11px;"
|
||||
+ ' font-family: "coda",arial,helvetica,sans-serif;'
|
||||
+ " background-color:#0E3C46;"
|
||||
+ " color:#ffce00;"
|
||||
+ "}\n").appendTo("head");
|
||||
};
|
||||
window.plugin.farmFind.changeLevel = function()
|
||||
{
|
||||
var myselect = document.getElementById("farm_level_select");
|
||||
var level = myselect.options[myselect.selectedIndex].value;
|
||||
window.plugin.farmFind.minLevel = level;
|
||||
var button = document.getElementById("findFarmClick");
|
||||
button.title = 'Check portals in view for L' + window.plugin.farmFind.minLevel + ' farms';
|
||||
button.innerHTML = 'L' + window.plugin.farmFind.minLevel + ' Farms';
|
||||
|
||||
};
|
||||
|
||||
var setup = function() {window.plugin.farmFind.minLevel = 7;
|
||||
window.plugin.farmFind.minNearby = 5;
|
||||
window.plugin.farmFind.setupCSS();
|
||||
window.plugin.farmFind.Radius = 500;
|
||||
$('#toolbox').append(' <a onclick="window.plugin.farmFind.checkPortals()" id="findFarmClick" title="Check portals in view for L' + window.plugin.farmFind.minLevel + ' farms">L' + window.plugin.farmFind.minLevel + ' Farms</a>');
|
||||
possibleFarmPortals = [];
|
||||
window.plugin.farmFind.levelLayerGroup = new L.LayerGroup();
|
||||
$('#dashboard').append('<select onchange="window.plugin.farmFind.changeLevel()" id="farm_level_select"><option value=1>Farm level 1</option><option value=2>Farm level 2</option><option value=3>Farm level 3</option><option value=4>Farm level 4</option><option value=5>Farm level 5</option><option value=6>Farm level 6</option><option value=7>Farm level 7</option><option value=8>Farm level 8</option></select>');
|
||||
var myselect = document.getElementById("farm_level_select");
|
||||
myselect.options.selectedIndex = 6;
|
||||
window.addLayerGroup('Farms', window.plugin.farmFind.levelLayerGroup, true);
|
||||
};
|
||||
|
||||
@@PLUGINEND@@
|
Loading…
x
Reference in New Issue
Block a user