// ==UserScript== // @name CheatGuessr | GeoGuessr Cheat // @namespace http://tampermonkey.net/ // @version 1.2 // @description Extremely customizable GeoGuessr cheating client. Click 3 to open the settings menu. // @author CheatGuessr // @match https://www.geoguessr.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=geoguessr.com // @grant GM_webRequest // @license GNU AGPLv3 // @downloadURL https://update.greasyfork.icu/scripts/525302/CheatGuessr%20%7C%20GeoGuessr%20Cheat.user.js // @updateURL https://update.greasyfork.icu/scripts/525302/CheatGuessr%20%7C%20GeoGuessr%20Cheat.meta.js // ==/UserScript== let globalCoordinates = { lat: 0, lng: 0 }; let googleMapsIframe = null; let settingsModal = null; const DEFAULT_SETTINGS = { keybinds: { toggleMap: '1', newTab: '2', settings: '3', detailedLocation: '4', pinpoint: '5', nearbypinpoint: '6' }, mapPosition: 'top-left', mapSize: { width: 400, height: 300 }, blockAds: true }; const style = document.createElement('style'); style.textContent = ` .google-maps-iframe { position: fixed; z-index: 9999; border: 2px solid #333; border-radius: 4px; } .close-button { position: absolute; top: -15px; right: -15px; width: 30px; height: 30px; background: red; border: 2px solid white; border-radius: 50%; color: white; font-weight: bold; cursor: pointer; display: flex; align-items: center; justify-content: center; z-index: 10000; } .loading-indicator { position: fixed; left: 10px; padding: 5px 10px; background: rgba(0,0,0,0.7); color: white; border-radius: 4px; z-index: 9999; } .settings-modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: #1f2937; padding: 20px; border-radius: 8px; z-index: 10001; width: 600px; max-height: 80vh; overflow-y: auto; color: white; } .settings-backdrop { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 10000; } .settings-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; } .settings-section { background: #374151; padding: 15px; border-radius: 6px; } .settings-row { margin: 10px 0; } .settings-row label { display: block; margin-bottom: 5px; color: #e5e7eb; } .settings-input { width: 100%; padding: 8px; border: 1px solid #4b5563; border-radius: 4px; background: #1f2937; color: white; } .settings-button { padding: 8px 16px; border: none; border-radius: 4px; cursor: pointer; margin: 5px; background: #3b82f6; color: white; } .settings-button:hover { background: #2563eb; } `; document.head.appendChild(style); let settings = null; function loadSettings() { try { const saved = localStorage.getItem('geoGuessrHelper'); settings = saved ? JSON.parse(saved) : DEFAULT_SETTINGS; } catch (e) { settings = DEFAULT_SETTINGS; } } function saveSettings() { localStorage.setItem('geoGuessrHelper', JSON.stringify(settings)); } var originalOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url) { if (method.toUpperCase() === 'POST' && (url.startsWith('https://maps.googleapis.com/$rpc/google.internal.maps.mapsjs.v1.MapsJsInternalService/GetMetadata') || url.startsWith('https://maps.googleapis.com/$rpc/google.internal.maps.mapsjs.v1.MapsJsInternalService/SingleImageSearch'))) { this.addEventListener('load', function () { let interceptedResult = this.responseText; const pattern = /-?\d+\.\d+,-?\d+\.\d+/g; let match = interceptedResult.match(pattern)[0]; let split = match.split(","); let lat = Number.parseFloat(split[0]); let lng = Number.parseFloat(split[1]); globalCoordinates.lat = lat; globalCoordinates.lng = lng; }); } return originalOpen.apply(this, arguments); }; async function fetchLocationDetails(lat, lng) { try { const response = await fetch(`https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${lat}&lon=${lng}`); if (!response.ok) { throw new Error('Failed to fetch location details'); } const data = await response.json(); const { address } = data; const locationDetails = ` Area: ${address.neighbourhood || address.suburb || address.hamlet || 'N/A'} City: ${address.city || address.town || address.village || 'N/A'} State: ${address.state || 'N/A'} Country: ${address.country || 'N/A'} `; alert(locationDetails); } catch (error) { alert('Could not fetch location details: ' + error.message); } } function placeMarker(safeMode) { let { lat, lng } = globalCoordinates; if (safeMode) { const sway = [Math.random() > 0.5, Math.random() > 0.5]; const multiplier = Math.random() * 4; const horizontalAmount = Math.random() * multiplier; const verticalAmount = Math.random() * multiplier; sway[0] ? lat += verticalAmount : lat -= verticalAmount; sway[1] ? lng += horizontalAmount : lat -= horizontalAmount; } let element = document.querySelectorAll('[class^="guess-map_canvas__"]')[0]; if (!element) { placeMarkerStreaks(); return; } const latLngFns = { latLng: { lat: () => lat, lng: () => lng, } }; const reactKeys = Object.keys(element); const reactKey = reactKeys.find(key => key.startsWith("__reactFiber$")); const elementProps = element[reactKey]; const mapElementClick = elementProps.return.return.memoizedProps.map.__e3_.click; const mapElementPropKey = Object.keys(mapElementClick)[0]; const mapClickProps = mapElementClick[mapElementPropKey]; const mapClickPropKeys = Object.keys(mapClickProps); for (let i = 0; i < mapClickPropKeys.length; i++) { if (typeof mapClickProps[mapClickPropKeys[i]] === "function") { mapClickProps[mapClickPropKeys[i]](latLngFns); } } } function placeMarkerStreaks() { let { lat, lng } = globalCoordinates; let element = document.getElementsByClassName("region-map_mapCanvas__0dWlf")[0]; if (!element) { return; } const reactKeys = Object.keys(element); const reactKey = reactKeys.find(key => key.startsWith("__reactFiber$")); const elementProps = element[reactKey]; const mapElementClick = elementProps.return.return.memoizedProps.map.__e3_.click; const mapElementClickKeys = Object.keys(mapElementClick); const functionString = "(e.latLng.lat(),e.latLng.lng())}"; const latLngFn = { latLng: { lat: () => lat, lng: () => lng, } }; for (let i = 0; i < mapElementClickKeys.length; i++) { const curr = Object.keys(mapElementClick[mapElementClickKeys[i]]); let func = curr.find(l => typeof mapElementClick[mapElementClickKeys[i]][l] === "function"); let prop = mapElementClick[mapElementClickKeys[i]][func]; if (prop && prop.toString().slice(5) === functionString) { prop(latLngFn); } } } function mapsFromCoords() { const { lat, lng } = globalCoordinates; if (!lat || !lng) { return; } window.open(`https://maps.google.com/?output=embed&q=${lat},${lng}&ll=${lat},${lng}&z=5`); } function toggleSettingsModal() { if (settingsModal) { settingsModal.backdrop.remove(); settingsModal.modal.remove(); settingsModal = null; return; } const backdrop = document.createElement('div'); backdrop.className = 'settings-backdrop'; const modal = document.createElement('div'); modal.className = 'settings-modal'; modal.innerHTML = `