Advertisement
Guest User

1-1 install now

a guest
Dec 3rd, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.21 KB | None | 0 0
  1. // ==UserScript==
  2. // @name ℰℳℛ ☛ EMRClons v1.0.1
  3. // @namespace The best bot experience & Project by NickDev_
  4. // @version 1.0.1
  5. // @description Bots for AgarIOClons!
  6. // @author NickDev_
  7. // @match *://mgar.io/*
  8. // @match *://astr.io/*
  9. // @require https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.5/socket.io.min.js
  10. // @grant none
  11. // ==/UserScript==
  12.  
  13. var htmlToInject = '';
  14. var bot_name = 'ℰℳℛ ☛ SkillYT';
  15. var a_name = null;
  16. var client_uuid = localStorage.getItem('client_uuid');
  17.  
  18. client_uuid = "00da";
  19.  
  20. $("#h2").text('EMR - Client v1.0.1');
  21.  
  22. var spacerHTML = '<div id="minions" style="font-size: 17px;margin-bottom: 5px;border-bottom: 1px solid rgba(204, 204, 204, 0.25);margin: 0 -12px 5px -12px;padding: 0 12px 5px 12px;text-shadow: 0px 0px 15px #86FF00, 0px 0px 6px #86FF00;"></div>';
  23.  
  24. htmlToInject += '<div id="bmenu" style="position: absolute; top: 10px; left: 15px; padding: 0px 8px; font-family: Tahoma; color: rgb(255, 255, 255); z-index: 9999; border-radius: 2px; min-height: 15px; min-width: 200px; background-color: rgba(0, 0, 0, 0.6);">';
  25. htmlToInject += '<div id="title"><center><b>ℰℳℛ ☛ Clons v1.0.1</b></center></div>';
  26. htmlToInject += spacerHTML;
  27. htmlToInject += '<div id="cCount"><b>Clons: </b><span class="label label-info pull-right"><span id="botCount">Connecting...</span></div></b>';
  28. htmlToInject += '<div id="cTime"><b>Time left: </b><span class="label label-warning pull-right"><span id="timeLeft">1 year</span></div></b>';
  29. htmlToInject += spacerHTML;
  30. htmlToInject += '<div id="cMouse"><b>Move control: </b><span class="label label-success pull-right"><span id="mouseControl">ON</span></div></b>';
  31. htmlToInject += '<div id="cStop"><b>Stop moviment: </b><span class="label label-danger pull-right"><span id="stopM">OFF</span></div></b>';
  32. htmlToInject += '<div id="cPellet"><b>Pellet mode: </b><span class="label label-danger pull-right"><span id="pelletMode">OFF</span></div></b>';
  33. htmlToInject += spacerHTML;
  34. htmlToInject += '<div id="cUUID"><b>UUID: </b><span class="label label-default pull-right"><span id="UUID">' + client_uuid + '</span></div></b>';
  35. htmlToInject += spacerHTML;
  36. htmlToInject += '<div class="input-group" id="botnames_div"><span class="glyphicons glyphicons-lock"></span><input id="bots-name-input" class="form-control" placeholder="Comming soon!" maxlength="14" autofocus="" value="' + bot_name + '"></div>';
  37. htmlToInject += '</div>';
  38.  
  39. setTimeout(function(){
  40. if(movetoMouse){
  41. document.getElementById("cMouse").innerHTML('<div id="cMouse"><b>Move control: </b><span class="label label-success pull-right"><span id="mouseControl">ON</span></div></b>');
  42. }else{
  43. document.getElementById("cMouse").innerHTML('<div id="cMouse"><b>Move control: </b><span class="label label-danger pull-right"><span id="mouseControl">OFF</span></div></b>');
  44. }
  45. if(pelletMode){
  46. document.getElementById("cPellet").innerHTML('<div id="cPellet"><b>Pellet mode: </b><span class="label label-success pull-right"><span id="pelletMode">ON</span></div></b>');
  47. }else{
  48. document.getElementById("cPellet").innerHTML('<div id="cPellet"><b>Pellet mode: </b><span class="label label-danger pull-right"><span id="pelletMode">OFF</span></div></b>');
  49. }
  50. if(canMove){
  51. document.getElementById("cStop").innerHTML('<div id="cStop"><b>Stop moviment: </b><span class="label label-success pull-right"><span id="stopM">ON</span></div></b>');
  52. }else{
  53. document.getElementById("cStop").innerHTML('<div id="cStop"><b>Stop moviment: </b><span class="label label-danger pull-right"><span id="stopM">OFF</span></div></b>');
  54. }
  55.  
  56. }, 100);
  57.  
  58.  
  59. var botMenu = document.createElement('div');
  60. botMenu.id = 'bmenu';
  61. botMenu.innerHTML = htmlToInject;
  62. document.getElementsByTagName('body')[0].appendChild(botMenu);
  63.  
  64. b();
  65.  
  66. function b(){
  67. setTimeout(function() {
  68. var real_minx = -7071;
  69. var real_miny = -7071;
  70. var real_maxx = 7071;
  71. var real_maxy = 7071;
  72. var lastsent = {
  73. minx: 0,
  74. miny: 0,
  75. maxx: 0,
  76. maxy: 0
  77. };
  78.  
  79. function valcompare(Y, Z) {
  80. return 0.01 > Y - Z && -0.01 < Y - Z
  81. }
  82. window.agar.hooks.dimensionsUpdated = function(server_minx, server_miny, server_maxx, server_maxy) {
  83. if (valcompare(server_maxx - server_minx, server_maxy - server_miny)) {
  84. real_minx = server_minx;
  85. real_miny = server_miny;
  86. real_maxx = server_maxx;
  87. real_maxy = server_maxy
  88. } else {
  89. if (valcompare(server_minx, lastsent.minx)) {
  90. if (0.01 < server_maxx - lastsent.maxx || -0.01 > server_maxx - lastsent.maxx) {
  91. real_minx = server_minx;
  92. real_maxx = server_minx + 14142.135623730952
  93. }
  94. }
  95. if (0.01 < server_minx - lastsent.minx || -0.01 > server_minx - lastsent.minx) {
  96. if (valcompare(server_maxx, lastsent.maxx)) {
  97. real_maxx = server_maxx;
  98. real_minx = server_maxx - 14142.135623730952
  99. }
  100. }
  101. if (0.01 < server_miny - lastsent.miny || -0.01 > server_miny - lastsent.miny) {
  102. if (valcompare(server_maxy, lastsent.maxy)) {
  103. real_maxy = server_maxy;
  104. real_miny = server_maxy - 14142.135623730952
  105. }
  106. }
  107. if (valcompare(server_miny, lastsent.miny)) {
  108. if (0.01 < server_maxy - lastsent.maxy || -0.01 > server_maxy - lastsent.maxy) {
  109. real_miny = server_miny;
  110. real_maxy = server_miny + 14142.135623730952
  111. }
  112. }
  113. if (server_minx < real_minx) {
  114. real_minx = server_minx;
  115. real_maxx = server_minx + 14142.135623730952
  116. }
  117. if (server_maxx > real_maxx) {
  118. real_maxx = server_maxx;
  119. real_minx = server_maxx - 14142.135623730952
  120. }
  121. if (server_miny < real_miny) {
  122. real_miny = server_miny;
  123. real_maxy = server_miny + 14142.135623730952
  124. }
  125. if (server_maxy > real_maxy) {
  126. real_maxy = server_maxy;
  127. real_miny = server_maxy - 14142.135623730952
  128. }
  129. lastsent.minx = server_minx;
  130. lastsent.miny = server_miny;
  131. lastsent.maxy = server_maxy;
  132. lastsent.maxx = server_maxx
  133. }
  134. offset_x = real_minx || -7071;
  135. offset_y = real_miny || -7071
  136. };
  137. //var socket = io.connect('ws://togar-nm-istonicraft29482.codeanyapp.com:8081');
  138. var socket = io.connect('ws://b-Project-NickDeveloper-istonicraft29482.codeanyapp.com:8081');
  139. var canMove = true;
  140. var movetoMouse = true;
  141. var pelletMode = false;
  142. var moveEvent = new Array(2);
  143. var canvas = document.getElementById("canvas");
  144. last_transmited_game_server = null;
  145. socket.on('force-login', function(data) {
  146. socket.emit("login", {
  147. "uuid": client_uuid,
  148. "type": "client"
  149. });
  150. transmit_game_server()
  151. });
  152.  
  153.  
  154.  
  155. console.log('UUID: ' + client_uuid);
  156.  
  157. socket.on('spawn-count', function(data) {
  158. document.getElementById('cCount').innerHTML = '<div id="cCount"><b>Clons: </b><span class="label label-info pull-right"><span id="botCount">' + data + '</span></div></b>';
  159. });
  160.  
  161. if(client_uuid == null){
  162. console.log("generating a uuid for this user");
  163. client_uuid = Math.floor((5 + Math.random()) * 0x100110 * Math.random() * 152.22158531 / Math.random() * 15.1 / 553.1 - 515/2*51 / 999999*9999999 -99).toString(16).substring(3);
  164. localStorage.setItem('client_uuid', client_uuid);
  165. client_uuid = "00bb";
  166. //console.log(client_uuid);
  167. }
  168. socket.emit("login", client_uuid);
  169. $("#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></div><br><div class="input-group"><span class="input-group-addon" style="margin-top: -100px;" id="basic-addon1">Version:</span><input type="text" value="V1 Beta" readonly class="form-control"</div></div><br><center><span style="font-size=xx-large;color:red;font-weight:bold">XBots.io Info:</span><br>Xbots.io Team </b>Welcome To Xbots.io!<b><br> </b><br><br>Best Bots Experience</b> <b><br>~Buy Bots At http://Xbots.io/~ <b><br> </b><br><b><br> </b><br> </span> <br><b>Instructions on: Xbots.io Website Or on YouTube: SOON ~Suprix|OWNER</b></b><br><b></b> <br><b></b> <br> <b></b> <br> <b></b><br> <b></b><br> <b></b> <br><br> All rights reserved. Xbots.io � 2016 <br> ©xbots.io<br> ');
  170.  
  171. $("span[data-itr=option_show_mass]").prev()[0].checked = true;
  172. // setShowMass(true);
  173. var a = document.getElementById('gamemode').getElementsByTagName('option');
  174. if (a.length > 0) {
  175. for (var i = 0; i < a.length; i++) {
  176. if (a[i].getAttribute('data-itr') != 'party') {
  177. a[i].innerHTML += ' (Bots offline)';
  178. }
  179. }
  180. }
  181. a_name = bot_name;
  182. tBN();
  183.  
  184.  
  185.  
  186. function isMe(cell) {
  187. for (var i = 0; i < window.agar.myCells.length; i++) {
  188. if (window.agar.myCells[i] == cell.id) {
  189. return true
  190. }
  191. }
  192. return false
  193. }
  194.  
  195. function getCell() {
  196. var me = [];
  197. for (var key in window.agar.allCells) {
  198. var cell = window.agar.allCells[key];
  199. if (isMe(cell)) {
  200. me.push(cell)
  201. }
  202. }
  203. return me[0]
  204. }
  205. var skin_var = 0;
  206.  
  207. function emitPosition() {
  208. for (i = 0; i < agar.myCells.length; i++) {}
  209. x = (mouseX - window.innerWidth / 2) / window.agar.drawScale + window.agar.rawViewport.x;
  210. y = (mouseY - window.innerHeight / 2) / window.agar.drawScale + window.agar.rawViewport.y;
  211. if (!movetoMouse) {
  212. x = getCell().x;
  213. y = getCell().y
  214. }
  215. socket.emit("pos", {
  216. "x": x - (real_minx + 7071),
  217. "y": y - (real_miny + 7071),
  218. "dimensions": [-7071, -7071, 7071, 7071],
  219. "suicide_targets": [-7071, -7071, 7071, 7071]
  220. })
  221. }
  222.  
  223. function tBN(){
  224. socket.emit("botName", a_name);
  225. }
  226.  
  227.  
  228. function emitSplit(){
  229. socket.emit("cmd", {"name":"split"} );
  230. }
  231.  
  232. function s(){
  233. socket.emit("Stop")
  234. }
  235.  
  236. function collectMass(){
  237. socket.emit("collectMass")
  238. }
  239. $("#instructions").replaceWith("Test :D");
  240.  
  241. function emitMassEject() {
  242. socket.emit("cmd", {
  243. "name": "eject"
  244. })
  245. }
  246. function emi() {
  247. socket.emit("cmd", {
  248. "name": ""
  249.  
  250. })
  251. }
  252.  
  253. function emittricksplit() {
  254. socket.emit("cmd", {
  255. "name": "tricksplit"
  256. })
  257. }
  258.  
  259. function toggleMovement() {
  260. canMove = !canMove;
  261. switch (canMove) {
  262. case true:
  263. canvas.onmousemove = moveEvent[0];
  264. moveEvent[0] = null;
  265. canvas.onmousedown = moveEvent[1];
  266. moveEvent[1] = null;
  267. break;
  268. case false:
  269. canvas.onmousemove({
  270. clientX: innerWidth / 2,
  271. clientY: innerHeight / 2
  272. });
  273. moveEvent[0] = canvas.onmousemove;
  274. canvas.onmousemove = null;
  275. moveEvent[1] = canvas.onmousedown;
  276. canvas.onmousedown = null;
  277. break
  278. }
  279. }
  280. interval_id = setInterval(function() {
  281. emitPosition()
  282. }, 100);
  283. interval_id2 = setInterval(function() {
  284. transmit_game_server_if_changed()
  285. }, 200);
  286. var check = true;
  287. var check2 = true;
  288. document.addEventListener('keydown', function(e) {
  289. var key = e.keyCode || e.which;
  290. switch (key) {
  291. case 80:
  292. if(pelletMode == true){
  293. socket.emit('pelletMode', true);
  294. }else socket.emit('pelletMode', false);
  295. break;
  296. case 65:
  297. movetoMouse = !movetoMouse;
  298. if(check2 == true) { document.getElementById('follow').innerHTML = '<span class="label label-warning pull-right">ON</span>'; check2 = false; } else { document.getElementById('follow').innerHTML = '<span class="label label-danger pull-right">OFF</span>'; check2 = true; }
  299. break;
  300. case 68:
  301. toggleMovement();
  302. if(check == true) { document.getElementById('move').innerHTML = '<span class="label label-warning pull-right">ON</span>'; check = false; } else { document.getElementById('move').innerHTML = '<span class="label label-danger pull-right">OFF</span>'; check = true; }
  303. break;
  304. case 88:
  305. emitSplit();
  306. break;
  307. case 67:
  308. emitMassEject();
  309. break;
  310. case 75:
  311. StopBots();
  312. break;
  313. case 69:
  314. collectMass();
  315. break;
  316. case 82:
  317. emitRestart();
  318. break;
  319. case 90:
  320. emittricksplit();
  321. break;
  322. }
  323. });
  324.  
  325. var SplitInterval;
  326. var MacroInterval;
  327. var SplitDebounce = false;
  328. var MacroDebounce = false;
  329. $(document).on('keydown', function(input) {
  330. console.log("got keydown")
  331. if (input.keyCode == 16) {
  332. if (SplitDebounce) {
  333. return;
  334. }
  335. SplitDebounce = true;
  336. SplitInterval = setInterval(function() {
  337. $("body").trigger($.Event("keydown", {
  338. keyCode: 32
  339. }));
  340. $("body").trigger($.Event("keyup", {
  341. keyCode: 32
  342. }));
  343. }, 0);
  344. } else if (input.keyCode == 83) {
  345. if (MacroDebounce) {
  346. return;
  347. }
  348. MacroDebounce = true;
  349. MacroInterval = setInterval(function() {
  350. $("body").trigger($.Event("keydown", {
  351. keyCode: 87
  352. }));
  353. $("body").trigger($.Event("keyup", {
  354. keyCode: 87
  355. }));
  356. }, 0);
  357. }
  358. })
  359.  
  360. $(document).on('keyup', function(input) {
  361. if (input.keyCode == 16) {
  362. SplitDebounce = false;
  363. clearInterval(SplitInterval);
  364. return;
  365. } else if (input.keyCode == 83) {
  366. MacroDebounce = false;
  367. clearInterval(MacroInterval);
  368. return;
  369. }
  370. })
  371.  
  372. function transmit_game_server_if_changed() {
  373. if (last_transmited_game_server != window.agar.ws) {
  374. last_transmited_game_server = window.agar.ws;
  375. socket.emit("cmd", {
  376. "name": "reconnect_server",
  377. "ip": last_transmited_game_server
  378. })
  379. }
  380. }
  381.  
  382. function transmit_game_server() {
  383. last_transmited_game_server = window.agar.ws;
  384. socket.emit("cmd", {
  385. "name": "connect_server",
  386. "ip": last_transmited_game_server
  387. })
  388. }
  389. var mouseX = 0;
  390. var mouseY = 0;
  391. $("body").mousemove(function(event) {
  392. mouseX = event.clientX;
  393. mouseY = event.clientY
  394. });
  395. window.agar.minScale = -30
  396. }, 5000);
  397.  
  398. var allRules = [
  399. { hostname: ["agar.io"],
  400. scriptUriRe: /^http:\/\/agar\.io\/main_out\.js/,
  401. replace: function (m) {
  402. m.removeNewlines()
  403.  
  404. m.replace("var:allCells",
  405. /(=null;)(\w+)(.hasOwnProperty\(\w+\)?)/,
  406. "$1" + "$v=$2;" + "$2$3",
  407. "$v = {}")
  408.  
  409. m.replace("var:myCells",
  410. /(case 32:)(\w+)(\.push)/,
  411. "$1" + "$v=$2;" + "$2$3",
  412. "$v = []")
  413.  
  414. m.replace("var:top",
  415. /case 49:[^:]+?(\w+)=\[];/,
  416. "$&" + "$v=$1;",
  417. "$v = []")
  418.  
  419. m.replace("var:topTeams",
  420. /case 50:(\w+)=\[];/,
  421. "$&" + "$v=$1;",
  422. "$v = []")
  423.  
  424. var dr = "(\\w+)=\\w+\\.getFloat64\\(\\w+,!0\\);\\w+\\+=8;\\n?"
  425. var dd = 7071.067811865476
  426. m.replace("var:dimensions hook:dimensionsUpdated",
  427. RegExp("case 64:"+dr+dr+dr+dr),
  428. "$&" + "$v = [$1,$2,$3,$4],$H($1,$2,$3,$4),",
  429. "$v = " + JSON.stringify([-dd,-dd,dd,dd]))
  430.  
  431. var vr = "(\\w+)=\\w+\\.getFloat32\\(\\w+,!0\\);\\w+\\+=4;"
  432. m.save() &&
  433. m.replace("var:rawViewport:x,y var:disableRendering:1",
  434. /else \w+=\(5\*\w+\+(\w+)\)\/6,\w+=\(5\*\w+\+(\w+)\)\/6,.*?;/,
  435. "$&" + "$v0.x=$1; $v0.y=$2; if($v1)return;") &&
  436. m.replace("var:disableRendering:2 hook:skipCellDraw",
  437. /(\w+:function\(\w+\){)(if\(this\.\w+\(\)\){\+\+this\.[\w$]+;)/,
  438. "$1" + "if($v || $H(this))return;" + "$2") &&
  439. m.replace("var:rawViewport:scale",
  440. /Math\.pow\(Math\.min\(64\/\w+,1\),\.4\)/,
  441. "($v.scale=$&)") &&
  442. m.replace("var:rawViewport:x,y,scale",
  443. RegExp("case 17:"+vr+vr+vr),
  444. "$&" + "$v.x=$1; $v.y=$2; $v.scale=$3;") &&
  445. m.reset_("window.agar.rawViewport = {x:0,y:0,scale:1};" +
  446. "window.agar.disableRendering = false;") ||
  447. m.restore()
  448.  
  449. m.replace("reset hook:connect var:ws var:webSocket",
  450. /new WebSocket\((\w+)\);/,
  451. "$v1 = $&; $v0=$1;" + m.reset + "$H();",
  452. "$v0 = ''; $v1 = null;")
  453.  
  454. m.replace("property:scale",
  455. /function \w+\(\w+\){\w+\.preventDefault\(\);[^;]+;1>(\w+)&&\(\1=1\)/,
  456. `;${makeProperty("scale", "$1")};$&`)
  457.  
  458. m.replace("var:minScale",
  459. /;1>(\w+)&&\(\1=1\)/,
  460. ";$v>$1 && ($1=$v)",
  461. "$v = 1")
  462.  
  463. m.replace("var:region",
  464. /console\.log\("Find "\+(\w+\+\w+)\);/,
  465. "$&" + "$v=$1;",
  466. "$v = ''")
  467.  
  468. m.replace("cellProperty:isVirus",
  469. /((\w+)=!!\(\w+&1\)[\s\S]{0,400})((\w+).(\w+)=\2;)/,
  470. "$1$4.isVirus=$3")
  471.  
  472. m.replace("var:dommousescroll",
  473. /("DOMMouseScroll",)(\w+),/,
  474. "$1($v=$2),")
  475.  
  476. m.replace("var:skinF hook:cellSkin",
  477. /(\w+.fill\(\))(;null!=(\w+))/,
  478. "$1;" +
  479. "if($v)$3 = $v(this,$3);" +
  480. "if($h)$3 = $h(this,$3);" +
  481. "$2");
  482.  
  483. /*m.replace("bigSkin",
  484. /(null!=(\w+)&&\((\w+)\.save\(\),)(\3\.clip\(\),\w+=)(Math\.max\(this\.size,this\.\w+\))/,
  485. "$1" + "$2.big||" + "$4" + "($2.big?2:1)*" + "$5")*/
  486.  
  487. m.replace("hook:afterCellStroke",
  488. /\((\w+)\.strokeStyle="#000000",\1\.globalAlpha\*=\.1,\1\.stroke\(\)\);\1\.globalAlpha=1;/,
  489. "$&" + "$H(this);")
  490.  
  491. m.replace("var:showStartupBg",
  492. /\w+\?\(\w\.globalAlpha=\w+,/,
  493. "$v && $&",
  494. "$v = true")
  495.  
  496. var vAlive = /\((\w+)\[(\w+)\]==this\){\1\.splice\(\2,1\);/.exec(m.text)
  497. var vEaten = /0<this\.[$\w]+&&(\w+)\.push\(this\)}/.exec(m.text)
  498. !vAlive && console.error("Expose: can't find vAlive")
  499. !vEaten && console.error("Expose: can't find vEaten")
  500. if (vAlive && vEaten)
  501. m.replace("var:aliveCellsList var:eatenCellsList",
  502. RegExp(vAlive[1] + "=\\[\\];" + vEaten[1] + "=\\[\\];"),
  503. "$v0=" + vAlive[1] + "=[];" + "$v1=" + vEaten[1] + "=[];",
  504. "$v0 = []; $v1 = []")
  505.  
  506. m.replace("hook:drawScore",
  507. /(;(\w+)=Math\.max\(\2,(\w+\(\))\);)0!=\2&&/,
  508. "$1($H($3))||0!=$2&&")
  509.  
  510. m.replace("hook:beforeTransform hook:beforeDraw var:drawScale",
  511. /(\w+)\.save\(\);\1\.translate\((\w+\/2,\w+\/2)\);\1\.scale\((\w+),\3\);\1\.translate\((-\w+,-\w+)\);/,
  512. "$v = $3;$H0($1,$2,$3,$4);" + "$&" + "$H1($1,$2,$3,$4);",
  513. "$v = 1")
  514.  
  515. m.replace("hook:afterDraw",
  516. /(\w+)\.restore\(\);(\w+)&&\2\.width&&\1\.drawImage/,
  517. "$H();" + "$&")
  518.  
  519. m.replace("hook:cellColor",
  520. /(\w+=)this\.color,/,
  521. "$1 ($h && $h(this, this.color) || this.color),")
  522.  
  523. m.replace("var:drawGrid",
  524. /(\w+)\.globalAlpha=(\.2\*\w+);/,
  525. "if(!$v)return;" + "$&",
  526. "$v = true")
  527.  
  528. m.replace("hook:drawCellMass",
  529. /&&\((\w+\|\|0==\w+\.length&&\(!this\.\w+\|\|this\.\w+\)&&20<this\.size)\)&&/,
  530. "&&( $h ? $h(this,$1) : ($1) )&&")
  531.  
  532. m.replace("hook:cellMassText",
  533. /(\.\w+)(\(~~\(this\.size\*this\.size\/100\)\))/,
  534. "$1( $h ? $h(this,$2) : $2 )")
  535.  
  536. m.replace("hook:cellMassTextScale",
  537. /(\.\w+)\((this\.\w+\(\))\)([\s\S]{0,1000})\1\(\2\/2\)/,
  538. "$1($2)$3$1( $h ? $h(this,$2/2) : ($2/2) )")
  539.  
  540. m.replace("var:enableDirectionSending",
  541. /;64>(\w+)\*\1\+(\w+)\*\2/,
  542. ";if(!$v)return" + "$&",
  543. "$v = true")
  544.  
  545. m.replace("var:simpleCellDraw",
  546. /(:function\(\){)(var a=10;)/,
  547. "$1 if($v)return true;$2",
  548. "$v=false")
  549.  
  550. m.replace("hook:updateLeaderboard",
  551. /({\w+=null;)(if\(null!=)/,
  552. "$1 if($H())return; $2")
  553.  
  554. var template = (key,n) =>
  555. `this\\.${key}=\\w+\\*\\(this\\.(\\w+)-this\\.(\\w+)\\)\\+this\\.\\${n};`
  556. var re = new RegExp(template('x', 2) + template('y', 4) + template('size', 6))
  557. var match = re.exec(m.text)
  558. if (match) {
  559. m.cellProp.nx = match[1]
  560. m.cellProp.ny = match[3]
  561. m.cellProp.nSize = match[5]
  562. } else
  563. console.error("Expose: cellProp:x,y,size search failed!")
  564.  
  565. }},
  566. ]
  567.  
  568. function makeProperty(name, varname) {
  569. return "'" + name + "' in window.agar || " +
  570. "Object.defineProperty( window.agar, '"+name+"', " +
  571. "{get:function(){return "+varname+"},set:function(){"+varname+"=arguments[0]},enumerable:true})"
  572. }
  573.  
  574. if (window.top != window.self)
  575. return
  576.  
  577. if (document.readyState !== 'loading')
  578. return console.error("Expose: this script should run at document-start")
  579.  
  580. var isFirefox = /Firefox/.test(navigator.userAgent)
  581.  
  582. // Stage 1: Find corresponding rule
  583. var rules
  584. for (var i = 0; i < allRules.length; i++)
  585. if (allRules[i].hostname.indexOf(window.location.hostname) !== -1) {
  586. rules = allRules[i]
  587. break
  588. }
  589. if (!rules)
  590. return console.error("Expose: cant find corresponding rule")
  591.  
  592.  
  593. // Stage 2: Search for `main_out.js`
  594. if (isFirefox) {
  595. function bse_listener(e) { tryReplace(e.target, e) }
  596. window.addEventListener('beforescriptexecute', bse_listener, true)
  597. } else {
  598. // Iterate over document.head child elements and look for `main_out.js`
  599. for (var i = 0; i < document.head.childNodes.length; i++)
  600. if (tryReplace(document.head.childNodes[i]))
  601. return
  602. // If there are no desired element in document.head, then wait until it appears
  603. function observerFunc(mutations) {
  604. for (var i = 0; i < mutations.length; i++) {
  605. var addedNodes = mutations[i].addedNodes
  606. for (var j = 0; j < addedNodes.length; j++)
  607. if (tryReplace(addedNodes[j]))
  608. return observer.disconnect()
  609. }
  610. }
  611. var observer = new MutationObserver(observerFunc)
  612. observer.observe(document.head, {childList: true})
  613. }
  614.  
  615. // Stage 3: Replace found element using rules
  616. function tryReplace(node, event) {
  617. var scriptLinked = rules.scriptUriRe && rules.scriptUriRe.test(node.src)
  618. var scriptEmbedded = rules.scriptTextRe && rules.scriptTextRe.test(node.textContent)
  619. if (node.tagName != "SCRIPT" || (!scriptLinked && !scriptEmbedded))
  620. return false // this is not desired element; get back to stage 2
  621.  
  622. if (isFirefox) {
  623. event.preventDefault()
  624. window.removeEventListener('beforescriptexecute', bse_listener, true)
  625. }
  626.  
  627. var mod = {
  628. reset: "",
  629. text: null,
  630. history: [],
  631. cellProp: {},
  632. save() {
  633. this.history.push({reset:this.reset, text:this.text})
  634. return true
  635. },
  636. restore() {
  637. var state = this.history.pop()
  638. this.reset = state.reset
  639. this.text = state.text
  640. return true
  641. },
  642. reset_(reset) {
  643. this.reset += reset
  644. return true
  645. },
  646. replace(what, from, to, reset) {
  647. var vars = [], hooks = []
  648. what.split(" ").forEach((x) => {
  649. x = x.split(":")
  650. x[0] === "var" && vars.push(x[1])
  651. x[0] === "hook" && hooks.push(x[1])
  652. })
  653. function replaceShorthands(str) {
  654. function nope(letter, array, fun) {
  655. str = str
  656. .split(new RegExp('\\$' + letter + '([0-9]?)'))
  657. .map((v,n) => n%2 ? fun(array[v||0]) : v)
  658. .join("")
  659. }
  660. nope('v', vars, (name) => "window.agar." + name)
  661. nope('h', hooks, (name) => "window.agar.hooks." + name)
  662. nope('H', hooks, (name) =>
  663. "window.agar.hooks." + name + "&&" +
  664. "window.agar.hooks." + name)
  665. return str
  666. }
  667. var newText = this.text.replace(from, replaceShorthands(to))
  668. if(newText === this.text) {
  669. console.error("Expose: `" + what + "` replacement failed!")
  670. return false
  671. } else {
  672. this.text = newText
  673. if (reset)
  674. this.reset += replaceShorthands(reset) + ";"
  675. return true
  676. }
  677. },
  678. removeNewlines() {
  679. this.text = this.text.replace(/([,\/;])\n/mg, "$1")
  680. },
  681. get: function() {
  682. var cellProp = JSON.stringify(this.cellProp)
  683. return `window.agar={hooks:{},cellProp:${cellProp}};` +
  684. this.reset + this.text
  685. }
  686. }
  687.  
  688. if (scriptEmbedded) {
  689. mod.text = node.textContent
  690. rules.replace(mod)
  691. if (isFirefox) {
  692. document.head.removeChild(node)
  693. var script = document.createElement("script")
  694. script.textContent = mod.get()
  695. document.head.appendChild(script)
  696. } else {
  697. node.textContent = mod.get()
  698. }
  699. console.log("Expose: replacement done")
  700. } else {
  701. document.head.removeChild(node)
  702. var request = new XMLHttpRequest()
  703. request.onload = function() {
  704. var script = document.createElement("script")
  705. mod.text = this.responseText
  706. rules.replace(mod)
  707. script.textContent = mod.get()
  708. // `main_out.js` should not executed before jQuery was loaded, so we need to wait jQuery
  709. function insertScript(script) {
  710. if (typeof jQuery === "undefined")
  711. return setTimeout(insertScript, 0, script)
  712. document.head.appendChild(script)
  713. console.log("Expose: replacement done")
  714. }
  715. insertScript(script)
  716. }
  717. request.onerror = function() { console.error("Expose: response was null") }
  718. request.open("get", node.src, true)
  719. request.send()
  720. }
  721.  
  722. return true
  723. }
  724. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement