fsploit debug - deeeep.io

best deeeep.io cheat ever

// ==UserScript==
// @name         fsploit debug - deeeep.io
// @namespace    http://tampermonkey.net/
// @version      5.1.0-debug
// @description  best deeeep.io cheat ever
// @run-at       document-start
// @author       mahdi1337, noam01, .pi3141
// @match        https://*.deeeep.io/*
// @icon         https://beta.deeeep.io/favicon-32x32.png
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

// Search for "TODO:" to see what needs to be done
// Check those first in the case that the script breaks

"use strict";

const fsploitVersion = "5.1.3";
const knownClientVersion = "9fcb82c9,e40a671d";

const currentScript = GM_getValue("mainModule");

if (!GM_getValue("logo")) {
	fetch("https://raw.githubusercontent.com/mahdi13377/fsploit-public/main/logo-base64")
		.then((response) => response.text())
		.then((data) => {
			const loadingCover = document.createElement("div");
			loadingCover.id = "loadingCover";
			loadingCover.style.cssText =
				"position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgb(30, 30, 30); z-index: 9999; opacity: 1; transition: opacity 0.5s ease-out; display: flex; justify-content: center; align-items: center;";
			const logoImage = document.createElement("img");
			logoImage.style.cssText = "max-width: 80%; max-height: 80%;";
			logoImage.src = `data:image/png;base64,${data}`;
			loadingCover.appendChild(logoImage);
			document.documentElement.appendChild(loadingCover);
			setTimeout(() => {
				loadingCover.style.opacity = "0";
			}, 1000);
			setTimeout(() => {
				loadingCover.remove();
			}, 1550);
			GM_setValue("logo", data.trim());
		});
} else {
	const logoData = GM_getValue("logo");
	const loadingCover = document.createElement("div");
	loadingCover.id = "loadingCover";
	loadingCover.style.cssText =
		"position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgb(30, 30, 30); z-index: 9999; opacity: 1; transition: opacity 0.5s ease-out; display: flex; justify-content: center; align-items: center;";
	const logoImage = document.createElement("img");
	logoImage.style.cssText = "max-width: 80%; max-height: 80%;";
	logoImage.src = `data:image/png;base64,${logoData}`;
	loadingCover.appendChild(logoImage);
	document.documentElement.appendChild(loadingCover);
	setTimeout(() => {
		loadingCover.style.opacity = "0";
	}, 1000);
	setTimeout(() => {
		loadingCover.remove();
	}, 1550);
}

// FSPLOIT

let game;
let gameState;
let currentScene;

let betterVisionx = false;
let quickDisconnectx = false;
let aimLinex = false;
let clearChatx = false;
let boostHacksx = false;
let humpbackAutosongsx = false;

// GAME UTILS
const encodeBytePacket = (t, e, n = "") => {
	const silly = ["ode", "eat", "fr", "bite", "eng", "enc", "the", "code", "rep", "L", "en", "setter"];if (!t) return null;const a = ((A, B) => {const enc = new TextEncoder();const a = enc[silly[5] + silly[0]](A);const i = enc[silly[10] + silly[7]](B);const r = new Uint8Array(a[`l${silly[4]}${silly[6].slice(0, 2)}`]);for (let o = 0; o < a.length; o++) r[o] = a[o] ^ i[o % i[`${silly[9].toLowerCase()}${silly[10]}g${silly[6].slice(0, 2)}`]];return btoa(String.fromCharCode(...r));})(String.fromCharCode(e)[silly[8] + silly[1]](3) + n, t);const i = new TextEncoder()[silly[5] + silly[0]](a);const r = 1 + i.byteLength + 1;const o = new ArrayBuffer(r);const l = new DataView(o);l.setUint8(0, 25);new Uint8Array(o)[silly[11].slice(0, (0o11 / 0x1b) * 0b1001)](i, 1);l.setUint8(r - 1, e);return o;};

