blackhack

Cheat for brofist.io

// ==UserScript==
// @name           blackhack
// @version        1.14-beta4
// @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
// @match          http://www.brofist.io/
// @match          http://www.brofist.io/modes/twoPlayer/c/index.html
// @match          http://www.brofist.io/modes/hideAndSeek/c/index.html
// @match          http://www.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 = "4px"; // расстояние между белой точкой и никнеймом

        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.includes(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();
}

















// Функция, возвращающая противоположный (инвертированный) цвет в формате 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', 'http://www.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','http://www.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', 'http://www.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 myStatus() {
                    return temp1[57].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="display: flex; align-items: center; gap: 10px; width: max-content;">
      <label for="blacklistInput" style="min-width: 70px; text-align: left;">Никнейм</label>
      <input type="text" id="blacklistInput" style="width: 150px;">
      <button class="btn">Добавить</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 = true;
                e.buttonMode = true;
                let flag = false;
                function t() {
                    if (hack.vars.shiftPressed) {
                        let name = this.ref.refP.name.getText();
                        if (!hack.vars.blacklisted.names.includes(name)) {
                            hack.vars.blacklisted.names.push(name);
                        }
                        window.updateBlacklistList();
                        flag = true;
                    }
                    if (flag) {
                        flag = false;
                        return;
                    }
                    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;
                }
                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();
}
长期地址
遇到问题?请前往 GitHub 提 Issues,或加Q群1031348184

赞助商

Fishcpy

广告

Rainyun

注册一下就行

Rainyun

一年攒够 12 元