您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
For a full list of features included in this script, see this document https://docs.google.com/document/d/18nLXSQQLOzl4WpUgZkM-mxhhQLY6P3FKonQGp-H0fqI/edit?usp=sharing
当前为
// ==UserScript== // @name Geoguessr Unity Script // @description For a full list of features included in this script, see this document https://docs.google.com/document/d/18nLXSQQLOzl4WpUgZkM-mxhhQLY6P3FKonQGp-H0fqI/edit?usp=sharing // @version 5.2.6 // @author Jupaoqq // @include https://www.geoguessr.com/* // @run-at document-start // @license MIT // @namespace https://greasyfork.org/users/838374 // @grant none // ==/UserScript== /** * Custom your minimap here! */ /** * 1: replace "roadmap" in the customMode field with any of the options below: * "roadmap" displays the default road map view. This is the default map type. * "satellite" displays Google Earth satellite images. * "hybrid" displays a mixture of normal and satellite views. * "terrain" displays a physical map based on terrain information. */ let customMode = "roadmap"; /** * 2: Go to https://mapstyle.withgoogle.com/ first click "No thanks, take me to the old style wizard" * then click "MORE OPTIONS" to hide or reveal certain features. * When you are done, click "FINISH", then "COPY JSON", and replace my settings in custom with your settings below. */ let custom = [ { "featureType": "administrative", "stylers": [ { "visibility": "off" } ] }, { "featureType": "landscape", "stylers": [ { "visibility": "off" } ] }, { "featureType": "poi.park", "stylers": [ { "visibility": "off" } ] }, { "featureType": "road", "elementType": "labels", "stylers": [ { "visibility": "off" } ] }, { "featureType": "transit", "stylers": [ { "visibility": "off" } ] } ] /** * End of Minimap customization instruction section */ /** * Overlay anything on the minimap here! * 1. overlay an GeoJSON object * 2. overlay a custom image */ /** * Overlay an GeoJSON object: */ // change the GeoJson display style. // strokeOpacity, strokeWeight, fillOpacity takes a value between 0 and 1. // strokeColor and fillColor supports Hexadecimal color (#00FF00 is green) // If clickable is set to true, you would not be able to make a guess within the shape let GEOJSON_STYLE = { strokeColor: "black", strokeOpacity: 1, strokeWeight: 0.2, fillColor: "#00FF00", fillOpacity: 0, clickable: false, } // replace the URL with your desired link // For example, search "Germany GeoJson" on Github, find this link (https://github.com/isellsoap/deutschlandGeoJSON/blob/main/4_kreise/4_niedrig.geo.json) // Then click "Download" to get the raw.githubusercontent.com link (https://raw.githubusercontent.com/isellsoap/deutschlandGeoJSON/main/4_kreise/4_niedrig.geo.json) // and replace the URL below with that URL. // State zipcode: see this site https://github.com/OpenDataDE/State-zip-code-GeoJSON let YOUR_URL = "https://raw.githubusercontent.com/severinlandolt/map-switzerland/main/02%20GeoJSON/CH_Kantonsgrenzen_100_geo.json" // set it to true to add your custom GeoJSON by copy it to the code below (this is for let GeoJsonCustomUser = false // replace with your custom GeoJson, go to https://geojson.io/ to customize it then copy the Json to here let CUSTOM_GEOJSON = { "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "type": "LineString", "coordinates": [ [ 2.493896484375, 52.7163309360463 ], [ 2.4609375, 53.15994678846807 ], [ 3.2025146484375, 53.179703893605385 ], [ 3.2080078125, 52.96518371955126 ], [ 2.48291015625, 52.948637884883205 ] ] } }, { "type": "Feature", "properties": {}, "geometry": { "type": "LineString", "coordinates": [ [ 3.218994140625, 52.05586831074774 ], [ 3.218994140625, 52.13685974852633 ], [ 2.515869140625, 52.1267438596429 ], [ 2.515869140625, 51.77803705914517 ], [ 3.2354736328125, 51.78993084774129 ], [ 3.228607177734375, 51.96119237712624 ], [ 2.8571319580078125, 51.95230623740452 ] ] } }, { "type": "Feature", "properties": { "stroke": "#555555", "stroke-width": 2, "stroke-opacity": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ 2.5048828125, 52.619725272670266 ], [ 2.5103759765625, 52.274880130680536 ], [ 2.867431640625, 52.284962354465726 ], [ 3.2299804687499996, 52.29504228453735 ], [ 3.2135009765625, 52.63973017532399 ], [ 2.5096893310546875, 52.621392697207625 ] ] } } ] } /** * Overlay a custom image: */ // set it to true to add your image overlay let OverlayCustom = false // replace the URL with your desired link let OVERLAY_URL = "https://www.battleface.com/blog/wp-content/uploads/2020/10/patreon-profile-tom-geowizard.jpg" // set the bounds for the image - latitude (North and South), longitude (North and South) let OVERLAY_BOUNDS = { north: 53, west: -3, south: 51, east: 1, }; // change the image overlay display style. let OVERLAY_STYLE = { fillOpacity: 0.2, clickable: false, } /** * End of Minimap Overlay instruction section */ // API Keys var MS_API_KEY = "AjWqExh5E9aZfgKKBrgJMM2tbBeJ_q9ET7__194VDfcpl8lEWYTYNRWoYE1kqy95"; var YANDEX_API_KEY = "b704b5a9-3d67-4d19-b702-ec7807cecfc6"; var KAKAO_API_KEY = "cbacbe41e3a223d794f321de4f3e247b"; const MAPS_API_URL = "https://maps.googleapis.com/maps/api/js"; // removed "?" from the link var MAPILLARY_API_KEY_LIST = ["MLY|6723031704435203|5afd537469b114cf814881137ad74b7c", "MLY|6691659414239148|b45e7e82cde126044cbc2cf5d4a7c9b1", "MLY|5074369465929308|f7ad2802cbaf26c63f88046a292df68b", "MLY|7451643761528219|6477f2db0e3928b51e45ec9311983936", "MLY|4855256237866198|6d0464771831c8a4bf2be095e1e1aabc", "MLY|4772941976102161|8458d4f08d2e1970cdfe0a4e242c04ff", "MLY|4492067214235489|94c44703942362ad6f6b70b5d32c3a45", "MLY|4618251611628426|0cef71d6ec8b997a5ec06ecdeabf11ec", "MLY|4096846270415982|fa2ce29641503e6ef665f17459633570", "MLY|4231415756962414|fe353880fd246e8a4a6ae32152f7dbb0",] var MAPILLARY_API_KEY = MAPILLARY_API_KEY_LIST[Math.floor(Math.random() * MAPILLARY_API_KEY_LIST.length)]; console.log("Geoguessr Unity Script v5.2.6 by Jupaoqq"); // Store each player instance let YandexPlayer, KakaoPlayer, GooglePlayer, MapillaryPlayer, MSStreetPlayer; let YANDEX_INJECTED = false; let BAIDU_INJECTED = false; let KAKAO_INJECTED = false; let MAPILLARY_INJECTED = false; let MS_INJECTED = false; // Game mode detection let isBattleRoyale = false; let isDuel = false; let isBullseye = false; let isLiveChallenge = false; // Player detection and coordinate conversion let nextPlayer = "Google"; let nextPlayer_save = "Google"; let global_lat = 0; let global_lng = 0; let global_panoID = null; let global_BDID, global_BDAh, global_BDBh; let yId, yTime, yEnd, iId; let global_heading = null; let global_pitch = null; let krCoordinates = [38.75292321084364, 124.2804539232574, 33.18509676203202, 129.597381999198] let global_radi = 100 // Callback variables let eventListenerAttached = false; let povListenerAttached = false; let playerLoaded = false; let teleportLoaded = false; let syncLoaded = false; // Minimize Yandex API use let yandex_map = false; let Kakao_map = false; // Mapillary Image Key let mmKey = 0; // Handle Yandex compass let COMPASS = null; // Handle undo let locHistory = []; let defaultPanoIdChange = true; // Round check let ROUND = 0; let CURRENT_ROUND_DATA = null; let switch_call = true; let one_reset = false; // let cnt = 0; let cn_tips = false; var isFirefox = typeof InstallTrigger !== 'undefined'; let linksList = [] let fire1 = true; let CNBorder = false; // Satellite Map Radius (in Meters) let ms_radius = 15000; let ms_random = false; let ms_birdseye = false; // Create the Maps, but not reload API let partialCreateYandex = false; let partialCreateKakao = false; let partialCreateMapillary = false; let partialCreateMS = false; // let NEW_ROUND_LOADED = false; // Geoguessr Canvas String Names let GENERAL_CANVAS = ".game-layout__panorama-canvas"; let BR_CANVAS = ".br-game-layout__panorama-canvas"; let FAIL_TO_LOAD_CANVAS = ".game-layout__panorama-message"; let DUEL_LAYOUT = ".game_layout__TO_jf"; let DUELS_CANVAS = ".game-panorama_panorama__rdhFg"; let DUELS_CANVAS2 = ".game-panorama_panoramaCanvas__PNKve"; let BULLSEYE_CANVAS = ".game-panorama_panorama__ncMwh"; let BULLSEYE_CANVAS2 = ".game-panorama_panoramaCanvas__r_5ea"; let LIVE_CANVAS = ".game-panorama_panorama__6RmkO"; let LIVE_CANVAS2 = ".game-panorama_panoramaCanvas__gp8og" let DUELS_POPUP = ".overlay_overlay__AR02x" let BR_POPUP = ".popup__content" let BR_LOAD_KAKAO = false; let BR_LOAD_YANDEX = false; let BR_LOAD_MS = false; let ms_sat_map = false; let rtded = false; let NM = false; let NP = false; let NZ = false; let initBing = false; /** * Helper Functions */ // Highlight API Load Message function myHighlight(...args) { console.log(`%c${[...args]}`, "color: dodgerblue; font-size: 24px;"); } // Hex to number conversion for Baidu coordinate conversion function hex2a(hexx) { var hex = hexx.toString(); var str = ''; for (var i = 0; i < hex.length; i += 2) { str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); } return str; } // Coordinate computation given heading, distance and current coordinates for teleport function FindPointAtDistanceFrom(lat, lng, initialBearingRadians, distanceKilometres) { const radiusEarthKilometres = 6371.01; var distRatio = distanceKilometres / radiusEarthKilometres; var distRatioSine = Math.sin(distRatio); var distRatioCosine = Math.cos(distRatio); var startLatRad = DegreesToRadians(lat); var startLonRad = DegreesToRadians(lng); var startLatCos = Math.cos(startLatRad); var startLatSin = Math.sin(startLatRad); var endLatRads = Math.asin((startLatSin * distRatioCosine) + (startLatCos * distRatioSine * Math.cos(initialBearingRadians))); var endLonRads = startLonRad + Math.atan2( Math.sin(initialBearingRadians) * distRatioSine * startLatCos, distRatioCosine - startLatSin * Math.sin(endLatRads)); return { lat: RadiansToDegrees(endLatRads), lng: RadiansToDegrees(endLonRads) }; } function DegreesToRadians(degrees) { const degToRadFactor = Math.PI / 180; return degrees * degToRadFactor; } function RadiansToDegrees(radians) { const radToDegFactor = 180 / Math.PI; return radians * radToDegFactor; } function toRadians(degrees) { return degrees * Math.PI / 180; }; // Converts from radians to degrees. function toDegrees(radians) { return radians * 180 / Math.PI; } function bearing(start_latitude, start_longitude, stop_latitude, stop_longitude){ let y = Math.sin(stop_longitude-start_longitude) * Math.cos(stop_latitude); let x = Math.cos(start_latitude)*Math.sin(stop_latitude) - Math.sin(start_latitude)*Math.cos(stop_latitude)*Math.cos(stop_longitude-start_longitude); let brng = Math.atan2(y, x) * 180 / Math.PI; return brng } // Check if two floating point numbers are really really really really close to each other (to 10 decimal points) function almostEqual (a, b) { return a.toFixed(10) === b.toFixed(10) } function almostEqual2 (a, b) { return a.toFixed(3) === b.toFixed(3) } function moveFrom(coords, angle, distance){ const R_EARTH = 6378.137; const M = (1 / ((2 * Math.PI / 360) * R_EARTH)) / 1000; let radianAngle = -angle * Math.PI / 180; let x = 0 + (distance * Math.cos(radianAngle)); let y = 0 + (distance * Math.sin(radianAngle)); let newLat = coords.lat + (y * M); let newLng = coords.lng + (x * M) / Math.cos(coords.lat * (Math.PI / 180)); return { lat: newLat, lng: newLng }; } function getBBox(coordinates, meters){ let SW = moveFrom(coordinates, 135, meters); let NE = moveFrom(coordinates, 315, meters); return `${SW.lng},${SW.lat},${NE.lng},${NE.lat}`; } function getBBox2(coordinates, meters){ let SW = moveFrom(coordinates, 135, meters); let NE = moveFrom(coordinates, 315, meters); return [NE.lat,SW.lng,SW.lat,NE.lng]; } function distance(lat1, lon1, lat2, lon2) { var p = 0.017453292519943295; // Math.PI / 180 var c = Math.cos; var a = 0.5 - c((lat2 - lat1) * p)/2 + c(lat1 * p) * c(lat2 * p) * (1 - c((lon2 - lon1) * p))/2; return 1000 * 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km } // Script injection, extracted from extenssr: // https://gitlab.com/nonreviad/extenssr/-/blob/main/src/injected_scripts/maps_api_injecter.ts function overrideOnLoad(googleScript, observer, overrider) { const oldOnload = googleScript.onload googleScript.onload = (event) => { const google = window.google if (google) { observer.disconnect() overrider(google) } if (oldOnload) { oldOnload.call(googleScript, event) } } } function grabGoogleScript(mutations) { for (const mutation of mutations) { for (const newNode of mutation.addedNodes) { const asScript = newNode if (asScript && asScript.src && asScript.src.startsWith('https://maps.googleapis.com/')) { //asScript.src = "https://maps.googleapis.com/maps/api/js?key=AIzaSyDqRTXlnHXELLKn7645Q1L_5oc4CswKZK4&v=3&libraries=places,drawing&language=ja®ion=JP" return asScript } } } return null } function injecter(overrider) { if (document.documentElement) { injecterCallback(overrider); } else { alert("Script didn't load, refresh to try loading the script"); } } function injecterCallback(overrider) { new MutationObserver((mutations, observer) => { const googleScript = grabGoogleScript(mutations) if (googleScript) { overrideOnLoad(googleScript, observer, overrider) } }).observe(document.documentElement, { childList: true, subtree: true }) } function magic_formula(boundary) { let area = (boundary[0] - boundary[2]) * (boundary[1] - boundary[3]) let dist = Math.pow((area / 50000), 0.25) * 20000 if (dist < 250) dist = 250 return dist } function formatDist() { if (ms_radius > 999) { let d = ms_radius / 1000.0; return parseFloat(d.toPrecision(2)).toString() + "km"; } else { let d = ms_radius; return parseFloat(d.toPrecision(3)).toString() + "m"; } } // Getter function for the button elements function setButtons() { // console.log("set") return [document.getElementById("Teleport Button"), document.getElementById("plus"), document.getElementById("minus"), document.getElementById("reset"), document.getElementById("switch"), document.getElementById("Show Buttons"), document.getElementById("Date Button"), document.getElementById("minus year"), document.getElementById("plus year"), document.getElementById("Minimap Button"), document.getElementById("Overlay Button"), document.getElementById("Help Button"), document.getElementById("Teleport Options Button"), document.getElementById("Satellite Switch")]; } // Store default position for the button elements function resetBtnPos() { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); teleportBtn.style.top = "14em"; teleportMoreBtn.style.top = "14em"; teleportLessBtn.style.top = "14em"; teleportDistResetBtn.style.top = "16.5em"; switchCovergeButton.style.top = "11.5em"; mainMenuBtn.style.top = "6em"; timeMachineBtn.style.top = "19em"; timeMachineOlderBtn.style.top = "19em"; timeMachineNewerBtn.style.top = "19em"; MinimapBtn.style.top = "21.5em"; OverlayBtn.style.top = "21.5em"; HelpBtn.style.top = "9em"; TeleportArisBtn.style.top = "16.5em"; satelliteSwitchButton.style.top = "9em"; document.getElementById("Youtube Button").style.top = "6em"; teleportBtn.style.right = "3em"; teleportMoreBtn.style.right = "0.5em"; teleportLessBtn.style.right = "13.5em"; teleportDistResetBtn.style.right = "6.5em"; switchCovergeButton.style.right = "0.5em"; mainMenuBtn.style.right = "0.5em"; timeMachineBtn.style.right = "3em"; timeMachineOlderBtn.style.right = "13.5em"; timeMachineNewerBtn.style.right = "0.5em"; MinimapBtn.style.right = "8.25em"; OverlayBtn.style.right = "0.5em"; HelpBtn.style.right = "9.5em"; TeleportArisBtn.style.right = "0.5em"; satelliteSwitchButton.style.right = "0.5em"; document.getElementById("Youtube Button").style.right = "4em"; let hC = 0 for (let mapDiv of document.getElementsByClassName("preset-minimap")){ mapDiv.style.top = (23.6 + (hC * 1.6)).toString() + "em"; mapDiv.style.right = "8.25em"; hC++; } let hC2 = 0 for (let mapDiv2 of document.getElementsByClassName("overlay-minimap")){ mapDiv2.style.top = (23.6 + (hC2 * 1.6)).toString() + "em"; mapDiv2.style.right = "0.5em"; hC2++; } for (let mapDiv3 of document.getElementsByClassName("unity-btn")){ if (mapDiv3.id !== "Show Buttons") { let oR = parseFloat(mapDiv3.style.width.replace(/[^\d.-]/g, '')) - 0.25; mapDiv3.style.backgroundPosition = "" + oR + "em"; } } } // Adjust Buttons for different game modes function AdjustBtnPos(top, right) { resetBtnPos(); for (let element of document.getElementsByClassName("unity-btn")){ let eTop = element.style.top; let eRight = element.style.right; element.style.top = "calc(" + top.toString() + " + " + eTop + ")"; element.style.right = "calc(" + right.toString() + " + " + eRight + ")"; // console.log(element.style.top) } } /** * Creates Unity buttons * * @returns Promise */ function UnityInitiate() { const google = window.google; let curPosition; let kakao_enabled = true; function svCheck(data, status) { if (status === 'OK') { // console.log("STATUS OK"); let l = data.location.latLng.toString().split(','); let lat = l[0].replaceAll('(', ''); let lng = l[1].replaceAll(')', ''); if (lat == curPosition.lat && lng == curPosition.lng && !switch_call) { console.log("Trying more distance"); teleportBtn.distance += 100; teleportBtn.innerHTML = "Teleport " + teleportBtn.distance + " m"; } else { console.log("Teleport Success"); GooglePlayer.setPosition(data.location.latLng); GooglePlayer.setPov({ heading: switchCovergeButton.heading, pitch: 0, }) if (teleportBtn.distance > 150) { teleportBtn.distance = 100; teleportBtn.innerHTML = "Teleport " + teleportBtn.distance + " m"; } } switch_call = false; } else { console.log("STATUS NOT OK"); teleportBtn.distance += 100; teleportBtn.innerHTML = "Teleport " + teleportBtn.distance + " m"; } } google.maps.Map = class extends google.maps.Map { constructor(...args) { super(...args); if (GeoJsonCustomUser) { if (GeoJsonCustomUser) { this.data.addGeoJson(CUSTOM_GEOJSON); } this.data.setStyle(function(feature) { return GEOJSON_STYLE }); } if (OverlayCustom) { let customOverlay = new google.maps.GroundOverlay(OVERLAY_URL, OVERLAY_BOUNDS, OVERLAY_STYLE); customOverlay.setMap(this); } if (CNBorder) { this.data.loadGeoJson("https://raw.githubusercontent.com/Jupaoqq/Jupaoqq.github.io/main/10DD.json"); this.data.setStyle(function(feature) { return { clickable: false, strokeWeight: 1 } }); const imageBounds3 = { north: NW[0], west: NW[1], south: NW[2], east: NW[3], }; SEOverlay3 = new google.maps.GroundOverlay( "https://www.countryflags.com/wp-content/uploads/china-flag-png-large.png", imageBounds3, {clickable: false, opacity: 1} ); SEOverlay3.setMap(this); this.addListener("zoom_changed", () => { let zoomLevel = this.getZoom(); let opacity = 1; if (SEOverlay) { SEOverlay.setMap(null); NWOverlay.setMap(null); } let borderSE = TW[0] let borderNW = TS[0] if (zoomLevel > 7 && zoomLevel < 14) { borderSE = TW[zoomLevel - 7]; borderNW = TS[1]; } if (zoomLevel >= 14) { opacity = 0; } const imageBounds = { north: borderSE[0], west: borderSE[1], south: borderSE[2], east: borderSE[3], }; SEOverlay = new google.maps.GroundOverlay( "https://www.countryflags.com/wp-content/uploads/china-flag-png-large.png", imageBounds, {clickable: false, opacity: opacity} ); SEOverlay.setMap(this); const imageBounds2 = { north: borderNW[0], west: borderNW[1], south: borderNW[2], east: borderNW[3], }; NWOverlay = new google.maps.GroundOverlay( "https://www.countryflags.com/wp-content/uploads/china-flag-png-large.png", imageBounds2, {clickable: false, opacity: 1} ); NWOverlay.setMap(this); }); } for (let mapDiv of document.getElementsByClassName("preset-minimap")){ google.maps.event.addDomListener(mapDiv, "click", () => { MinimapBtn.current = mapDiv.id; if (mapDiv.id == "Hybrid") { this.setMapTypeId('hybrid'); } else if (mapDiv.id == "Terrain") { this.setMapTypeId('terrain'); } else if (mapDiv.id == "Satellite") { this.setMapTypeId('satellite'); } else if (mapDiv.id == "Custom") { this.setMapTypeId(customMode); } else { this.setMapTypeId('roadmap'); } // this.setTilt(45); for (let ar of presetMinimap) { if (ar[1] == mapDiv.id) { this.set('styles', ar[0]); } } for (let element of document.getElementsByClassName("preset-minimap")){ if (element.id == MinimapBtn.current) { element.style.background = "#ff1493"; } else { element.style.background = "#ff69b4"; } if (rtded) { if (element.id == "Borders" || element.id == "Satellite" || element.id == "Terrain" || element.id == "Hybrid" || element.id == "Custom") { element.style.backgroundColor = "red"; element.disabled = true; } } } }); } for (let mapDiv of document.getElementsByClassName("overlay-minimap")){ google.maps.event.addDomListener(mapDiv, "click", () => { OverlayBtn.current = mapDiv.id; // console.log(mapDiv.url) // console.log(mapDiv.id) // console.log(mapDiv.loaded) if (!mapDiv.loaded) { this.data.loadGeoJson(mapDiv.url, { id: mapDiv.id }); mapDiv.loaded = true; } if (mapDiv.id == "Clear") { this.overlayMapTypes.clear(); this.data.setStyle(function(feature) { return GEOJSON_INVISIBLE }); for (let element of document.getElementsByClassName("overlay-minimap")){ if (element.id === "Clear") { element.style.background = "#ff1493"; } else { element.style.background = "#ff69b4"; } } } else { if (mapDiv.id == "Coverage" || mapDiv.id == "Official") { this.overlayMapTypes.clear(); const coverageLayer = new google.maps.ImageMapType({ getTileUrl ({ x, y }, z) { // Omits photospheres // return `https://mts1.googleapis.com/vt?hl=en-US&lyrs=svv|cb_client:apiv3&style=5,8&x=${x}&y=${y}&z=${z}` // Omits unofficial and trekker, but also half of mongolia if (mapDiv.id == "Official") { return `https://mts1.googleapis.com/vt?hl=en-US&lyrs=svv|cb_client:app&style=5,8&x=${x}&y=${y}&z=${z}` } // return `https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i${z}!2i${x}!3i${y}!4i256!2m8!1e2!2ssvv!4m2!1scb_client!2sapp!4m2!1scc!2s*211m3*211e3*212b1*213e2*211m3*211e2*212b1*213e2!3m3!3sUS!12m1!1e68!4e0` // Includes everything else { return `https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i${z}!2i${x}!3i${y}!4i256!2m8!1e2!2ssvv!4m2!1scb_client!2sapiv3!4m2!1scc!2s*211m3*211e3*212b1*213e2*211m3*211e2*212b1*213e2!3m3!3sUS!12m1!1e68!4e0` } }, maxZoom: 20, tileSize: new google.maps.Size(256, 256), }) this.overlayMapTypes.push(coverageLayer); let other = "Official"; if (mapDiv.id == "Official") { other = "Coverage" } mapDiv.style.background = "#ff1493"; for (let element of document.getElementsByClassName("overlay-minimap")){ if (element.id === "Clear" || element.id === other) { element.style.background = "#ff69b4"; } } } else { this.data.setStyle(function(feature) { return GEOJSON_STYLE }); for (let element of document.getElementsByClassName("overlay-minimap")){ if (element.id !== "Coverage" && element.id !== "Official") { if (element.id !== "Clear" && element.loaded) { element.style.background = "#ff1493"; } else { element.style.background = "#ff69b4"; } } } } } }); } } } const svService = new google.maps.StreetViewService(); google.maps.StreetViewPanorama = class extends google.maps.StreetViewPanorama { constructor(...args) { super(...args); GooglePlayer = this; const isGamePage = () => location.pathname.startsWith("/challenge/") || location.pathname.startsWith("/results/") || location.pathname.startsWith("/game/")|| location.pathname.startsWith("/battle-royale/") || location.pathname.startsWith("/duels/") || location.pathname.startsWith("/team-duels/") || location.pathname.startsWith("/bullseye/") || location.pathname.startsWith("/live-challenge/"); this.addListener('position_changed', () => { // Maybe this could be used to update the position in the other players // so that they are always in sync try { if (!isGamePage()) return; // timeMachineBtn.panoId = GooglePlayer.pano; // timeMachineBtn.index = -1; const lat = this.getPosition().lat(); const lng = this.getPosition().lng(); const { heading } = this.getPov(); curPosition = { lat, lng, heading }; if (switchCovergeButton.useGoogle) { switchCovergeButton.lng = lng; switchCovergeButton.lat = lat; switchCovergeButton.heading = heading; if (!timeMachineBtn.list.some(row => row.includes(GooglePlayer.pano))) { timeMachineBtn.innerHTML = "Time Machine"; timeMachineBtn.panoId = GooglePlayer.pano; timeMachineBtn.index = -1; timeMachineBtn.plusminusLock = true; timeMachineNewerBtn.style.backgroundColor = "red"; timeMachineNewerBtn.disabled = true; timeMachineOlderBtn.style.backgroundColor = "red"; timeMachineOlderBtn.disabled = true; } } switchCovergeButton.useGoogle = true; teleportBtn.google = true; // console.log("also run"); // switchCovergeButton.heading = position.lat; // console.log(position.heading); // console.log(switchCovergeButton.lng); } catch (e) { console.error("GeoGuessr Path Logger Error:", e); } }); this.addListener('pov_changed', () => { const { heading, pitch } = this.getPov(); if (KakaoPlayer) { if (typeof KakaoPlayer !== 'string' ) { const vp = KakaoPlayer.getViewpoint(); // Prevent a recursive loop: only update kakao's viewpoint if it got out of sync with google's if ((!almostEqual(vp.pan, heading) || !almostEqual(vp.tilt, pitch)) && nextPlayer == "Kakao") { KakaoPlayer.setViewpoint({ pan: heading, tilt: pitch, zoom: vp.zoom }); } } } }); } }; var mainMenuBtn = document.createElement("Button"); mainMenuBtn.classList.add("unity-btn"); mainMenuBtn.id = "Show Buttons"; mainMenuBtn.hide = true; mainMenuBtn.innerHTML = "<font size=2>Unity<br><font size=1>v5.2.6</font>"; mainMenuBtn.style = "visibility:hidden;width:3em;height:2.5em;position:absolute;z-index:99999;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;line-height: 15px;"; // document.querySelector(".game-layout__status").appendChild(mainMenuBtn) document.body.appendChild(mainMenuBtn); mainMenuBtn.addEventListener("click", () => { if (mainMenuBtn.hide) { if (nextPlayer != "Youtube") { mainMenuBtn.innerHTML = "<font size=2>Geoguessr Unity Script<br><font size=1>by Jupaoqq | v5.2.6</font>"; mainMenuBtn.style.width = "15em"; let oR = parseFloat(mainMenuBtn.style.width.replace(/[^\d.-]/g, '')) - 0.25; mainMenuBtn.style.backgroundPosition = "" + oR + "em"; mainMenuBtn.style.backgroundColor = "#BF40BF" } for (let element of document.getElementsByClassName("unity-btn")){ if (!element.classList.contains("preset-minimap") && !element.classList.contains("overlay-minimap")) { element.style.visibility = ""; if ((nextPlayer != "Youtube") && element.id == "Youtube Button") { element.style.visibility = "hidden"; } } } mainMenuBtn.hide = false; } else { if (nextPlayer != "Youtube") { mainMenuBtn.innerHTML = "<font size=2>Unity<br><font size=1>v5.2.6</font>"; mainMenuBtn.style.width = "3em" mainMenuBtn.style.backgroundPosition = ""; mainMenuBtn.backgroundColor = "" } for (let element of document.getElementsByClassName("unity-btn")){ if (element.id !== "Show Buttons") { element.style.visibility = "hidden"; } } mainMenuBtn.hide = true; } }); var teleportBtn = document.createElement("Button"); teleportBtn.classList.add("unity-btn"); teleportBtn.teleType = "default"; teleportBtn.id = "Teleport Button"; teleportBtn.distance = 100; teleportBtn.google = true; teleportBtn.innerHTML = "Teleport 100m"; teleportBtn.style = "visibility:hidden;width:10em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(teleportBtn); teleportBtn.addEventListener("click", () => { // console.log("Google Teleport"); if (switchCovergeButton.init) { // console.log("run"); switchCovergeButton.init = false; if (teleportBtn.google) { switchCovergeButton.useGoogle = true; teleportBtn.google = true; } else { switchCovergeButton.useGoogle = false; teleportBtn.google = false; } } else { // console.log(teleportBtn.google) if (teleportBtn.google && GooglePlayer != null) { let heading = GooglePlayer.getPov().heading; let place = FindPointAtDistanceFrom(curPosition.lat, curPosition.lng , DegreesToRadians(heading), teleportBtn.distance * 0.001) svService.getPanorama({ location: place, radius: 1000, source: teleportBtn.teleType}, svCheck); } } }); var teleportMoreBtn = document.createElement("Button"); teleportMoreBtn.classList.add("unity-btn"); teleportMoreBtn.id = "plus" teleportMoreBtn.innerHTML = "+"; teleportMoreBtn.style = "visibility:hidden;width:2em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(teleportMoreBtn); teleportMoreBtn.addEventListener("click", () => { if (teleportBtn.distance > 21 && teleportBtn.distance < 149) { teleportBtn.distance = teleportBtn.distance + 25; } teleportBtn.innerHTML = "Teleport " + teleportBtn.distance + " m"; }); var teleportLessBtn = document.createElement("Button"); teleportLessBtn.classList.add("unity-btn"); teleportLessBtn.id = "minus" teleportLessBtn.innerHTML = "-"; teleportLessBtn.style = "visibility:hidden;width:2em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(teleportLessBtn); teleportLessBtn.addEventListener("click", () => { if (teleportBtn.distance > 26) { teleportBtn.distance = teleportBtn.distance - 25; } teleportBtn.innerHTML = "Teleport " + teleportBtn.distance + " m"; }); var teleportDistResetBtn = document.createElement("Button"); teleportDistResetBtn.classList.add("unity-btn"); teleportDistResetBtn.id = "reset" teleportDistResetBtn.innerHTML = "Reset Distance"; teleportDistResetBtn.style = "visibility:hidden;width:9em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(teleportDistResetBtn); teleportDistResetBtn.addEventListener("click", () => { teleportBtn.distance = 100; teleportBtn.innerHTML = "Teleport " + teleportBtn.distance + " m"; }); var satelliteSwitchButton = document.createElement("Button"); satelliteSwitchButton.classList.add("unity-btn"); satelliteSwitchButton.id = "Satellite Switch"; satelliteSwitchButton.state = false; satelliteSwitchButton.innerHTML = "Streetview mode"; satelliteSwitchButton.style = "visibility:hidden;width:8.5em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;line-height: 14px;"; document.body.appendChild(satelliteSwitchButton); satelliteSwitchButton.addEventListener("click", () => { if (!initBing) { let di = formatDist(); satelliteSwitchButton.innerHTML = `Satellite (${di})`; initBing = true; MS_INJECTED = false; BR_LOAD_MS = true; injectMSPlayer(); nextPlayer = "Bing Satellite"; injectCanvas(true); satCallback(); sessionStorage.setItem('Satellite', "T"); console.log("Load Bing Maps API") // } else { if (!satelliteSwitchButton.innerHTML.includes("Satellite")) { // console.log("true!!") let di2 = formatDist(); satelliteSwitchButton.innerHTML = `Satellite (${di2})`; nextPlayer = "Bing Satellite"; injectCanvas(true); satCallback(); nextPlayer = nextPlayer_save; sessionStorage.setItem('Satellite', "T"); // console.log("hello") } else { satelliteSwitchButton.innerHTML = "Streetview mode"; if (nextPlayer_save == "Bing Satellite") { nextPlayer = "Google"; } else { nextPlayer = nextPlayer_save; } injectCanvas(true); if (sessionStorage.getItem('Satellite') == "T") { if (nextPlayer !== "Google") { goToLocation(true); } handleButtons(); } sessionStorage.setItem('Satellite', "F"); } if (satelliteSwitchButton.innerHTML !== "Streetview mode" || nextPlayer == "Baidu") { switchCovergeButton.disabled = true; switchCovergeButton.style.background = "red"; } else { switchCovergeButton.disabled = false; switchCovergeButton.style.background = "#BF40BF"; } } }); var switchCovergeButton = document.createElement("Button"); switchCovergeButton.classList.add("unity-btn"); switchCovergeButton.sat = false; switchCovergeButton.id = "switch"; switchCovergeButton.init = false; switchCovergeButton.useGoogle = false; switchCovergeButton.lng = 0 switchCovergeButton.lat = 0 switchCovergeButton.heading = 0 switchCovergeButton.innerHTML = "Switch to Google"; switchCovergeButton.style = "visibility:hidden;width:15em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(switchCovergeButton); switchCovergeButton.addEventListener("click", () => { nextPlayer = nextPlayer_save; let GOOGLE_MAPS_CANVAS1 = document.querySelector(".game-layout__panorama-canvas"); let GOOGLE_MAPS_CANVAS2 = document.querySelector(".br-game-layout__panorama-canvas"); let GOOGLE_MAPS_CANVAS3 = document.querySelector(".inactive"); let GOOGLE_MAPS_CANVAS4 = document.querySelector(".game-panorama_panoramaCanvas__r_5ea"); let duel = false; let GOOGLE_MAPS_CANVAS = null; if (GOOGLE_MAPS_CANVAS1 !== null) { GOOGLE_MAPS_CANVAS = GOOGLE_MAPS_CANVAS1; } else if (GOOGLE_MAPS_CANVAS2 !== null) { GOOGLE_MAPS_CANVAS = GOOGLE_MAPS_CANVAS2; } else if (GOOGLE_MAPS_CANVAS4 !== null) { GOOGLE_MAPS_CANVAS = GOOGLE_MAPS_CANVAS4; } if (GOOGLE_MAPS_CANVAS3 !== null) { duel = true; } let KAKAO_MAPS_CANVAS = document.getElementById("roadview"); let YANDEX_MAPS_CANVAS = document.querySelector(".ymaps-2-1-79-panorama-screen"); let MAPILLARY_MAPS_CANVAS = document.getElementById("mapillary-player") let BAIDU_MAPS_CANVAS = document.getElementById("i_container"); let MS_MAPS_CANVAS = document.getElementById("ms-player"); // if (nextPlayer !== "Baidu") { if (switchCovergeButton.useGoogle == false) { if (duel) { document.getElementById("default_player").className = "game-panorama_panoramaCanvas__PNKve"; if (nextPlayer == "Kakao") { KAKAO_MAPS_CANVAS.className = "inactive"; } else if (nextPlayer == "Bing Satellite" || nextPlayer == "Bing Streetside") { MS_MAPS_CANVAS.className = "inactive"; } else { MAPILLARY_MAPS_CANVAS.className = "inactive"; MAPILLARY_MAPS_CANVAS.style.visibility = "hidden"; } } else { GOOGLE_MAPS_CANVAS.style.visibility = ""; if (nextPlayer == "Kakao") { KAKAO_MAPS_CANVAS.style.visibility = "hidden"; } else if (nextPlayer == "Yandex") { YANDEX_MAPS_CANVAS.style.visibility = "hidden"; } else if (nextPlayer == "Baidu" || nextPlayer == "Youtube" || nextPlayer == "Image") { BAIDU_MAPS_CANVAS.style.visibility = "hidden"; } else if (nextPlayer == "Mapillary" || nextPlayer == "Google") { MAPILLARY_MAPS_CANVAS.style.visibility = "hidden"; } else if (nextPlayer == "Bing Satellite" || nextPlayer == "Bing Streetside") { MS_MAPS_CANVAS.style.visibility = "hidden"; } } const lat = GooglePlayer.getPosition().lat(); const lng = GooglePlayer.getPosition().lng(); switch_call = true; if (!almostEqual2(lat, switchCovergeButton.lat) || !almostEqual2(lat, switchCovergeButton.lng)) { svService.getPanorama({ location: { lat: switchCovergeButton.lat, lng: switchCovergeButton.lng }, radius: 1000 }, svCheck); } switchCovergeButton.useGoogle = true; teleportBtn.google = true; switchCovergeButton.init = false; console.log("use Google"); } else { if (MS_MAPS_CANVAS) { MS_MAPS_CANVAS.style.visibility = "hidden"; } if (duel) { document.getElementById("default_player").className = "inactive"; if (nextPlayer == "Kakao") { KAKAO_MAPS_CANVAS.className = "game-panorama_panoramaCanvas__PNKve"; } else if (nextPlayer == "Bing Satellite" || nextPlayer == "Bing Streetside") { MS_MAPS_CANVAS.className = "game-panorama_panoramaCanvas__PNKve"; } else { MAPILLARY_MAPS_CANVAS.className = "game-panorama_panoramaCanvas__PNKve"; MAPILLARY_MAPS_CANVAS.style.visibility = ""; MapillaryPlayer.resize(); //window.dispatchEvent(new Event('resize')); // document.querySelector(".mapillary-canvas").style.; // mapillary-canvas } } else { GOOGLE_MAPS_CANVAS.style.visibility = "hidden"; if (nextPlayer == "Kakao") { KAKAO_MAPS_CANVAS.style.visibility = ""; } else if (nextPlayer == "Yandex") { YANDEX_MAPS_CANVAS.style.visibility = ""; } else if (nextPlayer == "Baidu" || nextPlayer == "Youtube" || nextPlayer == "Image") { BAIDU_MAPS_CANVAS.style.visibility = ""; } else if (nextPlayer == "Mapillary" || nextPlayer == "Google" ) { MAPILLARY_MAPS_CANVAS.style.visibility = ""; } else if (nextPlayer == "Bing Satellite" || nextPlayer == "Bing Streetside") { MS_MAPS_CANVAS.style.visibility = ""; } } switchCovergeButton.useGoogle = false; teleportBtn.google = false; switchCovergeButton.init = true; console.log("use Others"); } if (switchCovergeButton.useGoogle) { if (nextPlayer == "Google") { switchCovergeButton.innerHTML = "Switch to Mapillary"; satelliteSwitchButton.disabled = false; satelliteSwitchButton.style.background = "#BF40BF"; } else { switchCovergeButton.innerHTML = "Switch to " + nextPlayer; satelliteSwitchButton.disabled = true; satelliteSwitchButton.style.background = "red"; } } else { if (nextPlayer == "Google" || nextPlayer == "Baidu") { switchCovergeButton.innerHTML = "Switch to Google"; satelliteSwitchButton.disabled = true; satelliteSwitchButton.style.background = "red"; } else { switchCovergeButton.innerHTML = "Switch to Google"; satelliteSwitchButton.disabled = false; satelliteSwitchButton.style.background = "#BF40BF"; } } // if (switchCovergeButton.sat) // { // satelliteSwitchButton.disabled = true; // satelliteSwitchButton.style.background = "red"; // } // else // { // satelliteSwitchButton.disabled = false; // satelliteSwitchButton.style.background = "#BF40BF"; // } // } // else { // switchCovergeButton.useGoogle = false; // teleportBtn.google = false; // console.log("use Others"); // } // if (!(typeof Microsoft == typeof undefined) && (satelliteSwitchButton.innerHTML == "Satellite mode")) // { // console.log("called") // satelliteSwitchButton.innerHTML = "Streetview mode"; // // nextPlayer = satelliteSwitchButton.old_viewer; // if (!switchCovergeButton.useGoogle) // { // nextPlayer = satelliteSwitchButton.old_viewer; // } // else // { // nextPlayer = "Google"; // } // injectCanvas(false); // nextPlayer = nextPlayer_save; // } }); var timeMachineNewerBtn = document.createElement("Button"); timeMachineNewerBtn.classList.add("unity-btn"); timeMachineNewerBtn.id = "plus year" timeMachineNewerBtn.innerHTML = "+"; timeMachineNewerBtn.style = "visibility:hidden;width:2em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(timeMachineNewerBtn); timeMachineNewerBtn.addEventListener("click", () => { if (timeMachineBtn.index < timeMachineBtn.list.length - 1 && !timeMachineBtn.plusminusLock) { timeMachineBtn.index = timeMachineBtn.index + 1; GooglePlayer.setPano(timeMachineBtn.list[timeMachineBtn.index][0]); timeMachineBtn.innerHTML = "<font size=2>[" + (timeMachineBtn.index + 1) + "] " + timeMachineBtn.list[timeMachineBtn.index][1] + "</font>"; // console.log(timeMachineBtn.index) } GenBtnColor(); }); var timeMachineOlderBtn = document.createElement("Button"); timeMachineOlderBtn.classList.add("unity-btn"); timeMachineOlderBtn.id = "minus year" timeMachineOlderBtn.innerHTML = "-"; timeMachineOlderBtn.style = "visibility:hidden;width:2em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(timeMachineOlderBtn); timeMachineOlderBtn.addEventListener("click", () => { if (timeMachineBtn.index > 0 && !timeMachineBtn.plusminusLock) { timeMachineBtn.index = timeMachineBtn.index - 1; GooglePlayer.setPano(timeMachineBtn.list[timeMachineBtn.index][0]); timeMachineBtn.innerHTML = "<font size=2>[" + (timeMachineBtn.index + 1) + "] " + timeMachineBtn.list[timeMachineBtn.index][1] + "</font>"; // console.log(timeMachineBtn.index) } GenBtnColor(); }); function svCheck2(data, status) { let l = [] if (status === 'OK') { // console.log("OK for " + data.location.latLng + " at ID " + data.location.pano); // console.log(data.time) for (const alt of data.time) { let date = Object.values(alt).find((value) => value instanceof Date) l.push([alt.pano, date.toDateString()]); } // console.log(l); timeMachineBtn.list = l timeMachineBtn.index = l.length - 1; timeMachineBtn.innerHTML = "<font size=2>[" + (timeMachineBtn.index + 1) + "] " + timeMachineBtn.list[timeMachineBtn.index][1] + "</font>"; GenBtnColor(); timeMachineBtn.plusminusLock = false; // timeMachineOlderBtn.click() // timeMachineBtn.innerHTML = "Default Date"; } } var timeMachineBtn = document.createElement("Button"); timeMachineBtn.classList.add("unity-btn"); timeMachineBtn.id = "Date Button"; timeMachineBtn.plusminusLock = true; timeMachineBtn.panoId = 0; timeMachineBtn.index = -1; timeMachineBtn.list = []; timeMachineBtn.innerHTML = "Time Machine"; timeMachineBtn.style = "visibility:hidden;width:10em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(timeMachineBtn); timeMachineBtn.addEventListener("click", () => { // console.log(timeMachineBtn.index) if (timeMachineBtn.panoId != 0) { if(timeMachineBtn.index == -1) { svService.getPanorama({pano: timeMachineBtn.panoId}, svCheck2); } else { timeMachineBtn.index = timeMachineBtn.list.length - 1; GooglePlayer.setPano(timeMachineBtn.list[timeMachineBtn.index][0]); timeMachineBtn.innerHTML = "<font size=2>[" + (timeMachineBtn.index + 1) + "] " + timeMachineBtn.list[timeMachineBtn.index][1] + "</font>"; GenBtnColor(); } } else { timeMachineBtn.panoId = GooglePlayer.pano; svService.getPanorama({pano: timeMachineBtn.panoId}, svCheck2); } }); // Battle Royale UI optimization // let hide = true; var MinimapBtn = document.createElement("Button"); MinimapBtn.classList.add("unity-btn"); MinimapBtn.id = "Minimap Button"; MinimapBtn.innerHTML = "Minimap Style"; MinimapBtn.current = "Default"; MinimapBtn.childVisible = false; MinimapBtn.style = "visibility:hidden;width:7.25em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(MinimapBtn); MinimapBtn.addEventListener("click", () => { if (MinimapBtn.childVisible) { for (let element of document.getElementsByClassName("preset-minimap")){ element.style.visibility="hidden"; } MinimapBtn.childVisible = false; } else { for (let element of document.getElementsByClassName("preset-minimap")){ element.style.visibility=""; } MinimapBtn.childVisible = true; } }); let HeightCount = 0 for (let a of presetMinimap) { let aButton = document.createElement("Button"); aButton.id = a[1]; aButton.classList.add("preset-minimap"); aButton.classList.add("unity-btn"); aButton.innerHTML = a[1]; aButton.style = "visibility:hidden;width:7.25em;height:1.5em;position:absolute;z-index:99999;background-color: #ff69b4;border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(aButton); HeightCount++; } var OverlayBtn = document.createElement("Button"); OverlayBtn.classList.add("unity-btn"); OverlayBtn.id = "Overlay Button"; OverlayBtn.innerHTML = "Overlay"; OverlayBtn.current = "Clear"; OverlayBtn.childVisible = false; OverlayBtn.style = "visibility:hidden;width:7.25em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(OverlayBtn); OverlayBtn.addEventListener("click", () => { if (OverlayBtn.childVisible) { for (let element of document.getElementsByClassName("overlay-minimap")){ element.style.visibility = "hidden"; } OverlayBtn.childVisible = false; } else { for (let element of document.getElementsByClassName("overlay-minimap")){ element.style.visibility = ""; } OverlayBtn.childVisible = true; } }); let HeightCount2 = 0 for (let b of presetOverlay) { let bButton = document.createElement("Button"); bButton.id = b[0]; bButton.url = b[1]; bButton.loaded = false; bButton.classList.add("overlay-minimap"); bButton.classList.add("unity-btn"); bButton.innerHTML = b[0]; bButton.style = "visibility:hidden;width:7.25em;height:1.5em;position:absolute;z-index:99999;background-color: #ff69b4;border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; if (bButton.id == "Clear") { bButton.loaded = true; bButton.style.background = "#ff1493"; } document.body.appendChild(bButton); HeightCount2++; } var HelpBtn = document.createElement("Button"); HelpBtn.classList.add("unity-btn"); HelpBtn.id = "Help Button"; HelpBtn.innerHTML = "Script Help"; HelpBtn.style = "visibility:hidden;width:6em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(HelpBtn); HelpBtn.addEventListener("click", () => { window.open('https://docs.google.com/document/d/18nLXSQQLOzl4WpUgZkM-mxhhQLY6P3FKonQGp-H0fqI/edit?usp=sharing'); }); var TeleportArisBtn = document.createElement("Button"); TeleportArisBtn.classList.add("unity-btn"); TeleportArisBtn.id = "Teleport Options Button"; TeleportArisBtn.innerHTML = "Default"; TeleportArisBtn.style = "visibility:hidden;width:5.5em;height:2em;position:absolute;z-index:99999;background-color: #BF40BF;background-repeat:no-repeat;background-image:linear-gradient(180deg, #0066cc 50%, #ffcc00 50%);border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;"; document.body.appendChild(TeleportArisBtn); TeleportArisBtn.addEventListener("click", () => { if (teleportBtn.teleType == "default") { teleportBtn.teleType = "outdoor" TeleportArisBtn.innerHTML = "Official"; } else { teleportBtn.teleType = "default" TeleportArisBtn.innerHTML = "Default"; } }); var playYoutubeBtn = document.createElement("Button"); playYoutubeBtn.classList.add("unity-btn"); playYoutubeBtn.id = "Youtube Button"; playYoutubeBtn.innerHTML = "Play video"; playYoutubeBtn.style = "visibility:hidden;width:5.5em;height:2.5em;position:absolute;z-index:999999;background-color: #BF40BF;border: none;color: white;padding: none;text-align: center;vertical-align: text-top;text-decoration: none;display: inline-block;font-size: 16px;line-height: 14px;"; document.body.appendChild(playYoutubeBtn); playYoutubeBtn.addEventListener("click", () => { let iframe = document.getElementById("i_container"); iframe.style.position = "absolute"; iframe.allow = "autoplay"; let srcString = "https://www.youtube.com/embed/" + yId + "?&playlist=" + yId + "&autoplay=1&modestbranding=1&controls=0&start="; if (yTime == "0" && yEnd == "0") { } else { srcString += yTime + "&end=" + yEnd; } iframe.src = srcString; iframe.style.visibility = ""; playYoutubeBtn.innerHTML = "Play video from start"; }); console.log("Script buttons Loaded"); } function GenBtnColor() { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); if (timeMachineBtn.index == timeMachineBtn.list.length - 1) { timeMachineNewerBtn.style.backgroundColor = "red"; timeMachineNewerBtn.disabled = true; } else { timeMachineNewerBtn.style.backgroundColor = "#BF40BF"; timeMachineNewerBtn.disabled = false; } if (timeMachineBtn.index == 0) { timeMachineOlderBtn.style.backgroundColor = "red"; timeMachineOlderBtn.disabled = true; } else { timeMachineOlderBtn.style.backgroundColor = "#BF40BF"; timeMachineOlderBtn.disabled = false; } } /** * Handle Keyboard inputs */ function kBoard() { document.addEventListener('keydown', logKey); } function logKey(e) { // console.log(e.code); let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); if (e.code == "Space") { setHidden(true); } if (e.code == "Digit3") { teleportBtn.click(); } else if (e.code == "Digit4") { timeMachineOlderBtn.click(); } else if (e.code == "Digit5") { timeMachineBtn.click(); } else if (e.code == "Digit6") { timeMachineNewerBtn.click(); } else if (e.code == "Digit7") { if (mainMenuBtn.style.visibility == "hidden") { mainMenuBtn.style.visibility = ""; } else { mainMenuBtn.style.visibility = "hidden"; } } } /** * Hide or reveal the buttons, and disable buttons if such feature is not available */ function setHidden(cond) { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); if (mainMenuBtn != null) { mainMenuBtn.style.visibility = ""; mainMenuBtn.innerHTML = "<font size=2>Unity<br><font size=1>v5.2.6</font>"; mainMenuBtn.style.width = "3em" mainMenuBtn.style.backgroundPosition = ""; mainMenuBtn.backgroundColor = "" mainMenuBtn.hide = true; if (cond) { if (teleportBtn != null) { for (let element of document.getElementsByClassName("unity-btn")){ element.style.visibility = "hidden"; } } let iframe = document.getElementById("i_container"); if (iframe != null) { if (!isBattleRoyale) { iframe.src = "" } else { // TODO } } } else { for (let element of document.getElementsByClassName("unity-btn")){ if (element.id !== "Show Buttons") { element.style.visibility = "hidden"; } } } } } function setDisable(cond) { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); function setAll(cond1, cond2) { teleportMoreBtn.style.backgroundColor = cond1; teleportMoreBtn.disabled = cond2; teleportLessBtn.style.backgroundColor = cond1; teleportLessBtn.disabled = cond2; teleportDistResetBtn.style.backgroundColor = cond1; teleportDistResetBtn.disabled = cond2; switchCovergeButton.style.backgroundColor = cond1; switchCovergeButton.disabled = cond2; teleportBtn.style.backgroundColor = cond1; teleportBtn.disabled = cond2; TeleportArisBtn.style.backgroundColor = cond1; TeleportArisBtn.disabled = cond2; timeMachineBtn.style.backgroundColor = cond1; timeMachineBtn.disabled = cond2; satelliteSwitchButton.style.backgroundColor = cond1; satelliteSwitchButton.disabled = cond2; } function setMapstyle(cond1, cond2) { for (let mapDiv of document.getElementsByClassName("preset-minimap")) { if (mapDiv.id == "Borders" || mapDiv.id == "Satellite" || mapDiv.id == "Terrain" || mapDiv.id == "Hybrid" || mapDiv.id == "Custom") { mapDiv.style.backgroundColor = cond1; mapDiv.disabled = cond2; } } for (let mapDiv2 of document.getElementsByClassName("overlay-minimap")) { if (mapDiv2.id == "Coverage" || mapDiv2.id == "Official") { mapDiv2.style.backgroundColor = cond1; mapDiv2.disabled = cond2; } } } // console.log(cond) if (teleportBtn != null) { if (rtded) { setAll("red", true); setMapstyle("red", true) } else { setMapstyle("#ff69b4", false) if (cond == ms_sat_map) { setAll("red", true); } else if (cond == "NMPZ") { setAll("red", true); if (cond !== "Baidu") { satelliteSwitchButton.style.backgroundColor = "#BF40BF"; satelliteSwitchButton.disabled = false; } if (NZ) { if (ms_radius > 5000) { ms_radius = 5000; } } if (NM) { if (ms_radius > 2000) { ms_radius = 2000; } } if (NM && NZ) { if (ms_radius > 1000) { ms_radius = 1000; } } if (NM && NP && NZ) { if (ms_radius > 500) { ms_radius = 500; } } } else if (cond == "Google") { setAll("#BF40BF", false); } else if (cond === "Baidu" || cond === "Youtube" || cond === "Image" || cond == "Bing Satellite") { setAll("red", true); switchCovergeButton.style.backgroundColor = "#BF40BF"; switchCovergeButton.disabled = false; if (cond !== "Baidu") { satelliteSwitchButton.style.backgroundColor = "#BF40BF"; satelliteSwitchButton.disabled = false; } } else if (cond == "Kakao" || cond == "Yandex" || cond == "Mapillary" || cond == "Bing Streetside") { setAll("#BF40BF", false); timeMachineBtn.style.backgroundColor = "red"; timeMachineBtn.disabled = true; } // else if (cond == "Bing Satellite") { // setAll("red", true); // switchCovergeButton.style.backgroundColor = "#BF40BF"; // switchCovergeButton.disabled = false; // satelliteSwitchButton.style.backgroundColor = "#BF40BF"; // satelliteSwitchButton.disabled = false; // } } timeMachineNewerBtn.style.backgroundColor = "red"; timeMachineNewerBtn.disabled = true; timeMachineOlderBtn.style.backgroundColor = "red"; timeMachineOlderBtn.disabled = true; } } /** * This observer stays alive while the script is running */ function launchObserver() { UnityInitiate(); handleTeleport(); SyncListener(); kBoard(); console.log("Main Observer"); const OBSERVER = new MutationObserver((mutations, observer) => { detectGamePage(); }); observerCallback(OBSERVER) } function observerCallback(obs) { if (obs) { obs.observe(document.head, { attributes: true, childList: true, subtree: true }); } else { setTimeout(observerCallback, 250); } } /** * Once the Google Maps API was loaded we can do more stuff */ window.addEventListener('DOMContentLoaded', (event) => { injecter(() => { launchObserver(); }) }); const base62 = { charset: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' .split(''), encode: integer => { if (integer === 0) { return 0; } let s = []; while (integer > 0) { s = [base62.charset[integer % 62], ...s]; integer = Math.floor(integer / 62); } return s.join(''); }, decode: chars => chars.split('').reverse().reduce((prev, curr, i) => prev + (base62.charset.indexOf(curr) * (62 ** i)), 0) }; /** * Check whether the current page is a game, if so which game mode */ function detectGamePage() { if (document.querySelector(".game-layout__panorama-message") !== null && !one_reset) { one_reset = true; console.log("Hide fail to load panorama canvas"); document.querySelector(".game-layout__panorama-message").style.visibility = "hidden"; } function loadModule() { if (toLoad) { initializeCanvas(); } waitLoad(); } let toLoad = !playerLoaded && !YandexPlayer && !KakaoPlayer && !MapillaryPlayer && !MSStreetPlayer && !YANDEX_INJECTED && !KAKAO_INJECTED && !MAPILLARY_INJECTED && !MS_INJECTED const PATHNAME = window.location.pathname; if (PATHNAME.startsWith("/game/") || PATHNAME.startsWith("/challenge/")) { // console.log("Game page"); isBattleRoyale = false; isDuel = false; loadModule(); } else if (PATHNAME.startsWith("/battle-royale/")) { if (document.querySelector(".br-game-layout") == null) { // console.log("Battle Royale Lobby"); rstValues(); } else { // console.log("Battle Royale"); isBattleRoyale = true; isDuel = false; loadModule(); } } else if (PATHNAME.startsWith("/duels/") || PATHNAME.startsWith("/team-duels/")) { if (document.querySelector(".game_layout__TO_jf") == null) { // console.log("Battle Royale Lobby"); rstValues(); } else { // console.log("Duels"); isBattleRoyale = true; isDuel = true; loadModule(); } } else if (PATHNAME.startsWith("/bullseye/")) { if (document.querySelector(".game_layout__0vAWj") == null) { // console.log("Battle Royale Lobby"); rstValues(); } else { // console.log("bullseye"); isBattleRoyale = true; isBullseye = true; loadModule(); } } else if (PATHNAME.startsWith("/live-challenge/")) { if (document.querySelector(".game_layout__p7CLf") == null) { // console.log("Battle Royale Lobby"); rstValues(); } else { // console.log("bullseye"); isLiveChallenge = true; isBattleRoyale = true; loadModule(); } } else { rstValues(); // console.log("Not a Game page"); } } function rstValues() { ROUND = 0; YandexPlayer = null; KakaoPlayer = null; MapillaryPlayer = null; MSStreetPlayer = null; BAIDU_INJECTED = false; YANDEX_INJECTED = false; KAKAO_INJECTED = false; MAPILLARY_INJECTED = false; MS_INJECTED = false; nextPlayer = "Google"; nextPlayer_save = "Google"; global_lat = 0; global_lng = 0; global_panoID = null; global_BDAh = null; global_BDBh = null; global_BDID = null; yId = null; yTime = null; yEnd = null; iId = null; COMPASS = null; eventListenerAttached = false; povListenerAttached = false; playerLoaded = false; locHistory = []; one_reset = false; setHidden(true); yandex_map = false; Kakao_map = false; mmKey = 0; CURRENT_ROUND_DATA = null; ms_radius = 15000; ms_random = false; ms_birdseye = false; isDuel = false; isBattleRoyale = false; isBullseye = false; isLiveChallenge = false; BR_LOAD_KAKAO = false; BR_LOAD_YANDEX = false; BR_LOAD_MS = false; ms_sat_map = false; rtded = false; linksList = []; NM = false; NP = false; NZ = false; initBing = false; } /** * Wait for various players to load */ function waitLoad() { if (!YandexPlayer || !KakaoPlayer || !MapillaryPlayer || !MSStreetPlayer || !YANDEX_INJECTED || !KAKAO_INJECTED || !MAPILLARY_INJECTED || !MS_INJECTED) { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); if (document.querySelector(".ticket-bar_root__H8RcX") != null) { if (document.querySelector(".br-game-layout__panorama-canvas") != null) { AdjustBtnPos("-2em + 2px", "300px"); } else if (document.querySelector(".game-panorama_panorama__rdhFg") != null) { AdjustBtnPos("6em", "0em"); } else if (document.querySelector(".game-panorama_panorama__ncMwh") != null) { AdjustBtnPos("5em", "18.5em"); } else if (document.querySelector(".game-panorama_panorama__6RmkO") != null) { AdjustBtnPos("4em", "15.5em"); } else { AdjustBtnPos("4em", "0em"); } } else { if (document.querySelector(".br-game-layout__panorama-canvas") != null) { AdjustBtnPos("-6em + 2px", "300px"); } else if (document.querySelector(".game-panorama_panorama__rdhFg") != null) { AdjustBtnPos("2em", "0em"); } else if (document.querySelector(".game-panorama_panorama__ncMwh") != null) { AdjustBtnPos("1em", "18.5em"); } else if (document.querySelector(".game-panorama_panorama__6RmkO") != null) { AdjustBtnPos("0em", "15.5em"); } else { AdjustBtnPos("0em", "0em"); } } setTimeout(waitLoad, 250); } else { checkRound(); } } /** * Checks for round changes */ function checkRound() { // console.log("Check Round"); let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); if (!isBattleRoyale) { // console.log("Check Round"); let currentRound = getRoundFromPage(); if (ROUND != currentRound) { fire1 = true; switchCovergeButton.init = true; console.log("New round"); ROUND = currentRound; // NEW_ROUND_LOADED = true; COMPASS = null; locHistory = []; one_reset = false; getMapData(); nextButtonCallback(); } } else { getMapData(); } } /** * Add listeners if buttons have been created */ function finalDetail() { let target = document.querySelector("a[data-qa='play-same-map']"); if (target) { var div = document.createElement("div"); div.classList.add("buttons_buttons__0B3SB") document.querySelector('.result-layout_content__jAHfP').appendChild(div); for (var rd of linksList) { // console.log(rd) let cl = target.cloneNode( true ); let tx = "View R" + rd[0] + " in " + rd[1]; cl.querySelector('.button_label__kpJrA').innerHTML = tx; cl.removeAttribute('data-qa'); cl.removeAttribute('href'); cl.urlStr = rd[2]; cl.addEventListener("click", (e) => { window.open(cl.urlStr); }) cl.style = "top:10px;right:-10px;"; div.appendChild(cl); } } else { setTimeout(finalDetail, 500); } } function nextButtonCallback() { let nextButton = document.querySelector("button[data-qa='close-round-result']"); let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); if (nextButton != null && fire1) { fire1 = false; nextButton.addEventListener("click", (e) => { if (mainMenuBtn != null && !cn_tips && ROUND !== 5) { // console.log("try to show show buttons") mainMenuBtn.style.visibility = ""; } if (ROUND == 5) { console.log("Game Finished") if (linksList) { finalDetail(); } } }) let urlStr = "" if (nextPlayer !== "Google") { console.log("Clone buttons"); let clone = document.querySelector("button[data-qa='close-round-result']").cloneNode( true ); let tx = "View Location in " + nextPlayer; clone.querySelector('.button_label__kpJrA').innerHTML = tx; clone.setAttribute('id', "LinkBtn"); clone.removeAttribute('data-qa'); if (nextPlayer == "Baidu") { urlStr = "https://map.baidu.com/?panotype=street&pid=" + global_BDID + "&panoid=" + global_BDID + "&from=api"; } else if (nextPlayer == "Youtube") { urlStr = "https://www.youtube.com/watch?v=" + yId; } else if (nextPlayer == "Image") { urlStr = iId; } else if (nextPlayer == "Kakao") { urlStr = "https://map.kakao.com/link/roadview/" + global_lat + "," + global_lng; } else if (nextPlayer == "Mapillary") { urlStr = "https://www.mapillary.com/app/?pKey=" + mmKey + "&focus=photo"; } else if (nextPlayer == "Yandex") { urlStr = "https://yandex.com/maps/?&panorama%5Bdirection%5D=16%2C0&panorama%5Bpoint%5D=" + global_lng + "%2C" + global_lat; } else if (nextPlayer == "Bing Satellite" || nextPlayer == "Bing Streetside") { urlStr = "https://bing.com/maps/default.aspx?cp=" + global_lat + "~" + global_lng + "&lvl=20&style=r"; } clone.addEventListener("click", (e) => { window.open(urlStr); }) if (ROUND == 5) { clone.style = "top:10px;"; } else { clone.style = "right:-10px;"; } linksList.push([ROUND, nextPlayer, urlStr]); document.querySelector('.round-result_actions__5j26U').appendChild(clone); } } else { setTimeout(nextButtonCallback, 1000); } } function guessButtonCallback() { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); let guessButton = document.querySelector("button[data-qa='perform-guess']"); if (guessButton != null) { guessButton.addEventListener("click", (e) => { if (mainMenuBtn != null) { console.log("try to hide show buttons") mainMenuBtn.style.visibility = "hidden"; setHidden(true); } }) } else { setTimeout(guessButtonCallback, 500); } } /** * Load different streetview players */ function loaderChecker(data) { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); if (data.includes("A United World") || data.includes("A Unity World") || data.includes("Unity Test") || data.includes("Unity Special Edition")) { console.log("Complete Map"); data = "Yandex Bing Streetside Kakao"; } if (data.includes("Yandex")) { console.log("Yandex Map"); if (data == "Yandex Bing Streetside Kakao") { yandex_map = false; } else { yandex_map = true; } injectYandexScript().then(() => { console.log("Ready to inject Yandex player"); injectYandexPlayer(); }).catch((error) => { console.log(error); }); BR_LOAD_YANDEX = true; } else { console.log("Not Yandex map"); YANDEX_INJECTED = true; YandexPlayer = "YD"; } if (data.includes("Bing Streetside") || data.includes("Bing Satellite") || (sessionStorage.getItem('Satellite') == "T" && !rtded)) { if (data.includes("Bing Satellite")) { ms_sat_map = true; let tempRad = data.split("Bing Satellite")[1]; if (/\d/.test(tempRad)) { ms_radius = parseInt(tempRad.replace(/\D/g,'')) * 1000; } if (tempRad.includes("Birdseye")) { ms_birdseye = true; } if (tempRad.includes("Random")) { ms_random = true; } } console.log("Bing Map"); injectMSPlayer(); initBing = true; BR_LOAD_MS = true; } else { console.log("Not Bing map"); MS_INJECTED = true; MSStreetPlayer = "MS"; } if (data.includes("Kakao")) { console.log("Kakao Map"); if (data == "Yandex Bing Streetside Kakao") { Kakao_map = false; } else { Kakao_map = true; } injectKakaoScript().then(() => { console.log("Ready to inject Kakao player"); }).catch((error) => { console.log(error); }); BR_LOAD_KAKAO = true; } else{ KAKAO_INJECTED = true; KakaoPlayer = "KK"; console.log("Not Kakao map"); } if (!data.includes("China Tips for each province")) { cn_tips = false; mainMenuBtn.style.visibility = ""; setHidden(false); } else { cn_tips = true; guaranteeUI(); } } function loadPlayers() { let mapBounds; playerLoaded = true; injectContainer(); getSeed().then((data) => { // console.log(data) let map_name = "Default" if (typeof data.isRated !== 'undefined') { rtded = data.isRated; } if (typeof data.options.isRated !== 'undefined') { rtded = data.options.isRated; } if (rtded) { map_name = "Public Game"; } else { if (!isBattleRoyale) { mapBounds = [data.bounds.max.lat, data.bounds.max.lng, data.bounds.min.lat, data.bounds.min.lng]; map_name = data.mapName; } else { if (isBullseye) { mapBounds = [data.boundingBox.max.lat, data.boundingBox.max.lng, data.boundingBox.min.lat, data.boundingBox.min.lng]; map_name = data.mapName; } else if (isDuel) { mapBounds = [data.mapBounds.max.lat, data.mapBounds.max.lng, data.mapBounds.min.lat, data.mapBounds.min.lng]; map_name = data.options.map.name; } else if (isLiveChallenge) { mapBounds = [data.mapBounds.max.lat, data.mapBounds.max.lng, data.mapBounds.min.lat, data.mapBounds.min.lng]; map_name = data.mapName; } else { map_name = "Unity Test"; } } } if (mapBounds) { ms_radius = magic_formula(mapBounds); // console.log(ms_radius / 1000) } loaderChecker(map_name) }).catch((error) => { console.log(error); }); } function guaranteeUI() { // console.log("UI") if (document.getElementById("GH-ui") !== null) { document.getElementById("GH-ui").style.display = "block"; } else { setTimeout(guaranteeUI, 500); } } /** * Handles Return to start and undo */ function handleReturnToStart() { let rtsButton = document.querySelector("button[data-qa='return-to-start']"); console.log("Handle Return to start"); rtsButton.addEventListener("click", (e) => { if (nextPlayer !== "Baidu") { goToLocation(true); } else { document.getElementById("i_container").src = "https://map.baidu.com/?panotype=street&pid=" + global_BDID + "&panoid=" + global_BDID + "&from=api"; } const elementClicked = e.target; elementClicked.setAttribute('listener', 'true'); console.log("Return to start"); }); guessButtonCallback(); // setTimeout(function () {goToLocation();}, 1000); } function handleUndo() { let undoButton = document.querySelector("button[data-qa='undo-move']"); console.log("Handle undo"); undoButton.addEventListener("click", (e) => { if (locHistory.length > 0) { goToUndoMove(); console.log("Undo Move"); } }) } /** * Load game information */ function satCallback() { // console.log("Sat callback") if (typeof MSStreetPlayer.entities !== typeof undefined && typeof Microsoft.Maps !== typeof undefined) { goToLocation(false); } else { setTimeout(satCallback, 250); } } function kakaoCallback() { console.log("Kakao callback") if (typeof kakao.maps !== typeof undefined) { goToLocation(true); setTimeout(function () {goToLocation(true);}, 3000); } else { setTimeout(satCallback, 250); } } function modularget(data) { if (data) { locationCheck(data); if (nextPlayer == "Kakao") { kakaoCallback(); } else { goToLocation(true); } handleMinimapCallback(); handleButtons(); } } function getMapData() { // myHighlight("Seed data"); getSeed().then((data) => { let switchCovergeButton = document.getElementById("switch"); let mainMenuBtn = document.getElementById("Show Buttons") if (isBattleRoyale) { if (data.status == "Finished" || typeof data.gameId == typeof undefined) { // console.log("Battle Royale Lobby"); } else { let origin = false; if (!CURRENT_ROUND_DATA) { CURRENT_ROUND_DATA = data origin = true; } if (origin || !(data.currentRoundNumber === CURRENT_ROUND_DATA.currentRoundNumber)) { // myHighlight("Battle Royale New round"); switchCovergeButton.init = true; // NEW_ROUND_LOADED = true; COMPASS = null; locHistory = []; one_reset = false; setHidden(false); if (!origin) { CURRENT_ROUND_DATA = data; } modularget(data); } } } else { if (!cn_tips) { mainMenuBtn.style.visibility = ""; } else { mainMenuBtn.style.visibility = "hidden"; AdjustBtnPos("14em", "0em"); } modularget(data); } }).catch((error) => { console.log(error); }); } function handleMinimapCallback() { let trueCond = true; let timeoutTime = 250; if (isBattleRoyale) { if (isDuel) { if (document.querySelector(".overlay_overlay__AR02x")) { trueCond = false; } else { trueCond = true; } } else { if (document.querySelector(".popup__content")) { trueCond = false; } else { trueCond = true; } } timeoutTime = 2500; } if (trueCond) { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); let cur = MinimapBtn.current; // console.log(cur) for (let mapDiv of document.getElementsByClassName("preset-minimap")){ if (cur == mapDiv.id) { setTimeout(function () {mapDiv.click();}, 500); setTimeout(function () {mapDiv.click();}, 1000); setTimeout(function () {mapDiv.click();}, 3000); } } } else { setTimeout(handleMinimapCallback, timeoutTime); } } /** * Hide unnecessary buttons for non-Google coverages */ function handleButtons() { let CHECKPOINT = document.querySelector("button[data-qa='set-checkpoint']"); let ZOOM_IN = document.querySelector("button[data-qa='pano-zoom-in']"); let ZOOM_OUT = document.querySelector("button[data-qa='pano-zoom-out']"); let UNDO_MOVE = document.querySelector("button[data-qa='undo-move']"); let DEFAULT_COMPASS = document.querySelector(".compass"); let NEW_COMPASS = document.querySelector(".panorama-compass_compassContainer__MEnh0"); let RETURN_TO_START = document.querySelector("button[data-qa='return-to-start']"); let C1 = (CHECKPOINT !== null); let C2 = (ZOOM_IN !== null); let C3 = (ZOOM_OUT !== null); let C4 = (UNDO_MOVE !== null); let C5 = (DEFAULT_COMPASS !== null); let C6 = (NEW_COMPASS !== null); let C7 = (RETURN_TO_START !== null); let waitCond = C5 || C6; let cpCond = true; let comCond = true; if (!NM) { cpCond = C1 && C4 && C7; } if (!NZ) { comCond = C2 && C3; } function moduleButtons(cond) { if (!NM) { CHECKPOINT.style.visibility = cond; UNDO_MOVE.style.visibility = cond; } if (!NZ) { ZOOM_IN.style.visibility = cond; ZOOM_OUT.style.visibility = cond; } if (C5) { DEFAULT_COMPASS.style.visibility = cond; } if (C6) { NEW_COMPASS.style.visibility = cond; } } if (waitCond && cpCond && comCond) { console.log("Handle Buttons"); if (nextPlayer === "Google") { moduleButtons(""); } else if (nextPlayer === "Baidu" || nextPlayer === "Youtube" || nextPlayer === "Image" || nextPlayer === "Bing Satellite") { moduleButtons("hidden"); } else if (nextPlayer === "Yandex" || nextPlayer === "Kakao" || nextPlayer === "Mapillary" || nextPlayer === "Bing Streetside") { moduleButtons("hidden"); if (nextPlayer === "Yandex" || nextPlayer === "Kakao") { if (C5) { DEFAULT_COMPASS.style.visibility = ""; } if (C6) { NEW_COMPASS.style.visibility = ""; } } if (!NM) { UNDO_MOVE.style.visibility = ""; handleUndo(); } } if (!NM) { handleReturnToStart(); } } else { setTimeout(handleButtons, 250); } } /** * Check which player to use for the next location */ function locationCheck(data) { // console.log(data); let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); let round; if (isBattleRoyale) { if (isDuel || isBullseye || isLiveChallenge) { round = data.rounds[data.currentRoundNumber - 1].panorama; } else { round = data.rounds[data.currentRoundNumber - 1]; } } else { round = data.rounds[data.round - 1]; } global_lat = round.lat; global_lng = round.lng; global_panoID = round.panoId; global_heading = round.heading; global_pitch = round.pitch; nextPlayer = "Google"; // if (ms_sat_map) // { // nextPlayer = "Bing Satellite"; // } if (global_panoID) { let locInfo; if (isBullseye || isLiveChallenge) { locInfo = global_panoID; } else { locInfo = hex2a(global_panoID); } // console.log(locInfo) if (locInfo.substring(0, 3) == "YTB") { nextPlayer = "Youtube"; let lengths = [3, 11, 4, 4]; let toPiece = lengths.map((p => i => locInfo.slice(p, p += i))(0)); let fullID = locInfo.substring(3).split('START'); yId = toPiece[1]; yTime = Number(toPiece[2]); yEnd = Number(toPiece[3]); } else { let mapType = locInfo.substring(0, 5); // panoId unchanged if (mapType === "YDMAP" ) { nextPlayer = "Yandex"; } else if (mapType === "KKMAP" ) { nextPlayer = "Kakao"; } // New panoId formats else if (mapType === "BAIDU" ) { nextPlayer = "Baidu"; let lengths = [5, 7, 7, 3]; let toPiece = lengths.map((p => i => locInfo.slice(p, p += i))(0)); let panoId1 = base62.decode(toPiece[1]).toString().substring(1); let panoId2 = base62.decode(toPiece[2]).toString().substring(1); global_BDID = panoId1 + panoId2 + toPiece[3] } else if (mapType === "MAPIL") { nextPlayer = "Mapillary"; mmKey = locInfo.substring(5).replace(/\D/g,''); } else if (mapType === "IMAGE") { nextPlayer = "Image"; let lengths = [5, 4, 4, 7, 2]; let toPiece = lengths.map((p => i => locInfo.slice(p, p += i))(0)); iId = "https://i.ibb.co/" + toPiece[3] + "/" + toPiece[1] + "." + toPiece[2].replace(/[^0-9a-z]/gi, '') } else if (mapType === "BINGM" ) { nextPlayer = "Bing Streetside"; } else if (mapType === "SATEL" ) { nextPlayer = "Bing Satellite"; ms_radius = parseInt(locInfo.substring(5).replace(/\D/g,'')) * 1000; } // legacy panoId formats support else if (mapType === "BDMAP") { nextPlayer = "Baidu"; let coord = locInfo.substring(5); if(coord.includes('BDAh')) { global_BDID = coord.split('BDAh')[0].replace("panoId",""); let tem = coord.split('BDAh')[1]; global_BDAh = tem.split('BDBh')[0]; global_BDBh = tem.split('BDBh')[1]; } else { global_BDID = coord.replace("panoId",""); } } else if (mapType === "MLMAP") { nextPlayer = "Mapillary"; mmKey = locInfo.substring(5); } else { nextPlayer = "Google"; // GooglePlayer.setPano(locInfo); } } } else { if (Kakao_map) { nextPlayer = "Kakao"; } else if (yandex_map) { nextPlayer = "Yandex"; } else { nextPlayer = "Google"; } } // if ( krCoordinates[0] > global_lat && krCoordinates[2] < global_lat && krCoordinates[1] < global_lng && krCoordinates[3] > global_lng) // { // nextSecondaryPlayer = "Kakao"; // } // else if (nextPlayer = "Mapillary") // { // nextSecondaryPlayer = "Google"; // } // else // { // nextSecondaryPlayer = "Mapillary"; // } // Disable buttons if NM, NMPZ if(!isBattleRoyale) { NM = data.forbidMoving; NP = data.forbidRotating; NZ = data.forbidZooming; } else { // console.log(data) if (isBullseye || isLiveChallenge) { NM = data.options.movementOptions.forbidMoving; NP = data.options.movementOptions.forbidRotating; NZ = data.options.movementOptions.forbidZooming; } else { NM = data.movementOptions.forbidMoving; NP = data.movementOptions.forbidRotating; NZ = data.movementOptions.forbidZooming; } } if (NM || NP || NZ) { setDisable("NMPZ"); } else { setDisable(nextPlayer); } if (nextPlayer == "Google") { switchCovergeButton.innerHTML = "Switch to Mapillary"; } else { switchCovergeButton.innerHTML = "Switch to Google"; } nextPlayer_save = nextPlayer; console.log(nextPlayer_save); // console.log("??") // console.log(sessionStorage.getItem('Satellite') == "T") if (ms_sat_map || (sessionStorage.getItem('Satellite') == "T" && nextPlayer !== "Baidu" && nextPlayer !== "Bing Streetside" && !rtded)) { nextPlayer = "Bing Satellite"; } if (nextPlayer == "Bing Satellite") { let di3 = formatDist(); satelliteSwitchButton.innerHTML = `Satellite (${di3})`; } else { satelliteSwitchButton.innerHTML = "Streeview mode"; } console.log(nextPlayer); injectCanvas(false); } /** * setID for canvas */ function initializeCanvas() { let GAME_CANVAS = ""; let DUEL_CANVAS = ""; //console.log("Is duels"); //console.log(duels); if (isBattleRoyale) { if (isDuel) { GAME_CANVAS = document.querySelector(".game-panorama_panorama__rdhFg"); DUEL_CANVAS = document.querySelector(".game-panorama_panoramaCanvas__PNKve"); } else if (isBullseye) { GAME_CANVAS = document.querySelector(".game-panorama_panorama__ncMwh"); DUEL_CANVAS = "dummy"; } else if (isLiveChallenge) { GAME_CANVAS = document.querySelector(".game-panorama_panorama__6RmkO"); DUEL_CANVAS = "dummy"; } else { GAME_CANVAS = document.querySelector(".br-game-layout__panorama-wrapper"); DUEL_CANVAS = "dummy"; } } else { GAME_CANVAS = document.querySelector(".game-layout__canvas"); DUEL_CANVAS = "dummy"; } if (GAME_CANVAS && DUEL_CANVAS) { // console.log("Canvas injected"); GAME_CANVAS.id = "player"; if (isDuel) { DUEL_CANVAS.id = "default_player"; } partialCreateMapillary = (typeof mapillary !== typeof undefined) partialCreateYandex = (typeof ymaps !== typeof undefined) partialCreateKakao = (typeof kakao !== typeof undefined) partialCreateMS = (typeof Microsoft !== typeof undefined); loadPlayers(); injectMapillaryPlayer(); } else { setTimeout(initializeCanvas, 250); } } /** * Hide or show players based on where the next location is */ function injectCanvas(cond) { if (isDuel) { canvasSwitch(cond); } else { // console.log("BING??") // console.log(BR_LOAD_MS) Google(); Baidu(); if (BR_LOAD_KAKAO) { Kakao(); } if (BR_LOAD_YANDEX) { Yandex(); } if (BR_LOAD_MS) { // console.log("Yes") Bing(cond); } Mapillary(); } ZoomControls(); } // for duels (class ID change) function canvasSwitch(cond) { console.log("canvas switch") // let cond = true; let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); let GOOGLE_MAPS_CANVAS = document.querySelector(".game-panorama_panorama__rdhFg"); let BAIDU_MAPS_CANVAS = document.getElementById("i_container"); let KAKAO_MAPS_CANVAS = document.getElementById("roadview"); let YANDEX_MAPS_CANVAS = document.querySelector(".ymaps-2-1-79-panorama-screen"); let BING_MAPS_CANVAS = document.getElementById("ms-player"); let MAPILLARY_MAPS_CANVAS = document.getElementById("mapillary-player"); // console.log([GOOGLE_MAPS_CANVAS, BAIDU_MAPS_CANVAS, MAPILLARY_MAPS_CANVAS, BR_LOAD_KAKAO, KAKAO_MAPS_CANVAS, BR_LOAD_MS, BING_MAPS_CANVAS, BR_LOAD_YANDEX, YANDEX_MAPS_CANVAS]) if (GOOGLE_MAPS_CANVAS && BAIDU_MAPS_CANVAS && MAPILLARY_MAPS_CANVAS && (!BR_LOAD_KAKAO || KAKAO_MAPS_CANVAS) && (!BR_LOAD_MS || BING_MAPS_CANVAS) && (!BR_LOAD_YANDEX || YANDEX_MAPS_CANVAS)) { document.getElementById("default_player").style.position = "absolute"; document.getElementById("default_player").className = "inactive"; BAIDU_MAPS_CANVAS.style.position = "absolute"; BAIDU_MAPS_CANVAS.className = "inactive"; MAPILLARY_MAPS_CANVAS.style.visibility = "hidden"; MAPILLARY_MAPS_CANVAS.style.position = "absolute"; MAPILLARY_MAPS_CANVAS.className = "inactive"; if (BR_LOAD_KAKAO) { KAKAO_MAPS_CANVAS.style.position = "absolute"; KAKAO_MAPS_CANVAS.className = "inactive"; } if (BR_LOAD_YANDEX) { YANDEX_MAPS_CANVAS.style.visibility = "hidden"; YANDEX_MAPS_CANVAS.style.position = "absolute"; } if (BR_LOAD_MS) { BING_MAPS_CANVAS.style.position = "absolute"; BING_MAPS_CANVAS.className = "inactive"; } if (!cond) { teleportBtn.google = false; switchCovergeButton.useGoogle = false; } if (nextPlayer === "Google") { document.getElementById("default_player").className = "game-panorama_panoramaCanvas__PNKve"; teleportBtn.google = true; switchCovergeButton.useGoogle = true; console.log("Google Duel Canvas loaded"); } else if (nextPlayer === "Baidu" || nextPlayer === "Youtube" || nextPlayer === "Image") { BAIDU_MAPS_CANVAS.className = "game-panorama_panorama__rdhFg"; console.log("Container Duel Canvas loaded"); } else if (nextPlayer === "Kakao") { if (BR_LOAD_KAKAO) { KAKAO_MAPS_CANVAS.className = "game-panorama_panorama__rdhFg"; } console.log("Kakao Duel Canvas loaded"); } else if (nextPlayer === "Yandex") { if (BR_LOAD_YANDEX) { YANDEX_MAPS_CANVAS.style.visibility = ""; } console.log("Yandex Duel Canvas loaded"); } else if (nextPlayer === "Mapillary") { MAPILLARY_MAPS_CANVAS.style.visibility = ""; MAPILLARY_MAPS_CANVAS.className = "game-panorama_panorama__rdhFg"; // MapillaryPlayer.resize(); console.log("Mapillary Duel Canvas loaded"); } else if (nextPlayer === "Bing Streetside" || nextPlayer === "Bing Satellite") { if (BR_LOAD_MS) { BING_MAPS_CANVAS.className = "game-panorama_panorama__rdhFg"; } console.log("MS Duel Canvas loaded"); } } else { setTimeout(canvasSwitch(cond), 1000); } } // for Battle Royale and classic (change visibility) function Google() { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); let GOOGLE_MAPS_CANVAS = "" if (isBattleRoyale) { if (isBullseye) { GOOGLE_MAPS_CANVAS = document.querySelector(".game-panorama_panoramaCanvas__r_5ea"); } else if (isLiveChallenge) { GOOGLE_MAPS_CANVAS = document.querySelector(".game-panorama_panoramaCanvas__gp8og"); } else { GOOGLE_MAPS_CANVAS = document.querySelector(".br-game-layout__panorama-canvas"); } } else { GOOGLE_MAPS_CANVAS = document.querySelector(".game-layout__panorama-canvas"); } if (GOOGLE_MAPS_CANVAS !== null) { if (nextPlayer === "Google") { GOOGLE_MAPS_CANVAS.style.visibility = ""; teleportBtn.google = true; switchCovergeButton.useGoogle = true; } else { GOOGLE_MAPS_CANVAS.style.visibility = "hidden"; teleportBtn.google = false; } } else { setTimeout(Google, 250); } } function Baidu() { let BAIDU_MAPS_CANVAS = document.getElementById("i_container"); // console.log("Baidu canvas"); if (BAIDU_MAPS_CANVAS !== null) { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); BAIDU_MAPS_CANVAS.style.position = "absolute"; if (nextPlayer === "Baidu" || nextPlayer === "Youtube" || nextPlayer === "Image") { BAIDU_MAPS_CANVAS.style.visibility = ""; switchCovergeButton.useGoogle = false; console.log("Container Canvas loaded"); } else { BAIDU_MAPS_CANVAS.style.visibility = "hidden"; // console.log("Container Canvas hidden"); } } else { setTimeout(Baidu, 250); } } function Kakao() { let KAKAO_MAPS_CANVAS = document.getElementById("roadview"); // console.log("Kakao canvas"); if (KAKAO_MAPS_CANVAS != null) { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); KAKAO_MAPS_CANVAS.style.position = "absolute"; if (nextPlayer === "Kakao") { KAKAO_MAPS_CANVAS.style.visibility = ""; switchCovergeButton.useGoogle = false; console.log("Kakao Canvas loaded"); } else { KAKAO_MAPS_CANVAS.style.visibility = "hidden"; // console.log("Kakao Canvas hidden"); } } else { setTimeout(Kakao, 250); } } function Yandex() { let YANDEX_MAPS_CANVAS = document.querySelector(".ymaps-2-1-79-panorama-screen"); if (YANDEX_MAPS_CANVAS != null) { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); if (isBullseye) { let div = document.getElementById("player"); YANDEX_MAPS_CANVAS.classList.add("game-panorama_panorama__ncMwh"); div.prepend(YANDEX_MAPS_CANVAS); } if (isLiveChallenge) { let div = document.getElementById("player"); YANDEX_MAPS_CANVAS.classList.add("game-panorama_panorama__6RmkO"); div.prepend(YANDEX_MAPS_CANVAS); } // console.log("Yandex canvas"); document.querySelector(".ymaps-2-1-79-panorama-screen").style.position = "absolute"; // console.log("Yandex canvas"); /* console.log(YANDEX_MAPS_CANVAS); */ if (nextPlayer === "Yandex") { YANDEX_MAPS_CANVAS.style.visibility = ""; switchCovergeButton.useGoogle = false; console.log("Yandex Canvas loaded"); } else { YANDEX_MAPS_CANVAS.style.visibility = "hidden"; console.log("Yandex Canvas hidden"); } } else { setTimeout(Yandex, 250); } } function Mapillary() { let MAPILLARY_MAPS_CANVAS = document.getElementById("mapillary-player"); if (MAPILLARY_MAPS_CANVAS != null) { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); // console.log("Mapillary canvas"); MAPILLARY_MAPS_CANVAS.style.position = "absolute"; if (nextPlayer === "Mapillary") { MAPILLARY_MAPS_CANVAS.style.visibility = ""; switchCovergeButton.useGoogle = false; console.log("Mapillary Canvas loaded"); } else { MAPILLARY_MAPS_CANVAS.style.visibility = "hidden"; // console.log("Mapillary Canvas hidden"); } } else { setTimeout(Mapillary, 250); } } function Bing(cond) { let BING_MAPS_CANVAS = document.getElementById("ms-player"); // console.log("stuck") if (BING_MAPS_CANVAS != null) { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); // console.log("Mapillary canvas"); BING_MAPS_CANVAS.style.position = "absolute"; if (nextPlayer === "Bing Satellite" || nextPlayer === "Bing Streetside") { BING_MAPS_CANVAS.style.visibility = ""; if (!cond) { switchCovergeButton.useGoogle = false; } console.log("Bing Canvas loaded"); } else { BING_MAPS_CANVAS.style.visibility = "hidden"; // console.log("Bing Canvas hidden"); } } else { setTimeout(Bing(cond), 500) } } /** * Adjust button placement */ function ZoomControls() { let style = ` .ymaps-2-1-79-panorama-gotoymaps {display: none !important;} .ymaps-2-1-79-panorama-control__zoom {top: 2rem !important; left: 2rem !important; z-Index: 0} .mapillary-bearing-indicator-container {top: 2rem !important; left: 2rem !important;} .mapillary-zoom-container {top: 6rem !important; left: 2.20rem !important;} .NavBar_MapTypeButtonContainerWrapper {visibility: hidden !important;} .bm_LocateMeControl {visibility: hidden !important;} .NavBar_Container {top: -6rem !important; left: 2rem !important;} .streetsideToolPanel {top: 4rem !important; left: 2rem !important;} .NavBarButton_Container {visibility: hidden !important;} `; // let nav = document.querySelector('.NavBar_MapTypeButtonContainerWrapper'); // let locate = document.getElementById("LocateMeButton"); // let navAll = document.getElementById("MicrosoftNav"); // if (nav) // { // nav.style.visibility = "hidden"; // } // if (locate) // { // locate.style.visibility = "hidden"; // } // if (navAll) // { // navAll.style.top = "15em" // } let style_element = document.createElement("style"); style_element.innerHTML = style; document.body.appendChild(style_element); // document.getElementById("mapillary-bearing-indicator-container").style.top = "20em" } /** * Updates the compass to match Yandex Panorama facing */ function updateCompass() { if (!COMPASS) { let compass = document.querySelector("img.compass__indicator"); if (compass != null) { COMPASS = compass; let direction = YandexPlayer.getDirection()[0] * -1; COMPASS.setAttribute("style", `transform: rotate(${direction}deg);`); } } else { let direction = YandexPlayer.getDirection()[0] * -1; COMPASS.setAttribute("style", `transform: rotate(${direction}deg);`); } } /** * Open next location in streetview player given next player and next coordinate */ function goToLocation(cond) { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); console.log("Going to location"); console.log(nextPlayer); if (nextPlayer === "Yandex") { let options = {}; YandexPlayer.moveTo([global_lat, global_lng], options); YandexPlayer.setDirection([0, 16]); YandexPlayer.setSpan([10, 67]); } else if (nextPlayer === "Baidu" || nextPlayer === "Youtube" || nextPlayer === "Image") { if (document.getElementById("i_container") !== null) { let iframe = document.getElementById("i_container"); if (nextPlayer === "Baidu") { if (!isFirefox) { iframe.style.top = '-60px'; iframe.style.height = (window.innerHeight + 200) + 'px'; } else { iframe.style.top = '-60px'; iframe.style.height = (window.innerHeight + 219) + 'px'; } if (!isFirefox) { iframe.style.right = '-55px'; iframe.style.width = (window.innerWidth + 55) + 'px'; } else { iframe.style.right = '-15px'; iframe.style.width = (window.innerWidth + 15) + 'px'; } let urlStr2 = "https://map.baidu.com/?panotype=street&pid=" + global_BDID + "&panoid=" + global_BDID + "&from=api"; let urlStr = "https://map.baidu.com/@" + global_BDAh + "," + global_BDBh + "#panoid=" + global_BDID + "&panotype=street&l=12&tn=B_NORMAL_MAP&sc=0&newmap=1&shareurl=1&pid=" + global_BDID; // console.log(urlStr) if (global_BDAh != null) { iframe.src = urlStr; } else { iframe.src = urlStr2; } iframe.style.visibility = ""; } else if (nextPlayer === "Youtube") { document.getElementById("Youtube Button").style.visibility = ""; document.getElementById("Youtube Button").innerHTML = "Play video"; iframe.allow = "autoplay"; iframe.style.visibility = "hidden"; iframe.style.top = '-60px'; iframe.style.height = (window.innerHeight + 235) + 'px'; mainMenuBtn.innerHTML = "<font size=2>Unity<br><font size=1>v5.2.6</font>"; mainMenuBtn.style.width = "3em" mainMenuBtn.style.backgroundPosition = ""; mainMenuBtn.backgroundColor = "" } else if (nextPlayer === "Image") { iframe.style.top = '0px'; iframe.style.height = (window.innerHeight) + 'px'; iframe.style.visibility = ""; iframe.src = iId; } } else { setTimeout(goToLocation(true), 250); } // let a = new BMap.Point(global_lng, global_lat); // BaiduPlayer.setPov({ heading: -40, pitch: 6 }); // BaiduPlayer.setPosition(a); } else if (nextPlayer === "Kakao") { var roadviewClient = new kakao.maps.RoadviewClient(); var position = new kakao.maps.LatLng(global_lat, global_lng); roadviewClient.getNearestPanoId(position, 500, function (panoId) { KakaoPlayer.setPanoId(panoId, position); KakaoPlayer.setViewpoint({ pan: global_heading, tilt: global_pitch, zoom: -3 }) }); } else if (nextPlayer === "Mapillary") { MapillaryPlayer.resize() MapillaryPlayer.moveTo(mmKey).then( image => { //console.log(image); }, error => { console.log(error); }); } else if (nextPlayer === "Google") { handleMapillary({lat: global_lat, lng: global_lng}, {meters: 500, limit: 500}); } else if (nextPlayer === "Bing Streetside") { let mTId = MSStreetPlayer.getMapTypeId(); if (mTId !== Microsoft.Maps.MapTypeId.streetside && mTId !== Microsoft.Maps.MapTypeId.road) { console.log("Reset Bing map type to Streetside") MSStreetPlayer = new Microsoft.Maps.Map(document.getElementById('ms-player'),{disableStreetsideAutoCoverage: true, allowHidingLabelsOfRoad: true}); } MSStreetPlayer.setOptions({disableStreetside: false}); MSStreetPlayer.setView({mapTypeId: Microsoft.Maps.MapTypeId.streetside, zoom: 18, streetsideOptions: { overviewMapMode: Microsoft.Maps.OverviewMapMode.hidden, showCurrentAddress: false, showProblemReporting: false, showExitButton: false, }, center: new Microsoft.Maps.Location(global_lat, global_lng), heading: 90, pitch: -30}); } else if (nextPlayer === "Bing Satellite") { // console.log("Bing Satellite Player") let mTId = MSStreetPlayer.getMapTypeId(); if (mTId !== Microsoft.Maps.MapTypeId.aerial && mTId !== Microsoft.Maps.MapTypeId.road) { console.log("Reset Bing map type to Satellite") MSStreetPlayer = new Microsoft.Maps.Map(document.getElementById('ms-player'),{disableStreetsideAutoCoverage: true, allowHidingLabelsOfRoad: true}); } // MSStreetPlayer = new Microsoft.Maps.Map(document.getElementById('ms-player'),{disableStreetsideAutoCoverage: true, allowHidingLabelsOfRoad: true}); let ctr = new Microsoft.Maps.Location(global_lat, global_lng) let loc_centre = {lat: global_lat, lng: global_lng}; for (var i = MSStreetPlayer.entities.getLength() - 1; i >= 0; i--) { var pushpin = MSStreetPlayer.entities.get(i); if (pushpin instanceof Microsoft.Maps.Pushpin) { MSStreetPlayer.entities.removeAt(i); } } // console.log("Satellite radius: " + (ms_radius / 1000).toString() + "km"); let latlngBounds = getBBox2(loc_centre, ms_radius); // console.log(latlngBounds) let bounds = Microsoft.Maps.LocationRect.fromLocations(new Microsoft.Maps.Location(latlngBounds[0], latlngBounds[1]), new Microsoft.Maps.Location(latlngBounds[2], latlngBounds[3])); MSStreetPlayer.setOptions({maxBounds: bounds}) // console.log(bounds) // console.log(Microsoft.Maps.LabelOverlay.hidden) if (ms_birdseye || ms_random) { let dg = 0; if (ms_random) { dg = (Math.floor(Math.random() * 4)) * 90 } Microsoft.Maps.getIsBirdseyeAvailable(ctr, dg, onResponse); function onResponse(isAvailable) { console.log("Birds-eye"); console.log(isAvailable); MSStreetPlayer.setView({mapTypeId: isAvailable ? Microsoft.Maps.MapTypeId.birdseye : Microsoft.Maps.MapTypeId.aerial, labelOverlay: Microsoft.Maps.LabelOverlay.hidden, center: ctr, zoom: 15, }) FixLink(); } } else { MSStreetPlayer.setOptions({disableStreetside: true}); MSStreetPlayer.setView({mapTypeId: Microsoft.Maps.MapTypeId.aerial, labelOverlay: Microsoft.Maps.LabelOverlay.hidden, center: ctr, zoom: 15, }) } var pin = new Microsoft.Maps.Pushpin(ctr, {}); //Add the pushpin to the map MSStreetPlayer.entities.push(pin); FixLink(); // hideNav(); } if (cond) { switchCovergeButton.lat = global_lat; switchCovergeButton.lng = global_lng; } } function FixLink() { let ele = document.querySelector('[title="Microsoft Bing"]'); // console.log("?") if (ele) { // console.log("!") ele.href = "#"; } else { setTimeout(FixLink, 250); } } /** * Handle undo using the location history of the current round */ function goToUndoMove(data) { /* console.log(global_lat); console.log(global_lng); */ let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); let options = {}; let prevStep = null; if (locHistory.length === 1) { prevStep = locHistory[0]; } else { prevStep = locHistory.pop(); } // console.log(prevStep); // console.log(locHistory) if (nextPlayer === "Yandex") { defaultPanoIdChange = false; YandexPlayer.moveTo([prevStep[0], prevStep[1]], options); YandexPlayer.setDirection([prevStep[2], prevStep[3]]); YandexPlayer.setSpan([10, 67]); switchCovergeButton.lat = prevStep[0]; switchCovergeButton.lng = prevStep[1]; } else if (nextPlayer === "Kakao") { let btn = document.querySelector("button[data-qa='undo-move']"); btn.disabled = false; btn.classList.remove('styles_disabled__2YdHD'); defaultPanoIdChange = false; let position = new kakao.maps.LatLng(prevStep[0], prevStep[1]); KakaoPlayer.setPanoId(prevStep[2], position); switchCovergeButton.lat = prevStep[0]; switchCovergeButton.lng = prevStep[1]; switchCovergeButton.useGoogle = false; teleportBtn.google = false; // console.log("Undo 1 step"); // console.log(locHistory); } else if (nextPlayer === "Mapillary" ) { // console.log(prevStep[1]); MapillaryPlayer.moveTo(prevStep[2]).then( image => { //console.log(image); switchCovergeButton.lat = prevStep[1]; switchCovergeButton.lng = prevStep[0]; }, error => { console.log(error); }); } else if (nextPlayer === "Bing Streetside") { defaultPanoIdChange = false; // console.log(locHistory); MSStreetPlayer.setView({center: new Microsoft.Maps.Location(prevStep[0], prevStep[1]),}); switchCovergeButton.lat = prevStep[0]; switchCovergeButton.lng = prevStep[1]; switchCovergeButton.heading = prevStep[2]; } } function handleTeleport() { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); if (teleportBtn) { teleportBtn.addEventListener("click", () => { if (!teleportBtn.google) { // console.log("non-Google Teleport"); let prevStep = null; if (locHistory.length === 1) { prevStep = locHistory[0]; } else { prevStep = locHistory[locHistory.length - 1]; } // console.log(locHistory); let options = {}; let place, position, pID; if (nextPlayer === "Yandex") { place = FindPointAtDistanceFrom(prevStep[0], prevStep[1], DegreesToRadians(prevStep[2]), teleportBtn.distance * 0.001); YandexPlayer.setDirection([prevStep[2], prevStep[3]]); YandexPlayer.moveTo([place.lat, place.lng], options); YandexPlayer.setSpan([10, 67]); switchCovergeButton.lat = place.lat; switchCovergeButton.lng = place.lng; } else if (nextPlayer === "Kakao") { var roadviewClient = new kakao.maps.RoadviewClient(); place = FindPointAtDistanceFrom(prevStep[0], prevStep[1], DegreesToRadians(prevStep[3]), teleportBtn.distance * 0.001); position = new kakao.maps.LatLng(place.lat, place.lng); roadviewClient.getNearestPanoId(position, 500, function (panoId) { KakaoPlayer.setPanoId(panoId, position); }); switchCovergeButton.lat = place.lat; switchCovergeButton.lng = place.lng; } else if (nextPlayer === "Mapillary" || nextPlayer === "Google") { place = FindPointAtDistanceFrom(prevStep[0], prevStep[1], DegreesToRadians(prevStep[2]), teleportBtn.distance * 0.001); handleMapillary(place, {meters: 500, limit: 500}); switchCovergeButton.lat = place.lat; switchCovergeButton.lng = place.lng; // locHistory.push([place.lat, place.lng, prevStep[2], prevStep[3]]); } else if (nextPlayer === "Bing Streetside") { // console.log("teleport") // console.log(prevStep); place = FindPointAtDistanceFrom(prevStep[0], prevStep[1], DegreesToRadians(prevStep[2]), teleportBtn.distance * 0.001); let bounds = new Microsoft.Maps.LocationRect(new Microsoft.Maps.Location(place.lat, place.lng), 1, 1); Microsoft.Maps.Map.getClosestPanorama(bounds, onSuccess, onMissingCoverage); function onSuccess(panoramaInfo) { // console.log("Coverage") // console.log([panoramaInfo.la, panoramaInfo.lo]) MSStreetPlayer.setView({center: new Microsoft.Maps.Location(panoramaInfo.la, panoramaInfo.lo), }); } function onMissingCoverage() { console.log("No Coverage") } } if (teleportBtn.distance > 150) { teleportBtn.distance = 100; teleportBtn.innerHTML = "Teleport " + teleportBtn.distance + " m"; } } }); } } function SyncListener() { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); switchCovergeButton.addEventListener("click", () => { if (switchCovergeButton.useGoogle == false) { // switchCovergeButton.useGoogle = true; console.log(nextPlayer) if (nextPlayer === "Yandex") { let options = {}; YandexPlayer.moveTo([switchCovergeButton.lat, switchCovergeButton.lng], options); YandexPlayer.setDirection([switchCovergeButton.heading, 0]); // nextPlayer = "Yandex"; } else if (nextPlayer === "Kakao") { let roadviewClient = new kakao.maps.RoadviewClient(); // console.log(switchCovergeButton.lat); let position = new kakao.maps.LatLng(switchCovergeButton.lat, switchCovergeButton.lng); roadviewClient.getNearestPanoId(position, 500, function (panoId) { KakaoPlayer.setPanoId(panoId, position); }); KakaoPlayer.setViewpoint({ pan: switchCovergeButton.heading, tilt: 0, zoom: -3 }); // nextPlayer = "Kakao"; } else if (nextPlayer === "Mapillary" || nextPlayer === "Google") { // nextPlayer = "Kakao"; handleMapillary({lat: switchCovergeButton.lat, lng: switchCovergeButton.lng}, {meters: 100, limit: 100}); } else if (nextPlayer === "Bing Streetside") { let bounds = new Microsoft.Maps.LocationRect(new Microsoft.Maps.Location(switchCovergeButton.lat, switchCovergeButton.lng), 0.01, 0.01); Microsoft.Maps.Map.getClosestPanorama(bounds, onSuccess, onMissingCoverage); function onSuccess(panoramaInfo) { MSStreetPlayer.setView({center: new Microsoft.Maps.Location(panoramaInfo.la, panoramaInfo.lo), heading: switchCovergeButton.heading }); } function onMissingCoverage() { console.log("No Coverage") } } } }); } /** * Gets the seed data for the current game * * @returns Promise with seed data as object */ function getSeed() { // console.log("getSeed called"); return new Promise((resolve, reject) => { let token = getToken(); let URL; let cred = "" const PATHNAME = window.location.pathname; if (PATHNAME.startsWith("/game/")) { URL = `https://www.geoguessr.com/api/v3/games/${token}`; } else if (PATHNAME.startsWith("/challenge/")) { URL = `https://www.geoguessr.com/api/v3/challenges/${token}/game`; } else if (PATHNAME.startsWith("/battle-royale/")) { URL = `https://game-server.geoguessr.com/api/battle-royale/${token}`; } else if (PATHNAME.startsWith("/duels/") || PATHNAME.startsWith("/team-duels/")) { URL = `https://game-server.geoguessr.com/api/duels/${token}`; } else if (PATHNAME.startsWith("/bullseye/")) { URL = `https://game-server.geoguessr.com/api/bullseye/${token}`; } else if (PATHNAME.startsWith("/live-challenge/")) { URL = `https://game-server.geoguessr.com/api/live-challenge/${token}`; } if (isBattleRoyale) { fetch(URL, { // Include credentials to GET from the endpoint credentials: 'include' }) .then((response) => response.json()) .then((data) => { resolve(data); }) .catch((error) => { reject(error); }); } else { fetch(URL) .then((response) => response.json()) .then((data) => { resolve(data); }) .catch((error) => { reject(error); }); } }); } /** * Gets the token from the current URL * * @returns token */ function getToken() { const PATHNAME = window.location.pathname; if (PATHNAME.startsWith("/game/")) { return PATHNAME.replace("/game/", ""); } else if (PATHNAME.startsWith("/challenge/")) { return PATHNAME.replace("/challenge/", ""); } else if (PATHNAME.startsWith("/battle-royale/")) { return PATHNAME.replace("/battle-royale/", ""); } else if (PATHNAME.startsWith("/duels/")) { return PATHNAME.replace("/duels/", ""); } else if (PATHNAME.startsWith("/team-duels/")) { return PATHNAME.replace("/team-duels/", ""); } else if (PATHNAME.startsWith("/bullseye/")) { return PATHNAME.replace("/bullseye/", ""); } else if (PATHNAME.startsWith("/live-challenge/")) { return PATHNAME.replace("/live-challenge/", ""); } } /** * Gets the round number from the ongoing game from the page itself * * @returns Round number */ function getRoundFromPage() { const roundData = document.querySelector("div[data-qa='round-number']"); if (roundData) { let roundElement = roundData.querySelector("div:last-child"); if (roundElement) { let round = parseInt(roundElement.innerText.charAt(0)); if (!isNaN(round) && round >= 1 && round <= 5) { return round; } } } else { return ROUND; } } /** * Injects Yandex Script */ function injectYandexScript() { return new Promise((resolve, reject) => { if (!YANDEX_INJECTED) { if (YANDEX_API_KEY === "") { console.log("No Yandex Key") reject(); } else { if (!partialCreateYandex) { const SCRIPT = document.createElement("script"); SCRIPT.type = "text/javascript"; SCRIPT.async = true; SCRIPT.src = `https://api-maps.yandex.ru/2.1/?lang=en_US&apikey=${YANDEX_API_KEY}`; document.body.appendChild(SCRIPT); SCRIPT.onload = () => { ymaps.ready(() => { YANDEX_INJECTED = true; myHighlight("Yandex API Loaded"); resolve(); }); } } else { YANDEX_INJECTED = true; resolve(); } } } else { resolve(); } }); } /** * Injects Yandex Player and calls handleReturnToStart */ function injectYandexPlayer() { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); let lat = 41.321861; let lng = 69.212920; let options = { "direction": [0, 16], "span": [10, 67], "controls": ["zoomControl"] }; ymaps.panorama.createPlayer("player", [lat, lng], options) .done((player) => { YandexPlayer = player; YandexPlayer.events.add("directionchange", (e) => { updateCompass(); let pov = YandexPlayer.getDirection(); if (locHistory.length > 0 && nextPlayer == "Yandex") { switchCovergeButton.heading = pov[0]; locHistory[locHistory.length - 1][2] = pov[0]; locHistory[locHistory.length - 1][3] = pov[1]; } }); YandexPlayer.events.add("panoramachange", (e) => { if (defaultPanoIdChange) { let num = YandexPlayer.getPanorama().getPosition(); let pov = YandexPlayer.getDirection(); // console.log(num); // console.log(pov); if (nextPlayer == "Yandex") { locHistory.push([num[0], num[1], pov[0], pov[1]]); switchCovergeButton.lat = num[0]; switchCovergeButton.lng = num[1]; } let btn = document.querySelector("button[data-qa='undo-move']"); if (locHistory.length > 1) { btn.disabled = false; btn.classList.remove('styles_disabled__2YdHD'); } // console.log(locHistory); } defaultPanoIdChange = true; }); console.log("Yandex Player injected"); }); } /** * Injects Baidu script */ function reportWindowSize() { let iframeC = document.getElementById("i_container"); if (iframeC) { if (nextPlayer == "Baidu") { iframeC.style.top = '-60px'; iframeC.style.height = (window.innerHeight + 200) + 'px'; iframeC.style.right = '-55px'; iframeC.style.width = (window.innerWidth + 55) + 'px'; } else if (nextPlayer == "Youtube") { iframeC.style.top = '-60px'; iframeC.style.height = (window.innerHeight + 235) + 'px'; } else if (nextPlayer == "Image") { iframeC.style.top = '0px'; iframeC.style.height = (window.innerHeight) + 'px'; } } } window.onresize = reportWindowSize; function injectContainer() { myHighlight("iframe container loaded") const iframe = document.createElement('iframe'); iframe.frameBorder = 0; iframe.style.position = "absolute"; iframe.id = "i_container"; if (isBattleRoyale) { if (isDuel) { iframe.className = "inactive"; } else if (isBullseye) { iframe.className = "game-panorama_panorama__ncMwh"; } else if (isLiveChallenge) { iframe.className = "game-panorama_panorama__6RmkO"; } else { iframe.className = "br-game-layout__panorama"; } } else { iframe.className = "game-layout__panorama"; } var div = document.getElementById("player"); div.style.overflow = "hidden"; if (isBullseye || isLiveChallenge) { div.prepend(iframe); } else { div.appendChild(iframe); } } // function injectMedia() { // myHighlight("Baidu API loaded") // const iframe = document.createElement('iframe'); // iframe.allow = "autoplay" // iframe.src = "https://www.youtube.com/embed/72kRM86V-dw?&autoplay=1&modestbranding=1&controls=0&start=10" // iframe.frameBorder = 0; // iframe.style.position = "absolute"; // iframe.id = "media-player"; // iframe.style="position:fixed; top: -60px; left:0; bottom: calc(100% + 175px); right:0; width:100%; height:calc(100% + 235px); border:none; margin:0; padding:0; overflow:hidden; z-index:999999;" // if (isBattleRoyale) { // if (isDuel) // { // iframe.className = "inactive" // } // else // { // iframe.className = "br-game-layout__panorama" // } // } // else { // iframe.className = "game-layout__panorama" // } // var div = document.getElementById("player"); // div.style.overflow = "hidden"; // div.appendChild(iframe); // } /** * Injects Kakao script */ function injectKakaoScript() { return new Promise((resolve, reject) => { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); if (!KAKAO_INJECTED) { if (KAKAO_API_KEY === "") { console.log("No Kakao Key") } else { let canvas = document.createElement("kmap"); if (isBattleRoyale) { if (isDuel) { canvas.innerHTML = ` <div id="roadview" class="inactive" style="zIndex: 99999,position: "absolute", top: 0, left: 0, width: '100%', height: '100%',"> </div> `; } else if (isBullseye) { canvas.innerHTML = ` <div id="roadview" class="game-panorama_panorama__ncMwh" style="zIndex: 99999,position: "absolute", top: 0, left: 0, width: '100%', height: '100%',"> </div> `; } else if (isLiveChallenge) { canvas.innerHTML = ` <div id="roadview" class="game-panorama_panorama__6RmkO" style="zIndex: 99999,position: "absolute", top: 0, left: 0, width: '100%', height: '100%',"> </div> `; } else { canvas.innerHTML = ` <div id="roadview" class="br-game-layout__panorama" style="zIndex: 99999,position: "absolute", top: 0, left: 0, width: '100%', height: '100%',"> </div> `; } } else { canvas.innerHTML = ` <div id="roadview" class="game-layout__panorama" style="zIndex: 99999,position: "absolute", top: 0, left: 0, width: '100%', height: '100%',"> </div> `; } var div = document.getElementById("player"); if (isBullseye || isLiveChallenge) { div.prepend(canvas); } else { div.appendChild(canvas); } let SCRIPT; if (!partialCreateKakao) { SCRIPT = document.createElement("script"); SCRIPT.async = true; // SCRIPT.type = "text/javascript"; SCRIPT.src = `//dapi.kakao.com/v2/maps/sdk.js?appkey=${KAKAO_API_KEY}&autoload=false`; document.body.appendChild(SCRIPT); } function drawmapKakao() { kakao.maps.load(function () { var position = new kakao.maps.LatLng(33.450701, 126.560667); let roadviewContainer = document.getElementById('roadview'); KakaoPlayer = new kakao.maps.Roadview(roadviewContainer); var panoId = 1023434522; KakaoPlayer.setPanoId(panoId, position); KAKAO_INJECTED = true; // Remove the compass from Kakao kakao.maps.event.addListener(KakaoPlayer, 'init', () => { const compassContainer = roadviewContainer.querySelector('div[id*="_box_util_"]'); if (compassContainer) compassContainer.style.display = 'none'; }); kakao.maps.event.addListener(KakaoPlayer, 'panoid_changed', function() { if (defaultPanoIdChange && KakaoPlayer) { let latlng = KakaoPlayer.getPosition(); let lat = latlng.getLat(); let lng = latlng.getLng(); let pID = KakaoPlayer.getViewpointWithPanoId(); if (nextPlayer == "Kakao" && lat != 33.45047613915499) { // console.log("push"); locHistory.push([lat, lng, pID.panoId, pID.pan]); switchCovergeButton.lat = lat; switchCovergeButton.lng = lng; switchCovergeButton.heading = pID.pan; } let btn = document.querySelector("button[data-qa='undo-move']"); if (locHistory.length > 1 && (btn != null)) { btn.disabled = false; btn.classList.remove('styles_disabled__2YdHD'); } // console.log(locHistory); } defaultPanoIdChange = true; }); kakao.maps.event.addListener(KakaoPlayer, 'viewpoint_changed', function() { // console.log("pov_listener attached"); let pID = KakaoPlayer.getViewpointWithPanoId(); if (locHistory.length > 0 && nextPlayer == "Kakao") { switchCovergeButton.heading = pID.pan; locHistory[locHistory.length - 1][3] = pID.pan; } if (GooglePlayer) { const { heading, pitch } = GooglePlayer.getPov() if ((!almostEqual(pID.pan, heading) || !almostEqual(pID.tilt, pitch)) && nextPlayer == "Kakao") { // Updating the google street view POV will update the compass GooglePlayer.setPov({ heading: pID.pan, pitch: pID.tilt }) } } // console.log(locHistory); }) }); } if (partialCreateKakao) { drawmapKakao(); } else { SCRIPT.onload = () => { drawmapKakao(); myHighlight("Kakao API Loaded"); resolve(); }; } } } else { resolve(); } }); } function injectMSPlayer() { return new Promise((resolve, reject) => { if (!MS_INJECTED) { if (MS_API_KEY === "") { let canvas = document.getElementById("player"); console.log("No MS Key") } else { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); let SCRIPT; if (!partialCreateMS) { SCRIPT = document.createElement("script"); SCRIPT.type = "text/javascript"; SCRIPT.async = true; SCRIPT.src = `https://www.bing.com/api/maps/mapcontrol?key=${MS_API_KEY}`; document.body.appendChild(SCRIPT); } let canvas = document.createElement("msmap"); if (isBattleRoyale) { if (isDuel) { canvas.innerHTML = `<div id="ms-player" class="inactive" style="zIndex: 99999, position: 'absolute', top: 0, left: 0, width: '100%', height: '100%'"></div>`; } else if (isBullseye) { canvas.innerHTML = `<div id="ms-player" class="game-panorama_panorama__ncMwh" style="zIndex: 99999, position: 'absolute', top: 0, left: 0, width: '100%', height: '100%'"></div>`; } else if (isLiveChallenge) { canvas.innerHTML = `<div id="ms-player" class="game-panorama_panorama__6RmkO" style="zIndex: 99999, position: 'absolute', top: 0, left: 0, width: '100%', height: '100%'"></div>`; } else { canvas.innerHTML = `<div id="ms-player" class="br-game-layout__panorama" style="zIndex: 99999, position: 'absolute', top: 0, left: 0, width: '100%', height: '100%'"></div>`; } } else { canvas.innerHTML = `<div id="ms-player" class="game-layout__panorama" style="zIndex: 99999, position: 'absolute', top: 0, left: 0, width: '100%', height: '100%'"></div>`; } var div = document.getElementById("player"); if (isBullseye || isLiveChallenge) { div.prepend(canvas); } else { div.appendChild(canvas); } function drawmapMS() { MSStreetPlayer = new Microsoft.Maps.Map(document.getElementById('ms-player'),{disableStreetsideAutoCoverage: true, allowHidingLabelsOfRoad: true}); MS_INJECTED = true; // MSStreetPlayer.setOptions({ // minZoom: 13 // }); Microsoft.Maps.Events.addHandler(MSStreetPlayer, 'viewchangeend', function () { updateView(MSStreetPlayer); }); function updateView(map) { let ctrm = map.getCenter(); if (nextPlayer == "Bing Streetside" && (switchCovergeButton.lat !== ctrm.latitude && switchCovergeButton.lng !== ctrm.longitude)) { let heading2 = bearing(switchCovergeButton.lat, switchCovergeButton.lng, ctrm.latitude, ctrm.longitude) // console.log("moved"); // console.log([switchCovergeButton.lat, switchCovergeButton.lng, ctrm.latitude, ctrm.longitude]) // console.log(heading2); locHistory.push([ctrm.latitude, ctrm.longitude, heading2]); switchCovergeButton.lat = ctrm.latitude; switchCovergeButton.lng = ctrm.longitude; switchCovergeButton.heading = heading2; let btn = document.querySelector("button[data-qa='undo-move']"); if (locHistory.length > 1 && (btn != null)) { btn.disabled = false; btn.classList.remove('styles_disabled__2YdHD'); } } } } if (partialCreateMS) { drawmapMS(); } else { SCRIPT.addEventListener('load', () => { myHighlight("Bing Maps API loaded"); let timeout = 0; let interval = setInterval(() => { if (timeout >= 40) { reject(); clearInterval(interval); } if (document.getElementById('ms-player') !== null && typeof Microsoft.Maps.Map !== typeof undefined) { drawmapMS(); resolve(); clearInterval(interval); } timeout += 1; }, 1000); }) } } } else { resolve(); } }); } function injectMapillaryPlayer() { return new Promise((resolve, reject) => { if (!MAPILLARY_INJECTED) { if (MAPILLARY_API_KEY === "") { let canvas = document.getElementById("player"); console.log("No Mapillary Key") } else { let [teleportBtn, teleportMoreBtn, teleportLessBtn, teleportDistResetBtn, switchCovergeButton, mainMenuBtn, timeMachineBtn, timeMachineOlderBtn, timeMachineNewerBtn, MinimapBtn, OverlayBtn, HelpBtn, TeleportArisBtn, satelliteSwitchButton] = setButtons(); let SCRIPT; if (!partialCreateMapillary) { SCRIPT = document.createElement("script"); SCRIPT.type = "text/javascript"; SCRIPT.async = true; SCRIPT.src = `https://unpkg.com/[email protected]/dist/mapillary.js`; document.body.appendChild(SCRIPT); document.querySelector('head').innerHTML += '<link href="https://unpkg.com/[email protected]/dist/mapillary.css" rel="stylesheet"/>'; } let canvas = document.createElement("mmap"); if (isBattleRoyale) { if (isDuel) { canvas.innerHTML = `<div id="mapillary-player" class="inactive" style="zIndex: 99999, position: 'absolute', top: 0, left: 0, width: '100%', height: '100%'"></div>`; } else if (isBullseye) { canvas.innerHTML = `<div id="mapillary-player" class="game-panorama_panorama__ncMwh" style="zIndex: 99999, position: 'absolute', top: 0, left: 0, width: '100%', height: '100%'"></div>`; } else if (isLiveChallenge) { canvas.innerHTML = `<div id="mapillary-player" class="game-panorama_panorama__6RmkO" style="zIndex: 99999, position: 'absolute', top: 0, left: 0, width: '100%', height: '100%'"></div>`; } else { canvas.innerHTML = `<div id="mapillary-player" class="br-game-layout__panorama" style="zIndex: 99999, position: 'absolute', top: 0, left: 0, width: '100%', height: '100%'"></div>`; } } else { canvas.innerHTML = `<div id="mapillary-player" class="game-layout__panorama" style="zIndex: 99999, position: 'absolute', top: 0, left: 0, width: '100%', height: '100%'"></div>`; } var div = document.getElementById("player"); if (isBullseye || isLiveChallenge) { div.prepend(canvas); } else { div.appendChild(canvas); } function drawMapML() { var {Viewer} = mapillary; MapillaryPlayer = new Viewer({ accessToken: MAPILLARY_API_KEY, container: 'mapillary-player', // the ID of our container defined in the HTML body }); MapillaryPlayer.on('image', async (event) => { // cnt = cnt + 1; // console.log(cnt); let image = event.image; let pos = image.originalLngLat; let cond = true; for (const element of locHistory) { if (element[2] == image.id) { cond = false; } } if (cond) { switchCovergeButton.lat = pos.lat; switchCovergeButton.lng = pos.lng; switchCovergeButton.heading = image.compassAngle; // console.log(pos); locHistory.push([pos.lat, pos.lng, image.id, image.compassAngle]); } let btn = document.querySelector("button[data-qa='undo-move']"); if (btn !== null && locHistory.length > 1) { btn.disabled = false; btn.classList.remove('styles_disabled__2YdHD'); } }); MAPILLARY_INJECTED = true; } if (partialCreateMapillary) { drawMapML(); } else { SCRIPT.addEventListener('load', () => { myHighlight("Mapillary API Loaded"); // resolve(BMap); drawMapML(); resolve(); }) } } } else { resolve(); } }); } function handleMapillary(latlng, options) { console.log("handleMapillary") handleMapillaryHelper(latlng, options).then((data) => { //console.log(data.data) let idToSet = 0; let curDist = 100000000; for (const element of data.data) { // console.log(element) if (element.hasOwnProperty("computed_geometry")) { try { let rCord = element.computed_geometry["coordinates"]; let dist = distance(latlng.lat,latlng.lng,rCord[1],rCord[0]) if (dist < curDist) { idToSet = element.id; curDist = dist } } catch (e) { console.log("Error") } } } if (idToSet !== 0) { MapillaryPlayer.moveTo(idToSet).then( image => { //console.log(image); }, error => { console.log(error); }); }}).catch((error) => { console.log(error); }); } function handleMapillaryHelper(latlng, options) { return new Promise((resolve, reject) => { // console.log("1") let bbox = getBBox(latlng, options.meters); let URL = "https://graph.mapillary.com/images?access_token={0}&fields=id,computed_geometry&bbox={1}&limit={2}".replace('{0}', MAPILLARY_API_KEY).replace('{1}', bbox).replace('{2}', options.limit) // console.log(URL) fetch(URL) .then((response) => {resolve(response.json())}) .catch((error) => {console.log(error);}); }); } /** * Minimap presets */ let water_name_only = [ { "elementType": "geometry", "stylers": [ { "visibility": "off" } ] }, { "featureType": "administrative", "stylers": [ { "visibility": "off" } ] }, { "featureType": "landscape", "stylers": [ { "visibility": "off" } ] }, { "featureType": "poi", "stylers": [ { "visibility": "off" } ] }, { "featureType": "road", "stylers": [ { "visibility": "off" } ] }, { "featureType": "transit", "stylers": [ { "visibility": "off" } ] } ] let country_name_only = [ { "elementType": "geometry", "stylers": [ { "visibility": "off" } ] }, { "featureType": "administrative", "stylers": [ { "visibility": "off" } ] }, { "featureType": "administrative.country", "elementType": "labels", "stylers": [ { "visibility": "on" } ] }, { "featureType": "landscape", "stylers": [ { "visibility": "off" } ] }, { "featureType": "poi", "stylers": [ { "visibility": "off" } ] }, { "featureType": "road", "stylers": [ { "visibility": "off" } ] }, { "featureType": "transit", "stylers": [ { "visibility": "off" } ] }, { "featureType": "water", "stylers": [ { "visibility": "off" } ] } ] let no_label_or_terrain = [ { "elementType": "geometry", "stylers": [ { "visibility": "off" } ] }, { "featureType": "administrative", "stylers": [ { "visibility": "off" } ] }, { "featureType": "landscape", "stylers": [ { "visibility": "off" } ] }, { "featureType": "poi", "stylers": [ { "visibility": "off" } ] }, { "featureType": "road", "stylers": [ { "visibility": "off" } ] }, { "featureType": "transit", "stylers": [ { "visibility": "off" } ] }, { "featureType": "water", "stylers": [ { "visibility": "on" } ] }, { "featureType": "water", "elementType": "labels", "stylers": [ { "visibility": "off" } ] } ] let no_label = [ { "elementType": "labels", "stylers": [ { "visibility": "off" } ] }, { "featureType": "administrative", "stylers": [ { "visibility": "off" } ] } ] let blank = [ { "stylers": [ { "visibility": "off" } ] } ] let thick_border = [ { "featureType": "administrative.country", "elementType": "geometry.stroke", "stylers": [ { "weight": 1.5 } ] }, { "featureType": "administrative.province", "elementType": "geometry.stroke", "stylers": [ { "weight": 3.5 } ] } ] let Indonesia = [ { "featureType": "administrative", "stylers": [ { "visibility": "off" } ] }, { "featureType": "landscape", "elementType": "labels", "stylers": [ { "visibility": "off" } ] }, { "featureType": "poi.park", "elementType": "labels", "stylers": [ { "visibility": "off" } ] }, { "featureType": "road", "elementType": "labels", "stylers": [ { "visibility": "off" } ] }, { "featureType": "transit", "elementType": "labels", "stylers": [ { "visibility": "off" } ] }, { "featureType": "water", "elementType": "labels", "stylers": [ { "visibility": "off" } ] } ] let dark = [ { "elementType": "geometry", "stylers": [ { "color": "#212121" } ] }, { "elementType": "labels.icon", "stylers": [ { "visibility": "off" } ] }, { "elementType": "labels.text.fill", "stylers": [ { "color": "#757575" } ] }, { "elementType": "labels.text.stroke", "stylers": [ { "color": "#212121" } ] }, { "featureType": "administrative", "elementType": "geometry", "stylers": [ { "color": "#757575" } ] }, { "featureType": "administrative.country", "elementType": "labels.text.fill", "stylers": [ { "color": "#9e9e9e" } ] }, { "featureType": "administrative.land_parcel", "stylers": [ { "visibility": "off" } ] }, { "featureType": "administrative.locality", "elementType": "labels.text.fill", "stylers": [ { "color": "#bdbdbd" } ] }, { "featureType": "poi", "elementType": "labels.text.fill", "stylers": [ { "color": "#757575" } ] }, { "featureType": "poi.park", "elementType": "geometry", "stylers": [ { "color": "#181818" } ] }, { "featureType": "poi.park", "elementType": "labels.text.fill", "stylers": [ { "color": "#616161" } ] }, { "featureType": "poi.park", "elementType": "labels.text.stroke", "stylers": [ { "color": "#1b1b1b" } ] }, { "featureType": "road", "elementType": "geometry.fill", "stylers": [ { "color": "#2c2c2c" } ] }, { "featureType": "road", "elementType": "labels.text.fill", "stylers": [ { "color": "#8a8a8a" } ] }, { "featureType": "road.arterial", "elementType": "geometry", "stylers": [ { "color": "#373737" } ] }, { "featureType": "road.highway", "elementType": "geometry", "stylers": [ { "color": "#3c3c3c" } ] }, { "featureType": "road.highway.controlled_access", "elementType": "geometry", "stylers": [ { "color": "#4e4e4e" } ] }, { "featureType": "road.local", "elementType": "labels.text.fill", "stylers": [ { "color": "#616161" } ] }, { "featureType": "transit", "elementType": "labels.text.fill", "stylers": [ { "color": "#757575" } ] }, { "featureType": "water", "elementType": "geometry", "stylers": [ { "color": "#000000" } ] }, { "featureType": "water", "elementType": "labels.text.fill", "stylers": [ { "color": "#3d3d3d" } ] } ] let default_preset = [] let presetMinimap = [[default_preset, "Default"], [blank, "Blank"], [water_name_only, "Oceanman"], [country_name_only, "Impossible"], [no_label_or_terrain, "Streaks"], [no_label, "Easy 5K"], [Indonesia, "POI only"], [dark, "Dark Mode"], [thick_border, "Borders"], [default_preset, "Satellite"], [default_preset, "Terrain"], [default_preset, "Hybrid"], [custom, "Custom", customMode]] let GEOJSON_INVISIBLE = { strokeOpacity: 0, fillOpacity: 0, } let presetOverlay = [["Clear",""], ["Coverage",""], ["Official",""], ["Longitude", "https://raw.githubusercontent.com/Jupaoqq/Jupaoqq.github.io/main/lonl.json"], ["Latitude", "https://raw.githubusercontent.com/Jupaoqq/Jupaoqq.github.io/main/latl.json"], ["US County","https://raw.githubusercontent.com/CodeForCary/CountyDataUSA5m/master/cb_2017_us_county_5m.json"], ["France","https://raw.githubusercontent.com/gregoiredavid/france-geojson/master/departements.geojson"], ["Time Zone", "https://raw.githubusercontent.com/treyerl/timezones/master/timezones_wVVG8.geojson"], ["UK Parliament", "https://raw.githubusercontent.com/martinjc/UK-GeoJSON/master/json/electoral/gb/wpc.json"], ["Custom", YOUR_URL]] /** * Display map per local laws and regulations */ let SEOverlay, NWOverlay, SEOverlay3; let TW = [[24.80, 119.00, 22.00, 123.20], [24.20, 119.90, 22.90, 121.85], [24.00, 120.90, 23.80, 121.20], [23.93, 121.03, 23.85, 121.15], [23.92, 121.055, 23.89, 121.10], [23.92, 121.055, 23.89, 121.10], [23.92, 121.055, 23.89, 121.10], ] let TS = [[30.40, 93.40, 28, 97.20], [29.40, 94.55, 28.20, 96.45]] let NW = [36.20, 77.70, 34.40, 80.70]