您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A premium cheat client for Voxiom.io developed by Emulation, featuring advanced in-game mods and enhancements.
// ==UserScript== // @name Voxiom.io Emulation Premium Cheat Client // @namespace http://tampermonkey.net/ // @version 1.0 // @description A premium cheat client for Voxiom.io developed by Emulation, featuring advanced in-game mods and enhancements. // @author Emulation // @match https://voxiom.io/* // @icon https://www.google.com/s2/favicons?sz=64&domain=voxiom.io // @grant none // @license MIT // ==/UserScript== (function() { // Settings const prototype_ = { player: { opacity: 1, wireframe: false, seeThroughWalls: false, meshType: 'Normal', animationSpeed: 1, baseHue: 0, emissiveIntensity: 0.5, crosshairType: 'None', crosshairSize: 20, crosshairGap: 5, crosshairColor: '#00f0ff', notifications: true, modStatus: true, menuOpacity: 1.0, fov: 90, noFog: false, theme: localStorage.getItem('theme') || 'obsidian-black', menuPosition: JSON.parse(localStorage.getItem('menuPosition')) || { left: '50%', top: '50%' }, menuVisible: localStorage.getItem('menuVisible') !== 'false', menuMinimized: false } }; const playerMaterials = new Set(); let notificationTimeout = null; const clientVersion = '2.0.0'; let menuVisible = prototype_.player.menuVisible; let camera, scene; const notifications = []; // Save settings function saveSettings() { localStorage.setItem('theme', prototype_.player.theme); localStorage.setItem('menuPosition', JSON.stringify(prototype_.player.menuPosition)); localStorage.setItem('menuVisible', menuVisible); localStorage.setItem('menuMinimized', prototype_.player.menuMinimized); localStorage.setItem('settings', JSON.stringify({ opacity: prototype_.player.opacity, wireframe: prototype_.player.wireframe, seeThroughWalls: prototype_.player.seeThroughWalls, meshType: prototype_.player.meshType, animationSpeed: prototype_.player.animationSpeed, baseHue: prototype_.player.baseHue, emissiveIntensity: prototype_.player.emissiveIntensity, crosshairType: prototype_.player.crosshairType, crosshairSize: prototype_.player.crosshairSize, crosshairGap: prototype_.player.crosshairGap, crosshairColor: prototype_.player.crosshairColor, notifications: prototype_.player.notifications, modStatus: prototype_.player.modStatus, menuOpacity: prototype_.player.menuOpacity, fov: prototype_.player.fov, noFog: prototype_.player.noFog })); } // Load settings const savedSettings = localStorage.getItem('settings'); if (savedSettings) { Object.assign(prototype_.player, JSON.parse(savedSettings)); } // Show notification function showNotification(message) { if (!prototype_.player.notifications) return; const notification = document.createElement('div'); notification.className = 'notification tooltip'; notification.textContent = message; notification.style.position = 'fixed'; notification.style.bottom = `${20 + notifications.length * 40}px`; notification.style.right = '20px'; notification.style.background = 'var(--bg-gradient)'; notification.style.border = '1px solid var(--accent-color)'; notification.style.color = 'var(--text-color)'; notification.style.padding = '6px 12px'; notification.style.borderRadius = '5px'; notification.style.boxShadow = '0 4px 15px var(--accent-shadow)'; notification.style.opacity = '0'; notification.style.transition = 'opacity 0.3s ease, transform 0.3s ease'; notification.style.transform = 'translateX(20px)'; notification.style.zIndex = '999997'; notification.style.fontFamily = '"Inter", sans-serif'; notification.style.fontSize = '11px'; notification.style.backdropFilter = 'blur(12px)'; document.body.appendChild(notification); notifications.push(notification); setTimeout(() => { notification.style.opacity = '1'; notification.style.transform = 'translateX(0)'; }, 10); setTimeout(() => { notification.style.opacity = '0'; notification.style.transform = 'translateX(20px)'; setTimeout(() => { notification.remove(); notifications.splice(notifications.indexOf(notification), 1); notifications.forEach((n, i) => { n.style.bottom = `${20 + i * 40}px`; }); }, 300); }, 2500); if (notificationTimeout) clearTimeout(notificationTimeout); notificationTimeout = setTimeout(() => {}, 100); } // Patch Array.push const originalPush = Array.prototype.push; Array.prototype.push = function(...args) { try { for (const obj of args) { const mat = obj?.material; if (!mat || mat.type !== "MeshBasicMaterial") continue; mat.transparent = true; playerMaterials.add(mat); applyMeshType(mat); if (!camera && obj.camera) { camera = obj.camera; applyFOV(); } if (!scene && obj.scene) { scene = obj.scene; applyFog(); } } } catch (e) { console.error("[EMULATION'S PREMIUM] Material hook error:", e); showNotification("Warning: Material hooking failed"); } return originalPush.apply(this, args); }; // Apply chams function applyChamsSettings() { try { playerMaterials.forEach(mat => { if (!mat) return; mat.opacity = prototype_.player.opacity; mat.wireframe = prototype_.player.wireframe; mat.transparent = true; mat.side = 2; if (prototype_.player.seeThroughWalls) { mat.depthTest = false; mat.depthFunc = 7; } else { mat.depthTest = true; mat.depthFunc = 3; } applyMeshType(mat); }); applyFOV(); applyFog(); updateStatus(); drawCrosshair(); } catch (e) { console.error("[EMULATION'S PREMIUM] Chams error:", e); showNotification("Error applying chams"); } } // Apply FOV function applyFOV() { if (camera) { camera.fov = prototype_.player.fov; camera.updateProjectionMatrix(); } } // Apply Fog function applyFog() { if (scene) { if (prototype_.player.noFog) { scene.fog = null; } else { if (scene.fog === null) { scene.fog = new THREE.Fog(0x000000, 10, 100); } } } } // Dynamic color helpers function getRainbowColor() { return `hsl(${(Date.now() / (50 / prototype_.player.animationSpeed)) % 360}, 100%, 50%)`; } function getAuroraColor() { const t = Date.now() / (400 / prototype_.player.animationSpeed); return `hsl(${(t * 30 + prototype_.player.baseHue) % 360}, 80%, 60%)`; } function getNeonPulseColor() { const t = Date.now() / (100 / prototype_.player.animationSpeed); const i = (Math.sin(t * 2) + 1) / 2; return `hsl(${(300 + prototype_.player.baseHue) % 360}, 100%, ${50 + i * 30}%)`; } function getSolarFlareColor() { const t = Date.now() / (250 / prototype_.player.animationSpeed); return `hsl(${(30 + prototype_.player.baseHue) % 360}, 100%, ${60 + Math.sin(t) * 20}%)`; } // Mesh type implementation function applyMeshType(mat) { if (!mat) return; const type = prototype_.player.meshType; mat.color.set('white'); if (mat.emissive) mat.emissive.setHex(0x000000); mat.wireframe = prototype_.player.wireframe; mat.side = 2; const emissiveFactor = prototype_.player.emissiveIntensity; switch (type) { case 'Normal': mat.opacity = 1; mat.transparent = false; mat.depthTest = true; break; case 'Glow Neon': mat.color.set(`hsl(${(180 + prototype_.player.baseHue) % 360}, 100%, 50%)`); mat.opacity = prototype_.player.opacity; if (mat.emissive) mat.emissive.setHex(0x00FFFF).multiplyScalar(emissiveFactor); mat.transparent = mat.opacity < 1; mat.depthTest = true; break; case 'Rainbow': mat.transparent = true; mat.opacity = 0.9; mat.depthTest = false; mat.color.set(getRainbowColor()); break; case 'Glass': mat.color.set(`hsl(${(200 + prototype_.player.baseHue) % 360}, 50%, 80%)`); mat.opacity = 0.3; mat.transparent = true; mat.depthTest = true; break; case 'Red Danger': mat.color.set(`hsl(${(0 + prototype_.player.baseHue) % 360}, 100%, 50%)`); mat.opacity = 0.9; mat.transparent = true; mat.depthTest = true; break; case 'Hacker Matrix': mat.color.set(`hsl(${(120 + prototype_.player.baseHue) % 360}, 100%, 50%)`); mat.wireframe = true; mat.opacity = 1; mat.transparent = false; mat.depthTest = true; break; case 'Chrome Metal': mat.color.set('#C0C0C0'); if (mat.emissive) mat.emissive.setHex(0x404040).multiplyScalar(emissiveFactor); mat.opacity = 1; mat.transparent = false; mat.depthTest = true; break; case 'Aurora Borealis': mat.transparent = true; mat.opacity = 0.7; mat.depthTest = false; mat.color.set(getAuroraColor()); break; case 'Neon Pulse': mat.transparent = true; mat.opacity = 0.9; mat.depthTest = false; mat.color.set(getNeonPulseColor()); if (mat.emissive) mat.emissive.setHex(0xFF00FF).multiplyScalar(emissiveFactor); break; case 'Solar Flare': mat.transparent = true; mat.opacity = 0.9; mat.depthTest = false; mat.color.set(getSolarFlareColor()); if (mat.emissive) mat.emissive.setHex(0xFFA500).multiplyScalar(emissiveFactor); break; default: mat.opacity = prototype_.player.opacity; mat.transparent = mat.opacity < 1; mat.depthTest = true; break; } } // Animation loop let animationFrameId; function animate() { if (!menuVisible && !prototype_.player.modStatus && prototype_.player.crosshairType === 'None') { drawCrosshair(); animationFrameId = requestAnimationFrame(animate); return; } const staticMeshes = ['Normal', 'Glow Neon', 'Glass', 'Red Danger', 'Hacker Matrix', 'Chrome Metal']; if (!staticMeshes.includes(prototype_.player.meshType)) { playerMaterials.forEach(mat => { if (!mat) return; switch (prototype_.player.meshType) { case 'Rainbow': mat.color.set(getRainbowColor()); break; case 'Aurora Borealis': mat.color.set(getAuroraColor()); break; case 'Neon Pulse': mat.color.set(getNeonPulseColor()); break; case 'Solar Flare': mat.color.set(getSolarFlareColor()); break; } }); } drawCrosshair(); animationFrameId = requestAnimationFrame(animate); } // Crosshair rendering let crosshairCanvas, crosshairCtx; function initCrosshairCanvas() { crosshairCanvas = document.createElement('canvas'); crosshairCanvas.id = 'crosshair-canvas'; crosshairCanvas.style.position = 'fixed'; crosshairCanvas.style.top = '0'; crosshairCanvas.style.left = '0'; crosshairCanvas.style.width = '100%'; crosshairCanvas.style.height = '100%'; crosshairCanvas.style.zIndex = '999998'; crosshairCanvas.style.pointerEvents = 'none'; crosshairCanvas.style.background = 'var(--crosshair-overlay)'; document.body.appendChild(crosshairCanvas); crosshairCtx = crosshairCanvas.getContext('2d'); resizeCrosshair(); } function resizeCrosshair() { if (!crosshairCanvas) return; crosshairCanvas.width = window.innerWidth; crosshairCanvas.height = window.innerHeight; drawCrosshair(); } function drawCrosshair() { if (!crosshairCtx || !crosshairCanvas) return; crosshairCtx.clearRect(0, 0, crosshairCanvas.width, crosshairCanvas.height); if (prototype_.player.crosshairType === 'None') return; const centerX = crosshairCanvas.width / 2; const centerY = crosshairCanvas.height / 2; const size = prototype_.player.crosshairSize; const gap = prototype_.player.crosshairGap; const color = prototype_.player.crosshairColor; crosshairCtx.strokeStyle = color; crosshairCtx.fillStyle = color; crosshairCtx.lineWidth = 2; switch (prototype_.player.crosshairType) { case 'Dot': crosshairCtx.beginPath(); crosshairCtx.arc(centerX, centerY, size / 5, 0, Math.PI * 2); crosshairCtx.fill(); break; case 'Cross': crosshairCtx.beginPath(); crosshairCtx.moveTo(centerX - size / 2, centerY); crosshairCtx.lineTo(centerX - gap, centerY); crosshairCtx.moveTo(centerX + gap, centerY); crosshairCtx.lineTo(centerX + size / 2, centerY); crosshairCtx.moveTo(centerX, centerY - size / 2); crosshairCtx.lineTo(centerX, centerY - gap); crosshairCtx.moveTo(centerX, centerY + gap); crosshairCtx.lineTo(centerX, centerY + size / 2); crosshairCtx.stroke(); break; case 'Plus': crosshairCtx.beginPath(); crosshairCtx.lineWidth = 4; crosshairCtx.moveTo(centerX - size / 3, centerY); crosshairCtx.lineTo(centerX - gap, centerY); crosshairCtx.moveTo(centerX + gap, centerY); crosshairCtx.lineTo(centerX + size / 3, centerY); crosshairCtx.moveTo(centerX, centerY - size / 3); crosshairCtx.lineTo(centerX, centerY - gap); crosshairCtx.moveTo(centerX, centerY + gap); crosshairCtx.lineTo(centerX, centerY + size / 3); crosshairCtx.stroke(); break; case 'Dynamic Dot': const pulseSize = size / 5 + Math.sin(Date.now() / 300) * (size / 4); crosshairCtx.beginPath(); crosshairCtx.arc(centerX, centerY, pulseSize, 0, Math.PI * 2); crosshairCtx.fill(); break; } } // Update status bar function updateStatus() { const statusBar = document.querySelector('#status-bar'); if (!statusBar) return; statusBar.innerHTML = ` <span class="status-item" title="Current mesh type"><i class="fas fa-cube"></i> Mesh: <span class="status-value">${prototype_.player.meshType}</span></span> <span class="status-item tooltip" id="wallhack-toggle" title="Click to toggle wallhacks"><i class="fas fa-eye"></i> Wallhacks: <span class="${prototype_.player.seeThroughWalls ? 'active' : ''}">${prototype_.player.seeThroughWalls ? 'ON' : 'OFF'}</span></span> <span class="status-item tooltip" title="Current crosshair type"><i class="fas fa-crosshairs"></i> Crosshair: <span class="status-value">${prototype_.player.crosshairType}</span></span> <span class="status-item tooltip" title="Current FOV setting"><i class="fas fa-camera"></i> FOV: <span class="status-value">${prototype_.player.fov}°</span></span> `; const wallhackToggle = statusBar.querySelector('#wallhack-toggle'); if (wallhackToggle) { wallhackToggle.onclick = () => { prototype_.player.seeThroughWalls = !prototype_.player.seeThroughWalls; showNotification(`Wallhacks ${prototype_.player.seeThroughWalls ? 'enabled' : 'disabled'}`); applyChamsSettings(); updateCategoryUI('Settings'); }; } } // UI styles if (!document.getElementById('emuChamsStyle')) { const styleSheet = document.createElement('style'); styleSheet.id = 'emuChamsStyle'; styleSheet.innerHTML = ` @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500&family=Orbitron:wght@700;800&display=swap'); @import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css'); :root { --accent-color: #00ccff; --accent-shadow: rgba(0, 204, 255, 0.4); --bg-gradient: linear-gradient(to bottom, rgba(0, 10, 20, 0.9), rgba(5, 15, 30, 0.9)); --btn-bg: rgba(20, 30, 50, 0.7); --btn-hover-gradient: linear-gradient(to right, rgba(0, 204, 255, 0.3), rgba(255, 64, 129, 0.3)); --text-color: #f0f6ff; --status-bg: rgba(0, 10, 20, 0.85); --border-color: #1a2538; --divider-color: #2e3a50; --crosshair-overlay: linear-gradient(to bottom, rgba(0, 10, 20, 0.05), rgba(0, 10, 20, 0.1)); } [data-theme="obsidian-black"] { --accent-color: #00ccff; --accent-shadow: rgba(0, 204, 255, 0.4); --bg-gradient: linear-gradient(to bottom, rgba(0, 10, 20, 0.9), rgba(5, 5, 15, 30, 0.9)); --btn-bg: rgba(20, 30, 50, 0.7); --btn-hover-bg: rgba(0, 204, 255, 0.3); --text-color: #f0f6ff; --status-bg: rgba(0, 10, 20, 5, 30, 0.85); --border-color: #1a2538; --divider-color: #2e3a50; --crosshair-overlay: linear-gradient(to bottom, rgba(0, 10, 20, 0.05), rgba(0, 10, 20, 0.1)); } [data-theme="arctic-white"] { --accent-color: #0066cc; --accent-shadow: rgba(0, 0, 204, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(255, 255, 255, 0.9), rgba(235, 245, 255, 0.9)); --btn-bg: rgba(210, 220, 230, 0.4); --btn-hover-bg: rgba(0, 105, 204, 0.2); --text-color: #1a2530; --status-bg: rgba(255, 255, 255, 0.85); --border-color: #d5e0f0; --divider-color: #e5e0f5; --crosshair-overlay: linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(235, 245, 255, 0.1)); } [data-theme="crimson-pulse"] { --accent-color: #ff3333; --accent-shadow: rgba(255, 51, 51, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(45, 0, 0, 0.9), rgba(30, 5, 5, 5, 0.9)); --btn-bg: rgba(60, 15, 15, 0.7); --btn-hover-bg: rgba(255, 51, 51, 0.5); --text-color: #ffcc99; --status-bg: rgba(30, 5, 5, 0, 0.85); --border-color: #4a2525; --divider-color: #5a3f3f3f; --crosshair-bg: linear-gradient(to bottom, rgba(45, 0, 0, 0.1), rgba(30, 5, 5, 0.1)); } [data-theme="toxic-green"] { --accent-color: #00ff33; --accent-shadow: rgba(0, 255, 51, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(0, 40, 0, 0.9), rgba(55, 25, 5, 0.9)); --btn-bg: rgba(20, 60, 20, 0.7); --btn-hover-bg: rgba(0, 255, 51, 0.2); --text-color: #ccff99; --status-bg: rgba(5, 5, 25, 5, 0.85); --border-color: #2f4a2f; --divider-color: #3f5a3f; --crosshair-bg: linear-gradient(to bottom, rgba(5, 40, 0, 0.05), rgba(5, 5, 25, 5, 0.05)); } [data-theme="sapphire-blue"] { --accent-color: #3399ff; --accent-shadow: rgba(51, 153, 255, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(0, 20, 50, 0.9), rgba(5, 5, 15, 40, 0.9)); --btn-bg: rgba(20, 50, 80, 0.3); --btn-hover-bg: rgba(51, 153, 255, 0.2); --text-color: #c3c3e6ff; --status-bg: rgba(5, 5, 15, 40, 0.85); --border-color: #2f3f5a; --divider-color: #3f4f6a; --crosshair-bg: linear-gradient(to bottom, rgba(0, 20, 50, 0.05), rgba(5, 5, 15, 40, 0.05)); } [data-theme="synthwave-purple"] { --accent-color: #cc66cc; --accent-shadow: rgba(204, 102, 204, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(40, 0, 50, 0.9), rgba(25, 5, 5, 40, 0.9)); --btn-bg: rgba(60, 20, 70, 0.3); --btn-hover-bg: rgba(204, 102, 204, 0.2); --text-color: #e6ccff; --status-bg: rgba(25, 5, 5, 40, 0.85); --border-color: #4a2f5a; --divider-color: #5a3f6a; --crosshair-bg: linear-gradient(to bottom, rgba(40, 0, 50, 0.05), rgba(25, 5, 5, 40, 0.05)); } [data-theme="dark-neon"] { --accent-color: #00e6ff; --accent-shadow: rgba(0, 230, 255, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(0, 10, 20, 0.9), rgba(5, 5, 15, 30, 0.9)); --btn-bg: rgba(20, 30, 50, 0.7); --btn-hover-bg: rgba(0, 230, 255, 0.2); --text-color: #f0f6ff; --status-bg: rgba(0, 10, 20, 5, 30, 0.85); --border-color: #1a2538; --divider-color: #2e3a50; --crosshair-bg: linear-gradient(to bottom, rgba(0, 10, 20, 0.05), rgba(0, 10, 20, 0.1)); } [data-theme="light-cyber"] { --accent-color: #0066cc; --accent-shadow: rgba(0, 102, 204, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(255, 255, 255, 0.9), rgba(235, 245, 255, 0.9)); --btn-bg: rgba(210, 220, 230, 0.4); --btn-hover-bg: rgba(0, 102, 204, 0.2); --text-color: #1a2530; --status-bg: rgba(255, 255, 255, 0.85); --border-color: #d5e0f0; --divider-color: #e5e0f5; --crosshair-bg: linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(235, 245, 255, 0.1)); } [data-theme="matrix-green"] { --accent-color: #00ff33; --accent-shadow: rgba(0, 255, 51, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(0, 40, 0, 0.9), rgba(5, 5, 25, 5, 0.9)); --btn-bg: rgba(20, 60, 20, 0.7); --btn-hover-bg: rgba(0, 255, 51, 0.2); --text-color: #ccff99; --status-bg: rgba(5, 5, 25, 5, 0.85); --border-color: #2f4a2f; --divider-color: #3f5a3f; --crosshair-bg: linear-gradient(to bottom, rgba(0, 40, 0, 0.05), rgba(5, 5, 25, 5, 0.05)); } [data-theme="retro-vaporwave"] { --accent-color: #ff66cc; --accent-shadow: rgba(255, 102, 204, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(255, 102, 204, 0.5), rgba(90, 0, 150, 0.5)); --btn-bg: rgba(255, 102, 204, 0.4); --btn-hover-bg: rgba(255, 102, 204, 0.6); --text-color: #f0f6ff; --status-bg: rgba(90, 0, 150, 0.7); --border-color: #9000cc; --divider-color: #c300ff; --crosshair-bg: linear-gradient(to bottom, rgba(255, 102, 204, 0.1), rgba(90, 0, 150, 0.1)); } #menu { position: absolute; width: 400px; background: var(--bg-gradient); backdrop-filter: blur(12px); border: 1px solid var(--accent-color); border-radius: 5px; box-shadow: 0 4px 25px var(--accent-shadow), inset 0 0 5px rgba(255, 255, 255, 0.1); z-index: 999999; font-family: 'Inter', sans-serif; color: var(--text-color); opacity: ${prototype_.player.menuOpacity}; transition: opacity 0.3s ease, transform 0.3s ease, height 0.3s ease; left: ${prototype_.player.menuPosition.left}; top: ${prototype_.player.menuPosition.top}; } #menu.hidden { opacity: 0; transform: scale(0.95); pointer-events: none; } #menu.minimized { height: 32px; overflow: hidden; } #menu.transitioning { opacity: 0; transition: opacity 0.2s ease; } #menu-header { padding: 5px 8px; background: rgba(0, 0, 0, 0.3); display: flex; align-items: center; border-bottom: 1px solid var(--border-color); cursor: move; } #menu-logo { width: 18px; height: 18px; margin-right: 6px; background: conic-gradient(from 45deg, transparent 0deg 90deg, var(--accent-color) 90deg 180deg, transparent 180deg 270deg, var(--accent-color) 270deg 360deg); clip-path: polygon(50% 0%, 100% 100%, 0% 100%); transform: rotate(45deg); } #menu-badge { font-size: 8px; padding: 2px 6px; background: linear-gradient(45deg, var(--accent-color), #ff4081); color: var(--btn-bg); border-radius: 3px; margin-left: 6px; text-transform: uppercase; font-weight: 800; font-family: 'Orbitron', sans-serif; } #menu-title { font-size: 13px; font-weight: 800; font-family: 'Orbitron', sans-serif; background: linear-gradient(45deg, var(--accent-color), #ff4081); -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-shadow: 0 0 3px var(--accent-shadow); margin: 0; flex-grow: 1; } #menu-controls button { background: none; border: none; color: var(--text-color); font-size: 11px; padding: 3px; cursor: pointer; transition: color 0.2s, transform 0.2s; margin-left: 3px; } #menu-controls button:hover { color: var(--accent-color); transform: scale(1.1); } #menu-tabs { display: flex; background: var(--status-bg); border-bottom: 1px solid var(--border-color); } #menu-tabs button { background: transparent; border: none; color: var(--text-color); padding: 5px 8px; cursor: pointer; font-size: 10px; font-weight: 800; font-family: 'Orbitron', sans-serif; transition: all 0.2s; flex: 1; text-align: center; text-transform: uppercase; } #menu-tabs button:hover { background: var(--btn-hover-bg); } #menu-tabs button.active { color: var(--accent-color); background: var(--btn-bg); border-bottom: 2px solid var(--accent-color); } #menu-body { padding: 8px; max-height: 380px; overflow-y: auto; background: transparent; } #menu-body::-webkit-scrollbar { width: 6px; } #menu-body::-webkit-scrollbar-track { background: var(--btn-bg); border-radius: 3px; } #menu-body::-webkit-scrollbar-thumb { background: var(--accent-color); border-radius: 3px; } .tab-content { display: none; animation: fadeIn 0.3s ease; } .tab-content.active { display: block; } @keyframes fadeIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } } .btn-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 5px; margin: 5px 0; } .btn-grid.settings { grid-template-columns: repeat(3, 1fr); } .cheat-btn { position: relative; background: var(--btn-bg); border: 1px solid var(--border-color); color: var(--text-color); padding: 4px; border-radius: 4px; font-size: 8px; font-weight: 800; font-family: 'Orbitron', sans-serif; cursor: pointer; transition: all 0.2s ease; text-align: center; display: flex; align-items: center; justify-content: center; gap: 3px; text-transform: uppercase; overflow: hidden; } .cheat-btn:hover { background: var(--btn-hover-bg); border-color: var(--accent-color); box-shadow: 0 0 5px var(--accent-shadow); transform: scale(1.02); } .cheat-btn:hover::after { content: ''; position: absolute; top: 50%; left: 50%; width: 100px; height: 100px; background: radial-gradient(circle, rgba(255,255,255,0.2) 0%, transparent 70%); transform: translate(-50%, -50%) scale(0); animation: ripple 0.5s ease-out; } @keyframes ripple { to { transform: translate(-50%, -50%) scale(2); opacity: 0; } } .cheat-btn.active { background: var(--accent-color); color: var(--btn-bg); border-color: var(--accent-color); } .cheat-btn:active { transform: scale(0.98); } #status-bar { padding: 4px 8px; background: var(--status-bg); border-top: 1px solid var(--border-color); font-size: 8px; color: var(--text-color); display: flex; flex-wrap: wrap; gap: 5px; font-family: 'Inter', sans-serif; } .status-item { background: var(--btn-bg); padding: 2px 6px; border-radius: 10px; cursor: pointer; transition: background 0.2s, color 0.2s; display: flex; align-items: center; gap: 3px; } .status-item:hover { background: var(--btn-hover-bg); color: var(--accent-color); } .status-value, .active { color: var(--accent-color); font-weight: 600; } #mod-status { position: fixed; top: 10px; right: 10px; background: var(--bg-gradient); color: var(--text-color); padding: 4px 8px; border-radius: 4px; border: 1px solid var(--accent-color); font-family: 'Inter', sans-serif; font-size: 9px; z-index: 999997; box-shadow: 0 0 5px var(--accent-shadow); backdrop-filter: blur(10px); animation: pulseGlow 0.5s infinite alternate; display: none; } @keyframes pulseGlow { to { box-shadow: 0 0 8px var(--accent-shadow); } } #branding { position: fixed; top: 10px; left: 10px; display: flex; align-items: center; background: var(--bg-gradient); padding: 6px 12px; border-radius: 4px; border: 2px solid var(--border-color); box-shadow: 0 0 5px var(--accent-shadow), inset 0 0 3px rgba(255,255,255,0.1); color: var(--text-color); font-family: 'Inter', sans-serif; font-size: 11px; z-index: 999997; backdrop-filter: blur(10px); } #branding-icon { width: 20px; height: 20px; margin-right: 6px; background: conic-gradient(from 0deg, transparent 0deg 90deg, var(--accent-color) 90deg 180deg, transparent 180deg 270deg, var(--accent-color) 270deg 360deg); clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); transform: rotate(0deg); animation: spin 4s linear infinite; } #branding-text { background: linear-gradient(45deg, var(--accent-color), #ff4081); -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-shadow: 0 0 3px var(--accent-shadow); } #branding-version { font-size: 8px; color: var(--text-color); opacity: 0.6; margin-left: 4px; } .tooltip::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: var(--btn-bg); color: var(--text-color); padding: 3px 6px; border-radius: 4px; font-size: 8px; white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity 0.2s; z-index: 10; border: 1px solid var(--border-color); } .tooltip:hover::after { opacity: 1; } @keyframes spin { to { transform: rotate(360deg); } } hr { border: 0; border-top: 1px solid var(--divider-color); margin: 5px 0; } label { display: block; font-size: 10px; font-weight: 500; margin: 5px 0 2px; color: var(--text-color); } input[type="color"], input[type="range"] { width: 100%; height: 20px; border: 1px solid var(--border-color); border-radius: 4px; background: var(--btn-bg); cursor: pointer; } input[type="range"] { -webkit-appearance: none; height: 6px; } input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; width: 12px; height: 12px; background: var(--accent-color); border-radius: 50%; border: 1px solid var(--border-color); cursor: pointer; } .description { font-size: 9px; color: var(--text-color); opacity: 0.6; margin-bottom: 5px; } `; document.head.appendChild(styleSheet); } // Create UI let menu = document.getElementById('menu'); if (!menu) { // Branding const branding = document.createElement('div'); branding.id = 'branding'; branding.innerHTML = ` <span id="branding-icon"></span> <span id="branding-text">Emulation's Premium Client</span> <span id="branding-version">v${clientVersion}</span> `; document.body.appendChild(branding); // Mod status const modStatus = document.createElement('div'); modStatus.id = 'mod-status'; modStatus.textContent = "Emulation's Premium: Active"; modStatus.style.display = prototype_.player.modStatus ? 'block' : 'none'; document.body.appendChild(modStatus); // Menu menu = document.createElement('div'); menu.id = 'menu'; menu.dataset.theme = prototype_.player.theme; menu.classList.toggle('hidden', !menuVisible); menu.classList.toggle('minimized', prototype_.player.menuMinimized); const header = document.createElement('div'); header.id = 'menu-header'; const logo = document.createElement('div'); logo.id = 'menu-logo'; const title = document.createElement('h1'); title.id = 'menu-title'; title.textContent = "Emulation's Premium Client"; const badge = document.createElement('span'); badge.id = 'menu-badge'; badge.textContent = 'PREMIUM'; const controls = document.createElement('div'); controls.id = 'menu-controls'; const minimizeBtn = document.createElement('button'); minimizeBtn.innerHTML = '<i class="fas fa-minus"></i>'; minimizeBtn.setAttribute('aria-label', 'Minimize menu'); minimizeBtn.onclick = () => { prototype_.player.menuMinimized = !prototype_.player.menuMinimized; menu.classList.toggle('minimized', prototype_.player.menuMinimized); minimizeBtn.innerHTML = `<i class="fas fa-${prototype_.player.menuMinimized ? 'plus' : 'minus'}"></i>`; saveSettings(); showNotification(`Menu ${prototype_.player.menuMinimized ? 'minimized' : 'restored'}`); }; const closeBtn = document.createElement('button'); closeBtn.innerHTML = '<i class="fas fa-times"></i>'; closeBtn.setAttribute('aria-label', 'Close menu'); closeBtn.onclick = () => { menuVisible = false; menu.classList.add('hidden'); saveSettings(); showNotification('Menu closed'); }; controls.appendChild(minimizeBtn); controls.appendChild(closeBtn); header.appendChild(logo); header.appendChild(title); header.appendChild(badge); header.appendChild(controls); const content = document.createElement('div'); content.id = 'menu-content'; const tabs = document.createElement('div'); tabs.id = 'menu-tabs'; const body = document.createElement('div'); body.id = 'menu-body'; const statusBar = document.createElement('div'); statusBar.id = 'status-bar'; content.appendChild(tabs); content.appendChild(body); content.appendChild(statusBar); menu.appendChild(header); menu.appendChild(content); document.body.appendChild(menu); // Draggable menu let isDragging = false; let currentX, currentY; header.addEventListener('mousedown', (e) => { isDragging = true; currentX = e.clientX - parseFloat(menu.style.left || window.innerWidth / 2); currentY = e.clientY - parseFloat(menu.style.top || window.innerHeight / 2); document.body.style.userSelect = 'none'; }); document.addEventListener('mousemove', (e) => { if (!isDragging) return; e.preventDefault(); let newX = e.clientX - currentX; let newY = e.clientY - currentY; newX = Math.max(0, Math.min(newX, window.innerWidth - menu.offsetWidth)); newY = Math.max(0, Math.min(newY, window.innerHeight - menu.offsetHeight)); menu.style.left = `${newX}px`; menu.style.top = `${newY}px`; prototype_.player.menuPosition = { left: `${newX}px`, top: `${newY}px` }; saveSettings(); }); document.addEventListener('mouseup', () => { isDragging = false; document.body.style.userSelect = ''; }); initCrosshairCanvas(); window.addEventListener('resize', resizeCrosshair); const categories = [ { name: 'Advantage', description: 'Tactical enhancements for strategic play', meshes: [ { name: 'Normal', desc: 'Default mesh rendering' }, { name: 'Glow Neon', desc: 'Bright neon glow effect' }, { name: 'Red Danger', desc: 'Red highlight for threats' }, { name: 'Hacker Matrix', desc: 'Green wireframe style' }, { name: 'Chrome Metal', desc: 'Shiny metallic finish' }, ]}, { name: 'Visuals', description: 'Dynamic visual effects for immersion', meshes: [ { name: 'Rainbow', desc: 'Cycling rainbow colors' }, { name: 'Aurora Borealis', desc: 'Northern lights effect' }, { name: 'Neon Pulse', desc: 'Pulsating pink glow' }, { name: 'Solar Flare', desc: 'Bright fiery pulses' }, ]}, { name: 'Crosshairs', description: 'Customizable crosshair styles', crosshairs: [ { name: 'None', desc: 'No crosshair' }, { name: 'Dot', desc: 'Small centered dot' }, { name: 'Cross', desc: 'Classic cross shape' }, { name: 'Plus', desc: 'Thick plus shape' }, { name: 'Dynamic Dot', desc: 'Pulsing dot effect' }, ]}, { name: 'Settings', description: 'Configure client options', meshes: [] } ]; let currentCategory = 'Advantage'; function updateCategoryButtons() { tabs.innerHTML = ''; categories.forEach(cat => { const btn = document.createElement('button'); btn.textContent = cat.name; btn.classList.toggle('active', cat.name === currentCategory); btn.setAttribute('aria-label', `Select ${cat.name} tab`); btn.onclick = () => { currentCategory = cat.name; updateCategoryUI(); updateCategoryButtons(); showNotification(`Switched to ${cat.name}`); }; tabs.appendChild(btn); }); } function updateCategoryUI() { body.innerHTML = ''; const tabContent = document.createElement('div'); tabContent.className = `tab-content ${currentCategory.toLowerCase()} active`; const info = document.createElement('div'); info.className = 'description'; info.textContent = categories.find(c => c.name === currentCategory).description; tabContent.appendChild(info); if (currentCategory === 'Advantage' || currentCategory === 'Visuals') { const btnGrid = document.createElement('div'); btnGrid.className = 'btn-grid'; const meshes = categories.find(c => c.name === currentCategory).meshes; meshes.forEach(mesh => { const btn = document.createElement('button'); btn.className = `cheat-btn ${prototype_.player.meshType === mesh.name ? 'active' : ''} tooltip`; btn.title = mesh.desc; btn.innerHTML = `<i class="fas fa-cube"></i> ${mesh.name}`; btn.onclick = () => { prototype_.player.meshType = mesh.name; btnGrid.querySelectorAll('.cheat-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); showNotification(`Mesh set to ${mesh.name}`); applyChamsSettings(); saveSettings(); }; btnGrid.appendChild(btn); }); tabContent.appendChild(btnGrid); } else if (currentCategory === 'Crosshairs') { const btnGrid = document.createElement('div'); btnGrid.className = 'btn-grid'; const crosshairs = categories.find(c => c.name === currentCategory).crosshairs; crosshairs.forEach(ch => { const btn = document.createElement('button'); btn.className = `cheat-btn ${prototype_.player.crosshairType === ch.name ? 'active' : ''} tooltip`; btn.title = ch.desc; btn.innerHTML = `<i class="fas fa-crosshairs"></i> ${ch.name}`; btn.onclick = () => { prototype_.player.crosshairType = ch.name; btnGrid.querySelectorAll('.cheat-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); showNotification(`Crosshair set to ${ch.name}`); applyChamsSettings(); saveSettings(); }; btnGrid.appendChild(btn); }); tabContent.appendChild(btnGrid); const sizeLabel = document.createElement('label'); sizeLabel.textContent = 'Crosshair Size'; const sizeGrid = document.createElement('div'); sizeGrid.className = 'btn-grid'; [10, 20, 30, 40, 50].forEach(size => { const btn = document.createElement('button'); btn.className = `cheat-btn ${prototype_.player.crosshairSize === size ? 'active' : ''} tooltip`; btn.title = `Set size to ${size}px`; btn.textContent = `${size}px`; btn.onclick = () => { prototype_.player.crosshairSize = size; sizeGrid.querySelectorAll('.cheat-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); showNotification(`Crosshair Size set to ${size}px`); applyChamsSettings(); saveSettings(); }; sizeGrid.appendChild(btn); }); tabContent.appendChild(sizeLabel); tabContent.appendChild(sizeGrid); const gapLabel = document.createElement('label'); gapLabel.textContent = 'Crosshair Gap'; const gapGrid = document.createElement('div'); gapGrid.className = 'btn-grid'; [0, 5, 10, 15, 20].forEach(gap => { const btn = document.createElement('button'); btn.className = `cheat-btn ${prototype_.player.crosshairGap === gap ? 'active' : ''} tooltip`; btn.title = `Set gap to ${gap}px`; btn.textContent = `${gap}px`; btn.onclick = () => { prototype_.player.crosshairGap = gap; gapGrid.querySelectorAll('.cheat-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); showNotification(`Crosshair Gap set to ${gap}px`); applyChamsSettings(); saveSettings(); }; gapGrid.appendChild(btn); }); tabContent.appendChild(gapLabel); tabContent.appendChild(gapGrid); const colorLabel = document.createElement('label'); colorLabel.textContent = 'Crosshair Color'; const colorPicker = document.createElement('input'); colorPicker.type = 'color'; colorPicker.value = prototype_.player.crosshairColor; colorPicker.onchange = () => { prototype_.player.crosshairColor = colorPicker.value; showNotification(`Crosshair color set to ${colorPicker.value}`); applyChamsSettings(); saveSettings(); }; tabContent.appendChild(colorLabel); tabContent.appendChild(colorPicker); } else if (currentCategory === 'Settings') { const btnGrid = document.createElement('div'); btnGrid.className = 'btn-grid settings'; // Wallhacks const wallhackBtn = document.createElement('button'); wallhackBtn.className = `cheat-btn ${prototype_.player.seeThroughWalls ? 'active' : ''} tooltip`; wallhackBtn.title = 'Toggle visibility through walls'; wallhackBtn.innerHTML = `<i class="fas fa-eye"></i> Wallhacks: ${prototype_.player.seeThroughWalls ? 'ON' : 'OFF'}`; wallhackBtn.onclick = () => { prototype_.player.seeThroughWalls = !prototype_.player.seeThroughWalls; wallhackBtn.innerHTML = `<i class="fas fa-eye"></i> Wallhacks: ${prototype_.player.seeThroughWalls ? 'ON' : 'OFF'}`; wallhackBtn.classList.toggle('active'); showNotification(`Wallhacks ${prototype_.player.seeThroughWalls ? 'enabled' : 'disabled'}`); applyChamsSettings(); saveSettings(); }; btnGrid.appendChild(wallhackBtn); // Wireframe const wireframeBtn = document.createElement('button'); wireframeBtn.className = `cheat-btn ${prototype_.player.wireframe ? 'active' : ''} tooltip`; wireframeBtn.title = 'Enable wireframe rendering'; wireframeBtn.innerHTML = `<i class="fas fa-draw-polygon"></i> Wireframe: ${prototype_.player.wireframe ? 'ON' : 'OFF'}`; wireframeBtn.onclick = () => { prototype_.player.wireframe = !prototype_.player.wireframe; wireframeBtn.innerHTML = `<i class="fas fa-draw-polygon"></i> Wireframe: ${prototype_.player.wireframe ? 'ON' : 'OFF'}`; wireframeBtn.classList.toggle('active'); showNotification(`Wireframe ${prototype_.player.wireframe ? 'enabled' : 'disabled'}`); applyChamsSettings(); saveSettings(); }; btnGrid.appendChild(wallhackBtn); // No Fog const noFogBtn = document.createElement('button'); noFogBtn.className = `cheat-btn ${prototype_.player.noFog ? 'active' : ''} tooltip`; noFogBtn.title = 'Disable environmental fog'; noFogBtn.innerHTML = `<i class="fas fa-cloud"></i> No Fog: ${prototype_.player.noFog ? 'ON' : 'OFF'}`; noFogBtn.onclick = () => { prototype_.player.noFog = !prototype_.player.noFog; noFogBtn.innerHTML = `<i class="fas fa-cloud"></i> No Fog: ${prototype_.player.noFog ? 'ON' : 'OFF'}`; noFogBtn.classList.toggle('active'); showNotification(`No Fog ${prototype_.player.noFog ? 'enabled' : 'disabled'}`); applyChamsSettings(); saveSettings(); }; btnGrid.appendChild(noFogBtn); // Notifications const notifyBtn = document.createElement('button'); notifyBtn.className = `cheat-btn ${prototype_.player.notifications ? 'active' : ''} tooltip`; notifyBtn.title = 'Toggle action notifications'; notifyBtn.innerHTML = `<i class="fas fa-bell"></i> Notifications: ${prototype_.player.notifications ? 'ON' : 'OFF'}`; notifyBtn.onclick = () => { prototype_.player.notifications = !prototype_.player.notifications; notifyBtn.innerHTML = `<i class="fas fa-bell"></i> Notifications: ${prototype_.player.notifications ? 'ON' : 'OFF'}`; notifyBtn.classList.toggle('active'); showNotification(`Notifications ${prototype_.player.notifications ? 'enabled' : 'disabled'}`); saveSettings(); }; btnGrid.appendChild(notifyBtn); // Mod Status const modStatusBtn = document.createElement('button'); modStatusBtn.className = `cheat-btn ${prototype_.player.modStatus ? 'active' : ''} tooltip`; modStatusBtn.title = 'Toggle mod status display'; modStatusBtn.innerHTML = `<i class="fas fa-shield-alt"></i> Mod Status: ${prototype_.player.modStatus ? 'ON' : 'OFF'}`; modStatusBtn.onclick = () => { prototype_.player.modStatus = !prototype_.player.modStatus; modStatusBtn.innerHTML = `<i class="fas fa-shield-alt"></i> Mod Status: ${prototype_.player.modStatus ? 'ON' : 'OFF'}`; modStatusBtn.classList.toggle('active'); document.getElementById('mod-status').style.display = prototype_.player.modStatus ? 'block' : 'none'; showNotification(`Mod Status ${prototype_.player.modStatus ? 'enabled' : 'disabled'}`); saveSettings(); }; btnGrid.appendChild(modStatusBtn); tabContent.appendChild(btnGrid); tabContent.appendChild(document.createElement('hr')); // Opacity const opacityLabel = document.createElement('label'); opacityLabel.textContent = 'Mesh Opacity'; const opacityGrid = document.createElement('div'); opacityGrid.className = 'btn-grid'; [0.1, 0.3, 0.5, 0.7, 0.9, 1.0].forEach(op => { const btn = document.createElement('button'); btn.className = `cheat-btn ${prototype_.player.opacity === op ? 'active' : ''} tooltip`; btn.title = `Set opacity to ${op}`; btn.textContent = op.toFixed(1); btn.onclick = () => { prototype_.player.opacity = op; opacityGrid.querySelectorAll('.cheat-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); showNotification(`Opacity set to ${op}`); applyChamsSettings(); saveSettings(); }; opacityGrid.appendChild(btn); }); tabContent.appendChild(opacityLabel); tabContent.appendChild(opacityGrid); // Animation Speed const speedLabel = document.createElement('label'); speedLabel.textContent = 'Animation Speed'; const speedGrid = document.createElement('div'); speedGrid.className = 'btn-grid'; [0.5, 1.0, 1.5, 2.0].forEach(speed => { const btn = document.createElement('button'); btn.className = `cheat-btn ${prototype_.player.animationSpeed === speed ? 'active' : ''} tooltip`; btn.title = `Set speed to ${speed}x`; btn.textContent = `${speed}x`; btn.onclick = () => { prototype_.player.animationSpeed = speed; speedGrid.querySelectorAll('.cheat-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); showNotification(`Animation speed set to ${speed}x`); applyChamsSettings(); saveSettings(); }; speedGrid.appendChild(btn); }); tabContent.appendChild(speedLabel); tabContent.appendChild(speedGrid); // Base Hue const hueLabel = document.createElement('label'); hueLabel.textContent = 'Base Hue'; const hueGrid = document.createElement('div'); hueGrid.className = 'btn-grid'; [0, 60, 120, 180, 240, 300].forEach(hue => { const btn = document.createElement('button'); btn.className = `cheat-btn ${prototype_.player.baseHue === hue ? 'active' : ''} tooltip`; btn.title = `Set hue to ${hue}°`; btn.textContent = `${hue}°`; btn.onclick = () => { prototype_.player.baseHue = hue; hueGrid.querySelectorAll('.cheat-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); showNotification(`Base Hue set to ${hue}°`); applyChamsSettings(); saveSettings(); }; hueGrid.appendChild(btn); }); tabContent.appendChild(hueLabel); tabContent.appendChild(hueGrid); // Emissive Intensity const emissiveLabel = document.createElement('label'); emissiveLabel.textContent = 'Emissive Intensity'; const emissiveGrid = document.createElement('div'); emissiveGrid.className = 'btn-grid'; [0.0, 0.2, 0.4, 0.6, 0.8, 1.0].forEach(intensity => { const btn = document.createElement('button'); btn.className = `cheat-btn ${prototype_.player.emissiveIntensity === intensity ? 'active' : ''} tooltip`; btn.title = `Set intensity to ${intensity}`; btn.textContent = intensity.toFixed(1); btn.onclick = () => { prototype_.player.emissiveIntensity = intensity; emissiveGrid.querySelectorAll('.cheat-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); showNotification(`Emissive Intensity set to ${intensity}`); applyChamsSettings(); saveSettings(); }; emissiveGrid.appendChild(btn); }); tabContent.appendChild(emissiveLabel); tabContent.appendChild(emissiveGrid); // FOV const fovLabel = document.createElement('label'); fovLabel.textContent = `Field of View: ${prototype_.player.fov}°`; const fovSlider = document.createElement('input'); fovSlider.type = 'range'; fovSlider.min = 70; fovSlider.max = 120; fovSlider.step = 1; fovSlider.value = prototype_.player.fov; fovSlider.oninput = () => { prototype_.player.fov = parseInt(fovSlider.value); fovLabel.textContent = `Field of View: ${prototype_.player.fov}°`; showNotification(`FOV set to ${prototype_.player.fov}°`); applyChamsSettings(); saveSettings(); }; tabContent.appendChild(fovLabel); tabContent.appendChild(fovSlider); tabContent.appendChild(document.createElement('hr')); // Menu Opacity const menuOpacityLabel = document.createElement('label'); menuOpacityLabel.textContent = 'Menu Opacity'; const menuOpacityGrid = document.createElement('div'); menuOpacityGrid.className = 'btn-grid'; [0.5, 0.7, 0.9, 1.0].forEach(op => { const btn = document.createElement('button'); btn.className = `cheat-btn ${prototype_.player.menuOpacity === op ? 'active' : ''} tooltip`; btn.title = `Set menu opacity to ${op}`; btn.textContent = op.toFixed(1); btn.onclick = () => { prototype_.player.menuOpacity = op; menu.style.opacity = op; menuOpacityGrid.querySelectorAll('.cheat-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); showNotification(`Menu Opacity set to ${op}`); saveSettings(); }; menuOpacityGrid.appendChild(btn); }); tabContent.appendChild(menuOpacityLabel); tabContent.appendChild(menuOpacityGrid); // Theme const themeLabel = document.createElement('label'); themeLabel.textContent = 'Theme'; const themeGrid = document.createElement('div'); themeGrid.className = 'btn-grid'; ['obsidian-black', 'arctic-white', 'crimson-pulse', 'toxic-green', 'sapphire-blue', 'synthwave-purple', 'dark-neon', 'light-cyber', 'matrix-green', 'retro-vaporwave'].forEach(theme => { const btn = document.createElement('button'); btn.className = `cheat-btn ${prototype_.player.theme === theme ? 'active' : ''} tooltip`; btn.title = `Switch to ${theme.replace('-', ' ')} theme`; btn.textContent = theme.replace('-', ' ').replace(/\b\w/g, c => c.toUpperCase()); btn.onclick = () => { menu.classList.add('transitioning'); setTimeout(() => { prototype_.player.theme = theme; menu.dataset.theme = theme; saveSettings(); themeGrid.querySelectorAll('.cheat-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); showNotification(`Theme set to ${theme}`); menu.classList.remove('transitioning'); branding.dataset.theme = theme; modStatus.dataset.theme = theme; crosshairCanvas.dataset.theme = theme; }, 200); }; themeGrid.appendChild(btn); }); tabContent.appendChild(themeLabel); tabContent.appendChild(themeGrid); tabContent.appendChild(document.createElement('hr')); // Reset Settings const resetLabel = document.createElement('label'); resetLabel.textContent = 'Reset Settings'; const resetBtn = document.createElement('button'); resetBtn.className = 'cheat-btn tooltip'; resetBtn.title = 'Reset all settings to default'; resetBtn.innerHTML = '<i class="fas fa-undo"></i> Reset All'; resetBtn.onclick = () => { prototype_.player = { opacity: 1, wireframe: false, seeThroughWalls: false, meshType: 'Normal', animationSpeed: 1, baseHue: 0, emissiveIntensity: 0.5, crosshairType: 'None', crosshairSize: 20, crosshairGap: 5, crosshairColor: '#00f0ff', notifications: true, modStatus: true, menuOpacity: 1.0, fov: 90, noFog: false, theme: 'obsidian-black', menuPosition: { left: '50%', top: '50%' }, menuVisible: true, menuMinimized: false }; menu.style.opacity = 1.0; menu.style.left = '50%'; menu.style.top = '50%'; menu.dataset.theme = 'obsidian-black'; menuVisible = true; menu.classList.remove('hidden'); menu.classList.remove('minimized'); branding.dataset.theme = 'obsidian-black'; modStatus.dataset.theme = 'obsidian-black'; crosshairCanvas.dataset.theme = 'obsidian-black'; saveSettings(); showNotification('Settings reset to default'); applyChamsSettings(); updateCategoryUI(); }; tabContent.appendChild(resetLabel); tabContent.appendChild(resetBtn); } body.appendChild(tabContent); updateStatus(); } updateCategoryButtons(); updateCategoryUI(); // Toggle menu with semicolon document.addEventListener('keydown', (e) => { if (e.key === ';') { menuVisible = !menuVisible; menu.classList.toggle('hidden', !menuVisible); saveSettings(); showNotification(`Menu ${menuVisible ? 'opened' : 'closed'}`); } }); } // Start animation loop applyChamsSettings(); animate(); })();