Classified

Impossible to outplace

// ==UserScript==
// @name         Classified
// @namespace    none
// @version      1
// @description  Impossible to outplace
// @author       𝓛._.𝓻𝓮 (Watersheep)
// @match        *://moomoo.io/*
// @match        *://sandbox.moomoo.io/*
// @icon         https://i.pinimg.com/originals/f8/7a/d3/f87ad32360e70eaf0b8f7ae9b5ed2b67.gif
// @require      http://code.jquery.com/jquery-3.3.1.min.js
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/msgpack.min.js
// @license      WTFPL
// ==/UserScript==

let config = window.config;

function normal() {
    hat(normalHat)
    acc(normalAcc)
}

function aim(x, y) {
    var cvs = document.getElementById("gameCanvas")
    cvs.dispatchEvent(new MouseEvent("mousemove", {
        clientX: x,
        clientY: y
    }))
}

let coreURL = new URL(window.location.href)
window.sessionStorage.force = coreURL.searchParams.get("fc")

if (window.sessionStorage.force != "false" && window.sessionStorage.force && window.sessionStorage.force.toString() != "null") {
    document.getElementsByClassName("menuHeader")[0].innerHTML = `Servers <span style="color: red">Force (${window.sessionStorage.force})</span>`
}

class ForceSocket extends WebSocket {
    constructor(...args) {
        if (window.sessionStorage.force != "false" && window.sessionStorage.force && window.sessionStorage.force.toString() != "null") {
            let server = window.sessionStorage.force
            let sip = ""
            for (let gameServer of window.vultr.servers) {
                if (`${gameServer.region}:${gameServer.index}:0` == server) {
                    sip = gameServer.ip
                }
            }
            args[0] = `wss://ip_${sip}.moomoo.io:8008/?gameIndex=0`
            delete window.sessionStorage.force
        }
        super(...args)
    }
}

setInterval(() => {
    if(autoaim == true) {
        doNewSend(["2", [nearestEnemyAngle]]);
    }
}, 0);
setInterval(() => {
    if(spin) {
        aim(Math.random() * window.innerWidth, Math.random() * window.innerHeight);
    }
}, 0);

var spin = false;
var nearestEnemy;
var nearestEnemyAngle;
var autoaim = false;
var isEnemyNear;
var instaSpeed = 0;
var primary;
var secondary;
var foodType;
var wallType;
var spikeType;
var millType;
var mineType;
var trapType;
var boostType;
var turretType;
var spawnpadType;
var tick = 0;
var oldHat;
var oldAcc;
var enemiesNear;
var normalHat;
var normalAcc;
var ws;
var msgpack5 = msgpack;
var boostDir;
let myPlayer = {
    id: null,
    x: null,
    y: null,
    oldX: null,
    oldY: null,
    dt: 0,
    dir: null,
    object: null,
    weapon: null,
    clan: null,
    isLeader: null,
    hat: null,
    accessory: null,
    isSkull: null,
    sTime: 0,
    sCount: 0,
    health: 100
};

let healSpeed = 0;
var messagecrash = 0;
var clanToggle = 0;
var clanCrash = 0;
var clanfake = 0;
var messagefake = 0;
let healToggle = 0;
let hatToggle = 0;
let SoreHolder = document.getElementById('storeHolder');
let width;
let height;
let mouseX;
let mouseY;
let heal = false;
let onetick = false;
let oneticking = false;
let lessmove = undefined;
let instaing = false;
let mySkins = {};
let myTails = {};
let camX = null;
let camY = null;
let myXY = {
    x: undefined,
    y: undefined
}

document.msgpack = msgpack;

function n() {
    this.buffer = new Uint8Array([0]);
    this.buffer.__proto__ = new Uint8Array;
    this.type = 0;
};

let packet = 0;
let firstPacket = false;
WebSocket.prototype.oldSend = WebSocket.prototype.send;
WebSocket.prototype.send = function (m) {
    if (!ws) {
        document.ws = this;
        ws = this;
        socketFound(this);
    }
    if (ws == this) {
        if (!firstPacket) {
            firstPacket = true;
            setTimeout(() => {
                packet = 0;
                firstPacket = false;
            }, 1000);
        }
        packet++;
    }
    this.oldSend(m);
};

let delta;
let now;
let lastUpdate = Date.now();

let types = {
    util: {
        getDist: function (tmp1, tmp2, type1, type2) {
            let tmpXY1 = {
                x: type1 == 0 ? tmp1.x : type1 == 1 ? tmp1.x1 : type1 == 2 && tmp1.x2,
                y: type1 == 0 ? tmp1.y : type1 == 1 ? tmp1.y1 : type1 == 2 && tmp1.y2
            }
            let tmpXY2 = {
                x: type2 == 0 ? tmp2.x : type2 == 1 ? tmp2.x1 : type2 == 2 && tmp2.x2,
                y: type2 == 0 ? tmp2.y : type2 == 1 ? tmp2.y1 : type2 == 2 && tmp2.y2
            }
            return Math.sqrt((tmpXY2.x -= tmpXY1.x) * tmpXY2.x + (tmpXY2.y -= tmpXY1.y) * tmpXY2.y);
        },
        getDirect: function (tmp1, tmp2, type1, type2) {
            let tmpXY1 = {
                x: type1 == 0 ? tmp1.x : type1 == 1 ? tmp1.x1 : type1 == 2 && tmp1.x2,
                y: type1 == 0 ? tmp1.y : type1 == 1 ? tmp1.y1 : type1 == 2 && tmp1.y2
            }
            let tmpXY2 = {
                x: type2 == 0 ? tmp2.x : type2 == 1 ? tmp2.x1 : type2 == 2 && tmp2.x2,
                y: type2 == 0 ? tmp2.y : type2 == 1 ? tmp2.y1 : type2 == 2 && tmp2.y2
            }
            return Math.atan2(tmpXY1.y - tmpXY2.y, tmpXY1.x - tmpXY2.x);
        },
    }
}

let gameCanvas = document.getElementById("gameCanvas");
let mainContext = gameCanvas.getContext("2d");
let myName = "unknown";

function shameCounter() {
    if (myPlayer.id) {
        let tmpXY = {
            x: camX,
            y: camY
        };
        let tmpDist = types.util.getDist(tmpXY, myXY, 0, 0);
        let tmpDir = types.util.getDirect(myXY, tmpXY, 0, 0);
        let camSpd = Math.min(tmpDist * 0.01 * delta, tmpDist);
        if (tmpDist > 0.05) {
            camX += camSpd * Math.cos(tmpDir);
            camY += camSpd * Math.sin(tmpDir);
        } else {
            camX = myXY.x;
            camY = myXY.y;
        }
        let rate = 170;
        myPlayer.dt += delta;
        let tmpRate = Math.min(1.7, myPlayer.dt / rate);
        let tmpDiff = (myPlayer.x - myPlayer.oldX);
        myXY.x = myPlayer.oldX + (tmpDiff * tmpRate);
        tmpDiff = (myPlayer.y - myPlayer.oldY);
        myXY.y = myPlayer.oldY + (tmpDiff * tmpRate);
        let xOffset = camX - (1920 / 2);
        let yOffset = camY - (1080 / 2);
        mainContext.font = "30px Hammersmith One";
        mainContext.fillStyle = "#fff";
        mainContext.textBaseline = "middle";
        mainContext.textAlign = "center";
        mainContext.lineWidth = 8;
        mainContext.lineJoin = "round";
        var tmpText = (myPlayer.clan ? "[" + myPlayer.clan + "] " : "") + (myName || "");
        var tmpS = 60;
        var tmpX = myXY.x - xOffset - (tmpS / 2) + (mainContext.measureText(tmpText).width / 2) + 35 + (myPlayer.isSkull == 1 ? 90 : 30);
        mainContext.strokeText(myPlayer.sCount, tmpX, (myXY.y - yOffset - 35) - 34);
        mainContext.fillText(myPlayer.sCount, tmpX, (myXY.y - yOffset - 35) - 34);
    } else {
        camX = 14400 / 2;
        camY = 14400 / 2;
    }
}

