Pokevision Enhancer

Save/Load filter list, scan an area for pokemon, plus more!

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Pokevision Enhancer
// @namespace   https://greasyfork.org/en/users/814-bunta
// @description Save/Load filter list, scan an area for pokemon, plus more!
// @include     *pokevision.com/*
// @version     1.2
// @Author      Bunta
// @license     http://creativecommons.org/licenses/by-nc-sa/3.0/us/
// @grant       none
// ==/UserScript==


var scanDelay = 1000; // time between scans for each lat/long position. Should be no lower than 1000 (1s)
var autoDelay = 60000; // time between scans repeating when Auto checkbox is enabled
var scanOnLoad = false; // if true will perform scan as soon as page is loaded or refreshed
var minLat = -36.84, maxLat = -36.86, minLon = 174.62, maxLon = 174.64; // bounds for the scan area. minLat is northmost value, minLon is westmost value. Scans adjust lat/long by 0.01

/* run below code (after setting above position variables) in console to view the bounds of your search area
App.home.createMarker(1,{latitude: minLat,longitude:minLon,pokemonId:151,}); // Mew should be top left
App.home.createMarker(1,{latitude: minLat,longitude:maxLon,pokemonId:25,});  // Pikachu should be top right
App.home.createMarker(1,{latitude: maxLat,longitude:minLon,pokemonId:26,});  // Raichu should be bottom left
App.home.createMarker(1,{latitude: maxLat,longitude:maxLon,pokemonId:150,}); // MewTwo should be bottom right
*/

var  pokemonAlertList = { //Choose which pokemon you want to be alerted about!
	"Bulbasaur": false,
	"Ivysaur":false,
	"Venusaur":false,
	"Charmander":false,
	"Charmeleon":true,
	"Charizard":true,
	"Squirtle":false,
	"Wartortle":false,
	"Blastoise":true, 
	"Caterpie":false, 
	"Metapod":false,
	"Butterfree":false,
	"Weedle":false,
	"Kakuna":false,
	"Beedrill":false,
	"Pidgey":false,
	"Pidgeotto":false,
	"Pidgeot":false,
	"Rattata":false,
	"Raticate":false,
	"Spearow":false,
	"Fearow":false,
	"Ekans":false,
	"Arbok":false,
	"Pikachu":true,
	"Raichu":true,
	"Sandshrew":false,
	"Sandslash":false,
	"Nidoran♀":false,
	"Nidorina":false,
	"Nidoqueen":true,
	"Nidoran♂":false,
	"Nidorino":false,
	"Nidoking":false,
	"Clefairy":false,
	"Clefable":false,
	"Vulpix":false,
	"Ninetales":true,
	"Jigglypuff":false,
	"Wigglytuff":false,
	"Zubat":false,
	"Golbat":false,
	"Oddish":false,
	"Gloom":false,
	"Vileplume":true,
	"Paras":false,
	"Parasect":false,
	"Venonat":false,
	"Venomoth":false,
	"Diglett":false,
	"Dugtrio":true,
	"Meowth":false,
	"Persian":false,
	"Psyduck":false,
	"Golduck":false,
	"Mankey":false,
	"Primeape":true,
	"Growlithe":false,
	"Arcanine":false,
	"Poliwag":false,
	"Poliwhirl":false,
	"Poliwrath":false,
	"Abra":false,
	"Kadabra":false,
	"Alakazam":true,
	"Machop":false,
	"Machoke":true,
	"Machamp":true,
	"Bellsprout":false,
	"Weepinbell":false,
	"Victreebel":false,
	"Tentacool":false,
	"Tentacruel":false,
	"Geodude":false,
	"Graveler":false,
	"Golem":true,
	"Ponyta":false,
	"Rapidash":true,
	"Slowpoke":false,
	"Slowbro":false,
	"Magnemite":false,
	"Magneton":true,
	"Farfetch'd":true,
	"Doduo":false,
	"Dodrio":false,
	"Seel":false,
	"Dewgong":true,
	"Grimer":false,
	"Muk":true,
	"Shellder":false,
	"Cloyster":true,
	"Gastly":false,
	"Haunter":false,
	"Gengar":true,
	"Onix":false,
	"Drowzee":false,
	"Hypno":true,
	"Krabby":false,
	"Kingler":false,
	"Voltorb":false,
	"Electrode":false,
	"Exeggcute":false,
	"Exeggutor":true,
	"Cubone":false,
	"Marowak":true,
	"Hitmonlee":false,
	"Hitmonchan":false,
	"Lickitung":false,
	"Koffing":false,
	"Weezing":false,
	"Rhyhorn":false,
	"Rhydon":true,
	"Chansey":false,
	"Tangela":false,
	"Kangaskhan":true,
	"Horsea":false,
	"Seadra":false,
	"Goldeen":false,
	"Seaking":false,
	"Staryu":false,
	"Starmie":false,
	"Mr. Mime":true,
	"Scyther":false,
	"Jynx":false,
	"Electabuzz":false,
	"Magmar":false,
	"Pinsir":false,
	"Tauros":true,
	"Magikarp":false,
	"Gyarados":true,
	"Lapras":true,
	"Ditto":true,
	"Eevee":false,
	"Vaporeon":false,
	"Jolteon":true,
	"Flareon":true,
	"Porygon":false,
	"Omanyte":false,
	"Omastar":true,
	"Kabuto":false,
	"Kabutops":true,
	"Aerodactyl":false,
	"Snorlax":false,
	"Articuno":true,
	"Zapdos":true,
	"Moltres":true,
	"Dratini":false,
	"Dragonair":false,
	"Dragonite":true,
	"Mewtwo":true, 
	"Mew":true,
}

