CheatGuessr | WorldGuessr Cheat

Extremely customizable WorldGuessr cheating client. Click 3 to open the settings menu.

Nainštalovať tento skript?
Autor skriptu navrhuje

Tiež sa vám môže páčiť CheatGuessr | GeoGuessr Cheat.

Nainštalovať tento skript

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

// ==UserScript==
// @name         CheatGuessr | WorldGuessr Cheat
// @namespace    http://tampermonkey.net/
// @version      1.6
// @description  Extremely customizable WorldGuessr cheating client. Click 3 to open the settings menu.
// @author       CheatGuessr
// @match        https://www.worldguessr.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=worldguessr.com
// @grant        none
// @license      GNU AGPLv3
// ==/UserScript==
     
    (function() {
        'use strict';

        if (window.location.pathname === '/banned') {
            const handleBannedPage = () => {
                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();
            return;
        }
     
        let googleMapsIframe = null;
        let lastLocation = null;
        let loadingIndicator = null;
        let dotInterval = null;
        let settings = null;
        let settingsModal = null;
        let mapDivClass = localStorage.getItem('mapDivClass') || 'map-div';
     
        const DEFAULT_SETTINGS = {
            keybinds: {
                toggleMap: '1',
                newTab: '2',
                settings: '3',
                detailedLocation: '4'
            },
            mapPosition: 'top-left',
            mapSize: {
                width: 400,
                height: 300
            },
            loadingPosition: 'bottom',
            refreshInterval: 1000,
            blockAds: true
        };
     
        const style = document.createElement('style');
        style.textContent = `
            .${mapDivClass} {
                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);
     
        function loadSettings() {
            try {
                const saved = localStorage.getItem('worldGuessrHelper');
                settings = saved ? JSON.parse(saved) : DEFAULT_SETTINGS;
            } catch (e) {
                settings = DEFAULT_SETTINGS;
            }
        }
     
        function saveSettings() {
            localStorage.setItem('worldGuessrHelper', JSON.stringify(settings));
        }
     
        function blockAds() {
            if (!settings.blockAds) 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() {
            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 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 = `
                <h2 style="margin-bottom: 20px">WorldGuessr Helper Settings</h2>
                <div class="settings-grid">
                    <div class="settings-section">
                        <h3>Keybinds</h3>
                        <div class="settings-row">
                            <label>Toggle Map Key</label>
                            <input type="text" class="settings-input" id="toggleMapKey" value="${settings.keybinds.toggleMap}">
                        </div>
                        <div class="settings-row">
                            <label>New Tab Key</label>
                            <input type="text" class="settings-input" id="newTabKey" value="${settings.keybinds.newTab}">
                        </div>
                        <div class="settings-row">
                            <label>Settings Key</label>
                            <input type="text" class="settings-input" id="settingsKey" value="${settings.keybinds.settings}">
                        </div>
                        <div class="settings-row">
                            <label>Detailed Location Alert</label>
                            <input type="text" class="settings-input" id="detailedLocation" value="${settings.keybinds.detailedLocation}">
                        </div>
                    </div>
                    <div class="settings-section">
                        <h3>Map Settings</h3>
                        <div class="settings-row">
                            <label>Map Position</label>
                            <select class="settings-input" id="mapPosition">
                                <option value="top-left" ${settings.mapPosition === 'top-left' ? 'selected' : ''}>Top Left</option>
                                <option value="top-right" ${settings.mapPosition === 'top-right' ? 'selected' : ''}>Top Right</option>
                                <option value="bottom-left" ${settings.mapPosition === 'bottom-left' ? 'selected' : ''}>Bottom Left</option>
                                <option value="bottom-right" ${settings.mapPosition === 'bottom-right' ? 'selected' : ''}>Bottom Right</option>
                            </select>
                        </div>
                        <div class="settings-row">
                            <label>Map Width (px)</label>
                            <input type="number" class="settings-input" id="mapWidth" value="${settings.mapSize.width}">
                        </div>
                        <div class="settings-row">
                            <label>Map Height (px)</label>
                            <input type="number" class="settings-input" id="mapHeight" value="${settings.mapSize.height}">
                        </div>
                    </div>
                </div>
                <div class="settings-section" style="margin-top: 20px">
                    <h3>Additional Settings</h3>
                    <div class="settings-row">
                        <label>
                            <input type="checkbox" id="blockAds" ${settings.blockAds ? 'checked' : ''}>
                            Block Advertisements
                        </label>
                    </div>
                </div>
                <div style="text-align: right; margin-top: 20px">
                    <button class="settings-button" id="closeSettings">Cancel</button>
                    <button class="settings-button" id="saveSettings">Save</button>
                </div>
            `;
     
            document.body.appendChild(backdrop);
            document.body.appendChild(modal);
     
            settingsModal = { backdrop, modal };
     
            document.getElementById('saveSettings').onclick = () => {
                settings.keybinds.toggleMap = document.getElementById('toggleMapKey').value;
                settings.keybinds.newTab = document.getElementById('newTabKey').value;
                settings.keybinds.settings = document.getElementById('settingsKey').value;
                settings.keybinds.detailedLocation = document.getElementById('detailedLocation').value;
                settings.mapPosition = document.getElementById('mapPosition').value;
                settings.mapSize.width = parseInt(document.getElementById('mapWidth').value);
                settings.mapSize.height = parseInt(document.getElementById('mapHeight').value);
                settings.blockAds = document.getElementById('blockAds').checked;
     
                saveSettings();
                blockAds();
                toggleSettingsModal();
            };
     
            document.getElementById('closeSettings').onclick = toggleSettingsModal;
        }
     
        function showLoadingIndicator() {
            if (loadingIndicator) {
                loadingIndicator.style.display = 'block';
                loadingIndicator.style.bottom = settings.loadingPosition === 'bottom' ? '10px' : 'auto';
                loadingIndicator.style.top = settings.loadingPosition === 'top' ? '10px' : 'auto';
            }
        }
     
        function hideLoadingIndicator() {
            if (loadingIndicator) {
                loadingIndicator.style.display = 'none';
            }
        }
     
        function extractLocationFromIframe() {
            showLoadingIndicator();
            const iframe = document.querySelector('iframe[src^="/svEmbed"]');
            if (!iframe) {
                hideLoadingIndicator();
                return null;
            }
     
            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, timestamp: new Date() };
            }
            hideLoadingIndicator();
            return null;
        }
     
        function updateMapPosition() {
            if (!googleMapsIframe) return;
     
            const pos = settings.mapPosition.split('-');
            googleMapsIframe.style.top = pos[0] === 'top' ? '10px' : 'auto';
            googleMapsIframe.style.bottom = pos[0] === 'bottom' ? '10px' : 'auto';
            googleMapsIframe.style.left = pos[1] === 'left' ? '10px' : 'auto';
            googleMapsIframe.style.right = pos[1] === 'right' ? '10px' : 'auto';
            googleMapsIframe.style.width = settings.mapSize.width + 'px';
            googleMapsIframe.style.height = settings.mapSize.height + 'px';
        }
     
        function toggleGoogleMapsIframe(location) {
            if (!location) return;
    
            if (googleMapsIframe) {
                googleMapsIframe.remove();
                googleMapsIframe = null;
                return;
            }
    
            try {
                const container = document.createElement('div');
                container.className = mapDivClass;
    
                const closeBtn = document.createElement('button');
                closeBtn.className = 'close-button';
                closeBtn.textContent = '×';// ==UserScript==
// @name         CheatGuessr | WorldGuessr Cheat
// @namespace    http://tampermonkey.net/
// @version      1.5
// @description  Extremely customizable WorldGuessr cheating client. Click 3 to open the settings menu.
// @author       CheatGuessr
// @match        https://www.worldguessr.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=worldguessr.com
// @grant        none
// @license      GNU AGPLv3
// ==/UserScript==
     
    (function() {
        'use strict';

        if (window.location.pathname === '/banned') {
            const handleBannedPage = () => {
                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;
                        }

                        localStorage.setItem('mapDivClass', chars);
                        const history = JSON.parse(localStorage.getItem('mapDivClassHistory') || '[]');
                        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();
            return;
        }
     
        let googleMapsIframe = null;
        let lastLocation = null;
        let loadingIndicator = null;
        let dotInterval = null;
        let settings = null;
        let settingsModal = null;
        let mapDivClass = localStorage.getItem('mapDivClass') || 'map-div';
     
        const DEFAULT_SETTINGS = {
            keybinds: {
                toggleMap: '1',
                newTab: '2',
                settings: '3',
                detailedLocation: '4'
            },
            mapPosition: 'top-left',
            mapSize: {
                width: 400,
                height: 300
            },
            loadingPosition: 'bottom',
            refreshInterval: 1000,
            blockAds: true
        };
     
        const style = document.createElement('style');
        style.textContent = `
            .${mapDivClass} {
                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);
     
        function loadSettings() {
            try {
                const saved = localStorage.getItem('worldGuessrHelper');
                settings = saved ? JSON.parse(saved) : DEFAULT_SETTINGS;
            } catch (e) {
                settings = DEFAULT_SETTINGS;
            }
        }
     
        function saveSettings() {
            localStorage.setItem('worldGuessrHelper', JSON.stringify(settings));
        }
     
        function blockAds() {
            if (!settings.blockAds) 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() {
            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 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 = `
                <h2 style="margin-bottom: 20px">WorldGuessr Helper Settings</h2>
                <div class="settings-grid">
                    <div class="settings-section">
                        <h3>Keybinds</h3>
                        <div class="settings-row">
                            <label>Toggle Map Key</label>
                            <input type="text" class="settings-input" id="toggleMapKey" value="${settings.keybinds.toggleMap}">
                        </div>
                        <div class="settings-row">
                            <label>New Tab Key</label>
                            <input type="text" class="settings-input" id="newTabKey" value="${settings.keybinds.newTab}">
                        </div>
                        <div class="settings-row">
                            <label>Settings Key</label>
                            <input type="text" class="settings-input" id="settingsKey" value="${settings.keybinds.settings}">
                        </div>
                        <div class="settings-row">
                            <label>Detailed Location Alert</label>
                            <input type="text" class="settings-input" id="detailedLocation" value="${settings.keybinds.detailedLocation}">
                        </div>
                    </div>
                    <div class="settings-section">
                        <h3>Map Settings</h3>
                        <div class="settings-row">
                            <label>Map Position</label>
                            <select class="settings-input" id="mapPosition">
                                <option value="top-left" ${settings.mapPosition === 'top-left' ? 'selected' : ''}>Top Left</option>
                                <option value="top-right" ${settings.mapPosition === 'top-right' ? 'selected' : ''}>Top Right</option>
                                <option value="bottom-left" ${settings.mapPosition === 'bottom-left' ? 'selected' : ''}>Bottom Left</option>
                                <option value="bottom-right" ${settings.mapPosition === 'bottom-right' ? 'selected' : ''}>Bottom Right</option>
                            </select>
                        </div>
                        <div class="settings-row">
                            <label>Map Width (px)</label>
                            <input type="number" class="settings-input" id="mapWidth" value="${settings.mapSize.width}">
                        </div>
                        <div class="settings-row">
                            <label>Map Height (px)</label>
                            <input type="number" class="settings-input" id="mapHeight" value="${settings.mapSize.height}">
                        </div>
                    </div>
                </div>
                <div class="settings-section" style="margin-top: 20px">
                    <h3>Additional Settings</h3>
                    <div class="settings-row">
                        <label>
                            <input type="checkbox" id="blockAds" ${settings.blockAds ? 'checked' : ''}>
                            Block Advertisements
                        </label>
                    </div>
                </div>
                <div style="text-align: right; margin-top: 20px">
                    <button class="settings-button" id="closeSettings">Cancel</button>
                    <button class="settings-button" id="saveSettings">Save</button>
                </div>
            `;
     
            document.body.appendChild(backdrop);
            document.body.appendChild(modal);
     
            settingsModal = { backdrop, modal };
     
            document.getElementById('saveSettings').onclick = () => {
                settings.keybinds.toggleMap = document.getElementById('toggleMapKey').value;
                settings.keybinds.newTab = document.getElementById('newTabKey').value;
                settings.keybinds.settings = document.getElementById('settingsKey').value;
                settings.keybinds.detailedLocation = document.getElementById('detailedLocation').value;
                settings.mapPosition = document.getElementById('mapPosition').value;
                settings.mapSize.width = parseInt(document.getElementById('mapWidth').value);
                settings.mapSize.height = parseInt(document.getElementById('mapHeight').value);
                settings.blockAds = document.getElementById('blockAds').checked;
     
                saveSettings();
                blockAds();
                toggleSettingsModal();
            };
     
            document.getElementById('closeSettings').onclick = toggleSettingsModal;
        }
     
        function showLoadingIndicator() {
            if (loadingIndicator) {
                loadingIndicator.style.display = 'block';
                loadingIndicator.style.bottom = settings.loadingPosition === 'bottom' ? '10px' : 'auto';
                loadingIndicator.style.top = settings.loadingPosition === 'top' ? '10px' : 'auto';
            }
        }
     
        function hideLoadingIndicator() {
            if (loadingIndicator) {
                loadingIndicator.style.display = 'none';
            }
        }
     
        function extractLocationFromIframe() {
            showLoadingIndicator();
            const iframe = document.querySelector('iframe[src^="/svEmbed"]');
            if (!iframe) {
                hideLoadingIndicator();
                return null;
            }
     
            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, timestamp: new Date() };
            }
            hideLoadingIndicator();
            return null;
        }
     
        function updateMapPosition() {
            if (!googleMapsIframe) return;
     
            const pos = settings.mapPosition.split('-');
            googleMapsIframe.style.top = pos[0] === 'top' ? '10px' : 'auto';
            googleMapsIframe.style.bottom = pos[0] === 'bottom' ? '10px' : 'auto';
            googleMapsIframe.style.left = pos[1] === 'left' ? '10px' : 'auto';
            googleMapsIframe.style.right = pos[1] === 'right' ? '10px' : 'auto';
            googleMapsIframe.style.width = settings.mapSize.width + 'px';
            googleMapsIframe.style.height = settings.mapSize.height + 'px';
        }
     
        function toggleGoogleMapsIframe(location) {
            if (!location) return;
    
            if (googleMapsIframe) {
                googleMapsIframe.remove();
                googleMapsIframe = null;
                return;
            }
    
            try {
                const container = document.createElement('div');
                container.className = mapDivClass;
    
                const closeBtn = document.createElement('button');
                closeBtn.className = 'close-button';
                closeBtn.textContent = '×';
                closeBtn.onclick = () => {
                    container.remove();
                    googleMapsIframe = null;
                };
    
                const iframe = document.createElement('iframe');
                iframe.width = '100%';
                iframe.height = '100%';
                iframe.style.border = 'none';
                iframe.src = "https://www.google.com/maps?q=" + location.lat + "," + location.long + "&z=18&output=embed";
    
                container.appendChild(closeBtn);
                container.appendChild(iframe);
                document.body.appendChild(container);
                googleMapsIframe = container;
                updateMapPosition();
            } catch (error) {
                console.error('Error creating iframe:', error);
            }
        }
     
        async function fetchLocationDetails(lat, long) {
            try {
                const response = await fetch(`https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${lat}&lon=${long}`);
                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);
            }
        }
     
        window.addEventListener('keydown', function(event) {
            event.stopPropagation();
     
            const location = extractLocationFromIframe();
            if (!location) return;
     
            if (lastLocation && (lastLocation.lat !== location.lat || lastLocation.long !== location.long)) {
                if (googleMapsIframe) {
                    toggleGoogleMapsIframe(location);
                    toggleGoogleMapsIframe(location);
                }
            }
            lastLocation = location;
     
            if (event.key === settings.keybinds.toggleMap) {
                toggleGoogleMapsIframe(location);
            } else if (event.key === settings.keybinds.newTab) {
                window.open("https://www.google.com/maps?q=" + location.lat + "," + location.long, "_blank");
            } else if (event.key === settings.keybinds.settings) {
                if (googleMapsIframe) {
                    toggleGoogleMapsIframe(location);
                }
                toggleSettingsModal();
            } else if (event.key === settings.keybinds.detailedLocation) {
                const { lat, long } = location;
                if (!lat || !long) {
                    alert('Coordinates not yet available!');
                } else {
                    fetchLocationDetails(lat, long);
                }
            }
        }, true);
     
        loadSettings();
        createLoadingIndicator();
        blockAds();
     
        setInterval(() => {
            const location = extractLocationFromIframe();
            if (!location || !lastLocation) return;
     
            if (lastLocation.lat !== location.lat || lastLocation.long !== location.long) {
                if (googleMapsIframe) {
                    toggleGoogleMapsIframe(location);
                    toggleGoogleMapsIframe(location);
                }
                lastLocation = location;
            }
        }, settings.refreshInterval);
     
        const observer = new MutationObserver(() => {
            if (!document.querySelector('iframe[src^="/svEmbed"]') && googleMapsIframe) {
                googleMapsIframe.remove();
                googleMapsIframe = null;
            }
        });
     
        observer.observe(document.body, { childList: true, subtree: true });
    })();
                closeBtn.onclick = () => {
                    container.remove();
                    googleMapsIframe = null;
                };
    
                const iframe = document.createElement('iframe');
                iframe.width = '100%';
                iframe.height = '100%';
                iframe.style.border = 'none';
                iframe.src = "https://www.google.com/maps?q=" + location.lat + "," + location.long + "&z=18&output=embed";
    
                container.appendChild(closeBtn);
                container.appendChild(iframe);
                document.body.appendChild(container);
                googleMapsIframe = container;
                updateMapPosition();
            } catch (error) {
                console.error('Error creating iframe:', error);
            }
        }
     
        async function fetchLocationDetails(lat, long) {
            try {
                const response = await fetch(`https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${lat}&lon=${long}`);
                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);
            }
        }
     
        window.addEventListener('keydown', function(event) {
            event.stopPropagation();
     
            const location = extractLocationFromIframe();
            if (!location) return;
     
            if (lastLocation && (lastLocation.lat !== location.lat || lastLocation.long !== location.long)) {
                if (googleMapsIframe) {
                    toggleGoogleMapsIframe(location);
                    toggleGoogleMapsIframe(location);
                }
            }
            lastLocation = location;
     
            if (event.key === settings.keybinds.toggleMap) {
                toggleGoogleMapsIframe(location);
                return;
            } else if (event.key === settings.keybinds.newTab) {
                window.open("https://www.google.com/maps?q=" + location.lat + "," + location.long, "_blank");
                return;
            } else if (event.key === settings.keybinds.settings) {
                if (googleMapsIframe) {
                    toggleGoogleMapsIframe(location);
                }
                toggleSettingsModal();
                return;
            } else if (event.key === settings.keybinds.detailedLocation) {
                const { lat, long } = location;
                if (!lat || !long) {
                    alert('Coordinates not yet available!');
                } else {
                    fetchLocationDetails(lat, long);
                }
                return;
            }
        }, true);
     
        loadSettings();
        createLoadingIndicator();
        blockAds();
     
        setInterval(() => {
            const location = extractLocationFromIframe();
            if (!location || !lastLocation) return;
     
            if (lastLocation.lat !== location.lat || lastLocation.long !== location.long) {
                if (googleMapsIframe) {
                    toggleGoogleMapsIframe(location);
                    toggleGoogleMapsIframe(location);
                }
                lastLocation = location;
            }
        }, settings.refreshInterval);
     
        const observer = new MutationObserver(() => {
            if (!document.querySelector('iframe[src^="/svEmbed"]') && googleMapsIframe) {
                googleMapsIframe.remove();
                googleMapsIframe = null;
            }
        });
     
        observer.observe(document.body, { childList: true, subtree: true });
    })();