Clap mod

I hate seeing people killing me with my mod

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

Bạn sẽ cần cài đặt một tiện ích mở rộng như Tampermonkey hoặc Violentmonkey để cài đặt kịch bản này.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(Tôi đã có Trình quản lý tập lệnh người dùng, hãy cài đặt nó!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Clap mod
// @version      v2
// @description  I hate seeing people killing me with my mod
// @match        http*://*.moomoo.io/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=moomoo.io
// @require      https://update.greasyfork.org/scripts/423602/1005014/msgpack.js
// @license      MIT
// @grant        none
// @namespace Good Guy
// ==/UserScript==
/** VARIABLES **/
let spike = 0;
let weapongrind = false;
let { msgpack, config, jQuery: $ } = window;
let leaderboard = document.getElementById('leaderboard')
let gameCanvas = document.getElementById("gameCanvas");
let mainContext = gameCanvas.getContext("2d");
let storeMenu = document.getElementById("storeMenu");
let allianceMenu = document.getElementById("allianceMenu");
let chatHolder = document.getElementById("chatHolder");
let altchaCheckbox = document.getElementById('altcha_checkbox');
let altcha = document.getElementById('altcha');
let menuOpened = false;
let mouseX, mouseY, width = innerWidth, height = innerHeight;
let moveKeys = { w: false, a: false, s: false, d: false };
let myPlayer = {
    id: null, x: null, y: null, dir: null, object: null, weapon: null, clan: null,
    isLeader: null, maxXP: 300, XP: 0, age: 1, hat: null, accessory: null, isSkull: null, maxHealth: 100
};
let locked = false, gameTick = 0, enemy = [], ws = null;
let tPing = 90;
let players = [], nearestEnemy = {}, enemyAngle, isEnemyNear;
let primary, secondary, foodType, wallType, spikeType, millType, mineType, boostType, spawnpadType, turretType, haveMine;
let SaVeGe = {
    tick: 0,
    tickQueue: [],
    manage: [],
    tickRate: 1000 / 9,
    tickSpeed: 0,
    lastTick: performance.now(),
    tickBase(set, tick) {
        const targetTick = this.tick + tick;
        this.tickQueue[targetTick] = this.tickQueue[targetTick] ?? [];
        this.tickQueue[targetTick].push(set);
    }
};

document.getElementById("gameName").innerHTML = "Clap mod";
document.querySelector("#pre-content-container").remove(); //ANTI AD

/** SOCKET **/
WebSocket.prototype.oldSend = WebSocket.prototype.send;
WebSocket.prototype.send = function (m) {
    if (!ws) {
        document.websocket = this;
        ws = this;
        socketFound(this);
    }
    this.oldSend(m);
};

/** FPS BOOSTER **/
let { maxScreenWidth, maxScreenHeight } = config;
let FPSBooster;
let { moveTo, lineTo } = CanvasRenderingContext2D.prototype;

CanvasRenderingContext2D.prototype.moveTo = function(x, y) {
    if (!FPSBooster || this.globalAlpha !== 0.06) {
        return moveTo.call(this, x, y);
    }
};
CanvasRenderingContext2D.prototype.lineTo = function(x, y) {
    if (!FPSBooster || this.globalAlpha !== 0.06) {
        return lineTo.call(this, x, y);
    }
};

class Checker {
    check(callback) {
        return (event) => {
            if (event instanceof Event && (event.isTrusted ?? true)) {
                callback(event);
            }
        };
    }
}

let checker = new Checker();
let updateScreen = () => {
    let currentWidth = window.innerWidth;
    let currentHeight = window.innerHeight;

    if (FPSBooster) {

    } else {
    }
};
/** LOCKERS **/
let lockers = {
    attacker: false,
    breaker: false,
    storeOpened: false,
}

/** WS SEND PACKET **/
let sendPacket = (packet, ...data) => {
    ws.send(new Uint8Array(msgpack.encode([packet, data])));
};

/** FOR STORE FUNCTIONS **/
let goldCount = () => {
    let scoreCount = document.getElementById("scoreDisplay");
    return scoreCount ? parseInt(scoreCount.innerText) : 0;
};

let hatPrice = (hatId) => {
    let hatPrice = {
        45: 0,
        51: 0,
        50: 0,
        28: 0,
        29: 0,
        30: 0,
        36: 0,
        37: 0,
        38: 0,
        44: 0,
        35: 0,
        42: 0,
        43: 0,
        49: 0,
        57: 50,
        8: 100,
        2: 500,
        15: 600,
        5: 1000,
        4: 2000,
        18: 2000,
        31: 2500,
        1: 3000,
        10: 3000,
        48: 3000,
        6: 4000,
        23: 4000,
        13: 5000,
        9: 5000,
        32: 5000,
        7: 6000,
        22: 6000,
        12: 6000,
        26: 8000,
        21: 10000,
        46: 10000,
        14: 10000,
        11: 10000,
        53: 10000,
        20: 12000,
        58: 12000,
        27: 15000,
        40: 15000,
        52: 15000,
        55: 20000,
        56: 20000
    };
    return hatPrice[hatId] || 0;
};

let accPrice = (accessoryId) => {
    let accPrice = {
        12: 1000,
        9: 1000,
        10: 1000,
        3: 1500,
        8: 2000,
        11: 2000,
        17: 3000,
        6: 3000,
        4: 4000,
        5: 5000,
        2: 6000,
        1: 8000,
        7: 8000,
        14: 10000,
        15: 10000,
        20: 10000,
        16: 12000,
        13: 15000,
        19: 15000,
        18: 20000,
        21: 20000
    };
    return accPrice[accessoryId] || 0;
};
let purchased = [];
let isPurchased = (id) => {
    return purchased.includes(id);
};

/** STORE **/
let storeBuy = (id, index) => {
    if (isPurchased(id)) {
        return;
    }
    let gold = goldCount();
    let cost = 0;
    if (index === 0) {
        cost = hatPrice(id);
    } else if (index === 1) {
        cost = accPrice(id);
    }
    if (gold >= cost) {
        sendPacket('c', 1, id, index);
        purchased.push(id);
    }
};
let storeEquip = (id, index) => sendPacket('c', 0, id, index);

/** EQUIP WEAPONS **/
let equipWeapon = (weapon) => sendPacket('z', weapon, true);

/** SEND CHAT **/
let sendChat = message => sendPacket('6', message);

/** AUTO GATHER **/
let autoGather = () => sendPacket('K', 1, 1);

/** REQUEST ANIMATION FRAME **/
let requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || (callback => setTimeout(callback, 1000 / 60));

/** HANDLE MESSAGE **/
let handleMessage = (message) => {
    let decodeData = msgpack.decode(new Uint8Array(message.data));

    let data = Array.isArray(decodeData) && decodeData.length > 1 ? [decodeData[0], ...decodeData[1]] : decodeData;

    if (!data) return;

    let dataType = data[0];

    if (dataType === "C" && myPlayer.id == null) {
        myPlayer.id = data[1];
    }
    if (dataType == "D" && data[2]) {
        secondary = null;
        primary = 0;
        foodType = 0;
        wallType = 3;
        spikeType = 6;
        millType = 10;
        spawnpadType = 36;
    }
    if (dataType == "V") {
        if (data[2] == 1) {
            primary = data[1][0];
            secondary = data[1][1] ?? null;
        } else {
            foodType = data[1][0];
            wallType = data[1][1];
            spikeType = data[1][2];
            millType = data[1][3];
            boostType = data[1][4] ?? -1;
            haveMine = data[1][5] == 13 || data[1][4] == 14;
            if (haveMine) {
                mineType = data[1][5];
            }
            turretType = data[1][5 + (haveMine ? 1 : 0)];
        }
    }
    if (dataType == "a") updatePlayers(data);
    if (dataType === "T") updateAge(data[1], data[2], data[3]);
    if (dataType == "O" && data[1] == myPlayer.id) {
        let playerID = data[1];
        let health = data[2];
        updateHealth(health, playerID);
    }
};

/** DISTANCE CALCULATE **/
let distance = (a, b) => {
    return Math.sqrt(Math.pow(b.y - a[2], 2) + Math.pow(b.x - a[1], 2));
};

/** ANTI ALTCHA **/
document.getElementById('altcha').style.display = 'none';
document.getElementById('altcha_checkbox').click();

/** UPDATE XP/MAXXP/AGE **/
let updateAge = (xp, maxXp, age) => {
    if (xp != undefined) {
        myPlayer.XP = xp;
    }
    if (maxXp != undefined) {
        myPlayer.maxXP = maxXp;
    }
    if (age != undefined) {
        myPlayer.age = age;
    }
}

/** PLACE **/
let place = (id, angle = Math.atan2(mouseY - height / 2, mouseX - width / 2)) => {
    if (typeof id !== "number" || id == -1) return;
    sendPacket("z", id, null);
    sendPacket("F", 1, angle);
    sendPacket("F", 0, angle);
    sendPacket("z", myPlayer.weapon, true);
}
//sendupgrade
function sendUpgrade(index) {
    //myPlayer.reloads[index] = 0;
        sendPacket("H", index);
}
/** HOOK **/
let hook = (target, prop, setter, getter) => {
    let symbol = Symbol(prop);
    Object.defineProperty(target, prop, {
        get() {
            getter(this, this[symbol]);
            return this[symbol];
        },
        set(value) {
            setter(this, symbol, value);
        },
        configurable: true
    })
}

/** IS TEAM **/
let isTeam = (kaka) => {
    return kaka.clan == myPlayer.clan;
};

/** OPEN/CLOSED **/
let checkMenu = () => {
    return (allianceMenu.style.display != "block" && chatHolder.style.display != "block" && storeMenu.style.display != "block" && !menuOpened);
}

/** RENDERING **/
let object = null;
hook(Object.prototype, "isItem", function(that, symbol, value) {
    that[symbol] = value;
}, function(that, value) {
    if (value === true) {
        object = that;
    }
});

CanvasRenderingContext2D.prototype.restore = new Proxy(CanvasRenderingContext2D.prototype.restore, {
    apply(target, thisArg, args) {
        markObject(thisArg);
        return Reflect.apply(target, thisArg, args);
    }
});

let markColor = (id) => {

    if (id === myPlayer.id) {
        return { color: "#00ff00", render: true };
    } else {
        return { color: "#FF4D4D", render: false };
    }
};

// item.owner.sid

let markObject = (ctx) => {
    if (!object || !object.owner || myPlayer.id === null) return;
    let distance = Math.sqrt(Math.pow(myPlayer.x - object.x, 2) + Math.pow(myPlayer.y - object.y, 2));
    if (distance > 300) return;
    let type = markColor(object.owner.sid);
    if (!type.render) return;
    ctx.fillStyle = type.color;
    ctx.beginPath();
    ctx.arc(0, 0, 10, 0, 2 * Math.PI);
    ctx.fill();
    object = null;
};
/** WEAPONS/NAMES/IDS **/
let weapon = {
    "tool_hammer": 0,
    "hand_axe": 1,
    "great_axe": 2,
    "short_sword": 3,
    "katana": 4,
    "polearm": 5,
    "bat": 6,
    "daggers": 7,
    "stick": 8,
    "hunting_bow": 9,
    "great_hammer": 10,
    "wooden_shield": 11,
    "crossbow": 12,
    "repeater_crossbow": 13,
    "mc_grabby": 14,
    "musket": 15
};

/** UPDATE PLAYERS **/
let updatePlayers = data => {
    SaVeGe.tick++
    let enemies = [];
    let players = [];
    let cTickQ = SaVeGe.tickQueue[SaVeGe.tick];
    if (Array.isArray(cTickQ)) {
        cTickQ.forEach((did) => did());
        SaVeGe.tickQueue[SaVeGe.tick] = null;
    }
    for (let i = 0; i < data[1].length / 13; i++) {
        let playerInfo = data[1].slice(13 * i, 13 * i + 13);
        players.push(playerInfo);

        if (playerInfo[0] == myPlayer.id) {
            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];
        } else if (playerInfo[7] != myPlayer.clan && playerInfo[7] !== null) {
            enemies.push({
                id: playerInfo[0],
                x: playerInfo[1],
                y: playerInfo[2],
                dir: playerInfo[3],
                object: playerInfo[4],
                weapon: playerInfo[5],
                clan: playerInfo[7],
                isLeader: playerInfo[8],
                hat: playerInfo[9],
                accessory: playerInfo[10],
                isSkull: playerInfo[11]
            });
        }
    }

    if (enemies) {
        nearestEnemy = enemies.sort((a, b) => distance(a, myPlayer) - distance(b, myPlayer))[0];
    }

    let isEnemyNear = nearestEnemy ? (Math.sqrt(Math.pow(myPlayer.y - nearestEnemy.y, 2) + Math.pow(myPlayer.x - nearestEnemy.x, 2)) < 320) : true;
    enemyAngle = nearestEnemy ? Math.atan2(nearestEnemy.y - myPlayer.y, nearestEnemy.x - myPlayer.x) : (myPlayer?.dir ?? 0)
};