const boostData = {
	10: {
		hasSec: true,
	},
	11: {
		hasSec: true,
		secLoadTime: 350,
	},
	21: {
		hasSec: true,
		secLoadTime: 1000,
	},
	22: {
		hasSec: true,
		secLoadTime: 600,
	},
	25: {
		hasSec: true,
		secLoadTime: 350,
	},
	27: {
		hasSec: true,
		secLoadTime: 350,
	},
	34: {
		hasSec: true,
		secLoadTime: 350,
	},
	38: {
		hasSec: true,
		secLoadTime: 750,
	},
	40: {
		hasSec: true,
		secLoadTime: 1000,
	},
	41: {
		hasSec: true,
	},
	42: {
		hasSec: true,
		secLoadTime: 300,
	},
	43: {
		hasSec: true,
		secLoadTime: 350,
	},
	49: {
		hasSec: true,
		secLoadTime: 350,
	},
	56: {
		hasSec: true,
	},
	61: {
		hasSec: true,
		secLoadTime: 400,
	},
	62: {
		hasSec: true,
		secLoadTime: 2000,
	},
	68: {
		hasSec: true,
	},
	70: {
		hasSec: true,
		secLoadTime: 250,
	},
	71: {
		hasSec: true,
		secLoadTime: 350,
	},
	73: {
		hasSec: true,
		secLoadTime: 1000,
	},
	74: {
		hasSec: true,
	},
	76: {
		hasSec: true,
		secLoadTime: 200,
	},
	80: {
		hasSec: true,
		secLoadTime: 350,
	},
	82: {
		hasSec: true,
		secLoadTime: 1500,
		hasScaling: true,
	},
	83: {
		hasSec: true,
	},
	86: {
		hasSec: true,
		secLoadTime: 1000,
	},
	87: {
		hasSec: true,
		secLoadTime: 150,
	},
	90: {
		hasSec: true,
	},
	91: {
		hasSec: true,
		secLoadTime: 800,
	},
	92: {
		hasSec: true,
		secLoadTime: 300,
	},
	93: {
		hasSec: true,
		secLoadTime: 750,
	},
	94: {
		hasSec: true,
	},
	95: {
		hasSec: true,
	},
	96: {
		hasSec: true,
		secLoadTime: 750,
	},
	97: {
		hasSec: true,
		hasWalking: true,
	},
	98: {
		hasSec: true,
	},
	99: {
		hasSec: true,
		secLoadTime: 400,
	},
	100: {
		hasSec: true,
		secLoadTime: 750,
	},
	101: {
		hasSec: true,
		secLoadTime: 750,
	},
	102: {
		hasSec: true,
		secLoadTime: 1000,
		hasScaling: true,
	},
	103: {
		hasSec: true,
		hasWalking: true,
	},
	105: {
		hasSec: true,
		hasScaling: true,
		hasWalking: true,
	},
	106: {
		hasSec: true,
	},
	107: {
		hasSec: true,
		secLoadTime: 750,
		hasScaling: true,
	},
	108: {
		hasSec: true,
	},
	109: {
		hasSec: true,
		secLoadTime: 600,
	},
	110: {
		hasSec: true,
	},
	111: {
		hasSec: true,
		secLoadTime: 600,
	},
	112: {
		hasSec: true,
	},
	113: {
		hasSec: true,
		hasWalking: true,
	},
	114: {
		hasSec: true,
		secLoadTime: 300,
	},
	115: {
		hasSec: true,
	},
	116: {
		hasSec: true,
	},
	117: {
		hasSec: true,
		secLoadTime: 600,
	},
	119: {
		hasSec: true,
		secLoadTime: 250,
	},
	120: {
		hasSec: true,
	},
	121: {
		hasWalking: true,
	},
	123: {
		hasSec: true,
		secLoadTime: 750,
		hasWalking: true,
	},
	124: {
		hasSec: true,
	},
	126: {
		hasSec: true,
	},
	127: {
		hasSec: true,
	},
	default: {
		hasSec: false,
		secLoadTime: 500,
		hasWalking: false,
		walkingLoadTime: 250,
		hasScaling: false,
	},
};
const sendBoost = (type, time = "") => {
	game[obfuscatedNameTranslator.socketManager].sendBytePacket(encodeBytePacket(gameState.token, type, time));
};
const handleLongPress = (t) => {
	const Boost = 1;
	const SecondaryAbility = 4;
	const ScalingBoost = 5;
	try {
		const data = {
			...boostData.default,
			...(boostData[currentScene?.myAnimals?.[0]?.visibleFishLevel] || {}),
		};
		if (t < (currentScene?.myAnimals?.[0]?._standing ? 40 : 100)) {
			return sendBoost(Boost);
		}
		if (currentScene?.myAnimals?.[0]?._standing) {
			return sendBoost(ScalingBoost, t);
		}
		if (data.hasScaling) {
			return sendBoost(ScalingBoost, t);
		}
		if (data.hasSec) {
			return sendBoost(SecondaryAbility, t);
		}
		return sendBoost(Boost);
	} catch {}
};

// MISC UTILS
const randInt = (min, max) => Math.floor(min + Math.random() * (max - min));

// UI

const ui = {
	message: {
		info: (message, options) => {
			return document.getElementById("app").__vue_app__._context.config.globalProperties.$message({
				message: message,
				...options,
			});
		},
		success: (message, options) => {
			return document.getElementById("app").__vue_app__._context.config.globalProperties.$message.success({
				message: message,
				...options,
			});
		},
		warning: (message, options) => {
			return document.getElementById("app").__vue_app__._context.config.globalProperties.$message.warning({
				message: message,
				...options,
			});
		},
		error: (message, options) => {
			return document.getElementById("app").__vue_app__._context.config.globalProperties.$message.error({
				message: message,
				...options,
			});
		},
	},
	confirm: ({ title, message, type, dangerouslyUseHTMLString, confirmButtonText, cancelButtonText, onConfirm, onCancel }) => {
		return document
			.getElementById("app")
			.__vue_app__._context.config.globalProperties.$msgbox({
				title: title || "fsploit",
				message: message || "",
				type: type || "",
				dangerouslyUseHTMLString: dangerouslyUseHTMLString || false,
				confirmButtonText: confirmButtonText || "OK",
				cancelButtonText: cancelButtonText || "Cancel",
				showCancelButton: true,
				showClose: false,
			})
			.then(onConfirm)
			.catch(onCancel);
	},
	alert: ({ title, message, type, dangerouslyUseHTMLString, dismissButtonText, onDismiss }) => {
		return document
			.getElementById("app")
			.__vue_app__._context.config.globalProperties.$msgbox({
				title: title || "FSploit",
				message: message || "",
				type: type || "",
				dangerouslyUseHTMLString: dangerouslyUseHTMLString || false,
				confirmButtonText: dismissButtonText || "OK",
				showCancelButton: false,
				showClose: false,
			})
			.then(onDismiss);
	},

	registerGameUiButton: ({ id, svgIcon, onClick }) => {
		gameUiButtons.push({ id, svgIcon, onClick });
		console.log(gameUiButtons);
	},

	nukeDOM: () => {
		const domObserver = new MutationObserver(() => {
			for (const child of document.querySelectorAll("#app > *")) {
				child.remove();
			}
		});
		domObserver.observe(document.querySelector("html"), { childList: true, subtree: true });
	},
};

// CUSTOM STYLES

const applyStyles = () => {
	document.title = `fsploit ${fsploitVersion}`;
	for (const favicon of document.querySelectorAll("link[rel*='icon']")) {
		favicon.remove();
	}
	document.getElementsByTagName("head")[0].appendChild(
		Object.assign(document.createElement("link"), {
			href: "https://raw.githubusercontent.com/mahdi13377/deeeepio_api_wrapper/main/favicon.ico",
			rel: "shortcut icon",
			type: "image/x-icon",
		})
	);
	document.getElementsByTagName("head")[0].appendChild(
		Object.assign(document.createElement("link"), {
			href: "https://raw.githubusercontent.com/mahdi13377/deeeepio_api_wrapper/main/favicon.ico",
			rel: "icon",
			type: "image/x-icon",
		})
	);
	const customTheme = `
		img[src*="img/badges/"] {
			display: none;
		}

		.el-input__wrapper {
			background-color: rgba(17, 24, 39, 0) !important;
		}

		.el-input__inner {
			color: rgba(255, 255, 255, 1) !important;
		}

		* {
			text-decoration: none !important;
		}

		.dark .modal-content {
			background-color: #202020 !important;
			border-color: #3c3c3c !important;
		}

		.dark .forum-post-page .inner,
		.dark .profile .content {
			background-color: #2b2b2b !important;
		}

		.dark body .el-input__wrapper,
		.dark body .el-textarea__wrapper {
			background-color: rgba(17, 24, 39, 0) !important;
			border-color: rgba(55, 65, 81, 1) !important;
			color: rgba(255, 255, 255, 1) !important;
		}

		.dark .forum-page,
		.dark .social-modal .main .content,
		.dark .social-modal .main .sidebar--left {
			background-color: #2b2c2f !important;
		}

		.forum-page .inner .forum-posts .forum-post-summary {
			border-color: rgba(209, 213, 219, 1) !important;
			border-bottom-width: 1px !important;
			cursor: pointer !important;
			padding-top: 0.5rem !important;
			padding-left: 0.75rem !important;
			padding-right: 0.75rem !important;
		}

		.dark .forum-page .inner .forum-posts .forum-post-summary:hover {
			background-color: rgba(77, 77, 77, 0.1) !important;
		}

		.dark .forum-page .inner .forum-posts .forum-post-summary {
			border-color: rgb(64 68 72) !important;
		}

		.dark .social-modal .main .sidebar--left .tabs .tab.active {
			background-color: rgba(65, 65, 65, 0) !important;
			color: rgba(255, 255, 255, 1) !important;
		}

		.dark .friends-view .nav .button-container .nice-button.active {
			background-color: rgb(62 66 70) !important;
			color: rgba(255, 255, 255, 1) !important;
		}

		.all-friends .friends .friend:hover,
		.friend-requests .requests .request.is-new,
		.friend-requests .requests .request:hover {
			background-color: rgb(62 66 70) !important;
			border-radius: 10px !important;
		}

		.btn.square.el-button--mini {
			border-radius: 0.9rem !important;
			width: 2rem !important;
			height: 2rem !important;
		}

		.dark .animals-container .animals .animal {
			background-color: rgba(17, 24, 39, 0) !important;
		}

    .dark .skins-container .skins .skin {
        --tw-bg-opacity: 0!important;
    }
.dark .emotes .emote {
    --tw-bg-opacity: 0!important;
}
.dark .pets .pet {
    --tw-bg-opacity: 0!important;
}

body .el-popover.el-popper.popover--dark {
    border-color: #3c3c3c!important;
}
.dark .leaderboard-popover-details .right .header {
    --tw-bg-opacity: 1!important;
    background-color: #2b2b2b!important
}

body .el-popover.el-popper.popover--dark {
    background-color: #2b2b2b!important
}

.el-col-xs-12 {
    display: block;
    max-width: 49%;
    flex: 0 0 50%
}

html.dark .el-select__popper .el-select-dropdown {
    --tw-bg-opacity: 1;
    background-color: #2b2b2b
}

html.dark .el-select__popper .el-select-dropdown {
    --tw-bg-opacity: 1;
    background-color: #2b2b2b
}

html.dark .el-select__popper .el-select-dropdown__item:focus,html.dark .el-select__popper .el-select-dropdown__item:not(.is-disabled):hover {
    --tw-bg-opacity: 1;
    background-color: #1f1f1f
}

html.dark .el-dropdown-menu__item:focus,html.dark .el-dropdown-menu__item:not(.is-disabled):hover {
    --tw-bg-opacity: 1;
    background-color: #1f1f1f
}

html.dark .el-popper__arrow::before {
    --tw-bg-opacity: 1;
    background-color: rgba(55,65,81,var(--tw-bg-opacity));
    background: #ffffff!important;
    border-color: #565656!important
}

html.dark .el-popper {
    --tw-bg-opacity: 1;
    background-color: #1f1f1f
    --tw-border-opacity: 1;
    border-color: #1f1f1f
    border-radius: .375rem;
    --tw-text-opacity: 1;
}

.dark .create-comment .nav-bar {
    --tw-bg-opacity: 1;
    background-color: #202121;
}

.el-textarea__inner {
    box-shadow: none!important;
}

.el-col.el-col-24.el-col-xs-12.is-guttered:nth-of-type(2) {
    background-color: rgba(32, 32, 33, 0.1);
    padding-right: 15px;
    padding-left: 5px;
    border-width: 1px;
    border-radius: 0.5rem;
    border-color: rgba(255, 255, 255, 0.1);
}

.dark body .el-textarea__inner {
    background-color: #1c1c1c!important;

}

.dark .leaderboard-popover-details .left {
    --tw-bg-opacity: 0!important;
    background-color: rgba(31,41,55,var(--tw-bg-opacity))!important;
}
		.user-widget {
			border-bottom-right-radius: 1rem !important;
			display: -webkit-box !important;
			display: -ms-flexbox !important;
			display: -webkit-flex !important;
			display: flex !important;
			-webkit-box-orient: horizontal !important;
			-webkit-box-direction: normal !important;
			-ms-flex-direction: row !important;
			-webkit-flex-direction: row !important;
			flex-direction: row !important;
			-webkit-box-align: stretch !important;
			-ms-flex-align: stretch !important;
			-webkit-align-items: stretch !important;
			align-items: stretch !important;
			padding: 1rem !important;
		}

		/* Common styles for all buttons */
		.btn:not(.el-button--text) {
      border-bottom-width: 4px!important;
			background-color: rgba(27, 59, 67, 1) !important;
			border-color: rgba(1, 35, 46, 1) !important;
			color: rgba(255, 255, 255, 1) !important;
		}

		.btn:not(.el-button--text):hover {
			background-color: rgba(31, 41, 55, 1) !important;
			border-color: rgba(17, 24, 39, 1) !important;
		}

		.coins.pb-2 {
			background-color: rgba(0, 0, 0, 0) !important;
			border-color: rgba(0, 0, 0, 0) !important;
		}

		html.dark .el-dropdown-menu {
			background-color: #2b2b2b !important;
		}

		.el-popper.is-light .el-popper__arrow::before {
			opacity: 0 !important;
		}

		.el-dropdown-menu__item:not(.is-disabled):focus {

			color: rgba(255, 255, 255, 1) !important;
		}

		.el-dropdown-menu__item i {
			margin-right: 5px !important;
		}

		.user-widget .user__data .username {
			cursor: pointer !important;
			margin-right: 0.25rem !important;
			overflow: hidden !important;
			-o-text-overflow: ellipsis !important;
			text-overflow: ellipsis !important;
			max-width: 16rem !important;
			font-size: 1.1em !important;
			line-height: 1.2em !important;
			margin-left: 1.5rem !important;
		}

		.el-button.el-button--small.el-tooltip__trigger.btn.nice-button.yellow.has-icon.square.only-icon.el-tooltip__trigger {
			display: none !important;
		}

		.el-image:nth-of-type(2).el-image__inner {
			content: url("https://i.ibb.co/84gjfCt/image-4.png") !important;
		}

		.divider {
			display: none !important;
		}

		.btn {
			outline: 2px solid transparent !important;
		}

		.home-page .header .left {
			background-color: rgba(17,24,39, 0.4)!important;
		}

		.top-right-nav {
			background-color: rgba(17,24,39, 0.4)!important;
		}

        div.sidebar.left > div.ad-block {
            opacity: 0 !important;
            pointer-events: none !important;
            display: none !important;
        }
        div.sidebar.left > a {
            display: none !important;
        }
        div.sidebar.left {
            max-width: 30vw;
            width: 21rem;
            bottom: 0 !important;
        }
.dark .profile .content[data-v-60d99b2d] {
    --tw-bg-opacity: 0.5!important;
    background-color: #242424!important;
    backdrop-filter: blur(10px)!important;
    border-radius: 8px!important;
    border: 1px solid rgba(255, 255, 255, 0.1)!important;
}

.el-button {
    transition: .3s!important;
}
		`;
	document.body.appendChild(Object.assign(document.createElement("style"), { innerHTML: customTheme }));

	const versionText = document.querySelector(".client-version");
	versionText.innerHTML = `<p>fsploit v${fsploitVersion}</p><p>Vast Softworks LLC.</p>`;
	versionText.style.display = "flex";
	versionText.style.justifyContent = "space-between";
	versionText.style.left = ".25rem";

	if (!GM_getValue("background")) {
		fetch("https://raw.githubusercontent.com/mahdi13377/fsploit-public/main/background-base64")
			.then((response) => response.text())
			.then((data) => {
				document.body.appendChild(
					Object.assign(document.createElement("style"), {
						innerHTML: `.home-bg {background-image: url('data:image/png;base64,${data.trim()}') !important;}`,
					})
				);
				GM_setValue("background", data.trim());
			});
	} else {
		const backgroundData = GM_getValue("background");
		document.body.appendChild(
			Object.assign(document.createElement("style"), {
				innerHTML: `.home-bg {background-image: url('data:image/png;base64,${backgroundData}') !important;}`,
			})
		);
	}

	if (!GM_getValue("banner")) {
		fetch("https://raw.githubusercontent.com/mahdi13377/fsploit-public/main/banner-base64")
			.then((response) => response.text())
			.then((data) => {
				document.body.appendChild(
					Object.assign(document.createElement("style"), {
						innerHTML: `.play-game img {opacity: 0 !important;} .play-game > div:first-of-type {background-image: url('data:image/png;base64,${data.trim()}') !important; background-size: contain !important; background-repeat: no-repeat !important; background-position: center !important;}`,
					})
				);
				GM_setValue("banner", data.trim());
			});
	} else {
		const bannerData = GM_getValue("banner");
		document.body.appendChild(
			Object.assign(document.createElement("style"), {
				innerHTML: `.play-game img {opacity: 0 !important;} .play-game > div:first-of-type {background-image: url('data:image/png;base64,${bannerData}') !important; background-size: contain !important; background-repeat: no-repeat !important; background-position: center !important;}`,
			})
		);
	}
	document.querySelector(".play-game img").setAttribute("draggable", "false");

	const left_widget_container = document.querySelector("div.sidebar.left");

	const tutorial_box = document.querySelector("div.sidebar.right > div:nth-child(3)").cloneNode(true);
	tutorial_box.setAttribute("id", "tutorial-box");
	left_widget_container.appendChild(tutorial_box);

	document.querySelector("#tutorial-box > div.title").innerText = "How to play";
	document.querySelector("#tutorial-box > div:nth-child(2)").outerHTML = '<div id="tutorial"></div>';

	const tutorial = document.getElementById("tutorial");
	tutorial.style.maxHeight = "30vh";
	tutorial.style.overflow = "scroll";
	tutorial.style.overflowX = "hidden";
	tutorial.style.padding = "10px";
	tutorial.style.fontSize = "small";

	const tut = `<b>Welcome to fsploit!</b>
<p>Scroll down for instructions on hacks</p>
<br />
<b>Controls</b>
<p><b>ESC</b> to hide/show menu</p>
<p><b>Hold CTRL</b> to see an aim line (only on certain animals)</p>
<p><b>Scroll</b> with your mouse to zoom in and out of the map. This client allows you to do so without limit.</p>
<p><b>M</b> to hide/show chat messages</p>
<p><b>B</b> to clear chat messages</p>
<p><b>N</b> to hide/show large map</p>
<p><b>Y</b> to view the evolution tree</p>
<p><b>S</b> to open settings</p>

<br />
<hr />
<br />

<b>Boost hacks</b>
<p>Hold <b>CTRL</b> and <b>CLICK</b> to use a long charged boost</p>
<p>Hold <b>ALT</b> and <b>CLICK</b> to use a short charged boost</p>
<p>Hold <b>CTRL</b>, <b>SHIFT</b>, and <b>CLICK</b> to use a special charged boost:</p>
<ul>
	<li>Walking animals: jump higher than normal</li>
	<li>Beluga and beaked whale: shoot super speed projectile (uses 2 boosts)</li>
	<li>Thresher: go nyoom (uses 2 boosts)</li>
</ul>

<b>Goblin shark 210 dmg</b>
<p>It is possible to glitch goblin shark's charged shot mechanism and fire bullets that deal 210 damage without having to charge for 2 seconds.</p>
<p>Steps:</p>
<ol>
	<li>Charge boost to max. Make sure you reach the -50% speed.</li>
	<li>Cancel the charge boost by right clicking.</li>
	<li>Hold the control key and click once to fire a shot.</li>
</ol>
<p>Note that if you long press to manually do a charged boost, it will cancel the glitch and you will have to do the steps above again.</p>`;
	tutorial.innerHTML = tut;
};

// CHEATS

const evoTree = () => {
	const overlay = document.createElement("div");
	overlay.style.cssText =
		"position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: rgba(0, 0, 0, 0); z-index: 1000; display: none;";
	const img = document.createElement("img");
	function isInputActive() {
		const e = document.activeElement;
		return e.matches("input") || e.matches("textarea");
	}
	img.src = "https://i.ibb.co/djBZ520/image.png";
	img.style.cssText = "display: block; max-width: 100%; height: auto; ";
	overlay.appendChild(img);
	document.body.appendChild(overlay);
	window.addEventListener("keydown", (e) => {
		if (!isInputActive() && e.code === "KeyY") {
			overlay.style.display = "block";
		}
	});
	window.addEventListener("keyup", (e) => {
		if (!isInputActive() && e.code === "KeyY") {
			overlay.style.display = "none";
		}
	});
};

const quickDisconnect = () => {
	if (!quickDisconnectx) {
		document.body.addEventListener("keydown", (e) => {
			if (e.ctrlKey && e.shiftKey && e.code === "KeyQ" && document.activeElement !== document.querySelector("div.chat-input input")) {
				try {
					game[obfuscatedNameTranslator.socketManager].disconnect();
				} catch {}
			}
		});
		quickDisconnectx = true;
	}
};

const betterVision = () => {
	try {
		currentScene[obfuscatedNameTranslator.setFlash] = () => true;
	} catch {}
	try {
		currentScene[obfuscatedNameTranslator.terrainManager].shadow.setShadowSize(1000000);
		currentScene[obfuscatedNameTranslator.terrainManager].shadow.setShadowSize = () => true;
	} catch {}
	if (!betterVisionx) {
		setInterval(() => {
			try {
				currentScene[obfuscatedNameTranslator.foodGlowContainer].zOrder = 996;
				currentScene[obfuscatedNameTranslator.foodContainer].zOrder = 997;
				currentScene[obfuscatedNameTranslator.namesLayer].zOrder = 998;
				currentScene[obfuscatedNameTranslator.animalsContainer].zOrder = 999;
				currentScene[obfuscatedNameTranslator.barsLayer].zOrder = 1000;
				currentScene[obfuscatedNameTranslator.chatContainer].zOrder = 1001;
			} catch {}
			try {
				game.viewport.clampZoom({
					minWidth: 0,
					maxWidth: 1e7,
				});
				game.viewport.plugins.plugins.clamp = null;
				game.viewport.plugins.plugins["clamp-zoom"] = null;
			} catch {}
			try {
				currentScene[obfuscatedNameTranslator.viewingGhosts] = true;
				currentScene[obfuscatedNameTranslator.ceilingsContainer].alpha = 0.3;
			} catch {}
		}, 300);
		// cache property names to speed up code
		let p = [];
		setInterval(() => {
			for (
				let i = 0;
				i < currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList]?.length || 0;
				i++
			) {
				try {
					if (currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i].alpha < 0.5) {
						currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i].alpha = 0.5;
					}
					if (currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i].inner.alpha < 0.5) {
						currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i].inner.alpha = 0.5;
					}

					// make nameObject and relatedObjects visible
					// cache stuff
					if (p.length === 0) {
						const temp = getAllProperties(
							currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i]
						);
						p = temp.filter(
							(e) =>
								e.startsWith("_0x") &&
								typeof currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i][e] ===
									"object"
						);
					}
					for (const e of p) {
						if (currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i][e].visible != null)
							currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i][e].visible = true;
					}
				} catch {}
			}
		}, 50);
		betterVisionx = true;
	}
};

const aimLine = () => {
	const overlayAnimals = [13, 61, 93, 94, 113];

	function createAimOverlay() {
		try {
			document.getElementById("aim-overlay").remove();
		} catch {}
		const aim_overlay = document.createElement("hr");
		document.querySelector("div.game").insertBefore(aim_overlay, document.querySelector("div.game").children[0]);
		aim_overlay.outerHTML =
			'<hr id="aim-overlay" style="border: 1px #f55d dotted;border-image: linear-gradient(to right, #f55d, #f550) 1;transform-origin: left;position: absolute;top: 50%;left: 50%;width: 40vw;display:none;pointer-events:none;">';
	}
	createAimOverlay();
	if (!aimLinex) {
		document.addEventListener("mousemove", () => {
			try {
				if (currentScene != null) {
					if (currentScene?.myAnimals?.[0] != null) {
						document.getElementById("aim-overlay").style.transform = `rotate(${
							(currentScene?.myAnimals?.[0]?.inner?.rotation * 180) / Math.PI +
							(currentScene?.myAnimals?.[0]?.visibleFishLevel === 101 ? 90 : -90)
						}deg)`;
					}
				}
			} catch {}
		});
		window.addEventListener(
			"keydown",
			(e) => {
				try {
					if (e.ctrlKey && overlayAnimals.includes(currentScene.myAnimals[0].visibleFishLevel)) {
						document.getElementById("aim-overlay").style.display = "block";
					}
				} catch {}
			},
			false
		);
		window.addEventListener(
			"keyup",
			(e) => {
				try {
					if (!e.ctrlKey) {
						document.getElementById("aim-overlay").style.display = "none";
					}
				} catch {}
			},
			false
		);
		window.addEventListener("focus", () => {
			try {
				document.getElementById("aim-overlay").style.display = "none";
			} catch {}
		});
		aimLinex = true;
	}
};

const clearChat = () => {
	if (!clearChatx) {
		document.addEventListener("keydown", (event) => {
			if (event.code === "KeyB" && document.activeElement !== document.querySelector("div.chat-input input")) {
				for (const b of currentScene[obfuscatedNameTranslator.chatMessages]) {
					b.renderable = false;
					b.render = () => undefined;
				}
			}
		});
		clearChatx = true;
	}
};

const boostHacks = () => {
	function showCtrlOverlay(e) {
		if (!document.getElementById("ctrl-overlay")) {
			createCtrlOverlay();
		}
		if (e.ctrlKey || e.altKey) {
			try {
				if (currentScene != null) {
					if (currentScene?.myAnimals?.[0] != null) {
						if (currentScene?.myAnimals?.[0]?.visibleFishLevel !== 101) {
							document.getElementById("ctrl-overlay").style.pointerEvents = "all";
						} else if (!e.shiftKey) {
							if (currentScene?.myAnimals?.[0]?.visibleFishLevel === 101) document.getElementById("ctrl-overlay").style.pointerEvents = "all";
						} else {
							document.getElementById("ctrl-overlay").style.pointerEvents = "none";
						}
					}
				}
			} catch {}
		}
	}

	function superShot() {
		try {
			handleLongPress(1);
			setTimeout(() => {
				handleLongPress(5000);
			}, 50);
			setTimeout(() => {
				handleLongPress(5000);
			}, 100);
			setTimeout(() => {
				handleLongPress(5000);
			}, 150);
		} catch {}
	}

	function createCtrlOverlay() {
		try {
			document.getElementById("ctrl-overlay").remove();
		} catch {}
		const ctrl_overlay = document.createElement("div");
		document.querySelector("div.game").insertBefore(ctrl_overlay, document.querySelector("div.game").children[0]);
		ctrl_overlay.outerHTML =
			'<div id="ctrl-overlay" style="width: 100%;height: 100%;position: absolute;display: block;z-index:10000;pointer-events:none;"></div>';
		document.getElementById("ctrl-overlay").addEventListener("contextmenu", (e) => e.preventDefault());
	}
	createCtrlOverlay();
	if (!boostHacksx) {
		window.addEventListener(
			"keydown",
			(e) => {
				try {
					showCtrlOverlay(e);
				} catch {}
			},
			false
		);
		window.addEventListener(
			"click",
			(e) => {
				try {
					const b = {
						...boostData.default,
						...boostData[currentScene?.myAnimals?.[0]?.visibleFishLevel],
					};
					if (e.ctrlKey) {
						if (e.shiftKey && currentScene?.myAnimals?.[0]?.visibleFishLevel === 107) {
							superShot();
						} else if (e.shiftKey && currentScene?.myAnimals?.[0]?.visibleFishLevel !== 101 && currentScene?.myAnimals?.[0]?._standing) {
							handleLongPress(randInt(5e8, 2 ** 31 - 1));
						} else {
							let inputManager = Object.getOwnPropertyNames(game)
								.map((v) => game[v])
								.find((v) => v.keys instanceof Array);
							inputManager.pointerDown = true;
							inputManager.pressElapsed = Infinity;
							inputManager.setPointerDown(false);
						}
					} else if (e.altKey) {
						handleLongPress(currentScene?.myAnimals?.[0]?._standing ? 41 : Math.floor(b.secLoadTime / 2));
					}
				} catch {}
			},
			false
		);
		window.addEventListener(
			"keyup",
			(e) => {
				try {
					if (!e.ctrlKey && !e.altKey) {
						document.getElementById("ctrl-overlay").style.pointerEvents = "none";
					}
				} catch {}
			},
			false
		);
		window.addEventListener("focus", () => {
			try {
				document.getElementById("ctrl-overlay").style.pointerEvents = "none";
			} catch {}
		});
		boostHacksx = true;
	}
};

const humpbackAutosongs = () => {
	if (!humpbackAutosongsx) {
		const songs = [
			[5, 5, 5],
			[5, 5000, 5],
			[5000, 5000, 5000],
			[5000, 5000, 5],
		];
		const humpbackUiStyle = document.createElement("style");
		humpbackUiStyle.innerHTML = `
#humpback-ui * {
  font-family:Quicksand;
  color:#fff;
}
#humpback-ui .hb-button p {
  margin:5px 0 0 0;
  font-size:12px;
}
#humpback-ui {
  display:flex;
  gap:8px;
  width:100%;
  justify-content:center;
  pointer-events:none;
  user-select:none;
}
#humpback-ui .hb-button {
  background:#0004;
  padding:10px 0;
  border-radius:15px;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
}
#humpback-ui .hb-song {
  display:flex;
  flex-direction:row;
  gap:2px;
  width:81px;
  justify-content:center;
}
#humpback-ui .war {
  background:#ae3e41;
}
#humpback-ui .heal {
  background:#1aff00;
}
#humpback-ui .blast {
  background:#f6ff00;
}
#humpback-ui .ruin {
  background:#db7c00;
}
#humpback-ui .small {
  width:10px;
  height:10px;
  margin:2.5px 0;
  border-radius:999px;
}
#humpback-ui .large {
  width:15px;
  height:15px;
  border-radius:999px;
}

  `;
		document.head.appendChild(humpbackUiStyle);
		setInterval(() => {
			try {
				if (currentScene?.myAnimals?.[0]?.visibleFishLevel != 87) {
					if (document.querySelector("#humpback-ui")) {
						document.querySelector("#humpback-ui").remove();
					}
					return;
				} else if (document.querySelector("#humpback-ui")) {
					return;
				}
				const humpbackUI = document.createElement("div");
				const parent = document.querySelector(".stats .middle");

				humpbackUI.innerHTML = `
<div id="humpback-ui">
  <div class="hb-button">
    <div class="hb-song">
      <div class="war small"></div>
      <div class="war small"></div>
      <div class="war small"></div>
    </div>
    <p>War | 1</p>
  </div>

  <div class="hb-button">
    <div class="hb-song">
      <div class="heal small"></div>
      <div class="heal large"></div>
      <div class="heal small"></div>
    </div>
    <p>Heal | 2</p>
  </div>

  <div class="hb-button">
    <div class="hb-song">
      <div class="blast large"></div>
      <div class="blast large"></div>
      <div class="blast large"></div>
    </div>
    <p>Blast | 3</p>
  </div>

  <div class="hb-button">
    <div class="hb-song">
      <div class="ruin large"></div>
      <div class="ruin large"></div>
      <div class="ruin small"></div>
    </div>
    <p>Ruin | 4</p>
  </div>
</div>
    `;
				parent.prepend(humpbackUI);
			} catch {}
		}, 100);
		document.addEventListener("keydown", (e) => {
			try {
				if (!["1", "2", "3", "4"].includes(e.key)) return;
				if (currentScene?.myAnimals?.[0]?.visibleFishLevel !== 87) return;
				for (const i in [0, 1, 2]) {
					setTimeout(() => {
						handleLongPress(songs[parseInt(e.key) - 1][i]);
					}, Math.max(document.querySelector("div.top-right div.latency > span.value")?.innerText * 3 || 100, 100) * i);
				}
			} catch {}
		});
		humpbackAutosongsx = true;
	}
};

const obfuscatedNameTranslator = {};
const getAllProperties = (obj) => {
	return [...Object.getOwnPropertyNames(Object.getPrototypeOf(obj)), ...Object.getOwnPropertyNames(obj)];
};
const throttle = (func, delay) => {
	let prev = 0;
	return (...args) => {
		const now = Date.now();
		if (now - prev > delay) {
			prev = now;
			return func(...args);
		}
	};
};
const injector = () => {
	const reflect = {};
	for (const v of Object.getOwnPropertyNames(Reflect)) {
		reflect[v] = Reflect[v];
	}

	const proxy = Proxy;

	const spoof = new WeakMap();
	spoof.set = spoof.set;
	spoof.get = spoof.get;
	spoof.has = spoof.has;

	const proxies = new WeakSet();
	proxies.add = proxies.add;
	proxies.has = proxies.has;
	proxies.delete = proxies.delete;

	const lookupGetter = Object.prototype.__lookupGetter__;

	const hook = (obj, name, handler) => {
		const hooked = new proxy(obj[name], handler);
		spoof.set(hooked, obj[name]);
		obj[name] = hooked;
	};

	hook(Function.prototype, "toString", {
		apply(f, th, args) {
			return reflect.apply(f, spoof.get(th) || th, args);
		},
	});

	hook(window, "Proxy", {
		construct(f, args) {
			const result = reflect.construct(f, args);
			proxies.add(result);
			return result;
		},
	});

	hook(proxy, "revocable", {
		apply(f, th, args) {
			const result = reflect.apply(f, th, args);
			proxies.add(result.proxy);
			return result;
		},
	});

	let lastInjectionSuccessTime = 0;
	hook(Function.prototype, "bind", {
		apply(f, th, args) {
			if (proxies.has(args[0])) return reflect.apply(f, th, args);
			try {
				try {
					if (lookupGetter.call(args[0], "aboveBgPlatformsContainer") != null) return reflect.apply(f, th, args);
				} catch {}
				if (args[0] && args[0].aboveBgPlatformsContainer != null) {
					currentScene = args[0];
					game = args[0].game;

					const currentSceneKeys = getAllProperties(currentScene);
					const obCurrentSceneKeys = currentSceneKeys.filter((e) => e.startsWith("_0x"));
					obfuscatedNameTranslator.setFlash =
						Object.getOwnPropertyNames(currentScene.__proto__.__proto__)
							.filter((v) => v.startsWith("_0x"))
							.find((v) => currentScene[v] instanceof Function) || obfuscatedNameTranslator.setFlash;
					obfuscatedNameTranslator.terrainManager =
						obCurrentSceneKeys.find((e) => typeof currentScene[e]?.shadow !== "undefined") || obfuscatedNameTranslator.terrainManager;

					const foodContainerInter = setInterval(() => {
						obfuscatedNameTranslator.foodGlowContainer =
							obCurrentSceneKeys.find(
								(e) =>
									typeof currentScene[e]?.children?.[0]?.texture?.textureCacheIds?.[0] !== "undefined" &&
									currentScene[e].children?.[0].texture.textureCacheIds[0] === "food_glow.png"
							) || obfuscatedNameTranslator.foodGlowContainer;
						obfuscatedNameTranslator.foodContainer =
							obCurrentSceneKeys.find(
								(e) =>
									typeof currentScene[e]?.children?.[0]?.texture?.textureCacheIds?.[0] !== "undefined" &&
									[
										"food.png",
										"flappy.png",
										"meat.png",
										"man.png",
										"algae.png",
										"apple.png",
										"fruit.png",
										"volcanofood.png",
										"bubble.png",
										"coconut.png",
										"coldfood.png",
										"coldalgae.png",
										"reeffood.png",
										"reefalgae.png",
									].includes(currentScene[e].children?.[0].texture.textureCacheIds?.[0])
							) || obfuscatedNameTranslator.foodContainer;

						if (typeof obfuscatedNameTranslator.foodGlowContainer !== "undefined" && typeof obfuscatedNameTranslator.foodContainer !== "undefined")
							clearInterval(foodContainerInter);
					}, 1000);

					obfuscatedNameTranslator.ceilingsContainer =
						obCurrentSceneKeys.find(
							(e) =>
								typeof currentScene[e]?.children?.[0]?.settings?.layerId !== "undefined" &&
								currentScene[e].children?.[0].settings.layerId === "ceilings"
						) || obfuscatedNameTranslator.ceilingsContainer;

					obfuscatedNameTranslator.viewingGhosts =
						obCurrentSceneKeys.find((e) => typeof currentScene[e] === "boolean") || obfuscatedNameTranslator.viewingGhosts;

					obfuscatedNameTranslator.entityManager =
						obCurrentSceneKeys.find((e) => typeof currentScene[e]?.entitiesList !== "undefined") || obfuscatedNameTranslator.entityManager;
					obfuscatedNameTranslator.entityManagerProps = {};
					const entityManagerKeys = getAllProperties(currentScene[obfuscatedNameTranslator.entityManager]);

					const animalListInter = setInterval(() => {
						obfuscatedNameTranslator.animalsContainer =
							obCurrentSceneKeys.find((e) => typeof currentScene[e]?.children?.[0]?.isHiding !== "undefined") ||
							obfuscatedNameTranslator.animalsContainer;

						obfuscatedNameTranslator.entityManagerProps.animalsList =
							entityManagerKeys
								.filter((e) => e.startsWith("_0x"))
								.find((e) => typeof currentScene?.[obfuscatedNameTranslator.entityManager]?.[e]?.[0] !== "undefined") ||
							obfuscatedNameTranslator.entityManagerProps.animalsList;
						if (
							typeof obfuscatedNameTranslator.animalsContainer !== "undefined" &&
							typeof obfuscatedNameTranslator.entityManagerProps.animalsList !== "undefined"
						)
							clearInterval(animalListInter);
					}, 1000);

					obfuscatedNameTranslator.chatMessages =
						obCurrentSceneKeys.find((e) => typeof currentScene[e] === "object" && typeof currentScene[e]?.length === "number") ||
						obfuscatedNameTranslator.chatMessages;

					// TODO: fix this in the future since numbers could change
					//       need to get ALL layers and order them from lowest zIndex to highest zIndex
					//       then get layers by their index

					// namesLayer zIndex = 18
					// barsLayer zIndex = 15
					// chatContainer zIndex = 50
					obfuscatedNameTranslator.barsLayer =
						obCurrentSceneKeys.find((e) => typeof currentScene[e] === "object" && currentScene[e]?.zIndex === 15) ||
						obfuscatedNameTranslator.barsLayer;
					obfuscatedNameTranslator.namesLayer =
						obCurrentSceneKeys.find((e) => typeof currentScene[e] === "object" && currentScene[e]?.zIndex === 18) ||
						obfuscatedNameTranslator.namesLayer;
					obfuscatedNameTranslator.chatContainer =
						obCurrentSceneKeys.find((e) => typeof currentScene[e] === "object" && currentScene[e]?.zIndex === 50) ||
						obfuscatedNameTranslator.chatContainer;

					const gameKeys = getAllProperties(game);
					obfuscatedNameTranslator.socketManager =
						gameKeys.find((e) => typeof game[e]?.sendBytePacket !== "undefined") || obfuscatedNameTranslator.socketManager;

					quickDisconnect();
					betterVision();
					aimLine();
					clearChat();
					boostHacks();
					humpbackAutosongs();
					try {
						gameState = document
							.getElementById("app")
							._vnode.appContext.config.globalProperties.$simpleState.states.find((v) => v._storeMeta.id === "game");
					} catch {}
					// throttle
					if (lastInjectionSuccessTime < Date.now() - 3000) {
						ui.message.success("fsploit - Loaded client modifications");
						lastInjectionSuccessTime = Date.now();
					}
				}
			} catch {}
			return reflect.apply(f, th, args);
		},
	});
};

// MAIN

window.addEventListener("load", () => {
	setTimeout(() => {
		fetch("https://raw.githubusercontent.com/mahdi13377/fsploit-public/main/mainMod.js", { cache: "no-cache" })
			.then((response) => {
				return response.text();
			})
			.then((data) => {
				if (currentScript !== data) {
					ui.nukeDOM();
					ui.alert({
						title: "fsploit",
						message: "fsploit has been updated. Please reload the page.",
						type: "info",
						dismissButtonText: "Reload",
						onDismiss: () => location.reload(),
					});
				}
				GM_setValue("mainModule", data);
			})
			.catch(() => {
				location.reload();
			});
	}, 1000);

	const main = () => {
		injector();
		applyStyles();
		evoTree();
		const { close } = ui.message.success(`fsploit v${fsploitVersion} - Initialized`);
		setTimeout(() => {
			close();
			ui.message.info("Brought to you by Vast Softworks LLC.");
		}, 3000);
	};

	let sourceVersion = "unknown,unknown";
	try {
		sourceVersion = [
			document.querySelector("head script[type='module'][src*='index']").src.match(/index\.(?<name>[0-9a-z]*)\.js/i).groups.name,
			document.querySelector("head link[rel='modulepreload'][href*='vendor']").href.match(/vendor\.(?<name>[0-9a-z]*)\.js/i).groups.name,
		].join(",");
	} catch {}
	if (sourceVersion === knownClientVersion) {
		main();
	} else {
		ui.confirm({
			title: "Untested Deeeep.io version",
			message: `Anti-cheat bypass features may not work as expected and get your account banned.
					<br>
					Do you want to proceed anyway?
					<br>
					<p style="font-size:smaller;margin-top: 12px;">
						Debug info:
						<span style="background: #0004;border: 1px solid #fff3;padding: 1px 3px;border-radius: 4px;user-select: auto;">
							index: ${sourceVersion.split(",")[0]}, vendor: ${sourceVersion.split(",")[1]}
						</span>
					</p>`,
			dangerouslyUseHTMLString: true,
			type: "warning",
			confirmButtonText: "Yes",
			cancelButtonText: "No",
			onConfirm: main,
			onCancel: () => {},
		});
	}
});

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址