Worldguessr Cheat/Hack 2025

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

  1. // ==UserScript==
  2. // @name Worldguessr Cheat/Hack 2025
  3. // @namespace http://tampermonkey.net/
  4. // @version 2.5
  5. // @description Always visible tiny "See Location" button in the bottom-left corner for WorldGuessr. Made by DarkShadow44. Updated 2025. Undetected.
  6. // @author DarkShadow44 & CheatGuessr
  7. // @match https://www.worldguessr.com/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=worldguessr.com
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. let seeLocationButton = null;
  16. let loadingIndicator = null;
  17. let dotInterval = null;
  18. let blockAdsSetting = true;
  19. let initMessageElement = null; // Für die Initialisierungsnachricht
  20.  
  21. // Funktion zum Anzeigen der Initialisierungsnachricht
  22. function showInitializationMessage() {
  23. if (initMessageElement) return; // Nur einmal anzeigen
  24.  
  25. initMessageElement = document.createElement('div');
  26. initMessageElement.id = 'cheat-init-message';
  27. initMessageElement.innerHTML = `
  28. WorldGuessr Cheat Initialized, made by DarkShadow44 2025.<br>
  29. <span class="untdctd">✔</span>Undetected<span class="untdctd">✔</span><br>
  30. (Small button to see your location is at the bottom left)
  31. `;
  32. document.body.appendChild(initMessageElement);
  33.  
  34. // Nachricht nach 5 Sekunden ausblenden und entfernen
  35. setTimeout(() => {
  36. if (initMessageElement) {
  37. initMessageElement.style.opacity = '0';
  38. // Warten bis die Opacity-Transition vorbei ist, bevor das Element entfernt wird
  39. setTimeout(() => {
  40. if (initMessageElement && initMessageElement.parentNode) {
  41. initMessageElement.parentNode.removeChild(initMessageElement);
  42. }
  43. initMessageElement = null; // Zurücksetzen für den Fall eines Neuladens (obwohl das Skript dann neu startet)
  44. }, 500); // Muss zur CSS-Transition-Dauer passen
  45. }
  46. }, 5000); // 5 Sekunden anzeigen
  47. }
  48.  
  49.  
  50. // Funktion zum Erstellen des "See Location"-Knopfes
  51. function createSeeLocationButton() {
  52. if (seeLocationButton) return;
  53.  
  54. seeLocationButton = document.createElement('button');
  55. seeLocationButton.id = 'tiny-see-location-button';
  56. seeLocationButton.textContent = 'See Location';
  57. document.body.appendChild(seeLocationButton);
  58.  
  59. seeLocationButton.onclick = () => {
  60. if (window.location.pathname !== '/banned' && window.location.pathname !== '/banned2') {
  61. const loc = extractLocationFromIframe();
  62. if (loc) {
  63. window.open(`https://www.google.com/maps?q=${loc.lat},${loc.long}&z=18&output=embed`, "_blank");
  64. } else {
  65. alert('Could not determine current location. Please ensure you are in a game round.');
  66. }
  67. } else {
  68. alert("This function is not available on the 'banned' page.");
  69. }
  70. };
  71. }
  72.  
  73. // Banned page handler
  74. if (window.location.pathname === '/banned' || window.location.pathname === '/banned2') {
  75. const handleBannedPage = () => {
  76. // ... (Banned Page Code bleibt unverändert) ...
  77. const backdrop = document.createElement('div');
  78. backdrop.style.position = 'fixed';
  79. backdrop.style.top = '0';
  80. backdrop.style.left = '0';
  81. backdrop.style.right = '0';
  82. backdrop.style.bottom = '0';
  83. backdrop.style.backgroundColor = 'rgba(0,0,0,0.5)';
  84. backdrop.style.zIndex = '10000';
  85.  
  86. const modal = document.createElement('div');
  87. modal.style.position = 'fixed';
  88. modal.style.top = '50%';
  89. modal.style.left = '50%';
  90. modal.style.transform = 'translate(-50%, -50%)';
  91. modal.style.backgroundColor = '#1f2937';
  92. modal.style.padding = '20px';
  93. modal.style.borderRadius = '8px';
  94. modal.style.color = 'white';
  95. modal.style.zIndex = '10001';
  96.  
  97. const message = document.createElement('p');
  98. 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';
  99. message.style.margin = '0 0 15px 0';
  100.  
  101. const input = document.createElement('input');
  102. input.type = 'text';
  103. input.style.width = '100%';
  104. input.style.marginBottom = '15px';
  105. input.style.padding = '8px';
  106. input.style.borderRadius = '4px';
  107. input.style.border = '1px solid #4b5563';
  108. input.style.backgroundColor = '#374151';
  109. input.style.color = 'white';
  110.  
  111. const submitButton = document.createElement('button');
  112. submitButton.textContent = 'Submit';
  113. submitButton.style.padding = '8px 16px';
  114. submitButton.style.backgroundColor = '#3b82f6';
  115. submitButton.style.color = 'white';
  116. submitButton.style.border = 'none';
  117. submitButton.style.borderRadius = '4px';
  118. submitButton.style.cursor = 'pointer';
  119. submitButton.onmouseenter = () => submitButton.style.backgroundColor = '#2563eb';
  120. submitButton.onmouseleave = () => submitButton.style.backgroundColor = '#3b82f6';
  121.  
  122. submitButton.onclick = () => {
  123. const chars = input.value.trim();
  124. if (chars) {
  125. if (chars === 'df89aj3n4r98nd9') {
  126. alert('You cannot use the example!');
  127. return;
  128. }
  129. const history = JSON.parse(localStorage.getItem('mapDivClassHistory') || '[]');
  130. if (history.includes(chars)) {
  131. alert('You cannot reuse a previous map div name!');
  132. return;
  133. }
  134. localStorage.removeItem('banned');
  135. localStorage.setItem('mapDivClass', chars);
  136. history.push(chars);
  137. localStorage.setItem('mapDivClassHistory', JSON.stringify(history));
  138. window.location.href = 'https://www.worldguessr.com/';
  139. }
  140. };
  141. modal.appendChild(message);
  142. modal.appendChild(input);
  143. modal.appendChild(submitButton);
  144. document.body.appendChild(backdrop);
  145. document.body.appendChild(modal);
  146. };
  147. handleBannedPage();
  148. // Initialisierungsnachricht und Knopf auch auf der Banned-Seite anzeigen
  149. }
  150.  
  151. // Styles
  152. const style = document.createElement('style');
  153. style.textContent = `
  154. #cheat-init-message {
  155. position: fixed;
  156. top: 20px;
  157. left: 50%;
  158. transform: translateX(-50%);
  159. background-color: #28a745; /* Grün */
  160. color: white;
  161. padding: 12px 20px;
  162. border-radius: 8px;
  163. border: 2px solid white;
  164. box-shadow: 0 4px 12px rgba(0,0,0,0.2);
  165. z-index: 10005; /* Sehr hoch */
  166. text-align: center;
  167. font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  168. font-size: 14px;
  169. opacity: 1;
  170. transition: opacity 0.5s ease-out;
  171. }
  172. #cheat-init-message .untdctd { /* Styling für die Häkchen */
  173. color: #c3e6cb; /* Helleres Grün für die Häkchen innerhalb des grünen Kastens */
  174. font-weight: bold;
  175. margin: 0 2px;
  176. }
  177.  
  178. #tiny-see-location-button {
  179. position: fixed;
  180. bottom: 10px;
  181. left: 10px;
  182. padding: 5px 10px;
  183. font-size: 11px;
  184. background-color: #3b82f6;
  185. color: white;
  186. border: none;
  187. border-radius: 5px;
  188. cursor: pointer;
  189. z-index: 10003;
  190. box-shadow: 0 1px 4px rgba(0,0,0,0.3);
  191. opacity: 0.9;
  192. transition: opacity 0.2s, background-color 0.2s;
  193. }
  194. #tiny-see-location-button:hover {
  195. opacity: 1;
  196. background-color: #2563eb;
  197. }
  198.  
  199. .loading-indicator {
  200. position: fixed;
  201. left: 10px;
  202. bottom: 50px;
  203. padding: 5px 10px;
  204. background: rgba(0,0,0,0.7);
  205. color: white;
  206. border-radius: 4px;
  207. z-index: 9999;
  208. font-family: Arial, sans-serif;
  209. }
  210. `;
  211. document.head.appendChild(style);
  212.  
  213.  
  214. // Nur wenn NICHT auf der Banned-Seite, werden Adblock und Ladeindikator initialisiert
  215. if (window.location.pathname !== '/banned' && window.location.pathname !== '/banned2') {
  216. try {
  217. const savedSettings = JSON.parse(localStorage.getItem('worldGuessrHelperMinimal'));
  218. if (savedSettings && typeof savedSettings.blockAds === 'boolean') {
  219. blockAdsSetting = savedSettings.blockAds;
  220. }
  221. } catch (e) { /* Ignoriere Fehler, Standardwert wird verwendet */ }
  222.  
  223. function blockAdsIfEnabled() {
  224. // ... (blockAdsIfEnabled Code bleibt unverändert) ...
  225. if (!blockAdsSetting) return;
  226. const adSelectors = [
  227. '[id^="google_ads_iframe"]',
  228. '[id^="worldguessr-com_"]',
  229. '.video-ad'
  230. ];
  231. const removeAds = () => {
  232. adSelectors.forEach(selector => {
  233. document.querySelectorAll(selector).forEach(ad => ad.remove());
  234. });
  235. };
  236. removeAds();
  237. const observer = new MutationObserver(removeAds);
  238. observer.observe(document.body, { childList: true, subtree: true });
  239. }
  240.  
  241. function createLoadingIndicator() {
  242. // ... (createLoadingIndicator Code bleibt unverändert) ...
  243. if (loadingIndicator) return;
  244. loadingIndicator = document.createElement('div');
  245. loadingIndicator.className = 'loading-indicator';
  246. loadingIndicator.style.display = 'none';
  247. document.body.appendChild(loadingIndicator);
  248.  
  249. let dots = 0;
  250. if (dotInterval) clearInterval(dotInterval);
  251. dotInterval = setInterval(() => {
  252. dots = (dots + 1) % 4;
  253. if (loadingIndicator) {
  254. loadingIndicator.textContent = 'Loading location' + '.'.repeat(dots);
  255. }
  256. }, 500);
  257. }
  258.  
  259. function showLoadingIndicator() {
  260. if (loadingIndicator) loadingIndicator.style.display = 'block';
  261. }
  262.  
  263. function hideLoadingIndicator() {
  264. if (loadingIndicator) loadingIndicator.style.display = 'none';
  265. }
  266.  
  267. window.extractLocationFromIframe = function() {
  268. // ... (extractLocationFromIframe Code bleibt unverändert) ...
  269. showLoadingIndicator();
  270. const iframe = document.querySelector('iframe[src^="/svEmbed"]');
  271. if (!iframe) {
  272. hideLoadingIndicator();
  273. console.warn("WorldGuessr iframe not found.");
  274. return null;
  275. }
  276. try {
  277. const urlParams = new URLSearchParams(iframe.src.split('?')[1]);
  278. const lat = parseFloat(urlParams.get('lat'));
  279. const long = parseFloat(urlParams.get('long'));
  280. if (!isNaN(lat) && !isNaN(long)) {
  281. hideLoadingIndicator();
  282. return { lat, long };
  283. }
  284. } catch (e) {
  285. console.error("Error parsing iframe src:", e);
  286. }
  287. hideLoadingIndicator();
  288. console.warn("Could not extract lat/long from iframe.");
  289. return null;
  290. };
  291.  
  292. createLoadingIndicator();
  293. blockAdsIfEnabled();
  294. } else {
  295. window.extractLocationFromIframe = function() {
  296. console.warn("extractLocationFromIframe called on banned page. No location to extract.");
  297. return null;
  298. };
  299. }
  300.  
  301. // Funktionen und Elemente initialisieren, die immer gebraucht werden
  302. // (unabhängig von Banned-Status für den Knopf und die Init-Nachricht)
  303. function initializeUI() {
  304. createSeeLocationButton();
  305. showInitializationMessage();
  306. }
  307.  
  308. if (document.body) {
  309. initializeUI();
  310. } else {
  311. window.addEventListener('DOMContentLoaded', initializeUI);
  312. }
  313.  
  314. console.log("CheatGuessr Tiny Location Button Loaded (v2.5 - InitMsg).");
  315.  
  316. })();