/** PLACE REPEATER **/
let placeRepeater = (key, action) => {
    return {
        interval: null,
        action,
        key,
    };
}
let grindInterval;
let repeaters = [
    placeRepeater("q", () => {
        place(foodType);
    }),
    placeRepeater("f", () => {
        place(boostType);
    }),
    placeRepeater("v", () => {
        place(spikeType);
    }),
    placeRepeater("F", () => {
        place(millType);
    }),
    placeRepeater("h", () => {
place(turretType);
    }),
    placeRepeater("t", () => {
        place(wallType);
    }),
    placeRepeater("c",() => {
           // let c = myPlayer.dir;
                place(spikeType, myPlayer.dir + toRad(0));
        place(spikeType, myPlayer.dir + toRad(120));
        place(spikeType, myPlayer.dir - toRad(120));
    }),
        placeRepeater("z",() => {
                let a = myPlayer.dir;
        place(boostType, myPlayer.dir + toRad(45));
        place(boostType, myPlayer.dir - toRad(45));
        place(boostType, myPlayer.dir + toRad(135));
        place(boostType, myPlayer.dir - toRad(135));
        place(boostType, myPlayer.dir + toRad(0));
        place(boostType, myPlayer.dir - toRad(180));
        place(boostType, myPlayer.dir + toRad(90));
        place(boostType, myPlayer.dir - toRad(90));
        place(boostType, a);
                }),
        placeRepeater("g", () => {
    place(spikeType, myPlayer.dir + toRad(90));
    place(spikeType, myPlayer.dir - toRad(90));
    place(boostType, myPlayer.dir);
    }),
        placeRepeater(" ", () => {
    }),
];
/** HIT **/
let hit = () => {
    sendPacket("F", 1, enemyAngle);
    sendPacket("F", 0);
}

