blackhack

Cheat for brofist.io

Pada tanggal 13 Maret 2025. Lihat %(latest_version_link).

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 or Violentmonkey 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           blackhack
// @version        1.14-beta1
// @description    Cheat for brofist.io
// @author         CiNoP
// @match          https://brofist.io/
// @match          https://brofist.io/modes/twoPlayer/c/index.html
// @match          https://brofist.io/modes/hideAndSeek/c/index.html
// @match          https://brofist.io/modes/sandbox/c/index.html
// @match          http://brofist.io/
// @match          http://brofist.io/modes/twoPlayer/c/index.html
// @match          http://brofist.io/modes/hideAndSeek/c/index.html
// @match          http://brofist.io/modes/sandbox/c/index.html
// @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 */






// Функция для переключения вкладок (пример реализации)
window.openTab = function(tabName, event) {
	const tabContents = document.querySelectorAll(".tab-content");
	tabContents.forEach(tab => tab.style.display = "none");
	const buttons = document.querySelectorAll(".tab-button");
	buttons.forEach(btn => btn.classList.remove("active"));
	document.getElementById(tabName + "Tab").style.display = "block";
	event.currentTarget.classList.add("active");
}




// Функция для обновления списка в контейнере
window.updateBlacklistList = function() {
    const container = document.getElementById("blacklistContainer");
    container.innerHTML = "";
    hack.vars.blacklisted.names.forEach(name => {
        const row = document.createElement("div");
        row.className = "form-row";
        row.style.justifyContent = "flex-start";
        row.style.alignItems = "center";
        row.style.gap = "8px"; // Увеличиваем зазор между элементами

        // Кнопка для удаления (эмодзи ❌) - сделана квадратной
        const delBtn = document.createElement("button");
        delBtn.className = "btn";
        delBtn.style.padding = "0";
        delBtn.style.width = "24px";
        delBtn.style.height = "24px";
        delBtn.style.lineHeight = "24px";
        delBtn.style.display = "flex";
        delBtn.style.alignItems = "center";
        delBtn.style.justifyContent = "center";
        delBtn.style.boxSizing = "border-box";
        delBtn.innerText = "❌";
        delBtn.onclick = function() {
            window.removeBlacklistName(name);
        };

        // Эмодзи белой точки
        const whiteDot = document.createElement("span");
        whiteDot.innerText = "⚪";
        whiteDot.style.marginRight = "8px"; // расстояние между белой точкой и никнеймом

        const nameSpan = document.createElement("span");
        nameSpan.innerText = name;

        row.appendChild(delBtn);
        row.appendChild(whiteDot);
        row.appendChild(nameSpan);
        container.appendChild(row);
    });
}

// Функция добавления никнейма
window.addBlacklistName = function() {
    const input = document.getElementById("blacklistInput");
    const name = input.value.trim();
    if (name !== "") {
        hack.vars.blacklisted.names.push(name);
        input.value = "";
        window.updateBlacklistList();
    }
}

// Функция удаления никнейма по клику на ❌
window.removeBlacklistName = function(name) {
    hack.vars.blacklisted.names = hack.vars.blacklisted.names.filter(e => e !== name);
    window.updateBlacklistList();
}

setInterval(window.updateBlacklistList, 200);















// Функция, возвращающая противоположный (инвертированный) цвет в формате HEX
window.getComplementaryColor = function(hex) {
	hex = hex.replace("#", "");
	if (hex.length === 3) {
		hex = hex.split("").map(ch => ch + ch).join("");
	}
	const r = parseInt(hex.substring(0, 2), 16);
	const g = parseInt(hex.substring(2, 4), 16);
	const b = parseInt(hex.substring(4, 6), 16);
	const compR = (255 - r).toString(16).padStart(2, '0');
	const compG = (255 - g).toString(16).padStart(2, '0');
	const compB = (255 - b).toString(16).padStart(2, '0');
	return `#${compR}${compG}${compB}`;
}

// Преобразование HEX в RGBA с учетом прозрачности
window.hexToRGBA = function(hex, opacity) {
	hex = hex.replace("#", "");
	if (hex.length === 3) {
		hex = hex.split("").map(ch => ch + ch).join("");
	}
	const r = parseInt(hex.substring(0, 2), 16);
	const g = parseInt(hex.substring(2, 4), 16);
	const b = parseInt(hex.substring(4, 6), 16);
	return `rgba(${r}, ${g}, ${b}, ${opacity})`;
};

// Функция для применения выбранных настроек косметики
window.applyCosmetics = function() {
	const bgColor = document.getElementById("bgColorInput").value;
	const textColor = document.getElementById("textColorInput").value;
	const bgOpacity = parseFloat(document.getElementById("bgOpacityInput").value);
	const outlineEnabled = document.getElementById("textOutlineCheckbox").checked;

	const background = window.hexToRGBA(bgColor, bgOpacity);
	const elementIds = ["someData", "controlPanel", "mapCredits", "leaderboard", "timer"];

	elementIds.forEach(id => {
		const el = document.getElementById(id);
		if (el) {
			el.style.setProperty("background-color", background, "important");
			el.style.setProperty("opacity", "1", "important");

			// Меняем цвет текста и добавляем обводку, если это не leaderboard
			if (id !== "leaderboard") {
				el.style.setProperty("color", textColor, "important");

				if (outlineEnabled) {
					const outlineColor = getComplementaryColor(textColor);
					el.style.setProperty("text-shadow", `
    0.75px 0.75px 0 ${outlineColor},
    -0.75px -0.75px 0 ${outlineColor},
    0.75px -0.75px 0 ${outlineColor},
    -0.75px 0.75px 0 ${outlineColor},
    0.75px 0 0 ${outlineColor},
    0 0.75px 0 ${outlineColor},
    -0.75px 0 0 ${outlineColor},
    0 -0.75px 0 ${outlineColor}
  `, "important");
				} else {
					el.style.setProperty("text-shadow", "none", "important");
				}
			}
		}
	});

	localStorage.setItem("cosmeticsSettings", JSON.stringify({
		bgColor,
		textColor,
		bgOpacity,
		outlineEnabled
	}));
};

// Функция для загрузки сохраненных настроек
window.loadCosmetics = function() {
	const savedSettings = localStorage.getItem("cosmeticsSettings");
	if (savedSettings) {
		const {
			bgColor,
			textColor,
			bgOpacity,
			outlineEnabled
		} = JSON.parse(savedSettings);

		document.getElementById("bgColorInput").value = bgColor;
		document.getElementById("textColorInput").value = textColor;
		document.getElementById("bgOpacityInput").value = bgOpacity;
		if (typeof outlineEnabled !== "undefined") {
			document.getElementById("textOutlineCheckbox").checked = outlineEnabled;
		}

		window.applyCosmetics();
	}
};





const roomButtons = document.querySelectorAll('.button.rooms');
roomButtons.forEach(button => {
	button.addEventListener('click', function() {
		setTimeout(function() {
			window.loadCosmetics();
		}, 30);
	});
});











let sandboxURL = ['https://brofist.io/modes/sandbox/c/index.html', 'http://brofist.io/modes/sandbox/c/index.html']
let twoPlayerURL = ['https://brofist.io/modes/twoPlayer/c/index.html', 'http://brofist.io/modes/twoPlayer/c/index.html']
let hideAndSeekURL = ['https://brofist.io/modes/hideAndSeek/c/index.html', 'http://brofist.io/modes/hideAndSeek/c/index.html']
let brofioURL = ['https://brofist.io', 'http://brofist.io/']

document.body.insertAdjacentHTML("beforebegin",
	`<button id="infoPanelBtn" style="display: inherit; width: 30px; height: 30px; position: fixed; top: 50%; left: 0px; background: rgba(0, 0, 0, 0.3); color: rgb(255, 255, 255); border: none; cursor: pointer;">ⓘ</button>`
);

document.body.insertAdjacentHTML("beforebegin",
	`<div id="infoPanelArrow" style="position: fixed; left: 35px; top: 50%; font-size: 30px; color: #FF4136; opacity: 0; transform: translateY(-50%);">➤</div>`
);

document.getElementById('infoPanelBtn').addEventListener('click', () => {
	const panel = document.getElementById('cheatInfoPanel');
	panel.style.display = (panel.style.display === 'none') ? 'block' : 'none';
});

document.body.insertAdjacentHTML("beforebegin",
	`<div id="cheatInfoPanel" style="display: none; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: rgba(0, 0, 0, 0.8); color: rgb(255, 255, 255); padding: 15px; border-radius: 5px; font-size: 20px; text-align: center; z-index: 1000; font-family: Arial, sans-serif; cursor: move; max-width: 90%; max-height: 90%; overflow: auto; user-select: none;">
    <div style="margin-bottom: 10px;">
      <button id="decreaseFont" style="margin-right: 5px;">-</button>
      <button id="increaseFont">+</button>
    </div>
    <div id="cheatInfoText">
      ${getCheatInfoText()}
    </div>
  </div>`
);

makePanelDraggable(document.getElementById('cheatInfoPanel'));

function getCheatInfoText() {
	if (brofioURL.includes(window.location.href)) {
		return "Зайдите в любой режим";
	} else if (twoPlayerURL.includes(window.location.href)) {
		return `
<b>Функционал чита:</b><br>
английская <b>C</b> - Рывок (во все стороны)<br>
англ. <b>Z</b> - Прыжок с возможностью второго прыжка<br>
<b>F2</b> - Режим бога<br>
<b>ё</b> или <b>\`</b> - Изменение скорости в режиме бога<br>
<b>F4</b> - Невосприимчивость к яду<br>
<b>F9</b> - Невосприимчивость к смерти (по умолчанию вкл.)<br>
<b>Home</b>/<b>End</b> - тп к спавну/двери<br>
Зажатие англ. <b>S</b> - Увеличение массы в 3 раза<br>
<b>Insert</b> - Тп к игроку<br>
<b>Колесо мыши</b> - Выдача вертикальной скорости<br>
<b>Правый клик</b> - Телепорт к месту на котором ваш курсор<br><br>

<b>А так же:</b><br>
Информация об игроке, скриптовых переменных и т.п. во вкладке Info<br>
Изменение стиля интерфейса во вкладке Cosmetics<br>
Переключение между новым и старым передвижением в левой нижней панели<br>
Нажмите <b>Esc</b> чтобы скрыть новые панели<br>
    `;
	} else {
		return `
<b>Функционал чита:</b><br>
английская <b>C</b> - Рывок (во все стороны)<br>
англ. <b>Z</b> - Прыжок с возможностью второго прыжка<br>
<b>F2</b> - Режим бога<br>
<b>ё</b> или <b>\`</b> - Изменение скорости в режиме бога<br>
Зажатие англ. <b>S</b> - Увеличение массы в 3 раза<br>
<b>Колесо мыши</b> - Выдача вертикальной скорости<br><br>

<b>А так же:</b><br>
Информация об игроке, скриптовых переменных и т.п. в левой верхней панели<br>
Переключение между новым и старым передвижением в левой нижней панели<br>
Нажмите <b>Esc</b> чтобы скрыть новые панели<br>
    `;
	}
}

function makePanelDraggable(panel) {
	let isDragging = false;
	let startX, startY, initialX, initialY;

	panel.addEventListener('mousedown', dragStart);
	document.addEventListener('mouseup', dragEnd);
	document.addEventListener('mousemove', drag);

	function dragStart(e) {
		isDragging = true;
		startX = e.clientX;
		startY = e.clientY;
		const rect = panel.getBoundingClientRect();
		initialX = rect.left;
		initialY = rect.top;
		panel.style.transform = 'none';
	}

	function drag(e) {
		if (!isDragging) return;

		const offsetX = e.clientX - startX;
		const offsetY = e.clientY - startY;

		let newX = initialX + offsetX;
		let newY = initialY + offsetY;

		const windowWidth = window.innerWidth;
		const windowHeight = window.innerHeight;
		const panelRect = panel.getBoundingClientRect();

		const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
		const scrollbarHeight = window.innerHeight - document.documentElement.clientHeight;

		newX = Math.max(0, Math.min(windowWidth - panelRect.width - scrollbarWidth, newX));
		newY = Math.max(0, Math.min(windowHeight - panelRect.height - scrollbarHeight, newY));

		panel.style.left = `${newX}px`;
		panel.style.top = `${newY}px`;
	}

	function dragEnd() {
		isDragging = false;
	}
}

const cheatInfoPanel = document.getElementById('cheatInfoPanel');
const cheatInfoText = document.getElementById('cheatInfoText');
const decreaseFontBtn = document.getElementById('decreaseFont');
const increaseFontBtn = document.getElementById('increaseFont');

let fontSize = 20;

decreaseFontBtn.addEventListener('click', () => {
	fontSize = Math.max(10, fontSize - 2);
	cheatInfoText.style.fontSize = fontSize + 'px';
});

increaseFontBtn.addEventListener('click', () => {
	fontSize = Math.min(40, fontSize + 2);
	cheatInfoText.style.fontSize = fontSize + 'px';
});

const infoPanelArrow = document.getElementById('infoPanelArrow');
let animationCount = 0;
let animationRunning = false;