let mStatus = document.createElement("div");
mStatus.id = "status";
mStatus.style.position = "absolute";
mStatus.style.color = "#fff";
mStatus.style.font = "15px Hammersmith One";
mStatus.style.top = "40px";
mStatus.style.left = "40px";
mStatus.style.display = "block";
mStatus.textAlign = "right";
document.body.appendChild(mStatus);

function doUpdate() {
    now = Date.now();
    delta = now - lastUpdate;
    lastUpdate = now;
    shameCounter();
    window.requestAnimationFrame(doUpdate);
    mStatus.innerHTML = `
    Packet: ${packet}</br>
    `;
}
doUpdate();


function socketFound(socket) {
    socket.addEventListener('message', function (message) {
        handleMessage(message);
    });
}

function dist(a, b) {
    return Math.hypot(a[2] - b.y, a[1] - b.x);
}

function handleMessage(m) {
    let temp = msgpack5.decode(new Uint8Array(m.data));
    let data;
    if (temp.length > 1) {
        data = [temp[0], ...temp[1]];
        if (data[1] instanceof Array) {
            data = data;
        }
    } else {
        data = temp;
    }
    let item = data[0];
    if (!data) {
        return
    };

    if (item === "io-init") {
        let cvs = document.getElementById("gameCanvas");
        width = cvs.clientWidth;
        height = cvs.clientHeight;
        $(window).resize(function () {
            width = cvs.clientWidth;
            height = cvs.clientHeight;
        });
        cvs.addEventListener("mousemove", e => {
            mouseX = e.clientX;
            mouseY = e.clientY;
        });
    }

    if (item == "A" && myPlayer.id == null) {
        myPlayer.id = data[1];
    }

    if (item == "B") {
        if (data[2]) {
            myName = data[1][2];
            myPlayer.health = 100;
            myPlayer.sCount = 0;
            myPlayer.sTime = 0;
            update();
        }
    }
if(data == "6") {
    console.warn(data);
}
    if(data == "K") {
        console.error(data);
        let sid = data[0]
        let findObj = findObjectBySid(sid);
        try {
            let objAim = UTILS.getDirect(findObj, tmpXY(player));
            let objDst = UTILS.getDist(findObj, tmpXY(player));
            let tmpCount = -1;
            for (let i = -Math.PI/(Math.PI); i <= Math.PI/(Math.PI); i+= Math.PI/(Math.PI)) {
                tmpCount++
                if (tmpCount == 1 && objDst <= 200) {
                    place(spikeType, objAim);
                } else {
                    checkPlace(2, objAim+i);
                }
            }
        } catch (e) {
            console.error(e);
        }
    }


    if (item == "O" && data[1] == myPlayer.id) {
        if (75 < data[2] < 100) {
            setTimeout(() => {
                place(foodType);
            }, 90);
        }
    }

    if (item == "O" && data[1] == myPlayer.id) {
        if (data[2] < 75) {
            macros.q = true
            place(foodType);
            place(foodType);
        } else {
            macros.q = false
        }
    }

    function findPlayerBySID(sid) {
    for (var i = 0; i < players.length; ++i) {
        if (players[i].sid == sid) {
            return players[i];
        }
    } return null;
}
console.log(data);
    // UPDATE HEALTH:
    if (item == "O" && data[1] == myPlayer.id) {
        let tmpObj = findPlayerBySID(sid);
        if (tmpObj) {
                let tmpHealth = tmpObj.health;
                tmpObj.health = value;
                if (tmpHealth < tmpObj.health) {
                    if (tmpObj.hitTime) {
                        let timeSinceHit = Date.now() - tmpObj.hitTime;
                        tmpObj.hitTime = 0;
                        let tmpShame = tmpObj.shameCount;
                        if (timeSinceHit <= 120) {
                            tmpObj.shameCount = Math.min(8, tmpObj.shameCount + 1);
                        } else {
                            tmpObj.shameCount = Math.max(0, tmpObj.shameCount - 2);
                        }
                        if (tmpObj !== player) {
                            if (tmpObj.dangerShame < tmpObj.shameCount) {
                                tmpObj.dangerShame = tmpObj.shameCount;
                            }
                        }
                    }
                } else if (tmpHealth > tmpObj.health) {
                    let a = 0;
                    let antiInsta = false;
                    let checkAnti;
                    tmpObj.hitTime = Date.now();
                    if (tmpObj === player) {
                        if (!getEl("tickbase").checked) {
                            let pingHeal = function() {
                                return Math.max(0, 250 - window.pingTime);
                            };
                            if (true) {
                                if (near.length) {
                                    if(tmpObj != player) {
                                        if (
                                            (tmpObj.reloads[tmpObj.primaryIndex] != 0 && tmpObj.skinIndex == 7) ||
                                            (tmpObj.reloads[tmpObj.secondaryIndex] != 0 && tmpObj.skinIndex == 53)
                                        ) {
                                            checkAnti = true;
                                        }
                                        if (checkAnti) {
                                            io.send("ch", "anti insta test");
                                            antiInsta = true;
                                        }
                                        if(antiInsta) {
                                            console.log("anti instad");
                                            io.send("ch", "anti insta test");
                                            if(value>40){
                                                place(0, getAttackDir());
                                            }else{
                                                place(0, getAttackDir());
                                                place(0, getAttackDir());
                                            }
                                        }
                                        console.warn(player.reloads[player.primaryIndex]);
                                        if(Math.abs(value)>25) {
                                            if(tmpObj.reloads[tmpObj.primaryIndex] != 0) a=0;
                                            if(tmpObj.reloads[tmpObj.secondaryIndex] != 0) a=1;
                                            if(a=0) {
                                                io.send("ch", "beta anti insta");

                                                place(0, getAttackDir());
                                                place(0, getAttackDir());
                                            } else if (a=1) {
                                                //io.send("ch", "test");

                                                setTimeout(() => {
                                                    place(0, getAttackDir());
                                                }, 86);
                                                setTimeout(() => {
                                                    place(0, getAttackDir());
                                                }, 86);
                                            }
                                        } else {
                                            if(tmpObj.reloads[tmpObj.primaryIndex] != 0) a=0;
                                            if(tmpObj.reloads[tmpObj.secondaryIndex] != 0) a=1;
                                            if(a=0) {
                                                //io.send("ch", "beta anti insta");

                                                place(0, getAttackDir());
                                                place(0, getAttackDir());
                                            } else if (a=1) {
                                                //io.send("ch", "test");

                                                setTimeout(() => {
                                                    place(0, getAttackDir());
                                                }, 86);
                                                setTimeout(() => {
                                                    place(0, getAttackDir());
                                                }, 86);
                                            }
                                        }
                                    }
                                    value >= 20
                                    if (tmpObj.skinIndex = 53 && tmpObj.isAI != true) {
                                        if(tmpObj.reloads[tmpObj.primaryIndex] != 0) a=0;
                                        if(tmpObj.reloads[tmpObj.secondaryIndex] != 0) a=1;
                                        if(a=0) {
                                            //io.send("ch", "beta anti insta");

                                            place(0, getAttackDir());
                                            place(0, getAttackDir());
                                        } else if (a=1) {
                                            io.send("ch", "test");

                                            setTimeout(() => {
                                                place(0, getAttackDir());
                                            }, 86);
                                            setTimeout(() => {
                                                place(0, getAttackDir());
                                            }, 86);
                                        }
                                    } else {
                                        if(tmpObj.reloads[tmpObj.primaryIndex] != 0) a=0;
                                        if(tmpObj.reloads[tmpObj.secondaryIndex] != 0) a=1;
                                        if(a=0) {
                                            //io.send("ch", "beta anti insta");

                                            place(0, getAttackDir());
                                            place(0, getAttackDir());
                                        } else if (a=1) {
                                            io.send("ch", "test");

                                            setTimeout(() => {
                                                place(0, getAttackDir());
                                            }, 86);
                                            setTimeout(() => {
                                                place(0, getAttackDir());
                                            }, 86);
                                        }
                                    }
                                    player.skinIndex == 11 && (value >= 30);
                                    buyEquip(11, 0);
                                } else {
                                    if(tmpObj.reloads[tmpObj.primaryIndex] != 0) a=0;
                                    if(tmpObj.reloads[tmpObj.secondaryIndex] != 0) a=1;
                                    if(a=0) {
                                        //io.send("ch", "beta anti insta");
                                        place(0, getAttackDir());
                                        place(0, getAttackDir());
                                    } else if (a=1) {
                                        if (
                                            (tmpObj.reloads[tmpObj.primaryIndex] != 0 && tmpObj.skinIndex == 7) ||
                                            (tmpObj.reloads[tmpObj.secondaryIndex] != 0 && tmpObj.skinIndex == 53)
                                        ) {
                                            checkAnti = true;
                                        }
                                        if (checkAnti) {
                                            io.send("ch", "anti insta test");
                                            antiInsta = true;
                                        }
                                        if(antiInsta) {
                                            console.log("anti instad");
                                            io.send("ch", "anti insta test");
                                            if(value>40){
                                                place(0, getAttackDir());
                                            }else{
                                                place(0, getAttackDir());
                                                place(0, getAttackDir());
                                            }
                                        }
                                        //io.send("ch", "test");
                                        setTimeout(() => {
                                            place(0, getAttackDir());
                                        }, 86);
                                        setTimeout(() => {
                                            place(0, getAttackDir());
                                        }, 86);
                                    }
                                }
                            }
                        } else {

                            let damage = tmpHealth - tmpObj.health;
                            let pingHeal = function() {
                                return Math.max(0, 140 - window.pingTime);
                            };
                            let normal = 50;
                            if (near.nears.length) {
                                for (let i = 0; i < near.nears.length; i++) {
                                    let nearEnemy = near.enemy;
                                    if (damage >= (tmpObj.skinIndex == 6 ? 30 : 10) && ((nearEnemy.secondaryIndex === undefined || nearEnemy.primaryIndex === undefined) ? true : (nearEnemy.reloads[nearEnemy.primaryIndex] === 0 && nearEnemy.reloads[nearEnemy.secondaryIndex] === 0))) {
                                        if (tmpObj.shameCount < 3) {
                                            for (let i = 0; i < applCxC(damage); i++) {
                                                setTimeout(() => {
                                                    if(Math.abs(value)>40) {
                                                        place(0, getAttackDir());
                                                        place(0, getAttackDir());
                                                    } else {
                                                        place(0, getAttackDir());
                                                    }
                                                }, config.tickRate / 2);
                                            }
                                        } else {
                                            for (let i = 0; i < applCxC(damage); i++) {
                                                setTimeout(() => {
                                                    if(Math.abs(value)>40) {
                                                        place(0, getAttackDir());
                                                        place(0, getAttackDir());
                                                    } else {
                                                        place(0, getAttackDir());
                                                    }
                                                }, config.tickRate);
                                            }
                                        }
                                    } else {
                                        for (let i = 0; i < applCxC(damage); i++) {
                                            setTimeout(() => {
                                                if(Math.abs(value)>40) {
                                                    place(0, getAttackDir());
                                                    place(0, getAttackDir());
                                                } else {
                                                    place(0, getAttackDir());
                                                }
                                            }, config.tickRate * 1.5);
                                        }
                                    }
                                }
                            } else {
                                for (let i = 0; i < applCxC(damage); i++) {
                                    setTimeout(() => {
                                        if(Math.abs(value)>40) {
                                            place(0, getAttackDir());
                                            place(0, getAttackDir());
                                        } else {
                                            place(0, getAttackDir());
                                        }
                                    }, config.tickRate / 2);
                                }
                            }
                        }
                    } else {
                        if (tmpObj === near.enemy) {
                            let damage = tmpHealth - tmpObj.health;
                            if (damage > 5) {
                                if (autos.insta.count > 0) {
                                    autos.insta.count--;
                                    setTimeout(() => {
                                        if (autos.insta.count <= 0) {
                                            autos.insta.todo = true;
                                        }
                                    }, config.tickRate / 2);
                                }
                            }
                        }
                    }
                }
            }
        }

    if (item == "a") {
        enemiesNear = [];
        for (let i = 0; i < data[1].length / 13; i++) {
            let playerInfo = data[1].slice(13 * i, 13 * i + 13);
            if (playerInfo[0] == myPlayer.id) {
                myPlayer.oldX = myXY.x;
                myPlayer.oldY = myXY.y;
                myPlayer.dt = 0;
                myPlayer.x = playerInfo[1];
                myPlayer.y = playerInfo[2];
                myPlayer.dir = playerInfo[3];
                myPlayer.object = playerInfo[4];
                myPlayer.weapon = playerInfo[5];
                myPlayer.clan = playerInfo[7];
                myPlayer.isLeader = playerInfo[8];
                myPlayer.hat = playerInfo[9];
                myPlayer.accessory = playerInfo[10];
                myPlayer.isSkull = playerInfo[11];
                if (myPlayer.hat == 45) {
                    myPlayer.sCount = 0;
                }
            } else if (playerInfo[7] != myPlayer.clan || playerInfo[7] === null) {
                enemiesNear.push(playerInfo);
            }
        }
        isEnemyNear = false;
        if (enemiesNear) {
            nearestEnemy = enemiesNear.sort((a, b) => dist(a, myPlayer) - dist(b, myPlayer))[0];
        }
        if (nearestEnemy) {
            nearestEnemyAngle = Math.atan2(nearestEnemy[2] - myPlayer.y, nearestEnemy[1] - myPlayer.x);
            if (Math.sqrt(Math.pow((myPlayer.y - nearestEnemy[2]), 2) + Math.pow((myPlayer.x - nearestEnemy[1]), 2)) < 300) {
                isEnemyNear = true;
                if (autoaim == false && oneticking == false && myPlayer.hat != 7 && myPlayer.hat != 53) {
                    normalHat = 12;
                    if (primary != 8) {
                        normalAcc = 21
                    }
                };
            }
        }
        if (onetick && enemiesNear.length) {
            let distance = dist(nearestEnemy, myPlayer);
            let biomehat = function () {
                if (myPlayer.accessory != 11) {
                    acc(11);
                }
                if (myPlayer.y < 2400) {
                    if (myPlayer.hat != 15) {
                        hat(15);
                    }
                } else if (myPlayer.y > 6850 && myPlayer.y < 7550) {
                    if (myPlayer.hat != 31) {
                        hat(31);
                    }
                } else {
                    if (myPlayer.hat != 12) {
                        hat(12);
                    }
                }
            };
            oneticking = true;
            if (distance > 231 && distance < 234) {
                if (lessmove != undefined) {
                    lessmove = undefined;
                    doNewSend(["33", [lessmove]]);
                }
                biomehat();
                if (nearestEnemy[9] != 22 && nearestEnemy[9] != 6) {
                    sendTick();
                }
            } else {
                if (distance <= 231) {
                    if (lessmove != nearestEnemyAngle + Math.PI) {
                        lessmove = nearestEnemyAngle + Math.PI;
                        doNewSend(["33", [lessmove]]);
                    }
                } else if (distance >= 234) {
                    if (lessmove != nearestEnemyAngle) {
                        lessmove = nearestEnemyAngle;
                        doNewSend(["33", [lessmove]]);
                    }
                }

                if (distance > 215 && distance < 250) {
                    if (myPlayer.hat != 40) {
                        hat(40);
                        acc(0);
                    }
                } else {
                    if (myPlayer.hat != 12) {
                        hat(12);
                    }
                }
            }
        } else {
            oneticking = false;
        }
        if (isEnemyNear == false && autoaim == false) {
            normalAcc = 11;
            if (myPlayer.y < 2400) {
                normalHat = 15;
            } else if (myPlayer.y > 6850 && myPlayer.y < 7550) {
                normalHat = 31;
            } else {
                normalHat = 12;
            }
        }
        if (!nearestEnemy) {
            nearestEnemyAngle = myPlayer.dir;
        }
        if (doInsta) {
            doInsta = false;
            if (!instaing) {
                doNewSend(["13c", [0, 0, 1]]);
                doNewSend(["5", [primary, true]]);
                autoaim = true
                doNewSend(["7", [1]]);
                if (!mySkins[7]) {
                    doNewSend(["13c", [1, 7, 0]]);
                }
                if (myPlayer.hat != 7) {
                    doNewSend(["13c", [0, 7, 0]]);
                }
                if (myPlayer.accessory != 0) {
                    doNewSend(["13c", [0, 0, 1]]);
                }
                setTimeout(() => {
                    if (myPlayer.accessory != 0) {
                        doNewSend(["13c", [0, 0, 1]]);
                    }
                    if (!mySkins[53]) {
                        doNewSend(["13c", [1, 53, 0]]);
                    }
                    if (myPlayer.hat != 53) {
                        doNewSend(["13c", [0, 53, 0]]);
                    }
                    doNewSend(["5", [secondary, true]]);
                    autoaim = false
                    setTimeout(() => {
                        doNewSend(["7", [1]]);
                        doNewSend(["5", [primary, true]]);
                    }, 82);
                }, 82);
            }
        }
    }

    if (item == "h" && data[1] == myPlayer.id) {
        let dmg = myPlayer.health - data[2];
        if ((myPlayer.health - data[2]) < 0) {
            if (myPlayer.sTime) {
                let timeHit = Date.now() - myPlayer.sTime;
                myPlayer.sTime = 0;
                if (timeHit <= 120) {
                    myPlayer.sCount++;
                } else {
                    myPlayer.sCount = Math.max(0, myPlayer.sCount - 2);
                }
            }
        } else {
            myPlayer.sTime = Date.now();
        }
        myPlayer.health = data[2];
    }
    if (item == "V") {
        update();
    }
    if (item == "us") {
        if (data[3]) {
            if (!data[1])
                myTails[data[2]] = 1;
            else
                myPlayer.accessory = data[2];
        } else {
            if (!data[1])
                mySkins[data[2]] = 1;
            else
                myPlayer.hat = data[2];
        }
    }
}

