Sploop++

simple visuals

  1. // ==UserScript==
  2. // @name Sploop++
  3. // @version 1.2
  4. // @description simple visuals
  5. // @author nyannez
  6. // @match *://sploop.io/*
  7. // @run-at document-start
  8. // @icon https://sploop.io/img/ui/favicon.png
  9. // @grant none
  10. // @namespace https://gf.qytechs.cn/users/960747
  11. // ==/UserScript==
  12.  
  13. const defaultSettings = {
  14. HP: true,
  15. chestsHP: true,
  16. rainbHP: true,
  17. LBF: false,
  18. rainbBar: false,
  19. hideHPwNicks: false,
  20. hideHUD: false,
  21. autoRespawn: false,
  22. hitboxes: false,
  23. autobuy: true,
  24. wrange: false,
  25. rainbNick: false,
  26. rainbClan: false,
  27. nickGradient: false,
  28. night: false,
  29. VSync: true,
  30. vignette: false,
  31. slowMotion: false,
  32. decorations: true,
  33. itemCount: true,
  34. keystrokes: true,
  35. shop: "crystal",
  36. lobby: "vertical",
  37. nickColor: "#89A0FE",
  38. nickColor2: "#404040",
  39. gradient: "#6d1082",
  40. gradient2: "#ad1dab",
  41. HPColor: "#a4cc4f",
  42. EnemysHPColor: "#802641",
  43. clanColor: "#0a80c9",
  44. clanColor2: "#2e3336",
  45. snowColor: "#ece5db",
  46. grassColor: "#788F57",
  47. beachColor: "#fcefbb",
  48. riverColor: "#2a8b9b",
  49. desertColor: "#b38354",
  50. nightColor: "#211b55",
  51. nightOpacity: "80",
  52. shopOpacity: 1,
  53. shopSize: 1
  54. };
  55. let buyed = false;
  56. const log = console.log;
  57.  
  58. const checkChanges = (obj1, obj2) => {
  59. const keys1 = Object.keys(obj1);
  60. const keys2 = Object.keys(obj2);
  61.  
  62. return keys2.some(key => !keys1.includes(key)) || keys1.some(key => !keys2.includes(key));
  63. };
  64.  
  65. if (!localStorage.settings || checkChanges(defaultSettings, JSON.parse(localStorage.settings))) {
  66. localStorage.setItem("settings", JSON.stringify(defaultSettings));
  67. };
  68.  
  69. const changeSettings = (key, value) => {
  70. let newSettings = JSON.parse(localStorage.settings);
  71. newSettings[key] = value;
  72. localStorage.setItem("settings", JSON.stringify(newSettings));
  73. };
  74.  
  75. const getValue = (key) => JSON.parse(localStorage.settings)[key];
  76.  
  77. const defaultRAF = window.requestAnimationFrame;
  78. if (!getValue("VSync")) window.requestAnimationFrame = f => setTimeout(f, 0);
  79.  
  80. window.changeSettings = changeSettings;
  81. window.getValue = getValue;
  82. window.getSettings = changeSettings;
  83.  
  84. const getEl = (id) => document.getElementById(id);
  85. window.getEl = getEl;
  86. const serverInfo = document.createElement("span");
  87. const pingCount = document.createElement("span");
  88. const bossInfo = document.createElement("span");
  89. const FPS = document.createElement("span");
  90. const CPS = document.createElement("span");
  91. let cps = 0;
  92. const keystrokes = document.createElement("div");
  93. const servers = {
  94. SFRA: "EU#1 Sand",
  95. SFRA2: "EU#2",
  96. SFRA2BIS: "EU#2 Sand",
  97. SCA: "USA#1 Sand",
  98. SCA2: "USA#2 Sand",
  99. SGP: 'AS#1 Sand',
  100. SGP2: 'AS#2 Sand',
  101. SGP3BIS: "AS#3 Sand",
  102. FRA1FFA: "EU Classic",
  103. CA1FFA: "USA Classic",
  104. SGP1FFA: "AS Classic",
  105. FR1EVENT: "EU Event",
  106. CA1EVENT: "USA Event"
  107. };
  108.  
  109. window.addEventListener('DOMContentLoaded', event => {
  110. const Comfortaa = document.createElement('style');
  111. Comfortaa.innerHTML = `@import "https://fonts.googleapis.com/css2?family=Comfortaa&display=swap";`;
  112. const ubuntu = document.createElement("style");
  113. ubuntu.textContent = `@import "https://fonts.googleapis.com/css2?family=Ubuntu:700&display=swap";`;
  114. document.head.appendChild(Comfortaa, ubuntu);
  115.  
  116. serverInfo.style = `position: absolute;font-size: 120%;z-index: 888;top: 15px;color: white;left: 1%;font-weight: 100;pointer-events: none;font-family: Comfortaa;text-shadow: 1px 1px 5px black, 3px 3px 5px black;`;
  117. FPS.id = "FPS";
  118. FPS.style = "position: absolute;z-index: 10;left: 1%;font-family: Comfortaa;pointer-events:none;top: 50px;font-size: 120%;color: white;font-weight: 100;text-shadow: 1px 1px 5px black, 3px 3px 5px black;"
  119. pingCount.id = "pingCount";
  120. pingCount.style = "position: absolute;z-index: 10;left: 1%;font-family: Comfortaa;pointer-events:none;top: 85px;font-size: 120%;color: white;font-weight: 100;text-shadow: 1px 1px 5px black, 3px 3px 5px black;"
  121. bossInfo.id = "bossInfo";
  122. bossInfo.style = "position: absolute;z-index: 10;left: 1%;font-family: Comfortaa;pointer-events:none;top: 120px;font-size: 120%;color: white;font-weight: 100;text-shadow: 1px 1px 5px black, 3px 3px 5px black;"
  123. CPS.id = "CPS";
  124. CPS.style = "position: absolute;z-index: 10;left: 1%;font-family: Comfortaa;pointer-events:none;top: 155px;font-size: 120%;color: white;font-weight: 100;text-shadow: 1px 1px 5px black, 3px 3px 5px black;"
  125. CPS.textContent = "CPS: " + cps;
  126. pingCount.textContent = "Ping: unknown";
  127. serverInfo.textContent = "Loading...";
  128. bossInfo.textContent = "Boss: unknown";
  129. FPS.textContent = "FPS: unknown";
  130. serverInfo.style.display = "none";
  131. FPS.style.display = "none";
  132. pingCount.style.display = "none";
  133. bossInfo.style.display = "none";
  134. CPS.style.display = "none";
  135.  
  136. const plist = document.createElement("div");
  137. plist.id = "plist";
  138. plist.style = `
  139. position: absolute;
  140. top: 40%;
  141. background: rgba(0, 0, 0, 0.26);
  142. box-shadow: rgba(0, 0, 0, 0.26) 3px 8px 20px 1px;
  143. border: 3px solid rgba(0, 0, 0, 0.16);
  144. border-radius: 15px;
  145. left: 50%;
  146. height: 500px;
  147. width: 400px;
  148. color: white;
  149. transform: translate(-50%, -40%);
  150. display: none;
  151. flex-direction: column;
  152. overflow-x: hidden;
  153. `;
  154.  
  155. const menu = document.createElement("div");
  156. menu.id = "menu";
  157. menu.className = "menuu";
  158. menu.style = `
  159. z-index: 99;
  160. position: absolute;
  161. top: 40%;
  162. background: rgba(0, 0, 0, 0.26);
  163. left: 50%;
  164. height: 450px;
  165. box-shadow: rgba(0, 0, 0, 0.26) 3px 8px 20px 1px;
  166. width: 400px;
  167. transform: translate(-50%, -40%);
  168. border-radius: 15px;
  169. padding: 10px;
  170. border: 3px solid rgba(0, 0, 0, 0.16);
  171. display: none;
  172. overflow: auto;
  173. `;
  174.  
  175. menu.innerHTML = `
  176. <div class="otctup">
  177. <span class="checkbox-text">Health point</span>
  178. <label class="checkbox">
  179. <input type="checkbox" id="HP">
  180. <span class="checkmark"></span>
  181. </label>
  182. </div>
  183.  
  184. <div class="otctup">
  185. <span class="checkbox-text">Rainbow nickname</span>
  186. <label class="checkbox">
  187. <input type="checkbox" id="rainbNick">
  188. <span class="checkmark"></span>
  189. </label>
  190. </div>
  191.  
  192. <div class="otctup">
  193. <span class="checkbox-text">Rainbow HP</span>
  194. <label class="checkbox">
  195. <input type="checkbox" id="rainbHP">
  196. <span class="checkmark"></span>
  197. </label>
  198. </div>
  199.  
  200. <div class="otctup">
  201. <span class="checkbox-text">Rainbow age bar</span>
  202. <label class="checkbox">
  203. <input type="checkbox" id="rainbBar">
  204. <span class="checkmark"></span>
  205. </label>
  206. </div>
  207.  
  208. <div class="otctup">
  209. <span class="checkbox-text">Rainbow clan</span>
  210. <label class="checkbox">
  211. <input type="checkbox" id="rainbClan">
  212. <span class="checkmark"></span>
  213. </label>
  214. </div>
  215.  
  216. <div class="otctup">
  217. <span class="checkbox-text">Rainbow speed: </span>
  218. <input class="inpu" value="35">
  219. </div>
  220.  
  221. <div class="otctup">
  222. <span class="checkbox-text">Chests HP</span>
  223. <label class="checkbox">
  224. <input type="checkbox" id="chestsHP">
  225. <span class="checkmark"></span>
  226. </label>
  227. </div>
  228.  
  229. <div class="otctup">
  230. <span class="checkbox-text">Leader board full gold</span>
  231. <label class="checkbox">
  232. <input type="checkbox" id="LBF">
  233. <span class="checkmark"></span>
  234. </label>
  235. </div>
  236.  
  237. <div class="otctup">
  238. <span class="checkbox-text">Hide HP with nicknames</span>
  239. <label class="checkbox">
  240. <input type="checkbox" id="hideHPwNicks">
  241. <span class="checkmark"></span>
  242. </label>
  243. </div>
  244.  
  245. <div class="otctup">
  246. <span class="checkbox-text">Hide HUD</span>
  247. <label class="checkbox">
  248. <input type="checkbox" id="hideHUD">
  249. <span class="checkmark"></span>
  250. </label>
  251. </div>
  252.  
  253. <div class="otctup">
  254. <span class="checkbox-text">VSync</span>
  255. <label class="checkbox">
  256. <input type="checkbox" id="VSync">
  257. <span class="checkmark"></span>
  258. </label>
  259. </div>
  260.  
  261. <div class="otctup">
  262. <span class="checkbox-text">Decorations</span>
  263. <label class="checkbox">
  264. <input type="checkbox" id="decorations">
  265. <span class="checkmark"></span>
  266. </label>
  267. </div>
  268.  
  269. <div class="otctup">
  270. <span class="checkbox-text">Item count</span>
  271. <label class="checkbox">
  272. <input type="checkbox" id="itemCount">
  273. <span class="checkmark"></span>
  274. </label>
  275. </div>
  276.  
  277. <div class="otctup">
  278. <span class="checkbox-text">Slowmotion</span>
  279. <label class="checkbox">
  280. <input type="checkbox" id="slowMotion">
  281. <span class="checkmark"></span>
  282. </label>
  283. </div>
  284.  
  285. <div class="otctup">
  286. <span class="checkbox-text">Keystrokes</span>
  287. <label class="checkbox">
  288. <input type="checkbox" id="keystrokes">
  289. <span class="checkmark"></span>
  290. </label>
  291. </div>
  292.  
  293. <div class="otctup">
  294. <span class="checkbox-text">Hitboxes</span>
  295. <label class="checkbox">
  296. <input type="checkbox" id="hitboxes">
  297. <span class="checkmark"></span>
  298. </label>
  299. </div>
  300.  
  301. <div class="otctup">
  302. <span class="checkbox-text">Weapon range</span>
  303. <label class="checkbox">
  304. <input type="checkbox" id="wrange">
  305. <span class="checkmark"></span>
  306. </label>
  307. </div>
  308.  
  309. <div class="otctup">
  310. <span class="checkbox-text">Auto respawn</span>
  311. <label class="checkbox">
  312. <input type="checkbox" id="autoRespawn">
  313. <span class="checkmark"></span>
  314. </label>
  315. </div>
  316.  
  317. <div class="otctup" style="display: flex;align-items: center;">
  318. <span class="checkbox-text">Shop type</span>
  319. <select style="outline: none; left: 10px; position: relative; text-align: center;" onchange="window.changeCSS(this);">
  320. <option ${getValue("shop") === "default" ? "selected" : ""}>default</option>
  321. <option ${getValue("shop") === "crystal" ? "selected" : ""}>crystal</option>
  322. </select>
  323. <input oninput=window.changeColor(this) value=${getValue("shopColor")} type="color" id="shopColor" style="background: none;border: none;left: 15px;position: relative;">
  324. </div>
  325.  
  326. <div class="otctup" style="display: flex;align-items: center;">
  327. <span class="checkbox-text" style="padding-right: 5px;">Opacity</span>
  328. <input oninput=window.changeOpacity(this) value=${getValue("shopOpacity") * 100} min="1" max="100" type="range" id="shopOpacity" style="outline:none;">
  329. </div>
  330.  
  331. <div class="otctup" style="padding-bottom: 5px;display: flex;align-items: center;">
  332. <span class="checkbox-text" style="padding-right: 5px;">Size</span>
  333. <input oninput=window.changeOpacity(this) value=${getValue("shopSize") * 100} min="1" max="100" type="range" id="shopSize" style="outline:none;">
  334. </div>
  335.  
  336. <div class="otctup">
  337. <span class="checkbox-text" style="">Lobby type</span>
  338. <select style="outline: none;left: 10px;position: relative;text-align: center;" onchange="window.changeCSS(this);">
  339. <option ${getValue("lobby") === "vertical" ? "selected" : ""}>default</option>
  340. <option ${getValue("lobby") === "vertical" ? "selected" : ""}>vertical</option>
  341. </select>
  342. </div>
  343.  
  344. <div class="otctup">
  345. <span class="checkbox-text">Auto buy hats (sandbox)</span>
  346. <label class="checkbox">
  347. <input type="checkbox" id="autobuy">
  348. <span class="checkmark"></span>
  349. </label>
  350. </div>
  351.  
  352. <div class="otctup" style="display: flex;align-items: center;">
  353. <span class="checkbox-text" style="padding-right: 5px;">Night</span>
  354. <label class="checkbox">
  355. <input type="checkbox" id="night">
  356. <span class="checkmark"></span>
  357. </label>
  358. <input oninput=window.changeColor(this) value=${getValue("nightColor")} type="color" id="nightColor" style="padding-right: 10px;background: none;border: none;left: 5px;position: relative;">
  359. <span class="checkbox-text" style="padding-right: 5px;">Vignette</span>
  360. <label class="checkbox">
  361. <input type="checkbox" id="vignette">
  362. <span class="checkmark"></span>
  363. </label>
  364. <span class="checkbox-text" style="padding-left: 5px;padding-right: 5px;">A</span>
  365. <input oninput=window.changeOpacity(this) value=${getValue("nightOpacity")} min="1" max="100" type="range" id="nightOpacity" style="outline:none;">
  366. </div>
  367.  
  368. <div style="display: flex;align-items: center;">
  369. <span class="checkbox-text">Nickname color</span>
  370. <input oninput=window.changeColor(this) value=${getValue("nickColor")} type="color" id="nickColor" style="background: none;border: none;left: 5px;position: relative;">
  371. <input oninput=window.changeColor(this) value=${getValue("nickColor2")} type="color" id="nickColor2" style="background: none;border: none;left: 5px;position: relative;">
  372. </div>
  373.  
  374. <div style="display: flex;align-items: center;">
  375. <span style="padding-right: 5px;" class="checkbox-text">Nickname gradient</span>
  376. <label class="checkbox">
  377. <input type="checkbox" id="nickGradient">
  378. <span class="checkmark"></span>
  379. </label>
  380. <input oninput=window.changeColor(this) value=${getValue("gradient")} type="color" id="gradient" style="background: none;border: none;left: 5px;position: relative;">
  381. <input oninput=window.changeColor(this) value=${getValue("gradient2")} type="color" id="gradient2" style="background: none;border: none;left: 5px;position: relative;">
  382. </div>
  383.  
  384. <div style="display: flex;align-items: center;">
  385. <span class="checkbox-text">HP color</span>
  386. <input oninput=window.changeColor(this) value=${getValue("HPColor")} type="color" id="HPColor" style="background: none;border: none;left: 5px;position: relative;">
  387. </div>
  388.  
  389. <div style="display: flex;align-items: center;">
  390. <span class="checkbox-text">Enemys HP color</span>
  391. <input oninput=window.changeColor(this) value=${getValue("EnemysHPColor")} type="color" id="EnemysHPColor" style="background: none;border: none;left: 5px;position: relative;">
  392. </div>
  393.  
  394. <div style="display: flex;align-items: center;">
  395. <span class="checkbox-text">Clan color</span>
  396. <input oninput=window.changeColor(this) value=${getValue("clanColor")} type="color" id="clanColor" style="background: none;border: none;left: 5px;position: relative;">
  397. <input oninput=window.changeColor(this) value=${getValue("clanColor2")} type="color" id="clanColor2" style="background: none;border: none;left: 5px;position: relative;">
  398. </div>
  399.  
  400. <div style="display: flex;align-items: center;">
  401. <span class="checkbox-text">Snow color</span>
  402. <input oninput=window.changeColor(this) value=${getValue("snowColor")} type="color" id="snowColor" style="background: none;border: none;left: 5px;position: relative;">
  403. </div>
  404.  
  405. <div style="display: flex;align-items: center;">
  406. <span class="checkbox-text">Grass color</span>
  407. <input oninput=window.changeColor(this) value=${getValue("grassColor")} type="color" id="grassColor" style="background: none;border: none;left: 5px;position: relative;">
  408. </div>
  409.  
  410. <div style="display: flex;align-items: center;">
  411. <span class="checkbox-text">Beach color</span>
  412. <input oninput=window.changeColor(this) value=${getValue("beachColor")} type="color" id="beachColor" style="background: none;border: none;left: 5px;position: relative;">
  413. </div>
  414.  
  415. <div style="display: flex;align-items: center;">
  416. <span class="checkbox-text">River color</span>
  417. <input oninput=window.changeColor(this) value=${getValue("riverColor")} type="color" id="riverColor" style="background: none;border: none;left: 5px;position: relative;">
  418. </div>
  419.  
  420. <div style="display: flex;align-items: center;">
  421. <span class="checkbox-text">Desert color</span>
  422. <input oninput=window.changeColor(this) value=${getValue("desertColor")} type="color" id="desertColor" style="background: none;border: none;left: 5px;position: relative;">
  423. </div>
  424.  
  425. <button id="reset">Reset</button>
  426. `;
  427.  
  428. keystrokes.style="pointer-events: none;position: absolute;width: 150px;height: auto;background: rgba(0, 0, 0, 0.62);z-index: 9;display: none;flex-wrap: wrap;top: 190px;left: 1%;"
  429. keystrokes.id = "keystrokes";
  430. keystrokes.innerHTML = `
  431. <div id="1" class="batton" style="border-bottom: none;">1</div>
  432. <div id="2" class="batton" style="border-bottom: none;border-left: none;">2</div>
  433. <div id="3" class="batton" style="border-bottom: none;border-left: none;">3</div>
  434. <div id="Q" class="batton">Q</div>
  435. <div id="F" style="border-left: none;" class="batton">F</div>
  436. <div id="R" style="border-left: none;" class="batton">R</div>
  437. <div id="LBtn" class="batton" style="width: 50%;border-top: none;">L</div>
  438. <div id="RBtn" class="batton" style="width: 50%;border-top: none;border-left: none;">R</div>
  439. <div id="Space" class="batton" style="width: 100%;border-top: none;">Space</div>
  440. `;
  441. const night = document.createElement("div");
  442. night.innerHTML = `<div id="nightEl" style="display: ${getValue("night") ? "block" : "none"};position: absolute;z-index: 2;width: 100%;height: 100%;background: ${getValue("vignette") ? `radial-gradient(transparent, ${getValue("nightColor") + getValue("nightOpacity")})` : `${getValue("nightColor") + getValue("nightOpacity")}`};pointer-events: none;"></div>`;
  443. document.body.append(serverInfo, FPS, pingCount, bossInfo, CPS, menu, plist, night, keystrokes);
  444.  
  445. getEl("reset").addEventListener("mousedown", () => {
  446. localStorage.setItem("settings", JSON.stringify(defaultSettings));
  447. document.querySelectorAll('input[type="checkbox"]').forEach(el => {
  448. const id = el.id;
  449. if (["chestsHP", "LBF", "HP", "rainbHP", "rainbBar", "hideHPwNicks", "hideHUD", "autoRespawn", "hitboxes", "autobuy", "wrange", "rainbNick", "rainbClan", "nickGradient", "VSync", "slowMotion", "night", "vignette", "decorations", "itemCount", "keystrokes"].includes(id)) {
  450. el.checked = getValue(id);
  451. }
  452. });
  453. });
  454.  
  455. const opacityToHex = (val) =>{
  456. val = Math.max(0, Math.min(100, val));
  457. const opacityValue = Math.round((val / 100) * 255);
  458. const opacityHex = opacityValue.toString(16).padStart(2, "0");
  459.  
  460. return opacityHex;
  461. };
  462.  
  463. window.changeOpacity = (element) => {
  464. const opacity = opacityToHex(element.value);
  465. if (element.id === "shopSize") {
  466. const sizeForShop = element.value / 100;
  467. getEl("hat-menu").style.scale = element.value / 100;
  468. changeSettings(element.id, sizeForShop);
  469. } else if (element.id === "shopOpacity") {
  470. const opacityForShop = element.value / 100;
  471. getEl("hat-menu").style.setProperty('opacity', `${opacityForShop}`, 'important');
  472. changeSettings(element.id, opacityForShop);
  473. }else if (element.id === "nightOpacity" && getValue("vignette")) {
  474. getEl("nightEl").style.background = `radial-gradient(transparent, ${getValue("nightColor") + opacity})`;
  475. changeSettings(element.id, opacity);
  476. } else if (element.id === "nightOpacity") {
  477. getEl("nightEl").style.background = getValue("nightColor") + opacity;
  478. changeSettings(element.id, opacity);
  479. };
  480. };
  481.  
  482. window.changeColor = (element) => {
  483. if (element.id === "nightColor") {
  484. if (!getValue("vignette")) getEl("nightEl").style.background = element.value + getValue("nightOpacity");
  485. if (getValue("vignette")) getEl("nightEl").style.background = `radial-gradient(transparent, ${getValue("nightColor") + getValue("nightOpacity")})`;
  486. changeSettings(element.id, element.value);
  487. } else {
  488. changeSettings(element.id, element.value);
  489. };
  490. };
  491.  
  492. window.changeCSS = (event) => {
  493. if (event.value === "vertical") {
  494. window.lobbyCSS = document.createElement("style");
  495. window.lobbyCSS.innerHTML = differentCSS[event.value];
  496. document.head.append(window.lobbyCSS);
  497. } else if (event.value === "crystal") {
  498. window.shopCSS = document.createElement("style");
  499. window.shopCSS.innerHTML = differentCSS[event.value];
  500. document.head.append(window.shopCSS);
  501. } else if (event.value === "default") {
  502. if (window.lobbyCSS) window.lobbyCSS.remove();
  503. if (window.shopCSS) window.shopCSS.remove();
  504. };
  505. changeSettings("shop", event.value);
  506. };
  507.  
  508. setInterval(() => {
  509. getSploopServers();
  510. if (!currentServerUrl) return;
  511. const serverName = currentServerUrl.toUpperCase();
  512. const server = sploopServers.find(i => i.r === serverName);
  513. serverInfo.textContent = `${servers[serverName]}: ${server.d[1]}`;
  514. }, 2000);
  515.  
  516. try {
  517. ["new-changelog", "logo", "bottom-wrap", "shop-io-games", "right-content", "game-bottom-content", "game-right-content-main", "game-left-content-main", "cross-promo", "landscape"].forEach(e => getEl(e).remove());
  518. document.querySelector("#skin-message > a > div").remove();
  519. document.querySelector("#left-content > div:nth-child(3)").remove();
  520. getEl("shop-message").style.opacity = 0;
  521. getEl("skin-message").style.opacity = 0;
  522. } catch(err) {}
  523.  
  524. const styleItem = `
  525. .batton {
  526. width: 50px;
  527. height: 50px;
  528. color: white;
  529. display: flex;
  530. align-items: center;
  531. justify-content: center;
  532. border: 2px solid;
  533. font-family: 'Comfortaa';
  534. font-weight: 100;
  535. }
  536.  
  537. .sl {
  538. outline: none;
  539. border: none;
  540. font-weight: 600;
  541. }
  542.  
  543. .otctup {
  544. padding-top: 5px;
  545. }
  546.  
  547. .menuu::-webkit-scrollbar {
  548. width: 18px;
  549. margin-left: 10px;
  550. }
  551.  
  552. #plist::-webkit-scrollbar {
  553. width: 18px;
  554. margin-left: 10px;
  555. }
  556.  
  557. .menuu::-webkit-scrollbar-thumb {
  558. border-radius: 20px;
  559. border: 2px solid #272727;
  560. background: #3939397d;
  561. }
  562.  
  563. #plist::-webkit-scrollbar-thumb {
  564. border-radius: 20px;
  565. border: 2px solid #272727;
  566. background: #3939397d;
  567. }
  568.  
  569. .inpu {
  570. width: auto;
  571. max-width: 50px;
  572. outline: none;
  573. text-align: center;
  574. }
  575.  
  576. .checkbox {
  577. position: relative;
  578. display: inline-block;
  579. cursor: pointer;
  580. }
  581.  
  582. .checkbox input {
  583. position: absolute;
  584. opacity: 0;
  585. cursor: pointer;
  586. }
  587.  
  588. .checkbox .checkmark {
  589. position: relative;
  590. display: inline-block;
  591. vertical-align: middle;
  592. width: 20px;
  593. height: 20px;
  594. border: 2px solid #333;
  595. border-radius: 5px;
  596. background-color: #222;
  597. }
  598.  
  599. .checkbox input:checked + .checkmark {
  600. background-color: #222;
  601. }
  602.  
  603. .checkbox input:checked + .checkmark:after {
  604. content: "";
  605. background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e");
  606. background-size: cover;
  607. background-position: center;
  608. position: absolute;
  609. width: 100%;
  610. height: 100%;
  611. }
  612.  
  613. .checkbox span {
  614. pointer-events: none;
  615. }
  616.  
  617. .checkbox-text {
  618. font-weight: 100;
  619. font-family: Comfortaa;
  620. color: white;
  621. }
  622.  
  623. #ranking-rank-container {
  624. height: 360px;
  625. }
  626.  
  627. #ranking2-middle-main {
  628. height: auto;
  629. }
  630.  
  631. #left-content {
  632. height: 40px;
  633. position: unset;
  634. width: 100px;
  635. display: flex;
  636. flex-direction: row;
  637. justify-content: space-around;
  638. }
  639.  
  640. #game-middle-main {
  641. left: 50%;
  642. transform: translate(-50%);
  643. }
  644.  
  645. #main-content {
  646. background: none;
  647. }
  648.  
  649. .profile-scores {
  650. width: 600px;
  651. height: 76px;
  652. color: white;
  653. }
  654.  
  655. #profile-next-rank-text {
  656. height: 100%;
  657. color: white;
  658. width: auto;
  659. max-width: none;
  660. }
  661.  
  662. #profile-next-rank-icons {
  663. height: 100%;
  664. width: 250px;
  665. padding: 5px;
  666. margin-right: 10px;
  667. }
  668.  
  669. .scrollbar::-webkit-scrollbar-thumb {
  670. box-shadow: none;
  671. }
  672. #hat-menu {
  673. transform-origin: left top;
  674. }
  675. `;
  676. const differentCSS = {
  677. vertical: `
  678. #server-select {
  679. transition: all 0.5s ease;
  680. border-radius: 5px;
  681. background: #9ce2de;
  682. box-shadow: inset 0 -6px 0 0 rgb(85 173 195 / 70%);
  683. }
  684. #server-select:hover {
  685. transition: all 0.5s ease;
  686. background: #abe2ff;
  687. box-shadow: inset 0px -5px 0px rgb(131 210 238);
  688. }
  689. .nav-button-active {
  690. transition: all 0.5s ease;
  691. position: absolute;
  692. transform: scale(1);
  693. color: #7fdeff;
  694. }
  695. .nav-button-text:active {
  696. transition: all 0.5s ease;
  697. transform: scale(1);
  698. color: #7fdeff;
  699. }
  700. .nav-button-text:hover {
  701. transition: all 0.5s ease;
  702. color: #7fdeff;
  703. }
  704. #play:hover {
  705. transition: all 0.5s ease;
  706. background-color: #abe2ff;
  707. box-shadow: inset 0 -9px 0 rgb(131 210 238);
  708. }
  709. #play {
  710. transition: all 0.5s ease;
  711. background: #9ce2de;
  712. box-shadow: inset 0 -9px 0 rgb(85 173 195 / 70%);
  713. border-radius: 7px;
  714. }
  715. #play:active {
  716. transition: all 0.5s ease;
  717. background-color: #6dc5e7;
  718. box-shadow: inset 0 9px 0 rgb(153 207 249 / 70%);
  719. }
  720. .dark-blue-button {
  721. transition: all 0.5s ease;
  722. background: #9ce2de;
  723. box-shadow: inset 0 -6px 0 0 rgb(85 173 195 / 70%);
  724. }
  725. .dark-blue-button-3-active {
  726. transition: all 0.5s ease;
  727. background: #6dc5e7;
  728. box-shadow: inset 0px 5px 0px rgb(153 207 249 / 70%);
  729. }
  730. .dark-blue-button:hover {
  731. transition: all 0.5s ease;
  732. background: #abe2ff;
  733. box-shadow: inset 0px -5px 0px rgb(131 210 238);
  734. }
  735. .dark-blue-button-3-active:active {
  736. transition: all 0.5s ease;
  737. background: #6dc5e7;
  738. box-shadow: inset 0px 5px 0px rgb(153 207 249 / 70%);
  739. }
  740. .game-mode {
  741. transition: all 0.5s ease;
  742. border-radius: 7px;
  743. }
  744. #nickname {
  745. transition: all 0.5s ease;
  746. border-radius: 5px;
  747. }
  748. #game-middle-main {
  749. background: rgba(75, 186, 248, 0.2);
  750. border-radius: 0px;
  751. box-shadow: rgb(153, 187, 255) 5px 5px 20px 2px;
  752. border-color: rgba(60, 185, 255, 0.2);
  753. }
  754. #nav {
  755. position: absolute;
  756. display: flex;
  757. flex-direction: column;
  758. left: -20vw;
  759. width: 0px !important;
  760. height: 200%;
  761. justify-content: space-between;
  762. }
  763. #middle-wrap {
  764. scale: 0.8;
  765. }
  766. `,
  767. crystal: `
  768. .green-button {
  769. transition: all 0.5s ease;
  770. background-color: rgb(138 202 234 / 50%);
  771. box-shadow: inset 0 -5px 0 rgb(111 175 185 / 50%);
  772. }
  773. .green-button:hover {
  774. transition: all 0.5s ease;
  775. background-color: #a3d2ea;
  776. box-shadow: inset 0 -5px 0 #69bae3;
  777. }
  778. .green-button:active {
  779. transition: all 0.5s ease;
  780. background-color: #9ae0ea;
  781. box-shadow: inset 0 5px 0 #bbedee;
  782. }
  783. .menu-item {
  784. border-bottom: 3px solid rgba(255, 255, 255, 0) !important;
  785. }
  786. #hat_menu_content {
  787. border-color: rgba(175, 226, 255, 0.57);
  788. box-shadow: none;
  789. background: rgba(20, 20, 20, 0);
  790. border-radius: 0px;
  791. text-shadow: rgb(20, 20, 20) 3px 0px 20px;
  792. }
  793. #hat-menu {
  794. scale: ${getValue("shopSize")};
  795. transform-origin: left top;
  796. display: flex;
  797. opacity: ${getValue("shopOpacity")} !important;
  798. background: rgba(190, 220, 255, 0.17) !important;
  799. box-shadow: rgba(173, 255, 239, 0.5) 6px 6px 23px 2px;
  800. border: 5px solid rgba(168, 211, 255, 0.51);
  801. }
  802. `};
  803. const styleElement = document.createElement("style");
  804. styleElement.innerHTML = styleItem;
  805. document.head.appendChild(styleElement);
  806.  
  807. if (getValue("shop") !== "default") {
  808. window.shopCSS = document.createElement("style");
  809. window.shopCSS.innerHTML = differentCSS[getValue("shop")];
  810. document.head.append(window.shopCSS);
  811. };
  812.  
  813. if (getValue("lobby") !== "default") {
  814. window.lobbyCSS = document.createElement("style");
  815. window.lobbyCSS.innerHTML = differentCSS[getValue("lobby")];
  816. document.head.append(window.lobbyCSS);
  817. };
  818.  
  819. document.querySelector("#play > div.background-moving.background-img-play").remove();
  820. document.querySelector("#hat-menu > div.pop-top.select > div.pop-title.text-shadowed-4").style.textShadow = "none";
  821. document.querySelector("#hat-menu > div.pop-top.select > div.pop-title.text-shadowed-4").textContent = "hats";
  822. for (let i = 0; i < 11; i++) {
  823. document.getElementsByClassName("hat_action_button")[i].style.borderRadius = '5px';
  824. document.getElementsByClassName("menu-item")[i].style.borderBottom = "3px solid #ffffff00";
  825. document.getElementsByClassName("menu-item")[i].style.color = "3px solid #ffffff00";
  826. document.getElementsByClassName("description")[i].style.display = "none";
  827. };
  828.  
  829. const isInput = () => {
  830. const element = document.activeElement;
  831. return ["TEXTAREA", "INPUT"].includes(element.tagName);
  832. };
  833.  
  834. window.addEventListener("keydown", (event) => {
  835. if (event.code === "Space" && !isInput()) {
  836. event.preventDefault();
  837. }
  838. });
  839.  
  840. getEl("hat_menu_content").addEventListener("wheel", event => {
  841. const hatMenuContent = getEl("hat_menu_content");
  842. const scrollTop = hatMenuContent.scrollTop;
  843.  
  844. getEl("hat_menu_content").scrollBy(0, event.deltaY < 0 ? (scrollTop === 203 || scrollTop === 200) ? -250 : -150 : 203);
  845. event.preventDefault();
  846. });
  847.  
  848. setTimeout(() => {
  849. const kd = document.createElement("div");
  850. const kdCount = (Number(document.querySelector("#total-kill").textContent) / Number(document.querySelector("#total-death").textContent)).toFixed(2);
  851. kd.innerHTML = `<div><div class="text-shadowed-3 profile-score">Kills/Deaths</div><div class="text-shadowed-3 profile-score yellow-text">${kdCount}</div></div>`;
  852. document.querySelector("#profile-container > div.middle-main.profile-scores").appendChild(kd);
  853. }, 200);
  854.  
  855. document.querySelectorAll('input[type="checkbox"]').forEach(el => {
  856. const id = el.id;
  857. if (["chestsHP", "LBF", "HP", "rainbHP", "rainbBar", "hideHPwNicks", "hideHUD", "autoRespawn", "hitboxes", "autobuy", "wrange", "rainbNick", "rainbClan", "nickGradient", "VSync", "slowMotion", "night", "vignette", "decorations", "itemCount", "keystrokes"].includes(id)) {
  858. el.checked = getValue(id);
  859. el.addEventListener("click", event => {
  860. changeSettings(id, !getValue(id));
  861. if (id === "VSync") {
  862. if (getValue(id)) {
  863. window.requestAnimationFrame = defaultRAF;
  864. } else {
  865. window.requestAnimationFrame = f => setTimeout(f, 0);
  866. };
  867. } else if (id === "hideHUD") {
  868. if (getValue(id)) {
  869. serverInfo.style.display = "none";
  870. FPS.style.display = "none";
  871. pingCount.style.display = "none";
  872. bossInfo.style.display = "none";
  873. CPS.style.display = "none";
  874. keystrokes.style.display = "none";
  875. } else {
  876. serverInfo.style.display = "block";
  877. FPS.style.display = "block";
  878. pingCount.style.display = "block";
  879. bossInfo.style.display = "block";
  880. CPS.style.display = "block";
  881. keystrokes.style.display = "flex";
  882. };
  883. } else if (id === "night") {
  884. getEl("nightEl").style.display = getValue(id) ? "block" : "none";
  885. } else if (id === "vignette") {
  886. const opacity = getValue("nightOpacity");
  887. getEl("nightEl").style.background = getValue(id) ? `radial-gradient(transparent, ${getValue("nightColor") + getValue("nightOpacity")})` : `${getValue("nightColor") + getValue("nightOpacity")}`
  888. } else if (id === "keystrokes") {
  889. keystrokes.style.display = getValue(id) ? "flex" : "none";
  890. };
  891. });
  892. };
  893. });
  894.  
  895. window.hue = 0;
  896. const updateColors = () => {
  897. window.barColor = getValue("rainbBar") ? `hsl(${window.hue}, 80%, 50%)` : "#ffffff";
  898. window.myHPColor = getValue("rainbHP") ? `hsl(${window.hue}, 80%, 50%)` : getValue("HPColor");
  899. window.hue = (window.hue + 0.3) % 360;
  900. };
  901.  
  902. const setNewInterval = () => {
  903. const speed = document.querySelector("#menu > div:nth-child(6) > input").value;
  904. const colorInterval = setInterval(() => {
  905. if (speed !== document.querySelector("#menu > div:nth-child(6) > input").value) {
  906. setNewInterval();
  907. clearInterval(colorInterval);
  908. };
  909. updateColors();
  910. }, document.querySelector("#menu > div:nth-child(6) > input").value);
  911. };
  912. setNewInterval();
  913. });
  914.  
  915. let sploopServers, currentServerUrl, ws;
  916. const getSploopServers = async () => await fetch("https://sploop.io/servers").then(e => e.json()).then(e => (sploopServers = e));
  917.  
  918. const entities = {
  919. 0: { health: 100 },
  920. 14: { health: 380 },
  921. 23: { health: 380 },
  922. 24: { health: 380 },
  923. 25: { health: 1000 },
  924. 27: { health: 5000 },
  925. 28: { health: 5000 },
  926. 36: { health: 380 },
  927. };
  928.  
  929. const packetsID = {
  930. item: 0,
  931. move: 1,
  932. hat: 5,
  933. chat: 7,
  934. place: 8,
  935. joinGame: 11,
  936. angle: 13,
  937. upgrade: 14,
  938. stopMove: 15,
  939. clanAcc: 17,
  940. stopAttack: 18,
  941. hit: 19,
  942. joinClan: 21,
  943. clan: 22,
  944. EAttack: 23,
  945. clanLeave: 24
  946. };
  947.  
  948. let myID, placing = true, onHand = 0, placed = false, isAlive = false;
  949. const sendPacket = (packetID, ...values) => ws.send(new Uint8Array([packetID, ...values]));
  950. const respawn = () => ws.send(JSON.stringify([10, localStorage.nickname, localStorage.skin, "FFFFFEEEEGGBBBAAA", localStorage.accessory, localStorage.accMail, localStorage.accToken, localStorage.back]))
  951. window.sendPacket = sendPacket;
  952.  
  953. const checkChat = () => getEl("chat-wrapper").style.display === "" || getEl("chat-wrapper").style.display === "none";
  954. window.openPlayersList = () => {
  955. let dis = getEl("plist").style.display;
  956. getEl("menu").style.display = "none";
  957. getEl("plist").style.display = dis === "flex" ? dis = "none" : dis = "flex";
  958. };
  959.  
  960. const updateCPS = () => {
  961. CPS.textContent = `CPS: ${++cps}`;
  962. setTimeout(() => {
  963. CPS.textContent = `CPS: ${--cps}`;
  964. }, 1000);
  965. };
  966.  
  967. window.addEventListener("mousedown", event => {
  968. const btn = event.which === 1 ? "LBtn" : "RBtn";
  969. getEl(btn).style.background = "rgb(255 255 255 / 62%)";
  970. updateCPS();
  971. });
  972.  
  973. window.addEventListener("mouseup", event => {
  974. const btn = event.which === 1 ? "LBtn" : "RBtn";
  975. setTimeout(() => {
  976. getEl(btn).style.background = "none";
  977. }, 20);
  978. });
  979.  
  980. let keyPressed = false;
  981.  
  982. window.addEventListener("keydown", event => {
  983. const pressedKey = event.code;
  984. let element;
  985.  
  986. switch (pressedKey) {
  987. case "Escape":
  988. window.openMenu();
  989. break;
  990. case "Digit1":
  991. case "Digit2":
  992. case "Digit3":
  993. case "KeyQ":
  994. case "KeyF":
  995. case "KeyR":
  996. element = getEl(pressedKey.slice(-1));
  997. if (element) element.style.background = "rgb(255 255 255 / 62%)";
  998. if (pressedKey === "Digit1") onHand = 0;
  999. else if (pressedKey === "Digit2") onHand = 1;
  1000. break;
  1001. case "Space":
  1002. if (!keyPressed) {
  1003. element = getEl("Space");
  1004. if (element) {
  1005. element.style.background = "rgb(255 255 255 / 62%)";
  1006. updateCPS();
  1007. keyPressed = true;
  1008. }
  1009. }
  1010. break;
  1011. }
  1012. });
  1013.  
  1014. window.addEventListener("keyup", event => {
  1015. const pressedKey = event.code;
  1016. const element = pressedKey === "Space" ? getEl("Space") : getEl(pressedKey.slice(-1));
  1017. if (element) element.style.background = "none";
  1018. if (pressedKey === "Space") keyPressed = false;
  1019. });
  1020.  
  1021. window.seconds = undefined;
  1022.  
  1023. window.updatePList = () => {
  1024. getEl("plist").innerHTML = ``;
  1025. if (window.allPlayers) {
  1026. window.allPlayers.forEach(player => {
  1027. if (player[Sploop.nick] !== "") {
  1028. const element = document.createElement("span");
  1029. element.textContent = `{${player[Sploop.id2]}} ${player[Sploop.nick]}`;
  1030. element.className = "checkbox-text";
  1031. element.style = `
  1032. font-size: 17px;
  1033. padding-top: 10px;
  1034. left: 10px;
  1035. position: relative;
  1036. user-select: text;
  1037. `;
  1038. getEl("plist").append(element);
  1039. };
  1040. });
  1041. };
  1042. };
  1043.  
  1044. window.getKill = (data) => {
  1045. };
  1046.  
  1047. let nextBoss = 0;
  1048. window.getBoss = (ID, bosses) => {
  1049. clearInterval(window.seconds);
  1050. const whichBoss = ID === 0 ? "cow" : ID === 1 ? "dragon" : ID === 2 ? "mammoth" : "unknown";
  1051. nextBoss = bosses[ID + 1 < 3 ? ID + 1 : 0].name;
  1052. bossInfo.textContent = `Boss: ${whichBoss}`;
  1053. };
  1054.  
  1055. window.getWS = (websocket) => {
  1056. ws = websocket;
  1057. currentServerUrl = ws.url.split('//')[1].split('.')[0];
  1058. window.myWS = ws;
  1059. ws.onclose = () => {
  1060. ws = undefined;
  1061. buyed = false;
  1062. };
  1063. };
  1064.  
  1065. window.receiveMsg = (msg) => {
  1066. const data = msg.data;
  1067. const decoded = typeof data === "string" ? JSON.parse(data) : new Uint8Array(data);
  1068. switch (decoded[0]) {
  1069. case 15:
  1070. getEl("pingCount").textContent = `Ping: ${decoded[1]}`;
  1071. break;
  1072. case 21: {
  1073. let count = 59;
  1074. window.seconds = setInterval(() => {
  1075. bossInfo.textContent = `Next boss: ${nextBoss} ${count}s`;
  1076. count--;
  1077. }, 1000)
  1078. break;
  1079. }
  1080. case 35:
  1081. if (getValue("autobuy") && !buyed) {
  1082. for (let i = 0; i < 12; i++) sendPacket(packetsID.hat, i);
  1083. buyed = true;
  1084. };
  1085. isAlive = true;
  1086. serverInfo.style.display = "block";
  1087. FPS.style.display = "block";
  1088. pingCount.style.display = "block";
  1089. bossInfo.style.display = "block";
  1090. CPS.style.display = "block";
  1091. if (getValue("keystrokes")) keystrokes.style.display = "flex";
  1092. break;
  1093. case 19:
  1094. if (getValue("autoRespawn")) respawn();
  1095. onHand = 0;
  1096. isAlive = false;
  1097. placed = false;
  1098. serverInfo.style.display = "none";
  1099. FPS.style.display = "none";
  1100. pingCount.style.display = "none";
  1101. bossInfo.style.display = "none";
  1102. CPS.style.display = "none";
  1103. keystrokes.style.display = "none";
  1104. getEl("plist").style.display = "none";
  1105. break;
  1106. case 33:
  1107. myID = decoded[1];
  1108. window.myID = myID;
  1109. break;
  1110. };
  1111. };
  1112.  
  1113. window.receiveChatMsg = (text) => {
  1114. if (text.includes("spawn")) {
  1115. window.decorations.push({
  1116. id: Number(text.split(" ")[1]),
  1117. [Sploop.x]: window.myX,
  1118. [Sploop.y]: window.myY,
  1119. gu: {
  1120. Mu: 2,
  1121. vu: 2
  1122. }
  1123. });
  1124. }
  1125. if (text.includes("remove")) {
  1126. let lastIndex = window.decorations.findLastIndex(obj => obj.id == Number(text.split(" ")[1]));
  1127. if (lastIndex !== -1) {
  1128. window.decorations.splice(lastIndex, 1);
  1129. }
  1130. }
  1131. if (text.includes("removes")) {
  1132. let lastIndex = window.decorations.findIndex(obj => obj.id == Number(text.split(" ")[1]));
  1133. if (lastIndex !== -1) {
  1134. window.decorations.splice(lastIndex, 1);
  1135. }
  1136. }
  1137. };
  1138.  
  1139. let gameEntity;
  1140. let chests = [], queue = [];
  1141. window.attackAnimation = (type, id, weapon, isObject, entity) => {
  1142. if (entity.type === 30 && chests.some(chest => chest[Sploop.id2] === id)) {
  1143. queue.push(id);
  1144. } else if (entity.type === 0) {
  1145. const chests = queue.map(id => gameEntity.get(id));
  1146. queue = [];
  1147. if (!chests.length) return;
  1148. const hatAdditional = entity[Sploop.hat] === 11 ? 1.4 : (entity[Sploop.hat] === 2 ? 1.25 : 1);
  1149. const damage = (window.weapons[weapon][Sploop.weaponDamage2] || window.weapons[weapon][Sploop.weaponDamage]) * hatAdditional;
  1150. chests.forEach(entity => {
  1151. entity.health = ((entity.health -= damage) % 1 === 0) ? entity.health.toFixed(0) : entity.health.toFixed(1);
  1152. });
  1153. };
  1154. };
  1155.  
  1156. window.drawChestHP = (target, id, ctx, step) => {
  1157. if (target.type === 30 && target.health === undefined) target.health = 380;
  1158. if (!chests.some(chest => chest[Sploop.id2] === target[Sploop.id2]) && target.type === 30) chests.push(target);
  1159. if (getValue("hitboxes")) {
  1160. ctx.save();
  1161. ctx.beginPath();
  1162. ctx.lineWidth = 1.5;
  1163. ctx.arc(0, 0, window.sprites[target.type][Sploop.size], 0, 2 * Math.PI);
  1164. ctx.stroke();
  1165. ctx.closePath();
  1166. ctx.restore();
  1167. };
  1168. };
  1169.  
  1170. window.removeEntity = (entity) => {
  1171. if (!entity.health) return;
  1172. if ([12].includes(entity.type)) {
  1173. const player = [...gameEntity].filter(([key, value]) => Sploop.id in value && value[Sploop.id] === entity[Sploop.id] && value.type === 0)[0][1];
  1174. const spike = queue.map(id => gameEntity.get(id));
  1175. queue = [];
  1176. spike.forEach(obj => {
  1177. obj.health -= player[Sploop.currentWeapon];
  1178. });
  1179. };
  1180. delete entity.health;
  1181. const index = chests.findIndex(chest => chest[Sploop.id2] === entity[Sploop.id2]);
  1182. if (index !== -1) {
  1183. chests.splice(index, 1);
  1184. };
  1185. };
  1186.  
  1187. window.getEntityData = async (entity, ctx, isTeammate, map) => {
  1188. gameEntity = map;
  1189. if (!entity) return;;
  1190. const entityX = entity[Sploop.x],
  1191. entityY = entity[Sploop.y];
  1192. if (entity[Sploop.id] === myID) {
  1193. window.myX = entityX;
  1194. window.myY = entityY;
  1195. window.myAngle = entity[Sploop.angle];
  1196. window.myID2 = entity[Sploop.id2];
  1197. }
  1198. if (getValue("hitboxes")) {
  1199. ctx.save();
  1200. ctx.beginPath();
  1201. ctx.lineWidth = 1.5;
  1202. ctx.arc(entity[Sploop.x], entity[Sploop.y], window.sprites[entity.type][Sploop.size], 0, 2 * Math.PI);
  1203. ctx.stroke();
  1204. ctx.closePath();
  1205. ctx.restore();
  1206. };
  1207. const maxHealth = entities[entity.type].health;
  1208. const entityHealth = ((entity[Sploop.health] * maxHealth / 100) / 255 * 100).toFixed(0);
  1209. if (getValue("wrange") && entity.type === 0) {
  1210. const entityWeapon = entity[Sploop.currentWeapon],
  1211. entityAngle = entity[Sploop.angle],
  1212. weaponRange = window.weapons[entityWeapon].range,
  1213. weaponName = window.weapons[entityWeapon][Sploop.weaponName];
  1214. ctx.save();
  1215. ctx.beginPath();
  1216. ctx.fillStyle = "#0000001A";
  1217. ctx.strokeStyle = "#ffffff80";
  1218. ctx.lineWidth = 3;
  1219. if (weaponName === "XBow" || weaponName === "Bow" || weaponName === "Stone Musket" || weaponName === "Pearl") {
  1220. const weaponX = weaponRange * Math.cos(entityAngle) + entityX;
  1221. const weaponY = weaponRange * Math.sin(entityAngle) + entityY;
  1222. ctx.moveTo(entityX, entityY)
  1223. ctx.lineTo(weaponX, weaponY);
  1224. } else {
  1225. ctx.arc(entityX, entityY, weaponRange, entityAngle - 1.5, entityAngle + 1.5)
  1226. };
  1227. ctx.fill();
  1228. ctx.stroke();
  1229. ctx.closePath();
  1230. ctx.restore();
  1231. };
  1232. if (getValue("HP")) {
  1233. ctx.font = "100 20px MV Boli";
  1234. ctx.shadowOffsetX = 2;
  1235. ctx.shadowOffsetY = 2;
  1236. ctx.shadowColor = "#000000";
  1237. ctx.shadowBlur = 5;
  1238. ctx.fillStyle = (entity[Sploop.id] === myID || isTeammate) ? window.myHPColor : getValue("EnemysHPColor");
  1239. ctx.fillText(`${entityHealth}/${maxHealth}`, entityX - 50, entityY + window.sprites[entity.type][Sploop.size] + 70);
  1240. ctx.shadowBlur = 0;
  1241. ctx.shadowOffsetX = 0;
  1242. ctx.shadowOffsetY = 0;
  1243. };
  1244. if (getValue("chestsHP") && chests.length) {
  1245. chests.forEach(target => {
  1246. ctx.save();
  1247. ctx.beginPath();
  1248. ctx.textAlign = "center";
  1249. ctx.font = "600 20px Comfortaa";
  1250. ctx.fillStyle = "#fff";
  1251. ctx.strokeStyle = "#000";
  1252. ctx.lineWidth = 3;
  1253. ctx.strokeText(target.health, target[Sploop.x], target[Sploop.y] + 5);
  1254. ctx.fillText(target.health, target[Sploop.x], target[Sploop.y] + 5);
  1255. ctx.fillRect
  1256. ctx.closePath();
  1257. ctx.restore();
  1258. });
  1259. };
  1260. };
  1261.  
  1262. const max = [0, 0, 0, 100, 30, 8, 2, 12, 32, 1, 2];
  1263. window.drawItemBar = (ctx, imageData, index) => {
  1264. if (!getValue("itemCount")) return;
  1265. const limit = max[window.weapons[window.stats[Sploop.itemsID][index]][Sploop.weaponID2]];
  1266. const crntCount = window.stats[Sploop.objCount][window.weapons[window.stats[Sploop.itemsID][index]][Sploop.weaponID2]];
  1267. if (limit == 0) return;
  1268. const text = `${crntCount}/${limit}`;
  1269. ctx.save();
  1270. ctx.font = "600 25px MV Boli";
  1271. ctx.fillStyle = "#000";
  1272. ctx.fillText(text, imageData[Sploop.x] + imageData.width - ctx.measureText(text).width - 10, imageData[Sploop.y] + 25);
  1273. ctx.restore();
  1274. };
  1275.  
  1276. const TYPEOF = value => Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
  1277. const NumberSystem = [
  1278. { radix: 2, prefix: "0b0*" },
  1279. { radix: 8, prefix: "0+" },
  1280. { radix: 10, prefix: "" },
  1281. { radix: 16, prefix: "0x0*" }
  1282. ];
  1283. class Regex {
  1284. constructor(code, unicode) {
  1285. this.code = this.COPY_CODE = code;
  1286. this.unicode = unicode || false;
  1287. this.hooks = {};
  1288. };
  1289.  
  1290. static parseValue = value => {
  1291. try { return Function(`return (${value})`)(); }
  1292. catch (err) { return null; }
  1293. };
  1294.  
  1295. isRegexp = value => TYPEOF(value) === "regexp";
  1296.  
  1297. generateNumberSystem = int => `(?:${NumberSystem.map(({ prefix, radix }) => prefix + int.toString(radix)).join("|")})`;
  1298.  
  1299. parseVariables = regex => regex.replace(/\{VAR\}/g, "(?:let|var|const)")
  1300. .replace(/\{QUOTE\}/g, "['\"`]")
  1301. .replace(/ARGS\{(\d+)\}/g, (_, count) => (Array(Number(count)).fill("\\w+")).join("\\s*,\\s*"))
  1302. .replace(/NUMBER\{(\d+)\}/g, (_, int) => this.generateNumberSystem(Number(int)));
  1303.  
  1304. format = (name, inputRegex, flags) => {
  1305. const regex = Array.isArray(inputRegex) ? inputRegex.map(exp => this.isRegexp(exp) ? exp.source : exp).join("\\s*") : this.isRegexp(inputRegex) ? inputRegex.source : "";
  1306. let parsedRegex = this.parseVariables(regex);
  1307.  
  1308. if (this.unicode) {
  1309. parsedRegex = parsedRegex.replace(/\\w/g, "(?:[^\\x00-\\x7F-]|\\$|\\w)");
  1310. };
  1311.  
  1312. const expression = new RegExp(parsedRegex.replace(/\{INSERT\}/, ""), flags);
  1313. return parsedRegex.includes("{INSERT}") ? new RegExp(parsedRegex, flags) : expression;
  1314. };
  1315.  
  1316. template = (type, name, regex, substr) => {
  1317. const expression = new RegExp(`(${this.format(name, regex).source})`);
  1318. const match = this.code.match(expression) || [];
  1319. this.code = this.code.replace(expression, type === 0 ? "$1" + substr : substr + "$1");
  1320. return match;
  1321. };
  1322.  
  1323. match = (name, regex, flags, debug = false) => {
  1324. const expression = this.format(name, regex, flags);
  1325. const match = this.code.match(expression) || [];
  1326. this.hooks[name] = { expression, match };
  1327. return match;
  1328. };
  1329.  
  1330. matchAll = (name, regex, debug = false) => {
  1331. const expression = this.format(name, regex, "g");
  1332. const matches = [...this.code.matchAll(expression)];
  1333. this.hooks[name] = { expression, match: matches };
  1334. return matches;
  1335. };
  1336.  
  1337. replace = (name, regex, substr, flags) => {
  1338. const expression = this.format(name, regex, flags);
  1339. this.code = this.code.replace(expression, substr);
  1340. return this.code.match(expression) || [];
  1341. };
  1342.  
  1343. replaceAll = (name, regex, substr, flags) => {
  1344. const expression = this.format(name, regex, "g");
  1345. this.code = this.code.replaceAll(expression, substr);
  1346. return this.code.match(expression) || [];
  1347. };
  1348.  
  1349. append = (name, regex, substr) => this.template(0, name, regex, substr);
  1350.  
  1351. prepend = (name, regex, substr) => this.template(1, name, regex, substr);
  1352.  
  1353. insert = (name, regex, substr) => {
  1354. const { source } = this.format(name, regex);
  1355. if (!source.includes("{INSERT}")) throw new Error("Your regexp must contain {INSERT} keyword");
  1356. const findExpression = new RegExp(source.replace(/^(.*)\{INSERT\}(.*)$/, "($1)($2)"));
  1357. this.code = this.code.replace(findExpression, `$1${substr}$2`);
  1358. return this.code.match(findExpression);
  1359. };
  1360. };
  1361.  
  1362. window.openMenu = () => {
  1363. let dis = getEl("menu").style.display;
  1364. getEl("plist").style.display = "none";
  1365. getEl("menu").style.display = dis === "block" ? dis = "none" : dis = "block";
  1366. };
  1367.  
  1368. window.abbreviateNumber = (number) => {
  1369. const suffixes = {
  1370. 't': 1e12,
  1371. 'b': 1e9,
  1372. 'm': 1e6,
  1373. 'k': 1e3,
  1374. };
  1375.  
  1376. for (const [letter, value] of Object.entries(suffixes)) {
  1377. if (number >= value) {
  1378. let abbreviated = (number / value).toFixed(2).replace(/\.?0*$/, '');
  1379. return `${abbreviated}${letter}`;
  1380. };
  1381. };
  1382.  
  1383. return number.toString();
  1384. };
  1385.  
  1386. window.hslToHex = (h, s, l) => {
  1387. l /= 100;
  1388. const a = s * Math.min(l, 1 - l) / 100;
  1389. const f = n => {
  1390. const k = (n + h / 30) % 12;
  1391. const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
  1392. return Math.round(255 * color).toString(16).padStart(2, '0');
  1393. };
  1394. return `#${f(0)}${f(8)}${f(4)}`;
  1395. };
  1396.  
  1397. let frames = 0,
  1398. lastTime,
  1399. lastUpdate = 0,
  1400. frameCount = 0;
  1401. window.updateFPSCounter = (currentTime) => {
  1402. const elapsedSeconds = (currentTime - (lastTime || (lastTime = currentTime))) / 1000;
  1403. frameCount++;
  1404.  
  1405. if (elapsedSeconds >= 1) {
  1406. FPS.textContent = `FPS: ${Math.round(frameCount / elapsedSeconds)}`;
  1407. frameCount = 0;
  1408. lastTime = currentTime;
  1409. };
  1410. };
  1411.  
  1412. let Sploop;
  1413. const applyHooks = code => {
  1414. const Hook = new Regex(code, true);
  1415. window.COPY_CODE = (Hook.COPY_CODE.match(/^(\(function \w+\(\w+\)\{.+)\(.+?\);$/) || [])[1];
  1416. Hook.append("EXTERNAL fix", /\(function (\w+)\(\w+\)\{/, "let $2 = eval(`(() => ${COPY_CODE})()`);delete window.COPY_CODE;");
  1417. const nick = Hook.match("nick", /\.(\w+):"XX"/)[1];
  1418. const ID = Hook.match('ID', /&&\w{2}===\w\.(\w{2})\){/)[1];
  1419. const map = Hook.match("objects", /let \w=(\w).get\(\w\)/)[1];
  1420. const myData = Hook.match('myPlayer', /=(\w.get\(\w{2}\));\w&&\w\(\)/)[1];
  1421. const X = Hook.match('playerX', /\{this\.(\w{2})=\w\|\|0/)[1];
  1422. const Y = Hook.match('playerY', /,this\.(\w{2})=\w\|\|0\}/)[1];
  1423. const ID2 = Hook.match('ID2', /-1!==\w+\.(\w+)&&/)[1];
  1424. const currentWeapon = Hook.match("crntWeapon", /,\w.(\w{2})===/)[1];
  1425. const angle = Hook.match("angle", /;\w.(\w{2})=\w\(\)/)[1];
  1426. const weaponName = Hook.match("wpnName", /(\w{2}):"XX/)[1];
  1427. const health = Hook.match("health", /(\w{2})<<8;/)[1];
  1428. const weaponDamage = Hook.match("wpnDamage", /(\w{2}):32,reload:300/)[1];
  1429. const weaponDamage2 = Hook.match("wpnDamage", /\w{2}:25,.{6}:300,(\w{2}):30/)[1];
  1430. const teamID = Hook.match('test', /,\w=\w.(\w{2})\|.+?\<\<8/)[1];
  1431. const radius = Hook.match("radius", /(\w{2}):220/)[1];
  1432. const [, currentItem, hat] = Hook.match("hat", /\(\w+\.(\w+)\|\w+\.(\w+)<<NUMBER{8}\)/);
  1433. const inWhichObject = Hook.match("iwo", /110\).+?,1===\w.(\w{2})&&!\w{2}/)[1];
  1434. const weaponID = Hook.match('weaponID', /5,(\w{2}):0,\w{2}:22,/)[1];
  1435. const weaponID2 = Hook.matchAll('el', /,(\w+):9,\w+:2/)[1][1];
  1436. const itemsID = Hook.match("IDs", />1\){.{3}(\w{2})/)[1];
  1437. const objCount = Hook.match("objCount", /\),this.(\w{2})=\w\):/)[1];
  1438. const size = Hook.match("size", /\.(\w{2})\+50/)[1];
  1439. const RweaponDMG = Hook.match("size", /\[0,0,10,0\](?:[^:]+:){4}[^,:]+,(\w{2})/)[1];
  1440. const Bosses = Hook.match("bosses", /\(3424\),(\w+)/)[1];
  1441. const itemBar = Hook.match("defaultData", /(\W\w+>NUMBER{1}\W.+?(\w+)\.(\w+).+?)function/)[3];
  1442. const myID = Hook.match("myID", /!==(\w{2})\)/)[1];
  1443. Sploop = {
  1444. x: X,
  1445. y: Y,
  1446. id: ID,
  1447. map: map,
  1448. id2: ID2,
  1449. hat: hat,
  1450. nick: nick,
  1451. size: size,
  1452. type: 'type',
  1453. angle: angle,
  1454. health: health,
  1455. radius: radius,
  1456. teamID: teamID,
  1457. itemsID: itemsID,
  1458. itemBar: itemBar,
  1459. objCount: objCount,
  1460. weaponID: weaponID,
  1461. weaponID2: weaponID2,
  1462. RweaponDMG: RweaponDMG,
  1463. weaponName: weaponName,
  1464. weaponDamage: weaponDamage,
  1465. weaponDamage2: weaponDamage2,
  1466. currentWeapon: currentWeapon,
  1467. inWhichObject: inWhichObject
  1468. }
  1469. log(Sploop);
  1470. window.Sploop = Sploop;
  1471. window.generatePositions = (amount, id) => {
  1472. let flowers = [];
  1473. for (let i = 0; i < amount; i++) {
  1474. let obj = {
  1475. [Sploop.x]: Math.floor(Math.random() * (9800 - 200 + 1)) + 200,
  1476. [Sploop.y]: Math.floor(Math.random() * (7450 - 200 + 1)) + 200,
  1477. id: id
  1478. };
  1479. flowers.push(obj);
  1480. };
  1481. return flowers;
  1482. };
  1483.  
  1484. window.decorations = [{"id":223,[Sploop.x]:29.99999999999999,[Sploop.y]:2550.0000000056198},{"id":223,[Sploop.x]:214.0002966762103,[Sploop.y]:2492.0291726187397},{"id":223,[Sploop.x]:382.0748870194689,[Sploop.y]:2440.6865700037215},{"id":223,[Sploop.x]:573.9858511507157,[Sploop.y]:2503.996448203956},{"id":223,[Sploop.x]:761.9999908462445,[Sploop.y]:2442.0386539633755},{"id":223,[Sploop.x]:952.0590210896952,[Sploop.y]:2505.0498958190256},{"id":223,[Sploop.x]:1259.9862437885706,[Sploop.y]:2452.0322384681695},{"id":223,[Sploop.x]:1450.0232490356113,[Sploop.y]:2512.003077236567},{"id":223,[Sploop.x]:1641.999998107236,[Sploop.y]:2447.999837480006},{"id":223,[Sploop.x]:1764.0000434531719,[Sploop.y]:2505.0000611454825},{"id":223,[Sploop.x]:1988.0000024140948,[Sploop.y]:2475.3910402273605},{"id":223,[Sploop.x]:2179.999948255453,[Sploop.y]:2539.9980611367455},{"id":223,[Sploop.x]:2371.000480338862,[Sploop.y]:2415.9959284149245},{"id":223,[Sploop.x]:2498.0000070562905,[Sploop.y]:2536.0629494204723},{"id":223,[Sploop.x]:2686.9998878301403,[Sploop.y]:2472.9999999978954},{"id":223,[Sploop.x]:2925.999527997155,[Sploop.y]:2485.018991363512},{"id":223,[Sploop.x]:3097.732209871221,[Sploop.y]:2439.997508765663},{"id":223,[Sploop.x]:3273.968723799376,[Sploop.y]:2549.999193626759},{"id":223,[Sploop.x]:3464.8013362358633,[Sploop.y]:2485.988137109807},{"id":223,[Sploop.x]:3658.901643634054,[Sploop.y]:2485.9999999926995},{"id":223,[Sploop.x]:3831.043036235859,[Sploop.y]:2526.0001627953843},{"id":223,[Sploop.x]:4082.9596476709476,[Sploop.y]:2461.9236918125425},{"id":223,[Sploop.x]:3956.0004172683734,[Sploop.y]:2461.99999999995},{"id":223,[Sploop.x]:4277.747414095257,[Sploop.y]:2513.8991451561224},{"id":223,[Sploop.x]:4509.000161954971,[Sploop.y]:2580.0064837158116},{"id":223,[Sploop.x]:4400.0000005704605,[Sploop.y]:2479.9017377199107},{"id":223,[Sploop.x]:4781.002734792941,[Sploop.y]:2488.1308565839},{"id":223,[Sploop.x]:4967.00551941161,[Sploop.y]:2551.1279965524545},{"id":223,[Sploop.x]:5160.050201842505,[Sploop.y]:2488.0470865591833},{"id":223,[Sploop.x]:5352.999570332228,[Sploop.y]:2552.020740569861},{"id":223,[Sploop.x]:5543.93781742945,[Sploop.y]:2488.0029731646046},{"id":223,[Sploop.x]:5737.000002635433,[Sploop.y]:2427.172435813349},{"id":223,[Sploop.x]:5928.993634014561,[Sploop.y]:2464.136863940179},{"id":223,[Sploop.x]:6116.258412735068,[Sploop.y]:2460.7532317948144},{"id":223,[Sploop.x]:6320.9560100313865,[Sploop.y]:2503.999997449834},{"id":223,[Sploop.x]:6559.886115789101,[Sploop.y]:2497.8825216612922},{"id":223,[Sploop.x]:6808.045482957361,[Sploop.y]:2434.7954508014664},{"id":223,[Sploop.x]:6686.313048001445,[Sploop.y]:2434.000063238881},{"id":223,[Sploop.x]:7007.821502411624,[Sploop.y]:2497.842353327186},{"id":223,[Sploop.x]:7201.89346427579,[Sploop.y]:2434.814349475234},{"id":223,[Sploop.x]:7394.0000069265125,[Sploop.y]:2496.000855023708},{"id":223,[Sploop.x]:7586.991570724414,[Sploop.y]:2496.002150801967},{"id":223,[Sploop.x]:7774.35475739181,[Sploop.y]:2433.97018813505},{"id":223,[Sploop.x]:7965.652671373453,[Sploop.y]:2433.9999999745323},{"id":223,[Sploop.x]:8105.065104471541,[Sploop.y]:2448.041779867961},{"id":223,[Sploop.x]:8357.00328524934,[Sploop.y]:2485.986261225132},{"id":223,[Sploop.x]:8500.999736983238,[Sploop.y]:2584.090122606014},{"id":223,[Sploop.x]:8679.159237507823,[Sploop.y]:2413.199101719817},{"id":223,[Sploop.x]:8908.11207669312,[Sploop.y]:2493.8815710969857},{"id":223,[Sploop.x]:9100.266251022786,[Sploop.y]:2430.0089637733436},{"id":223,[Sploop.x]:9286.056462091026,[Sploop.y]:2485.9780466880356},{"id":223,[Sploop.x]:9538.995084609018,[Sploop.y]:2450.9396355931212},{"id":223,[Sploop.x]:9732.002382560924,[Sploop.y]:2514.7415554647096},{"id":223,[Sploop.x]:9924.06913400942,[Sploop.y]:2450.3753934720717},{"id":224,[Sploop.x]:9633.066283895572,[Sploop.y]:2774.965527966431},{"id":224,[Sploop.x]:9368.367656473702,[Sploop.y]:2638.760240996886},{"id":224,[Sploop.x]:9108.93843443585,[Sploop.y]:2637.9999992425182},{"id":224,[Sploop.x]:8886.996496464813,[Sploop.y]:2740.465721502559},{"id":224,[Sploop.x]:8591.98848042534,[Sploop.y]:2697.955473152916},{"id":224,[Sploop.x]:8364.02653944699,[Sploop.y]:2742.099189166931},{"id":224,[Sploop.x]:8018.224819551448,[Sploop.y]:2652.8442740990295},{"id":224,[Sploop.x]:7777.999486631112,[Sploop.y]:2606.9522705110076},{"id":224,[Sploop.x]:7558.001173278906,[Sploop.y]:2890.046991103157},{"id":224,[Sploop.x]:8127.3105680599665,[Sploop.y]:2890.999995021336},{"id":224,[Sploop.x]:7398.508914037662,[Sploop.y]:2668.8699230283755},{"id":224,[Sploop.x]:6708.262218454327,[Sploop.y]:2866.24706119208},{"id":224,[Sploop.x]:6880.874061431822,[Sploop.y]:2568.0547673207466},{"id":224,[Sploop.x]:7048.001181302265,[Sploop.y]:2683.998365437441},{"id":224,[Sploop.x]:6384.51880056193,[Sploop.y]:2633.012344760018},{"id":224,[Sploop.x]:6229.001527052843,[Sploop.y]:2724.000037299408},{"id":224,[Sploop.x]:6185.032206096412,[Sploop.y]:2552.328289336163},{"id":224,[Sploop.x]:5833.001081234768,[Sploop.y]:2515.000004783373},{"id":224,[Sploop.x]:5635.013000179002,[Sploop.y]:2715.132991764611},{"id":224,[Sploop.x]:4983.825719408364,[Sploop.y]:2630.2715949351987},{"id":224,[Sploop.x]:4808.991452957154,[Sploop.y]:2675.0019236474545},{"id":224,[Sploop.x]:4529.012077026215,[Sploop.y]:2794.998442785668},{"id":224,[Sploop.x]:4248.154513207736,[Sploop.y]:2644.1945023172448},{"id":224,[Sploop.x]:3829.7973412358106,[Sploop.y]:2707.1158592753254},{"id":224,[Sploop.x]:3546.763829523222,[Sploop.y]:2679.8762554251716},{"id":224,[Sploop.x]:3265.379713427688,[Sploop.y]:2884.726069333624},{"id":224,[Sploop.x]:2752.170958277778,[Sploop.y]:2757.172314205808},{"id":224,[Sploop.x]:2342.000023920623,[Sploop.y]:2541.7259192431193},{"id":224,[Sploop.x]:2393.0000001045064,[Sploop.y]:2546.020440082226},{"id":224,[Sploop.x]:2375.214639614609,[Sploop.y]:2785.050511999293},{"id":224,[Sploop.x]:2011.4663935069682,[Sploop.y]:2678.3053400094395},{"id":224,[Sploop.x]:2319.999998340479,[Sploop.y]:2512.063388541019},{"id":224,[Sploop.x]:1781.5653155460602,[Sploop.y]:2919.7695949555446},{"id":224,[Sploop.x]:1457.9829399058456,[Sploop.y]:2732.69666008065},{"id":224,[Sploop.x]:1121.8816981507593,[Sploop.y]:2643.8009150795624},{"id":224,[Sploop.x]:902.8558665635351,[Sploop.y]:2914.533541069445},{"id":224,[Sploop.x]:617.7088262599689,[Sploop.y]:3000.208332291725},{"id":224,[Sploop.x]:115.76284446446414,[Sploop.y]:2761.1691492848804},{"id":224,[Sploop.x]:443.999174424608,[Sploop.y]:2626.910633614252},{"id":224,[Sploop.x]:401.0006173978146,[Sploop.y]:532.9993392260212}, {"id":"225",[Sploop.x]:146.3497840873793,[Sploop.y]:7519.927999039886},{"id":"225",[Sploop.x]:391.0196308967286,[Sploop.y]:7549.085720093481},{"id":"225",[Sploop.x]:543.1371807981709,[Sploop.y]:7533.976836147818},{"id":"225",[Sploop.x]:697.0531620113139,[Sploop.y]:7550.005525482361},{"id":"225",[Sploop.x]:841.2366989055986,[Sploop.y]:7546.024636082353},{"id":"225",[Sploop.x]:1002.1840190174183,[Sploop.y]:7499.675493417864},{"id":"225",[Sploop.x]:1142.6196506884087,[Sploop.y]:7548.285257450758},{"id":"225",[Sploop.x]:1304.2958114699852,[Sploop.y]:7548.0000001380395},{"id":"225",[Sploop.x]:1461.2890760037862,[Sploop.y]:7504.484162973849},{"id":"225",[Sploop.x]:1599.1268933314354,[Sploop.y]:7552.456685165645},{"id":"225",[Sploop.x]:1759.204500911972,[Sploop.y]:7529.112818068299},{"id":"225",[Sploop.x]:1885.5663898853736,[Sploop.y]:7535.997014384194},{"id":"225",[Sploop.x]:2008.864282123885,[Sploop.y]:7534.011987392109},{"id":"225",[Sploop.x]:2169.451157581377,[Sploop.y]:7508.428652937195},{"id":"225",[Sploop.x]:2321.4119053460654,[Sploop.y]:7524.004600254365},{"id":"225",[Sploop.x]:2445.37679324718,[Sploop.y]:7556.959438438634},{"id":"225",[Sploop.x]:2605.4951406107575,[Sploop.y]:7557.0000001068265},{"id":"225",[Sploop.x]:2745.837252598174,[Sploop.y]:7513.389117185103},{"id":"225",[Sploop.x]:2870.119102149074,[Sploop.y]:7545.351524404612},{"id":"225",[Sploop.x]:3053.1769305206426,[Sploop.y]:7545.000003910216},{"id":"225",[Sploop.x]:3154.026610855043,[Sploop.y]:7492.703531529384},{"id":"225",[Sploop.x]:3241.745184056783,[Sploop.y]:7558.0648618785635},{"id":"225",[Sploop.x]:3452.00226701193,[Sploop.y]:7544.999961196074},{"id":"225",[Sploop.x]:3567.4144062974487,[Sploop.y]:7498.745675591474},{"id":"225",[Sploop.x]:3688.934608223305,[Sploop.y]:7531.10369153833},{"id":"225",[Sploop.x]:3791.186191689511,[Sploop.y]:7520.999459482911},{"id":"225",[Sploop.x]:3906.079096108739,[Sploop.y]:7543.998942932907},{"id":"225",[Sploop.x]:4044.2380426104028,[Sploop.y]:7543.999999992666},{"id":"225",[Sploop.x]:4174.286212080739,[Sploop.y]:7505.998008278797},{"id":"225",[Sploop.x]:4319.522512008703,[Sploop.y]:7537.101396727113},{"id":"225",[Sploop.x]:4433.000000004023,[Sploop.y]:7513.999999995751},{"id":"225",[Sploop.x]:4555.716798990464,[Sploop.y]:7546.0026680826795},{"id":"225",[Sploop.x]:4670.1247637998,[Sploop.y]:7523.046104406854},{"id":"225",[Sploop.x]:4794.617556083352,[Sploop.y]:7555.999791719118},{"id":"225",[Sploop.x]:4941.651040639689,[Sploop.y]:7524.000003661002},{"id":"225",[Sploop.x]:5042.602176094363,[Sploop.y]:7556.0006088283935},{"id":"225",[Sploop.x]:5180.459249490879,[Sploop.y]:7556.00000000101},{"id":"225",[Sploop.x]:5303.000933676377,[Sploop.y]:7501.028451187172},{"id":"225",[Sploop.x]:5419.518179728937,[Sploop.y]:7548.018130776565},{"id":"225",[Sploop.x]:5557.021528601353,[Sploop.y]:7525.360710641226},{"id":"225",[Sploop.x]:5679.548749434651,[Sploop.y]:7558.387682614479},{"id":"225",[Sploop.x]:5817.081907074551,[Sploop.y]:7535.225502179956},{"id":"225",[Sploop.x]:5955.801011406585,[Sploop.y]:7536.998169722631},{"id":"225",[Sploop.x]:6058.068886876112,[Sploop.y]:7503.843014156425},{"id":"225",[Sploop.x]:6182.08285499084,[Sploop.y]:7536.468905493149},{"id":"225",[Sploop.x]:6319.000298599492,[Sploop.y]:7559.223506154572},{"id":"225",[Sploop.x]:6456.0438409023,[Sploop.y]:7559.000001239853},{"id":"225",[Sploop.x]:6593.708873816226,[Sploop.y]:7559.000000000004},{"id":"225",[Sploop.x]:6694.621021783071,[Sploop.y]:7503.922669545933},{"id":"225",[Sploop.x]:6802.017532395823,[Sploop.y]:7543.013844983488},{"id":"225",[Sploop.x]:6939.576139515191,[Sploop.y]:7519.736835652795},{"id":"225",[Sploop.x]:7094.688032200829,[Sploop.y]:7540.085798774424},{"id":"225",[Sploop.x]:7226.998639368321,[Sploop.y]:7522.058989048326},{"id":"225",[Sploop.x]:7387.01121045099,[Sploop.y]:7544.002188008208},{"id":"225",[Sploop.x]:7525.164163912381,[Sploop.y]:7520.477342503655},{"id":"225",[Sploop.x]:7682.63209343086,[Sploop.y]:7520.950333690332},{"id":"225",[Sploop.x]:7819.874119219743,[Sploop.y]:7474.529781602834},{"id":"225",[Sploop.x]:7914.101850271172,[Sploop.y]:7546.273684819922},{"id":"225",[Sploop.x]:8075.163398710387,[Sploop.y]:7523.178479254832},{"id":"225",[Sploop.x]:8243.626299995074,[Sploop.y]:7529.999928226666},{"id":"225",[Sploop.x]:8381.398267091548,[Sploop.y]:7506.778270687802},{"id":"225",[Sploop.x]:8610.0060525894,[Sploop.y]:7529.696290884706},{"id":"225",[Sploop.x]:8770.417583524257,[Sploop.y]:7553.000247702051},{"id":"225",[Sploop.x]:8448.995853929235,[Sploop.y]:7553.000000000004},{"id":"225",[Sploop.x]:8929.703318071148,[Sploop.y]:7552.999999999999},{"id":"225",[Sploop.x]:9044.893738170069,[Sploop.y]:7504.45378526034},{"id":"225",[Sploop.x]:9233.46060143763,[Sploop.y]:7495.997477063163},{"id":"225",[Sploop.x]:9348.000125187058,[Sploop.y]:7541.000685853901},{"id":"225",[Sploop.x]:9572.018260313409,[Sploop.y]:7527.314604546699},{"id":"225",[Sploop.x]:9702.810491263053,[Sploop.y]:7511.700779821693}, ...window.generatePositions(100, 220), ...window.generatePositions(100, 221), ...window.generatePositions(100, 222)];
  1485. Hook.append("flowers", /Date\.now\(\),\w=0;/, `
  1486. if (window.getValue("decorations")) {
  1487. window.decorations.forEach(decoration => {
  1488. if (Math.hypot(window.myX - Number(decoration.${Sploop.x}), window.myY - Number(decoration.${Sploop.y})) < 1500) st(decoration, decoration.id, t, n);
  1489. });
  1490. }
  1491. `);
  1492. Hook.append("itemCounter", /AGE 0.+?\[(\w+)\][,;](\w+)\.\w+\((\w+)\)([,;])/, `window.drawItemBar($4,$3,$2)$5`);
  1493. Hook.replace("removeCheckerForLB", /\w\(\w\.\w+\|\|/, `e(`);
  1494. Hook.replace("coloredLB", /((\w)\.\w+,\w\(\)\.\w+,)(\w\(\)\..{2}),(\w\(\)\.\w+)/, `$1$2.${Sploop.id2} == window.myID ? window.getValue("rainbNick") ? window.hslToHex(window.hue, 80, 50) : window.getValue("nickGradient") ? window.gradient : window.getValue("nickColor") : $3, $2.${Sploop.id2} == window.myID ? window.getValue("nickColor2") : $4`);
  1495. Hook.append("chatMsg", /\.length\)return;/, `window.receiveChatMsg(i);`);
  1496. Hook.append("openWS", /(\w+)\.onopen=\w=>{/, `window.getWS($2),`);
  1497. Hook.replace("LBPos", /width:250/, `width: 260`);
  1498. Hook.replace("biggerLBoard", /250,330/, `260, 330`);
  1499. Hook.replace("scorePos", /\+145/, `\+145`);
  1500. Hook.replace("strokeForScrInLB", /(\),\w\(\)\.\w+,)\w\(\)\..{2}\)/, `$1"#ffffff", "#2D3030")`);
  1501. Hook.insert("changeBiomesColors", /\.5\*\w+;{INSERT}.+?\+\+\)\w=(\w+).+?(\w+),\w\./, `
  1502. $3()[0].$4 = window.getValue("grassColor");
  1503. $3()[1].$4 = window.getValue("snowColor");
  1504. $3()[2].$4 = window.getValue("beachColor");
  1505. $3()[3].$4 = window.getValue("riverColor");
  1506. $3()[4].$4 = window.getValue("desertColor");
  1507. `);
  1508. Hook.append("updateFPS", /const (\w)=\+new Date,.+?3;/, `window.updateFPSCounter($2);`);
  1509. Hook.replace("let", /\);const (\w)=\+/, `);let $1=+`);
  1510. Hook.insert("test", /\w\.\w+,{INSERT}(\w)\),\w+&/, `window.getValue("slowMotion") ? $3 / 3 : `);
  1511. Hook.insert("w", /&.{15}\),\w+\(\w+,{INSERT}(\w)\),\w+/, `window.getValue("slowMotion") ? $3 / 3 : `);
  1512. Hook.replace("transparentDescr", /(\w\.fillStyle=")(#\w+"|\w\(\d+\))(,\w\()/, `$1#0000004D"$3`);
  1513. Hook.insert("addID", /\w+:function\(ARGS{8}{INSERT}\)/, `,id`);
  1514. Hook.insert("addID", /;return this\.\w+\(ARGS{9}{INSERT}\)/, `,id`);
  1515. Hook.insert("addID", /\w+:function\(ARGS{9}{INSERT}\){c/, `,id=false`);
  1516. Hook.replace("removeCheckerForNick", /;(const \w=)\w.\w+\|\|/, `;$1`);
  1517. Hook.replace("coloredNick", /(===(\w\.\w+);.{22}\.\w+,\w\(\)\.\w+,)\w\(\)\.\w+,("#\w+"|\w\(\d+\))/, `$1$2 === ${myID} ? window.getValue("rainbNick") ? window.hslToHex(window.hue, 80, 50) : window.getValue("nickColor") : "#fff", $2 === ${myID} ? window.getValue("nickColor2") : "#404040", undefined, undefined, undefined, undefined, $2`);
  1518. Hook.insert("names", /,{INSERT}\w+:480},\w\./, `name: "mammoth",`);
  1519. Hook.insert("names", /,{INSERT}\w+:480},\w\[/, `name: "dragon",`);
  1520. Hook.insert("names", /,{INSERT}duration:120/, `name: "cow",`);
  1521. Hook.replace("chooseItem", /"Choose item",40,"#fff"/, `"«Choose item»",40,"#fff","#303030"`);
  1522. Hook.replace("addGradient", /(1\*\w\+("px Baloo Paaji"|\w\(\d+\)),)(\w)(\[\w\(\d+\)\]|\.fillStyle)=(\w),/, `
  1523. $1
  1524. window.gradient=$3.createLinearGradient(0, 0, $3.measureText(n).width, 0),
  1525. window.gradient.addColorStop(0, window.getValue("gradient")),
  1526. window.gradient.addColorStop(1, window.getValue("gradient2")),
  1527. $3.fillStyle = id === window.myID && window.getValue("nickGradient") ? window.gradient : $5,
  1528. `);
  1529. Hook.append("hideHPwNicks", /45,0,2.+?\){/, `if (window.getValue("hideHPwNicks")) return;`);
  1530. Hook.append("hideHUD", /==\w+}function \w+\(\w,\w\){/, `if (window.getValue("hideHUD")) return;`);
  1531. Hook.insert("test", /{INSERT}.{12}\w+\[2\]\<<8;\w+=/, `return;`);
  1532. Hook.replace("test", /this.Fl=this.Fl/, "this.Fl=0");
  1533. Hook.replace("test", /.ag=.02/, ".ag=.0");
  1534. Hook.append("someFunction", /login\.hide\(\),\w{2}\(\)}/, `window.someFunction=lt;`);
  1535. const serverList = Hook.match("allPlayers", /\w",\w{2}:\w\?(\w{2}\.\w{2})\[/)[1];
  1536. Hook.replace("defaultData", /(\W\w+>NUMBER{1}\W.+?(\w+)\.(\w+).+?)function/, `$1setInterval(() => {window.allPlayers = ${serverList};window.updatePList();},1000);function`);
  1537. Hook.append("getBoss", /3\)}\w+ \w+\((\w),\w,\w\){/, `window.getBoss($2, ${Bosses}());`)
  1538. Hook.replace("abrScore", /(\w\(\d+\)\+)(\w)(\+\w\(\d+\),)/, `$1window.abbreviateNumber($2)$3`);
  1539. Hook.replace("abrScore", /\+(\w\[\w\]\[0\])/, `+window.abbreviateNumber($1)`);
  1540. Hook.replace("abrScore", /("ranking-score">.{3})(\w)/, `$1window.abbreviateNumber($2)`);
  1541. const weaponList = Hook.match("weaponList", /\?Math\.PI\/2.+?(\w\(\))/)[1];
  1542. Hook.append("Kills", /=1}}function.+?function.{4}(\w).{2}/, `window.getKill($2);`);
  1543. Hook.append('removeEntity', /\;let (\w)=\w.\w+\(\w\).{14}/, `window.removeEntity($2);`);
  1544. Hook.replace("renderItems", /(\(\w+\.\w+\+\w+,\w+\.\w+\+\w+\).+?\w+\(\).+?\w+\.\w+\.\w+\)([,;]))/, `$1window.drawChestHP(...arguments, ${Sploop.map})$2`);
  1545. Hook.replace("defaultData", /(\W\w+>NUMBER{1}\W.+?(\w+)\.(\w+).+?)function/, `$1window.stats=$2;window.sprites = tt();window.weapons=${weaponList};function`);
  1546. Hook.append("getMsg", /0;fu.{10}(\w).{2}/, `window.receiveMsg($2);`);
  1547. Hook.replace("particles", /(0,\w{2}=!1,\w{2}=)!1,/, `$1true,`);
  1548. Hook.replace("grid", /1,(\w{2})=!0/, `1, $1=false`);
  1549. Hook.replace("millMarker", /=false,(\w{2})=!0/, `=false,$1=false`);
  1550. Hook.replace("enablePing", /42.5\),(\w{2})=!1/, `42.5),$1=true`);
  1551. Hook.replace("nativeRender", /(true,\w{2}=)!1/, `$1true`);
  1552. Hook.replace("betterAGEBar", /("AGE 0"|\w\(\d+\)),24,("#fff"|\w\(\d+\))\)\);/, `"«0»",24,"#fff","#303030"));`);
  1553. Hook.replace("betterAGEBar", /("AGE "|\w\(\d+\))\+(\w),\d{2},("#\w+"|\w\(\d+\))/, `"«" + $2 + "»",24,"#fff","#303030"`);
  1554. Hook.replace("ColorMats", /\)\,24,\"\#\w{6}\"\)|\)\,24,\w\(\d{3}\)\)/, `),24,"#AE4D57", "#303030")`);
  1555. Hook.replace("ColorMats", /\)\,24,\"\#\w{6}\"\)|\)\,24,\w\(\d{3}\)\)/, `),24,"#935F3B", "#303030")`);
  1556. Hook.replace("ColorMats", /\)\,24,\"\#\w{6}\"\)|\)\,24,\w\(\d{3}\)\)/, `),24,"#7B7A91", "#303030")`);
  1557. Hook.replace("ColorMats", /\"\",24\,\D{9}|\"\",24\,\w\(\d{3}\)/, `"",24,"#FFD700", "#303030"`);
  1558. Hook.replace('customLoader', /Loading Sploop.io/, `Loading cringe...`);
  1559. Hook.replace("customBar", /20,10,(\w\(\d+\)|"#5D3A37")/, `20,10,"#00000080"`);
  1560. Hook.replace("customBar", /=(\w\(\d{3}\)|"#\w+"),this/, `=window.getValue("rainbBar") ? window.hslToHex(window.hue, 80, 50) : "#fff",this`);
  1561. Hook.replace("customHP", /(,\.18.+?\:).+?\)}/, `$1window.myHPColor)}`);
  1562. Hook.replace("customHP", /(=\.5;\w(\[\w\(\d+\)\]|\.fillStyle)=\w).+?,/, `$1?window.myHPColor : window.getValue("EnemysHPColor"),`);
  1563. Hook.replace("customClan", /"\["/, `"«"`);
  1564. Hook.replace("customClan", /"\]"/, `"»"`);
  1565. Hook.replace("customClan", /("»",\w\(\)\.\w+,)("#\w+"|\w\(\d+\)),("#\w+"|\w\(\d+\))/, `$1window.getValue("rainbClan") ? window.hslToHex(window.hue, 80, 50) : window.getValue("clanColor"),window.getValue("clanColor2")`);
  1566. Hook.append("showFullMats", /10},\w{2}\Dfunction\((\w)\){/, `return $2;`);
  1567. Hook.append("attackAnim", /\+=NUMBER{5}.+?(\w+)=.+?(\w+)=.+?(\w+)=.+?(\w+)=.+?(\w+)=.+?;/, `window.attackAnimation($2, $3, $4, $5, $6);`);
  1568. Hook.replace("showFullGold", /(\w)\>\d{7}.*?\+""/, `window.getValue("LBF")?$1:window.abbreviateNumber($1)`);
  1569. const kawakaa = Hook.match("m", /var.{6}(\w{2})\((\w),(\w)\)&&\w{2}\(.{5}/).slice(1);
  1570. Hook.append("newImg", /(\w).{9}(.{9})."clan_decline"\)\);/, `
  1571. $2[$2.length] = $3("settings"));
  1572. $2[$2.length - 1].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/wasdad-02.png?v=1708708420340";
  1573. $2[$2.length] = $3("list"));
  1574. $2[$2.length - 1].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/absba.png?v=1714327780784";
  1575. $2[$2.length] = $3("yFlower"));
  1576. $2[$2.length - 1].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/yellowFlower.png?v=1714580473155";
  1577. $2[$2.length] = $3("rFlower"));
  1578. $2[$2.length - 1].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/redFlower.png?v=1714579975791";
  1579. $2[$2.length] = $3("berry"));
  1580. $2[$2.length - 1].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/zxc.png?v=1714581353965";
  1581. $2[$2.length] = $3("bigEGG"));
  1582. $2[$2.length - 1].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/bigEGG.png?v=1714650054208";
  1583. $2[$2.length] = $3("miniEGG"));
  1584. $2[$2.length - 1].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/miniEGGpng.png?v=1714650626845";
  1585. $2[$2.length] = $3("ybigEGG"));
  1586. $2[$2.length - 1].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/ybigEGG.png?v=1714757303463";
  1587. `);
  1588. Hook.append("newImg", /1.{4}(\w{2})\((\w).{9}38.5,42.5\)/, `,huebok=$2($3[$3.length - 7], 38.5, 42.5)`);
  1589. Hook.append("newImg", /1.{4}(\w{2})\((\w).{9}38.5,42.5\)/, `,sbnoadnb=$2($3[$3.length - 8], 38.5, 42.5)`);
  1590. Hook.append("newImg", /var.{6}(\w{2})\((\w),(\w)\)&&\w{2}\(.{5}/, `sbnoadnb.$2($3, $4) && window.openMenu(), huebok.$2($3, $4) && window.openPlayersList(),`);
  1591. Hook.append("newImg", /return \w{2}.\w{2}\(\w,\w\)&&\((\w)=!0\),/, `sbnoadnb.${kawakaa[0]}(${kawakaa[1]}, ${kawakaa[2]}) && ($2 = !0), huebok.${kawakaa[0]}(${kawakaa[1]}, ${kawakaa[2]}) && ($2 = !0),`);
  1592. Hook.append("newImg", /\.(\w+)=5,(\w+).(\w+)=\w+.\w+-\w+(\[\w\(\d+\)\]|.width)-11;/ , `sbnoadnb.$2 = 5, sbnoadnb.$4 = $3.$4 - $3.width-11, huebok.$2 = 5, huebok.$4 = sbnoadnb.$4 - sbnoadnb.width-11;`);
  1593. Hook.append("newImg", /0,-50\)}}if\(\w{2}.\w{2}\(\w\),\w{2}.(\w{2})\((\w)\),/, `sbnoadnb.$2($3),huebok.$2($3),`);
  1594. let args = Hook.match("drawEntityInfo", /\.\w+\),\w(\.restore|\w\(\d+\))\(\)}function \w+\((ARGS{3})\){/)[2];
  1595. Hook.append('drawEntityInfo', /EnemysHPColor.+?width,\w\*\w.height\)/, `;try {window.getEntityData(${args}, ${Sploop.map});} catch(err) {};`);
  1596. return Hook.code;
  1597. };
  1598.  
  1599. window.eval = new Proxy(window.eval, {
  1600. apply(target, _this, args) {
  1601. const code = args[0];
  1602. if (code.length > 100000) {
  1603. args[0] = applyHooks(code);
  1604. window.eval = target;
  1605. }
  1606. return target.apply(_this, args);
  1607. }
  1608. });

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址