fsploit debug - deeeep.io

best deeeep.io cheat ever

As of 23.03.2025. See апошняя версія.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==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: () => {},
		});
	}
});