Advertisement
hossem147

Hossbots.ga extension

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