Blum Autoclicker

blumgame

  1. // ==UserScript==
  2. // @name Blum Autoclicker
  3. // @version 2.4
  4. // @namespace Violentmonkey Scripts
  5. // @author mudachyo
  6. // @match https://telegram.blum.codes/*
  7. // @grant none
  8. // @icon https://cdn.prod.website-files.com/65b6a1a4a0e2af577bccce96/65ba99c1616e21b24009b86c_blum-256.png
  9. // @homepage https://github.com/mudachyo/Blum
  10. // @description blumgame
  11. // ==/UserScript==
  12.  
  13. let GAME_SETTINGS = {
  14. minBombHits: Math.floor(Math.random() * 2),
  15. minIceHits: Math.floor(Math.random() * 2) + 2,
  16. flowerSkipPercentage: Math.floor(Math.random() * 11) + 15,
  17. minDelayMs: 500,
  18. maxDelayMs: 999,
  19. autoClickPlay: false,
  20. dogsProbability: (98 + Math.random()) / 100
  21. };
  22.  
  23.  
  24. let isGamePaused = false;
  25.  
  26. try {
  27. let gameStats = {
  28. score: 0,
  29. bombHits: 0,
  30. iceHits: 0,
  31. dogsHits: 0,
  32. flowersSkipped: 0,
  33. isGameOver: false,
  34. };
  35.  
  36. const originalArrayPush = Array.prototype.push;
  37. Array.prototype.push = function(...items) {
  38. items.forEach(item => handleGameElement(item));
  39. return originalArrayPush.apply(this, items);
  40. };
  41.  
  42. function handleGameElement(item) {
  43. if (!item || !item.asset) return;
  44.  
  45. const {
  46. assetType
  47. } = item.asset;
  48. switch (assetType) {
  49. case "CLOVER":
  50. processFlower(item);
  51. break;
  52. case "BOMB":
  53. processBomb(item);
  54. break;
  55. case "FREEZE":
  56. processIce(item);
  57. break;
  58. case "DOGS":
  59. processDogs(item);
  60. break;
  61. }
  62. }
  63.  
  64. function processFlower(item) {
  65. const shouldSkip = Math.random() < (GAME_SETTINGS.flowerSkipPercentage / 100);
  66. if (shouldSkip) {
  67. gameStats.flowersSkipped++;
  68. } else {
  69. gameStats.score++;
  70. clickElement(item);
  71. }
  72. }
  73.  
  74. function processBomb(item) {
  75. if (gameStats.bombHits < GAME_SETTINGS.minBombHits) {
  76. gameStats.score = 0;
  77. clickElement(item);
  78. gameStats.bombHits++;
  79. }
  80. }
  81.  
  82. function processIce(item) {
  83. if (gameStats.iceHits < GAME_SETTINGS.minIceHits) {
  84. clickElement(item);
  85. gameStats.iceHits++;
  86. }
  87. }
  88.  
  89. function processDogs(item) {
  90. if (Math.random() < GAME_SETTINGS.dogsProbability) {
  91. clickElement(item);
  92. gameStats.dogsHits++;
  93. }
  94. }
  95.  
  96. function clickElement(item) {
  97. const createEvent = (type, EventClass) => new EventClass(type, {
  98. bubbles: true,
  99. cancelable: true,
  100. pointerId: 1,
  101. isPrimary: true,
  102. pressure: type === 'pointerdown' ? 0.5 : 0
  103. });
  104.  
  105. setTimeout(() => {
  106. if (typeof item.onClick === 'function') {
  107. if (item.element) {
  108. ['pointerdown', 'mousedown', 'pointerup', 'mouseup', 'click'].forEach(type => {
  109. item.element.dispatchEvent(createEvent(type, type.startsWith('pointer') ? PointerEvent : MouseEvent));
  110. });
  111. }
  112. item.onClick(item);
  113. }
  114. item.isExplosion = true;
  115. item.addedAt = performance.now();
  116. }, getClickDelay());
  117. }
  118.  
  119. // Функция для расчета задержки между кликами
  120. function getClickDelay() {
  121. const minDelay = GAME_SETTINGS.minDelayMs || 500;
  122. const maxDelay = GAME_SETTINGS.maxDelayMs || 1000;
  123. return Math.random() * (maxDelay - minDelay) + minDelay;
  124. }
  125.  
  126. function checkGameCompletion() {
  127. const rewardElement = document.querySelector('#app > div > div > div.content > div.reward');
  128. if (rewardElement && !gameStats.isGameOver) {
  129. gameStats.isGameOver = true;
  130. resetGameStats();
  131. }
  132. }
  133.  
  134. function resetGameStats() {
  135. gameStats = {
  136. score: 0,
  137. bombHits: 0,
  138. iceHits: 0,
  139. dogsHits: 0,
  140. flowersSkipped: 0,
  141. isGameOver: false,
  142. };
  143. }
  144.  
  145. function getNewGameDelay() {
  146. return Math.floor(Math.random() * (GAME_SETTINGS.maxDelayMs - GAME_SETTINGS.minDelayMs + 1) + GAME_SETTINGS.minDelayMs);
  147. }
  148.  
  149. function checkAndClickPlayButton() {
  150. const playButtons = document.querySelectorAll('button.kit-button.is-large.is-primary, a.play-btn[href="/game"], button.kit-button.is-large.is-primary');
  151.  
  152. playButtons.forEach(button => {
  153. if (!isGamePaused && GAME_SETTINGS.autoClickPlay && (/Play/.test(button.textContent) || /Continue/.test(button.textContent))) {
  154. setTimeout(() => {
  155. button.click();
  156. gameStats.isGameOver = false;
  157. }, getNewGameDelay());
  158. }
  159. });
  160. }
  161.  
  162.  
  163. function continuousPlayButtonCheck() {
  164. checkAndClickPlayButton();
  165. setTimeout(continuousPlayButtonCheck, 1000);
  166. }
  167.  
  168. const observer = new MutationObserver(mutations => {
  169. for (const mutation of mutations) {
  170. if (mutation.type === 'childList') {
  171. checkGameCompletion();
  172. }
  173. }
  174. });
  175.  
  176. const appElement = document.querySelector('#app');
  177. if (appElement) {
  178. observer.observe(appElement, {
  179. childList: true,
  180. subtree: true
  181. });
  182. }
  183.  
  184. continuousPlayButtonCheck();
  185.  
  186. const settingsMenu = document.createElement('div');
  187. settingsMenu.className = 'settings-menu';
  188. settingsMenu.style.display = 'none';
  189.  
  190. const menuTitle = document.createElement('h3');
  191. menuTitle.className = 'settings-title';
  192. menuTitle.textContent = 'Blum Autoclicker';
  193.  
  194. const closeButton = document.createElement('button');
  195. closeButton.className = 'settings-close-button';
  196. closeButton.textContent = '×';
  197. closeButton.onclick = () => {
  198. settingsMenu.style.display = 'none';
  199. };
  200.  
  201. menuTitle.appendChild(closeButton);
  202. settingsMenu.appendChild(menuTitle);
  203.  
  204. function updateSettingsMenu() {
  205. document.getElementById('flowerSkipPercentage').value = GAME_SETTINGS.flowerSkipPercentage;
  206. document.getElementById('flowerSkipPercentageDisplay').textContent = GAME_SETTINGS.flowerSkipPercentage;
  207. document.getElementById('minIceHits').value = GAME_SETTINGS.minIceHits;
  208. document.getElementById('minIceHitsDisplay').textContent = GAME_SETTINGS.minIceHits;
  209. document.getElementById('minBombHits').value = GAME_SETTINGS.minBombHits;
  210. document.getElementById('minBombHitsDisplay').textContent = GAME_SETTINGS.minBombHits;
  211. document.getElementById('minDelayMs').value = GAME_SETTINGS.minDelayMs;
  212. document.getElementById('minDelayMsDisplay').textContent = GAME_SETTINGS.minDelayMs;
  213. document.getElementById('maxDelayMs').value = GAME_SETTINGS.maxDelayMs;
  214. document.getElementById('maxDelayMsDisplay').textContent = GAME_SETTINGS.maxDelayMs;
  215. document.getElementById('autoClickPlay').checked = GAME_SETTINGS.autoClickPlay;
  216. }
  217.  
  218. settingsMenu.appendChild(createSettingElement('Flower Skip (%)', 'flowerSkipPercentage', 'range', 0, 100, 1,
  219. 'EN: Percentage probability of skipping a flower.<br>' +
  220. 'RU: Вероятность пропуска цветка в процентах.'));
  221. settingsMenu.appendChild(createSettingElement('Min Freeze Hits', 'minIceHits', 'range', 1, 10, 1,
  222. 'EN: Minimum number of clicks per freeze.<br>' +
  223. 'RU: Минимальное количество кликов на заморозку.'));
  224. settingsMenu.appendChild(createSettingElement('Min Bomb Hits', 'minBombHits', 'range', 0, 10, 1,
  225. 'EN: Minimum number of clicks per bomb.<br>' +
  226. 'RU: Минимальное количество кликов на бомбу.'));
  227. settingsMenu.appendChild(createSettingElement('Min Delay (ms)', 'minDelayMs', 'range', 10, 10000, 10,
  228. 'EN: Minimum delay between clicks.<br>' +
  229. 'RU: Минимальная задержка между кликами.'));
  230. settingsMenu.appendChild(createSettingElement('Max Delay (ms)', 'maxDelayMs', 'range', 10, 10000, 10,
  231. 'EN: Maximum delay between clicks.<br>' +
  232. 'RU: Максимальная задержка между кликами.'));
  233. settingsMenu.appendChild(createSettingElement('Auto Click Play', 'autoClickPlay', 'checkbox', null, null, null,
  234. 'EN: Automatically start the next game at the end of.<br>' +
  235. 'RU: Автоматически начинать следующую игру по окончании.'));
  236.  
  237. const pauseResumeButton = document.createElement('button');
  238. pauseResumeButton.textContent = 'Pause';
  239. pauseResumeButton.className = 'pause-resume-btn';
  240. pauseResumeButton.onclick = toggleGamePause;
  241. settingsMenu.appendChild(pauseResumeButton);
  242.  
  243. const socialButtons = document.createElement('div');
  244. socialButtons.className = 'social-buttons';
  245.  
  246. const githubButton = document.createElement('a');
  247. githubButton.href = 'https://github.com/mudachyo/Blum';
  248. githubButton.target = '_blank';
  249. githubButton.className = 'social-button';
  250. githubButton.innerHTML = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAADtklEQVR4nO2ZSWgVQRCGP2OCS3CJYoy7uCtiDi6o8aAIikvQi4oGvCiiRo2E6FXJQdxQg4LgUTx4cyPuHhVRD0bcsyDu4IJrTNTnSEMNPOfNm1czb2YSJD8UDNNT1fV3V1dX90AH/l8UAEuBfUAt8Bj4CLSKmOdH0ma+WQL0pp2gC1AGXAJ+A5ZPMToXgFViK3Z0AyqBVwGcTycvga1A17hILAAaQiTglHpgfpQEzNTXREjAKcdl5kNFf+BOjCQskVtAYVgkhst0W20kT8WHrNBP0qjVxtIAFAUl0bWNwsnyCLNAKfpoO3DecsjhICnWy+B2CbspwA7gWRbOmd1+G1As1cGBDN/P05LoptgnBruEoSH0A7gKVACzgNFAvsgYebcROAN8BTYDnR22ihWLXxVilYpRTLf75mlHy+PbAYr+zUB5oouy7Ah9o0pCkaL/F5lmpUwZ1+MiJFKi9GGll5FLSiPLIyRSrvThfDoDBT5K8eoIiRxT+vAL6OlmYKnSwGdZkFFhPPBT6Uupm4H9SmWT56PGSaUve92Ua5XK02Igskzpy1k35afKuMyNgchYJRFT0KbgvULRfBMHhiiJvHNTblUomm86xUBkoiMKPor8cfjT4qZsZ4rZUu+MAPoAA+XZljiIJCNXtoYC6dtUFYOSBjYFn6TxJnAXaJRQeiPPtqwgehz2iIrvScvAzFIKnkjjNUmxWyRPm4p1khw37VGJGjnS11BggmTKRVI575a7MPsIkIKL0rhLqsuDwCngOlAns/FBpnN1xLPRIqPdBDwAbgPngCNyFtrvVaZUKzOFkW8yU2FjncuC9pKdbkbm+jBgpBlYE1KomZJ8j08SRua4GeuuTMFOuSFryXnS0yBfBqMxQL8tXucie504xZxT1soGlM7wW+AEsEFGaiTQK8l2XznHmOvQKikvvgYgYImYkiotSj1SXomcwd8qw65KbihtFMq75iyct5JkYaa015RGsU7apwJfMpAwpNOhJAQy9eKLJyo8DJhcbpcQFyU07J84z4ErwOJMHQDrsyRSrr3duBckLn0gx6MPK4Pc9VOBzwQSLkYSIe4fGwKQSADT/XZ0JI2xT3KxNlgTpx4YFYBITZCO8qTu8tNRZ5/2/di+7PMC8B/09BnLfqG1+yCMP8DDgIdtSOS+nBhDQQ+pNOMmciWKf/F5UmInYiCSAA5FfdExWc4HURGpA2YQE3IlBTc4fvj7xeskfWNrU0zXTSnIkbLldFL54gelorswyz2pAx0gIvwFLXDNiM6zHVAAAAAASUVORK5CYII=">GitHub';
  251. socialButtons.appendChild(githubButton);
  252.  
  253. const telegramButton = document.createElement('a');
  254. telegramButton.href = 'https://t.me/shopalenka';
  255. telegramButton.target = '_blank';
  256. telegramButton.className = 'social-button';
  257. telegramButton.innerHTML = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGOElEQVR4nO2ZWUxUZxiGT7Q2ARHLLuuwK6sMLtWmSdPLNuldjaZNet+kSdM2qY1eTNIiyC6LMsPIziAdFgUE2dW2SdtUEWSYfV+YgVnArTICvs0ZO5GwzDnMDNgmvMlcnXPxfP//ne9//3cIYkc72pHHOsXHbuaQ9WTWoO3c4QFrR0a/dSrzlsWW3mt5kXbTTP5saT2zgpTu2Y6Urtlzh7pMJwgWdhFvWkf7rdFZQ7aLzME5fdagDYcHbMjstyLzlhUZfVak91qQftOCtB4zUrvNSOkyI+XGLA5dn8XBTpMuqcOUl9hhidp28KxfHodkD9s4zGGbnTk0h83DzyC5YwbJ7TNIbDPZE/jGqmSeIXhb4I+MzH/GHLFZmcNz8BQ+qc2ERL4JiT8bEX/NaIlvNZ7ZOvB72HNkZJ6bPTIHb8MntDoKQFzLNOKaDewjnHt7vAvfbfDNHp3r23J43jRimw2IaTL0hnMMvt6Bv4c92wnPaDKA0WhATJ1uKJUveNvzArajbXir4Ov1iK7TI6pWW+URfPbo/OdvDl6HqBodIria027BHxt6FMQctpnfJHzkVS3CqzXWcI4bI/bVnN/KaaMHo0EDRqNuQ/gILlmAFuFs9eVNwWfctkR545BaA98yjdgGNRhcMT7iS/HtkAZH64SIqVFvDM/RIKxKYw/nKGJoF+CwB96Eb9Ejrl4BZoMQBb8boJx7DqfahRZEVUk2hD/AJgtQI/SyOo8ePQu7mINzOm/AJ7RoEVcrxcftMvAEZjxfXMZqdYqsiLwidgkfdkWN0EqVnuBjNyX/v67SfXi+EQk8LZLrRPh6WI0x01O4Uu2DGUSy5a7hL6sRUqlCYLniOHX7OCyxG/BtRiQ2K3GcJ8bFPwyYfvICdHR+VIMIjpISPrhChaByxQ+UBWT2Wzs3A5/ENyCxSYFPuxXokduwuPxyDeQT+xJ+/FUL2/PFNc9Ot0sdBVDBB5crEXRJ2UZZQEa/RUAJT646X4eUZim+Gta4bJM/DU/wfsND5P6mW/d5NleAcI6aGr5MicBLyofUO9BnsW4If92Eg3wt3uPLUHbftO6Krlz1s6NqRJf9Bc5907rvPHuxjAMl43ThEVCqMFPvQJ/Fvgb+xgwOtapxpk+FAdU8ll6ubZOVuqt5hBONQjCqJtE4MbvhexOmpzhwSUAXHgHFigXKAtJ7zfbVK5/Mk4MvsbqEdq7696MaMKpFiGVPgS+0uHy/fcqMsHIxPfgSBd4pktMooMdsXd3zSc1yVI6Z8GydOe7UHXLVm0Rg1MgQxxGiR2qjLPjCXR1CK2T04Ivl2F8op24hMj1YM206jEi6pkZ6kwRfDqlxQ2qD5e9X/a95tIBvhtWIvSp1eJtErghDyjnQ0RcdUoRVyOnBF8nhXyCj/ohTu2Y7XR5S1/RIaFQgtkaE+OopMLhCxNarEdukQzRbiC4arebUu9WTCK1Q0ILfXyjHvgIZ9RglcxvarpJneH0NrNcgrXqS8gN3amFxGWEFYwipUNKC9y+QwS9fepayADJ0csvPN+gRXSXCd4Mq2JeoixDMPENw4Tht+H35Mvjkio/RMnMHO2a0bl1GarUOY/ZhwxQeGF17oHaBGUFFAtrwfhclGtppHpmYeXQNZCsQVTaBn+5oYV9af3Ll3NYiqFhEE16KvXnSXIKuyLiPTMzcvQY6jBlb5TikPqidxMQ6u/FJoxBBJVJa8H65kgWfHEkksRmRcZ/b8E5jRl5EyiWIKBpD3t3Xu2F8bEdI3hgCS+XU8HlS+F6QVhCbVSpfGxjfajS7Db/SHlQoEFw0ibTycZwfUOHklXEE5E/Shbf4scTu5aZkVukxvPOQKlciuFSCwPyHCMgXIKBERgm/N1cKnxzxKcITkVmlx/CbGJV+K+B9cySVhMfiY3dMk/76dsP7XBDfJFi33/K8AIIgyKA1ul7fu23wOeIeguWlcNcpMvIms8ptaRuWl1Z+PZFZZQRXY/Y2vG+uZNbjD5Z2ERX6IDLuC2NrFjyGz5UskHPenyUIJLZbgVXaSDIxC6lUazcPL9GS9mDTJ+yWiIVdZOhE5jZk9EGmBwGlcmtAicL+TrHcvr9QZvUvlE2Qfp60xA5X+V/4m3VHOyL+//oHp9RefhzsK9wAAAAASUVORK5CYII=">Telegram Channel';
  258. socialButtons.appendChild(telegramButton);
  259.  
  260. const donateButton = document.createElement('a');
  261. donateButton.href = 'https://mudachyo.codes/donate/';
  262. donateButton.target = '_blank';
  263. donateButton.className = 'social-button';
  264. donateButton.innerHTML = '<img src="data:image/png;base64,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">Donate';
  265. socialButtons.appendChild(donateButton);
  266.  
  267. settingsMenu.appendChild(socialButtons);
  268.  
  269. document.body.appendChild(settingsMenu);
  270.  
  271. const settingsButton = document.createElement('button');
  272. settingsButton.className = 'settings-button';
  273. settingsButton.textContent = '⚙️';
  274. settingsButton.onclick = () => {
  275. settingsMenu.style.display = settingsMenu.style.display === 'block' ? 'none' : 'block';
  276. };
  277. document.body.appendChild(settingsButton);
  278.  
  279. const style = document.createElement('style');
  280. style.textContent = `
  281. .settings-menu {
  282. position: fixed;
  283. top: 50%;
  284. left: 50%;
  285. transform: translate(-50%, -50%);
  286. background-color: rgba(40, 44, 52, 0.95);
  287. border-radius: 8px;
  288. box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2);
  289. color: #abb2bf;
  290. font-family: 'Arial', sans-serif;
  291. z-index: 10000;
  292. padding: 20px;
  293. width: 300px;
  294. }
  295. .settings-title {
  296. color: #61afef;
  297. font-size: 18px;
  298. font-weight: bold;
  299. margin-bottom: 15px;
  300. display: flex;
  301. align-items: center;
  302. justify-content: space-between;
  303. }
  304. .settings-close-button {
  305. background: none;
  306. border: none;
  307. color: #e06c75;
  308. font-size: 20px;
  309. cursor: pointer;
  310. padding: 0;
  311. }
  312. .setting-item {
  313. margin-bottom: 12px;
  314. }
  315. .setting-label {
  316. display: flex;
  317. align-items: center;
  318. margin-bottom: 4px;
  319. }
  320. .setting-label-text {
  321. color: #e5c07b;
  322. margin-right: 5px;
  323. }
  324. .help-icon {
  325. cursor: help;
  326. display: inline-flex;
  327. align-items: center;
  328. justify-content: center;
  329. width: 14px;
  330. height: 14px;
  331. border-radius: 50%;
  332. background-color: #61afef;
  333. color: #282c34;
  334. font-size: 10px;
  335. font-weight: bold;
  336. }
  337. .setting-input {
  338. display: flex;
  339. align-items: center;
  340. }
  341. .setting-slider {
  342. flex-grow: 1;
  343. margin-right: 8px;
  344. }
  345. .setting-value {
  346. min-width: 30px;
  347. text-align: right;
  348. font-size: 11px;
  349. }
  350. .tooltip {
  351. position: relative;
  352. }
  353. .tooltip .tooltiptext {
  354. visibility: hidden;
  355. width: 200px;
  356. background-color: #4b5263;
  357. color: #fff;
  358. text-align: center;
  359. border-radius: 6px;
  360. padding: 5px;
  361. position: absolute;
  362. z-index: 1;
  363. bottom: 125%;
  364. left: 50%;
  365. margin-left: -100px;
  366. opacity: 0;
  367. transition: opacity 0.3s;
  368. font-size: 11px;
  369. box-shadow: 0 2px 4px rgba(0,0,0,0.2);
  370. }
  371. .tooltip:hover .tooltiptext {
  372. visibility: visible;
  373. opacity: 1;
  374. }
  375. .pause-resume-btn {
  376. display: block;
  377. width: calc(100% - 10px);
  378. padding: 8px;
  379. margin: 15px 5px;
  380. background-color: #98c379;
  381. color: #282c34;
  382. border: none;
  383. border-radius: 4px;
  384. cursor: pointer;
  385. font-weight: bold;
  386. font-size: 14px;
  387. transition: background-color 0.3s;
  388. }
  389. .pause-resume-btn:hover {
  390. background-color: #7cb668;
  391. }
  392. .social-buttons {
  393. margin-top: 15px;
  394. display: flex;
  395. justify-content: space-between;
  396. white-space: nowrap;
  397. }
  398. .social-button {
  399. display: inline-flex;
  400. align-items: center;
  401. padding: 5px 8px;
  402. border-radius: 4px;
  403. background-color: #282c34;
  404. color: #abb2bf;
  405. text-decoration: none;
  406. font-size: 12px;
  407. transition: background-color 0.3s;
  408. }
  409. .social-button:hover {
  410. background-color: #4b5263;
  411. }
  412. .social-button img {
  413. width: 16px;
  414. height: 16px;
  415. margin-right: 5px;
  416. }
  417. .settings-button {
  418. position: fixed;
  419. bottom: 20px;
  420. right: 20px;
  421. background-color: rgba(36, 146, 255, 0.8);
  422. color: #fff;
  423. border: none;
  424. border-radius: 50%;
  425. width: 40px;
  426. height: 40px;
  427. font-size: 18px;
  428. cursor: pointer;
  429. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
  430. z-index: 9999;
  431. }
  432. `;
  433. document.head.appendChild(style);
  434.  
  435. function createSettingElement(label, id, type, min, max, step, tooltipText) {
  436. const container = document.createElement('div');
  437. container.className = 'setting-item';
  438.  
  439. const labelContainer = document.createElement('div');
  440. labelContainer.className = 'setting-label';
  441.  
  442. const labelElement = document.createElement('span');
  443. labelElement.className = 'setting-label-text';
  444. labelElement.textContent = label;
  445.  
  446. const helpIcon = document.createElement('span');
  447. helpIcon.textContent = '?';
  448. helpIcon.className = 'help-icon tooltip';
  449.  
  450. const tooltipSpan = document.createElement('span');
  451. tooltipSpan.className = 'tooltiptext';
  452. tooltipSpan.innerHTML = tooltipText;
  453. helpIcon.appendChild(tooltipSpan);
  454.  
  455. labelContainer.appendChild(labelElement);
  456. labelContainer.appendChild(helpIcon);
  457.  
  458. const inputContainer = document.createElement('div');
  459. inputContainer.className = 'setting-input';
  460.  
  461. function AutoClaimAndStart() {
  462. setInterval(() => {
  463. const claimButton = document.querySelector('button.kit-button.is-large.is-drop.is-fill.button.is-done');
  464. const startFarmingButton = document.querySelector('button.kit-button.is-large.is-primary.is-fill.button');
  465. const continueButton = document.querySelector('button.kit-button.is-large.is-primary.is-fill.btn');
  466. if (claimButton) {
  467. claimButton.click();
  468. } else if (startFarmingButton) {
  469. startFarmingButton.click();
  470. } else if (continueButton) {
  471. continueButton.click();
  472. }
  473. }, Math.floor(Math.random() * 5000) + 5000);
  474. }
  475.  
  476. AutoClaimAndStart();
  477.  
  478. let input;
  479. if (type === 'checkbox') {
  480. input = document.createElement('input');
  481. input.type = 'checkbox';
  482. input.id = id;
  483. input.checked = GAME_SETTINGS[id];
  484. input.addEventListener('change', (e) => {
  485. GAME_SETTINGS[id] = e.target.checked;
  486. saveSettings();
  487. });
  488. inputContainer.appendChild(input);
  489. } else {
  490. input = document.createElement('input');
  491. input.type = type;
  492. input.id = id;
  493. input.min = min;
  494. input.max = max;
  495. input.step = step;
  496. input.value = GAME_SETTINGS[id];
  497. input.className = 'setting-slider';
  498.  
  499. const valueDisplay = document.createElement('span');
  500. valueDisplay.id = `${id}Display`;
  501. valueDisplay.textContent = GAME_SETTINGS[id];
  502. valueDisplay.className = 'setting-value';
  503.  
  504. input.addEventListener('input', (e) => {
  505. GAME_SETTINGS[id] = parseFloat(e.target.value);
  506. valueDisplay.textContent = e.target.value;
  507. saveSettings();
  508. });
  509.  
  510. inputContainer.appendChild(input);
  511. inputContainer.appendChild(valueDisplay);
  512. }
  513.  
  514. container.appendChild(labelContainer);
  515. container.appendChild(inputContainer);
  516. return container;
  517. }
  518.  
  519. function saveSettings() {
  520. localStorage.setItem('BlumAutoclickerSettings', JSON.stringify(GAME_SETTINGS));
  521. }
  522.  
  523. function loadSettings() {
  524. const savedSettings = localStorage.getItem('BlumAutoclickerSettings');
  525. if (savedSettings) {
  526. const parsedSettings = JSON.parse(savedSettings);
  527. GAME_SETTINGS = {
  528. ...GAME_SETTINGS,
  529. ...parsedSettings
  530. };
  531. }
  532. }
  533.  
  534. loadSettings();
  535. updateSettingsMenu();
  536.  
  537. function toggleGamePause() {
  538. isGamePaused = !isGamePaused;
  539. pauseResumeButton.textContent = isGamePaused ? 'Resume' : 'Pause';
  540. pauseResumeButton.style.backgroundColor = isGamePaused ? '#e5c07b' : '#98c379';
  541. }
  542. } catch (e) {
  543. console.error("Blum Autoclicker error:", e);
  544. }