MultiHack KillSwitch [WORKING 2023]

Take Over MooMoo.io

目前為 2023-11-24 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name MultiHack KillSwitch [WORKING 2023]
  3. // @namespace Take Over MooMoo
  4. // @version 0.3
  5. // @description Take Over MooMoo.io
  6. // @match *://moomoo.io/*
  7. // @match *://*.moomoo.io/*
  8. // @author Logixx
  9. // @require https://greasyfork.org/scripts/423602-msgpack/code/msgpack.js
  10. // @require https://unpkg.com/guify@0.12.0/lib/guify.min.js
  11. // @require https://update.greasyfork.org/scripts/480301/1283571/CowJS.js
  12. // @grant none
  13. // @license https://greasyfork.org/en/users/1222651-logixx
  14. // @icon https://moomoo.io/img/favicon.png?v=1
  15. // @run-at document-start
  16. // ==/UserScript==
  17. (function () {
  18. 'use strict'
  19.  
  20.  
  21. // Variables
  22. var gearcounter = 1;
  23. var gear = false;
  24. var Allplayers = [];
  25. var players = [];
  26. var items = [];
  27. var weapons = [];
  28. var inGame = false;
  29. var tmpHealth = 100;
  30. var sTime = 0;
  31. var sCount = 0;
  32. var msgpack = window.msgpack;
  33. var scale = 45;
  34. var placeOffset = 5;
  35. var ws;
  36. var EnemyAngle1 = 0;
  37. var lastWeaponRangeMultChange = null
  38. var Boughtscuba = false;
  39. var BoughtscubaEle;
  40. var prevHatID = 0;
  41. var prevTailID = 0;
  42. var boughtItems = false;
  43. var boughtItems2 = false;
  44. var monkeyTail = false;
  45. var boostHat = false;
  46. var snowGear = false;
  47. var PLAYER_SPEED = .0016;
  48. var i = 0;
  49.  
  50. const { Cow, CowUtils } = window
  51.  
  52. var x1 = 0;
  53. var y1 = 0;
  54.  
  55. function saveSettings(HACK, data) {
  56. console.log(
  57. 'save: ' + HACK.toLowerCase().toString() + ' ' + data.toString()
  58. )
  59. localStorage.setItem(
  60. HACK.toLowerCase().toString(),
  61. data.toString()
  62. )
  63. }
  64.  
  65. var settings = {
  66.  
  67. ping: { e: localStorage.getItem('ping') || false },
  68. showsid: {e: localStorage.getItem('showsid') || false },
  69. percents: { e: localStorage.getItem('percents') || false },
  70. tracers: { e: localStorage.getItem('tracers') || false },
  71. hp: { e: localStorage.getItem('hp') || false },
  72. circles_hp: { e: localStorage.getItem('circles_hp') || false },
  73. inweaponrange: { e: Number(localStorage.getItem('inwprange')) || false },
  74. whereurlooking: { e: Number(localStorage.getItem('whereurlooking')) || false },
  75. healthbars: {e: Number(localStorage.getItem('healthbars')) || false },
  76. hitcounter: { e: Number(localStorage.getItem('hitcounter')) || false },
  77. hpcolor: 'red',
  78. weaponrange: { e: Number(localStorage.getItem('weaponrange')) || 1 },
  79. enabledhacks: { e: localStorage.getItem('enabledhacks') || false },
  80. coloredstructures: { e: localStorage.getItem('coloredstructures') || false },
  81.  
  82. tripleautomill: { e: localStorage.getItem('tripleautomill') || false, k: localStorage.getItem('tripleautomillk') || 'KeyM', d: true, n: 'Triple AutoMill' },
  83. autoboost: { e: localStorage.getItem('autoboost') || false, k: localStorage.getItem('autoboostk') || 'KeyB', d: true, n: 'AutoBoost' },
  84. autoboostspikes: { e: localStorage.getItem('autoboostspikes') || false, k: localStorage.getItem('autoboostspikesk') ||'KeyS', d: true, n: 'AutoBoost + Spikes' },
  85. autotrap: { e: localStorage.getItem('autotrap') || false, k: localStorage.getItem('autotrapk') || 'KeyT', d: true, n: 'AutoTrap' },
  86. autoheal: { e: localStorage.getItem('autoheal') || false, k: localStorage.getItem('autohealk') || 'KeyH', s: Number(localStorage.getItem('autoheals')) || 10, d: true, n: 'AutoHeal'},
  87. autoscuba: { e: localStorage.getItem('autoscuba') || false, k: localStorage.getItem('autoscubak') || 'KeyS', d: false },
  88. autobreak: { e: localStorage.getItem('autobreak') || false, k: localStorage.getItem('autobreakk') || 'KeyD', d: true, n: 'AutoBreak' },
  89. autospeed_hat_acc: { e: localStorage.getItem('autospeed_hat_acc') || false, k: localStorage.getItem('autospeed_hat_acck') || 'KeyA', d: true, n: 'AutoSpeed + Hat + Acc' },
  90. toggleoffspeed_hit_and_on: { e: localStorage.getItem('toggleoffspeed_hit_and_on') || false, k: localStorage.getItem('toggleoffspeed_hit_and_onk') || 'KeyL', d: false },
  91. antibow: { e: localStorage.getItem('antibow') || false, k: localStorage.getItem('antibowk') || 'KeyQ', d: true, n: 'AntiBow' },
  92. insta_kill: { e: localStorage.getItem('insta_kill') || false, k: localStorage.getItem('insta_killk') || 'KeyE', d: true, n: 'Insta Kill' },
  93. biomegear: { e: localStorage.getItem('biomegear') || true },
  94.  
  95. autojoin: { e: localStorage.getItem('autojoin') || false, n: Number(localStorage.getItem('autojoinn')) || 0 },
  96. autocreate: { e: localStorage.getItem('autocreate') || false, n: localStorage.getItem('autocreaten') || 'Killers' },
  97. autoleave: {e: localStorage.getItem('autoleave') || false },
  98. autokick: {e: localStorage.getItem('autokick') || false, n: localStorage.getItem('autokickn') || '' },
  99. };
  100.  
  101. const inventory = {
  102. primary: null,
  103. secondary: null,
  104. food: null,
  105. wall: null,
  106. spike: null,
  107. mill: null,
  108. mine: null,
  109. boostPad: null,
  110. trap: null,
  111. turret: null,
  112. spawnpad: null
  113. };
  114.  
  115. const myPlayer = {
  116. food: null,
  117. wood: null,
  118. stone: null,
  119. points: null,
  120. kills: null,
  121. sid: null,
  122. x: null,
  123. y: null,
  124. dir: null,
  125. buildIndex: null,
  126. weaponIndex: null,
  127. weaponVariant: null,
  128. team: null,
  129. isLeader: null,
  130. skinIndex: null,
  131. tailIndex: null,
  132. iconIndex: null,
  133. CAMX: 0,
  134. CAMY: 0,
  135. };
  136.  
  137. //GUI
  138.  
  139. const gui = new guify({
  140. title: 'MultiHack',
  141. align: 'right',
  142. width: 600,
  143. opacity: 0.8,
  144. barMode: 'none',
  145. theme: {
  146. colors: {
  147. panelBackground: 'rgb(0,0,0)',
  148. componentBackground: 'rgb(10,10,25)',
  149. componentForeground: 'red',
  150. textPrimary: 'red',
  151. textSecondary: 'red',
  152. textHover: 'rgb(0,0,0)',
  153. },
  154. font: {
  155. fontSize: '20px',
  156. fontFamily: 'Hammersmith',
  157. },
  158. },
  159. })
  160.  
  161. const folders = [
  162. 'Visuals',
  163. 'Misc',
  164. 'Keybinds',
  165. 'Team',
  166. ];
  167.  
  168. const visuals = [
  169. 'Ping',
  170. 'ShowSID',
  171. 'Percents',
  172. 'Tracers',
  173. 'Hp',
  174. 'EnabledHacks',
  175. 'ColoredStructures',
  176. 'HealthBars',
  177. 'Circles_Hp',
  178. 'InWeaponRange',
  179. 'WhereURLooking',
  180. 'HitCounter',
  181. 'WeaponRange',
  182. ];
  183.  
  184. const misc = [
  185. 'TripleAutoMill',
  186. 'AutoBoost',
  187. 'AutoBoostSpikes',
  188. 'AutoTrap',
  189. 'AutoHeal',
  190. 'AutoScuba',
  191. 'AutoBreak',
  192. 'AutoSpeed_Hat_Acc',
  193. 'ToggleOffSpeed_Hit_And_On',
  194. 'AntiBow',
  195. 'Insta_Kill',
  196. 'BiomeGear',
  197. ];
  198.  
  199. const team = [
  200. 'AutoJoin',
  201. 'ID To Join:',
  202. 'AutoCreate',
  203. 'Name To Create:',
  204. 'AutoLeave',
  205. 'AutoKick',
  206. 'Persons ID To Kick:',
  207. ];
  208.  
  209. for (let key in settings) {
  210. if (localStorage.getItem(key.toLowerCase() === undefined)) {
  211. localStorage.setItem(key.toLowerCase(), 'false')
  212. }
  213. if (localStorage.getItem(key.toLowerCase()) === 'false') {
  214. settings[key].e = false
  215. } else
  216. if (localStorage.getItem(key.toLowerCase()) === 'true') {
  217. settings[key].e = true
  218. }
  219. }
  220.  
  221. for(let j0 = 0; j0 < folders.length; j0++) {
  222. gui.Register({
  223. type: 'folder',
  224. label: folders[j0],
  225. open: !1
  226. });
  227. };
  228.  
  229. for (let j1 = 0; j1 < visuals.length; j1++) {
  230. if (visuals[j1].toLowerCase() === 'weaponrange') {
  231. gui.Register({
  232. type: 'range',
  233. label: visuals[j1],
  234. folder: folders[0],
  235. object: settings[visuals[j1].toLowerCase()],
  236. property: 'e',
  237. step: 1,
  238. min: 1,
  239. max: 5,
  240. onChange: (data) => {
  241. saveSettings(visuals[j1].toLowerCase(), data);
  242. }
  243. });
  244. } else {
  245. gui.Register({
  246. type: 'checkbox',
  247. label: visuals[j1],
  248. folder: folders[0],
  249. object: settings[visuals[j1].toLowerCase()],
  250. property: 'e',
  251. onChange: (data) => {
  252. saveSettings(visuals[j1].toLowerCase(), data);
  253. }
  254. });
  255. };
  256. };
  257. for (let j2 = 0; j2 < misc.length; j2++) {
  258. gui.Register({
  259. type: 'checkbox',
  260. label: misc[j2],
  261. folder: folders[1],
  262. object: settings[misc[j2].toLowerCase()],
  263. property: 'e',
  264. onChange: (data) => {
  265. saveSettings(misc[j2].toLowerCase(), data);
  266. }
  267. });
  268. };
  269.  
  270. const script = {
  271. setKeybind: function (selection, save) {
  272. selection.k = 'Press Any Key'
  273. document.addEventListener('keydown', function set_key(e) {
  274. if (e.key === 'Escape') {
  275. selection.k = 'NONE'
  276. localStorage.setItem(save, selection.k)
  277. document.removeEventListener('keydown', set_key)
  278. } else {
  279. selection.k = e.code
  280. localStorage.setItem(save, selection.k)
  281. document.removeEventListener('keydown', set_key)
  282. }
  283. })
  284. },
  285. };
  286.  
  287. gui.Register({
  288. type: 'button',
  289. label: 'AUTUTU',
  290. folder: folders[3],
  291. action: () => {
  292. testerWeap()
  293. }
  294. });
  295.  
  296. gui.Register({
  297. type: 'button',
  298. label: team[0],
  299. folder: folders[3],
  300. action: () => {
  301. joinTeam(settings.autojoin.n)
  302. }
  303. });
  304. gui.Register({
  305. type: 'text',
  306. label: team[1],
  307. folder: folders[3],
  308. object: settings.autojoin,
  309. property: 'n',
  310. onChange: (data) => {
  311. saveSettings('autojoinn', data);
  312. }
  313. });
  314. gui.Register({
  315. type: 'button',
  316. label: team[2],
  317. folder: folders[3],
  318. action: () => {
  319. createTeam(settings.autocreate.n)
  320. }
  321. });
  322. gui.Register({
  323. type: 'text',
  324. label: team[3],
  325. folder: folders[3],
  326. object: settings.autocreate,
  327. property: 'n',
  328. onChange: (data) => {
  329. saveSettings('autocreaten', data);
  330. }
  331. });
  332. gui.Register({ // e
  333. type: 'button',
  334. label: team[4],
  335. folder: folders[3],
  336. action: () => {
  337. leaveTeam()
  338. }
  339. });
  340. gui.Register({ // e
  341. type: 'button',
  342. label: team[5],
  343. folder: folders[3],
  344. action: () => {
  345. kickTeam(settings.autokick.n)
  346. }
  347. });
  348. gui.Register({
  349. type: 'text',
  350. label: team[6],
  351. folder: folders[3],
  352. object: settings.autokick,
  353. property: 'n',
  354. onChange: (data) => {
  355. saveSettings('autokickn', data);
  356. }
  357. });
  358.  
  359. gui.Register({
  360. type: 'button',
  361. label: 'Set '+misc[0]+' Key',
  362. folder: folders[2],
  363. action: () => {
  364. script.setKeybind(settings.tripleautomill, 'tripleautomillk')
  365. }
  366. });
  367. gui.Register({
  368. type: 'display',
  369. label: misc[0]+' Key:',
  370. folder: folders[2],
  371. object: settings[misc[0].toLowerCase()],
  372. property: 'k',
  373. });
  374. //AutoBoost
  375. gui.Register({
  376. type: 'button',
  377. label: 'Set '+misc[1]+' Key',
  378. folder: folders[2],
  379. action: () => {
  380. script.setKeybind(settings.autoboost, 'autoboostk')
  381. }
  382. });
  383. gui.Register({
  384. type: 'display',
  385. label: misc[1]+' Key:',
  386. folder: folders[2],
  387. object: settings[misc[1].toLowerCase()],
  388. property: 'k',
  389. });
  390. //AutoBoostSpikes
  391. gui.Register({
  392. type: 'button',
  393. label: 'Set '+misc[2]+' Key',
  394. folder: folders[2],
  395. action: () => {
  396. script.setKeybind(settings.autoboostspikes, 'autoboostspikesk')
  397. }
  398. });
  399. gui.Register({
  400. type: 'display',
  401. label: misc[2]+' Key:',
  402. folder: folders[2],
  403. object: settings[misc[2].toLowerCase()],
  404. property: 'k',
  405. });
  406. //AutoTrap
  407. gui.Register({
  408. type: 'button',
  409. label: 'Set '+misc[3]+' Key',
  410. folder: folders[2],
  411. action: () => {
  412. script.setKeybind(settings.autotrap, 'autotrapk')
  413. }
  414. });
  415. gui.Register({
  416. type: 'display',
  417. label: misc[3]+' Key:',
  418. folder: folders[2],
  419. object: settings[misc[3].toLowerCase()],
  420. property: 'k',
  421. });
  422. //AutoHeal
  423. gui.Register({
  424. type: 'button',
  425. label: 'Set '+misc[4]+' Key',
  426. folder: folders[2],
  427. action: () => {
  428. script.setKeybind(settings.autoheal, 'autohealk')
  429. }
  430. });
  431. gui.Register({
  432. type: 'display',
  433. label: misc[4]+' Key:',
  434. folder: folders[2],
  435. object: settings[misc[4].toLowerCase()],
  436. property: 'k',
  437. });
  438. gui.Register({
  439. type: 'range',
  440. label: misc[4]+ ' Speed:',
  441. folder: folders[2],
  442. min: 1,
  443. max: 1000,
  444. step: 1,
  445. object: settings[misc[4].toLowerCase()],
  446. property: 's',
  447. onChange() {
  448. saveSettings('autoheals', settings.autoheal.s)
  449. }
  450. });
  451. //AutoScuba
  452. gui.Register({
  453. type: 'button',
  454. label: 'Set '+misc[5]+' Key',
  455. folder: folders[2],
  456. action: () => {
  457. script.setKeybind(settings.autoscuba, 'autoscubak')
  458. }
  459. });
  460. gui.Register({
  461. type: 'display',
  462. label: misc[5]+' Key:',
  463. folder: folders[2],
  464. object: settings[misc[5].toLowerCase()],
  465. property: 'k',
  466. });
  467. //AutoBreak
  468. gui.Register({
  469. type: 'button',
  470. label: 'Set '+misc[6]+' Key',
  471. folder: folders[2],
  472. action: () => {
  473. script.setKeybind(settings.autobreak, 'autobreakk')
  474. }
  475. });
  476. gui.Register({
  477. type: 'display',
  478. label: misc[6]+' Key:',
  479. folder: folders[2],
  480. object: settings[misc[6].toLowerCase()],
  481. property: 'k',
  482. });
  483. //AutoSpeed_Hat_Acc
  484. gui.Register({
  485. type: 'button',
  486. label: 'Set '+misc[7]+' Key',
  487. folder: folders[2],
  488. action: () => {
  489. script.setKeybind(settings.autospeed_hat_acc, 'autospeed_hat_acck')
  490. }
  491. });
  492. gui.Register({
  493. type: 'display',
  494. label: misc[7]+' Key:',
  495. folder: folders[2],
  496. object: settings[misc[7].toLowerCase()],
  497. property: 'k',
  498. });
  499. //ToggleOffSpeed_Hit_And_On
  500. gui.Register({
  501. type: 'button',
  502. label: 'Set '+misc[8]+' Key',
  503. folder: folders[2],
  504. action: () => {
  505. script.setKeybind(settings.toggleoffspeed_hit_and_on, 'toggleoffspeed_hit_and_onk')
  506. }
  507. });
  508. gui.Register({
  509. type: 'display',
  510. label: misc[8]+' Key:',
  511. folder: folders[2],
  512. object: settings[misc[8].toLowerCase()],
  513. property: 'k',
  514. });
  515. //AntiBow
  516. gui.Register({
  517. type: 'button',
  518. label: 'Set '+misc[9]+' Key',
  519. folder: folders[2],
  520. action: () => {
  521. script.setKeybind(settings.antibow, 'antibowk')
  522. }
  523. });
  524. gui.Register({
  525. type: 'display',
  526. label: misc[9]+' Key:',
  527. folder: folders[2],
  528. object: settings[misc[9].toLowerCase()],
  529. property: 'k',
  530. });
  531. //Insta_Kill
  532. gui.Register({
  533. type: 'button',
  534. label: 'Set '+misc[10]+' Key',
  535. folder: folders[2],
  536. action: () => {
  537. script.setKeybind(settings.insta_kill, 'insta_killk')
  538. }
  539. });
  540. gui.Register({
  541. type: 'display',
  542. label: misc[10]+' Key:',
  543. folder: folders[2],
  544. object: settings[misc[10].toLowerCase()],
  545. property: 'k',
  546. });
  547.  
  548. const join = message => Array.isArray(message) ? [...message] : [...message];
  549.  
  550. // WebSocket setup
  551. ws = new Promise(function (resolve) {
  552. let {
  553. send
  554. } = WebSocket.prototype;
  555. WebSocket.prototype.send = function (...x) {
  556. send.apply(this, x);
  557. this.send = send;
  558. this.io = function (...datas) {
  559. const [packet, ...data] = datas;
  560. this.send(new Uint8Array(Array.from(msgpack.encode([packet, data]))));
  561. };
  562.  
  563. document.addEventListener("keydown", event => {
  564. if ('Key'+event.key.toLocaleUpperCase() === settings.autoboost.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  565. settings.autoboost.e = true;
  566. };
  567. if ('Key'+event.key.toLocaleUpperCase() === settings.autoboostspikes.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  568. settings.autoboostspikes.e = true;
  569. };
  570. if ('Key'+event.key.toLocaleUpperCase() === settings.autotrap.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  571. settings.autotrap.e = true;
  572. };
  573. if ('Key'+event.key.toLocaleUpperCase() === settings.insta_kill.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  574. settings.insta_kill.e = true;
  575. };
  576. if ('Key'+event.key.toLocaleUpperCase() === settings.autospeed_hat_acc.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  577. settings.autospeed_hat_acc.e = true;
  578. };
  579. });
  580.  
  581. document.addEventListener("keyup", event => {
  582. if ('Key'+event.key.toLocaleUpperCase() === settings.autoboost.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  583. settings.autoboost.e = false;
  584. };
  585. if ('Key'+event.key.toLocaleUpperCase() === settings.autoboostspikes.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  586. settings.autoboostspikes.e = false;
  587. };
  588. if ('Key'+event.key.toLocaleUpperCase() === settings.autotrap.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  589. settings.autotrap.e = false;
  590. };
  591. if ('Key'+event.key.toLocaleUpperCase() === settings.insta_kill.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  592. settings.insta_kill.e = false;
  593. };
  594. if ('Key'+event.key.toLocaleUpperCase() === settings.autospeed_hat_acc.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  595. settings.autospeed_hat_acc.e = false;
  596. };
  597. });
  598.  
  599. document.addEventListener("keydown", event => {
  600. if ('Key'+event.key.toLocaleUpperCase() === settings.tripleautomill.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  601. settings.tripleautomill.e = !settings.tripleautomill.e;
  602. };
  603. if ('Key'+event.key.toLocaleUpperCase() === settings.autoheal.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  604. settings.autoheal.e = !settings.autoheal.e;
  605. };
  606. if ('Key'+event.key.toLocaleUpperCase() === settings.autobreak.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  607. settings.autobreak.e = !settings.autobreak.e;
  608. };
  609. if ('Key'+event.key.toLocaleUpperCase() === settings.antibow.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  610. settings.antibow.e = !settings.antibow.e;
  611. };
  612. if ('Key'+event.key.toLocaleUpperCase() === settings.toggleoffspeed_hit_and_on.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  613. settings.toggleoffspeed_hit_and_on.e = !settings.toggleoffspeed_hit_and_on.e;
  614. };
  615. if ('Key'+event.key.toLocaleUpperCase() === settings.autoscuba.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  616. settings.autoscuba.e = !settings.autoscuba.e;
  617. };
  618. });
  619.  
  620. this.addEventListener("message", function (e) {
  621. const [packet, data] = msgpack.decode(new Uint8Array(e.data));
  622. let sid = data[0];
  623. let health = data[1];
  624.  
  625. var tmpData = msgpack.decode(new Uint8Array(e.data));
  626. var ms = e;
  627.  
  628.  
  629. let addEventListener = {
  630. setupGame: "C",
  631. updateHealth: "O",
  632. killPlayer: "P",
  633. updateItems: "V"
  634. };
  635.  
  636. switch (packet) {
  637. case addEventListener.setupGame:
  638. inGame = true;
  639. items = [0, 3, 6, 10];
  640. weapons = [0];
  641. break;
  642. case addEventListener.updateHealth:
  643. if (sid === myPlayer.sid) {
  644. if (inGame) {
  645. if (health < 100 && health > 0 && settings.autoheal.e) {
  646. setTimeout(function () {
  647. chat('AutoHealing...')
  648. place(inventory.food);
  649. }, Number(settings.autoheal.s));
  650. }
  651. }
  652. if (tmpHealth - health < 0) {
  653. if (sTime) {
  654. let timeHit = Date.now() - sTime;
  655. sTime = 0;
  656. sCount = timeHit <= 120 ? sCount + 1 : Math.max(0, sCount - 2);
  657. }
  658. } else {
  659. sTime = Date.now();
  660. }
  661. tmpHealth = health;
  662. }
  663. break;
  664. case addEventListener.killPlayer:
  665. inGame = false;
  666. tmpHealth = 200;
  667. break;
  668. case addEventListener.updateItems:
  669. if (sid) {
  670. if (health) {
  671. weapons = sid;
  672. } else {
  673. items = sid;
  674. }
  675. }
  676. break;
  677. };
  678.  
  679. if ((ms = undefined) || (tmpData = (ms = tmpData.length > 1 ? [tmpData[0], ...join(tmpData[1])] : tmpData)[0]) || ms) {
  680. if ("C" == tmpData && null === myPlayer.sid && (myPlayer.sid = ms[1]) || "a" == tmpData) {
  681. for (tmpData = 0; tmpData < ms[1].length / 13; tmpData++) {
  682.  
  683. var data2 = ms[1].slice(13 * tmpData, 13 * (tmpData + 1));
  684. if (data2[0] == myPlayer.sid) {
  685. Object.assign(myPlayer, {
  686. food: document.getElementById("foodDisplay").innerText,
  687. wood: document.getElementById("woodDisplay").innerText,
  688. stone: document.getElementById("stoneDisplay").innerText,
  689. points: document.getElementById("scoreDisplay").innerText,
  690. kills: document.getElementById("killCounter").innerText,
  691. sid: data2[0],
  692. x: data2[1],
  693. y: data2[2],
  694. dir: data2[3],
  695. buildIndex: data2[4],
  696. weaponIndex: data2[5],
  697. weaponVariant: data2[6],
  698. team: data2[7],
  699. isLeader: data2[8],
  700. skinIndex: data2[9],
  701. tailIndex: data2[10],
  702. iconIndex: data2[11]
  703. });
  704. } else {
  705. const existingAllPlayerIndex = Allplayers.findIndex(Allplayers => Allplayers.sid === data2[0]);
  706. const existingPlayerIndex = players.findIndex(players => players.sid === data2[0]);
  707.  
  708. if (existingPlayerIndex !== -1) {
  709. // Update existing player information
  710. players[existingPlayerIndex] = {
  711. sid: data2[0],
  712. x: data2[1],
  713. y: data2[2],
  714. dir: data2[3],
  715. buildIndex: data2[4],
  716. weaponIndex: data2[5],
  717. weaponVariant: data2[6],
  718. team: data2[7],
  719. isLeader: data2[8],
  720. skinIndex: data2[9],
  721. tailIndex: data2[10],
  722. iconIndex: data2[11]
  723. };
  724. } else {
  725. players.push({
  726. sid: data2[0],
  727. x: data2[1],
  728. y: data2[2],
  729. dir: data2[3],
  730. buildIndex: data2[4],
  731. weaponIndex: data2[5],
  732. weaponVariant: data2[6],
  733. team: data2[7],
  734. isLeader: data2[8],
  735. skinIndex: data2[9],
  736. tailIndex: data2[10],
  737. iconIndex: data2[11]
  738. });
  739. }
  740.  
  741. if (existingAllPlayerIndex !== -1) {
  742. // Update existing player information
  743. Allplayers[existingAllPlayerIndex] = {
  744. sid: data2[0],
  745. x: data2[1],
  746. y: data2[2],
  747. dir: data2[3],
  748. buildIndex: data2[4],
  749. weaponIndex: data2[5],
  750. weaponVariant: data2[6],
  751. team: data2[7],
  752. isLeader: data2[8],
  753. skinIndex: data2[9],
  754. tailIndex: data2[10],
  755. iconIndex: data2[11]
  756. };
  757. } else {
  758. // Add a new player entry to the players array
  759. Allplayers.push({
  760. sid: data2[0],
  761. x: data2[1],
  762. y: data2[2],
  763. dir: data2[3],
  764. buildIndex: data2[4],
  765. weaponIndex: data2[5],
  766. weaponVariant: data2[6],
  767. team: data2[7],
  768. isLeader: data2[8],
  769. skinIndex: data2[9],
  770. tailIndex: data2[10],
  771. iconIndex: data2[11]
  772. });
  773. }
  774. };
  775.  
  776. if (myPlayer.skinIndex < 1 || !myPlayer.tailIndex < 1) {
  777. PLAYER_SPEED = .0016;
  778. } else {
  779. PLAYER_SPEED = (.0016 * (myPlayer.skinIndex ? (myPlayer.skinIndex === 56 ? (1.1) : myPlayer.skinIndex === 12 ? (1.16) : 1 ) : 1 ) * (myPlayer.tailIndex ? (myPlayer.tailIndex === 11 ? (1.35) : (myPlayer.tailIndex === 19 ? (1.1) : 1 ) ) : 1 ));
  780. };
  781.  
  782. // LOGIC AUTO MILL :D
  783.  
  784. if (y1 !== myPlayer.y || x1 !== myPlayer.x) {
  785. if (Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x) < (scale + placeOffset) * 2) {
  786.  
  787. const millCost = {
  788. wood: (inventory.mill === 10 ? 50 : (inventory.mill === 11 ? 60 : (inventory.mill === 12 ? 100 : 50))),
  789. stone: (inventory.mill === 10 ? 10 : (inventory.mill === 11 ? 20 : (inventory.mill === 12 ? 50 : 10))),
  790. };
  791.  
  792. if (settings.tripleautomill.e && myPlayer.wood >= millCost.wood && myPlayer.stone >= millCost.stone && inGame) {
  793. let angle = Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x);
  794. setTimeout(function () {
  795. chat('TripleMill...')
  796. place(inventory.mill, angle + Math.PI / 2.5);
  797. place(inventory.mill, angle);
  798. place(inventory.mill, angle - Math.PI / 2.5);
  799. }, PLAYER_SPEED);
  800. };
  801. // AUTO BOOST PAD :D
  802.  
  803. const boostCost = {
  804. wood: 5,
  805. stone: 20,
  806. };
  807.  
  808. if (settings.autoboost.e && myPlayer.wood >= boostCost.wood && myPlayer.stone >= boostCost.stone && inGame) {
  809. let angle = Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x);
  810. setTimeout(function () {
  811. chat('Boosting...')
  812. place(inventory.boostPad, angle + Math.PI);
  813. }, PLAYER_SPEED);
  814. };
  815.  
  816. // AUTO BOOST SPIKES :D
  817.  
  818. const spikeCost = {
  819. wood: (inventory.spike === 6 ? 20 : (inventory.spike === 7 ? 30 : (inventory.spike === 8 ? 35 : (inventory.spike === 9 ? 30 : 20)))),
  820. stone: (inventory.spike === 6 ? 5 : (inventory.spike === 7 ? 10 : (inventory.spike === 8 ? 15 : (inventory.spike === 9 ? 20 : 5)))),
  821. }
  822.  
  823. if (settings.autoboostspikes.e && myPlayer.wood >= boostCost.wood+spikeCost.wood && myPlayer.stone >= boostCost.stone+spikeCost.stone && inGame) {
  824. let angle = Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x);
  825. chat('Boosting + Spikes...')
  826. place(inventory.spike, angle + Math.PI / 2);
  827. place(inventory.boostPad, angle + Math.PI);
  828. place(inventory.spike, angle - Math.PI / 2);
  829. };
  830.  
  831. // AUTO TRAP :D
  832.  
  833. const trapCost = {
  834. wood: 30,
  835. stone: 30,
  836. }
  837.  
  838. if (settings.autotrap.e && myPlayer.wood >= trapCost.wood && myPlayer.stone >= trapCost.stone && inGame) {
  839. setTimeout(function () {
  840. chat('AutoTraping...')
  841. let angle = Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x);
  842. place(inventory.trap, angle + Math.PI / 2.5);
  843. place(inventory.trap, angle + Math.PI);
  844. place(inventory.trap, angle - Math.PI / 2.5);
  845. }, PLAYER_SPEED);
  846. };
  847.  
  848. // AUTO SCUBA :D
  849.  
  850. if (Boughtscuba === true) {} else {
  851. BoughtscubaEle = document.getElementById('storeDisplay21');
  852. };
  853.  
  854. if (Boughtscuba !== true && Number(myPlayer.points) >= 2500 && settings.autoscuba.e) { console.log(`BUY ${myPlayer.points}`); storeBuy(31); storeEquip(31); Boughtscuba = true; BoughtscubaEle = true; };
  855. if (BoughtscubaEle !== true && BoughtscubaEle !== null) {
  856. if (BoughtscubaEle.innerText.includes('Equip') && Boughtscuba !== false) { Boughtscuba = true; BoughtscubaEle = true; };
  857. };
  858.  
  859. var inWater = false;
  860.  
  861. var inSnow = false;
  862.  
  863. if (Number(myPlayer.y) >= ((14400 / 2) - 375) && Number(myPlayer.y) <= ((14400 / 2) + 375)) {
  864. inWater = true;
  865. };
  866.  
  867. const snowY = window.config.snowBiomeTop
  868.  
  869. if(myPlayer.y <= snowY) {
  870. inSnow = true;
  871. };
  872.  
  873. if (settings.autospeed_hat_acc.e || inWater || inSnow) {
  874. if (!snowGear && Number(myPlayer.points) >= 600) {
  875. storeBuy(15);
  876. snowGear = true;
  877. };
  878.  
  879. if (inSnow && snowGear && inGame && settings.biomegear.e) {
  880. storeEquip(15);
  881. };
  882. if (inWater && settings.autoscuba.e && inGame && Boughtscuba) {
  883. storeEquip(31);
  884. };
  885. if (!boughtItems && settings.autospeed_hat_acc.e && Number(myPlayer.points) >= 6000) {
  886. storeBuy(12, 0);
  887. boughtItems = true;
  888. } else
  889. if (!boughtItems2 && settings.autospeed_hat_acc.e && Number(myPlayer.points) >= 2000) {
  890. storeBuy(11, 1);
  891. boughtItems2 = true;
  892. };
  893. if (settings.autospeed_hat_acc.e && inGame && boughtItems && boughtItems2) {
  894. chat('Speed...')
  895. if (boughtItems && !boostHat && monkeyTail) {
  896. storeEquip(12, 0);
  897. boostHat = true;
  898. } else
  899. if (boughtItems2 && !monkeyTail) {
  900. storeEquip(11, 1);
  901. monkeyTail = true;
  902. };
  903. }
  904. } else {
  905. if (!settings.autospeed_hat_acc.e && inGame) {
  906. if (monkeyTail && boughtItems2 && !boostHat) {
  907. storeEquip(prevTailID, 1);
  908. monkeyTail = false;
  909. } else
  910. if (boostHat && boughtItems) {
  911. storeEquip(prevHatID, 0);
  912. boostHat = false;
  913. };
  914. };
  915. if (prevHatID !== Number(myPlayer.skinIndex) && myPlayer.skinIndex !== 31 && myPlayer.skinIndex !== 12 && myPlayer.skinIndex !== 15) {
  916. prevHatID = Number(myPlayer.skinIndex);
  917. };
  918. if (prevTailID !== Number(myPlayer.tailIndex) && myPlayer.tailIndex !== 11) {
  919. prevTailID = Number(myPlayer.tailIndex);
  920. };
  921. i === 0 ? (
  922. storeEquip(prevHatID, i),
  923. i = 1
  924. ) : (
  925. storeEquip(prevTailID, i),
  926. i = 0
  927. );
  928. };
  929.  
  930. x1 = myPlayer.x;
  931. y1 = myPlayer.y;
  932. };
  933. };
  934. };
  935. };
  936. cacheItems();
  937. };
  938. });
  939. resolve(this);
  940. };
  941. });
  942.  
  943. // Functions
  944. const sendPacket = function (...datas) {
  945. const [type, ...data] = datas;
  946. var binary = msgpack.encode([type, data]);
  947. ws.then(function (wsInstance) {
  948. wsInstance.send(new Uint8Array(Array.from(binary)));
  949. });
  950. };
  951.  
  952. function findPlayerBySID(sid) {
  953. for (var i = 0; i < Allplayers.length; i++) {
  954. if (Allplayers[i].sid == sid) {
  955. return Allplayers[i];
  956. }
  957. } return null;
  958. };
  959.  
  960. function objectAlly(sid) {
  961. var tmpObj = findPlayerBySID(sid);
  962.  
  963. if (myPlayer.sid == sid) {
  964. return true
  965. } else if (!tmpObj) {
  966. return false;
  967. } else if (tmpObj.team) {
  968. return tmpObj.team === myPlayer.team ? true : false
  969. } else {
  970. return false
  971. };
  972. };
  973.  
  974. function isAlly(sid){
  975.  
  976. var tmpObj = findPlayerBySID(sid)
  977. if (!tmpObj){
  978. return false
  979. }
  980. if (myPlayer.sid == sid){
  981. return true
  982. }else if (tmpObj.team){
  983. return tmpObj.team === myPlayer.team ? true : false
  984. } else {
  985. return
  986. }
  987. };
  988.  
  989. const emit = (event, a, b, c, m, r) => ws.then(function (wsInstance){wsInstance.send(Uint8Array.from([...msgpack.encode([event, [a, b, c, m, r]])]))});
  990.  
  991. //BUYEQUIP
  992.  
  993. const buyEquip = (id) => {
  994. window.storeBuy(id)
  995. setTimeout(() => {
  996. window.storeEquip(id)
  997. }, 15);
  998. }
  999.  
  1000. //TEAM
  1001. const leaveTeam = () => {
  1002. sendPacket("N")
  1003. };
  1004.  
  1005. const kickTeam = (id) => {
  1006. sendPacket("Q", Number(id))
  1007. }
  1008.  
  1009. const createTeam = (name) => {
  1010. sendPacket("L", name.toString().charAt(0).toUpperCase()+name.toString().slice(1));
  1011. }
  1012.  
  1013. const joinTeam = (id) => {
  1014. sendPacket("b", Number(id));
  1015. };
  1016.  
  1017. // PLACE
  1018. const place = (thing, angle) => {
  1019. emit("G", thing, false);
  1020. emit("d", 1, angle);
  1021. emit("d", 0, angle);
  1022. emit("G", myPlayer.weaponIndex, true);
  1023. };
  1024.  
  1025. // SELECT WEAPON
  1026. const selectWeapon = function (index) {
  1027. if (inGame) {
  1028. console.log(weapons[index])
  1029. emit("G", weapons[index], true);
  1030. }
  1031. };
  1032.  
  1033. // HIT
  1034. const hit = function (ang) {
  1035. if (inGame) {
  1036. emit("d", 1, ang);
  1037. emit("d", 0, ang);
  1038. }
  1039. };
  1040. // CHAT
  1041. const chat = function (e) {
  1042. if (inGame) {
  1043. sendPacket("S", 1);
  1044. sendPacket("K", 1);
  1045. }
  1046. };
  1047.  
  1048. const cacheItems = () => {
  1049. for (let c = 0; c < 9; c++) {
  1050. var _document$getElementB;
  1051. if (((_document$getElementB = document.getElementById(`actionBarItem${c}`)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.offsetParent) !== null) {
  1052. inventory.primary = c;
  1053. }
  1054. }
  1055. for (let s = 9; s < 16; s++) {
  1056. var _document$getElementB2;
  1057. if (((_document$getElementB2 = document.getElementById(`actionBarItem${s}`)) === null || _document$getElementB2 === void 0 ? void 0 : _document$getElementB2.offsetParent) !== null) {
  1058. inventory.secondary = s;
  1059. }
  1060. }
  1061. for (let P = 16; P < 19; P++) {
  1062. var _document$getElementB3;
  1063. if (((_document$getElementB3 = document.getElementById(`actionBarItem${P}`)) === null || _document$getElementB3 === void 0 ? void 0 : _document$getElementB3.offsetParent) !== null) {
  1064. inventory.food = P - 16;
  1065. }
  1066. }
  1067. for (let f = 19; f < 22; f++) {
  1068. var _document$getElementB4;
  1069. if (((_document$getElementB4 = document.getElementById(`actionBarItem${f}`)) === null || _document$getElementB4 === void 0 ? void 0 : _document$getElementB4.offsetParent) !== null) {
  1070. inventory.wall = f - 16;
  1071. }
  1072. }
  1073. for (let _ = 22; _ < 26; _++) {
  1074. var _document$getElementB5;
  1075. if (((_document$getElementB5 = document.getElementById(`actionBarItem${_}`)) === null || _document$getElementB5 === void 0 ? void 0 : _document$getElementB5.offsetParent) !== null) {
  1076. inventory.spike = _ - 16;
  1077. }
  1078. }
  1079. for (let u = 26; u < 29; u++) {
  1080. var _document$getElementB6;
  1081. if (((_document$getElementB6 = document.getElementById(`actionBarItem${u}`)) === null || _document$getElementB6 === void 0 ? void 0 : _document$getElementB6.offsetParent) !== null) {
  1082. inventory.mill = u - 16;
  1083. }
  1084. }
  1085. for (let I = 29; I < 31; I++) {
  1086. var _document$getElementB7;
  1087. if (((_document$getElementB7 = document.getElementById(`actionBarItem${I}`)) === null || _document$getElementB7 === void 0 ? void 0 : _document$getElementB7.offsetParent) !== null) {
  1088. inventory.mine = I - 16;
  1089. }
  1090. }
  1091. for (let p = 31; p < 33; p++) {
  1092. var _document$getElementB8;
  1093. if (((_document$getElementB8 = document.getElementById(`actionBarItem${p}`)) === null || _document$getElementB8 === void 0 ? void 0 : _document$getElementB8.offsetParent) !== null) {
  1094. inventory.boostPad = p - 16;
  1095. }
  1096. }
  1097. for (let x = 31; x < 33; x++) {
  1098. var _document$getElementB9;
  1099. if (((_document$getElementB9 = document.getElementById(`actionBarItem${x}`)) === null || _document$getElementB9 === void 0 ? void 0 : _document$getElementB9.offsetParent) !== null) {
  1100. inventory.trap = x - 16;
  1101. }
  1102. }
  1103. for (let g = 29; g < 31; g++) {
  1104. var _document$getElementB10;
  1105. if (((_document$getElementB10 = document.getElementById(`actionBarItem${g}`)) === null || _document$getElementB10 === void 0 ? void 0 : _document$getElementB10.offsetParent) !== null && g !== 36) {
  1106. inventory.turret = g - 16;
  1107. }
  1108. }
  1109. inventory.spawnpad = 36;
  1110. };
  1111.  
  1112. window.addEventListener('DOMContentLoaded', () => {
  1113.  
  1114. var connecting = document.getElementById('loadingText');
  1115. var diedMsg = document.getElementById('diedText');
  1116. var gameLogo = document.getElementById('gameName');
  1117.  
  1118. connecting.textContent = 'Switching On KillSwitch';
  1119. diedMsg.textContent = 'You Died, Go MOD!';
  1120. gameLogo.textContent = 'KillSwitch';
  1121. gameLogo.style.color = 'black';
  1122.  
  1123. lastWeaponRangeMultChange = Date.now()
  1124. resetPlayers()
  1125. });
  1126.  
  1127. function resetPlayers() {
  1128. players = [];
  1129. setTimeout(() => {
  1130. resetPlayers()
  1131. }, 1000);
  1132. };
  1133.  
  1134. function drawCircleBar(color, width, scale, endAngle) {
  1135. const { context } = Cow.renderer
  1136.  
  1137. context.strokeStyle = color
  1138. context.lineWidth = width
  1139. context.lineCap = "round"
  1140. context.beginPath()
  1141. context.arc(0, 0, scale, 0, endAngle)
  1142. context.stroke()
  1143. context.closePath()
  1144. };
  1145.  
  1146. function drawCircle(x, y, color, radius, lineWidth) {
  1147. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1148. ctx.beginPath();
  1149. ctx.arc(x, y, radius, 0, 2 * Math.PI);
  1150. ctx.strokeStyle = color;
  1151. ctx.lineWidth = lineWidth
  1152. ctx.stroke();
  1153. };
  1154.  
  1155. function weaponRanges(weaponID) {
  1156. switch (weaponID) {
  1157. case 0:
  1158. return 65;
  1159. break;
  1160. case 1:
  1161. return 70;
  1162. break;
  1163. case 2:
  1164. return 75;
  1165. break;
  1166. case 3:
  1167. return 110;
  1168. break;
  1169. case 4:
  1170. return 118;
  1171. break;
  1172. case 5:
  1173. return 142;
  1174. break;
  1175. case 6:
  1176. return 110;
  1177. break;
  1178. case 7:
  1179. return 65;
  1180. break;
  1181. case 8:
  1182. return 70;
  1183. break;
  1184. case 9:
  1185. return 200;
  1186. break;
  1187. case 10:
  1188. return 75;
  1189. break;
  1190. case 11:
  1191. return 0;
  1192. break;
  1193. case 12:
  1194. return 200;
  1195. break;
  1196. case 13:
  1197. return 200;
  1198. break;
  1199. case 14:
  1200. return 0;
  1201. break;
  1202. case 15:
  1203. return 200;
  1204. break;
  1205.  
  1206. default:
  1207. return 0;
  1208. break;
  1209. };
  1210. };
  1211.  
  1212. Cow.addRender("building-health-bars", () => {
  1213. if (!Cow.player?.alive) return
  1214. if (settings.insta_kill.e && inGame) {
  1215. // console.log('kiddos')
  1216. // if (!gear && Number(myPlayer.points) >= 50000) {
  1217. // console.log('buying', gearcounter)
  1218. // gearcounter === 1 ? (
  1219. // storeBuy(53), gearcounter++) : gearcounter === 2 ? (
  1220. // storeBuy(20), gearcounter++) : gearcounter === 3 ? (
  1221. // storeBuy(7), gearcounter++) : gearcounter === 4 ? (
  1222. // storeBuy(55), gearcounter++) : ( gear = true, gearcounter = 1);
  1223. // };
  1224. // if (gear) {
  1225. for (let i = 0; i < players.length; i++) {
  1226. buyEquip(53) // turret
  1227. var nearestEnemyAngle = Math.atan2(players[i].y - myPlayer.y, players[i].x - myPlayer.x);
  1228. const weaponRangePrimary = weaponRanges(inventory.primary);
  1229. const weaponRangeSecondary = weaponRanges(inventory.secondary);
  1230. console.log(weaponRangeSecondary, weaponRangePrimary, nearestEnemyAngle)
  1231. if (nearestEnemyAngle > weaponRangePrimary) return
  1232. if (weaponRangeSecondary === 200) {
  1233. console.log('selecting')
  1234. selectWeapon(1); // select secondary
  1235. setTimeout(() => {
  1236. buyEquip(7); // bull helmet
  1237. hit(nearestEnemyAngle); // fire
  1238. setTimeout(() => {
  1239. buyEquip(20); // samurai
  1240. setTimeout(() => {
  1241. if (inventory.primary !== 8) {
  1242. buyEquip(55); // bloddthirster
  1243. selectWeapon(0); // select primary
  1244. setTimeout(() => {
  1245. nearestEnemyAngle = Math.atan2(players[i].y - myPlayer.y, players[i].x - myPlayer.x);
  1246. hit(nearestEnemyAngle); // hit the enemy
  1247. hit(nearestEnemyAngle); // hit the enemy
  1248. setTimeout(() => {
  1249. selectWeapon(0)
  1250. storeEquip(0)
  1251. }, 20);
  1252. }, 20);
  1253. } else {
  1254. chat('Sh1t Stick');
  1255. buyEquip(53); // turret
  1256. setTimeout(() => {
  1257. nearestEnemyAngle = Math.atan2(players[i].y - myPlayer.y, players[i].x - myPlayer.x);
  1258. place(inventory.spike, nearestEnemyAngle - Math.PI / 2);
  1259. place(inventory.spike, nearestEnemyAngle + Math.PI);
  1260. place(inventory.spike, nearestEnemyAngle + Math.PI / 2);
  1261. setTimeout(() => {
  1262. selectWeapon(0)
  1263. storeEquip(0)
  1264. }, 20);
  1265. }, 20);
  1266. };
  1267. }, 20);
  1268. }, 20);
  1269. }, 20);
  1270. } else {
  1271. if (inventory.primary !== 8) {
  1272. buyEquip(55); // bloddthirster
  1273. selectWeapon(0); // select primary
  1274. hit(nearestEnemyAngle); // hit the enemy
  1275. hit(nearestEnemyAngle); // hit the enemy
  1276. } else {
  1277. chat('Sh1t Stick');
  1278. buyEquip(53); // turret
  1279. place(inventory.spike, nearestEnemyAngle - Math.PI / 2);
  1280. place(inventory.spike, nearestEnemyAngle + Math.PI);
  1281. place(inventory.spike, nearestEnemyAngle + Math.PI / 2);
  1282. };
  1283. };
  1284. // };
  1285. };
  1286. };
  1287.  
  1288. Object.assign(myPlayer, {
  1289. CAMX: Cow.player.renderX,
  1290. CAMY: Cow.player.renderY,
  1291. });
  1292.  
  1293. const { context } = Cow.renderer
  1294. const weaponRange = (Cow.player.weapon.range + Cow.player.scale / 2) * parseFloat(settings.weaponrange.e)
  1295.  
  1296. if ((Date.now() - lastWeaponRangeMultChange) <= 1500) {
  1297. const color = settings.coloredstructures.e?objectAlly(object.owner.sid) ? 'lime':'red':'blue';
  1298.  
  1299. context.save()
  1300. context.fillStyle = color
  1301. context.strokeStyle = color
  1302. context.globalAlpha = .3
  1303. context.lineWidth = 4
  1304.  
  1305. context.translate(Cow.player.renderX, Cow.player.renderY)
  1306. context.beginPath()
  1307. context.arc(0, 0, weaponRange, 0, Math.PI * 2)
  1308. context.fill()
  1309. context.globalAlpha = .7
  1310. context.stroke()
  1311. context.closePath()
  1312. context.restore()
  1313. } else {
  1314. lastWeaponRangeMultChange = null
  1315. };
  1316.  
  1317. if (settings.enabledhacks.e) {
  1318. (function () {
  1319. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1320. let _ = 100;
  1321. let __ = 60;
  1322. for (let hack in settings) {
  1323. if (settings[hack].e && settings[hack].d) {
  1324. if (settings[hack].n === 'Triple AutoMill') __ = 75;
  1325. if (settings[hack].n === 'AutoBoost + Spikes') __ = 100;
  1326. if (settings[hack].n === 'AutoSpeed + Hat + Acc') __ = 125;
  1327. ctx.save();
  1328. ctx.beginPath();
  1329. ctx.lineWidth = 7;
  1330. ctx.fillStyle = 'red';
  1331. ctx.strokeStyle = 'black';
  1332. ctx.font = '22px Hammersmith, sans-serif';
  1333. ctx.strokeText(
  1334. settings[hack].n,
  1335. __,
  1336. _
  1337. );
  1338. ctx.fillText(
  1339. settings[hack].n,
  1340. __,
  1341. _
  1342. );
  1343. ctx.restore();
  1344. _ += 30;
  1345. };
  1346. };
  1347. })();
  1348. };
  1349.  
  1350. if (settings.showsid.e && inGame) {
  1351. (function () {
  1352. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1353.  
  1354. ctx.save();
  1355. ctx.beginPath();
  1356. ctx.lineWidth = 7;
  1357. ctx.fillStyle = 'lime';
  1358. ctx.strokeStyle = 'black';
  1359. ctx.font = '22px Hammersmith, sans-serif';
  1360. ctx.strokeText(myPlayer.sid, Cow.player.renderX, Cow.player.renderY);
  1361. ctx.fillText(myPlayer.sid, Cow.player.renderX, Cow.player.renderY);
  1362. ctx.restore();
  1363.  
  1364. for (let t = 0; t < players.length; t++) {
  1365.  
  1366. const offsetX = window.config.maxScreenWidth/2-Cow.player.renderX;
  1367. const offsetY = window.config.maxScreenHeight/2-Cow.player.renderY;
  1368.  
  1369. const endX = Math.round(window.config.maxScreenWidth/2 - myPlayer.x + players[t].x - offsetX*2);
  1370. const endY = Math.round(window.config.maxScreenHeight/2 - myPlayer.y + players[t].y - offsetY*2);
  1371.  
  1372. ctx.save();
  1373. ctx.beginPath();
  1374. ctx.lineWidth = 7;
  1375. ctx.fillStyle = isAlly(players[t].sid) ? 'lime' : 'red';
  1376. ctx.strokeStyle = 'black';
  1377. ctx.font = '22px Hammersmith, sans-serif';
  1378. ctx.strokeText(players[t].sid, endX, endY);
  1379. ctx.fillText(players[t].sid, endX, endY);
  1380. ctx.restore();
  1381.  
  1382. }
  1383. })();
  1384. };
  1385.  
  1386. if (settings.tracers.e && inGame) {
  1387. (function () {
  1388. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1389.  
  1390. for (let t = 0; t < players.length; t++) {
  1391. ctx.save();
  1392. ctx.beginPath();
  1393. ctx.lineWidth = 3;
  1394. ctx.moveTo(Cow.player.renderX, Cow.player.renderY);
  1395.  
  1396. const offsetX = window.config.maxScreenWidth/2-Cow.player.renderX
  1397. const offsetY = window.config.maxScreenHeight/2-Cow.player.renderY
  1398.  
  1399. const endX = Math.round(window.config.maxScreenWidth/2 - myPlayer.x + players[t].x - offsetX*2);
  1400. const endY = Math.round(window.config.maxScreenHeight/2 - myPlayer.y + players[t].y - offsetY*2);
  1401.  
  1402. ctx.lineWidth = 5
  1403. ctx.lineTo(endX, endY);
  1404. ctx.strokeStyle = isAlly(players[t].sid) ? 'lime' : 'red';
  1405. ctx.stroke();
  1406.  
  1407. drawCircle(endX, endY, isAlly(players[t].sid) ? 'lime' : 'red', 45, 5);
  1408.  
  1409. ctx.restore();
  1410. }
  1411. })();
  1412. };
  1413.  
  1414. if (settings.ping.e) {
  1415. const ping = document.getElementById('pingDisplay');
  1416. ping.style.display = 'block';
  1417. ping.style.fontSize = '22px';
  1418. } else {
  1419. const ping = document.getElementById('pingDisplay');
  1420. ping.style.display = 'none';
  1421. };
  1422.  
  1423. if (settings.hp.e && inGame) {
  1424. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1425. ctx.save();
  1426. ctx.beginPath();
  1427. ctx.lineWidth = 7;
  1428. ctx.fillStyle = 'lime';
  1429. ctx.strokeStyle = 'black';
  1430. ctx.font = '22px Hammersmith, sans-serif';
  1431. ctx.strokeText(Math.round(tmpHealth*2)+'hp',Cow.player.renderX,Cow.player.renderY+100);
  1432. ctx.fillText(Math.round(tmpHealth*2)+'hp',Cow.player.renderX,Cow.player.renderY+100);
  1433. ctx.restore();
  1434. };
  1435.  
  1436. if (settings.percents.e && inGame) {
  1437. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1438. ctx.save();
  1439. ctx.beginPath();
  1440. ctx.lineWidth = 7;
  1441. ctx.fillStyle = 'lime';
  1442. ctx.strokeStyle = 'black';
  1443. ctx.font = '22px Hammersmith, sans-serif';
  1444. ctx.strokeText(Math.round(tmpHealth)+'%',Cow.player.renderX,Cow.player.renderY+125);
  1445. ctx.fillText(Math.round(tmpHealth)+'%',Cow.player.renderX,Cow.player.renderY+125);
  1446. ctx.restore();
  1447. };
  1448.  
  1449. Cow.objectsManager.eachVisible((object) => {
  1450. if (!object.isItem) return
  1451.  
  1452. const distance = CowUtils.getDistance(Cow.player, object) - object.scale
  1453. const angle = CowUtils.getDirection(object, Cow.player)
  1454.  
  1455. if (object.name === 'pit trap') {
  1456. if (distance < 50 && object.owner.sid !== myPlayer.sid && !(objectAlly(object.owner.sid))) {
  1457. if (settings.autobreak.e && inGame) {
  1458. setTimeout(function () {
  1459. chat('AutoBreaking...')
  1460. var index = 0;
  1461. let angle = Math.atan2(object.y - myPlayer.y, object.x - myPlayer.x);
  1462. if (inventory.primary === 8 && inventory.secondary !== 10) {
  1463. chat("KillSwitch MOD can't help you.");
  1464. };
  1465. index = inventory.secondary === 10 ? 1 : 0;
  1466. selectWeapon(index);
  1467. hit(angle);
  1468. selectWeapon(0);
  1469. }, PLAYER_SPEED);
  1470. };
  1471. };
  1472. };
  1473.  
  1474. if (settings.antibow.e && inGame) {
  1475. for (let t = 0; t < players.length; t++) {
  1476. let nearestEnemyAngle = Math.atan2(players[t].y - myPlayer.y, players[t].x - myPlayer.x);
  1477. let nearestEnemyAngleOpp = Math.atan2(myPlayer.y - players[t].y, myPlayer.x - players[t].x);
  1478. // console.log(nearestEnemyAngleOpp, players[t].dir, nearestEnemyAngleOpp===players[t].dir?true:false)
  1479. if (nearestEnemyAngle &&
  1480. (players[t].weaponIndex === 9 || players[t].weaponIndex === 12 || players[t].weaponIndex === 13 || players[t].weaponIndex === 15)
  1481. && EnemyAngle1 !== nearestEnemyAngle && nearestEnemyAngleOpp >= players[t].dir - .25 && nearestEnemyAngleOpp <= players[t].dir + .25) {
  1482. chat('AntiBow...')
  1483. place(inventory.mill, nearestEnemyAngle);
  1484. selectWeapon(0);
  1485. EnemyAngle1 = nearestEnemyAngle;
  1486. };
  1487. };
  1488. };
  1489.  
  1490. if (settings.inweaponrange.e && distance > weaponRange) return
  1491. if (settings.whereurlooking.e && CowUtils.getAngleDist(angle, Cow.player.lookAngle) > Cow.config.gatherAngle) return
  1492.  
  1493. if (settings.hitcounter.e) {
  1494. const damage = Cow.player.weapon.dmg * Cow.items.variants[Cow.player.weaponVariant].val
  1495. const damageAmount = damage * (Cow.player.weapon.sDmg || 1) * (Cow.player.skin?.id === 40 ? 3.3 : 1)
  1496. const hits = Math.ceil(object.health / damageAmount)
  1497. const offsetY = settings.circles_hp.e ? 2 : 22
  1498.  
  1499. context.save()
  1500. context.font = `18px Hammersmith, sans-serif`
  1501. context.fillStyle = "#fff"
  1502. context.textBaseline = "middle"
  1503. context.textAlign = "center"
  1504. context.lineWidth = 8
  1505. context.lineJoin = "round"
  1506.  
  1507. context.translate(object.renderX, object.renderY)
  1508. context.strokeText(hits, 0, offsetY)
  1509. context.fillText(hits, 0, offsetY)
  1510. context.restore()
  1511. };
  1512.  
  1513. if (settings.circles_hp.e) {
  1514. const endAngle = ((object.health / object.maxHealth) * 360) * (Math.PI / 180)
  1515. const width = 14
  1516. const scale = 22
  1517.  
  1518. context.save()
  1519. context.translate(object.renderX, object.renderY)
  1520. context.rotate(object.dir ?? object.dir2)
  1521. drawCircleBar("#3d3f42", width, scale, endAngle)
  1522. drawCircleBar(settings.coloredstructures.e?objectAlly(object.owner.sid) ? 'lime':'red':'blue', width / 2.5, scale, endAngle)
  1523. context.restore()
  1524.  
  1525. return
  1526. };
  1527.  
  1528. if (settings.healthbars.e || settings.circles_hp.e) {
  1529.  
  1530. const { healthBarWidth, healthBarPad } = window.config
  1531. const width = healthBarWidth / 2 - healthBarPad / 2
  1532. const height = 17
  1533. const radius = 8
  1534.  
  1535. context.save()
  1536. context.translate(object.renderX, object.renderY)
  1537.  
  1538. context.fillStyle = "#3d3f42"
  1539. context.roundRect(-width - healthBarPad, -height / 2, 2 * width + 2 * healthBarPad, height, radius)
  1540. context.fill()
  1541.  
  1542. context.fillStyle = settings.coloredstructures.e?objectAlly(object.owner.sid) ? 'lime':'red':'blue'
  1543. context.roundRect(-width, -height / 2 + healthBarPad, 2 * width * (object.health / object.maxHealth), height - 2 * healthBarPad, radius - 1)
  1544. context.fill()
  1545. context.restore()
  1546. };
  1547. });
  1548. });
  1549. })();