let macros = {
    q: false,
    f: false,
    v: false,
    n: false,
    g: false,
    '9': false
}

setInterval(() => {
    macros.v && place(spikeType);
}, 35);

setInterval(() => {
    macros.f && place(boostType);
    macros.n && place(millType);
    macros.g && place(turretType);
    macros.q && place(foodType);
    macros['9'] && place(spawnpadType);
}, 86);

function doNewSend(sender) {
    ws.send(new Uint8Array(Array.from(msgpack5.encode(sender))));
}

function acc(id) {
    doNewSend(["13c", [0, id, 1]]);
}

function hat(id) {
    doNewSend(["13c", [0, id, 0]]);
}

function place(id, angle = Math.atan2(mouseY - height / 2, mouseX - width / 2)) {
    doNewSend(["5", [id, null]]);
    doNewSend(["c", [1, angle]]);
    doNewSend(["5", [myPlayer.weapon, true]]);
}

function plac(id, angle = Math.atan2(mouseY - height / 2, mouseX - width / 2)) {
    doNewSend(["5", [id, null]]);
    doNewSend(["c", [1, angle]]);
    doNewSend(["5", [myPlayer.weapon, true]]);
}

function placing(id, angle = Math.atan2(mouseY - height / 2, mouseX - width / 2)) {
    doNewSend(["5", [id, null]]);
    doNewSend(["c", [1, angle]]);
    doNewSend(["5", [myPlayer.weapon, true]]);
}

