cursors.io hack

cursorsio hack - vnx and new hack in description

// ==UserScript==
// @name         cursors.io hack 
// @namespace    VNXS
// @version      1.4.1
// @description  cursorsio hack - vnx and new hack in description
// @author       VNXS
// @match        http://cursors.io/
// @grant        none
// @run-at       document-idle
// ==/UserScript==
 
var cps=100,
    spamClicking = !1;
function init(view, value, attr) {
    function Class() {
        attr.x = view.getUint16(value, true);
        value += 2;
        attr.y = view.getUint16(value, true);
        value += 2;
        attr.width = view.getUint16(value, true);
        value += 2;
        attr.height = view.getUint16(value, true);
        value += 2;
    }
 
    function done() {
        var color = view.getUint32(value, true).toString(16);
        for (; 6 > color.length;) {
            color = "0" + color;
        }
        value += 4;
        attr.color = "#" + color;
    }
    var name = view.getUint8(value);
    value += 1;
    attr.type = name;
    switch (name) {
        case 255:
            break;
        case 0:
            attr.x = view.getUint16(value, true);
            value += 2;
            attr.y = view.getUint16(value, true);
            value += 2;
            attr.size = view.getUint8(value);
            value += 1;
            attr.isCentered = !!view.getUint8(value);
            value += 1;
            name = read(view, value);
            attr.text = name[0];
            value = name[1];
            break;
        case 1:
            Class();
            var py = !attr.color;
            done();
            break;
            name = attr.x | 0;
            var y = attr.y | 0;
            var version = attr.width | 0;
            var h = attr.height | 0;
            if (py) {
                py = y;
                for (; py < y + h; ++py) {
                    var info = name;
                    for (; info < name + version; ++info) {
                        ++tmp[info + 400 * py];
                    }
                }
            }
            break;
        case 2:
            Class();
            attr.isBad = !!view.getUint8(value);
            value += 1;
            break;
        case 3:
            Class();
            attr.count = view.getUint16(value, true);
            value += 2;
            done();
            break;
        case 4:
            Class();
            attr.count = view.getUint16(value, true);
            value += 2;
            done();
            break;
        default:
            throw Error("Unknown object type " + name);;
    }
    return value;
}
 
function read(view, offset) {
    var optsData = "";
    var lo = 0;
    var chunk = 0;
    for (; 0 != (chunk = view.getUint8(offset)); ++offset) {
        lo <<= 8;
        lo |= chunk;
        if (!(chunk & 128)) {
            optsData += String.fromCharCode(lo);
            lo = 0;
        }
    }
    if (0 != lo) {
        optsData += String.fromCharCode(lo);
    }
    return [optsData, offset + 1];
}
 
function proc(data) {
    var view = new DataView(data.buffer),
        v, index, parts, x;
    if (view.getUint8(0) == 1) {
        var push = function(view, element) {
            return element + 2 + 4 * view.getUint16(element, true)
        };
        index = view.getUint16(1, true);
        index = push(view, 3 + 8 * index);
        v = view.getUint16(index, true);
        index += 2;
        parts = 0;
        for (; parts < v; parts++) {
            x = view.getUint32(index, true);
            item = 0;
            a: for (; item < items.length; item++) {
                if (items[item].id == x) {
                    items.splice(item, 1);
                    break a;
                }
            }
            index += 4;
        }
        v = view.getUint16(index, true);
        index += 2;
        parts = 0;
        for (; parts < v; parts++) {
            a: {
                item = view.getUint32(index, true);x = 0;
                for (; x < items.length; x++) {
                    if (items[x].id == item) {
                        item = items[x];
                        break a;
                    }
                }
                item = {
                    id: item
                };items.push(item);
            }
            index += 4;index = init(view, index, item);
        }
        return;
    }
    items = [];
    head = [view.getUint16(1, true), view.getUint16(3, true)];
    v = view.getUint16(5, true);
    index = 7;
    parts = 0;
    for (; parts < v; parts++) {
        item = {};
        item.id = view.getUint32(index, true);
        index += 4;
        index = init(view, index, item);
        if (item.x > 0) item.x--, item.width++;
        if (item.y > 0) item.y--, item.height++;
        if (item.x + item.width < 400) item.width++;
        if (item.y + item.height < 300) item.height++;
        items.push(item);
    }
}
 
var avoidGreenArea = false
function dos(head) { // Pathfinder
    var gridX = 400,
        gridY = 300;
    var grid = [];
    visit = [];
    for (var i = 0; i < gridY; i++) {
        grid[i] = [];
        visit[i] = [];
        for (var j = 0; j < gridX; j++) grid[i][j] = 0, visit[i][j] = 0;
    }
    items.forEach(function(d) {
        if ((d.type == 1) || (d.type == 2 && (d.isBad || avoidGreenArea)))
            for (var j = 0; j < d.height; j++) {
                if (d.y+j<=299) for (var i = 0; i < d.width; i++) {
                    if (d.x+i<=399) grid[d.y + j][d.x + i] = 3
                }
            }
    });
    var bfs = [head],
        bfs2 = [];
    while (bfs.length) {
        bfs.forEach(function(dat) {
            var x = dat[0],
                y = dat[1];
            if (grid[y][x] == 3) return;
            grid[y][x] = 3;
            for (var X = x + 1; X < gridX && !(grid[y][X] & 1); X++) {
                grid[y][X] |= 1;
                if (!visit[y][X]) {
                    visit[y][X] = [x, y], bfs2.push([X, y]);
                }
            }
            for (var X = x - 1; X >= 0 && !(grid[y][X] & 1); X--) {
                grid[y][X] |= 1;
                if (!visit[y][X]) {
                    visit[y][X] = [x, y], bfs2.push([X, y]);
                }
            }
            for (var Y = y + 1; Y < gridY && !(grid[Y][x] & 2); Y++) {
                grid[Y][x] |= 2;
                if (!visit[Y][x]) {
                    visit[Y][x] = [x, y], bfs2.push([x, Y]);
                }
            }
            for (var Y = y - 1; Y >= 0 && !(grid[Y][x] & 2); Y--) {
                grid[Y][x] |= 2;
                if (!visit[Y][x]) {
                    visit[Y][x] = [x, y], bfs2.push([x, Y]);
                }
            }
        });
        bfs = bfs2;
        bfs2 = [];
    }
}
var tmp = WebSocket.prototype.send;
WebSocket.prototype.send = function(x) {
    WebSocket.prototype.send = tmp;
    tmp = this;
    this.send = function() {};
    var t2 = this.onmessage;
    this.onmessage = function(x) {
        var msg = new Uint8Array(x.data);
        if (msg[0] == 1 || msg[0] == 4) {
            proc(msg);
        }
        return t2.call(this, x)
    }
}
var ff = navigator.userAgent.indexOf("Chrome") == -1;
var num_1 = prompt('1/2 WebSocket Location (where to connect. only change if you know what you\'re doing)', 'ws://104.248.73.48:2828'),
    num_2 = 0,
    num_3 = 1 * prompt('2/2 WebSocket Total (how many bots. only change if you know what you\'re doing.', 2);
console.log(num_1);
var pool = [],
    cursors = [];
if (!isNaN(parseInt(num_3))) {
    alert('Result: Valid WebSocket total. Connecting bots...');
} else alert('Result: Invalid WebSocket total.');
if (!isNaN(parseInt(num_3))) {
    for (var i = 0; i < num_3; i++) {
        pool.push(new WebSocket(`${num_1}`)); // websocket
    }
    pool[num_3-1].onopen = function(x){alert('Result: All bots have been successfully connected.')};
}
var position = [];
canvas.onclick = function(e) {
    var xy = [(e.layerX - (ff ? canvas.offsetLeft : 0)) / 2 | 0, (e.layerY - (ff ? canvas.offsetTop : 0)) / 2 | 0];
    position = [(e.layerX - (ff ? canvas.offsetLeft : 0)) / 2 | 0, (e.layerY - (ff ? canvas.offsetTop : 0)) / 2 | 0];
    var mov = [];
    if (e.altKey) {
        if (cursors.length < 1) return;
        for (ii=0;ii<cursors.length;ii++) {
            pool.push(cursors.shift());
        }
       return;
    }
    if (window["items"] && !(xy[0] == head[0] && xy[1] == head[1]) && !e.ctrlKey) {
        dos(head);
        var xy2 = xy.slice(0);
        while (visit[xy2[1]][xy2[0]]) {
            mov.push(xy2);
            xy2 = visit[xy2[1]][xy2[0]]
        }
        mov = mov.reverse();
    } else mov.push(xy);
    if (mov.length == 0) {
        return;
    }
    if (!e.shiftKey) {
        head = xy;
        pool.forEach(function(x) {
            move(x, mov)
        });
        move(tmp, mov);
        var buf = new ArrayBuffer(9),
            q = new DataView(buf);
        q.setUint8(0, 2, 1);
        q.setUint16(1, xy[0], 1);
        q.setUint16(3, xy[1], 1);
        q.setInt32(5, -1, 1);
        return;
    }
    var buf = new ArrayBuffer(9),
        q = new DataView(buf);
    q.setUint8(0, 2, 1);
    q.setUint16(1, xy[0], 1);
    q.setUint16(3, xy[1], 1);
    q.setInt32(5, -1, 1);
    cursors.push(pool.pop());
    cursors[cursors.length - 1].click = buf;
    move(cursors[cursors.length - 1], mov);
}
 
var fontSize = 2;
var letterOffset = 0;
var alphabet = new Array(200);
var mainCursorWriting = true;
var botWriting = true;
var fontType = 'basic';
alphabet[58]=[[0,0,0,1],[2,0,2,1]],alphabet[40]=[[0,2,1,0],[2,2,1,0]],alphabet[41]=[[0,0,1,2],[2,0,1,2]],alphabet[63]=[[1,0,0,0],[0,0,0,2],[0,2,1,2],[1,2,1,1],[1,1,2,1]],alphabet[97]=[[2,0,0,0],[0,0,0,2],[0,2,2,2],[1,0,1,2]],alphabet[98]=[[2,0,0,0],[0,0,0,2],[0,2,2,2],[2,2,2,0],[1,0,1,2]],alphabet[99]=[[2,2,2,0],[2,0,0,0],[0,0,0,2]],alphabet[100]=[[2,0,0,0],[0,0,0,1],[0,1,1,2],[1,2,2,1],[2,1,2,0]],alphabet[101]=[[2,2,2,0],[2,0,0,0],[0,0,0,2],[1,0,1,2]],alphabet[102]=[[2,0,0,0],[0,0,0,2],[1,0,1,2]],alphabet[103]=[[1,1,1,2],[1,2,2,2],[2,2,2,0],[2,0,0,0],[0,0,0,2]],alphabet[104]=[[0,0,2,0],[0,2,2,2],[1,0,1,2]],alphabet[105]=[[0,0,0,2],[0,1,2,1],[2,0,2,2]],alphabet[106]=[[0,0,0,2],[0,1,2,1],[2,0,2,1]],alphabet[107]=[[0,0,2,0],[1,0,0,2],[1,0,2,2]],alphabet[108]=[[0,0,2,0],[2,0,2,2]],alphabet[109]=[[0,0,2,0],[0,0,2,1],[2,1,0,2],[0,2,2,2]],alphabet[110]=[[0,0,2,0],[0,0,2,2],[0,2,2,2]],alphabet[111]=[[2,0,0,0],[0,0,0,2],[0,2,2,2],[2,2,2,0]],alphabet[112]=[[2,0,0,0],[0,0,0,2],[0,2,1,2],[1,2,1,0]],alphabet[113]=[[2,0,0,0],[0,0,0,2],[0,2,2,2],[2,2,2,0],[1,1,2,2]],alphabet[114]=[[2,0,0,0],[0,0,0,2],[0,2,1,2],[1,2,1,0],[1,1,2,2]],alphabet[115]=[[0,0,0,2],[1,0,1,2],[2,0,2,2],[0,0,1,0],[1,2,2,2]],alphabet[116]=[[0,0,0,2],[0,1,2,1]],alphabet[117]=[[0,0,2,0],[0,2,2,2],[2,0,2,2]],alphabet[118]=[[0,0,2,1],[0,2,2,1]],alphabet[119]=[[0,0,2,0],[0,2,2,2],[2,0,1,1],[2,2,1,1]],alphabet[120]=[[0,0,2,2],[2,0,0,2]],alphabet[121]=[[0,0,1,1],[0,2,1,1],[1,1,2,1]],alphabet[122]=[[0,0,0,2],[0,2,2,0],[2,0,2,2]],alphabet[48]=[[0,0,2,0],[2,0,2,2],[2,2,0,2],[0,2,0,0]],alphabet[49]=[[0,0,0,1],[0,1,2,1],[2,0,2,2]],alphabet[50]=[[0,0,0,2],[0,2,1,2],[1,2,1,0],[1,0,2,0],[2,0,2,2]],alphabet[51]=[[0,0,0,2],[0,2,2,2],[2,2,2,0],[1,0,1,2]],alphabet[52]=[[0,0,1,0],[1,0,1,2],[0,2,2,2]],alphabet[53]=[[0,2,0,0],[0,0,1,0],[1,0,1,2],[1,2,2,2],[2,2,2,0]],alphabet[54]=[[0,2,0,0],[0,0,2,0],[2,0,2,2],[2,2,1,2],[1,2,1,0]],alphabet[55]=[[0,0,0,2],[0,2,2,2],[1,1,1,2]],alphabet[56]=[[0,0,2,0],[2,0,2,2],[2,2,0,2],[0,2,0,0],[1,0,1,2]],alphabet[57]=[[2,0,2,2],[2,2,0,2],[0,2,0,0],[0,0,1,0],[1,0,1,2]];
var message = '';
var moveMethod = 1;
function hkd(z) {
    console.log(z);
    switch(z.keyCode) {
        case 8:
        if (message.length <= 0) return;
            z.preventDefault();
            message = message.substring(0, message.length - 1);
            break;
    }
 
    // numpad keys
    switch (z.code) {
        case 'Numpad0':
            spamClicking=!spamClicking
            break;
        case 'Numpad1':
            moveMethod=1;
            break;
        case 'Numpad2':
            moveMethod=2;
            break;
        case 'Numpad3':
            moveMethod=3;
            break;
    }
 
}
 
