agario-feeder-bot

to be writen

  1. // ==UserScript==
  2. // @name agario-feeder-bot
  3. // @namespace http://github.com/davidmann4/
  4. // @version 0.02
  5. // @description to be writen
  6. // @author davidmann4
  7. // @license MIT
  8. // @match http://agar.io/*
  9. // @require https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.5/socket.io.min.js
  10. // @grant none
  11. // @run-at document-start
  12. // ==/UserScript==
  13.  
  14. setTimeout(function() {
  15. var real_minx = -7071;
  16. var real_miny = -7071;
  17. var real_maxx = 7071;
  18. var real_maxy = 7071;
  19. var lastsent = {
  20. minx: 0,
  21. miny: 0,
  22. maxx: 0,
  23. maxy: 0
  24. };
  25.  
  26. function valcompare(Y, Z) {
  27. return 0.01 > Y - Z && -0.01 < Y - Z
  28. }
  29. window.agar.hooks.dimensionsUpdated = function(server_minx, server_miny, server_maxx, server_maxy) {
  30. if (valcompare(server_maxx - server_minx, server_maxy - server_miny)) {
  31. real_minx = server_minx;
  32. real_miny = server_miny;
  33. real_maxx = server_maxx;
  34. real_maxy = server_maxy
  35. } else {
  36. if (valcompare(server_minx, lastsent.minx)) {
  37. if (0.01 < server_maxx - lastsent.maxx || -0.01 > server_maxx - lastsent.maxx) {
  38. real_minx = server_minx;
  39. real_maxx = server_minx + 14142.135623730952
  40. }
  41. }
  42. if (0.01 < server_minx - lastsent.minx || -0.01 > server_minx - lastsent.minx) {
  43. if (valcompare(server_maxx, lastsent.maxx)) {
  44. real_maxx = server_maxx;
  45. real_minx = server_maxx - 14142.135623730952
  46. }
  47. }
  48. if (0.01 < server_miny - lastsent.miny || -0.01 > server_miny - lastsent.miny) {
  49. if (valcompare(server_maxy, lastsent.maxy)) {
  50. real_maxy = server_maxy;
  51. real_miny = server_maxy - 14142.135623730952
  52. }
  53. }
  54. if (valcompare(server_miny, lastsent.miny)) {
  55. if (0.01 < server_maxy - lastsent.maxy || -0.01 > server_maxy - lastsent.maxy) {
  56. real_miny = server_miny;
  57. real_maxy = server_miny + 14142.135623730952
  58. }
  59. }
  60. if (server_minx < real_minx) {
  61. real_minx = server_minx;
  62. real_maxx = server_minx + 14142.135623730952
  63. }
  64. if (server_maxx > real_maxx) {
  65. real_maxx = server_maxx;
  66. real_minx = server_maxx - 14142.135623730952
  67. }
  68. if (server_miny < real_miny) {
  69. real_miny = server_miny;
  70. real_maxy = server_miny + 14142.135623730952
  71. }
  72. if (server_maxy > real_maxy) {
  73. real_maxy = server_maxy;
  74. real_miny = server_maxy - 14142.135623730952
  75. }
  76. lastsent.minx = server_minx;
  77. lastsent.miny = server_miny;
  78. lastsent.maxy = server_maxy;
  79. lastsent.maxx = server_maxx
  80. }
  81. offset_x = real_minx || -7071;
  82. offset_y = real_miny || -7071
  83. };
  84. var socket = io.connect('ws://104.236.100.252:8081');
  85. var canMove = true;
  86. var movetoMouse = true;
  87. var moveEvent = new Array(2);
  88. var canvas = document.getElementById("canvas");
  89. last_transmited_game_server = null;
  90. socket.on('force-login', function(data) {
  91. socket.emit("login", {
  92. "uuid": client_uuid,
  93. "type": "client"
  94. });
  95. transmit_game_server()
  96. });
  97. $( "#canvas" ).after( "<div style='background-color: #000000; -moz-opacity: 0.4; -khtml-opacity: 0.4; opacity: 0.4; filter: alpha(opacity=40); zoom: 1; width: 205px; top: 10px; left: 10px; display: block; position: absolute; text-align: center; font-size: 15px; color: #ffffff; padding: 5px; font-family: Ubuntu;'> <div style='color:#ffffff; display: inline; -moz-opacity:1; -khtml-opacity: 1; opacity:1; filter:alpha(opacity=100); padding: 10px;'><a>Bots</a></div> <div style='color:#ffffff; display: inline; -moz-opacity:1; -khtml-opacity: 1; opacity:1; filter:alpha(opacity=100); padding: 10px;'><br>Minions: <a id='minionCount' >Offline</a> </div> <div style='color:#ffffff; display: inline; -moz-opacity:1; -khtml-opacity: 1; opacity:1; filter:alpha(opacity=100); padding: 10px;'><br><a>A</a> - Move To Mouse: <a id='ismoveToMouse' >On</a> </div> <div style='color:#ffffff; display: inline; -moz-opacity:1; -khtml-opacity: 1; opacity:1; filter:alpha(opacity=100); padding: 10px;'><br><a>D</a> - Stop Movement: <a id='isStopMove' >Off</a> </div> <a><br>E</a> - Split bots <a><br>R</a> - Eject mass" );
  98. socket.on('spawn-count', function(data) {
  99. document.getElementById('minionCount').innerHTML = data
  100. });
  101. var client_uuid = localStorage.getItem('client_uuid');
  102. if (client_uuid == null) {
  103. console.log("generating a uuid for this user");
  104. client_uuid = ""; var ranStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  105. for (var ii = 0; ii < 15; ii++) client_uuid += ranStr.charAt(Math.floor(Math.random() * ranStr.length));
  106. localStorage.setItem('client_uuid', client_uuid)
  107. }
  108. socket.emit("login", client_uuid);
  109. $("#instructions").replaceWith('<br><div class="input-group"><span class="input-group-addon" id="basic-addon1">UUID</span><input type="text" value="' + client_uuid + '" readonly class="form-control"</div>');
  110.  
  111. function isMe(cell) {
  112. for (var i = 0; i < window.agar.myCells.length; i++) {
  113. if (window.agar.myCells[i] == cell.id) {
  114. return true
  115. }
  116. }
  117. return false
  118. }
  119.  
  120. window.agar.hooks.drawCellMass = function(cell, old_draw) {
  121. if(cell.size > 20) return cell;
  122. }
  123. window.agar.hooks.cellMassTextScale = function(cell, old_scale) {
  124. }
  125. function getCell() {
  126. var me = [];
  127. for (var key in window.agar.allCells) {
  128. var cell = window.agar.allCells[key];
  129. if (isMe(cell)) {
  130. me.push(cell)
  131. }
  132. }
  133. return me[0]
  134. }
  135. var skin_var = 0;
  136.  
  137. function emitPosition() {
  138. for (i = 0; i < agar.myCells.length; i++) {}
  139. x = (mouseX - window.innerWidth / 2) / window.agar.drawScale + window.agar.rawViewport.x;
  140. y = (mouseY - window.innerHeight / 2) / window.agar.drawScale + window.agar.rawViewport.y;
  141. if (!movetoMouse) {
  142. x = getCell().x;
  143. y = getCell().y
  144. }
  145. socket.emit("pos", {
  146. "x": x - (real_minx + 7071),
  147. "y": y - (real_miny + 7071),
  148. "dimensions": [-7071, -7071, 7071, 7071]
  149. })
  150. }
  151.  
  152. function emitSplit() {
  153. socket.emit("cmd", {
  154. "name": "split"
  155. })
  156. }
  157.  
  158. function emitMassEject() {
  159. socket.emit("cmd", {
  160. "name": "eject"
  161. })
  162. }
  163.  
  164. function toggleMovement() {
  165. canMove = !canMove;
  166. switch (canMove) {
  167. case true:
  168. canvas.onmousemove = moveEvent[0];
  169. moveEvent[0] = null;
  170. canvas.onmousedown = moveEvent[1];
  171. moveEvent[1] = null;
  172. break;
  173. case false:
  174. canvas.onmousemove({
  175. clientX: innerWidth / 2,
  176. clientY: innerHeight / 2
  177. });
  178. moveEvent[0] = canvas.onmousemove;
  179. canvas.onmousemove = null;
  180. moveEvent[1] = canvas.onmousedown;
  181. canvas.onmousedown = null;
  182. break
  183. }
  184. }
  185. interval_id = setInterval(function() {
  186. emitPosition()
  187. }, 100);
  188. interval_id2 = setInterval(function() {
  189. transmit_game_server_if_changed()
  190. }, 5000);
  191. document.addEventListener('keydown', function(e) {
  192. var key = e.keyCode || e.which;
  193. switch (key) {
  194. case 65:
  195. movetoMouse = !movetoMouse;
  196. if(movetoMouse) { document.getElementById('ismoveToMouse').innerHTML = "On"; } else { document.getElementById('ismoveToMouse').innerHTML = "Off"; }
  197. break;
  198. case 68:
  199. toggleMovement();
  200. if(!canMove) { document.getElementById('isStopMove').innerHTML = "On"; } else { document.getElementById('isStopMove').innerHTML = "Off"; }
  201. break;
  202. case 69:
  203. emitSplit();
  204. break;
  205. case 82:
  206. emitMassEject();
  207. break
  208. }
  209. });
  210.  
  211. function transmit_game_server_if_changed() {
  212. if (last_transmited_game_server != window.agar.ws) {
  213. last_transmited_game_server = window.agar.ws;
  214. socket.emit("cmd", {
  215. "name": "reconnect_server",
  216. "ip": last_transmited_game_server
  217. })
  218. }
  219. }
  220.  
  221. function transmit_game_server() {
  222. last_transmited_game_server = window.agar.ws;
  223. socket.emit("cmd", {
  224. "name": "connect_server",
  225. "ip": last_transmited_game_server
  226. })
  227. }
  228. var mouseX = 0;
  229. var mouseY = 0;
  230. $("body").mousemove(function(event) {
  231. mouseX = event.clientX;
  232. mouseY = event.clientY
  233. });
  234. window.agar.minScale = -30
  235. }, 5000);
  236.  
  237. var allRules = [
  238. { hostname: ["agar.io"],
  239. scriptUriRe: /^http:\/\/agar\.io\/main_out\.js/,
  240. replace: function (m) {
  241. m.removeNewlines()
  242.  
  243. m.replace("var:allCells",
  244. /(=null;)(\w+)(.hasOwnProperty\(\w+\)?)/,
  245. "$1" + "$v=$2;" + "$2$3",
  246. "$v = {}")
  247.  
  248. m.replace("var:myCells",
  249. /(case 32:)(\w+)(\.push)/,
  250. "$1" + "$v=$2;" + "$2$3",
  251. "$v = []")
  252.  
  253. m.replace("var:top",
  254. /case 49:[^:]+?(\w+)=\[];/,
  255. "$&" + "$v=$1;",
  256. "$v = []")
  257.  
  258. m.replace("var:topTeams",
  259. /case 50:(\w+)=\[];/,
  260. "$&" + "$v=$1;",
  261. "$v = []")
  262.  
  263. var dr = "(\\w+)=\\w+\\.getFloat64\\(\\w+,!0\\);\\w+\\+=8;\\n?"
  264. var dd = 7071.067811865476
  265. m.replace("var:dimensions hook:dimensionsUpdated",
  266. RegExp("case 64:"+dr+dr+dr+dr),
  267. "$&" + "$v = [$1,$2,$3,$4],$H($1,$2,$3,$4),",
  268. "$v = " + JSON.stringify([-dd,-dd,dd,dd]))
  269.  
  270. var vr = "(\\w+)=\\w+\\.getFloat32\\(\\w+,!0\\);\\w+\\+=4;"
  271. m.save() &&
  272. m.replace("var:rawViewport:x,y var:disableRendering:1",
  273. /else \w+=\(5\*\w+\+(\w+)\)\/6,\w+=\(5\*\w+\+(\w+)\)\/6,.*?;/,
  274. "$&" + "$v0.x=$1; $v0.y=$2; if($v1)return;") &&
  275. m.replace("var:disableRendering:2 hook:skipCellDraw",
  276. /(\w+:function\(\w+\){)(if\(this\.\w+\(\)\){\+\+this\.[\w$]+;)/,
  277. "$1" + "if($v || $H(this))return;" + "$2") &&
  278. m.replace("var:rawViewport:scale",
  279. /Math\.pow\(Math\.min\(64\/\w+,1\),\.4\)/,
  280. "($v.scale=$&)") &&
  281. m.replace("var:rawViewport:x,y,scale",
  282. RegExp("case 17:"+vr+vr+vr),
  283. "$&" + "$v.x=$1; $v.y=$2; $v.scale=$3;") &&
  284. m.reset_("window.agar.rawViewport = {x:0,y:0,scale:1};" +
  285. "window.agar.disableRendering = false;") ||
  286. m.restore()
  287.  
  288. m.replace("reset hook:connect var:ws var:webSocket",
  289. /new WebSocket\((\w+)\);/,
  290. "$v1 = $&; $v0=$1;" + m.reset + "$H();",
  291. "$v0 = ''; $v1 = null;")
  292.  
  293. m.replace("property:scale",
  294. /function \w+\(\w+\){\w+\.preventDefault\(\);[^;]+;1>(\w+)&&\(\1=1\)/,
  295. `;${makeProperty("scale", "$1")};$&`)
  296.  
  297. m.replace("var:minScale",
  298. /;1>(\w+)&&\(\1=1\)/,
  299. ";$v>$1 && ($1=$v)",
  300. "$v = 1")
  301.  
  302. m.replace("var:region",
  303. /console\.log\("Find "\+(\w+\+\w+)\);/,
  304. "$&" + "$v=$1;",
  305. "$v = ''")
  306.  
  307. m.replace("cellProperty:isVirus",
  308. /((\w+)=!!\(\w+&1\)[\s\S]{0,400})((\w+).(\w+)=\2;)/,
  309. "$1$4.isVirus=$3")
  310.  
  311. m.replace("var:dommousescroll",
  312. /("DOMMouseScroll",)(\w+),/,
  313. "$1($v=$2),")
  314.  
  315. m.replace("var:skinF hook:cellSkin",
  316. /(\w+.fill\(\))(;null!=(\w+))/,
  317. "$1;" +
  318. "if($v)$3 = $v(this,$3);" +
  319. "if($h)$3 = $h(this,$3);" +
  320. "$2");
  321.  
  322. m.replace("hook:afterCellStroke",
  323. /\((\w+)\.strokeStyle="#000000",\1\.globalAlpha\*=\.1,\1\.stroke\(\)\);\1\.globalAlpha=1;/,
  324. "$&" + "$H(this);")
  325.  
  326. m.replace("var:showStartupBg",
  327. /\w+\?\(\w\.globalAlpha=\w+,/,
  328. "$v && $&",
  329. "$v = true")
  330.  
  331. var vAlive = /\((\w+)\[(\w+)\]==this\){\1\.splice\(\2,1\);/.exec(m.text)
  332. var vEaten = /0<this\.[$\w]+&&(\w+)\.push\(this\)}/.exec(m.text)
  333. !vAlive && console.error("Expose: can't find vAlive")
  334. !vEaten && console.error("Expose: can't find vEaten")
  335. if (vAlive && vEaten)
  336. m.replace("var:aliveCellsList var:eatenCellsList",
  337. RegExp(vAlive[1] + "=\\[\\];" + vEaten[1] + "=\\[\\];"),
  338. "$v0=" + vAlive[1] + "=[];" + "$v1=" + vEaten[1] + "=[];",
  339. "$v0 = []; $v1 = []")
  340.  
  341. m.replace("hook:drawScore",
  342. /(;(\w+)=Math\.max\(\2,(\w+\(\))\);)0!=\2&&/,
  343. "$1($H($3))||0!=$2&&")
  344.  
  345. m.replace("hook:beforeTransform hook:beforeDraw var:drawScale",
  346. /(\w+)\.save\(\);\1\.translate\((\w+\/2,\w+\/2)\);\1\.scale\((\w+),\3\);\1\.translate\((-\w+,-\w+)\);/,
  347. "$v = $3;$H0($1,$2,$3,$4);" + "$&" + "$H1($1,$2,$3,$4);",
  348. "$v = 1")
  349.  
  350. m.replace("hook:afterDraw",
  351. /(\w+)\.restore\(\);(\w+)&&\2\.width&&\1\.drawImage/,
  352. "$H();" + "$&")
  353.  
  354. m.replace("hook:cellColor",
  355. /(\w+=)this\.color,/,
  356. "$1 ($h && $h(this, this.color) || this.color),")
  357.  
  358. m.replace("var:drawGrid",
  359. /(\w+)\.globalAlpha=(\.2\*\w+);/,
  360. "if(!$v)return;" + "$&",
  361. "$v = true")
  362.  
  363. m.replace("hook:drawCellMass",
  364. /&&\((\w+\|\|0==\w+\.length&&\(!this\.\w+\|\|this\.\w+\)&&20<this\.size)\)&&/,
  365. "&&( $h ? $h(this,$1) : ($1) )&&")
  366.  
  367. m.replace("hook:cellMassText",
  368. /(\.\w+)(\(~~\(this\.size\*this\.size\/100\)\))/,
  369. "$1( $h ? $h(this,$2) : $2 )")
  370.  
  371. m.replace("hook:cellMassTextScale",
  372. /(\.\w+)\((this\.\w+\(\))\)([\s\S]{0,1000})\1\(\2\/2\)/,
  373. "$1($2)$3$1( $h ? $h(this,$2/2) : ($2/2) )")
  374.  
  375. m.replace("var:enableDirectionSending",
  376. /;64>(\w+)\*\1\+(\w+)\*\2/,
  377. ";if(!$v)return" + "$&",
  378. "$v = true")
  379.  
  380. m.replace("var:simpleCellDraw",
  381. /(:function\(\){)(var a=10;)/,
  382. "$1 if($v)return true;$2",
  383. "$v=false")
  384.  
  385. m.replace("hook:updateLeaderboard",
  386. /({\w+=null;)(if\(null!=)/,
  387. "$1 if($H())return; $2")
  388.  
  389. var template = (key,n) =>
  390. `this\\.${key}=\\w+\\*\\(this\\.(\\w+)-this\\.(\\w+)\\)\\+this\\.\\${n};`
  391. var re = new RegExp(template('x', 2) + template('y', 4) + template('size', 6))
  392. var match = re.exec(m.text)
  393. if (match) {
  394. m.cellProp.nx = match[1]
  395. m.cellProp.ny = match[3]
  396. m.cellProp.nSize = match[5]
  397. } else
  398. console.error("Expose: cellProp:x,y,size search failed!")
  399.  
  400. }},
  401. ]
  402.  
  403. function makeProperty(name, varname) {
  404. return "'" + name + "' in window.agar || " +
  405. "Object.defineProperty( window.agar, '"+name+"', " +
  406. "{get:function(){return "+varname+"},set:function(){"+varname+"=arguments[0]},enumerable:true})"
  407. }
  408.  
  409. if (window.top != window.self)
  410. return
  411.  
  412. if (document.readyState !== 'loading')
  413. return console.error("Expose: this script should run at document-start")
  414.  
  415. var isFirefox = /Firefox/.test(navigator.userAgent)
  416.  
  417. // Stage 1: Find corresponding rule
  418. var rules
  419. for (var i = 0; i < allRules.length; i++)
  420. if (allRules[i].hostname.indexOf(window.location.hostname) !== -1) {
  421. rules = allRules[i]
  422. break
  423. }
  424. if (!rules)
  425. return console.error("Expose: cant find corresponding rule")
  426.  
  427.  
  428. // Stage 2: Search for `main_out.js`
  429. if (isFirefox) {
  430. function bse_listener(e) { tryReplace(e.target, e) }
  431. window.addEventListener('beforescriptexecute', bse_listener, true)
  432. } else {
  433. // Iterate over document.head child elements and look for `main_out.js`
  434. for (var i = 0; i < document.head.childNodes.length; i++)
  435. if (tryReplace(document.head.childNodes[i]))
  436. return
  437. // If there are no desired element in document.head, then wait until it appears
  438. function observerFunc(mutations) {
  439. for (var i = 0; i < mutations.length; i++) {
  440. var addedNodes = mutations[i].addedNodes
  441. for (var j = 0; j < addedNodes.length; j++)
  442. if (tryReplace(addedNodes[j]))
  443. return observer.disconnect()
  444. }
  445. }
  446. var observer = new MutationObserver(observerFunc)
  447. observer.observe(document.head, {childList: true})
  448. }
  449.  
  450. // Stage 3: Replace found element using rules
  451. function tryReplace(node, event) {
  452. var scriptLinked = rules.scriptUriRe && rules.scriptUriRe.test(node.src)
  453. var scriptEmbedded = rules.scriptTextRe && rules.scriptTextRe.test(node.textContent)
  454. if (node.tagName != "SCRIPT" || (!scriptLinked && !scriptEmbedded))
  455. return false // this is not desired element; get back to stage 2
  456.  
  457. if (isFirefox) {
  458. event.preventDefault()
  459. window.removeEventListener('beforescriptexecute', bse_listener, true)
  460. }
  461.  
  462. var mod = {
  463. reset: "",
  464. text: null,
  465. history: [],
  466. cellProp: {},
  467. save() {
  468. this.history.push({reset:this.reset, text:this.text})
  469. return true
  470. },
  471. restore() {
  472. var state = this.history.pop()
  473. this.reset = state.reset
  474. this.text = state.text
  475. return true
  476. },
  477. reset_(reset) {
  478. this.reset += reset
  479. return true
  480. },
  481. replace(what, from, to, reset) {
  482. var vars = [], hooks = []
  483. what.split(" ").forEach((x) => {
  484. x = x.split(":")
  485. x[0] === "var" && vars.push(x[1])
  486. x[0] === "hook" && hooks.push(x[1])
  487. })
  488. function replaceShorthands(str) {
  489. function nope(letter, array, fun) {
  490. str = str
  491. .split(new RegExp('\\$' + letter + '([0-9]?)'))
  492. .map((v,n) => n%2 ? fun(array[v||0]) : v)
  493. .join("")
  494. }
  495. nope('v', vars, (name) => "window.agar." + name)
  496. nope('h', hooks, (name) => "window.agar.hooks." + name)
  497. nope('H', hooks, (name) =>
  498. "window.agar.hooks." + name + "&&" +
  499. "window.agar.hooks." + name)
  500. return str
  501. }
  502. var newText = this.text.replace(from, replaceShorthands(to))
  503. if(newText === this.text) {
  504. console.error("Expose: `" + what + "` replacement failed!")
  505. return false
  506. } else {
  507. this.text = newText
  508. if (reset)
  509. this.reset += replaceShorthands(reset) + ";"
  510. return true
  511. }
  512. },
  513. removeNewlines() {
  514. this.text = this.text.replace(/([,\/;])\n/mg, "$1")
  515. },
  516. get: function() {
  517. var cellProp = JSON.stringify(this.cellProp)
  518. return `window.agar={hooks:{},cellProp:${cellProp}};` +
  519. this.reset + this.text
  520. }
  521. }
  522.  
  523. if (scriptEmbedded) {
  524. mod.text = node.textContent
  525. rules.replace(mod)
  526. if (isFirefox) {
  527. document.head.removeChild(node)
  528. var script = document.createElement("script")
  529. script.textContent = mod.get()
  530. document.head.appendChild(script)
  531. } else {
  532. node.textContent = mod.get()
  533. }
  534. console.log("Expose: replacement done")
  535. } else {
  536. document.head.removeChild(node)
  537. var request = new XMLHttpRequest()
  538. request.onload = function() {
  539. var script = document.createElement("script")
  540. mod.text = this.responseText
  541. rules.replace(mod)
  542. script.textContent = mod.get()
  543. // `main_out.js` should not executed before jQuery was loaded, so we need to wait jQuery
  544. function insertScript(script) {
  545. if (typeof jQuery === "undefined")
  546. return setTimeout(insertScript, 0, script)
  547. document.head.appendChild(script)
  548. console.log("Expose: replacement done")
  549. }
  550. insertScript(script)
  551. }
  552. request.onerror = function() { console.error("Expose: response was null") }
  553. request.open("get", node.src, true)
  554. request.send()
  555. }
  556.  
  557. return true
  558. }