/** SOCKET CONNECTION **/
let socketFound = stuff => {
    stuff.addEventListener("message", handleMessage);
    gameCanvas.addEventListener("mousemove", ({ x, y }) => {
        mouseX = x;
        mouseY = y;
    });
    window.addEventListener("resize", () => {
        height = innerHeight;
        width = innerWidth;
    });
};
/** MOVEMENT **/
let moveEz = (key, isKeyDown) => {
    moveKeys[key] = isKeyDown;
    if ((moveKeys.w || moveKeys.a || moveKeys.s || moveKeys.d) && !locked) {
       // storeEquip(12, 0);
        locked = true;
    }
    if (!moveKeys.w && !moveKeys.a && !moveKeys.s && !moveKeys.d && locked) {
      // storeEquip(6, 0);
        locked = false;
    }
};
let soike = 0;
/** AUTO HEAL **/
let defHealSpeed = 120;
let autoHeal = (health, damage) => {
    let cHealSpeed = defHealSpeed;
    if (health <= 50) {
        cHealSpeed = 100;
        place(foodType, null);
        place(foodType, null);
        place(foodType, null);
        place(foodType, null);
        place(foodType, null);
        storeEquip(21, 1);
    } else if (damage >= 30) {
        cHealSpeed = 110;
        place(foodType, null);
        place(foodType, null);
        place(foodType, null);
        place(foodType, null);
        storeBuy(21, 1);
        storeEquip(21, 1);
    }
    if (health < myPlayer.maxHealth) {
        let healing = setInterval(() => {
            if (myPlayer.health < myPlayer.maxHealth) {
                place(foodType, null);
            } else {
                clearInterval(healing);
            }
        }, cHealSpeed);
    }
};
    setInterval(function() {
if (soike === 1 && myPlayer.age > 5){
    soike = 0;
        place(spikeType, myPlayer.dir + toRad(45));
        place(spikeType, myPlayer.dir - toRad(45));
        place(spikeType, myPlayer.dir + toRad(135));
        place(spikeType, myPlayer.dir - toRad(135));
        place(spikeType, myPlayer.dir + toRad(0));
        place(spikeType, myPlayer.dir - toRad(180));
        place(spikeType, myPlayer.dir + toRad(90));
        place(spikeType, myPlayer.dir - toRad(90));
    soike = 0;
}
}, 100);
    setInterval(function() {
        if (myPlayer.hat === 45) {
        storeEquip(13, 1);
        }
}, 100);
/** UPDATE HEALTH **/
let lastHealth = 100;
let updateHealth = (health, playerID) => {
    if (myPlayer.id === playerID) {
        let damage = Math.max(0, lastHealth - health);
        myPlayer.health = health;
        if (myPlayer.health > 0) {
            autoHeal(myPlayer.health, damage);
        }
        lastHealth = health;
    } else {
        enemy.health = health;
    }
};
/** INSTA KILL **/
let instaKill = (...instaType) => {
    let type = instaType[0];

    switch (type) {
        case "normal":
            sendChat("");
            storeBuy(0, 1);
            storeEquip(0, 1);
            setTimeout(()=>{
                 storeBuy(7, 0);
                 storeEquip(7, 0);
                                 equipWeapon(primary);
                 hit();
                 setTimeout(()=>{
                    equipWeapon(secondary);
                    hit();
                                         storeBuy(53, 0);
                    storeEquip(53, 0);
                    setTimeout(() => {
                          storeBuy(6, 0);
                          storeEquip(6, 0);
                        if (secondary == 15){
                            equipWeapon(secondary);
                            setTimeout(()=>{
                            equipWeapon(primary);
                            },1500);
                        } else if (secondary == 12){
                            equipWeapon(secondary);
                            setTimeout(()=>{
                            equipWeapon(primary);
                            },1000);
                        } else if (secondary == 13){
                            equipWeapon(secondary);
                            setTimeout(()=>{
                            equipWeapon(primary);
                            },400);
                        }
                        setTimeout(() => {
                          storeBuy(11, 1);
                          storeEquip(11, 1);
                           equipWeapon(primary);
                            equipWeapon(secondary);
                    }, 170);
                    }, 170);
                  }, 120);
             }, 120);
            break;

        case "boostTick":
            sendChat("");
            storeEquip(0, 1);
            place(boostType, null);
                        setTimeout(()=>{
                 equipWeapon(secondary);
                 storeBuy(53, 0);
                 storeEquip(53, 0);
                 hit();
                 setTimeout(()=>{
                    equipWeapon(primary);
                    storeBuy(7, 0);
                    storeEquip(7, 0);
                     if (enemy.health > 0){
                     place(spikeType, null);
                     } else{
                     place(foodType, null);
                     }
                    hit();
                    setTimeout(() => {
                          storeBuy(6, 0);
                          storeEquip(6, 0);
                        setTimeout(() => {
                          storeBuy(11, 1);
                          storeEquip(11, 1);
                            if (secondary == 15){
                            equipWeapon(secondary);
                            setTimeout(()=>{
                            equipWeapon(primary);
                            },1500);
                        } else if (secondary == 12){
                            equipWeapon(secondary);
                            setTimeout(()=>{
                            equipWeapon(primary);
                            },1000);
                        } else if (secondary == 13){
                            equipWeapon(secondary);
                            setTimeout(()=>{
                            equipWeapon(primary);
                            },400);
                        }
                           equipWeapon(primary);
                            equipWeapon(secondary);
                    }, 170);
                    }, 170);
                  }, 110);
             }, 100);
            break;

        case "reverseInsta":
            sendChat("");
                        storeEquip(0, 1);
                        setTimeout(()=>{
                 equipWeapon(secondary);
                 storeBuy(53, 0);
                 storeEquip(53, 0);
                 hit();
                 setTimeout(()=>{
                                         storeBuy(7, 0);
                    storeEquip(7, 0);
                    hit();
                    equipWeapon(primary);
                    setTimeout(() => {
                          storeBuy(6, 0);
                          storeEquip(6, 0);
                        setTimeout(() => {
                          storeBuy(11, 1);
                          storeEquip(11, 1);
                            if (secondary == 15){
                            equipWeapon(secondary);
                            setTimeout(()=>{
                            equipWeapon(primary);
                            },1500);
                        } else if (secondary == 12){
                            equipWeapon(secondary);
                            setTimeout(()=>{
                            equipWeapon(primary);
                            },1000);
                        } else if (secondary == 13){
                            equipWeapon(secondary);
                            setTimeout(()=>{
                            equipWeapon(primary);
                            },400);
                        }
                           equipWeapon(primary);
                            equipWeapon(secondary);
                    }, 170);
                    }, 170);
                  }, 100);
             }, 100);

            break;

        case "oneTick":
                        sendChat("");
            storeEquip(0, 1);
                        setTimeout(()=>{
                 equipWeapon(primary);
                 storeBuy(7, 0);
                 storeEquip(7, 0);
                 hit();
                 setTimeout(()=>{
                    equipWeapon(secondary);
                     place(spikeType, null);
                     hit();
                     storeEquip(53, 0);
                        setTimeout(() => {
                          storeBuy(6, 0);
                          storeEquip(6, 0);
                            equipWeapon(primary);
                            setTimeout(() => {
                          storeBuy(11, 1);
                          storeEquip(11, 1);
                           equipWeapon(secondary);
                    }, 800);
                    }, 170);
                  }, 105);
             }, 100);

            break;

        default:
            sendChat("");
            break;
    }
};