// Test if local storage is available
function storageAvailable(type) {
	try {
		var storage = window[type],
			x = '__storage_test__';
		storage.setItem(x, x);
		storage.removeItem(x);
		return true;
	}
	catch(e) {
		return false;
	}
}
var storageAllowed = storageAvailable('localStorage');

// Start with some style fixes to improve map visibility
function addGlobalStyle(css) {
    var head, style;
    head = document.getElementsByTagName('head')[0];
    if (!head) { return; }
    style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = css;
    head.appendChild(style);
}
addGlobalStyle("header { padding: 5px 0 ! important }")
addGlobalStyle("body.home {	padding: 40px 0px 0px 0 ! important }")
$("footer").remove()

// Function to update the pokemon list to the selected pokemon above
function refreshFilter() {
	$("button.bs-deselect-all").click()
	for (key in pokemonAlertList) {
		if (pokemonAlertList[key]) {
			$("ul.dropdown-menu.inner li span").filter(function(index) { return $(this).text() === key; }).click();
		}
	}
}

// Function to save the pokemon list to local storage
function saveFilter() {
	var selectedPokemon = [];
	$('.dropdown-menu.inner li.selected').each(function(_, el){
		selectedPokemon.push($(el).data('original-index'));
	});
	localStorage.setItem('selectedPokemon', JSON.stringify(selectedPokemon));
}

// Function to load the pokemon list from local storage
function loadFilter() {
	var selectedPokemon
	try {
  	selectedPokemon = JSON.parse(localStorage.selectedPokemon);
	} catch(e) {
		refreshFilter();
		return;
	}
	
	if (selectedPokemon == null || selectedPokemon == "") { refreshFilter(); return; }
	
	$("button.bs-deselect-all").click()
	selectedPokemon.forEach(function(pokemonId) {
		$("ul.dropdown-menu.inner li[data-original-index=" + pokemonId + "] a").click();
	});
}

var scanning = false;

// function to perform scanning in grid area bound by lat/long variables set above
function scanLoop(lat,lon) {
	if (lon > maxLon) {
		lat -= 0.01;
		lon = minLon;
	}
	
	if (lat < maxLat) {
		console.log("Scanning Complete:", (new Date()).toLocaleTimeString());
		if ($("#autoRescan").prop("checked"))
		{
			console.log("Next scan will start:", (new Date((new Date()).getTime() + autoDelay)).toLocaleTimeString());
			setTimeout(function() {
				console.log("Initiating Scan:", (new Date()).toLocaleTimeString());
				scanLoop(minLat,minLon);
			}, autoDelay);
		} else {
  		scanning = false;
		}
		return;
	}
	
	//console.log("scanning:",lat,lon);
	App.home.findNearbyPokemon(lat, lon);
	setTimeout(function() { scanLoop(lat,lon+0.01); }, scanDelay);
}

// Add buttons to header bar
if (storageAllowed) {
  $("a.header-map-locate").before('<input type="checkbox" name="autoRescan" id="autoRescan" value="Auto">Auto  <button id="rescanPokes">Scan</Rescan><button id="saveFilter">Save Filter</button><button id="loadFilter">Load Filter</button>');
} else {
  $("a.header-map-locate").before('<input type="checkbox" name="autoRescan" id="autoRescan" value="Auto">Auto  <button id="rescanPokes">Scan</Rescan><button id="refreshFilter">Filter</button>');
}

// Add click functions to buttons
$("#rescanPokes").click(function() {
  console.log("rescanPokes");
	if (!scanning) {
		scanning = true;
		console.log("Initiating Scan:", (new Date()).toLocaleTimeString());
		scanLoop(minLat,minLon);
	}
});
$("#refreshFilter").click(function() {
  console.log("refreshFilter");
  refreshFilter();
});
$("#saveFilter").click(function() {
  console.log("saveFilter");
  saveFilter();
});

$("#loadFilter").click(function() {
  console.log("loadFilter");
  loadFilter();
});


// Update filter and scan on page load (if enabled)
$(window).load(function(){
	if (storageAllowed) {
		loadFilter();
	} else {
		refreshFilter();
	}
	
	if (!scanning && scanOnLoad) {
		scanning = true;
		console.log("Initiating Scan:", (new Date()).toLocaleTimeString());
		scanLoop(minLat,minLon);
	}
});