function initializeArrow() {
	infoPanelArrow.style.position = 'fixed';
	infoPanelArrow.style.top = '50%';
	infoPanelArrow.style.left = '35px';
	infoPanelArrow.style.transform = 'translateY(-50%) rotate(180deg)';
	infoPanelArrow.style.opacity = 0;
	infoPanelArrow.style.top = 'calc(50% + 15px)'
}

function animateArrow() {
	if (animationRunning) return;

	animationRunning = true;
	let opacity = 0;
	let fadeIn = true;

	const animationSpeed = 25;

	const animation = setInterval(() => {
		if (fadeIn) {
			opacity += 0.1;
			if (opacity >= 1) {
				fadeIn = false;
			}
		} else {
			opacity -= 0.1;
			if (opacity <= 0) {
				fadeIn = true;
				animationCount++;
				if (animationCount >= 10) {
					clearInterval(animation);
					animationRunning = false;
					infoPanelArrow.style.opacity = 0;
				}
			}
		}

		infoPanelArrow.style.opacity = opacity;
	}, animationSpeed);
}


initializeArrow();
animateArrow();





function sandboxHack() {
	function activateMain(temp1) {
		const hack = {
			keyBindings: {
				isCPressed: false,
				cTimer: null,
				isZPressed: false
			},
			playerMoveData: {
				lastHorizontalDirection: 1,
				isDashingDown: false,
				isDashingUp: false,
				lastDashTime: 0,
				dashDuration: 100,
				dashEndTime: 0,
				isDoubleJumpAllowed: false,
				airDashAvailable: true,
				newMovementIsOn: false,
			},
			bindKeys: function() {
				document.addEventListener('keydown', function(event) {
					if (event.key === 'Escape') {
						const panel = document.getElementById('someData')
						const panel1 = document.getElementById('controlPanel')
						if (panel.style.display === 'none') {
							panel.style.display = 'inherit'
						} else {
							panel.style.display = 'none'
						}
						if (panel1.style.display === 'none') {
							panel1.style.display = 'inherit'
						} else {
							panel1.style.display = 'none'
						}
					}
					if (event.key.toLowerCase() === 's' && event.repeat) {
						if (!hack.vars.modeIsOn) {
							hack.getters.me.p.mass = 3
						}
					}
					if (event.key.toLowerCase() === 'z' && !event.repeat) {
						hack.keyBindings.isZPressed = true
					} else if (event.repeat) {
						hack.keyBindings.isZPressed = false
					}
					if (event.key.toLowerCase() === 'c') {
						hack.keyBindings.isCPressed = true
						if (!hack.keyBindings.cTimer) {
							hack.keyBindings.cTimer = setTimeout(() => {
								hack.keyBindings.isCPressed = false
								hack.keyBindings.cTimer = null
							}, 250)
						}
					}
				})
				document.addEventListener('keyup', function(event) {
					if (event.key.toLowerCase() === 's') {
						if (!hack.vars.modeIsOn) {
							hack.getters.me.p.mass = 1
						}
					}
					if (event.key.toLowerCase() === 'z') {
						hack.keyBindings.isZPressed = false
					}
					if (event.key.toLowerCase() === 'c') {
						hack.keyBindings.isCPressed = false
						if (hack.keyBindings.cTimer) {
							clearTimeout(hack.keyBindings.cTimer)
							hack.keyBindings.cTimer = null
						}
					}
				})
			},
			getters: {
				get client() {
					return temp1[38].exports
				},
				get gf() {
					return temp1[42].exports
				},
				get gp() {
					return temp1[43].exports
				},
				get graphics() {
					return temp1[44].exports
				},
				get mode() {
					return temp1[48].exports
				},
				get envirData() {
					return temp1[53].exports
				},
				get network() {
					return temp1[66].exports
				},
				get physics() {
					return temp1[362].exports
				},
				get me() {
					return hack.getters.mode.player.gpData
				},
				get ray() {
					return hack.getters.me.ray
				},
				get velocity() {
					return hack.getters.me.p.velocity
				},
				get otherPlayers() {
					return hack.getters.mode.otherPlayers
				},
				get velocity() {
					return this.mode.player.gpData.p.velocity
				},
				get otherPlayers() {
					return this.mode.otherPlayers
				},
				ghost: false,
				get me() {
					return hack.getters.mode.player.gpData
				},
				get ray() {
					return hack.getters.me.ray
				},
				get velocity() {
					return hack.getters.me.p.velocity
				},
				get otherPlayers() {
					return hack.getters.mode.otherPlayers
				}
			},
			vars: {
				get isGround() {
					return isGrounded()
				},
				mult: 1,
				lrSpd: 3,
				udSpd: 3,
				'POSITION INFO ': '-----------------------',
				get currentPosX() {
					return Math.round(hack.getters.me.getX() * 100) / 100
				},
				get currentPosY() {
					return Math.round(hack.getters.me.getY() * 100) / 100
				},
				'SPEED INFO ': '----------------------------',
				get totalSpd() {
					return (((this.lrSpd + this.udSpd) / 2) * this.mult)
				},
				get currentSpdX() {
					return Math.round(hack.getters.me.p.velocity[0] * 100) / 100
				},
				get currentSpdY() {
					return Math.round(hack.getters.me.p.velocity[1] * 100) / 100
				},
				'SCRIPT VALUES ': '----------------------',
				multSpdIsOn: false,
				modeIsOn: false,
				ghost1: false,
				'MOVEMENT VALUES ': '---------------'
			},
			suppFuncs: {
				getMult: () => {
					if (hack.vars.mult < 3) {
						return 1
					} else if (hack.vars.mult < 4) {
						return 2
					}
				},
				setMult: function(e) {
					if (e != undefined) {
						hack.vars.lrSpd = hack.vars.udSpd = e
						return
					}
					if (hack.suppFuncs.getMult() === 1) {
						hack.vars.mult++
					} else if (hack.suppFuncs.getMult() === 2) {
						hack.vars.mult += 2
					} else {
						hack.vars.mult = 1
					}
				},
				getIndexByName: function(playerName) {
					const index = hack.getters.otherPlayers.findIndex(player => player?.myName === playerName)
					return index === -1 ? false : index
				}
			},
			functions: {
				godModeEnable: () => {
					hack.vars.ghost1 = true
					hack.getters.me.p.collisionResponse = false
					hack.getters.me.p.mass = 0
					hack.vars.modeIsOn = true
					hack.getters.velocity[0] = 0
					hack.getters.velocity[1] = 0
				},
				godModeDisable: () => {
					hack.vars.ghost1 = false
					hack.getters.me.p.collisionResponse = true
					hack.getters.me.p.mass = 1
					hack.vars.modeIsOn = false
					hack.getters.velocity[0] = 0
					hack.getters.velocity[1] = 0
				},
				multSpdEnable: () => {
					hack.vars.lrSpd *= hack.vars.mult
					hack.vars.udSpd *= hack.vars.mult
					hack.vars.multSpdIsOn = true
				},
				multSpdDisable: () => {
					hack.vars.lrSpd /= hack.vars.mult
					hack.vars.udSpd /= hack.vars.mult
					hack.vars.multSpdIsOn = false
				}
			},
			logFuncs: {
				logModeIsOn: () => {
					console.log('modeIsOn:', hack.vars.modeIsOn)
				},
				logSpd: () => {
					console.log('speed:', ((hack.vars.lrSpd + hack.vars.udSpd) / 2) * hack.vars.mult)
				}
			}
		}
		document.body.insertAdjacentHTML("beforebegin", `
  <div id="someData" style="display: inherit; width: auto; position: fixed; top: 0px; left: 0px; height: auto; text-align: left; font-size: 14px; background: rgb(0, 0, 0); color: rgb(255, 255, 255); opacity: 0.7; padding: 2px 2px;"></div>
`)

		const updateData = () => {
			const o = []
			for (let i in hack.vars) {
				const res = ''
				for (let char of i) {
					res += char
					if (char === char.toUpperCase()) {
						res += ''
					}
				}
				o.push(`${res}: ${hack.vars[i]}`)
			}
			for (let i in hack.playerMoveData) {
				o.push(`${i}: ${hack.playerMoveData[i]}`)
			}
			document.getElementById("someData").innerHTML = o.join('<br>')
		}

		document.body.insertAdjacentHTML("beforebegin", `
  <div id="controlPanel" style="display: inherit; width: auto; position: fixed; bottom: 0px; left: 0px; height: auto; text-align: left; font-size: 14px; background: rgb(0, 0, 0); color: rgb(255, 255, 255); opacity: 0.7; padding: 2px 2px;">
    <div>
      <span>new movement: </span>
      <button id="newMoveBtn" style="background: rgba(255, 255, 255, 0.7); color: black;">${hack.playerMoveData.newMovementIsOn}</button>
    </div>
  </div>
`)

		const updateButtonStates = () => {
			document.getElementById("newMoveBtn").innerText = hack.playerMoveData.newMovementIsOn
		}

		document.getElementById("newMoveBtn").addEventListener("click", () => {
			if (!hack.playerMoveData.newMovementIsOn) {
				newMovement()
			} else {
				oldMovement()
			}
			updateButtonStates()
		})

		setInterval(updateData, 100 / 6)
		updateButtonStates()
		setInterval(updateButtonStates, 100 / 6)
		hack.bindKeys()

		let scrActivate = function() {
			hack.getters.client.loopFunctions[2].timeOut = 100 / 6
			hack.getters.client.loopFunctions[3].timeOut = 0
			oldMovement()
			Object.defineProperty(hack.vars, 'mult', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'lrSpd', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'udSpd', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'multSpdIsOn', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'ghost1', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'lastDashTime', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'lastHorizontalDirection', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'lastDashTime', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'dashDuration', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'dashEndTime', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'newMovementIsOn', {
				enumerable: false
			})
		}

		hack.getters.client.findUntilFound = function(e, t, n) {
			hack.getters.network.gsip = e;
			hack.getters.network.gsrn = t;
			hack.getters.network.getSID?.((sid) => {
				hack.getters.network.sid = sid;
				hack.getters.network.connectToGs?.(hack.getters.network.gsip, () => {
					console.log("connected to gs");

					hack.getters.client.verifyIsHuman?.(() => {
						hack.getters.network.registerSidOnGs?.((verifyStatus) => {
							console.log("verified on gs server", verifyStatus);

							if (verifyStatus === "") {
								alert("You are already playing the game in another browser tab.");
								location.reload();
								n(2);
							} else {
								hack.getters.network.joinRoom?.(hack.getters.network.gsrn, (joinStatus) => {
									if (joinStatus === 1) {
										hack.getters.client.sendPlayingInfo?.(hack.getters.client.roomId, () => {
											hack.getters.client.onReady?.();
											n(1);
											scrActivate()
										});
									} else {
										console.log("else");
										hack.getters.network.gsSockehack?.getters.client.disconnect?.();

										do {
											hack.getters.client.rIndex++;
											const currentDataCenter = hack.getters.network.dataCenters?.[hack.getters.client.dcIndex];

											if (!currentDataCenter?.[hack.getters.client.rIndex]) {
												hack.getters.client.dcIndex++;
												hack.getters.client.rIndex = 0;

												if (!hack.getters.network.dataCenters?.[hack.getters.client.dcIndex]) {
													alert("It seems all servers are full. Please refresh your page and try again.");
													location.reload();
													return;
												}
											}
										} while (hack.getters.network.dataCenters?.[hack.getters.client.dcIndex]?.[hack.getters.client.rIndex]?.[2] !== hack.getters.client.modeInfo.mp);

										const newGsip = hack.getters.network.dataCenters?.[hack.getters.client.dcIndex]?.[hack.getters.client.rIndex]?.[1];
										const newGsrn = hack.getters.network.dataCenters?.[hack.getters.client.dcIndex]?.[hack.getters.client.rIndex]?.[3];
										hack.getters.client.roomId = hack.getters.network.dataCenters?.[hack.getters.client.dcIndex]?.[hack.getters.client.rIndex]?.[4];

										hack.getters.client.findUntilFound(newGsip, newGsrn, n);
									}
								});
							}
						});
					});
				});
			});
		};

		document.body.onkeyup = (event) => {
			const key = event.key
			switch (key) {
				case 'PageUp':
					if (!hack.vars.modeIsOn) {
						hack.getters.me.p.gravityScale = 1
						hack.getters.me.p.collisionResponse = 1
					}
					break;
				case 'PageDown':
					if (!hack.vars.modeIsOn) {
						hack.getters.me.p.collisionResponse = 1
					}
					break;
			}
		}

		document.body.onkeydown = (event) => {
			const key = event.key;
			switch (key) {
				case 'PageUp':
					if (!hack.vars.modeIsOn) {
						hack.getters.me.p.gravityScale = -1
						hack.getters.me.p.collisionResponse = 0
					}
					break;
				case 'PageDown':
					if (!hack.vars.modeIsOn) {
						hack.getters.me.p.gravityScale = 1
						hack.getters.me.p.collisionResponse = 0
					}
					break;
				case 'F2':
					if (!hack.vars.modeIsOn) {
						hack.functions.godModeEnable();
						hack.logFuncs.logModeIsOn();
						hack.functions.multSpdEnable();
					} else {
						hack.functions.godModeDisable();
						hack.logFuncs.logModeIsOn();
						hack.functions.multSpdDisable();
					}
					break;
				case '`': // Backtick (`)
				case 'ё'.toLowerCase(): // Cyrillic Yo (часто на той же клавише, что и Backtick)
					if (hack.vars.modeIsOn) {
						hack.suppFuncs.setMult();
						hack.logFuncs.logSpd();
					}
					break;
			}
		};

		function isGrounded() {
			const meX = hack.getters.me.getX()
			const meY = hack.getters.me.getY()
			const ray = hack.getters.ray
			const physics = hack.getters.physics
			const gpPWorld = hack.getters.gp.pWorld
			const rayResult = hack.getters.me.ray.result
			const rayHitPoint = (hack.getters.ray.hitPoint = [Infinity, Infinity])

			const verticalOffset = 50
			const checkYPosition = meY + 45

			for (let i = 0; i < 121; i++) {
				const o = meX - 15 + i * (30 / 120)
				const s = checkYPosition
				const u = s + verticalOffset

				ray.from = [physics.xAxis(o, 0), physics.yAxis(s, 0)]
				ray.to = [physics.xAxis(o, 0), physics.yAxis(u, 0)]

				ray.update()
				rayResult.reset()

				if (gpPWorld.raycast(rayResult, ray)) {
					rayResult.getHitPoint(rayHitPoint, ray)
					const hitDistance = rayResult.getHitDistance(ray)

					if (rayResult.shape.ref.getCollision() && hitDistance < 0.1) {
						return true
					}
				}
			}

			return false
		}

		function newMovement() {
			hack.getters.client.loopFunctions[2].fun = function() {
				const currentTime = Date.now()
				const dashCooldown = 250
				const dashDistance = 2.5
				const dashSpeed = 25
				const grounded = isGrounded()

				if (grounded) {
					hack.playerMoveData.airDashAvailable = true
				}

				if (hack.getters.mode.moveLeft) {
					hack.playerMoveData.lastHorizontalDirection = -1
				} else if (hack.getters.mode.moveRight) {
					hack.playerMoveData.lastHorizontalDirection = 1
				}

				if (
					hack.keyBindings.isCPressed &&
					hack.getters.mode.moveDown &&
					currentTime - hack.playerMoveData.lastDashTime >= dashCooldown &&
					!hack.playerMoveData.isDashingDown &&
					(grounded || (!grounded && hack.playerMoveData.airDashAvailable))
				) {
					hack.playerMoveData.lastDashTime = currentTime
					hack.playerMoveData.isDashingDown = true
					hack.playerMoveData.dashDuration = (dashDistance / dashSpeed) * 1000
					hack.playerMoveData.dashEndTime = currentTime + hack.playerMoveData.dashDuration
					if (!grounded) {
						hack.playerMoveData.airDashAvailable = false
					}
				}

				if (
					hack.keyBindings.isCPressed &&
					hack.getters.mode.moveUp &&
					currentTime - hack.playerMoveData.lastDashTime >= dashCooldown &&
					!hack.playerMoveData.isDashingUp &&
					(grounded || (!grounded && hack.playerMoveData.airDashAvailable))
				) {
					hack.playerMoveData.lastDashTime = currentTime
					hack.playerMoveData.isDashingUp = true
					hack.playerMoveData.dashDuration = (dashDistance / dashSpeed) * 1000
					hack.playerMoveData.dashEndTime = currentTime + hack.playerMoveData.dashDuration
					if (!grounded) {
						hack.playerMoveData.airDashAvailable = false
					}
				}

				if (
					hack.keyBindings.isCPressed &&
					currentTime - hack.playerMoveData.lastDashTime >= dashCooldown &&
					!hack.playerMoveData.isDashing &&
					(grounded || (!grounded && hack.playerMoveData.airDashAvailable))
				) {
					hack.playerMoveData.lastDashTime = currentTime
					hack.playerMoveData.isDashing = true
					hack.playerMoveData.dashVelocity = dashSpeed * hack.playerMoveData.lastHorizontalDirection
					hack.playerMoveData.dashDuration = (dashDistance / dashSpeed) * 1000
					hack.playerMoveData.dashEndTime = currentTime + hack.playerMoveData.dashDuration
					if (!grounded) {
						hack.playerMoveData.airDashAvailable = false
					}
				}

				if (hack.playerMoveData.isDashingDown) {
					hack.getters.mode.player.gpData.p.velocity[1] = -dashSpeed
					hack.getters.mode.player.gpData.p.velocity[0] = 0
					hack.getters.me.p.collisionResponse = false
					if (currentTime >= hack.playerMoveData.dashEndTime) {
						hack.playerMoveData.isDashingDown = false
						hack.getters.mode.player.gpData.p.velocity[1] = 0
						if (!hack.vars.modeIsOn) {
							hack.getters.me.p.collisionResponse = true
						}
					}
					return
				}

				if (hack.playerMoveData.isDashingUp) {
					hack.getters.mode.player.gpData.p.velocity[1] = dashSpeed
					hack.getters.mode.player.gpData.p.velocity[0] = 0
					hack.getters.me.p.collisionResponse = false
					if (currentTime >= hack.playerMoveData.dashEndTime) {
						hack.playerMoveData.isDashingUp = false
						hack.getters.mode.player.gpData.p.velocity[1] = 0
						if (!hack.vars.modeIsOn) {
							hack.getters.me.p.collisionResponse = true
						}
					}
					return
				}

				if (hack.playerMoveData.isDashing) {
					hack.getters.mode.player.gpData.p.velocity[0] = hack.playerMoveData.dashVelocity
					hack.getters.mode.player.gpData.p.velocity[1] = 0
					hack.getters.me.p.collisionResponse = false
					if (currentTime >= hack.playerMoveData.dashEndTime) {
						hack.playerMoveData.isDashing = false
						hack.getters.mode.player.gpData.p.velocity[0] = 0
						if (!hack.vars.modeIsOn) {
							hack.getters.me.p.collisionResponse = true
						}
					}
					return
				} else {
					if (hack.getters.mode.moveRight) {
						hack.getters.mode.player.gpData.p.velocity[0] = hack.vars.lrSpd * hack.vars.mult
					} else if (hack.getters.mode.moveLeft) {
						hack.getters.mode.player.gpData.p.velocity[0] = -hack.vars.lrSpd * hack.vars.mult
					}
				}

				if (grounded) {
					hack.playerMoveData.isDoubleJumpAllowed = true
					if (hack.keyBindings.isZPressed) {
						hack.keyBindings.isZPressed = false
						hack.getters.velocity[1] = 8 * (hack.getters.me.p.gravityScale)
					}
				} else if (hack.playerMoveData.isDoubleJumpAllowed && hack.keyBindings.isZPressed) {
					hack.keyBindings.isZPressed = false
					hack.getters.velocity[1] = 8 * (hack.getters.me.p.gravityScale)
					hack.playerMoveData.isDoubleJumpAllowed = false
				}

				if (hack.vars.ghost1) {
					if (hack.getters.mode.moveUp) {
						hack.getters.velocity[1] = hack.vars.udSpd * hack.vars.mult
					}
					if (hack.getters.mode.moveDown) {
						hack.getters.velocity[1] = -hack.vars.udSpd * hack.vars.mult
					}
					if (!hack.getters.mode.moveUp && !hack.getters.mode.moveDown) {
						hack.getters.velocity[1] = 0
					}
				}
			}
			hack.playerMoveData.newMovementIsOn = true
		}

		function oldMovement() {
			hack.getters.client.loopFunctions[2].fun = function() {
				const grounded = isGrounded()

				if (hack.getters.mode.moveRight) {
					hack.getters.mode.player.gpData.p.velocity[0] = hack.vars.lrSpd * hack.vars.mult
				} else if (hack.getters.mode.moveLeft) {
					hack.getters.mode.player.gpData.p.velocity[0] = -hack.vars.lrSpd * hack.vars.mult
				}
				if (grounded) {
					if (hack.getters.mode.moveUp) {
						hack.getters.velocity[1] = 8
					}
				}
				if (hack.vars.ghost1) {
					if (hack.getters.mode.moveUp) {
						hack.getters.velocity[1] = hack.vars.udSpd * hack.vars.mult
					}
					if (hack.getters.mode.moveDown) {
						hack.getters.velocity[1] = -hack.vars.udSpd * hack.vars.mult
					}
					if (!hack.getters.mode.moveUp && !hack.getters.mode.moveDown) {
						hack.getters.velocity[1] = 0
					}
				}
			}
			hack.playerMoveData.newMovementIsOn = false
		}

		addEventListener("mousewheel", e => {
			window.tweenObjects.map(x => {
				try {
					if (e.shiftKey) {
						hack.getters.mode.player.gpData.p.velocity[0] = -Math.sign(e.deltaY) * 15;
					} else {
						hack.getters.mode.player.gpData.p.velocity[1] = -Math.sign(e.deltaY) * 15;
					}
				} catch (err) {
					console.error(err);
				}
			});
		});

	}

	let temp1 = {};
	const _call = Function.prototype.call;
	new Promise((resolve, reject) => {
		Function.prototype.call = function(...args) {
			if (args[2]?.exports) {
				temp1 = args[6]
				Function.prototype.call = _call
				console.log(temp1)
				resolve(temp1)
			}
			return _call.apply(this, args)
		};
	}).then((result) => {
		if (Object.keys(result).length > 0) {
			activateMain(result)
		} else {
			console.log("temp1 is empty")
		}
	}).catch((error) => {
		console.error("An error occurred:", error)
	})
}

