Advertisement
Guest User

Untitled

a guest
Jul 25th, 2016
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.93 KB | None | 0 0
  1. // ==UserScript==
  2. // @name Best Mini-Map AGAR.IO by d0m
  3. // @version 2.1
  4. // @description Лучшая версия мини-карты
  5. // @author d0m
  6. // @license GC
  7. // @match http://agar.io/*
  8. // @require http://cdn.jsdelivr.net/msgpack/1.05/msgpack.js
  9. // @grant none
  10. // @run-at document-body
  11. // @namespace https://greasyfork.org/users/17276
  12. // ==/UserScript==
  13.  
  14. window.msgpack = this.msgpack;
  15.  
  16. (function(){
  17. var _WebSocket = window._WebSocket = window.WebSocket;
  18. var $ = window.jQuery;
  19. var msgpack = window.msgpack;
  20. var options = {
  21. enableMultiCells: true,
  22. enableCross: true
  23. };
  24.  
  25. //Параметры игры
  26. var agar_server = null;
  27. var map_server = null;
  28. var player_name = [];
  29. var players = [];
  30. var id_players = [];
  31. var cells = [];
  32. var current_cell_ids = [];
  33. var start_x = -7000,
  34. start_y = -7000,
  35. end_x = 7000,
  36. end_y = 7000,
  37. length_x = 14000,
  38. length_y = 14000;
  39. var render_timer = null;
  40.  
  41. function miniMapSendRawData(data) {
  42. if (map_server !== null && map_server.readyState === window._WebSocket.OPEN) {
  43. var array = new Uint8Array(data);
  44. map_server.send(array.buffer);
  45. }
  46. }
  47.  
  48. /*-------------------------------------------Рендер миникарты-------------------------------------------------*/
  49. function miniMapRender() {
  50. var canvas = window.mini_map;
  51. var ctx = canvas.getContext('2d');
  52. ctx.clearRect(0, 0, canvas.width, canvas.height);
  53. for (var id in window.mini_map_tokens) {
  54. var token = window.mini_map_tokens[id];
  55. var x = token.x * canvas.width;
  56. var y = token.y * canvas.height;
  57. var size = token.size * canvas.width;
  58.  
  59. ctx.beginPath();
  60. ctx.arc(
  61. x,
  62. y,
  63. size,
  64. 0,
  65. 2 * Math.PI,
  66. false
  67. );
  68. ctx.closePath();
  69. ctx.fillStyle = token.color;
  70. ctx.fill();
  71.  
  72. if (options.enableCross && -1 != current_cell_ids.indexOf(token.id))
  73. miniMapDrawCross(token.x, token.y, token.color);
  74.  
  75. if (options.enableAxes && -1 != current_cell_ids.indexOf(token.id))
  76. miniMapDrawMiddleCross()
  77.  
  78. if (id_players[id] !== undefined) {
  79. // Draw you party member's crosshair
  80. if (options.enableCross) {
  81. miniMapDrawCross(token.x, token.y, token.color);
  82. }
  83.  
  84. ctx.font = size * 2 + 'px Arial';
  85. ctx.textAlign = 'center';
  86. ctx.textBaseline = 'middle';
  87. ctx.fillStyle = 'white';
  88. ctx.fillText(id_players[id] + 1, x, y);
  89. }
  90. };
  91. }
  92.  
  93. function miniMapDrawCross(x, y, color) {
  94. var canvas = window.mini_map;
  95. var ctx = canvas.getContext('2d');
  96. ctx.lineWidth = 1;
  97. ctx.beginPath();
  98. ctx.moveTo(0, y * canvas.height);
  99. ctx.lineTo(canvas.width, y * canvas.height);
  100. ctx.moveTo(x * canvas.width, 0);
  101. ctx.lineTo(x * canvas.width, canvas.height);
  102. ctx.closePath();
  103. ctx.strokeStyle = '#33FF33';
  104. ctx.stroke();
  105. }
  106. /*-----------------------------------------Рендер миникарты:END-----------------------------------------------*/
  107.  
  108.  
  109.  
  110. function miniMapCreateToken(id, color) {
  111. var mini_map_token = {
  112. id: id,
  113. color: color,
  114. x: 0,
  115. y: 0,
  116. size: 0
  117. };
  118. return mini_map_token;
  119. }
  120.  
  121. function miniMapRegisterToken(id, token) {
  122. if (window.mini_map_tokens[id] === undefined) {
  123. window.mini_map_tokens[id] = token;
  124. }
  125. }
  126.  
  127. function miniMapUnregisterToken(id) {
  128. if (window.mini_map_tokens[id] !== undefined) {
  129. delete window.mini_map_tokens[id];
  130. }
  131. }
  132.  
  133. function miniMapIsRegisteredToken(id) {
  134. return window.mini_map_tokens[id] !== undefined;
  135.  
  136. }
  137.  
  138. function miniMapUpdateToken(id, x, y, size) {
  139. if (window.mini_map_tokens[id] !== undefined) {
  140.  
  141. window.mini_map_tokens[id].x = x;
  142. window.mini_map_tokens[id].y = y;
  143. window.mini_map_tokens[id].size = size;
  144.  
  145. return true;
  146. } else {
  147. return false;
  148. }
  149. }
  150.  
  151. function miniMapUpdatePos(x, y) {
  152. window.mini_map_pos.text('x: ' + x.toFixed(0) + ', y: ' + y.toFixed(0));
  153. }
  154.  
  155. function miniMapReset() {
  156. cells = [];
  157. window.mini_map_tokens = [];
  158. }
  159.  
  160. function miniMapInit() {
  161. window.mini_map_tokens = [];
  162.  
  163. cells = [];
  164. current_cell_ids = [];
  165. start_x = -7000;
  166. start_y = -7000;
  167. end_x = 7000;
  168. end_y = 7000;
  169. length_x = 14000;
  170. length_y = 14000;
  171.  
  172. //Дерево мини-карты
  173. if ($('#mini-map-wrapper').length === 0){
  174. var wrapper = $('<div>').attr('id', 'mini-map-wrapper').css({position: 'fixed',zIndex: '1000',bottom: 10,right: 10,width: 160,height: 160});
  175.  
  176. //Скрываем недостатки
  177. $(".tosBox").hide();
  178. $(".agario-promo").hide();
  179. $("#mainPanel").find("hr").hide();
  180. $("#mainPanel").find("center").hide();
  181. //jQuery("body").append("<div style='width:300px;height:100px;position:fixed;left:10px;bottom:10px;border:1px solid black;background:#fff;' id='qqk'></div>");
  182.  
  183. var setka = $("<div id='setka' style='width:160px;height:160px;position:fixed;bottom:10px;right:10px;'><table width='100%' height='100%'><tr><td>A1</td><td>A2</td><td>A3</td><td>A4</td><td>A5</td><td>A6</td></tr><tr><td>B1</td><td>B2</td><td>B3</td><td>B4</td><td>B5</td><td>B6</td></tr><tr><td>C1</td><td>C2</td><td>C3</td><td>C4</td><td>C5</td><td>C6</td></tr><tr><td>D1</td><td>D2</td><td>D3</td><td>D4</td><td>D5</td><td>D6</td></tr><tr><td>E1</td><td>E2</td><td>E3</td><td>E4</td><td>E5</td><td>E6</td></tr><tr><td>F1</td><td>F2</td><td>F3</td><td>F4</td><td>F5</td><td>F6</td></tr></table></div>");
  184. setka.appendTo(document.body);
  185. $("#setka table").css({"borderSpacing":"0px","font":"normal 10px Arial","background": '#303030'});
  186. $("#setka table tr>td").css({"textAlign":"center","border":"1px solid #505050","color":"#707070"});
  187.  
  188.  
  189. var mini_map = $('<canvas>').attr({id: 'mini-map',width: 160,height: 160}).css({width: '100%',height: '100%',position: 'relative'});
  190. wrapper.append(mini_map).appendTo(document.body);
  191.  
  192. window.mini_map = mini_map[0];
  193. }
  194.  
  195. //Обработчик мини-карты
  196. if (render_timer === null)
  197. render_timer = setInterval(miniMapRender, 1000 / 10);
  198.  
  199. //Позиция мини-карты
  200. if ($('#mini-map-pos').length === 0) {
  201. window.mini_map_pos = $('<div>').attr('id', 'mini-map-pos').css({
  202. bottom: 10,
  203. right: 10,
  204. color: 'white',
  205. fontSize: 15,
  206. fontWeight: 800,
  207. position: 'fixed'
  208. }).appendTo(document.body);
  209. }
  210. }
  211.  
  212. // cell constructor
  213. function Cell(id, x, y, size, color, name) {
  214. cells[id] = this;
  215. this.id = id;
  216. this.ox = this.x = x;
  217. this.oy = this.y = y;
  218. this.oSize = this.size = size;
  219. this.color = color;
  220. this.points = [];
  221. this.pointsAcc = [];
  222. this.setName(name);
  223. }
  224.  
  225. Cell.prototype = {
  226. id: 0,
  227. points: null,
  228. pointsAcc: null,
  229. name: null,
  230. nameCache: null,
  231. sizeCache: null,
  232. x: 0,
  233. y: 0,
  234. size: 0,
  235. ox: 0,
  236. oy: 0,
  237. oSize: 0,
  238. nx: 0,
  239. ny: 0,
  240. nSize: 0,
  241. updateTime: 0,
  242. updateCode: 0,
  243. drawTime: 0,
  244. destroyed: false,
  245. isVirus: false,
  246. isAgitated: false,
  247. wasSimpleDrawing: true,
  248.  
  249. destroy: function() {
  250. delete cells[this.id];
  251. id = current_cell_ids.indexOf(this.id);
  252. -1 != id && current_cell_ids.splice(id, 1);
  253. this.destroyed = true;
  254. if (map_server === null || map_server.readyState !== window._WebSocket.OPEN){
  255. miniMapUnregisterToken(this.id);
  256. }
  257. },
  258. setName: function(name) {
  259. this.name = name;
  260. },
  261. updatePos: function() {
  262. if (map_server === null || map_server.readyState !== window._WebSocket.OPEN) {
  263. if (options.enableMultiCells || -1 != current_cell_ids.indexOf(this.id)) {
  264. if (!miniMapIsRegisteredToken(this.id))
  265. {
  266. miniMapRegisterToken(
  267. this.id,
  268. miniMapCreateToken(this.id, this.color)
  269. );
  270. }
  271.  
  272. var size_n = this.nSize/length_x;
  273. miniMapUpdateToken(this.id, (this.nx - start_x)/length_x, (this.ny - start_y)/length_y, size_n);
  274. }
  275. }
  276. /*
  277. if (options.enablePosition && -1 != current_cell_ids.indexOf(this.id)) {
  278. window.mini_map_pos.show();
  279. miniMapUpdatePos(this.nx, this.ny);
  280. } else {
  281. window.mini_map_pos.hide();
  282. }*/
  283.  
  284. }
  285. };
  286.  
  287. String.prototype.capitalize = function() {
  288. return this.charAt(0).toUpperCase() + this.slice(1);
  289. };
  290.  
  291. function camel2cap(str) {
  292. return str.replace(/([A-Z])/g, function(s){return ' ' + s.toLowerCase();}).capitalize();
  293. };
  294.  
  295. // create a linked property from slave object
  296. // whenever master[prop] update, slave[prop] update
  297. function refer(master, slave, prop) {
  298. Object.defineProperty(master, prop, {
  299. get: function(){
  300. return slave[prop];
  301. },
  302. set: function(val) {
  303. slave[prop] = val;
  304. },
  305. enumerable: true,
  306. configurable: true
  307. });
  308. };
  309.  
  310. // extract a websocket packet which contains the information of cells
  311. function extractCellPacket(data, offset) {
  312. ////
  313. var dataToSend = {
  314. destroyQueue : [],
  315. nodes : [],
  316. nonVisibleNodes : []
  317. };
  318. ////
  319.  
  320. var I = +new Date;
  321. var qa = false;
  322. var b = Math.random(), c = offset;
  323. var size = data.getUint16(c, true);
  324. c = c + 2;
  325.  
  326. // Nodes to be destroyed (killed)
  327. for (var e = 0; e < size; ++e) {
  328. var p = cells[data.getUint32(c, true)],
  329. f = cells[data.getUint32(c + 4, true)],
  330. c = c + 8;
  331. p && f && (
  332. f.destroy(),
  333. f.ox = f.x,
  334. f.oy = f.y,
  335. f.oSize = f.size,
  336. f.nx = p.x,
  337. f.ny = p.y,
  338. f.nSize = f.size,
  339. f.updateTime = I,
  340. dataToSend.destroyQueue.push(f.id));
  341.  
  342. }
  343.  
  344. // Nodes to be updated
  345. for (e = 0; ; ) {
  346. var d = data.getUint32(c, true);
  347. c += 4;
  348. if (0 == d) {
  349. break;
  350. }
  351. ++e;
  352. var p = data.getInt32(c, true),
  353. c = c + 4,
  354. f = data.getInt32(c, true),
  355. c = c + 4;
  356. g = data.getInt16(c, true);
  357. c = c + 2;
  358. for (var h = data.getUint8(c++), m = data.getUint8(c++), q = data.getUint8(c++), h = (h << 16 | m << 8 | q).toString(16); 6 > h.length; )
  359. h = "0" + h;
  360.  
  361. var h = "#" + h,
  362. k = data.getUint8(c++),
  363. m = !!(k & 1),
  364. q = !!(k & 16);
  365.  
  366. k & 2 && (c += 4);
  367. k & 4 && (c += 8);
  368. k & 8 && (c += 16);
  369.  
  370. for (var n, k = ""; ; ) {
  371. n = data.getUint16(c, true);
  372. c += 2;
  373. if (0 == n)
  374. break;
  375. k += String.fromCharCode(n)
  376. }
  377.  
  378. n = k;
  379. k = null;
  380.  
  381. var updated = false;
  382. // if d in cells then modify it, otherwise create a new cell
  383. cells.hasOwnProperty(d)
  384. ? (k = cells[d],
  385. k.updatePos(),
  386. k.ox = k.x,
  387. k.oy = k.y,
  388. k.oSize = k.size,
  389. k.color = h,
  390. updated = true)
  391. : (k = new Cell(d, p, f, g, h, n),
  392. k.pX = p,
  393. k.pY = f);
  394.  
  395. k.isVirus = m;
  396. k.isAgitated = q;
  397. k.nx = p;
  398. k.ny = f;
  399. k.nSize = g;
  400. k.updateCode = b;
  401. k.updateTime = I;
  402. n && k.setName(n);
  403.  
  404. // ignore food creation
  405. if (updated) {
  406. dataToSend.nodes.push({
  407. id: k.id,
  408. x: k.nx,
  409. y: k.ny,
  410. size: k.nSize,
  411. color: k.color
  412. });
  413. }
  414. }
  415.  
  416. // Destroy queue + nonvisible nodes
  417. b = data.getUint32(c, true);
  418. c += 4;
  419. for (e = 0; e < b; e++) {
  420. d = data.getUint32(c, true);
  421. c += 4, k = cells[d];
  422. null != k && k.destroy();
  423. dataToSend.nonVisibleNodes.push(d);
  424. }
  425.  
  426. var packet = {
  427. type: 16,
  428. data: dataToSend
  429. }
  430.  
  431. miniMapSendRawData(msgpack.pack(packet));
  432. }
  433.  
  434. // extract the type of packet and dispatch it to a corresponding extractor
  435. function extractPacket(event) {
  436. var c = 0;
  437. var data = new DataView(event.data);
  438. 240 == data.getUint8(c) && (c += 5);
  439. var opcode = data.getUint8(c);
  440. c++;
  441. switch (opcode) {
  442. case 16: // cells data
  443. extractCellPacket(data, c);
  444. break;
  445. case 20: // cleanup ids
  446. current_cell_ids = [];
  447. break;
  448. case 32: // cell id belongs me
  449. var id = data.getUint32(c, true);
  450.  
  451. if (current_cell_ids.indexOf(id) === -1)
  452. current_cell_ids.push(id);
  453.  
  454. miniMapSendRawData(msgpack.pack({
  455. type: 32,
  456. data: id
  457. }));
  458. break;
  459. case 64: // get borders
  460. start_x = data.getFloat64(c, !0), c += 8,
  461. start_y = data.getFloat64(c, !0), c += 8,
  462. end_x = data.getFloat64(c, !0), c += 8,
  463. end_y = data.getFloat64(c, !0), c += 8,
  464. center_x = (start_x + end_x) / 2,
  465. center_y = (start_y + end_y) / 2,
  466. length_x = Math.abs(start_x - end_x),
  467. length_y = Math.abs(start_y - end_y);
  468. }
  469. };
  470.  
  471. function extractSendPacket(data) {
  472. var view = new DataView(data);
  473. switch (view.getUint8(0, true)) {
  474. case 0:
  475. player_name = [];
  476. for (var i=1; i < data.byteLength; i+=2) {
  477. player_name.push(view.getUint16(i, true));
  478. }
  479.  
  480. miniMapSendRawData(msgpack.pack({
  481. type: 0,
  482. data: player_name
  483. }));
  484. break;
  485. }
  486. }
  487.  
  488. // the injected point, overwriting the WebSocket constructor
  489. window.WebSocket = function(url, protocols) {
  490. console.log('Listen');
  491.  
  492. if (protocols === undefined) {
  493. protocols = [];
  494. }
  495.  
  496. var ws = new _WebSocket(url, protocols);
  497.  
  498. refer(this, ws, 'binaryType');
  499. refer(this, ws, 'bufferedAmount');
  500. refer(this, ws, 'extensions');
  501. refer(this, ws, 'protocol');
  502. refer(this, ws, 'readyState');
  503. refer(this, ws, 'url');
  504.  
  505. this.send = function(data){
  506. extractSendPacket(data);
  507. return ws.send.call(ws, data);
  508. };
  509.  
  510. this.close = function(){
  511. return ws.close.call(ws);
  512. };
  513.  
  514. this.onopen = function(event){};
  515. this.onclose = function(event){};
  516. this.onerror = function(event){};
  517. this.onmessage = function(event){};
  518.  
  519. ws.onopen = function(event) {
  520. miniMapInit();
  521. agar_server = url;
  522. miniMapSendRawData(msgpack.pack({
  523. type: 100,
  524. data: {url: url, region: $('#region').val(), gamemode: $('#gamemode').val(), party: location.hash}
  525. }));
  526. if (this.onopen)
  527. return this.onopen.call(ws, event);
  528. }.bind(this);
  529.  
  530. ws.onmessage = function(event) {
  531. extractPacket(event);
  532. if (this.onmessage)
  533. return this.onmessage.call(ws, event);
  534. }.bind(this);
  535.  
  536. ws.onclose = function(event) {
  537. if (this.onclose)
  538. return this.onclose.call(ws, event);
  539. }.bind(this);
  540.  
  541. ws.onerror = function(event) {
  542. if (this.onerror)
  543. return this.onerror.call(ws, event);
  544. }.bind(this);
  545. };
  546.  
  547. window.WebSocket.prototype = _WebSocket;
  548.  
  549. $(window.document).ready(function() {
  550. miniMapInit();
  551. });
  552.  
  553. $(window).load(function() {
  554. var main_canvas = document.getElementById('canvas');
  555. if (main_canvas && main_canvas.onmousemove) {
  556. document.onmousemove = main_canvas.onmousemove;
  557. main_canvas.onmousemove = null;
  558. }
  559. });
  560. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement