// ==UserScript== // @author Zaso // @name Player Ranges // @category Layer // @version 0.3.1.20210103.154230 // @description Add one or more player markers and his ranges (hack/deploy range and xmp ranges) on the map. // @id player-ranges@Zaso // @namespace https://github.com/IITC-CE/ingress-intel-total-conversion // @downloadURL https://raw.githubusercontent.com/IITC-CE/Community-plugins/master/dist/Zaso/player-ranges.user.js // @updateURL https://raw.githubusercontent.com/IITC-CE/Community-plugins/master/dist/Zaso/player-ranges.meta.js // @match https://intel.ingress.com/* // @grant none // ==/UserScript== function wrapper(plugin_info) { // ensure plugin framework is there, even if iitc is not yet loaded if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'ZasoItems'; plugin_info.dateTimeVersion = '2021-01-03-154230'; plugin_info.pluginId = 'player-ranges'; //END PLUGIN AUTHORS NOTE // PLUGIN START //////////////////////////////////////////////////////// // History // 0.3.1 Headers changed. Ready for IITC-CE // 0.3.0 Original sript // use own namespace for plugin window.plugin.playerRanges = function(){}; window.plugin.playerRanges.storage = {}; window.plugin.playerRanges.obj = {}; window.plugin.playerRanges.data = {}; window.plugin.playerRanges.ui = {}; window.plugin.playerRanges.getHtml = {}; window.plugin.playerRanges.layer = {}; window.plugin.playerRanges.action = {}; window.plugin.playerRanges.control = {}; window.plugin.playerRanges.mpe = {}; window.plugin.playerRanges.override = {}; window.plugin.playerRanges.userLocation = {}; window.plugin.playerRanges.dialog = {}; window.plugin.playerRanges.hook = {}; // window.plugin.playerRanges.obj.rangeVal = [window.HACK_RANGE, 42, 48, 58, 72, 90, 112, 138, 168]; window.plugin.playerRanges.obj.rangeVal = [40, 42, 48, 58, 72, 90, 112, 138, 168]; window.plugin.playerRanges.obj.rangeRecharge = [0, 250, 500, 750, 1000, 1250, 1500, 1750, 2000, 2250, 2500, 2750, 3000, 3250, 3500, 3750, 4000]; window.plugin.playerRanges.obj.rangeName = ['hack', 'L1', 'L2', 'L3', 'L4', 'L5', 'L6', 'L7', 'L8', 'mark', 'recharge', 'jolly']; window.plugin.playerRanges.obj.settings = {dashArr:[7,7], weight:1.5, opacity:0.7 } window.plugin.playerRanges.obj.main = {opt:{hack:1,L1:1,L2:1,L3:1,L4:1,L5:1,L6:1,L7:1,L8:1,recharge:0,label:1,jolly:0}, markers:{}}; window.plugin.playerRanges.obj.layerGroup = {}; window.plugin.playerRanges.obj.playersLayers = {}; window.plugin.playerRanges.obj.rangesLayers = {}; //====================================================================== // STORAGE FUNCTIONS //====================================================================== window.plugin.playerRanges.storage.NAME = 'plugin-playerRanges'; window.plugin.playerRanges.storage.save = function(){ window.localStorage[window.plugin.playerRanges.storage.NAME] = JSON.stringify(window.plugin.playerRanges.obj.main); } window.plugin.playerRanges.storage.load = function(){ window.plugin.playerRanges.obj.main = JSON.parse(window.localStorage[window.plugin.playerRanges.storage.NAME]); } window.plugin.playerRanges.storage.get = function(){ return window.localStorage[window.plugin.playerRanges.storage.NAME]; } window.plugin.playerRanges.storage.reset = function(){ window.plugin.playerRanges.obj.main = {opt:{hack:1,L1:1,L2:1,L3:1,L4:1,L5:1,L6:1,L7:1,L8:1,recharge:0,label:1,jolly:0}, markers:{}}; window.plugin.playerRanges.storage.save(); } window.plugin.playerRanges.storage.check = function(){ if(!window.localStorage[window.plugin.playerRanges.storage.NAME]){ window.plugin.playerRanges.storage.reset(); } window.plugin.playerRanges.storage.load(); if(window.plugin.playerRanges.obj.main.opt === undefined){ window.plugin.playerRanges.storage.isOldVersion(); } if(window.plugin.playerRanges.obj.main.opt.recharge === undefined){ window.plugin.playerRanges.obj.main.opt.recharge = 0; window.plugin.playerRanges.storage.save(); } } window.plugin.playerRanges.storage.isOldVersion = function(){ window.plugin.playerRanges.storage.reset(); } //====================================================================== // DATA //====================================================================== window.plugin.playerRanges.data.generateID = function(){ return 'uuid-'+((new Date).getTime().toString(16)+Math.floor(1E7*Math.random()).toString(16)); } window.plugin.playerRanges.data.getMyFaction = function(){ return window.PLAYER.team; } window.plugin.playerRanges.data.validateName = function(name){ var name = name.toString(); var pattern = new RegExp(/^[a-zA-Z0-9_\-\ \(\)\[\]]/); for(i=0; i= 0 && level <= 16){ player.level = Number(level); }else{ player.level = 0; } } window.plugin.playerRanges.data.getPlayerLevel = function(idPlayer){ var player = window.plugin.playerRanges.data.getPlayer(idPlayer); return (player)? player.level : false; } window.plugin.playerRanges.data.setPlayerJolly = function(idPlayer, jolly = 0){ var player = window.plugin.playerRanges.data.getPlayer(idPlayer); player.jolly = (jolly >= 0)? Number(jolly) : 0; } window.plugin.playerRanges.data.getPlayerJolly = function(idPlayer){ var player = window.plugin.playerRanges.data.getPlayer(idPlayer); return (player)? player.jolly : false; } window.plugin.playerRanges.data.getRangeNameByIndex = function(rangeIndex){ if(rangeIndex == 10){ return 'recharge'; } else if(rangeIndex == 11){ return 'jolly'; } else if(rangeIndex == 12){ return 'label'; } var rangeName = window.plugin.playerRanges.obj.rangeName[rangeIndex]; return (rangeName)? rangeName : false; } window.plugin.playerRanges.data.getRangeIndexByName = function(rangeName){ if(rangeIndex == 'recharge'){ return 10; } else if(rangeIndex == 'jolly'){ return 11; } else if(rangeIndex == 'label'){ return 12; } var rangeIndex = window.plugin.playerRanges.obj.rangeName.indexOf(rangeName); return (rangeIndex > -1)? rangeIndex : false; } window.plugin.playerRanges.data.getRangeValByIndex = function(rangeIndex){ var rangeVal = window.plugin.playerRanges.obj.rangeVal[rangeIndex]; return (rangeVal)? rangeVal : false; } window.plugin.playerRanges.data.getRangeValByName = function(rangeName){ var rangeIndex = window.plugin.playerRanges.data.getRangeIndexByName(rangeName); var rangeVal = window.plugin.playerRanges.obj.rangeVal[rangeIndex]; return (rangeVal)? rangeVal : false; } window.plugin.playerRanges.data.getRangeRecharge = function(playerLevel){ if(playerLevel == 0) return 0; if(playerLevel >= 1 && playerLevel <= 16){ return window.plugin.playerRanges.obj.rangeRecharge[playerLevel]; // return 250*1000*playerLevel; } return false; } window.plugin.playerRanges.data.getMyRangeRecharge = function(){ var playerLevel = parseInt(window.PLAYER.verified_level); return window.plugin.playerRanges.data.getRangeRecharge(playerLevel); } window.plugin.playerRanges.data.setRangeStatus = function(rangeName, status){ var ranges = window.plugin.playerRanges.data.getRangeStatusByName(rangeName); var range = ranges[rangeName]; if(status === undefined){ var currRangeStatus = window.plugin.playerRanges.data.getRangeStatusByName(rangeName); resp = (currRangeStatus === true)? 0 : 1; }else{ resp = (status === false)? 0 : 1; } window.plugin.playerRanges.obj.main.opt[rangeName] = resp; return resp; } window.plugin.playerRanges.data.getRangesStatus = function(){ return window.plugin.playerRanges.obj.main.opt; } window.plugin.playerRanges.data.getRangeStatusByIndex = function(rangeIndex){ var rangeName = window.plugin.playerRanges.data.getRangeNameByIndex(rangeIndex); var isEnabled = window.plugin.playerRanges.data.getRangeStatusByName(rangeName); return isEnabled; } window.plugin.playerRanges.data.getRangeStatusByName = function(rangeName){ var rangesStatus = window.plugin.playerRanges.data.getRangesStatus(); var rangeStatus = rangesStatus[rangeName]; var isEnabled = (rangeStatus == 1)? true : false; return isEnabled; } window.plugin.playerRanges.data.getInvertRangeStatus = function(rangeName){ var currRangeStatus = window.plugin.playerRanges.data.getRangeStatusByName(rangeName); return !currRangeStatus; } window.plugin.playerRanges.data.setPlayerCoord = function(idPlayer, latlng){ try{ var player = window.plugin.playerRanges.data.getPlayer(idPlayer); player.ll = latlng; return true; }catch(e){ return false; } } window.plugin.playerRanges.data.getPlayerCoord = function(idPlayer){ var player = window.plugin.playerRanges.data.getPlayer(idPlayer); return player.ll; } window.plugin.playerRanges.data.addPlayer = function(idPlayer, latlng, label = '', level = undefined, jolly = undefined){ var obj = { ll: latlng, label: (label === undefined)? '' : label }; if(level !== undefined && $.isNumeric(level) && level >= 0 && level <= 16){ obj.level = Number(level); }else{ obj.level = 0; } if(jolly !== undefined && $.isNumeric(jolly) && jolly > -1){ obj.jolly = Number(jolly); } window.plugin.playerRanges.obj.main.markers[idPlayer] = obj; } window.plugin.playerRanges.data.deletePlayer = function(idPlayer){ delete window.plugin.playerRanges.obj.main.markers[idPlayer]; } //====================================================================== // LAYERS //====================================================================== window.plugin.playerRanges.layer.boot = function(){ // Create the main layer window.plugin.playerRanges.obj.layerGroup = new L.LayerGroup(); window.plugin.playerRanges.obj.rangesLayers = {}; for(var index in window.plugin.playerRanges.obj.rangeName){ var rangeName = window.plugin.playerRanges.data.getRangeNameByIndex(index); var rangeStatus = window.plugin.playerRanges.data.getRangeStatusByName(rangeName); window.plugin.playerRanges.obj.rangesLayers[rangeName] = new L.LayerGroup(); } // Append the main layer to the map window.addLayerGroup('Player Ranges', window.plugin.playerRanges.obj.layerGroup, true); window.plugin.playerRanges.layer.restoreRangesLayersVisibility(); } window.plugin.playerRanges.layer.salvaDaParteIlLayer = function(idPlayer, rangeName, layer){ window.plugin.playerRanges.obj.playersLayers[idPlayer][rangeName] = layer; window.plugin.playerRanges.obj.rangesLayers[rangeName].addLayer(layer); return layer; } window.plugin.playerRanges.layer.getPlayerLayers = function(idPlayer){ return window.plugin.playerRanges.obj.playersLayers[idPlayer]; } window.plugin.playerRanges.layer.getPlayerLayer = function(idPlayer, rangeName){ if(idPlayer === undefined){ return window.plugin.playerRanges.obj.rangesLayers[rangeName]; }else{ return window.plugin.playerRanges.obj.rangesLayers[rangeName][idPlayer]; } } window.plugin.playerRanges.layer.drawPlayer = function(idPlayer){ window.plugin.playerRanges.obj.playersLayers[idPlayer] = {}; window.plugin.playerRanges.layer.drawMarkerPlayer(idPlayer); window.plugin.playerRanges.layer.drawAllRangesPlayer(idPlayer); window.plugin.playerRanges.ui.appendPlayerToDialogList(idPlayer); } window.plugin.playerRanges.layer.removePlayerLayers = function(idPlayer){ var playerLayers = window.plugin.playerRanges.layer.getPlayerLayers(idPlayer); for(rangeName in playerLayers){ var layer = playerLayers[rangeName]; window.plugin.playerRanges.obj.rangesLayers[rangeName].removeLayer(layer); } delete window.plugin.playerRanges.obj.playersLayers[idPlayer]; } window.plugin.playerRanges.layer.setPlayerLatLng = function(idPlayer, newLL){ var playerLayers = window.plugin.playerRanges.layer.getPlayerLayers(idPlayer); for(rangeName in playerLayers){ var layer = playerLayers[rangeName]; layer.setLatLng(newLL); } } window.plugin.playerRanges.layer.setPlayerLabel = function(idPlayer, newLabel){ var playerLayers = window.plugin.playerRanges.layer.getPlayerLayers(idPlayer); $(playerLayers.mark._icon).find('span').text(newLabel); } window.plugin.playerRanges.layer.setPlayerRecharge = function(idPlayer, newLevel){ var lays = window.plugin.playerRanges.layer.getPlayerLayers(idPlayer); lays.recharge.setRadius(window.plugin.playerRanges.data.getRangeRecharge(newLevel)); } window.plugin.playerRanges.layer.setPlayerJolly = function(idPlayer, newJolly){ var lays = window.plugin.playerRanges.layer.getPlayerLayers(idPlayer); lays.jolly.setRadius(newJolly); } window.plugin.playerRanges.layer.drawAllPlayers = function(){ var players = window.plugin.playerRanges.data.getPlayers(); for(idPlayer in players){ window.plugin.playerRanges.layer.drawPlayer(idPlayer); } } window.plugin.playerRanges.layer.cleanAllPlayers = function(){ var players = window.plugin.playerRanges.data.getPlayers(); for(idPlayer in players){ window.plugin.playerRanges.layer.removePlayerLayers(idPlayer); } } window.plugin.playerRanges.layer.drawMarkerPlayer = function(idPlayer){ var player = window.plugin.playerRanges.data.getPlayer(idPlayer); var latlng = player.ll; var label = player.label; var factionClass = window.plugin.playerRanges.data.getMyFaction(); // Arrow Marker ---------- start var icc = new L.divIcon({ iconSize: new L.Point(19, 25), className:'playerRanges playerIcon '+factionClass, html: ''+label+'' }); var mark = new L.Marker(latlng, {icon:icc, draggable:true}); // Arrow Marker ---------- end window.plugin.playerRanges.layer.salvaDaParteIlLayer(idPlayer, 'mark', mark); window.plugin.playerRanges.layer.setEventsOnMarkerPlayer(idPlayer, mark); } window.plugin.playerRanges.layer.drawAllRangesPlayer = function(idPlayer){ var player = window.plugin.playerRanges.data.getPlayer(idPlayer); var latlng = player.ll; var playerRangesLayers = new Array(); var optWeight = window.plugin.playerRanges.obj.settings.weight; var optOpacity = window.plugin.playerRanges.obj.settings.opacity; // Hack Range playerRangesLayers[0] = new L.geodesicCircle( latlng, window.plugin.playerRanges.data.getRangeValByIndex(0), { weight: optWeight, opacity: optOpacity, clickable: false, fill: false, color: window.ACCESS_INDICATOR_COLOR, } ); // XMP Range for(var i=1; i<=8; i++){ playerRangesLayers[i] = new L.geodesicCircle( latlng, window.plugin.playerRanges.data.getRangeValByIndex(i), { weight: optWeight, opacity: optOpacity, clickable: false, fill: false, color: window.COLORS_LVL[i], dashArray: window.plugin.playerRanges.obj.settings.dashArr } ); } // Recharge Range var rangeRechargeVal = (player.level === undefined)? window.plugin.playerRanges.data.getMyRangeRecharge() : window.plugin.playerRanges.data.getRangeRecharge(player.level); playerRangesLayers[9] = new L.geodesicCircle( latlng, rangeRechargeVal, { weight: optWeight, opacity: optOpacity, clickable: false, fill: false, color: window.ACCESS_INDICATOR_COLOR, } ); // Jolly Range playerRangesLayers[10] = new L.geodesicCircle( latlng, ((player.jolly === undefined || player.jolly < 0)? 0 : player.jolly), { weight: optWeight, opacity: optOpacity, dashArray: [8, 6, 2, 6, 2, 6], clickable: false, fill: false, color: 'red', } ); // Add elements to the layers for(var i=1; i<=8; i++){ var rangeName = window.plugin.playerRanges.data.getRangeNameByIndex(i); var layer = playerRangesLayers[i]; window.plugin.playerRanges.layer.salvaDaParteIlLayer(idPlayer, rangeName, layer); } window.plugin.playerRanges.layer.salvaDaParteIlLayer(idPlayer, 'hack', playerRangesLayers[0]); window.plugin.playerRanges.layer.salvaDaParteIlLayer(idPlayer, 'recharge', playerRangesLayers[9]); window.plugin.playerRanges.layer.salvaDaParteIlLayer(idPlayer, 'jolly', playerRangesLayers[10]); } window.plugin.playerRanges.layer.setEventsOnMarkerPlayer = function(idPlayer, mark){ // Remove the elements from the layers mark.on('dblclick', function(e){ window.plugin.playerRanges.action.deletePlayer(idPlayer); }); // Save the new player position mark.on('dragend', function(e){ var newLL = e.target._latlng; window.plugin.playerRanges.action.dragEndPlayer(idPlayer, newLL); }); // Repositions the ranges when the arrow is dragged mark.on('drag', function(e){ var newLL = e.target._latlng; window.plugin.playerRanges.action.dragPlayer(idPlayer, newLL); }); /* // Repositions the arrow when the map is zoomed map.on('zoomend', function(e){ pLayer_range[9].setLatLng(pLayer_range[0].getLatLng()); }); */ } window.plugin.playerRanges.layer.setRangeLayerVisibility = function(rangeName, status){ if(status === undefined){ var status = window.plugin.playerRanges.data.getInvertRangeStatus(rangeName); } if(status === true){ window.plugin.playerRanges.layer.addRangeLayer(rangeName); }else if(status === false){ window.plugin.playerRanges.layer.removeRangeLayer(rangeName); } } window.plugin.playerRanges.layer.restoreRangesLayersVisibility = function(){ var rangesStatus = window.plugin.playerRanges.data.getRangesStatus(); for(rangeName in rangesStatus){ var rangeStatus = window.plugin.playerRanges.data.getRangeStatusByName(rangeName); window.plugin.playerRanges.layer.setRangeLayerVisibility(rangeName, rangeStatus); } window.plugin.playerRanges.layer.setRangeLayerVisibility('mark', true); } window.plugin.playerRanges.layer.addRangeLayer = function(rangeName){ if(rangeName == 'label'){ $('body').removeClass('hideLabelPlayersRanges'); window.plugin.playerRanges.hook.runChangeRangeVisibility('label', true); return; } var rangeLayer = window.plugin.playerRanges.obj.rangesLayers[rangeName]; var hasLayer = window.plugin.playerRanges.obj.layerGroup.hasLayer(rangeLayer); if(!hasLayer){ window.plugin.playerRanges.obj.layerGroup.addLayer(rangeLayer); window.plugin.playerRanges.hook.runChangeRangeVisibility(rangeName, true); } } window.plugin.playerRanges.layer.removeRangeLayer = function(rangeName){ if(rangeName == 'label'){ $('body').addClass('hideLabelPlayersRanges'); window.plugin.playerRanges.hook.runChangeRangeVisibility('label', false); return; } var rangeLayer = window.plugin.playerRanges.obj.rangesLayers[rangeName]; var hasLayer = window.plugin.playerRanges.obj.layerGroup.hasLayer(rangeLayer); if(hasLayer){ window.plugin.playerRanges.obj.layerGroup.removeLayer(rangeLayer); window.plugin.playerRanges.hook.runChangeRangeVisibility(rangeName, false); } } //====================================================================== // CSS AND CONTROL FUNCTIONS //====================================================================== window.plugin.playerRanges.ui.setupCSS = function(){ $("