function twoPlayerHack() {
	function activateMain(temp1) {

        function handleKeyDown(event) {
            if (event.repeat) return;

            const mode = hack.getters.mode;
            const velocity = mode.player.gpData.p.velocity

            switch (event.key) {
                case "ArrowLeft":
                    mode.moveLeft = true;
                    mode.moveRight = false;
                    break;
                case "ArrowRight":
                    mode.moveRight = true;
                    mode.moveLeft = false;
                    break;
                case "ArrowUp":
                    mode.moveUp = true;
                    mode.moveDown = false;
                    break;
                case "ArrowDown":
                    mode.moveDown = true;
                    mode.moveUp = false;
                    break;
            }
        }

        function handleKeyUp(event) {
            const mode = hack.getters.mode;
            const velocity = mode.player.gpData.p.velocity

            switch (event.key) {
                case "ArrowLeft":
                    mode.moveLeft = false;
                    velocity[0] = 0;
                    break;
                case "ArrowRight":
                    mode.moveRight = false;
                    velocity[0] = 0
                    break;
                case "ArrowUp":
                    mode.moveUp = false;
                    break;
                case "ArrowDown":
                    mode.moveDown = false;
                    break;
            }
        }


		const hack = {
			keyBindings: {
				isCPressed: false,
				cTimer: null,
				isZPressed: false
			},
			playerMoveData: {
				lastHorizontalDirection: 1,
				isDashingDown: false,
				isDashingUp: false,
				lastDashTime: 0,
				dashDuration: 100,
				dashEndTime: 0,
				isDoubleJumpAllowed: false,
				airDashAvailable: true,
				newMovementIsOn: true,
				division: 120,
				meYplus: 45,
			},
			bindKeys: function() {




                document.addEventListener("keydown", (event) => {
                    if (event.key === "Shift") {
                        hack.vars.shiftPressed = true;
                    }
                });

                document.addEventListener("keyup", (event) => {
                    if (event.key === "Shift") {
                        hack.vars.shiftPressed = false;
                    }
                });





				document.addEventListener('keydown', function(event) {
					if (event.key === 'Escape') {
						const panel = document.getElementById('someData')
						const panel1 = document.getElementById('controlPanel')
						if (panel.style.display === 'none') {
							panel.style.display = 'inherit'
						} else {
							panel.style.display = 'none'
						}
						if (panel1.style.display === 'none') {
							panel1.style.display = 'inherit'
						} else {
							panel1.style.display = 'none'
						}
					}
					if (event.key.toLowerCase() === 's' && event.repeat) {
						if (!hack.vars.modeIsOn) {
							hack.getters.me.p.mass = 3
						}
					}

                    if (event.key.toLowerCase() === 'z' && !hack.keyBindings.isZPressed) {
                        hack.keyBindings.isZPressed = true;
                    }

					if (event.key.toLowerCase() === 'c') {
						hack.keyBindings.isCPressed = true
						if (!hack.keyBindings.cTimer) {
							hack.keyBindings.cTimer = setTimeout(() => {
								hack.keyBindings.isCPressed = false
								hack.keyBindings.cTimer = null
							}, 250)
						}
					}
				})
				document.addEventListener('keyup', function(event) {
					if (event.key.toLowerCase() === 's') {
						if (!hack.vars.modeIsOn) {
							hack.getters.me.p.mass = 1
						}
					}
                    if (event.key.toLowerCase() === 'z') {
                        hack.keyBindings.isZPressed = false;
                    }
					if (event.key.toLowerCase() === 'c') {
						hack.keyBindings.isCPressed = false
						if (hack.keyBindings.cTimer) {
							clearTimeout(hack.keyBindings.cTimer)
							hack.keyBindings.cTimer = null
						}
					}
				})
			},
			getters: {
				get client() {
					return temp1[38].exports
				},
				get gf() {
					return temp1[42].exports
				},
				get gp() {
					return temp1[43].exports
				},
				get graphics() {
					return temp1[44].exports
				},
				get guiComponentsKick() {
					return temp1[46].exports
				},
				get mode() {
					return temp1[48].exports
				},
				get envirData() {
					return temp1[52].exports
				},
				get remote_kickPlayer() {
					return temp1[54].exports
				},
				get rBio() {
					return temp1[62].exports
				},
				get rGho() {
					return temp1[63].exports
				},
				get modules_resultScreen() {
					return temp1[72].exports
				},
				get network() {
					return temp1[73].exports
				},
				get keyboardjs() {
					return temp1[107].exports
				},
				get physics() {
					return temp1[369].exports
				},
				get me() {
					return hack.getters.mode.player.gpData
				},
				get ray() {
					return hack.getters.me.ray
				},
				get velocity() {
					return hack.getters.me.p.velocity
				},
				get otherPlayers() {
					return hack.getters.mode.otherPlayers
				},
			},
			vars: {
                shiftPressed: false,
				blacklisted: {
					data: [],
					names: []
				},
				get isGround() {
					return isGrounded()
				},
				tpToOtherByClickIsOn: false,
				indexByClick: 0,
				mult: 1,
				lrSpd: 3,
				udSpd: 3,
				get currentPosX() {
					return Math.round(hack.getters.me.getX() * 100) / 100
				},
				get currentPosY() {
					return Math.round(hack.getters.me.getY() * 100) / 100
				},
				pX: 0,
				pY: 0,
				get totalSpd() {
					return (((this.lrSpd + this.udSpd) / 2) * this.mult)
				},
				get currentSpdX() {
					return Math.round(hack.getters.me.p.velocity[0] * 100) / 100
				},
				get currentSpdY() {
					return Math.round(hack.getters.me.p.velocity[1] * 100) / 100
				},
				multSpdIsOn: false,
				modeIsOn: false,
				immIsOn: false,
				MMGIsOn: false,
				interTpToOtherIsOn: false,
				ghost1: false,
				ghost2: false,
				isPlayerDead: false,
				tpSpawnCounter: 0,
			},
			suppFuncs: {
				getMult: () => {
					if (hack.vars.mult < 3) {
						return 1
					} else if (hack.vars.mult < 4) {
						return 2
					}
				},
				setMult: function(e) {
					if (e != undefined) {
						hack.vars.lrSpd = hack.vars.udSpd = e
						return
					}
					if (hack.suppFuncs.getMult() === 1) {
						hack.vars.mult++
					} else if (hack.suppFuncs.getMult() === 2) {
						hack.vars.mult += 2
					} else {
						hack.vars.mult = 1
					}
				},
				getIndexByName: function(playerName) {
					const index = hack.getters.otherPlayers.findIndex(player => player?.myName === playerName)
					return index === -1 ? false : index
				},
				processBlacklistData: function() {
					// 1. Добавляем новых игроков
					for (let name of hack.vars.blacklisted.names) {
						const index = hack.suppFuncs.getIndexByName(name);

						if (index) {
							const alreadyExists = hack.vars.blacklisted.data.some(entry => {
								return entry && entry[1] === name;
							});

							if (!alreadyExists) {
								hack.vars.blacklisted.data.push([index, name]);
							}
						}
					}
					// 2. Удаляем устаревшие записи
					if (hack.vars.blacklisted.data.length) {
						hack.vars.blacklisted.data = hack.vars.blacklisted.data.filter(entry => {
							return entry && entry[1] && hack.vars.blacklisted.names.includes(entry[1]);
						});
					}
				}
			},
			functions: {
				getBio: function(index) {
					let i = hack.getters.mode.otherPlayers[index]
					return {
						get gpData() {
							return hack.getters.me
						},
						get myName() {
							return i.myName
						},
						get mySkin() {
							return i.mySkin
						},
						get whatBro() {
							return i.whatBro
						},
						get chatColor() {
							return i.chatColor
						},
						get teamColor() {
							return i.teamColor
						},
					}
				},
				setBio: function(bio) {
					let mode = hack.getters.mode
					mode.setBio(
						bio.gpData,
						bio.myName,
						bio.mySkin,
						bio.whatBro,
						bio.chatColor,
						bio.teamColor
					)
				},
				prevPos: function() {
					hack.vars.pX = hack.getters.mode.player.gpData.getX()
					hack.vars.pY = hack.getters.mode.player.gpData.getY()
				},
				tpSpawn: function() {
					if (hack.vars.tpSpawnCounter == 0) {
						this.tp(hack.vars.pX, hack.vars.pY);
						hack.vars.tpSpawnCounter++
						return
					} else if (hack.vars.tpSpawnCounter == 1) {
						this.tp(
							hack.getters.mode.spawn.refP.getX(),
							hack.getters.mode.spawn.refP.getY()
						)
					}
					hack.vars.tpSpawnCounter = 0
				},
				tpDoor: function() {
					this.prevPos()
					hack.vars.tpSpawnCounter = 0
					this.tp(
						hack.getters.mode.exitGate.exitGateCounter.refP.getX(),
						hack.getters.mode.exitGate.exitGateCounter.refP.getY()
					)
				},
				tp: function(x, y) {
					hack.getters.mode.player.gpData.setX(x)
					hack.getters.mode.player.gpData.setY(y)
				},
				setTpToOther: function(playerIndex) {
					if (!hack.vars.interTpToOtherIsOn && playerIndex !== false) {
						this.interTpToOther = setInterval(() => {
							hack.getters.me.p.position[0] = hack.getters.otherPlayers[playerIndex].gpData.p.position[0]
							hack.getters.me.p.position[1] = hack.getters.otherPlayers[playerIndex].gpData.p.position[1]
						}, 100 / 14.4)
						hack.vars.interTpToOtherIsOn = true
					} else if (playerIndex === false) {
						try {
							clearInterval(this.interTpToOther)
							hack.vars.interTpToOtherIsOn = false
						} catch {
							console.log('не существующий интервал')
						}
					}
				},
				MMGEnable: function() {
					hack.getters.mode.makeMeGhost = function() {
						hack.getters.me.setAlpha(0.3)
						hack.getters.me.p.shapes[0].sensor = true
						hack.getters.me.p.gravityScale = 0
						hack.getters.velocity[0] = 0
						hack.getters.velocity[1] = 0
						hack.getters.me.me = void 0
						hack.vars.ghost2 = true
						hack.vars.isPlayerDead = true
						hack.getters.rGho.fire(hack.getters.network.gsSocket)
						if (hack.getters.mode.md.mobile()) {
							hack.getters.mode.setupTouchButtons(true)
						}
					}
					hack.vars.MMGIsOn = true
				},
				MMGDisable: function() {
					hack.getters.mode.makeMeGhost = () => {}
					hack.vars.MMGIsOn = false
				},
				immEnable: () => {
					hack.getters.me.me = void 0
					hack.vars.immIsOn = true
				},
				immDisable: () => {
					hack.getters.me.me = true
					hack.vars.immIsOn = false
				},
				godModeEnable: () => {
					hack.vars.ghost1 = true
					hack.getters.me.p.collisionResponse = false
					hack.getters.me.p.mass = 0
					hack.vars.modeIsOn = true
					hack.getters.velocity[0] = 0
					hack.getters.velocity[1] = 0
				},
				godModeDisable: () => {
					hack.vars.ghost1 = false
					hack.getters.me.p.collisionResponse = true
					hack.getters.me.p.mass = 1
					hack.vars.modeIsOn = false
					hack.getters.velocity[0] = 0
					hack.getters.velocity[1] = 0
				},
				multSpdEnable: () => {
					hack.vars.lrSpd *= hack.vars.mult
					hack.vars.udSpd *= hack.vars.mult
					hack.vars.multSpdIsOn = true
				},
				multSpdDisable: () => {
					hack.vars.lrSpd /= hack.vars.mult
					hack.vars.udSpd /= hack.vars.mult
					hack.vars.multSpdIsOn = false
				}
			},
			logFuncs: {
				logModeIsOn: () => {
					console.log('modeIsOn:', hack.vars.modeIsOn)
				},
				logImmIsOn: () => {
					console.log('immIsOn:', hack.vars.immIsOn)
				},
				logSpd: () => {
					console.log('speed:', ((hack.vars.lrSpd + hack.vars.udSpd) / 2) * hack.vars.mult)
				},
				logMMGIsOn: () => {
					console.log('MMGIsOn:', hack.vars.MMGIsOn)
				}
			}
		}

		window.hack = hack

		/*
		 ***********************
		 *                     *
		 *      infoPanel      *
		 *                     *
		 ***********************
		 */


        /* Добавляем общий стиль для всех элементов */
        const style = document.createElement('style');
        style.innerHTML = `
  /* Глобальные стили для фиксированных контейнеров */
  .fixed-container {
    position: fixed;
    z-index: 1000;
    font-family: Arial, sans-serif;
    color: #fff;
  }
  /* Фон с альфа-прозрачностью */
  .transparent-bg {
    background-color: rgba(0, 0, 0, 0.7);
  }
  /* Контейнер без фона */
  .no-bg {
    background-color: transparent;
  }
  /* Стили для контейнера кнопок */
  .button-container {
    display: flex;
    justify-content: flex-start;
    gap: 10px;
    top: 0;
    left: 0;
    padding: 4px;
  }
  .tab-button {
    font-size: 0.6em;
    cursor: pointer;
  }
  /* Стили для блока данных */
  .data-container {
    top: 25px;
    left: -12px;
    padding: 5px;
    margin-left: 10px;
    text-align: left;
    font-size: 14px;
  }
  .tab-content {
    display: none;
  }
  .tab-content.active {
    display: block;
  }
  /* Общие стили для форм */
  .identity-container,
  .cosmetics-container {
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin-left: 1px;
  }
  .form-row {
    display: flex;
    align-items: center;
  }
  .form-row label {
    width: 100px;
    text-align: left;
    margin: 0;
  }
  .form-row input {
    width: 142px;
  }
  /* Стиль для кнопок */
  .btn {
    padding: 5px 10px;
    cursor: pointer;
  }
  /* Панель управления */
  .control-panel {
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin-left: 1px;
    bottom: 0;
    left: 0;
    font-size: 14px;
    background-color: transparent;
    color: rgba(255, 255, 255, 1);
  }
  .control-panel button {
    padding: 2px 10px;
    cursor: pointer;
  }
`;
        document.head.appendChild(style);

        /* Вставляем HTML вкладок */
        document.body.insertAdjacentHTML("beforeend", `
  <div id="buttonContainer" class="fixed-container button-container no-bg">
    <button class="tab-button active" onclick="openTab('info', event)">Info</button>
    <button class="tab-button" onclick="openTab('cosmetics', event)">Cosmetics</button>
    <button class="tab-button" onclick="openTab('blacklist', event)">Blacklist</button>
    <button class="tab-button" onclick="openTab('identity', event)">Identity</button>
  </div>
  <div id="someData" class="fixed-container data-container transparent-bg">
    <div id="infoTab" class="tab-content active"></div>
    <div id="cosmeticsTab" class="tab-content"></div>
    <div id="blacklistTab" class="tab-content">45345</div>
    <div id="identityTab" class="tab-content"></div>
  </div>
`);








// Обновляем содержимое вкладки blacklistTab
const blacklistTab = document.getElementById("blacklistTab");
blacklistTab.innerHTML = `
  <div class="cosmetics-container no-bg" style="padding: 5px;">
    <div class="form-row" style="justify-content: flex-start; align-items: center; gap: 5px;">
      <label for="blacklistInput" style="width: 70px; text-align: left; margin-right: 10px;">Никнейм</label>
      <input type="text" id="blacklistInput" style="width: 150px;" value="">
      <button class="btn" onclick="addBlacklistName()">Добавить</button>
    </div>
    <div id="blacklistContainer" style="margin-top: 10px; max-height: 175px; overflow-y: auto; font-size: 12px;">
      <!-- Здесь будут отображаться добавленные ники -->
    </div>
  </div>
`;









        /* Обработка вкладки Identity */
        const identityTab = document.getElementById("identityTab");
        identityTab.innerHTML = `
<div class="identity-container no-bg" style="position: relative;">
  <div class="form-row">
    <label for="nicknameInput">Никнейм</label>
    <input type="text" id="nicknameInput" value="">
  </div>
  <div class="form-row">
    <label for="skinInput">Скин</label>
    <input type="text" id="skinInput" value="">
  </div>
  <div class="form-row">
    <label for="vipInput">Вип статус</label>
    <input type="text" id="vipInput" value="">
  </div>
  <div class="form-row">
    <label for="chatColorInput">Цв. чата</label>
    <input type="text" id="chatColorInput" value="">
  </div>
  <div class="form-row">
    <label for="teamColorInput">Цв. команды</label>
    <input type="text" id="teamColorInput" value="">
  </div>
  <div style="text-align: center; margin-top: 10px;">
    <button class="btn" onclick="
      hack.getters.mode.setMyBio();
      let skinValue = document.getElementById('skinInput').value;
      if (!skinValue) {
        skinValue = hack.getters.mode.mySkin;
      }
      let chatColorValue = document.getElementById('chatColorInput').value;
      if (!chatColorValue) {
        chatColorValue = hack.getters.mode.chatColor;
      }
      let vipValue = document.getElementById('vipInput').value;
      if (!vipValue) {
        vipValue = undefined;
      }
      hack.getters.mode.setBio(
        hack.getters.mode.player.gpData,
        document.getElementById('nicknameInput').value,
        skinValue,
        vipValue,
        chatColorValue,
        document.getElementById('teamColorInput').value
      )">Применить</button>
  </div>
  <div style="position: absolute; bottom: 0; left: 0;">
    <button class="btn" onclick="
      hack.getters.mode.setMyBio();
      const bio = hack.functions.getBio(hack.vars.indexByClick);
      if (bio) {
        document.getElementById('nicknameInput').value = bio.myName || '';
        document.getElementById('skinInput').value = bio.mySkin || '';
        document.getElementById('vipInput').value = bio.whatBro || '';
        document.getElementById('chatColorInput').value = bio.chatColor || '';
        document.getElementById('teamColorInput').value = bio.teamColor || '';
      }
    ">©</button>
  </div>
</div>

<script>
  document.addEventListener('DOMContentLoaded', function() {
    document.getElementById('nicknameInput').value = hack.getters.mode.myName || "";
    document.getElementById('skinInput').value = hack.getters.mode.mySkin || "";
    document.getElementById('vipInput').value = hack.getters.mode.whatBro || "";
    document.getElementById('chatColorInput').value = hack.getters.mode.chatColor || "";
    document.getElementById('teamColorInput').value = hack.getters.mode.teamColor || "";
  });
</script>
`;

        /* Обработка вкладки Cosmetics */
        const cosmeticsTab = document.getElementById("cosmeticsTab");
        cosmeticsTab.innerHTML = `
  <div class="cosmetics-container no-bg">
    <div class="form-row" style="justify-content: flex-end;">
      <label for="bgColorInput" style="width: 70px; text-align: left; margin-right: 10px;">Фон:</label>
      <input type="color" id="bgColorInput" style="width: 150px;" value="#000000">
    </div>
    <div class="form-row" style="justify-content: flex-end;">
      <label for="textColorInput" style="width: 70px; text-align: left; margin-right: 10px;">Текст:</label>
      <input type="color" id="textColorInput" style="width: 150px;" value="#ffffff">
    </div>
    <div class="form-row" style="justify-content: flex-end;">
      <label for="bgOpacityInput" style="width: 70px; text-align: left; margin-right: 10px;">Прозрачн. фона:</label>
      <input type="number" id="bgOpacityInput" min="0" max="1" step="0.1" value="0.7" style="width: 142px;">
    </div>
    <div class="form-row" style="justify-content: flex-end;">
      <label for="textOutlineCheckbox" style="width: 70px; text-align: left; margin-right: 10px;">Обводка:</label>
      <input type="checkbox" id="textOutlineCheckbox">
    </div>
    <div style="text-align: center; margin-top: 10px;">
      <button class="btn" onclick="applyCosmetics()">Применить</button>
    </div>
  </div>
`;

        /* Обновление данных в вкладке Info */
        const infoTab = document.getElementById("infoTab");
        const updateData = () => {
            const o = [];
            // POSITION INFO
            o.push("<b>POSITION INFO</b>");
            o.push(`  current Pos X: ${hack.vars.currentPosX}`);
            o.push(`  current Pos Y: ${hack.vars.currentPosY}`);
            // SPEED INFO
            o.push("<br><b>SPEED INFO</b>");
            o.push(`  total Spd: ${hack.vars.totalSpd}`);
            o.push(`  current Spd X: ${hack.vars.currentSpdX}`);
            o.push(`  current Spd Y: ${hack.vars.currentSpdY}`);
            // SCRIPT VALUES
            o.push("<br><b>SCRIPT VALUES</b>");
            o.push(`  mult Spd Is On: ${hack.vars.multSpdIsOn}`);
            o.push(`  mode Is On: ${hack.vars.modeIsOn}`);
            o.push(`  imm Is On: ${hack.vars.immIsOn}`);
            o.push(`  MMG Is On: ${hack.vars.MMGIsOn}`);
            o.push(`  inter Tp To Other Is On: ${hack.vars.interTpToOtherIsOn}`);
            o.push(`  is Player Dead: ${hack.vars.isPlayerDead}`);
            // MOVEMENT VALUES
            o.push("<br><b>MOVEMENT VALUES</b>");
            o.push(`  new Movement Is On: ${hack.playerMoveData.newMovementIsOn}`);
            infoTab.innerHTML = o.join('<br>');
        };
        setInterval(updateData, 100 / 6);

        /* Вставляем панель управления */
document.body.insertAdjacentHTML("beforebegin", `
  <div id="controlPanel" style="display: flex; flex-direction: column; gap: 5px; position: fixed; bottom: 0px; left: 0px; height: auto; text-align: left; font-size: 14px; background-color: rgba(0, 0, 0, 0.7); color: rgba(255, 255, 255, 1); font-family: Arial, sans-serif; padding: 5px;">
    <div style="display: flex; align-items: center; gap: 5px;">
      <span>new movement:</span>
      <button id="newMoveBtn" style="padding: 0 6px; height: 18px; line-height: 18px; display: flex; align-items: center; justify-content: center; box-sizing: border-box;">${hack.playerMoveData.newMovementIsOn}</button>
    </div>
    <div style="display: flex; align-items: center; gap: 5px;">
      <span>poison immunity:</span>
      <button id="immBtn" style="padding: 0 6px; height: 18px; line-height: 18px; display: flex; align-items: center; justify-content: center; box-sizing: border-box;">${hack.vars.immIsOn}</button>
    </div>
    <div style="display: flex; align-items: center; gap: 5px;">
      <span>death immunity:</span>
      <button id="MMGBtn" style="padding: 0 6px; height: 18px; line-height: 18px; display: flex; align-items: center; justify-content: center; box-sizing: border-box;">${!hack.vars.MMGIsOn}</button>
    </div>
  </div>
`);








		const updateButtonStates = () => {
			const newMoveBtn = document.getElementById("newMoveBtn");
			const immBtn = document.getElementById("immBtn");
			const MMGBtn = document.getElementById("MMGBtn");
			if (newMoveBtn) newMoveBtn.innerText = hack.playerMoveData.newMovementIsOn;
			if (immBtn) immBtn.innerText = hack.vars.immIsOn;
			if (MMGBtn) MMGBtn.innerText = !hack.vars.MMGIsOn;
		}

		document.getElementById("newMoveBtn").addEventListener("click", () => {
			if (!hack.playerMoveData.newMovementIsOn) {
				newMovement();
			} else {
				oldMovement();
			}
			updateButtonStates();
		});

		document.getElementById("immBtn").addEventListener("click", () => {
			if (hack.vars.immIsOn) {
				hack.functions.immDisable();
			} else {
				hack.functions.immEnable();
			}
			updateButtonStates();
		});

		document.getElementById("MMGBtn").addEventListener("click", () => {
			if (hack.vars.MMGIsOn) {
				hack.functions.MMGDisable();
			} else {
				hack.functions.MMGEnable();
			}
			updateButtonStates();
		});

		updateButtonStates();

		setInterval(updateButtonStates, 100 / 6);



		hack.functions.MMGDisable()

		function scrActivate() {


			hack.getters.mode.createKickGui = function(e) {
				e.myIndex = e.myIndex;
				e.interactive = !0;
				e.buttonMode = !0;

				function t() {
					let kickIndex = hack.getters.mode.kickIndex = this.ref.refP.g.myIndex;
					hack.getters.guiComponentsKick.showLoading(this.ref.refP.name.getText(), this.ref.refP.g.myIndex)
					hack.vars.indexByClick = kickIndex
                    if (hack.vars.shiftPressed) {

                        hack.vars.blacklisted.names.push(this.ref.refP.name.getText())

                    }
				}
				e.on("click", t).on("touchstart", t)
			}
			setTimeout(function() {
				window.loadCosmetics();
			}, 0);
			hack.getters.client.loopFunctions[3].timeOut = 0
			hack.getters.client.loopFunctions[2].timeOut = 100 / 6
			oldMovement()
			Object.defineProperty(hack.vars, 'mult', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'lrSpd', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'udSpd', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'ghost2', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'pX', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'pY', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'tpSpawnCounter', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'multSpdIsOn', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'ghost1', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'lastDashTime', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'lastHorizontalDirection', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'lastDashTime', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'dashDuration', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'dashEndTime', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'newMovementIsOn', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'division', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'meYplus', {
				enumerable: false
			})
			document.getElementById('timer').style.background = 'rgb(0, 0, 0)'
			document.getElementById('timer').style.color = 'rgb(255, 255, 255)'
			document.getElementById('mapCredits').style.background = 'rgb(0, 0, 0)'
			document.getElementById('mapCredits').style.color = 'rgb(255, 255, 255)'
			document.getElementById('leaderboard').style.background = 'rgb(0, 0, 0)'
			document.getElementById('timer').style.opacity = 0.7
			document.getElementById('leaderboard').style.opacity = 0.7
			document.getElementById('mapCredits').style.opacity = 0.7
		}

		hack.bindKeys()











		hack.getters.mode.processOthersPlayerData = function() {
			hack.suppFuncs.processBlacklistData()
			let flag = false
			if (0 != hack.getters.mode.othersPlayerNetworkData.length) {
				var currentPlayersIndex = [];
				for (var x = 0; x < hack.getters.mode.othersPlayerNetworkData.length; x++) {
					for (var y = 0; y < hack.getters.mode.othersPlayerNetworkData[x].length; y++) {
						var data = hack.getters.mode.othersPlayerNetworkData[x][y];
						var index = data[0];
						var xVelo = data[1];
						var yVelo = data[2];
						var xAxis = data[3];
						var yAxis = data[4];
						for (let iterator = 0; iterator < hack.vars.blacklisted.data.length; iterator++) {
							if (hack.vars.blacklisted.data[iterator].includes(index)) {
								flag = true;
							}
						}
						if (flag) {
							flag = false;
							continue
						}

						if (typeof hack.getters.mode.otherPlayers[index] == "undefined" || hack.getters.mode.otherPlayers[index] == null) { // ИСПРАВЛЕННОЕ УСЛОВИЕ
								hack.getters.mode.oldPlayersIndex[hack.getters.mode.oldPlayersIndex.length] = index;
								var person = new Object();
								person.myName = "";
								person.mySkin = 0,
								person.reset = Infinity; // changed from 1 / 0 to Infinity for readability, same value
								person.gpData = hack.getters.mode.createPlayer();
								person.gpData.g.myIndex = index;
								hack.getters.mode.otherPlayers[index] = person;
								hack.getters.mode.enableEmit && hack.getters.rBio.fire(hack.getters.network.gsSocket, index);
								hack.getters.gp.gWorld.removeChild(person.gpData.g);
								hack.getters.gp.gWorld.mid.addChild(person.gpData.g)
                        }


						if (10 < hack.getters.mode.otherPlayers[index].reset) {
								hack.getters.mode.otherPlayers[index].gpData.setX(xAxis);
								hack.getters.mode.otherPlayers[index].gpData.setY(yAxis);
								hack.getters.mode.otherPlayers[index].reset = 0
                        }
						hack.getters.mode.otherPlayers[index].reset++;
						hack.getters.mode.otherPlayers[index].gpData.p.velocity[0] = xVelo;
						hack.getters.mode.otherPlayers[index].gpData.p.velocity[1] = yVelo;
						currentPlayersIndex[currentPlayersIndex.length] = index;
					}
				}
				var result = hack.getters.gf.difference(hack.getters.mode.oldPlayersIndex, currentPlayersIndex);
				for (var i = 0; i < result.length; i++) {
					var person = hack.getters.mode.otherPlayers[result[i]];
					if (null != person) {
						hack.getters.gp.gWorld.children[1].removeChild(person.gpData.g);
						hack.getters.gp.pWorld.removeBody(person.gpData.p);
						hack.getters.gp.list[hack.getters.gp.list.indexOf(person.gpData)] = null;
						hack.getters.gp.deleteCounter++;
						hack.getters.mode.otherPlayers[result[i]] = null;
                    }

				}
				hack.getters.mode.oldPlayersIndex = currentPlayersIndex;
				hack.getters.mode.othersPlayerNetworkData = [];
			}
		}
















		hack.getters.mode.onChangeMap = function(e) {
			try {
				scrActivate()
				scrActivate = null
			} catch {}
			let mode = hack.getters.mode;
			let gp = hack.getters.gp;
			let resultScreen = hack.getters.modules_resultScreen;
			let client = hack.getters.client
			clearInterval(mode.startTimeId);
			clearTimeout(mode.smallStepTimeId);
			resultScreen.hideResultScreen();
			e = e;
			gp.unload(gp);
			gp.list = gp.load(e, gp);
			mode.syncArr = [];
			mode.ghost = !1;
			mode.tweenObjects = [];
			mode.defineBehaviours(gp.list, mode.syncArr, gp);
			mode.md.mobile() && mode.setupTouchButtons(!1);
			mode.setMyBio();
			mode.setBio(mode.player.gpData, mode.myName, mode.mySkin, mode.whatBro, mode.chatColor, mode.teamColor);
			for (var t, n = 0; n < mode.otherPlayers.length; n++)
				void 0 !== mode.otherPlayers[n] && null != mode.otherPlayers[n] && (t = mode.otherPlayers[n].gpData.g.myIndex,
					mode.otherPlayers[n].gpData = mode.createPlayer(),
					mode.otherPlayers[n].gpData.g.myIndex = t,
					mode.otherPlayers[n].gpData.p.gravityScale = 0,
					gp.gWorld.removeChild(mode.otherPlayers[n].gpData.g),
					gp.gWorld.mid.addChild(mode.otherPlayers[n].gpData.g),
					mode.setBio(mode.otherPlayers[n].gpData, mode.otherPlayers[n].myName, mode.otherPlayers[n].mySkin, mode.otherPlayers[n].whatBro, mode.otherPlayers[n].chatColor, mode.otherPlayers[n].teamColor));
			void 0 === mode.firstTimeMapChange && (mode.firstTimeMapChange = !0);
			mode.smallStepTimeId = setTimeout(function() {
				document.getElementById("startTime").style.display = "inherit";
				document.getElementById("startTime").innerHTML = mode.startTime;
				client.runPhysics = !1;
				mode.startTimeId = setInterval(function() {
					mode.startTime++;
					document.getElementById("startTime").innerHTML = mode.startTime;
					3 == mode.startTime && (mode.startTime = 0,
						client.runPhysics = !0,
						clearInterval(mode.startTimeId),
						document.getElementById("startTime").style.display = "none");
				}, 1e3);
			}, 0);
			hack.getters.me.me = true
			if (hack.vars.modeIsOn) {
				hack.functions.godModeEnable()
			} else {
				hack.functions.godModeDisable()
			}
			if (hack.vars.immIsOn) {
				hack.functions.immEnable()
			} else {
				hack.functions.immDisable()
			}
			hack.vars.ghost2 = false
			hack.vars.isPlayerDead = false






			const keyboardjs = hack.getters.keyboardjs
			for (let i in keyboardjs._listeners) {
				if (i != 0) {
					delete keyboardjs._listeners[i]
				}
			}
			document.addEventListener("keyup", handleKeyUp)
			document.addEventListener("keydown", handleKeyDown)







		}

		document.body.onkeyup = (event) => {
			const key = event.key
			switch (key) {
				case 'PageUp':
					if (!hack.vars.modeIsOn) {
						hack.getters.me.p.gravityScale = 1
						hack.getters.me.p.collisionResponse = 1
					}
					break;
				case 'PageDown':
					if (!hack.vars.modeIsOn) {
						hack.getters.me.p.collisionResponse = 1
					}
					break;
			}
		}

		document.body.onkeydown = (event) => {
			const key = event.key;
			switch (key) {
				case 'Delete':
					if (!hack.vars.tpToOtherByClickIsOn) {
						hack.vars.tpToOtherByClickIsOn = true
						hack.functions.setTpToOther(hack.vars.indexByClick)
					} else {
						hack.vars.tpToOtherByClickIsOn = false
						hack.functions.setTpToOther(false)
					}
					break
				case 'PageUp':
					if (!hack.vars.modeIsOn) {
						hack.getters.me.p.gravityScale = -1
						hack.getters.me.p.collisionResponse = 0
					}
					break;
				case 'PageDown':
					if (!hack.vars.modeIsOn) {
						hack.getters.me.p.gravityScale = 1
						hack.getters.me.p.collisionResponse = 0
					}
					break;
				case 'Control':
					hack.getters.mode.makeMeGhost();
					break;
				case 'F2':
					if (!hack.vars.modeIsOn) {
						hack.functions.godModeEnable();
						hack.logFuncs.logModeIsOn();
						hack.functions.multSpdEnable();
					} else {
						hack.functions.godModeDisable();
						hack.logFuncs.logModeIsOn();
						hack.functions.multSpdDisable();
					}
					break;
				case 'Home':
					hack.functions.tpSpawn();
					break;
				case 'End':
					hack.functions.tpDoor();
					break;
				case 'F9':
					if (!hack.vars.MMGIsOn) {
						hack.functions.MMGEnable();
						hack.logFuncs.logMMGIsOn();
					} else {
						hack.functions.MMGDisable();
						hack.logFuncs.logMMGIsOn();
					}
					break;
				case '`': // Backtick (`)
				case 'ё'.toLowerCase(): // Cyrillic Yo (часто на той же клавише, что и Backtick)
					if (hack.vars.modeIsOn) {
						hack.suppFuncs.setMult();
						hack.logFuncs.logSpd();
					}
					break;
				case 'Insert':
				case 'NumPad0': // Клавиша 0 на цифровой клавиатуре
					hack.functions.setTpToOther(hack.suppFuncs.getIndexByName(prompt('Введите корректный никнейм. Чтобы выйти из интервала нажмите Esc.')));
					break;
				case 'F4':
					if (!hack.vars.immIsOn) {
						hack.functions.immEnable();
						hack.logFuncs.logImmIsOn();
					} else {
						hack.functions.immDisable();
						hack.logFuncs.logImmIsOn();
					}
					break;
			}
		};


		function isGrounded() {
			// Кэшируем необходимые геттеры и данные
			const {
				me,
				ray,
				physics,
				gp
			} = hack.getters;
			const {
				division,
				meYplus
			} = hack.playerMoveData;
			const meX = me.getX();
			const meY = me.getY();
			const gpPWorld = gp.pWorld;
			const rayResult = me.ray.result;
			// Сброс точки попадания
			const rayHitPoint = ray.hitPoint = [Infinity, Infinity];

			// Предварительные вычисления
			const verticalOffset = 50;
			const checkYPosition = meY + meYplus;
			const startYPosition = physics.yAxis(checkYPosition, 0);
			const endYPosition = physics.yAxis(checkYPosition + verticalOffset, 0);
			const leftX = meX - 15;
			const step = 30 / division;

			// Пробегаем по ряду лучей от левого до правого края игрока
			for (let i = 0; i <= division; i++) {
				const currentX = leftX + i * step;
				const xPos = physics.xAxis(currentX, 0);

				// Задаём начальную и конечную точки луча
				ray.from = [xPos, startYPosition];
				ray.to = [xPos, endYPosition];

				ray.update();
				rayResult.reset();

				if (gpPWorld.raycast(rayResult, ray)) {
					rayResult.getHitPoint(rayHitPoint, ray);
					const hitDistance = rayResult.getHitDistance(ray);

					if (rayResult.shape.ref.getCollision() && hitDistance < 0.1) {
						return true;
					}
				}
			}
			return false;
		}


		// Основная функция движения с улучшенной логикой дэшинга и обработкой ввода
		function newMovement() {
			// Настройки для проверки земли
			hack.playerMoveData.division = 120;
			hack.playerMoveData.meYplus = 45;

			// Константы для дэшинга
			const dashCooldown = 250;
			const dashDistance = 2.5;
			const dashSpeed = 25;
			const dashDuration = (dashDistance / dashSpeed) * 1000; // в мс

			// Вспомогательная функция для старта дэша
			function startDash(type, currentTime, grounded) {
				hack.playerMoveData.lastDashTime = currentTime;
				if (type === 'Down') {
					hack.playerMoveData.isDashingDown = true;
				} else if (type === 'Up') {
					hack.playerMoveData.isDashingUp = true;
				} else if (type === 'Horizontal') {
					hack.playerMoveData.isDashing = true;
					hack.playerMoveData.dashVelocity = dashSpeed * hack.playerMoveData.lastHorizontalDirection;
				}
				hack.playerMoveData.dashDuration = dashDuration;
				hack.playerMoveData.dashEndTime = currentTime + dashDuration;
				if (!grounded) {
					hack.playerMoveData.airDashAvailable = false;
				}
			}

			// Вспомогательная функция для обновления движения во время дэша
			function updateDash(type, currentTime) {
				const player = hack.getters.mode.player.gpData.p;
				const me = hack.getters.me.p;
				if (type === 'Down') {
					player.velocity[1] = -dashSpeed;
					player.velocity[0] = 0;
				} else if (type === 'Up') {
					player.velocity[1] = dashSpeed;
					player.velocity[0] = 0;
				} else if (type === 'Horizontal') {
					player.velocity[0] = hack.playerMoveData.dashVelocity;
					player.velocity[1] = 0;
				}
				// Отключаем стандартную реакцию столкновений во время дэша
				me.collisionResponse = false;
				if (currentTime >= hack.playerMoveData.dashEndTime) {
					if (type === 'Down') {
						hack.playerMoveData.isDashingDown = false;
						player.velocity[1] = 0;
					} else if (type === 'Up') {
						hack.playerMoveData.isDashingUp = false;
						player.velocity[1] = 0;
					} else if (type === 'Horizontal') {
						hack.playerMoveData.isDashing = false;
						player.velocity[0] = 0;
					}
					if (!hack.vars.modeIsOn) {
						me.collisionResponse = true;
					}
				}
			}

			// Основной цикл обновления движения
			hack.getters.client.loopFunctions[2].fun = function() {
				const currentTime = Date.now();
				const grounded = isGrounded();

				// Если игрок на земле – сбрасываем возможность воздушного дэша
				if (grounded) {
					hack.playerMoveData.airDashAvailable = true;
				}

				// Обновляем последнее горизонтальное направление движения
				if (hack.getters.mode.moveLeft) {
					hack.playerMoveData.lastHorizontalDirection = -1;
				} else if (hack.getters.mode.moveRight) {
					hack.playerMoveData.lastHorizontalDirection = 1;
				}

				// Если кнопка дэша нажата и прошло достаточно времени, пытаемся запустить дэш
				if (hack.keyBindings.isCPressed &&
					currentTime - hack.playerMoveData.lastDashTime >= dashCooldown &&
					(grounded || hack.playerMoveData.airDashAvailable)
				) {
					if (hack.getters.mode.moveDown && !hack.playerMoveData.isDashingDown) {
						startDash('Down', currentTime, grounded);
					} else if (hack.getters.mode.moveUp && !hack.playerMoveData.isDashingUp) {
						startDash('Up', currentTime, grounded);
					} else if (!hack.playerMoveData.isDashing) {
						startDash('Horizontal', currentTime, grounded);
					}
				}

				// Обновление дэш-движения
				if (hack.playerMoveData.isDashingDown) {
					updateDash('Down', currentTime);
					return;
				} else if (hack.playerMoveData.isDashingUp) {
					updateDash('Up', currentTime);
					return;
				} else if (hack.playerMoveData.isDashing) {
					updateDash('Horizontal', currentTime);
					return;
				} else {
					// Обычное горизонтальное движение
					const player = hack.getters.mode.player.gpData.p;
					if (hack.getters.mode.moveRight) {
						hack.getters.mode.moveLeft = false
						player.velocity[0] = hack.vars.lrSpd * hack.vars.mult;
					} else if (hack.getters.mode.moveLeft) {
						hack.getters.mode.moveRight
						player.velocity[0] = -hack.vars.lrSpd * hack.vars.mult;
					}
				}





/*
                // Обработка прыжка и двойного прыжка
                if (grounded) {
                    hack.playerMoveData.isDoubleJumpAllowed = true;
                    if (hack.keyBindings.isZPressed) {
                        hack.keyBindings.isZPressed = false;
                        hack.getters.velocity[1] = 8 * hack.getters.me.p.gravityScale;
                    }
                } else if (hack.playerMoveData.isDoubleJumpAllowed && hack.keyBindings.isZPressed) {
                    hack.keyBindings.isZPressed = false;
                    hack.getters.velocity[1] = 8 * hack.getters.me.p.gravityScale;
                    hack.playerMoveData.isDoubleJumpAllowed = false;
                }
*/

                // Если клавиша прыжка нажата, обрабатываем её
                if (hack.keyBindings.isZPressed) {
                    hack.keyBindings.isZPressed = false;

                    if (grounded) {
                        // Прыжок с земли: прыгаем и разрешаем двойной прыжок
                        hack.getters.velocity[1] = 8 * hack.getters.me.p.gravityScale;
                        hack.playerMoveData.isDoubleJumpAllowed = true;
                    } else if (hack.playerMoveData.isDoubleJumpAllowed) {
                        // Двойной прыжок в воздухе: прыгаем и запрещаем дальнейшие прыжки в воздухе
                        hack.getters.velocity[1] = 8 * hack.getters.me.p.gravityScale;
                        hack.playerMoveData.isDoubleJumpAllowed = false;
                    }
                }

                // Если игрок на земле, всегда разрешаем двойной прыжок
                if (grounded) {
                    hack.playerMoveData.isDoubleJumpAllowed = true;
                }









				// Обработка движения в режиме "призрака"
				if (hack.vars.ghost1 || hack.vars.ghost2) {
					if (hack.getters.mode.moveUp) {
						hack.getters.velocity[1] = hack.vars.udSpd * hack.vars.mult;
					}
					if (hack.getters.mode.moveDown) {
						hack.getters.velocity[1] = -hack.vars.udSpd * hack.vars.mult;
					}
					if (!hack.getters.mode.moveUp && !hack.getters.mode.moveDown) {
						hack.getters.velocity[1] = 0;
					}
				}
			};

			hack.playerMoveData.newMovementIsOn = true;
		}

		function oldMovement() {
			hack.playerMoveData.division = 12
			hack.playerMoveData.meYplus = 49
			hack.getters.client.loopFunctions[2].fun = function() {
				const grounded = isGrounded()

				if (hack.getters.mode.moveRight) {
					hack.getters.mode.player.gpData.p.velocity[0] = hack.vars.lrSpd * hack.vars.mult
				} else if (hack.getters.mode.moveLeft) {
					hack.getters.mode.player.gpData.p.velocity[0] = -hack.vars.lrSpd * hack.vars.mult
				}
				if (grounded) {
					if (hack.getters.mode.moveUp) {
						hack.getters.velocity[1] = 8
					}
				}
				if (hack.vars.ghost1 || hack.vars.ghost2) {
					if (hack.getters.mode.moveUp) {
						hack.getters.velocity[1] = hack.vars.udSpd * hack.vars.mult
					}
					if (hack.getters.mode.moveDown) {
						hack.getters.velocity[1] = -hack.vars.udSpd * hack.vars.mult
					}
					if (!hack.getters.mode.moveUp && !hack.getters.mode.moveDown) {
						hack.getters.velocity[1] = 0
					}
				}
			}
			hack.playerMoveData.newMovementIsOn = false
		}
		addEventListener("mousewheel", e => {
			window.tweenObjects.map(x => {
				try {
					if (e.shiftKey) {
						hack.getters.mode.player.gpData.p.velocity[0] = -Math.sign(e.deltaY) * 15;
					} else {
						hack.getters.mode.player.gpData.p.velocity[1] = -Math.sign(e.deltaY) * 15;
					}
				} catch (err) {
					console.error(err);
				}
			});
		});




		window.window = this

		function teleportToClick(event) {
			event.preventDefault()
			const gameWidthFactor = window.innerWidth / hack.getters.mode.horizontalFOV
			const gameHeightFactor = window.innerHeight / (hack.getters.mode.horizontalFOV * (window.innerHeight / window.innerWidth))
			const targetX = (hack.getters.me.g.x + (event.clientX - window.innerWidth / 2) / gameWidthFactor) / 100;
			const targetY = -(hack.getters.me.g.y - hack.getters.me.shapes[1].getHeight() / 2 + (event.clientY - window.innerHeight / 2) / gameHeightFactor) / 100
			hack.getters.me.p.position[0] = targetX
			hack.getters.me.p.position[1] = targetY
		}
		document.addEventListener("contextmenu", teleportToClick)
	}

	let temp1 = {};
	const _call = Function.prototype.call;
	new Promise((resolve, reject) => {
		Function.prototype.call = function(...args) {
			if (args[2]?.exports) {
				temp1 = args[6]
				Function.prototype.call = _call
				console.log(temp1)
				resolve(temp1)
			}
			return _call.apply(this, args)
		};
	}).then((result) => {
		if (Object.keys(result).length > 0) {
			activateMain(result)
		} else {
			console.log("temp1 is empty")
		}
	}).catch((error) => {
		console.error("An error occurred:", error)
	})
}

