// ==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();
})();