NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name PokevisionMod Updated // @namespace PokeModUpdated // @description Pokevision Mod Updated // @include https://pokevision.com/* // @version 1.3 // @grant GM_addStyle // ==/UserScript== window.addEventListener('load', function() { if (Notification.permission !== "granted") { Notification.requestPermission(); } //console.log("test"); //setTimeout(function () { GM_addStyle('.leaflet-marker-icon-wrapper.leaflet-zoom-animated.leaflet-clickable { margin-left: -23.5px !important; margin-top: -22px !important; }'); //POKEVISION AFK MOD - Take 2 22/07/2016 console.log("%cLOADING POKEVISION MOD","color:lightblue"); console.log("- Big thanks to ffejmania for the distance calculator"); /*Sound effects, in case the narrator bugs up (happens a lot) Hopefully these guys don't mind we're using their sound :) http://ionden.com/a/plugins/ion.sound/static/sounds/button_tiny.mp3 */ var audio = new Audio('http://ionden.com/a/plugins/ion.sound/static/sounds/button_tiny.mp3'); function blip() { audio.play(); } var pokemonAlertList = { //Choose which pokemon you want to be alerted about! "Bulbasaur": true, "Ivysaur":true, "Venusaur":true, "Charmander":true, "Charmeleon":true, "Charizard":true, "Squirtle":true, "Wartortle":true, "Blastoise":true, "Caterpie":false, "Metapod":false, "Butterfree":true, "Weedle":false, "Kakuna":false, "Beedrill":true, "Pidgey":false, //Hell no "Pidgeotto":false, "Pidgeot":true, "Rattata":false, "Raticate":false, "Spearow":false, "Fearow":true, "Ekans":false, "Arbok":true, "Pikachu":true, "Raichu":true, "Sandshrew":true, "Sandslash":true, "Nidoran♀":false, "Nidorina":false, "Nidoqueen":true, "Nidoran♂":false, "Nidorino":false, "Nidoking":true, "Clefairy":false, "Clefable":true, "Vulpix":true, "Ninetales":true, "Jigglypuff":false, "Wigglytuff":true, "Zubat":false, //Hell no "Golbat":true, "Oddish":false, "Gloom":false, "Vileplume":true, "Paras":false, "Parasect":false, "Venonat":false, "Venomoth":true, "Diglett":true, "Dugtrio":true, "Meowth":false, "Persian":false, "Psyduck":false, "Golduck":true, "Mankey":false, "Primeape":true, "Growlithe":true, "Arcanine":true, "Poliwag":false, "Poliwhirl":true, "Poliwrath":true, "Abra":false, "Kadabra":true, "Alakazam":true, "Machop":true, "Machoke":true, "Machamp":true, "Bellsprout":false, "Weepinbell":false, "Victreebel":true, "Tentacool":false, "Tentacruel":true, "Geodude":false, "Graveler":true, "Golem":true, "Ponyta":true, "Rapidash":true, "Slowpoke":true, "Slowbro":true, "Magnemite":false, "Magneton":true, "Farfetch'd":true, "Doduo":false, "Dodrio":false, "Seel":false, "Dewgong":false, "Grimer":false, "Muk":true, "Shellder":false, "Cloyster":true, "Gastly":false, "Haunter":false, "Gengar":true, "Onix":true, "Drowzee":false, "Hypno":false, "Krabby":false, "Kingler":false, "Voltorb":false, "Electrode":true, "Exeggcute":false, "Exeggutor":true, "Cubone":false, "Marowak":true, "Hitmonlee":true, "Hitmonchan":true, "Lickitung":true, "Koffing":true, "Weezing":true, "Rhyhorn":false, "Rhydon":true, "Chansey":false, "Tangela":false, "Kangaskhan":true, "Horsea":false, "Seadra":false, "Goldeen":false, "Seaking":false, "Staryu":false, "Starmie":true, "Mr. Mime":true, "Scyther":true, "Jynx":false, "Electabuzz":true, "Magmar":true, "Pinsir":true, "Tauros":true, "Magikarp":false, "Gyarados":true, "Lapras":true, "Ditto":true, "Eevee":false, "Vaporeon":true, "Jolteon":true, "Flareon":true, "Porygon":true, "Omanyte":true, "Omastar":true, "Kabuto":true, "Kabutops":true, "Aerodactyl":true, "Snorlax":true, "Articuno":true, "Zapdos":true, "Moltres":true, "Dratini":true, "Dragonair":true, "Dragonite":true, "Mewtwo":true, "Mew":true, //The dream set: function(n, value) { this[Object.keys(this)[n]] = value; } }; var searchdistance = 500; //Are they worth the walk? getCookie(); //Clean that side bar. Sorry website owners. $(".home-sidebar p:not(.home-sidebar-social), .home-sidebar ol, .home-sidebar h3").remove(); $(".home-sidebar").append(` <h1>That lazy afk mod</h1> <p>Sit back, relax and it'll let you know when it's worth going outside :)<p> <h3 id="distanceheader">` + (searchdistance == 1000 ? `No limit` : (`Alert distance <` + searchdistance + `m`)) + `</h3> <input id="searchdistance" type="range" min="10" max="1000" value="` + searchdistance + `"></input> <h3>Pokemon</h3> <p><button id="deselectall">Deselect All</button><button id="selectall">Select All</button></p> <ol id="alertlist" type="1"> </ol> `); $(".home-map-scan").remove(); var showUnwanted = true; //If it's not on the alert list should it be shown? This isn't a feature just yet... //Add pokemon to the list for (var key in pokemonAlertList) { if (key != "set") { var isChecked = pokemonAlertList[key]? "checked" : ""; $("#alertlist").append('<li><input type="checkbox" '+isChecked+'></input> '+key+'</li>'); } } //Bind events to the list items $("#selectall").click(function(){ console.log("selectall"); $("#alertlist li").each(function(e){ $(this).find("input").prop("checked",true); var name = $(this).text().replace(/\s+/g, ''); pokemonAlertList[name] = true; }); setCookie(); }); $("#deselectall").click(function(){ console.log("deselectall"); $("#alertlist li").each(function(e){ $(this).find("input").prop("checked",false); var name = $(this).text().replace(/\s+/g, ''); pokemonAlertList[name] = false; }); setCookie(); }); $("#searchdistance").mousemove(function(e){ var dis = $(this).val(); searchdistance = dis; if (dis < 1000) { $("#distanceheader").text("Alert distance <" + dis + "m"); } else { $("#distanceheader").text("No limit"); } setCookie(); }); $("#alertlist li input").click(function(e){ var name = $(this).parent().text().replace(/\s+/g, ''); var state = $(this).is(":checked"); console.log(name,state); pokemonAlertList[name] = state; //Update the variable setCookie(); }); //The cool stuff App.home.updateMarkers = function() { e = App.home; if (!e.map) { return; } for (var i in e.pokemon) { var t = e.pokemon[i], o = t.expiration_time - Math.floor(+new Date() / 1000), n = e.markers['pokemon-' + i]; if (o <= 0) { if (n) { e.map.removeLayer(n); delete e.markers['pokemon-' + i]; } delete e.pokemon[i]; continue; } if (!n) { //Check if it's on the alert list and if its wanted n = e.createMarker(i, t); foundPokemon(e.pokedex[t.pokemonId], getDistanceMetres(App.home.latitude, App.home.longitude, n._latlng.lat, n._latlng.lng)); } n.updateLabel(e.secondsToString(o)); } }; function search() { console.log("Scanning..."); App.home.findNearbyPokemon(App.home.latitude, App.home.longitude, !0); setTimeout(search,App.home.TIMER_SCAN_DELAY); //Scans at websites desired delay, please don't change this! } function foundPokemon(pokemon,d) { if (pokemonAlertList[pokemon] && (d <= searchdistance || searchdistance === "1000")) { //If it's within range console.log("FOUND POKEMON!" + pokemon + " " + d + " metres away"); blip(); notifyMe(pokemon, d); return; } } //Big thanks to ffejmania (and Lolologist) :) function getDistanceMetres(lat1,lon1,lat2,lon2) { var R = 6371; // Radius of the earth in km var dLat = deg2rad(lat2-lat1); // deg2rad below var dLon = deg2rad(lon2-lon1); var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(dLon/2) * Math.sin(dLon/2) ; var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var d = Math.floor(R * c * 1000); // Distance in m return d; } function deg2rad(deg) { return deg * (Math.PI/180); } function setCookie() { var d = new Date(); d.setTime(d.getTime() + (365*24*60*60*1000)); var expires = "expires="+ d.toUTCString(); var list = $('ol#alertlist li'); var array = []; list.each(function (index) { if ($(this).find('input:checked').length > 0) { array.push(index); } }); document.cookie = "shownPokemon=" + array.join(',') + "; " + expires; document.cookie = "searchDistance=" + searchdistance + "; " + expires; } function getCookie() { var ca = document.cookie.split(';'); for(var i = 0; i <ca.length; i++) { var c = ca[i]; while (c.charAt(0)==' ') { c = c.substring(1); } if (c.indexOf("shownPokemon=") === 0) { var value = c.substring("shownPokemon=".length,c.length); var array = value.split(','); var list = $('ol#alertlist li'); for (var a = 0; a < 151; a++) { pokemonAlertList.set(a, false); } if (value.length > 0) { for (var b = 0; b < array.length; b++) { pokemonAlertList.set(array[b], true); } } } else if (c.indexOf("searchDistance=") === 0) { var d = c.substring("searchDistance=".length,c.length); searchdistance = +d; } } } function getObjectKeyIndex(obj, keyToFind) { var i = 0, key; for (key in obj) { if (key == keyToFind) { return i; } i++; } return null; } function notifyMe(pokemon, d) { if (!Notification) { alert('Desktop notifications not available in your browser. Try Chromium.'); return; } if (Notification.permission !== "granted") Notification.requestPermission(); else { var id = getObjectKeyIndex(pokemonAlertList, pokemon); var notification = new Notification('Found a ' + pokemon, { icon: 'https://ugc.pokevision.com/images/pokemon/' + (id + 1) + '.png', body: "Found a " + pokemon+ " " + d + " metres away!", }); } } //Start the repeating search function search(); App.success( 'The mod has started running! It will automatically refresh the search every 30 seconds' //Pop up ); //}, 5000); }, false);