function hkp(e) {
    if ((e.keyCode >= 39 && e.keyCode <= 41) ||
         e.keyCode == 44 || e.keyCode == 46 ||
        (e.keyCode >= 48 && e.keyCode <= 59 && e.location == 0) ||
        (e.keyCode >= 65 && e.keyCode <= 90) ||
        (e.keyCode >= 97 && e.keyCode <= 122) ||
         e.keyCode == 32 || e.keyCode == 63) {
        message = message.concat(String.fromCharCode(e.keyCode));
        return;
    }
    switch(e.keyCode) {
        case 13:
            drawWord(message.toLowerCase(), head[0], head[1]);
            message = "";
            e.preventDefault();
            break;    
        default:
            return;
    }
}
 
var j=0;
function drawLetter(a, x, y) {
    var letter = alphabet[a];
 
    if (letter == null)
        return;
 
    var g = new ArrayBuffer(9),
        e = new DataView(g);
 
    for (var i = 0; i < letter.length; i++) {
        e.setUint8(0, 3);
        e.setUint16(1, x+alphabet[a][i][1]*fontSize, !0);
        e.setUint16(3, y+alphabet[a][i][0]*fontSize, !0);
        e.setUint16(5, x+alphabet[a][i][3]*fontSize, !0);
        e.setUint16(7, y+alphabet[a][i][2]*fontSize, !0);
        if (mainCursorWriting) {
            if (j==0) WebSocket.prototype.send.call(tmp, g);
            else if (botWriting) WebSocket.prototype.send.call(pool[j-1], g);
            else WebSocket.prototype.send.call(tmp, g);
        } else if (botWriting) {
            if (j!=0) WebSocket.prototype.send.call(pool[j-1], g);
            else if (mainCursorWriting) WebSocket.prototype.send.call(tmp, g);
            else WebSocket.prototype.send.call(pool[j-1], g);
        }
        j++;
        if (j>=(botWriting?pool.length:0)+(mainCursorWriting?1:0)) j=0;
    }
}
 
var timeout = 70,
    wordIndex = 0;
function drawWord(s, x, y) {
    setTimeout(function () {
        drawLetter(s.charCodeAt(0), x, y);
        wordIndex++;
        if (s.length > 0)
            drawWord(s.substring(1, s.length), x+fontSize*3, y);
        else {
            wordIndex = 0;
            letterOffset = 0;
        }
    }, timeout);
}
 
document.onkeydown = hkd;
document.onkeypress = hkp;
 
