// ==UserScript==
// @name _-*.:GPT-MOD:.*-_
// @description Autobreak-trap, Autoheal, Hat macros, Anti-trap, AutoPush & more!
// @version s.2
// @author Thiago
// @match *://sploop.io/*
// @run-at document-start
// @require http://code.jquery.com/jquery-3.3.1.min.js
// @require https://code.jquery.com/ui/1.12.0/jquery-ui.min.js
// @grant none
// @namespace https://greasyfork.org/users/761829
// ==/UserScript==
const { log } = console;
var autoChoose = true; // SET TO false IF YOU WANT TO DISABLE
let version = "3.2.3.1"
let wsPushing = false
let Game;
let Entity = new Array();
let Canvas;
let Context;
let ctx;
let keyDown = [];
let user = {};
let tribe = [];
let enemy;
let encoder = new TextEncoder();
let decoder = new TextDecoder();
let server;
let teammates = [];
let Config = {
update: (type) => {
Config[type] += 1;
setTimeout(() => (Config[type] -= 1), 1e3);
},
serverUpdate: 1e3 / 9,
breaking: false,
pushing: false,
rate: 1e3,
pps: 0,
weapon: 0,
cps: 0,
tps: 0,
fps: 0,
ping: 0,
enemiesNear: [],
freeze: {
send: true,
pps: true,
message: false,
setup: false
},
angle: 0,
move: 0,
messages: new Array([], []),
counter: 0,
resolver: function () {
},
last: Date.now(),
chat: ["♫©§☼<◄ø▲►>§²¯-_®♫♀↨§", "OW U ME HACK X.+*!-?", "MI HACK IS GPT BEST HACK", "MI HACK IS GPT BEST HACK", "AND THE HACK IS CREATED BY I", "", "IS", "PRO NO noob¡"] ,
isJson: (data) => {
try {
JSON.parse(data);
} catch (e) {
return false;
}
return true;
},
WS: null
};
Config.tick = () => {
return new Promise((e) => (Config.resolver = e))
};
let Toggle = {
UI: true,
autoBreak: true,
autoPush: true,
autoPlace: true,
autoSync: true,
autoRespawn: false,
autoChat: false,
tracers: true,
autoHeal: true,
optHeal: false,
}
class Macro {
constructor(advanced, spike, trap, mill, food) {
this.advanced = advanced;
this.spike = spike;
this.trap = trap;
this.mill = mill;
this.food = food;
};
update() {
setTimeout(() => {
if (keyDown[this.spike]) Sploop.newPlace(4);
if (keyDown[this.trap]) Sploop.newPlace(7);
if (keyDown[this.mill]) Sploop.newPlace(5);
if (keyDown[this.food]) Sploop.newPlace(2);
}, 14);
};
};
let Placer = new Macro(true, 86, 70, 78, 81);
class Sploop {
static place(id, angle = Config.angle) {
Config.update('cps');
Sploop.take(id);
Sploop.hit(angle);
Sploop.take(Config.weapon);
}
static newPlace(id, angle = Config.angle) {
let increasor = Math.PI / 8; // 22.25 radians
let offset = Math.PI / 4; // 45 radians
this.place(id, angle, true)
for (let newAngle = 0; newAngle < offset; newAngle += increasor) {
Sploop.place(id, angle - newAngle);
Sploop.place(id, angle + newAngle);
}
Sploop.take(Config.weapon);
}
static quad(id, angle = 0) {
for (let newAngle = 0; newAngle < Math.PI * 2; newAngle += Math.PI / 8) {
let time = (Config.serverUpdate / 4) * (newAngle / (Math.PI / 8))
setTimeout(() => Sploop.place(7, angle + newAngle), time);
}
}
static heal(amount) {
for (let count = 0; count <= amount; count++) Sploop.place(2);
}
static equip(id) {
if (user.skin != id) Game.send(new Uint8Array([5, id]));
}
static walk(angle = Config.move) {
if (typeof angle !== 'number') return Game.send(new Uint8Array([1, 0]));
angle = (65535 * (angle + Math.PI)) / (2 * Math.PI);
Game.send(new Uint8Array([1, 255 & angle, (angle >> 8) & 255]));
}
static take(id) {
Game.send(new Uint8Array([0, id]));
}
static chat(text) {
text = encoder.encode(text);
Game.send(new Uint8Array([7, ...text]))
}
static hit(angle) {
angle = (65535 * (angle + Math.PI)) / (2 * Math.PI);
Game.send(new Uint8Array([19, 255 & angle, (angle >> 8) & 255]));
Game.send(new Uint8Array([18]));
}
static watch(angle) {
angle = (65535 * (angle + Math.PI)) / (2 * Math.PI);
Game.send(new Uint8Array([13, 255 & angle, (angle >> 8) & 255]));
}
static offensive() {
let offensive = () => {
let distance = enemy ? getDistance(enemy, user) : 0;
if (user.y <= 9e3 && user.y >= 8e3) return 9;
if (enemy && distance <= 300) return false && distance <= 150 ? 6 : 5;
return 7;
}
Sploop.equip(offensive());
}
static healthChange(health, oldHealth) {
if (oldHealth > health) {
user.hitDate = Config.counter;
}
;
user.health = health;
}
/* static mine(build){
if(user.id2 == build.id2) return true;
if(user.team){
let length = tribe.length;
for(let index = 0; index < length; index++) {
let teammate = tribe[index];
if(build.id2 == teammate.id2) return true;
}
}
return false;
}*/
static update() {
Config.counter += 1;
Config.resolver();
Config.last = Date.now();
if (user.alive) {
if (user.health < 100 && Toggle.autoHeal) {
log("damage")
setTimeout(() => {
Sploop.heal(1);
}, Toggle.optHeal ? (Config.serverUpdate - 20 - Config.ping) + parseInt(document.querySelector('[data-speed="addms"]').value) : parseInt(document.querySelector('[data-speed="heal"]').value));
}
;
let trap = Entity.find(c => c && getDistance(c, user) <= 50 && c.type == 6 && !teammates.includes(c.id2) && user.id2 !== c.id2);
let wasBreaking = Config.breaking;
Config.breaking = false;
if (trap && Toggle.autoBreak) {
console.log(trap, user)
let angle = getAngle(trap, user);
Config.breaking = true;
Sploop.chat("");
Sploop.hit(angle);
Sploop.equip(6);
if (!wasBreaking) Sploop.quad(7, angle);
} else if (wasBreaking) {
Sploop.chat("");
Sploop.offensive();
}
let wasPushing = Config.pushing;
Config.pushing = false;
if (enemy && !trap && user.alive) {
let distance = getDistance(enemy, user);
if (Toggle.autoPush && distance <= 250) {
let trap = Entity.find(c => c && getDistance(c, enemy) <= 60 && c.type == 6 && c.id !== enemy.id);
if (wsPushing && !trap) {
wsPushing = false;
Sploop.walk('stop');
}
if (trap) {
let spikes = Entity.filter(c => c && [2, 7, 17].includes(c.type) && c.id !== enemy.id && getDistance(c, trap) <= 130);
if (wsPushing && !spikes.length) {
wsPushing = false;
Sploop.walk('stop');
}
if (spikes.length) {
let spike = spikes.sort((a, b) => getDistance(a, trap) - getDistance(b, trap))[0];
let angle = getAngle(enemy, spike);
distance = getDistance(enemy, spike) + 70;
let position = {
x: spike.x + (distance * Math.cos(angle)),
y: spike.y + (distance * Math.sin(angle))
};
distance = getDistance(position, user);
angle = () => {
wsPushing = true;
if (distance > 100) {
return getAngle(position, user)
} else {
let angleDifference = Math.abs(getAngle(spike, position) - getAngle(spike, user))
let message = `diffence [${angleDifference / (Math.PI / 180)}]`
Sploop.chat(`INFINITED-$XD{(angleDifference / (Math.PI / 180)).toFixed(3)}`)
// Sploop.chat(message);
return getAngle(enemy, user)
}
}
Config.pushing = true;
Sploop.walk(angle())
}
}
}
distance = getDistance(enemy, user)
if (Toggle.autoPlace && distance <= 200) {
let trap = Entity.find(c => c && c.type == 6 && enemy.id !== c.id && getDistance(c, enemy) <= 50);
let enemyPos = {
x: enemy.x + enemy.xVel,
y: enemy.y + enemy.yVel
}
let userPos = {
x: user.x + user.xVel,
y: user.y + user.yVel
}
distance = getDistance(enemyPos, userPos);
let angle = getAngle(enemyPos, userPos)
let range = 28 * 2 + 50;
if (trap) {
angle = getAngle(trap, userPos);
setTimeout(() => {
Sploop.place(4, angle + (50 * Math.PI / 180));
}, 14)
} else {
if (Toggle.autoSync && distance < 250) {
let spike = Entity.find(c => c && [2, 7, 17].includes(c.type) && c.id !== enemy.id && getDistance(c, enemyPos) <= 60);
if (spike) {
Sploop.equip(2);
Sploop.take(0);
Sploop.hit(angle);
setTimeout(() => Sploop.offensive(), 2e3);
}
if (enemy.health <= (enemy.skin == 2 ? 78 : 85) && user.skin == 5 && user.health <= 70) {
Sploop.equip(2);
Sploop.take(0);
Sploop.hit(angle);
setTimeout(() => Sploop.offensive(), 2e3);
}
}
if (range >= distance) {
setTimeout(() => {
Sploop.place(7, angle);
}, 14)
}
}
}
}
if (wasPushing && !Config.pushing) Sploop.walk('Stop');
}
updateInfo()
}
}
class Script {
setup() {
this.run();
};
/*override(ws, data){
!Config.freeze.send && this.log(`WebSocket`, `⬈`, data[0], '#8ecc51');
if(Config.isJson(data)) {
let oldws = JSON.parse(data)
if(oldws[0] == 6) {
user.name = oldws[1]
}
}
ws.classic(data, true);
Config.update('pps');
}*/
send(data) {
if (this.ws && 1 === this.ws.readyState) {
if (Config.pps >= 400) return // Reduce the packet limit to do not get kicked
this.ws.send(data)
Config.update('pps');
}
}
message(event) {
let data = event.data;
let string = typeof data === 'string';
let decoded = string ? JSON.parse(data) : new Uint8Array(data);
let length = decoded.length;
let id = Number(decoded[0]);
let found = Config.messages[Number(string)].find(item => item && item.id == id);
if (!found) return !Config.freeze.message && Game.log(`WebSocket`, `⬉`, `${decoded} | ${string}`, '#c7cc51');
switch (decoded[0]) {
case 20:
Config.enemiesNear = []
enemy = null;
for (let int = 1; int < length; int += 19) {
let type = decoded[int],
owner = decoded[int + 1],
index = decoded[int + 2] | decoded[int + 3] << 8,
x = decoded[int + 4] | decoded[int + 5] << 8,
y = decoded[int + 6] | decoded[int + 7] << 8,
broken = decoded[int + 8],
skin = decoded[int + 11],
team = decoded[int + 12],
health = decoded[int + 13] / 255 * 100,
clown = decoded[int + 8];
let temp = Entity[index] || {};
if (2 && broken) Entity[index] = null;
if (!type && broken == 2) {
temp = {};
} else {
temp.type = type;
temp.id = index;
temp.health = health;
temp.xVel = temp.x - x;
temp.yVel = temp.y - y;
temp.speed = Math.hypot(y - temp.y, x - temp.x);
temp.move = Math.atan2(y - temp.y, x - temp.x);
temp.x = x;
temp.y = y;
temp.id2 = owner;
temp.skin = skin;
temp.team = team;
temp.clown = Boolean(clown);
Config.enemiesNear.push(temp)
Entity[index] = temp;
}
if (temp.id === user.id) {
Sploop.healthChange(temp.health, user.health);
Object.assign(user, temp)
} else if (!temp.type && (!user.team || temp.team != user.team)) {
let distance = Math.hypot(user.y - temp.y, user.x - temp.x);
let distance2 = enemy ? Math.hypot(user.y - enemy.y, user.x - enemy.x) : null;
if (enemy) {
if (distance < distance2) enemy = temp;
} else {
enemy = temp;
}
}
}
Config.update('tps');
Sploop.update();
break;
case 35:
user.id = decoded[1];
user.alive = true;
user.spawnDate = Date.now();
user.health = 100;
Config.weapon = 0;
break;
case 19:
user.health = 0;
user.speed = 0;
user.alive = false;
if (Toggle.autoRespawn) {
setTimeout(() => {
Game.send(Config.respawnPacket)
}, 200)
}
break;
case 28:
Sploop.chat("~D.E.S.T.R.O.Y.E.D~")
break;
case 24:
teammates = [...data.slice(3, data.length)];
break;
case 16:
teammates = [...data.slice(2, data.length)];
break;
case 27:
teammates = [];
break;
/* case 'Ping update':
Config.ping = decoded[1] | (decoded[2] << 8);
break;*/
}
Placer.update();
}
log(group, symbol, result, color) {
return log(`%c[${group}] %c${symbol}`, `color:${color};font-weight:bold`, `color:${color}`, result);
}
run(ws) {
let chatval = 0
setInterval(() => {
if (Toggle.autoChat) {
if (chatval == Config.chat.length) {
chatval = 0;
} else {
if (user.alive && Toggle.autoChat) {
chatval++
Sploop.chat(Config.chat[chatval])
}
}
}
}, 1000)
let val = [1, 2, 4, 8]
let lval = 0
setInterval(() => {
if (Toggle.antiAFK) {
lval++
Game.send(new Uint8Array([1, val[lval - 1]]))
setTimeout(() => {
Game.send(new Uint8Array([1, 0]))
}, 200)
if (lval == val.length) {
lval = 0
}
}
}, 5000)
!Config.freeze.setup && Game.log(`Hijacked Iframe`, `✔`, ws.url, '#0f0');
let notifications = `
<div class="notifications-holder"></div>
<style>
.box span {
font-size: 20px;
white-space: nowrap;
}
.box {
width: max-content;
height: 40px;
display: flex;
align-items: center;
padding-top: 3.5px;
padding-left: 7px;
padding-right: 7px;
border-radius: 7px;
background-color: rgb(40 45 34 / 60%);
border: 4px solid #141414;
margin-bottom: 5px;
color: white;
letter-spacing: 1px;
font-weight: bold;
box-shadow: inset 0 -3px 0 #333;
}
.notifications-holder {
position: absolute;
left: 20px;
top: 20px;
display: flex;
flex-direction: column;
z-index: 5;
}
</style>
`
$("body").append(notifications)
addNotifications(`The script is running!`, "#5c4ce6")
this.ws = ws;
/* let infoPanel = '\n<div class="info-panel-holder">\n <div id="info-content">\n <p id="health"></div>\n</div>\n<style>\n#info-content {\n color: #fff;\n font-size: 22px;\n text-shadow: 0px 0px 5px black, 0px 0px 7px black;\n}\n.info-panel-holder {\n position: absolute;\n top: 20px;\n left: 20px;\n}\n</style>\n';
$("body").append(infoPanel)*/
setInterval(() => {
!Config.freeze.pps && this.log(`PPS`, `⬍`, Config.pps, '#516ecc');
}, Config.rate);
Config.width = Canvas.clientWidth;
Config.height = Canvas.clientHeight;
$(window).resize(() => {
Config.width = Canvas.clientWidth;
Config.height = Canvas.clientHeight;
});
Canvas.addEventListener('mousemove', (event) => {
Config.mouseX = event.clientX;
Config.mouseY = event.clientY;
Config.angle = Math.atan2(Config.mouseY - Config.height / 2, Config.mouseX - Config.width / 2);
});
}
constructor() {
this.ws = null;
}
};
const Setup = () => {
Game = new Script();
Game.log(`Setup`, `⦿`, '', '#000000');
let data = Config.messages;
data[0][1] = { name: 'Player update', string: false };
data[0][2] = { name: 'Verify', string: false };
data[0][5] = { name: 'Choose', string: false };
data[0][7] = { name: 'Hit', string: false };
data[0][14] = { name: 'Resource update', string: false };
data[0][16] = { name: 'Projectile Hit', string: false };
data[0][18] = { name: 'Chat', string: false };
data[0][19] = { name: 'Choose x3', string: true };
data[0][20] = { name: 'Choose x2', string: false };
data[0][22] = { name: 'Ping update', string: false };
data[0][23] = { name: 'Ping update', string: false };
data[0][24] = { name: 'Create clan', string: false };
data[0][25] = { name: 'Leave clan', string: false };
data[0][26] = { name: 'Create clan', string: false };
data[0][27] = { name: 'Leave clan', string: false };
data[0][30] = { name: 'Place', string: false };
data[1][2] = { name: 'Spawn', string: true };
data[1][8] = { name: 'Player setup', string: true };
data[1][9] = { name: 'Leaderboard update', string: true };
data[1][11] = { name: 'Text', string: true };
data[1][13] = { name: 'Death', string: true };
data[1][19] = { name: 'Choose', string: true };
data[1][35] = { name: 'new Verify', string: true };
for (let index = 0; index <= 1; index++) {
let length = data[index].length;
for (let id = 0; id < length; id++) {
if (data[index][id]) data[index][id].id = id;
}
;
}
;
};
Setup();
/*
class Nuro extends WebSocket {
constructor(url, protocols) {
Config.WS = super(url, protocols);
this.addEventListener('message', event => Game.message(event));
this.classic = this.send;
this.send = data => Game.override(this, data);
window.ws = this;
Game.run(this);
}
set onmessage(f) {
!Config.freeze.setup && log('onmessage', f);
super.onmessage = f;
}
}
*/
// there you go
WebSocket.prototype.unmodifiedSend = WebSocket.prototype.send;
WebSocket.prototype.send = function (arguments) {
this.unmodifiedSend(arguments);
if (window.ws !== this) {
this.addEventListener('message', event => Game.message(event));
this.classic = this.send;
window.ws = this;
Game.run(this);
Config.WS = this.url;
}
}
// r <3
let blockReact = ['clan-menu-clan-name-input', 'nickname', 'chat'];
const keyChange = (event, down) => {
if (blockReact.includes(document.activeElement.id.toLowerCase())) return `Blocked key change.`
keyDown[event.keyCode] = down;
let isPrimary = [49, 97].includes(event.keyCode);
let isSecondary = [50, 98].includes(event.keyCode);
console.debug(event.code)
if (event.code == 'KeyY') {
let katana = [1, 12, 9, 19, 20, 15, 8, 17, 16];
katana.forEach(e => Game.send(new Uint8Array([14, e])));
}
if (down && (isPrimary || isSecondary)) Config.weapon = Number(isSecondary);
switch (event.code) {
case "ShiftLeft":
Sploop.take(Config.weapon);
break
case document.querySelector('[data-key="instakill"]').value:
log("InstaKill")
break
case document.querySelector('[data-key="crystalgear"]').value:
Sploop.equip(4)
break
case document.querySelector('[data-key="boosthat"]').value:
Sploop.equip(7)
break;
case document.querySelector('[data-key="berserkergear"]').value:
Sploop.equip(2)
break
case document.querySelector('[data-key="spikegear"]').value:
Sploop.equip(5)
break;
case document.querySelector('[data-key="Demolist"]').value:
Sploop.equip(11)
break;
}
Placer.update();
};
setInterval(Placer.update, 75);
document.addEventListener("keydown", (event) => keyChange(event, true));
document.addEventListener("keyup", (event) => keyChange(event, false));
const getDistance = (player, player2) => {
return Math.sqrt(Math.pow((player.x - player2.x), 2) + Math.pow((player.y - player2.y), 2));
}
const getAngle = (player, player2) => {
return Math.atan2(player.y - player2.y, player.x - player2.x)
}
const encodeSym = Symbol();
let init
const ReqFrame = requestAnimationFrame;
window.requestAnimationFrame = function () {
Config.update("fps");
ReqFrame.apply(this, arguments);
}
let updateInfo = () => {
if (user && user.alive) {
let Display = ``;
let addText = (text = '') => {
Display += (text + '<br/>')
}
addText(`health: ${Math.round(user.health)}/100`);
addText(`push: o${Config.pushing ? 'n' : 'ff'}line`);
addText(`stuck: ${Config.breaking ? 'yes' : 'no'}`);
addText(`speed: ${Math.round(user.speed)}`);
addText();
addText(`cps: ${Config.cps}`);
addText(`pps: ${Config.pps}`);
addText(`tps: ${Config.tps}`);
addText(`fps: ${Config.fps}`);
if (!Toggle.UI) {
Display = ""
}
$("#info-content").html(Display)
}
;
}
var ctx2d
const gctx = CanvasRenderingContext2D.prototype.clearRect;
CanvasRenderingContext2D.prototype.clearRect = function () {
if (this.canvas.id === "game-canvas") {
Canvas = this.canvas
Context = Canvas.getContext("2d")
ctx2d = this;
}
return gctx.apply(this, arguments);
}
/* Tracers */
let dlo = 0, dlod = Date.now()
function tracer(x, y, mx, my, color) {
Context.save()
Context.lineCap = "round"
Context.lineWidth = 5
Context.globalAlpha = .50
Context.beginPath()
Context.lineDashOffset = -dlo
Context.strokeStyle = color
Context.moveTo(mx, my)
Context.lineTo(x, y)
Context.stroke()
Context.restore()
}
let tracerX = 0, tracerY = 0, tracermX = 0, tracermY = 0
const { fillRect } = CanvasRenderingContext2D.prototype;
CanvasRenderingContext2D.prototype.fillRect = function (x, y, width, height) {
let cp = (tracerX > 0 && tracerY > 0 && tracermX > 0 && tracermY > 0)
if (!dlod || Date.now() - dlod >= 10) {
dlo++
dlod = Date.now()
}
if (this.fillStyle === "#a4cc4f") {
tracermX = x + 50
tracermY = y - 70
fillRect.call(this, x, y, width, height);
} else if (this.fillStyle === "#cc5151") {
tracerX = x + 50
tracerY = y - 70
fillRect.call(this, x, y, width, height);
}
if (user.alive && cp && Toggle.tracers) {
tracer(tracerX, tracerY, tracermX, tracermY, "#cc5151")
}
fillRect.call(this, x, y, width, height);
return fillRect.apply(this, arguments);
}
const { fillText } = CanvasRenderingContext2D.prototype;
CanvasRenderingContext2D.prototype.fillText = function (text, x, y) {
if (text == user.name && text.length > 1 || typeof text == "string" && text.startsWith(String.fromCharCode(0))) {
let hue = 0;
let step = 360 / user.name.length;
for (let letter of text) {
this.fillStyle = `hsl(${hue}, 100%, 50%)`;
fillText.call(this, letter, x, y);
x += this.measureText(letter).width;
hue = (hue + step) % 360;
}
return;
}
return fillText.apply(this, arguments);
}
let settingMenu = `
<div id="settingMenu" class="pop-box">
<div class="menu-title">
<div class="pop-title text-shadowed-4">Settings</div>
<div class="pop-close-button">
<img id="setting-menu-close-button" class="pop-close" draggable="false" src="https://images-ext-2.discordapp.net/external/mgjNglv928NY9v8XuIr2Z2mFbQHliKADNMZn9XsDibA/https/sploop.io/img/ui/close.png">
</div>
</div>
<div class="navbar">
<div class="nb-btn text-shadowed-3" id="hack" style="margin-right: 10px;">Hack</div>
<div class="nb-btn text-shadowed-3" id="control">Control</div>
</div>
<div class="select pop-list-content scrollbar text-shadowed-3 content subcontent-bg" id="hat_menu_content" data-menu="1"></div>
<div class="select pop-list-content scrollbar text-shadowed-3 content subcontent-bg" id="hat_menu_content" data-menu="2" style="display: none;">
<div class="control-box">
<p style="font-size: 20px;font-weight: bold;color: white;">HealSpeed</p>
<input id="control-key" data-speed="heal" class="input text-shadowed-3" placeholder="Enter speed..." value="100">
</div>
<div class="control-box">
<p style="font-size: 20px;font-weight: bold;color: white;">AddHealMS</p>
<input id="control-key" data-speed="addms" class="input text-shadowed-3" placeholder="Enter speed..." value="0">
</div>
<div class="control-box">
<p style="font-size: 20px;font-weight: bold;color: white;">InstaKill</p>
<input id="control-key" data-key="instakill" onKeyPress=SupressInput(event); class="input text-shadowed-3" placeholder="Enter key..." value="KeyR">
</div>
<div class="control-box">
<p style="font-size: 20px;font-weight: bold;color: white;">CrystalGear</p>
<input id="control-key" data-key="crystalgear" onKeyPress=SupressInput(event); class="input text-shadowed-3" placeholder="Enter key..." value="KeyT">
</div>
<div class="control-box">
<p style="font-size: 20px;font-weight: bold;color: white;">BerserkerGear</p>
<input id="control-key" data-key="berserkergear" onKeyPress=SupressInput(event); class="input text-shadowed-3" placeholder="Enter key..." value="KeyC">
</div>
<div class="control-box">
<p style="font-size: 20px;font-weight: bold;color: white;">SpikeGear</p>
<input id="control-key" data-key="spikegear" onKeyPress=SupressInput(event); class="input text-shadowed-3" placeholder="Enter key..." value="KeyG">
</div>
<div class="control-box">
<p style="font-size: 20px;font-weight: bold;color: white;">Demolist</p>
<input id="control-key" data-key="Demolist" onKeyPress=SupressInput(event); class="input text-shadowed-3" placeholder="Enter key..." value="KeyG">
</div>
<div class="control-box">
<p style="font-size: 20px;font-weight: bold;color: white;">BoostHat</p>
<input id="control-key" data-key="boosthat" onKeyPress=SupressInput(event); class="input text-shadowed-3" placeholder="Enter key..." value="KeyB">
</div>
</div>
</div>
<style>
.control-box {
padding: 10px;
display: flex;
justify-content: space-between;
width: 100%;
align-items: center;
}
#control-key {
width: 180px;
text-align: left;
text-indent: 16px;
color: white;
line-height: 70px;
height: 40px;
font-weight: 600;
}
.navbar {
display: flex;
}
.nb-btn {
margin-top: 5px;
width: 150px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: inset 0 -3px 0 #333;
border-radius: 7px;
background-color: rgb(40 45 34 / 60%);
border: 4px solid #141414;
cursor: url(img/ui/cursor-pointer.png) 6 0, pointer;
}
#hat_menu_content {
padding: 8px 0 0 0;
margin-bottom: 0px;
margin-top: 2.5px;
}
.togglerButton {
margin-left: auto;
outline: none;
border: 4px solid #141414;
padding: 7px;
font-size: 16px;
margin-right: 5px;
cursor: url(https://sploop.io/img/ui/cursor-pointer.png) 6 0, pointer;
margin-top: auto;
margin-bottom: auto;
color: #fff;
border-radius: 10px;
background-color: #96b943;
box-shadow: inset 0 -5px 0 #809836;
}
.togglerButton:hover {
background-color: #b5de53;
box-shadow: inset 0 -5px 0 #95af44;
}
.name-desc {
display: flex;
flex-direction: column;
padding-left: 10px;
margin-bottom: 5px;
}
.item-container {
width: 100%;
display: flex;
align-items: center;
border-bottom: 3px solid #141414;
flex-direction: row;
justify-content: space-between;
padding-bottom: 5px;
}
.menu-title {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
}
#settingMenu {
position: absolute;
top: 80%;
left: 80%;
transform: translate(-50%, -50%);
height: 367px;
width: 500px;
display: none;
opacity: 1;
background: rgba(40, 45, 34, 0.6);
color: #fff;
}
</style>
<script>
function SupressInput($event) {
$event.preventDefault();
}
</script>
`
const __TOGGLERS__ = [{
name: "AutoHeal",
desc: "Auto heals you",
id: "autoheal",
active: true,
last: false
}, {
name: "Optimized Heal",
desc: "Optimizes autoheal in some cases",
id: "optheal",
active: false,
last: false
}, {
name: "AutoPush",
desc: "Automatically pushes enemies into spikes",
id: "autopush",
active: true,
last: false
}, {
name: "AutoPlace",
desc: "Optimizes and automates spike and trap placement",
id: "autoplace",
active: true,
last: false
}, {
name: "AutoSync",
desc: "Optimized attacking & Auto hat switching",
id: "autosync",
active: true,
last: false
}, {
name: "AutoBreak",
desc: "Automatically breaks out of traps",
id: "autobreak",
active: true,
last: false
}, {
name: "AutoRespawn",
desc: "Auto respawn you",
id: "autorespawn",
active: false,
last: false
}, {
name: "UI",
desc: "visibility of the UI",
id: "ui",
active: true,
last: false
}, {
name: "AutoChat",
desc: "Sing cool song",
id: "autochat",
active: false,
last: false
}, {
name: "Tracers",
desc: "Draw tracers to enemies",
id: "tracers",
active: true,
last: false
}, {
name: "AntiAFK",
desc: "move every 5 seconds",
id: "antiAFK",
active: false,
last: true
}]
function __TOGGLER__(name, desc, id, active, last) {
return `
<div class="item-container" style="margin-top: 4px; ${last ? "border-bottom: none;" : "border-bottom: 3px solid #141414;"}">
<div class="name-desc">
<p style="font-size: 16px;font-weight: bold;color: white;">${name}</p>
<p style="font-size: 14px; color: #d2c396;">${desc}</p>
</div>
<button class="togglerButton text-shadowed-3" id="${id}" style="${active ? "outline: none;" : "background: #b94343; box-shadow: inset 0 -5px 0 #983636"}">
${active ? "Enabled" : "Disabled"}
</button>
</div>
`
}
function genTogglers() {
__TOGGLERS__.forEach(t => {
$('[data-menu="1"]').append(__TOGGLER__(t.name, t.desc, t.id, t.active, t.last))
})
}
function addNotifications(text, color = "#fff") {
let idGen = () => "notification-" + ~~(Math.random() * 10000) + 1,
readyId = idGen()
let add = `
<div class="box text-shadowed-3" id="${readyId}" style="display: block; opacity: 0;">
<span style="color: ${color};">
${text}
</span>
</div>
`
$(".notifications-holder").prepend(add)
$("#" + readyId).show().animate({ opacity: 1 }, 750)
setTimeout(() => {
$("#" + readyId).animate({ opacity: 0 }, 750, () => {
$("#" + readyId).remove()
});
}, 3000)
}
window.rContextMenu = () => {
let elm = document.getElementsByTagName('*')
for (let i = 0; i < elm.length; ++i) {
elm[i].oncontextmenu = null
}
}
function cEl(e, t, n, g) {
addNotifications(`${n} <span style='color: ${t ? "#8ecc51" : "#cc5151"}'>${t ? "enabled" : "disabled"}</span>`)
$(e).css("background", !t ? "#b94343" : "#96b943")
$(e).css("box-shadow", !t ? "inset 0 -5px 0 #983636" : "inset 0 -5px 0 #809836")
$(e).text(!t ? "Disabled" : "Enabled")
$(e).hover(() => {
$(e).css("background", !t ? "#de5353" : "#b5de53")
$(e).css("box-shadow", !t ? "inset 0 -5px 0 #af4444" : "inset 0 -5px 0 #95af44")
}, function () {
$(e).css("background", !t ? "#b94343" : "#96b943")
$(e).css("box-shadow", !t ? "inset 0 -5px 0 #983636" : "inset 0 -5px 0 #809836")
})
}
/* ChangeLog menu */
let changeLogMenu = `
<div class="centerMenu">
<div class="pop-box popup-fade-in" id="script-changelog" style="display: flex;">
<div class="pop-top">
<div class="pop-title text-shadowed-4" style="display: flex;align-items: center;">
<a class="pointer" style="margin-right: 5px;" href="https://discord.gg/EETcmmFgAt" target="_blank"><img class="pointer" draggable="false" src="img/ui/discord.png"></a>
SploMod - The best hack of 2024
</div>
<div class="pop-close-button"><img class="pop-close" id="close-script-cl" draggable="false" src="img/ui/close.png"></div>
</div>
<div class="pop-list-content scrollbar text-shadowed-3" id="changeLog-s"></div>
</div>
</div>
<style>
.centerMenu {
position: absolute;
top: 0;
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: rgb(39 66 35 / 60%);
z-index: 100;
transform-origin: center;
}
#script-changelog {
width: 615px;
height: 475px;
}
</style>
`
let __CHANGELOGS__ = [
{
version: "FINAL",
date: "2024-8-26",
added: true,
remove: false,
fixed: true,
addedContent: ["Reduced the packet limit to prevent yourself getting kicked"],
removedContent: [],
fixedContent: [
"This script was patched like one year's ago, It got fixed by Ilyax and Ilyax made her own fans for splomod playable again."
]
},
{
version: "3.2.2",
date: "2022-3-27",
added: false,
remove: false,
fixed: true,
addedContent: [],
removedContent: [],
fixedContent: [
"click the discord icon in this menu to get to our discord."
]
},
{
version: "3.2.1",
date: "2022-3-20",
added: false,
remove: false,
fixed: true,
addedContent: [],
removedContent: [],
fixedContent: [
"fixed tracers, they are now clean and have a better design.",
"join our discord server! (click the discord icon)"
]
},
{
version: "3.2",
date: "2022-3-20",
added: true,
remove: false,
fixed: true,
addedContent: [
"AntiAFK - moves every 5 seconds",
"Tracers - draw lines to enemies"
],
removedContent: [],
fixedContent: [
"Fixed UI toggle not working.",
"improved optimized heal",
"join our discord server! (click the discord icon)"
]
},
{
version: "3.1.1",
date: "2022-3-19",
added: true,
remove: false,
fixed: true,
addedContent: [
"Added autochat",
],
removedContent: [
"nothing"
],
fixedContent: [
"join our discord server! (click the discord icon)"
]
},
{
version: "3.1",
date: "2022-3-19",
added: true,
remove: true,
fixed: true,
addedContent: [
"Added changelog menu.",
],
removedContent: [
"Removed nothing."
],
fixedContent: [
"Fixed autoheal speed.",
"join our discord server! (click the discord icon)"
]
}, {
version: "3",
date: "2022-3-19",
added: true,
remove: false,
fixed: false,
addedContent: [
"Added game menu.",
"Added optimized autoheal."
],
removedContent: [
"None.",
"Nothing."
],
fixedContent: [""]
}]
function __CHANGELOG__(version, date, added, remove, fixed, addedContent, removedContent, fixedContent) {
let add = "",
rem = "",
fix = ""
let at = '<li class="subcontent-subtitle">Added</li>',
rt = '<li class="subcontent-subtitle">Removed</li>',
ft = '<li class="subcontent-subtitle">Fixed</li>'
let ac = () => {
let res = ""
let al = addedContent.length
for (let i = 0; i < al; i++) {
res += `<li>- ${addedContent[i]}</li>`
}
return res
}
let rc = () => {
let res = ""
let rl = removedContent.length
for (let i = 0; i < rl; i++) {
res += `<li>- ${removedContent[i]}</li>`
}
return res
}
let fc = () => {
let res = ""
let fl = fixedContent.length
for (let i = 0; i < fl; i++) {
res += `<li>- ${fixedContent[i]}</li>`
}
return res
}
if (added) {
add = `
<ul>
${ac()}
<br>
</ul>
`
}
if (remove) {
rem = `
<ul>
${rc()}
<br>
</ul>
`
}
if (fixed) {
fix = `
<ul>
${fc()}
<br>
</ul>
`
}
return `
<ul class="subcontent-bg">
<li class="subcontent-title">[${version}] - ${date}</li>
<ol>
${added ? at + add : ""}
${remove ? rt + rem : ""}
${fixed ? ft + fix : ""}
</ol>
</ul>
`
}
function genChangeLogs() {
__CHANGELOGS__.forEach(cl => {
$("#changeLog-s").append(__CHANGELOG__(cl.version, cl.date, cl.added, cl.remove, cl.fixed, cl.addedContent, cl.removedContent, cl.fixedContent))
})
}
let changeLog = true
function controlSaver() {
let items = ["bha", "sga", "bga", "cga", "ika", 'dem']
let datas = ["boosthat", "spikegear", "berserkergear", "crystalgear", "instakill", 'Demolist']
for (let i = 0; i < datas.length; i++) {
document.querySelector(`[data-key="${datas[i]}"]`).value = localStorage.getItem(items[i]) || document.querySelector(`[data-key="${datas[i]}"]`).value
}
document.querySelector('[data-speed="heal"]').value = localStorage.getItem("heal") || document.querySelector('[data-speed="heal"]').value
document.querySelector('[data-speed="addms"]').value = localStorage.getItem("addms") || document.querySelector('[data-speed="addms"]').value
}
/* Add at event DOMContentLoaded so that there is no HTML substitution bug */
document.addEventListener("DOMContentLoaded", () => {
$("body").append(settingMenu)
$("body").append(changeLogMenu)
$("#close-script-cl").click(() => $(".centerMenu").css("display", "none"))
let bha = [false, document.querySelector('[data-key="boosthat"]')]
let dem = [false, document.querySelector('[data-key="Demolist"]')]
let sga = [false, document.querySelector('[data-key="spikegear"]')]
let bga = [false, document.querySelector('[data-key="berserkergear"]')]
let cga = [false, document.querySelector('[data-key="crystalgear"]')]
let ika = [false, document.querySelector('[data-key="instakill"]')]
document.querySelector('[data-speed="heal"]').oninput = (e) => (e.target.value = e.target.value.replace(/\D/g, ''), localStorage.setItem("heal", document.querySelector('[data-speed="heal"]').value))
document.querySelector('[data-speed="addms"]').oninput = (e) => (e.target.value = e.target.value.replace(/\D/g, ''), localStorage.setItem("addms", document.querySelector('[data-speed="addms"]').value))
bha[1].onclick = () => (bha[1].value = "...", bha[0] = true)
dem[1].onclick = () => (dem[1].value = "...", dem[0] = true)
sga[1].onclick = () => (sga[1].value = "...", sga[0] = true)
bga[1].onclick = () => (bga[1].value = "...", bga[0] = true)
cga[1].onclick = () => (cga[1].value = "...", cga[0] = true)
ika[1].onclick = () => (ika[1].value = "...", ika[0] = true)
document.addEventListener("keydown", e => {
if (bha[0]) (bha[0] = false, bha[1].value = e.code, localStorage.setItem("bha", e.code))
if (dem[0]) (dem[0] = false, dem[1].value = e.code, localStorage.setItem("dem", e.code))
if (sga[0]) (sga[0] = false, sga[1].value = e.code, localStorage.setItem("sga", e.code))
if (bga[0]) (bga[0] = false, bga[1].value = e.code, localStorage.setItem("bga", e.code))
if (cga[0]) (cga[0] = false, cga[1].value = e.code, localStorage.setItem("cga", e.code))
if (ika[0]) (ika[0] = false, ika[1].value = e.code, localStorage.setItem("ika", e.code))
})
genChangeLogs()
controlSaver()
if (changeLog) {
$(".centerMenu").css("display", "flex")
changeLog = false
}
genTogglers()
$("#autoheal").click(() => (Toggle.autoHeal = !Toggle.autoHeal, cEl("#autoheal", Toggle.autoHeal, "AutoHeal")))
$("#autopush").click(() => (Toggle.autoPush = !Toggle.autoPush, cEl("#autopush", Toggle.autoPush, "AutoPush")))
$("#autosync").click(() => (Toggle.autoSync = !Toggle.autoSync, cEl("#autosync", Toggle.autoSync, "AutoSync")))
$("#autoplace").click(() => (Toggle.autoPlace = !Toggle.autoPlace, cEl("#autoplace", Toggle.autoPlace, "AutoPlace")))
$("#autobreak").click(() => (Toggle.autoBreak = !Toggle.autoBreak, cEl("#autobreak", Toggle.autoBreak, "AutoBreak")))
$("#autochat").click(() => (log(Toggle.autoChat), Toggle.autoChat = !Toggle.autoChat, cEl("#autochat", Toggle.autoChat, "AutoChat")))
$("#tracers").click(() => (Toggle.tracers = !Toggle.tracers, cEl("#tracers", Toggle.tracers, "Tracers")))
$("#autorespawn").click(() => (Toggle.autoRespawn = !Toggle.autoRespawn, cEl("#autorespawn", Toggle.autoRespawn, "AutoRespawn")))
$("#optheal").click(() => (Toggle.optHeal = !Toggle.optHeal, cEl("#optheal", Toggle.optHeal, "OptimizedAutoheal")))
$("#ui").click(() => (Toggle.UI = !Toggle.UI, cEl("#ui", Toggle.UI, "UI")))
$("#antiAFK").click(() => (Toggle.antiAFK = !Toggle.antiAFK, cEl("#antiAFK", Toggle.antiAFK, "antiAFK")))
$("#setting-menu-close-button").click(() => {
$("#settingMenu").css("display", "none")
})
$("#hack").click(() => {
$('[data-menu="1"]').css("display", "block")
$('[data-menu="2"]').css("display", "none")
})
$("#control").click(() => {
$('[data-menu="1"]').css("display", "none")
$('[data-menu="2"]').css("display", "block")
})
document.addEventListener("keydown", e => {
if (e.code == "Escape") {
if ($("#settingMenu").css("display") == "flex") {
$("#settingMenu").css("display", "none")
} else {
$("#settingMenu").css("display", "flex")
$("#clan-menu").css("display", "none")
$("#hat-menu").css("display", "none")
}
}
})
setInterval(() => {
if ($("#clan-menu").css("display") == "block" || $("#hat-menu").css("display") == "flex") {
$("#settingMenu").css("display", "none")
}
if ($("#homepage").css("display") == "flex") {
$("#settingMenu").css("display", "none")
}
}, 500)
})