function hideAndSeekHack() {
	function activateMain(temp1) {
		const hack = {
			keyBindings: {
				isCPressed: false,
				cTimer: null,
				isZPressed: false
			},
			playerMoveData: {
				lastHorizontalDirection: 1,
				isDashingDown: false,
				isDashingUp: false,
				lastDashTime: 0,
				dashDuration: 100,
				dashEndTime: 0,
				isDoubleJumpAllowed: false,
				airDashAvailable: true,
				newMovementIsOn: true
			},
			bindKeys: function() {
				document.addEventListener('keydown', function(event) {
					if (event.key === 'Escape') {
						const panel = document.getElementById('someData')
						const panel1 = document.getElementById('controlPanel')
						if (panel.style.display === 'none') {
							panel.style.display = 'inherit'
						} else {
							panel.style.display = 'none'
						}
						if (panel1.style.display === 'none') {
							panel1.style.display = 'inherit'
						} else {
							panel1.style.display = 'none'
						}
					}
					if (event.key.toLowerCase() === 's' && event.repeat) {
						if (!hack.vars.modeIsOn) {
							hack.getters.me.p.mass = 3
						}
					}
					if (event.key.toLowerCase() === 'z' && !event.repeat) {
						hack.keyBindings.isZPressed = true
					} else if (event.repeat) {
						hack.keyBindings.isZPressed = false
					}
					if (event.key.toLowerCase() === 'c') {
						hack.keyBindings.isCPressed = true
						if (!hack.keyBindings.cTimer) {
							hack.keyBindings.cTimer = setTimeout(() => {
								hack.keyBindings.isCPressed = false
								hack.keyBindings.cTimer = null
							}, 250)
						}
					}
				})
				document.addEventListener('keyup', function(event) {
					if (event.key.toLowerCase() === 's') {
						if (!hack.vars.modeIsOn) {
							hack.getters.me.p.mass = 1
						}
					}
					if (event.key.toLowerCase() === 'z') {
						hack.keyBindings.isZPressed = false
					}
					if (event.key.toLowerCase() === 'c') {
						hack.keyBindings.isCPressed = false
						if (hack.keyBindings.cTimer) {
							clearTimeout(hack.keyBindings.cTimer)
							hack.keyBindings.cTimer = null
						}
					}
				})
			},
			getters: {
				get client() {
					return temp1[38].exports
				},
				get gf() {
					return temp1[42].exports
				},
				get gp() {
					return temp1[43].exports
				},
				get graphics() {
					return temp1[44].exports
				},
				get mode() {
					return temp1[48].exports
				},
				get envirData() {
					return temp1[53].exports
				},
				get network() {
					return temp1[74].exports
				},
				get physics() {
					return temp1[370].exports
				},
				get me() {
					return hack.getters.mode.player.gpData
				},
				get ray() {
					return hack.getters.me.ray
				},
				get velocity() {
					return hack.getters.me.p.velocity
				},
				get otherPlayers() {
					return hack.getters.mode.otherPlayers
				},
				get ray() {
					return this.mode.player.gpData.ray
				},
				get velocity() {
					return this.mode.player.gpData.p.velocity
				},
				get otherPlayers() {
					return this.mode.otherPlayers
				},
				ghost: false,
				get me() {
					return hack.getters.mode.player.gpData
				},
				get ray() {
					return hack.getters.me.ray
				},
				get velocity() {
					return hack.getters.me.p.velocity
				},
				get otherPlayers() {
					return hack.getters.mode.otherPlayers
				}
			},
			vars: {
				get isGround() {
					return isGrounded()
				},
				mult: 1,
				lrSpd: 3,
				udSpd: 3,
				'POSITION INFO ': '-----------------------',
				get currentPosX() {
					return Math.round(hack.getters.me.getX() * 100) / 100
				},
				get currentPosY() {
					return Math.round(hack.getters.me.getY() * 100) / 100
				},
				'SPEED INFO ': '----------------------------',
				get totalSpd() {
					return (((this.lrSpd + this.udSpd) / 2) * this.mult)
				},
				get currentSpdX() {
					return Math.round(hack.getters.me.p.velocity[0] * 100) / 100
				},
				get currentSpdY() {
					return Math.round(hack.getters.me.p.velocity[1] * 100) / 100
				},
				'SCRIPT VALUES ': '----------------------',
				multSpdIsOn: false,
				modeIsOn: false,
				ghost1: false,
				isPlayerDead: false,
				'MOVEMENT VALUES ': '---------------'
			},
			suppFuncs: {
				getMult: () => {
					if (hack.vars.mult < 3) {
						return 1
					} else if (hack.vars.mult < 4) {
						return 2
					}
				},
				setMult: function(e) {
					if (e != undefined) {
						hack.vars.lrSpd = hack.vars.udSpd = e
						return
					}
					if (hack.suppFuncs.getMult() === 1) {
						hack.vars.mult++
					} else if (hack.suppFuncs.getMult() === 2) {
						hack.vars.mult += 2
					} else {
						hack.vars.mult = 1
					}
				},
				getIndexByName: function(playerName) {
					const index = hack.getters.otherPlayers.findIndex(player => player?.myName === playerName)
					return index === -1 ? false : index
				}
			},
			functions: {
				godModeEnable: () => {
					hack.vars.ghost1 = true
					hack.getters.me.p.collisionResponse = false
					hack.getters.me.p.mass = 0
					hack.vars.modeIsOn = true
					hack.getters.velocity[0] = 0
					hack.getters.velocity[1] = 0
				},
				godModeDisable: () => {
					hack.vars.ghost1 = false
					hack.getters.me.p.collisionResponse = true
					hack.getters.me.p.mass = 1
					hack.vars.modeIsOn = false
					hack.getters.velocity[0] = 0
					hack.getters.velocity[1] = 0
				},
				multSpdEnable: () => {
					hack.vars.lrSpd *= hack.vars.mult
					hack.vars.udSpd *= hack.vars.mult
					hack.vars.multSpdIsOn = true
				},
				multSpdDisable: () => {
					hack.vars.lrSpd /= hack.vars.mult
					hack.vars.udSpd /= hack.vars.mult
					hack.vars.multSpdIsOn = false
				}
			},
			logFuncs: {
				logModeIsOn: () => {
					console.log('modeIsOn:', hack.vars.modeIsOn)
				},
				logSpd: () => {
					console.log('speed:', ((hack.vars.lrSpd + hack.vars.udSpd) / 2) * hack.vars.mult)
				}
			}
		}

		document.body.insertAdjacentHTML("beforebegin", `
  <div id="someData" style="display: inherit; width: auto; position: fixed; top: 25px; left: 0px; height: auto; text-align: left; font-size: 14px; background: rgb(0, 0, 0); color: rgb(255, 255, 255); opacity: 0.7; padding: 2px 2px;"></div>
`)

		const updateData = () => {
			const o = []
			for (let i in hack.vars) {
				o.push(`${i}: ${hack.vars[i]}`)
			}
			for (let i in hack.playerMoveData) {
				o.push(`${i}: ${hack.playerMoveData[i]}`)
			}
			document.getElementById("someData").innerHTML = o.join('<br>')
		}

		document.body.insertAdjacentHTML("beforebegin", `
  <div id="controlPanel" style="display: inherit; width: auto; position: fixed; bottom: 0px; left: 0px; height: auto; text-align: left; font-size: 14px; background: rgb(0, 0, 0); color: rgb(255, 255, 255); opacity: 0.7; padding: 2px 2px;">
    <div>
      <span>new movement: </span>
      <button id="newMoveBtn" style="background: rgba(255, 255, 255, 0.7); color: black;">${hack.playerMoveData.newMovementIsOn}</button>
    </div>
  </div>
`)

		const updateButtonStates = () => {
			document.getElementById("newMoveBtn").innerText = hack.playerMoveData.newMovementIsOn
		}

		document.getElementById("newMoveBtn").addEventListener("click", () => {
			if (!hack.playerMoveData.newMovementIsOn) {
				newMovement()
			} else {
				oldMovement()
			}
			updateButtonStates()
		})

		setInterval(updateData, 100 / 6)
		updateButtonStates()
		setInterval(updateButtonStates, 100 / 6)
		hack.bindKeys()

		let scrActivate = function() {
			hack.getters.client.loopFunctions[2].timeOut = 100 / 6
			hack.getters.client.loopFunctions[3].timeOut = 0
			oldMovement()
			Object.defineProperty(hack.vars, 'mult', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'lrSpd', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'udSpd', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'multSpdIsOn', {
				enumerable: false
			})
			Object.defineProperty(hack.vars, 'ghost1', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'lastDashTime', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'lastHorizontalDirection', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'lastDashTime', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'dashDuration', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'dashEndTime', {
				enumerable: false
			})
			Object.defineProperty(hack.playerMoveData, 'newMovementIsOn', {
				enumerable: false
			})
			document.getElementById('timer').style.opacity = 0.7
			document.getElementById('timer').style.background = 'rgb(0, 0, 0)'
			document.getElementById('timer').style.color = 'rgb(255, 255, 255)'
			document.getElementById('seekerDistance').style.opacity = 0.7
			document.getElementById('seekerDistance').style.background = 'rgb(0, 0, 0)'
			document.getElementById('seekerDistance').style.color = 'rgb(255, 255, 255)'
			document.getElementById('hidersCount').style.color = 'rgb(255, 255, 255)'
			document.getElementById('hidersCount').style.opacity = 0.7
		}

		setTimeout(() => {
			if (hack.vars.modeIsOn) {
				hack.functions.godModeEnable()
			}
		}, 300)

		hack.getters.client.findUntilFound = function(e, t, n) {
			hack.getters.network.gsip = e;
			hack.getters.network.gsrn = t;
			hack.getters.network.getSID?.((sid) => {
				hack.getters.network.sid = sid;
				hack.getters.network.connectToGs?.(hack.getters.network.gsip, () => {
					console.log("connected to gs");

					hack.getters.client.verifyIsHuman?.(() => {
						hack.getters.network.registerSidOnGs?.((verifyStatus) => {
							console.log("verified on gs server", verifyStatus);

							if (verifyStatus === "") {
								alert("You are already playing the game in another browser tab.");
								location.reload();
								n(2);
							} else {
								hack.getters.network.joinRoom?.(hack.getters.network.gsrn, (joinStatus) => {
									if (joinStatus === 1) {
										hack.getters.client.sendPlayingInfo?.(hack.getters.client.roomId, () => {
											hack.getters.client.onReady?.();
											n(1);
											scrActivate()
										});
									} else {
										console.log("else");
										hack.getters.network.gsSockehack?.getters.client.disconnect?.();

										do {
											hack.getters.client.rIndex++;
											const currentDataCenter = hack.getters.network.dataCenters?.[hack.getters.client.dcIndex];

											if (!currentDataCenter?.[hack.getters.client.rIndex]) {
												hack.getters.client.dcIndex++;
												hack.getters.client.rIndex = 0;

												if (!hack.getters.network.dataCenters?.[hack.getters.client.dcIndex]) {
													alert("It seems all servers are full. Please refresh your page and try again.");
													location.reload();
													return;
												}
											}
										} while (hack.getters.network.dataCenters?.[hack.getters.client.dcIndex]?.[hack.getters.client.rIndex]?.[2] !== hack.getters.client.modeInfo.mp);

										const newGsip = hack.getters.network.dataCenters?.[hack.getters.client.dcIndex]?.[hack.getters.client.rIndex]?.[1];
										const newGsrn = hack.getters.network.dataCenters?.[hack.getters.client.dcIndex]?.[hack.getters.client.rIndex]?.[3];
										hack.getters.client.roomId = hack.getters.network.dataCenters?.[hack.getters.client.dcIndex]?.[hack.getters.client.rIndex]?.[4];

										hack.getters.client.findUntilFound(newGsip, newGsrn, n);
									}
								});
							}
						});
					});
				});
			});
		};

		document.body.onkeydown = (event) => {
			const key = event.key;
			switch (key) {
				case 'PageUp':
					if (!hack.vars.modeIsOn) {
						hack.getters.me.p.gravityScale = -1
						hack.getters.me.p.collisionResponse = 0
					}
					break;
				case 'PageDown':
					if (!hack.vars.modeIsOn) {
						hack.getters.me.p.gravityScale = 1
						hack.getters.me.p.collisionResponse = 0
					}
					break;
				case 'F2':
					if (!hack.vars.modeIsOn) {
						hack.functions.godModeEnable();
						hack.logFuncs.logModeIsOn();
						hack.functions.multSpdEnable();
					} else {
						hack.functions.godModeDisable();
						hack.logFuncs.logModeIsOn();
						hack.functions.multSpdDisable();
					}
					break;
				case '`': // Backtick (`)
				case 'ё'.toLowerCase(): // Cyrillic Yo (часто на той же клавише, что и Backtick)
					if (hack.vars.modeIsOn) {
						hack.suppFuncs.setMult();
						hack.logFuncs.logSpd();
					}
					break;
			}
		};

		function isGrounded() {
			const meX = hack.getters.me.getX()
			const meY = hack.getters.me.getY()
			const ray = hack.getters.ray
			const physics = hack.getters.physics
			const gpPWorld = hack.getters.gp.pWorld
			const rayResult = hack.getters.me.ray.result
			const rayHitPoint = (hack.getters.ray.hitPoint = [Infinity, Infinity])

			const verticalOffset = 50
			const checkYPosition = meY + 45

			for (let i = 0; i < 121; i++) {
				const o = meX - 15 + i * (30 / 120)
				const s = checkYPosition
				const u = s + verticalOffset

				ray.from = [physics.xAxis(o, 0), physics.yAxis(s, 0)]
				ray.to = [physics.xAxis(o, 0), physics.yAxis(u, 0)]

				ray.update()
				rayResult.reset()

				if (gpPWorld.raycast(rayResult, ray)) {
					rayResult.getHitPoint(rayHitPoint, ray)
					const hitDistance = rayResult.getHitDistance(ray)

					if (rayResult.shape.ref.getCollision() && hitDistance < 0.1) {
						return true
					}
				}
			}

			return false
		}

		function newMovement() {
			hack.getters.client.loopFunctions[2].fun = function() {
				const currentTime = Date.now()
				const dashCooldown = 250
				const dashDistance = 2.5
				const dashSpeed = 25
				const grounded = isGrounded()

				if (grounded) {
					hack.playerMoveData.airDashAvailable = true
				}

				if (hack.getters.mode.moveLeft) {
					hack.playerMoveData.lastHorizontalDirection = -1
				} else if (hack.getters.mode.moveRight) {
					hack.playerMoveData.lastHorizontalDirection = 1
				}

				if (
					hack.keyBindings.isCPressed &&
					hack.getters.mode.moveDown &&
					currentTime - hack.playerMoveData.lastDashTime >= dashCooldown &&
					!hack.playerMoveData.isDashingDown &&
					(grounded || (!grounded && hack.playerMoveData.airDashAvailable))
				) {
					hack.playerMoveData.lastDashTime = currentTime
					hack.playerMoveData.isDashingDown = true
					hack.playerMoveData.dashDuration = (dashDistance / dashSpeed) * 1000
					hack.playerMoveData.dashEndTime = currentTime + hack.playerMoveData.dashDuration
					if (!grounded) {
						hack.playerMoveData.airDashAvailable = false
					}
				}

				if (
					hack.keyBindings.isCPressed &&
					hack.getters.mode.moveUp &&
					currentTime - hack.playerMoveData.lastDashTime >= dashCooldown &&
					!hack.playerMoveData.isDashingUp &&
					(grounded || (!grounded && hack.playerMoveData.airDashAvailable))
				) {
					hack.playerMoveData.lastDashTime = currentTime
					hack.playerMoveData.isDashingUp = true
					hack.playerMoveData.dashDuration = (dashDistance / dashSpeed) * 1000
					hack.playerMoveData.dashEndTime = currentTime + hack.playerMoveData.dashDuration
					if (!grounded) {
						hack.playerMoveData.airDashAvailable = false
					}
				}

				if (
					hack.keyBindings.isCPressed &&
					currentTime - hack.playerMoveData.lastDashTime >= dashCooldown &&
					!hack.playerMoveData.isDashing &&
					(grounded || (!grounded && hack.playerMoveData.airDashAvailable))
				) {
					hack.playerMoveData.lastDashTime = currentTime
					hack.playerMoveData.isDashing = true
					hack.playerMoveData.dashVelocity = dashSpeed * hack.playerMoveData.lastHorizontalDirection
					hack.playerMoveData.dashDuration = (dashDistance / dashSpeed) * 1000
					hack.playerMoveData.dashEndTime = currentTime + hack.playerMoveData.dashDuration
					if (!grounded) {
						hack.playerMoveData.airDashAvailable = false
					}
				}

				if (hack.playerMoveData.isDashingDown) {
					hack.getters.mode.player.gpData.p.velocity[1] = -dashSpeed
					hack.getters.mode.player.gpData.p.velocity[0] = 0
					hack.getters.me.p.collisionResponse = false
					if (currentTime >= hack.playerMoveData.dashEndTime) {
						hack.playerMoveData.isDashingDown = false
						hack.getters.mode.player.gpData.p.velocity[1] = 0
						if (!hack.vars.modeIsOn) {
							hack.getters.me.p.collisionResponse = true
						}
					}
					return
				}

				if (hack.playerMoveData.isDashingUp) {
					hack.getters.mode.player.gpData.p.velocity[1] = dashSpeed
					hack.getters.mode.player.gpData.p.velocity[0] = 0
					hack.getters.me.p.collisionResponse = false
					if (currentTime >= hack.playerMoveData.dashEndTime) {
						hack.playerMoveData.isDashingUp = false
						hack.getters.mode.player.gpData.p.velocity[1] = 0
						if (!hack.vars.modeIsOn) {
							hack.getters.me.p.collisionResponse = true
						}
					}
					return
				}

				if (hack.playerMoveData.isDashing) {
					hack.getters.mode.player.gpData.p.velocity[0] = hack.playerMoveData.dashVelocity
					hack.getters.mode.player.gpData.p.velocity[1] = 0
					hack.getters.me.p.collisionResponse = false
					if (currentTime >= hack.playerMoveData.dashEndTime) {
						hack.playerMoveData.isDashing = false
						hack.getters.mode.player.gpData.p.velocity[0] = 0
						if (!hack.vars.modeIsOn) {
							hack.getters.me.p.collisionResponse = true
						}
					}
					return
				} else {
					if (hack.getters.mode.moveRight) {
						hack.getters.mode.player.gpData.p.velocity[0] = hack.vars.lrSpd * hack.vars.mult
					} else if (hack.getters.mode.moveLeft) {
						hack.getters.mode.player.gpData.p.velocity[0] = -hack.vars.lrSpd * hack.vars.mult
					}
				}

				if (grounded) {
					hack.playerMoveData.isDoubleJumpAllowed = true
					if (hack.keyBindings.isZPressed) {
						hack.keyBindings.isZPressed = false
						hack.getters.velocity[1] = 8 * (hack.getters.me.p.gravityScale)
					}
				} else if (hack.playerMoveData.isDoubleJumpAllowed && hack.keyBindings.isZPressed) {
					hack.keyBindings.isZPressed = false
					hack.getters.velocity[1] = 8 * (hack.getters.me.p.gravityScale)
					hack.playerMoveData.isDoubleJumpAllowed = false
				}

				if (hack.vars.ghost1) {
					if (hack.getters.mode.moveUp) {
						hack.getters.velocity[1] = hack.vars.udSpd * hack.vars.mult
					}
					if (hack.getters.mode.moveDown) {
						hack.getters.velocity[1] = -hack.vars.udSpd * hack.vars.mult
					}
					if (!hack.getters.mode.moveUp && !hack.getters.mode.moveDown) {
						hack.getters.velocity[1] = 0
					}
				}
			}
			hack.playerMoveData.newMovementIsOn = true
		}

		function oldMovement() {
			hack.getters.client.loopFunctions[2].fun = function() {
				const grounded = isGrounded()

				if (hack.getters.mode.moveRight) {
					hack.getters.mode.player.gpData.p.velocity[0] = hack.vars.lrSpd * hack.vars.mult
				} else if (hack.getters.mode.moveLeft) {
					hack.getters.mode.player.gpData.p.velocity[0] = -hack.vars.lrSpd * hack.vars.mult
				}
				if (grounded) {
					if (hack.getters.mode.moveUp) {
						hack.getters.velocity[1] = 8
					}
				}
				if (hack.vars.ghost1) {
					if (hack.getters.mode.moveUp) {
						hack.getters.velocity[1] = hack.vars.udSpd * hack.vars.mult
					}
					if (hack.getters.mode.moveDown) {
						hack.getters.velocity[1] = -hack.vars.udSpd * hack.vars.mult
					}
					if (!hack.getters.mode.moveUp && !hack.getters.mode.moveDown) {
						hack.getters.velocity[1] = 0
					}
				}
			}
			hack.playerMoveData.newMovementIsOn = false
		}
		addEventListener("mousewheel", e => {
			window.tweenObjects.map(x => {
				try {
					if (e.shiftKey) {
						hack.getters.mode.player.gpData.p.velocity[0] = -Math.sign(e.deltaY) * 15;
					} else {
						hack.getters.mode.player.gpData.p.velocity[1] = -Math.sign(e.deltaY) * 15;
					}
				} catch (err) {
					console.error(err);
				}
			});
		})
	}

	let temp1 = {};
	const _call = Function.prototype.call;
	new Promise((resolve, reject) => {
		Function.prototype.call = function(...args) {
			if (args[2]?.exports) {
				temp1 = args[6]
				Function.prototype.call = _call
				console.log(temp1)
				resolve(temp1)
			}
			return _call.apply(this, args)
		};
	}).then((result) => {
		if (Object.keys(result).length > 0) {
			activateMain(result)
		} else {
			console.log("temp1 is empty")
		}
	}).catch((error) => {
		console.error("An error occurred:", error)
	})
}

if (sandboxURL.includes(window.location.href)) {
	sandboxHack();
} else if (twoPlayerURL.includes(window.location.href)) {
	twoPlayerHack();
} else if (hideAndSeekURL.includes(window.location.href)) {
	hideAndSeekHack();
}