let instaKillMode = 0;
let isInstaKillModeEnabled = false;

let humanBasedInsta = () => {
    if (!isInstaKillModeEnabled) return;

    switch (instaKillMode) {
        case 0:
            equipWeapon(primary);
            storeBuy(7, 0);
            storeEquip(7, 0);
            hit();
            break;

        case 1:
            equipWeapon(secondary);
            storeBuy(53, 0);
            storeEquip(53, 0);
            hit();
            break;

        case 2:
            equipWeapon(primary);
            storeBuy(6, 0);
            storeEquip(6, 0);
            break;

        case 3:
            sendChat("");
            break;

        default:
            sendChat("");
            break;
    }

    instaKillMode = (instaKillMode + 1) % 4;
};
let movementdir;
document.addEventListener("keydown", (event) => {
 if (event.key === "w") {
     movementdir = -1.57;
  }
});
document.addEventListener("keydown", (event) => {
  if (event.key === "d") {
     movementdir = 0;
  }
});
document.addEventListener("keydown", (event) => {
  if (event.key === "s") {
     movementdir = 1.57;
  }
});
document.addEventListener("keydown", (event) => {
if (event.key === "a") {
     movementdir = -3.14
  }
});
document.addEventListener("keydown", (event) => {
      if (event.key === ",") {
        storeBuy(31, 0);
        storeEquip(31, 0);
  }
});
document.addEventListener("keydown", (event) => {
  if (event.key === ",") {
        storeBuy(15, 0);
        storeEquip(15, 0);
  }
});
document.addEventListener("keydown", (event) => {
  if (event.key === "e") {
        storeEquip(20, 0);
  }
});
let autoa = false;
let aInterval;
    document.addEventListener("keydown", (event) => {
  if (event.key === "/") {
    autoa = !autoa;
    sendChat(autoa ? "" : "");

    if (autoa) {
      aInterval = setInterval(() => {
          setTimeout(() => {
    storeBuy(8, 0);
    storeEquip(8, 0);
    setTimeout(() => {
    storeBuy(15, 0);
    storeEquip(15, 0);
                    }, 150);
                    }, 150);
      }, 300);
    } else {
      clearInterval(aInterval);
    }
  }
});
document.addEventListener("keydown", (event) => {
      if (event.key === "`") {
      weapongrind = !weapongrind;
      sendChat(weapongrind ? "ON" : "OFF");
  }
});
let keys = {};

