// ==UserScript== // @name agar-mini-map // @namespace http://github.com/dimotsai/ // @version 0.48 // @description This script will show a mini map and your location on agar.io // @author dimotsai // @license MIT // @match http://agar.io/* // @require http://cdn.jsdelivr.net/msgpack/1.05/msgpack.js // @grant none // @run-at document-body // ==/UserScript== window.msgpack = this.msgpack; (function() { var _WebSocket = window._WebSocket = window.WebSocket; var $ = window.jQuery; var msgpack = window.msgpack; var options = { enableMultiCells: true, enablePosition: true, enableAxes: false, enableCross: true, enableUniqueCellColor: true }; // game states var agar_server = null; var map_server = null; var player_name = []; var players = []; var id_players = []; var cells = []; var current_cell_ids = []; var start_x = -7000, start_y = -7000, end_x = 7000, end_y = 7000, length_x = 14000, length_y = 14000; var render_timer = null; var last_server = null; function miniMapSendRawData(data) { if (map_server !== null && map_server.readyState === window._WebSocket.OPEN) { var array = new Uint8Array(data); map_server.send(array.buffer); } } function miniMapConnectToServer(address, onOpen, onClose) { try { var ws = new window._WebSocket(address); document.cookie = "agar-mini-map-server=" + address; } catch (ex) { onClose(); console.error(ex); return false; } ws.binaryType = "arraybuffer"; ws.onopen = function() { onOpen(); console.log(address + ' connected'); } ws.onmessage = function(event) { var buffer = new Uint8Array(event.data); var packet = msgpack.unpack(buffer); switch(packet.type) { case 128: for (var i=0; i < packet.data.addition.length; ++i) { var cell = packet.data.addition[i]; if (! miniMapIsRegisteredToken(cell.id)) { miniMapRegisterToken( cell.id, miniMapCreateToken(cell.id, cell.color) ); } var size_n = cell.size/length_x; miniMapUpdateToken(cell.id, (cell.x - start_x)/length_x, (cell.y - start_y)/length_y, size_n); } for (var i=0; i < packet.data.deletion.length; ++i) { var id = packet.data.deletion[i]; miniMapUnregisterToken(id); } break; case 129: players = packet.data; for (var p in players) { var player = players[p]; var ids = player.ids; for (var i in ids) { id_players[ids[i]] = player.no; } } mini_map_party.trigger('update-list'); break; case 130: if (agar_server != packet.data.url) { var region_name = $('#region > option[value="' + packet.data.region + '"]').text(); var gamemode_name = $('#gamemode > option[value="' + packet.data.gamemode + '"]').text(); var title = 'Agar Server Mismatched'; var content = ('You are now at: ' + agar_server + '
Your team members are all at: ' + packet.data.url + ', ' + region_name + ':' + gamemode_name + packet.data.party + '.
The minimap server has disconnected automatically.'); $('#mini-map-connect-btn').popover('destroy').popover({ animation: false, placement: 'top', title: title, content: content, container: document.body, html: true }).popover('show'); } else { $('#mini-map-content-btn').popover('hide'); } break; } } ws.onerror = function() { onClose(); console.error('failed to connect to map server'); } ws.onclose = function() { onClose(); map_server = null; console.log('map server disconnected'); } map_server = ws; } function miniMapRender() { var canvas = window.mini_map; var ctx = canvas.getContext('2d'); ctx.clearRect(0, 0, canvas.width, canvas.height); for (var id in window.mini_map_tokens) { var token = window.mini_map_tokens[id]; var x = token.x * canvas.width; var y = token.y * canvas.height; var size = token.size * canvas.width; var myColor = null; var isMyCell = false; if (options.enableUniqueCellColor) { if (window.darkThemeCheckBox.checked) { myColor = "white"; } else { myColor = "black"; } } else { myColor = token.color; } if (options.enableCross && -1 != current_cell_ids.indexOf(token.id)) { miniMapDrawCross(token.x, token.y, myColor); isMyCell = true; } if (options.enableAxes && -1 != current_cell_ids.indexOf(token.id)) miniMapDrawMiddleCross() if (id_players[id] !== undefined) { // Draw you party member's crosshair if (options.enableCross && !isMyCell) { miniMapDrawCross(token.x, token.y, token.color); } ctx.font = size * 2 + 'px Arial'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillStyle = 'white'; ctx.fillText(id_players[id] + 1, x, y); } ctx.beginPath(); ctx.arc( x, y, size, 0, 2 * Math.PI, false ); ctx.closePath(); if (isMyCell) { ctx.fillStyle = myColor; } else { ctx.fillStyle = token.color; } ctx.fill(); }; } function miniMapDrawCross(x, y, color) { var canvas = window.mini_map; var ctx = canvas.getContext('2d'); ctx.lineWidth = 0.5; ctx.beginPath(); ctx.moveTo(0, y * canvas.height); ctx.lineTo(canvas.width, y * canvas.height); ctx.moveTo(x * canvas.width, 0); ctx.lineTo(x * canvas.width, canvas.height); ctx.closePath(); ctx.strokeStyle = color || '#FFFFFF'; ctx.stroke(); } function miniMapDrawMiddleCross() { var canvas = window.mini_map; var ctx = canvas.getContext('2d'); ctx.lineWidth = 0.5; ctx.beginPath(); ctx.moveTo(0, canvas.height/2); ctx.lineTo(canvas.width, canvas.height/2); ctx.moveTo(canvas.width/2, 0); ctx.lineTo(canvas.width/2, canvas.height); ctx.closePath(); ctx.strokeStyle = '#000000'; ctx.stroke(); } function miniMapCreateToken(id, color) { var mini_map_token = { id: id, color: color, x: 0, y: 0, size: 0 }; return mini_map_token; } function miniMapRegisterToken(id, token) { if (window.mini_map_tokens[id] === undefined) { // window.mini_map.append(token); window.mini_map_tokens[id] = token; } } function miniMapUnregisterToken(id) { if (window.mini_map_tokens[id] !== undefined) { // window.mini_map_tokens[id].detach(); delete window.mini_map_tokens[id]; } } function miniMapIsRegisteredToken(id) { return window.mini_map_tokens[id] !== undefined; } function miniMapUpdateToken(id, x, y, size) { if (window.mini_map_tokens[id] !== undefined) { window.mini_map_tokens[id].x = x; window.mini_map_tokens[id].y = y; window.mini_map_tokens[id].size = size; return true; } else { return false; } } function miniMapUpdatePos(x, y) { window.mini_map_pos.text('x: ' + x.toFixed(0) + ', y: ' + y.toFixed(0)); } function miniMapReset() { cells = []; window.mini_map_tokens = []; } function miniMapInit() { window.mini_map_tokens = []; cells = []; current_cell_ids = []; start_x = -7000; start_y = -7000; end_x = 7000; end_y = 7000; length_x = 14000; length_y = 14000; // get last used map server address from cookie if existent var cookies = document.cookie.replace(/ /g,'').split(";"); for (var i=0; i').attr('id', 'mini-map-wrapper').css({ position: 'fixed', bottom: 10, right: 10, width: 300, height: 300, background: 'rgba(128, 128, 128, 0.58)' }); var mini_map = $('').attr({ id: 'mini-map', width: 300, height: 300 }).css({ width: '100%', height: '100%', position: 'relative' }); wrapper.append(mini_map).appendTo(document.body); window.mini_map = mini_map[0]; } // minimap renderer if (render_timer === null) render_timer = setInterval(miniMapRender, 1000 / 30); // minimap location if ($('#mini-map-pos').length === 0) { window.mini_map_pos = $('
').attr('id', 'mini-map-pos').css({ bottom: 10, right: 10, color: 'white', fontSize: 15, fontWeight: 800, position: 'fixed' }).appendTo(document.body); } // dark theme checkbox window.darkThemeCheckBox = $('[data-itr=option_dark_theme]').parent().children('input')[0]; // minimap options if ($('#mini-map-options').length === 0) { window.mini_map_options = $('
').attr('id', 'mini-map-options').css({ bottom: 315, right: 10, color: '#666', fontSize: 14, position: 'fixed', fontWeight: 400, zIndex: 1000 }).appendTo(document.body); var container = $('
') .css({ background: 'rgba(200, 200, 200, 0.58)', padding: 5, borderRadius: 5 }) .hide(); for (var name in options) { var label = $('