i30Mod

BEST WS SENDER MOD! ESC = Mod Menu, P = WS Sender, L = Console Command. [ = advanced autochat. Change autochat: press L, then enter advAc2 = "<your autochat here>" || Features: Increases FPS, Blocks Ads, Biome Map, and more! This is a utility mod, not a hack. Made by i30cps.

目前為 2022-12-30 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name i30Mod
  3. // @author i30cps
  4. // @version 1.8.3
  5. // @description BEST WS SENDER MOD! ESC = Mod Menu, P = WS Sender, L = Console Command. [ = advanced autochat. Change autochat: press L, then enter advAc2 = "<your autochat here>" || Features: Increases FPS, Blocks Ads, Biome Map, and more! This is a utility mod, not a hack. Made by i30cps.
  6. // @match *://moomoo.io/*
  7. // @match *://sandbox.moomoo.io/*
  8. // @match *://dev.moomoo.io/*
  9. // @match *://abc.moomoo.io/*
  10. // @icon data:image/png;base64,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
  11. // @require https://gf.qytechs.cn/scripts/423602-msgpack/code/msgpack.js?version=912797
  12. // @require http://code.jquery.com/jquery-3.3.1.min.js
  13. // @require https://code.jquery.com/ui/1.12.0/jquery-ui.min.js
  14. // @require https://cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.0/jquery-confirm.min.js
  15. // @license none
  16. // @namespace -
  17. // ==/UserScript==
  18.  
  19. /*
  20. discord is rotator#2860
  21.  
  22. ws notes
  23. packet = data
  24. - receiving:
  25. - io-init = intialization
  26. - ch = chat; data[0] = unknown; data[1] = playerid; data[2] = message
  27. - 2 = other player came
  28. what super mod has to say about this:
  29. names[data[1][1]] ? names[data[1][1]] != data[1][2] ? (console.log("{", names[data[1][1]], "} => {", data[1][2], "} [", data[1][1], "]"), cPlayer && chat("{" + names[data[1][1]] + "} => {" + data[1][2] + "}")) : (console.log("{", names[data[1][1]], "} returned"), cPlayer && chat("{" + names[data[1][1]] + "} returned")) : (console.log("{", data[1][2], "} [", data[1][1], "]"), cPlayer && chat("{" + data[1][2] + "} [" + data[1][1] + "]")), names[data[1][1]] = data[1][2], theirPrimary[data[1][1]] = 0, theirSecondary[data[1][1]] = void 0;
  30. - 6 = something about buildings, idk. examine some hacks to find out about it (look in the anti trap section)
  31. - 7: i dont know much about that
  32. - 8 = mostly useless
  33. - 9 = you got a kill or something, idk
  34. - 10 = mostly useless
  35. - 11 = you died
  36. - 13 = player left or something, idk
  37. - 17 = something happens to your hotbar
  38. - 18
  39. - 33 = move
  40. - ac
  41. - h = hp change
  42. - data[2] = your hp
  43. - d = disconnect
  44. -
  45. //*/
  46.  
  47. // antiinvis
  48. CanvasRenderingContext2D.prototype.rotatef = CanvasRenderingContext2D.prototype.rotate
  49. CanvasRenderingContext2D.prototype.rotate = function(e){
  50. if(Math.abs(e) > 1e300) {
  51. e = Math.atan2(Math.cos(e), Math.sin(e));
  52. this.globalAlpha = 0.85;
  53. this.rotatef(e);
  54. } else {
  55. this.rotatef(e);
  56. }
  57. };
  58.  
  59. //Start edit
  60. setTimeout(() => {
  61. if (document.getElementById('gameName').innerHTML != 'i30cps') {
  62. alert("Warning: Mod may not be compatible with other mods. Use at your own risk.");
  63. }
  64. $("#ot-sdk-btn-floating").remove() // remove the cookie thing
  65. console.log("SetTimeout Happened..");
  66. $("#gameCanvas").css('cursor', 'url(http://cur.cursors-4u.net/user/use-1/use153.cur), default');
  67. $("#enterGame").css('cursor', 'url(http://cur.cursors-4u.net/user/use-1/use153.cur), default');
  68. document.getElementById('loadingText').innerHTML = "i30cps mod isn't unfair, and thus isn't a hack.";
  69. document.getElementById('gameName').innerHTML = 'i30cps';
  70. //document.getElementById('errorNotification').remove();
  71. window.location.native_resolution = true;
  72. $("#consentBlock").css({display: "none"});
  73. $("#youtuberOf").css({display: "none"});
  74. $("#mapDisplay").css({background: `url('https://i.imgur.com/fgFsQJp.png')`});
  75. //document.getElementById("moomooio_728x90_home").style.display = "none";
  76. //$("#moomooio_728x90_home").parent().css({display: "none"});
  77. document.getElementById("linksContainer2").innerHTML = `<a href="https://www.youtube.com/" target="_blank" class="menuLink">YouTube</a> | <a href="https://discord.com/channels/@me" target="_blank" class="menuLink"> Discord </a> | <a href="https://youtube.com/watch?v=dQw4w9WgXcQ" target="_blank" class="menuLink"> Little Bots </a> `
  78. //Edit end
  79. }, 1200);
  80. console.log("The mod is working.");
  81. $("#gameCanvas").css('cursor', 'url(http://cur.cursors-4u.net/user/use-1/use153.cur), default');
  82. $("#enterGame").css('cursor', 'url(http://cur.cursors-4u.net/user/use-1/use153.cur), default');
  83. document.getElementById('loadingText').innerHTML = "i30cps mod isn't unfair, and thus isn't a hack.";
  84. document.getElementById('gameName').innerHTML = 'i30cps';
  85. document.getElementById("leaderboard").append('i30cps\' Utility Mod');;
  86. //document.getElementById('errorNotification').remove();
  87. //more fps:
  88. window.location.native_resolution = true;
  89. $("promoImgHolder").remove();
  90. $("#consentBlock").css({display: "none"});
  91. $("#youtuberOf").css({display: "none"});
  92. $("#mapDisplay").css({background: `url('https://i.imgur.com/fgFsQJp.png')`});
  93. //document.getElementById("moomooio_728x90_home").style.display = "none";
  94. //$("#moomooio_728x90_home").parent().css({display: "none"});
  95. document.getElementById("linksContainer2").innerHTML = `<a href="https://www.youtube.com/" target="_blank" class="menuLink">YouTube</a> | <a href="https://discord.com/channels/@me" target="_blank" class="menuLink"> Discord </a> | <a href="https://youtube.com/watch?v=dQw4w9WgXcQ" target="_blank" class="menuLink"> Little Bots </a> `
  96. //Edit end
  97. try {
  98. document.getElementById("moomooio_728x90_home").style.display = "none"; //Remove sidney's ads
  99. $("#moomooio_728x90_home").parent().css({display: "none"});
  100. } catch (e) {
  101. console.log("error removing ad");
  102. }
  103.  
  104. function login(username, sk=0) {
  105. doNewSend(['sp', [{name: username, skin: sk, mofoll: 1}]])
  106. }
  107.  
  108. let mouseX;
  109. let mouseY;
  110.  
  111. let width;
  112. let height;
  113.  
  114. var animateyorn = true;
  115. var doAdvAc1 = false;
  116. var doAdvAc2 = false;
  117. var animateInterval = 500;
  118. var advAc2pos = 0;
  119. var advAc = `get i30cpsmod
  120. no unfair advantages
  121. --
  122. imagine cheating
  123. --`.split('\n'); // change this to change advanced autochat type 1, make sure each line is or is below thirty characters long.
  124. var advAc2 = "Imagine having to cheat through the use of unfair advantages to beat others in a cow game. Whoever does is pathetic. Stop the cheaters. Get i30cpsmod - no unfair advantages. Bring more light into mooomoo.io. bit.ly/i30cpsmod";
  125. var advertisement = "Imagine having to cheat through the use of unfair advantages to beat others in a cow game. Whoever does is pathetic. Stop the cheaters. Get i30cpsmod - no unfair advantages. Bring more light into mooomoo.io. bit.ly/i30cpsmod";
  126. var rickroll = `We're no strangers to love; You know the rules and so do I (do I); A full commitment's what I'm thinking of; You wouldn't get this from any other guy; I just wanna tell you how I'm feeling; Gotta make you understand; Never gonna give you up; Never gonna let you down; Never gonna run around and desert you; Never gonna make you cry; Never gonna say goodbye; Never gonna tell a lie and hurt you; We've known each other for so long; Your heart's been aching, but you're too shy to say it (say it); Inside, we both know what's been going on (going on); We know the game and we're gonna play it; And if you ask me how I'm feeling; Don't tell me you're too blind to see; Never gonna give you up; Never gonna let you down; Never gonna run around and desert you; Never gonna make you cry; Never gonna say goodbye; Never gonna tell a lie and hurt you; Never gonna give you up; Never gonna let you down; Never gonna run around and desert you; Never gonna make you cry; Never gonna say goodbye; Never gonna tell a lie and hurt you; We've known each other for so long; Your heart's been aching, but you're too shy to say it (to say it); Inside, we both know what's been going on (going on); We know the game and we're gonna play it; I just wanna tell you how I'm feeling; Gotta make you understand; Never gonna give you up; Never gonna let you down; Never gonna run around and desert you; Never gonna make you cry; Never gonna say goodbye; Never gonna tell a lie and hurt you; Never gonna give you up; Never gonna let you down; Never gonna run around and desert you; Never gonna make you cry; Never gonna say goodbye; Never gonna tell a lie and hurt you; Never gonna give you up; Never gonna let you down; Never gonna run around and desert you; Never gonna make you cry; Never gonna say goodbye; Never gonna tell a lie and hurt you`
  127. function roll() {
  128. if (advAc2.substring(0, 1820) == rickroll) {advAc2 = advertisement}
  129. else {advAc2 = rickroll}
  130. }
  131. setInterval(() => { // if someone steals my advAc2 ill go find their house and rickroll them irl
  132. if(doAdvAc1) { // array autochat
  133. doNewSend(['ch', [advAc[advAc2pos++]]]);
  134. }
  135. else if(doAdvAc2) { // Long scroll autochat
  136. while (advAc2.length <= 30) {
  137. advAc2 += " || " + advAc2
  138. }
  139. if (advAc2.substring(advAc2.length - 30, advAc2.length) != advAc2.substring(0, 30)) {
  140. advAc2 += " || " + advAc2.substring(0, 30);
  141. }
  142. if (advAc2pos > advAc2.length - 30) {
  143. advAc2pos = 0;
  144. }
  145. doNewSend(['ch', [advAc2.substring(advAc2pos, advAc2pos + 30)]])
  146. advAc2pos += 2;
  147. } else {advAc2pos = 0}
  148. if(messageToggle == 1) { // default autochat
  149. doNewSend(["ch", [animate(true, animateyorn)]])
  150. }
  151. }, animateInterval);
  152.  
  153. var angs = [[-135, -90, -45],
  154. [180, null, 0],
  155. [135, 90, 45]]; // angle for movement
  156.  
  157. var justClosed = false;
  158.  
  159. setInterval(() => {
  160. if(autoaim == true) {
  161. doNewSend(["2", [nearestEnemyAngle]]);
  162. }
  163. if (document.querySelector("#allianceMenu").style.display=='block') {
  164. if (holdingKeys.w || holdingKeys.a || holdingKeys.s || holdingKeys.d) {
  165. let xArea = 1;
  166. let yArea = 1;
  167. if (holdingKeys.w) yArea -= 1;
  168. if (holdingKeys.a) xArea -= 1;
  169. if (holdingKeys.s) yArea += 1;
  170. if (holdingKeys.d) xArea += 1;
  171. doNewSend(['33', [toRad(angs[yArea][xArea])]])
  172. justClosed = true;
  173. }
  174. } else if (justClosed) { // just closed it
  175. justClosed = false;
  176. }
  177. }, 5);
  178.  
  179. setInterval(() => {
  180. // Fix advAc2
  181. while (advAc2.length <= 30) {
  182. advAc2 += " || " + advAc2
  183. }
  184. if (advAc2.substring(advAc2.length - 30, advAc2.length) != advAc2.substring(0, 30)) {
  185. advAc2 += " || " + advAc2.substring(0, 30);
  186. }
  187.  
  188. // CpsTalk
  189. if (cpsTalk) {
  190. doNewSend(['ch', ["Clicks/Sec. - " + cps + " - By i30cps"]])
  191. }
  192. }, 500)
  193.  
  194. function normal() {
  195. hat(normalHat);
  196. acc(normalAcc);
  197. }
  198.  
  199. function aim(x, y){
  200. var cvs = document.getElementById("gameCanvas");
  201. cvs.dispatchEvent(new MouseEvent("mousemove", {
  202. clientX: x,
  203. clientY: y
  204.  
  205. }));
  206. }
  207.  
  208. let coreURL = new URL(window.location.href);
  209. window.sessionStorage.force = coreURL.searchParams.get("fc");
  210.  
  211. var holdingKeys = {w: false, a: false, s: false, d: false}
  212.  
  213. var cpsTalk = false;
  214. var nearestEnemy;
  215. var nearestEnemyAngle;
  216. var isEnemyNear;
  217. var primary;
  218. var instapike = true;
  219. var instaCHAT = true;
  220. var secondary;
  221. var foodType;
  222. var wallType;
  223. var spikeType;
  224. var millType;
  225. var mineType;
  226. var boostType;
  227. var fdng = true;
  228. var turretType;
  229. var spawnpadType = 20;
  230. var autoaim = false;
  231. var tick = 1;
  232. var oldHat;
  233. var oldAcc;
  234. var enemiesNear;
  235. var normalHat;
  236. var normalAcc;
  237. var ws;
  238. var searchp = true;
  239. var msgpack5 = msgpack;
  240. let myPlayer = {
  241. id: null,
  242. x: null,
  243. y: null,
  244. dir: null,
  245. object: null,
  246. weapon: null,
  247. clan: null,
  248. isLeader: null,
  249. hat: null,
  250. accessory: null,
  251. isSkull: null
  252. };
  253.  
  254. let healSpeed = 100;
  255. var messageToggle = 0;
  256. let hatToggle = 1;
  257. var letChatToggle = 1;
  258. document.logPackets = false;
  259.  
  260. var interv = setInterval(() => {
  261. if(!(localStorage.i30cps_MENU==undefined)){document.querySelector("#menuchanger").innerText = "Menu Key: "+localStorage.i30cps_MENU+" - Click this text and press a key to change it!";}
  262. if (document.querySelector("#menuchanger").innerText == "Menu Key: "+localStorage.i30cps_MENU+" - Click this text and press a key to change it!") {
  263. clearInterval(interv);
  264. }
  265. }, 500);
  266.  
  267. if (localStorage.i30cps!='true') {
  268. localStorage.i30cps = !0;
  269. localStorage.i30cps_MENU = 'Escape';
  270. localStorage.i30cps_SPIKE = 'v';
  271. localStorage.i30cps_BOOST = 'f';
  272. localStorage.i30cps_MILL = 'z';
  273. localStorage.i30cps_TURRET = 'g';
  274. localStorage.i30cps_WALL = 't';
  275. localStorage.i30cps_SPAWNPAD = 'b';
  276. }
  277.  
  278. var nocommand = ["ach1", "spikechanger", "millchanger", "boostchanger", "turretchanger", "chatbox", "allianceinput"]
  279.  
  280. function decorate(message) {
  281. let result = ''
  282. for (let i = 0; i < message.length; i++) {
  283. Math.random() < 0.1 ? result += '~' : (Math.random() < 0.1 ? result += '-' : result += message[i]);
  284. }
  285. return result;
  286. }
  287.  
  288. document.msgpack = msgpack;
  289.  
  290. WebSocket.prototype.oldSend = WebSocket.prototype.send;
  291. WebSocket.prototype.send = function(m){
  292. if (!ws) {
  293. document.ws = this;
  294.  
  295. ws = this;
  296. socketFound(this);
  297. }
  298. if (document.logPackets) { // intercept and log the packet
  299. if (!(document.doNotLog.includes(msgpack.decode(m)[0].toString()))) console.log(msgpack.decode(m));
  300. }
  301. this.oldSend(m);
  302. };
  303.  
  304. document.addEventListener('mousedown', (e) => {
  305. cps += 1;
  306. setTimeout(() => {cps -= 1}, 960);
  307. });
  308.  
  309. document.addEventListener('keydown', (e) => {
  310. if (e.code == 'Space') {
  311. cps += 1;
  312. setTimeout(() => {cps -= 1}, 960);
  313. }
  314. })
  315.  
  316. document.doNotLog = ['2', 'pp', '33', 'ch']
  317.  
  318. function socketFound(socket){
  319. socket.addEventListener('message', function(message){
  320. handleMessage(message);
  321. });
  322. }
  323.  
  324. function handleMessage(m){
  325. let temp = msgpack5.decode(new Uint8Array(m.data));
  326. let data;
  327. if(temp.length > 1) {
  328. data = [temp[0], ...temp[1]];
  329. } else {
  330. data = temp;
  331. }
  332. let item = data[0];
  333. if(!data) {return};
  334.  
  335. if(item === "io-init") {
  336. let cvs = document.getElementById("gameCanvas");
  337. width = cvs.clientWidth;
  338. height = cvs.clientHeight;
  339. $(window).resize(function() {
  340. width = cvs.clientWidth;
  341. height = cvs.clientHeight;
  342. });
  343. cvs.addEventListener("mousemove", e => {
  344. mouseX = e.clientX;
  345. mouseY = e.clientY;
  346. });
  347. }
  348. if (item == 'an') {
  349. if (tabs.includes(data[1][0])) {
  350. doNewSend(['11', [data[1], '1']])
  351. }
  352. }
  353. if (item == "1" && myPlayer.id == null){
  354. myPlayer.id = data[1];
  355. myID = data[1];
  356. if (!tabs.includes(myID)) {
  357. tabs.push(myID);
  358. }
  359. }
  360.  
  361. if (item == "33") {
  362. enemiesNear = [];
  363. for(let i = 0; i < data[1].length / 13; i++) {
  364. let playerInfo = data[1].slice(13*i, 13*i+13);
  365. if(playerInfo[0] == myPlayer.id) {
  366. myPlayer.x = playerInfo[1];
  367. myPlayer.y = playerInfo[2];
  368. myPlayer.dir = playerInfo[3];
  369. myPlayer.object = playerInfo[4];
  370. myPlayer.weapon = playerInfo[5];
  371. myPlayer.clan = playerInfo[7];
  372. myPlayer.isLeader = playerInfo[8];
  373. myPlayer.hat = playerInfo[9];
  374. myPlayer.accessory = playerInfo[10];
  375. myPlayer.isSkull = playerInfo[11];
  376. } else if(playerInfo[7] != myPlayer.clan || playerInfo[7] === null) {
  377. enemiesNear.push(playerInfo);
  378. }
  379. }
  380. }
  381.  
  382. isEnemyNear = false;
  383. if(enemiesNear) {
  384. nearestEnemy = enemiesNear.sort((a,b) => dist(a, myPlayer) - dist(b, myPlayer))[0];
  385. }
  386. if(nearestEnemy) {
  387. nearestEnemyAngle = Math.atan2(nearestEnemy[2]-myPlayer.y, nearestEnemy[1]-myPlayer.x);
  388. if(Math.sqrt(Math.pow((myPlayer.y-nearestEnemy[2]), 2) + Math.pow((myPlayer.x-nearestEnemy[1]), 2)) < 300) {
  389. isEnemyNear = true;
  390. if(autoaim == false && myPlayer.hat != 7 && myPlayer.hat != 53) {
  391. normalHat = 6;
  392. if(primary != 8) {
  393. normalAcc = 21;
  394. }
  395. };
  396. }
  397. }
  398. if(isEnemyNear == false && autoaim == false) {
  399. normalAcc = 11;
  400. if (myPlayer.y < 2400){
  401. normalHat = 15;
  402. } else if (myPlayer.y > 6850 && myPlayer.y < 7550){
  403. normalHat = 31;
  404. } else {
  405. normalHat = 12;
  406. }
  407. }
  408. if (!nearestEnemy) {
  409. nearestEnemyAngle = myPlayer.dir;
  410. }
  411. update();
  412. }
  413.  
  414.  
  415. function doNewSend(sender){
  416. ws.send(new Uint8Array(Array.from(msgpack5.encode(sender))));
  417. }
  418. document.doNewSend = doNewSend;
  419.  
  420. /* Hat/Acc Debug */
  421.  
  422. function acc(id) {
  423. doNewSend(["13c", [0, 0, 1]]);
  424. doNewSend(["13c", [0, id, 1]]);
  425. }
  426.  
  427. function hat(id) {
  428. doNewSend(["13c", [0, id, 0]]);
  429. }
  430.  
  431. function placeF(id, angle = Math.atan2(mouseY - height / 2, mouseX - width / 2)) {
  432. doNewSend(["5", [id, null]]);
  433. doNewSend(["c", [1, angle]]);
  434. doNewSend(["c", [0, angle]]);
  435. doNewSend(["5", [id, null]]);
  436. doNewSend(["c", [1, angle]]);
  437. doNewSend(["c", [0, angle]]);
  438. doNewSend(["5", [myPlayer.weapon, true]]);
  439. }
  440.  
  441. function place(id, angle = Math.atan2(mouseY - height / 2, mouseX - width / 2)) {
  442. doNewSend(["5", [id, null]]);
  443. doNewSend(["c", [1, angle]]);
  444. doNewSend(["c", [0, angle]]);
  445. doNewSend(["5", [myPlayer.weapon, true]]);
  446. }
  447.  
  448. function slot(id) {
  449. doNewSend(["5", [id, null]])
  450. }
  451.  
  452. function katana() {
  453. doNewSend([6, [4]])
  454. }
  455.  
  456. document.addEventListener('keydown', (e)=>{
  457. if (['KeyW', 'KeyA', 'KeyS', 'KeyD'].includes(e.code)) {
  458. if (e.code == 'KeyW') holdingKeys.w = true;
  459. else if (e.code == 'KeyA') holdingKeys.a = true;
  460. else if (e.code == 'KeyS') holdingKeys.s = true;
  461. else if (e.code == 'KeyD') holdingKeys.d = true;
  462. }
  463. if (updateMenuKey) {
  464. updateMenuKey = false;
  465. localStorage.i30cps_MENU = e.code;
  466. document.querySelector("#menuchanger").innerText = "Menu Key: "+e.code+" - Click this text and press a key to change it!";
  467. }
  468. if (e.keyCode == 46 && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  469. const EDITION = 0;
  470.  
  471. var head = document.getElementsByTagName('head')[0];
  472. var icon = document.createElement('link');
  473.  
  474. icon.setAttribute('type', 'image/png');
  475. icon.setAttribute('rel', 'shortcut icon');
  476.  
  477. if (EDITION == 0) icon.setAttribute('href', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAAAA3NCSVQICAjb4U/gAAABHVBMVEX///9FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUXt7e3r6+vp6enn5+fl5eXj4+Ph4eHf39/d3d3b29vZ2dnX19fV1dXT09PR0dHPz8/MzMzJycnHx8fFxcXDw8PBwcG/v7+9vb27u7u5ubm3t7e1tbWzs7OxsbGvr6+tra2rq6upqamnp6elpaWjo6OhoaGfn5+dnZ2ZmZmVlZWTk5ORkZGPj4+NjY2Li4uJiYmHh4eFhYWDg4OBgYF+fn58fHx6enp4eHh2dnZ0dHRycnJwcHBubm5sbGxqampmZmZiYmJgYGBeXl5cXFxaWlpYWFhWVlZUVFRSUlJQUFBOTk5MTExKSkpISEhGRkZFRUUChAOfAAAAX3RSTlMAESIzRFVmd4iZqrvM3e7//////////////////////////////////////////////////////////////////////////////////////////////////////////4gnOa8AAAAJcEhZcwAACpwAAAqcAfTS3xIAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAFnRFWHRDcmVhdGlvbiBUaW1lADAzLzE3LzE3CP1IFgAADiFJREFUeJztnXsjG00XwJ8gaULYhLRudSlFL4RS9PKUVsuDEooIkc33/xiviMjuOWdusTOz+s7vX8maM5k9c25z5p9/HA6Hw+FwOBwOh8PhcDgcDofD4XA4HHpIdCdT6Uxftr9/oP7AQH9/ti+TTiW7E7bHp5FEdyqTDUhNM5DNpP7CaehKZrIi0YNkM8m/ZxK6Upl+FeFb9GdSXbbH/mi6Ur3CRc9joPcpT0Kys18erYR0t21JOqE7/aif/qnPQUpJ5cmQTdmWSZ5EOmrpm6SfxsaQyOgRv0HmCUyBpl+/Rdq2fAKe6RW/wTPbMnKIXvVRxFcdanz5w2RsS0qSjMTqkSObtC0txtjP3yRui6BH+u2/Lv36d70492pipJD37skXRiZezRXX//1VupZ9TjZWtqGU8q8efVt59dwT8GJmZeu4KvO8GG0H4r2/8nN1KieSvU1ueu1XRfjQ2NgEvfxx+scb0/Kyt5nePBbMQK9tye/o5r/+x2sjnUjfZPQjfw6yMQgWcF//ypeXnUvfZOIr710YsK4KefKfLObFAorJL51w/klPbOU/nItC+ibzv9n/x+pmwJa/9Do68RvMleK4BrpZY7p4F634Dd5dsP6bNT2QYET9bj4NRi+/5w1+rtH/b8BWmKSPsfondIjfYJKhDfvsyE+7P7VNBYtPldwnehFYcY1oBVie0Sd+g9lL8t9a2Ap6yIH8HtYrv+cN0zui8a0gQYY/tjUu/xb579R/7jetCCkF4G/oF7/BJjUDhtVAipJ/xYz8nveBmgGjodIuYgC196bk97xFnxiASc+QsAD8RXPye94SMQEGowPUDrhmUn7PWyOGYGwvTBD//LNZ+T3vMzEIUzsBEQLbNS2/5+1aewmIHeBkyPwEDJ3icZjZCXAM8HrMvPyeN45zCFkT8hMLwOgG0IbYCkwsAWwD79iR3/N+oqH065cfL4BywdYEFLBrqH8J4AXw1pb8nvfW/BLAC8DCDthmz/gSQEbwzajNCRi7gePRHB5Lohk3bgKG+YIGpDdGjMIAFWsasEkBJc70BgZQIHzdrvyetwFHNKBTfqQCK1oyACoMoSWgUw0iN8j6AiCWgE6XCP6vqmUN0KCA6mn0yY/egG+2pW+wZe4dgG+Ary0JpsKEuXcA7gG/bcveBKZKtO0DKBtetC16k2U4Ll22EIyFVi3EgSiGoBrUFR2FfsBP25K3gHEBXf4AVAEW/eAw78woAagCbqxbgS2GoE+oRwlAFbBnW+42/4Gh6bEEoBVgLBcqBmZL9VgCUAWM2xa7zbgJJQAzwue2pQ4CS+h0ZIqhI/DdttBBYNWIDiUAg0HLtoUOAo1BHWEhmBGbtC10kEkwOA05MpgTv7Ytc4gctIajz5TDsriYeIItoEcYfdkc1IGxiIW0+QaGF70WhDowRmZQA2gKRa8FoSuouSRWlRkwvOgdQmgHvrAtcpgXYHiR24Lx3gRugeUiUW8D0Bc+sS0wBB4liNojhlnRGPnCTWCiPOrz5THfBfXvg/B4sKHCcHlghizqg8WxdoUa6HaHYDhowbbAkAUwwKiDQjG3g/RbQrF2hhtMggFG7RDD6jirpVEUo2CAUdfLQUtY2ArDNM/BAKO2heEExCQt2GZI8wSAx9dty4uBI3QT4CYgFhOQn5pfXlv78H5WKX6Qe7lQXFtbfT+rsNnEcAKev9s+bR/wu/i+IHewdnj9sJ3tvTqU7cETtwnIvd1DR93LK+IpGNtBhyIvPsukIeM1AfnVc/iNO45Fa3oZlX838HfFy0DzBEA7gF8h+Z4Wv/Fr8m1o6jRgk5+CqSuAz+s2hHh9Akb2mWLczgDvm9R50BbVD9wJGNY8AdAX4HSIenPFEaNeP2R/c5rRJeWefZ79/RJ8OGpfAHqDr5gjWadOdgdhplTyvI5RDf5wpv0V+GzU3iCMB8yzBgJjc5gyq7hqRfjVCluDzIOPRh0PgCExVpGoWP56nfUyMzWnzAwUwSejDolJBkXXJeRn5RRey3y3zGrOpzsoKhcWnxe9/03oV3lb6rvHjA51usPisDxgnxrEsLgN5h2rpAjMXmFhvtITALfeqAsEYI3YH2oQxJF+EvKwMdzIWfh0PPYP+FjkdWLg+TViDG8kRaCVgJQKaHBKORQ5aEJELb9EVDRHdDSgqVATQPVFoVkmvj0GPhP9GWJoCMyiMcCNiI1PTQDPDA5TJvQgXD/RF0hAQwArMpEdF+BxE1Bfwt9eBR+JvkQG7oPbcAiz8gI8cgXUS/jb+ktFYYUEGsQPeQHK1AS8l/8+kZeCLUc1nBgA/+EG6OK8dFv0ev2ImgDozfDYhF/OwThK9PKLsoNzCuPfoiZgSM6KvOMEfnkSfEBHOxmoBYEmYsdyMLQnJb2L1nGNmm5XqIFAC4oaoQehHZqvCk+A57WgH6GjXB4aw6fhIUhdCdDkmJQfZfh5QCWg3RBuwC2VhJYYD1Y84Ez+EaBzi/YyyTtglUxoGUpb8vX6FSuzDI0ZDmAThu109ByagsfmQn6pwi7+iSG/N0S3zKUAlgRUH3rOzkJTKKQE5H+9S3ZpgTgo2AI4o3AD0XR6Go4i6BDKG7KEId8ix24hDwl9D5bH6OohAR3CYHxbegK4NbYTZGJMOAFw5eg6PA0Do0FZyE63BBf8NLnsm1QNfQvWCes6Pg/jgtWAXy6pBKtTXPmJhiA0ISWYhzaItj7bcBiBclE5K6YmLDDNHUg9KGRLwSJRfW1koD8UODwKTREZ+V/vXNR8v3axE7yOY/BQ5kk/gs+BsQB9jTWhEqgEXGKJoHY1JP9oW1L/IOAdDOIWeZhgF+McTMbqu4EKdVEJXCSzIxx0OfT+T4dyCJeBv+UkHMvgo5AjrrGfHHQHAh6hUAsehgoDJsDPdhXMFi2KgisXwUdBT1BnNzXoDly194FB/qBr4a5jQ8jx+RM0EMeO+BMQbGI4CN8Anb3EUC+tQEd53NowwCHoOYXzgH44TPSBV2VRC9qgaOnp7CaHuooHUoTD7CGfwc77VPzPD9dcvNhil4v8G/wgqsfR2mEcWsN+QH2zUjtnuDiOXOEwVDr+nTEFZ8G3ZRSGEvU2FUXvQLBOgNLe/iHRbYgOoProcrLhT2Xic5VQdh21E9TbVha9A+fBX3cF2qSlDbK4jWHtHeBP5uZ34Jt1FGpknkNlJZp77KO2usvB4TzfKLVWZO1ku8io5oAFXS18siA0N7Px34PNcLULipNQIzXdt06hdwDGNwrTb5eW3r0e5xTFMsO/jNqHu6fOLy4tzqGn4iCS9t7aaNTMCBeLPLOOpKJ8TdEn9Azd8uPOwlXVg/TsOgpf9TTiMArG679uCPeWVu0si5viP6DaoA8XpRm4kxu1l/+lNmjU+i1AVbFB3S/4AAP3C+DewooHyXlek694U+UWfICJC7fgCrhWPEOJfrUgiu/AGNQBBlYAumWLLvpjkuN6jdeK+wAKRuu/bwsqwXPFIbOsoCa+4kXNeRiI0q8E4Tao2kmBX0rk4+IzPtAV0K8EYGBUFOfWPAFT4AH6bxqCI1a9XXuSPwGqx/Lz0BvWLT90B68UB+zludmvqvJt5dBZ1H7hGvh/VM0wH27UW7k7T870CkBmgHJrVW45mfKF7brPSmHgLqB+0SIn9cM5UcYAGgL6dwEYEDhRHvMIsxDkknUehg0sUNZ/1RayBPnnGSkmGTNwqd6ZBWXlDdy8CrNDwow3ZphUhHvqt1ZPQV9A6x079yBv8FJ9Brzp7fLtpn++/31398f++a0mL29LnpIPyY+WkolLN/GVszerndy4XRh92PPzo500pcmtYpPCxMWzKEV8y+my8ft2CstUbbHei8buQddtNagdb2+uL6pr8Q4YWfy4uXVUo4rLTagAXCYRZL+DN1mN6X3fZxbW6yuNCEEugXv8ba0vQ2Gbd6rAzAKgr55vc1nsRCVKkSvyi2mNXUCPcgNhTj/Oarh8YXz2o+BIhYmI6D345lWIulUv4JDz6jcxERJvAUsmCTqwjnjAyA+BtvJICmwNQZajnQBxIbkJGygAby+8I+K2s5ui/2doB2wjWgNfop0A0Ykqw79/gx6+JlTOmvPBefAg/Ubf/we4uyE63Pk4uK+Awf0vTIpjE0asA1AtVJsBY/YPQZo5BYopQxHsEynWfv57khlaF5iZgGzGQEWEkEQyDRNmkdsBqBrsVvh0j/YsiALiDhOPAq6AdJxkvwNaRhHfSQ2rgYzbPUKgYRSxIQRr0S0YPgI038Gh+waNxwPTxmSfkM6BkZDYqQAcI4jUH4besEnfXxa4DUR6DQvsFWfb+qGAkcKbMbFcsozBFIhN65cFypqWIruXeBCdKjeQA1UHuQWHEUXIC6iiwFT8Ww2UNa2fv4lC/je416iJHKg6VIzoSLnmBTJHHbCKnxnUACmBO842HqEMxzbOyFh4LFUArqFsUdqc6SBZlJvZLDFSAfqrITuDkzKrHm4uKKSORxY2D6rsPEgcN8E7BCmzysGX4oygDmZ4pvj5oMJPAsXRCrpHnDK7XQylvW8bxbmpscAmOTQ6NVfc+LZXuhYmwOJpBreQSJkF8K8uz8/OzspXNf8Oya/ZCYFLIk6ZPZp4boEPYGsoYuJpAwXQPAOxl18ibfoY4hcKJEjyaogexUD8AmEkXZpeg96YWsAEWjaDmKv/MAmBUahOJoZhUC6JZzJmobT4T+TtD9OdjmYO4pEB7YyuFCN5rCD8U1v7iEQyw4oU/P3Ct0j0POtVWgoxy31Hw+0sZPrEVtJfKXuARHcylc70ZfvRVPztkmMSia5bEv9nUjscDofD4XA4HA6Hw+FwOBwOh8PhcFjif8cCKOJRwH6+AAAAAElFTkSuQmCC');
  478. if (EDITION == 1) icon.setAttribute('href', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAAAA3NCSVQICAjb4U/gAAABNVBMVEX///9FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUXfxlXdxFXcw1Xbw1XZwVTawVTXv1TVvVTTvFTSu1TPuVPRuVLNt1PLtVPJtFPIs1PGsVLFsVLEr1LDrlLBrVK/q1K9qlG6p1G5plG3pVG1o1CyoVCxoFCvnlCtnVCsm1CqmU+nl0+llU+jlE+hkk+gkU6fkE6dj06bjU6Yi06Zi06XiU2Uh02RhU2Pg02NgUyLgEyJfkyIfUyFe0yDeUuBeEt9dEt8c0t4cEp2bkp0bEpyakpwaUpuZ0ltZklqZEloYklmYUhmYEhlYEhjXkhiXUhgXEheWkhbWEdaV0dYVUdWU0dVUkdSUEZPTkZQTkZNTEZOTEZMS0ZKSkZKSUZISEVFRUVGRkXhDf0HAAAAZ3RSTlMAESIzRFVmd4iZqrvM3e7/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9O0EYAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDMvMTcvMTcI/UgWAAAJuElEQVR4nO2de1/URhSG5RKuC7NgVXBRRClaa3XFirRY74ooxVK8K1Jgk+//EbrLwrLJe+aWzCT8wnn+JLPhzOTM7cybkzNnGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGMYFfQMjY2E4NjLQV7QlBdA3ODIedhgfGTxVjdA71FX5TiMM9RZtV14MY+3bDBVtWS70VWT1D8PKKegIg/Lqtxgo2j7P9Iyo6x+GIz1F2+iTHoX7d7pBmVtA+/wPfKBoK/2h6f9HlHYc6DOrfxiWdS4wGADaVIq21A/S9Q9SyhVRr3n9w7CMq2ILByinC9jUPwyLttY9/XYN0F+0vc6h1gCbi7WJau3ev8SlwaLtdc4o1HGvLg6p78HF0aLtdQ6EQPbmRYefoQXGi7bXNbgK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');
  479.  
  480. head.appendChild(icon);
  481. }
  482. if(e.keyCode == 38 && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  483. if(letChatToggle) {messageToggle = (messageToggle + 1) % 2;}
  484. }
  485. if(e.key == "\\" && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  486. doNewSend(["6", [4]]);
  487. }
  488. if(e.keyCode == 189 && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  489. doNewSend(["6", [28]]);
  490. /*setTimeout(() => {
  491. doNewSend(["6", [25]]);
  492. }, 100);*/
  493. }
  494. if(e.key == localStorage.i30cps_BOOST && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  495. slot(boostType);
  496. }
  497. if(e.key == localStorage.i30cps_MILL && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  498. slot(millType);
  499. }
  500. if(e.key == localStorage.i30cps_SPIKE && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  501. slot(spikeType)
  502. }
  503. if(e.key == localStorage.i30cps_TURRET && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  504. doNewSend(["5", [turretType, null]])
  505. }
  506. if(e.key == localStorage.i30cps_WALL && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  507. doNewSend(["5", [wallType, null]])
  508. }
  509. if(e.key == localStorage.i30cps_SPAWNPAD && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  510. doNewSend(["5", [20, null]])
  511. }
  512. if(e.keyCode == 80 && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  513. let sendPrompt = prompt("Send (Type Help for Help):").split(", ");
  514.  
  515. if (sendPrompt.length == 2) {
  516. eval("doNewSend(["+sendPrompt[0]+", ["+sendPrompt[1]+"]])");
  517. } else if (sendPrompt.length == 3) {
  518. eval("doNewSend(["+sendPrompt[0]+", ["+sendPrompt[1]+", "+sendPrompt[2]+"]])");
  519. } else if (sendPrompt.length == 1 && sendPrompt[0].toLowerCase() == "help") {
  520. alert("6, 4 = Katana, 6, 25 = Spinning Spikes, 6, 28 = Power Mill, 6, 15 = Musket, 33, angle = Move, 2, angle = Aim, 5, id = Slot, 'c', 1, angle = start hit, c, 0, angle = stop hit")
  521. } else {
  522. alert("Ws Sender Error. Use a, b, c option format. Do not use brackets ( (), [], {} ).")
  523. }
  524. }
  525. if(e.keyCode == 76 && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  526. let evals = prompt("Console Command: Available Commands: katana(), place(spikeType:millType:boostType:turretType, optionalangle):")
  527. eval(evals);
  528. }
  529. if(e.keyCode == 219 && !nocommand.includes(document.activeElement.id.toLowerCase())) {
  530. doAdvAc2 = !doAdvAc2;
  531. }
  532. })
  533.  
  534. document.addEventListener('keyup', (e) => {
  535. if (['KeyW', 'KeyA', 'KeyS', 'KeyD'].includes(e.code)) {
  536. if (e.code == 'KeyW') holdingKeys.w = false;
  537. else if (e.code == 'KeyA') holdingKeys.a = false;
  538. else if (e.code == 'KeyS') holdingKeys.s = false;
  539. else if (e.code == 'KeyD') holdingKeys.d = false;
  540. }
  541. if (document.querySelector("#allianceMenu").style.display=='block') doNewSend(['33', []])
  542. })
  543.  
  544. function isElementVisible(e) {
  545. return (e.offsetParent !== null);
  546. }
  547.  
  548.  
  549. function toRad(angle) {
  550. return angle * 0.01745329251;
  551. }
  552.  
  553. function dist(a, b){
  554. return Math.sqrt( Math.pow((b.y-a[2]), 2) + Math.pow((b.x-a[1]), 2) );
  555. }
  556.  
  557. var updateMenuKey = false;
  558.  
  559. document.title = "Utility Mod by i30cps"
  560.  
  561. function update() {
  562. // find the slots for everything
  563. for (let i=0;i<9;i++){
  564. if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))){
  565. primary = i;
  566. }
  567. }
  568.  
  569. for (let i=9;i<16;i++){
  570. if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))){
  571. secondary = i;
  572. }
  573. }
  574.  
  575. for (let i=16;i<19;i++){
  576. if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))){
  577. foodType = i - 16;
  578. }
  579. }
  580.  
  581. for (let i=19;i<22;i++){
  582. if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))){
  583. wallType = i - 16;
  584. }
  585. }
  586.  
  587. for (let i=22;i<26;i++){
  588. if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))){
  589. spikeType = i - 16;
  590. }
  591. }
  592.  
  593. for (let i=26;i<29;i++){
  594. if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))){
  595. millType = i - 16;
  596. }
  597. }
  598.  
  599. for (let i=29;i<31;i++){
  600. if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))){
  601. mineType = i - 16;
  602. }
  603. }
  604.  
  605. for (let i=31;i<33;i++){
  606. if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))){
  607. boostType = i - 16;
  608. }
  609. }
  610.  
  611. for (let i=33;i<39;i++){
  612. if (isElementVisible(document.getElementById("actionBarItem" + i.toString())) && i != 36){
  613. turretType = i - 16;
  614. }
  615. }
  616.  
  617. spawnpadType = 20;
  618. }
  619.  
  620. /*try {
  621. document.getElementById("moomooio_728x90_home").style.display = "none";
  622. $("moomooio728x90_home").parent().css({display: "none"});
  623. } catch (e) {
  624. console.log("There was an error removing the ads.");
  625. }*/
  626.  
  627.  
  628. var menuChange = document.createElement("div");
  629. menuChange.className = "menuCard";
  630. menuChange.id = "mainSettings";
  631. menuChange.innerHTML = `
  632. <div id="simpleModal" class="modal">
  633. <div class="modal-content">
  634. <div class="modal-header">
  635. <span class="closeBtn">&times;</span>
  636. <h2 style="font-size: 17px;">Settings</h2>
  637. </div>
  638. <div class="modal-body" style="font-size: 17px;">
  639. <div class="modal-content" style="font-size:14px">
  640. <p>This mod does not give any unfair advantages. ESC = Open Menu, P = WS Sender L = Console Command, Up Arrow=Autochat, Dash (-) = Power Mill, Backslash (\\) = Katana. To spawn a bot: Press L and type bot(). To find bot's owner: say owner.</p>
  641. </div>
  642. <div class="flexControl">
  643. <a id="menuchanger">Menu Key: Escape - Click this text and press a key to change it!</a>
  644. <h3 style="font-size: 17px;"> Settings </h3>
  645. <label class="container">Show biomes on the map?
  646. <input type="checkbox" id="myCheck" checked="true">
  647. <span class="checkmark"></span>
  648. </label>
  649. <label class="container">Bigger shop?
  650. <input type="checkbox" id="bigShop">
  651. <span class="checkmark"></span>
  652. </label>
  653. <label class="container">Aim Cursor?
  654. <input type="checkbox" id="myCheck3" checked="true">
  655. <span class="checkmark"></span>
  656. </label>
  657. <label class="container">Advertisement bots join your clan?
  658. <input type="checkbox" id="customBotClan">
  659. <span class="checkmark"></span>
  660. </label>
  661. <label class="container">Advertisement bots let everyone join their clan?
  662. <input type="checkbox" id="botClanOpen" checked="true">
  663. <span class="checkmark"></span>
  664. </label>
  665. <label for="wallchanger" class="container">Wall Key:</label><input type="text" id="wallchanger" value="t"><label for="spikechanger" class="container">Spike Key:</label>
  666. <input type="text" id="spikechanger" value="v"><label for="millchanger" class="container">Windmill Key:
  667. </label><input type="text" id="millchanger" value="z"><label for="boostchanger" class="container">Boost/Trap Key:</label>
  668. <input type="text" id="boostchanger" value="f"><label for="turretchanger" class="container">Turret/Teleporter/Other Key:</label>
  669. <input type="text" id="turretchanger" value="g"><label for="spawnpadchanger" class="container">Spawn Pad Key:</label><input type="text" id="spawnpadchanger" value="b">
  670. <h3 style="font-size: 17px;"> Autochat settings </h3>
  671. <label class="container">AutoChat Animation?
  672. <input type="checkbox" checked="true" id="myCheck2">
  673. <span class="checkmark"></span>
  674. </label>
  675. <br>AutoChat:<input type="text" value="bit.ly/i30cpsmod not unfair" id="ach1" width="100" height="50"/><br>
  676. </div>
  677. </div>
  678. </div>
  679. </div>`
  680. document.body.appendChild(menuChange)
  681.  
  682. setTimeout(() => { // buffer for modal to load
  683. document.getElementById("spikechanger").value = localStorage.i30cps_SPIKE;
  684. document.getElementById("millchanger").value = localStorage.i30cps_MILL;
  685. document.getElementById("boostchanger").value = localStorage.i30cps_BOOST;
  686. document.getElementById("turretchanger").value = localStorage.i30cps_TURRET;
  687. document.getElementById("wallchanger").value = localStorage.i30cps_WALL;
  688. document.getElementById("spawnpadchanger").value = localStorage.i30cps_SPAWNPAD;
  689. setTimeout(() => { // buffer for modal to update
  690. setInterval(() => {
  691. localStorage.i30cps_SPIKE = document.getElementById("spikechanger").value.toLowerCase();
  692. localStorage.i30cps_MILL = document.getElementById("millchanger").value.toLowerCase();
  693. localStorage.i30cps_BOOST = document.getElementById("boostchanger").value.toLowerCase();
  694. localStorage.i30cps_TURRET = document.getElementById("turretchanger").value.toLowerCase();
  695. localStorage.i30cps_WALL = document.getElementById("wallchanger").value.toLowerCase();
  696. localStorage.i30cps_SPAWNPAD = document.getElementById("spawnpadchanger").value.toLowerCase();
  697. }, 500);
  698. }, 1000);
  699. }, 500);
  700.  
  701. var styleItem = document.createElement("style");
  702. styleItem.type = "text/css";
  703. styleItem.appendChild(document.createTextNode(`
  704. .keyPressLow {
  705. margin-left: 8px;
  706. font-size: 16px;
  707. margin-right: 8px;
  708. height: 25px;
  709. width: 50px;
  710. background-color: #fcfcfc;
  711. border-radius: 3.5px;
  712. border: none;
  713. text-align: center;
  714. color: #4A4A4A;
  715. border: 0.5px solid #f2f2f2;
  716. }
  717. .menuPrompt {
  718. font-size: 17px;
  719. font-family: 'Hammersmith One';
  720. color: #4A4A4A;
  721. flex: 0.2;
  722. text-align: center;
  723. margin-top: 10px;
  724. display: inline-block;
  725. }
  726.  
  727. .modal {
  728. display: none;
  729. position: fixed;
  730. z-index: 1;
  731. left: 0;
  732. top: 0;
  733. overflow: auto;
  734. height: 100%;
  735. width: 100%;
  736. }
  737.  
  738. .modal-content {
  739. margin: 10% auto;
  740. width: 40%;
  741. box-shadow: 0 5px 8px 0 rgba(0, 0, 0, 0.2), 0 7px 20px 0 rgba(0, 0, 0, 0.17);
  742. font-size: 14px;
  743. line-height: 1.6;
  744. }
  745.  
  746. .modal-header h2,
  747. .modal-footer h3 {
  748. margin: 0;
  749. }
  750.  
  751. .modal-header {
  752. background: #4287f5;
  753. padding: 15px;
  754. color: #fff;
  755. border-top-left-radius: 5px;
  756. border-top-right-radius: 5px;
  757. }
  758.  
  759. .modal-body {
  760. padding: 10px 20px;
  761. background: #fff;
  762. }
  763.  
  764. .modal-footer {
  765. background: #cf2727;
  766. padding: 10px;
  767. color: #fff;
  768. text-align: center;
  769. border-bottom-left-radius: 5px;
  770. border-bottom-right-radius: 5px;
  771. }
  772.  
  773. .closeBtn {
  774. color: #ccc;
  775. float: right;
  776. font-size: 30px;
  777. color: #fff;
  778. }
  779.  
  780. .closeBtn:hover,
  781. .closeBtn:focus {
  782. color: #000;
  783. text-decoration: none;
  784. cursor: pointer;
  785. }
  786.  
  787. /* Customize the label (the container) */
  788. .container {
  789. display: block;
  790. position: relative;
  791. padding-left: 35px;
  792. margin-bottom: 12px;
  793. cursor: pointer;
  794. font-size: 16px;
  795. -webkit-user-select: none;
  796. -moz-user-select: none;
  797. -ms-user-select: none;
  798. user-select: none;
  799. }
  800.  
  801. /* Hide the browser's default checkbox */
  802. .container input {
  803. position: absolute;
  804. opacity: 0;
  805. cursor: pointer;
  806. height: 0;
  807. width: 0;
  808. }
  809.  
  810. /* Create a custom checkbox */
  811. .checkmark {
  812. position: absolute;
  813. top: 0;
  814. left: 0;
  815. height: 25px;
  816. width: 25px;
  817. background-color: #eee;
  818. }
  819.  
  820. /* On mouse-over, add a grey background color */
  821. .container:hover input ~ .checkmark {
  822. background-color: #ccc;
  823. }
  824.  
  825. /* When the checkbox is checked, add a red background */
  826. .container input:checked ~ .checkmark {
  827. background-color: #cf2727;
  828. }
  829.  
  830. /* Create the checkmark/indicator (hidden when not checked) */
  831. .checkmark:after {
  832. content: "";
  833. position: absolute;
  834. display: none;
  835. }
  836.  
  837. /* Show the checkmark when checked */
  838. .container input:checked ~ .checkmark:after {
  839. display: block;
  840. }
  841.  
  842. /* Style the checkmark/indicator */
  843. .container .checkmark:after {
  844. left: 9px;
  845. top: 5px;
  846. width: 5px;
  847. height: 10px;
  848. border: solid white;
  849. border-width: 0 3px 3px 0;
  850. -webkit-transform: rotate(45deg);
  851. -ms-transform: rotate(45deg);
  852. transform: rotate(45deg);
  853. }
  854.  
  855. `))
  856. document.head.appendChild(styleItem);
  857.  
  858.  
  859. $("#adCard").css({display: "none"});
  860.  
  861.  
  862. window.addEventListener('keydown', function(e) {
  863. if (e.code == localStorage.i30cps_MENU){
  864. if (modal.style.display != "block") {
  865. modal.style.display = "block";
  866. } else {
  867. modal.style.display = "none";
  868. }
  869. }
  870. })
  871.  
  872. // Get modal element
  873. var modal = document.getElementById("simpleModal");
  874. // Get close button
  875. var closeBtn = document.getElementsByClassName('closeBtn')[0];
  876.  
  877. // Events
  878. closeBtn.addEventListener('click', closeModal);
  879. window.addEventListener('click', outsideClick);
  880.  
  881. // Close
  882. function closeModal() {
  883. modal.style.display = 'none';
  884. }
  885.  
  886. // Close If Outside Click
  887. function outsideClick(e) {
  888. if (e.target == modal) {
  889. modal.style.display = 'none';
  890. }
  891. }
  892.  
  893. // Menu Key Changer
  894. document.querySelector("#menuchanger").onclick = (e) => {updateMenuKey = true;}
  895.  
  896. document.querySelector("#myCheck").addEventListener('change', function() {
  897. if (this.checked) {
  898. $("#mapDisplay").css({background: `url('https://i.imgur.com/fgFsQJp.png')`});
  899. } else {
  900. $("#mapDisplay").css({background: `rgba(0, 0, 0, 0.25)`})
  901. }
  902. })
  903.  
  904. document.querySelector("#myCheck2").addEventListener('change', function() {
  905. if (this.checked) {
  906. animateyorn = true;
  907. } else {
  908. animateyorn = false;
  909. }
  910. })
  911.  
  912. document.querySelector("#myCheck3").addEventListener('change', function() {
  913. if (this.checked) {
  914. $("#gameCanvas").css('cursor', 'url(http://cur.cursors-4u.net/user/use-1/use153.cur), default');
  915. } else {
  916. document.getElementById("gameCanvas").style.cursor = 'default';
  917. }
  918. })
  919.  
  920. document.querySelector("#bigShop").addEventListener('change', function() {
  921. if (this.checked) {
  922. document.getElementById('storeHolder').style = 'height: 1500px; width: 450px';
  923. } else {
  924. document.getElementById('storeHolder').style = '';
  925. }
  926. })
  927.  
  928. var customBotClan = false;
  929. document.querySelector('#customBotClan').addEventListener('change', function() {
  930. if (this.checked) {
  931. customBotClan = true;
  932. } else {
  933. customBotClan = false;
  934. }
  935. })
  936.  
  937. var openBotClan = true;
  938. document.querySelector('#botClanOpen').addEventListener('change', function() {
  939. if (this.checked) openBotClan = true;
  940. else openBotClan = false;
  941. })
  942.  
  943. function animate(space, animateyn) {
  944. let result = '';
  945. if (space) {
  946. result = document.getElementById("ach1").value;
  947. } else {
  948. result = "i30cps"
  949. }
  950. if (animateyn) {
  951. let place = Math.floor(Math.random()*result.length);
  952. result = result.substring(0, place) + "_" + result.substring(place+1, result.length);
  953. }
  954. return result;
  955. }
  956.  
  957. unsafeWindow.admob = {
  958. requestInterstitialAd: ()=>{},
  959. showInterstitialAd: ()=>{}
  960. }
  961.  
  962. var cps = 0;
  963. var CpsMenu = document.createElement("div");
  964. CpsMenu.style.padding = "5px";
  965. CpsMenu.id = "CpsDiv";
  966. CpsMenu.style.font = "40px Arial";
  967. CpsMenu.style.display = "block";
  968. CpsMenu.style.position = "fixed";
  969. CpsMenu.style.top = "3%";
  970. CpsMenu.style.left = "0%";
  971. CpsMenu.textContent = "Cps:";
  972. document.body.appendChild(CpsMenu);
  973. setInterval(()=>{
  974. CpsMenu.textContent = "Cps:"+cps;
  975. }, 5);
  976.  
  977.  
  978. document.donotrespondtothis = ['33', 'h', '5', '7', 'a', 'ch', 'mm'];
  979.  
  980. document.dnpush = (e) => {
  981. document.donotrespondtothis.push(e);
  982. }
  983.  
  984. var tabs = [];
  985. var myID;
  986. document.botDebug = false;
  987. var botClan;
  988. var usedBot = false;
  989.  
  990. const captcha = '6LevKusUAAAAAAFknhlV8sPtXAk5Z5dGP5T2FYIZ';
  991. const generateToken = () => unsafeWindow.grecaptcha.execute(captcha, { action : 'homepage' });
  992. let botcount = (window.location.hostname == "sandbox.moomoo.io") ? 1 : 2;
  993. const wait = async ms => new Promise(done => setTimeout(done, ms));
  994. const connectBot = captcha => {
  995. let advertpos = 0;
  996. let nearestenemy;
  997. let enemyIsNear;
  998. let enemiesnear = [];
  999. let thingToSay = '';
  1000. let token = encodeURIComponent(captcha);
  1001. let advertBot = new WebSocket(document.ws.url.split("&")[0] + "&token=" + token);
  1002. advertBot.binaryType = 'arraybuffer';
  1003. advertBot.message = (data) => {
  1004. advertBot.send(msgpack.encode(data));
  1005. };
  1006. if (!usedBot) {
  1007. advertBot.isFirstBot = true;
  1008. usedBot = true;
  1009. } else {
  1010. advertBot.isFirstBot = false;
  1011. }
  1012.  
  1013. let randAngle=0;
  1014. let nearAngle = 0;
  1015. advertBot.onopen = async () => {
  1016. await wait(100);
  1017. advertBot.message(['sp', [{name: 'i30cps bot', moofoll: '1', skin: Math.floor(Math.random()*4)}]]);
  1018. setInterval(() => {
  1019. if (sayDiff) {
  1020. advertBot.message(['ch', [thingToSay]])
  1021. }
  1022. advertpos += 3;
  1023. if (advertpos > advAc2.length - 30) {
  1024. advertpos = 0;
  1025. }
  1026. advertBot.message(['ch', [advAc2.substring(advertpos, advertpos + 30)]]);
  1027. }, 500)
  1028. setInterval(()=>{
  1029. advertBot.message([2, [90**100]])
  1030. if (!enemyIsNear) {
  1031. advertBot.message(['33', [nearAngle]])
  1032. } else {
  1033. advertBot.message(['33', []])
  1034. }
  1035. }, 100);
  1036. setInterval(() => {
  1037. enemyIsNear = false;
  1038. }, 15000)
  1039. setInterval(() => {
  1040. randAngle = Math.random() * 6.283185307179586;
  1041. advertBot.message([5, [10, null]]);
  1042. advertBot.message(['c', [1, 0]]);
  1043. advertBot.message(['c', [0, 0]]);
  1044. if (document.botDebug) console.log(advertBot.clan + ' :: ' + advertBot.x + ', ' + advertBot.y);
  1045. setTimeout(() => {
  1046. advertBot.message([5, [11, null]]);
  1047. advertBot.message(['c', [1, 0]]);
  1048. advertBot.message(['c', [0, 0]]);
  1049. setTimeout(() => {
  1050. advertBot.message([5, [12, null]]);
  1051. advertBot.message(['c', [1, 0]]);
  1052. advertBot.message(['c', [0, 0]]);
  1053. setTimeout(() => {
  1054. advertBot.message(['c', [1, 0]]);
  1055. advertBot.message(['c', [0, 0]]);
  1056. }, 100);
  1057. }, 100);
  1058. }, 100);
  1059. }, 5000);
  1060. };
  1061. let sayDiff = false;
  1062. let nearbyPlayers = [];
  1063. let nearbyEnemies = [];
  1064. advertBot.chat = (message, duration) => {
  1065. thingToSay = message;
  1066. sayDiff = true;
  1067. setTimeout(() => {
  1068. sayDiff = false;
  1069. }, duration)
  1070. }
  1071. advertBot.reClan = () => {
  1072. if (advertBot.clan == null) {
  1073. setTimeout(() => {
  1074. if(advertBot.clan == null) {
  1075. doNewSend(['8', [decorate(String.fromCharCode(Math.floor(Math.random()*26)+65)+String.fromCharCode(Math.floor(Math.random()*26)+65)+String.fromCharCode(Math.floor(Math.random()*26)+65)+String.fromCharCode(Math.floor(Math.random()*26)+65)+String.fromCharCode(Math.floor(Math.random()*26)+65)+String.fromCharCode(Math.floor(Math.random()*26)+65)+String.fromCharCode(Math.floor(Math.random()*26)+65))]])
  1076. setTimeout(() => {
  1077. if (advertBot.clan == null) advertBot.reClan()
  1078. else {advertBot.message(['9', [null]])}
  1079. }, 500);
  1080. }
  1081. }, 5000);
  1082. }
  1083. }
  1084. advertBot.clanUpdate = (joinSelfClan) => {
  1085. if (joinSelfClan && myPlayer.clan && botClan && (myPlayer.clan!=botClan)) {
  1086. advertBot.message(['9', [null]])
  1087. botClan = false;
  1088. }
  1089. if (advertBot.clan == null) {
  1090. if (myPlayer.clan && joinSelfClan) {
  1091. advertBot.message(['10', [myPlayer.clan]]);
  1092. botClan = false;
  1093. } else if (advertBot.isFirstBot) {
  1094. botClan = decorate('i30cps');
  1095. advertBot.message(['8', [botClan]]);
  1096. } else {
  1097. advertBot.message(['10', [botClan]]);
  1098. }
  1099. } else if (!botClan) {
  1100. botClan = advertBot.clan;
  1101. }
  1102. }
  1103. advertBot.onmessage = message => {
  1104. let temp = msgpack.decode(new Uint8Array(message.data));
  1105. let data;
  1106. if(temp.length > 1) {
  1107. data = [temp[0], ...temp[1]];
  1108. } else {
  1109. data = temp;
  1110. }
  1111. let item = data[0];
  1112. if(!data) {return};
  1113. //if(!document.donotrespondtothis.includes(item)){console.log(data)}
  1114. if (item == 'an') {
  1115. console.log(data);
  1116. console.log(tabs);
  1117. if (tabs.includes(data[1]) || openBotClan) {
  1118. advertBot.message(['11', [data[1], 1]])
  1119. } else {
  1120. advertBot.message(['11', [data[1], 0]])
  1121. }
  1122. }
  1123. if (item == "h") {
  1124. advertBot.message(['c', [1, 0]])
  1125. advertBot.message(['c', [0, 0]])
  1126. setTimeout(()=>{
  1127. advertBot.message(["5", [0, null]]);
  1128. advertBot.message(["c", [1, 0]]);
  1129. advertBot.message(["c", [0, 0]]);
  1130. advertBot.message(["5", [0, null]]);
  1131. advertBot.message(["c", [1, 0]]);
  1132. advertBot.message(["c", [0, 0]]);
  1133. }, 100);
  1134. } else if (item == '11') {
  1135. advertBot.message(['sp', [{ name: 'i30cps bot', moofoll: '1', skin: Math.floor(Math.random() * 4)}]]);
  1136. } else if (item === '1') {
  1137. enemyIsNear = false;
  1138. advertBot.id = data[1];
  1139. if (!tabs.includes(advertBot.id)) {
  1140. tabs.push(advertBot.id);
  1141. }
  1142. advertBot.clanUpdate(customBotClan);
  1143. } else if (item === '33') {
  1144. nearbyEnemies = [];
  1145. for(let i = 0; i < data[1].length / 13; i++) {
  1146. let playerInfo = data[1].slice(13*i, 13*i+13);
  1147. if(playerInfo[0] == advertBot.id) {
  1148. advertBot.id = playerInfo[0];
  1149. advertBot.x = playerInfo[1];
  1150. advertBot.y = playerInfo[2];
  1151. advertBot.dir = playerInfo[3];
  1152. advertBot.object = playerInfo[4];
  1153. advertBot.weapon = playerInfo[5];
  1154. advertBot.clan = playerInfo[7];
  1155. advertBot.isLeader = playerInfo[8];
  1156. advertBot.hat = playerInfo[9];
  1157. advertBot.accessory = playerInfo[10];
  1158. advertBot.isSkull = playerInfo[11];
  1159. } else {
  1160. nearbyPlayers.push(data[1].slice(13*i, 13*i+13))
  1161. if((playerInfo[7] != advertBot.clan || playerInfo[7] === null) && !(tabs.includes(playerInfo[0]))) {
  1162. nearbyEnemies.push(playerInfo);
  1163. }
  1164. };
  1165. };
  1166. advertBot.clanUpdate(customBotClan);
  1167. } else if (item == 'ch') {
  1168. let isOwner = data[1] == myID;
  1169. if ((!(data[1] == advertBot.id)) && (data[2].includes(document.querySelector("#nameInput").value))) {console.log(data[2]);}
  1170. if (isOwner) {
  1171. if (data[2].substring(0, 2) == 'i:') {
  1172. let datas = data[2].substring(0, 2).split(' ');
  1173. advertBot.message([datas[0]==undefined?null:datas[0], [datas[1]==undefined?null:datas[1], datas[2]==undefined?null:datas[2]]])
  1174. } else if (data[2].substring(0, 2) == 'i!') {
  1175. eval(data[2].substring(2, data[2].length));
  1176. }
  1177. }
  1178. if (data[2].substring(0, 2) == 'i.') { // commands
  1179. if (isOwner) { // admin commands
  1180. if ((data[2] == 'i.dc') || (data[2] == 'i.disconnect')) for (let i = 0; i < 20; i++) advertBot.message(['sp', {name: "i30cps bot", skin: 1, moofoll: 1}]); // moomoo kicks after this
  1181. else if (data[2].substring(0, 4).toLowerCase() == 'i.ch') {
  1182. thingToSay = data[2].substring(5, 30);
  1183. sayDiff = true;
  1184. }
  1185. }
  1186. }
  1187. if (data[2].includes('owner')) {
  1188. advertBot.chat("[" + myPlayer.clan + "] " + document.querySelector("#nameInput").value + " {" + myPlayer.id + "}", 1000);
  1189. }
  1190. }
  1191.  
  1192. if(nearbyEnemies) {
  1193. nearestenemy = nearbyEnemies.sort((a,b) => dist(a, advertBot) - dist(b, advertBot))[0];
  1194. }
  1195.  
  1196. if(nearestenemy) {
  1197. nearAngle = Math.atan2(nearestenemy[2]-advertBot.y, nearestenemy[1]-advertBot.x);
  1198. let nearDist = Math.sqrt(Math.pow((advertBot.y-nearestenemy[2]), 2) + Math.pow((advertBot.x-nearestenemy[1]), 2));
  1199. if(nearDist < 250) {
  1200. enemyIsNear = false;
  1201. nearAngle += 3.141592653;
  1202. } else if (nearDist < 400) {
  1203. enemyIsNear = true;
  1204. } else {
  1205. enemyIsNear = false;
  1206. }
  1207. } else {nearAngle = randAngle}
  1208. };
  1209. };
  1210.  
  1211. function bot(notifi=true) {
  1212. const promises = [generateToken()];
  1213. Promise.all(promises).then(t => {
  1214. console.log('generated ', t);
  1215. if (notifi) alert('generated an i30cps bot that uses your advAc2: ' + t)
  1216. connectBot(t[0]);
  1217. });
  1218. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址