document.addEventListener("keydown", (event) => {
    keys[event.code] = true;
if (window.location.hostname === "sandbox.moomoo.io") {
    // Check if both keys are pressed
    if (keys["KeyW"] && keys["KeyD"]) {
        movementdir = -0.785;
    }
            if (keys["KeyD"] && keys["KeyS"]) {
        movementdir = 0.785;
    }
            if (keys["KeyS"] && keys["KeyA"]) {
        movementdir = 2.355;
    }
            if (keys["KeyA"] && keys["KeyW"]) {
        movementdir = -2.355;
    }
}
});
document.addEventListener("keyup", (event) => {
    keys[event.code] = false;
});
//autospike
/** KEY EVENTS **/
document.addEventListener('keydown', ({ key }) => {
    if (key == 'Escape') {
        let menu = document.getElementById('modMenu');
        if (menu) {
            if (menu.style.visibility === 'hidden') {
                menu.style.visibility = 'visible';
                menu.style.opacity = '1';
                menu.style.transform = 'translate(-50%, -50%) scale(1)';
                menuOpened = true;
            } else {
                menu.style.opacity = '0';
                menu.style.transform = 'translate(-50%, -50%) scale(0.95)';
                menuOpened = false;
                menu.style.visibility = 'hidden';
            }
        }
    }
    if (!checkMenu()) return;
    for (let repeater of repeaters) {
        if (repeater.key === key && repeater.interval === null) {
            repeater.interval = setInterval(
                repeater.action, 100
            );
        }
    }
    // if (key in moveKeys) moveEz(key, true);
    if (key == "r") {
        let instaTypes = document.getElementById('instaKillType');
        let instaType = instaTypes.value;
        instaKill(instaType);
    }
});

document.addEventListener('keyup', ({ key }) => {
    if (!checkMenu()) return;
    for (let repeater of repeaters) {
        if (repeater.key === key && repeater.interval !== null) {
            clearInterval(repeater.interval);
            repeater.interval = null;
        }
    }
    // if (key in moveKeys) moveEz(key, false);
});
function toRad(angle) {
    return angle * 0.01745329251;
}
let automill = false;
let millInterval;
if (window.location.hostname === "sandbox.moomoo.io") {
document.addEventListener("keydown", (event) => {
  if (event.key === "=") {
      automill = !automill;
                if (automill) {
      millInterval = setInterval(() => {
          place(millType, movementdir - 1.90);
          place(millType, movementdir - 3.14);
          place(millType, movementdir + 1.90);
      }, 135);
    } else {
      clearInterval(millInterval);
    };
  }
  });
};
/** MOUSE EVENTS **/
document.addEventListener('mousedown', (mouse) => {
    if (!checkMenu()) return;
    if (mouse.button === 0 && !lockers.attacker) {
        humanBasedInsta();
        if (!isInstaKillModeEnabled) {
            storeBuy(11, 1);
            storeEquip(0, 1);
                        equipWeapon(primary);
            setTimeout(()=>{
                storeBuy(7, 0);
                storeEquip(7, 0);
                autoGather();
            }, 100);
            lockers.attacker = true;
        }
    }
    if (mouse.button === 2 && !lockers.breaker) {
        if (!isInstaKillModeEnabled) {
            sendChat("");
            storeBuy(40, 0);
            storeEquip(40, 0);
            autoGather();

            lockers.breaker = true;
        }
        if (secondary == 10 && weapongrind == false) {
        equipWeapon(secondary);
        }
    }
});

document.addEventListener('mouseup', (mouse) => {
    if (!checkMenu()) return;
    if (mouse.button === 0 && lockers.attacker) {
        if (!isInstaKillModeEnabled) {
            storeBuy(11, 1);
            storeEquip(11, 1);
            autoGather();
            setTimeout(()=>{
                storeBuy(6, 0);
                storeEquip(6, 0);
            }, 200);
            lockers.attacker = false;
        }
    }
    if (mouse.button === 2 && lockers.breaker) {
        if (!isInstaKillModeEnabled) {
            storeBuy(6, 0);
            storeEquip(6, 0);
            autoGather();
            lockers.breaker = false;
        }
    }
});
let prevCount = 0;
const handleMutations = (mutationsList) => {
    for (const mutation of mutationsList) {
        if (mutation.target.id === "killCounter") {
            const count = parseInt(mutation.target.innerText, 10) || 0;
            if (count > prevCount) {
                sendChat("Pls, say hi to Good Guy,");
                setTimeout(()=>{
                    sendChat("When you meet him :D");
                },650);
                prevCount = count;
            }
        }
    }
};
const observer = new MutationObserver(handleMutations);
observer.observe(document, {
    subtree: true,
    childList: true,
});
setInterval(function() {
    if (myPlayer.y > 6830 && myPlayer.y < 7600) {
        storeBuy(31, 0);
        storeEquip(31, 0);
    }
}, 130);
setInterval(function() {
    if (myPlayer.y < 2400) {
       storeEquip(15, 0);
       storeEquip(15, 0);
    }
}, 900);
setInterval(function() {
    storeBuy(11, 1);
}, 100);
setInterval(function() {
    storeBuy(6, 0);
}, 100);
setInterval(function() {
    storeBuy(7, 0);
}, 100);
setInterval(function() {
    storeBuy(40, 0);
}, 100);
/*


STYLING AND MOD MENUS UNDER


*/


/** MOD MENU **/
let createModMenu = () => {
    let menuContainer = document.createElement('div');
    menuContainer.id = 'modMenu';

    menuContainer.innerHTML = `
        <h2 class="mod-menu-title">
        </h2>
        <div class="menu-item" style="margin-top: 0px;">
            <label style="cursor: pointer;">
                <div class="toggle-switch">
                    <input type="checkbox" id="fpsBoosterToggle" class="checkbox">
                    <span class="slider"></span>
                </div>
                <span class="menu-label">FPS Booster</span>
            </label>
        </div>
        <div class="menu-item" style="margin-top: 0px;">
            <label style="cursor: pointer;">
                <div class="toggle-switch">
                    <input type="checkbox" id="autoGatherToggle" class="checkbox">
                    <span class="slider"></span>
                </div>
                <span class="menu-label">Auto Gather</span>
            </label>
        </div>
        <div class="menu-item">
            <label for="instaKillType" style="font-size: 16px">InstaKill Type:</label>
            <select id="instaKillType">
                            <option value="normal">Normal Insta</option>
                            <option value="reverseInsta">Reverse Insta</option>
                            <option value="boostTick">Boost Tick</option>
                            <option value="oneTick">One Tick</option>
            </select>
        </div>
        <div class="menu-footer">
            Credits: SaVeGe
        </div>
    `;

    document.body.appendChild(menuContainer);

    document.getElementById('fpsBoosterToggle').checked = FPSBooster;
    document.getElementById('fpsBoosterToggle').addEventListener('change', (e) => {
        FPSBooster = e.target.checked;
        updateScreen();
    });

    document.getElementById('autoGatherToggle').addEventListener('change', (e) => {
        if (e.target.checked) {
            autoGather();
        } else {
            autoGather();
        }
    });
};

createModMenu();

let menuStyles = `
    @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap');

    #modMenu {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%) scale(0.95);
        width: 420px;
        background: rgba(30, 30, 30, 0.8);
        border-radius: 20px;
        padding: 20px;
        box-shadow: 0 15px 35px rgba(0, 0, 0, 0.4);
        color: #ffffff;
        visibility: hidden;
        opacity: 0;
        z-index: 10000;
        font-family: 'Poppins', sans-serif;
        transition: transform 0.6s ease, opacity 0.6s ease, visibility 0.6s ease;
        border: 1px solid rgba(255, 255, 255, 0.25);
    }

    #modMenu h2 {
        text-align: center;
        color: #ffffff;
        font-size: 36px;
        letter-spacing: 1.5px;
        margin-bottom: 20px;
        text-shadow: 0px 2px 5px rgba(0, 0, 0, 0.5);
    }

    #modMenu .menu-item {
        margin-bottom: 15px;
    }

    #modMenu .menu-footer {
        margin-top: 20px;
        text-align: center;
        color: #ccc;
        font-size: 14px;
        font-style: italic;
    }

    #modMenu .toggle-switch {
        position: relative;
        display: inline-block;
        width: 50px;
        height: 26px;
    }

    #modMenu .toggle-switch input {
        display: none;
    }

    #modMenu .slider {
        position: absolute;
        cursor: pointer;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background-color: rgba(255, 255, 255, 0.2);
        border-radius: 34px;
        transition: background-color 0.4s, box-shadow 0.4s;
        box-shadow: inset 0px 2px 4px rgba(0, 0, 0, 0.3);
    }

    #modMenu .slider:before {
        position: absolute;
        content: "";
        height: 22px;
        width: 22px;
        left: 4px;
        bottom: 2px;
        background-color: #ffffff;
        border-radius: 50%;
        transition: transform 0.4s, box-shadow 0.4s;
        box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.3);
    }

    #modMenu input:checked + .slider {
        background-color: rgba(0, 234, 255, 0.8);
        box-shadow: 0 0 15px rgba(0, 234, 255, 0.6);
    }

    #modMenu input:checked + .slider:before {
        transform: translateX(24px);
        box-shadow: 0px 4px 6px rgba(0, 234, 255, 0.6);
    }

    #modMenu .menu-label {
        position: absolute;
        font-size: 16px;
        margin-top: 5px;
        color: #ddd;
        margin-left: 10px;
        transition: color 0.3s ease;
        text-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
    }

    #modMenu select {
        background: rgba(255, 255, 255, 0.2);
        border: 1px solid rgba(255, 255, 255, 0.4);
        border-radius: 5px;
        color: #ddd;
        padding: 10px;
        font-size: 16px;
        font-family: 'Poppins', sans-serif;
        width: 100%;
        margin-top: 5px;
        transition: background 0.3s, border-color 0.3s;
    }

    #modMenu select:hover {
        background: rgba(255, 255, 255, 0.3);
        border-color: rgba(255, 255, 255, 0.6);
    }

    #modMenu select option {
        background-color: rgba(30, 30, 30, 0.8);
        color: #ffffff;
    }

    #modMenu select option:hover {
        background-color: rgba(0, 234, 255, 0.5);
    }

    #modMenu select:focus {
        outline: none;
        border-color: rgba(0, 234, 255, 0.8);
        background-color: rgba(255, 255, 255, 0.3);
    }

    #modMenu button {
        background: rgba(255, 255, 255, 0.2);
        border: 1px solid rgba(255, 255, 255, 0.4);
        color: #ffffff;
        border-radius: 5px;
        padding: 12px 20px;
        font-size: 18px;
        cursor: pointer;
        transition: background 0.3s, box-shadow 0.3s;
        width: 100%;
    }

    #modMenu button:hover {
        background: rgba(255, 255, 255, 0.3);
        border-color: rgba(255, 255, 255, 0.6);
    }
    #leaderboard::after {
        display: block;
        font-size: 40px;
        text-align: center;
        margin: 0 auto;
    }
`;

let styleSheet = document.createElement('style');
Object.assign(styleSheet, { type: 'text/css', textContent: menuStyles });
document.head.append(styleSheet);