MultiHack KillSwitch [WORKING 2023]

Take Over MooMoo.io

  1. // ==UserScript==
  2. // @name MultiHack KillSwitch [WORKING 2023]
  3. // @namespace Take Over MooMoo
  4. // @version 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 teleport = false;
  23. var stoptrapper = 1;
  24. var allAnimals = [];
  25. var Allplayers = [];
  26. var players = [];
  27. var items = [];
  28. var itemInfo = [{ Idistance: 0, health: 0, damage: 0 }];
  29. var weapons = [];
  30. var inGame = false;
  31. var tmpHealth = 100;
  32. var sTime = 0;
  33. var sCount = 0;
  34. var msgpack = window.msgpack;
  35. var scale = 45;
  36. var placeOffset = 5;
  37. var ws;
  38. var EnemyAngle1 = 0;
  39. var lastWeaponRangeMultChange = null
  40. var Boughtscuba = false;
  41. var BoughtscubaEle;
  42. var prevHatID = 0;
  43. var prevTailID = 0;
  44. var boughtItems = false;
  45. var boughtItems2 = false;
  46. var monkeyTail = false;
  47. var boostHat = false;
  48. var snowGear = false;
  49. var myDmg = 0;
  50. var itemHp = 100;
  51. var hitCount_ = 16;
  52. var i = 0;
  53. var myKills = 0;
  54. var inTrap = false;
  55.  
  56. const { Cow, CowUtils } = window
  57.  
  58. var x1 = 0;
  59. var y1 = 0;
  60.  
  61. function saveSettings(HACK, data) {
  62. console.log(
  63. 'save: ' + HACK.toLowerCase().toString() + ' ' + data.toString()
  64. )
  65. localStorage.setItem(
  66. HACK.toLowerCase().toString(),
  67. data.toString()
  68. )
  69. }
  70.  
  71. var settings = {
  72.  
  73. ping: { e: localStorage.getItem('ping') || false },
  74. showsid: {e: localStorage.getItem('showsid') || false },
  75. percents: { e: localStorage.getItem('percents') || false },
  76. tracers: { e: localStorage.getItem('tracers') || false },
  77. animaltracers: { e: localStorage.getItem('animaltracers') || false },
  78. hp: { e: localStorage.getItem('hp') || false },
  79. circles_hp: { e: localStorage.getItem('circles_hp') || false },
  80. inweaponrange: { e: Number(localStorage.getItem('inwprange')) || false },
  81. whereurlooking: { e: Number(localStorage.getItem('whereurlooking')) || false },
  82. healthbars: {e: Number(localStorage.getItem('healthbars')) || false },
  83. hitcounter: { e: Number(localStorage.getItem('hitcounter')) || false },
  84. hpcolor: 'red',
  85. weaponrange: { e: Number(localStorage.getItem('weaponrange')) || 1 },
  86. enabledhacks: { e: localStorage.getItem('enabledhacks') || false },
  87. coloredstructures: { e: localStorage.getItem('coloredstructures') || false },
  88.  
  89. tripleautomill: { e: localStorage.getItem('tripleautomill') || false, k: localStorage.getItem('tripleautomillk') || 'NONE', d: true, n: 'Triple AutoMill' },
  90. autoboost: { e: localStorage.getItem('autoboost') || false, k: localStorage.getItem('autoboostk') || 'NONE', d: true, n: 'AutoBoost' },
  91. autoboostspikes: { e: localStorage.getItem('autoboostspikes') || false, k: localStorage.getItem('autoboostspikesk') ||'NONE', d: true, n: 'AutoBoost + Spikes' },
  92. autotrap: { e: localStorage.getItem('autotrap') || false, k: localStorage.getItem('autotrapk') || 'NONE', d: true, n: 'AutoTrap' },
  93. autoheal: { e: localStorage.getItem('autoheal') || false, k: localStorage.getItem('autohealk') || 'NONE', cases: ['Default','Fast','Slow'], o: localStorage.getItem('autohealo') || 'Default', d: true, n: 'AutoHeal'},
  94. autoscuba: { e: localStorage.getItem('autoscuba') || false, k: localStorage.getItem('autoscubak') || 'NONE', d: false },
  95. autobreak: { e: localStorage.getItem('autobreak') || false, k: localStorage.getItem('autobreakk') || 'NONE', d: true, n: 'AutoBreak' },
  96. autospeed_hat_acc: { e: localStorage.getItem('autospeed_hat_acc') || false, k: localStorage.getItem('autospeed_hat_acck') || 'NONE', d: true, n: 'AutoSpeed + Hat + Acc' },
  97. toggleoffspeed_hit_and_on: { e: localStorage.getItem('toggleoffspeed_hit_and_on') || false, k: localStorage.getItem('toggleoffspeed_hit_and_onk') || 'NONE', d: false },
  98. antibow: { e: localStorage.getItem('antibow') || false, k: localStorage.getItem('antibowk') || 'NONE', d: true, n: 'AntiBow' },
  99. insta_kill: { e: localStorage.getItem('insta_kill') || false, k: localStorage.getItem('insta_killk') || 'NONE', d: true, n: 'Insta Kill' },
  100. biomegear: { e: localStorage.getItem('biomegear') || true },
  101. antianimal: { e: localStorage.getItem('antianimal') || true, n: Number(localStorage.getItem('antianimaln')) || 200 },
  102.  
  103. autojoin: { e: localStorage.getItem('autojoin') || false, n: Number(localStorage.getItem('autojoinn')) || 0 },
  104. autocreate: { e: localStorage.getItem('autocreate') || false, n: localStorage.getItem('autocreaten') || 'Killers' },
  105. autoleave: {e: localStorage.getItem('autoleave') || false },
  106. autokick: {e: localStorage.getItem('autokick') || false, n: localStorage.getItem('autokickn') || '' },
  107.  
  108. aimbot: { e: localStorage.getItem('aimbot') || false, a: null, d: true, n: 'Aimbot', k: localStorage.getItem('aimbotk') || 'NONE', },
  109. aaimbot: { e: localStorage.getItem('aaimbot') || false, a: null, d: true, n: 'Animal Aimbot', k: localStorage.getItem('aaimbotk') || 'NONE', },
  110. // afk
  111.  
  112. antiplayer: { e: localStorage.getItem('antiplayer') || false },
  113. autotele: { e: localStorage.getItem('autotele') || false },
  114. autocircles: {e: localStorage.getItem('autocircles') || false },
  115. turrets: { e: localStorage.getItem('turrets') || false },
  116.  
  117. // ruby
  118.  
  119. rubyfarm: { e: localStorage.getItem('rubyfarm') || false, r: localStorage.getItem('rubyfarmr') || 'Turret', h: localStorage.getItem('rubyfarmh') || false, d: true, n: 'RubyFarm' },
  120.  
  121. // chat
  122.  
  123. chatstats: { e: localStorage.getItem('chatstats') || false },
  124. chatkill: { e: localStorage.getItem('chatkill') || false },
  125. chatpoints: { e: localStorage.getItem('chatpoints') || false },
  126. chatinsta: { e: localStorage.getItem('chatinsta') || false },
  127. chatset: { e: localStorage.getItem('chatset') || false, n: localStorage.getItem('chatsetn') || 'KillSwitch > All' },
  128. chataimbot: { e: localStorage.getItem('chataimbot') || false },
  129. chataaimbot: { e: localStorage.getItem('chataaimbot') || false },
  130. chatping: { e: localStorage.getItem('chatping') || false },
  131.  
  132. };
  133.  
  134. const inventory = {
  135. primary: null,
  136. secondary: null,
  137. food: null,
  138. wall: null,
  139. spike: null,
  140. mill: null,
  141. mine: null,
  142. boostPad: null,
  143. trap: null,
  144. turret: null,
  145. spawnpad: null,
  146. teleporter: false,
  147. };
  148.  
  149. const myPlayer = {
  150. food: null,
  151. wood: null,
  152. stone: null,
  153. points: null,
  154. kills: null,
  155. sid: null,
  156. x: null,
  157. y: null,
  158. dir: null,
  159. buildIndex: null,
  160. weaponIndex: null,
  161. weaponVariant: null,
  162. team: null,
  163. isLeader: null,
  164. skinIndex: null,
  165. tailIndex: null,
  166. iconIndex: null,
  167. CAMX: 0,
  168. CAMY: 0,
  169. };
  170.  
  171. //GUI
  172.  
  173. const gui = new guify({
  174. title: 'KillSwitch',
  175. align: 'right',
  176. width: 600,
  177. opacity: 0.8,
  178. barMode: 'none',
  179. theme: {
  180. colors: {
  181. panelBackground: 'rgb(0,0,0)',
  182. componentBackground: 'rgb(10,10,25)',
  183. componentForeground: 'red',
  184. textPrimary: 'red',
  185. textSecondary: 'red',
  186. textHover: 'rgb(0,0,0)',
  187. },
  188. font: {
  189. fontSize: '20px',
  190. fontFamily: 'Hammersmith',
  191. },
  192. },
  193. })
  194.  
  195. const folders = [
  196. 'Visuals',
  197. 'Misc',
  198. 'Keybinds',
  199. 'Team',
  200. 'Aimbot',
  201. 'AFK',
  202. 'Chat',
  203. ];
  204.  
  205. const visuals = [
  206. 'Ping',
  207. 'ShowSID',
  208. 'Percents',
  209. 'Tracers',
  210. 'AnimalTracers',
  211. 'Hp',
  212. 'EnabledHacks',
  213. 'ColoredStructures',
  214. 'HealthBars',
  215. 'Circles_Hp',
  216. 'InWeaponRange',
  217. 'WhereURLooking',
  218. 'HitCounter',
  219. 'WeaponRange',
  220. ];
  221.  
  222. const misc = [
  223. 'TripleAutoMill',
  224. 'AutoBoost',
  225. 'AutoBoostSpikes',
  226. 'AutoTrap',
  227. 'AutoHeal',
  228. 'AutoScuba',
  229. 'AutoBreak',
  230. 'AutoSpeed_Hat_Acc',
  231. 'ToggleOffSpeed_Hit_And_On',
  232. 'AntiBow',
  233. 'Insta_Kill',
  234. 'BiomeGear',
  235. 'AntiAnimal',
  236. ];
  237.  
  238. const team = [
  239. 'AutoJoin',
  240. 'ID To Join:',
  241. 'AutoCreate',
  242. 'Name To Create:',
  243. 'AutoLeave',
  244. 'AutoKick',
  245. 'Persons ID To Kick:',
  246. ];
  247.  
  248. const aimbotF = [
  249. 'Aimbot',
  250. 'Set Aimbot Key',
  251. 'Aimbot Key:',
  252. 'Animal Aimbot',
  253. 'Set Animal Aimbot Key',
  254. 'Animal Aimbot Key:'
  255. ];
  256.  
  257. const afk = [
  258. 'AntiPlayer',
  259. 'AutoTeleport',
  260. 'Circle Movement',
  261. 'AutoTurret Defense'
  262. ];
  263.  
  264. for (let key in settings) {
  265. if (localStorage.getItem(key.toLowerCase() === undefined)) {
  266. localStorage.setItem(key.toLowerCase(), 'false')
  267. }
  268. if (localStorage.getItem(key.toLowerCase()) === 'false') {
  269. settings[key].e = false
  270. } else
  271. if (localStorage.getItem(key.toLowerCase()) === 'true') {
  272. settings[key].e = true
  273. }
  274. }
  275.  
  276. for(let j0 = 0; j0 < folders.length; j0++) {
  277. gui.Register({
  278. type: 'folder',
  279. label: folders[j0],
  280. open: !1
  281. });
  282. };
  283.  
  284. for (let j1 = 0; j1 < visuals.length; j1++) {
  285. if (visuals[j1].toLowerCase() === 'weaponrange') {
  286. gui.Register({
  287. type: 'range',
  288. label: visuals[j1],
  289. folder: folders[0],
  290. object: settings[visuals[j1].toLowerCase()],
  291. property: 'e',
  292. step: 1,
  293. min: 1,
  294. max: 5,
  295. onChange: (data) => {
  296. saveSettings(visuals[j1].toLowerCase(), data);
  297. }
  298. });
  299. } else {
  300. gui.Register({
  301. type: 'checkbox',
  302. label: visuals[j1],
  303. folder: folders[0],
  304. object: settings[visuals[j1].toLowerCase()],
  305. property: 'e',
  306. onChange: (data) => {
  307. saveSettings(visuals[j1].toLowerCase(), data);
  308. }
  309. });
  310. };
  311. };
  312. for (let j2 = 0; j2 < misc.length; j2++) {
  313. gui.Register({
  314. type: 'checkbox',
  315. label: misc[j2],
  316. folder: folders[1],
  317. object: settings[misc[j2].toLowerCase()],
  318. property: 'e',
  319. onChange: (data) => {
  320. saveSettings(misc[j2].toLowerCase(), data);
  321. }
  322. });
  323. };
  324.  
  325. const script = {
  326. setKeybind: function (selection, save) {
  327. selection.k = 'Press Any Key'
  328. document.addEventListener('keydown', function set_key(e) {
  329. if (e.key === 'Escape') {
  330. selection.k = 'NONE'
  331. localStorage.setItem(save, selection.k)
  332. document.removeEventListener('keydown', set_key)
  333. } else {
  334. selection.k = e.code
  335. localStorage.setItem(save, selection.k)
  336. document.removeEventListener('keydown', set_key)
  337. }
  338. })
  339. },
  340. };
  341.  
  342. gui.Register({
  343. type: 'checkbox',
  344. label: 'Stats',
  345. folder: folders[6],
  346. object: settings.chatstats,
  347. property: 'e',
  348. onChange: () => {
  349. saveSettings('chatstats', settings.chatstats.e);
  350. }
  351. });
  352. gui.Register({
  353. type: 'checkbox',
  354. label: 'Kills',
  355. folder: folders[6],
  356. object: settings.chatkill,
  357. property: 'e',
  358. onChange: () => {
  359. saveSettings('chatkill', settings.chatkill.e);
  360. }
  361. });
  362. gui.Register({
  363. type: 'checkbox',
  364. label: 'Score',
  365. folder: folders[6],
  366. object: settings.chatpoints,
  367. property: 'e',
  368. onChange: () => {
  369. saveSettings('chatpoints', settings.chatpoints.e);
  370. }
  371. });
  372. gui.Register({
  373. type: 'checkbox',
  374. label: 'Insta',
  375. folder: folders[6],
  376. object: settings.chatinsta,
  377. property: 'e',
  378. onChange: () => {
  379. saveSettings('chatinsta', settings.chatinsta.e);
  380. }
  381. });
  382. gui.Register({
  383. type: 'text',
  384. label: 'Set Your Message',
  385. folder: folders[6],
  386. object: settings.chatset,
  387. property: 'n',
  388. onChange: () => {
  389. saveSettings('chatsetn', settings.chatset.n);
  390. }
  391. });
  392. gui.Register({
  393. type: 'checkbox',
  394. label: 'Say Your Message',
  395. folder: folders[6],
  396. object: settings.chatset,
  397. property: 'e',
  398. onChange: () => {
  399. saveSettings('chatset', settings.chatset.e);
  400. }
  401. });
  402. gui.Register({
  403. type: 'checkbox',
  404. label: 'Aimbot Chat',
  405. folder: folders[6],
  406. object: settings.chataimbot,
  407. property: 'e',
  408. onChange: () => {
  409. saveSettings('chataimbot', settings.chataimbot.e);
  410. }
  411. });
  412. gui.Register({
  413. type: 'checkbox',
  414. label: 'Animal Aimbot Chat',
  415. folder: folders[6],
  416. object: settings.chataaimbot,
  417. property: 'e',
  418. onChange: () => {
  419. saveSettings('chataaimbot', settings.chataaimbot.e);
  420. }
  421. });
  422. gui.Register({
  423. type: 'checkbox',
  424. label: 'Ping Chat',
  425. folder: folders[6],
  426. object: settings.chatping,
  427. property: 'e',
  428. onChange: () => {
  429. saveSettings('chatping', settings.chatping.e);
  430. }
  431. });
  432.  
  433. gui.Register({
  434. type: 'checkbox',
  435. label: afk[0],
  436. folder: folders[5],
  437. object: settings.antiplayer,
  438. property: 'e',
  439. onChange: () => {
  440. saveSettings('antiplayer', settings.antiplayer.e);
  441. }
  442. });
  443. gui.Register({
  444. type: 'checkbox',
  445. label: afk[1],
  446. folder: folders[5],
  447. object: settings.autotele,
  448. property: 'e',
  449. onChange: () => {
  450. saveSettings('autotele', settings.autotele.e);
  451. }
  452. });
  453. gui.Register({
  454. type: 'checkbox',
  455. label: afk[2],
  456. folder: folders[5],
  457. object: settings.autocircles,
  458. property: 'e',
  459. onChange: () => {
  460. saveSettings('autocircles', settings.autocircles.e);
  461. }
  462. });
  463. gui.Register({
  464. type: 'checkbox',
  465. label: afk[3],
  466. folder: folders[5],
  467. object: settings.turrets,
  468. property: 'e',
  469. onChange: () => {
  470. saveSettings('turrets', settings.turrets.e);
  471. }
  472. });
  473.  
  474. gui.Register({
  475. type: 'checkbox',
  476. label: 'RubyFarming',
  477. folder: folders[1],
  478. object: settings.rubyfarm,
  479. property: 'e',
  480. onChange: () => {
  481. saveSettings('rubyfarm', settings.rubyfarm.e);
  482. }
  483. });
  484.  
  485. gui.Register({
  486. type: 'select',
  487. label: 'RubyFarming Item',
  488. folder: folders[1],
  489. object: settings.rubyfarm,
  490. property: 'r',
  491. options: ['Turret','Mill','Spikes','Spawn Pad','Walls'],
  492. onChange: () => {
  493. saveSettings('rubyfarmr', settings.rubyfarm.r);
  494. }
  495. });
  496. gui.Register({
  497. type: 'checkbox',
  498. label: 'RubyFarming Hammer',
  499. folder: folders[1],
  500. object: settings.rubyfarm,
  501. property: 'h',
  502. onChange: () => {
  503. saveSettings('rubyfarmh', settings.rubyfarm.h);
  504. }
  505. });
  506.  
  507. gui.Register({
  508. type: 'range',
  509. label: misc[12]+' Distance',
  510. folder: folders[1],
  511. object: settings['antianimal'],
  512. property: 'n',
  513. step: 1,
  514. min: 1,
  515. max: 300,
  516. onChange: (data) => {
  517. saveSettings('antianimaln', data);
  518. }
  519. });
  520. gui.Register({
  521. type: 'select',
  522. label: misc[4]+ ' Mode:',
  523. folder: folders[1],
  524. options: ['Default', 'Fast', 'Slow'],
  525. object: settings[misc[4].toLowerCase()],
  526. property: 'o',
  527. onChange() {
  528. saveSettings('autohealo', settings.autoheal.o)
  529. }
  530. });
  531.  
  532. gui.Register({
  533. type: 'checkbox',
  534. label: aimbotF[0],
  535. folder: folders[4],
  536. object: settings['aimbot'],
  537. property: 'e',
  538. onChange: (data) => {
  539. saveSettings('aimbot', data);
  540. }
  541. });
  542. gui.Register({
  543. type: 'button',
  544. label: aimbotF[1],
  545. folder: folders[4],
  546. action: () => {
  547. script.setKeybind(settings.aimbot, 'aimbotk')
  548. }
  549. });
  550. gui.Register({
  551. type: 'display',
  552. label: aimbotF[2],
  553. folder: folders[4],
  554. object: settings['aimbot'],
  555. property: 'k',
  556. });
  557. gui.Register({
  558. type: 'checkbox',
  559. label: aimbotF[3],
  560. folder: folders[4],
  561. object: settings['aaimbot'],
  562. property: 'e',
  563. onChange: (data) => {
  564. saveSettings('aaimbot', data);
  565. }
  566. });
  567. gui.Register({
  568. type: 'button',
  569. label: aimbotF[4],
  570. folder: folders[4],
  571. action: () => {
  572. script.setKeybind(settings.aaimbot, 'aaimbotk')
  573. }
  574. });
  575. gui.Register({
  576. type: 'display',
  577. label: aimbotF[5],
  578. folder: folders[4],
  579. object: settings['aaimbot'],
  580. property: 'k',
  581. });
  582.  
  583. gui.Register({
  584. type: 'button',
  585. label: team[0],
  586. folder: folders[3],
  587. action: () => {
  588. joinTeam(settings.autojoin.n)
  589. }
  590. });
  591. gui.Register({
  592. type: 'text',
  593. label: team[1],
  594. folder: folders[3],
  595. object: settings.autojoin,
  596. property: 'n',
  597. onChange: (data) => {
  598. saveSettings('autojoinn', data);
  599. }
  600. });
  601. gui.Register({
  602. type: 'button',
  603. label: team[2],
  604. folder: folders[3],
  605. action: () => {
  606. createTeam(settings.autocreate.n)
  607. }
  608. });
  609. gui.Register({
  610. type: 'text',
  611. label: team[3],
  612. folder: folders[3],
  613. object: settings.autocreate,
  614. property: 'n',
  615. onChange: (data) => {
  616. saveSettings('autocreaten', data);
  617. }
  618. });
  619. gui.Register({ // e
  620. type: 'button',
  621. label: team[4],
  622. folder: folders[3],
  623. action: () => {
  624. leaveTeam()
  625. }
  626. });
  627. gui.Register({ // e
  628. type: 'button',
  629. label: team[5],
  630. folder: folders[3],
  631. action: () => {
  632. kickTeam(settings.autokick.n)
  633. }
  634. });
  635. gui.Register({
  636. type: 'text',
  637. label: team[6],
  638. folder: folders[3],
  639. object: settings.autokick,
  640. property: 'n',
  641. onChange: (data) => {
  642. saveSettings('autokickn', data);
  643. }
  644. });
  645.  
  646. gui.Register({
  647. type: 'button',
  648. label: 'Set '+misc[0]+' Key',
  649. folder: folders[2],
  650. action: () => {
  651. script.setKeybind(settings.tripleautomill, 'tripleautomillk')
  652. }
  653. });
  654. gui.Register({
  655. type: 'display',
  656. label: misc[0]+' Key:',
  657. folder: folders[2],
  658. object: settings[misc[0].toLowerCase()],
  659. property: 'k',
  660. });
  661. //AutoBoost
  662. gui.Register({
  663. type: 'button',
  664. label: 'Set '+misc[1]+' Key',
  665. folder: folders[2],
  666. action: () => {
  667. script.setKeybind(settings.autoboost, 'autoboostk')
  668. }
  669. });
  670. gui.Register({
  671. type: 'display',
  672. label: misc[1]+' Key:',
  673. folder: folders[2],
  674. object: settings[misc[1].toLowerCase()],
  675. property: 'k',
  676. });
  677. //AutoBoostSpikes
  678. gui.Register({
  679. type: 'button',
  680. label: 'Set '+misc[2]+' Key',
  681. folder: folders[2],
  682. action: () => {
  683. script.setKeybind(settings.autoboostspikes, 'autoboostspikesk')
  684. }
  685. });
  686. gui.Register({
  687. type: 'display',
  688. label: misc[2]+' Key:',
  689. folder: folders[2],
  690. object: settings[misc[2].toLowerCase()],
  691. property: 'k',
  692. });
  693. //AutoTrap
  694. gui.Register({
  695. type: 'button',
  696. label: 'Set '+misc[3]+' Key',
  697. folder: folders[2],
  698. action: () => {
  699. script.setKeybind(settings.autotrap, 'autotrapk')
  700. }
  701. });
  702. gui.Register({
  703. type: 'display',
  704. label: misc[3]+' Key:',
  705. folder: folders[2],
  706. object: settings[misc[3].toLowerCase()],
  707. property: 'k',
  708. });
  709. //AutoHeal
  710. gui.Register({
  711. type: 'button',
  712. label: 'Set '+misc[4]+' Key',
  713. folder: folders[2],
  714. action: () => {
  715. script.setKeybind(settings.autoheal, 'autohealk')
  716. }
  717. });
  718. gui.Register({
  719. type: 'display',
  720. label: misc[4]+' Key:',
  721. folder: folders[2],
  722. object: settings[misc[4].toLowerCase()],
  723. property: 'k',
  724. });
  725. //AutoScuba
  726. gui.Register({
  727. type: 'button',
  728. label: 'Set '+misc[5]+' Key',
  729. folder: folders[2],
  730. action: () => {
  731. script.setKeybind(settings.autoscuba, 'autoscubak')
  732. }
  733. });
  734. gui.Register({
  735. type: 'display',
  736. label: misc[5]+' Key:',
  737. folder: folders[2],
  738. object: settings[misc[5].toLowerCase()],
  739. property: 'k',
  740. });
  741. //AutoBreak
  742. gui.Register({
  743. type: 'button',
  744. label: 'Set '+misc[6]+' Key',
  745. folder: folders[2],
  746. action: () => {
  747. script.setKeybind(settings.autobreak, 'autobreakk')
  748. }
  749. });
  750. gui.Register({
  751. type: 'display',
  752. label: misc[6]+' Key:',
  753. folder: folders[2],
  754. object: settings[misc[6].toLowerCase()],
  755. property: 'k',
  756. });
  757. //AutoSpeed_Hat_Acc
  758. gui.Register({
  759. type: 'button',
  760. label: 'Set '+misc[7]+' Key',
  761. folder: folders[2],
  762. action: () => {
  763. script.setKeybind(settings.autospeed_hat_acc, 'autospeed_hat_acck')
  764. }
  765. });
  766. gui.Register({
  767. type: 'display',
  768. label: misc[7]+' Key:',
  769. folder: folders[2],
  770. object: settings[misc[7].toLowerCase()],
  771. property: 'k',
  772. });
  773. //ToggleOffSpeed_Hit_And_On
  774. gui.Register({
  775. type: 'button',
  776. label: 'Set '+misc[8]+' Key',
  777. folder: folders[2],
  778. action: () => {
  779. script.setKeybind(settings.toggleoffspeed_hit_and_on, 'toggleoffspeed_hit_and_onk')
  780. }
  781. });
  782. gui.Register({
  783. type: 'display',
  784. label: misc[8]+' Key:',
  785. folder: folders[2],
  786. object: settings[misc[8].toLowerCase()],
  787. property: 'k',
  788. });
  789. //AntiBow
  790. gui.Register({
  791. type: 'button',
  792. label: 'Set '+misc[9]+' Key',
  793. folder: folders[2],
  794. action: () => {
  795. script.setKeybind(settings.antibow, 'antibowk')
  796. }
  797. });
  798. gui.Register({
  799. type: 'display',
  800. label: misc[9]+' Key:',
  801. folder: folders[2],
  802. object: settings[misc[9].toLowerCase()],
  803. property: 'k',
  804. });
  805. //Insta_Kill
  806. gui.Register({
  807. type: 'button',
  808. label: 'Set '+misc[10]+' Key',
  809. folder: folders[2],
  810. action: () => {
  811. script.setKeybind(settings.insta_kill, 'insta_killk')
  812. }
  813. });
  814. gui.Register({
  815. type: 'display',
  816. label: misc[10]+' Key:',
  817. folder: folders[2],
  818. object: settings[misc[10].toLowerCase()],
  819. property: 'k',
  820. });
  821.  
  822. const join = message => Array.isArray(message) ? [...message] : [...message];
  823.  
  824. // WebSocket setup
  825. ws = new Promise(function (resolve) {
  826. let {
  827. send
  828. } = WebSocket.prototype;
  829. WebSocket.prototype.send = function (...x) {
  830. send.apply(this, x);
  831. this.send = send;
  832. this.io = function (...datas) {
  833. const [packet, ...data] = datas;
  834. this.send(new Uint8Array(Array.from(msgpack.encode([packet, data]))));
  835. };
  836.  
  837. document.addEventListener("keydown", event => {
  838. if ('Key'+event.key.toLocaleUpperCase() === settings.autoboost.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  839. settings.autoboost.e = true;
  840. };
  841. if ('Key'+event.key.toLocaleUpperCase() === settings.autoboostspikes.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  842. settings.autoboostspikes.e = true;
  843. };
  844. if ('Key'+event.key.toLocaleUpperCase() === settings.autotrap.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  845. settings.autotrap.e = true;
  846. };
  847. if ('Key'+event.key.toLocaleUpperCase() === settings.insta_kill.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  848. settings.insta_kill.e = true;
  849. };
  850. if ('Key'+event.key.toLocaleUpperCase() === settings.autospeed_hat_acc.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  851. settings.autospeed_hat_acc.e = true;
  852. };
  853. });
  854.  
  855. document.addEventListener("keyup", event => {
  856. if ('Key'+event.key.toLocaleUpperCase() === settings.autoboost.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  857. settings.autoboost.e = false;
  858. };
  859. if ('Key'+event.key.toLocaleUpperCase() === settings.autoboostspikes.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  860. settings.autoboostspikes.e = false;
  861. };
  862. if ('Key'+event.key.toLocaleUpperCase() === settings.autotrap.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  863. settings.autotrap.e = false;
  864. };
  865. if ('Key'+event.key.toLocaleUpperCase() === settings.insta_kill.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  866. settings.insta_kill.e = false;
  867. };
  868. if ('Key'+event.key.toLocaleUpperCase() === settings.autospeed_hat_acc.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  869. settings.autospeed_hat_acc.e = false;
  870. };
  871. });
  872.  
  873. document.addEventListener("keydown", event => {
  874. if ('Key'+event.key.toLocaleUpperCase() === settings.tripleautomill.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  875. settings.tripleautomill.e = !settings.tripleautomill.e;
  876. };
  877. if ('Key'+event.key.toLocaleUpperCase() === settings.autoheal.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  878. settings.autoheal.e = !settings.autoheal.e;
  879. };
  880. if ('Key'+event.key.toLocaleUpperCase() === settings.autobreak.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  881. settings.autobreak.e = !settings.autobreak.e;
  882. };
  883. if ('Key'+event.key.toLocaleUpperCase() === settings.antibow.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  884. settings.antibow.e = !settings.antibow.e;
  885. };
  886. if ('Key'+event.key.toLocaleUpperCase() === settings.toggleoffspeed_hit_and_on.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  887. settings.toggleoffspeed_hit_and_on.e = !settings.toggleoffspeed_hit_and_on.e;
  888. };
  889. if ('Key'+event.key.toLocaleUpperCase() === settings.autoscuba.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  890. settings.autoscuba.e = !settings.autoscuba.e;
  891. };
  892. if ('Key'+event.key.toLocaleUpperCase() === settings.aimbot.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  893. settings.aimbot.e = !settings.aimbot.e;
  894. };
  895. if ('Key'+event.key.toLocaleUpperCase() === settings.aaimbot.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
  896. settings.aaimbot.e = !settings.aaimbot.e;
  897. };
  898. });
  899.  
  900. this.addEventListener("message", function (e) {
  901. const [packet, data] = msgpack.decode(new Uint8Array(e.data));
  902. let sid = data[0];
  903. let health = data[1];
  904.  
  905. var tmpData = msgpack.decode(new Uint8Array(e.data));
  906. var ms = e;
  907.  
  908.  
  909. let addEventListener = {
  910. setupGame: "C",
  911. updateHealth: "O",
  912. killPlayer: "P",
  913. updateItems: "V"
  914. };
  915.  
  916. switch (packet) {
  917. case addEventListener.setupGame:
  918. inGame = true;
  919. items = [0, 3, 6, 10];
  920. weapons = [0];
  921. break;
  922. case addEventListener.updateHealth:
  923. if (sid === myPlayer.sid) {
  924. if (inGame) {
  925. if (health < 100 && health > 0 && settings.autoheal.e) {
  926. switch (settings.autoheal.o) {
  927. case 'Fast':
  928. setTimeout(() => {
  929. chat('Fast AutoHealing...');
  930. place(inventory.food);
  931. }, 100);
  932. break;
  933.  
  934. case 'Slow':
  935. setTimeout(() => {
  936. chat('Slow AutoHealing...');
  937. place(inventory.food);
  938. }, 350);
  939. break;
  940. default:
  941. setTimeout(() => {
  942. chat('Default AutoHealing...');
  943. place(inventory.food);
  944. }, 250);
  945. break;
  946. };
  947. };
  948. };
  949. if (tmpHealth - health < 0) {
  950. if (sTime) {
  951. let timeHit = Date.now() - sTime;
  952. sTime = 0;
  953. sCount = timeHit <= 120 ? sCount + 1 : Math.max(0, sCount - 2);
  954. }
  955. } else {
  956. sTime = Date.now();
  957. }
  958. tmpHealth = health;
  959. }
  960. break;
  961. case addEventListener.killPlayer:
  962. inGame = false;
  963. setTimeout(() => {
  964. tmpHealth = 100;
  965. }, 100);
  966. break;
  967. case addEventListener.updateItems:
  968. if (sid) {
  969. if (health) {
  970. weapons = sid;
  971. } else {
  972. items = sid;
  973. }
  974. }
  975. break;
  976. };
  977.  
  978. if ((ms = undefined) || (tmpData = (ms = tmpData.length > 1 ? [tmpData[0], ...join(tmpData[1])] : tmpData)[0]) || ms) {
  979. if ("C" == tmpData && null === myPlayer.sid && (myPlayer.sid = ms[1]) || "a" == tmpData) {
  980. for (tmpData = 0; tmpData < ms[1].length / 13; tmpData++) {
  981.  
  982. var data2 = ms[1].slice(13 * tmpData, 13 * (tmpData + 1));
  983. if (data2[0] == myPlayer.sid) {
  984. Object.assign(myPlayer, {
  985. food: document.getElementById("foodDisplay").innerText,
  986. wood: document.getElementById("woodDisplay").innerText,
  987. stone: document.getElementById("stoneDisplay").innerText,
  988. points: document.getElementById("scoreDisplay").innerText,
  989. kills: document.getElementById("killCounter").innerText,
  990. sid: data2[0],
  991. x: data2[1],
  992. y: data2[2],
  993. dir: data2[3],
  994. buildIndex: data2[4],
  995. weaponIndex: data2[5],
  996. weaponVariant: data2[6],
  997. team: data2[7],
  998. isLeader: data2[8],
  999. skinIndex: data2[9],
  1000. tailIndex: data2[10],
  1001. iconIndex: data2[11]
  1002. });
  1003. } else {
  1004. const existingAllPlayerIndex = Allplayers.findIndex(Allplayers => Allplayers.sid === data2[0]);
  1005. const existingPlayerIndex = players.findIndex(players => players.sid === data2[0]);
  1006.  
  1007. if (existingPlayerIndex !== -1) {
  1008. // Update existing player information
  1009. players[existingPlayerIndex] = {
  1010. sid: data2[0],
  1011. x: data2[1],
  1012. y: data2[2],
  1013. dir: data2[3],
  1014. buildIndex: data2[4],
  1015. weaponIndex: data2[5],
  1016. weaponVariant: data2[6],
  1017. team: data2[7],
  1018. isLeader: data2[8],
  1019. skinIndex: data2[9],
  1020. tailIndex: data2[10],
  1021. iconIndex: data2[11]
  1022. };
  1023. } else {
  1024. players.push({
  1025. sid: data2[0],
  1026. x: data2[1],
  1027. y: data2[2],
  1028. dir: data2[3],
  1029. buildIndex: data2[4],
  1030. weaponIndex: data2[5],
  1031. weaponVariant: data2[6],
  1032. team: data2[7],
  1033. isLeader: data2[8],
  1034. skinIndex: data2[9],
  1035. tailIndex: data2[10],
  1036. iconIndex: data2[11]
  1037. });
  1038. }
  1039.  
  1040. if (existingAllPlayerIndex !== -1) {
  1041. // Update existing player information
  1042. Allplayers[existingAllPlayerIndex] = {
  1043. sid: data2[0],
  1044. x: data2[1],
  1045. y: data2[2],
  1046. dir: data2[3],
  1047. buildIndex: data2[4],
  1048. weaponIndex: data2[5],
  1049. weaponVariant: data2[6],
  1050. team: data2[7],
  1051. isLeader: data2[8],
  1052. skinIndex: data2[9],
  1053. tailIndex: data2[10],
  1054. iconIndex: data2[11]
  1055. };
  1056. } else {
  1057. // Add a new player entry to the players array
  1058. Allplayers.push({
  1059. sid: data2[0],
  1060. x: data2[1],
  1061. y: data2[2],
  1062. dir: data2[3],
  1063. buildIndex: data2[4],
  1064. weaponIndex: data2[5],
  1065. weaponVariant: data2[6],
  1066. team: data2[7],
  1067. isLeader: data2[8],
  1068. skinIndex: data2[9],
  1069. tailIndex: data2[10],
  1070. iconIndex: data2[11]
  1071. });
  1072. }
  1073. };
  1074. };
  1075. };
  1076. cacheItems();
  1077. };
  1078. });
  1079. resolve(this);
  1080. };
  1081. });
  1082.  
  1083. // Functions
  1084. const sendPacket = function (...datas) {
  1085. const [type, ...data] = datas;
  1086. var binary = msgpack.encode([type, data]);
  1087. ws.then(function (wsInstance) {
  1088. wsInstance.send(new Uint8Array(Array.from(binary)));
  1089. });
  1090. };
  1091.  
  1092. function findPlayerBySID(sid) {
  1093. for (var i = 0; i < Allplayers.length; i++) {
  1094. if (Allplayers[i].sid == sid) {
  1095. return Allplayers[i];
  1096. }
  1097. } return null;
  1098. };
  1099.  
  1100. function objectAlly(sid) {
  1101. var tmpObj = findPlayerBySID(sid);
  1102.  
  1103. if (myPlayer.sid == sid) {
  1104. return true
  1105. } else if (!tmpObj) {
  1106. return false;
  1107. } else if (tmpObj.team) {
  1108. return tmpObj.team === myPlayer.team ? true : false
  1109. } else {
  1110. return false
  1111. };
  1112. };
  1113.  
  1114. function isAlly(sid){
  1115.  
  1116. var tmpObj = findPlayerBySID(sid)
  1117. if (!tmpObj){
  1118. return false
  1119. }
  1120. if (myPlayer.sid == sid){
  1121. return true
  1122. }else if (tmpObj.team){
  1123. return tmpObj.team === myPlayer.team ? true : false
  1124. } else {
  1125. return
  1126. }
  1127. };
  1128.  
  1129. const emit = (event, a, b, c, m, r) => ws.then(function (wsInstance){wsInstance.send(Uint8Array.from([...msgpack.encode([event, [a, b, c, m, r]])]))});
  1130.  
  1131. //BUYEQUIP
  1132.  
  1133. const buyEquip = (id) => {
  1134. window.storeBuy(id)
  1135. setTimeout(() => {
  1136. window.storeEquip(id)
  1137. }, 15);
  1138. }
  1139.  
  1140. //TEAM
  1141. const leaveTeam = () => {
  1142. sendPacket("N")
  1143. };
  1144.  
  1145. const kickTeam = (id) => {
  1146. sendPacket("Q", Number(id))
  1147. }
  1148.  
  1149. const createTeam = (name) => {
  1150. sendPacket("L", name.toString().charAt(0).toUpperCase()+name.toString().slice(1));
  1151. }
  1152.  
  1153. const joinTeam = (id) => {
  1154. sendPacket("b", Number(id));
  1155. };
  1156.  
  1157. // PLACE
  1158. const place = (thing, angle) => {
  1159. emit("G", thing, false);
  1160. emit("d", 1, angle);
  1161. emit("d", 0, angle);
  1162. emit("G", myPlayer.weaponIndex, true);
  1163. };
  1164.  
  1165. // SELECT WEAPON
  1166. const selectWeapon = function (index) {
  1167. if (inGame) {
  1168. emit("G", weapons[index], true);""
  1169. }
  1170. };
  1171.  
  1172. const _hit = (ang) => {
  1173. emit("d", 1, ang);
  1174. setTimeout(() => {
  1175. emit("d", 0, ang);
  1176. }, 100);
  1177. }
  1178.  
  1179.  
  1180. // HIT
  1181. const hit = function (ang) {
  1182. if (inGame) {
  1183. emit("d", 1, ang);
  1184. emit("d", 0, ang);
  1185. emit("G", myPlayer.weaponIndex, true);
  1186. }
  1187. };
  1188. // CHAT
  1189. const chat = function (e) {
  1190. if (inGame) {
  1191. emit("6", e)
  1192. }
  1193. };
  1194.  
  1195. const cacheItems = () => {
  1196. for (let c = 0; c < 9; c++) {
  1197. var _document$getElementB;
  1198. if (((_document$getElementB = document.getElementById(`actionBarItem${c}`)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.offsetParent) !== null) {
  1199. inventory.primary = c;
  1200. }
  1201. }
  1202. for (let s = 9; s < 16; s++) {
  1203. var _document$getElementB2;
  1204. if (((_document$getElementB2 = document.getElementById(`actionBarItem${s}`)) === null || _document$getElementB2 === void 0 ? void 0 : _document$getElementB2.offsetParent) !== null) {
  1205. inventory.secondary = s;
  1206. }
  1207. }
  1208. for (let P = 16; P < 19; P++) {
  1209. var _document$getElementB3;
  1210. if (((_document$getElementB3 = document.getElementById(`actionBarItem${P}`)) === null || _document$getElementB3 === void 0 ? void 0 : _document$getElementB3.offsetParent) !== null) {
  1211. inventory.food = P - 16;
  1212. }
  1213. }
  1214. for (let f = 19; f < 22; f++) {
  1215. var _document$getElementB4;
  1216. if (((_document$getElementB4 = document.getElementById(`actionBarItem${f}`)) === null || _document$getElementB4 === void 0 ? void 0 : _document$getElementB4.offsetParent) !== null) {
  1217. inventory.wall = f - 16;
  1218. }
  1219. }
  1220. for (let _ = 22; _ < 26; _++) {
  1221. var _document$getElementB5;
  1222. if (((_document$getElementB5 = document.getElementById(`actionBarItem${_}`)) === null || _document$getElementB5 === void 0 ? void 0 : _document$getElementB5.offsetParent) !== null) {
  1223. inventory.spike = _ - 16;
  1224. }
  1225. }
  1226. for (let u = 26; u < 29; u++) {
  1227. var _document$getElementB6;
  1228. if (((_document$getElementB6 = document.getElementById(`actionBarItem${u}`)) === null || _document$getElementB6 === void 0 ? void 0 : _document$getElementB6.offsetParent) !== null) {
  1229. inventory.mill = u - 16;
  1230. }
  1231. }
  1232. for (let I = 29; I < 31; I++) {
  1233. var _document$getElementB7;
  1234. if (((_document$getElementB7 = document.getElementById(`actionBarItem${I}`)) === null || _document$getElementB7 === void 0 ? void 0 : _document$getElementB7.offsetParent) !== null) {
  1235. inventory.mine = I - 16;
  1236. }
  1237. }
  1238. for (let p = 31; p < 33; p++) {
  1239. var _document$getElementB8;
  1240. if (((_document$getElementB8 = document.getElementById(`actionBarItem${p}`)) === null || _document$getElementB8 === void 0 ? void 0 : _document$getElementB8.offsetParent) !== null) {
  1241. inventory.boostPad = p - 16;
  1242. }
  1243. }
  1244. for (let x = 31; x < 33; x++) {
  1245. var _document$getElementB9;
  1246. if (((_document$getElementB9 = document.getElementById(`actionBarItem${x}`)) === null || _document$getElementB9 === void 0 ? void 0 : _document$getElementB9.offsetParent) !== null) {
  1247. inventory.trap = x - 16;
  1248. }
  1249. }
  1250. for (let g = 33; g < 35; g++) {
  1251. var _document$getElementB10;
  1252. if (((_document$getElementB10 = document.getElementById(`actionBarItem${g}`)) === null || _document$getElementB10 === void 0 ? void 0 : _document$getElementB10.offsetParent) !== null && g !== 36) {
  1253. inventory.turret = g - 16;
  1254. }
  1255. }
  1256. for (let y = 36; y < 39; y++) {
  1257. var _document$getElementB10;
  1258. if (((_document$getElementB10 = document.getElementById(`actionBarItem${y}`)) === null || _document$getElementB10 === void 0 ? void 0 : _document$getElementB10.offsetParent) !== null && y !== 36) {
  1259. inventory.teleporter = y - 16;
  1260. }
  1261. }
  1262. inventory.spawnpad = 36;
  1263. };
  1264.  
  1265. window.addEventListener('DOMContentLoaded', () => {
  1266.  
  1267. var connecting = document.getElementById('loadingText');
  1268. var diedMsg = document.getElementById('diedText');
  1269. var gameLogo = document.getElementById('gameName');
  1270.  
  1271. connecting.textContent = 'Switching On KillSwitch';
  1272. diedMsg.textContent = 'You Died, Go MOD!';
  1273. gameLogo.textContent = 'KillSwitch';
  1274. gameLogo.style.color = 'black';
  1275.  
  1276. lastWeaponRangeMultChange = Date.now()
  1277. resetPlayers()
  1278. });
  1279.  
  1280. function resetPlayers() {
  1281. allAnimals = [];
  1282. players = [];
  1283. setTimeout(() => {
  1284. resetPlayers()
  1285. }, 1000);
  1286. };
  1287.  
  1288. window.setInterval(() => {
  1289. if (!inGame) return;
  1290. if (settings.chatstats.e) { chat(`Health: ${Math.floor(tmpHealth)} / 100 hp`) };
  1291. setTimeout(() => {
  1292. if (settings.chatping.e) { chat(`Ping: ${window.pingTime}ms`) };
  1293. setTimeout(() => {
  1294. if (settings.chatkill.e && myPlayer.kills > myKills) { chat(`Kill You | Kills: ${myPlayer.kills}`) };
  1295. setTimeout(() => {
  1296. if (settings.chatpoints.e) { chat(`Score: ${myPlayer.points}`) };
  1297. setTimeout(() => {
  1298. if (settings.chatset.e) { chat(`${settings.chatset.n}`) };
  1299. myKills = myPlayer.kills;
  1300. }, 100);
  1301. }, 100);
  1302. }, 100);
  1303. }, 100);
  1304. }, 500)
  1305.  
  1306. function drawCircleBar(color, width, scale, endAngle) {
  1307. const { context } = Cow.renderer
  1308.  
  1309. context.strokeStyle = color
  1310. context.lineWidth = width
  1311. context.lineCap = "round"
  1312. context.beginPath()
  1313. context.arc(0, 0, scale, 0, endAngle)
  1314. context.stroke()
  1315. context.closePath()
  1316. };
  1317.  
  1318. function drawCircle(x, y, color, radius, lineWidth) {
  1319. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1320. ctx.beginPath();
  1321. ctx.arc(x, y, radius, 0, 2 * Math.PI);
  1322. ctx.strokeStyle = color;
  1323. ctx.lineWidth = lineWidth
  1324. ctx.stroke();
  1325. };
  1326.  
  1327. function weaponRanges(weaponID) {
  1328. switch (weaponID) {
  1329. case 0:
  1330. return 65;
  1331. break;
  1332. case 1:
  1333. return 70;
  1334. break;
  1335. case 2:
  1336. return 75;
  1337. break;
  1338. case 3:
  1339. return 110;
  1340. break;
  1341. case 4:
  1342. return 118;
  1343. break;
  1344. case 5:
  1345. return 142;
  1346. break;
  1347. case 6:
  1348. return 110;
  1349. break;
  1350. case 7:
  1351. return 65;
  1352. break;
  1353. case 8:
  1354. return 70;
  1355. break;
  1356. case 9:
  1357. return 200;
  1358. break;
  1359. case 10:
  1360. return 75;
  1361. break;
  1362. case 11:
  1363. return 0;
  1364. break;
  1365. case 12:
  1366. return 200;
  1367. break;
  1368. case 13:
  1369. return 200;
  1370. break;
  1371. case 14:
  1372. return 0;
  1373. break;
  1374. case 15:
  1375. return 200;
  1376. break;
  1377.  
  1378. default:
  1379. return 0;
  1380. break;
  1381. };
  1382. };
  1383.  
  1384. function dist2dSQRT(e, o) {
  1385. return e && o
  1386. ? Math.sqrt((e.x - o.x) ** 2 + (e.y - o.y) ** 2)
  1387. : null
  1388. };
  1389.  
  1390. window.setInterval(() => {
  1391. teleport = true;
  1392. }, 5000)
  1393.  
  1394.  
  1395. window.setInterval(() => {
  1396.  
  1397. if (!inGame) return;
  1398.  
  1399. if (settings.antiplayer.e && inGame && !inTrap) {
  1400. for (let t = 0; t < players.length; t++) {
  1401. let nearestEnemyAngle = Math.atan2(players[t].y - myPlayer.y, players[t].x - myPlayer.x);
  1402. let nearestEnemyDistance = dist2dSQRT(myPlayer, players[t])
  1403. // console.log(nearestEnemyDistance)
  1404. if (nearestEnemyDistance - 115 <= 200 && nearestEnemyAngle) {
  1405. place(inventory.spike, nearestEnemyAngle);
  1406. };
  1407. };
  1408. };
  1409. if (settings.autocircles.e && inGame) {
  1410. // emit(0, "X", 1000, 1000, -.25, 100, .0016, 1 , 1, 1);
  1411. }
  1412.  
  1413. if (settings.autotele.e && inGame) {
  1414. // all 4 angles
  1415. const tele = inventory.teleporter;
  1416. const spike = inventory.spike;
  1417. place(tele, -Math.PI / 2);
  1418. place(spike, Math.PI);
  1419. place(spike, -Math.PI);
  1420. place(spike, Math.PI / 2);
  1421. };
  1422.  
  1423. if (settings.turrets.e && inGame) {
  1424. const turret = inventory.turret;
  1425. place(turret, -Math.PI / 2);
  1426. place(turret, Math.PI);
  1427. place(turret, -Math.PI);
  1428. place(turret, Math.PI / 2);
  1429. };
  1430.  
  1431. if (settings.aimbot.e && inGame && !inTrap) {
  1432. for (let t = 0; t < players.length; t++) {
  1433. let nearestEnemyAngle = Math.atan2(players[t].y - myPlayer.y, players[t].x - myPlayer.x);
  1434. let nearestEnemyDistance = dist2dSQRT(myPlayer, players[t])
  1435. // console.log(nearestEnemyDistance)
  1436. if (nearestEnemyDistance - 115 <= weaponRanges(inventory.primary) && nearestEnemyAngle) {
  1437. if (settings.chataimbot.e) { chat(`AimBot... Distance: ${Math.round(nearestEnemyDistance-115)}`); };
  1438. selectWeapon(0);
  1439. hit(nearestEnemyAngle);
  1440. };
  1441. };
  1442. };
  1443.  
  1444. if (settings.antianimal.e && inGame && !inTrap) {
  1445. for (let t = 0; t < allAnimals.length; t++) {
  1446. let nearestEnemyAngle = Math.atan2(allAnimals[t].y - myPlayer.y, allAnimals[t].x - myPlayer.x);
  1447. let nearestEnemyDistance = dist2dSQRT(myPlayer, allAnimals[t])
  1448. if (nearestEnemyDistance <= Number(settings.antianimal.n) && nearestEnemyAngle) {
  1449. place(inventory.spike, nearestEnemyAngle);
  1450. };
  1451. };
  1452. };
  1453.  
  1454. if (settings.aaimbot.e && inGame && !inTrap) {
  1455. for (let t = 0; t < allAnimals.length; t++) {
  1456. let nearestEnemyAngle = Math.atan2(allAnimals[t].y - myPlayer.y, allAnimals[t].x - myPlayer.x);
  1457. let nearestEnemyDistance = dist2dSQRT(myPlayer, allAnimals[t])
  1458. // console.log(nearestEnemyDistance)
  1459. if (nearestEnemyDistance - 115 <= weaponRanges(inventory.primary) && nearestEnemyAngle) {
  1460. if (settings.chataaimbot.e) { chat(`Animal Aimbot... Distance: ${Math.round(nearestEnemyDistance-115)}`); };
  1461. selectWeapon(0);
  1462. hit(nearestEnemyAngle);
  1463. };
  1464. };
  1465. };
  1466.  
  1467. if (settings.rubyfarm.e && inGame) {
  1468. function getInvItem() {
  1469. switch (settings.rubyfarm.r) {
  1470. case 'Turret':
  1471. return inventory.turret
  1472. break;
  1473. case 'Mill':
  1474. return inventory.mill
  1475. break;
  1476. case 'Spikes':
  1477. return inventory.spike
  1478. break;
  1479. case 'Spawn Pad':
  1480. return inventory.spawnpad
  1481. break;
  1482. case 'Walls':
  1483. return inventory.wall
  1484. break;
  1485. default:
  1486. return inventory.turret
  1487. break;
  1488. };
  1489. };
  1490.  
  1491. const item = getInvItem();
  1492.  
  1493. itemInfo = [{ name: settings.rubyfarm.r, health: itemHp, yourDmg: myDmg, hitCount: hitCount_, started: itemInfo.started }];
  1494.  
  1495. const angle = 1;
  1496.  
  1497. if (itemInfo.itemHp <= 10 || hitCount_ < 2 || !itemInfo.started) {
  1498. place(item, angle - Math.PI / 4);
  1499. place(item, angle + Math.PI / 4);
  1500. };
  1501.  
  1502. settings.rubyfarm.h ? myPlayer.weaponIndex === 10 ? '' : selectWeapon(1) : selectWeapon(0);
  1503.  
  1504. _hit(angle);
  1505. };
  1506.  
  1507. if (settings.insta_kill.e && inGame) {
  1508. for (let i = 0; i < players.length; i++) {
  1509. buyEquip(53) // turret
  1510. var nearestEnemyAngle = Math.atan2(players[i].y - myPlayer.y, players[i].x - myPlayer.x);
  1511. let nearestEnemyDistance = dist2dSQRT(myPlayer, players[i]);
  1512. const weaponRangePrimary = weaponRanges(inventory.primary);
  1513. if (nearestEnemyDistance - 110 > weaponRangePrimary) return
  1514. if (settings.chatinsta.e) { chat(`Insta Kill Loser`) };
  1515. function instakill() {
  1516. setTimeout(()=>{
  1517. emit("G", inventory.primary, 1);
  1518. settings.insta_kill.e = true;
  1519. settings.insta_kill.fastmode = true;
  1520. buyEquip(7, 0);
  1521. setTimeout(()=> {
  1522. _hit(nearestEnemyAngle)
  1523. setTimeout(()=>{
  1524. buyEquip(20, 0);
  1525. emit("G", inventory.secondary, 1);
  1526. buyEquip(53, 0);
  1527. setTimeout(()=>{
  1528. settings.insta_kill.fastmode ? buyEquip(20, 0) : buyEquip(55, 0);
  1529. setTimeout(()=>{
  1530. buyEquip(11, 1);
  1531. settings.insta_kill.e = false;
  1532. _hit(nearestEnemyAngle)
  1533. }, 80);
  1534. }, 102);
  1535. },100);
  1536. }, 15);
  1537. }, 70);
  1538. };
  1539. instakill();
  1540. // if (weaponRangeSecondary === 200) {
  1541. // // console.log('selecting')
  1542. // selectWeapon(1); // select secondary
  1543. // setTimeout(() => {
  1544. // buyEquip(7); // bull helmet
  1545. // hit(nearestEnemyAngle); // fire
  1546. // setTimeout(() => {
  1547. // buyEquip(20); // samurai
  1548. // setTimeout(() => {
  1549. // if (inventory.primary !== 8) {
  1550. // buyEquip(55); // bloddthirster
  1551. // selectWeapon(0); // select primary
  1552. // nearestEnemyAngle = Math.atan2(players[i].y - myPlayer.y, players[i].x - myPlayer.x);
  1553. // hit(nearestEnemyAngle); // hit the enemy
  1554. // hit(nearestEnemyAngle); // hit the enemy
  1555. // setTimeout(() => {
  1556. // selectWeapon(0)
  1557. // storeEquip(0)
  1558. // }, 20);
  1559. // } else {
  1560. // buyEquip(53); // turret
  1561. // nearestEnemyAngle = Math.atan2(players[i].y - myPlayer.y, players[i].x - myPlayer.x);
  1562. // place(inventory.spike, nearestEnemyAngle - Math.PI / 2);
  1563. // place(inventory.spike, nearestEnemyAngle + Math.PI);
  1564. // place(inventory.spike, nearestEnemyAngle + Math.PI / 2);
  1565. // setTimeout(() => {
  1566. // selectWeapon(0)
  1567. // storeEquip(0)
  1568. // }, 20);
  1569. // };
  1570. // }, 20);
  1571. // }, 75);
  1572. // }, 20);
  1573. // } else {
  1574. // if (inventory.primary !== 8) {
  1575. // buyEquip(55); // bloddthirster
  1576. // selectWeapon(0); // select primary
  1577. // hit(nearestEnemyAngle); // hit the enemy
  1578. // hit(nearestEnemyAngle); // hit the enemy
  1579. // } else {
  1580. // buyEquip(53); // turret
  1581. // place(inventory.spike, nearestEnemyAngle - Math.PI / 2);
  1582. // place(inventory.spike, nearestEnemyAngle);
  1583. // place(inventory.spike, nearestEnemyAngle + Math.PI / 2);
  1584. // };
  1585. // };
  1586. };
  1587. };
  1588.  
  1589. if (settings.antibow.e && inGame) {
  1590. for (let t = 0; t < players.length; t++) {
  1591. let nearestEnemyAngle = Math.atan2(players[t].y - myPlayer.y, players[t].x - myPlayer.x);
  1592. let nearestEnemyAngleOpp = Math.atan2(myPlayer.y - players[t].y, myPlayer.x - players[t].x);
  1593. // console.log(nearestEnemyAngleOpp, players[t].dir, nearestEnemyAngleOpp===players[t].dir?true:false)
  1594. if (nearestEnemyAngle &&
  1595. (players[t].weaponIndex === 9 || players[t].weaponIndex === 12 || players[t].weaponIndex === 13 || players[t].weaponIndex === 15)
  1596. && EnemyAngle1 !== nearestEnemyAngle && nearestEnemyAngleOpp >= players[t].dir - .25 && nearestEnemyAngleOpp <= players[t].dir + .25) {
  1597. chat('AntiBow...')
  1598. place(inventory.mill, nearestEnemyAngle);
  1599. selectWeapon(0);
  1600. EnemyAngle1 = nearestEnemyAngle;
  1601. };
  1602. };
  1603. };
  1604. if (y1 !== myPlayer.y || x1 !== myPlayer.x) {
  1605. if (Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x) < (scale + placeOffset) * 2) {
  1606.  
  1607. const millCost = {
  1608. wood: (inventory.mill === 10 ? 50 : (inventory.mill === 11 ? 60 : (inventory.mill === 12 ? 100 : 50))),
  1609. stone: (inventory.mill === 10 ? 10 : (inventory.mill === 11 ? 20 : (inventory.mill === 12 ? 50 : 10))),
  1610. };
  1611.  
  1612. if (settings.tripleautomill.e && myPlayer.wood >= millCost.wood && myPlayer.stone >= millCost.stone && inGame) {
  1613. let angle = Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x);
  1614. place(inventory.mill, angle + Math.PI / 2.5);
  1615. place(inventory.mill, angle);
  1616. place(inventory.mill, angle - Math.PI / 2.5);
  1617. };
  1618. // AUTO BOOST PAD :D
  1619.  
  1620. const boostCost = {
  1621. wood: 5,
  1622. stone: 20,
  1623. };
  1624.  
  1625. if (settings.autoboost.e && myPlayer.wood >= boostCost.wood && myPlayer.stone >= boostCost.stone && inGame) {
  1626. let angle = Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x);
  1627. place(inventory.boostPad, angle + Math.PI);
  1628. };
  1629.  
  1630. // AUTO BOOST SPIKES :D
  1631.  
  1632. const spikeCost = {
  1633. wood: (inventory.spike === 6 ? 20 : (inventory.spike === 7 ? 30 : (inventory.spike === 8 ? 35 : (inventory.spike === 9 ? 30 : 20)))),
  1634. stone: (inventory.spike === 6 ? 5 : (inventory.spike === 7 ? 10 : (inventory.spike === 8 ? 15 : (inventory.spike === 9 ? 20 : 5)))),
  1635. }
  1636.  
  1637. if (settings.autoboostspikes.e && myPlayer.wood >= boostCost.wood+spikeCost.wood && myPlayer.stone >= boostCost.stone+spikeCost.stone && inGame) {
  1638. let angle = Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x);
  1639. place(inventory.spike, angle + Math.PI / 2);
  1640. place(inventory.boostPad, angle + Math.PI);
  1641. place(inventory.spike, angle - Math.PI / 2);
  1642. };
  1643.  
  1644. // AUTO TRAP :D
  1645.  
  1646. const trapCost = {
  1647. wood: 30,
  1648. stone: 30,
  1649. }
  1650.  
  1651. if (settings.autotrap.e && myPlayer.wood >= trapCost.wood && myPlayer.stone >= trapCost.stone && inGame) {
  1652. let angle = Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x);
  1653. place(inventory.trap, angle + Math.PI / 2.5);
  1654. place(inventory.trap, angle + Math.PI);
  1655. place(inventory.trap, angle - Math.PI / 2.5);
  1656. };
  1657.  
  1658. // AUTO SCUBA :D
  1659.  
  1660. if (Boughtscuba === true) {} else {
  1661. BoughtscubaEle = document.getElementById('storeDisplay21');
  1662. };
  1663.  
  1664. if (Boughtscuba !== true && Number(myPlayer.points) >= 2500 && settings.autoscuba.e) { console.log(`BUY ${myPlayer.points}`); storeBuy(31); storeEquip(31); Boughtscuba = true; BoughtscubaEle = true; };
  1665. if (BoughtscubaEle !== true && BoughtscubaEle !== null) {
  1666. if (BoughtscubaEle.innerText.includes('Equip') && Boughtscuba !== false) { Boughtscuba = true; BoughtscubaEle = true; };
  1667. };
  1668.  
  1669. var inWater = false;
  1670.  
  1671. var inSnow = false;
  1672.  
  1673. if (Number(myPlayer.y) >= ((14400 / 2) - 375) && Number(myPlayer.y) <= ((14400 / 2) + 375)) {
  1674. inWater = true;
  1675. };
  1676.  
  1677. const snowY = window.config.snowBiomeTop
  1678.  
  1679. if (myPlayer.y <= snowY) {
  1680. inSnow = true;
  1681. };
  1682.  
  1683. if (settings.autospeed_hat_acc.e || inWater || inSnow) {
  1684. if (!snowGear && Number(myPlayer.points) >= 600) {
  1685. storeBuy(15);
  1686. snowGear = true;
  1687. };
  1688.  
  1689. if (inSnow && snowGear && inGame && settings.biomegear.e) {
  1690. storeEquip(15);
  1691. };
  1692. if (inWater && settings.autoscuba.e && inGame && Boughtscuba) {
  1693. storeEquip(31);
  1694. };
  1695. if (!boughtItems && settings.autospeed_hat_acc.e && Number(myPlayer.points) >= 6000) {
  1696. storeBuy(12, 0);
  1697. boughtItems = true;
  1698. } else
  1699. if (!boughtItems2 && settings.autospeed_hat_acc.e && Number(myPlayer.points) >= 2000) {
  1700. storeBuy(11, 1);
  1701. boughtItems2 = true;
  1702. };
  1703. if (settings.autospeed_hat_acc.e && inGame && boughtItems && boughtItems2) {
  1704. if (boughtItems && !boostHat && monkeyTail) {
  1705. storeEquip(12, 0);
  1706. boostHat = true;
  1707. } else
  1708. if (boughtItems2 && !monkeyTail) {
  1709. storeEquip(11, 1);
  1710. monkeyTail = true;
  1711. };
  1712. }
  1713. } else {
  1714. if (!settings.autospeed_hat_acc.e && inGame) {
  1715. if (monkeyTail && boughtItems2 && !boostHat) {
  1716. storeEquip(prevTailID, 1);
  1717. monkeyTail = false;
  1718. } else
  1719. if (boostHat && boughtItems) {
  1720. storeEquip(prevHatID, 0);
  1721. boostHat = false;
  1722. };
  1723. };
  1724. if (prevHatID !== Number(myPlayer.skinIndex) && myPlayer.skinIndex !== 31 && myPlayer.skinIndex !== 12 && myPlayer.skinIndex !== 15) {
  1725. prevHatID = Number(myPlayer.skinIndex);
  1726. };
  1727. if (prevTailID !== Number(myPlayer.tailIndex) && myPlayer.tailIndex !== 11) {
  1728. prevTailID = Number(myPlayer.tailIndex);
  1729. };
  1730. i === 0 ? (
  1731. storeEquip(prevHatID, i),
  1732. i = 1
  1733. ) : (
  1734. storeEquip(prevTailID, i),
  1735. i = 0
  1736. );
  1737. };
  1738. x1 = myPlayer.x;
  1739. y1 = myPlayer.y
  1740. };
  1741. };
  1742. }, 50);
  1743.  
  1744. Cow.addRender("building-health-bars", () => {
  1745. if (!Cow.player?.alive) return;
  1746.  
  1747. const { context } = Cow.renderer
  1748. const weaponRange = (Cow.player.weapon.range + Cow.player.scale / 2) * parseFloat(settings.weaponrange.e)
  1749.  
  1750. if ((Date.now() - lastWeaponRangeMultChange) <= 1500) {
  1751. const color = settings.coloredstructures.e?objectAlly(object.owner.sid) ? 'lime':'red':'blue';
  1752.  
  1753. context.save()
  1754. context.fillStyle = color
  1755. context.strokeStyle = color
  1756. context.globalAlpha = .3
  1757. context.lineWidth = 4
  1758.  
  1759. context.translate(Cow.player.renderX, Cow.player.renderY)
  1760. context.beginPath()
  1761. context.arc(0, 0, weaponRange, 0, Math.PI * 2)
  1762. context.fill()
  1763. context.globalAlpha = .7
  1764. context.stroke()
  1765. context.closePath()
  1766. context.restore()
  1767. } else {
  1768. lastWeaponRangeMultChange = null
  1769. };
  1770.  
  1771. if (settings.enabledhacks.e) {
  1772. (function () {
  1773. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1774. let _ = 100;
  1775. let __ = 60;
  1776. for (let hack in settings) {
  1777. if (settings[hack].e && settings[hack].d) {
  1778. if (settings[hack].n === 'Triple AutoMill' || settings[hack].n === 'Animal Aimbot') __ = 75;
  1779. if (settings[hack].n === 'AutoBoost + Spikes') __ = 100;
  1780. if (settings[hack].n === 'AutoSpeed + Hat + Acc') __ = 125;
  1781. ctx.save();
  1782. ctx.beginPath();
  1783. ctx.lineWidth = 7;
  1784. ctx.fillStyle = 'red';
  1785. ctx.strokeStyle = 'black';
  1786. ctx.font = '22px Hammersmith, sans-serif';
  1787. ctx.strokeText(
  1788. settings[hack].n,
  1789. __,
  1790. _
  1791. );
  1792. ctx.fillText(
  1793. settings[hack].n,
  1794. __,
  1795. _
  1796. );
  1797. ctx.restore();
  1798. _ += 30;
  1799. };
  1800. };
  1801. })();
  1802. };
  1803.  
  1804. if (settings.showsid.e && inGame) {
  1805. (function () {
  1806. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1807.  
  1808. ctx.save();
  1809. ctx.beginPath();
  1810. ctx.lineWidth = 7;
  1811. ctx.fillStyle = 'lime';
  1812. ctx.strokeStyle = 'black';
  1813. ctx.font = '22px Hammersmith, sans-serif';
  1814. ctx.strokeText(myPlayer.sid, Cow.player.renderX, Cow.player.renderY);
  1815. ctx.fillText(myPlayer.sid, Cow.player.renderX, Cow.player.renderY);
  1816. ctx.restore();
  1817.  
  1818. for (let t = 0; t < players.length; t++) {
  1819.  
  1820. const offsetX = window.config.maxScreenWidth/2-Cow.player.renderX;
  1821. const offsetY = window.config.maxScreenHeight/2-Cow.player.renderY;
  1822.  
  1823. const endX = Math.round(window.config.maxScreenWidth/2 - myPlayer.x + players[t].x - offsetX*2);
  1824. const endY = Math.round(window.config.maxScreenHeight/2 - myPlayer.y + players[t].y - offsetY*2);
  1825.  
  1826. ctx.save();
  1827. ctx.beginPath();
  1828. ctx.lineWidth = 7;
  1829. ctx.fillStyle = isAlly(players[t].sid) ? 'lime' : 'red';
  1830. ctx.strokeStyle = 'black';
  1831. ctx.font = '22px Hammersmith, sans-serif';
  1832. ctx.strokeText(players[t].sid, endX, endY);
  1833. ctx.fillText(players[t].sid, endX, endY);
  1834. ctx.restore();
  1835.  
  1836. }
  1837. })();
  1838. };
  1839.  
  1840. if (settings.tracers.e && inGame) {
  1841. (function () {
  1842. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1843.  
  1844. for (let t = 0; t < players.length; t++) {
  1845. ctx.save();
  1846. ctx.beginPath();
  1847. ctx.lineWidth = 3;
  1848. ctx.moveTo(Cow.player.renderX, Cow.player.renderY);
  1849.  
  1850. const offsetX = window.config.maxScreenWidth/2-Cow.player.renderX
  1851. const offsetY = window.config.maxScreenHeight/2-Cow.player.renderY
  1852.  
  1853. const endX = Math.round(window.config.maxScreenWidth/2 - myPlayer.x + players[t].x - offsetX*2);
  1854. const endY = Math.round(window.config.maxScreenHeight/2 - myPlayer.y + players[t].y - offsetY*2);
  1855.  
  1856. ctx.lineWidth = 5
  1857. ctx.lineTo(endX, endY);
  1858. ctx.strokeStyle = isAlly(players[t].sid) ? 'lime' : 'red';
  1859. ctx.stroke();
  1860.  
  1861. drawCircle(endX, endY, isAlly(players[t].sid) ? 'lime' : 'red', 45, 5);
  1862.  
  1863. ctx.restore();
  1864. }
  1865. })();
  1866. };
  1867.  
  1868. if (settings.ping.e) {
  1869. const ping = document.getElementById('pingDisplay');
  1870. ping.style.display = 'block';
  1871. ping.style.fontSize = '22px';
  1872. } else {
  1873. const ping = document.getElementById('pingDisplay');
  1874. ping.style.display = 'none';
  1875. };
  1876.  
  1877. if (settings.hp.e && inGame) {
  1878. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1879. ctx.save();
  1880. ctx.beginPath();
  1881. ctx.lineWidth = 7;
  1882. ctx.fillStyle = 'lime';
  1883. ctx.strokeStyle = 'black';
  1884. ctx.font = '22px Hammersmith, sans-serif';
  1885. ctx.strokeText(Math.round(tmpHealth*2)+'hp',Cow.player.renderX,Cow.player.renderY+100);
  1886. ctx.fillText(Math.round(tmpHealth*2)+'hp',Cow.player.renderX,Cow.player.renderY+100);
  1887. ctx.restore();
  1888. };
  1889.  
  1890. if (settings.percents.e && inGame) {
  1891. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1892. ctx.save();
  1893. ctx.beginPath();
  1894. ctx.lineWidth = 7;
  1895. ctx.fillStyle = 'lime';
  1896. ctx.strokeStyle = 'black';
  1897. ctx.font = '22px Hammersmith, sans-serif';
  1898. ctx.strokeText(Math.round(tmpHealth)+'%',Cow.player.renderX,Cow.player.renderY+125);
  1899. ctx.fillText(Math.round(tmpHealth)+'%',Cow.player.renderX,Cow.player.renderY+125);
  1900. ctx.restore();
  1901. };
  1902.  
  1903. Cow.animalsManager.eachVisible((animal) => {
  1904.  
  1905. const existingPlayerIndex = allAnimals.findIndex(allAnimals => allAnimals.sid === animal.sid);
  1906.  
  1907. if (existingPlayerIndex !== -1) {
  1908. // Update existing player information
  1909. allAnimals[existingPlayerIndex] = {
  1910. sid: animal.sid,
  1911. fullhp: animal.maxHealth,
  1912. hp: animal.health,
  1913. name: animal.name,
  1914. x: animal.x,
  1915. y: animal.y,
  1916. x1: animal.x1,
  1917. y1: animal.y1,
  1918. x2: animal.x2,
  1919. y2: animal.y2,
  1920. };
  1921. } else {
  1922. allAnimals.push({
  1923. sid: animal.sid,
  1924. fullhp: animal.maxHealth,
  1925. hp: animal.health,
  1926. name: animal.name,
  1927. x: animal.x,
  1928. y: animal.y,
  1929. x1: animal.x1,
  1930. y1: animal.y1,
  1931. x2: animal.x2,
  1932. y2: animal.y2,
  1933. });
  1934. }
  1935.  
  1936. if (settings.animaltracers.e && inGame) {
  1937. (function () {
  1938. const ctx = document.getElementById('gameCanvas').getContext('2d');
  1939.  
  1940. for (let t = 0; t < allAnimals.length; t++) {
  1941. ctx.save();
  1942. ctx.beginPath();
  1943. ctx.lineWidth = 3;
  1944. ctx.moveTo(Cow.player.renderX, Cow.player.renderY);
  1945.  
  1946. const endX = Math.round(Cow.player.renderX - myPlayer.x + allAnimals[t].x);
  1947. const endY = Math.round(Cow.player.renderY - myPlayer.y + allAnimals[t].y);
  1948.  
  1949. ctx.lineWidth = 5
  1950. ctx.lineTo(endX, endY);
  1951. ctx.strokeStyle = 'blue';
  1952. ctx.stroke();
  1953.  
  1954. drawCircle(endX, endY, 'blue', 45, 5);
  1955.  
  1956. ctx.restore();
  1957.  
  1958. ctx.save();
  1959. ctx.beginPath();
  1960. ctx.lineWidth = 7;
  1961. ctx.fillStyle = 'blue';
  1962. ctx.strokeStyle = 'black';
  1963. ctx.font = '25px Hammersmith, sans-serif';
  1964. ctx.strokeText(allAnimals[t].hp,endX,endY);
  1965. ctx.fillText(allAnimals[t].hp,endX,endY);
  1966. ctx.restore();
  1967.  
  1968. };
  1969. })();
  1970. };
  1971. });
  1972.  
  1973. function getRubyName(name) {
  1974. switch (name) {
  1975. case 'turret':
  1976. return 'Turret'
  1977. break;
  1978. case 'windmill':
  1979. return 'Mill'
  1980. break;
  1981. case 'faster windmill':
  1982. return 'Mill'
  1983. break;
  1984. case 'power mill':
  1985. return 'Mill'
  1986. break;
  1987. case 'spawn pad':
  1988. return 'Spawn Pad'
  1989. break;
  1990. case 'spikes':
  1991. return 'Spikes'
  1992. break;
  1993. case 'greater spikes':
  1994. return 'Spikes'
  1995. break;
  1996. case 'poison spikes':
  1997. return 'Spikes'
  1998. break;
  1999. case 'spinning spikes':
  2000. return 'Spikes'
  2001. break;
  2002. case 'wood wall':
  2003. return 'Walls'
  2004. break;
  2005. case 'stone wall':
  2006. return 'Walls'
  2007. break;
  2008. case 'castle wall':
  2009. return 'Walls'
  2010. break;
  2011.  
  2012. default:
  2013. return 'None'
  2014. break;
  2015. };
  2016. };
  2017.  
  2018. Cow.objectsManager.eachVisible((object) => {
  2019. if (!object.isItem) return
  2020.  
  2021. const distance = CowUtils.getDistance(Cow.player, object) - object.scale
  2022. const angle = CowUtils.getDirection(object, Cow.player)
  2023.  
  2024. if (settings.rubyfarm.e && inGame && objectAlly(object.owner.sid)) {
  2025. const damage = Cow.player.weapon.dmg * Cow.items.variants[Cow.player.weaponVariant].val;
  2026. const damageAmount = damage * (Cow.player.weapon.sDmg || 1) * (Cow.player.skin?.id === 40 ? 3.3 : 1);
  2027. myDmg = damageAmount;
  2028. if (getRubyName(object.name) === settings.rubyfarm.r && distance < 150) {
  2029. hitCount_ = Math.ceil(object.health / damageAmount);
  2030. itemHp = object.health;
  2031. itemInfo.started = true;
  2032. };
  2033. } else {
  2034. itemInfo.started = false;
  2035. };
  2036.  
  2037. inTrap = false;
  2038.  
  2039. if (object.name === 'pit trap') {
  2040. if (distance < 50 && object.owner.sid !== myPlayer.sid && !(objectAlly(object.owner.sid))) {
  2041. inTrap = true;
  2042. // console.log(object.health)
  2043. if (settings.autobreak.e && inGame) {
  2044. const damage = Cow.player.weapon.dmg * Cow.items.variants[Cow.player.weaponVariant].val;
  2045. const damageAmount = damage * (Cow.player.weapon.sDmg || 1) * (Cow.player.skin?.id === 40 ? 3.3 : 1);
  2046. chat('AutoBreaking...')
  2047. var index = 0;
  2048. let angle = Math.atan2(object.y - myPlayer.y, object.x - myPlayer.x);
  2049. if (inventory.primary === 8 && inventory.secondary !== 10) {
  2050. chat("KillSwitch MOD can't help you.");
  2051. };
  2052. index = inventory.secondary === 10 ? 1 : 0;
  2053. if (!stoptrapper) {
  2054. stoptrapper = true
  2055. selectWeapon(index);
  2056. };
  2057. if (Math.ceil(object.health / damageAmount) < 2) {
  2058. stoptrapper = false;
  2059. };
  2060.  
  2061. _hit(angle);
  2062.  
  2063. setTimeout(() => {
  2064. if (settings.autoheal.e && tmpHealth < 100) { place(inventory.food, angle) };
  2065. }, 10);
  2066. };
  2067. };
  2068. };
  2069.  
  2070. if (settings.inweaponrange.e && distance > weaponRange) return
  2071. if (settings.whereurlooking.e && CowUtils.getAngleDist(angle, Cow.player.lookAngle) > Cow.config.gatherAngle) return
  2072.  
  2073. if (settings.hitcounter.e) {
  2074. const damage = Cow.player.weapon.dmg * Cow.items.variants[Cow.player.weaponVariant].val
  2075. const damageAmount = damage * (Cow.player.weapon.sDmg || 1) * (Cow.player.skin?.id === 40 ? 3.3 : 1)
  2076. const hits = Math.ceil(object.health / damageAmount)
  2077. const offsetY = settings.circles_hp.e ? 2 : 22
  2078.  
  2079. context.save()
  2080. context.font = `18px Hammersmith, sans-serif`
  2081. context.fillStyle = "#fff"
  2082. context.textBaseline = "middle"
  2083. context.textAlign = "center"
  2084. context.lineWidth = 8
  2085. context.lineJoin = "round"
  2086.  
  2087. context.translate(object.renderX, object.renderY)
  2088. context.strokeText(hits, 0, offsetY)
  2089. context.fillText(hits, 0, offsetY)
  2090. context.restore()
  2091. };
  2092.  
  2093. if (settings.circles_hp.e) {
  2094. const endAngle = ((object.health / object.maxHealth) * 360) * (Math.PI / 180)
  2095. const width = 14
  2096. const scale = 22
  2097.  
  2098. context.save()
  2099. context.translate(object.renderX, object.renderY)
  2100. context.rotate(object.dir ?? object.dir2)
  2101. drawCircleBar("#3d3f42", width, scale, endAngle)
  2102. drawCircleBar(settings.coloredstructures.e?objectAlly(object.owner.sid) ? 'lime':'red':'blue', width / 2.5, scale, endAngle)
  2103. context.restore()
  2104.  
  2105. return
  2106. };
  2107.  
  2108. if (settings.healthbars.e || settings.circles_hp.e) {
  2109.  
  2110. const { healthBarWidth, healthBarPad } = window.config
  2111. const width = healthBarWidth / 2 - healthBarPad / 2
  2112. const height = 17
  2113. const radius = 8
  2114.  
  2115. context.save()
  2116. context.translate(object.renderX, object.renderY)
  2117.  
  2118. context.fillStyle = "#3d3f42"
  2119. context.roundRect(-width - healthBarPad, -height / 2, 2 * width + 2 * healthBarPad, height, radius)
  2120. context.fill()
  2121.  
  2122. context.fillStyle = settings.coloredstructures.e?objectAlly(object.owner.sid) ? 'lime':'red':'blue'
  2123. context.roundRect(-width, -height / 2 + healthBarPad, 2 * width * (object.health / object.maxHealth), height - 2 * healthBarPad, radius - 1)
  2124. context.fill()
  2125. context.restore()
  2126. };
  2127. });
  2128. });
  2129. })();