TC Meadow hack

DONT LEAK Modded also FUCK Trollers not xD Trollers tho

  1. // ==UserScript==
  2. // @name TC Meadow hack
  3. // @namespace -
  4. // @version BETA
  5. // @description DONT LEAK Modded also FUCK Trollers not xD Trollers tho
  6. // @author The Trollers Ehscripts
  7. // @match zombs.io
  8. // @match http://meadow-rocky-lan.glitch.me/
  9. // @icon https://i.pinimg.com/originals/0d/f2/c4/0df2c47c6fb1f663fa8e29357c96b61d.jpg
  10. // @grant none
  11. // @license MIT
  12. // @license TC Meadow
  13. // ==/UserScript==
  14.  
  15. // DO NOT LEAK!!!!
  16. //IMa leak this haha *Dark kg xD Trollers TC Meadow Sway*
  17.  
  18. /*** DEATHRAIN ***/
  19. document.querySelectorAll('.ad-unit, .hud-intro-left, .hud-intro-wrapper > h2, .hud-intro-form > label, .hud-intro-stone, .hud-intro-tree, .hud-intro-corner-bottom-left, .hud-intro-corner-bottom-right').forEach(el => el.remove());
  20. document.getElementsByClassName("hud-intro-form")[0].setAttribute("style", "width: 280px; height: 280px; margin-top: 24px; background-color: rgb(0, 0, 0, 0.0);");
  21. document.getElementsByClassName("hud-intro-guide")[0].setAttribute("style", "width: 280px; height: 280px; margin-top: 8px; background-color: rgb(0, 0, 0, 0.0);");
  22. document.getElementsByClassName("hud-intro-wrapper")[0].childNodes[1].innerHTML = `<br style="height:20px;" /><Custom><b><font size="36">Serplent Mod</font></b></Custom>`;
  23. let igText = document.getElementsByTagName("font")[0];
  24. igText.style.textTransform = "none";
  25. document.getElementsByClassName("hud-intro-play")[0].setAttribute("class", "btn btn-blue hud-intro-play");
  26. var Style1 = document.querySelectorAll('.hud-intro-name, .hud-intro-main, .hud-intro-server, .hud-intro-play');for (let i = 0; i < Style1.length; i++) {
  27. Style1[i].style.border = "3px solid #66e8ff";
  28. }
  29. ///=======================================/=======================================>
  30.  
  31. /*** EH ***/
  32.  
  33. window.lm = "Off";
  34. window.alttype = "WebSocket";
  35. window.follow = { toggle: false };
  36. window.gopt = {};
  37.  
  38. /*
  39. const blurCanvas = () => {
  40. document.querySelector('canvas').style.filter = "blur(1.5px)";
  41. };
  42.  
  43. const focusCanvas = () => {
  44. document.querySelector('canvas').style.filter = "none";
  45. };
  46.  
  47. let menuOpen = false;
  48.  
  49. document.getElementsByClassName("hud-menu-icon")[2].addEventListener('click', function() {
  50. menuOpen = !menuOpen;
  51. if(menuOpen) {
  52. blurCanvas();
  53. } else {
  54. focusCanvas();
  55. };
  56. });
  57. */
  58.  
  59. // sirr0m why do i have to comment the "blur game when you open the menu" code out it isn't very bad its only 1 and a half pixels of blur :(
  60.  
  61. (function(t, e) {
  62. let script = document.createElement("script")
  63. script.src = t
  64. document.body.appendChild(script)
  65.  
  66. let link = document.createElement("link")
  67. link.rel = "stylesheet"
  68. link.href = e
  69. document.head.appendChild(link) // append script tags to use noty
  70. })("https://cdnjs.cloudflare.com/ajax/libs/noty/3.1.4/noty.min.js", "https://cdnjs.cloudflare.com/ajax/libs/noty/3.1.4/noty.min.css")
  71.  
  72. let newYoutubers = [{
  73. name: "Xtreme", // retard raider
  74. channel: "https://www.youtube.com/channel/UCKS2BQZkU3mB0JvxQIVRlyA"
  75. }, {
  76. name: "deathrain", // retard raider
  77. channel: "https://www.youtube.com/channel/UC4Wl5kskE-fXku2pynDEjXQ"
  78. }, {
  79. name: "Apex", // retard raider
  80. channel: "https://www.youtube.com/channel/UCrVyJ-ivzuBDETc7y0MZf9A"
  81. }, {
  82. name: "KG FALLEN", // kage
  83. channel: "https://www.youtube.com/channel/UCCKIceY9pJfr2vBw9f7IT1A"
  84. }, {
  85. name: "ehScripts", // hackerman #1
  86. channel: "https://www.youtube.com/channel/UCICBX1kWvJUwxt_MlHZzdOA"
  87. }, {
  88. name: "Sirr0m", // epic cat guy
  89. channel: "https://www.youtube.com/channel/UCo2tH8aOC_cLgxChDBtZdmA"
  90. }, {
  91. name: "Peepo", // peepo!
  92. channel: "https://cdn.discordapp.com/emojis/801475958883614811.png?v=1"
  93. }, {
  94. name: "The Trollers", // hackerman #2
  95. channel: "https://www.youtube.com/channel/UCiiwV0WmsCqF8sGHxfoGsfA"
  96. }];
  97.  
  98. let youtuber = newYoutubers[Math.floor(Math.random() * newYoutubers.length)];
  99. document.getElementsByClassName("hud-intro-youtuber")[0].innerHTML = `<h3>Featured YouTuber:</h3><a href="${youtuber.channel}" target="_blank">${youtuber.name}</a>`;
  100.  
  101. window.altNames = "";
  102.  
  103. let sm = document.querySelector("#hud-menu-settings");
  104.  
  105. sm.style.backgroundColor = "rgba(28, 92, 65, 0.55)";
  106. sm.style.border = "5px solid white";
  107.  
  108. sm.innerHTML = `
  109. <style>
  110. Custom {
  111. letter-spacing: 10px;
  112. -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-image: url('https://media.discordapp.net/attachments/855622511553937429/862917682987139102/unknown.png');
  113. background-size: cover;
  114. }
  115. .hud-intro::before {
  116. background-image: url('https://i.pinimg.com/originals/0d/f2/c4/0df2c47c6fb1f663fa8e29357c96b61d.jpg');
  117. background-size: cover;
  118. }
  119. .hud-intro-main {
  120. padding: 0px 25px 25px 25px;
  121. width: 580px;
  122. height: 335px;
  123. background-image: linear-gradient(to bottom right, rgba(18, 124, 166, 0.65), rgba(18, 146, 196, 0.65), rgba(18, 124, 166, 0.65))
  124. }
  125. .hud-intro-name, .hud-intro-server {
  126. border: 3px solid #66e8ff;
  127. }
  128. .btn-blue, .btn-red {
  129. margin-top: 3px;
  130. margin-left: 3px;
  131. }
  132. ::-webkit-scrollbar-track {
  133. -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
  134. border-radius: 10px;
  135. background-color: #d3d3d3;
  136. }
  137. ::-webkit-scrollbar {
  138. width: 12px;
  139. height: 0px;
  140. border-radius: 10px;
  141. background-color: #F5F5F5;
  142. }
  143. ::-webkit-scrollbar-thumb {
  144. border-radius: 10px;
  145. -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
  146. background-color: #6fa890;
  147. }
  148. .tab {
  149. border-top-left-radius: 35%;
  150. border-top-right-radius: 35%;
  151. background-color: #6fa890;
  152. width: 150px;
  153. height: 50px;
  154. border: 4px solid white;
  155. display: inline-block;
  156. text-align: center;
  157. color: black;
  158. }
  159. #addtab {
  160. background-color: #35594a;
  161. margin-left: 175px;
  162. margin-top: -40px;
  163. }
  164. .rmtab {
  165. background-color: rgba(0, 0, 0, 0);
  166. border-color: rgba(0, 0, 0, 0);
  167. font-weight: bold;
  168. }
  169. .btn-fixed {
  170. display: inline-block;
  171. height: 25px;
  172. line-height: 25px;
  173. padding: 0 12px;
  174. background: #444;
  175. color: #eee;
  176. border: 0;
  177. font-size: 14px;
  178. vertical-align: top;
  179. text-align: center;
  180. text-decoration: none;
  181. text-shadow: 0 1px 0 rgba(0, 0, 0, 0.4);
  182. box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
  183. border-radius: 4px;
  184. transition: all 0.15s ease-in-out;
  185. }
  186. .search-bar {
  187. background-color: #FFF;
  188. background-image: linear-gradient(to bottom right, rgba(118, 168, 111, 0.85), rgba(111, 168, 158, 0.85), rgba(131, 189, 117, 0.8));
  189. outline: none;
  190. border: 2px solid white;
  191. border-radius: 5px;
  192. color: white;
  193. text-shadow: 1.5px 1.5px 1px #41593b;
  194. font-size: 16px;
  195. vertical-align: middle;
  196. }
  197. ::placeholder {
  198. color: white;
  199. text-shadow: 1.5px 1.5px 1px #41593b;
  200. }
  201. * {
  202. font-family: Hammersmith One;
  203. }
  204. #searchpgs {
  205. width: 80%;
  206. height: 25px;
  207. }
  208. .btn-curve-right {
  209. border-top-right-radius: 25px;
  210. border-bottom-right-radius: 25px;
  211. }
  212. .btn-curve-left {
  213. border-top-left-radius: 25px;
  214. border-bottom-left-radius: 25px;
  215. }
  216. </style>
  217. <style>
  218. .switch {
  219. position: relative;
  220. display: inline-block;
  221. width: 60px;
  222. height: 34px;
  223. }
  224.  
  225. .switch input {
  226. opacity: 0;
  227. width: 0;
  228. height: 0;
  229. }
  230.  
  231. .slider {
  232. position: absolute;
  233. cursor: pointer;
  234. top: 0;
  235. left: 0;
  236. right: 0;
  237. bottom: 0;
  238. background-color: #ccc;
  239. -webkit-transition: .4s;
  240. transition: .4s;
  241. }
  242.  
  243. .slider:before {
  244. position: absolute;
  245. content: "";
  246. height: 26px;
  247. width: 26px;
  248. left: 4px;
  249. bottom: 4px;
  250. background-color: white;
  251. -webkit-transition: .4s;
  252. transition: .4s;
  253. }
  254.  
  255. input:checked + .slider {
  256. background-color: #2196F3;
  257. }
  258.  
  259. input:focus + .slider {
  260. box-shadow: 0 0 1px #2196F3;
  261. }
  262.  
  263. input:checked + .slider:before {
  264. -webkit-transform: translateX(26px);
  265. -ms-transform: translateX(26px);
  266. transform: translateX(26px);
  267. }
  268.  
  269. /* Rounded sliders */
  270. .slider.round {
  271. border-radius: 34px;
  272. }
  273.  
  274. .slider.round:before {
  275. border-radius: 50%;
  276. }
  277. </style>
  278. <div id="tabs">
  279. <div class="tab" id="tab1">
  280. <p>
  281. Main Menu
  282. <button class="rmtab" id="rmtab1">x</button>
  283. </p>
  284. </div>
  285. </div>
  286. <button class="btn" id="addtab">+</button>
  287. <br />
  288. <center>
  289. <button class="btn-fixed search-bar" onclick="window.bfb();"><i class="fa fa-angle-left"></i></button>
  290. <button class="btn-fixed search-bar" onclick="window.bff();"><i class="fa fa-angle-right"></i></button>
  291. <input class="btn-fixed search-bar" style="width: 70%; height: 25px; vertical-align: middle;" type="search" placeholder="Search all menu pages..." id="searchpgs" />
  292. <button class="btn-fixed search-bar" id="srchbtn"><i class="fa fa-search"></i></button></center>
  293. <hr />
  294. <div id="pageDisp">
  295. </div>
  296. </div>
  297. `;
  298.  
  299. let searchpgs = document.getElementById("searchpgs");
  300. let srchbtn = document.getElementById("srchbtn");
  301.  
  302. searchpgs.addEventListener("keydown", function(e) {
  303. if(e.keyCode === 13) {
  304. window.searchTab(this.value);
  305. };
  306. });
  307.  
  308. srchbtn.addEventListener("click", function(e) {
  309. window.searchTab(searchpgs.value);
  310. });
  311.  
  312. window.focusedTab = 1;
  313.  
  314. let tabId = 2;
  315. let tabs = document.getElementById("tabs");
  316. let addTab = document.getElementById("addtab");
  317. let addTabRightEffect = 175;
  318. let addTabDownEffect = -40;
  319. let tabsAmt = 1;
  320. let pageDisp = document.getElementById("pageDisp");
  321. let tabsData = [{
  322. type: "mainMenu",
  323. html: `
  324. <a href="https://discord.gg/q3J2Y7fbR2" target="_blank" style="float: right;"><button class="btn btn-facebook"><i class="fab fa-discord fa-lg"></i></button></a>
  325. <h1>iGniTioN</h1>
  326. <p>Developer: <strong>Serplent</strong></p>
  327. <p>Co-Developer: <strong>The Trollers</strong></p>
  328. <hr />
  329. <h2>Categories</h3>
  330. <button class="btn btn-blue" onclick="window.redirectTab('Score', 'score')">Score</button>
  331. <button class="btn btn-blue" onclick="window.redirectTab('Waves', 'waves')">Waves</button>
  332. <button class="btn btn-blue" onclick="window.redirectTab('Raid', 'raid')">Raid</button>
  333. <button class="btn btn-blue" onclick="window.redirectTab('Alts', 'alts')">Alts</button>
  334. <button class="btn btn-blue" onclick="window.redirectTab('Shortcuts', 'shortcuts')">Shortcuts</button>
  335. <button class="btn btn-blue" onclick="window.redirectTab('Miscellaneous', 'misc')">Misc.</button>
  336. `,
  337. keywords: [],
  338. visited: 0
  339. }, {
  340. type: "score",
  341. html: `
  342. <h1>Score</h1>
  343. <hr />
  344. <button class="btn btn-green" onclick="window.redirectTab('Player Trick', 'playertrick')">Player Trick</button>
  345. <button class="btn btn-green" onclick="window.redirectTab('Stats', 'sts')">Stats</button>
  346. <button class="btn btn-green" onclick="window.redirectTab('Auto Revive', 'arp')">Auto Revive</button>
  347. <button class="btn btn-green" onclick="window.redirectTab('Pet Heal', 'petheal')">Pet Heal</button>
  348. <button class="btn btn-green" onclick="window.redirectTab('AFS', 'afs')">AFS</button>
  349. `,
  350. keywords: ["score", "wr", "4player", "4p", "trick", "base"],
  351. name: "Score",
  352. category: true,
  353. visited: 0
  354. }, {
  355. type: "alts",
  356. html: `
  357. <h1>Alts</h1>
  358. <div id="alttype" style="display:inline-block;"></div><button class="btn btn-green" onclick="window.sendWs();" style="display:inline-block;margin-top: 4px;margin-left:10px;">Send Alt</button>
  359. <br /><br />
  360. <input type="text" maxlength="29" placeholder="Alt Name" id="BotName" class="btn-fixed search-bar" style="height: 35px;" />
  361. <select id="slctbnv">
  362. </select>
  363. <button class="btn btn-green" id="ALTname">Set Name</button>
  364. <h1 id="nfnlt"># of alts: //nlt, current alt ID: //si</h1>
  365. <label>Remove Alt: </label><input type="text" id="inprm" class="btn-fixed search-bar" placeholder="Alt ID" style="height: 40px;" />
  366. <button id="rmaltbtn" class="btn btn-green">Remove Alt</button>
  367. <br />
  368. <strong style="color: red; display: none;" id="noiderr"><i class="fa fa-times-circle"></i> Sorry, there is no alt with that ID.</strong>
  369. <br />
  370. <button class="btn btn-red" onclick="window.rmw();"><i class="fa fa-trash"></i> Remove WebSockets</button>
  371. <button class="btn btn-red" onclick="window.rmi();"><i class="fa fa-trash"></i> Remove iFrames</button>
  372. <button class="btn btn-red" onclick="window.rma();"><i class="fa fa-trash"></i> Remove All</button>
  373. <hr />
  374. <button class="btn btn-green" onclick="window.redirectTab('Player Trick', 'playertrick')">Player Trick</button><button class="btn btn-green" onclick="window.redirectTab('L Key', 'lkey')">L Key</button><button class="btn btn-green" onclick="window.redirectTab('AITO', 'aito')">AITO</button>
  375. `,
  376. keywords: ["alt", "bot", "4p", "trick", "fill", "clone"],
  377. name: "Alts",
  378. category: true,
  379. script: `
  380. let slctbnv = document.getElementById("slctbnv");
  381. slctbnv.innerHTML = window.altNames;
  382. let bn = document.getElementById("BotName");
  383. let an = document.getElementById("ALTname");
  384. slctbnv.onchange = () => {
  385. bn.value = this.value;
  386. };
  387. an.onclick = () => {
  388. let bnv = bn.value;
  389. game.options.nickname = bnv;
  390. window.altNames += '<br><option value="' + bnv + '">' + bnv + '</option>';
  391. window.focusTab(window.focusedTab, { pche: window.getTabDataByType("alts").cache, nlt: window.nlt, si: window.si });
  392. };
  393. let inprm = document.getElementById("inprm");
  394. let rmaltbtn = document.getElementById("rmaltbtn");
  395. rmaltbtn.onclick = () => {
  396. window.rmAlt(parseInt(inprm.value) - 1);
  397. };
  398. window.ats = new window.BS([{
  399. name: "WebSocket",
  400. color: "blue",
  401. onselect: () => { window.alttype = "WebSocket"; }
  402. }, {
  403. name: "iFrame",
  404. color: "red",
  405. onselect: () => { window.alttype = "iFrame"; }
  406. }]);
  407. window.ats.select(window.alttype);
  408. document.getElementById("alttype").append(ats.elem);
  409. `,
  410. visited: 0
  411. }, {
  412. type: "raid",
  413. html: `
  414. <h1>Raid</h1>
  415. <hr />
  416. <button class="btn btn-green" onclick="window.redirectTab('L Key', 'lkey')">L Key</button>
  417. <button class="btn btn-green" onclick="window.redirectTab('Entity Follower', 'ef')">Entity Follower</button>
  418. `,
  419. keywords: ["raid", "kill", "offense", "offend", "destroy", "destruct", "lkey", "l key"],
  420. name: "Raid",
  421. category: true,
  422. visited: 0
  423. }, {
  424. type: "waves",
  425. html: `
  426. <h1>Waves</h1>
  427. <hr />
  428. <button class="btn btn-green" onclick="window.redirectTab('AITO', 'aito')">AITO</button>
  429. <button class="btn btn-green" onclick="window.redirectTab('Auto ReBuilder', 'rebuilder')">Auto ReBuilder</button>
  430. <button class="btn btn-green" onclick="window.redirectTab('3x3 Walls', 'x3w')">3x3 Walls</button>
  431. <button class="btn btn-green" onclick="window.redirectTab('Alarms', 'alarms')">Alarms</button>
  432. `,
  433. keywords: ["defense", "defend", "anti", "rebuild", "re build", "auto rebuild", "autorebuild", "auto", "shield", "fixed shield", "fixedshield", "afs", "arp", "revive", "pet", "protec", "wave"],
  434. name: "Waves",
  435. category: true,
  436. visited: 0
  437. }, {
  438. type: "playertrick",
  439. html: `
  440. <h1>Player Trick</h2>
  441. <button class="btn" id="tglpt"></button>
  442. <p><strong><i class="fa fa-info-circle"></i> Will apply to the current alts, not send them</strong></p>
  443. <hr />
  444. <h2>Related Pages</h2>
  445. <button class="btn btn-green" onclick="window.redirectTab('Alts', 'alts')">Alts</button>
  446. <button class="btn btn-blue" onclick="window.redirectTab('Score', 'score')">Score</button>
  447. `,
  448. script: `
  449. let tglpt = document.getElementById("tglpt");
  450.  
  451. if(window.playerTrickToggle) {
  452. tglpt.classList.add("btn-red");
  453. tglpt.innerText = "Disable Player Trick"
  454. } else {
  455. tglpt.classList.add("btn-green");
  456. tglpt.innerText = "Enable Player Trick"
  457. };
  458.  
  459. tglpt.addEventListener("click", function() {
  460. if(this.classList.contains("btn-green")) {
  461. this.classList.replace("btn-green", "btn-red");
  462. this.innerText = "Disable Player Trick";
  463. } else {
  464. this.classList.replace("btn-red", "btn-green");
  465. this.innerText = "Enable Player Trick";
  466. };
  467. window.togglePlayerTrick();
  468. });
  469. `,
  470. keywords: ["4p", "4player", "trick", "score", "wr", "bot", "alt", "4 player"],
  471. name: "Player Trick",
  472. category: false,
  473. visited: 0
  474. }, {
  475. type: "search",
  476. html: `
  477. <h1>//sqt</h1>
  478. <div>
  479. //rsl
  480. </div>
  481. `,
  482. keywords: []
  483. }, {
  484. type: "afs",
  485. html: `
  486. <h1>Auto Fix Shield</h1>
  487. <button id="afstgl" class="btn"></button>
  488. <p><strong><i class="fa fa-question-circle"></i> Automatically tries to upgrade to the maximum tier of shield, while fixing the low shield health glitch</strong></p>
  489. <hr />
  490. <h2>Related Pages</h2>
  491. <button class="btn btn-blue" onclick="window.redirectTab('Waves', 'waves')">Waves</button>
  492. `,
  493. script: `
  494. let tglpt = document.getElementById("afstgl");
  495.  
  496. if(window.afsToggle) {
  497. tglpt.classList.add("btn-red");
  498. tglpt.innerText = "Disable AFS"
  499. } else {
  500. tglpt.classList.add("btn-green");
  501. tglpt.innerText = "Enable AFS"
  502. };
  503.  
  504. tglpt.addEventListener("click", function() {
  505. if(this.classList.contains("btn-green")) {
  506. this.classList.replace("btn-green", "btn-red");
  507. this.innerText = "Disable AFS";
  508. } else {
  509. this.classList.replace("btn-red", "btn-green");
  510. this.innerText = "Enable AFS";
  511. };
  512. window.toggleAFS();
  513. });
  514. `,
  515. keywords: ["afs", "defense", "shield", "fix", "protec", "wave"],
  516. name: "AFS",
  517. category: false,
  518. visited: 0
  519. }, {
  520. type: "arp",
  521. html: `
  522. <h1>Auto Revive</h1>
  523. <button id="arptgl" class="btn"></button>
  524. <p><strong><i class="fa fa-exclamation-circle"></i> May create lag</strong></p>
  525. <hr />
  526. <h2>Related Pages</h2>
  527. <button class="btn btn-green" onclick="window.redirectTab('Waves', 'waves')">Waves</button>
  528. `,
  529. script: `
  530. let arptgl = document.getElementById("arptgl");
  531.  
  532. if(window.autoRevivePets) {
  533. arptgl.classList.add("btn-red");
  534. arptgl.innerText = "Disable Revive"
  535. } else {
  536. arptgl.classList.add("btn-green");
  537. arptgl.innerText = "Enable Revive"
  538. };
  539.  
  540. arptgl.addEventListener("click", function() {
  541. if(this.classList.contains("btn-green")) {
  542. this.classList.replace("btn-green", "btn-red");
  543. this.innerText = "Disable Revive";
  544. } else {
  545. this.classList.replace("btn-red", "btn-green");
  546. this.innerText = "Enable Revive";
  547. };
  548. window.toggleARP();
  549. });
  550. `,
  551. name: "Auto Revive",
  552. keywords: ["arp", "revive", "pet", "defense", "protec", "wave", "score"],
  553. category: false,
  554. visited: 0
  555. }, {
  556. type: "misc",
  557. html: `
  558. <h1>Miscellaneous</h1>
  559. <hr />
  560. <button class="btn btn-green" onclick="window.redirectTab('Markers', 'markers')">Markers</button>
  561. <button class="btn btn-green" onclick="window.redirectTab('Game Options', 'gopt')">Game Options</button>
  562. <button class="btn btn-green" onclick="window.redirectTab('AHRC', 'ahrc')">AHRC</button>
  563. `,
  564. name: "Miscellaneous",
  565. keywords: ["misc", "zoom", "marker", "game", "option", "ahrc", "harvest", "auto", "collect", "farm", "mats", "resources"],
  566. category: true,
  567. visited: 0
  568. }, {
  569. type: "sts",
  570. html: `
  571. <h1>Stats</h1>
  572. <h2><i class="fa fa-chart-bar"></i> Score</h2>
  573. <p id="aspw"></p>
  574. <div id="scoreGraph">
  575. </div>
  576. <br />
  577. <button class="btn btn-green" onclick="window.refreshStats();">Refresh</button>
  578. `,
  579. name: "Stats",
  580. keywords: ["score", "stat", "analytic"],
  581. script: `
  582. let aspw = document.getElementById("aspw");
  583. aspw.innerText = 'Average SPW: ' + window.avgspw;
  584. document.getElementById("scoreGraph").append(window.ScoreStats.dom);
  585. `,
  586. category: false,
  587. visited: 0
  588. }, {
  589. type: "aito",
  590. html: `
  591. <h1>AITO</h1>
  592. <p><i class="fa fa-info-circle"></i><strong> Will create a new alt for timeouting, not apply on the current alts.</strong></p>
  593. <button class="btn" id="aitotgl"></button>
  594. <p><strong><i class="fa fa-keyboard"></i> Keybind: SHIFT + ]</strong></p>
  595. <p><strong><i class="fa fa-code"></i> Command to toggle: !aito</strong></p>
  596. <hr />
  597. <h2>Related Pages</h2>
  598. <button class="btn btn-green" onclick="window.redirectTab('Waves', 'waves')">Waves</button>
  599. `,
  600. name: "AITO",
  601. script: `
  602. let aitotgl = document.getElementById("aitotgl");
  603. const toggleAito = (ed = false) => {
  604. if(ed) { window.startaito = !window.startaito; window.sendAitoAlt(); };
  605. if(window.startaito) { aitotgl.classList.remove("btn-green"); aitotgl.classList.add("btn-red"); aitotgl.innerText = "Disable AITO"; } else { aitotgl.classList.add("btn-green"); aitotgl.classList.remove("btn-red"); aitotgl.innerText = "Enable AITO"; };
  606. };
  607. toggleAito();
  608. aitotgl.addEventListener("click", function() {
  609. toggleAito(true);
  610. });
  611. addEventListener('toggleAitoFromChatCommand', function() {
  612. toggleAito();
  613. });
  614. addEventListener('aitoToggleFromKeybind', function() {
  615. toggleAito();
  616. });
  617. `,
  618. keywords: ["aito", "defense", "defend", "timeout", "infinit", "wave"],
  619. category: false,
  620. visited: 0
  621. }, {
  622. type: "lkey",
  623. html: `
  624. <h1>L Key</h1>
  625. <p><i class="fa fa-info-circle"></i><strong> Will create a 2 new alts for raiding, not apply on the current alts.</strong></p>
  626. <button id="ltgl" class="btn"></button>
  627. <div>
  628. <h2 style="display:inline-block;">Automatic Swings:
  629. <label class="switch" class="display:inline-block;">
  630. <input type="checkbox" style="margin-bottom:25px;" onchange="window.lksa = !window.lksa;">
  631. <span class="slider round"></span>
  632. </label>
  633. </h2>
  634. </div>
  635. <hr />
  636. <h2>Related Pages</h2>
  637. <button class="btn btn-green" onclick="window.redirectTab('Raid', 'raid')">Raid</button>
  638. `,
  639. name: "L Key",
  640. script: `
  641. let ltgl = document.getElementById("ltgl");
  642. const toggleL = (ed = false) => {
  643. if((typeof ed === "boolean") && ed) { window.FKey = !window.FKey; window.LKeyWithTimeouts(); };
  644. if(window.FKey) { ltgl.classList.remove("btn-green"); ltgl.classList.add("btn-red"); ltgl.innerText = "Disable L Key"; } else { ltgl.classList.add("btn-green"); ltgl.classList.remove("btn-red"); ltgl.innerText = "Enable L Key"; };
  645. };
  646. toggleL();
  647. ltgl.addEventListener('click', function() {
  648. toggleL(true);
  649. });
  650. addEventListener('LKeyToggleFromChatCommand', toggleL);
  651. `,
  652. keywords: ["l key", "lkey", "raid", "offense", "offend", "destroy", "destruct"],
  653. category: false,
  654. visited: 0
  655. }, {
  656. type: "rebuilder",
  657. html: `
  658. <h1>Auto ReBuilder</h1>
  659. <p><strong><i class="fa fa-exclamation-circle"></i> Will not upgrade rebuilt towers to the original tier.</strong></p>
  660. <button class="btn" id="rebuildertgl"></button>
  661. <p><strong><i class="fa fa-keyboard"></i> Keybind: SHIFT + \x5c</strong></p>
  662. <p><strong><i class="fa fa-code"></i> Command: !rb</strong></p>
  663. <hr />
  664. <h2>Related Pages</h2>
  665. <button class="btn btn-green" onclick="window.redirectTab('Waves', 'waves')">Waves</button>
  666. `,
  667. name: "Auto ReBuilder",
  668. script: `
  669. let rebuildertgl = document.getElementById("rebuildertgl");
  670. let chk = () => {
  671. if(window.getRebuilderToggle()) {
  672. rebuildertgl.classList.remove("btn-green");
  673. rebuildertgl.classList.add("btn-red");
  674. rebuildertgl.innerText = "Disable ReBuilder";
  675. } else {
  676. rebuildertgl.classList.remove("btn-red");
  677. rebuildertgl.classList.add("btn-green");
  678. rebuildertgl.innerText = "Enable ReBuilder";
  679. };
  680. };
  681. chk();
  682. addEventListener("rebuilderToggleFromKeybind", function(e) {
  683. chk();
  684. });
  685. addEventListener("rebuilderToggleFromChatCommand", function(e) {
  686. chk();
  687. });
  688. rebuildertgl.addEventListener('click', function() {
  689. window.toggleRebuilder();
  690. chk();
  691. });
  692. `,
  693. keywords: ["defense", "defend", "build", "base", "repair", "antiraid", "anti raid", "wave"],
  694. visited: 0
  695. }, {
  696. type: "shortcuts",
  697. html: `
  698. <h1>Shortcuts</h1>
  699. <h2><i class="fa fa-code"></i> Commands</h2>
  700. <p><i class="fa fa-info-circle"></i><strong> These commands are case-sensitive.</strong></p>
  701. <ul>
  702. <li><strong>( !aito )</strong> - Toggles <a href="javascript:void(0)" onclick="window.redirectTab('AITO', 'aito')">AITO</a></li>
  703. <li><strong>( !L )</strong> - Toggles <a href="javascript:void(0)" onclick="window.redirectTab('L Key', 'lkey')">L Key</a></li>
  704. <li><strong>( !rb )</strong> - Toggles <a href="javascript:void(0)" onclick="window.redirectTab('Auto ReBuilder', 'rebuilder')">Auto ReBuilder</a></li>
  705. </ul>
  706. <hr />
  707. <h2><i class="fa fa-keyboard"></i> Keybinds</h2>
  708. <ul>
  709. <li><strong>( SHIFT + \x5c )</strong> - Toggles <a href="javascript:void(0)" onclick="window.redirectTab('Auto ReBuilder', 'rebuilder')">Auto ReBuilder</a></li>
  710. <li><strong>( SHIFT + } )</strong> - Toggles <a href="javascript:void(0)" onclick="window.redirectTab('AITO', 'aito')">AITO</a></li>
  711. <li><strong>( SHIFT + F )</strong> - Toggles <a href="javascript:void(0)" onclick="window.redirectTab('Pet Heal', 'aito')">Pet Heal</a></li>
  712. <li><strong>( SHIFT + \` )</strong> - Adds <a href="javascript:void(0)" onclick="window.redirectTab('Markers', 'markers')">Markers</a></li>
  713. <li><strong>( SHIFT + 3 )</strong> - Toggles <a href="javascript:void(0)" onclick="window.redirectTab('3x3 Walls', 'x3w')">3x3 Walls</a></li>
  714. </ul>
  715. `,
  716. name: "Shortcuts",
  717. keywords: ["cmd", "command", "key", "bind", "short"],
  718. category: true,
  719. visited: 0
  720. }, {
  721. type: "markers",
  722. html: `
  723. <h1>Markers</h1>
  724. <p><i class="fa fa-info-circle"></i><strong> Adds a small marker on the minimap that you can use to save different locations in-game.</strong></p>
  725. <p><strong><i class="fa fa-keyboard"></i> Keybind: SHIFT + \`</strong></p>
  726. <button class="btn btn-green" onclick="window.addMarker();">Add Marker</button>
  727. `,
  728. name: "Markers",
  729. keywords: ["mark", "location", "save", "indicat", "map"],
  730. category: false,
  731. visited: 0
  732. }, {
  733. type: "gopt",
  734. html: `
  735. <h1>Game Options</h1>
  736. <div>
  737. <h2 style="display:inline-block;">Debug:
  738. <label class="switch" class="display:inline-block;">
  739. <input type="checkbox" style="margin-bottom:25px;" onchange="this.checked && game.debug.show(); !this.checked && game.debug.hide(); window.gopt.dbg = this.checked;" id="dbg">
  740. <span class="slider round"></span>
  741. </label>
  742. </h2>
  743. <br />
  744. <h2 style="display:inline-block;">Screenshot Mode:
  745. <label class="switch" class="display:inline-block;">
  746. <input type="checkbox" style="margin-bottom:25px;" onchange="window.ssMode(); window.gopt.ssm = this.checked;" id="ssm">
  747. <span class="slider round"></span>
  748. </label>
  749. </h2>
  750. <br />
  751. <h2 style="display:inline-block;">Zoom on Scroll:
  752. <label class="switch" class="display:inline-block;">
  753. <input type="checkbox" style="margin-bottom:25px;" onchange="window.toggleZoS(); window.gopt.zos = this.checked;" id="zos">
  754. <span class="slider round"></span>
  755. </label>
  756. </h2>
  757. <br />
  758. <h2 style="display:inline-block;">Your Name Color:</h2>
  759. <input type="color" id="ync" onchange="window.customColor(); window.gopt.ync = this.value;" />
  760. <br />
  761. <h2 style="display:inline-block;">Always Day Brightness:
  762. <label class="switch" class="display:inline-block;">
  763. <input type="checkbox" style="margin-bottom:25px;" onchange="window.toggleAllDay(); window.gopt.tad = this.value;" id="tad">
  764. <span class="slider round"></span>
  765. </label>
  766. </h2>
  767. <br />
  768. <h2 style="display:inline-block;">Exact Resource Counter:
  769. <label class="switch" class="display:inline-block;">
  770. <input type="checkbox" style="margin-bottom:25px;" onchange="window.frss = !window.frss; window.gopt.frss = this.value;" id="frc">
  771. <span class="slider round"></span>
  772. </label>
  773. </h2>
  774. <br />
  775. <h2 style="display:inline-block;">Disable Chat:
  776. <label class="switch" class="display:inline-block;">
  777. <input type="checkbox" style="margin-bottom:25px;" onchange="window.toggleChat(); window.gopt.cdt = this.value;" id="cdt">
  778. <span class="slider round"></span>
  779. </label>
  780. </h2>
  781. </div>
  782. `,
  783. name: "Game Options",
  784. script: `
  785. document.getElementById("dbg").checked = !!game.debug.visible;
  786. document.getElementById("ssm").checked = !!window.ssModeToggle;
  787. document.getElementById("zos").checked = !!window.zoomonscroll;
  788. window.yncv ? document.getElementById("ync").value = window.yncv : false;
  789. let hno = document.getElementsByClassName("hud-day-night-overlay")[0];
  790. document.getElementById("tad").checked = (hno.style.display === "none");
  791. document.getElementById("frc").checked = !!window.frss;
  792. document.getElementById("cdt").checked = !!window.chatDisabled;
  793.  
  794. `,
  795. keywords: ["option", "game"],
  796. category: false,
  797. visited: 0
  798. }, {
  799. type: "x3w",
  800. html: `
  801. <h1>3x3 Walls</h1>
  802. <button id="xtgl" class="btn"></button>
  803. `,
  804. name: "3x3 Walls",
  805. script: `
  806. let xtgl = document.getElementById("xtgl");
  807. const toggle3x3Walls = (ed = false) => {
  808. if(ed) { window.x3builds = !window.x3builds };
  809. if(window.x3builds) { xtgl.classList.add("btn-red"); xtgl.classList.remove("btn-green"); xtgl.innerText = "Disable 3x3 Walls" } else { xtgl.classList.add("btn-green"); xtgl.classList.remove("btn-red"); xtgl.innerText = "Enable 3x3 Walls"; };
  810. };
  811. toggle3x3Walls();
  812. xtgl.addEventListener("click", function() {
  813. toggle3x3Walls(true);
  814. window.noty3x();
  815. });
  816. `,
  817. keywords: ["3x", "wall", "3 x", "three", "tri", "wave", "base", "build", "protec", "defend", "defense"],
  818. category: false,
  819. visited: 0
  820. }, {
  821. type: "ahrc",
  822. html: `
  823. <h1>AHRC</h1>
  824. <button id="atgl" class="btn"></button>
  825. `,
  826. name: "AHRC",
  827. script: `
  828. let atgl = document.getElementById("atgl");
  829. const toggleAHRC = (ed = false) => {
  830. if(ed) { window.AHRC = !window.AHRC };
  831. if(window.AHRC) { atgl.classList.add("btn-red"); atgl.classList.remove("btn-green"); atgl.innerText = "Disable AHRC" } else { atgl.classList.add("btn-green"); atgl.classList.remove("btn-red"); atgl.innerText = "Enable AHRC"; };
  832. };
  833. toggleAHRC();
  834. atgl.addEventListener("click", function() {
  835. toggleAHRC(true);
  836. });
  837. `,
  838. keywords: ["ahrc", "collect", "farm", "mats", "resources", "harvest", "auto"],
  839. category: false,
  840. visited: 0
  841. }, {
  842. type: "petheal",
  843. html: `
  844. <h1>Pet Heal</h1>
  845. <button id="phtgl" class="btn"></button>
  846. `,
  847. name: "Pet Heal",
  848. script: `
  849. let phtgl = document.getElementById("phtgl");
  850. const togglePH = (ed = false) => {
  851. if(ed) { window.petheal = !window.petheal; };
  852. if(window.petheal) { phtgl.classList.add("btn-red"); phtgl.classList.remove("btn-green"); phtgl.innerText = "Disable Pet Heal" } else { phtgl.classList.add("btn-green"); phtgl.classList.remove("btn-red"); phtgl.innerText = "Enable Pet Heal"; };
  853. };
  854. togglePH();
  855. phtgl.addEventListener("click", function() {
  856. togglePH(true);
  857. });
  858. `,
  859. keywords: ["auto", "defense", "pet", "heal", "score", "defend", "waves", "score"],
  860. category: false,
  861. visited: 0
  862. }, {
  863. type: "alarms",
  864. html: `
  865. <h1>Alarms</h1>
  866. <button class="btn btn-green alarm" onclick="alarm();">Enable Tower Destroy Alarm</button>
  867. <br>
  868. <button class="btn btn-green stashHitAlarm" onclick="stashHitAlarm();">Enable Stash Damage Alarm</button>
  869. <br>
  870. <button class="btn btn-green deadAlarm" onclick="deadAlarm();">Enable Player Death Alarm</button>
  871. <br>
  872. <button class="btn btn-green disconnectAlarm" onclick="disconnectAlarm();">Enable Disconnect Alarm</button>
  873. <br>
  874. <button class="btn btn-green health65pAlarm" onclick="health65pAlarm();">Enable 65% Player Health Alarm</button>
  875. <br>
  876. <button class="btn btn-green pingAlarm" onclick="pingAlarm();">Enable >2k Ping Alarm</button>
  877. <br>
  878. <button class="btn btn-green tower65pAlarm" onclick="tower65pAlarm();">Enable <65% Tower Health Alarm</button>
  879. `,
  880. name: "Alarms",
  881. script: `
  882. let normAlarm = document.getElementsByClassName("alarm")[0];
  883. if(isOnOrNot) { normAlarm.classList.replace("btn-green", "btn-red"); normAlarm.innerText = "Disable Tower Destroy Alarm" };
  884. let shAlarm = document.getElementsByClassName("stashHitAlarm")[0];
  885. if(stashhitalarm) { shAlarm.classList.replace("btn-green", "btn-red"); shAlarm.innerText = "Disable Stash Damage Alarm" };
  886. let deadAlarm = document.getElementsByClassName("deadAlarm")[0];
  887. if(deadalarm) { deadAlarm.classList.replace("btn-green", "btn-red"); deadAlarm.innerText = "Disable Player Death Alarm" };
  888. let disconnectAlarm = document.getElementsByClassName("disconnectAlarm")[0];
  889. if(disconnectalarm) { disconnectAlarm.classList.replace("btn-green", "btn-red"); disconnectAlarm.innerText = "Disable Disconnect Alarm" };
  890. let health65pAlarm = document.getElementsByClassName("health65pAlarm")[0];
  891. if(health65palarm) { health65pAlarm.classList.replace("btn-green", "btn-red"); health65pAlarm.innerText = "Disable 65% Player Health Alarm" };
  892. let pAlarm = document.getElementsByClassName("pingAlarm")[0];
  893. if(pingalarm) { pAlarm.classList.replace("btn-green", "btn-red"); pAlarm.innerText = "Disable >2k Ping Alarm" };
  894. let t65pAlarm = document.getElementsByClassName("tower65pAlarm")[0];
  895. if(tower65palarm) { t65pAlarm.classList.replace("btn-green", "btn-red"); t65pAlarm.innerText = "Disable <65% Tower Health Alarm" };
  896. `,
  897. keywords: ["alarm", "defense", "wake", "score", "defend", "waves", "base"],
  898. category: false,
  899. visited: 0
  900. }, {
  901. type: "acc",
  902. html: `
  903. <h1>Accounts</h1>
  904. <div id="bfl">
  905. <div id="snr">
  906. <h2>Sign In</h2>
  907. <label>Username: </label><input type="text" class="search-bar" id="usrn" />
  908. <br />
  909. <label>Password: </label><input type="password" class="search-bar" id="pswd" />
  910. <br />
  911. <button onclick="window.siGN(document.getElementById('usrn').value, document.getElementById('pswd').value);" class="btn btn-green">Submit</button>
  912. </div>
  913. <hr />
  914. <button id="rlins" class="btn">Register instead?</button>
  915. </div>
  916. <div id="act" style="display: none;">
  917. <button class="btn btn-gold" style="float: right;" onclick="window.sgNO();"><i class="fa fa-sign-out-alt fa-lg"></i></button>
  918. <h2 id="hiu">Hello, user!</h2>
  919. <hr />
  920. <button class="btn btn-blue" onclick="window.redirectTab('Users', 'users')">Users</button>
  921. <hr />
  922. <button class="btn btn-green" onclick="window.saveGopt(window.username);">Save Game Options</button>
  923. <button class="btn btn-gold" onclick="window.loadGoptReq(window.username);">Load Game Options</button>
  924. </div>
  925. `,
  926. name: "Accounts",
  927. script: `
  928. let snr = document.getElementById("snr");
  929. let rlins = document.getElementById("rlins");
  930. rlins.onclick = () => {
  931. dispatchEvent(new CustomEvent('regins'));
  932. };
  933. addEventListener('regins', function() {
  934. snr.innerHTML = \`
  935. <h2>Register</h2>
  936. <label>Username: </label><input type="text" class="search-bar" id="usrn" />
  937. <br />
  938. <label>Password: </label><input type="password" class="search-bar" id="pswd" />
  939. <br />
  940. <button onclick="window.reGS(document.getElementById('usrn').value, document.getElementById('pswd').value);" class="btn btn-green">Submit</button>
  941. \`;
  942. rlins.onclick = () => {
  943. dispatchEvent(new CustomEvent("logins"));
  944. };
  945. rlins.innerHTML = "Sign in instead?";
  946. });
  947. addEventListener('logins', function() {
  948. snr.innerHTML = \`
  949. <h2>Sign In</h2>
  950. <label>Username: </label><input type="text" class="search-bar" id="usrn" />
  951. <br />
  952. <label>Password: </label><input type="password" class="search-bar" id="pswd" />
  953. <br />
  954. <button onclick="window.siGN(document.getElementById('usrn').value, document.getElementById('pswd').value);" class="btn btn-green">Submit</button>
  955. \`;
  956. rlins.onclick = () => {
  957. dispatchEvent(new CustomEvent("regins"));
  958. };
  959. rlins.innerHTML = "Register instead?";
  960. });
  961. let auth = localStorage.ig_auth;
  962. if(auth) {
  963. auth = JSON.parse(auth);
  964. window.siGN(auth.username, auth.password);
  965. };
  966. `,
  967. keywords: ["acc", "save"],
  968. category: false,
  969. visited: 0
  970. }, {
  971. type: "ef",
  972. html: `
  973. <h1>Entity Follower</h1>
  974. <p><strong><i class="fa fa-info-circle"></i> Toggling this feature via keyboard will enable/disable the nearest player mode, not the one you selected.</strong></p>
  975. <div id="efm">
  976. <h2>Mode</h2>
  977. </div>
  978. <br />
  979. <div id="eulm" style="display: none;">
  980. <label>Entity UID: </label>
  981. <input type="text" onchange="window.ulmv = this.value;" class="search-bar" />
  982. </div>
  983. `,
  984. name: "Entity Follower",
  985. script: `
  986. let mode = new window.BS([{
  987. name: "Off",
  988. color: "red",
  989. onselect: () => {
  990. window.lm = "Off";
  991. document.getElementById("eulm").style.display = "none";
  992. window.follow = { toggle: false };
  993. clearInterval(window.ulm);
  994. }
  995. }, {
  996. name: "Nearest Player",
  997. color: "blue",
  998. onselect: () => {
  999. window.lm = "Nearest Player";
  1000. document.getElementById("eulm").style.display = "none";
  1001. window.follow = { toggle: true, np: true };
  1002. document
  1003. clearInterval(window.ulm);
  1004. }
  1005. }, {
  1006. name: "Set UID",
  1007. color: "green",
  1008. onselect: () => {
  1009. window.lm = "Set UID";
  1010. document.getElementById("eulm").style.display = "block";
  1011. window.ulm = setInterval(() => {
  1012. window.follow = { toggle: true, uid: window.ulmv };
  1013. }, 250);
  1014. }
  1015. }]);
  1016. mode.select(window.lm);
  1017. document.getElementById("efm").append(mode.elem);
  1018. addEventListener('efToggleByKeybind', function() {
  1019. mode.select(window.lm);
  1020. });
  1021. `,
  1022. keywords: ["raid", "offense", "offend", "attack", "follow", "ppl", "people", "move"],
  1023. category: false,
  1024. visited: 0
  1025. }, {
  1026. type: "users",
  1027. html: `
  1028. <h1>Users</h1>
  1029. <div id="users">
  1030. </div>
  1031. `,
  1032. name: "Users",
  1033. script: `
  1034. let users = document.getElementById("users");
  1035. let k = window.httpGet("https://readypoisedlegacy.nathaniel009.repl.co/users");
  1036. for(let i of JSON.parse(k)) {
  1037. users.innerHTML += \`<button class="btn btn-gold" onclick="window.userPg('\${i}')">\${i}</button><br />\`;
  1038. };
  1039. `,
  1040. keywords: [],
  1041. category: true,
  1042. visited: 0
  1043. }, {
  1044. type: "userpg",
  1045. html: `
  1046. <h1 id="username">User</h1>
  1047. <div id="userInfo">
  1048. </div>
  1049. `,
  1050. name: "User",
  1051. keywords: [],
  1052. category: false,
  1053. visited: 0
  1054. }];
  1055. let currentTabs = [{
  1056. elem: document.getElementById("tab1"),
  1057. type: "mainMenu",
  1058. id: 1,
  1059. ict: 0
  1060. }];
  1061. let bfTabs = [{ title: "Main Menu", type: "mainMenu", html: tabsData[0].html }];
  1062. let bfIndex = 0;
  1063.  
  1064. window.nlt = 0;
  1065. window.si = 0;
  1066.  
  1067. //pageDisp.style.overflow = "scroll";
  1068. sm.style.overflow = "scroll";
  1069.  
  1070. addTab.style.transition = "margin-left 135ms";
  1071.  
  1072. const arrAvg = arr => arr.reduce((a, b) => a + b, 0) / arr.length;
  1073.  
  1074. window.getTabDataByType = type => tabsData.find(i => i.type === type);
  1075.  
  1076. const getTabById = id => currentTabs.find(i => i.id === id);
  1077.  
  1078. // window.avgspw
  1079.  
  1080. let scr = [];
  1081.  
  1082. game.network.addRpcHandler("DayCycle", e => {
  1083. scr.push(game.ui.playerTick.score);
  1084. window.avgspw = arrAvg(scr);
  1085. window.ScoreStats.update(game.ui.playerTick.score, Math.max.apply(null, scr));
  1086. });
  1087.  
  1088. window.refreshStats = () => {
  1089. scr.push(game.ui.playerTick.score);
  1090. window.avgspw = arrAvg(scr);
  1091. let curr = getTabById(window.focusedTab);
  1092. window.ScoreStats.update(game.ui.playerTick.score, Math.max.apply(null, scr));
  1093. window.focusTab(window.focusedTab, {}); // no loading details for stats (yet)
  1094. };
  1095.  
  1096. pageDisp.innerHTML = window.getTabDataByType("mainMenu").html;
  1097.  
  1098. const hint = (txt, time) => {
  1099. game.ui.components.PopupOverlay.showHint(txt, time);
  1100. };
  1101.  
  1102. const getTabByElem = elem => currentTabs.find(i => i.elem === elem);
  1103.  
  1104. window.getMostVisitedTabs = () => {
  1105. return tabsData.sort((a, b) => b.visited - a.visited);
  1106. };
  1107.  
  1108. const addRmTabFunctionality = (element, ird) => {
  1109. element.addEventListener("click", function(e) {
  1110. e.stopPropagation();
  1111. this.parentElement.parentElement.remove();
  1112. addTab.style.marginLeft = `${addTabRightEffect -= 150}px`;
  1113. if((tabsAmt--) <= 1) {
  1114. addTab.style.marginTop = `0px`;
  1115. } else {
  1116. addTab.style.marginTop = `-40px`;
  1117. };
  1118. addTab.style.display = "block";
  1119.  
  1120. let ct = document.getElementsByClassName("tab");
  1121. let ctl = ct[ct.length - 1];
  1122.  
  1123. if(ctl) {
  1124. let ctlid = parseInt(ctl.id.replace("tab", ""));
  1125. let curr = getTabById(ctlid);
  1126. window.focusTab(ctlid, { nlt: window.nlt, si: window.si, rsl: curr.rsl, sqt: curr.sqt });
  1127. };
  1128.  
  1129. currentTabs.splice(currentTabs.indexOf(getTabById(ird)), 1);
  1130.  
  1131. for(let itc in currentTabs) {
  1132. currentTabs[itc].ict = itc;
  1133. currentTabs[itc].elem.dataset.ict = itc;
  1134. };
  1135.  
  1136. if(tabsAmt === 0) {
  1137. pageDisp.innerHTML = ``;
  1138. };
  1139. });
  1140. };
  1141.  
  1142. const addTabFocusOnClickFunctionality = (element, ird) => {
  1143. element.addEventListener("click", function(e) {
  1144. for(let itc in currentTabs) {
  1145. currentTabs[itc].ict = itc;
  1146. currentTabs[itc].elem.dataset.ict = itc;
  1147. };
  1148. let irddt = {};
  1149. let curr = getTabByElem(this);
  1150. try {
  1151. irddt = window.getTabDataByType(curr.type);
  1152. } catch {};
  1153. window.focusTab(ird, { sqt: curr.sqt, rsl: curr.rsl, pche: irddt.cache || "", nlt: window.nlt, si: window.si });
  1154. console.log(ird);
  1155. });
  1156. };
  1157.  
  1158. addRmTabFunctionality(document.getElementById("rmtab1"), 1);
  1159. addTabFocusOnClickFunctionality(document.getElementById("tab1"), 1);
  1160.  
  1161. window.focusTab = (id, data) => {
  1162. window.focusedTab = id;
  1163. for(let i of currentTabs) {
  1164. if(i.id !== id) {
  1165. i.elem.style.backgroundColor = "#4b806a";
  1166. } else if(i.id === id) {
  1167. i.elem.style.backgroundColor = "#6fa890";
  1168. let tdt = window.getTabDataByType(i.type);
  1169.  
  1170. let vtdth = tdt.html;
  1171.  
  1172. for(let iokvtd in data) {
  1173. vtdth = vtdth.replaceAll(`//${iokvtd}`, data[iokvtd]);
  1174. };
  1175.  
  1176. pageDisp.innerHTML = vtdth;
  1177. if(tdt.script) {
  1178. eval(tdt.script);
  1179. };
  1180. if(i.type === "userpg") {
  1181. document.getElementById("username").innerText = i.ud.username;
  1182. document.getElementById("userInfo").innerHTML = `
  1183. <strong>Joined ${i.ud.joinDate}</strong>
  1184. `;
  1185. };
  1186. } else {
  1187. i.elem.style.backgroundColor = "#4b806a";
  1188. };
  1189. };
  1190. };
  1191.  
  1192. window.makeTab = (text, type) => {
  1193.  
  1194. if((tabsAmt + 1) > 3) {
  1195. addTab.style.display = "none";
  1196. return;
  1197. } else { tabsAmt++; };
  1198.  
  1199. let tab = document.createElement("div");
  1200. tab.classList.add("tab");
  1201. tab.innerHTML = `
  1202. <p>
  1203. ${text}
  1204. <button class="rmtab" id="rmtab${tabId}">x</button>
  1205. </p>
  1206. `;
  1207. tab.id = `tab${tabId}`;
  1208.  
  1209. let ict = currentTabs.length - 1;
  1210.  
  1211. tab.dataset.ict = ict;
  1212. console.log(tab.id);
  1213. tabs.append(tab);
  1214.  
  1215. let elem = document.getElementById(`tab${tabId}`);
  1216. let ctobj = { elem: elem, type: type, id: tabId, sqt: null, rsl: null };
  1217.  
  1218. ctobj.ict = ict;
  1219.  
  1220. currentTabs.push(ctobj);
  1221.  
  1222. for(let itc in currentTabs) {
  1223. currentTabs[itc].ict = itc;
  1224. currentTabs[itc].elem.dataset.ict = itc;
  1225. };
  1226.  
  1227. console.log(currentTabs);
  1228.  
  1229. let tdt = window.getTabDataByType(type);
  1230.  
  1231. tdt.visited++;
  1232.  
  1233. addTab.style.marginLeft = `${addTabRightEffect += 150}px`;
  1234.  
  1235. console.log(`${tabsAmt} tabsAmt`);
  1236.  
  1237. let oldTabId = tabId;
  1238. tabId++;
  1239.  
  1240. window.focusTab(oldTabId, { pche: tdt.cache || "", si: window.si, nlt: window.nlt });
  1241.  
  1242.  
  1243. if(tabsAmt === 3) {
  1244. addTab.style.display = "none";
  1245. };
  1246.  
  1247. if(tabsAmt >= 1) {
  1248. addTab.style.marginTop = "-40px";
  1249. };
  1250.  
  1251. let currentRmTab = document.getElementById(`rmtab${oldTabId}`);
  1252. addRmTabFunctionality(currentRmTab, oldTabId);
  1253. addTabFocusOnClickFunctionality(document.getElementById(`tab${oldTabId}`), oldTabId);
  1254.  
  1255. bfTabs.push({ title: text, script: tdt.script, html: tdt.html, type: type });
  1256.  
  1257. bfIndex++;
  1258.  
  1259. return ctobj;
  1260. };
  1261.  
  1262. window.redirectTab = function(text, type) {
  1263. let gd = getTabById(window.focusedTab);
  1264. let gid = gd.elem;
  1265. gid.innerHTML = `
  1266. <p>
  1267. ${text}
  1268. <button class="rmtab" id="rmtab${gid.id}">x</button>
  1269. </p>
  1270. `;
  1271. currentTabs[gd.ict].type = type;
  1272. let tdt = window.getTabDataByType(type);
  1273. pageDisp.innerHTML = tdt.html;
  1274.  
  1275. bfTabs.push({ title: text, script: tdt.script, html: tdt.html, type: type, sqt: gd.sqt, rsl: gd.rsl });
  1276.  
  1277. bfIndex++;
  1278. if(tdt.script) {
  1279. eval(tdt.script);
  1280. };
  1281. addRmTabFunctionality(document.getElementById(`rmtab${gid.id}`), gd.id);
  1282. addTabFocusOnClickFunctionality(gid, gd.id);
  1283. tabsData[tabsData.indexOf(tdt)].visited++;
  1284.  
  1285. let idrtd = gd.id;
  1286. let irddt = window.getTabDataByType(getTabById(idrtd).type);
  1287. window.focusTab(idrtd, { pche: irddt.cache || "", nlt: window.nlt, si: window.si, rsl: gd.rsl, sqt: gd.sqt });
  1288. };
  1289.  
  1290. window.redirectTab2 = function(text, type, rsl, sqt) {
  1291. let gd = getTabById(window.focusedTab);
  1292. if(!gd) { return; };
  1293. let gid = gd.elem;
  1294. gid.innerHTML = `
  1295. <p>
  1296. ${text}
  1297. <button class="rmtab" id="rmtab${gid.id}">x</button>
  1298. </p>
  1299. `;
  1300. currentTabs[gd.ict].type = type;
  1301. let tdt = window.getTabDataByType(type);
  1302. pageDisp.innerHTML = tdt.html; // 1k lines, very nice!
  1303. if(tdt.script) {
  1304. eval(tdt.script);
  1305. };
  1306. addRmTabFunctionality(document.getElementById(`rmtab${gid.id}`), gd.id);
  1307. addTabFocusOnClickFunctionality(gid, gd.id);
  1308. tabsData[tabsData.indexOf(tdt)].visited++;
  1309.  
  1310. let idrtd = gd.id;
  1311. let irddt = window.getTabDataByType(getTabById(idrtd).type);
  1312. window.focusTab(idrtd, { pche: irddt.cache || "", nlt: window.nlt, si: window.si, rsl: rsl, sqt: sqt });
  1313. };
  1314.  
  1315. window.bfRedirect = index => {
  1316. let bfri = bfTabs[index];
  1317. window.redirectTab2(bfri.title, bfri.type, bfri.rsl, bfri.sqt);
  1318. };
  1319.  
  1320. window.bfb = () => {
  1321. let bfim = bfTabs[bfIndex - 1];
  1322. if(bfim) {
  1323. window.bfRedirect(bfIndex---1);
  1324. };
  1325. };
  1326.  
  1327. window.bff = () => {
  1328. let bfip = bfTabs[bfIndex + 1];
  1329. if(bfip) {
  1330. window.bfRedirect(bfIndex+++1);
  1331. };
  1332. };
  1333.  
  1334. const qryify = qry => {
  1335. return (qry.length > 2) ? `${qry.slice(0, 2)}...` : qry;
  1336. };
  1337.  
  1338. const qryify2 = qry => {
  1339. return (qry.length > 6) ? `${qry.slice(0, 6)}...` : qry;
  1340. }; // for user pages
  1341.  
  1342. window.searchTab = function(query) {
  1343. if(tabsAmt > 0) {
  1344. let gd = getTabById(window.focusedTab);
  1345. let gid = gd.elem;
  1346.  
  1347. let rsl = ``;
  1348.  
  1349. for(let itd of tabsData) {
  1350. for(let itkd of itd.keywords) {
  1351. if(query.toLowerCase().includes(itkd) && !rsl.includes(itd.name)) {
  1352. rsl += `<button onclick="window.redirectTab('${itd.name}', '${itd.type}')" class="btn btn-${itd.category ? "blue" : "green"}">${itd.name}</button><br />`;
  1353. };
  1354. };
  1355. };
  1356.  
  1357. if(rsl.length === 0) { rsl = `No results for ${query}`; };
  1358.  
  1359. let sqt = `Results for: ${query}`;
  1360.  
  1361. let data = {
  1362. sqt: sqt,
  1363. rsl: rsl
  1364. };
  1365.  
  1366. let gdi = window.focusedTab;
  1367.  
  1368. let sqry = `Search - ${qryify(query)}`;
  1369.  
  1370. getTabById(gdi).rsl = rsl;
  1371. getTabById(gdi).sqt = sqt;
  1372.  
  1373. let tdt = window.getTabDataByType("search");
  1374.  
  1375. let vtdth = tdt.html;
  1376.  
  1377. for(let iokvtd in data) {
  1378. vtdth = vtdth.replaceAll(`//${iokvtd}`, data[iokvtd]);
  1379. };
  1380.  
  1381. bfTabs.push({ title: sqry, html: vtdth, type: "search", sqt: sqt, rsl: rsl });
  1382. gd.type = "search";
  1383.  
  1384. gid.innerHTML = `
  1385. <p>
  1386. ${sqry}
  1387. <button class="rmtab" id="rmtab${gid.id}">x</button>
  1388. </p>
  1389. `;
  1390.  
  1391. pageDisp.innerHTML = vtdth;
  1392.  
  1393. if(tdt.script) {
  1394. eval(tdt.script);
  1395. };
  1396. addRmTabFunctionality(document.getElementById(`rmtab${gid.id}`), gd.id);
  1397. addTabFocusOnClickFunctionality(gid, gd.id);
  1398. } else {
  1399. window.makeTab("Main Menu", "mainMenu");
  1400. window.searchTab(query);
  1401. };
  1402. };
  1403.  
  1404. addTab.addEventListener("click", function() {
  1405. window.makeTab("Main Menu", "mainMenu");
  1406. });
  1407.  
  1408. let sockets = [];
  1409. window.sendWs = () => {
  1410. if(window.alttype === "iFrame") {
  1411. document.getElementById("nfnlt").innerHTML = `# of alts: ${window.nlt+++1}, current alt ID: ${window.si+++1}`;
  1412.  
  1413. window.focusTab(window.focusedTab, { nlt: window.nlt, si: window.si });
  1414.  
  1415. let iframe = document.createElement("iframe");
  1416. iframe.style.display = "none";
  1417. iframe.src = `http://zombs.io/#/${game.options.serverId}/${game.ui.getPlayerPartyShareKey()}/4ptrick`;
  1418. let ifd = `s${Math.floor(Math.random() * 100000)}`;
  1419. iframe.id = ifd;
  1420. document.body.append(iframe);
  1421.  
  1422. let ifde = document.getElementById(ifd);
  1423. ifde.addEventListener('load', function() {
  1424. this.contentWindow.eval(`
  1425. document.querySelector(".hud-intro-name").value = "${game.options.nickname}";
  1426. document.querySelector(".hud-intro-play").click();
  1427. game.network.addEnterWorldHandler(() => {
  1428. console.log("loaded alt");
  1429. game.network.sendInput({ left: 1, up: 1 });
  1430. game.network.sendRpc({ name: "JoinPartyByShareKey", partyShareKey: "${game.ui.getPlayerPartyShareKey()}" });
  1431. });
  1432. `);
  1433. });
  1434. sockets.push({ iframe: ifde, close: () => { ifde.remove(); }, joinMainParty: () => { ifde.contentWindow.eval(`game.network.sendRpc({ name: "JoinPartyByShareKey", partyShareKey: "${game.ui.getPlayerPartyShareKey()}" });`); }, closed: false });
  1435. return;
  1436. };
  1437. document.getElementById("nfnlt").innerHTML = `# of alts: ${window.nlt+++1}, current alt ID: ${window.si+++1}`;
  1438.  
  1439. window.focusTab(window.focusedTab, { nlt: window.nlt, si: window.si });
  1440.  
  1441. const ws = new WebSocket(`ws://${game.options.servers[game.options.serverId].hostname}:80`);
  1442. ws.binaryType = "arraybuffer";
  1443. ws.id = sockets.length;
  1444. ws.removed = false;
  1445. /*
  1446. let addMissingTickFields = function (tick, lastTick) {
  1447. for (var fieldName in lastTick) {
  1448. var fieldValue = lastTick[fieldName];
  1449. tick[fieldName] = fieldValue;
  1450. };
  1451. }; // thanks to trollers for giving me this function :D
  1452. */
  1453. ws.onopen = () => {
  1454. ws.network = new game.networkType();
  1455. let entities = {};
  1456. let myPlayer = {};
  1457. ws.myPlayer = myPlayer;
  1458. ws.entities = entities;
  1459. ws.network.sendRpc = (e) => { ws.send(ws.network.codec.encode(9, e)) };
  1460. ws.network.sendInput = (e) => { ws.send(ws.network.codec.encode(3, e)) };
  1461. ws.onmessage = msg => {
  1462. const data = ws.network.codec.decode(msg.data)
  1463. switch (data.opcode) {
  1464. case 4:
  1465. ws.send(ws.network.codec.encode(3, { up: 1 }));
  1466. ws.send(ws.network.codec.encode(3, { left: 1 }));
  1467. ws.joinMainParty();
  1468. break;
  1469. case 5:
  1470. ws.send(ws.network.codec.encode(4, { displayName: game.options.nickname, extra: data.extra }));
  1471. sockets[ws.id] = ws;
  1472. break;
  1473. }
  1474. if(data.uid) {
  1475. ws.uid = data.uid;
  1476. myPlayer.uid = data.uid;
  1477. };
  1478. };
  1479.  
  1480. ws.joinMainParty = () => {
  1481. ws.send(ws.network.codec.encode(9, {
  1482. name: "JoinPartyByShareKey",
  1483. partyShareKey: game.ui.getPlayerPartyShareKey()
  1484. }));
  1485. };
  1486. window[`socket${ws.id}`] = ws;
  1487. }
  1488.  
  1489. sockets.push(ws);
  1490. };
  1491.  
  1492. window.rmAlt = num => {
  1493. let sck = sockets[num];
  1494. let noiderr = document.getElementById("noiderr");
  1495. if(sck && !sck.closed) {
  1496. sck.closed = true;
  1497. sck.close();
  1498. noiderr.style.display = "none";
  1499. window.focusTab(window.focusedTab, { nlt: window.nlt---1, si: window.si });
  1500. } else {
  1501. noiderr.style.display = "block";
  1502. };
  1503. };
  1504.  
  1505. const kickAll = () => {
  1506. for (let i in game.ui.playerPartyMembers) {
  1507. if (game.ui.playerPartyMembers[i].playerUid == game.ui.playerTick.uid) continue;
  1508. game.network.sendRpc({
  1509. name: "KickParty",
  1510. uid: game.ui.playerPartyMembers[i].playerUid
  1511. });
  1512. };
  1513. };
  1514.  
  1515. const joinAll = () => {
  1516. for(let socket of sockets) {
  1517. if(!socket.removed) {
  1518. for (let sck of sockets) sck.joinMainParty();
  1519. };
  1520. };
  1521. };
  1522.  
  1523. let isDay,
  1524. tickStarted,
  1525. tickToEnd,
  1526. hasKicked = false,
  1527. hasJoined = false;
  1528.  
  1529. game.network.addEntityUpdateHandler(tick => {
  1530. if(window.playerTrickToggle) {
  1531. if (!hasKicked) {
  1532. if (tick.tick >= tickStarted + 18 * (1000 / game.world.replicator.msPerTick)) {
  1533. kickAll();
  1534. hasKicked = true;
  1535. };
  1536. };
  1537. if (!hasJoined) {
  1538. if (tick.tick >= tickStarted + 118 * (1000 / game.world.replicator.msPerTick)) {
  1539. joinAll();
  1540. hasJoined = true;
  1541. };
  1542. };
  1543. };
  1544. });
  1545.  
  1546. game.network.addRpcHandler("DayCycle", e => {
  1547. if(window.playerTrickToggle) {
  1548. isDay = !!e.isDay;
  1549. if (!isDay) {
  1550. tickStarted = e.cycleStartTick;
  1551. tickToEnd = e.nightEndTick;
  1552. hasKicked = false;
  1553. hasJoined = false;
  1554. };
  1555. };
  1556. });
  1557.  
  1558. window.togglePlayerTrick = () => {
  1559. window.playerTrickToggle = !window.playerTrickToggle;
  1560. };
  1561.  
  1562. window.addName = name => {
  1563. let id = `u${Math.floor(Math.random() * 9999)}`;
  1564. localStorage.names = `${localStorage.names || ""}<div id="${id}"><button onclick="document.querySelector('.hud-intro-name').value = \`${name.replaceAll('`', '\`')}\`" class="btn btn-blue">${name}</button>`;
  1565. };
  1566.  
  1567. const fixShield = () => {
  1568. if(game.world.inWorld) {
  1569. if (game.ui.playerTick.zombieShieldHealth < 85000 && window.afsToggle) {
  1570. game.network.sendRpc({name: "EquipItem", itemName: "ZombieShield", tier: Game.currentGame.ui.inventory.ZombieShield.tier});
  1571. };
  1572. };
  1573. };
  1574. game.network.addRpcHandler("DayCycle", fixShield);
  1575.  
  1576. window.toggleAFS = function() {
  1577. window.afsToggle = !window.afsToggle;
  1578. };
  1579.  
  1580. const revive = () => {
  1581. let rae = document.querySelector("a.hud-shop-actions-revive");
  1582. if(rae) {
  1583. rae.click();
  1584. };
  1585. };
  1586.  
  1587.  
  1588. window.toggleARP = function() {
  1589. window.autoRevivePets = !window.autoRevivePets;
  1590. };
  1591.  
  1592. (window.refreshNS = () => {
  1593. let guide = document.getElementsByClassName("hud-intro-guide")[0];
  1594. guide.innerHTML = `
  1595. <center><h1 style="text-transform: none;">Name Saver</h1>
  1596. <hr></center>
  1597. <div>
  1598. ${localStorage.names || "<h2>No names have been saved here yet...<h2>"}
  1599. </div>
  1600. <hr />
  1601. <input type="text" class="search-bar" style="width:135px;" id="inpn" /><button class="btn-fixed btn-green" onclick="window.addName(document.getElementById('inpn').value); window.refreshNS();">Add name</button>
  1602. `;
  1603. })(); // will make localStorage.names an object, maybe in early to mid beta
  1604.  
  1605. // ==UserScript==
  1606. // @name AITO FIXED
  1607. // @namespace -
  1608. // @version 0.1
  1609. // @description say !aito to enable/disable aito
  1610. // @author ehScripts
  1611. // @match zombs.io
  1612. // @grant none
  1613. // ==/UserScript==
  1614.  
  1615. window.sendAitoAlt = () => {
  1616. if (window.startaito) {
  1617. let ws = new WebSocket(`ws://${Game.currentGame.options.servers[Game.currentGame.options.serverId].hostname}:8000`);
  1618. ws.binaryType = "arraybuffer";
  1619. ws.onclose = () => {
  1620. ws.isclosed = true;
  1621. }
  1622. ws.onopen = () => {
  1623. ws.network = new Game.currentGame.networkType();
  1624. ws.network.sendInput = (t) => {
  1625. ws.network.sendPacket(3, t);
  1626. };
  1627. ws.network.sendRpc = (t) => {
  1628. ws.network.sendPacket(9, t);
  1629. };
  1630. ws.network.sendPacket = (e, t) => {
  1631. if (!ws.isclosed) {
  1632. ws.send(ws.network.codec.encode(e, t));
  1633. }
  1634. };
  1635. }
  1636. ws.onEnterWorld = () => {
  1637. // useless
  1638. }
  1639. ws.onmessage = msg => {
  1640. ws.data = ws.network.codec.decode(msg.data);
  1641. if(ws.data.opcode === 5) {
  1642. ws.network.sendPacket(4, { displayName: localStorage.name, extra: ws.data.extra });
  1643. };
  1644. if (ws.data.uid) {
  1645. ws.uid = ws.data.uid;
  1646. }
  1647. if (ws.data.name) {
  1648. ws.dataType = ws.data;
  1649. }
  1650. if (!window.startaito && !ws.isclosed) {
  1651. ws.isclosed = true;
  1652. ws.close();
  1653. }
  1654. if (ws.verified) {
  1655. if (!ws.isDay && !ws.isclosed) {
  1656. ws.isclosed = true;
  1657. ws.close();
  1658. window.sendAitoAlt();
  1659. }
  1660. }
  1661. if (ws.data.name == "DayCycle") {
  1662. ws.isDay = ws.data.response.isDay;
  1663. if (ws.isDay) {
  1664. ws.verified = true;
  1665. }
  1666. }
  1667. if (ws.data.name == "Dead") {
  1668. ws.network.sendInput({
  1669. respawn: 1
  1670. });
  1671. }
  1672. if (ws.data.name == "Leaderboard") {
  1673. ws.lb = ws.data;
  1674. if (ws.psk) {
  1675. ws.network.sendRpc({
  1676. name: "JoinPartyByShareKey",
  1677. partyShareKey: game.ui.getPlayerPartyShareKey()
  1678. });
  1679. if (ws.psk.response.partyShareKey == game.ui.getPlayerPartyShareKey()) {
  1680. ws.network.sendRpc({
  1681. name: "BuyItem",
  1682. itemName: "Pause",
  1683. tier: 1
  1684. });
  1685. }
  1686. }
  1687. }
  1688. if (ws.data.name == "PartyShareKey") {
  1689. ws.psk = ws.data;
  1690. }
  1691. switch (ws.data.opcode) {
  1692. case 4:
  1693. ws.onEnterWorld(ws.data);
  1694. break;
  1695. }
  1696. }
  1697. }
  1698. }
  1699.  
  1700. game.network.addRpcHandler("ReceiveChatMessage", e => {
  1701. if (e.message == "!aito" && e.uid == game.world.myUid) {
  1702. window.startaito = !window.startaito;
  1703. dispatchEvent(new CustomEvent("toggleAitoFromChatCommand"));
  1704. window.sendAitoAlt();
  1705. }
  1706. })
  1707.  
  1708. // ==UserScript==
  1709. // @name Auto ReBuilder
  1710. // @namespace -
  1711. // @version 0.1
  1712. // @description kek, press SHIFT+\ to toggle, since its not enabled by default
  1713. // @author ehScripts
  1714. // @match zombs.io
  1715. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASgAAACiCAYAAADyW1ATAAAgAElEQVR4Xu1da2wc13W+d/ZBcpcPURLlh+RIcWRbpvUgtVEM+REv9XDkxEEetWu1SdwgCVoEbdEAadP0T9CiQBGk8f/+SdsETYFC/2LJpmSnEtAoEikuSUkxbdmSLcuSIskiKVkk5Yg7M8W5d+7M7HJ3587szmv3LCBQu3vndXbuN9/97nfPoQRfGAGMAEYgohGgET0vPC2MAEYAI0AQoPAmwAhgBCIbAQSoyP40eGIYAYwAAhTeAxgBjEBkI4AAFdmfBk8MI4ARQIBqgntg7+bO57L6wj64FEop0XXdvKqq76EdUYiuJIhGFUKUhPlefP7Lkat4fzTB/RHnS4j6Daj09/cnOzo6kouLi1E/11Dug/b29vYNH5/6TUq/s8HdCVAGTjpViE7hL7xPcpBinynk9Md330UImXfabyqV0m/fvl2cmpoqEkI0p/b4PUZANgJR6vQ0l8sBEKV1XU+n0+mEpmnZez4xdJ7oGnQbousq+wvv4fnP/2qE6DqhVCNEg76hEwqfyzIJI1L1tG9LKKSvM01WZJKkL5smPe3JkuNrmkoW5mfI/NwMub0wQ+ZuTZOF+VkyPzftzHQacH6VmBWhEDmDOQEgVWBQDKgYaFFClCSBaDOmBYyLGsxL/FUS5Pz14jpFUebv3Lmjqqq6SAi5MzU1BX8tSid7Z2I7jACMCKIShc2bN2fvXf/snB18GPAQlVA2ZLEAib/XGBDxv/b3HKCCfLUlFbIykyZ92RRZkU2SZe2pksPrusbAaH5ulizMAzhxsLIDVJDny49FDeZkgJOdSdGkwagAjOwsywZo9s9LmJgNvBSFXLw02zs5OXkj+OvDIzZDBEIFqD1f/sd1i9rcVzVt8SvJRHqroqQyCtWJrqkmQxLMiZ1oJQZFdYM5ccCi0FBTA2UmKYWSVWUMSpwAMDNVLVZlUPUwN1eaUzkTk9CgGFMymJMAKppIMOYl3ptMSmhZwKgMZia0LfaeMVo6NLx/+EgzdBy8hmAiECpA7X7un3TBgoAt8eEbgAtnRYIZiaGcxZSiyKBSbHi3Ipsiy9qTDgwK2BRnUeG9yjUo2zDP0KDY8E7832BMYohXwqzKhn1iG2gLIAVtgbFpmvbmwQOv9Yd3zXjkuEUgFIB6/vnnEzfI5iIwHcGMqMGEuLbEtSYYGgmtyVGDYloUalB25lZrNs8PDYoxpgraFDAoqijm7GJne3dy3759Fs2NW6/B8w0sAoEDVC6X6+m9/ys3OHMqFboVA2QEKDWvBsX1qMhoUAnDYiBm8xqkQekASgZoMaHd9rpy8dqqiYmJDwO70/FAsYxAoADV39/fee/Gr9+C2TY++2ZpRiZTQg1KzsdUrim5fR+CBlWumSFIxRIzAj3pwABq6I9+9DlClB8nlPQAs8oYwzfUoAL9vW0HC16DqnSlF89fXn769OnZsKKAx412BAIBqHw+n0zc9cyirnE/E2dOMPuGGpSsZtTo2b4wNahyJvX+uQ+6pqam5qLdVfDswohAIAA1ODjY1/vA3mswrBPak4wGxWftmskHNcPsBuCFanUNqvxmf/Xlg4Hci2F0Mjym9wgEclMM/fFPdLvGhBqU5SRvNDOS3p9nDYo7yr34oMqZk/39tcvX04VCAVzn+MIImBHwHaByuVyqZ/3eO+VeppbSoDSV+57mhZO8NX1QtfrdtcvX1xYKhQvYNzEC9gj4DlBDe1/SgTEpVCOoQTX3WjxZH1Q1JvXKr4Z9vx+x+8crAr7fEEMv/NQc3qEGhRpUre6BOlS8wCOIs/UdoHbsfUkvWVtnOsbRBwVGTWnNyLgbGtY+YhoUXB4CVBBdPl7H8B2gljIovo4ONahWWIuXJBoAobEWz6lr3Lj+UebYsWO3ndpV+v6ZL35OKqWLVxDM55/k+9dhCRYsaOcZM9j/YbaZZf3RydGRUd/7lJf4xHUb34OJGhQkW2iNfFD1alDFxeI5JZH8jpuMBwKY3DJL2cwKO3c+pWsMjKgJSvCeJc0QIKVx7NJUA7Q0DXJoDR0fG5PK3JDL5e7R5m9ftvZXO5+ZRrSh3509K7XvuAKTOG//AQo1KLbomeeDQg1KpsNcuXht3cTExPu12g4ODq69e82q8zL7q9RGVdX3Dr3y+v21tt+5K68LpqQZIGRnTiabsjEowah0XX/v+Fih5v7h2Fsf7tf5NpyBiX3WOi+aSFxJdmaGFm/eetPp+pXOTKzzcfkOUKhBNVs+KH98UOYT08iE+tHMXPfRo0dvVeqAu/fs/nwypRyA79wyJ3t7AITh/YeW9IFdu/J5QulhC5wEMzKYksmcyj63MSgx/DteGK/Yxz69cWNe0/TDgokJgLIzs3qvr3z7U2ff9r2/OwGm2+99P+FW06BWZlMs5a/9BZME3AdlZ1CoQTndrNX0oqef2XUtkUz0OW0v8z2A0PCB10r6wdCOp95TFLqOgYwBRoJBOWlQpiYltCpdJyPjE0v6WW7Tpild1R62WJg8g5K5rlpt4gRU/gMU+qBQgyrLB9VoZuB1f3bNx0iox/q1XsaEvGhQTJMywI2DkE1QN4V2+5COJfTjxweNK4Cc+iffOeN7/68XTH0/wdbzQdXKqIkaVL03bCO3F5oPBxNjkg5AgmWRtsBiyffG7F0tDarkOwmAcqNBNTIGDBA72iKbUcJ3gEINCjUokZPcK9ORqvNn9Fo3zAP2a9d8AKTY+4oMCpiNew0KgMoEP5sIzq0K1vGD0KCc4p9e1r1hbGzsTKMBsJ79+Q5QqEHBjY0aVIQKCJXpg5rhZeIfw/BKgEejNCiZIV6YDKoSgERFp/IfoFCDQg0KNahIalAyzDRsoPIfoFrOByWrQUVgFk/UtgshJ3k9tL9R26IGJR/JsIDKd4BqBQ0qrdAllYXFT998dfGC8UHZ4yfzpPfSHjUo9z6yoIHKd4BCDaqCBgWucqO6sPwzrNEtg8hJ7m4tXqOvUGZ/puZkrORDDco5akGClP8AhRpU82tQSoV6eKI+HhTvRA0qthpUJWZKsx1rTp48eckZyupv4T9AoQZVthYP0v1y/Sn0ysKoQbG1b8LnZGpSLeaD8gIjQbEo3wEKNSj0QaEPSmRqsZzjUfRBOfmk7N83DUDJa1DsNmZlzyG5DlR04VVdRO4o/pn4jv8Ft6/9c6v0uZengtdt2pIKWZlJkb5smkitxUMNymuoG74dalDeQqp0Zj45OTnpOZuE7FF9Z1D+5oOCunr8qSQqFcM6BQAuN45iN0+OSmPytoSyZBbPfvymzweFGhQfJlZxoMsYNUvWAga0Fq/e2dEg1vL5D1AtokH1ZTh7WpGt4IMCJ7mhO0FNPNSgZJ+f/rYr90GhBiUf71RP17JCoXBTfgtvLX0HqFbSoFZmkmRlNl2SbgV9UHwWDyoZ18tUG709+qDc+6DEyAA1KNSgvD1ypLdCHxSTPMXaO/RBSd850LB5AMpXHxRqUJU0MRmmAYyGMRslQXSqEB3+krK/7PMkqHqEKNxBLtoT4XOCv6hBtYwGpSQS00V18bmgcqL7PsRrlXxQqEEpS8qh6wp8xk2cPLFItF6oQbn/PYI0abIHrftTdLcFalDog0INqjl8UEEN6+wI4ztAoQ+qylo8I0e5O7hvZOugNCiDRfn/LPQUHNSg5MIWBjgFwqDQB1VWF29+hszNgdVglpWi8qoh1evzQg2qNAd4K+Ykd/JBJbs71xYKhQtyEOZPK18Z1GOPPbaq7b6vXuVmSpBYhfubmylZ8mfjczCzKbaKw+xz5hxXjb/2fQhHeXSc5EKDquokj6UPKskFdPaPi+mmqC7W8cFfIbSLNoaAjhqUUXU44jnJy6El27fCc4XnRsOUHwClbNu2bV12/dfOMUc3gdzLYrZNIwplKzFN5zezx5R9X9Iettdhe74MRjFBzQAsY39i6YvYX5DMROSDYj6ozjTpabPKTqEPypsPStfJxPD+g1sr3fD2Muf1MMnFxeKl14d/vab8GNu3b+/IdrYv1FsXT9O0SyPjE0v2D8fLbdyoRy0neVjDuFqg1iiAorlcrkPTtHXdG771Bl92Yi0/KWVQ9vV1gknx9XaxX4vXmWZr8irVxZszqwrPkAWjyjC4y8N7RVuDcipNvucLu09RRdlUT/xqHWPLli2rV/b1XqyrLl6N8ucCoMKoi1cesygCk0kw6vmBYdsnXviXB4lGnqVE+TylqUdpMt3JwcbGfDRgThozxZkMiDEfixlRk1kBM+JMCUqGC3AT+ytlUDH0QaEGxW65WsynWsFO+72659k9eUr1w16Zsswxtm3bdl8223aMUroaNCo7o7JXgzGrvdjW4h0bK9R8+JcDlKmBGTXz6mGGTvGF75XOzIOTk5Pv1Nv//d6+LgaVy+UymQ1/Pm8u0C0ffpVrSq2sQZmVheO0Fi94Dera5etZ+01/8+ZN9ezZs4s8rUXll33I59Rhpq/O3j86OvqeUzvxPZRB1zTtcEndPIe6eL8dPeHYr8JiUEGtoZONr1M7x0BW28Hjf/Jvuym58xJNtG8CxgM7ouyvxXxQg+JMQVWL5gLh2wszZO6WNYvn95Oy6v6hcq3hHNeE+F3BSS4c5EIkp4lgcpLrmnYa7j1NJ6OUkhuaSv5XJ7ra29X7+r59+yAnT8XX4OBg391rVl0TX05fnX0ok8m8e+TIkaJTZ6j1fT7/RB6+13XyTLFYXK5QZRvXRukWjSS6jx49esvN/oPWoKI8jKsVN88A9cTXfwZjMQZKSxkUalD2oEO6FcieCVkM2D/UoNz05SVtnfSpunYe0MZBMKi23p57Tpw4cSWgS/LlMJ4Aatu2bfe3bfjuOc6cuGYkZtnKNSP2OWpQFoOKqQZlrckz7AYhrsXTNO3Ngwde66/UI3K53MpV9678UDDHq5c+fKC7u/t8vQxqaOjJp+B46qL6jE7Jcqrr26A8OqV0YHr2o66pqak5Nz20kRpUXNmRTLxcA9RTL/58aPHOzH8oye611RmU3d9kCd0t7YNCDUrmfnTVRgjdbjQoPkyjQ8P7h4/IHmzHjs/qbjQoTdOHjo+N1dx/IxkUApTtl3zixZ/rdl+SnUGhBoU+KJblwMiSILStqK3FW7xTvDx7/caOsbGxM7VAaufOp9giOmBKDNg0UWBBvC/73JjFUzXtikpovtb+/daggkrJKwvyXtu5YlC5XG5De/9fv2nlAUcNCgJv5iSv4oMq16BgiYvQpLz+cPVvF20fVP3X57yH27f+kKo29Nu5K8/QqB4fVFtnV9X9N5JBOV1pW2/Pp06cOPGuU7sofu8KoB578Rd6Zc0JNai+zjRZkUmywglg1Kyakxw1KNYPQpu9NHohHB+Y0fD+Q0v6wMDAwLKVfb2zpU5ydz4owbxGxicq9rFGalBu4hm34aB7gCqppFKJQQmwsi1nwbV4vA4em8Vrfh+UsCTEZS3e8IHXSvrB7qd36Nawjg/j3GhQIs8UKy2l66QSSAXJoCoxo7gAlSxAKblc7q62R/7mcolDvGwWLxQNylhWg2vx+G0ozUwi7oMSnUr6emzMyGmVvvgec5ITUkwn26ampu5EcXjH7meZE+vv708v+/Q//EH4nVCDKo2aOw2K60+oQcncef63wXxQPMYdK3rvGxkZueh/xN0dQQqgNm/enO0c/MEcT41SyfeEGhRoUPaqLqhBJYh9Fo9C+l+jzLgrpueBGcnuv3QYZ8sPVbG+nTcNip2+RLqVoNfi1WKmURr+SQHUo48+2p146K9uyjGoFtWgoKpwJiVRWThCGpQolJAwCiawfE6U6BTW4MEsn7e1eHHToITGhHXxStlNFIBKCqByuVxP2yPfuwEAhRoUXcIEMB8UT2THGFMMfFCoQRk1tiQ1yyAqCFcb+EkB1KZNm3q7Bn8wI8egxOyd93xQZj4pNiTguaK4C11k0oxiRs0US1ZXKR9UqQ8KNSh3KoS/rVGDko+vQpShybNvSTvw5fdcvaUUQA0MDDyQ2fK3b6MGVfnJAyI5+J9QgzIYlGBSRpYEcJKjBgVSlD0FMGSaBT3X+AweweBYDygflKfZUUo+OPX2mU80Anhk9yEFUNv/7Je6yCHO/wo2gz4oCLQFUKhB2fOXx8UHhRqULFzwdkFqU64BCjWoRmhQ18nC/A1W1cXTk6wRs2Hog2KMxp4ZE8yYPEV+6Vo7t2vxhANdiO6myRN+N4MhMTYljsfKr3OGZT8f2dnIMGZHgwIp1wDlzKBQgyrPSY4aFGSbl7rV3D3KG9AaNShvQYweQJWk8y33PbW4D8qFBgUJ64A5xa0uXpTyQTWKWaAPyt1snp2ppXq60oVCAVIx+/qSeqyhBlX7N3CtQRnr8sBNHt7LyGYAxhH0QbG1duiDcnc3BsGiXAMUalCoQbH1BGVFOtEHtVS7amYNKtGVfWRiYmLKHaS5b+0aoFCDWhpkxqDARV7TB8WHdZDNoPnX4nFHOiu4YFQmRg2qts1AiOSW7cB9Zw5yiyDYExvKy1wUG+KhBlV1LZm0D+rWDFlYQA2qURpSvbNXqEF516CiB1DM/2RVAuaubvRBefJBoQYl81z0vY2pORn5nlCDkg95ZAHKnQbFZ/d0VkGYF1JQzArCxhIWbjwp+b6kvb1CsVFx2HK0W5aGeOWDQh+U6Aqh+cCM4pvog1qqqdZkpgnlbVUt/sXvzp4NZMmL/BBPmkG1qg8qTVZ2pmqsxUMNSv75HFxL9EG5i3VQzMl8gMmcHmpQtTNVogZVYQ2eqJsHWQ5wLZ7pFC9JBxyDtXhUUXRKlbc0Tf03ZZH+avL8W+dlMKNRbXxgUJgPqtxJDkPWkpzkRkZNyFEe3gt9UKhBOd99ye7O/vHx8TedW/rTwjVARVODsgR8mN0GTStIjcN9PijUoIL8fappKrgWr/rIoH35spWjo6PT/sCO/F5dAxT6oKr5oFCDYsnqmO8JfVD2RcEyKX+j4oMKWmNygip5gEIflJwPqjNNetqq1MW7NU0WFmZxLZ5kJsd6fU5O2xeL6slDr7w2UKmT7No9pDegLt7JkfGJivsPqy5eNeYaNWByJZIPDAysy2z+/nvog6qM957W4hleKKcniH/f2yoLi9zkLZeTnA4N7x+uOl0+NPTkeUrpWvgNPNXFI3To+NhYxf2HXRdP3FdRBSa3ALUss/n7s+5zkgflg4qRBsUqC6MGFaYGdfnCld7JyckbTuC/a1c+r+v6Ybf5oG4vFldPTExcrrV/AVDChxVkPiilM+N4fk6xCep7qSGevWgCalCoQZVkzQTWBQzMluY3aA3q9q0/dHR0td2W6TSvvnxQ6p4v31c+/yRfFyISzkF6XsPsyYaSLFuvTo6OjErtPwwGtXzNvakjR44UZeIUlTZSwXz88ce7yPrvfqRjXbyKs4MlPijUoKzqLgHlJAeAOnLkyMdR6VQy5xGkBhX1YVyteEkBVC6Xy7Q98r151KAqh7I9qZCVUDQhK+ckX4iSDwpm3Uo0KGsWLi518ZoBoOqZxaPZjjX6/G2zKnBQqVBkgLjeNlIAlc/nk3c+8e1F1KAq+0Zc+aBioEGB8xvyO7FhG6RMseV/oonS98JaEGY+qIWPPjaHeE5r+7wO8YaGntRZFRYmmJfmLDc/VzXy29ETUn2qkRpUmHXr6gUgp+2lggmzwtu3b2+nD3x3ATUo1KCipkE53eSVvtf12jN4YpsdOz7LUEnM4jlpUKK0lK6TqjN4sL9GalBxHsI5/XayAMX289iLvzDyQtXOSQ4gBtkLdN1op0EWA42ArwSc6CwbAdXgV+cJqaCdmeUAvleNCsZ8PywLgrE/c3v2uciCYBUJFcNQpydpI79HDSp+a/E0VT938JVD62t1kJ07nzLACRgTZfevYFD2LAh2BsVuZ97u3LGxQtX9B6VBKZ0ZqRlLJ6AI63v3AFVSFw/q49mm+E3QYL8SqwZcnhqltL6eAVZ8CoQo5e1ZzinVqChstbUqDNtr9JWeS5ABdatBRS6jZsw1KK+/NbCd4f2HlvSBXXvyeb1IDtvAxpsPStfJ8cJ4xT7WSAYle/1xZFquAGpwcPDe7KbvXTKZkclgOFOixnsx28ffB5EPKo4+KHCUz0SyLl7cNCgnx7jTWrxXy0Bq5678FKX04VInOdzHzhqUHdTEYuTj4xNL+lkjNSi31x8nzcoVQEHwH//GfzLTR/WMmpgPqnJdPMwHJfukD7JdK+eDigOjcg9Qf/qzIU299bNEuvuTlgZUqkmhBuW0Fs9ykovO2EhNDPbptD9CYQBuzdaZVgMx3DNm8UQ9PKyL51qDMmf7ZBYLg8bFZgcNI6jT79fI7/WOtuWnT5+eDfLBIHss1wAFO966devDmf6/nBJpdk1hGjWoeGbUbGENyso6wJ3gPLPcUiuBp7V4BtjIAFQ9PijZzu7ULr2se8PY2NgZp3ZBfu8JoOAEn/jGv+vlDAo1qCQrPQXZDOzMSFWLhFcUniG3TR8UalAyTK+RTKH8eJgPqjrTjsrwzzNAwY89MDDwQPaBr72mpLvWimGdNXtnTf1bJauEdmXN7glfFbcSGJYDY1ZPzNaJfVqzdyBWilk7a5+lM4TB4bxpM5B0kkduFs8owmk5ysFNDg7zJP9r5niyDQnFNhFYi1fPL93KGpRM3MIGqroACi5w+3M/eTbZ1vWy6WcySlOhD8qqlqFpKmdQZj4o1KD8ZEayzAzr4snXxQsLqOoGKLgZYCnMzZs3V3c//J3zfNiHPij70wkAan4uwrN4qEGZRQ1aWYOKIqNqCEDBhT3//POJCxcuZBVF6Uqv23sRGFTL+KASlPTBYuFMNQ1qkZU9Rw3KeXYxSGaFGpS33yNIH1XDAMqGvnRgYKBH07TeFf3ffHepk5zrR+LzZtCgYu8kRw2KESdO/DU2mydMmZZZUzSAJVzwfeV8UGItXlxzksuwKMiecPLkyUsybett4wdAmecEeaTS9331I1hzh2vxyjUozqjss31uHcH1tEcflOE7MtfO2d6rpdkKuFblrw+q3GYQJJOU1ezs91tQmpSvAAUXPvTCT40FxtxhjmvxpnmNvLkZJpyH96qWkzx++aC8xrCkiCazQLW2D8pNHJsGoHbsfUmHwpVmVgIza4ExzGPLwku/L2lvz4pgZDkoHzbCeyuLQQh18VxoUNwPBbN48fBBmU5yYxi4JB+UUTk4zHxQXpkkalDeNCiIW6qn695CofB7N6DmpW0IDAo1qMgxKNSgUIPygB5BsCj/AWrvSzpqUNwHNXdrmtxmdfEsBoUaFI9AGJpLlHxQcdOgEl3ZVRMTEx96wDVXm/gPUKhBEfRBJcB04urGDKIxalDeoxwEe2IPLu+nKLdlq2lQfZ1p0r1kLZ7hgypxkqMGFRZzEpoValDemWvTANTSWbzm1aD6simyIpMirZoPitfDs2YBWcEFYy1fAM9CuSdmWStci+cubEoiMU1U/bnJs29Vrcjsbo+1W/vOoIZaRINalU2TFTYnuV1TEWvxoqVBQYJlalZvwXxQ6IOSmQ0N0qQZyBAPfVCQWwjX4qEGxX1WJboXpBAWlYptPiw7UDSSjdS7r6CGdfbz9J1BoQZFiao2gwYFqVcoQR9U7bp40Lnsy2AAgMxkd4YR1CxNpXHYhtlEMYtnrxYTtkZnP34Y4BQSg0INqll9UKhBGev0yoAoLhk1yxlWqqdrbaFQuFAv86pne98ZFGpQfIgXPR8UalDog6qcDyrbtyJz7Nix2/UAS6O29R+g0AfVBBqUmJ2rnVGzlEFBRk6ejRPKo7vVoHRdmxje/9rWSjf6M1/8nNWz6ugJi8Xipddf/fWa8l1s3769I5NtW7AP17zkJNc0/dLI+PiS/cN+w6iL5xSqsIZxtc7Ld4BCDQo1KJbMmfJbTdYx7lSafM8Xnj5FFbpJdn+iE9jb1zrGli1bVq9cuewibGcxLZd18Yg6dHxssuJ0fJh18cpn64LM7+QEkuXf+w5Q9fugVDbTwTMhiFzk0cpJLvJBoQ+qMT6oV18+6Hhf7nl2T55SnVX/9fKSOca2bdvuy2bbjimKslowKHPWzSEf1LETYzWvIWwGpXRmHpycnHzHS+yC3MbxRqj3ZLgGpRKF8iRfCitNpRFKNXg0GemBVULNLAfwvcraiQrFvKACvOefW9kMRBYEq0CDldXAygnu5sld6UnrtD0UTRA+KOEkr+6DgmwGPP1vuPmgoqdBXbl4rX98fPxNt/ccDPlkmdT01dn7R0dH35M9xq5d+byqqofd5IP67egJqX412P/I21TXH+Czela6F+Zwp/7cv6mermWFQuGm7PWH3U4qkPWcJPqgmsEHFYwGdfXSh54Ayn5/Dg4O9t29ZtU18dn01dmHMpnMu0eOHCnWcx+Lbbdv3748nVKmNU09CaCiqtoxhdJZqtND0OY3x49LO6w/vXFjXlO1w5UAqhHnat9HFPUlmWv0HaBQg0INSlaDagRAydz0UWwz8NDDevnawErMnWTa7zp16hQDYBDzF67PLFRzgLf19txz4sSJK1G8Xtlz8h2gUIOKAYNqUD6oen1QrQxQsh221dr5D1CoQRFNg8rCs0Y+KNSgqml6XjWoVuu0rXS9/gMU+qDQByXpg0IG1UrQI3etvgMUalCoQaEGJdcZsdXSCPgOUKhBoQbF3OQSuRGRQSFElUfAf4BCDQo1KKIQCsteRHXMKo7y6auz942MjDD3Nr4wAkyr9DsM6IOKAYNSYK2cyIRZqS5eMD6oS+//vvPUqVPzft+TuP/4RMB3gEINCjUoWQ3q1ZcPwliwIQuB49MF8UxrRcB3gEINKgYMKiI+KJn1cdidWysC/gMUalCoQUlqUK/8atj3+7G1unf8r9b3GwLWLrWvfvYcVZLLeEYCq0w5Y/OwcJhAGXRQQYxy6OJzJqqqRhYDq62V1QD2Zc9yYN93cD9O7LMZRECDunzhysaTJ0++EdyvhkeKQwR8BygIwlNf+dGhRCq7m2UlMCuPZb8AAAQDSURBVLMWGGDEkjCLrAT8e93+3shiwE50STYDAW4WMLG0Q5pqxt6vVeHiALD/dIIuyWZg/14tLpIFqCgc67p4/uYkv3b5erpQKCzGodPgOQYXgUAA6rNf+uHfJ9t6f2zP6SRSpnBGxcEKFFIAIcGoOFPCfFD+3A6UsFJTZh07yIApZvN4JkxdAVAy/m/oVKR8G/i80mfwpHBRFw/1J39+5bjvNRCA2vHCP3+KkvTZ1s0HhWvxavmgZq7duHtkZORq3DsTnn/jIxAIQMFp57/8gy8T0vavyVT7epFUDjWomcb/otJ7tDGokDWozvbu5L59+6xxufQ1YMNmj0BwAJXPJ2dnZ+/ve+iFMzyTJmpQkFEzCI2sooMbMjaCOVNJsPLkbOgm3sNgWwzbYJhHKNFp4zUoTdMmVVX/4evDrx9s9o6G1+ctAoEBFJze+vXr29YNfutjoTlBF0ENytsPV/9W4WtQ75/7oGtqamqu/mvBPTRrBAIFKBOkBr75cWvlJI+HBsWmKWxMyhTKgUEZTEowKyglxZgX/FWMv+K9/S8wtAo+qGuXr2cLhQIr7YQvjEC1CAQOUMaJ0MHBwXuWr336/5RE+/3ogwrjBg1Cg4JZQrqkLh4uaQnj947nMcMCKBatoS/93edTqeyB1vJBlWbUbBUNSlX1s9d+/+HuycnJ8/HsKnjWYUQgVIASF/yZz3zmwWVrdp9BH1SQt0CwGtTiorYHxfAgf9/mOFYkAMoGVCuWr955fWldPKiHB6th4loXrzU1qMvX5voKhcL15ugqeBVhRCBSABVGAOJ+zM2bN6/Zpv/uA/fX4axBFWly/H9GLufc7xu3wAg0JgIIUI2JY6h7+fYmxcyhJK1pSfigKKVD/3X8inQhylCDgAdvygggQDXHz6q8uCk1niLqFvnLqaVBJcjF7COpRlXjlT8nbIkRKI0AAlST3BHf3Ni2O0EXWflteDkxKUIhuQ0s6DUWDBt+JXh/evETvZOTkzeaJDR4GTGOAAJUjH+88lPv7+9PJ5PJ1QP6mQMpsvhw7UurrEG9QT6FBsomuififikIUHH/BZeev/KNTW170mTxQE0mZWhQRSV9o6gkR3WSeJVqiQP/PfnhO80XEryiuEYAASquv5zEeQ8ODvZvLVbLUskZ1Bvtg/d1dHRcQb1JIqDYJPAIIEAFHvLQDkhzuVxHOp1uv3Pnzse4Di603wEP7CICCFAugoVNMQIYgWAjgAAVbLzxaBgBjICLCCBAuQgWNsUIYASCjQACVLDxxqNhBDACLiKAAOUiWNgUI4ARCDYCCFDBxhuPhhHACLiIAAKUi2BhU4wARiDYCCBABRtvPBpGACPgIgIIUC6ChU0xAhiBYCPw/9X50I5bW6H8AAAAAElFTkSuQmCC
  1716. // @grant none
  1717. // ==/UserScript==
  1718.  
  1719. 'use strict';
  1720.  
  1721. let toggle;
  1722. let rebuildData = [];
  1723. let rebuiltTowers = [];
  1724. let waitRebuildData = [];
  1725.  
  1726. window.toggleRebuilder = () => {
  1727. return (toggle = !toggle);
  1728. };
  1729.  
  1730. window.getRebuilderToggle = () => {
  1731. return toggle;
  1732. };
  1733.  
  1734. addEventListener('keydown', function(e) {
  1735. if(document.activeElement.tagName.toLowerCase() !== "input" && document.activeElement.tagName.toLowerCase() !== "textarea") {
  1736. if(e.key === "|") {
  1737. let tglrb = window.toggleRebuilder();
  1738. new Noty({
  1739. type: 'success',
  1740. text: `ReBuilder toggle is now ${tglrb}`,
  1741. timeout: 2000
  1742. }).show();
  1743. dispatchEvent(new CustomEvent("rebuilderToggleFromKeybind"));
  1744. };
  1745. if(e.key === "~") {
  1746. window.addMarker();
  1747. new Noty({
  1748. type: 'success',
  1749. text: `Added marker`,
  1750. timeout: 2000
  1751. }).show();
  1752. };
  1753. if(e.key === "}") {
  1754. window.startaito = !window.startaito;
  1755. window.sendAitoAlt();
  1756. new Noty({
  1757. type: 'success',
  1758. text: `AITO toggle is now ${window.startaito}`,
  1759. timeout: 2000
  1760. }).show();
  1761. dispatchEvent(new CustomEvent("aitoToggleFromKeybind"));
  1762. };
  1763. };
  1764. });
  1765.  
  1766. game.network.addRpcHandler("ReceiveChatMessage", e => {
  1767. if (e.message == "!rb" && e.uid == game.world.myUid) {
  1768. let tglrb = window.toggleRebuilder();
  1769. new Noty({
  1770. type: 'success',
  1771. text: `ReBuilder toggle is now ${tglrb}`,
  1772. timeout: 2000
  1773. }).show();
  1774. dispatchEvent(new CustomEvent("rebuilderToggleFromChatCommand"));
  1775. }
  1776. })
  1777.  
  1778. window.noty3x = function() {
  1779. new Noty({
  1780. type: 'success',
  1781. text: `3x3 Walls toggle is now ${window.x3builds}`,
  1782. timeout: 2000
  1783. }).show();
  1784. };
  1785.  
  1786. const onFailure = (data) => {
  1787. let reason = data.reason;
  1788. if(["ObstructonsArePresent", "PartyBuildingObstructionsArePresent"].includes(reason) && toggle) {
  1789. // Something is blocking the building placement.... Who knows?
  1790. };
  1791. };
  1792.  
  1793. game.network.addRpcHandler("Failure", onFailure);
  1794.  
  1795. game.network.addRpcHandler("LocalBuilding", (data) => {
  1796. if(!toggle) { return; };
  1797. for(let e of data) {
  1798. if(!!e.dead) {
  1799. rebuildData.push(`${e.x} - ${e.y} - ${e.tier}`);
  1800. let snb = e;
  1801. snb.name = "MakeBuilding";
  1802. snb.yaw = e.yaw || 0;
  1803. game.network.sendRpc(snb);
  1804. continue;
  1805. };
  1806. if(!rebuildData.includes(`${e.x} - ${e.y} - ${e.tier}`)) { continue; };
  1807. let args = rebuildData[rebuildData.indexOf(`${e.x} - ${e.y} - ${e.tier}`)].split(" - ").map(i => parseInt(i));
  1808. if(!e.dead && e.x == args[0] && e.y == args[1]) {
  1809. setTimeout(() => {
  1810. for(let i = 1; i < args[2]; i++) {
  1811. game.network.sendRpc({ name: "UpgradeBuilding", uid: e.uid });
  1812. };
  1813. rebuiltTowers.push(`${e.x} - ${e.y} - ${args[2]} - ${e.yaw} - ${e.type} - ${e.uid}`);
  1814. }, game.world.replicator.msPerTick);
  1815. };
  1816. };
  1817. });
  1818.  
  1819. var map = document.getElementById("hud-map");
  1820. let markerId = 1;
  1821.  
  1822. window.addMarker = () => {
  1823. map.insertAdjacentHTML("beforeend", `<div style="color: red; display: block; left: ${parseInt(game.ui.components.Map.playerElems[game.world.getMyUid()].marker.style.left) - 4}%; top: ${parseInt(game.ui.components.Map.playerElems[game.world.getMyUid()].marker.style.top) - 12}%; position: absolute;" class='map-display'><i class='fa fa-map-marker'>${markerId++}</i></div>`)
  1824. };
  1825.  
  1826. // ==UserScript==
  1827. // @name L Key Fixed w/ Automatic Hits
  1828. // @namespace -
  1829. // @version 0.1
  1830. // @description say "!L" to enable/disable the L key.
  1831. // @author Trollers, eh
  1832. // @match zombs.io
  1833. // @grant none
  1834. // ==/UserScript==
  1835. let id = 1;
  1836. let cloneTimeout = false;
  1837. let socket = [];
  1838. function ltab() {
  1839. let thisServer = Game.currentGame.options.servers[Game.currentGame.options.serverId];
  1840. let ws = new WebSocket(`ws://${thisServer.hostname}:${8000}`);
  1841. ws.binaryType = "arraybuffer";
  1842. ws.id = id++;
  1843. socket.push(ws);
  1844. ws.onopen = () => {
  1845. ws.network = new Game.currentGame.networkType();
  1846. ws.network.sendPacket = (e, t) => {
  1847. if (!ws.isclosed) {
  1848. ws.send(ws.network.codec.encode(e, t));
  1849. }
  1850. };
  1851. ws.onEnterWorld = (e) => {
  1852. ws.inWorld = true;
  1853. };
  1854. ws.onclose = () => {
  1855. if (!ws.isclosed) {
  1856. ws.isclosed = true;
  1857. ltab();
  1858. }
  1859. };
  1860. ws.onmessage = (msg) => {
  1861. ws.data = ws.network.codec.decode(msg.data);
  1862. if (ws.data.opcode === 5) {
  1863. ws.network.sendPacket(4, { displayName: "asdf", extra: ws.data.extra });
  1864. }
  1865. if (ws.data.opcode == 4) ws.onEnterWorld(ws.data);
  1866. if (ws.data.uid) {
  1867. ws.uid = ws.data.uid;
  1868. ws.network.sendPacket(3, { up: 1, down: 0 });
  1869. ws.wready = true;
  1870. }
  1871. if (ws.data.name == "PartyInfo") {
  1872. ws.partyInfo = ws.data.response;
  1873. setTimeout(() => {
  1874. for (let i in ws.partyInfo) {
  1875. if (ws.partyInfo[i].playerUid == ws.uid && ws.partyInfo[i].isLeader) {
  1876. ws.network.sendRpc({ name: "SetPartyMemberCanSell", uid: game.world.myUid, canSell: 1 });
  1877. ws.network.sendRpc({ name: "SetOpenParty", isOpen: 1 });
  1878. setTimeout(() => {
  1879. ws.network.sendRpc({ name: "SetPartyName", partyName: ws.id + "" });
  1880. }, 1000);
  1881. }
  1882. }
  1883. }, 1750);
  1884. }
  1885. if (ws.data.name == "PartyApplicant") {
  1886. ws.partyApplicant = ws.data.response;
  1887. if (ws.partyApplicant.applicantUid == game.world.myUid) {
  1888. ws.network.sendRpc({ name: "PartyApplicantDecide", applicantUid: game.world.myUid, accepted: 1 });
  1889. }
  1890. }
  1891. if (ws.data.name == "PartyShareKey") {
  1892. ws.psk = ws.data.response.partyShareKey;
  1893. if (window.FKey && cloneTimeout) {
  1894. if (socket[1].psk !== socket[0].psk) {
  1895. game.network.sendRpc({ name: "JoinPartyByShareKey", partyShareKey: window.playerIds.id2.psk });
  1896. }
  1897. }
  1898. }
  1899. };
  1900. };
  1901. }
  1902.  
  1903. window.LKeyWithTimeouts = function () {
  1904. new Noty({
  1905. type: 'success',
  1906. text: `L Key toggle is now ${window.FKey}`,
  1907. timeout: 2000
  1908. }).show();
  1909. cloneTimeout = false;
  1910. if (window.FKey) {
  1911. window.reduceWS2();
  1912. window.waitUntilReady = setInterval(() => {
  1913. if(socket[0].wready && socket[1].wready) {
  1914. window.playerIds = {
  1915. id1: socket[0],
  1916. id2: socket[1],
  1917. };
  1918. console.log(`WREADY 1: ${socket[0].readyState === WebSocket.OPEN}, 2: ${socket[1].readyState === WebSocket.OPEN}`);
  1919. game.network.sendRpc({ name: "KickParty", uid: window.playerIds.id1.uid });
  1920. game.network.sendRpc({ name: "KickParty", uid: window.playerIds.id2.uid });
  1921. window.FKeyOn = setInterval(() => {
  1922. cloneTimeout = true;
  1923. window.playerIds.id2.network.sendRpc({ name: "JoinPartyByShareKey", partyShareKey: window.playerIds.id1.psk });
  1924. setTimeout(() => {
  1925. window.playerIds.id1.network.sendRpc({ name: "KickParty", uid: window.playerIds.id2.uid });
  1926. setTimeout(() => {
  1927. window.playerIds.id2.network.sendRpc({ name: "KickParty", uid: game.world.myUid });
  1928. }, 7400);
  1929. if(window.lksa) {
  1930. setTimeout(() => {
  1931. game.network.sendInput({ space: 1 });
  1932. game.network.sendInput({ space: 0 });
  1933. setTimeout(() => {
  1934. game.network.sendInput({ space: 1 });
  1935. game.network.sendInput({ space: 0 });
  1936. }, 250);
  1937. }, 7150);
  1938. };
  1939. }, 350);
  1940. if(window.lksa) {
  1941. setTimeout(() => {
  1942. game.network.sendInput({ space: 1 });
  1943. game.network.sendInput({ space: 0 });
  1944. setTimeout(() => {
  1945. game.network.sendInput({ space: 1 });
  1946. game.network.sendInput({ space: 0 });
  1947. }, 250);
  1948. }, 50);
  1949. };
  1950. }, 15500);
  1951. if(window.lksa) {
  1952. setTimeout(() => {
  1953. game.network.sendInput({ space: 1 });
  1954. game.network.sendInput({ space: 0 });
  1955. setTimeout(() => {
  1956. game.network.sendInput({ space: 1 });
  1957. game.network.sendInput({ space: 0 });
  1958. }, 250);
  1959. }, 15250);
  1960. };
  1961. console.log("readyboth");
  1962. clearInterval(window.waitUntilReady);
  1963. };
  1964. }, 75);
  1965. } else {
  1966. clearInterval(window.FKeyOn);
  1967. window.FKeyOn = null;
  1968. window.playerIds.id1.isclosed = true;
  1969. window.playerIds.id1.close();
  1970. window.playerIds.id2.isclosed = true;
  1971. window.playerIds.id2.close();
  1972. clearInterval(window.aitUntilReady);
  1973. socket = [];
  1974. }
  1975. };
  1976.  
  1977. let aud = new Audio("https://cdn.discordapp.com/attachments/855622511553937429/865666768009166858/bmmph.mp3");
  1978.  
  1979. game.network.addRpcHandler("ReceiveChatMessage", (e) => {
  1980. if (e.message == "!L" && e.uid == game.world.myUid) {
  1981. window.FKey = !window.FKey;
  1982. window.LKeyWithTimeouts();
  1983. dispatchEvent(new CustomEvent("LKeyToggleFromChatCommand"));
  1984. }
  1985. if(!window.sfxc) return;
  1986. aud.play();
  1987. });
  1988. window.oldWs2 = false;
  1989. window.reduceWS2 = () => {
  1990. if (!window.oldWs2) {
  1991. window.oldWs2 = true;
  1992. for (let i = 0; i < 2; i++) {
  1993. ltab();
  1994. }
  1995. }
  1996. };
  1997.  
  1998. // game.network.addEnterWorldHandler(window.reduceWS2);
  1999.  
  2000. window.ssMode = () => {
  2001. window.ssModeToggle = !window.ssModeToggle;
  2002. var mba = document.querySelectorAll([".hud-bottom-right", ".hud-bottom-left", ".hud-bottom-center", ".hud-center-left", ".hud-top-right"]);
  2003. for(let mb of mba) {
  2004. if (mb.style.display === "none") {
  2005. mb.style.display = "block";
  2006. } else {
  2007. mb.style.display = "none";
  2008. }
  2009. };
  2010. document.querySelector(".hud-bottom-right").appendChild(document.querySelector("#hud-health-bar"));
  2011. document.querySelector(".hud-bottom-right").insertAdjacentElement("afterbegin", document.querySelector("#hud-party-icons"));
  2012. document.querySelector(".hud-bottom-left").insertAdjacentElement("afterbegin", document.querySelector("#hud-day-night-ticker"));
  2013. // original screenshot mode code by deathrain, modified by eh
  2014. };
  2015.  
  2016. /**
  2017. * @author mrdoob / http://mrdoob.com/
  2018. */
  2019.  
  2020. window.Stats = function () {
  2021.  
  2022. var mode = 0;
  2023.  
  2024. var container = document.createElement( 'div' );
  2025. container.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000';
  2026. container.addEventListener( 'click', function ( event ) {
  2027.  
  2028. event.preventDefault();
  2029. showPanel( ++ mode % container.children.length );
  2030.  
  2031. }, false );
  2032.  
  2033. //
  2034.  
  2035. function addPanel( panel ) {
  2036.  
  2037. container.appendChild( panel.dom );
  2038. return panel;
  2039.  
  2040. }
  2041.  
  2042. function showPanel( id ) {
  2043.  
  2044. for ( var i = 0; i < container.children.length; i ++ ) {
  2045.  
  2046. container.children[ i ].style.display = i === id ? 'block' : 'none';
  2047.  
  2048. }
  2049.  
  2050. mode = id;
  2051.  
  2052. }
  2053.  
  2054. //
  2055.  
  2056. var beginTime = ( performance || Date ).now(), prevTime = beginTime, frames = 0;
  2057.  
  2058. var fpsPanel = addPanel( new window.Stats.Panel( 'FPS', '#0ff', '#002' ) );
  2059. var msPanel = addPanel( new window.Stats.Panel( 'MS', '#0f0', '#020' ) );
  2060.  
  2061. if ( self.performance && self.performance.memory ) {
  2062.  
  2063. var memPanel = addPanel( new window.Stats.Panel( 'MB', '#f08', '#201' ) );
  2064.  
  2065. }
  2066.  
  2067. showPanel( 0 );
  2068.  
  2069. return {
  2070.  
  2071. REVISION: 16,
  2072.  
  2073. dom: container,
  2074.  
  2075. addPanel: addPanel,
  2076. showPanel: showPanel,
  2077.  
  2078. begin: function () {
  2079.  
  2080. beginTime = ( performance || Date ).now();
  2081.  
  2082. },
  2083.  
  2084. end: function () {
  2085.  
  2086. frames ++;
  2087.  
  2088. var time = ( performance || Date ).now();
  2089.  
  2090. msPanel.update( time - beginTime, 200 );
  2091.  
  2092. if ( time >= prevTime + 1000 ) {
  2093.  
  2094. fpsPanel.update( ( frames * 1000 ) / ( time - prevTime ), 100 );
  2095.  
  2096. prevTime = time;
  2097. frames = 0;
  2098.  
  2099. if ( memPanel ) {
  2100.  
  2101. var memory = performance.memory;
  2102. memPanel.update( memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576 );
  2103.  
  2104. }
  2105.  
  2106. }
  2107.  
  2108. return time;
  2109.  
  2110. },
  2111.  
  2112. update: function () {
  2113.  
  2114. beginTime = this.end();
  2115.  
  2116. },
  2117.  
  2118. // Backwards Compatibility
  2119.  
  2120. domElement: container,
  2121. setMode: showPanel
  2122.  
  2123. };
  2124.  
  2125. };
  2126.  
  2127. window.Stats.Panel = function ( name, fg, bg ) {
  2128.  
  2129. var min = Infinity, max = 0, round = Math.round;
  2130. var PR = round( window.devicePixelRatio || 1 );
  2131.  
  2132. var WIDTH = 175 * PR, HEIGHT = 48 * PR,
  2133. TEXT_X = 3 * PR, TEXT_Y = 2 * PR,
  2134. GRAPH_X = 3 * PR, GRAPH_Y = 15 * PR,
  2135. GRAPH_WIDTH = 171 * PR, GRAPH_HEIGHT = 30 * PR;
  2136.  
  2137. var canvas = document.createElement( 'canvas' );
  2138. canvas.width = WIDTH;
  2139. canvas.height = HEIGHT;
  2140. canvas.style.cssText = 'width:80px;height:48px';
  2141.  
  2142. var context = canvas.getContext( '2d' );
  2143. context.font = 'bold ' + ( 9 * PR ) + 'px Helvetica,Arial,sans-serif';
  2144. context.textBaseline = 'top';
  2145.  
  2146. context.fillStyle = bg;
  2147. context.fillRect( 0, 0, WIDTH, HEIGHT );
  2148.  
  2149. context.fillStyle = fg;
  2150. context.fillText( name, TEXT_X, TEXT_Y );
  2151. context.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );
  2152.  
  2153. context.fillStyle = bg;
  2154. context.globalAlpha = 0.9;
  2155. context.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );
  2156.  
  2157. return {
  2158.  
  2159. dom: canvas,
  2160.  
  2161. update: function ( value, maxValue ) {
  2162.  
  2163. min = Math.min( min, value );
  2164. max = Math.max( max, value );
  2165.  
  2166. context.fillStyle = bg;
  2167. context.globalAlpha = 1;
  2168. context.fillRect( 0, 0, WIDTH, GRAPH_Y );
  2169. context.fillStyle = fg;
  2170. context.fillText( round( value ) + ' ' + name + ' (' + round( min ) + '-' + round( max ) + ')', TEXT_X, TEXT_Y );
  2171.  
  2172. context.drawImage( canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT );
  2173.  
  2174. context.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT );
  2175.  
  2176. context.fillStyle = bg;
  2177. context.globalAlpha = 0.9;
  2178. context.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round( ( 1 - ( value / maxValue ) ) * GRAPH_HEIGHT ) );
  2179.  
  2180. }
  2181.  
  2182. };
  2183.  
  2184. };
  2185.  
  2186. window.ScoreStats = window.Stats.Panel("SPW", "rgb(0, 255, 255)", "rgb(0, 0, 34)");
  2187. window.ScoreStats.dom.style.width = "175px";
  2188. window.ScoreStats.dom.style.cssText = "width:175px;height:48px;";
  2189.  
  2190. game.network.sendRpc2 = game.network.sendRpc;
  2191. game.network.sendRpc = (data) => {
  2192. if(data.name === "MakeBuilding" && data.type === "Wall" && window.x3builds) {
  2193. console.log(data);
  2194.  
  2195. let offset = 48;
  2196. let oldOffset = 48
  2197. let earlyOffset = 48;
  2198.  
  2199. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x + offset, y: data.y - offset, yaw: data.yaw });
  2200. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x - offset, y: data.y - offset, yaw: data.yaw });
  2201. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x + offset, y: data.y + offset, yaw: data.yaw });
  2202. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x - offset, y: data.y + offset, yaw: data.yaw });
  2203. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x - offset, y: data.y, yaw: data.yaw });
  2204. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x + offset, y: data.y, yaw: data.yaw });
  2205. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x, y: data.y - offset, yaw: data.yaw });
  2206. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x, y: data.y + offset, yaw: data.yaw });
  2207.  
  2208. offset *= 2;
  2209.  
  2210. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x + offset, y: data.y - offset, yaw: data.yaw });
  2211. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x - offset, y: data.y - offset, yaw: data.yaw });
  2212. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x + offset, y: data.y + offset, yaw: data.yaw });
  2213. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x - offset, y: data.y + offset, yaw: data.yaw });
  2214. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x - offset, y: data.y, yaw: data.yaw });
  2215. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x + offset, y: data.y, yaw: data.yaw });
  2216. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x, y: data.y - offset, yaw: data.yaw });
  2217. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x, y: data.y + offset, yaw: data.yaw });
  2218. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x + oldOffset, y: data.y + offset, yaw: data.yaw });
  2219. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x - oldOffset, y: data.y + offset, yaw: data.yaw });
  2220. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x + oldOffset, y: data.y - offset, yaw: data.yaw });
  2221. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x - oldOffset, y: data.y - offset, yaw: data.yaw });
  2222. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x + offset, y: data.y - oldOffset, yaw: data.yaw });
  2223. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x - offset, y: data.y - oldOffset, yaw: data.yaw });
  2224. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x + offset, y: data.y + oldOffset, yaw: data.yaw });
  2225. game.network.sendRpc2({ name: "MakeBuilding", type: data.type, x: data.x - offset, y: data.y + oldOffset, yaw: data.yaw });
  2226. }; // xy
  2227. game.network.sendRpc2(data);
  2228. };
  2229.  
  2230. let dimension = 1;
  2231. let upd = () => {
  2232. const renderer = Game.currentGame.renderer;
  2233. let canvasWidth = window.innerWidth * window.devicePixelRatio;
  2234. let canvasHeight = window.innerHeight * window.devicePixelRatio;
  2235. let ratio = canvasHeight / (1080 * dimension);
  2236. renderer.scale = ratio;
  2237. renderer.entities.setScale(ratio);
  2238. renderer.ui.setScale(ratio);
  2239. renderer.renderer.resize(canvasWidth, canvasHeight);
  2240. renderer.viewport.width = renderer.renderer.width / renderer.scale + 2 * renderer.viewportPadding;
  2241. renderer.viewport.height = renderer.renderer.height / renderer.scale + 2 * renderer.viewportPadding;
  2242. };
  2243. const onWindowResize = () => {
  2244. if (window.zoomonscroll) {
  2245. upd();
  2246. console.log(dimension);
  2247. }
  2248. } // Zoom by Apex, modified by eh
  2249. onWindowResize();
  2250. window.onresize = onWindowResize;
  2251. window.onwheel = e => {
  2252. if (e.deltaY > 0) {
  2253. dimension += 0.02;
  2254. } else if (e.deltaY < 0) {
  2255. dimension -= 0.02;
  2256. }
  2257. onWindowResize();
  2258. }
  2259.  
  2260. window.zoom = val => {
  2261. dimension = val;
  2262. upd();
  2263. };
  2264.  
  2265. function hexToRgb(hex) {
  2266. var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  2267. if(result){
  2268. var r= parseInt(result[1], 16);
  2269. var g= parseInt(result[2], 16);
  2270. var b= parseInt(result[3], 16);
  2271. return [r, g, b];
  2272. }
  2273. return null;
  2274. };
  2275.  
  2276. window.customColor = function() {
  2277. let yncv = document.getElementById("ync").value;
  2278. let hr = hexToRgb(yncv);
  2279. game.world.localPlayer.entity.currentModel.nameEntity.setColor(hr[0], hr[1], hr[2]);
  2280. window.yncv = yncv;
  2281. };
  2282.  
  2283. game.network.addPacketHandler(0, () => {
  2284. let entities = game.world.entities;
  2285. if(window.AHRC) {
  2286. if (!window.AHRC1) {
  2287. window.AHRC1 = true;
  2288. setTimeout(() => { window.AHRC1 = false; }, 75);
  2289. for(let uid in entities) {
  2290. if(!entities.hasOwnProperty(uid)) continue;
  2291. let obj = entities[uid];
  2292. Game.currentGame.network.sendRpc({
  2293. name: "CollectHarvester",
  2294. uid: obj.fromTick.uid
  2295. });
  2296. if(obj.fromTick.model == "Harvester" && obj.fromTick.tier == 1) {
  2297. Game.currentGame.network.sendRpc({
  2298. name: "AddDepositToHarvester",
  2299. uid: obj.fromTick.uid,
  2300. deposit: 0.07
  2301. });
  2302. };
  2303. if(obj.fromTick.model == "Harvester" && obj.fromTick.tier == 2) {
  2304. Game.currentGame.network.sendRpc({
  2305. name: "AddDepositToHarvester",
  2306. uid: obj.fromTick.uid,
  2307. deposit: 0.11
  2308. });
  2309. };
  2310. if(obj.fromTick.model == "Harvester" && obj.fromTick.tier == 3) {
  2311. Game.currentGame.network.sendRpc({
  2312. name: "AddDepositToHarvester",
  2313. uid: obj.fromTick.uid,
  2314. deposit: 0.17
  2315. });
  2316. };
  2317. if(obj.fromTick.model == "Harvester" && obj.fromTick.tier == 4) {
  2318. Game.currentGame.network.sendRpc({
  2319. name: "AddDepositToHarvester",
  2320. uid: obj.fromTick.uid,
  2321. deposit: 0.22
  2322. });
  2323. };
  2324. if(obj.fromTick.model == "Harvester" && obj.fromTick.tier == 5) {
  2325. Game.currentGame.network.sendRpc({
  2326. name: "AddDepositToHarvester",
  2327. uid: obj.fromTick.uid,
  2328. deposit: 0.25
  2329. });
  2330. };
  2331. if(obj.fromTick.model == "Harvester" && obj.fromTick.tier == 6) {
  2332. Game.currentGame.network.sendRpc({
  2333. name: "AddDepositToHarvester",
  2334. uid: obj.fromTick.uid,
  2335. deposit: 0.28
  2336. });
  2337. };
  2338. if(obj.fromTick.model == "Harvester" && obj.fromTick.tier == 7) {
  2339. Game.currentGame.network.sendRpc({
  2340. name: "AddDepositToHarvester",
  2341. uid: obj.fromTick.uid,
  2342. deposit: 0.42
  2343. });
  2344. };
  2345. if(obj.fromTick.model == "Harvester" && obj.fromTick.tier == 8) {
  2346. Game.currentGame.network.sendRpc({
  2347. name: "AddDepositToHarvester",
  2348. uid: obj.fromTick.uid,
  2349. deposit: 0.65
  2350. });
  2351. };
  2352. };
  2353. };
  2354. };
  2355. });
  2356.  
  2357. window.toggleAllDay = () => {
  2358. let hno = document.getElementsByClassName("hud-day-night-overlay")[0];
  2359. if(hno.style.display === "block" || hno.style.display === "") {
  2360. hno.style.display = "none"; // 2k lines, woo-hoo!
  2361. } else {
  2362. hno.style.display = "block";
  2363. };
  2364. };
  2365.  
  2366. window.moveTowards = pos => {
  2367. if (game.ui.playerTick.position.y-pos.y > 100 || Math.sqrt(Math.pow((game.ui.playerTick.position.y-pos.y), 2) + Math.pow((game.ui.playerTick.position.x-pos.x), 2)) < 100) {
  2368. game.network.sendInput({down: 0})
  2369. } else {
  2370. game.network.sendInput({down: 1})
  2371. }
  2372. if (-game.ui.playerTick.position.y+pos.y > 100 || Math.sqrt(Math.pow((game.ui.playerTick.position.y-pos.y), 2) + Math.pow((game.ui.playerTick.position.x-pos.x), 2)) < 100) {
  2373. game.network.sendInput({up: 0})
  2374. } else {
  2375. game.network.sendInput({up: 1})
  2376. }
  2377. if (-game.ui.playerTick.position.x+pos.x > 100 || Math.sqrt(Math.pow((game.ui.playerTick.position.y-pos.y), 2) + Math.pow((game.ui.playerTick.position.x-pos.x), 2)) < 100) {
  2378. game.network.sendInput({left: 0})
  2379. } else {
  2380. game.network.sendInput({left: 1})
  2381. }
  2382. if (game.ui.playerTick.position.x-pos.x > 100 || Math.sqrt(Math.pow((game.ui.playerTick.position.y-pos.y), 2) + Math.pow((game.ui.playerTick.position.x-pos.x), 2)) < 100) {
  2383. game.network.sendInput({right: 0})
  2384. } else {
  2385. game.network.sendInput({right: 1})
  2386. }
  2387. };
  2388.  
  2389. window.moveAwayFrom = pos => {
  2390. if (game.ui.playerTick.position.y-pos.y > 100 || Math.sqrt(Math.pow((game.ui.playerTick.position.y-pos.y), 2) + Math.pow((game.ui.playerTick.position.x-pos.x), 2)) < 100) {
  2391. game.network.sendInput({down: 1})
  2392. } else {
  2393. game.network.sendInput({down: 0})
  2394. }
  2395. if (-game.ui.playerTick.position.y+pos.y > 100 || Math.sqrt(Math.pow((game.ui.playerTick.position.y-pos.y), 2) + Math.pow((game.ui.playerTick.position.x-pos.x), 2)) < 100) {
  2396. game.network.sendInput({up: 1})
  2397. } else {
  2398. game.network.sendInput({up: 0})
  2399. }
  2400. if (-game.ui.playerTick.position.x+pos.x > 100 || Math.sqrt(Math.pow((game.ui.playerTick.position.y-pos.y), 2) + Math.pow((game.ui.playerTick.position.x-pos.x), 2)) < 100) {
  2401. game.network.sendInput({left: 1})
  2402. } else {
  2403. game.network.sendInput({left: 0})
  2404. }
  2405. if (game.ui.playerTick.position.x-pos.x > 100 || Math.sqrt(Math.pow((game.ui.playerTick.position.y-pos.y), 2) + Math.pow((game.ui.playerTick.position.x-pos.x), 2)) < 100) {
  2406. game.network.sendInput({right: 1})
  2407. } else {
  2408. game.network.sendInput({right: 0})
  2409. }
  2410. };
  2411.  
  2412.  
  2413. const dist = (a, b) => {
  2414. return Math.sqrt( Math.pow((b.y-a.y), 2) + Math.pow((b.x-a.x), 2) );
  2415. };
  2416.  
  2417. window.nearestPlayer = () => {
  2418. let playerPos = game.ui.playerTick.position;
  2419. let ewoalp = [];
  2420. for(let e of Object.entries(game.world.entities)){ if((e[0] != game.world.myUid) && e[1].entityClass === "PlayerEntity") { ewoalp.push(e[1]); }; };
  2421. return ewoalp.map(e => { return { x: e.getPositionX(), y: e.getPositionY(), uid: e.uid } }).sort((a, b) => dist(a, playerPos) - dist(b, playerPos))[0];
  2422. };
  2423.  
  2424. game.network.addEntityUpdateHandler(() => {
  2425. if(window.follow && window.follow.toggle) {
  2426. if(window.follow.np) {
  2427. let np = window.nearestPlayer();
  2428. if(!np) { return; };
  2429. window.moveTowards(np);
  2430. } else if(window.follow.uid) {
  2431. let entity = game.world.entities[window.follow.uid];
  2432. if(!entity) { return; };
  2433. window.moveTowards(entity.targetTick.position);
  2434. };
  2435. };
  2436. if(!window.zoomonscroll) {
  2437. window.zoom(document.getElementById("zoomSlider").value);
  2438. };
  2439. });
  2440.  
  2441. document.getElementsByClassName('hud-intro-name')[0].setAttribute('maxlength', 29);
  2442.  
  2443. game.network.sendPacket2 = game.network.sendPacket;
  2444. game.network.sendPacket = (opcode, data) => {
  2445. window.ptOpc = opcode;
  2446. window.ptData = data;
  2447. dispatchEvent(new CustomEvent("sendPacket"));
  2448. game.network.sendPacket2(opcode, data);
  2449. };
  2450.  
  2451. /*** TROLLERS ***/
  2452.  
  2453. // server scanner (serverObj has the data)
  2454.  
  2455. localStorage.wsEnv = "wss://idealglisteningprocessors.thethe4.repl.co/";
  2456. localStorage.isxyzAllowed = "1";
  2457. localStorage.haspassword = "ytrsmoon==?1.";
  2458.  
  2459. wss = null;
  2460. codec = new BinCodec();
  2461. serverObj = {};
  2462. let leaderboardLoaded;
  2463.  
  2464. function myWS() {
  2465. if (!localStorage.isxyzAllowed) return;
  2466. wss = new WebSocket(localStorage.wsEnv);
  2467. wss.binaryType = "arraybuffer";
  2468. wss.onopen = () => {
  2469. if (localStorage.haspassword) thisNetwork.sendMessage(localStorage.haspassword);
  2470. }
  2471. wss.onmessage = (e) => {
  2472. let data = codec.decode(e.data);
  2473. let response = data.response;
  2474. let parsedResponse;
  2475. if (response.data) {
  2476. parsedResponse = JSON.parse(response.data);
  2477. if (parsedResponse) {
  2478. if (parsedResponse.id) {
  2479. thisInfo.id = parsedResponse.id;
  2480. }
  2481. }
  2482. if (parsedResponse.m) {
  2483. serverObj = parsedResponse.m;
  2484. if (!leaderboardLoaded) {
  2485. leaderboardLoaded = true;
  2486. game.ui.components.Leaderboard.leaderboardData = serverObj[document.getElementsByClassName("hud-intro-server")[0].value].leaderboardDataObj;
  2487. game.ui.components.Leaderboard.update();
  2488. }
  2489. for (let i = 0; i < document.getElementsByClassName("hud-intro-server")[0].length; i++) {
  2490. let id = document.getElementsByClassName("hud-intro-server")[0][i].value;
  2491. let target = serverObj[id].leaderboardDataObj.sort((a, b) => b.wave - a.wave)[0];
  2492. document.getElementsByClassName("hud-intro-server")[0][i].innerText = `${game.options.servers[id].name}, ppl: ${serverObj[id].population}, ${target.wave} <= ${target.name}`
  2493. }
  2494. }
  2495. } else {
  2496. if (!response.msg.includes(`{"tk":"`) && !response.msg.includes(`, [`)) {
  2497. console.log(response);
  2498. }
  2499. }
  2500. }
  2501. }
  2502. thisNetwork = {
  2503. codec: codec,
  2504. sendMessage(message) {
  2505. wss.send(codec.encode(9, {name: "message", msg: message}));
  2506. },
  2507. getdisconnected() {
  2508. return wss.readyState == wss.CLOSED;
  2509. },
  2510. disconnect() {
  2511. wss.close();
  2512. },
  2513. reconnect() {
  2514. myWS();
  2515. }
  2516. }
  2517. thisInfo = {
  2518. id: null,
  2519. name: null,
  2520. uid: null,
  2521. host: null,
  2522. active: false
  2523. }
  2524. game.network.addEnterWorldHandler(e => {
  2525. thisInfo.uid = e.uid;
  2526. thisInfo.name = e.effectiveDisplayName;
  2527. thisInfo.host = game.network.socket.url;
  2528. thisInfo.active = true;
  2529. console.log("Selam");
  2530. })
  2531. myWS();
  2532. setInterval(() => {
  2533. if (localStorage.isxyzAllowed && thisNetwork.getdisconnected()) {
  2534. thisNetwork.reconnect();
  2535. }
  2536. }, 5000);
  2537.  
  2538. // great auto pet heal
  2539.  
  2540. let petTokens = {
  2541. 1: 100,
  2542. 2: 100,
  2543. 3: 100,
  2544. 4: 100,
  2545. 5: 200,
  2546. 6: 200,
  2547. 7: 300,
  2548. 8: Infinity
  2549. }
  2550. let myPet = {};
  2551. window.petheal = false;
  2552. window.autoRevivePets = false; // set this to true if u want Auto Revive pet.
  2553. let heallevel = 70;
  2554. game.network.addEntityUpdateHandler((data) => {
  2555. if (game.ui.playerTick.petUid) {
  2556. window.activated = true;
  2557. if (data.entities[game.ui.playerTick.petUid]) {
  2558. if (data.entities[game.ui.playerTick.petUid].uid) {
  2559. myPet = game.world.entities[game.ui.playerTick.petUid].fromTick;
  2560. if (game.world.entities[game.ui.playerTick.petUid]) {
  2561. let isTokenHealing = false;
  2562. if (myPet.model == window.model && myPet.tier == window.tier && (myPet.health/myPet.maxHealth)*100 <= 95 && (myPet.health/myPet.maxHealth)*100 > 0 && game.ui.playerTick.token >= petTokens[myPet.tier] && game.ui.playerTick.petUid) {
  2563. game.network.sendRpc({name: "BuyItem", itemName: myPet.model, tier: myPet.tier + 1});
  2564. isTokenHealing = true;
  2565. }
  2566. if (window.petheal && !isTokenHealing) {
  2567. if ((myPet.health/myPet.maxHealth) * 100 < heallevel && (myPet.health/myPet.maxHealth) * 100 > 0) {
  2568. if (!window.healPet) {
  2569. game.network.sendRpc({name: "BuyItem", itemName: "PetHealthPotion", tier: 1})
  2570. game.network.sendRpc({name: "EquipItem", itemName: "PetHealthPotion", tier: 1})
  2571. window.healPet = true;
  2572. setTimeout(() => {
  2573. window.healPet = false;
  2574. }, 300);
  2575. }
  2576. }
  2577.  
  2578. let playerHealth = (myPlayer.health/myPlayer.maxHealth) * 100;
  2579. if (playerHealth <= 10) {
  2580. if (!window.playerTimeout_1) {
  2581. window.playerTimeout_1 = true;
  2582. setTimeout(() => {
  2583. window.playerTimeout_1 = false;
  2584. }, 300)
  2585. healPlayer();
  2586. }
  2587. }
  2588. }
  2589. if (window.model !== myPet.model) window.model = myPet.model;
  2590. if (window.tier !== myPet.tier) window.tier = myPet.tier;
  2591. }
  2592. }
  2593. }
  2594. }
  2595. if (window.autoRevivePets && window.activated) {
  2596. game.network.sendRpc({name: "BuyItem", itemName: "PetRevive", tier: 1});
  2597. game.network.sendRpc({name: "EquipItem", itemName: "PetRevive", tier: 1});
  2598. }
  2599. })
  2600.  
  2601. // player info + attempt to make it possible not laggy like before's
  2602.  
  2603. let getRss = false;
  2604. let allowed1 = true;
  2605.  
  2606. function msToTime(s) {
  2607.  
  2608. // Pad to 2 or 3 digits, default is 2
  2609. function pad(n, z) {
  2610. z = z || 2;
  2611. return ('00' + n).slice(-z);
  2612. }
  2613.  
  2614. var ms = s % 1000;
  2615. s = (s - ms) / 1000;
  2616. var secs = s % 60;
  2617. s = (s - secs) / 60;
  2618. var mins = s % 60;
  2619. var hrs = (s - mins) / 60;
  2620.  
  2621. return pad(hrs) + ':' + pad(mins) + ':' + pad(secs) + '.' + pad(ms, 3);
  2622. }
  2623.  
  2624. game.network.addEntityUpdateHandler(() => {
  2625. if (getRss) {
  2626. !allowed1 && (allowed1 = true);
  2627. }
  2628. if (getRss || allowed1) {
  2629. for (let i in game.world.entities) {
  2630. if (game.world.entities[i].fromTick.name) {
  2631. let player = game.world.entities[i];
  2632. let wood_1 = counter(player.targetTick.wood);
  2633. let stone_1 = counter(player.targetTick.stone);
  2634. let gold_1 = counter(player.targetTick.gold);
  2635. let token_1 = counter(player.targetTick.token);
  2636. let px_1 = counter(player.targetTick.position.x);
  2637. let py_1 = counter(player.targetTick.position.y);
  2638. if (getRss && !player.targetTick.oldName) {
  2639. player.targetTick.oldName = player.targetTick.name;
  2640. player.targetTick.oldWood = wood_1;
  2641. player.targetTick.oldStone = stone_1;
  2642. player.targetTick.oldGold = gold_1;
  2643. player.targetTick.oldToken = token_1;
  2644. player.targetTick.oldPX = px_1;
  2645. player.targetTick.oldPY = py_1;
  2646. player.targetTick.info = `${player.targetTick.oldName}, UID: ${player.targetTick.uid}, W: ${wood_1}, S: ${stone_1}, G: ${gold_1}, T: ${token_1};\nx: ${Math.round(player.targetTick.position.x)}, y: ${Math.round(player.targetTick.position.y)}, partyId: ${Math.round(player.targetTick.partyId)};
  2647. score: ${player.targetTick.score}, timeDead: ${msToTime(player.targetTick.timeDead)};
  2648.  
  2649. `;
  2650. player.targetTick.name = game.world.entities[i].targetTick.info;
  2651. }
  2652. if (!getRss && player.targetTick.oldName) {
  2653. player.targetTick.info = player.targetTick.oldName;
  2654. player.targetTick.name = game.world.entities[i].targetTick.info;
  2655. player.targetTick.oldName = null;
  2656. }
  2657. if (getRss) {
  2658. if (player.targetTick.oldGold !== gold_1 || player.targetTick.oldWood !== wood_1 || player.targetTick.oldStone !== stone_1 || player.targetTick.oldToken !== token_1 || player.targetTick.oldPX !== px_1 || player.targetTick.oldPY !== py_1) {
  2659. player.targetTick.oldWood = wood_1;
  2660. player.targetTick.oldStone = stone_1;
  2661. player.targetTick.oldGold = gold_1;
  2662. player.targetTick.oldToken = token_1;
  2663. player.targetTick.oldPX = px_1;
  2664. player.targetTick.oldPY = py_1;
  2665. player.targetTick.info = `${player.targetTick.oldName}, UID: ${player.targetTick.uid}, W: ${wood_1}, S: ${stone_1}, G: ${gold_1}, T: ${token_1};\nx: ${Math.round(player.targetTick.position.x)}, y: ${Math.round(player.targetTick.position.y)}, partyId: ${Math.round(player.targetTick.partyId)};
  2666. score: ${player.targetTick.score}, timeDead: ${msToTime(player.targetTick.timeDead)};
  2667.  
  2668. `;
  2669. player.targetTick.name = game.world.entities[i].targetTick.info;
  2670. }
  2671. }
  2672. }
  2673. }
  2674. }
  2675. if (!getRss) {
  2676. allowed1 = false;
  2677. }
  2678. })
  2679.  
  2680. function counter(e = 0) {
  2681. if (e <= -0.99949999999999999e12) {
  2682. return Math.round(e/-1e11)/-10 + "T";
  2683. }
  2684. if (e <= -0.99949999999999999e9) {
  2685. return Math.round(e/-1e8)/-10 + "B";
  2686. }
  2687. if (e <= -0.99949999999999999e6) {
  2688. return Math.round(e/-1e5)/-10 + "M";
  2689. }
  2690. if (e <= -0.99949999999999999e3) {
  2691. return Math.round(e/-1e2)/-10 + "K";
  2692. }
  2693. if (e <= 0.99949999999999999e3) {
  2694. return Math.round(e) + "";
  2695. }
  2696. if (e <= 0.99949999999999999e6) {
  2697. return Math.round(e/1e2)/10 + "K";
  2698. }
  2699. if (e <= 0.99949999999999999e9) {
  2700. return Math.round(e/1e5)/10 + "M";
  2701. }
  2702. if (e <= 0.99949999999999999e12) {
  2703. return Math.round(e/1e8)/10 + "B";
  2704. }
  2705. if (e <= 0.99949999999999999e15) {
  2706. return Math.round(e/1e11)/10 + "T";
  2707. }
  2708. }
  2709.  
  2710. /*** EH ***/
  2711. document.addEventListener("keydown", e => {
  2712. if(document.activeElement.tagName.toLowerCase() !== "input" && document.activeElement.tagName.toLowerCase() !== "textarea") {
  2713. if (e.keyCode == 189) { // key -
  2714. getRss = !getRss;
  2715. new Noty({
  2716. type: 'success',
  2717. text: `RSS Above Head toggle is now ${getRss}`,
  2718. timeout: 2000
  2719. }).show();
  2720. }
  2721. if (e.key.toLowerCase() == "f" && e.shiftKey) {
  2722. window.petheal = !window.petheal;
  2723. new Noty({
  2724. type: 'success',
  2725. text: `Pet Heal toggle is now ${window.petheal}`,
  2726. timeout: 2000
  2727. }).show();
  2728. };
  2729. if (e.key.toLowerCase() == "p" && e.shiftKey) {
  2730. if(window.follow.toggle) {
  2731. window.follow = { toggle: false };
  2732. } else {
  2733. window.follow = { toggle: true, np: true };
  2734. };
  2735. window.lm = window.follow ? "Nearest Player" : "Off";
  2736. dispatchEvent(new CustomEvent("efToggleByKeybind"));
  2737. new Noty({
  2738. type: 'success',
  2739. text: `Nearest Player Follower toggle is now ${window.follow.toggle}`,
  2740. timeout: 2000
  2741. }).show();
  2742. };
  2743. if(e.key === "#") {
  2744. window.x3builds = !window.x3builds;
  2745. new Noty({
  2746. type: 'success',
  2747. text: `3x3 Walls toggle is now ${window.x3builds}`,
  2748. timeout: 2000
  2749. }).show();
  2750. };
  2751. };
  2752. })
  2753.  
  2754. window.stashspawn = psk => {
  2755. for(let sck of sockets) {
  2756. if(sck.readyState === 1) { sck.network.sendRpc({ name: "JoinPartyByShareKey", partyShareKey: psk }); sck.network.sendInput({ respawn: 1 }); };
  2757. };
  2758. };
  2759.  
  2760. (function() { // modified private parties tab code, except the new tab in the party menu is used differently (not private parties)
  2761. let getElement = (Element) => {
  2762. return document.getElementsByClassName(Element);
  2763. }
  2764. let getId = (Element) => {
  2765. return document.getElementById(Element);
  2766. }
  2767.  
  2768. game.ui.components.PlacementOverlay.oldStartPlacing = game.ui.components.PlacementOverlay.startPlacing;
  2769. game.ui.components.PlacementOverlay.startPlacing = function(e) {
  2770. game.ui.components.PlacementOverlay.oldStartPlacing(e);
  2771. if (game.ui.components.PlacementOverlay.placeholderEntity) {
  2772. game.ui.components.PlacementOverlay.direction = 2;
  2773. game.ui.components.PlacementOverlay.placeholderEntity.setRotation(180);
  2774. }
  2775. }
  2776.  
  2777. game.ui.components.PlacementOverlay.cycleDirection = function() {
  2778. if (game.ui.components.PlacementOverlay.placeholderEntity) {
  2779. game.ui.components.PlacementOverlay.direction = (game.ui.components.PlacementOverlay.direction + 1) % 4;
  2780. game.ui.components.PlacementOverlay.placeholderEntity.setRotation(game.ui.components.PlacementOverlay.direction * 90);
  2781. }
  2782. };
  2783.  
  2784. getElement("hud-party-members")[0].style.display = "block";
  2785. getElement("hud-party-grid")[0].style.display = "none";
  2786.  
  2787. let privateTab = document.createElement("a");
  2788. privateTab.className = "hud-party-tabs-link";
  2789. privateTab.id = "privateTab";
  2790. privateTab.innerHTML = "Party Tools";
  2791.  
  2792. let privateHud = document.createElement("div");
  2793. privateHud.className = "hud-private hud-party-grid";
  2794. privateHud.id = "privateHud";
  2795. privateHud.style = "display: none;";
  2796. getElement("hud-party-tabs")[0].appendChild(privateTab);
  2797. getElement("hud-menu hud-menu-party")[0].insertBefore(privateHud, getElement("hud-party-actions")[0]);
  2798.  
  2799. getId("privateTab").onclick = e => {
  2800. getId("privateHud2").style.display = "none";
  2801. for (let i = 0; i < getElement("hud-party-tabs-link").length; i++) {
  2802. getElement("hud-party-tabs-link")[i].className = "hud-party-tabs-link";
  2803. }
  2804. getId("privateTab").className = "hud-party-tabs-link is-active";
  2805. getId("privateHud").setAttribute("style", "display: block;");
  2806. if (getElement("hud-party-members")[0].getAttribute("style") == "display: block;") {
  2807. getElement("hud-party-members")[0].setAttribute("style", "display: none;");
  2808. }
  2809. if (getElement("hud-party-grid")[0].getAttribute("style") == "display: block;") {
  2810. getElement("hud-party-grid")[0].setAttribute("style", "display: none;");
  2811. }
  2812. if (getId("privateHud").getAttribute("style") == "display: none;") {
  2813. getId("privateHud").setAttribute("style", "display: block;");
  2814. }
  2815. }
  2816.  
  2817. getElement("hud-party-tabs-link")[0].onmouseup = e => {
  2818. getId("privateHud").setAttribute("style", "display: none;");
  2819. if (getId("privateTab").className == "hud-party-tabs-link is-active") {
  2820. getId("privateTab").className = "hud-party-tabs-link"
  2821. }
  2822. }
  2823.  
  2824. getElement("hud-party-tabs-link")[1].onmouseup = e => {
  2825. getId("privateHud").setAttribute("style", "display: none;");
  2826. if (getId("privateTab").className == "hud-party-tabs-link is-active") {
  2827. getId("privateTab").className = "hud-party-tabs-link"
  2828. }
  2829. }
  2830. getId("privateHud").innerHTML = `
  2831. <h1>Party Tools</h1>
  2832. <input id="psk" placeholder="Party share key..." value="abcdefghijklmnopqr" class="btn" /><button class="btn btn-green" onclick="game.network.sendRpc({ name: 'JoinPartyByShareKey', partyShareKey: document.getElementById('psk').value })">Join Party by Share Key (1)</button>
  2833. <input id="psk2" placeholder="Party share key (2)..." value="qwertyuiopasdfghjk" class="btn" /><button class="btn btn-green" onclick="game.network.sendRpc({ name: 'JoinPartyByShareKey', partyShareKey: document.getElementById('psk2').value })">Join Party by Share Key (2)</button>
  2834. <input id="psk3" placeholder="Party share key (3)..." value="klzxcvbnmlkjhgfdsa" class="btn" /><button class="btn btn-green" onclick="game.network.sendRpc({ name: 'JoinPartyByShareKey', partyShareKey: document.getElementById('psk3').value })">Join Party by Share Key (3)</button>
  2835. <br />
  2836. <button class="btn btn-red" onclick="game.network.sendRpc({ name: 'LeaveParty' })">Leave Current Party</button>
  2837. `;
  2838.  
  2839. let privateTab2 = document.createElement("a");
  2840. privateTab2.className = "hud-party-tabs-link";
  2841. privateTab2.id = "privateTab2";
  2842. privateTab2.innerHTML = "Share Keys";
  2843.  
  2844. let privateHud2 = document.createElement("div");
  2845. privateHud2.className = "hud-private hud-party-grid";
  2846. privateHud2.id = "privateHud2";
  2847. privateHud2.style = "display: none;";
  2848. getElement("hud-party-tabs")[0].appendChild(privateTab2);
  2849. getElement("hud-menu hud-menu-party")[0].insertBefore(privateHud2, getElement("hud-party-actions")[0]);
  2850.  
  2851. getId("privateTab2").onclick = e => {
  2852. getId("privateHud").style.display = "none";
  2853. for (let i = 0; i < getElement("hud-party-tabs-link").length; i++) {
  2854. getElement("hud-party-tabs-link")[i].className = "hud-party-tabs-link";
  2855. }
  2856. getId("privateTab2").className = "hud-party-tabs-link is-active";
  2857. getId("privateHud2").setAttribute("style", "display: block;");
  2858. if (getElement("hud-party-members")[0].getAttribute("style") == "display: block;") {
  2859. getElement("hud-party-members")[0].setAttribute("style", "display: none;");
  2860. }
  2861. if (getElement("hud-party-grid")[0].getAttribute("style") == "display: block;") {
  2862. getElement("hud-party-grid")[0].setAttribute("style", "display: none;");
  2863. }
  2864. if (getId("privateHud2").getAttribute("style") == "display: none;") {
  2865. getId("privateHud2").setAttribute("style", "display: block;");
  2866. }
  2867. }
  2868.  
  2869. getElement("hud-party-tabs-link")[0].onmouseup = e => {
  2870. getId("privateHud2").setAttribute("style", "display: none;");
  2871. if (getId("privateTab2").className == "hud-party-tabs-link is-active") {
  2872. getId("privateTab2").className = "hud-party-tabs-link"
  2873. }
  2874. }
  2875.  
  2876. getElement("hud-party-tabs-link")[1].onmouseup = e => {
  2877. getId("privateHud2").setAttribute("style", "display: none;");
  2878. if (getId("privateTab2").className == "hud-party-tabs-link is-active") {
  2879. getId("privateTab2").className = "hud-party-tabs-link"
  2880. }
  2881. }
  2882. getId("privateHud2").innerHTML = `
  2883. <h1>Share Keys</h1>
  2884. `;
  2885. game.network.addRpcHandler("PartyShareKey", function(e) {
  2886. let cpKeyId = `skl${Math.floor(Math.random() * 999999)}`;
  2887. let cpLnkId = `skl${Math.floor(Math.random() * 999999)}`;
  2888. let psk = e.partyShareKey;
  2889. let lnk = `http://zombs.io/#/${game.options.serverId}/${psk}/`;
  2890. getId("privateHud2").innerHTML += `<div style="display:inline-block;margin-right:10px;"><p>${psk} <a href="${lnk}" target="_blank" color="blue">[Link]</a></p></div><button class="btn btn-blue" id="${cpKeyId}" style="display:inline-block;">Copy Key</button><button class="btn btn-blue" id="${cpLnkId}" style="display:inline-block;">Copy Link</button><br />`
  2891. document.getElementById(cpKeyId).addEventListener('click', function(e) {
  2892. const elem = document.createElement('textarea');
  2893. elem.value = psk;
  2894. document.body.appendChild(elem);
  2895. elem.select();
  2896. document.execCommand('copy');
  2897. document.body.removeChild(elem);
  2898. new Noty({
  2899. type: 'success',
  2900. text: `Copied to clipboard`,
  2901. timeout: 2000
  2902. }).show();
  2903. });
  2904. document.getElementById(cpLnkId).addEventListener('click', function(e) {
  2905. const elem = document.createElement('textarea');
  2906. elem.value = lnk;
  2907. document.body.appendChild(elem);
  2908. elem.select();
  2909. document.execCommand('copy');
  2910. document.body.removeChild(elem);
  2911. new Noty({
  2912. type: 'success',
  2913. text: `Copied to clipboard`,
  2914. timeout: 2000
  2915. }).show();
  2916. });
  2917. });
  2918.  
  2919. // ^ share keys feature originally from 444x3
  2920.  
  2921. document.getElementsByClassName('hud-party-tabs-link')[0].onclick = () => { getId("privateHud").style.display = "none"; getId("privateTab").classList.remove("is-active"); };
  2922. document.getElementsByClassName('hud-party-tabs-link')[1].onclick = () => { getId("privateHud").style.display = "none"; getId("privateTab").classList.remove("is-active"); };
  2923. })();
  2924.  
  2925. // Button selector UI with curves, by ehScripts
  2926.  
  2927. window.BS = class BS {
  2928. constructor(options) {
  2929. let _this = this;
  2930. this.elem = document.createElement("div");
  2931. this.buttons = [];
  2932. this.getButtonByName = name => _this.buttons.find(btn => btn.data.name === name);
  2933. this.select = name => {
  2934. let btn = _this.getButtonByName(name);
  2935. _this.selected = name;
  2936. btn.elem.innerText = `> ${btn.data.name}`;
  2937. for(let b of _this.buttons) {
  2938. if(b.data.name !== btn.data.name) {
  2939. b.elem.innerText = b.data.name;
  2940. };
  2941. };
  2942. };
  2943. let PRIVATE = {
  2944. addSelectorFunctionality: (elem, data) => {
  2945. elem.addEventListener("click", function() {
  2946. _this.select(data.name);
  2947. if(data.onselect) { data.onselect(); };
  2948. });
  2949. _this.buttons.push({
  2950. elem: elem,
  2951. data: data
  2952. });
  2953. },
  2954. addLeftButton: data => {
  2955. let btn = document.createElement("button");
  2956. btn.classList.add("btn");
  2957. btn.classList.add(`btn-${data.color}`);
  2958. btn.classList.add("btn-curve-left");
  2959. btn.innerText = data.name;
  2960. PRIVATE.addSelectorFunctionality(btn, data);
  2961. _this.elem.append(btn);
  2962. },
  2963. addRightButton: data => {
  2964. let btn = document.createElement("button");
  2965. btn.classList.add("btn");
  2966. btn.classList.add(`btn-${data.color}`);
  2967. btn.classList.add("btn-curve-right");
  2968. btn.style.marginTop = "3px";
  2969. btn.style.marginLeft = "3px";
  2970. btn.innerText = data.name;
  2971. PRIVATE.addSelectorFunctionality(btn, data);
  2972. _this.elem.append(btn);
  2973. },
  2974. addButton: data => {
  2975. let btn = document.createElement("button");
  2976. btn.classList.add("btn");
  2977. btn.classList.add(`btn-${data.color}`);
  2978. btn.innerText = data.name;
  2979. PRIVATE.addSelectorFunctionality(btn, data);
  2980. _this.elem.append(btn);
  2981. },
  2982. addDoubleSidedButton: data => {
  2983. let btn = document.createElement("button");
  2984. btn.classList.add("btn");
  2985. btn.classList.add(`btn-${data.color}`);
  2986. btn.classList.add("btn-curve-right");
  2987. btn.classList.add("btn-curve-left");
  2988. btn.innerText = data.name;
  2989. PRIVATE.addSelectorFunctionality(btn, data);
  2990. _this.elem.append(btn);
  2991. }
  2992. };
  2993. if(options.length === 1) { PRIVATE.addDoubleSidedButton(options[0]); } else {
  2994. for(let o in options) {
  2995. let opt = options[o];
  2996. console.log(opt);
  2997. if(o == 0) { PRIVATE.addLeftButton(opt); }
  2998. else if(o == (options.length - 1)) { PRIVATE.addRightButton(opt); }
  2999. else { PRIVATE.addButton(opt); };
  3000. };
  3001. };
  3002. };
  3003. };
  3004.  
  3005. const fullRSS = () => {
  3006. if(!window.frss) { return; };
  3007. let resources = ["wood", "stone", "gold"];
  3008. let pt = game.ui.playerTick;
  3009. let rc = game.ui.components.Resources;
  3010. for(let i = 0; i < resources.length; i++) {
  3011. let rs = resources[i];
  3012. rc[`${rs}Elem`].innerHTML = Math.round(pt[rs]).toLocaleString("en");
  3013. };
  3014. rc.tokensElem.innerHTML = Math.round(pt.token).toLocaleString("en");
  3015. };
  3016.  
  3017. let sipt = setInterval(() => {
  3018. game.ui.addListener('playerTickUpdate', fullRSS);
  3019. }, 10);
  3020.  
  3021. setTimeout(() => { clearInterval(sipt); }, 90);
  3022.  
  3023. /*** TROLLERS ***/
  3024.  
  3025. isOnOrNot = false;
  3026. stashhitalarm = false;
  3027. deadalarm = false;
  3028. disconnectalarm = false;
  3029. health65palarm = false;
  3030. onlyOpenOnceOnTimeout = false;
  3031. pingalarm = false;
  3032. tower65palarm = false;
  3033.  
  3034. game.network.addRpcHandler("LocalBuilding", e => {
  3035. for (let i in e) {
  3036. if (e[i].dead) {
  3037. if (e[i].type !== "Wall" && e[i].type !== "Door") {
  3038. if (isOnOrNot) {
  3039. !onlyOpenOnceOnTimeout && (onlyOpenOnceOnTimeout = true, videoalert(), setTimeout(() => {onlyOpenOnceOnTimeout = false}, 14000))
  3040. }
  3041. }
  3042. }
  3043. }
  3044. })
  3045.  
  3046. game.network.addEntityUpdateHandler((e) => {
  3047. let gl = GetGoldStash();
  3048. if (gl) {
  3049. if (e.entities[gl.uid]) {
  3050. if (e.entities[gl.uid].health !== e.entities[gl.uid].maxHealth) {
  3051. if (stashhitalarm) {
  3052. !onlyOpenOnceOnTimeout && (onlyOpenOnceOnTimeout = true, videoalert(), setTimeout(() => {onlyOpenOnceOnTimeout = false}, 24000))
  3053. }
  3054. }
  3055. }
  3056. }
  3057. if (e.entities[game.world.myUid]) {
  3058. if (e.entities[game.world.myUid].health) {
  3059. if ((e.entities[game.world.myUid].health / 500) * 100 < 65) {
  3060. if (health65palarm) {
  3061. !onlyOpenOnceOnTimeout && (onlyOpenOnceOnTimeout = true, videoalert(), setTimeout(() => {onlyOpenOnceOnTimeout = false}, 24000));
  3062. }
  3063. }
  3064. }
  3065. }
  3066. if((game.network.ping > 2000) && pingalarm) {
  3067. !onlyOpenOnceOnTimeout && (onlyOpenOnceOnTimeout = true, videoalert(), setTimeout(() => {onlyOpenOnceOnTimeout = false}, 14000))
  3068. };
  3069. for(let i of Object.values(e.entities)) {
  3070. if((i !== true) && ["CannonTower", "MeleeTower", "Harvester", "ArrowTower", "MagicTower", "GoldMine", "BombTower"].includes(i.model)) {
  3071. if((i.health < 65) && tower65palarm) {
  3072. !onlyOpenOnceOnTimeout && (onlyOpenOnceOnTimeout = true, videoalert(), setTimeout(() => {onlyOpenOnceOnTimeout = false}, 14000))
  3073. };
  3074. };
  3075. };
  3076. })
  3077.  
  3078. game.network.addRpcHandler("Dead", () => {
  3079. if (deadalarm) {
  3080. !onlyOpenOnceOnTimeout && (onlyOpenOnceOnTimeout = true, videoalert(), setTimeout(() => {onlyOpenOnceOnTimeout = false}, 14000))
  3081. }
  3082. })
  3083.  
  3084. game.network.addCloseHandler(() => {
  3085. if (disconnectalarm) {
  3086. !onlyOpenOnceOnTimeout && (onlyOpenOnceOnTimeout = true, videoalert(), setTimeout(() => {onlyOpenOnceOnTimeout = false}, 14000))
  3087. }
  3088. })
  3089.  
  3090. videoalert = () => {
  3091. let a = new Audio();
  3092. a.src = "https://cdn.discordapp.com/attachments/870020008128958525/871587235324117052/Canadian_EAS_Alarm_EXTREME_LOUD.mp3"
  3093. a.volume = 1;
  3094. a.play();
  3095. Game.currentGame.ui.getComponent("PopupOverlay").showConfirmation("Stop Alert?", 10000, function() {
  3096. a.pause();
  3097. })
  3098. setTimeout(() => {
  3099. a.pause();
  3100. }, 30000);
  3101. }
  3102.  
  3103. alarm = () => {
  3104. isOnOrNot = !isOnOrNot;
  3105.  
  3106. document.getElementsByClassName("alarm")[0].innerText = document.getElementsByClassName("alarm")[0].innerText.replace(isOnOrNot ? "Enable" : "Disable", isOnOrNot ? "Disable" : "Enable");
  3107.  
  3108. document.getElementsByClassName("alarm")[0].className = document.getElementsByClassName("alarm")[0].className.replace(isOnOrNot ? "green" : "red", isOnOrNot ? "red" : "green");
  3109.  
  3110. }
  3111.  
  3112. stashHitAlarm = () => {
  3113. stashhitalarm = !stashhitalarm;
  3114.  
  3115. document.getElementsByClassName("stashHitAlarm")[0].innerText = document.getElementsByClassName("stashHitAlarm")[0].innerText.replace(stashhitalarm ? "Enable" : "Disable", stashhitalarm ? "Disable" : "Enable");
  3116.  
  3117. document.getElementsByClassName("stashHitAlarm")[0].className = document.getElementsByClassName("stashHitAlarm")[0].className.replace(stashhitalarm ? "green" : "red", stashhitalarm ? "red" : "green");
  3118.  
  3119. }
  3120.  
  3121. deadAlarm = () => {
  3122. deadalarm = !deadalarm;
  3123.  
  3124. document.getElementsByClassName("deadAlarm")[0].innerText = document.getElementsByClassName("deadAlarm")[0].innerText.replace(deadalarm ? "Enable" : "Disable", deadalarm ? "Disable" : "Enable");
  3125.  
  3126. document.getElementsByClassName("deadAlarm")[0].className = document.getElementsByClassName("deadAlarm")[0].className.replace(deadalarm ? "green" : "red", deadalarm ? "red" : "green");
  3127.  
  3128. }
  3129.  
  3130. disconnectAlarm = () => {
  3131. disconnectalarm = !disconnectalarm;
  3132.  
  3133. document.getElementsByClassName("disconnectAlarm")[0].innerText = document.getElementsByClassName("disconnectAlarm")[0].innerText.replace(disconnectalarm ? "Enable" : "Disable", disconnectalarm ? "Disable" : "Enable");
  3134.  
  3135. document.getElementsByClassName("disconnectAlarm")[0].className = document.getElementsByClassName("disconnectAlarm")[0].className.replace(disconnectalarm ? "green" : "red", disconnectalarm ? "red" : "green");
  3136.  
  3137. }
  3138.  
  3139. health65pAlarm = () => {
  3140. health65palarm = !health65palarm;
  3141.  
  3142. document.getElementsByClassName("health65pAlarm")[0].innerText = document.getElementsByClassName("health65pAlarm")[0].innerText.replace(health65palarm ? "Enable" : "Disable", health65palarm ? "Disable" : "Enable");
  3143.  
  3144. document.getElementsByClassName("health65pAlarm")[0].className = document.getElementsByClassName("health65pAlarm")[0].className.replace(health65palarm ? "green" : "red", health65palarm ? "red" : "green");
  3145.  
  3146. }
  3147.  
  3148. pingAlarm = () => {
  3149. pingalarm = !pingalarm;
  3150.  
  3151. document.getElementsByClassName("pingAlarm")[0].innerText = document.getElementsByClassName("pingAlarm")[0].innerText.replace(pingalarm ? "Enable" : "Disable", pingalarm ? "Disable" : "Enable");
  3152.  
  3153. document.getElementsByClassName("pingAlarm")[0].className = document.getElementsByClassName("pingAlarm")[0].className.replace(pingalarm ? "green" : "red", pingalarm ? "red" : "green");
  3154.  
  3155. }
  3156.  
  3157. tower65pAlarm = () => {
  3158. tower65palarm = !tower65palarm;
  3159.  
  3160. document.getElementsByClassName("tower65pAlarm")[0].innerText = document.getElementsByClassName("tower65pAlarm")[0].innerText.replace(tower65palarm ? "Enable" : "Disable", tower65palarm ? "Disable" : "Enable");
  3161.  
  3162. document.getElementsByClassName("tower65pAlarm")[0].className = document.getElementsByClassName("tower65pAlarm")[0].className.replace(tower65palarm ? "green" : "red", tower65palarm ? "red" : "green");
  3163.  
  3164. }
  3165.  
  3166. GetGoldStash = () => {
  3167. for (let i in game.ui.buildings) {
  3168. if (game.ui.buildings[i].type == "GoldStash") {
  3169. return game.ui.buildings[i];
  3170. }
  3171. }
  3172. }
  3173.  
  3174. let blockedNames = [];
  3175.  
  3176. window.blockPlayer = name => {
  3177. game.ui.components.PopupOverlay.showConfirmation(`Are you sure you want to block ${name}?`, 3500, () => {
  3178. blockedNames.push(name);
  3179. for(let msg of Array.from(document.getElementsByClassName("hud-chat-message"))) {
  3180. if(msg.childNodes[2].innerText === name) {
  3181. let bl = msg.childNodes[0];
  3182. bl.innerHTML = "Unblock";
  3183. bl.style.color = "blue";
  3184. bl.onclick = () => {
  3185. window.unblockPlayer(name);
  3186. };
  3187. };
  3188. };
  3189. }, () => {});
  3190. };
  3191.  
  3192. window.unblockPlayer = name => {
  3193. blockedNames.splice(blockedNames.indexOf(name), 1);
  3194. for(let msg of Array.from(document.getElementsByClassName("hud-chat-message"))) {
  3195. if(msg.childNodes[2].innerText === name) {
  3196. let bl = msg.childNodes[0];
  3197. bl.innerHTML = "Block";
  3198. bl.style.color = "red";
  3199. bl.onclick = () => {
  3200. window.blockPlayer(name);
  3201. };
  3202. };
  3203. };
  3204. };
  3205.  
  3206. const getClock = () => {
  3207. var date = new Date();
  3208. var d = date.getDate();
  3209. var d1 = date.getDay();
  3210. var h = date.getHours();
  3211. var m = date.getMinutes(); // 3k lines!
  3212. var s = date.getSeconds()
  3213. var session = "PM";
  3214.  
  3215. if(h == 2){
  3216. h = 12;
  3217. };
  3218.  
  3219.  
  3220. if(h > 12){
  3221. session = "PM";
  3222. h -= 12;
  3223. };
  3224. if(h < 12) {
  3225. session = "AM"
  3226. };
  3227.  
  3228. h = (h < 10) ? "0" + h : h;
  3229. m = (m < 10) ? "0" + m : m;
  3230. s = (s < 10) ? "0" + s : s;
  3231. return `${h}:${m} ${session}`;
  3232. }
  3233.  
  3234. Game.currentGame.network.emitter.removeListener("PACKET_RPC", Game.currentGame.network.emitter._events.PACKET_RPC[1]);
  3235. let onMessageReceived = (msg => {
  3236. if(blockedNames.includes(msg.displayName) || window.chatDisabled) { return; };
  3237. let a = Game.currentGame.ui.getComponent("Chat"),
  3238. b = msg.displayName.replace(/<(?:.|\n)*?>/gm, ''),
  3239. c = msg.message.replace(/<(?:.|\n)*?>/gm, ''),
  3240. d = a.ui.createElement(`<div class="hud-chat-message"><a href="javascript:void(0);" onclick="window.blockPlayer(\`${msg.displayName}\`)" style="color: red;">Block</a> <strong>${b}</strong> <small> at ${getClock()}</small>: ${c}</div>`);
  3241. a.messagesElem.appendChild(d);
  3242. a.messagesElem.scrollTop = a.messagesElem.scrollHeight;
  3243. })
  3244. Game.currentGame.network.addRpcHandler("ReceiveChatMessage", onMessageReceived);
  3245.  
  3246. window.toggleChat = () => {
  3247. window.chatDisabled = !window.chatDisabled;
  3248. let hcm = document.getElementsByClassName("hud-chat-messages")[0];
  3249. if(window.chatDisabled) {
  3250. window.oldChatHTML = hcm.innerHTML;
  3251. hcm.innerHTML = "<h1>Disabled Chat</h1>";
  3252. } else {
  3253. hcm.innerHTML = window.oldChatHTML;
  3254. };
  3255. };
  3256.  
  3257. const shouldKeep = uid => {
  3258. // sjfksljdf
  3259. };
  3260.  
  3261. game.world.removeEntity2 = game.world.removeEntity;
  3262. game.world.removeEntity = (uid) => {
  3263. if (shouldKeep(uid)) return;
  3264. game.world.removeEntity2(uid);
  3265. };
  3266.  
  3267. window.httpGet = url => {
  3268. var xmlHttp = new XMLHttpRequest();
  3269. xmlHttp.open("GET", url, false); // false for synchronous request
  3270. xmlHttp.send();
  3271. return xmlHttp.responseText;
  3272. };
  3273.  
  3274. window.reGS = (username, password) => {
  3275. let k = window.httpGet(`https://readypoisedlegacy.nathaniel009.repl.co/register?username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}`);
  3276. if(k.startsWith("ERROR: ")) {
  3277. new Noty({
  3278. type: "error",
  3279. layout: "topRight",
  3280. text: k.replace("ERROR: ", ""),
  3281. timeout: 2000
  3282. }).show();
  3283. } else {
  3284. new Noty({
  3285. type: "success",
  3286. layout: "topRight",
  3287. text: k,
  3288. timeout: 2000
  3289. }).show();
  3290. document.getElementById("bfl").style.display = "none";
  3291. let act = document.getElementById("act");
  3292. act.style.display = "block";
  3293. document.getElementById("hiu").innerHTML = `Hello, ${username}!`;
  3294. window.username = username;
  3295. localStorage.ig_auth = JSON.stringify({ username: username, password: password });
  3296. };
  3297. };
  3298.  
  3299. window.siGN = (username, password) => {
  3300. let k = window.httpGet(`https://readypoisedlegacy.nathaniel009.repl.co/login?username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}`);
  3301. if(k.startsWith("ERROR: ")) {
  3302. new Noty({
  3303. type: "error",
  3304. layout: "topRight",
  3305. text: k.replace("ERROR: ", ""),
  3306. timeout: 2000
  3307. }).show();
  3308. } else {
  3309. new Noty({
  3310. type: "success",
  3311. layout: "topRight",
  3312. text: k,
  3313. timeout: 2000
  3314. }).show();
  3315. document.getElementById("bfl").style.display = "none";
  3316. let act = document.getElementById("act");
  3317. act.style.display = "block";
  3318. document.getElementById("hiu").innerHTML = `Hello, ${username}!`;
  3319. window.username = username;
  3320. localStorage.ig_auth = JSON.stringify({ username: username, password: password });
  3321. };
  3322. };
  3323.  
  3324. window.sgNO = () => {
  3325. document.getElementById("act").style.display = "none";
  3326. document.getElementById("bfl").style.display = "block";
  3327. localStorage.ig_auth = undefined;
  3328. };
  3329.  
  3330. document.getElementsByClassName('hud-center-left')[0].insertAdjacentHTML("beforebegin", `
  3331. <div id="zsd">
  3332. <button class="btn btn-blue" style="position: absolute; top: ${32}%; left: ${devicePixelRatio}%; position: absolute; z-index: 14;" onclick="window.zoomOut();">
  3333. <i class="fa fa-arrow-up fa-2x" style="margin-top: 5px;"></i>
  3334. </button>
  3335. <input type='range' style='-webkit-appearance: slider-vertical; position: absolute; top: ${39}%; left: ${devicePixelRatio}%; position: absolute; z-index: 14;' id="zoomSlider" min=0.2 max=24 value=1 step=0.02 />
  3336. <button class="btn btn-red" style="position: absolute; top: ${38}%; left: ${8}%; position: absolute; z-index: 14; height: ${25}%;" onclick="window.resetZoom();">
  3337. <i class="fa fa-undo fa-2x"></i>
  3338. </button>
  3339. <button class="btn btn-blue" style="position: absolute; z-index: 14; top: ${59}%; left: ${devicePixelRatio}%;" onclick="window.zoomIn();">
  3340. <i class="fa fa-arrow-down fa-2x" style="margin-top: 5px;"></i>
  3341. </button>
  3342. </div>`);
  3343.  
  3344. window.toggleZoS = () => {
  3345. window.zoomonscroll = !window.zoomonscroll;
  3346. let zs = document.getElementById("zsd");
  3347. zs.style.display = zs.style.display == "none" ? "block" : "none";
  3348. };
  3349.  
  3350. window.zoomOut = () => {
  3351. let zs = document.getElementById("zoomSlider");
  3352. zs.value = parseInt(zs.value) + 1;
  3353. };
  3354. window.zoomIn = () => {
  3355. let zs = document.getElementById("zoomSlider");
  3356. zs.value = parseInt(zs.value) - 1;
  3357. };
  3358. window.resetZoom = () => {
  3359. document.getElementById("zoomSlider").value = 1;
  3360. };
  3361.  
  3362. window.userPg = username => {
  3363. let ud = window.httpGet(`https://readypoisedlegacy.nathaniel009.repl.co/user?username=${encodeURIComponent(username)}`);
  3364. ud = JSON.parse(ud);
  3365. ud.username = username;
  3366. currentTabs[getTabById(window.focusedTab).ict].ud = ud;
  3367. window.redirectTab(`${qryify2(username)}`, "userpg");
  3368. };
  3369.  
  3370. window.loadGopt = json => {
  3371. json.dbg ? game.debug.show() : game.debug.hide();
  3372. if(json.ssm) {
  3373. if(!window.ssModeToggle) {
  3374. window.ssMode();
  3375. };
  3376. } else if(window.ssModeToggle) {
  3377. window.ssMode();
  3378. };
  3379. if(json.zos) {
  3380. if(!window.zoomonscroll) {
  3381. window.toggleZoS();
  3382. };
  3383. } else if(window.zoomonscroll) {
  3384. window.toggleZoS();
  3385. };
  3386. if(json.ync) {
  3387. let hr = hexToRgb(json.ync);
  3388. game.world.localPlayer.entity.currentModel.nameEntity.setColor(hr[0], hr[1], hr[2]);
  3389. window.yncv = json.ync;
  3390. };
  3391. let hno = document.getElementsByClassName("hud-day-night-overlay")[0];
  3392. if(json.tad) {
  3393. if(hno.style.display !== "none") {
  3394. hno.style.display = "none";
  3395. };
  3396. } else if(hno.style.display === "none") {
  3397. hno.style.display = "block";
  3398. };
  3399. window.frss = !!json.frss;
  3400. if(json.cdt) {
  3401. if(!window.chatDisabled) {
  3402. window.toggleChat();
  3403. };
  3404. } else if(window.chatDisabled) {
  3405. window.toggleChat();
  3406. };
  3407. };
  3408.  
  3409. window.saveGopt = username => {
  3410. let k = window.httpGet(`https://readypoisedlegacy.nathaniel009.repl.co/gopt/save?username=${encodeURIComponent(username)}&gopt=${encodeURIComponent(JSON.stringify(window.gopt))}`);
  3411. if(k.startsWith("ERROR: ")) {
  3412. new Noty({
  3413. type: "error",
  3414. layout: "topRight",
  3415. text: k.replace("ERROR: ", ""),
  3416. timeout: 2000
  3417. }).show();
  3418. } else {
  3419. new Noty({
  3420. type: "success",
  3421. layout: "topRight",
  3422. text: k,
  3423. timeout: 2000
  3424. }).show();
  3425. };
  3426. };
  3427. window.loadGoptReq = username => {
  3428. let k = window.httpGet(`https://readypoisedlegacy.nathaniel009.repl.co/gopt/load?username=${encodeURIComponent(username)}`);
  3429. if(k.startsWith("ERROR: ")) {
  3430. new Noty({
  3431. type: "error",
  3432. layout: "topRight",
  3433. text: k.replace("ERROR: ", ""),
  3434. timeout: 2000
  3435. }).show();
  3436. } else {
  3437. new Noty({
  3438. type: "success",
  3439. layout: "topRight",
  3440. text: "Successfully loaded Game Options from your account.",
  3441. timeout: 2000
  3442. }).show();
  3443. window.loadGopt(JSON.parse(k));
  3444. };
  3445. };
  3446.  
  3447. window.rmw = () => {
  3448. for(let sck of sockets) {
  3449. if(!sck.iframe && !sck.closed) {
  3450. sck.close();
  3451. sck.closed = true;
  3452. window.nlt--;
  3453. };
  3454. };
  3455. window.focusTab(window.focusedTab, { pche: window.getTabDataByType("alts").cache, nlt: window.nlt, si: window.si });
  3456. new Noty({
  3457. type: "success",
  3458. layout: "topRight",
  3459. text: "Successfully removed all WebSockets",
  3460. timeout: 2000
  3461. }).show();
  3462. };
  3463. window.rmi = () => {
  3464. for(let sck of sockets) {
  3465. if(sck.iframe && !sck.closed) {
  3466. sck.close();
  3467. sck.closed = true;
  3468. window.nlt--;
  3469. };
  3470. };
  3471. window.focusTab(window.focusedTab, { pche: window.getTabDataByType("alts").cache, nlt: window.nlt, si: window.si });
  3472. new Noty({
  3473. type: "success",
  3474. layout: "topRight",
  3475. text: "Successfully removed all iFrames",
  3476. timeout: 2000
  3477. }).show();
  3478. };
  3479. window.rma = () => {
  3480. for(let sck of sockets) {
  3481. if(sck.closed) { continue; };
  3482. sck.close();
  3483. sck.closed = true;
  3484. window.nlt--;
  3485. };
  3486. window.focusTab(window.focusedTab, { pche: window.getTabDataByType("alts").cache, nlt: window.nlt, si: window.si });
  3487. new Noty({
  3488. type: "success",
  3489. layout: "topRight",
  3490. text: "Successfully removed all WebSockets",
  3491. timeout: 2000
  3492. }).show();
  3493. };// ==UserScript==
  3494. // @name New Userscript
  3495. // @namespace http://tampermonkey.net/
  3496. // @version 0.1
  3497. // @description try to take over the world!
  3498. // @author You
  3499. // @match http://*/*
  3500. // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
  3501. // @grant none
  3502. // ==/UserScript==
  3503.  
  3504. (function() {
  3505. 'use strict';
  3506.  
  3507. // Your code here...
  3508. })();