var pathfinderDelay = 0;
function move(x, mov, type = moveMethod, i = 0) {
    if (x.readyState != 1) return;
    if (i == 0 && x) x.rdy = 0;
    var buf = new ArrayBuffer(type==3?13:9),
        q = new DataView(buf);
    q.setUint8(0, type, 1);
    if (type!==3 && i<mov.length) {
        q.setUint16(1, mov[i][0], 1);
        q.setUint16(3, mov[i][1], 1);
        q.setInt32(5, -1, 1);
    }
    WebSocket.prototype.send.call(x, buf);
    if (pathfinderDelay === 0) {
        if (type!==3)for (i=0; i<mov.length;) {
            if (x.readyState != 1) break;
            if (i == 0 && x) x.rdy = 0;
            q.setUint16(1, mov[i][0], 1);
            q.setUint16(3, mov[i][1], 1);
            WebSocket.prototype.send.call(x, buf);
            i++;
        }
        q.setUint8(0, 2, 1),
        q.setUint16(1, mov[mov.length-1][0], 1);
        q.setUint16(3, mov[mov.length-1][1], 1),
        q.setInt32(5, -1, 1);
        WebSocket.prototype.send.call(x, buf);
        if (x) x.rdy = 1;
    } else {
        setTimeout(function(){
            move(x, mov, type, i+1);
        }, pathfinderDelay)
    }
    x.rdy = 1;
}
 
function returnAllBots() {
    for (var i=0; i<cursors.length;) {
        pool.push(cursors.shift());
    }
}
 
var disconnected = 0,
    connected = 0,
    disconnecting = 0,
    connecting = 0;
 
function lop2() {
    setInterval(function() {
        disconnecting = 0, connecting = 0;
        for (var i=0;i<pool.length;) {
            if (pool[i].readyState == 1) {
                connecting++;
            } else if (pool[i].readyState == 2 || pool[i].readyState == 3) {
                disconnecting++;
            }; i++;
        }; for (var i=0; i<cursors.length;) {
            if (cursors[i].readyState == 1) {
                connecting++;
            } else if (cursors[i].readyState == 2 || cursors[i].readyState == 3) {
                disconnecting++;
            }; i++;
        }
    connected = connecting,
    disconnected = disconnecting;
    }, 200);
}; lop2();
var lop = setInterval(function() {
    cursors.forEach(function(x) { // when you deploy a minion.
        if (x) { // prevents error spam
            if (x.rdy) { // if the bot has connected
                x.send(x.click);
            }
        }
    });
}, 1000 / cps);
 
setInterval(function() { // spam clicking/moving :D (new wall hack i guess) // doesn't work so far sry
    pool.forEach(function(x) {
        if (x && x.rdy && !!spamClicking) {
            move(x, [head[0],head[1]], 2);
        }
    })
}, 1000 / cps);
 
var darkTheme = true;
document.body.style.cssText = "transition:1s;background-color:#000000;"
canvas.style.backgroundColor = "#ffffff";
noCursorLock.style.display = 'none';
noCursorLock.checked = true;
noDrawings.style.display = 'none';
noCursorLock.parentElement.style.display = 'none';
noDrawings.parentElement.style.display = 'none';
var elementdisplay = document.createElement("CANVAS");
document.body.appendChild(elementdisplay);
var moreScripts = document.getElementsByTagName('a')[0];
moreScripts.href = '';
moreScripts.style.display = 'none';
var advertisement = document.getElementsByTagName('div')[4];
advertisement.style.display = 'none';
var outline = document.getElementsByTagName('div')[1];
outline.style.border = '5px solid #000000';
outline.style.borderStyle = 'collapse';
outline.style.margin = '20px auto 0px';
var outline2 = document.getElementsByTagName('div')[3];
outline2.style.fontSize = '0px';
outline2.style.transition = '1s';
var display = document.getElementsByTagName('canvas')[1];
display.style.cssText = "background-color:#ffffff;width:800px;margin-left:calc(50% - 405px);margin-right:calc(50% - 405px);margin-top:0px;height:192px;border:5px solid #000000;border-style:collapse;";
var dpl = display.getContext('2d');
display.width = 800,
display.height = 192;
dpl.font = '12px NovaSquare';
dpl.lineWidth = 2.5;
display.onmousemove = function(e) { // for like buttons and stuff
    var xy = [(e.layerX - (ff ? canvas.offsetLeft : 0)) | 0, (e.layerY - (ff ? canvas.offsetTop : 0)) | 0];
    if ((xy[0] >= 249 && xy[0] <= 266) && (xy[1] >= 65 && xy[1] <= 80)) { // decrease pathfinder delay
        display.style.cursor = 'pointer';
    } else if ((xy[0] >= 302 && xy[0] <= 318) && (xy[1] >= 65 && xy[1] <= 80)) { // increase pathfinder delay
        display.style.cursor = 'pointer';
    } else if ((xy[0] >= 10 && xy[0] <= 133) && (xy[1] >= 122 && xy[1] <= 136)) { // return all bots
        display.style.cursor = 'pointer';
    } else if ((xy[0] >= 450 && xy[0] <= 468) && (xy[1] >= 95 && xy[1] <= 107)) { // decrease text delay
        display.style.cursor = 'pointer';
    } else if ((xy[0] >= 514 && xy[0] <= 532) && (xy[1] >= 95 && xy[1] <= 107)) { // increase text delay
        display.style.cursor = 'pointer';
    } else if ((xy[0] >= 609 && xy[0] <= 701) && (xy[1] >= 82 && xy[1] <= 97)) { // toggle dark theme
        display.style.cursor = 'pointer';
    } else if ((xy[0] >= 279 && xy[0] <= 326) && (xy[1] >= 82 && xy[1] <= 97)) { // toggle pathfinder mode
        display.style.cursor = 'pointer';
    } else if ((xy[0] >= 280 && xy[0] <= 316) && (xy[1] >= 97 && xy[1] <= 107)) { // toggle avoid exits
        display.style.cursor = 'pointer';
    } else display.style.cursor = 'auto';
}
 
