iGniTioN

sıkıldım artık

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