Pokevision Enhancer

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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);
	}
});