let doInsta = false;
let keyss = {};
document.addEventListener('keydown', (e) => {
    if (!keyss[e.keyCode]) {
        keyss[e.keyCode] = 1;
        if (document.activeElement.id.toLowerCase() !== "chatbox") {
            macros[e.key] = true;
            const wallPlacer = false;
            if (e.keyCode == 82) {
                doInsta = false;
            }

            if (e.keyCode == 84) {
                onetick = !onetick;
                acc(0);
            }

            if (e.keyCode == 0) {
                for (let i = 0; i < 5; i++) {
                    let angle = myPlayer.dir + toRad(i * 72);
                    place(millType, angle)
                }
            }
            if (e.keyCode == 0) {
                for (let i = 0; i < 4; i++) {
                    let angle = myPlayer.dir + toRad(i * 90);
                    place(wallType, angle)
                }
            }

            if (e.keyCode == 0) {
                for (let i = 0; i < 4; i++) {
                    let angle = myPlayer.dir + toRad(i * 90);
                    place(boostType, angle)
                }
            }

            if (e.keyCode == 89) {
                hat(20)
            }

            if (e.keyCode == 72) {
                hat(53)
            }

            if (e.keyCode == 66) {
                hat(7)
                acc(21)
            }

            if (e.keyCode == 16) {
                hat(6)
                acc(11)
            }

            if (e.keyCode == 76) {
                hat(31)
            }

            if (e.keyCode == 90) {
                hat(40)
                acc(21)
            }

            if (e.keyCode == 67) {
                if (spin == false) {
                    spin = true;
                } else {
                    spin = false;
                }
            }
        }
    }
})

document.addEventListener('keyup', (e) => {
    if (keyss[e.keyCode]) {
        keyss[e.keyCode] = 0;
        macros[e.key] = false;
        if (document.activeElement.id.toLowerCase() !== "chatbox") {

            if (e.keyCode == 123123) {
                setTimeout(() => {
                    doNewSend(["33", [null]]);
                    boostDir = null;
                }, 10);
            }
            if (e.keyCode == 123123) {
                setTimeout(() => {
                    doNewSend(["33"]);
                }, 1);
            }
            if (e.keyCode == 219) {
                setTimeout(() => {
                    doNewSend(["33"]);
                }, 1);
            }
            if (e.keyCode == 123213) {
                setTimeout(() => {
                    doNewSend(["33"]);
                }, 1);
            }
            if (e.keyCode == 1232131231231231231232131503123121213215021213) {
                setTimeout(() => {
                    doNewSend(["33", [null]]);
                    boostDir = null;
                }, 10);
            }
        }
    }
})
//yes shared by zynq
function isElementVisible(e) {
    return (e.offsetParent !== null);
}

function toRad(angle) {
    return angle * 0.01745329251;
}

function update() {
    for (let i = 0; i < 9; i++) {
        if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))) {
            primary = i;
        }
    }

    for (let i = 9; i < 16; i++) {
        if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))) {
            secondary = i;
        }
    }

    for (let i = 16; i < 19; i++) {
        if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))) {
            foodType = i - 16;
        }
    }

    for (let i = 19; i < 22; i++) {
        if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))) {
            wallType = i - 16;
        }
    }

    for (let i = 22; i < 26; i++) {
        if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))) {
            spikeType = i - 16;
        }
    }

    for (let i = 26; i < 29; i++) {
        if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))) {
            millType = i - 16;
        }
    }
    for (let i = 29; i < 31; i++) {
        if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))) {
            mineType = i - 16;
        }
    }

    for (let i = 31; i < 33; i++) {
        if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))) {
            boostType = i - 16;
        }
    }

    for (let i = 33; i < 36; i++) {
        if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))) {
            turretType = i - 16;
        }
    }

    for (let i = 36; i < 37; i++) {
        if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))) {
            spawnpadType = i - 16;
        }
    }

    for (let i = 37; i < 39; i++) {
        if (isElementVisible(document.getElementById("actionBarItem" + i.toString()))) {
            turretType = i - 16;
        }
    }
}
window.onload = function () {
    document.getElementById("diedText").innerHTML = "YOU DIED";
    document.getElementById("diedText").style.color = "#FFFFFF";
    document.getElementById("gameName").innerHTML = "MOOMOO.IO";
    document.getElementById("gameName").style.color = "#FFFFFF";
}