您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A premium cheat client for Voxiom.io with cosmic-themed UI, expanded mesh types, version history accordions, key GUI opacity slider, and persistent settings.
// ==UserScript== // @name Voxiom.io Emulation Premium Cheat Client 3.0 // @namespace 3.0.0 // @version 3.0.0 // @description A premium cheat client for Voxiom.io with cosmic-themed UI, expanded mesh types, version history accordions, key GUI opacity slider, and persistent settings. // @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 settings = { player: { opacity: 1, wireframe: false, seeThroughWalls: false, meshType: 'Normal', animationSpeed: 1, baseHue: 0, emissiveIntensity: 0.5, crosshairType: 'None', crosshairSize: 20, crosshairGap: 5, crosshairColor: '#FFD700', notifications: true, modStatus: true, menuOpacity: 1.0, theme: localStorage.getItem('theme') || 'gold-black', menuPosition: JSON.parse(localStorage.getItem('menuPosition')) || { left: '10px', top: '10px' }, menuMinimized: true, showPing: false, showFps: false, showKeys: false, showMouse: false, showGameTime: false, keyGuiPosition: JSON.parse(localStorage.getItem('keyGuiPosition')) || { left: '10px', bottom: '10px' }, keyGuiSize: JSON.parse(localStorage.getItem('keyGuiSize')) || { width: '150px', height: '100px' }, keyGuiOpacity: parseFloat(localStorage.getItem('keyGuiOpacity')) || 1.0 } }; const playerMaterials = new Set(); let notificationTimeout = null; const clientVersion = '3.0.0'; const notifications = []; let stats = { ping: 0, fps: 0, keys: { w: false, a: false, s: false, d: false, space: false }, mouse: { x: 0, y: 0 }, gameTime: 0 }; let lastFrameTime = performance.now(); let frameCount = 0; let startTime = Date.now(); // Save settings function saveSettings() { localStorage.setItem('theme', settings.player.theme); localStorage.setItem('menuPosition', JSON.stringify(settings.player.menuPosition)); localStorage.setItem('menuMinimized', settings.player.menuMinimized); localStorage.setItem('keyGuiPosition', JSON.stringify(settings.player.keyGuiPosition)); localStorage.setItem('keyGuiSize', JSON.stringify(settings.player.keyGuiSize)); localStorage.setItem('keyGuiOpacity', settings.player.keyGuiOpacity); localStorage.setItem('settings', JSON.stringify({ opacity: settings.player.opacity, wireframe: settings.player.wireframe, seeThroughWalls: settings.player.seeThroughWalls, meshType: settings.player.meshType, animationSpeed: settings.player.animationSpeed, baseHue: settings.player.baseHue, emissiveIntensity: settings.player.emissiveIntensity, crosshairType: settings.player.crosshairType, crosshairSize: settings.player.crosshairSize, crosshairGap: settings.player.crosshairGap, crosshairColor: settings.player.crosshairColor, notifications: settings.player.notifications, modStatus: settings.player.modStatus, menuOpacity: settings.player.menuOpacity, showPing: settings.player.showPing, showFps: settings.player.showFps, showKeys: settings.player.showKeys, showMouse: settings.player.showMouse, showGameTime: settings.player.showGameTime })); } // Load settings const savedSettings = localStorage.getItem('settings'); if (savedSettings) { Object.assign(settings.player, JSON.parse(savedSettings)); } // Show notification function showNotification(message) { if (!settings.player.notifications) return; const notification = document.createElement('div'); notification.className = 'notification'; 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 = '8px 16px'; notification.style.borderRadius = '6px'; notification.style.boxShadow = '0 4px 12px 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 = '"Exo 2", sans-serif'; notification.style.fontSize = '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); } // Loading screen function showLoadingScreen() { const loadingScreen = document.createElement('div'); loadingScreen.id = 'loading-screen'; loadingScreen.style.position = 'fixed'; loadingScreen.style.top = '0'; loadingScreen.style.left = '0'; loadingScreen.style.width = '100%'; loadingScreen.style.height = '100%'; loadingScreen.style.background = 'var(--bg-gradient)'; loadingScreen.style.display = 'flex'; loadingScreen.style.flexDirection = 'column'; loadingScreen.style.alignItems = 'center'; loadingScreen.style.justifyContent = 'center'; loadingScreen.style.zIndex = '1000000'; loadingScreen.style.color = 'var(--text-color)'; loadingScreen.style.fontFamily = '"Exo 2", sans-serif'; loadingScreen.innerHTML = ` <div id="loading-logo" style="width: 50px; height: 50px; background: radial-gradient(circle, var(--accent-color) 10%, transparent 70%); animation: blackHoleSwirl 2s linear infinite;"></div> <h1 style="font-size: 20px; margin: 15px 0;">Emulation Premium</h1> <div id="loading-bar" style="width: 200px; height: 4px; background: var(--btn-bg); border-radius: 2px; overflow: hidden;"> <div id="loading-progress" style="width: 0; height: 100%; background: var(--accent-color); transition: width 1.5s ease;"></div> </div> `; document.body.appendChild(loadingScreen); const progressBar = document.getElementById('loading-progress'); let progress = 0; const interval = setInterval(() => { progress += 5; progressBar.style.width = `${progress}%`; if (progress >= 100) { clearInterval(interval); setTimeout(() => { loadingScreen.style.opacity = '0'; loadingScreen.style.transition = 'opacity 0.5s ease'; setTimeout(() => loadingScreen.remove(), 500); }, 300); } }, 80); } // 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); } } catch (e) { console.error("[EMULATION PREMIUM] Material hook error:", e); showNotification("Warning: Material hooking failed"); } return originalPush.apply(this, args); }; // Apply settings function applySettings() { try { playerMaterials.forEach(mat => { if (!mat) return; mat.opacity = settings.player.opacity; mat.wireframe = settings.player.wireframe; mat.transparent = true; mat.side = 2; if (settings.player.seeThroughWalls) { mat.depthTest = false; mat.depthFunc = 7; } else { mat.depthTest = true; mat.depthFunc = 3; } applyMeshType(mat); }); updateStatusOverlay(); drawCrosshair(); updateStatsOverlay(); updateKeyPressGui(); } catch (e) { console.error("[EMULATION PREMIUM] Settings error:", e); showNotification("Error applying settings"); } } // Dynamic color helpers function getRainbowColor() { return `hsl(${(Date.now() / (50 / settings.player.animationSpeed)) % 360}, 100%, 50%)`; } function getAuroraColor() { const t = Date.now() / (400 / settings.player.animationSpeed); return `hsl(${(t * 30 + settings.player.baseHue) % 360}, 80%, 60%)`; } function getNeonPulseColor() { const t = Date.now() / (100 / settings.player.animationSpeed); const i = (Math.sin(t * 2) + 1) / 2; return `hsl(${(300 + settings.player.baseHue) % 360}, 100%, ${50 + i * 30}%)`; } function getSolarFlareColor() { const t = Date.now() / (250 / settings.player.animationSpeed); return `hsl(${(30 + settings.player.baseHue) % 360}, 100%, ${60 + Math.sin(t) * 20}%)`; } function getGoldPulseColor() { const t = Date.now() / (200 / settings.player.animationSpeed); const i = (Math.sin(t * 2) + 1) / 2; return `hsl(45, 80%, ${50 + i * 20}%)`; } function getCosmicVoidColor() { const t = Date.now() / (300 / settings.player.animationSpeed); return `hsl(${(240 + t * 10) % 360}, 90%, ${40 + Math.sin(t) * 10}%)`; } function getStarfieldFluxColor() { const t = Date.now() / (150 / settings.player.animationSpeed); const i = (Math.cos(t * 3) + 1) / 2; return `hsl(210, 80%, ${60 + i * 20}%)`; } function getPlasmaSurgeColor() { const t = Date.now() / (200 / settings.player.animationSpeed); return `hsl(${(270 + t * 20) % 360}, 100%, ${50 + Math.sin(t * 2) * 15}%)`; } function getGalacticSpiralColor() { const t = Date.now() / (350 / settings.player.animationSpeed); return `hsl(${(180 + t * 15) % 360}, 85%, ${55 + Math.cos(t) * 10}%)`; } function getQuantumFlickerColor() { const t = Date.now() / (100 / settings.player.animationSpeed); const i = Math.random() * 0.3 + 0.7; return `hsl(300, 90%, ${50 * i}%)`; } // Mesh type implementation function applyMeshType(mat) { if (!mat) return; const type = settings.player.meshType; mat.color.set('white'); if (mat.emissive) mat.emissive.setHex(0x000000); mat.wireframe = settings.player.wireframe; mat.side = 2; const emissiveFactor = settings.player.emissiveIntensity; switch (type) { // Advantage Meshes case 'Normal': mat.opacity = 1; mat.transparent = false; mat.depthTest = true; break; case 'Glow Neon': mat.color.set(`hsl(${(180 + settings.player.baseHue) % 360}, 100%, 50%)`); mat.opacity = settings.player.opacity; if (mat.emissive) mat.emissive.setHex(0x00FFFF).multiplyScalar(emissiveFactor); mat.transparent = mat.opacity < 1; mat.depthTest = true; break; case 'Red Danger': mat.color.set(`hsl(${(0 + settings.player.baseHue) % 360}, 100%, 50%)`); mat.opacity = 0.9; mat.transparent = true; mat.depthTest = true; break; case 'Hacker Matrix': mat.color.set(`hsl(${(120 + settings.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 'Shadow Cloak': mat.color.set('#1A1A1A'); mat.opacity = 0.6; mat.transparent = true; mat.depthTest = false; if (mat.emissive) mat.emissive.setHex(0x111111).multiplyScalar(emissiveFactor); break; case 'Crystal Clear': mat.color.set('#E6E6FA'); mat.opacity = 0.3; mat.transparent = true; mat.depthTest = true; if (mat.emissive) mat.emissive.setHex(0xFFFFFF).multiplyScalar(emissiveFactor); break; case 'Toxic Haze': mat.color.set(`hsl(${(90 + settings.player.baseHue) % 360}, 80%, 50%)`); mat.opacity = 0.7; mat.transparent = true; mat.depthTest = false; if (mat.emissive) mat.emissive.setHex(0x00FF00).multiplyScalar(emissiveFactor); break; case 'Phantom Outline': mat.color.set('#FFFFFF'); mat.wireframe = true; mat.opacity = 0.8; mat.transparent = true; mat.depthTest = true; break; case 'Electric Grid': mat.color.set(`hsl(${(210 + settings.player.baseHue) % 360}, 100%, 50%)`); mat.wireframe = true; mat.opacity = 0.9; mat.transparent = true; mat.depthTest = false; if (mat.emissive) mat.emissive.setHex(0x00AAFF).multiplyScalar(emissiveFactor); break; // Utility Meshes case 'Rainbow': mat.transparent = true; mat.opacity = 0.9; mat.depthTest = true; mat.color.set(getRainbowColor()); break; case 'Aurora Borealis': mat.transparent = true; mat.opacity = 0.7; mat.depthTest = true; mat.color.set(getAuroraColor()); break; case 'Neon Pulse': mat.transparent = true; mat.opacity = 0.9; mat.depthTest = true; 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 = true; mat.color.set(getSolarFlareColor()); if (mat.emissive) mat.emissive.setHex(0xFFA500).multiplyScalar(emissiveFactor); break; case 'Gold Pulse': mat.transparent = true; mat.opacity = 0.9; mat.depthTest = true; mat.color.set(getGoldPulseColor()); if (mat.emissive) mat.emissive.setHex(0xFFD700).multiplyScalar(emissiveFactor); break; case 'Cosmic Void': mat.transparent = true; mat.opacity = 0.8; mat.depthTest = true; mat.color.set(getCosmicVoidColor()); if (mat.emissive) mat.emissive.setHex(0x1A237E).multiplyScalar(emissiveFactor); break; case 'Starfield Flux': mat.transparent = true; mat.opacity = 0.9; mat.depthTest = true; mat.color.set(getStarfieldFluxColor()); if (mat.emissive) mat.emissive.setHex(0x0288D1).multiplyScalar(emissiveFactor); break; case 'Plasma Surge': mat.transparent = true; mat.opacity = 0.85; mat.depthTest = true; mat.color.set(getPlasmaSurgeColor()); if (mat.emissive) mat.emissive.setHex(0x8E24AA).multiplyScalar(emissiveFactor); break; case 'Galactic Spiral': mat.transparent = true; mat.opacity = 0.8; mat.depthTest = true; mat.color.set(getGalacticSpiralColor()); if (mat.emissive) mat.emissive.setHex(0x26A69A).multiplyScalar(emissiveFactor); break; case 'Quantum Flicker': mat.transparent = true; mat.opacity = 0.9; mat.depthTest = true; mat.color.set(getQuantumFlickerColor()); if (mat.emissive) mat.emissive.setHex(0xAB47BC).multiplyScalar(emissiveFactor); break; default: mat.opacity = settings.player.opacity; mat.transparent = mat.opacity < 1; mat.depthTest = true; break; } } // Animation loop let animationFrameId; function animate() { const now = performance.now(); frameCount++; if (now - lastFrameTime >= 1000) { stats.fps = frameCount; frameCount = 0; lastFrameTime = now; stats.ping = Math.floor(Math.random() * 80 + 20); stats.gameTime = Math.floor((Date.now() - startTime) / 1000); updateStatsOverlay(); updateKeyPressGui(); } const staticMeshes = ['Normal', 'Glow Neon', 'Red Danger', 'Hacker Matrix', 'Chrome Metal', 'Shadow Cloak', 'Crystal Clear', 'Toxic Haze', 'Phantom Outline', 'Electric Grid']; if (!staticMeshes.includes(settings.player.meshType)) { playerMaterials.forEach(mat => { if (!mat) return; switch (settings.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; case 'Gold Pulse': mat.color.set(getGoldPulseColor()); break; case 'Cosmic Void': mat.color.set(getCosmicVoidColor()); break; case 'Starfield Flux': mat.color.set(getStarfieldFluxColor()); break; case 'Plasma Surge': mat.color.set(getPlasmaSurgeColor()); break; case 'Galactic Spiral': mat.color.set(getGalacticSpiralColor()); break; case 'Quantum Flicker': mat.color.set(getQuantumFlickerColor()); 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'; 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 (settings.player.crosshairType === 'None') return; const centerX = crosshairCanvas.width / 2; const centerY = crosshairCanvas.height / 2; const size = settings.player.crosshairSize; const gap = settings.player.crosshairGap; const color = settings.player.crosshairColor; crosshairCtx.strokeStyle = color; crosshairCtx.fillStyle = color; crosshairCtx.lineWidth = 2; switch (settings.player.crosshairType) { case 'Dot': crosshairCtx.beginPath(); crosshairCtx.arc(centerX, centerY, size / 4, 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 = 3; 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 / 4 + Math.sin(Date.now() / 300) * (size / 10); crosshairCtx.beginPath(); crosshairCtx.arc(centerX, centerY, pulseSize, 0, Math.PI * 2); crosshairCtx.fill(); break; } } // Update status overlay function updateStatusOverlay() { const statusBar = document.querySelector('#status-bar'); if (!statusBar) return; statusBar.innerHTML = ` <span class="status-text"><i class="fas fa-cube"></i> Mesh: ${settings.player.meshType}</span> <span class="status-text"><i class="fas fa-eye"></i> Wallhack: ${settings.player.seeThroughWalls ? 'ON' : 'OFF'}</span> <span class="status-text"><i class="fas fa-crosshairs"></i> Crosshair: ${settings.player.crosshairType}</span> <span class="status-text"><i class="fas fa-chart-line"></i> FPS: ${settings.player.showFps ? stats.fps : 'OFF'}</span> `; } // Update stats overlay function updateStatsOverlay() { let overlay = document.getElementById('stats-overlay'); if (!overlay) { overlay = document.createElement('div'); overlay.id = 'stats-overlay'; overlay.style.position = 'fixed'; overlay.style.bottom = '10px'; overlay.style.right = '10px'; overlay.style.background = 'var(--bg-gradient)'; overlay.style.border = '1px solid var(--accent-color)'; overlay.style.color = 'var(--text-color)'; overlay.style.padding = '8px'; overlay.style.borderRadius = '6px'; overlay.style.boxShadow = '0 2px 8px var(--accent-shadow)'; overlay.style.zIndex = '999998'; overlay.style.fontFamily = '"Exo 2", sans-serif'; overlay.style.fontSize = '11px'; overlay.style.display = 'none'; document.body.appendChild(overlay); } const content = []; if (settings.player.showPing) content.push(`<div><i class="fas fa-network-wired"></i> Ping: ${stats.ping}ms</div>`); if (settings.player.showFps) content.push(`<div><i class="fas fa-tachometer-alt"></i> FPS: ${stats.fps}</div>`); if (settings.player.showKeys) content.push(`<div><i class="fas fa-keyboard"></i> Keys: W:${stats.keys.w ? 'Down' : 'Up'} A:${stats.keys.a ? 'Down' : 'Up'} S:${stats.keys.s ? 'Down' : 'Up'} D:${stats.keys.d ? 'Down' : 'Up'} Space:${stats.keys.space ? 'Down' : 'Up'}</div>`); if (settings.player.showMouse) content.push(`<div><i class="fas fa-mouse"></i> Mouse: X:${stats.mouse.x} Y:${stats.mouse.y}</div>`); if (settings.player.showGameTime) content.push(`<div><i class="fas fa-clock"></i> Game Time: ${stats.gameTime}s</div>`); overlay.innerHTML = content.join(''); overlay.style.display = content.length ? 'block' : 'none'; } // Update key press GUI function updateKeyPressGui() { let gui = document.getElementById('key-press-gui'); if (!gui) { gui = document.createElement('div'); gui.id = 'key-press-gui'; gui.style.position = 'fixed'; gui.style.left = settings.player.keyGuiPosition.left; gui.style.bottom = settings.player.keyGuiPosition.bottom; gui.style.width = settings.player.keyGuiSize.width; gui.style.height = settings.player.keyGuiSize.height; gui.style.background = `var(--bg-gradient)`; gui.style.opacity = settings.player.keyGuiOpacity; gui.style.border = '1px solid var(--accent-color)'; gui.style.borderRadius = '6px'; gui.style.boxShadow = '0 2px 8px var(--accent-shadow)'; gui.style.zIndex = '999998'; gui.style.fontFamily = '"Exo 2", sans-serif'; gui.style.fontSize = '11px'; gui.style.display = settings.player.showKeys ? 'block' : 'none'; gui.style.userSelect = 'none'; gui.innerHTML = ` <div id="key-gui-header" style="padding: 4px; cursor: move; border-bottom: 1px solid var(--border-color); text-align: center; color: var(--text-color);"> Key Inputs </div> <div id="key-gui-body" style="padding: 8px; display: flex; flex-direction: column; align-items: center; gap: 4px;"> <div id="key-w" class="key-box" style="width: 24px; height: 24px; line-height: 24px; text-align: center; border-radius: 4px; background: ${stats.keys.w ? '#D3D3D3' : '#333333'}; color: ${stats.keys.w ? '#000000' : '#FFFFFF'};">W</div> <div style="display: flex; gap: 4px;"> <div id="key-a" class="key-box" style="width: 24px; height: 24px; line-height: 24px; text-align: center; border-radius: 4px; background: ${stats.keys.a ? '#D3D3D3' : '#333333'}; color: ${stats.keys.a ? '#000000' : '#FFFFFF'};">A</div> <div id="key-s" class="key-box" style="width: 24px; height: 24px; line-height: 24px; text-align: center; border-radius: 4px; background: ${stats.keys.s ? '#D3D3D3' : '#333333'}; color: ${stats.keys.s ? '#000000' : '#FFFFFF'};">S</div> <div id="key-d" class="key-box" style="width: 24px; height: 24px; line-height: 24px; text-align: center; border-radius: 4px; background: ${stats.keys.d ? '#D3D3D3' : '#333333'}; color: ${stats.keys.d ? '#000000' : '#FFFFFF'};">D</div> </div> <div id="key-space" class="key-box" style="width: 60px; height: 20px; line-height: 20px; text-align: center; border-radius: 4px; background: ${stats.keys.space ? '#D3D3D3' : '#333333'}; color: ${stats.keys.space ? '#000000' : '#FFFFFF'};">Space</div> </div> <div id="key-gui-resize" style="position: absolute; bottom: 0; right: 0; width: 10px; height: 10px; background: var(--accent-color); cursor: se-resize; border-radius: 0 0 6px 0;"></div> `; document.body.appendChild(gui); // Draggable const header = gui.querySelector('#key-gui-header'); let isDragging = false; let dragX, dragY; header.addEventListener('mousedown', (e) => { isDragging = true; dragX = e.clientX - parseFloat(gui.style.left || 10); dragY = e.clientY - (window.innerHeight - parseFloat(gui.style.bottom || 10) - gui.offsetHeight); }); document.addEventListener('mousemove', (e) => { if (!isDragging) return; let newX = e.clientX - dragX; let newBottom = window.innerHeight - (e.clientY - dragY) - gui.offsetHeight; newX = Math.max(0, Math.min(newX, window.innerWidth - gui.offsetWidth)); newBottom = Math.max(0, Math.min(newBottom, window.innerHeight - gui.offsetHeight)); gui.style.left = `${newX}px`; gui.style.bottom = `${newBottom}px`; settings.player.keyGuiPosition = { left: `${newX}px`, bottom: `${newBottom}px` }; saveSettings(); }); document.addEventListener('mouseup', () => { isDragging = false; }); // Resizable const resizeHandle = gui.querySelector('#key-gui-resize'); let isResizing = false; let resizeX, resizeY; resizeHandle.addEventListener('mousedown', (e) => { isResizing = true; resizeX = e.clientX; resizeY = e.clientY; e.preventDefault(); }); document.addEventListener('mousemove', (e) => { if (!isResizing) return; const deltaX = e.clientX - resizeX; const deltaY = e.clientY - resizeY; let newWidth = parseFloat(gui.style.width) + deltaX; let newHeight = parseFloat(gui.style.height) + deltaY; newWidth = Math.max(100, Math.min(newWidth, 300)); newHeight = Math.max(70, Math.min(newHeight, 200)); gui.style.width = `${newWidth}px`; gui.style.height = `${newHeight}px`; settings.player.keyGuiSize = { width: `${newWidth}px`, height: `${newHeight}px` }; resizeX = e.clientX; resizeY = e.clientY; saveSettings(); updateKeyPressGuiLayout(); }); document.addEventListener('mouseup', () => { isResizing = false; }); } // Update key states and opacity gui.querySelector('#key-w').style.background = stats.keys.w ? '#D3D3D3' : '#333333'; gui.querySelector('#key-w').style.color = stats.keys.w ? '#000000' : '#FFFFFF'; gui.querySelector('#key-a').style.background = stats.keys.a ? '#D3D3D3' : '#333333'; gui.querySelector('#key-a').style.color = stats.keys.a ? '#000000' : '#FFFFFF'; gui.querySelector('#key-s').style.background = stats.keys.s ? '#D3D3D3' : '#333333'; gui.querySelector('#key-s').style.color = stats.keys.s ? '#000000' : '#FFFFFF'; gui.querySelector('#key-d').style.background = stats.keys.d ? '#D3D3D3' : '#333333'; gui.querySelector('#key-d').style.color = stats.keys.d ? '#000000' : '#FFFFFF'; gui.querySelector('#key-space').style.background = stats.keys.space ? '#D3D3D3' : '#333333'; gui.querySelector('#key-space').style.color = stats.keys.space ? '#000000' : '#FFFFFF'; gui.style.display = settings.player.showKeys ? 'block' : 'none'; gui.style.opacity = settings.player.keyGuiOpacity; } // Update key press GUI layout function updateKeyPressGuiLayout() { const gui = document.getElementById('key-press-gui'); if (!gui) return; const width = parseFloat(gui.style.width); const height = parseFloat(gui.style.height); const keySize = Math.min(width / 8, height / 5); const spaceWidth = keySize * 2.5; const keyHeight = keySize * 0.8; gui.querySelector('#key-w').style.width = `${keySize}px`; gui.querySelector('#key-w').style.height = `${keySize}px`; gui.querySelector('#key-w').style.lineHeight = `${keySize}px`; gui.querySelector('#key-a').style.width = `${keySize}px`; gui.querySelector('#key-a').style.height = `${keySize}px`; gui.querySelector('#key-a').style.lineHeight = `${keySize}px`; gui.querySelector('#key-s').style.width = `${keySize}px`; gui.querySelector('#key-s').style.height = `${keySize}px`; gui.querySelector('#key-s').style.lineHeight = `${keySize}px`; gui.querySelector('#key-d').style.width = `${keySize}px`; gui.querySelector('#key-d').style.height = `${keySize}px`; gui.querySelector('#key-d').style.lineHeight = `${keySize}px`; gui.querySelector('#key-space').style.width = `${spaceWidth}px`; gui.querySelector('#key-space').style.height = `${keyHeight}px`; gui.querySelector('#key-space').style.lineHeight = `${keyHeight}px`; } // UI styles if (!document.getElementById('emuChamsStyle')) { const styleSheet = document.createElement('style'); styleSheet.id = 'emuChamsStyle'; styleSheet.innerHTML = ` @import url('https://fonts.googleapis.com/css2?family=Exo+2:wght@400;600&display=swap'); @import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css'); :root { --accent-color: #FFD700; --accent-shadow: rgba(255, 215, 0, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(10, 10, 15, 0.95), rgba(20, 20, 30, 0.95)); --btn-bg: rgba(20, 20, 30, 0.8); --text-color: #E6E6FA; --border-color: #2A2A3A; --divider-color: #3A3A4A; } [data-theme="gold-black"] { --accent-color: #FFD700; --accent-shadow: rgba(255, 215, 0, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(10, 10, 15, 0.95), rgba(20, 20, 30, 0.95)); --btn-bg: rgba(20, 20, 30, 0.8); --text-color: #E6E6FA; --border-color: #2A2A3A; --divider-color: #3A3A4A; } [data-theme="dark-neon"] { --accent-color: #00E6FF; --accent-shadow: rgba(0, 230, 255, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(0, 10, 15, 0.95), rgba(10, 20, 30, 0.95)); --btn-bg: rgba(15, 25, 35, 0.8); --text-color: #F0F6FF; --border-color: #1A2538; --divider-color: #2E3A50; } [data-theme="cyber-blue"] { --accent-color: #3399FF; --accent-shadow: rgba(51, 153, 255, 0.3); --bg-gradient: linear-gradient(to bottom, rgba(0, 20, 40, 0.95), rgba(20, 40, 60, 0.95)); --btn-bg: rgba(15, 35, 55, 0.8); --text-color: #C3E6FF; --border-color: #2F3F5A; --divider-color: #3F4F6A; } #menu { position: fixed; width: 320px; height: 400px; background: var(--bg-gradient); border: 2px solid var(--accent-color); border-radius: 10px; color: var(--text-color); opacity: ${settings.player.menuOpacity}; font-family: 'Exo 2', sans-serif; z-index: 999999; display: flex; flex-direction: column; left: ${settings.player.menuPosition.left}; top: ${settings.player.menuPosition.top}; transition: height 0.3s ease, opacity 0.3s ease; box-shadow: 0 0 20px var(--accent-shadow); } #menu.minimized { height: 40px; overflow: hidden; } #menu-header { background: radial-gradient(circle at center, rgba(255, 215, 0, 0.3) 0%, rgba(0, 0, 0, 1) 70%); background-size: 200% 200%; animation: blackHoleSwirl 6s ease-in-out infinite; padding: 10px; display: flex; align-items: center; justify-content: space-between; border-top-left-radius: 8px; border-top-right-radius: 8px; cursor: move; position: relative; overflow: hidden; z-index: 2; } #menu-header::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10"%3E%3Ccircle cx="5" cy="5" r="0.5" fill="rgba(255,255,255,0.2)" /%3E%3C/svg%3E'); background-size: 5px; animation: particleDrift 20s linear infinite; } @keyframes blackHoleSwirl { 0% { background-position: 0% 0%; } 50% { background-position: 100% 100%; } 100% { background-position: 0% 0%; } } @keyframes particleDrift { 0% { transform: translate(0, 0); } 100% { transform: translate(-50px, -50px); } } #menu-title { font-size: 16px; font-weight: 600; color: #FFFFFF; text-shadow: 0 0 5px var(--accent-color); } #menu-controls button { background: none; border: none; color: #FFFFFF; padding: 4px; cursor: pointer; transition: transform 0.2s; } #menu-controls button:hover { transform: scale(1.1); } #menu-content { display: flex; flex-grow: 1; overflow: hidden; } #menu-tabs { background: var(--btn-bg); width: 90px; display: flex; flex-direction: column; padding: 10px; border-right: 2px solid var(--border-color); flex-shrink: 0; } #menu-tabs button { background: none; border: none; color: var(--text-color); padding: 8px; cursor: pointer; font-size: 12px; font-weight: 600; transition: background-color 0.2s, transform 0.2s; border-radius: 4px; margin-bottom: 5px; display: flex; align-items: center; gap: 6px; } #menu-tabs button:hover { background: var(--accent-color); color: var(--btn-bg); transform: translateX(3px); } #menu-tabs button.active { background: var(--accent-color); color: var(--btn-bg); } #menu-body { padding: 10px; overflow-y: auto; flex-grow: 1; max-height: 340px; width: 210px; } #menu-body::-webkit-scrollbar { width: 6px; } #menu-body::-webkit-scrollbar-track { background: var(--btn-bg); } #menu-body::-webkit-scrollbar-thumb { background: var(--accent-color); border-radius: 3px; } .tab-content { display: none; } .tab-content.active { display: block; } .btn-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 6px; margin: 6px 0; } .cheat-btn { background: var(--btn-bg); border: 1px solid var(--border-color); color: var(--text-color); padding: 8px; border-radius: 4px; font-size: 11px; font-weight: 600; cursor: pointer; transition: all 0.2s ease; text-align: center; display: flex; align-items: center; justify-content: center; gap: 6px; } .cheat-btn:hover { background: var(--accent-color); color: var(--btn-bg); transform: scale(1.02); } .cheat-btn.active { background: var(--accent-color); color: var(--btn-bg); } #status-bar { position: fixed; bottom: 10px; left: 10px; background: var(--bg-gradient); padding: 8px; display: flex; flex-direction: column; gap: 4px; color: var(--text-color); font-size: 11px; font-family: 'Exo 2', sans-serif; z-index: 999998; border-radius: 6px; border: 1px solid var(--border-color); box-shadow: 0 2px 8px var(--accent-shadow); } .status-text { font-size: 11px; display: flex; align-items: center; gap: 4px; } #mod-status { position: fixed; top: 10px; right: 10px; background: var(--bg-gradient); padding: 8px; color: var(--text-color); border: 1px solid var(--accent-color); border-radius: 6px; font-size: 11px; z-index: 999998; display: none; font-family: 'Exo 2', sans-serif; } #branding { position: fixed; top: 10px; left: 10px; background: var(--bg-gradient); padding: 8px; color: var(--text-color); border-radius: 6px; font-family: 'Exo 2', sans-serif; font-size: 11px; z-index: 999998; border: 1px solid var(--border-color); } .tutorial-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.7); z-index: 10000; display: none; pointer-events: none; } .tutorial-tooltip { position: fixed; top: 20px; left: 50%; transform: translateX(-50%); background: var(--bg-gradient); color: var(--text-color); padding: 15px 20px; border: 2px solid var(--accent-color); border-radius: 8px; font-size: 16px; font-weight: 600; max-width: 500px; width: 90%; text-align: center; box-shadow: 0 4px 12px var(--accent-shadow); font-family: 'Exo 2', sans-serif; z-index: 10001; } .tutorial-arrow { position: absolute; width: 0; height: 0; border: 15px solid transparent; border-bottom-color: var(--accent-color); z-index: 10001; } hr { border: none; border-top: 1px solid var(--divider-color); margin: 8px 0; } label { font-size: 12px; font-weight: 600; color: var(--text-color); margin: 6px 0; display: block; } input[type="color"], input[type="range"] { width: 100%; border: 1px solid var(--border-color); border-radius: 4px; background: var(--btn-bg); padding: 2px; } .key-box { transition: background 0.1s ease, color 0.1s ease; box-shadow: 0 0 4px rgba(255, 215, 0, ${stats => stats.keys.w || stats.keys.a || stats.keys.s || stats.keys.d || stats.keys.space ? '0.3' : '0'}); } .accordion { background: var(--btn-bg); border: 1px solid var(--border-color); border-radius: 4px; margin-bottom: 6px; overflow: hidden; } .accordion-header { padding: 8px; cursor: pointer; display: flex; justify-content: space-between; align-items: center; font-size: 12px; font-weight: 600; color: var(--text-color); transition: background 0.2s ease; } .accordion-header:hover { background: var(--accent-color); color: var(--btn-bg); } .accordion-content { max-height: 0; overflow: hidden; transition: max-height 0.3s ease, padding 0.3s ease; padding: 0 8px; } .accordion-content.active { max-height: 200px; padding: 8px; } .accordion-content p { font-size: 11px; line-height: 1.4; color: var(--text-color); } `; document.head.appendChild(styleSheet); } // Tutorial system function startTutorial() { const overlay = document.createElement('div'); overlay.className = 'tutorial-overlay'; document.body.appendChild(overlay); overlay.style.display = 'block'; const tooltip = document.createElement('div'); tooltip.className = 'tutorial-tooltip'; tooltip.textContent = 'Press ; to open the Emulation Premium menu!'; document.body.appendChild(tooltip); const arrow = document.createElement('div'); arrow.className = 'tutorial-arrow'; document.body.appendChild(arrow); function updateArrowPosition() { const menuHeader = document.querySelector('#menu-header'); if (!menuHeader) return; const rect = menuHeader.getBoundingClientRect(); arrow.style.top = `${rect.bottom + 15}px`; arrow.style.left = `${rect.left + rect.width / 2}px`; } updateArrowPosition(); window.addEventListener('resize', updateArrowPosition); const handler = (e) => { if (e.key === ';') { document.removeEventListener('keydown', handler); window.removeEventListener('resize', updateArrowPosition); overlay.remove(); tooltip.remove(); arrow.remove(); showNotification('Tutorial dismissed'); } }; document.addEventListener('keydown', handler); } // Create UI let menu = document.getElementById('menu'); if (!menu) { showLoadingScreen(); // Branding const branding = document.createElement('div'); branding.id = 'branding'; branding.textContent = `Emulation Premium v${clientVersion}`; document.body.appendChild(branding); // Mod status const modStatus = document.createElement('div'); modStatus.id = 'mod-status'; modStatus.textContent = 'Premium Active'; modStatus.style.display = settings.player.modStatus ? 'block' : 'none'; document.body.appendChild(modStatus); // Status bar const statusBar = document.createElement('div'); statusBar.id = 'status-bar'; document.body.appendChild(statusBar); // Menu menu = document.createElement('div'); menu.id = 'menu'; menu.dataset.theme = settings.player.theme; menu.classList.toggle('minimized', settings.player.menuMinimized); const header = document.createElement('div'); header.id = 'menu-header'; const title = document.createElement('h1'); title.id = 'menu-title'; title.textContent = 'Emulation Premium'; const controls = document.createElement('div'); controls.id = 'menu-controls'; const minimizeBtn = document.createElement('button'); minimizeBtn.innerHTML = `<i class="fas fa-${settings.player.menuMinimized ? 'plus' : 'minus'}"></i>`; minimizeBtn.onclick = () => { settings.player.menuMinimized = !settings.player.menuMinimized; menu.classList.toggle('minimized'); minimizeBtn.innerHTML = `<i class="fas fa-${settings.player.menuMinimized ? 'plus' : 'minus'}"></i>`; saveSettings(); showNotification(`Menu ${settings.player.menuMinimized ? 'minimized' : 'restored'}`); }; controls.appendChild(minimizeBtn); header.appendChild(title); 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'; content.appendChild(tabs); content.appendChild(body); 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 || 10); currentY = e.clientY - parseFloat(menu.style.top || 10); }); document.addEventListener('mousemove', (e) => { if (!isDragging) return; 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`; settings.player.menuPosition = { left: `${newX}px`, top: `${newY}px` }; saveSettings(); }); document.addEventListener('mouseup', () => { isDragging = false; }); // Key press listeners document.addEventListener('keydown', (e) => { switch (e.key.toLowerCase()) { case 'w': stats.keys.w = true; break; case 'a': stats.keys.a = true; break; case 's': stats.keys.s = true; break; case 'd': stats.keys.d = true; break; case ' ': stats.keys.space = true; break; } updateStatsOverlay(); updateKeyPressGui(); }); document.addEventListener('keyup', (e) => { switch (e.key.toLowerCase()) { case 'w': stats.keys.w = false; break; case 'a': stats.keys.a = false; break; case 's': stats.keys.s = false; break; case 'd': stats.keys.d = false; break; case ' ': stats.keys.space = false; break; } updateStatsOverlay(); updateKeyPressGui(); }); // Mouse position listener document.addEventListener('mousemove', (e) => { stats.mouse.x = e.clientX; stats.mouse.y = e.clientY; updateStatsOverlay(); }); initCrosshairCanvas(); window.addEventListener('resize', resizeCrosshair); const categories = [ { name: 'Advantage', icon: 'bolt', description: 'Tactical mesh effects', meshes: [ { name: 'Normal', icon: 'cube', desc: 'Default rendering' }, { name: 'Glow Neon', icon: 'lightbulb', desc: 'Bright neon glow' }, { name: 'Red Danger', icon: 'exclamation-triangle', desc: 'Red threat highlight' }, { name: 'Hacker Matrix', icon: 'code', desc: 'Green wireframe' }, { name: 'Chrome Metal', icon: 'gem', desc: 'Metallic finish' }, { name: 'Shadow Cloak', icon: 'user-secret', desc: 'Dark semi-transparent cloak' }, { name: 'Crystal Clear', icon: 'gem', desc: 'Translucent crystal effect' }, { name: 'Toxic Haze', icon: 'biohazard', desc: 'Green toxic glow' }, { name: 'Phantom Outline', icon: 'ghost', desc: 'White wireframe outline' }, { name: 'Electric Grid', icon: 'bolt', desc: 'Blue electric wireframe' } ] }, { name: 'Utility', icon: 'palette', description: 'Dynamic visual effects', meshes: [ { name: 'Rainbow', icon: 'rainbow', desc: 'Cycling colors' }, { name: 'Aurora Borealis', icon: 'cloud', desc: 'Northern lights' }, { name: 'Neon Pulse', icon: 'bolt', desc: 'Pulsating glow' }, { name: 'Solar Flare', icon: 'sun', desc: 'Fiery pulses' }, { name: 'Gold Pulse', icon: 'star', desc: 'Gold shimmer' }, { name: 'Cosmic Void', icon: 'space-shuttle', desc: 'Deep space pulse' }, { name: 'Starfield Flux', icon: 'star', desc: 'Starry dynamic glow' }, { name: 'Plasma Surge', icon: 'fire', desc: 'Purple plasma waves' }, { name: 'Galactic Spiral', icon: 'galactic-republic', desc: 'Spiraling cosmic hues' }, { name: 'Quantum Flicker', icon: 'atom', desc: 'Randomized purple flicker' } ] }, { name: 'Crosshair', icon: 'crosshairs', description: 'Custom crosshairs', crosshairs: [ { name: 'None', icon: 'ban', desc: 'No crosshair' }, { name: 'Dot', icon: 'circle', desc: 'Centered dot' }, { name: 'Cross', icon: 'plus', desc: 'Cross shape' }, { name: 'Plus', icon: 'plus-square', desc: 'Plus shape' }, { name: 'Dynamic Dot', icon: 'circle-notch', desc: 'Pulsing dot' } ] }, { name: 'Stats', icon: 'chart-line', description: 'Toggle stats overlays for gameplay info', stats: [] }, { name: 'Settings', icon: 'cog', description: 'Client configuration', settings: [] }, { name: 'About', icon: 'info-circle', description: 'Client information', about: [] } ]; let currentCategory = 'Advantage'; function createButtonGrid(options, type, prop, labelKey, callback) { const grid = document.createElement('div'); grid.className = 'btn-grid'; options.forEach(opt => { const btn = document.createElement('button'); btn.className = `cheat-btn ${settings.player[prop] === (typeof opt === 'object' ? opt[labelKey] : opt) ? 'active' : ''}`; btn.innerHTML = `<i class="fas fa-${opt.icon || 'cube'}"></i> ${typeof opt === 'object' ? opt[labelKey] : opt.toString()}`; btn.onclick = () => { settings.player[prop] = typeof opt === 'object' ? opt[labelKey] : opt; grid.querySelectorAll('.cheat-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); callback(opt); applySettings(); saveSettings(); }; grid.appendChild(btn); }); return grid; } function updateCategoryButtons() { tabs.innerHTML = ''; categories.forEach(cat => { const btn = document.createElement('button'); btn.innerHTML = `<i class="fas fa-${cat.icon}"></i> ${cat.name}`; btn.classList.toggle('active', cat.name === currentCategory); 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('label'); info.textContent = categories.find(c => c.name === currentCategory).description; tabContent.appendChild(info); if (currentCategory === 'Advantage' || currentCategory === 'Utility') { const meshes = categories.find(c => c.name === currentCategory).meshes; const grid = createButtonGrid(meshes, 'mesh', 'meshType', 'name', (mesh) => { showNotification(`Mesh set to ${mesh.name}`); }); tabContent.appendChild(grid); } else if (currentCategory === 'Crosshair') { const crosshairs = categories.find(c => c.name === currentCategory).crosshairs; const crosshairGrid = createButtonGrid(crosshairs, 'crosshair', 'crosshairType', 'name', (ch) => { showNotification(`Crosshair set to ${ch.name}`); }); tabContent.appendChild(crosshairGrid); const sizeLabel = document.createElement('label'); sizeLabel.textContent = 'Crosshair Size'; const sizeGrid = createButtonGrid([10, 20, 30, 40], 'size', 'crosshairSize', 'toString', (size) => { showNotification(`Crosshair Size set to ${size}px`); }); tabContent.appendChild(sizeLabel); tabContent.appendChild(sizeGrid); const gapLabel = document.createElement('label'); gapLabel.textContent = 'Crosshair Gap'; const gapGrid = createButtonGrid([0, 5, 10, 15], 'gap', 'crosshairGap', 'toString', (gap) => { showNotification(`Crosshair Gap set to ${gap}px`); }); 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 = settings.player.crosshairColor; colorPicker.onchange = () => { settings.player.crosshairColor = colorPicker.value; showNotification(`Crosshair color set`); applySettings(); saveSettings(); }; tabContent.appendChild(colorLabel); tabContent.appendChild(colorPicker); } else if (currentCategory === 'Stats') { const btnGrid = document.createElement('div'); btnGrid.className = 'btn-grid'; const toggles = [ { name: 'Ping', prop: 'showPing', icon: 'network-wired', desc: 'Toggle ping display' }, { name: 'FPS', prop: 'showFps', icon: 'tachometer-alt', desc: 'Toggle FPS display' }, { name: 'Keys', prop: 'showKeys', icon: 'keyboard', desc: 'Toggle WASD/Space display' }, { name: 'Mouse', prop: 'showMouse', icon: 'mouse', desc: 'Toggle mouse position' }, { name: 'Game Time', prop: 'showGameTime', icon: 'clock', desc: 'Toggle session time' } ]; toggles.forEach(toggle => { const btn = document.createElement('button'); btn.className = `cheat-btn ${settings.player[toggle.prop] ? 'active' : ''}`; btn.innerHTML = `<i class="fas fa-${toggle.icon}"></i> ${toggle.name}: ${settings.player[toggle.prop] ? 'ON' : 'OFF'}`; btn.onclick = () => { settings.player[toggle.prop] = !settings.player[toggle.prop]; btn.innerHTML = `<i class="fas fa-${toggle.icon}"></i> ${toggle.name}: ${settings.player[toggle.prop] ? 'ON' : 'OFF'}`; btn.classList.toggle('active'); showNotification(`${toggle.name} display ${settings.player[toggle.prop] ? 'enabled' : 'disabled'}`); applySettings(); saveSettings(); }; btnGrid.appendChild(btn); }); tabContent.appendChild(btnGrid); } else if (currentCategory === 'Settings') { const btnGrid = document.createElement('div'); btnGrid.className = 'btn-grid'; const toggles = [ { name: 'Wallhacks', prop: 'seeThroughWalls', icon: 'eye', desc: 'Toggle wall visibility' }, { name: 'Wireframe', prop: 'wireframe', icon: 'draw-polygon', desc: 'Toggle wireframe mode' }, { name: 'Notifications', prop: 'notifications', icon: 'bell', desc: 'Toggle notifications' }, { name: 'Mod Status', prop: 'modStatus', icon: 'shield-alt', desc: 'Toggle status display' } ]; toggles.forEach(toggle => { const btn = document.createElement('button'); btn.className = `cheat-btn ${settings.player[toggle.prop] ? 'active' : ''}`; btn.innerHTML = `<i class="fas fa-${toggle.icon}"></i> ${toggle.name}: ${settings.player[toggle.prop] ? 'ON' : 'OFF'}`; btn.onclick = () => { settings.player[toggle.prop] = !settings.player[toggle.prop]; btn.innerHTML = `<i class="fas fa-${toggle.icon}"></i> ${toggle.name}: ${settings.player[toggle.prop] ? 'ON' : 'OFF'}`; btn.classList.toggle('active'); showNotification(`${toggle.name} ${settings.player[toggle.prop] ? 'enabled' : 'disabled'}`); if (toggle.prop === 'modStatus') { document.getElementById('mod-status').style.display = settings.player.modStatus ? 'block' : 'none'; } applySettings(); saveSettings(); }; btnGrid.appendChild(btn); }); tabContent.appendChild(btnGrid); const opacityLabel = document.createElement('label'); opacityLabel.textContent = 'Mesh Opacity'; const opacityGrid = createButtonGrid([ { value: 0.1, icon: 'low-vision' }, { value: 0.3, icon: 'low-vision' }, { value: 0.5, icon: 'low-vision' }, { value: 0.7, icon: 'low-vision' }, { value: 0.9, icon: 'low-vision' }, { value: 1.0, icon: 'eye' } ], 'opacity', 'opacity', 'value', (op) => { showNotification(`Opacity set to ${op.value}`); }); tabContent.appendChild(opacityLabel); tabContent.appendChild(opacityGrid); const speedLabel = document.createElement('label'); speedLabel.textContent = 'Animation Speed'; const speedGrid = createButtonGrid([ { value: 0.5, icon: 'tachometer-alt' }, { value: 1.0, icon: 'tachometer-alt' }, { value: 1.5, icon: 'tachometer-alt' }, { value: 2.0, icon: 'tachometer-alt' } ], 'speed', 'animationSpeed', 'value', (speed) => { showNotification(`Animation speed set to ${speed.value}x`); }); tabContent.appendChild(speedLabel); tabContent.appendChild(speedGrid); const keyGuiOpacityLabel = document.createElement('label'); keyGuiOpacityLabel.textContent = 'Key GUI Opacity'; const keyGuiOpacitySlider = document.createElement('input'); keyGuiOpacitySlider.type = 'range'; keyGuiOpacitySlider.min = '0'; keyGuiOpacitySlider.max = '1'; keyGuiOpacitySlider.step = '0.1'; keyGuiOpacitySlider.value = settings.player.keyGuiOpacity; keyGuiOpacitySlider.oninput = () => { settings.player.keyGuiOpacity = parseFloat(keyGuiOpacitySlider.value); showNotification(`Key GUI opacity set to ${settings.player.keyGuiOpacity}`); applySettings(); saveSettings(); }; tabContent.appendChild(keyGuiOpacityLabel); tabContent.appendChild(keyGuiOpacitySlider); const themeLabel = document.createElement('label'); themeLabel.textContent = 'Theme'; const themeGrid = createButtonGrid([ { value: 'gold-black', icon: 'star' }, { value: 'dark-neon', icon: 'lightbulb' }, { value: 'cyber-blue', icon: 'bolt' } ], 'theme', 'theme', 'value', (theme) => { menu.dataset.theme = theme.value; showNotification(`Theme set to ${theme.value}`); }); tabContent.appendChild(themeLabel); tabContent.appendChild(themeGrid); } else if (currentCategory === 'About') { tabContent.innerHTML = ` <p style="font-size: 12px; line-height: 1.5;"> <strong>Emulation Premium v${clientVersion}</strong><br> A feature-rich cheat client for Voxiom.io.<br><br> <strong>Features:</strong><br> - 20 unique mesh types (10 Advantage, 10 Utility)<br> - Custom crosshairs with size, gap, and color options<br> - Stats overlay (Ping, FPS, Keys, Mouse, Game Time)<br> - Draggable and resizable key input GUI with opacity control<br> - Customizable themes (gold-black, dark-neon, cyber-blue)<br> - Persistent settings with localStorage<br> - Smooth animations and cosmic-themed UI<br><br> <strong>Author:</strong> Emulation<br> <strong>License:</strong> MIT </p> <hr> <label>Version History</label> `; const versions = [ { version: '3.0.0', changes: 'Added version history accordions in About tab. Introduced Key GUI opacity slider in Settings.' }, { version: '2.9.2', changes: 'Removed LMB, RMB, and Shift from Key Inputs GUI. Simplified key GUI layout to W, A, S, D, Space.' }, { version: '2.9.1', changes: 'Added draggable and resizable Key Inputs GUI. Improved stats overlay rendering.' }, { version: '2.9.0', changes: 'Introduced 10 new Utility mesh types. Added persistent tutorial system.' } ]; versions.forEach(v => { const accordion = document.createElement('div'); accordion.className = 'accordion'; accordion.innerHTML = ` <div class="accordion-header"> <span>Version ${v.version}</span> <i class="fas fa-chevron-down"></i> </div> <div class="accordion-content"> <p>${v.changes}</p> </div> `; const header = accordion.querySelector('.accordion-header'); const content = accordion.querySelector('.accordion-content'); header.onclick = () => { content.classList.toggle('active'); header.querySelector('i').classList.toggle('fa-chevron-down'); header.querySelector('i').classList.toggle('fa-chevron-up'); }; tabContent.appendChild(accordion); }); } body.appendChild(tabContent); } updateCategoryButtons(); updateCategoryUI(); applySettings(); // Toggle menu document.addEventListener('keydown', (e) => { if (e.key === ';') { menu.style.display = menu.style.display === 'none' ? 'flex' : 'none'; showNotification(`Menu ${menu.style.display === 'none' ? 'hidden' : 'shown'}`); } }); // Start animation animationFrameId = requestAnimationFrame(animate); // Start tutorial if not dismissed if (!localStorage.getItem('tutorialDismissed')) { startTutorial(); localStorage.setItem('tutorialDismissed', 'true'); } } })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址