// ==UserScript==
// @name Sploop.io Legit Script
// @namespace http://tampermonkey.net/
// @version 0.5
// @description Show HP%, FPS, CPS, Ping, Press M to ON/OFF ghost mode, Big Shop, Transparent Shop & Clan menu. Use 75% page zoom for best results.
// @match *://sploop.io/*
// @icon https://i.postimg.cc/vBz07fcS/Screenshot-2025-08-28-090152.png
// @grant none
// @author normalplayer
// ==/UserScript==
(function() {
'use strict';
// ================== GHOST MODE ==================
CanvasRenderingContext2D.prototype.OdrawImage = CanvasRenderingContext2D.prototype.drawImage;
let ghostModeEnabled = true;
document.addEventListener("keydown", e => {
if (e.key.toLowerCase() === "m") {
ghostModeEnabled = !ghostModeEnabled;
console.log("Ghost Mode:", ghostModeEnabled ? "ON" : "OFF");
}
});
const excludedKeywords = [
"player", "inv_", "cow", "duck", "wolf", "shark",
"mammoth", "gcow", "dragon"
];
const resourceKeywords = [
"tree", "rock", "bush", "cactus", "ruby", "wood", "stone", "gold",
"wall", "spike", "windmill", "trap", "boost", "turret",
"heal_pad", "platform", "roof", "bed", "teleporter", "lootbox"
];
CanvasRenderingContext2D.prototype.drawImage = function (...args) {
const image = args[0];
const src = image && image.src;
if (src && ghostModeEnabled) {
const isExcluded = excludedKeywords.some(k => src.includes(k));
const isResource = resourceKeywords.some(k => src.includes(k));
this.save();
if (!isExcluded && isResource) {
this.globalAlpha = 0.4; // Resource bị mờ
} else {
this.globalAlpha = 1.0; // Player + mob + boss rõ
}
this.OdrawImage.call(this, ...args);
this.restore();
} else {
return this.OdrawImage.call(this, ...args);
}
};
/* // ================== TEXTURE REPLACE ==================
const textureMap = {
"tree": "",
"rock": "",
"wall": "",
"gold": ""
};
const _srcDescriptor = Object.getOwnPropertyDescriptor(Image.prototype, "src");
Object.defineProperty(Image.prototype, "src", {
set: function(value) {
for (const key in textureMap) {
if (value.includes(key)) {
value = textureMap[key];
break;
}
}
_srcDescriptor.set.call(this, value);
},
get: function() {
return _srcDescriptor.get.call(this);
}
});*/
// ---------------- Better Health Bar ----------------
function lerpColor(a, b, amount) {
const ah = parseInt(a.replace(/#/g, ''), 16),
ar = ah >> 16, ag = (ah >> 8) & 0xff, ab = ah & 0xff;
const bh = parseInt(b.replace(/#/g, ''), 16),
br = bh >> 16, bg = (bh >> 8) & 0xff, bb = bh & 0xff;
const rr = ar + amount * (br - ar),
rg = ag + amount * (bg - ag),
rb = ab + amount * (bb - ab);
return '#' + (((1 << 24) + (rr << 16) + (rg << 8) + rb) | 0).toString(16).slice(1);
}
function drawHpText(ctx, text, xPos, yPos, color) {
ctx.save();
ctx.font = "20px 'Baloo Paaji'";
ctx.textAlign = "center";
ctx.textBaseline = "top";
ctx.fillStyle = color;
ctx.fillText(text, xPos, yPos);
ctx.restore();
}
const enhanceFillRect = function (fill) {
return function (x, y, width, height) {
const fullWidth = 95;
const hpPercent = Math.max(0, Math.min(1, width / fullWidth));
const percentText = `${~~(width / fullWidth * 100)}%`;
const centerX = x + fullWidth / 2;
let color;
if (this.fillStyle === "#a4cc4f") {
color = hpPercent > 0.5 ? lerpColor("#a4cc4f", "#e09f3e", (1 - hpPercent) * 2)
: lerpColor("#e09f3e", "#cc5151", (0.5 - hpPercent) * 2);
this.fillStyle = color;
drawHpText(this, percentText, centerX, y + height + 9, color);
}
if (this.fillStyle === "#cc5151") {
color = hpPercent > 0.5 ? lerpColor("#cc5151", "#e09f3e", (1 - hpPercent) * 2)
: lerpColor("#e09f3e", "#a4cc4f", (0.5 - hpPercent) * 2);
this.fillStyle = color;
drawHpText(this, percentText, centerX, y + height + 9, color);
}
fill.call(this, x, y, width, height);
};
};
const FillRect = CanvasRenderingContext2D.prototype.fillRect;
CanvasRenderingContext2D.prototype.fillRect = enhanceFillRect(FillRect);
const { fillText } = CanvasRenderingContext2D.prototype;
CanvasRenderingContext2D.prototype.fillText = function (...args) {
if (typeof args[0] === "string") {
this.lineWidth = 8;
this.strokeStyle = "#313131";
this.strokeText.apply(this, args);
}
return fillText.apply(this, args);
};
const { strokeRect } = CanvasRenderingContext2D.prototype;
CanvasRenderingContext2D.prototype.strokeRect = function(x, y, w, h) {
if ((w === 40 && h === 40) || this.strokeStyle === "#bfbfbf" || this.strokeStyle === "#dedede") {
return;
}
return strokeRect.call(this, x, y, w, h);
};
const { stroke } = CanvasRenderingContext2D.prototype;
CanvasRenderingContext2D.prototype.stroke = function(...args) {
if (this.strokeStyle === "#bfbfbf" || this.strokeStyle === "#dedede") {
return;
}
return stroke.apply(this, args);
};
// ---------------- Overlay ----------------
const overlay = document.createElement("canvas");
overlay.width = window.innerWidth;
overlay.height = window.innerHeight;
overlay.style.position = "absolute";
overlay.style.top = "0";
overlay.style.left = "0";
overlay.style.pointerEvents = "none";
overlay.style.zIndex = "9999";
document.body.appendChild(overlay);
const octx = overlay.getContext("2d");
let frameCount = 0, fpsStartTime = performance.now(), fps=0, cps=0;
let lastFrameTime = performance.now(), ping='...';
// ---------------- Ping ----------------
setInterval(()=>{
const now = performance.now();
ping = Math.round(now - lastFrameTime);
lastFrameTime = now;
}, 50);
document.addEventListener("mousedown", ()=>{
cps++; setTimeout(()=>cps--,1000);
});
function loop(){
const now = performance.now();
frameCount++;
if(now - fpsStartTime >= 1000){
fps = frameCount;
frameCount=0;
fpsStartTime=now;
}
octx.clearRect(0,0,overlay.width,overlay.height);
octx.save();
octx.font = "25px 'Baloo Paaji'";
octx.textBaseline = "top";
octx.strokeStyle="#313131";
octx.lineWidth=4;
octx.strokeText(`FPS: ${fps}`,10,5); octx.fillStyle="white"; octx.fillText(`FPS: ${fps}`,10,5);
octx.strokeText(`CPS: ${cps}`,10,30); octx.fillText(`CPS: ${cps}`,10,30);
octx.strokeText(`PING: ${ping}ms`,10,55); octx.fillText(`PING: ${ping}ms`,10,55);
octx.restore();
requestAnimationFrame(loop);
}
loop();
window.addEventListener("resize", ()=>{
overlay.width = window.innerWidth;
overlay.height = window.innerHeight;
});
// ---------------- Auto Toggle ----------------
['#grid-toggle','#native-friendly-indicator'].forEach(id=>{
const el = document.querySelector(id); if(el) el.click();
});
// ---------------- Ad Remove ----------------
const styleAdRemove = document.createElement('style');
styleAdRemove.type = 'text/css';
styleAdRemove.appendChild(document.createTextNode(`
#cross-promo,#bottom-wrap,#google_play,#game-left-content-main,#game-bottom-content,#game-right-content-main,#left-content,#right-content{
display:none !important;
}
`));
document.head.appendChild(styleAdRemove);
document.querySelector('#game-content').style.justifyContent='center';
document.querySelector('#main-content').style.width='auto';
// ---------------- Big Shop, Clan -------------------
(function() {
var style = document.createElement("style");
style.innerHTML = `
/* --- SHOP --- */
#hat-menu {
width: 500px !important;
height: 790px !important;
background: rgba(0,0,0,0) !important;
opacity: 0.95 !important;
border: 5px solid black !important;
box-shadow: none !important;
}
#hat_menu_content {
max-height: 780px !important;
overflow-y: auto !important;
background: transparent !important;
}
/* --- CLAN MENU --- */
#clan-menu {
background: rgba(0,0,0,0) !important; /* trong suốt */
opacity: 0.95 !important;
border: 5px solid black !important; /* vẫn giữ viền */
box-shadow: none !important;
}
#clan_menu_content {
background: transparent !important;
}
`;
document.head.appendChild(style);
})();
// ------------------ Background --------------------
window.addEventListener("load", () => {
const homepage = document.getElementById("homepage");
if (homepage) {
homepage.style.backgroundImage = "url('https://4kwallpapers.com/images/wallpapers/satoru-gojo-black-3440x1440-14684.png')";
homepage.style.backgroundSize = "cover";
homepage.style.backgroundPosition = "center";
homepage.style.backgroundRepeat = "no-repeat";
}
});
// --------------- UI --------------
const customReplacements = [
{
selector: "#logo",
image: "https://i.postimg.cc/HW8qMWLM/logo.png"
},
];
function applyCustomUI() {
customReplacements.forEach(item => {
const el = document.querySelector(item.selector);
if (el) {
if (el.tagName === "IMG") {
el.src = item.image;
} else {
el.style.backgroundImage = `url(${item.image})`;
el.style.backgroundSize = "cover";
el.style.backgroundPosition = "center";
el.style.backgroundRepeat = "no-repeat";
}
}
});
}
applyCustomUI();
setInterval(applyCustomUI, 2000);
})();