Advertisement
iwhdiw

Untitled

Dec 13th, 2022
2,780
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 64.59 KB | None | 1 0
  1. // ==UserScript==
  2. // @name New script - kirka.io
  3. // @namespace Violentmonkey Scripts
  4. // @match https://kirka.io/
  5. // @grant none
  6. // @version 1.0
  7. // @author -
  8. // @description 12/13/2022, 4:20:38 PM
  9. // ==/UserScript==
  10. class Store {
  11. constructor(config) {
  12. this.config = JSON.parse(config);
  13. }
  14.  
  15. get = (key) => this.config[key];
  16. set = (key, value) => {
  17. this.config[key] = value;
  18. localStorage.saveSettings = JSON.stringify(this.config);
  19. }
  20. }
  21.  
  22. if (!localStorage.saveSettings) localStorage.saveSettings = JSON.stringify({
  23. permCrosshair: true,
  24. customCss: false,
  25. hideWeaponsAds: false,
  26. hideArms: false,
  27. leftHanded: false,
  28. hideFlagAds: false,
  29. playerHighLight: false,
  30. weaponHighlighter: false,
  31. rgbHighlight: false,
  32. wireframeWeapons: false,
  33. wireframeArms: false,
  34. rainbow: false,
  35. adspower: false,
  36. autoJoin: false,
  37. inspectKey: "j",
  38. menuKey: "click to bind",
  39. euLobbies: true,
  40. naLobbies: false,
  41. asiaLobbies: false,
  42. ffaLobbies: true,
  43. tdmLobbies: true,
  44. parkourLobbies: false,
  45. preferredFilter: 'Players',
  46. minPlayers: 4,
  47. maxPlayers: 8,
  48. minTimeLeft: 3,
  49. filterMaps: false,
  50. maps: '',
  51. customGames: false,
  52. cssLink: '',
  53. menuOpen: true,
  54. volume: 1,
  55. noKillSound: false,
  56. marketNames: false,
  57. customHitmarker: false,
  58. customHitmarkerSrc: ''
  59. });
  60.  
  61. const settings = new Store(localStorage.saveSettings);
  62.  
  63. let permCrosshair = !!settings.get('permCrosshair');
  64. let noLoadingTimes = true;
  65. let customCss = !!settings.get('customCss');
  66. //let hpNumber = true;
  67. let hideWeaponsAds = !!settings.get('hideWeaponsAds');
  68. let hideArms = !!settings.get('hideArms');
  69. let leftHanded = !!settings.get('leftHanded');
  70. let hideFlagAds = !!settings.get('hideFlagAds');
  71. let playerHighLight = !!settings.get('playerHighLight');
  72. let weaponHighlighter = !!settings.get('weaponHighlighter');
  73. let rgbHighlight = !!settings.get('rgbHighlight');
  74. let wireframeWeapons = !!settings.get('wireframeWeapons');
  75. let wireframeArms = !!settings.get('wireframeArms');
  76. let rainbow = !!settings.get('rainbow');
  77. let adspower = !!settings.get('adspower');
  78. let autoJoin = !!settings.get('autoJoin');
  79. let volume = typeof settings.get('volume') == 'undefined' ? 1 : settings.get('volume');
  80. let noKillSound = !!settings.get('noKillSound');
  81.  
  82. let volumeSlider;
  83. let volumeLab;
  84.  
  85. let marketNames = !!settings.get('marketNames');
  86.  
  87. let inspecting = false;
  88. let prevInsp = false;
  89. let prevInspectPos;
  90. let prevInspectRot;
  91. let prevWireframeWeapons = false;
  92. let prevWireframeArms = false;
  93.  
  94. let gui = document.createElement("div");
  95. let menuVisible = false;
  96.  
  97. let inspectListening = false;
  98. if (!settings.get('inspectKey')) settings.set('inspectKey', "j");
  99.  
  100. let menuListening = false;
  101.  
  102. let euLobbies = !!settings.get('euLobbies');
  103. let naLobbies = !!settings.get('naLobbies');
  104. let asiaLobbies = !!settings.get('asiaLobbies');
  105. let ffaLobbies = !!settings.get('ffaLobbies');
  106. let tdmLobbies = !!settings.get('tdmLobbies');
  107. let parkourLobbies = !!settings.get('parkourLobbies');
  108. let preferredFilter = typeof settings.get('preferredFilter') == 'undefined' ? 'Players' : settings.get('preferredFilter');
  109. let minPlayers = typeof settings.get('minPlayers') == 'undefined' ? 4 : settings.get('minPlayers');
  110. let maxPlayers = typeof settings.get('maxPlayers') == 'undefined' ? 8 : settings.get('maxPlayers');
  111. let minTimeLeft = typeof settings.get('minTimeLeft') == 'undefined' ? 3 : settings.get('minTimeLeft');
  112. let filterMaps = !!settings.get('filterMaps');
  113. let avoidSameLobby = true;
  114. let currentURL = window.location.href;
  115. let gameModes = [];
  116. let bestLobby = '';
  117. let allLobbyData = [];
  118. let maps = settings.get('maps') ? settings.get('maps') : [];
  119. let customGames = !!settings.get('customGames');
  120. let responseCount = 0;
  121. let minPlayerSlider;
  122. let maxPlayerSlider;
  123. let minPlayersLab;
  124. let maxPlayersLab;
  125. let minTimeLeftSlider;
  126. let minTimeLeftLab;
  127. let settingsButtonsAdded = false;
  128. let customHitmarker = !!settings.get('customHitmarker');
  129. let customHitmarkerSrc = !!settings.get('customHitmarkerSrc');
  130. let importBtn;
  131. let exportBtn;
  132.  
  133. let scene;
  134. let flagMaterial;
  135. let players;
  136. let gains = [];
  137. let overlayModel;
  138.  
  139. WeakMap.prototype.set = new Proxy(WeakMap.prototype.set, {
  140. apply(target, thisArg, argArray) {
  141.  
  142. if (argArray[0] && argArray[0].type === 'Scene') {
  143. if (argArray[0].children[0].type === 'AmbientLight') {
  144. scene = argArray[0];
  145.  
  146. setTimeout(() => {
  147. scene.children.forEach((e) => {
  148. if (e.type === "Sprite" && !e.material.depthTest && e.material.map?.image?.width === 149) {
  149. flagMaterial = e.material;
  150. }
  151. })
  152. }, 1000);
  153.  
  154. } else if (argArray[0]?.children[0]?.children[0]?.type === "PerspectiveCamera") {
  155. overlayModel = argArray[0].children[0].children[0].children[0];
  156. }
  157. }
  158.  
  159. return Reflect.apply(...arguments);
  160. }
  161. });
  162.  
  163. let crosshair;
  164.  
  165. new MutationObserver(mutationRecords => {
  166. try {
  167. mutationRecords.forEach(record => {
  168. record.addedNodes.forEach(el => {
  169. if (el.classList?.contains("loading-scene") && noLoadingTimes) el.parentNode.removeChild(el);
  170. if (el.id === "qc-cmp2-container") el.parentNode.removeChild(el);
  171. if (el.id === "cmpPersistentLink" || el.classList?.contains("home") || el.classList?.contains("moneys") || el.classList?.contains("auth-form")) {
  172.  
  173. let btn = document.createElement("button");
  174.  
  175. btn.id = "clientJoinButton";
  176.  
  177. btn.style = "background-color: var(--primary-1);\n" +
  178. " --hover-color: var(--primary-2);\n" +
  179. " --top: var(--primary-2);\n" +
  180. " --bottom: var(--primary-3);" +
  181. " display: flex ;\n" +
  182. " justify-content: center;\n" +
  183. " align-items: center;\n" +
  184. " border: none;\n" +
  185. " position: absolute;\n" +
  186. " color: var(--white);\n" +
  187. " font-size: 1rem;\n" +
  188. " transition: all .3s ease;\n" +
  189. " font-family: Rowdies;\n" +
  190. " padding: .9em 1.4em;\n" +
  191. " transform: skew(-10deg);\n" +
  192. " font-weight: 900;\n" +
  193. " overflow: hidden;\n" +
  194. " text-transform: uppercase;\n" +
  195. " border-radius: .2em;\n" +
  196. " outline: none;\n" +
  197. " text-shadow: 0 0.1em 0 #000;\n" +
  198. " -webkit-text-stroke: 1px var(--black);\n" +
  199. " box-shadow: 0 0.15rem 0 rgba(0,0,0,.315);\n" +
  200. " cursor: pointer;" +
  201. " box-shadow: 0 5.47651px 0 rgba(0,0,0,.5)!important;\n" +
  202. " text-shadow: -1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000,0 1px 1px rgba(0,0,0,.486)!important;" +
  203. " width: 150px;" +
  204. " height: 50px;" +
  205. " bottom: 20px;" +
  206. " right: 100%;" +
  207. " margin-right: 10px;" +
  208. " font-size: 20px;";
  209.  
  210.  
  211. btn.innerText = "Join Link";
  212.  
  213. btn.onclick = async () => {
  214. window.location.href = await navigator.clipboard.readText();
  215. }
  216.  
  217. if (document.getElementsByClassName("nickname")[0]) {
  218. const i = setInterval(() => {
  219. let id = document.getElementsByClassName('username')[0]?.innerText;
  220. if (id && !document.getElementById("menuBadge") && badgeLinks[id]) {
  221. const badgeElement = document.createElement("div");
  222. badgeElement.innerHTML = `<img data-v-c5d917c8="" src="${badgeLinks[id]}" id="menuBadge">`;
  223. document.getElementsByClassName("nickname")[0].appendChild(badgeElement);
  224. clearInterval(i);
  225. }
  226. }, 100);
  227. }
  228.  
  229. if (!document.getElementById("clientJoinButton")) document.getElementsByClassName('play-content')[0].append(btn);
  230.  
  231. document.getElementsByClassName('settings-and-socicons')[0].children[0].onclick = () => {
  232. window.location.href = "https://discord.com/invite/cNwzjsFHpg";
  233. };
  234.  
  235. document.getElementsByClassName('settings-and-socicons')[0].children[1].onclick = () => {
  236. window.location.href = "https://github.com/42infi/better-kirka-client/releases";
  237. };
  238.  
  239. if (!el.classList?.contains("home") && !el.classList?.contains('moneys') && !el.classList?.contains("auth-form")) el.parentNode.removeChild(el);
  240.  
  241. }
  242. if (el.classList?.contains("game-interface")) {
  243. crosshair = document.getElementById("crosshair-static");
  244.  
  245. const statsWrapper = document.getElementsByClassName("kill-death")[0];
  246. const killElement = document.getElementsByClassName("kill bg text-1")[0];
  247. const deathElement = document.getElementsByClassName("death bg text-1")[0];
  248.  
  249. const kdrElem = document.createElement("div");
  250. kdrElem.innerHTML += `<div data-${Object.keys(deathElement.dataset)[0]}="" class="kill bg text-1" id="kdrElem">K/D: 0</div>`;
  251.  
  252. statsWrapper.appendChild(kdrElem);
  253.  
  254. const kdrText = document.getElementById("kdrElem");
  255.  
  256. function onStatsUpdate() {
  257. kdrText.innerText = `K/D: ${Math.round((Number.parseInt(killElement.innerText) / Math.max(Number.parseInt(deathElement.innerText), 1)) * 100) / 100}`;
  258. }
  259.  
  260. killElement.addEventListener("DOMCharacterDataModified", onStatsUpdate);
  261. deathElement.addEventListener("DOMCharacterDataModified", onStatsUpdate);
  262. }
  263.  
  264. if (el.classList?.contains("settings")) {
  265.  
  266. exportBtn = document.createElement('div');
  267.  
  268. exportBtn.id = "importBtn";
  269.  
  270. exportBtn.style = "line-height: 1.2;\n" +
  271. "user-select: none;\n" +
  272. "--white: #fff;\n" +
  273. "--secondary-2: #37477c;\n" +
  274. "-webkit-font-smoothing: antialiased;\n" +
  275. "text-align: center;\n" +
  276. "font-family: Exo\\ 2;\n" +
  277. "box-sizing: border-box;\n" +
  278. "text-shadow: -1px -1px 0 #0f0f0f,1px -1px 0 #0f0f0f,-1px 1px 0 #0f0f0f,1px 1px 0 #0f0f0f;\n" +
  279. "font-weight: 100;\n" +
  280. "height: 100%;\n" +
  281. "padding: 0 .8rem;\n" +
  282. "color: var(--white);\n" +
  283. "font-size: 1.5rem;\n" +
  284. "box-shadow: 0 .125rem .25rem rgba(24,28,40,.25);\n" +
  285. "border-radius: 0 .313rem .313rem 0;\n" +
  286. "background-color: var(--secondary-2);\n" +
  287. "display: flex;\n" +
  288. "justify-content: center;\n" +
  289. "align-items: center;"
  290.  
  291. exportBtn.onmouseover = () => {
  292. exportBtn.style.color = "#ffd500";
  293. }
  294.  
  295. exportBtn.onmouseout = () => {
  296. exportBtn.style.color = "#ffffff";
  297. }
  298.  
  299. exportBtn.innerText = "Export"
  300.  
  301. exportBtn.onclick = async () => {
  302. let gameSettingsObj = {};
  303.  
  304. for (let key in localStorage) {
  305. if (key.startsWith("m")) {
  306. if (localStorage[key].startsWith('"') && localStorage[key].endsWith('"')) {
  307. gameSettingsObj[key] = localStorage[key].slice(1, -1);
  308. } else {
  309. gameSettingsObj[key] = localStorage[key];
  310. }
  311. }
  312. }
  313.  
  314. try {
  315. navigator.clipboard.writeText(JSON.stringify(gameSettingsObj));
  316. } catch {
  317. throw new Error("Copying to clipboard failed")
  318. }
  319. //clipboard.writeText(JSON.stringify(gameSettingsObj));
  320. }
  321.  
  322.  
  323. importBtn = document.createElement('div');
  324.  
  325. importBtn.id = "importBtn";
  326.  
  327. importBtn.style = "line-height: 1.2;\n" +
  328. "user-select: none;\n" +
  329. "--white: #fff;\n" +
  330. "--secondary-2: #37477c;\n" +
  331. "-webkit-font-smoothing: antialiased;\n" +
  332. "text-align: center;\n" +
  333. "font-family: Exo\\ 2;\n" +
  334. "box-sizing: border-box;\n" +
  335. "text-shadow: -1px -1px 0 #0f0f0f,1px -1px 0 #0f0f0f,-1px 1px 0 #0f0f0f,1px 1px 0 #0f0f0f;\n" +
  336. "font-weight: 100;\n" +
  337. "height: 100%;\n" +
  338. "padding: 0 .8rem;\n" +
  339. "color: var(--white);\n" +
  340. "font-size: 1.5rem;\n" +
  341. "box-shadow: 0 .125rem .25rem rgba(24,28,40,.25);\n" +
  342. "border-radius: 0 .313rem .313rem 0;\n" +
  343. "background-color: var(--secondary-2);\n" +
  344. "display: flex;\n" +
  345. "justify-content: center;\n" +
  346. "align-items: center;"
  347.  
  348. importBtn.onmouseover = () => {
  349. importBtn.style.color = "#ffd500";
  350. }
  351.  
  352. importBtn.onmouseout = () => {
  353. importBtn.style.color = "#ffffff";
  354. }
  355.  
  356. importBtn.innerText = "Import"
  357.  
  358. importBtn.onclick = () => {
  359. //Object.assign(localStorage, JSON.parse(clipboard.readText()));
  360. //window.location.reload();
  361. }
  362.  
  363. document.getElementsByClassName('tabs')[0].appendChild(exportBtn);
  364. document.getElementsByClassName('tabs')[0].appendChild(importBtn);
  365.  
  366. settingsButtonsAdded = true;
  367.  
  368. }
  369. });
  370. });
  371. } catch {
  372. }
  373. }).observe(document, { childList: true, subtree: true });
  374.  
  375. //old adblock
  376. /*
  377. let oldLog = console.log;
  378.  
  379. console.log = (...arguments) => {
  380. if (typeof arguments[0] == "string" && arguments[0].startsWith("window.aiptag.cmd")) {
  381. throw "ad's blocked by overengineered ad block " + Math.random().toString().split(".")[1];
  382. }
  383. oldLog(...arguments);
  384. };
  385. */
  386.  
  387. //new adblock
  388. Object.defineProperty(window, 'aiptag', {
  389. set(v) {
  390. },
  391. get() {
  392. }
  393. });
  394.  
  395. if (customCss) {
  396. let cssLinkElem = document.createElement("link");
  397. cssLinkElem.href = settings.get('cssLink');
  398. cssLinkElem.rel = "stylesheet";
  399. document.head.append(cssLinkElem);
  400. }
  401.  
  402. gui.id = "gui";
  403.  
  404. gui.innerHTML += "<style>\n" +
  405. " @import url('https://fonts.googleapis.com/css2?family=Titillium+Web:wght@300&display=swap');\n" +
  406. "\n" +
  407. " #gui {\n" +
  408. " background-color: rgb(24, 25, 28);\n" +
  409. " border: solid rgb(24, 25, 28) 5px;\n" +
  410. " box-shadow: 0 0 8px 2px #000000;\n" +
  411. " position: absolute;\n" +
  412. " left: 200px;\n" +
  413. " top: 60px;\n" +
  414. " z-index: 300;\n" +
  415. " color: rgb(255, 255, 255);\n" +
  416. " padding: 6px;\n" +
  417. " font-family: \"Titillium Web\", serif;\n" +
  418. " line-height: 1.6;\n" +
  419. " border-radius: 3px;\n" +
  420. " max-width: 390px;\n" +
  421. " }\n" +
  422. "\n" +
  423. " input:disabled {\n" +
  424. " background: rgb(255, 255, 255);\n" +
  425. " border: solid rgb(0, 0, 0) 1px;\n" +
  426. " width: 50px;\n" +
  427. " }\n" +
  428. "\n" +
  429. " .heading {\n" +
  430. " width: 380px;\n" +
  431. " height: 40px;\n" +
  432. " display: flex;\n" +
  433. " justify-content: center;\n" +
  434. " align-items: center;\n" +
  435. " background-color: rgb(24, 25, 28);\n" +
  436. " margin: -9px -6px 8px;\n" +
  437. " font-family: \"Titillium Web\", serif;\n" +
  438. " font-weight: bold;\n" +
  439. " text-align: center;\n" +
  440. " font-size: 24px;\n" +
  441. " border-bottom: solid rgb(140, 140, 140) 2px;\n" +
  442. " }\n" +
  443. "\n" +
  444. " .footer {\n" +
  445. " width: 380px;\n" +
  446. " height: 20px;\n" +
  447. " display: flex;\n" +
  448. " justify-content: center;\n" +
  449. " align-items: center;\n" +
  450. " background-color: rgb(24, 25, 28);\n" +
  451. " margin: 6px -6px -10px;\n" +
  452. " font-family: \"Titillium Web\", serif;\n" +
  453. " font-weight: bold;\n" +
  454. " text-align: center;\n" +
  455. " font-size: 11px;\n" +
  456. " position: relative;\n" +
  457. " border-top: solid rgb(140, 140, 140) 2px;\n" +
  458. " }\n" +
  459. "\n" +
  460. " .module:hover {\n" +
  461. " background-color: rgb(0, 0, 0, 0.1)\n" +
  462. " }\n" +
  463. "\n" +
  464. " .autojoin{\n" +
  465. " display: none;\n" +
  466. " }\n" +
  467. "\n" +
  468. " </style>\n" +
  469. " <div id=\"infi\" class=\"heading\">Script Settings</div>\n" +
  470. "\n" +
  471. " <div class=\"module\">\n" +
  472. " <input type=\"checkbox\" id=\"crosshair\" name=\"crosshair\">\n" +
  473. " <label for=\"crosshair\">Perm. Crosshair</label>\n" +
  474. " </div>\n" +
  475. "\n" +
  476. " <div class=\"module\">\n" +
  477. " <input type=\"checkbox\" id=\"customCSS\" name=\"customCSS\">\n" +
  478. " <label for=\"customCSS\">CSS Link: </label>\n" +
  479. " <input type=\"text\" id=\"cssLink\" placeholder=\"Paste CSS Link Here\">\n" +
  480. " </div>\n" +
  481. "\n" +
  482. " <div class=\"module\">\n" +
  483. " <input type=\"checkbox\" id=\"hideweap\" name=\"hideweap\">\n" +
  484. " <label for=\"hideweap\">Hide Weapon ADS</label>\n" +
  485. " </div>\n" +
  486. "\n" +
  487. " <div class=\"module\">\n" +
  488. " <input type=\"checkbox\" id=\"arms\" name=\"arms\">\n" +
  489. " <label for=\"arms\">Hide Arms</label>\n" +
  490. " </div>\n" +
  491. "\n" +
  492. " <div class=\"module\">\n" +
  493. " <input type=\"checkbox\" id=\"leftHanded\" name=\"leftHanded\">\n" +
  494. " <label for=\"leftHanded\">Left Handed</label>\n" +
  495. " </div>\n" +
  496. "\n" +
  497. " <div class=\"module\">\n" +
  498. " <input type=\"checkbox\" id=\"hideflag\" name=\"hideflag\">\n" +
  499. " <label for=\"hideflag\">Hide Flag ADS</label>\n" +
  500. " </div>\n" +
  501. "\n" +
  502. " <div class=\"module\">\n" +
  503. " <input type=\"checkbox\" id=\"highlight\" name=\"highlight\">\n" +
  504. " <label for=\"highlight\">Highlight Players</label>\n" +
  505. " </div>\n" +
  506. "\n" +
  507. " <div class=\"module\">\n" +
  508. " <input type=\"checkbox\" id=\"weaponHighlighter\" name=\"weaponHighlighter\">\n" +
  509. " <label for=\"weaponHighlighter\">Weapon Highlighting</label>\n" +
  510. " </div>\n" +
  511. "\n" +
  512. " <div class=\"module\">\n" +
  513. " <input type=\"checkbox\" id=\"rgbHighlight\" name=\"rgbHighlight\">\n" +
  514. " <label for=\"rgbHighlight\">Rainbow Highlighting</label>\n" +
  515. " </div>\n" +
  516. "\n" +
  517. " <div class=\"module\">\n" +
  518. " <input type=\"checkbox\" id=\"wireframeWeapons\" name=\"wireframeWeapons\">\n" +
  519. " <label for=\"wireframeWeapons\">Wireframe Weapons</label>\n" +
  520. " </div>\n" +
  521. "\n" +
  522. " <div class=\"module\">\n" +
  523. " <input type=\"checkbox\" id=\"wireframeArms\" name=\"wireframeArms\">\n" +
  524. " <label for=\"wireframeArms\">Wireframe Arms</label>\n" +
  525. " </div>\n" +
  526. "\n" +
  527. " <div class=\"module\">\n" +
  528. " <input type=\"checkbox\" id=\"rainbow\" name=\"rainbow\">\n" +
  529. " <label for=\"rainbow\">Rainbow Colors</label>\n" +
  530. " </div>\n" +
  531. "\n" +
  532. " <div class=\"module\">\n" +
  533. " Inspect Key\n" +
  534. " <button id=\"inspBindButton\" style=\"width: 100px\">click to bind</button>\n" +
  535. " </div>\n" +
  536. "\n" +
  537. " <div class=\"module\">\n" +
  538. " <input type=\"checkbox\" id=\"adspower\" name=\"adspower\">\n" +
  539. " <label for=\"adspower\">0 ADS Power</label>\n" +
  540. " </div>\n" +
  541. "\n" +
  542. " <div class=\"module\">\n" +
  543. " <input type=\"checkbox\" id=\"autoJoin\" name=\"autoJoin\">\n" +
  544. " <label for=\"autoJoin\">Auto-Joiner (Key F8)</label>\n" +
  545. " </div>\n" +
  546. "\n" +
  547. " <hr class=\"autojoin\">\n" +
  548. "\n" +
  549. " <div class=\"module autojoin\">\n" +
  550. " <input type=\"checkbox\" id=\"euLobbies\" name=\"euLobbies\">\n" +
  551. " <label for=\"euLobbies\">EU Lobbies</label>\n" +
  552. " </div>\n" +
  553. "\n" +
  554. " <div class=\"module autojoin\">\n" +
  555. " <input type=\"checkbox\" id=\"naLobbies\" name=\"naLobbies\">\n" +
  556. " <label for=\"naLobbies\">NA Lobbies</label>\n" +
  557. " </div>\n" +
  558. "\n" +
  559. " <div class=\"module autojoin\">\n" +
  560. " <input type=\"checkbox\" id=\"asiaLobbies\" name=\"asiaLobbies\">\n" +
  561. " <label for=\"asiaLobbies\">ASIA Lobbies</label>\n" +
  562. " </div>\n" +
  563. "\n" +
  564. " <div class=\"module autojoin\">\n" +
  565. " <input type=\"checkbox\" id=\"ffaLobbies\" name=\"ffaLobbies\">\n" +
  566. " <label for=\"ffaLobbies\">FFA Lobbies</label>\n" +
  567. " </div>\n" +
  568. "\n" +
  569. " <div class=\"module autojoin\">\n" +
  570. " <input type=\"checkbox\" id=\"tdmLobbies\" name=\"tdmLobbies\">\n" +
  571. " <label for=\"tdmLobbies\">TDM Lobbies</label>\n" +
  572. " </div>\n" +
  573. "\n" +
  574. " <div class=\"module autojoin\">\n" +
  575. " <input type=\"checkbox\" id=\"parkourLobbies\" name=\"parkourLobbies\">\n" +
  576. " <label for=\"parkourLobbies\">PARKOUR Lobbies</label>\n" +
  577. " </div>\n" +
  578. "\n" +
  579. " <div class=\"module autojoin\">\n" +
  580. " <label for=\"preferredFilter\">Prefered Filter:</label>\n" +
  581. " <select id=\"preferredFilter\" name=\"preferredFilter\">\n" +
  582. " <option value=\"Time\">Time</option>\n" +
  583. " <option value=\"Players\">Players</option>\n" +
  584. " </select>\n" +
  585. " </div>\n" +
  586. "\n" +
  587. " <div class=\"module autojoin\">\n" +
  588. " <input type=\"range\" id=\"minPlayers\" name=\"minPlayers\" min=\"0\" max=\"8\" value=\"0\" step=\"1\">\n" +
  589. " <label id=\"minPlayersLab\" for=\"minPlayers\">min. Players</label>\n" +
  590. " </div>\n" +
  591. "\n" +
  592. " <div class=\"module autojoin\">\n" +
  593. " <input type=\"range\" id=\"maxPlayers\" name=\"maxPlayers\" min=\"0\" max=\"8\" value=\"0\" step=\"1\">\n" +
  594. " <label id=\"maxPlayersLab\" for=\"maxPlayers\">max. Players</label>\n" +
  595. " </div>\n" +
  596. "\n" +
  597. " <div class=\"module autojoin\">\n" +
  598. " <input type=\"range\" id=\"minTimeLeft\" name=\"minTimeLeft\" min=\"0\" max=\"8\" value=\"0\" step=\"1\">\n" +
  599. " <label id=\"minTimeLeftLab\" for=\"minTimeLeft\">min. Time Left</label>\n" +
  600. " </div>\n" +
  601. "\n" +
  602. " <div class=\"module autojoin\">\n" +
  603. " <input type=\"checkbox\" id=\"filterMaps\" name=\"filterMaps\">\n" +
  604. " <label for=\"filterMaps\">Map Filter: </label>\n" +
  605. " <input type=\"text\" id=\"mapFilterField\" placeholder=\"Map1, Map2, Map3, etc.\">\n" +
  606. " </div>\n" +
  607. "\n" +
  608. " <div class=\"module autojoin\">\n" +
  609. " <input type=\"checkbox\" id=\"customGames\" name=\"customGames\">\n" +
  610. " <label for=\"customGames\">Custom Games </label>\n" +
  611. " </div>\n" +
  612. "\n" +
  613. " <hr class=\"autojoin\">\n" +
  614. "\n" +
  615. " <div class=\"module\">\n" +
  616. " Menu Toggle Key\n" +
  617. " <button id=\"menuBindButton\" style=\"width: 100px\">click to bind</button>\n" +
  618. " </div>\n" +
  619. "\n" +
  620. " <div class=\"module\">\n" +
  621. " <input type=\"range\" id=\"volume\" name=\"volume\" min=\"0\" max=\"2\" value=\"1\" step=\"0.1\">\n" +
  622. " <label id=\"volumeLab\" for=\"volume\">Volume</label>\n" +
  623. " </div>\n" +
  624. "\n" +
  625. " <div class=\"module\">\n" +
  626. " <input type=\"checkbox\" id=\"noKillSound\" name=\"noKillSound\">\n" +
  627. " <label for=\"noKillSound\">Disable Killsounds (applies after reload)</label>\n" +
  628. " </div>\n" +
  629. "\n" +
  630. " <div class=\"module\">\n" +
  631. " <input type=\"checkbox\" id=\"customHitmarker\" name=\"customHitmarker\">\n" +
  632. " <label for=\"customHitmarkerLink\">Hitmarker Link: </label>\n" +
  633. " <input type=\"text\" id=\"customHitmarkerLink\" placeholder=\"Paste Hitmarker Link\">\n" +
  634. " </div>\n" +
  635. "\n" +
  636. " <div class=\"footer\">Toggle With \"PageUp\" or \"F8\" Key</div>";
  637.  
  638.  
  639. gui.onclick = (e) => {
  640.  
  641. if (e.target.id === "crosshair") {
  642. permCrosshair = e.target.checked;
  643. settings.set('permCrosshair', permCrosshair);
  644. }
  645.  
  646. if (e.target.id === "customCSS") {
  647. customCss = e.target.checked;
  648. settings.set('customCss', customCss);
  649. }
  650.  
  651. if (e.target.id === "hideweap") {
  652. hideWeaponsAds = e.target.checked;
  653. settings.set('hideWeaponsAds', hideWeaponsAds);
  654. }
  655.  
  656. if (e.target.id === "arms") {
  657. hideArms = e.target.checked;
  658. settings.set('hideArms', hideArms);
  659. }
  660.  
  661. if (e.target.id === "leftHanded") {
  662. leftHanded = e.target.checked;
  663. settings.set('leftHanded', leftHanded);
  664. }
  665.  
  666.  
  667. if (e.target.id === "hideflag") {
  668. hideFlagAds = e.target.checked;
  669. settings.set('hideFlagAds', hideFlagAds);
  670. }
  671.  
  672.  
  673. if (e.target.id === "highlight") {
  674. playerHighLight = e.target.checked;
  675. settings.set('playerHighLight', playerHighLight);
  676. }
  677.  
  678. if (e.target.id === "weaponHighlighter") {
  679. weaponHighlighter = e.target.checked;
  680. settings.set('weaponHighlighter', weaponHighlighter);
  681. }
  682.  
  683. if (e.target.id === "rgbHighlight") {
  684. rgbHighlight = e.target.checked;
  685. settings.set('rgbHighlight', rgbHighlight);
  686. }
  687.  
  688. if (e.target.id === "wireframeWeapons") {
  689. wireframeWeapons = e.target.checked;
  690. settings.set('wireframeWeapons', wireframeWeapons);
  691. }
  692.  
  693. if (e.target.id === "wireframeArms") {
  694. wireframeArms = e.target.checked;
  695. settings.set('wireframeArms', wireframeArms);
  696. }
  697.  
  698. if (e.target.id === "rainbow") {
  699. rainbow = e.target.checked;
  700. settings.set('rainbow', rainbow);
  701. }
  702.  
  703. if (e.target.id === "adspower") {
  704. adspower = e.target.checked;
  705. settings.set('adspower', adspower);
  706. }
  707.  
  708. if (e.target.id === "autoJoin") {
  709. autoJoin = e.target.checked;
  710. settings.set('autoJoin', autoJoin);
  711. for (let e of document.getElementsByClassName('autojoin')) {
  712. e.style.display = autoJoin ? 'block' : 'none'
  713. }
  714. }
  715.  
  716. if (e.target.id === "euLobbies") {
  717. euLobbies = e.target.checked;
  718. settings.set('euLobbies', euLobbies);
  719. }
  720.  
  721. if (e.target.id === "naLobbies") {
  722. naLobbies = e.target.checked;
  723. settings.set('naLobbies', naLobbies);
  724. }
  725.  
  726. if (e.target.id === "asiaLobbies") {
  727. asiaLobbies = e.target.checked;
  728. settings.set('asiaLobbies', asiaLobbies);
  729. }
  730.  
  731. if (e.target.id === "ffaLobbies") {
  732. ffaLobbies = e.target.checked;
  733. settings.set('ffaLobbies', ffaLobbies);
  734. }
  735.  
  736. if (e.target.id === "tdmLobbies") {
  737. tdmLobbies = e.target.checked;
  738. settings.set('tdmLobbies', tdmLobbies);
  739. }
  740.  
  741. if (e.target.id === "parkourLobbies") {
  742. parkourLobbies = e.target.checked;
  743. settings.set('parkourLobbies', parkourLobbies);
  744. }
  745.  
  746. if (e.target.id === "filterMaps") {
  747. filterMaps = e.target.checked;
  748. settings.set('filterMaps', filterMaps);
  749. }
  750.  
  751. if (e.target.id === "customGames") {
  752. customGames = e.target.checked;
  753. settings.set('customGames', customGames);
  754. }
  755.  
  756. if (e.target.id === "noKillSound") {
  757. noKillSound = e.target.checked;
  758. settings.set('noKillSound', noKillSound);
  759. }
  760.  
  761. if (e.target.id === "marketNames") {
  762. marketNames = e.target.checked;
  763. settings.set('marketNames', marketNames);
  764. }
  765.  
  766. if (e.target.id === "customHitmarker") {
  767. customHitmarker = e.target.checked;
  768. settings.set('customHitmarker', customHitmarker);
  769. }
  770.  
  771. };
  772.  
  773. gui.style.display = "none";
  774.  
  775. document.body.appendChild(gui);
  776.  
  777. if (settings.get('menuOpen') === undefined || settings.get('menuOpen')) {
  778. toggleGui();
  779. }
  780.  
  781. document.getElementById("crosshair").checked = permCrosshair;
  782.  
  783. document.getElementById("customCSS").checked = customCss;
  784.  
  785. const cssField = document.getElementById('cssLink');
  786.  
  787. if (settings.get('cssLink') === undefined) settings.set('cssLink', '');
  788.  
  789. cssField.value = settings.get('cssLink');
  790.  
  791. cssField.oninput = () => {
  792. settings.set('cssLink', cssField.value);
  793. }
  794.  
  795. document.getElementById("hideweap").checked = hideWeaponsAds;
  796. document.getElementById("arms").checked = hideArms;
  797. document.getElementById("leftHanded").checked = leftHanded;
  798. document.getElementById("hideflag").checked = hideFlagAds;
  799. document.getElementById("highlight").checked = playerHighLight;
  800. document.getElementById("weaponHighlighter").checked = weaponHighlighter;
  801. document.getElementById("rgbHighlight").checked = rgbHighlight;
  802. document.getElementById("wireframeWeapons").checked = wireframeWeapons;
  803. document.getElementById("wireframeArms").checked = wireframeArms;
  804. document.getElementById("rainbow").checked = rainbow;
  805. document.getElementById("adspower").checked = adspower;
  806.  
  807. maxPlayersLab = document.getElementById('maxPlayersLab');
  808. minPlayersLab = document.getElementById('minPlayersLab');
  809. minTimeLeftLab = document.getElementById('minTimeLeftLab');
  810.  
  811. maxPlayerSlider = document.getElementById("maxPlayers");
  812. minPlayerSlider = document.getElementById("minPlayers");
  813. minTimeLeftSlider = document.getElementById("minTimeLeft");
  814.  
  815. maxPlayerSlider.onchange = () => {
  816. settings.set('maxPlayers', Number.parseInt(maxPlayerSlider.value));
  817. }
  818.  
  819. minPlayerSlider.onchange = () => {
  820. settings.set('minPlayers', Number.parseInt(minPlayerSlider.value));
  821. }
  822.  
  823. minTimeLeftSlider.onchange = () => {
  824. settings.set('minTimeLeft', Number.parseInt(minTimeLeftSlider.value));
  825. }
  826.  
  827. minPlayerSlider.value = minPlayers;
  828. maxPlayerSlider.value = maxPlayers;
  829. minTimeLeftSlider.value = minTimeLeft;
  830.  
  831. if (autoJoin) {
  832. for (let e of document.getElementsByClassName('autojoin')) {
  833. e.style.display = autoJoin ? 'block' : 'none'
  834. }
  835. }
  836.  
  837. document.getElementById("autoJoin").checked = autoJoin;
  838. document.getElementById("euLobbies").checked = euLobbies;
  839. document.getElementById("naLobbies").checked = naLobbies;
  840. document.getElementById("asiaLobbies").checked = asiaLobbies;
  841. document.getElementById("ffaLobbies").checked = ffaLobbies;
  842. document.getElementById("tdmLobbies").checked = tdmLobbies;
  843. document.getElementById("parkourLobbies").checked = parkourLobbies;
  844.  
  845. let inspectBindButton = document.getElementById("inspBindButton");
  846. inspectBindButton.style.fontWeight = "800";
  847. inspectBindButton.onclick = () => {
  848. inspectListening = true;
  849. inspectBindButton.innerText = "Press a Key"
  850. }
  851.  
  852. inspectBindButton.innerText = settings.get('inspectKey').toUpperCase();
  853.  
  854. let filter = document.getElementById("preferredFilter");
  855.  
  856. filter.value = preferredFilter;
  857.  
  858. filter.onchange = () => {
  859. preferredFilter = filter.value;
  860. settings.set('preferredFilter', filter.value);
  861. }
  862.  
  863. document.getElementById("filterMaps").checked = filterMaps;
  864.  
  865. let mapField = document.getElementById("mapFilterField");
  866.  
  867. let mapString = "";
  868. for (let name of maps) {
  869. mapString += name + ", "
  870. }
  871.  
  872. mapField.value = mapString.slice(0, -2);
  873.  
  874. mapField.oninput = () => {
  875. maps = mapField.value.replace(/ /g, '').toLowerCase().split(',');
  876. settings.set('maps', maps);
  877. }
  878.  
  879. document.getElementById("customGames").checked = customGames;
  880.  
  881. let menuBindButton = document.getElementById("menuBindButton");
  882. menuBindButton.style.fontWeight = "800";
  883. menuBindButton.onclick = () => {
  884. menuListening = true;
  885. menuBindButton.innerText = "Press a Key"
  886. }
  887.  
  888. menuBindButton.innerText = settings.get("menuKey") !== undefined ? settings.get("menuKey").toUpperCase() : "click to bind";
  889.  
  890.  
  891. document.getElementById("noKillSound").checked = noKillSound;
  892.  
  893.  
  894. volumeLab = document.getElementById('volumeLab');
  895. volumeSlider = document.getElementById("volume");
  896.  
  897. volumeSlider.onchange = () => {
  898. settings.set('volume', Number.parseFloat(volumeSlider.value));
  899. for (let i = 0; i < gains.length; i++) {
  900. const cur = gains[i];
  901. if (cur) cur.value = volume;
  902. }
  903. }
  904.  
  905. volumeSlider.value = volume;
  906.  
  907. let customHitmarkerField = document.getElementById('customHitmarkerLink');
  908.  
  909. if (settings.get('customHitmarkerLink') === undefined) settings.set('customHitmarkerLink', '');
  910.  
  911. customHitmarkerField.value = settings.get('customHitmarkerLink');
  912.  
  913. customHitmarkerField.oninput = () => {
  914. settings.set('customHitmarkerLink', customHitmarkerField.value);
  915. }
  916.  
  917. document.getElementById("customHitmarker").checked = customHitmarker;
  918.  
  919.  
  920. const ingameIds = [
  921. '#MTK3Z5', '#4DD3XZ', '#2Q0QKL', '#YYRHG7', '#W5J3AB', '#6FIJZY', '#HVCL3P', '#7PWLQI', '#FAYQ0E', '#QCZSZK', '#6L1WRO', '#Z37B0Z', '#6IUE15', '#UVPIAP', '#4HCBF4', '#QH8CEO', '#UH98AE', '#C8KLSB', '#Y64AN1'
  922. ];
  923.  
  924. const badgeLinks = {
  925. default: 'https://cdn.discordapp.com/attachments/738010330780926004/1017163938993020939/Untitled-finalihope.png',
  926. '#MTK3Z5': 'https://cdn.discordapp.com/attachments/1010612280775422093/1019727079320854528/rsz_2667.png',
  927. '#4DD3XZ': 'https://cdn.discordapp.com/attachments/738010330780926004/1027331355656331376/unknown.png',
  928. '#2Q0QKL': 'https://cdn.discordapp.com/attachments/738010330780926004/1020042667276632084/devbadge.png',
  929. '#YYRHG7': 'https://cdn.discordapp.com/attachments/738010330780926004/1020042667276632084/devbadge.png',
  930. '#W5J3AB': '',
  931. '#6FIJZY': '',
  932. '#HVCL3P': '',
  933. '#7PWLQI': '',
  934. '#FAYQ0E': '',
  935. '#QCZSZK': '',
  936. '#6L1WRO': '',
  937. '#Z37B0Z': 'https://cdn.discordapp.com/attachments/738010330780926004/1040977499384979517/b57d2718c0f2330c0e06166d4b5fb606.png',
  938. '#6IUE15': 'https://cdn.discordapp.com/attachments/738010330780926004/1040977499384979517/b57d2718c0f2330c0e06166d4b5fb606.png',
  939. '#UVPIAP': '',
  940. '#4HCBF4': 'https://cdn.discordapp.com/attachments/738010330780926004/1040977499384979517/b57d2718c0f2330c0e06166d4b5fb606.png',
  941. '#QH8CEO': '',
  942. '#UH98AE': '',
  943. '#C8KLSB': '',
  944. '#Y64AN1': '',
  945. '#D84BWU': 'https://cdn.discordapp.com/attachments/738010330780926004/1046046359884677170/greentick.png',
  946. '#T5KBH4': '',
  947. '#NV6BPK': '',
  948. '#LORZQI': '',
  949. '#JPI0TQ': '',
  950. '#P4B05K': '',
  951. '#6YGZWX': 'https://cdn.discordapp.com/attachments/738010330780926004/1048757530706333757/lelBadge.png',
  952. '#DU8C8P': '',
  953. '#JT4VC2': '',
  954. '#RFXB4H': 'https://cdn.discordapp.com/attachments/1040044875271385128/1050556879392223334/2.0-2.png',
  955. '#CEZ7ES': '',
  956. '#QH8CEO': '',
  957. '#WFUHVE': '',
  958. '#Y9W4QC': '',
  959. '#SQ0VI1': '',
  960. '#H8N3U4': '',
  961. '#ZXDZQD': '',
  962. '#EQJQ47': '',
  963. };
  964.  
  965. let imgTags = [];
  966. let hasPlayerList = false;
  967.  
  968.  
  969. function appendBadges() {
  970. players.querySelectorAll('.short-id').forEach((e) => {
  971.  
  972. if (ingameIds.includes(e.innerText)) {
  973. let img = document.createElement("img");
  974.  
  975. img.src = badgeLinks[e.innerText] !== '' ? badgeLinks[e.innerText] : badgeLinks.default;
  976.  
  977. imgTags.push(img);
  978.  
  979. e.parentElement.children[1].append(img);
  980. }
  981.  
  982. });
  983. }
  984.  
  985. setInterval(() => {
  986.  
  987.  
  988. players = document.getElementsByClassName('players')?.[0];
  989.  
  990. if (!players) gains = [];
  991.  
  992. if (!hasPlayerList && players) {
  993.  
  994. appendBadges();
  995.  
  996. const observer = new MutationObserver((mutation) => {
  997.  
  998. let n = false;
  999.  
  1000. mutation.forEach((e) => {
  1001. e.addedNodes.forEach((f) => {
  1002. if (f.nodeName === "IMG") n = true;
  1003. });
  1004. });
  1005.  
  1006. if (n) return;
  1007.  
  1008. for (let imgTag of imgTags) {
  1009. if (imgTag) imgTag.parentElement.removeChild(imgTag);
  1010. }
  1011.  
  1012. imgTags = [];
  1013.  
  1014. appendBadges();
  1015.  
  1016. });
  1017. observer.observe(players, {
  1018. attributes: true,
  1019. characterData: true,
  1020. childList: true,
  1021. subtree: true,
  1022. attributeOldValue: true,
  1023. characterDataOldValue: true
  1024. });
  1025. }
  1026.  
  1027. hasPlayerList = !!players;
  1028. }, 1000);
  1029.  
  1030.  
  1031. //credit to Sheriff for the cw time display
  1032.  
  1033. let isClanWarPage = false
  1034. let updating = false
  1035.  
  1036. async function clanWarUsers() {
  1037.  
  1038. let clanLb = await fetch("https://api.kirka.io/api/leaderboard/clanChampionship", {
  1039. "headers": {
  1040. "accept": "application/json, text/plain, */*",
  1041. "sec-fetch-site": "same-site"
  1042. },
  1043. "referrer": "https://kirka.io/hub/clans/champions-league",
  1044. "referrerPolicy": "no-referrer-when-downgrade",
  1045. "body": null,
  1046. "method": "GET",
  1047. })
  1048.  
  1049. let clanLbJson = await clanLb.json()
  1050.  
  1051. document.getElementsByClassName("reset-time")[0].innerHTML = '<svg data-v-49b1054a="" data-v-0684cd73="" xmlns="http://www.w3.org/2000/svg" class="time svg-icon svg-icon--clock"><!----><use data-v-49b1054a="" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/img/icons.6e41b8dd.svg#clock"></use></svg> Reset in ' + Math.floor(clanLbJson.remainingTime / 86400000) + "d " + Math.floor((clanLbJson.remainingTime / 86400000 - Math.floor(clanLbJson.remainingTime / 86400000)) * 24) + "h " + Math.floor(((clanLbJson.remainingTime / 86400000 - Math.floor(clanLbJson.remainingTime / 86400000)) * 24 - Math.floor((clanLbJson.remainingTime / 86400000 - Math.floor(clanLbJson.remainingTime / 86400000)) * 24)) * 60) + "m"
  1052. updating = false
  1053. }
  1054.  
  1055. let previousUrl = "";
  1056.  
  1057. const observer = new MutationObserver(() => {
  1058.  
  1059. if (window.location.href !== previousUrl) {
  1060. previousUrl = window.location.href;
  1061. if (window.location.href === "https://kirka.io/hub/clans/champions-league") {
  1062. isClanWarPage = true
  1063. } else {
  1064. isClanWarPage = false
  1065. updating = false
  1066. }
  1067. }
  1068.  
  1069. if (isClanWarPage) {
  1070. if (document.getElementsByClassName("reset-time")[0]) {
  1071. if (!document.getElementsByClassName("reset-time")[0].innerText.includes("d") || !document.getElementsByClassName("reset-time")[0].innerText.includes("h") || !document.getElementsByClassName("reset-time")[0].innerText.includes("m")) {
  1072. if (!updating) {
  1073. updating = true;
  1074. clanWarUsers();
  1075. }
  1076. }
  1077. }
  1078. }
  1079.  
  1080. if (document.getElementsByClassName("hit")[0] && customHitmarker && settings.get('customHitmarkerLink') && settings.get('customHitmarkerLink') !== '') {
  1081. document.getElementsByClassName("hit")[0].src = settings.get('customHitmarkerLink');
  1082. }
  1083.  
  1084. });
  1085.  
  1086. observer.observe(document, {
  1087. subtree: true,
  1088. childList: true
  1089. });
  1090.  
  1091.  
  1092.  
  1093.  
  1094. //hp numbers default ingame now
  1095. /*const observer = new MutationObserver(function (mutations) {
  1096. mutations.forEach(function (mutation) {
  1097. document.getElementsByClassName('hp-title')[0].innerText = hpNumber ? mutation.target.style.width.slice(0, -1) : "HP";
  1098. });
  1099. });*/
  1100.  
  1101. let scoped = false;
  1102.  
  1103.  
  1104. document.addEventListener('mousedown', (e) => {
  1105. if (e.button === 2) {
  1106. scoped = true;
  1107. inspecting = false;
  1108. }
  1109. });
  1110.  
  1111. document.addEventListener('mouseup', (e) => {
  1112. if (e.button === 2) scoped = false;
  1113. if (e.button === 3 || e.button === 4) e.preventDefault();
  1114.  
  1115. });
  1116.  
  1117. let inspectedWeapon;
  1118.  
  1119. document.addEventListener('keydown', (e) => {
  1120.  
  1121. if (inspectListening) {
  1122. settings.set('inspectKey', e.key);
  1123. document.getElementById("inspBindButton").innerText = e.key.toUpperCase();
  1124. inspectListening = false;
  1125. }
  1126.  
  1127. if (menuListening) {
  1128. settings.set('menuKey', e.key);
  1129. document.getElementById("menuBindButton").innerText = e.key.toUpperCase();
  1130. menuListening = false;
  1131. toggleGui();
  1132. }
  1133.  
  1134. if (e.key === settings.get("inspectKey").toLowerCase()) {
  1135. inspecting = true;
  1136. setTimeout(() => {
  1137. inspecting = false
  1138. }, 3000);
  1139. }
  1140.  
  1141. if (e.key.toLowerCase() === settings.get("menuKey")?.toLowerCase() || e.key === "PageUp" || e.key === "F8") {
  1142. toggleGui();
  1143. }
  1144.  
  1145. });
  1146.  
  1147. let redWireframe = 255;
  1148. let greenWireframe = 0;
  1149. let blueWireframe = 0;
  1150.  
  1151. let redHighlight = 255;
  1152. let greenHighlight = 0;
  1153. let blueHighlight = 0;
  1154.  
  1155. setInterval(() => {
  1156.  
  1157. if (rainbow) {
  1158. if (redWireframe > 0 && blueWireframe === 0) {
  1159. redWireframe--;
  1160. greenWireframe++;
  1161. }
  1162. if (greenWireframe > 0 && redWireframe === 0) {
  1163. greenWireframe--;
  1164. blueWireframe++;
  1165. }
  1166. if (blueWireframe > 0 && greenWireframe === 0) {
  1167. redWireframe++;
  1168. blueWireframe--;
  1169. }
  1170. } else {
  1171. let color = hexToRgb("#ff0000");
  1172. redWireframe = color.r;
  1173. greenWireframe = color.g;
  1174. blueWireframe = color.b;
  1175. }
  1176.  
  1177. if (rgbHighlight) {
  1178. if (redHighlight > 0 && blueHighlight === 0) {
  1179. redHighlight--;
  1180. greenHighlight++;
  1181. }
  1182. if (greenHighlight > 0 && redHighlight === 0) {
  1183. greenHighlight--;
  1184. blueHighlight++;
  1185. }
  1186. if (blueHighlight > 0 && greenHighlight === 0) {
  1187. redHighlight++;
  1188. blueHighlight--;
  1189. }
  1190. } else {
  1191. let color = hexToRgb("#ff0000");
  1192. redHighlight = color.r;
  1193. greenHighlight = color.g;
  1194. blueHighlight = color.b;
  1195. }
  1196.  
  1197. }, 4);
  1198.  
  1199. let armsMaterial;
  1200. let playerStructs = {};
  1201. let playerList;
  1202. const weaponColors = {
  1203. //Bayonet: "#aaffaa",
  1204. //Tomahawk: "#AAFFAA",
  1205. //Shark: "#31fa31",
  1206. Weatie: "#ff0000",
  1207. Revolver: "#200020",
  1208. LAR: "#ff5000",
  1209. VITA: "#ff00ff",
  1210. M60: "#00ffff",
  1211. "MAC-10": "#00FF00",
  1212. "AR-9": "#001e00",
  1213. SCAR: "#ffff00",
  1214. }
  1215.  
  1216. class Vector3 {
  1217. constructor(x, y, z) {
  1218. this.x = x;
  1219. this.y = y;
  1220. this.z = z;
  1221. }
  1222. }
  1223.  
  1224. const defaultPositions = {
  1225. lar: new Vector3(-0.0078, 0.045, 0.0205),
  1226. weatie: new Vector3(0.0009, 0.0541, 0.0577),
  1227. "mac-10": new Vector3(-0.0077, 0.0588, 0),
  1228. vita: new Vector3(0.0095, 0.0673, 0.0733),
  1229. m60: new Vector3(-0.0077, 0.067, 0.0447),
  1230. scar: new Vector3(0.0057, 0.046, 0.0531),
  1231. revolver: new Vector3(-0.0065, 0.065, -0.17),
  1232. "ar-9": new Vector3(-0.0077, 0.067, 0),
  1233. shark: new Vector3(-0.0157, 0.0094, -0.08),
  1234. bayonet: new Vector3(-0.0248, 0.0324, 0.0299),
  1235. tomahawk: new Vector3(-0.0248, 0.0324, 0.0196)
  1236. }
  1237.  
  1238. class Player {
  1239. constructor(spawnProtected, wName) {
  1240. this.spawnProtected = spawnProtected;
  1241. this.wName = wName;
  1242. }
  1243. }
  1244.  
  1245.  
  1246. function animate() {
  1247.  
  1248. window.requestAnimationFrame(animate);
  1249.  
  1250. if (menuVisible) {
  1251. if (minPlayerSlider) {
  1252. minPlayers = Number.parseInt(minPlayerSlider.value);
  1253. minPlayersLab.innerText = minPlayerSlider.value + " min. Players";
  1254. }
  1255.  
  1256. if (maxPlayerSlider) {
  1257. maxPlayers = Number.parseInt(maxPlayerSlider.value);
  1258. maxPlayersLab.innerText = maxPlayerSlider.value + " max. Players";
  1259. }
  1260.  
  1261. if (minTimeLeftSlider) {
  1262. minTimeLeft = Number.parseInt(minTimeLeftSlider.value);
  1263. minTimeLeftLab.innerText = minTimeLeftSlider.value + " min. Time Left";
  1264. }
  1265.  
  1266. if (volumeSlider) {
  1267. volume = Number.parseFloat(volumeSlider.value);
  1268. volumeLab.innerText = "Volume: " + volumeSlider.value;
  1269. }
  1270. }
  1271.  
  1272. if (flagMaterial) {
  1273. if (hideFlagAds) {
  1274. flagMaterial.visible = !scoped;
  1275. } else {
  1276. flagMaterial.visible = true;
  1277. }
  1278. }
  1279.  
  1280. if (overlayModel) {
  1281. if (leftHanded) {
  1282. overlayModel.scale.x = -1;
  1283. } else {
  1284. overlayModel.scale.x = 1;
  1285. }
  1286. }
  1287.  
  1288. if (crosshair && permCrosshair) crosshair.style = "visibility: visible !important; opacity: 1 !important; display: block !important; transition: none; !important"
  1289.  
  1290.  
  1291. try {
  1292.  
  1293. let weap = document.getElementsByClassName('list-weapons')[0].children[0].children[0].innerText;
  1294. let num = 4;
  1295.  
  1296. if (weap === "Weatie" || weap === "MAC-10") num = 5;
  1297.  
  1298. if (weap === "AR-9" || weap === "Revolver") num = 3;
  1299.  
  1300. let arms = true;
  1301. if ((scoped && hideWeaponsAds) || hideArms) {
  1302. arms = false;
  1303. }
  1304.  
  1305. const weaponModel = scene["entity"]["_entityManager"]["mWnwM"]["systemManager"]["_systems"]["0"]["_queries"]["player"]["entities"]["0"]["_components"]["35"]["weapons"][weap]?.model;
  1306.  
  1307. const sharkModel = scene["entity"]["_entityManager"]["mWnwM"]["systemManager"]["_systems"]["0"]["_queries"]["player"]["entities"]["0"]["_components"]["35"]["weapons"].Shark?.model;
  1308. const bayonetModel = scene["entity"]["_entityManager"]["mWnwM"]["systemManager"]["_systems"]["0"]["_queries"]["player"]["entities"]["0"]["_components"]["35"]["weapons"].Bayonet?.model;
  1309. const tomahawkModel = scene["entity"]["_entityManager"]["mWnwM"]["systemManager"]["_systems"]["0"]["_queries"]["player"]["entities"]["0"]["_components"]["35"]["weapons"].Tomahawk?.model;
  1310.  
  1311. if (weaponModel?.parent?.children[0]) armsMaterial = weaponModel.parent.children[0].material;
  1312.  
  1313. const weaponMaterial = weaponModel?.children[num].material;
  1314. const sharkMaterial = sharkModel?.children[2]?.material;
  1315. const bayonetMaterial = bayonetModel?.children[1]?.material;
  1316. const tomahawkMaterial = tomahawkModel?.children[1]?.material;
  1317.  
  1318.  
  1319. if (armsMaterial) armsMaterial.visible = arms;
  1320.  
  1321. if (hideWeaponsAds) {
  1322.  
  1323. if (weaponMaterial) weaponMaterial.visible = !scoped;
  1324. if (sharkMaterial) sharkMaterial.visible = !scoped;
  1325. if (bayonetMaterial) bayonetMaterial.visible = !scoped;
  1326. if (tomahawkMaterial) tomahawkMaterial.visible = !scoped;
  1327. }
  1328.  
  1329. if (inspecting) {
  1330. if (!prevInsp) {
  1331. prevInspectPos = weaponModel.position.clone();
  1332. prevInspectRot = weaponModel.rotation.clone();
  1333. if (weaponModel) inspectedWeapon = weaponModel;
  1334. }
  1335. weaponModel.rotation.x = 0;
  1336. weaponModel.rotation.y = -0.3;
  1337. weaponModel.rotation.z = -0.4;
  1338.  
  1339. weaponModel.position.y = 0.05;
  1340. weaponModel.position.z = -0.08;
  1341. } else {
  1342. if (prevInsp) {
  1343. inspectedWeapon.rotation.x = prevInspectRot.x;
  1344. inspectedWeapon.rotation.y = prevInspectRot.y;
  1345. inspectedWeapon.rotation.z = prevInspectRot.z;
  1346.  
  1347. inspectedWeapon.position.y = prevInspectPos.y;
  1348. inspectedWeapon.position.z = prevInspectPos.z;
  1349. }
  1350. }
  1351.  
  1352. prevInsp = inspecting;
  1353.  
  1354. if (wireframeArms && armsMaterial) {
  1355. setWireframe(true, armsMaterial);
  1356. } else if (prevWireframeArms && armsMaterial) {
  1357. setWireframe(false, armsMaterial);
  1358. }
  1359.  
  1360. if (wireframeWeapons) {
  1361. if (weaponMaterial) setWireframe(true, weaponMaterial);
  1362. if (sharkMaterial) setWireframe(true, sharkMaterial);
  1363. if (bayonetMaterial) setWireframe(true, bayonetMaterial);
  1364. if (tomahawkMaterial) setWireframe(true, tomahawkMaterial);
  1365. } else if (prevWireframeWeapons) {
  1366. if (weaponMaterial) setWireframe(false, weaponMaterial);
  1367. if (sharkMaterial) setWireframe(false, sharkMaterial);
  1368. if (bayonetMaterial) setWireframe(false, bayonetMaterial);
  1369. if (tomahawkMaterial) setWireframe(false, tomahawkMaterial);
  1370. }
  1371.  
  1372. prevWireframeWeapons = wireframeWeapons;
  1373. prevWireframeArms = wireframeArms;
  1374.  
  1375. } catch{
  1376. }
  1377.  
  1378. try {
  1379.  
  1380. try {
  1381. playerStructs = {}
  1382.  
  1383. if (playerList?.$items) {
  1384.  
  1385. for (let key of playerList.$items.keys()) {
  1386. const e = playerList?.$items.get(key);
  1387. if (e && e.sessionId) playerStructs[e.sessionId] = new Player(e.spawnProtected, e.wName);
  1388. }
  1389.  
  1390. /*for (let i = 0; i < playerList.$items.size; i++) {
  1391. const e = playerList?.$items[i];
  1392. console.log(e)
  1393. if (e && e.sessionId) playerStructs[e.sessionId] = new Player(e.spawnProtected, e.wName);
  1394. }*/
  1395. }
  1396. } catch{
  1397. }
  1398.  
  1399.  
  1400. let localPlayerClass = scene["children"]["0"]["parent"]["entity"]["_entityManager"]["mWnwM"]["systemManager"]["_systems"]["0"]["_queries"]["player"]["entities"]["0"]["_components"]["38"].wnWmN;
  1401.  
  1402. let qNum = 2;
  1403.  
  1404. if (!scene["entity"]["_entityManager"]["mWnwM"]["systemManager"]["_systems"]["2"]["_queries"].players) qNum = 3;
  1405.  
  1406. for (let i = 0; i < scene["entity"]["_entityManager"]["mWnwM"]["systemManager"]["_systems"][qNum]["_queries"].players.entities.length; i++) {
  1407.  
  1408. let player = scene["entity"]["_entityManager"]["mWnwM"]["systemManager"]["_systems"][qNum]["_queries"].players.entities[i]["_components"];
  1409. let mat = scene["entity"]["_entityManager"]["mWnwM"]["systemManager"]["_systems"][qNum]["_queries"].players.entities[i]["_components"][0].value.children[0].children[0].children[1].material;
  1410.  
  1411. if (!playerHighLight) continue;
  1412.  
  1413. let color = hexToRgb("#0000ff");
  1414. if (!localPlayerClass.team || localPlayerClass.team !== player["50"].team) {
  1415. color = hexToRgb("#ff0000");
  1416. if (weaponHighlighter) color = hexToRgb(weaponColors[playerStructs[player["50"].sessionId].wName]);
  1417. if (playerStructs[player["50"].sessionId].spawnProtected) color = hexToRgb('#ff2222');
  1418. }
  1419.  
  1420. let r = (rgbHighlight ? redHighlight : color.r) / 255;
  1421. let g = (rgbHighlight ? greenHighlight : color.g) / 255;
  1422. let b = (rgbHighlight ? blueHighlight : color.b) / 255;
  1423.  
  1424. let matCpy = mat.clone();
  1425.  
  1426. matCpy.map = null;
  1427.  
  1428. matCpy.color.r = r;
  1429. matCpy.color.g = g;
  1430. matCpy.color.b = b;
  1431.  
  1432. matCpy.needsUpdate = true;
  1433.  
  1434. scene["entity"]["_entityManager"]["mWnwM"]["systemManager"]["_systems"][qNum]["_queries"].players.entities[i]["_components"][0].value.children[0].children[0].children[1].material = matCpy;
  1435.  
  1436. }
  1437. } catch{
  1438. }
  1439.  
  1440. }
  1441.  
  1442. animate();
  1443.  
  1444.  
  1445. window.XMLHttpRequest = class extends window.XMLHttpRequest {
  1446.  
  1447. get responseText() {
  1448. if (this.invReq) {
  1449. this.invReq = false;
  1450. let entries = JSON.parse(this.responseText);
  1451. let sortedItems = {mythical: [], legendary: [], epic: [], rare: [], common: []};
  1452.  
  1453. for (let entry of entries) {
  1454. sortedItems[entry.item.rarity.toLowerCase()].push(entry);
  1455. }
  1456.  
  1457. let editEntries = [];
  1458. for (let rarity in sortedItems) {
  1459. editEntries = [].concat(editEntries, sortedItems[rarity]);
  1460. }
  1461.  
  1462. return JSON.stringify(editEntries);
  1463. }
  1464.  
  1465. return super.responseText;
  1466. }
  1467.  
  1468. open(method, url) {
  1469. if (url === "https://api.kirka.io/api/inventory") this.invReq = true;
  1470. return super.open(...arguments);
  1471. }
  1472. }
  1473.  
  1474.  
  1475. function minutesLeft(e) {
  1476. return Math.ceil((480 - (Date.now() - Date.parse(e)) / 1000));
  1477. }
  1478.  
  1479. document.onkeydown = event => {
  1480. if (event.key === "F8" && autoJoin) {
  1481. responseCount = 0;
  1482. allLobbyData = [];
  1483.  
  1484. fetch('https://eu1.kirka.io/matchmake')
  1485. .then(response => response.json())
  1486. .then(dataEU => {
  1487.  
  1488. for (let i = 0; i < dataEU.length; i++) {
  1489. dataEU[i].region = "EU";
  1490. }
  1491. if (euLobbies) {
  1492. for (let i = 0; i < dataEU.length; i++) {
  1493. allLobbyData.push(dataEU[i]);
  1494. }
  1495. }
  1496. responseCount++;
  1497. checkSearchLobby();
  1498. });
  1499. fetch('https://na1.kirka.io/matchmake')
  1500. .then(response => response.json())
  1501. .then(dataNA => {
  1502.  
  1503. for (let i = 0; i < dataNA.length; i++) {
  1504. dataNA[i].region = "NA";
  1505. }
  1506. if (naLobbies) {
  1507. for (let i = 0; i < dataNA.length; i++) {
  1508. allLobbyData.push(dataNA[i]);
  1509. }
  1510. }
  1511. responseCount++;
  1512. checkSearchLobby();
  1513. });
  1514. fetch('https://asia1.kirka.io/matchmake')
  1515. .then(response => response.json())
  1516. .then(dataASIA => {
  1517.  
  1518. for (let i = 0; i < dataASIA.length; i++) {
  1519. dataASIA[i].region = "ASIA";
  1520. }
  1521. if (asiaLobbies) {
  1522. for (let i = 0; i < dataASIA.length; i++) {
  1523. allLobbyData.push(dataASIA[i]);
  1524. }
  1525. }
  1526. responseCount++;
  1527. checkSearchLobby();
  1528. });
  1529. }
  1530. }
  1531.  
  1532. function checkSearchLobby() {
  1533. if (responseCount < 3) return;
  1534.  
  1535. console.log(allLobbyData);
  1536.  
  1537. if (parkourLobbies) {
  1538. gameModes.push('ParkourRoom');
  1539. }
  1540. if (ffaLobbies) {
  1541. gameModes.push('DeathmatchRoom');
  1542. }
  1543. if (tdmLobbies) {
  1544. gameModes.push('TeamDeathmatchRoom');
  1545. }
  1546.  
  1547. let fittingLobbies = [];
  1548. for (let i = 0; i < allLobbyData.length; i++) {
  1549. if (allLobbyData[i].metadata.custom === true && !customGames) continue;
  1550. if (allLobbyData[i].locked === false && allLobbyData[i].clients >= minPlayers && allLobbyData[i].clients <= maxPlayers && gameModes.includes(allLobbyData[i].name) && minutesLeft(allLobbyData[i].createdAt) >= minTimeLeft && (maps.includes(allLobbyData[i].metadata.mapName.toLowerCase()) || !filterMaps)) {
  1551. if (avoidSameLobby) {
  1552. if (!currentURL.includes(allLobbyData[i].roomId)) {
  1553. fittingLobbies.push(allLobbyData[i]);
  1554. }
  1555. } else {
  1556. fittingLobbies.push(allLobbyData[i]);
  1557. }
  1558. }
  1559. }
  1560.  
  1561. if (fittingLobbies.length !== 0) {
  1562. bestLobby = fittingLobbies[0];
  1563. if (fittingLobbies.length > 0) {
  1564. for (let i = 0; i < fittingLobbies.length; i++) {
  1565. if (bestLobby.clients < fittingLobbies[i].clients) {
  1566. bestLobby = fittingLobbies[i];
  1567. } else if (bestLobby.clients === fittingLobbies[i].clients) {
  1568. if (minutesLeft(bestLobby.createdAt) < minutesLeft(fittingLobbies[i].createdAt)) {
  1569. bestLobby = fittingLobbies[i];
  1570. }
  1571. }
  1572. }
  1573. }
  1574. } else if (preferredFilter === 'Time') {
  1575. bestLobby = fittingLobbies[0];
  1576. if (fittingLobbies.length > 0) {
  1577. for (let i = 0; i < fittingLobbies.length; i++) {
  1578. if (minutesLeft(bestLobby.createdAt) < minutesLeft(fittingLobbies[i].createdAt)) {
  1579. bestLobby = fittingLobbies[i];
  1580. }
  1581. }
  1582. }
  1583. }
  1584. if (fittingLobbies.length !== 0 && bestLobby !== '') {
  1585. let joinURL = 'https://kirka.io/games/' + bestLobby.region + '~' + bestLobby.roomId;
  1586. window.location.href = joinURL;
  1587. } else alert('No Lobby found - consider changing your settings'); //popup ohne alert?
  1588. }
  1589.  
  1590.  
  1591. Object.defineProperty(Object.prototype, '_players', {
  1592. set(v) {
  1593. this._p = v;
  1594. playerList = v;
  1595. },
  1596. get() {
  1597. return this._p;
  1598. }
  1599. });
  1600.  
  1601. let oldDefine = Object.defineProperty;
  1602. Object.defineProperty = (...args) => {
  1603. if (args[0] && args[1] && args[1] === 'renderer' && args[0].constructor.name.startsWith('_0x')) {
  1604. if (args[0].WnNMwm) {
  1605. Object.defineProperty(args[0].camera, "fov", {
  1606. get() {
  1607. let returnValue = Number.parseInt(args[0].WnNMwm.fov);
  1608. if (!adspower && this.vFov) returnValue = this.vFov;
  1609. return returnValue;
  1610. },
  1611. set(v) {
  1612. this.vFov = v;
  1613. }
  1614. });
  1615. }
  1616. }
  1617. return oldDefine(...args);
  1618. }
  1619.  
  1620. Object.defineProperty(Object.prototype, 'gain', {
  1621. set(v) {
  1622. if (v.gain) {
  1623. v.gain.value = volume;
  1624. gains.push(v.gain);
  1625. }
  1626. this._v = v;
  1627. },
  1628. get() {
  1629. return this._v;
  1630. }
  1631. });
  1632.  
  1633. Object.defineProperty(Audio.prototype, 'muted', {
  1634. set(v) {
  1635. },
  1636. get() {
  1637. return noKillSound;
  1638. }
  1639. });
  1640.  
  1641.  
  1642. function setWireframe(bool, material) {
  1643. material.wireframe = bool;
  1644. material.color.r = bool ? redWireframe / 255 : 1;
  1645. material.color.g = bool ? greenWireframe / 255 : 1;
  1646. material.color.b = bool ? blueWireframe / 255 : 1;
  1647. }
  1648.  
  1649.  
  1650. function toggleGui() {
  1651. menuVisible = !menuVisible;
  1652. if (menuVisible) {
  1653. document.exitPointerLock();
  1654. gui.style.display = 'inline-block';
  1655. } else {
  1656. gui.style.display = 'none';
  1657. }
  1658. settings.set('menuOpen', menuVisible);
  1659. }
  1660.  
  1661. function hexToRgb(hex) {
  1662. let result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  1663. return result ? {
  1664. r: parseInt(result[1], 16),
  1665. g: parseInt(result[2], 16),
  1666. b: parseInt(result[3], 16)
  1667. } : null;
  1668. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement