🏠 Home 

Greasy Fork is available in English.

Clap mod

Public mod for MooMoo.io


Installer dette script?
// ==UserScript==
// @name         Clap mod
// @namespace    Good Guy
// @version      v1
// @description  Public mod for MooMoo.io
// @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
// ==/UserScript==
/** VARIABLES **/
document.getElementById("gameName").innerHTML = "Clap mod";
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);
}
};
/** 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) {
let pixelDensity = 0.35;
let scale = Math.max(currentWidth / maxScreenWidth, currentHeight / maxScreenHeight) * pixelDensity;
gameCanvas.width = currentWidth * pixelDensity;
gameCanvas.height = currentHeight * pixelDensity;
gameCanvas.style.width = `${currentWidth}px`;
gameCanvas.style.height = `${currentHeight}px`;
mainContext.setTransform(scale, 0, 0, scale, (currentWidth * pixelDensity - maxScreenWidth * scale) / 2, (currentHeight * pixelDensity - maxScreenHeight * scale) / 2);
} else {
let pixelDensity = 0.8;
let scale = Math.max(currentWidth / maxScreenWidth, currentHeight / maxScreenHeight) * pixelDensity;
gameCanvas.width = currentWidth * pixelDensity;
gameCanvas.height = currentHeight * pixelDensity;
gameCanvas.style.width = `${currentWidth}px`;
gameCanvas.style.height = `${currentHeight}px`;
mainContext.setTransform(scale, 0, 0, scale, (currentWidth * pixelDensity - maxScreenWidth * scale) / 2, (currentHeight * pixelDensity - maxScreenHeight * scale) / 2);
}
};
window.addEventListener("resize", checker.check(updateScreen));
/** 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 a###rice = (accessoryId) => {
let a###rice = {
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 a###rice[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 = a###rice(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) {
sendPacket("H");
}
/** 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 = (Math.sqrt(Math.pow((myPlayer.y - nearestEnemy), 2) + Math.pow((myPlayer.x-nearestEnemy[1]), 2)) < 300) /**nearestEnemy ? (Math.sqrt(Math.pow(myPlayer.y - nearestEnemy.y, 2) + Math.pow(myPlayer.x - nearestEnemy.x, 2)) < 320) : false;
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 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);
}),
];
/** 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;
}
};
/** AUTO HEAL **/
let defHealSpeed = 200;
let autoHeal = (health, damage) => {
let cHealSpeed = defHealSpeed;
if (health <= 50) {
cHealSpeed = 230;
place(foodType);
storeEquip(21, 1);
sendChat("");
if (health < 100){
place(foodType);
}
} else if (damage >= 35) {
sendChat("");
spike = 1;
storeEquip(21, 1);
cHealSpeed = 170;
place(foodType, null);
}
if (health < myPlayer.maxHealth) {
let healing = setInterval(() => {
if (myPlayer.health < myPlayer.maxHealth) {
place(foodType, null);
} else {
clearInterval(healing);
}
}, cHealSpeed);
}
};
/** 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(()=>{
storeBuy(53, 0);
storeEquip(53, 0);
equipWeapon(secondary);
hit();
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);
}, 105);
}, 100);
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);
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);
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
}
});
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;
});
// clown hat
let clownInterval;
setInterval(function() {
if (myPlayer.hat === 45) {
storeBuy(13, 1);
storeEquip(13, 1);
}
}, 100);
//autospike
let spikeInterval;
setInterval(function() {
if (spike === 1) {
let c = myPlayer.dir;
place(spikeType, myPlayer.dir + toRad(0));
place(spikeType, myPlayer.dir + toRad(120));
place(spikeType, myPlayer.dir - toRad(120));
place(spikeType, c);
spike = 0;
}
}, 100);
/** 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);
});
document.addEventListener("keydown", (event) => {
if (event.key === "c") {
let c = myPlayer.dir;
place(spikeType, myPlayer.dir + toRad(0));
place(spikeType, myPlayer.dir + toRad(120));
place(spikeType, myPlayer.dir - toRad(120));
place(spikeType, c);
storeEquip(0, 1);
setTimeout(()=>{
equipWeapon(primary);
storeBuy(7, 0);
storeEquip(7, 0);
hit();
setTimeout(()=>{
equipWeapon(secondary);
hit();
storeEquip(53, 0);
setTimeout(() => {
storeBuy(53, 0);
storeEquip(53, 0);
if (enemy.object) {
place(spikeType);
}
setTimeout(() => {
storeBuy(6, 0);
storeEquip(6, 0);
equipWeapon(primary);
setTimeout(() => {
storeBuy(11, 1);
storeEquip(11, 1);
equipWeapon(secondary);
}, 800);
}, 170);
}, 120);
}, 105);
}, 100);
}
});
document.addEventListener("keydown", (event) => {
if (event.key === ",") {
storeBuy(31, 0);
storeEquip(31, 0);
}
});
document.addEventListener("keyup", (event) => {
if (event.key === ",") {
storeBuy(15, 0);
storeEquip(15, 0);
}
});
document.addEventListener("keydown", (event) => {
if (event.key === "e") {
storeEquip(20, 0);
}
});
let x = myPlayer.x;
let y = myPlayer.y;
function toRad(angle) {
return angle * 0.01745329251;
}
document.addEventListener("keydown", (event) => {
if (event.key === "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);
}
});
let autospin = false;
let spinInterval;
document.addEventListener("keydown", (event) => {
if (event.key === ".") {
autospin = !autospin;
sendChat(autospin ? "" : "");
if (autospin) {
let autospinDir = myPlayer.dir;
spinInterval = setInterval(() => {
myPlayer.dir + toRad(45);
myPlayer.dir - toRad(45);
myPlayer.dir + toRad(135);
myPlayer.dir - toRad(135);
myPlayer.dir = autospin.dir;
}, 100);
} else {
clearInterval(spinInterval);
}
}
});
let automill = false;
let millInterval;
if (window.location.hostname === "sandbox.moomoo.io") {
document.addEventListener("keydown", (event) => {
if (event.key === "n") {
automill = !automill;
if (automill) {
millInterval = setInterval(() => {
place(millType, movementdir - 1.90);
place(millType, movementdir - 3.14);
place(millType, movementdir + 1.90);
}, 100);
} 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;
}
}
});
//bow insta
document.addEventListener('mousedown', (mouse) => {
if (mouse.button === 1) {
sendChat("");
storeEquip(0, 1);
setTimeout(() => {
equipWeapon(secondary);
hit();
setTimeout(() => {
sendUpgrade(12);
hit();
storeEquip(53, 0);
setTimeout(() => {
sendUpgrade(15);
hit();
}, 100);
}, 100);
}, 100);
}
});
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) {
if (myPlayer.clan != null){
sendChat("Clap mod by Good Guy");
setTimeout(()=>{
sendChat(count + " kills");
},650);
}
prevCount = count;
}
}
}
};
const observer = new MutationObserver(handleMutations);
observer.observe(document, {
subtree: true,
childList: true,
});
setInterval(function() {
if (myPlayer.y > 6850 && myPlayer.y < 7550) {
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);
// weapond grinder
document.addEventListener("keydown", (event) => {
if (event.key === "`") {
sendChat("Weapond Grinding...");
weapongrind = !weapongrind;
}
});
/*
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="reverseInsta">Reverse Insta</option>
<option value="boostTick">Boost Tick</option>
<option value="normal">Normal Insta</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);