krunker tips

Krunker Dogeware Source Code

  1. // ==UserScript==
  2. // @name Krunker Dogeware – by The Gaming Gurus
  3. // @description The most advanced krunker cheat
  4. // @version 3.9.8
  5. // @author ©2021 Skid Lamer – The Gaming Gurus™
  6. // @supportURL https://skidlamer.github.io/wp
  7. // @homepage https://skidlamer.github.io/
  8. // @icon https://i.imgur.com/jjkFpnV.gif
  9. // @namespace https://greasyfork.org/users/704479
  10. // @include /^https?\:\/\/krunker\..*\/.*$/
  11. // @include /^https?\:\/\/.*.browserfps\..*\/.*$/
  12. // @exclude *://krunker.io/editor*
  13. // @exclude *://krunker.io/social*
  14. // @run-at document-start
  15. // @grant none
  16. // @noframes
  17. // ==/UserScript==
  18.  
  19. /* eslint-env es6 */
  20. /* eslint-disable curly, no-undef, no-loop-func, no-return-assign, no-sequences */
  21.  
  22. // License Donationware
  23.  
  24. // Amazon Giftcards Accepted – Send to : skidlamer@mail.com
  25.  
  26. // BTC: 3CsDVq96KgmyPjktUe1YgVSurJVe7LT53G
  27. // ETH: 0x5dbF713F95F7777c84e6EFF5080e2f0e0724E8b1
  28. // ETC: 0xF59BEbe25ECe2ac3373477B5067E07F2284C70f3
  29.  
  30. (function(dogStr, dog) {
  31.  
  32. function Log() {
  33. this.info = (str, args = []) => this.log(‘info’, str, args);
  34. this.warn = (str, args = []) => this.log(‘warn’, str, args);
  35. this.error = (str, args = []) => this.log(‘error’, str, args);
  36. this.log = (level, str, args) => {
  37. let colour = [];
  38. switch(level) {
  39. case ‘info’:colour=[“#07a1d5”, “#6e07d5”];break;
  40. case ‘error’:colour=[“#d50707”, “#d53a07”];break;
  41. case ‘warn’:colour=[“#d56e07”, “#d5d507”];break;
  42. }
  43. console.log(‘%c ‘.concat(‘[ ‘, level.toUpperCase(), ‘ ] ‘), [
  44. `background: linear-gradient(${colour[0]}, ${colour[1]})`
  45. , ‘border: 1px solid #3E0E02’
  46. , ‘color: white’
  47. , ‘display: block’
  48. , ‘text-shadow: 0 1px 0 rgba(0, 0, 0, 0.3)’
  49. , ‘box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4) inset, 0 5px 3px -5px rgba(0, 0, 0, 0.5), 0 -13px 5px -10px rgba(255, 255, 255, 0.4) inset’
  50. , ‘line-height: 12px’
  51. , ‘text-align: center’
  52. , ‘font-weight: bold’
  53. ].join(‘;’))
  54. if (args.length) console.log(str, args);
  55. else console.log(str);
  56. }
  57. } var log = new Log();
  58.  
  59. class Dogeware {
  60. constructor() {
  61. dog = this;
  62. //this.token = null;
  63. //this.gameJS = null;
  64. //this.generated = false;
  65. console.dir(this);
  66. this.settings = Object.assign({}, {
  67. aimbot: 1,
  68. superSilent: true,
  69. AImbot: true,
  70. frustumCheck: false,
  71. weaponZoom: 1.0,
  72. wallbangs: true,
  73. alwaysAim: false,
  74. pitchHack: 0,
  75. thirdPerson: false,
  76. autoReload: false,
  77. speedHack: false,
  78. rangeCheck: false,
  79. alwaysTrail: false,
  80. spinAimFrames: 10,
  81. animatedBillboards: false,
  82. esp: 1,
  83. espFontSize: 10,
  84. tracers: false,
  85. showGuiButton: true,
  86. awtv: false,
  87. uwtv: false,
  88. forceUnsilent: false,
  89. bhop: 0,
  90. spinBot: false,
  91. markTarget: true,
  92. skinHack: false,
  93. aimOffset: 0,
  94. aimNoise: 0,
  95. keybinds: true,
  96. antikick: true,
  97. fovbox: false,
  98. drawFovbox: true,
  99. fovBoxSize: 1,
  100. guiOnMMB: false,
  101. hideAdverts: false,
  102. hideStreams: false,
  103. hideMerch: false,
  104. hideNewsConsole: false,
  105. hideCookieButton: false,
  106. chams: false,
  107. chamsCol: 1,
  108. wireframe: false,
  109. kpalCSS: true,
  110. customCSS: “”,
  111. teamChams: false,
  112. autoNuke: false,
  113. chamsInterval: 500,
  114. preventMeleeThrowing: false,
  115. //autoSwap: false,
  116. forceNametagsOn: false,
  117. aimbotRange: 0,
  118. });
  119. this.state = Object.assign({}, {
  120. bindAimbotOn: true,
  121. quickscopeCanShoot: true,
  122. spinFrame: 0,
  123. pressedKeys: new Set(),
  124. spinCounter: 0,
  125. activeTab: 0,
  126. nameTags: false,
  127. frame: 0
  128. });
  129. this.gaybow = 0;
  130. this.colors = {
  131. White: “#FFFFFF”,
  132. Black: “#000000”,
  133. Purple: “#9400D3”,
  134. Pink: “#FF1493”,
  135. Blue: “#1E90FF”,
  136. DarkBlue: “#0000FF”,
  137. Aqua: “#00FFFF”,
  138. Green: “#008000”,
  139. Lime: “#7FFF00”,
  140. Orange: “#FF8C00”,
  141. Yellow: “#FFFF00”,
  142. Red: “#FF0000”,
  143. }
  144. //this.vars = {};
  145. this.isProxy = Symbol(“isProxy”);
  146. this.GUI = {};
  147. try {
  148. this.onLoad();
  149. } catch (e) {
  150. console.error(e);
  151. console.trace(e.stack);
  152. }
  153. }
  154.  
  155. onLoad() {
  156.  
  157. //this.waitFor(_=>document.documentElement instanceof window.HTMLElement).then(_=>{
  158. // this.iframe();
  159. //})
  160. //this.createObservers();
  161. this.defines();
  162. localStorage.kro_setngss_json ? Object.assign(this.settings, JSON.parse(localStorage.kro_setngss_json)) :
  163. localStorage.kro_setngss_json = JSON.stringify(this.settings);
  164. this.createListeners();
  165. this.hooking();
  166. /*
  167. this.waitFor(_=>this.token).then(_ => {
  168. if (!this.token) location.reload();
  169. this.version = /\[‘exports’]\[‘gameVersion’]='(\d+\.\d+\.\d+)’,/.exec(this.gameJS)[1];
  170. if ( this.isElectron() || !this.isDefined(GM) ) {
  171. const loader = new Function(“WP_fetchMMToken”, “Module”, this.gamePatch());
  172. loader(new Promise(res=>res(this.token)), { csv: async () => 0 });
  173. } else if (GM.info.script.version !== this.version) {
  174.  
  175. if (confirm(‘This Script Needs Updating by Skidlamer, visit The GamingGurus Discord now?\n\nCancel will attempt to use the script anyway \n(CHANCE OF BAN)’)) {
  176. return window.location.assign(“https://skidlamer.github.io/wp”);
  177. } else {
  178. const loader = new Function(“WP_fetchMMToken”, “Module”, this.gamePatch());
  179. loader(new Promise(res=>res(this.token)), { csv: async () => 0 });
  180. return this.hooking();
  181. }
  182.  
  183. } else {
  184. const loader = new Function(“WP_fetchMMToken”, “Module”, this.gamePatch());
  185. loader(new Promise(res=>res(this.token)), { csv: async () => 0 });
  186. }
  187. return this.hooking();
  188. })*/
  189. }
  190.  
  191. isType(item, type) {
  192. return typeof item === type;
  193. }
  194.  
  195. isDefined(item) {
  196. return !this.isType(item, “undefined”) && item !== null;
  197. }
  198.  
  199. objectHas(obj, arr) {
  200. return arr.some(prop => obj.hasOwnProperty(prop));
  201. }
  202.  
  203. createElement(type, html, id) {
  204. let newElement = document.createElement(type)
  205. if (id) newElement.id = id
  206. newElement.innerHTML = html
  207. return newElement
  208. }
  209.  
  210. getVersion() {
  211. //const elems = document.getElementsByClassName(‘terms’);
  212. //const version = elems[elems.length – 1].innerText;
  213. return this.version//version;
  214. }
  215.  
  216. isElectron() {
  217. // Renderer process
  218. if (typeof window !== ‘undefined’ && typeof window.process === ‘object’ && window.process.type === ‘renderer’) {
  219. return true;
  220. }
  221.  
  222. // Main process
  223. if (typeof process !== ‘undefined’ && typeof process.versions === ‘object’ && !!process.versions.electron) {
  224. return true;
  225. }
  226.  
  227. // Detect the user agent when the `nodeIntegration` option is set to true
  228. if (typeof navigator === ‘object’ && typeof navigator.userAgent === ‘string’ && navigator.userAgent.indexOf(‘Electron’) >= 0) {
  229. return true;
  230. }
  231.  
  232. return false;
  233. }
  234.  
  235. saveAs(name, data) {
  236. let blob = new Blob([data], {
  237. type: ‘text/plain’
  238. });
  239. let el = window.document.createElement(“a”);
  240. el.href = window.URL.createObjectURL(blob);
  241. el.download = name;
  242. window.document.body.appendChild(el);
  243. el.click();
  244. window.document.body.removeChild(el);
  245. }
  246.  
  247. saveScript() {
  248. this.fetchScript().then(script => {
  249. this.saveAs(“game_” + this.getVersion() + “.js”, script)
  250. })
  251. }
  252.  
  253. /*
  254. gamePatch() {
  255. let entries = {
  256. inView: {
  257. regex: /(\w+\[‘(\w+)’]\){if\(\(\w+=\w+\[‘\w+’]\[‘position’]\[‘clone’]\(\))/,
  258. index: 2
  259. },
  260. procInputs: {
  261. regex: /this\[‘(\w+)’]=function\((\w+),(\w+),\w+,\w+\){(this)\[‘recon’]/,
  262. index: 1
  263. },
  264. aimVal: {
  265. regex: /this\[‘(\w+)’]-=0x1\/\(this\[‘weapon’]\[‘\w+’]\/\w+\)/,
  266. index: 1
  267. },
  268. didShoot: {
  269. regex: /–,\w+\[‘(\w+)’]=!0x0/,
  270. index: 1
  271. },
  272. nAuto: {
  273. regex: /’Single\\x20Fire’,’varN’:'(\w+)’/,
  274. index: 1
  275. },
  276. crouchVal: {
  277. regex: /this\[‘(\w+)’]\+=\w\[‘\w+’]\*\w+,0x1<=this\[‘\w+’]/,
  278. index: 1
  279. },
  280. ammos: {
  281. regex: /\[‘length’];for\(\w+=0x0;\w+<\w+\[‘(\w+)’]\[‘length’]/,
  282. index: 1
  283. },
  284. weaponIndex: {
  285. regex: /\[‘weaponConfig’]\[\w+]\[‘secondary’]&&\(\w+\[‘(\w+)’]==\w+/,
  286. index: 1
  287. },
  288. objInstances: {
  289. regex: /\w+\[‘\w+’]\(0x0,0x0,0x0\);if\(\w+\[‘(\w+)’]=\w+\[‘\w+’]/,
  290. index: 1
  291. },
  292. //reloadTimer: {regex: /this\[‘(\w+)’]&&\(\w+\[‘\w+’]\(this\),\w+\[‘\w+’]\(this\)/, index: 1},
  293. reloadTimer: {
  294. regex: /0x0>=this\[‘(\w+’)]&&0x0>=this\[‘swapTime’]/,
  295. index: 1
  296. },
  297. recoilAnimY: {
  298. regex: /this\[‘(\w+)’]\+=this\[‘\w+’]\*\(/,
  299. index: 1
  300. },
  301. maxHealth: {
  302. regex: /this\[‘health’]\/this\[‘(\w+)’]\?/,
  303. index: 1
  304. },
  305. //xVel: { regex: /this\[‘x’]\+=this\[‘(\w+)’]\*\w+\[‘map’]\[‘config’]\[‘speedX’]/, index: 1 },
  306. yVel: {
  307. regex: /this\[‘(\w+)’]=this\[‘\w+’],this\[‘visible’]/,
  308. index: 1
  309. },
  310. //zVel: { regex: /this\[‘z’]\+=this\[‘(\w+)’]\*\w+\[‘map’]\[‘config’]\[‘speedZ’]/, index: 1 },
  311. // Patches
  312. socket: {
  313. regex: /\[‘onopen’]=\(\)=>{/,
  314. patch: `$&${dogStr}.socket=this;`
  315. },
  316. //frustum: {regex: /(;const (\w+)=this\[‘frustum’]\[‘containsPoint’];.*?return)!0x1/, patch: “$1 $2”},
  317. //videoAds: {regex: /!function\(\){var \w+=document\[‘createElement’]\(‘script’\);.*?}\(\);/, patch: “”},
  318. anticheat1:{regex: /&&\w+\(\),window\[‘utilities’]&&\(\w+\(null,null,null,!0x0\),\w+\(\)\)/, patch: “”},
  319. //anticheat2:{regex: /(\[]instanceof Array;).*?(var)/, patch: “$1 $2”},
  320. anticheat3:{regex: /windows\[‘length’\]>\d+.*?0x25/, patch: `0x25`},
  321. //anticheat4:{regex: /(\w+\=)\(!menuItemContainer\[‘innerHTML’]\[‘includes’].*?\);/, patch: `$1false;`},
  322. //anticheat4:{regex: /kro_utilities_/g, patch: `K_P_A_L__IS__A__G_A_Y__P_E_D_O`},
  323. //kpal:{regex: /1tWAEJx/g, patch: `K_P_A_L__IS__A__G_A_Y__P_E_D_O`},
  324. //kpal2:{regex: /jjkFpnV/g, patch: `K_P_A_L__IS__A__G_A_Y__P_E_D_O`},
  325.  
  326. writeable: {
  327. regex: /’writeable’:!0x1/g,
  328. patch: “writeable:true”
  329. },
  330. configurable: {
  331. regex: /’configurable’:!0x1/g,
  332. patch: “configurable:true”
  333. },
  334. typeError: {
  335. regex: /throw new TypeError/g,
  336. patch: “console.error”
  337. },
  338. error: {
  339. regex: /throw new Error/g,
  340. patch: “console.error”
  341. },
  342. //exports: {regex: /(this\[‘\w+’]\[‘\w+’]\(this\);};},function\(\w+,\w+,(\w+)\){)/, patch: `$1 ${dogStr}.exports=$2.c; ${dogStr}.modules=$2.m;`},
  343. inputs: {
  344. regex: /(\w+\[‘\w+’]\[\w+\[‘\w+’]\[‘\w+’]\?’\w+’:’push’]\()(\w+)\),/,
  345. patch: `$1${dogStr}.inputs($2)),`
  346. },
  347. nametags: {
  348. regex: /&&(\w+\[‘\w+’])\){(if\(\(\w+=\w+\[‘\w+’]\[‘\w+’]\[‘\w+’])/,
  349. patch: `){if(!$1&&!${dogStr}.state.nameTags)continue;$2`
  350. },
  351. wallbangs: {
  352. regex: /!(\w+)\[‘transparent’]/,
  353. patch: `${dogStr}.settings.wallbangs?!$1.penetrable : !$1.transparent`
  354. },
  355. thirdPerson: {
  356. regex: /(\w+)\[\’config\’\]\[\’thirdPerson\’\]/g,
  357. patch: `${dogStr}.settings.thirdPerson`
  358. },
  359. };
  360. let script = this.gameJS;
  361. for (let name in entries) {
  362. let object = entries[name];
  363. let found = object.regex.exec(script);
  364. if (object.hasOwnProperty(‘index’)) {
  365. if (!found) {
  366. object.val = null;
  367. //alert(“Failed to Find ” + name);
  368. console.error(“Failed to Find ” + name);
  369. } else {
  370. object.val = found[object.index];
  371. console.log(“Found “, name, “:”, object.val);
  372. }
  373. Object.defineProperty(dog.vars, name, {
  374. configurable: false,
  375. value: object.val
  376. });
  377. } else if (found) {
  378. script = script.replace(object.regex, object.patch);
  379. console.log(“Patched “, name);
  380. } else console.error(“Failed to Patch ” + name); //alert(“Failed to Patch ” + name);
  381. }
  382. return script;
  383. }
  384. */
  385.  
  386. async fetchScript() {
  387. const data = await this.request(“https://krunker.io/social.html”, “text”);
  388. const buffer = await this.request(“https://krunker.io/pkg/krunker.” + /\w.exports=”(\w+)”/.exec(data)[1] + “.vries”, “arrayBuffer”);
  389. const array = Array.from(new Uint8Array(buffer));
  390. const xor = array[0] ^ ‘!’.charCodeAt(0);
  391. return array.map((code) => String.fromCharCode(code ^ xor)).join(”);
  392. }
  393.  
  394. async request(url, type, opt = {}) {
  395. return fetch(url, opt).then(response => {
  396. if (!response.ok) {
  397. throw new Error(“Network response from ” + url + ” was not ok”)
  398. }
  399. return response[type]()
  400. })
  401. }
  402.  
  403. async waitFor(test, timeout_ms = 2e4, doWhile = null) {
  404. let sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
  405. return new Promise(async (resolve, reject) => {
  406. if (typeof timeout_ms != “number”) reject(“Timeout argument not a number in waitFor(selector, timeout_ms)”);
  407. let result, freq = 100;
  408. while (result === undefined || result === false || result === null || result.length === 0) {
  409. if (doWhile && doWhile instanceof Function) doWhile();;
  410. if (timeout_ms % 10000 < freq) console.log(“waiting for: “, test);
  411. if ((timeout_ms -= freq) < 0) {
  412. console.log(“Timeout : “, test);
  413. resolve(false);
  414. return;
  415. }
  416. await sleep(freq);
  417. result = typeof test === “string” ? Function(test)() : test();
  418. }
  419. console.log(“Passed : “, test);
  420. resolve(result);
  421. });
  422. };
  423.  
  424. async hooking() {
  425. await this.waitFor(_ => this.isDefined(this.socket))
  426. if (!this.isDefined(this.socket)) location.assign(location.origin);
  427. this.socket.send = new Proxy(this.socket.send, {
  428. apply(target, that, args) {
  429. if (args[0] === “en”) {
  430. //args[ args.length – 1 ] = true; // AntiPedo
  431. that.skinCache = {
  432. main: args[1][2][0],
  433. secondary: args[1][2][1],
  434. hat: args[1][3],
  435. body: args[1][4],
  436. knife: args[1][9],
  437. dye: args[1][14],
  438. waist: args[1][17],
  439. }
  440. }
  441. return Reflect.apply(…arguments);
  442. }
  443. })
  444. this.socket._dispatchEvent = new Proxy(this.socket._dispatchEvent, {
  445. apply(target, that, args) {
  446. if (dog.settings.skinHack && that.skinCache && args[0] === “0”) {
  447. let pInfo = args[1][0];
  448. let pSize = 38;
  449. while (pInfo.length % pSize !== 0) pSize++;
  450. for (let i = 0; i < pInfo.length; i += pSize) {
  451. if (pInfo[i] === that.socketId || 0) {
  452. pInfo[i + 12] = [that.skinCache.main, that.skinCache.secondary];
  453. pInfo[i + 13] = that.skinCache.hat;
  454. pInfo[i + 14] = that.skinCache.body;
  455. pInfo[i + 19] = that.skinCache.knife;
  456. pInfo[i + 24] = that.skinCache.dye;
  457. pInfo[i + 33] = that.skinCache.waist;
  458. }
  459. }
  460. }
  461.  
  462. return target.apply(that, args);
  463. }
  464. })
  465.  
  466. await this.waitFor(_ => this.isDefined(this.overlay))
  467. this.ctx = this.overlay.canvas.getContext(‘2d’);
  468. this.overlay.render = new Proxy(this.overlay.render, {
  469. apply(target, that, args) {
  470. [“scale”, “game”, “controls”, “renderer”, “me”].forEach((item, index) => {
  471. dog[item] = args[index]
  472. });
  473. Reflect.apply(…arguments);
  474. if (dog.me && dog.ctx) {
  475. dog.ctx.save();
  476. dog.ctx.scale(dog.scale, dog.scale);
  477. dog.render();
  478. dog.ctx.restore();
  479.  
  480. if (!dog.me.procInputs[dog.isProxy]) {
  481. dog.me.procInputs = new Proxy(dog.me.procInputs, {
  482. apply: function(target, that, [input, game, recon, lock]) {
  483. if (that) dog.inputs(input);
  484. return target.apply(that, [input, game, recon, lock]);
  485. },
  486. get: function(target, key) {
  487. return key === dog.isProxy ? true : Reflect.get(target, key);
  488. },
  489. })
  490. }
  491. // Wallbangs
  492. dog.game.map.manager.objects.filter(x => {
  493. return x.penetrable
  494. }).map((obj, index, array) => {
  495. obj.transparent=dog.settings.wallbangs;
  496. });
  497. }
  498. }
  499. })
  500.  
  501. this.cleanGUI();
  502. this.customCSS();
  503. await this.waitFor(_ => this.isDefined(window.windows));
  504. this.initGUI();
  505. }
  506.  
  507. defines() {
  508. const $origSkins = Symbol(“origSkins”),
  509. $localSkins = Symbol(“localSkins”);
  510.  
  511. Object.defineProperties(Object.prototype, {
  512. //isFaceIT: {
  513. // get() { return true }
  514. //},
  515. canvas: {
  516. set(val) {
  517. this._value = val;
  518. },
  519. get() {
  520. let object = this;
  521. if (dog.objectHas(object, [“healthColE”, “healthColT”, “dmgColor”])) {
  522. dog.overlay = this;
  523. }
  524. return this._value;
  525. }
  526. },
  527. RENDER: {
  528. set(val) {
  529. this._value = val;
  530. dog.renderer = this._value;
  531. dog.renderer.adsFovMlt.fill(dog.settings.weaponZoom)
  532. dog.fxComposer = this;
  533. },
  534. get() {
  535. return this._value;
  536. }
  537. },
  538. OBJLoader: {
  539. set(val) {
  540. dog.three = this;
  541. this._value = val;
  542. },
  543. get() {
  544. return this._value;
  545. }
  546. },
  547. skins: {
  548. set(fn) {
  549. this[$origSkins] = fn;
  550. if (void 0 == this.localSkins || !this.localSkins.length) {
  551. this[$localSkins] = Array.apply(null, Array(5e3)).map((x, i) => {
  552. return {
  553. ind: i,
  554. cnt: 0x1,
  555. }
  556. })
  557. }
  558. return fn;
  559. },
  560. get() {
  561. return dog.settings.skinHack && this.stats ? this[$localSkins] : this[$origSkins];
  562. }
  563. },
  564. useLooseClient: {
  565. enumerable: false,
  566. get() {
  567. return this._ulc
  568. },
  569. set(v) {
  570. dog.config = this
  571. // Increase the rate in which inView is updated to every frame, making aimbot way more responsive
  572. Object.defineProperty(this, “nameVisRate”, {
  573. value: 0,
  574. writable: false,
  575. configurable: true,
  576. })
  577. this._ulc = v
  578. }
  579. },
  580. trail: { // All weapon tracers
  581. enumerable: false,
  582. get() {
  583. return dog.settings.alwaysTrail || this._trail
  584. },
  585. set(v) {
  586. this._trail = v
  587. }
  588. },
  589. showTracers: {
  590. enumerable: false,
  591. get() {
  592. return dog.settings.alwaysTrail || this._showTracers
  593. },
  594. set(v) {
  595. this._showTracers = v
  596. }
  597. },
  598. shaderId: { // Animated billboards
  599. enumerable: false,
  600. get() {
  601. if (this.src && this.src.startsWith(“pubs/”)) return dog.settings.animatedBillboards ? 1 : this.rshaderId;
  602. else return this.rshaderId
  603. },
  604. set(v) {
  605. this.rshaderId = v
  606. }
  607. },
  608. // Clientside prevention of inactivity kick
  609. idleTimer: {
  610. enumerable: false,
  611. get() {
  612. return dog.settings.antikick ? 0 : this._idleTimer
  613. },
  614. set(v) {
  615. this._idleTimer = v
  616. }
  617. },
  618. kickTimer: {
  619. enumerable: false,
  620. get() {
  621. return dog.settings.antikick ? Infinity : this._kickTimer
  622. },
  623. set(v) {
  624. this._kickTimer = v
  625. }
  626. },
  627. cnBSeen: {
  628. set (val) {
  629. this.inView = val;
  630. },
  631. get() {
  632. let isEnemy =!dog.isDefined(dog.me)|| !dog.me.team||dog.me.team !=this.team;
  633. return this.inView||isEnemy&&dog.state.nameTags;
  634. }
  635. },
  636. events: {
  637. set (val) {
  638. if (this.ahNum ===0) {
  639. dog.wsSend = this.send.bind(this);
  640. dog.wsEvent = this._dispatchEvent.bind(this);
  641. dog.socket = this;
  642. }
  643. this._events = val;
  644. },
  645. get() {
  646. return this._events;
  647. }
  648. },
  649. thirdPerson: {
  650. set(val) {
  651. this._thirdPerson = val;
  652. },
  653. get() {
  654. return dog.settings.thirdPerson.val || this._thirdPerson
  655. }
  656. },
  657. });
  658.  
  659. // disable audioparam errors
  660. Object.keys(AudioParam.prototype).forEach(name => {
  661. if (Object.getOwnPropertyDescriptor(AudioParam.prototype, name).get) return
  662. const old = AudioParam.prototype[name]
  663. AudioParam.prototype[name] = function() {
  664. try {
  665. return old.apply(this, arguments)
  666. } catch (e) {
  667. console.log(“AudioParam error:\n” + e)
  668. return false
  669. }
  670. }
  671. })
  672. }
  673.  
  674. iframe() {
  675. const iframe = document.createElement(‘iframe’);
  676. iframe.setAttribute(‘style’, ‘display:none’);
  677. iframe.setAttribute(“id”, dogStr);
  678. iframe.src = location.origin;
  679. document.documentElement.appendChild(iframe);
  680.  
  681. const ifrWin = iframe.contentWindow;
  682. const ifrDoc = iframe.contentDocument?iframe.contentDocument:iframe.contentWindow.document;
  683.  
  684. let skidneySplizy = 0;
  685.  
  686. ifrWin.TextDecoder.prototype.decode = new Proxy(window.TextDecoder.prototype.decode, {
  687. apply: function(target, that, args) {
  688. let string = Reflect.apply(…arguments);
  689. if (string.length > 5e4) {
  690. log.warn(“skidneySplizy = ” + skidneySplizy);
  691. if (skidneySplizy == 0) {
  692. dog.gameJS = string;
  693. } else {
  694. dog.gameJS += string;
  695. } skidneySplizy ++;
  696. //console.log(string.length)
  697. /*
  698. if (!dog.gameJS) {
  699. dog.gameJS = string;
  700. console.log(“1stSTR”);
  701. } else {
  702. dog.gameJS += string;
  703. console.log(“2ndSTR”);
  704. }
  705. */
  706. } //else //console.log(string.length)
  707. if (string.includes(“generate-token”)) dog.generated = true;
  708. else if (string.length == 40||dog.generated) {
  709. dog.token = string;
  710. console.log(“Token “, string);
  711. document.documentElement.removeChild(iframe);
  712. }
  713. return string;
  714. },
  715. });
  716. }
  717.  
  718. createObservers() {
  719.  
  720. let observer = new MutationObserver(mutations => {
  721. for (let mutation of mutations) {
  722. for (let node of mutation.addedNodes) {
  723. if (node.tagName === ‘SCRIPT’) {
  724. if (node.type === “text/javascript” && node.innerHTML.startsWith(“*!”, 1)) {
  725. node.innerHTML = “”;
  726. observer.disconnect();
  727. } else if (node.src) {
  728. //console.log(node.src);
  729. }
  730. }
  731. }
  732. }
  733. });
  734. observer.observe(document, {
  735. childList: true,
  736. subtree: true
  737. });
  738. }
  739.  
  740. createListeners() {
  741.  
  742. window.addEventListener(“mouseup”, (e) => {
  743. if (e.which === 2 && dog.settings.guiOnMMB) {
  744. e.preventDefault()
  745. dog.showGUI()
  746. }
  747. })
  748. window.addEventListener(“keyup”, event => {
  749. if (this.state.pressedKeys.has(event.code)) this.state.pressedKeys.delete(event.code)
  750. if (!(document.activeElement.tagName === “INPUT” || !window.endUI && window.endUI.style.display) && dog.settings.keybinds) {
  751. switch (event.code) {
  752. case “KeyY”:
  753. this.state.bindAimbotOn = !this.state.bindAimbotOn
  754. this.wsEvent(“ch”, [null, (“Aimbot ” + (this.state.bindAimbotOn ? “on” : “off”)), 1])
  755. break
  756. case “KeyH”:
  757. this.settings.esp = (this.settings.esp + 1) % 4
  758. this.wsEvent(“ch”, [null, “ESP: ” + [“disabled”, “nametags”, “box”, “full”][this.settings.esp], 1])
  759. break
  760. }
  761. }
  762. })
  763. window.addEventListener(“keydown”, event => {
  764. if (event.code == “F1”) {
  765. event.preventDefault();
  766. dog.showGUI();
  767. }
  768. if (‘INPUT’ == document.activeElement.tagName || !window.endUI && window.endUI.style.display) return;
  769. switch (event.code) {
  770. case ‘NumpadSubtract’:
  771. document.exitPointerLock();
  772. //console.log(document.exitPointerLock)
  773. console.dirxml(this)
  774. break;
  775. default:
  776. if (!this.state.pressedKeys.has(event.code)) this.state.pressedKeys.add(event.code);
  777. break;
  778. }
  779. })
  780. }
  781.  
  782. inputs(input) {
  783. const key = {
  784. frame: 0,
  785. delta: 1,
  786. xdir: 2,
  787. ydir: 3,
  788. moveDir: 4,
  789. shoot: 5,
  790. scope: 6,
  791. jump: 7,
  792. reload: 8,
  793. crouch: 9,
  794. weaponScroll: 10,
  795. weaponSwap: 11,
  796. moveLock: 12
  797. }
  798.  
  799. const moveDir = {
  800. leftStrafe: 0,
  801. forward: 1,
  802. rightStrafe: 2,
  803. right: 3,
  804. backwardRightStrafe: 4,
  805. backward: 5,
  806. backwardLeftStrafe: 6,
  807. left: 7
  808. }
  809.  
  810. this.state.frame = input[key.frame];
  811. this.state.nameTags = [1, 2].some(n => n == this.settings.esp) || this.settings.forceNametagsOn;
  812.  
  813. if (this.me) {
  814.  
  815. // AUTO NUKE
  816. if (this.settings.autoNuke && Object.keys(this.me.streaks).length) {
  817. this.wsSend(“k”, 0)
  818. }
  819.  
  820. //AUTO BHOP
  821. if (this.settings.bhop) {
  822. if (this.state.pressedKeys.has(“Space”) || this.settings.bhop % 2) {
  823. this.controls.keys[this.controls.binds.jump.val] ^= 1;
  824. if (this.controls.keys[this.controls.binds.jump.val]) {
  825. this.controls.didPressed[this.controls.binds.jump.val] = 1;
  826. }
  827. if (this.state.pressedKeys.has(“Space”) || this.settings.bhop == 3) {
  828. if (this.me.yVel < -0.03 && this.me.canSlide) {
  829. setTimeout(() => {
  830. this.controls.keys[this.controls.binds.crouch.val] = 0;
  831. }, this.me.slideTimer || 325);
  832. this.controls.keys[this.controls.binds.crouch.val] = 1;
  833. this.controls.didPressed[this.controls.binds.crouch.val] = 1;
  834. }
  835. }
  836. }
  837. }
  838.  
  839. // Makes nametags show in custom games, where nametags are disabled
  840. if (this.settings.forceNametagsOn) {
  841. try {
  842. Object.defineProperty(this.game.config, “nameTags”, {
  843. get() {
  844. return dog.settings.forceNametagsOn ? false : this.game._nametags
  845. },
  846. set(v) {
  847. this.game._nametags = v
  848. }
  849. })
  850. } catch (e) {}
  851. }
  852.  
  853.  
  854. if (this.settings.spinBot) {
  855. const rate = 1
  856. input[key.moveDir] !== -1 && (input[key.moveDir] = (input[key.moveDir] + this.state.spinCounter – Math.round(7 * (input[key.ydir] / (Math.PI * 2000)))) % 7)
  857. input[key.ydir] = this.state.spinCounter / 7 * (Math.PI * 2000)
  858. input[key.frame] % rate === 0 && (this.state.spinCounter = (this.state.spinCounter + 1) % 7)
  859. }
  860.  
  861. // AUTO SWAP (not working idk why)
  862. // if (this.settings.autoSwap && !this.me.weapon.secondary && this.me[this.vars.ammos][0] === 0 && this.me[this.vars.ammos][1] > 0 && !this.me.swapTime && !this.me[this.vars.reloadTimer]) {
  863. // input[key.weaponSwap] = 1
  864. //}
  865.  
  866. // AUTO RELOAD
  867. if (this.settings.autoReload && this.me.ammos[this.me.weaponIndex] === 0) {
  868. input[key.reload] = 1
  869. }
  870.  
  871. // PITCH HACK
  872. if (this.settings.pitchHack) {
  873. switch (this.settings.pitchHack) {
  874. case 1:
  875. input[key.xdir] = -Math.PI * 500
  876. break
  877. case 2:
  878. input[key.xdir] = Math.PI * 500
  879. break
  880. case 3:
  881. input[key.xdir] = Math.sin(Date.now() / 50) * Math.PI * 500
  882. break
  883. case 4:
  884. input[key.xdir] = Math.sin(Date.now() / 250) * Math.PI * 500
  885. break
  886. case 5:
  887. input[key.xdir] = input[key.frame] % 2 ? Math.PI * 500 : -Math.PI * 500
  888. break
  889. case 6:
  890. input[key.xdir] = (Math.random() * Math.PI – Math.PI / 2) * 1000
  891. break
  892. }
  893. }
  894.  
  895. // Add the `pos` property to Players and AIs
  896. const getNoise = () => (Math.random() * 2 – 1) * this.settings.aimNoise
  897. this.game.players.list.forEach(v => {
  898. v.pos = {
  899. x: v.x,
  900. y: v.y,
  901. z: v.z
  902. };
  903. v.npos = {
  904. x: v.x + getNoise(),
  905. y: v.y + getNoise(),
  906. z: v.z + getNoise()
  907. };
  908. v.isTarget = false
  909. })
  910. if (this.game.AI.ais) {
  911. this.game.AI.ais.forEach(v => v.npos = v.pos = {
  912. x: v.x,
  913. y: v.y,
  914. z: v.z
  915. })
  916. }
  917.  
  918. // AIMBOT
  919. if (this.renderer && this.renderer.frustum && this.me.active) {
  920. this.controls.target = null
  921.  
  922. // Finds all the visible enemies
  923. let targets = this.game.players.list.filter(enemy => !enemy.isYTMP && enemy.hasOwnProperty(‘npos’) && (!this.settings.frustumCheck || this.containsPoint(enemy.npos)) && ((this.me.team === null || enemy.team !== this.me.team) && enemy.health > 0 && enemy.inView)).sort((e, e2) => this.getDistance(this.me.x, this.me.z, e.npos.x, e.npos.z) – this.getDistance(this.me.x, this.me.z, e2.npos.x, e2.npos.z));
  924. let target = targets[0];
  925.  
  926. // If there’s a fov box, pick an enemy inside it instead (if there is)
  927. if (this.settings.fovbox) {
  928. const scale = this.scale || parseFloat(document.getElementById(“uiBase”).style.transform.match(/\((.+)\)/)[1])
  929. const width = innerWidth / scale,
  930. height = innerHeight / scale
  931.  
  932. let foundTarget = false
  933. for (let i = 0; i < targets.length; i++) {
  934. const t = targets[i]
  935. const sp = this.world2Screen(new this.three.Vector3(t.x, t.y, t.z), width, height, t.height / 2)
  936. let fovBox = [width / 3, height / 4, width * (1 / 3), height / 2]
  937. switch (this.settings.fovBoxSize) {
  938. // medium
  939. case 2:
  940. fovBox = [width * 0.4, height / 3, width * 0.2, height / 3]
  941. break
  942. // small
  943. case 3:
  944. fovBox = [width * 0.45, height * 0.4, width * 0.1, height * 0.2]
  945. break
  946. }
  947. if (sp.x >= fovBox[0] && sp.x <= (fovBox[0] + fovBox[2]) && sp.y >= fovBox[1] && sp.y < (fovBox[1] + fovBox[3])) {
  948. target = targets[i]
  949. foundTarget = true
  950. break
  951. }
  952. }
  953. if (!foundTarget) {
  954. target = void “kpal”
  955. }
  956. }
  957.  
  958. let isAiTarget = false
  959. if (this.game.AI.ais && this.settings.AImbot) {
  960. let aiTarget = this.game.AI.ais.filter(ent => ent.mesh && ent.mesh.visible && ent.health && ent.pos && ent.canBSeen).sort((p1, p2) => this.getDistance(this.me.x, this.me.z, p1.pos.x, p1.pos.z) – this.getDistance(this.me.x, this.me.z, p2.pos.x, p2.pos.z)).shift()
  961. if (!target || (aiTarget && this.getDistance(this.me.x, this.me.z, aiTarget.pos.x, aiTarget.pos.z) > this.getDistance(this.me.x, this.me.z, target.pos.x, target.pos.z))) {
  962. target = aiTarget
  963. isAiTarget = true
  964. }
  965. }
  966.  
  967. const isShooting = input[key.shoot]
  968. if (target && this.settings.aimbot &&
  969. this.state.bindAimbotOn &&
  970. (!this.settings.aimbotRange || this.getDistance3D(this.me.x, this.me.y, this.me.z, target.x, target.y, target.z) < this.settings.aimbotRange) &&
  971. (!this.settings.rangeCheck || this.getDistance3D(this.me.x, this.me.y, this.me.z, target.x, target.y, target.z) <= this.me.weapon.range) &&
  972. !this.me.reloadTimer) {
  973.  
  974. if (this.settings.awtv) {
  975. input[key.scope] = 1
  976. }
  977. target.isTarget = this.settings.markTarget
  978.  
  979. const yDire = (this.getDir(this.me.z, this.me.x, target.npos.z, target.npos.x) || 0) * 1000
  980. const xDire = isAiTarget ?
  981. ((this.getXDir(this.me.x, this.me.y, this.me.z, target.npos.x, target.npos.y – target.dat.mSize / 2, target.npos.z) || 0) – (0.3 * this.me.recoilAnimY)) * 1000 :
  982. ((this.getXDir(this.me.x, this.me.y, this.me.z, target.npos.x, target.npos.y – target.crouchVal * 3 + this.me.crouchVal * 3 + this.settings.aimOffset, target.npos.z) || 0) – (0.3 * this.me.recoilAnimY)) * 1000
  983.  
  984. // aimbot tweak
  985. if (this.settings.forceUnsilent) {
  986. this.controls.target = {
  987. xD: xDire / 1000,
  988. yD: yDire / 1000
  989. }
  990. this.controls.update(400)
  991. }
  992.  
  993. // Different aimbot modes can share the same code
  994. switch (this.settings.aimbot) {
  995. // quickscope, silent, trigger aim, silent on aim, aim correction, unsilent
  996. case 1:
  997. case 2:
  998. case 5:
  999. case 6:
  1000. case 9:
  1001. case 10: {
  1002. let onAim = [5, 6, 9].some(n => n == this.settings.aimbot)
  1003. if ((this.settings.aimbot === 5 && input[key.scope]) || this.settings.aimbot === 10) {
  1004. this.controls.target = {
  1005. xD: xDire / 1000,
  1006. yD: yDire / 1000
  1007. }
  1008. this.controls.update(400)
  1009. }
  1010. if ([2, 10].some(n => n == this.settings.aimbot) || (this.settings.aimbot === 1 && this.me.weapon.id)) {
  1011. !this.me.weapon.melee && (input[key.scope] = 1)
  1012. }
  1013. if (this.me.didShoot) {
  1014. input[key.shoot] = 0
  1015. this.state.quickscopeCanShoot = false
  1016. setTimeout(() => {
  1017. this.state.quickscopeCanShoot = true
  1018. }, this.me.weapon.rate * .85)
  1019. } else if (this.state.quickscopeCanShoot && (!onAim || input[key.scope])) {
  1020. if (!this.me.weapon.melee) {
  1021. input[key.scope] = 1
  1022. }
  1023. if (!this.settings.superSilent && this.settings.aimbot !== 9) {
  1024. input[key.ydir] = yDire
  1025. input[key.xdir] = xDire
  1026. }
  1027. if ((this.settings.aimbot !== 9 && (!this.me.aimVal || this.me.weapon.noAim || this.me.weapon.melee)) ||
  1028. (this.settings.aimbot === 9 && isShooting)) {
  1029. input[key.ydir] = yDire
  1030. input[key.xdir] = xDire
  1031. input[key.shoot] = 1
  1032. }
  1033. }
  1034. }
  1035. break
  1036. // spin aim useless rn
  1037. // case 3: {
  1038. // if (me[dog.vars.didShoot]) {
  1039. // input[key.shoot] = 0
  1040. // dog.state.quickscopeCanShoot = false
  1041. // setTimeout(() => {
  1042. // dog.state.quickscopeCanShoot = true
  1043. // }, me.weapon.rate)
  1044. // } else if (dog.state.quickscopeCanShoot && !dog.state.spinFrame) {
  1045. // dog.state.spinFrame = input[key.frame]
  1046. // } else {
  1047. // const fullSpin = Math.PI * 2000
  1048. // const spinFrames = dog.settings.spinAimFrames
  1049. // const currentSpinFrame = input[key.frame]-dog.state.spinFrame
  1050. // if (currentSpinFrame < 0) {
  1051. // dog.state.spinFrame = 0
  1052. // }
  1053. // if (currentSpinFrame > spinFrames) {
  1054. // if (!dog.settings.superSilent) {
  1055. // input[key.ydir] = yDire
  1056. // input[key.xdir] = xDire
  1057. // }
  1058. // if (!me[dog.vars.aimVal] || me.weapon.noAim || me.weapon.melee) {
  1059. // input[key.ydir] = yDire
  1060. // input[key.xdir] = xDire
  1061. // input[key.shoot] = 1
  1062. // dog.state.spinFrame = 0
  1063. // }
  1064. // } else {
  1065. // input[key.ydir] = currentSpinFrame/spinFrames * fullSpin
  1066. // if (!me.weapon.melee)
  1067. // input[key.scope] = 1
  1068. // }
  1069. // }
  1070. // } break
  1071.  
  1072. // aim assist, smooth on aim, smoother, easy aim assist
  1073. case 4:
  1074. case 7:
  1075. case 8:
  1076. case 11:
  1077. if (input[key.scope] || this.settings.aimbot === 11) {
  1078. this.controls.target = {
  1079. xD: xDire / 1000,
  1080. yD: yDire / 1000
  1081. }
  1082. this.controls.update(({
  1083. 4: 400,
  1084. 7: 110,
  1085. 8: 70,
  1086. 11: 400
  1087. })[this.settings.aimbot])
  1088. if ([4, 11].some(n => n == this.settings.aimbot)) {
  1089. input[key.xdir] = xDire
  1090. input[key.ydir] = yDire
  1091. }
  1092. if (this.me.didShoot) {
  1093. input[key.shoot] = 0
  1094. this.state.quickscopeCanShoot = false
  1095. setTimeout(() => {
  1096. this.state.quickscopeCanShoot = true
  1097. }, this.me.weapon.rate * 0.85)
  1098. } else if (this.state.quickscopeCanShoot) {
  1099. input[this.me.weapon.melee ? key.shoot : key.scope] = 1
  1100. }
  1101. } else {
  1102. this.controls.target = null
  1103. }
  1104. break
  1105. // trigger bot
  1106. case 12: {
  1107. if (!this.three ||
  1108. !this.renderer ||
  1109. !this.renderer.camera ||
  1110. !this.game ||
  1111. !this.game.players ||
  1112. !this.game.players.list.length ||
  1113. !input[key.scope] ||
  1114. this.me.aimVal) {
  1115. break
  1116. }
  1117. // Only create these once for performance
  1118. if (!this.state.raycaster) {
  1119. this.state.raycaster = new this.three.Raycaster()
  1120. this.state.mid = new this.three.Vector2(0, 0)
  1121. }
  1122. const playerMaps = []
  1123. for (let i = 0; i < this.game.players.list.length; i++) {
  1124. let p = this.game.players.list[i]
  1125. if (!p || !p.objInstances || p.isYTMP || !(this.me.team === null || p.team !== this.me.team) || !p.inView) {
  1126. continue
  1127. }
  1128. playerMaps.push(p.objInstances)
  1129. }
  1130. const raycaster = this.state.raycaster
  1131. raycaster.setFromCamera(this.state.mid, this.renderer.camera)
  1132. if (raycaster.intersectObjects(playerMaps, true).length) {
  1133. input[key.shoot] = this.me.didShoot ? 0 : 1
  1134. }
  1135. }
  1136. break
  1137. }
  1138. } else {
  1139. if (this.settings.uwtv) {
  1140. input[key.scope] = 0
  1141. }
  1142. this.state.spinFrame = 0
  1143. }
  1144. }
  1145.  
  1146. if (this.settings.alwaysAim) {
  1147. input[key.scope] = 1
  1148. }
  1149. if (this.settings.preventMeleeThrowing && this.me.weapon.melee) {
  1150. input[key.scope] = 0
  1151. }
  1152. }
  1153. return input;
  1154. }
  1155.  
  1156. render() {
  1157.  
  1158. var scale = this.scale || parseFloat(document.getElementById(“uiBase”).style.transform.match(/\((.+)\)/)[1]);
  1159. let width = innerWidth / scale,
  1160. height = innerHeight / scale
  1161.  
  1162. let world2Screen = (pos, yOffset = 0) => {
  1163. pos.y += yOffset
  1164. pos.project(this.renderer.camera)
  1165. pos.x = (pos.x + 1) / 2
  1166. pos.y = (-pos.y + 1) / 2
  1167. pos.x *= width
  1168. pos.y *= height
  1169. return pos
  1170. }
  1171. let line = (x1, y1, x2, y2, lW, sS) => {
  1172. this.ctx.save()
  1173. this.ctx.lineWidth = lW + 2
  1174. this.ctx.beginPath()
  1175. this.ctx.moveTo(x1, y1)
  1176. this.ctx.lineTo(x2, y2)
  1177. this.ctx.strokeStyle = “rgba(0, 0, 0, 0.25)”
  1178. this.ctx.stroke()
  1179. this.ctx.lineWidth = lW
  1180. this.ctx.strokeStyle = sS
  1181. this.ctx.stroke()
  1182. this.ctx.restore()
  1183. }
  1184. let rect = (x, y, ox, oy, w, h, color, fill) => {
  1185. this.ctx.save()
  1186. this.ctx.translate(~~x, ~~y)
  1187. this.ctx.beginPath()
  1188. fill ? this.ctx.fillStyle = color : this.ctx.strokeStyle = color
  1189. this.ctx.rect(ox, oy, w, h)
  1190. fill ? this.ctx.fill() : this.ctx.stroke()
  1191. this.ctx.closePath()
  1192. this.ctx.restore()
  1193. }
  1194. let getTextMeasurements = (arr) => {
  1195. for (let i = 0; i < arr.length; i++) {
  1196. arr[i] = ~~this.ctx.measureText(arr[i]).width
  1197. }
  1198. return arr
  1199. }
  1200. let gradient = (x, y, w, h, colors) => {
  1201. const grad = this.ctx.createLinearGradient(x, y, w, h)
  1202. for (let i = 0; i < colors.length; i++) {
  1203. grad.addColorStop(i, colors[i])
  1204. }
  1205. return grad
  1206. }
  1207. let text = (txt, font, color, x, y) => {
  1208. this.ctx.save()
  1209. this.ctx.translate(~~x, ~~y)
  1210. this.ctx.fillStyle = color
  1211. this.ctx.strokeStyle = “rgba(0, 0, 0, 0.5)”
  1212. this.ctx.font = font
  1213. this.ctx.lineWidth = 1
  1214. this.ctx.strokeText(txt, 0, 0)
  1215. this.ctx.fillText(txt, 0, 0)
  1216. this.ctx.restore()
  1217. }
  1218.  
  1219. const padding = 2
  1220.  
  1221. for (const player of this.game.players.list.filter(v => (!v.isYTMP && v.active && (v.pos = {
  1222. x: v.x,
  1223. y: v.y,
  1224. z: v.z
  1225. })))) {
  1226. const pos = new this.three.Vector3(player.pos.x, player.pos.y, player.pos.z)
  1227. const screenR = world2Screen(pos.clone())
  1228. const screenH = world2Screen(pos.clone(), player.height)
  1229. const hDiff = ~~(screenR.y – screenH.y)
  1230. const bWidth = ~~(hDiff * 0.6)
  1231. const font = this.settings.espFontSize + “px GameFont”
  1232. const enemy = this.me.team === null || player.team !== this.me.team;
  1233.  
  1234. if (!this.containsPoint(player.pos)) {
  1235. continue
  1236. }
  1237.  
  1238. if (this.settings.tracers) {
  1239. line(width / 2, (dog.settings.tracers === 2 ? height / 2 : height – 1), screenR.x, screenR.y, 2, player.team === null ? “#FF4444” : player.team === this.me.team ? “#44AAFF” : “#FF4444”)
  1240. }
  1241.  
  1242. // Chams
  1243. const obj = player.objInstances;
  1244. if (this.isDefined(obj)) {
  1245. if (!obj.visible) {
  1246. Object.defineProperty(player.objInstances, ‘visible’, {
  1247. value: true,
  1248. writable: false
  1249. });
  1250. } else {
  1251. let chamsEnabled = this.settings.chams;
  1252. if (dog.gaybow >= 360) dog.gaybow = 0; else dog.gaybow++;
  1253. obj.traverse(child => {
  1254. if (child && child.type == “Mesh” && this.isDefined(child.material)) {
  1255. if (!child.hasOwnProperty(dogStr)) {
  1256. child[dogStr] = child.material;
  1257. } else if (child.hasOwnProperty(dogStr)) {
  1258. Object.defineProperty(child, ‘material’, {
  1259. get(){
  1260. return !chamsEnabled||(!enemy && !dog.settings.teamChams) ? this[dogStr] : new dog.three.MeshBasicMaterial({
  1261. color: new dog.three.Color(dog.settings.chamsCol == 12 ? `hsl(${dog.gaybow},100%, 50%)` : Object.values(dog.colors)[dog.settings.chamsCol]),
  1262. depthTest: false,
  1263. transparent: true,
  1264. fog: false,
  1265. wireframe: dog.settings.wireframe
  1266. })
  1267. }
  1268. });
  1269. }
  1270. }
  1271. })
  1272. }
  1273. }
  1274.  
  1275. if (this.settings.esp > 1) {
  1276. if (player.isTarget) {
  1277. this.ctx.save()
  1278. const meas = getTextMeasurements([“TARGET”])
  1279. text(“TARGET”, font, “#FFFFFF”, screenH.x – meas[0] / 2, screenH.y – this.settings.espFontSize * 1.5)
  1280.  
  1281. this.ctx.beginPath()
  1282.  
  1283. this.ctx.translate(screenH.x, screenH.y + Math.abs(hDiff / 2))
  1284. this.ctx.arc(0, 0, Math.abs(hDiff / 2) + 10, 0, Math.PI * 2)
  1285.  
  1286. this.ctx.strokeStyle = “#FFFFFF”
  1287. this.ctx.stroke()
  1288. this.ctx.closePath()
  1289. this.ctx.restore()
  1290. }
  1291.  
  1292. if (this.settings.esp === 2) {
  1293. this.ctx.save()
  1294. this.ctx.strokeStyle = (this.me.team === null || player.team !== this.me.team) ? “#FF4444” : “#44AAFF”
  1295. this.ctx.strokeRect(screenH.x – bWidth / 2, screenH.y, bWidth, hDiff)
  1296. this.ctx.restore()
  1297. continue
  1298. }
  1299.  
  1300. rect((screenH.x – bWidth / 2) – 7, ~~screenH.y – 1, 0, 0, 4, hDiff + 2, “#000000”, false)
  1301. rect((screenH.x – bWidth / 2) – 7, ~~screenH.y – 1, 0, 0, 4, hDiff + 2, “#44FF44”, true)
  1302. rect((screenH.x – bWidth / 2) – 7, ~~screenH.y – 1, 0, 0, 4, ~~((player.maxHealth – player.health) / player.maxHealth * (hDiff + 2)), “#000000”, true)
  1303. this.ctx.save()
  1304. this.ctx.lineWidth = 4
  1305. this.ctx.translate(~~(screenH.x – bWidth / 2), ~~screenH.y)
  1306. this.ctx.beginPath()
  1307. this.ctx.rect(0, 0, bWidth, hDiff)
  1308. this.ctx.strokeStyle = “rgba(0, 0, 0, 0.25)”
  1309. this.ctx.stroke()
  1310. this.ctx.lineWidth = 2
  1311. this.ctx.strokeStyle = player.team === null ? ‘#FF4444’ : this.me.team === player.team ? ‘#44AAFF’ : ‘#FF4444’
  1312. this.ctx.stroke()
  1313. this.ctx.closePath()
  1314. this.ctx.restore()
  1315.  
  1316. const playerDist = ~~(this.getDistance3D(this.me.x, this.me.y, this.me.z, player.pos.x, player.pos.y, player.pos.z) / 10)
  1317. this.ctx.save()
  1318. this.ctx.font = font
  1319. const meas = getTextMeasurements([“[“, playerDist, “m]”, player.level, “©”, player.name])
  1320. this.ctx.restore()
  1321. const grad2 = gradient(0, 0, meas[4] * 5, 0, [“rgba(0, 0, 0, 0.25)”, “rgba(0, 0, 0, 0)”])
  1322. if (player.level) {
  1323. const grad = gradient(0, 0, (meas[4] * 2) + meas[3] + (padding * 3), 0, [“rgba(0, 0, 0, 0)”, “rgba(0, 0, 0, 0.25)”])
  1324. rect(~~(screenH.x – bWidth / 2) – 12 – (meas[4] * 2) – meas[3] – (padding * 3), ~~screenH.y – padding, 0, 0, (meas[4] * 2) + meas[3] + (padding * 3), meas[4] + (padding * 2), grad, true)
  1325. text(“” + player.level, font, ‘#FFFFFF’, ~~(screenH.x – bWidth / 2) – 16 – meas[3], ~~screenH.y + meas[4] * 1)
  1326. }
  1327. rect(~~(screenH.x + bWidth / 2) + padding, ~~screenH.y – padding, 0, 0, (meas[4] * 5), (meas[4] * 4) + (padding * 2), grad2, true)
  1328. text(player.name, font, player.team === null ? ‘#FFCDB4’ : this.me.team === player.team ? ‘#B4E6FF’ : ‘#FFCDB4’, (screenH.x + bWidth / 2) + 4, screenH.y + meas[4] * 1)
  1329. if (player.clan) text(“[” + player.clan + “]”, font, “#AAAAAA”, (screenH.x + bWidth / 2) + 8 + meas[5], screenH.y + meas[4] * 1)
  1330. text(player.health + ” HP”, font, “#33FF33”, (screenH.x + bWidth / 2) + 4, screenH.y + meas[4] * 2)
  1331. text(player.weapon.name, font, “#DDDDDD”, (screenH.x + bWidth / 2) + 4, screenH.y + meas[4] * 3)
  1332. text(“[“, font, “#AAAAAA”, (screenH.x + bWidth / 2) + 4, screenH.y + meas[4] * 4)
  1333. text(“” + playerDist, font, “#DDDDDD”, (screenH.x + bWidth / 2) + 4 + meas[0], screenH.y + meas[4] * 4)
  1334. text(“m]”, font, “#AAAAAA”, (screenH.x + bWidth / 2) + 4 + meas[0] + meas[1], screenH.y + meas[4] * 4)
  1335. }
  1336.  
  1337. }
  1338.  
  1339. if (this.settings.fovbox && this.settings.drawFovbox) {
  1340. let fovBox = [width / 3, height / 4, width * (1 / 3), height / 2]
  1341. switch (this.settings.fovBoxSize) {
  1342. // medium
  1343. case 2:
  1344. fovBox = [width * 0.4, height / 3, width * 0.2, height / 3]
  1345. break
  1346. // small
  1347. case 3:
  1348. fovBox = [width * 0.45, height * 0.4, width * 0.1, height * 0.2]
  1349. break
  1350. }
  1351. this.ctx.save()
  1352. this.ctx.strokeStyle = “red”
  1353. this.ctx.strokeRect(…fovBox)
  1354. this.ctx.restore()
  1355. }
  1356. }
  1357.  
  1358. cleanGUI() {
  1359. let head = document.head || document.getElementsByTagName(‘head’)[0] || 0,
  1360. css = this.createElement(“style”, “#aMerger, #endAMerger { display: none !important }”);
  1361. head.appendChild(css);
  1362. window[‘onetrust-consent-sdk’].style.display = “none”;
  1363. window.streamContainer.style.display = “none”;
  1364. window.merchHolder.style.display = “none”;
  1365. window.newsHolder.style.display = “none”;
  1366. }
  1367.  
  1368. customCSS() {
  1369. if (!this.isDefined(this.CSSres) && this.settings.kpalCSS) {
  1370. let head = document.head || document.getElementsByTagName(‘head’)[0] || 0
  1371. this.CSSres = document.createElement(“link”);
  1372. this.CSSres.rel = “stylesheet”;
  1373. this.CSSres.href = “https://skidlamer.github.io/css/kpal.css”
  1374. this.CSSres.disabled = false;
  1375. head.appendChild(this.CSSres);
  1376. }
  1377. if (this.settings.customCSS.startsWith(“http”) && this.settings.customCSS.endsWith(“.css”)) {
  1378. //let head = document.head||document.getElementsByTagName(‘head’)[0]||0
  1379. this.CSSres.href = this.settings.customCSS;
  1380. //head.appendChild(this.CSSres);
  1381. } else this.CSSres = undefined;
  1382. }
  1383.  
  1384. initGUI() {
  1385. function createButton(name, iconURL, fn) {
  1386. const menu = document.querySelector(“#menuItemContainer”),
  1387. menuItem = document.createElement(“div”),
  1388. menuItemIcon = document.createElement(“div”),
  1389. menuItemTitle = document.createElement(“div”)
  1390.  
  1391. menuItem.className = “menuItem”
  1392. menuItemIcon.className = “menuItemIcon”
  1393. menuItemTitle.className = “menuItemTitle”
  1394.  
  1395. menuItemTitle.innerHTML = name
  1396. menuItemIcon.style.backgroundImage = `url(“https://i.imgur.com/jjkFpnV.gif”)`
  1397.  
  1398. menuItem.append(menuItemIcon, menuItemTitle)
  1399. menu.append(menuItem)
  1400.  
  1401. menuItem.addEventListener(“click”, fn)
  1402. }
  1403.  
  1404. dog.GUI.setSetting = function(setting, value) {
  1405. switch (setting) {
  1406. case “customCSS”:
  1407. dog.settings.customCSS = value
  1408. dog.customCSS();
  1409. break
  1410.  
  1411. default:
  1412. console.log(“SET “, setting, ” “, value);
  1413. dog.settings[setting] = value
  1414. }
  1415. localStorage.kro_setngss_json = JSON.stringify(dog.settings);
  1416. }
  1417. dog.GUI.windowIndex = windows.length + 1
  1418. dog.GUI.settings = {
  1419. aimbot: {
  1420. val: this.settings.aimbot
  1421. }
  1422. }
  1423. dog.GUI.windowObj = {
  1424. header: “CH33T”,
  1425. html: “”,
  1426. gen() {
  1427. return dog.getGuiHtml()
  1428. }
  1429. }
  1430. Object.defineProperty(window.windows, windows.length, {
  1431. value: dog.GUI.windowObj
  1432. })
  1433.  
  1434. if (this.settings.showGuiButton) {
  1435. createButton(“CH33TS”, null, () => {
  1436. window.showWindow(dog.GUI.windowIndex)
  1437. })
  1438. }
  1439. }
  1440.  
  1441. showGUI() {
  1442. if (document.pointerLockElement || document.mozPointerLockElement) {
  1443. document.exitPointerLock()
  1444. }
  1445. window.showWindow(this.GUI.windowIndex)
  1446. }
  1447.  
  1448. getGuiHtml() {
  1449. const builder = {
  1450. checkbox: (name, settingName, description = “”, needsRestart = false) => `<div class=”settName” title=”${description}”>${name} ${needsRestart ? “<span style=\”color: #eb5656\”>*</span>” : “”}<label class=”switch” style=”margin-left:10px”><input type=”checkbox” onclick=’${dogStr}.GUI.setSetting(“${settingName}”, this.checked)’ ${dog.settings[settingName]?”checked”:””}><span class=”slider”></span></label></div>`,
  1451. client_setting: (name, settingName, description = “”, needsRestart = true) => `<div class=”settName” title=”${description}”>${name} ${needsRestart ? “<span style=\”color: #eb5656\”>*</span>” : “”}<label class=”switch” style=”margin-left:10px”><input type=”checkbox” onclick=’doge_setsetting(“${settingName}”, this.checked?”1″:”0″)’ ${dog.settings[settingName]?”checked”:””}><span class=”slider”></span></label></div>`,
  1452. select: (name, settingName, options, description = “”, needsRestart = false) => {
  1453. let built = `<div class=”settName” title=”${description}”>${name} ${needsRestart ? “<span style=\”color: #eb5656\”>*</span>” : “”}<select onchange=’${dogStr}.GUI.setSetting(“${settingName}”, parseInt(this.value))’ class=”inputGrey2″>`
  1454. for (const option in options) {
  1455. if (options.hasOwnProperty(option))
  1456. built += `<option value=”${options[option]}” ${dog.settings[settingName] == options[option]?”selected”:””}>${option}</option>,`
  1457. }
  1458. return built + “</select></div>”
  1459. },
  1460. slider: (name, settingName, min, max, step, description = “”) => `<div class=”settName” title=”${description}”>${name} <input type=”number” class=”sliderVal” id=”slid_input_${settingName}” min=”${min}” max=”${max}” value=”${dog.settings[settingName]}” onkeypress=”${dogStr}.GUI.setSetting(‘${settingName}’, parseFloat(this.value.replace(‘,’, ‘.’)));document.querySelector(‘#slid_input_${settingName}’).value=this.value” style=”margin-right:0;border-width:0″><div class=”slidecontainer” style=””><input type=”range” id=”slid_${settingName}” min=”${min}” max=”${max}” step=”${step}” value=”${dog.settings[settingName]}” class=”sliderM” oninput=”${dogStr}.GUI.setSetting(‘${settingName}’, parseFloat(this.value));document.querySelector(‘#slid_input_${settingName}’).value=this.value”></div></div>`,
  1461. input: (name, settingName, type, description, extra) => `<div class=”settName” title=”${description}”>${name} <input type=”${type}” name=”${type}” id=”slid_utilities_${settingName}”\n${‘color’ == type ? ‘style=”float:right;margin-top:5px”‘ : `class=”inputGrey2″ placeholder=”${extra}”`}\nvalue=”${dog.settings[settingName]}” oninput=”${dogStr}.GUI.setSetting(\x27${settingName}\x27, this.value)”/></div>`,
  1462. label: (name, description) => “<br><span style=’color: black; font-size: 20px; margin: 20px 0′>” + name + “</span> <span style=’color: dimgrey; font-size: 15px’>” + (description || “”) + “</span><br>”,
  1463. nobrlabel: (name, description) => “<span style=’color: black; font-size: 20px; margin: 20px 0′>” + name + “</span> <span style=’color: dimgrey; font-size: 15px’>” + (description || “”) + “</span><br>”,
  1464. br: () => “<br>”,
  1465. style: content => `<style>${content}</style>`,
  1466. };
  1467. let built = `<div id=”settHolder”>
  1468. <img src=”https://i.imgur.com/tE0QUPv.png” width=”90%”>
  1469. <div class=”imageButton discordSocial” onmouseenter=”playTick()” onclick=”openURL(‘https://skidlamer.github.io/wp/index.html’)”><span style=’display:inline’></span></div>`
  1470.  
  1471. // fix fugly looking ‘built +=’ before every builder call
  1472. Object.keys(builder).forEach(name => {
  1473. const o = builder[name]
  1474. builder[name] = function() {
  1475. return built += o.apply(this, arguments), “”
  1476. }
  1477. })
  1478.  
  1479. // Tabs stuff
  1480. const tabNames = [“Weapon”, “Wallhack”, “Visual”, “Tweaks”, “Movement”, “Other”]
  1481. if (dog.isClient) {
  1482. tabNames.push(“Client”)
  1483. }
  1484. builder.style(`.cheatTabButton { color: black; background: #ddd; padding: 2px 7px; font-size: 15px; cursor: pointer; text-align: center; } .cheatTabActive { background: #bbb;}`)
  1485. this.GUI.changeTab = function(tabbtn) {
  1486. const tn = tabbtn.innerText
  1487. document.getElementById(“cheat-tabbtn-” + tabNames[dog.state.activeTab]).classList.remove(“cheatTabActive”)
  1488. document.getElementById(“cheat-tab-” + tabNames[dog.state.activeTab]).style.display = “none”
  1489. tabbtn.classList.add(“cheatTabActive”)
  1490. document.getElementById(“cheat-tab-” + tn).style.display = “block”
  1491. dog.state.activeTab = tabNames.indexOf(tn)
  1492. }
  1493. built += `<table style=”width: 100%; margin-bottom: 30px”><tr>`
  1494. for (let i = 0; i < tabNames.length; i++) {
  1495. const tab = tabNames[i]
  1496. built += `<td id=”cheat-tabbtn-${tab}” onclick=”${dogStr}.GUI.changeTab(this)” class=”cheatTabButton ${tabNames[dog.state.activeTab] === tab ? ‘cheatTabActive’ : ”}”>`
  1497. built += tab
  1498. built += `</td>`
  1499. }
  1500. built += `</table></tr>`
  1501.  
  1502. function tab(i, cb) {
  1503. built += `<div style=”display: ${dog.state.activeTab === i ? ‘block’ : ‘none’}” class=”cheat-tab” id=”cheat-tab-${tabNames[i]}”>`
  1504. cb()
  1505. built += `</div>`
  1506. }
  1507.  
  1508. // build gui
  1509. tab(0, () => {
  1510. builder.select(“Aimbot [Y]”, “aimbot”, {
  1511. “None”: 0,
  1512. “Quickscope / Auto pick”: 1,
  1513. “Silent aimbot”: 2,
  1514. //”Spin aimbot”: 3,
  1515. “Aim assist”: 4,
  1516. “Easy aim assist”: 11,
  1517. “SP Trigger bot”: 12,
  1518. “Silent on aim”: 6,
  1519. “Smooth”: 7,
  1520. “Unsilent”: 10,
  1521. “Unsilent on aim”: 5,
  1522. “Aim correction”: 9,
  1523. })
  1524. builder.select(“Spin aimbot speed”, “spinAimFrames”, {
  1525. “1”: 30,
  1526. “2”: 20,
  1527. “3”: 15,
  1528. “4”: 10,
  1529. “5”: 5,
  1530. })
  1531. builder.slider(“Aim range”, “aimbotRange”, 0, 1000, 10, “Set above 0 to make the aimbot pick enemies only at the selected range”)
  1532. builder.slider(“Aim offset”, “aimOffset”, -4, 1, 0.1, “The lower it is, the lower the aimbot will shoot (0 – head, -4 – body)”)
  1533. builder.slider(“Aim noise”, “aimNoise”, 0, 2, 0.005, “The higher it is, the lower is the aimbot accuracy”)
  1534. builder.checkbox(“Supersilent aim”, “superSilent”, “Only works with quickscope and silent aim, makes it almost invisible that you’re looking at somebody when you’re shooting at him”)
  1535. builder.checkbox(“Aim at AIs”, “AImbot”, “Makes the aimbot shoot at NPCs”)
  1536. builder.checkbox(“FOV check”, “frustumCheck”, “Makes you only shoot at enemies that are in your field of view. Prevents 180 flicks”)
  1537. builder.checkbox(“FOV box”, “fovbox”, “Creates a box in which enemies can be targetted, enable with FOV check”)
  1538. builder.select(“FOV box size”, “fovBoxSize”, {
  1539. “Big”: 1,
  1540. “Medium”: 2,
  1541. “Small”: 3,
  1542. })
  1543. builder.checkbox(“Wallbangs”, “wallbangs”, “Makes the aimbot shoot enemies behind walls”)
  1544. builder.checkbox(“Aimbot range check”, “rangeCheck”, “Checks if the enemy is in range of your weapon before shooting it, disable for rocket launcher”)
  1545. builder.checkbox(“Auto reload”, “autoReload”, “Automatically reloads your weapon when it’s out of ammo”)
  1546. builder.checkbox(“Prevent melee throwing”, “preventMeleeThrowing”, “Prevents you from throwing your knife”)
  1547. //builder.checkbox(“Auto swap”, “autoSwap”, “Automatically swaps the weapon when you’re out of ammo”)
  1548. })
  1549.  
  1550. tab(1, () => {
  1551. builder.select(“ESP [H]”, “esp”, {
  1552. “None”: 0,
  1553. “Nametags”: 1,
  1554. “Box ESP”: 2,
  1555. “Full ESP”: 3,
  1556. })
  1557. builder.select(“ESP Font Size”, “espFontSize”, {
  1558. “30px”: 30,
  1559. “25px”: 25,
  1560. “20px”: 20,
  1561. “15px”: 15,
  1562. “10px”: 10,
  1563. “5px”: 5,
  1564. })
  1565. builder.select(“Tracers”, “tracers”, {
  1566. “None”: 0,
  1567. “Bottom”: 1,
  1568. “Middle”: 2,
  1569. }, “Draws lines to players”)
  1570. builder.checkbox(“Mark aimbot target”, “markTarget”, “Shows who is the aimbot targetting at the time, useful for aim assist/aim correction”)
  1571. builder.checkbox(“Draw FOV box”, “drawFovbox”, “Draws the FOV box from aimbot settings”)
  1572. builder.checkbox(“Chams”, “chams”)
  1573. builder.select(“Chams colour”, “chamsCol”, {
  1574. White: 0,
  1575. Black: 1,
  1576. Purple: 2,
  1577. Pink: 3,
  1578. Blue: 4,
  1579. DarkBlue: 5,
  1580. Aqua: 6,
  1581. Green: 7,
  1582. Lime: 8,
  1583. Orange: 9,
  1584. Yellow: 10,
  1585. Red: 11,
  1586. Gaybow: 12,
  1587. })
  1588. builder.checkbox(“Friendly chams”, “teamChams”, “Show Chams for friendly players”)
  1589. builder.checkbox(“Wireframe”, “wireframe”)
  1590. builder.slider(“RGB interval”, “chamsInterval”, 50, 1000, 50, “How fast will the RGB chams change colour”)
  1591. })
  1592.  
  1593. tab(2, () => {
  1594. builder.checkbox(“Third person mode”, “thirdPerson”)
  1595. builder.checkbox(“Skin hack”, “skinHack”, “Makes you able to use any skin in game, only shows on your side”)
  1596. builder.checkbox(“Billboard shaders”, “animatedBillboards”, “Disable if you get fps drops”)
  1597. builder.checkbox(“Any weapon trail”, “alwaysTrail”)
  1598. builder.slider(“Weapon Zoom”, “weaponZoom”, 0, 20, .1, “Weapon Zoom Multiplier Adjust”)
  1599. })
  1600.  
  1601. tab(3, () => {
  1602. builder.checkbox(“Always aim”, “alwaysAim”, “Makes you slower and jump lower, but the aimbot can start shooting at enemies faster. Only use if ur good at bhopping”)
  1603. builder.checkbox(“Aim when target visible”, “awtv”)
  1604. builder.checkbox(“Unaim when no target visible”, “uwtv”)
  1605. builder.checkbox(“Force unsilent”, “forceUnsilent”)
  1606. })
  1607.  
  1608. tab(4, () => {
  1609. builder.select(“Auto bhop”, “bhop”, {
  1610. “None”: 0,
  1611. “Auto Jump”: 1,
  1612. “Key Jump”: 2,
  1613. “Auto Slide”: 3,
  1614. “Key Slide”: 4,
  1615. })
  1616. builder.label(“Only use with silent aim”)
  1617. builder.select(“Pitch hax”, “pitchHack”, {
  1618. “Disabled”: 0,
  1619. “Downward”: 1,
  1620. “Upward”: 2,
  1621. “sin(time)”: 3,
  1622. “sin(time/5)”: 4,
  1623. “double”: 5,
  1624. “random”: 6,
  1625. }, “Only use with aimbot on”)
  1626. builder.checkbox(“Spin bot”, “spinBot”)
  1627. })
  1628.  
  1629. tab(5, () => {
  1630. builder.checkbox(“Show GUI button”, “showGuiButton”, “Disable if you don’t want the dog under settings to be visible”)
  1631. builder.checkbox(“GUI on middle mouse button”, “guiOnMMB”, “Makes it possible to open this menu by clicking the mouse wheel”)
  1632. builder.checkbox(“Keybinds”, “keybinds”, “Turn keybinds on/off, Aimbot – Y, ESP – H”)
  1633. builder.checkbox(“No inactivity kick”, “antikick”, “Disables the ‘Kicked for inactivity’ message (client side, but works)”)
  1634. builder.checkbox(“Auto nuke”, “autoNuke”, “Automatically nukes when you are able to”)
  1635. builder.checkbox(“Force nametags on”, “fgno”, “Use in custom games with disabled nametags”)
  1636. builder.checkbox(“Use Kpal CSS”, “kpalCSS”, “Use the kpal CSS when no custom CSS is Applied”)
  1637. builder.input(“Custom CSS”, “customCSS”, “url”, “”, “URL to CSS file”)
  1638. })
  1639.  
  1640. if (dog.isClient) {
  1641. tab(6, () => {
  1642. builder.nobrlabel(“Restart is required after changing any of these settings”)
  1643. builder.br()
  1644. builder.client_setting(“Uncap FPS”, “uncap_fps”, “Disables V-Sync”)
  1645. builder.client_setting(“Adblock”, “adblock”, “Disables ads”)
  1646. })
  1647. }
  1648.  
  1649. built += “</div>”
  1650.  
  1651. return built;
  1652. }
  1653.  
  1654. getDistance(x1, y1, x2, y2) {
  1655. return Math.sqrt((x2 -= x1) * x2 + (y2 -= y1) * y2);
  1656. }
  1657.  
  1658. getDistance3D(x1, y1, z1, x2, y2, z2) {
  1659. let dx = x1 – x2;
  1660. let dy = y1 – y2;
  1661. let dz = z1 – z2;
  1662. return Math.sqrt(dx * dx + dy * dy + dz * dz);
  1663. }
  1664.  
  1665. getXDir(x1, y1, z1, x2, y2, z2) {
  1666. let h = Math.abs(y1 – y2);
  1667. let dst = this.getDistance3D(x1, y1, z1, x2, y2, z2);
  1668. return (Math.asin(h / dst) * ((y1 > y2) ? -1 : 1));
  1669. }
  1670.  
  1671. getDir(x1, y1, x2, y2) {
  1672. return Math.atan2(y1 – y2, x1 – x2);
  1673. }
  1674.  
  1675. getAngleDist(a, b) {
  1676. return Math.atan2(Math.sin(b – a), Math.cos(a – b));
  1677. }
  1678.  
  1679. containsPoint(point) {
  1680. let planes = this.renderer.frustum.planes;
  1681. for (let i = 0; i < 6; i++) {
  1682. if (planes[i].distanceToPoint(point) < 0) {
  1683. return false;
  1684. }
  1685. }
  1686. return true;
  1687. }
  1688.  
  1689. world2Screen(pos, width, height, yOffset = 0) {
  1690. pos.y += yOffset
  1691. pos.project(this.renderer.camera)
  1692. pos.x = (pos.x + 1) / 2
  1693. pos.y = (-pos.y + 1) / 2
  1694. pos.x *= width
  1695. pos.y *= height
  1696. return pos
  1697. }
  1698. };
  1699.  
  1700. window[dogStr] = new Dogeware();
  1701.  
  1702. })([…Array(8)].map(_ => ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’ [~~(Math.random() * 52)]).join(”));
Back to top button
pussy fingering videos hdindiantube.com xnxx video indian افلام نيك ايطالى arab-porno.net رضاعة سكس 葉月レイラ freejav.mobi 300maan-368 dungeon ni deai hentai hothentai.net pokemon xxx manga sex tube aloha hotmoza.tv malayalamsexvedeo
sex vedio mms pornstarsporno.net swathi naidu porn tubes سكسمحارم pornoarabsex.com نياكة مصري sex com indin justerporn.mobi bangla choda baclaran scandal iwantmoreteleserye.com eat all you can iloilo www.mom and son sex video.com indiansfucking.com tamilxxxporn
hindi sexxi sfico.info tube xclips 七瀬るい javsextube.com ねとられ neko hentai galleries hentai-images.com free hentai porn sites جنس شواز izleporno.biz ساره جين سكس تحميل سكس اجنبي sexauskunft.net sex mahala