Worldguessr Cheat/Hack 2025

Always visible tiny "See Location" button in the bottom-left corner for WorldGuessr. Made by DarkShadow44. Updated 2025. Undetected.

// ==UserScript==
// @name         Worldguessr Cheat/Hack 2025
// @namespace    http://tampermonkey.net/
// @version      2.5
// @description  Always visible tiny "See Location" button in the bottom-left corner for WorldGuessr. Made by DarkShadow44. Updated 2025. Undetected.
// @author       DarkShadow44 & CheatGuessr
// @match        https://www.worldguessr.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=worldguessr.com
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let seeLocationButton = null;
    let loadingIndicator = null;
    let dotInterval = null;
    let blockAdsSetting = true;
    let initMessageElement = null; // Für die Initialisierungsnachricht

    // Funktion zum Anzeigen der Initialisierungsnachricht
    function showInitializationMessage() {
        if (initMessageElement) return; // Nur einmal anzeigen

        initMessageElement = document.createElement('div');
        initMessageElement.id = 'cheat-init-message';
        initMessageElement.innerHTML = `
            WorldGuessr Cheat Initialized, made by DarkShadow44 2025.<br>
            <span class="untdctd">✔</span>Undetected<span class="untdctd">✔</span><br>
            (Small button to see your location is at the bottom left)
        `;
        document.body.appendChild(initMessageElement);

        // Nachricht nach 5 Sekunden ausblenden und entfernen
        setTimeout(() => {
            if (initMessageElement) {
                initMessageElement.style.opacity = '0';
                // Warten bis die Opacity-Transition vorbei ist, bevor das Element entfernt wird
                setTimeout(() => {
                    if (initMessageElement && initMessageElement.parentNode) {
                        initMessageElement.parentNode.removeChild(initMessageElement);
                    }
                    initMessageElement = null; // Zurücksetzen für den Fall eines Neuladens (obwohl das Skript dann neu startet)
                }, 500); // Muss zur CSS-Transition-Dauer passen
            }
        }, 5000); // 5 Sekunden anzeigen
    }


    // Funktion zum Erstellen des "See Location"-Knopfes
    function createSeeLocationButton() {
        if (seeLocationButton) return;

        seeLocationButton = document.createElement('button');
        seeLocationButton.id = 'tiny-see-location-button';
        seeLocationButton.textContent = 'See Location';
        document.body.appendChild(seeLocationButton);

        seeLocationButton.onclick = () => {
            if (window.location.pathname !== '/banned' && window.location.pathname !== '/banned2') {
                const loc = extractLocationFromIframe();
                if (loc) {
                    window.open(`https://www.google.com/maps?q=${loc.lat},${loc.long}&z=18&output=embed`, "_blank");
                } else {
                    alert('Could not determine current location. Please ensure you are in a game round.');
                }
            } else {
                alert("This function is not available on the 'banned' page.");
            }
        };
    }

    // Banned page handler
    if (window.location.pathname === '/banned' || window.location.pathname === '/banned2') {
        const handleBannedPage = () => {
            // ... (Banned Page Code bleibt unverändert) ...
            const backdrop = document.createElement('div');
            backdrop.style.position = 'fixed';
            backdrop.style.top = '0';
            backdrop.style.left = '0';
            backdrop.style.right = '0';
            backdrop.style.bottom = '0';
            backdrop.style.backgroundColor = 'rgba(0,0,0,0.5)';
            backdrop.style.zIndex = '10000';

            const modal = document.createElement('div');
            modal.style.position = 'fixed';
            modal.style.top = '50%';
            modal.style.left = '50%';
            modal.style.transform = 'translate(-50%, -50%)';
            modal.style.backgroundColor = '#1f2937';
            modal.style.padding = '20px';
            modal.style.borderRadius = '8px';
            modal.style.color = 'white';
            modal.style.zIndex = '10001';

            const message = document.createElement('p');
            message.textContent = 'The Cheat has been detected!\nPlease Enter 10-20 random characters to bypass the anti-cheat.\n\nExample (do not use the example):\ndf89aj3n4r98nd9';
            message.style.margin = '0 0 15px 0';

            const input = document.createElement('input');
            input.type = 'text';
            input.style.width = '100%';
            input.style.marginBottom = '15px';
            input.style.padding = '8px';
            input.style.borderRadius = '4px';
            input.style.border = '1px solid #4b5563';
            input.style.backgroundColor = '#374151';
            input.style.color = 'white';

            const submitButton = document.createElement('button');
            submitButton.textContent = 'Submit';
            submitButton.style.padding = '8px 16px';
            submitButton.style.backgroundColor = '#3b82f6';
            submitButton.style.color = 'white';
            submitButton.style.border = 'none';
            submitButton.style.borderRadius = '4px';
            submitButton.style.cursor = 'pointer';
            submitButton.onmouseenter = () => submitButton.style.backgroundColor = '#2563eb';
            submitButton.onmouseleave = () => submitButton.style.backgroundColor = '#3b82f6';

            submitButton.onclick = () => {
                const chars = input.value.trim();
                if (chars) {
                    if (chars === 'df89aj3n4r98nd9') {
                        alert('You cannot use the example!');
                        return;
                    }
                    const history = JSON.parse(localStorage.getItem('mapDivClassHistory') || '[]');
                    if (history.includes(chars)) {
                        alert('You cannot reuse a previous map div name!');
                        return;
                    }
                    localStorage.removeItem('banned');
                    localStorage.setItem('mapDivClass', chars);
                    history.push(chars);
                    localStorage.setItem('mapDivClassHistory', JSON.stringify(history));
                    window.location.href = 'https://www.worldguessr.com/';
                }
            };
            modal.appendChild(message);
            modal.appendChild(input);
            modal.appendChild(submitButton);
            document.body.appendChild(backdrop);
            document.body.appendChild(modal);
        };
        handleBannedPage();
        // Initialisierungsnachricht und Knopf auch auf der Banned-Seite anzeigen
    }

    // Styles
    const style = document.createElement('style');
    style.textContent = `
        #cheat-init-message {
            position: fixed;
            top: 20px;
            left: 50%;
            transform: translateX(-50%);
            background-color: #28a745; /* Grün */
            color: white;
            padding: 12px 20px;
            border-radius: 8px;
            border: 2px solid white;
            box-shadow: 0 4px 12px rgba(0,0,0,0.2);
            z-index: 10005; /* Sehr hoch */
            text-align: center;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            font-size: 14px;
            opacity: 1;
            transition: opacity 0.5s ease-out;
        }
        #cheat-init-message .untdctd { /* Styling für die Häkchen */
            color: #c3e6cb; /* Helleres Grün für die Häkchen innerhalb des grünen Kastens */
            font-weight: bold;
            margin: 0 2px;
        }

        #tiny-see-location-button {
            position: fixed;
            bottom: 10px;
            left: 10px;
            padding: 5px 10px;
            font-size: 11px;
            background-color: #3b82f6;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            z-index: 10003;
            box-shadow: 0 1px 4px rgba(0,0,0,0.3);
            opacity: 0.9;
            transition: opacity 0.2s, background-color 0.2s;
        }
        #tiny-see-location-button:hover {
            opacity: 1;
            background-color: #2563eb;
        }

        .loading-indicator {
            position: fixed;
            left: 10px;
            bottom: 50px;
            padding: 5px 10px;
            background: rgba(0,0,0,0.7);
            color: white;
            border-radius: 4px;
            z-index: 9999;
            font-family: Arial, sans-serif;
        }
    `;
    document.head.appendChild(style);


    // Nur wenn NICHT auf der Banned-Seite, werden Adblock und Ladeindikator initialisiert
    if (window.location.pathname !== '/banned' && window.location.pathname !== '/banned2') {
        try {
            const savedSettings = JSON.parse(localStorage.getItem('worldGuessrHelperMinimal'));
            if (savedSettings && typeof savedSettings.blockAds === 'boolean') {
                blockAdsSetting = savedSettings.blockAds;
            }
        } catch (e) { /* Ignoriere Fehler, Standardwert wird verwendet */ }

        function blockAdsIfEnabled() {
            // ... (blockAdsIfEnabled Code bleibt unverändert) ...
            if (!blockAdsSetting) return;
            const adSelectors = [
                '[id^="google_ads_iframe"]',
                '[id^="worldguessr-com_"]',
                '.video-ad'
            ];
            const removeAds = () => {
                adSelectors.forEach(selector => {
                    document.querySelectorAll(selector).forEach(ad => ad.remove());
                });
            };
            removeAds();
            const observer = new MutationObserver(removeAds);
            observer.observe(document.body, { childList: true, subtree: true });
        }

        function createLoadingIndicator() {
            // ... (createLoadingIndicator Code bleibt unverändert) ...
            if (loadingIndicator) return;
            loadingIndicator = document.createElement('div');
            loadingIndicator.className = 'loading-indicator';
            loadingIndicator.style.display = 'none';
            document.body.appendChild(loadingIndicator);

            let dots = 0;
            if (dotInterval) clearInterval(dotInterval);
            dotInterval = setInterval(() => {
                dots = (dots + 1) % 4;
                if (loadingIndicator) {
                    loadingIndicator.textContent = 'Loading location' + '.'.repeat(dots);
                }
            }, 500);
        }

        function showLoadingIndicator() {
            if (loadingIndicator) loadingIndicator.style.display = 'block';
        }

        function hideLoadingIndicator() {
            if (loadingIndicator) loadingIndicator.style.display = 'none';
        }

        window.extractLocationFromIframe = function() {
            // ... (extractLocationFromIframe Code bleibt unverändert) ...
            showLoadingIndicator();
            const iframe = document.querySelector('iframe[src^="/svEmbed"]');
            if (!iframe) {
                hideLoadingIndicator();
                console.warn("WorldGuessr iframe not found.");
                return null;
            }
            try {
                const urlParams = new URLSearchParams(iframe.src.split('?')[1]);
                const lat = parseFloat(urlParams.get('lat'));
                const long = parseFloat(urlParams.get('long'));
                if (!isNaN(lat) && !isNaN(long)) {
                    hideLoadingIndicator();
                    return { lat, long };
                }
            } catch (e) {
                console.error("Error parsing iframe src:", e);
            }
            hideLoadingIndicator();
            console.warn("Could not extract lat/long from iframe.");
            return null;
        };

        createLoadingIndicator();
        blockAdsIfEnabled();
    } else {
        window.extractLocationFromIframe = function() {
            console.warn("extractLocationFromIframe called on banned page. No location to extract.");
            return null;
        };
    }

    // Funktionen und Elemente initialisieren, die immer gebraucht werden
    // (unabhängig von Banned-Status für den Knopf und die Init-Nachricht)
    function initializeUI() {
        createSeeLocationButton();
        showInitializationMessage();
    }

    if (document.body) {
        initializeUI();
    } else {
        window.addEventListener('DOMContentLoaded', initializeUI);
    }

    console.log("CheatGuessr Tiny Location Button Loaded (v2.5 - InitMsg).");

})();