您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Speed Hack, Invisibility, And many more. "Insert" to open menu.
// ==UserScript== // @name Kour.io Zeph Menu // @match *://kour.io/* // @version 4.1 // @author Happyjeffery, Rasperiiii & suppress // @icon https://i.imgur.com/11sYWVM.png // @description Speed Hack, Invisibility, And many more. "Insert" to open menu. // @run-at document-start // @grant unsafeWindow // @namespace https://greasyfork.org/users/1369586 // ==/UserScript== (function () { ("use strict"); /*************************************** * Performance.now Speed Hack ***************************************/ const originalPerfNow = performance.now.bind(performance); function updatePerformanceNow(multiplier) { if (multiplier === 1) { performance.now = originalPerfNow; return; } performance.now = new Proxy(originalPerfNow, { apply(target, thisArg, argArray) { try { throw new Error(); } catch (e) { if (!e.stack.includes("invoke_")) { return target.apply(thisArg, argArray) * multiplier; } } return target.apply(thisArg, argArray); }, }); } updatePerformanceNow(1); /*************************************** * Invisibility + Instakill ***************************************/ const Signatures = { damageTaken: "f3 04 c8 02 f5 15 04", updateState: "f3 02 fd 02 f4 03 c8", }; function hexOf(buf) { return Array.from(new Uint8Array(buf)) .map((b) => b.toString(16).padStart(2, "0")) .join(" "); } function shouldBlockDamage(ev) { return ( ev.data instanceof ArrayBuffer && hexOf(ev.data).startsWith(Signatures.damageTaken) && kourInstance.config.Invisible ); } /*************************************** * AntiAim ***************************************/ const HEADER_SIG = [0xf3, 0x02, 0xfd, 0x02, 0xf4, 0x03]; const SAFE_MIN_LENGTH = 70; function arrayStartsWith(arr, prefix) { if (arr.length < prefix.length) return false; for (let i = 0; i < prefix.length; i++) { if (arr[i] !== prefix[i]) return false; } return true; } function isSafeToModify(packet) { return packet.byteLength >= SAFE_MIN_LENGTH && !kourInstance.config.Invisible && kourInstance.config.AntiAim; } function modifyPacket(packet) { const view = new DataView(packet.buffer, packet.byteOffset, packet.byteLength); let x = view.getFloat32(28, true); const xDelta = Math.random() < 0.5 ? -0.2 : 0.2; x += xDelta; view.setFloat32(28, x, true); let z = view.getFloat32(36, true); const zDelta = Math.random() < 0.5 ? -0.2 : 0.2; z += zDelta; view.setFloat32(36, z, true); //console.log(`[Packet Modified] X: ${x.toFixed(2)}, Z: ${z.toFixed(2)}`); return packet; } /*************************************** * Spinbot Angle Modifier ***************************************/ const crazyNumbers = [ 3822588238527201280.00, -1857736430059520.00, 0.00, -0.00, -1.4284511533486216e+24, -0.00, 0.00, 0.12, -1.8763868419170566e+22, 0.00, 556457979374085341184.00, 0.00, -228963383699832832.00, -0.00, 478289722746077184.00, 0.00, -1707527.88, 0.00, 2.0849836473005435e+26, -0.00, 343366451878428672.00, -0.00, 0.00, -0.00, -398.99, -7.327271464138011e+37, -0.00, 7.479676797675635e+34, 6077727.50, -112678365030856523776.00, 64406255347955662848.00, -0.00, 3.9367609144474995e+28, -0.68, -4.1272324222675643e+34, 0.00, -34401746419712.00, 256284.98, -0.00, -992099.94, -46124.25, -0.00, -0.23, 3573135.75, -0.00, 3.4937574108676156e+24, 31446140.00, -0.00, 0.00, -2.633920784508417e+22, 1.5002101046880594e+23, -662611.81, 0.00, -7.82, 2.1554711763577515e+33, -4781238408011841536.00, -8.267893275317273e+33, -0.00, 0.00, -4.7050078084659084e+24, 63447551577279168512.00, 0.00, 5.614778816753592e+36, 5183327.50, ]; let currentIndex = 0; const ANGLE_OFFSET = 0x38; /*************************************** * WebSocket Hooking ***************************************/ (function hookWS() { const OrigWS = unsafeWindow.WebSocket; unsafeWindow.WebSocket = function (...args) { const ws = new OrigWS(...args); const { addEventListener } = ws; ws.addEventListener = (type, fn, opts) => addEventListener.call( ws, type, type === "message" ? (ev) => shouldBlockDamage(ev) || fn(ev) : fn, opts ); const protoDesc = Object.getOwnPropertyDescriptor(OrigWS.prototype, "onmessage"); Object.defineProperty(ws, "onmessage", { set(fn) { protoDesc.set.call(this, (ev) => shouldBlockDamage(ev) || fn(ev)); }, get() { return protoDesc.get.call(this); }, }); const originalSend = ws.send; ws.send = function (data) { if (data instanceof ArrayBuffer || data instanceof Uint8Array) { let packet = data instanceof Uint8Array ? data : new Uint8Array(data); const hex = hexOf(packet); if (hex.startsWith(Signatures.updateState) && kourInstance.config.Instakill) { for (let i = 0; i < 41; i++) originalSend.call(ws, data); return; } if (arrayStartsWith(packet, HEADER_SIG)) { if (isSafeToModify(packet)) { packet = modifyPacket(packet); data = packet.buffer; } if (kourInstance.config.SpinBot && packet.byteLength >= ANGLE_OFFSET + 4 && !kourInstance.config.Invisible) { const view = new DataView(data); const num = crazyNumbers[currentIndex]; view.setFloat32(ANGLE_OFFSET, num, true); currentIndex++; if (currentIndex >= crazyNumbers.length) currentIndex = 0; } } } return originalSend.call(this, data); }; return ws; }; unsafeWindow.WebSocket.prototype = OrigWS.prototype; })(); /*************************************** * Config Object ***************************************/ class Kour { constructor() { this.config = { Invisible: true, Instakill: false, AntiAim: false, SpinBot: false, airStrafing: true, }; } } const kourInstance = new Kour(); unsafeWindow.kourInstance = kourInstance; /*************************************** * Weapon Changer (Lobby Only!) ***************************************/ const weapons = [ { name: "AK-47", id: "0" }, { name: "Deagle", id: "1" }, { name: "AWP", id: "2" }, { name: "Bayonet", id: "3" }, { name: "Uzi", id: "4" }, { name: "PKM", id: "5" }, { name: "Revolver", id: "6" }, { name: "RPG", id: "7" }, { name: "USPS", id: "8" }, { name: "MP5", id: "9" }, { name: "Shotgun", id: "10" }, { name: "Glock", id: "11" }, { name: "Karambit", id: "12" }, { name: "Knife", id: "13" }, { name: "Scar", id: "14" }, { name: "Minigun", id: "15" }, { name: "Famas", id: "16" }, { name: "Vector", id: "17" }, { name: "Flamethrower", id: "18" }, { name: "Kar98k", id: "19" }, { name: "M4A4", id: "20" }, { name: "Tec-9", id: "21" }, { name: "CZ", id: "22" }, { name: "Berretta92fs", id: "23" }, { name: "AK-109", id: "24" }, { name: "P90", id: "25" }, { name: "Thompson", id: "26" }, { name: "UMP45", id: "27" }, { name: "XM1014", id: "28" }, { name: "Butterfly", id: "29" }, { name: "Laser Gun", id: "30" }, { name: "Bomb", id: "31" }, { name: "Smoke Grenade", id: "32" }, { name: "Molotov", id: "33" }, { name: "Grenade", id: "34" }, { name: "Flashbang", id: "35" }, { name: "Glizzy", id: "36" }, { name: "Axe", id: "37" }, { name: "Bare Fists", id: "38" }, ]; function setSecondaryWeapon(weaponID) { firebase .database() .ref("users/" + firebase.auth().currentUser.uid) .child("overrideWeaponIndexes1") .set(weaponID); showUserDetails( firebase.auth().currentUser.email, firebase.auth().currentUser ); } function setMeleeWeapon(weaponID) { firebase .database() .ref("users/" + firebase.auth().currentUser.uid) .child("overrideWeaponIndexes2") .set(weaponID); showUserDetails( firebase.auth().currentUser.email, firebase.auth().currentUser ); } /*************************************** * Skin Changer (Lobby Only!) ***************************************/ const skins = [ { name: "KBI Agent", id: "12" }, { name: "James Kour", id: "13" }, { name: "President", id: "14" }, { name: "Doctor", id: "15" }, { name: "Trickster", id: "16" }, { name: "Royal Guard", id: "17" }, { name: "Xmas", id: "18" }, { name: "Kelvis", id: "19" }, { name: "Princess Pink", id: "20" }, { name: "Princess White", id: "21" }, { name: "Princess Bee", id: "22" }, { name: "Princess Leaf", id: "23" }, { name: "Koura Kraft", id: "24" }, { name: "Green Hologram", id: "25" }, { name: "Hologrape", id: "26" }, { name: "Peter", id: "27" }, { name: "Chicken", id: "28" }, { name: "Chickoletta", id: "29" }, { name: "Kyle", id: "30" }, { name: "Shadowgram", id: "32" }, { name: "IceBunny", id: "33" }, { name: "CocoBunny", id: "34" }, { name: "Kourean", id: "35" }, { name: "KourG", id: "36" }, { name: "Hackour", id: "37" }, { name: "Golden Hackour", id: "38" }, { name: "Gas Man", id: "39" }, { name: "Terrorist", id: "40" }, { name: "Counter Terrorist", id: "41" }, { name: "Ambush", id: "42" }, { name: "Baby Kour", id: "43" }, { name: "Poacher", id: "44" }, { name: "Astronaut", id: "45" }, { name: "Kour Parrot", id: "46" }, { name: "Kour Pirate", id: "47" }, { name: "Legionaut", id: "48" }, { name: "Blue Hologram", id: "49" }, { name: "Mr Wireframe", id: "50" }, { name: "Mythian", id: "51" }, { name: "Kour Trooper", id: "52" }, { name: "Kour Craft", id: "53" }, { name: "Kour Green Soldier", id: "54" }, { name: "Yellow Astronaut", id: "55" }, { name: "Orange Astronaut", id: "56" }, { name: "Red Astronaut", id: "57" }, { name: "Blue Astronaut", id: "58" }, { name: "Kour Banana", id: "59" }, { name: "Mrs Kour", id: "60" }, { name: "Investor Inverted", id: "61" }, { name: "Kour Jungler", id: "62" }, { name: "Skinny Baby", id: "63" }, { name: "KourTuber", id: "64" }, { name: "Red Hologram", id: "65" }, { name: "White Hologram", id: "66" }, { name: "Orange Hologram", id: "67" }, { name: "Dark Blue Hologram", id: "68" }, { name: "Brown Hologram", id: "69" }, { name: "Yellow Hologram", id: "70" }, { name: "Dark Red Hologram", id: "71" }, { name: "Kourist", id: "72" }, { name: "Firefighter", id: "73" }, { name: "FireKour", id: "74" }, { name: "Kour Thief", id: "75" }, { name: "Kour Burger", id: "76" }, { name: "Kour Fan", id: "77" }, { name: "Kour Brady", id: "78" }, { name: "LeKour James", id: "79" }, { name: "Uncle Kour", id: "80" }, { name: "Chef", id: "81" }, { name: "KourObby", id: "82" }, { name: "Legionary", id: "83" }, { name: "Kitty Kour One", id: "84" }, { name: "Kitty Kour Two", id: "85" }, { name: "Kitty Kour Three", id: "86" }, { name: "Kour Crafter", id: "87" }, { name: "RTX", id: "88" }, { name: "Loony Kour", id: "89" }, { name: "Kour Shocker", id: "90" }, { name: "Kourkin", id: "91" }, { name: "Forest Kour", id: "92" }, { name: "Slender Kour", id: "93" }, { name: "Drakour", id: "94" }, { name: "Christmas2024", id: "95" }, { name: "Deer2024", id: "96" } ]; function setSkin(skinID) { firebase .database() .ref("users/" + firebase.auth().currentUser.uid) .child("skin") .set(skinID); showUserDetails( firebase.auth().currentUser.email, firebase.auth().currentUser ); } /*************************************** * Profile Stats ***************************************/ function setStat(stat, value) { const parsedValue = parseInt(value, 10); const finalValue = isNaN(parsedValue) ? value : parsedValue; firebase .database() .ref("users/" + firebase.auth().currentUser.uid + "/public") .child(stat) .set(finalValue); showUserDetails( firebase.auth().currentUser.email, firebase.auth().currentUser ); } /*************************************** * Clan Editing ***************************************/ function overrideCreateClan() { if (typeof createClan === 'function') { createClan = function(clanName, leaderUserId, clanColor, reqID) { unityInstanceWrapper.sendMessage(firebaseObjName, 'OnSetDataNew', clanName + "&" + reqID); }; //console.log("override done."); } else { setTimeout(overrideCreateClan, 500); } } overrideCreateClan(); /*************************************** * Class Kills ***************************************/ const classMap = { Soldier: "class0kills", Hitman: "class1kills", Gunner: "class2kills", Heavy: "class3kills", Rocketeer: "class4kills", Agent: "class5kills", Brawler: "class6kills", Investor: "class7kills", Assassin: "class8kills", Juggernaut: "class9kills", Recon: "class10kills", Pyro: "class11kills", Rayblader: "class15kills", }; function setClassKills() { const existingDialog = document.getElementById("classSelectionDialog"); if (existingDialog) existingDialog.remove(); const classSelectionDialog = document.createElement("div"); classSelectionDialog.id = "classSelectionDialog"; Object.assign(classSelectionDialog.style, { position: "fixed", top: "50%", left: "50%", transform: "translate(-50%, -50%)", backgroundColor: "#5a2d72", color: "#fff", padding: "20px", zIndex: "10002", fontFamily: "Arial, sans-serif", fontSize: "14px", borderRadius: "8px", boxShadow: "0 4px 8px rgba(0,0,0,0.2)", width: "300px", maxHeight: "400px", overflowY: "auto", cursor: "move", userSelect: "none", }); const closeBtn = document.createElement("button"); closeBtn.textContent = "×"; closeBtn.style.position = "absolute"; closeBtn.style.top = "5px"; closeBtn.style.right = "5px"; closeBtn.style.background = "none"; closeBtn.style.border = "none"; closeBtn.style.color = "#fff"; closeBtn.style.fontSize = "16px"; closeBtn.style.cursor = "pointer"; closeBtn.addEventListener("click", () => classSelectionDialog.remove()); classSelectionDialog.appendChild(closeBtn); const dialogTitle = document.createElement("div"); dialogTitle.textContent = "Select Class"; dialogTitle.style.fontWeight = "bold"; dialogTitle.style.fontSize = "18px"; dialogTitle.style.marginBottom = "15px"; dialogTitle.style.textAlign = "center"; classSelectionDialog.appendChild(dialogTitle); const classButtonContainer = document.createElement("div"); classButtonContainer.style.display = "grid"; classButtonContainer.style.gridTemplateColumns = "repeat(2, 1fr)"; classButtonContainer.style.gap = "8px"; Object.keys(classMap).forEach((className) => { const classBtn = document.createElement("button"); classBtn.textContent = className; Object.assign(classBtn.style, { padding: "8px", cursor: "pointer", backgroundColor: "#9b3e9f", border: "none", borderRadius: "5px", fontSize: "13px", color: "#fff", transition: "background-color 0.3s", }); classBtn.addEventListener( "mouseover", () => (classBtn.style.backgroundColor = "#a74cbf") ); classBtn.addEventListener( "mouseout", () => (classBtn.style.backgroundColor = "#9b3e9f") ); classBtn.addEventListener("click", () => { const killsValue = prompt( `Enter kill count for ${className}:`, "10000" ); if (killsValue === null) return; const numKills = Number(killsValue); if (isNaN(numKills)) { alert("Please enter a valid number!"); return; } const dbField = classMap[className]; updateClassKills(dbField, numKills); classSelectionDialog.remove(); }); classButtonContainer.appendChild(classBtn); }); classSelectionDialog.appendChild(classButtonContainer); const cancelBtn = document.createElement("button"); cancelBtn.textContent = "Cancel"; Object.assign(cancelBtn.style, { width: "100%", marginTop: "15px", padding: "8px", cursor: "pointer", backgroundColor: "#444", border: "none", borderRadius: "5px", color: "#fff", }); cancelBtn.addEventListener("click", () => classSelectionDialog.remove()); classSelectionDialog.appendChild(cancelBtn); let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; classSelectionDialog.onmousedown = dragMouseDown; function dragMouseDown(e) { if (e.target.tagName === "BUTTON" || e.target.tagName === "INPUT") { return; } e = e || window.event; e.preventDefault(); pos3 = e.clientX; pos4 = e.clientY; document.onmouseup = closeDragElement; document.onmousemove = elementDrag; } function elementDrag(e) { e = e || window.event; e.preventDefault(); pos1 = pos3 - e.clientX; pos2 = pos4 - e.clientY; pos3 = e.clientX; pos4 = e.clientY; classSelectionDialog.style.top = classSelectionDialog.offsetTop - pos2 + "px"; classSelectionDialog.style.left = classSelectionDialog.offsetLeft - pos1 + "px"; classSelectionDialog.style.transform = "none"; } function closeDragElement() { document.onmouseup = null; document.onmousemove = null; } document.body.appendChild(classSelectionDialog); } function updateClassKills(classField, killCount) { if (!firebase.auth().currentUser) { console.log("[Zeph Menu] User is not logged in"); return; } const updateData = {}; updateData[classField] = killCount; firebase .database() .ref(`users/${firebase.auth().currentUser.uid}`) .update(updateData) .then(() => { showUserDetails( firebase.auth().currentUser.email, firebase.auth().currentUser ); console.log( `[Zeph Menu] ${classField} successfully updated to ${killCount}` ); showUserDetails( firebase.auth().currentUser.email, firebase.auth().currentUser ); }) .catch((err) => { console.error(`[Zeph Menu] Failed to update ${classField}:`, err); }); } /*************************************** * Stats Changer ***************************************/ function updateKDStats(kills) { if (!firebase.auth().currentUser) { console.log("[Zeph Menu] User is not logged in"); alert("login first!"); return; } const updateData = { totalKills: kills, }; firebase .database() .ref(`users/${firebase.auth().currentUser.uid}`) .update(updateData) .then(() => { showUserDetails( firebase.auth().currentUser.email, firebase.auth().currentUser ); console.log( `[Zeph Menu] Stats updated to Kills:${kills}` ); }) .catch((err) => { console.error("[Zeph Menu] Failed to update stats:", err); }); } function setKDStats() { const kills = prompt("Enter new Total Kills:", "1337"); if (kills === null) return; const parsedKills = Number(kills); if (isNaN(parsedKills)) { alert("Please enter valid numbers for kills."); return; } updateKDStats(parsedKills); } /*************************************** * Air strafing ***************************************/ let spaceHeld = false; let turningLeft = false; let turningRight = false; let lastMoveTime = 0; const activeTimeout = 150; document.addEventListener('mousemove', e => { if (e.movementX < 0) { turningLeft = true; turningRight = false; } else if (e.movementX > 0) { turningRight = true; turningLeft = false; } lastMoveTime = Date.now(); }); document.addEventListener('keydown', e => { if (e.code === 'Space') spaceHeld = true; }); document.addEventListener('keyup', e => { if (e.code === 'Space') spaceHeld = false; }); function simulateKey(code, down = true) { const event = new KeyboardEvent(down ? 'keydown' : 'keyup', { code: code, key: code.replace('Key', ''), keyCode: code === 'KeyA' ? 65 : 68, which: code === 'KeyA' ? 65 : 68, bubbles: true, cancelable: true, }); document.dispatchEvent(event); } let aHeld = false; let dHeld = false; function loop() { const now = Date.now(); const mouseActive = (now - lastMoveTime) < activeTimeout; if (kourInstance.config.airStrafing){ if (spaceHeld && mouseActive) { if (turningLeft && !aHeld) { simulateKey('KeyA', true); aHeld = true; } else if (!turningLeft && aHeld) { simulateKey('KeyA', false); aHeld = false; } if (turningRight && !dHeld) { simulateKey('KeyD', true); dHeld = true; } else if (!turningRight && dHeld) { simulateKey('KeyD', false); dHeld = false; } } else { if (aHeld) { simulateKey('KeyA', false); aHeld = false; } if (dHeld) { simulateKey('KeyD', false); dHeld = false; } } requestAnimationFrame(loop); } } loop(); /*************************************** * ESP ***************************************/ let gl = null; const filters = [ { min: 1481, max: 1483 }, // normal { min: 1553, max: 1555 }, // princess { min: 5615, max: 5617 }, // RTX { min: 3875, max: 3877 }, // Egg //{ min: 239, max: 240}, // Map Secret ]; window.espEnabled = true; window.addEventListener("keydown", (e) => { if (e.key.toLowerCase() === "p") { window.espEnabled = !window.espEnabled; const espCheckbox = document.getElementById("espToggle"); if (espCheckbox) espCheckbox.checked = window.espEnabled; console.log(`[Zeph ESP] Toggled ${window.espEnabled ? "ON" : "OFF"}`); } }); const WebGL = WebGL2RenderingContext.prototype; HTMLCanvasElement.prototype.getContext = new Proxy( HTMLCanvasElement.prototype.getContext, { apply(target, thisArgs, args) { if (args[1]) { args[1].preserveDrawingBuffer = true; } return Reflect.apply(...arguments); }, } ); try { window.espColor = JSON.parse(localStorage.getItem("espColorRGB")) || { r: 0, g: 0, b: 0 }; } catch { window.espColor = { r: 0, g: 0, b: 0 }; } const drawHandler = { apply(target, thisArgs, args) { const count = args[1]; const blockarms = document.getElementById("blockarms"); if (count === 300 && settings.crosshairEnabled) { return; } if (count === 24 && settings.damagenumbersoff) { return; } if (blockarms && blockarms.checked && count === 1098) { return; } const program = thisArgs.getParameter(thisArgs.CURRENT_PROGRAM); if (!program.uniforms) { program.uniforms = { vertexCount: thisArgs.getUniformLocation(program, "vertexCount"), espToggle: thisArgs.getUniformLocation(program, "espToggle"), gnilgnim: thisArgs.getUniformLocation(program, "gnilgnim"), espColor: thisArgs.getUniformLocation(program, "espColor"), }; } if (program.uniforms.vertexCount) { thisArgs.uniform1f(program.uniforms.vertexCount, count); } if (program.uniforms.espToggle) { thisArgs.uniform1f(program.uniforms.espToggle, window.espEnabled ? 1.0 : 0.0); } if (program.uniforms.gnilgnim) { thisArgs.uniform1f(program.uniforms.gnilgnim, 13371337.0); } if (program.uniforms.espColor && window.espColor) { const { r, g, b } = window.espColor; thisArgs.uniform3f(program.uniforms.espColor, r / 255, g / 255, b / 255); } gl = thisArgs; return Reflect.apply(...arguments); }, }; WebGL.drawElements = new Proxy(WebGL.drawElements, drawHandler); WebGL.drawElementsInstanced = new Proxy(WebGL.drawElementsInstanced, drawHandler); function generateRangeConditions(varName) { return filters .map(({ min, max }) => `(${varName} >= ${min}.0 && ${varName} <= ${max}.0)`) .join(" || "); } WebGL.shaderSource = new Proxy(WebGL.shaderSource, { apply(target, thisArgs, args) { let [shader, src] = args; if (src.includes("gl_Position")) { const conditions = generateRangeConditions("vertexCount"); src = src.replace( /void\s+main\s*\(\s*\)\s*\{/, `uniform float vertexCount;\nuniform float espToggle;\nuniform float gnilgnim;\nout float vVertexCount;\nuniform vec3 espColor;\nvoid main() {\nvVertexCount = vertexCount;\n` ); src = src.replace( /(gl_Position\s*=.+;)/, `$1\nif (espToggle > 0.5 && (${conditions})) {\n gl_Position.z = 0.01 + gl_Position.z * 0.1;\n}\nif (espToggle > 0.5 && gnilgnim == 13371337.0) {\n gl_Position.z *= 1.0;\n}` ); } if (src.includes("SV_Target0")) { const conditions = generateRangeConditions("vVertexCount"); src = src .replace( /void\s+main\s*\(\s*\)\s*\{/, `uniform float espToggle;\nuniform float gnilgnim;\nin float vVertexCount;\nuniform vec3 espColor;\nvoid main() {` ) .replace( /return;/, `if (espToggle > 0.5 && (${conditions}) && SV_Target0.a > 0.5) {\n SV_Target0 = vec4(espColor, 1.0);\n}\nif (gnilgnim == 13371337.0) {\n SV_Target0.rgb *= 1.0;\n}\nreturn;` ); } args[1] = src; return Reflect.apply(...arguments); }, }); /*************************************** * Color Aimbot ***************************************/ let fovCircleEnabled = true; const fovCanvas = document.createElement('canvas'); fovCanvas.style.position = 'fixed'; fovCanvas.style.top = '0'; fovCanvas.style.left = '0'; fovCanvas.style.pointerEvents = 'none'; fovCanvas.style.zIndex = '9999'; document.body.appendChild(fovCanvas); const fovCtx = fovCanvas.getContext('2d'); function resizeCanvas() { fovCanvas.width = window.innerWidth; fovCanvas.height = window.innerHeight; } resizeCanvas(); window.addEventListener('resize', resizeCanvas); const fovRadius = 80; function drawFOVCircle() { fovCtx.clearRect(0, 0, fovCanvas.width, fovCanvas.height); if (!fovCircleEnabled) return; const centerX = fovCanvas.width / 2; const centerY = fovCanvas.height / 2; fovCtx.beginPath(); fovCtx.arc(centerX, centerY, fovRadius, 0, Math.PI * 2); fovCtx.strokeStyle = 'rgba(0, 255, 0, 0.6)'; fovCtx.lineWidth = 2; fovCtx.stroke(); } const settings = { aimbotEnabled: true, aimbotSpeed: 1.2, aimbotTriggerButton: ['left', 'right'], crosshairEnabled: false, triggerbotEnabled: true, damagenumbersoff: false, }; let mouseButtons = { left: false, right: false}; document.addEventListener("mousedown", (e) => { if (e.button === 0) mouseButtons.left = true; if (e.button === 2) mouseButtons.right = true; }); document.addEventListener("mouseup", (e) => { if (e.button === 0) mouseButtons.left = false; if (e.button === 2) mouseButtons.right = false; }); function isTriggerPressed() { return settings.aimbotTriggerButton.some(btn => mouseButtons[btn]); } function isTargetPixel(r, g, b, a, t, c) { if (a === 0) return false; const dr = r - c.r; const dg = g - c.g; const db = b - c.b; return (dr * dr + dg * dg + db * db) <= (t * t); } function updateAimbot() { drawFOVCircle(); if (!settings.aimbotEnabled || !gl || !gl.canvas || !gl.readPixels || !isTriggerPressed()) return; const width = Math.min(150, gl.canvas?.width || 0); const height = Math.min(150, gl.canvas?.height || 0); if (width < 10 || height < 10) { return; } const t = 20; const c = window.espColor; const centerX = gl.canvas.width / 2; const centerY = gl.canvas.height / 2; const startX = Math.floor(centerX - width / 2); const startY = Math.floor(centerY - height / 2); const pixels = new Uint8Array(width * height * 4); gl.readPixels(startX, startY, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); let closestDist = Infinity; let bestDX = 0; let bestDY = 0; let targetCount = 0; //console.log(window.espColor); for (let i = 0; i < pixels.length; i += 4) { const r = pixels[i], g = pixels[i + 1], b = pixels[i + 2], a = pixels[i + 3]; if (isTargetPixel(r, g, b, a, t, c)) { targetCount++; const index = i / 4; const x = index % width; const y = Math.floor(index / width); const dx = startX + x - centerX; const dy = -(startY + y - centerY); const dist = Math.hypot(dx, dy); if (fovCircleEnabled) { if (dist > fovRadius) continue; } const gnilgnim = "signature Start X - Y"; if (dist < closestDist) { closestDist = dist; bestDX = dx; bestDY = dy; } } } if (closestDist < Infinity) { //console.log("moving"); const factor = settings.aimbotSpeed; gl.canvas.dispatchEvent(new MouseEvent("mousemove", { movementX: bestDX * factor, movementY: bestDY * factor, bubbles: true, cancelable: true, composed: true, })); } } setInterval(updateAimbot, 0); function createUI() { const menu = document.createElement("div"); menu.id = "zephMenu"; Object.assign(menu.style, { position: "fixed", top: "50px", right: "50px", width: "250px", maxHeight: "600px", overflowY: "auto", backgroundColor: "#5a2d72", color: "#fff", padding: "15px", zIndex: "10000", fontFamily: "Arial, sans-serif", fontSize: "16px", borderRadius: "8px", boxShadow: "0 4px 8px rgba(0,0,0,0.2)", display: "none", transition: "all 0.3s ease-in-out", }); const secondaryWeaponMenu = createWeaponMenu("Secondary Weapon", false); const meleeWeaponMenu = createWeaponMenu("Melee Weapon", true); const skinMenu = createSkinMenu(); const profileModderMenu = document.createElement("div"); profileModderMenu.id = "zephProfileModderMenu"; Object.assign(profileModderMenu.style, { position: "fixed", top: "50px", right: "320px", width: "220px", backgroundColor: "#5a2d72", color: "#fff", padding: "15px", zIndex: "10000", fontFamily: "Arial, sans-serif", fontSize: "14px", borderRadius: "8px", boxShadow: "0 4px 8px rgba(0,0,0,0.2)", display: "none", transition: "all 0.3s ease-in-out", }); const profileHeader = document.createElement("div"); profileHeader.textContent = "Profile Modder"; profileHeader.style.textAlign = "center"; profileHeader.style.fontWeight = "bold"; profileHeader.style.marginBottom = "10px"; profileModderMenu.appendChild(profileHeader); const buttonContainer = document.createElement("div"); Object.assign(buttonContainer.style, { maxHeight: "400px", overflowY: "auto", }); profileModderMenu.appendChild(buttonContainer); function createStyledButton(text, onClick) { const btn = document.createElement("button"); btn.textContent = text; Object.assign(btn.style, { width: "100%", margin: "5px 0", padding: "8px", cursor: "pointer", backgroundColor: "#9b3e9f", border: "none", borderRadius: "5px", fontSize: "14px", color: "#fff", transition: "background-color 0.3s", }); btn.addEventListener("click", onClick); btn.addEventListener("mouseover", () => (btn.style.backgroundColor = "#a74cbf")); btn.addEventListener("mouseout", () => (btn.style.backgroundColor = "#9b3e9f")); buttonContainer.appendChild(btn); } createStyledButton("Set Class Kills", setClassKills); createStyledButton("Change Kills", setKDStats); const statMappings = [ { label: "ELO", key: "elo" }, { label: "Chickalettas Killed", key: "chickalettasKilled" }, //{ label: "Deaths", key: "totalDeaths" }, // dont we wish LOL { label: "Games Played", key: "gamesPlayed" }, { label: "Games Won", key: "gamesWon" }, //{ label: "Games Lost", key: "gamesLost" }, //could be possible i just cant lose a game LOL { label: "Knife Kills", key: "knifeKills" }, { label: "Assists", key: "assists" }, { label: "Highest Kill Streak", key: "maxKillStreak" }, { label: "Barrels Shot", key: "barrels" }, { label: "Kyles Killed", key: "kylesKilled" }, ]; function createStatButton(label, key) { createStyledButton(`Change ${label}`, () => { const newValue = prompt(`Enter new value for ${label}:`); if (newValue !== null) { setStat(key, newValue); } }); } statMappings.forEach(({ label, key }) => { createStatButton(label, key); }); const headerContainer = document.createElement("div"); headerContainer.style.marginBottom = "15px"; headerContainer.style.position = "relative"; const madeByText = document.createElement("div"); madeByText.textContent = "Made by: Happyjeffery, Rasperiiii, suppress"; madeByText.style.fontSize = "10px"; madeByText.style.textAlign = "center"; madeByText.style.marginBottom = "5px"; madeByText.style.fontWeight = "bold"; madeByText.style.letterSpacing = "0.5px"; let hue = 0; function updateRGB() { hue = (hue + 1) % 360; madeByText.style.color = `hsl(${hue}, 100%, 70%)`; requestAnimationFrame(updateRGB); } updateRGB(); headerContainer.appendChild(madeByText); const titleContainer = document.createElement("div"); titleContainer.style.display = "flex"; titleContainer.style.alignItems = "center"; titleContainer.style.justifyContent = "center"; titleContainer.style.gap = "8px"; const header = document.createElement("div"); header.textContent = "Zeph Menu"; header.style.fontWeight = "bold"; header.style.fontSize = "20px"; const discordLogo = document.createElement("img"); discordLogo.src = "https://i.ibb.co/sJV6y56H/Zeph-Menu-Discordlogo.png"; discordLogo.alt = "Discord Logo"; discordLogo.style.width = "22px"; discordLogo.style.height = "22px"; discordLogo.style.cursor = "pointer"; discordLogo.style.transition = "all 0.2s ease"; discordLogo.style.borderRadius = "4px"; discordLogo.addEventListener("click", () => window.open("https://discord.gg/3XCAwXdRUh", "_blank")); discordLogo.addEventListener("mouseover", () => { discordLogo.style.transform = "scale(1.1) rotate(2deg)"; discordLogo.style.filter = "brightness(1.2) drop-shadow(0 0 2px rgba(255,255,255,0.3))"; }); discordLogo.addEventListener("mouseout", () => { discordLogo.style.transform = "scale(1) rotate(0deg)"; discordLogo.style.filter = "none"; }); titleContainer.appendChild(header); titleContainer.appendChild(discordLogo); headerContainer.appendChild(titleContainer); menu.appendChild(headerContainer); const profileModderBtn = document.createElement("button"); profileModderBtn.textContent = "Profile Modder"; Object.assign(profileModderBtn.style, { width: "100%", margin: "8px 0", padding: "8px", cursor: "pointer", backgroundColor: "#9b3e9f", border: "none", borderRadius: "5px", fontSize: "14px", color: "#fff", transition: "background-color 0.3s", }); profileModderBtn.addEventListener("click", () => { profileModderMenu.style.display = profileModderMenu.style.display === "none" ? "block" : "none"; secondaryWeaponMenu.style.display = "none"; meleeWeaponMenu.style.display = "none"; skinMenu.style.display = "none"; }); profileModderBtn.addEventListener("mouseover", () => (profileModderBtn.style.backgroundColor = "#a74cbf")); profileModderBtn.addEventListener("mouseout", () => (profileModderBtn.style.backgroundColor = "#9b3e9f")); menu.appendChild(profileModderBtn); const secondaryWeaponBtn = document.createElement("button"); secondaryWeaponBtn.textContent = "Set Secondary Weapon"; Object.assign(secondaryWeaponBtn.style, { width: "100%", margin: "8px 0", padding: "8px", cursor: "pointer", backgroundColor: "#53277E", border: "none", borderRadius: "5px", fontSize: "14px", color: "#fff", transition: "background-color 0.3s", }); secondaryWeaponBtn.addEventListener("click", () => { secondaryWeaponMenu.style.display = secondaryWeaponMenu.style.display === "none" ? "block" : "none"; meleeWeaponMenu.style.display = "none"; profileModderMenu.style.display = "none"; skinMenu.style.display = "none"; }); secondaryWeaponBtn.addEventListener("mouseover", () => (secondaryWeaponBtn.style.backgroundColor = "#6a359c")); secondaryWeaponBtn.addEventListener("mouseout", () => (secondaryWeaponBtn.style.backgroundColor = "#53277E")); menu.appendChild(secondaryWeaponBtn); const meleeWeaponBtn = document.createElement("button"); meleeWeaponBtn.textContent = "Set Melee Weapon"; Object.assign(meleeWeaponBtn.style, { width: "100%", margin: "8px 0", padding: "8px", cursor: "pointer", backgroundColor: "#53277E", border: "none", borderRadius: "5px", fontSize: "14px", color: "#fff", transition: "background-color 0.3s", }); meleeWeaponBtn.addEventListener("click", () => { meleeWeaponMenu.style.display = meleeWeaponMenu.style.display === "none" ? "block" : "none"; secondaryWeaponMenu.style.display = "none"; profileModderMenu.style.display = "none"; }); meleeWeaponBtn.addEventListener("mouseover", () => (meleeWeaponBtn.style.backgroundColor = "#6a359c")); meleeWeaponBtn.addEventListener("mouseout", () => (meleeWeaponBtn.style.backgroundColor = "#53277E")); menu.appendChild(meleeWeaponBtn); const skinBtn = document.createElement("button"); skinBtn.textContent = "Set Skin"; Object.assign(skinBtn.style, { width: "100%", margin: "8px 0", padding: "8px", cursor: "pointer", backgroundColor: "#53277E", border: "none", borderRadius: "5px", fontSize: "14px", color: "#fff", transition: "background-color 0.3s", }); skinBtn.addEventListener("click", () => { meleeWeaponMenu.style.display = "none"; secondaryWeaponMenu.style.display = "none"; profileModderMenu.style.display = "none"; skinMenu.style.display = skinMenu.style.display === "none" ? "block" : "none"; }); skinBtn.addEventListener("mouseover", () => (skinBtn.style.backgroundColor = "#6a359c")); skinBtn.addEventListener("mouseout", () => (skinBtn.style.backgroundColor = "#53277E")); menu.appendChild(skinBtn); const speedContainer = document.createElement("div"); speedContainer.style.margin = "15px 0"; const speedLabel = document.createElement("label"); speedLabel.textContent = "Speed Hack Multiplier: "; speedContainer.appendChild(speedLabel); const speedValue = document.createElement("span"); speedValue.textContent = "1x"; speedContainer.appendChild(speedValue); const speedSlider = document.createElement("input"); speedSlider.type = "range"; speedSlider.min = "1"; speedSlider.max = "6"; speedSlider.step = "0.5"; speedSlider.value = "1"; speedSlider.style.width = "100%"; speedSlider.addEventListener("input", function() { let multiplier = parseFloat(speedSlider.value); speedValue.textContent = multiplier.toFixed(1) + "x"; updatePerformanceNow(multiplier); }); speedContainer.appendChild(speedSlider); menu.appendChild(speedContainer); const airContainer = document.createElement("div"); const airCheckbox = document.createElement("input"); airCheckbox.type = "checkbox"; airCheckbox.id = "airToggle"; airCheckbox.checked = kourInstance.config.airStrafing; airCheckbox.addEventListener("change", function() { kourInstance.config.airStrafing = this.checked; }); const airLabel = document.createElement("label"); airLabel.htmlFor = "airToggle"; airLabel.textContent = " Air Strafing"; airContainer.appendChild(airCheckbox); airContainer.appendChild(airLabel); menu.appendChild(airContainer); const aimContainer = document.createElement("div"); const aimCheckbox = document.createElement("input"); aimCheckbox.type = "checkbox"; aimCheckbox.id = "aimToggle"; aimCheckbox.checked = kourInstance.config.AntiAim; aimCheckbox.addEventListener("change", function() { kourInstance.config.AntiAim = this.checked; }); const aimLabel = document.createElement("label"); aimLabel.htmlFor = "aimToggle"; aimLabel.textContent = " AntiPlayer (Turn off invis in lobby)"; aimContainer.appendChild(aimCheckbox); aimContainer.appendChild(aimLabel); menu.appendChild(aimContainer); const invisContainer = document.createElement("div"); const invisCheckbox = document.createElement("input"); invisCheckbox.type = "checkbox"; invisCheckbox.id = "invisToggle"; invisCheckbox.checked = kourInstance.config.Invisible; invisCheckbox.addEventListener("change", function() { kourInstance.config.Invisible = this.checked; console.log("Invisibility set to " + this.checked); }); const invisLabel = document.createElement("label"); invisLabel.htmlFor = "invisToggle"; invisLabel.textContent = " Invisible"; invisContainer.appendChild(invisCheckbox); invisContainer.appendChild(invisLabel); menu.appendChild(invisContainer); const blockarmsContainer = document.createElement("div"); const blockarmsCheckbox = document.createElement("input"); blockarmsCheckbox.type = "checkbox"; blockarmsCheckbox.id = "blockarms"; blockarmsCheckbox.checked = true; const blockarmsLabel = document.createElement("label"); blockarmsLabel.htmlFor = "blockarms"; blockarmsLabel.textContent = " Hide Arms"; blockarmsContainer.appendChild(blockarmsCheckbox); blockarmsContainer.appendChild(blockarmsLabel); menu.appendChild(blockarmsContainer); function hexToRgb(hex) { const bigint = parseInt(hex.slice(1), 16); return { r: (bigint >> 16) & 255, g: (bigint >> 8) & 255, b: bigint & 255 }; } const espContainer = document.createElement("div"); const espCheckbox = document.createElement("input"); espCheckbox.type = "checkbox"; espCheckbox.id = "espToggle"; espCheckbox.checked = window.espEnabled || false; espCheckbox.addEventListener("change", function() { window.espEnabled = this.checked; console.log("[Zeph ESP] Toggled " + (this.checked ? "ON" : "OFF")); }); const espColorContainer = document.createElement("div"); espColorContainer.style.marginTop = "8px"; espColorContainer.style.display = "flex"; espColorContainer.style.alignItems = "center"; espColorContainer.style.gap = "8px"; const espColorLabel = document.createElement("label"); espColorLabel.htmlFor = "espColorPicker"; espColorLabel.textContent = "ESP Color:"; espColorLabel.style.flexShrink = "0"; let savedRgb = localStorage.getItem("espColorRGB"); if (savedRgb) { try { window.espColor = JSON.parse(savedRgb); } catch { window.espColor = { r: 0, g: 0, b: 0 }; } } else { window.espColor = { r: 0, g: 0, b: 0 }; } const espColorPicker = document.createElement("input"); espColorPicker.type = "color"; espColorPicker.id = "espColorPicker"; espColorPicker.value = `#${((1 << 24) + (window.espColor.r << 16) + (window.espColor.g << 8) + window.espColor.b).toString(16).slice(1)}`; espColorPicker.addEventListener("input", (e) => { const rgb = hexToRgb(e.target.value); window.espColor = rgb; localStorage.setItem("espColorRGB", JSON.stringify(rgb)); }); espColorContainer.appendChild(espColorLabel); espColorContainer.appendChild(espColorPicker); menu.appendChild(espColorContainer); const espLabel = document.createElement("label"); espLabel.htmlFor = "espToggle"; espLabel.textContent = " ESP"; espContainer.appendChild(espCheckbox); espContainer.appendChild(espLabel); menu.appendChild(espContainer); const crosshairContainer = document.createElement("div"); const crosshairCheckbox = document.createElement("input"); crosshairCheckbox.type = "checkbox"; crosshairCheckbox.id = "crosshairToggle"; crosshairCheckbox.checked = settings.crosshairEnabled; crosshairCheckbox.addEventListener("change", function() { settings.crosshairEnabled = this.checked; }); const crosshairLabel = document.createElement("label"); crosshairLabel.htmlFor = "crosshairToggle"; crosshairLabel.textContent = " Hide crosshair"; crosshairContainer.appendChild(crosshairCheckbox); crosshairContainer.appendChild(crosshairLabel); menu.appendChild(crosshairContainer); const aimbotContainer = document.createElement("div"); const aimbotCheckbox = document.createElement("input"); aimbotCheckbox.type = "checkbox"; aimbotCheckbox.id = "aimbotToggle"; aimbotCheckbox.checked = settings.aimbotEnabled; aimbotCheckbox.addEventListener("change", function() { settings.aimbotEnabled = this.checked; console.log("aimbot set to " + this.checked); }); const aimbotLabel = document.createElement("label"); aimbotLabel.htmlFor = "aimbotToggle"; aimbotLabel.textContent = " Aimbot"; aimbotContainer.appendChild(aimbotCheckbox); aimbotContainer.appendChild(aimbotLabel); menu.appendChild(aimbotContainer); const fovContainer = document.createElement("div"); const fovCheckbox = document.createElement("input"); fovCheckbox.type = "checkbox"; fovCheckbox.id = "fovToggle"; fovCheckbox.checked = fovCircleEnabled; fovCheckbox.addEventListener("change", () => { fovCircleEnabled = fovCheckbox.checked; }); const fovLabel = document.createElement("label"); fovLabel.htmlFor = "fovToggle"; fovLabel.textContent = " FOV Circle"; fovContainer.appendChild(fovCheckbox); fovContainer.appendChild(fovLabel); menu.appendChild(fovContainer); const savedName = localStorage.getItem("playerNickname") || ""; const nameButton = document.createElement("button"); nameButton.textContent = "Edit Name"; Object.assign(nameButton.style, { marginTop: "10px", padding: "5px 10px", backgroundColor: "#7b3fa0", color: "#fff", border: "none", borderRadius: "5px", cursor: "pointer", display: "block" }); nameButton.addEventListener("click", () => { const newName = prompt("Enter your nickname:", savedName); if (newName !== null && newName.trim() !== "") { localStorage.setItem("playerNickname", newName.trim()); if (window.location.href.includes("#")) { unityInstance.SendMessage("MapScripts", "SetNickname", newName.trim()); } } }); menu.appendChild(nameButton); let savedClass = localStorage.getItem("selectedClass"); const classBtn = document.createElement("button"); classBtn.textContent = "Select Class"; Object.assign(classBtn.style, { marginTop: "10px", padding: "5px 10px", backgroundColor: "#7b3fa0", color: "#fff", border: "none", borderRadius: "5px", cursor: "pointer" }); const classDropdown = document.createElement("div"); Object.assign(classDropdown.style, { display: "none", marginTop: "10px", backgroundColor: "#673a91", padding: "10px", borderRadius: "8px" }); const classMap = { "Soldier": 0, "Hitman": 1, "Gunner": 2, "Heavy": 3, "Rocketeer": 4, "Agent": 5, "Brawler": 6, "Investor": 7, "Assassin": 8, "Juggernaut": 9, "Recon": 10, "Pyro": 11, "Rayblader": 12 }; Object.keys(classMap).forEach(cls => { const classOption = document.createElement("button"); classOption.textContent = cls; Object.assign(classOption.style, { display: "block", width: "100%", margin: "5px 0", padding: "5px", backgroundColor: "#9b3e9f", color: "#fff", border: "none", borderRadius: "4px", cursor: "pointer", }); classOption.addEventListener("click", () => { const classID = classMap[cls]; localStorage.setItem("selectedClass", classID); unityInstance.SendMessage("MapScripts", "ChangeClassTo", classID); classDropdown.style.display = "none"; }); classDropdown.appendChild(classOption); }); classBtn.addEventListener("click", () => { classDropdown.style.display = classDropdown.style.display === "none" ? "block" : "none"; }); menu.appendChild(classBtn); menu.appendChild(classDropdown); const keybindBtn = document.createElement("button"); keybindBtn.textContent = "Keybind Settings"; Object.assign(keybindBtn.style, { marginTop: "10px", padding: "5px 10px", backgroundColor: "#7b3fa0", color: "#fff", border: "none", borderRadius: "5px", cursor: "pointer" }); keybindBtn.addEventListener("click", () => { keybindMenu.style.display = keybindMenu.style.display === "none" ? "block" : "none"; }); const keybindMenu = document.createElement("div"); Object.assign(keybindMenu.style, { display: "none", marginTop: "10px", padding: "10px", backgroundColor: "#673a91", borderRadius: "8px" }); const toggleLabel = document.createElement("label"); toggleLabel.textContent = "Toggle Menu Key: "; toggleLabel.style.marginRight = "5px"; const toggleInput = document.createElement("input"); toggleInput.type = "text"; toggleInput.value = keybinds.toggleMenu; toggleInput.maxLength = 10; toggleInput.style.width = "60px"; toggleInput.addEventListener("keydown", (e) => { e.preventDefault(); // Don't type into box toggleInput.value = e.key; keybinds.toggleMenu = e.key; localStorage.setItem("zephKeybinds", JSON.stringify(keybinds)); }); keybindMenu.appendChild(toggleLabel); keybindMenu.appendChild(toggleInput); menu.appendChild(keybindBtn); menu.appendChild(keybindMenu); const style = document.createElement("style"); style.textContent = ` @keyframes fadeInOut { 0% { opacity: 0; } 10% { opacity: 1; } 90% { opacity: 1; } 100% { opacity: 0; } } @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } @keyframes flashRed { 0% { color: #FF3C3C; } 50% { color: #FFFFFF; } 100% { color: #FF3C3C; } } `; document.head.appendChild(style); document.body.appendChild(menu); document.body.appendChild(secondaryWeaponMenu); document.body.appendChild(meleeWeaponMenu); document.body.appendChild(profileModderMenu); document.body.appendChild(skinMenu); } function createSkinMenu() { const skinMenu = document.createElement("div"); skinMenu.id = `zephSkinMenu`; Object.assign(skinMenu.style, { position: "fixed", top: "50px", right: "320px", width: "250px", maxHeight: "400px", overflowY: "auto", backgroundColor: "#5a2d72", color: "#fff", padding: "15px", zIndex: "10000", fontFamily: "Arial, sans-serif", fontSize: "14px", borderRadius: "8px", boxShadow: "0 4px 8px rgba(0,0,0,0.2)", display: "none", transition: "all 0.3s ease-in-out", }); const skinHeader = document.createElement("div"); skinHeader.textContent = "Skin"; skinHeader.style.textAlign = "center"; skinHeader.style.fontWeight = "bold"; skinHeader.style.marginBottom = "10px"; skinMenu.appendChild(skinHeader); skins.forEach((skin) => { const btn = document.createElement("button"); btn.textContent = `${skin.name} (${skin.id})`; Object.assign(btn.style, { width: "100%", margin: "5px 0", padding: "5px", cursor: "pointer", backgroundColor: "#9b3e9f", border: "none", borderRadius: "5px", fontSize: "12px", color: "#fff", transition: "background-color 0.3s", }); btn.addEventListener("click", () => { setSkin(skin.id); skinMenu.style.display = "none"; }); btn.addEventListener( "mouseover", () => (btn.style.backgroundColor = "#a74cbf") ); btn.addEventListener( "mouseout", () => (btn.style.backgroundColor = "#9b3e9f") ); skinMenu.appendChild(btn); }); return skinMenu; } function createWeaponMenu(title, isMelee) { const weaponMenu = document.createElement("div"); weaponMenu.id = `zeph${isMelee ? "Melee" : "Secondary"}WeaponMenu`; Object.assign(weaponMenu.style, { position: "fixed", top: "50px", right: "320px", width: "250px", maxHeight: "400px", overflowY: "auto", backgroundColor: "#5a2d72", color: "#fff", padding: "15px", zIndex: "10000", fontFamily: "Arial, sans-serif", fontSize: "14px", borderRadius: "8px", boxShadow: "0 4px 8px rgba(0,0,0,0.2)", display: "none", transition: "all 0.3s ease-in-out", }); const weaponHeader = document.createElement("div"); weaponHeader.textContent = title; weaponHeader.style.textAlign = "center"; weaponHeader.style.fontWeight = "bold"; weaponHeader.style.marginBottom = "10px"; weaponMenu.appendChild(weaponHeader); weapons.forEach((weapon) => { const btn = document.createElement("button"); btn.textContent = `${weapon.name} (${weapon.id})`; Object.assign(btn.style, { width: "100%", margin: "5px 0", padding: "5px", cursor: "pointer", backgroundColor: "#9b3e9f", border: "none", borderRadius: "5px", fontSize: "12px", color: "#fff", transition: "background-color 0.3s", }); btn.addEventListener("click", () => { if (isMelee) { setMeleeWeapon(weapon.id); } else { setSecondaryWeapon(weapon.id); } weaponMenu.style.display = "none"; }); btn.addEventListener( "mouseover", () => (btn.style.backgroundColor = "#a74cbf") ); btn.addEventListener( "mouseout", () => (btn.style.backgroundColor = "#9b3e9f") ); weaponMenu.appendChild(btn); }); return weaponMenu; } window.addEventListener("keydown", (e) => { if (e.key.toLowerCase() === "v") { const savedClassID = localStorage.getItem("selectedClass"); if ( savedClassID !== null && window.location.href.includes("#") ) { unityInstance.SendMessage("MapScripts", "ChangeClassTo", parseInt(savedClassID)); } } }); /*************************************** * Keybinds ***************************************/ let lastHash = window.location.hash; setInterval(() => { const currentHash = window.location.hash; // Only run if hash has changed AND there's a # in the URL if (currentHash !== lastHash && currentHash.includes("#")) { lastHash = currentHash; const storedName = localStorage.getItem("playerNickname"); if (storedName) { unityInstance.SendMessage("MapScripts", "SetNickname", storedName); } } }, 500); let keybinds = { toggleMenu: "o", } const savedKeybinds = localStorage.getItem("zephKeybinds"); if (savedKeybinds) { try { keybinds = JSON.parse(savedKeybinds); } catch {} } document.addEventListener("keydown", function (e) { if (e.key === keybinds.toggleMenu && !e.target.matches("input, textarea")) { const menu = document.getElementById("zephMenu"); if (menu) { const isClosing = menu.style.display !== "none"; menu.style.display = isClosing ? "none" : "block"; if (isClosing) { document.getElementById("zephSecondaryWeaponMenu").style.display = "none"; document.getElementById("zephMeleeWeaponMenu").style.display = "none"; document.getElementById("zephProfileModderMenu").style.display = "none"; document.getElementById("zephSkinMenu").style.display = "none"; } } } }); window.addEventListener("load", createUI); })();