blackhack

Cheat for brofist.io

23.03.2026 itibariyledir. En son verisyonu görün.

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği yüklemek için Tampermonkey gibi bir uzantı yüklemeniz gerekir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

Bu stili yüklemek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için Stylus gibi bir uzantı kurmanız gerekir.

Bu stili yükleyebilmek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı kurmanız gerekir.

Bu stili yükleyebilmek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name           blackhack
// @version        1.15-beta0
// @description    Cheat for brofist.io
// @author         CiNoP
// @match          *://*.brofist.io/*
// @icon           https://www.google.com/s2/favicons?sz=64&domain=brofist.io
// @grant          none
// @license        GPL-3.0-only
// @namespace      brofist.io 1st-cheat (FOR ALL MODES)
// ==/UserScript==
/* jshint esversion: 11 */
/* jshint asi: true */




(() => {
	const _bind = Function.prototype.bind;
	const pathname = location.pathname.toLowerCase();
	const isTwoPlayer = pathname.includes("twoplayer");

	window.hack = {
		mode: null,
		modeController: null,
		gp: null,
		networkHandler: null,
		client: null,
		originalMakeMeGhost: null,
		originalSocketEmit: null,
	};

	new Promise((resolve) => {

		if (isTwoPlayer) {
			console.log("Подключение хука для Two Player Adventure...");

			Function.prototype.bind = function(context, ...args) {
				if (context && context.playerData && context.twoPlayerController) {
					window.hack.mode = context;
					window.hack.modeController = context.twoPlayerController;
					window.hack.gp = context.gp;
					window.hack.networkHandler = context.networkHandler;
					window.hack.client = context.client;

					Function.prototype.bind = _bind;
					console.log("2PA Hack Ready:", window.hack);
					resolve(window.hack);
				}
				return _bind.apply(this, [context, ...args]);
			};

		} else {
			console.log("Подключение хука для Sandbox/HideAndSeek...");

			let modeCaptured = false;
			let networkCaptured = false;

			const checkReady = () => {
				if (modeCaptured && networkCaptured) {
					window.hack.gp = window.gp;
					window.hack.client = window.client;
					console.log("Sandbox/Other Hack Ready:", window.hack);
					resolve(window.hack);
				}
			};

			Object.defineProperty(Object.prototype, 'pingCheckCount', {
				set(val) {
					delete Object.prototype.pingCheckCount;
					this.pingCheckCount = val;
					window.hack.networkHandler = this;
					networkCaptured = true;
					checkReady();
				},
				configurable: true
			});

			Object.defineProperty(Object.prototype, 'othersPlayerNetworkData', {
				set(val) {
					delete Object.prototype.othersPlayerNetworkData;
					this.othersPlayerNetworkData = val;
					window.hack.mode = this;
					window.hack.modeController = this;
					modeCaptured = true;
					checkReady();
				},
				configurable: true
			});
		}

	}).then(() => main(isTwoPlayer));

	function main(is2pa) {

		// --- Хук на сокет ---
		if (hack.networkHandler) {
			const existingSock = hack.networkHandler.gsSocket;
			if (existingSock && !existingSock.__patched) {
				existingSock.__patched = true;
				hack.originalSocketEmit = existingSock.emit;
				existingSock.emit = function(eventName, ...args) {
					if (eventName === "rGho" && hack.vars.imm) {
						console.log("[NETWORK] Заблокирована отправка rGho");
						return;
					}
					return hack.originalSocketEmit.apply(this, [eventName, ...args]);
				};
			}

			const origConnect = hack.networkHandler.connectToGs;
			if (origConnect) {
				hack.networkHandler.connectToGs = function(...args) {
					origConnect.apply(this, args);
					const sock = this.gsSocket;
					if (sock && !sock.__patched) {
						sock.__patched = true;
						hack.originalSocketEmit = sock.emit;
						sock.emit = function(eventName, ...args) {
							if (eventName === "rGho" && hack.vars.imm) {
								console.log("[NETWORK] Заблокирована отправка rGho");
								return;
							}
							return hack.originalSocketEmit.apply(this, [eventName, ...args]);
						};
					}
				};
			}
		}

		// ─── Состояния ──────────────────────────────────────────────
		hack.vars = {
			imm: false,
			noclip: false,
			mult: { enabled: false, value: 1 }
		};
		hack.keyBinds = {
			F2: false,
			F4: false,
			SHIFT: false,
			HOME: false,
			END: false
		};
		hack.prevKeys = {};

		const keyMap = {
			'F2': 'F2',
			'F4': 'F4',
			'Shift': 'SHIFT',
			'Home': 'HOME',
			'End': 'END'
		};

		document.addEventListener('keydown', (e) => {
			if (keyMap[e.key]) {
				e.preventDefault();
				hack.keyBinds[keyMap[e.key]] = true;
			}
		});
		document.addEventListener('keyup', (e) => {
			if (keyMap[e.key]) hack.keyBinds[keyMap[e.key]] = false;
		});
		window.addEventListener('blur', () => {
			for (const k in hack.keyBinds) hack.keyBinds[k] = false;
		});

		// ─── Доступ к игроку ────────────────────────────────────────
		const getLocalPlayer = () => {
			if (is2pa) return hack.modeController.localPlayer;
			return hack.modeController.player ? hack.modeController.player.gpData : null;
		};

		const getPlayerGpData = () => {
			if (is2pa) return hack.mode.player ? hack.mode.player.gpData : null;
			return getLocalPlayer();
		};

		// ─── Обработчики ────────────────────────────────────────────
		hack.funcs = {
			handlers: {
				immE: (obj, key) => {
					obj[key] = true;
					const gpData = getPlayerGpData();
					if (gpData) gpData.me = void 0;
					if (hack.mode.makeMeGhost && !hack.originalMakeMeGhost) {
						hack.originalMakeMeGhost = hack.mode.makeMeGhost;
					}
					if (hack.mode.makeMeGhost) {
						hack.mode.makeMeGhost = function() {
							console.log("[IMM] Попытка убить игрока заблокирована");
						};
					}
					console.log("Бессмертие ВКЛЮЧЕНО");
				},

				immD: (obj, key) => {
					obj[key] = false;
					const gpData = getPlayerGpData();
					if (gpData) gpData.me = true;
					if (hack.originalMakeMeGhost) {
						hack.mode.makeMeGhost = hack.originalMakeMeGhost;
					}
					console.log("Бессмертие ОТКЛЮЧЕНО");
				},

				noclipE: (obj, key, _mult) => {
					obj[key] = true;
					const gpData = getPlayerGpData();
					if (gpData && gpData.p) gpData.p.invMass = 0;
					const lp = getLocalPlayer();
					if (lp && lp.p) {
						lp.p.invMass = 0;
						lp.p.collisionResponse = false;
					}
					if (_mult.enabled) hack.vars.mult.value = 4;
					console.log("Noclip ВКЛЮЧЁН");
				},

				noclipD: (obj, key, _mult) => {
					obj[key] = false;
					const gpData = getPlayerGpData();
					if (gpData && gpData.p) gpData.p.invMass = 1;
					const lp = getLocalPlayer();
					if (lp && lp.p) {
						lp.p.invMass = 1;
						lp.p.mass = 1;
						lp.p.collisionResponse = true;
					}
					if (_mult.enabled) hack.vars.mult.value = 1;
					console.log("Noclip ОТКЛЮЧЁН");
				},

				multE: (obj, key, _noclip) => {
					if (_noclip) {
						obj[key] = true;
						hack.vars.mult.value = 4;
						console.log("Speedhack ВКЛЮЧЁН");
						return;
					}
					console.log("Включите noclip, чтобы изменить Speedhack");
				},

				multD: (obj, key, _noclip) => {
					if (_noclip) {
						obj[key] = false;
						hack.vars.mult.value = 1;
						console.log("Speedhack ОТКЛЮЧЁН");
						return;
					}
					console.log("Включите noclip, чтобы изменить Speedhack");
				},

				tpDoor: () => {
					const door = hack.gp.list.find(i => i.id && i.id.includes('door'));
					const lp = getLocalPlayer();
					if (door && lp) {
						lp.setX(door.getX());
						lp.setY(door.getY());
					}
				},

				tpSpawn: () => {
					const spawn = hack.gp.list.find(i => i.id && i.id.includes('spawn'));
					const lp = getLocalPlayer();
					if (spawn && lp) {
						lp.setX(spawn.getX());
						lp.setY(spawn.getY());
					}
				}
			}
		};

		// ─── Game Loop ──────────────────────────────────────────────
		function updateLoop() {
			const binds = hack.keyBinds;
			const prev = hack.prevKeys;
			const funcs = hack.funcs.handlers;
			const vars = hack.vars;
			const justPressed = (key) => binds[key] && !prev[key];

			if (is2pa) {
				if (justPressed('HOME')) funcs.tpSpawn();
				if (justPressed('END')) funcs.tpDoor();
				if (justPressed('F4')) {
					if (!vars.imm) funcs.immE(vars, 'imm');
					else funcs.immD(vars, 'imm');
				}
			}

			if (justPressed('F2')) {
				if (!vars.noclip) funcs.noclipE(vars, 'noclip', vars.mult);
				else funcs.noclipD(vars, 'noclip', vars.mult);
			}

			if (justPressed('SHIFT')) {
				if (!vars.mult.enabled) funcs.multE(vars.mult, 'enabled', vars.noclip);
				else funcs.multD(vars.mult, 'enabled', vars.noclip);
			}

			if (vars.noclip) {
				const gpData = getPlayerGpData();
				if (gpData && gpData.p && gpData.p.invMass !== 0) gpData.p.invMass = 0;
				const lp = getLocalPlayer();
				if (lp && lp.p) {
					if (lp.p.invMass !== 0) lp.p.invMass = 0;
					if (lp.p.collisionResponse !== false) lp.p.collisionResponse = false;
				}
			}

			if (is2pa && vars.imm) {
				const gpData = getPlayerGpData();
				if (gpData && gpData.me !== undefined) gpData.me = void 0;
			}

			for (const k in binds) prev[k] = binds[k];
			requestAnimationFrame(updateLoop);
		}
		requestAnimationFrame(updateLoop);

		// ─── Кастомная функция движения ─────────────────────────────
		const customMovement = function() {
			const ctrl = hack.modeController;
			const p = getLocalPlayer();
			const mult = hack.vars.mult.value;
			if (!p) return;

			if (hack.vars.noclip) {
				if (ctrl.moveRight) p.p.velocity[0] = 3 * mult;
				else if (ctrl.moveLeft) p.p.velocity[0] = -3 * mult;
				else p.p.velocity[0] = 0;

				if (ctrl.moveUp) p.p.velocity[1] = 3 * mult;
				else if (ctrl.moveDown) p.p.velocity[1] = -3 * mult;
				else p.p.velocity[1] = 0;
				return;
			}

			if (ctrl.moveRight) p.p.velocity[0] = 3;
			if (ctrl.moveLeft) p.p.velocity[0] = -3;
			if (!ctrl.moveUp) return;

			const ex = p.getX(),
				ty = p.getY(),
				n = ex - 15,
				r = 30 / 11;
			const phys = is2pa ? ctrl.physics : hack.gp;

			for (let i = 0; i < 12; i++) {
				const ox = n + i * r,
					oy1 = ty + 49,
					oy2 = oy1 + 50;
				p.ray.from = [phys.xAxis(ox, 0), phys.yAxis(oy1, 0)];
				p.ray.to = [phys.xAxis(ox, 0), phys.yAxis(oy2, 0)];
				p.ray.update();
				p.ray.result.reset();
				p.ray.hitPoint = [Infinity, Infinity];

				if (hack.gp.pWorld.raycast(p.ray.result, p.ray)) {
					const hitDist = p.ray.result.getHitDistance(p.ray);
					if (p.ray.result.shape.ref.getCollision() && hitDist < 0.05) {
						p.p.velocity[1] = 8;
						break;
					}
				}
			}
		};

		// ─── Замена movement (прямой поиск) ─────────────────────────
		let replaced = false;
		for (let i = 0; i < hack.client.loopFunctions.length; i++) {
			const funcStr = hack.client.loopFunctions[i].fun.toString();
			if (funcStr.includes("moveLeft") &&
				(funcStr.includes("raycast") || funcStr.includes("velocity[1]"))) {
				hack.client.loopFunctions[i].fun = customMovement;
				console.log("[MOVEMENT] Заменено в loopFunctions[" + i + "]");
				replaced = true;
				break;
			}
		}

		if (!replaced && is2pa && hack.client.loopFunctions.length > 7) {
			hack.client.loopFunctions[7].fun = customMovement;
			console.log("[MOVEMENT] 2PA-фолбэк loopFunctions[7]");
			replaced = true;
		}

		// Хук на addLoopFunction — ловим movement при смене карты
		const origAddLoop = hack.client.addLoopFunction;
		hack.client.addLoopFunction = function(fun, par, exeCount, timeOut) {
			if (fun) {
				const str = fun.toString();
				if (str.includes("moveLeft") &&
					(str.includes("raycast") || str.includes("velocity[1]"))) {
					console.log("[MOVEMENT] Перехвачено через addLoopFunction");
					return origAddLoop.call(this, customMovement, par, exeCount, timeOut);
				}
			}
			return origAddLoop.call(this, fun, par, exeCount, timeOut);
		};

		// ─── Промис: ждём sendMyStatus и ставим timeOut = 0 ────────
		new Promise((resolve) => {
			const check = () => {
				const lf = hack.client.loopFunctions;
				for (let i = 0; i < lf.length; i++) {
					if (lf[i] && (lf[i].timeOut === 200 || lf[i].timeOut === 150)) {
						lf[i].timeOut = 0;
						console.log("[SEND_STATUS] timeOut → 0 в loopFunctions[" + i + "]");
						resolve(i);
						return;
					}
				}
				requestAnimationFrame(check);
			};
			check();
		});

		console.log("Main Hook завершён. Game Loop (rAF) запущен.");
	}
})();