display.onmousedown = function(e) { // for like buttons and stuff
    var xy = [(e.layerX - (ff ? canvas.offsetLeft : 0)) | 0, (e.layerY - (ff ? canvas.offsetTop : 0)) | 0];
    if ((xy[0] >= 249 && xy[0] <= 266) && (xy[1] >= 65 && xy[1] <= 80)) { // decrease pathfinder delay
        display.style.cursor = 'pointer';
        pathfinderDelay -= 5;
        if (pathfinderDelay < 0) pathfinderDelay = 0;
    } else if ((xy[0] >= 302 && xy[0] <= 318) && (xy[1] >= 65 && xy[1] <= 80)) { // increase pathfinder delay
        display.style.cursor = 'pointer';
        pathfinderDelay += 5;
        if (pathfinderDelay > 250) pathfinderDelay = 250;
    } else if ((xy[0] >= 10 && xy[0] <= 133) && (xy[1] >= 122 && xy[1] <= 136)) { // return all bots
        display.style.cursor = 'pointer';
        returnAllBots();
    } else if ((xy[0] >= 450 && xy[0] <= 468) && (xy[1] >= 95 && xy[1] <= 107)) { // decrease text delay
        display.style.cursor = 'pointer';
        timeout -= 10;
        if (timeout < 25) timeout = 25;
    } else if ((xy[0] >= 514 && xy[0] <= 532) && (xy[1] >= 95 && xy[1] <= 107)) { // increase text delay
        display.style.cursor = 'pointer';
        timeout += 10;
        if (timeout > 750) timeout = 750;
    } else if ((xy[0] >= 609 && xy[0] <= 701) && (xy[1] >= 82 && xy[1] <= 93)) { // toggle dark theme
        display.style.cursor = 'pointer';
        darkTheme=!darkTheme;
        if (darkTheme == false) {
            document.body.style.backgroundColor = '#ffffff';
        }
        else if (darkTheme == true) {
            document.body.style.backgroundColor = '#000000';
        }
    } else if ((xy[0] >= 279 && xy[0] <= 326) && (xy[1] >= 82 && xy[1] <= 93)) { // toggle pathfinder mode
        display.style.cursor = 'pointer';
        moveMethod==2?moveMethod=1:moveMethod=2;
    } else if ((xy[0] >= 280 && xy[0] <= 316) && (xy[1] >= 95 && xy[1] <= 107)) { // toggle avoid exits
        display.style.cursor = 'pointer';
        avoidGreenArea=!avoidGreenArea
    } else display.style.cursor = 'auto';
}
function updateDisplay() {
    dpl.save();
    dpl.clearRect(0,0,800,192);
 
    // message display
    dpl.lineWidth = 2.5;
    dpl.font = '18px NovaSquare';
    dpl.fillStyle = '#ffffff';
    dpl.globalAlpha = 0.5;
    dpl.strokeText('Message: '+message,10,28);
    dpl.strokeRect(5,38,790,2.5);
    dpl.globalAlpha = 1;
    dpl.fillText('Message: '+message,10,28);
    dpl.fillRect(5,38,790,2.5);
 
    // title display
    dpl.font = '16px NovaSquare';
    dpl.globalAlpha = 0.5;
    dpl.strokeText('Bots',10,58);
    dpl.strokeText('Pathfinder',210,58);
    dpl.strokeText('Text',410,58);
    dpl.strokeText('Miscellanious',610,58);
    dpl.globalAlpha = 1;
    dpl.fillText('Bots',10,58);
    dpl.fillText('Pathfinder',210,58);
    dpl.fillText('Text',410,58);
    dpl.fillText('Miscellanious',610,58);
 
    // bots display
    dpl.font = '12px NovaSquare';
    dpl.globalAlpha = 0.5;
    dpl.strokeText('Ready: '+pool.length,10,78);
    dpl.strokeText('Deployed: '+cursors.length,10,92);
    dpl.strokeText('Disconnected: '+disconnected,10,106);
    dpl.strokeText('Connected: '+connected,10,120);
    dpl.strokeText('[Return All Deployed]',10,134);
    dpl.globalAlpha = 1;
    dpl.fillText('Ready: '+pool.length,10,78);
    dpl.fillText('Deployed: '+cursors.length,10,92);
    dpl.fillText('Disconnected: '+disconnected,10,106);
    dpl.fillText('Connected: '+connected,10,120);
    dpl.fillText('[Return All Deployed]',10,134);
 
    // pathfinder display
    dpl.font = '12px NovaSquare';
    dpl.globalAlpha = 0.5;
    dpl.strokeText('Delay: [<] '+pathfinderDelay+'ms [>]',210,78);
    dpl.strokeText('Movement: '+(moveMethod==1?'[Normal]':moveMethod==2?'[Clicks]':'[?????]'),210,92);
    dpl.strokeText('Avoid exits: ['+avoidGreenArea+']',210,106);
    dpl.globalAlpha = 1;
    dpl.fillText('Delay: [<] '+pathfinderDelay+'ms [>]',210,78);
    dpl.fillText('Movement: '+(moveMethod==1?'[Normal]':moveMethod==2?'[Clicks]':'[?????]'),210,92);
    dpl.fillText('Avoid exits: ['+avoidGreenArea+']',210,106);
 
    // text display
    dpl.font = '12px NovaSquare';
    dpl.globalAlpha = 0.5;
    dpl.strokeText('Font: '+fontType,410,78);
    dpl.strokeText('Size: '+fontSize,410,92);
    dpl.strokeText('Delay: [<] '+timeout+'ms [>]',410,106);
    dpl.globalAlpha = 1;
    dpl.fillText('Font: '+fontType,410,78);
    dpl.fillText('Size: '+fontSize,410,92);
    dpl.fillText('Delay: [<] '+timeout+'ms [>]',410,106);
 
    // misc display
    dpl.font = '12px NovaSquare';
    dpl.globalAlpha = 0.5;
    dpl.strokeText('Spam Clicking Rate: '+cps+'cps',610,78);
    dpl.strokeText('[Change Theme]',610,92);
    dpl.globalAlpha = 1;
    dpl.fillText('Spam Clicking Rate: '+cps+'cps',610,78);
    dpl.fillText('[Change Theme]',610,92);
 
    // credit display
    dpl.font = '12px NovaSquare';
    dpl.globalAlpha = 0.5;
    dpl.strokeText('Created by vnx#6389',790 - dpl.measureText('Created by vnx#6389').width,168);
    dpl.strokeText('Special thanks to cledis',790 - dpl.measureText('Special thanks to cledis').width,182);
    dpl.globalAlpha = 1;
    dpl.fillText('Created by vnx#6389',790 - dpl.measureText('Created by vnx#6389').width,168);
    dpl.fillText('Special thanks to cledis',790 - dpl.measureText('Special thanks to cledis').width,182);
 
    dpl.restore();
    requestAnimationFrame(updateDisplay);
}
 
requestAnimationFrame(updateDisplay);