premium omoggle script (fixed opponent score, color picker, language selector, FREE badge, control bar hidden by default, +/- buttons, resizable panel)
// ==UserScript==
// @name cheatmoggle
// @namespace https://omoggle.com/
// @version 13.6.2
// @description premium omoggle script (fixed opponent score, color picker, language selector, FREE badge, control bar hidden by default, +/- buttons, resizable panel)
// @match https://omoggle.com/*
// @match https://*.omoggle.com/*
// @grant unsafeWindow
// @run-at document-start
// ==/UserScript==
(function () {
'use strict';
const _window = (typeof unsafeWindow !== 'undefined') ? unsafeWindow : window;
// ==================== LANGUAGE TRANSLATIONS ====================
// English simplified (short, clear labels)
const LANGUAGES = {
en: {
name: 'English',
systemStatus: 'Home',
masterSwitch: 'Master',
powerStatus: 'Power',
active: 'ON',
inactive: 'OFF',
matchType: 'Mode',
hookStatus: 'Hook',
pending: 'PENDING',
hooked: 'HOOKED',
unbanClearCookies: 'Unban / Clear Cookies',
verificationBypass: 'Verification Bypass',
scoreControl: 'Score',
mode: 'Mode',
range: 'Range',
fixed: 'Fixed',
scoreMin: 'Min (1-10)',
scoreMax: 'Max (1-10)',
resultSettings: 'Final',
type: 'Type',
staticScore: 'Static',
dynamic: 'Dynamic',
target: 'Target (1-10)',
lowerBound: 'Lower (1-10)',
upperBound: 'Upper (1-10)',
matchmaking: 'Auto',
autoQueue: 'Auto Queue',
requestDelayMs: 'Delay (ms)',
autoFindNewMatch: 'Auto Find New',
spoofCycling: 'Cycling',
autoCycleCamera: 'Auto Cycle Cam',
cameraIntervalSec: 'Cam Int (s)',
autoCycleAudio: 'Auto Cycle Audio',
audioIntervalSec: 'Audio Int (s)',
convenience: 'Utils',
autoDismissPopups: 'Auto Dismiss',
autoClearCookiesOnBan: 'Auto Clear on Ban',
virtualCamera: 'Camera',
activateSpoof: 'Activate',
flipHorizontal: 'Flip H',
loopVideo: 'Loop',
playbackSpeed: 'Speed',
source: 'Src',
video: 'Video',
image: 'Image',
selectVideo: 'Select video...',
selectImage: 'Select image...',
textOverlay: 'Text',
enableText: 'Enable',
content: 'Text',
color: 'Color',
size: 'Size',
audioSpoof: 'Audio',
activateAudioSpoof: 'Activate',
selectAudio: 'Select audio...',
loop: 'Loop',
speed: 'Speed',
volume: 'Volume',
bass: 'Bass',
treble: 'Treble',
warmth: 'Warmth',
status: 'Status',
inactiveStatus: 'Inactive',
activeStatus: 'Active',
overlayEffects: 'Overlays',
banOverlay: 'Ban',
loadingOverlay: 'Loading',
noneOverlay: 'None',
developer: 'Dev',
consoleLogs: 'Console Logs',
hotkeys: 'Hotkeys',
openPanel: 'Open Panel',
streamProof: 'Stream',
panicKey: 'Panic Key',
mobileTripleTap: 'Mobile: Triple-tap',
showControlBar: 'Show Control Bar',
hideAllNow: 'Hide All',
iframeModeObs: 'Iframe (OBS)',
hidesGui: 'Hide GUI from capture',
branding: 'Brand',
displayBadge: 'Show Badge',
visibility: 'Opacity',
appearance: 'Theme',
customization: 'Custom',
accentColor: 'Accent',
language: 'Language',
credits: 'Credits',
developers: 'Devs'
},
ru: {
name: 'Русский',
systemStatus: 'Состояние системы',
masterSwitch: 'Главный выключатель',
powerStatus: 'Статус питания',
active: 'АКТИВЕН',
inactive: 'НЕАКТИВЕН',
matchType: 'Тип матча',
hookStatus: 'Статус хука',
pending: 'ОЖИДАНИЕ',
hooked: 'ПОДКЛЮЧЕН',
unbanClearCookies: 'Разбан / Очистить куки',
verificationBypass: 'Обход верификации',
scoreControl: 'Управление счетом',
mode: 'Режим',
range: 'Диапазон',
fixed: 'Фикс',
scoreMin: 'Мин (1-10)',
scoreMax: 'Макс (1-10)',
resultSettings: 'Настройки результата',
type: 'Тип',
staticScore: 'Статика',
dynamic: 'Динамика',
target: 'Цель (1-10)',
lowerBound: 'Нижняя граница (1-10)',
upperBound: 'Верхняя граница (1-10)',
matchmaking: 'Поиск матча',
autoQueue: 'Автоочередь',
requestDelayMs: 'Задержка запроса (мс)',
autoFindNewMatch: 'Авто поиск нового матча',
spoofCycling: 'Цикл подмены',
autoCycleCamera: 'Автоцикл камеры',
cameraIntervalSec: 'Интервал камеры (с)',
autoCycleAudio: 'Автоцикл аудио',
audioIntervalSec: 'Интервал аудио (с)',
convenience: 'Удобство',
autoDismissPopups: 'Авто закрытие окон',
autoClearCookiesOnBan: 'Очищать куки при бане',
virtualCamera: 'Виртуальная камера',
activateSpoof: 'Активировать подмену',
flipHorizontal: 'Отражение по горизонтали',
loopVideo: 'Повтор видео',
playbackSpeed: 'Скорость воспроизведения',
source: 'Источник',
video: 'Видео',
image: 'Изображение',
selectVideo: 'Выбрать видео...',
selectImage: 'Выбрать изображение...',
textOverlay: 'Текст поверх',
enableText: 'Включить текст',
content: 'Содержание',
color: 'Цвет',
size: 'Размер',
audioSpoof: 'Подмена аудио',
activateAudioSpoof: 'Активировать подмену аудио',
selectAudio: 'Выбрать аудио...',
loop: 'Повтор',
speed: 'Скорость',
volume: 'Громкость',
bass: 'Бас (дБ)',
treble: 'ВЧ (дБ)',
warmth: 'Теплота (дБ)',
status: 'Статус',
inactiveStatus: 'Неактивен',
activeStatus: 'Активен',
overlayEffects: 'Эффекты наложения',
banOverlay: 'Наложение бана',
loadingOverlay: 'Наложение загрузки',
noneOverlay: 'Нет',
developer: 'Разработчик',
consoleLogs: 'Логи консоли',
hotkeys: 'Горячие клавиши',
openPanel: 'Открыть панель',
streamProof: 'Режим стрима',
panicKey: 'Клавиша паники',
mobileTripleTap: 'Мобильный: тройное нажатие',
showControlBar: 'Показать панель управления',
hideAllNow: 'Скрыть всё сейчас',
iframeModeObs: 'Режим Iframe (OBS)',
hidesGui: 'Скрывает GUI от захвата экрана',
branding: 'Брендинг',
displayBadge: 'Показывать значок',
visibility: 'Видимость',
appearance: 'Внешний вид',
customization: 'Настройка',
accentColor: 'Акцентный цвет',
language: 'Язык',
credits: 'Разработчики',
developers: 'Разработчики'
},
uk: {
name: 'Українська',
systemStatus: 'Стан системи',
masterSwitch: 'Головний вимикач',
powerStatus: 'Стан живлення',
active: 'АКТИВНИЙ',
inactive: 'ВИМКНЕНО',
matchType: 'Тип матчу',
hookStatus: 'Стан хука',
pending: 'ОЧІКУЄ',
hooked: 'ПІДКЛЮЧЕНО',
unbanClearCookies: 'Розбан / Очистити cookie',
verificationBypass: 'Обхід верифікації',
scoreControl: 'Керування рахунком',
mode: 'Режим',
range: 'Діапазон',
fixed: 'Фіксований',
scoreMin: 'Мін (1-10)',
scoreMax: 'Макс (1-10)',
resultSettings: 'Налаштування результату',
type: 'Тип',
staticScore: 'Статичний',
dynamic: 'Динамічний',
target: 'Ціль (1-10)',
lowerBound: 'Нижня межа (1-10)',
upperBound: 'Верхня межа (1-10)',
matchmaking: 'Пошук матчу',
autoQueue: 'Авточерга',
requestDelayMs: 'Затримка запиту (мс)',
autoFindNewMatch: 'Авто пошук нового матчу',
spoofCycling: 'Цикл підміни',
autoCycleCamera: 'Автоцикл камери',
cameraIntervalSec: 'Інтервал камери (с)',
autoCycleAudio: 'Автоцикл аудіо',
audioIntervalSec: 'Інтервал аудіо (с)',
convenience: 'Зручність',
autoDismissPopups: 'Авто закриття спливаючих вікон',
autoClearCookiesOnBan: 'Очищати cookie при бану',
virtualCamera: 'Віртуальна камера',
activateSpoof: 'Активувати підміну',
flipHorizontal: 'Віддзеркалити горизонтально',
loopVideo: 'Повторювати відео',
playbackSpeed: 'Швидкість відтворення',
source: 'Джерело',
video: 'Відео',
image: 'Зображення',
selectVideo: 'Вибрати відео...',
selectImage: 'Вибрати зображення...',
textOverlay: 'Текст поверх',
enableText: 'Увімкнути текст',
content: 'Вміст',
color: 'Колір',
size: 'Розмір',
audioSpoof: 'Підміна аудіо',
activateAudioSpoof: 'Активувати підміну аудіо',
selectAudio: 'Вибрати аудіо...',
loop: 'Повтор',
speed: 'Швидкість',
volume: 'Гучність',
bass: 'Бас (дБ)',
treble: 'Високі частоти (дБ)',
warmth: 'Теплота (дБ)',
status: 'Статус',
inactiveStatus: 'Неактивний',
activeStatus: 'Активний',
overlayEffects: 'Ефекти накладання',
banOverlay: 'Накладання бану',
loadingOverlay: 'Накладання завантаження',
noneOverlay: 'Немає',
developer: 'Розробник',
consoleLogs: 'Логи консолі',
hotkeys: 'Гарячі клавіші',
openPanel: 'Відкрити панель',
streamProof: 'Режим трансляції',
panicKey: 'Клавіша паніки',
mobileTripleTap: 'Мобільний: потрійне натискання',
showControlBar: 'Показати панель керування',
hideAllNow: 'Приховати все зараз',
iframeModeObs: 'Режим Iframe (OBS)',
hidesGui: 'Ховає GUI від захоплення екрана',
branding: 'Брендинг',
displayBadge: 'Показувати значок',
visibility: 'Видимість',
appearance: 'Зовнішній вигляд',
customization: 'Налаштування',
accentColor: 'Акцентний колір',
language: 'Мова',
credits: 'Розробники',
developers: 'Розробники'
},
pt: {
name: 'Português',
systemStatus: 'Estado do sistema',
masterSwitch: 'Interruptor principal',
powerStatus: 'Estado da alimentação',
active: 'ATIVO',
inactive: 'INATIVO',
matchType: 'Tipo de partida',
hookStatus: 'Estado do hook',
pending: 'PENDENTE',
hooked: 'LIGADO',
unbanClearCookies: 'Desbanir / Limpar cookies',
verificationBypass: 'Bypass de verificação',
scoreControl: 'Controlo de pontuação',
mode: 'Modo',
range: 'Intervalo',
fixed: 'Fixo',
scoreMin: 'Mín (1-10)',
scoreMax: 'Máx (1-10)',
resultSettings: 'Definições de resultado',
type: 'Tipo',
staticScore: 'Estático',
dynamic: 'Dinâmico',
target: 'Alvo (1-10)',
lowerBound: 'Limite inferior (1-10)',
upperBound: 'Limite superior (1-10)',
matchmaking: 'Matchmaking',
autoQueue: 'Fila automática',
requestDelayMs: 'Atraso do pedido (ms)',
autoFindNewMatch: 'Encontrar nova partida auto',
spoofCycling: 'Ciclo de spoof',
autoCycleCamera: 'Ciclo automático da câmara',
cameraIntervalSec: 'Intervalo da câmara (s)',
autoCycleAudio: 'Ciclo automático do áudio',
audioIntervalSec: 'Intervalo do áudio (s)',
convenience: 'Conveniência',
autoDismissPopups: 'Fechar popups automaticamente',
autoClearCookiesOnBan: 'Limpar cookies ao ser banido',
virtualCamera: 'Câmara virtual',
activateSpoof: 'Ativar spoof',
flipHorizontal: 'Inverter horizontalmente',
loopVideo: 'Repetir vídeo',
playbackSpeed: 'Velocidade de reprodução',
source: 'Fonte',
video: 'Vídeo',
image: 'Imagem',
selectVideo: 'Selecionar vídeo...',
selectImage: 'Selecionar imagem...',
textOverlay: 'Sobreposição de texto',
enableText: 'Ativar texto',
content: 'Conteúdo',
color: 'Cor',
size: 'Tamanho',
audioSpoof: 'Spoof de áudio',
activateAudioSpoof: 'Ativar spoof de áudio',
selectAudio: 'Selecionar áudio...',
loop: 'Repetir',
speed: 'Velocidade',
volume: 'Volume',
bass: 'Graves (dB)',
treble: 'Agudos (dB)',
warmth: 'Calor (dB)',
status: 'Estado',
inactiveStatus: 'Inativo',
activeStatus: 'Ativo',
overlayEffects: 'Efeitos de sobreposição',
banOverlay: 'Sobreposição de ban',
loadingOverlay: 'Sobreposição de carregamento',
noneOverlay: 'Nenhum',
developer: 'Programador',
consoleLogs: 'Registos da consola',
hotkeys: 'Teclas de atalho',
openPanel: 'Abrir painel',
streamProof: 'Modo de transmissão',
panicKey: 'Tecla de pânico',
mobileTripleTap: 'Móvel: toque triplo',
showControlBar: 'Mostrar barra de controlo',
hideAllNow: 'Ocultar tudo agora',
iframeModeObs: 'Modo Iframe (OBS)',
hidesGui: 'Esconde a GUI da captura de ecrã',
branding: 'Marca',
displayBadge: 'Mostrar emblema',
visibility: 'Visibilidade',
appearance: 'Aparência',
customization: 'Personalização',
accentColor: 'Cor de destaque',
language: 'Idioma',
credits: 'Créditos',
developers: 'Programadores'
},
fr: {
name: 'Français',
systemStatus: 'État du système',
masterSwitch: 'Interrupteur principal',
powerStatus: 'État de l\'alimentation',
active: 'ACTIF',
inactive: 'INACTIF',
matchType: 'Type de match',
hookStatus: 'État du hook',
pending: 'EN ATTENTE',
hooked: 'ACCROCHÉ',
unbanClearCookies: 'Déban / Effacer les cookies',
verificationBypass: 'Contournement de vérification',
scoreControl: 'Contrôle du score',
mode: 'Mode',
range: 'Plage',
fixed: 'Fixe',
scoreMin: 'Min (1-10)',
scoreMax: 'Max (1-10)',
resultSettings: 'Paramètres de résultat',
type: 'Type',
staticScore: 'Statique',
dynamic: 'Dynamique',
target: 'Cible (1-10)',
lowerBound: 'Limite inférieure (1-10)',
upperBound: 'Limite supérieure (1-10)',
matchmaking: 'Matchmaking',
autoQueue: 'File d\'attente auto',
requestDelayMs: 'Délai de requête (ms)',
autoFindNewMatch: 'Trouver un nouveau match auto',
spoofCycling: 'Cycle de spoof',
autoCycleCamera: 'Cycle automatique de la caméra',
cameraIntervalSec: 'Intervalle caméra (s)',
autoCycleAudio: 'Cycle automatique de l\'audio',
audioIntervalSec: 'Intervalle audio (s)',
convenience: 'Confort',
autoDismissPopups: 'Fermer les popups automatiquement',
autoClearCookiesOnBan: 'Effacer les cookies en cas de bannissement',
virtualCamera: 'Caméra virtuelle',
activateSpoof: 'Activer le spoof',
flipHorizontal: 'Retourner horizontalement',
loopVideo: 'Boucle vidéo',
playbackSpeed: 'Vitesse de lecture',
source: 'Source',
video: 'Vidéo',
image: 'Image',
selectVideo: 'Sélectionner une vidéo...',
selectImage: 'Sélectionner une image...',
textOverlay: 'Superposition de texte',
enableText: 'Activer le texte',
content: 'Contenu',
color: 'Couleur',
size: 'Taille',
audioSpoof: 'Spoof audio',
activateAudioSpoof: 'Activer le spoof audio',
selectAudio: 'Sélectionner un fichier audio...',
loop: 'Boucle',
speed: 'Vitesse',
volume: 'Volume',
bass: 'Basses (dB)',
treble: 'Aigus (dB)',
warmth: 'Chaleur (dB)',
status: 'Statut',
inactiveStatus: 'Inactif',
activeStatus: 'Actif',
overlayEffects: 'Effets de superposition',
banOverlay: 'Superposition de bannissement',
loadingOverlay: 'Superposition de chargement',
noneOverlay: 'Aucun',
developer: 'Développeur',
consoleLogs: 'Journaux de la console',
hotkeys: 'Raccourcis',
openPanel: 'Ouvrir le panneau',
streamProof: 'Mode stream',
panicKey: 'Touche panique',
mobileTripleTap: 'Mobile : triple tapotement',
showControlBar: 'Afficher la barre de contrôle',
hideAllNow: 'Tout masquer maintenant',
iframeModeObs: 'Mode Iframe (OBS)',
hidesGui: 'Masque l\'interface de capture d\'écran',
branding: 'Marque',
displayBadge: 'Afficher le badge',
visibility: 'Visibilité',
appearance: 'Apparence',
customization: 'Personnalisation',
accentColor: 'Couleur d\'accent',
language: 'Langue',
credits: 'Crédits',
developers: 'Développeurs'
},
bg: {
name: 'Български',
systemStatus: 'Състояние на системата',
masterSwitch: 'Главен ключ',
powerStatus: 'Състояние на захранването',
active: 'АКТИВЕН',
inactive: 'ИЗКЛЮЧЕН',
matchType: 'Тип мач',
hookStatus: 'Състояние на hook',
pending: 'ИЗЧАКВА',
hooked: 'ВКЛЮЧЕН',
unbanClearCookies: 'Разбан / Изчистване на бисквитки',
verificationBypass: 'Заобикаляне на проверката',
scoreControl: 'Контрол на резултата',
mode: 'Режим',
range: 'Диапазон',
fixed: 'Фиксиран',
scoreMin: 'Мин (1-10)',
scoreMax: 'Макс (1-10)',
resultSettings: 'Настройки на резултата',
type: 'Тип',
staticScore: 'Статичен',
dynamic: 'Динамичен',
target: 'Цел (1-10)',
lowerBound: 'Долна граница (1-10)',
upperBound: 'Горна граница (1-10)',
matchmaking: 'Търсене на мач',
autoQueue: 'Автоопашка',
requestDelayMs: 'Забавяне на заявка (мс)',
autoFindNewMatch: 'Автоматично намиране на нов мач',
spoofCycling: 'Цикъл на подмяна',
autoCycleCamera: 'Автоматичен цикъл на камерата',
cameraIntervalSec: 'Интервал на камерата (с)',
autoCycleAudio: 'Автоматичен цикъл на аудио',
audioIntervalSec: 'Интервал на аудио (с)',
convenience: 'Удобство',
autoDismissPopups: 'Автоматично затваряне на изскачащи прозорци',
autoClearCookiesOnBan: 'Изчистване на бисквитки при бан',
virtualCamera: 'Виртуална камера',
activateSpoof: 'Активиране на подмяна',
flipHorizontal: 'Хоризонтално обръщане',
loopVideo: 'Повторение на видео',
playbackSpeed: 'Скорост на възпроизвеждане',
source: 'Източник',
video: 'Видео',
image: 'Изображение',
selectVideo: 'Избор на видео...',
selectImage: 'Избор на изображение...',
textOverlay: 'Текст отгоре',
enableText: 'Включване на текст',
content: 'Съдържание',
color: 'Цвят',
size: 'Размер',
audioSpoof: 'Подмяна на аудио',
activateAudioSpoof: 'Активиране на подмяна на аудио',
selectAudio: 'Избор на аудио...',
loop: 'Повторение',
speed: 'Скорост',
volume: 'Сила на звука',
bass: 'Бас (dB)',
treble: 'Високи честоти (dB)',
warmth: 'Топлина (dB)',
status: 'Състояние',
inactiveStatus: 'Неактивен',
activeStatus: 'Активен',
overlayEffects: 'Ефекти на наслагване',
banOverlay: 'Наслагване при бан',
loadingOverlay: 'Наслагване при зареждане',
noneOverlay: 'Няма',
developer: 'Разработчик',
consoleLogs: 'Конзолни логи',
hotkeys: 'Бързи клавиши',
openPanel: 'Отваряне на панела',
streamProof: 'Режим на стриймване',
panicKey: 'Клавиш за паника',
mobileTripleTap: 'Мобилен: тройно натискане',
showControlBar: 'Показване на контролния панел',
hideAllNow: 'Скрий всичко сега',
iframeModeObs: 'Iframe режим (OBS)',
hidesGui: 'Скрива GUI от екранен запис',
branding: 'Брандиране',
displayBadge: 'Показване на значка',
visibility: 'Видимост',
appearance: 'Външен вид',
customization: 'Персонализация',
accentColor: 'Акцентен цвят',
language: 'Език',
credits: 'Кредити',
developers: 'Разработчици'
},
de: {
name: 'Deutsch',
systemStatus: 'Systemstatus',
masterSwitch: 'Hauptschalter',
powerStatus: 'Energiestatus',
active: 'AKTIV',
inactive: 'INAKTIV',
matchType: 'Spieltyp',
hookStatus: 'Hook-Status',
pending: 'AUSSTEHEND',
hooked: 'GEHOOKT',
unbanClearCookies: 'Entbannen / Cookies löschen',
verificationBypass: 'Verifikations-Bypass',
scoreControl: 'Punktzahl-Kontrolle',
mode: 'Modus',
range: 'Bereich',
fixed: 'Fest',
scoreMin: 'Min (1-10)',
scoreMax: 'Max (1-10)',
resultSettings: 'Ergebniseinstellungen',
type: 'Typ',
staticScore: 'Statisch',
dynamic: 'Dynamisch',
target: 'Ziel (1-10)',
lowerBound: 'Untergrenze (1-10)',
upperBound: 'Obergrenze (1-10)',
matchmaking: 'Matchmaking',
autoQueue: 'Auto-Warteschlange',
requestDelayMs: 'Anfrageverzögerung (ms)',
autoFindNewMatch: 'Auto neues Spiel finden',
spoofCycling: 'Spoof-Zyklus',
autoCycleCamera: 'Auto Kamera wechseln',
cameraIntervalSec: 'Kamera-Intervall (s)',
autoCycleAudio: 'Auto Audio wechseln',
audioIntervalSec: 'Audio-Intervall (s)',
convenience: 'Komfort',
autoDismissPopups: 'Popups automatisch schließen',
autoClearCookiesOnBan: 'Cookies bei Bann löschen',
virtualCamera: 'Virtuelle Kamera',
activateSpoof: 'Spoof aktivieren',
flipHorizontal: 'Horizontal spiegeln',
loopVideo: 'Video wiederholen',
playbackSpeed: 'Wiedergabegeschwindigkeit',
source: 'Quelle',
video: 'Video',
image: 'Bild',
selectVideo: 'Video auswählen...',
selectImage: 'Bild auswählen...',
textOverlay: 'Textüberlagerung',
enableText: 'Text aktivieren',
content: 'Inhalt',
color: 'Farbe',
size: 'Größe',
audioSpoof: 'Audio-Spoof',
activateAudioSpoof: 'Audio-Spoof aktivieren',
selectAudio: 'Audio auswählen...',
loop: 'Wiederholen',
speed: 'Geschwindigkeit',
volume: 'Lautstärke',
bass: 'Bass (dB)',
treble: 'Höhen (dB)',
warmth: 'Wärme (dB)',
status: 'Status',
inactiveStatus: 'Inaktiv',
activeStatus: 'Aktiv',
overlayEffects: 'Überlagerungseffekte',
banOverlay: 'Bann-Overlay',
loadingOverlay: 'Lade-Overlay',
noneOverlay: 'Keins',
developer: 'Entwickler',
consoleLogs: 'Konsolenlogs',
hotkeys: 'Tastenkürzel',
openPanel: 'Panel öffnen',
streamProof: 'Stream-Modus',
panicKey: 'Panik-Taste',
mobileTripleTap: 'Mobil: dreifaches Antippen',
showControlBar: 'Steuerleiste anzeigen',
hideAllNow: 'Alles ausblenden',
iframeModeObs: 'Iframe-Modus (OBS)',
hidesGui: 'Verbirgt GUI vor Bildschirmaufnahme',
branding: 'Branding',
displayBadge: 'Abzeichen anzeigen',
visibility: 'Sichtbarkeit',
appearance: 'Erscheinungsbild',
customization: 'Anpassung',
accentColor: 'Akzentfarbe',
language: 'Sprache',
credits: 'Credits',
developers: 'Entwickler'
},
es: {
name: 'Español',
systemStatus: 'Estado del sistema',
masterSwitch: 'Interruptor maestro',
powerStatus: 'Estado de energía',
active: 'ACTIVO',
inactive: 'INACTIVO',
matchType: 'Tipo de partida',
hookStatus: 'Estado del hook',
pending: 'PENDIENTE',
hooked: 'ENLAZADO',
unbanClearCookies: 'Desbanear / Limpiar cookies',
verificationBypass: 'Bypass verificación',
scoreControl: 'Control de puntuación',
mode: 'Modo',
range: 'Rango',
fixed: 'Fijo',
scoreMin: 'Mín (1-10)',
scoreMax: 'Máx (1-10)',
resultSettings: 'Ajustes de resultado',
type: 'Tipo',
staticScore: 'Estático',
dynamic: 'Dinámico',
target: 'Objetivo (1-10)',
lowerBound: 'Límite inferior (1-10)',
upperBound: 'Límite superior (1-10)',
matchmaking: 'Emparejamiento',
autoQueue: 'Cola automática',
requestDelayMs: 'Retardo de solicitud (ms)',
autoFindNewMatch: 'Buscar nueva partida auto',
spoofCycling: 'Ciclo de spoofing',
autoCycleCamera: 'Ciclo automático cámara',
cameraIntervalSec: 'Intervalo cámara (s)',
autoCycleAudio: 'Ciclo automático audio',
audioIntervalSec: 'Intervalo audio (s)',
convenience: 'Conveniencia',
autoDismissPopups: 'Cerrar ventanas auto',
autoClearCookiesOnBan: 'Limpiar cookies al ser baneado',
virtualCamera: 'Cámara virtual',
activateSpoof: 'Activar spoof',
flipHorizontal: 'Voltear horizontal',
loopVideo: 'Repetir video',
playbackSpeed: 'Velocidad reproducción',
source: 'Fuente',
video: 'Video',
image: 'Imagen',
selectVideo: 'Seleccionar video...',
selectImage: 'Seleccionar imagen...',
textOverlay: 'Superposición texto',
enableText: 'Activar texto',
content: 'Contenido',
color: 'Color',
size: 'Tamaño',
audioSpoof: 'Spoof de audio',
activateAudioSpoof: 'Activar spoof audio',
selectAudio: 'Seleccionar audio...',
loop: 'Repetir',
speed: 'Velocidad',
volume: 'Volumen',
bass: 'Graves (dB)',
treble: 'Agudos (dB)',
warmth: 'Calidez (dB)',
status: 'Estado',
inactiveStatus: 'Inactivo',
activeStatus: 'Activo',
overlayEffects: 'Efectos superpuestos',
banOverlay: 'Superposición baneo',
loadingOverlay: 'Superposición carga',
noneOverlay: 'Ninguno',
developer: 'Desarrollador',
consoleLogs: 'Registros consola',
hotkeys: 'Teclas rápidas',
openPanel: 'Abrir panel',
streamProof: 'Modo stream',
panicKey: 'Tecla pánico',
mobileTripleTap: 'Móvil: triple toque botón',
showControlBar: 'Mostrar barra control',
hideAllNow: 'Ocultar todo ahora',
iframeModeObs: 'Modo Iframe (OBS)',
hidesGui: 'Oculta la GUI de captura pantalla',
branding: 'Marca',
displayBadge: 'Mostrar insignia',
visibility: 'Visibilidad',
appearance: 'Apariencia',
customization: 'Personalización',
accentColor: 'Color acento',
language: 'Idioma',
credits: 'Créditos',
developers: 'Desarrolladores'
},
it: {
name: 'Italiano',
systemStatus: 'Stato sistema',
masterSwitch: 'Interruttore principale',
powerStatus: 'Stato alimentazione',
active: 'ATTIVO',
inactive: 'INATTIVO',
matchType: 'Tipo partita',
hookStatus: 'Stato hook',
pending: 'IN ATTESA',
hooked: 'AGGANCIATO',
unbanClearCookies: 'Sblocca / Cancella cookie',
verificationBypass: 'Bypass verifica',
scoreControl: 'Controllo punteggio',
mode: 'Modalità',
range: 'Intervallo',
fixed: 'Fisso',
scoreMin: 'Min (1-10)',
scoreMax: 'Max (1-10)',
resultSettings: 'Impostazioni risultato',
type: 'Tipo',
staticScore: 'Statico',
dynamic: 'Dinamico',
target: 'Obiettivo (1-10)',
lowerBound: 'Limite inferiore (1-10)',
upperBound: 'Limite superiore (1-10)',
matchmaking: 'Matchmaking',
autoQueue: 'Coda automatica',
requestDelayMs: 'Ritardo richiesta (ms)',
autoFindNewMatch: 'Trova nuova partita auto',
spoofCycling: 'Ciclo spoof',
autoCycleCamera: 'Ciclo automatico fotocamera',
cameraIntervalSec: 'Intervallo fotocamera (s)',
autoCycleAudio: 'Ciclo automatico audio',
audioIntervalSec: 'Intervallo audio (s)',
convenience: 'Comodità',
autoDismissPopups: 'Chiudi popup automaticamente',
autoClearCookiesOnBan: 'Cancella cookie al ban',
virtualCamera: 'Fotocamera virtuale',
activateSpoof: 'Attiva spoof',
flipHorizontal: 'Capovolgi orizzontale',
loopVideo: 'Ripeti video',
playbackSpeed: 'Velocità riproduzione',
source: 'Sorgente',
video: 'Video',
image: 'Immagine',
selectVideo: 'Seleziona video...',
selectImage: 'Seleziona immagine...',
textOverlay: 'Sovrapposizione testo',
enableText: 'Attiva testo',
content: 'Contenuto',
color: 'Colore',
size: 'Dimensione',
audioSpoof: 'Spoof audio',
activateAudioSpoof: 'Attiva spoof audio',
selectAudio: 'Seleziona audio...',
loop: 'Ripeti',
speed: 'Velocità',
volume: 'Volume',
bass: 'Bassi (dB)',
treble: 'Acuti (dB)',
warmth: 'Calore (dB)',
status: 'Stato',
inactiveStatus: 'Inattivo',
activeStatus: 'Attivo',
overlayEffects: 'Effetti sovrapposizione',
banOverlay: 'Sovrapposizione ban',
loadingOverlay: 'Sovrapposizione caricamento',
noneOverlay: 'Nessuno',
developer: 'Sviluppatore',
consoleLogs: 'Log console',
hotkeys: 'Scorciatoie',
openPanel: 'Apri pannello',
streamProof: 'Prova streaming',
panicKey: 'Tasto panico',
mobileTripleTap: 'Mobile: triplo tocco pulsante',
showControlBar: 'Mostra barra controllo',
hideAllNow: 'Nascondi tutto ora',
iframeModeObs: 'Modalità Iframe (OBS)',
hidesGui: 'Nasconde GUI dalla cattura schermo',
branding: 'Marchio',
displayBadge: 'Mostra badge',
visibility: 'Visibilità',
appearance: 'Aspetto',
customization: 'Personalizzazione',
accentColor: 'Colore accento',
language: 'Lingua',
credits: 'Crediti',
developers: 'Sviluppatori'
}
};
let currentLang = 'en';
const DEFAULT_CONFIG = {
enabled: true,
scoreEnabled: true,
scoreMode: 'range',
fixedScore: 94000,
scoreRangeMin: 85000,
scoreRangeMax: 95000,
resultEnabled: true,
myFinalScore: "94000",
finalScoreMode: 'fixed',
finalScoreRangeMin: 85000,
finalScoreRangeMax: 97000,
holdBtnSize: 54,
debug: true,
wmAlpha: 20,
wmFontSize: 9,
wmPaddingH: 14,
wmPaddingV: 6,
wmBorder: true,
wmBg: true,
theme: 'midnight',
queueDelay: 1000,
autoCamInterval: 5,
autoAudioInterval: 5,
showControlBar: false, // hidden by default
autoQueue: false,
accentColor: '#6366f1',
language: 'en',
panelWidth: 300, // saved panel size
panelHeight: null // auto
};
function loadConfig() {
try {
const saved = localStorage.getItem('cheatmoggle _config');
if (saved) return { ...DEFAULT_CONFIG, ...JSON.parse(saved) };
} catch (e) {}
return { ...DEFAULT_CONFIG };
}
function saveConfig() {
try {
localStorage.setItem('cheatmoggle _config', JSON.stringify(CONFIG));
} catch (e) {}
}
const CONFIG = loadConfig();
currentLang = CONFIG.language || 'en';
const THEMES = {
amoled: { name: 'AMOLED', primary: '#000000', primaryRgb: '0,0,0', secondary: '#171717', accent: '#ffffff', accentRgb: '255,255,255', success: '#22c55e', warning: '#eab308', danger: '#ef4444', bgDark: '#000000', bgCard: '#0a0a0a', bgElevated: '#141414', border: 'rgba(255,255,255,0.15)', text: '#ffffff', textMuted: '#a1a1aa' },
neon: { name: 'Neon', primary: '#00ff88', primaryRgb: '0,255,136', secondary: '#00cc6a', accent: '#7dffb3', accentRgb: '125,255,179', success: '#00ff88', warning: '#ffcc00', danger: '#ff4444', bgDark: '#0a0f0c', bgCard: '#0d1a12', bgElevated: '#132218', border: 'rgba(0,255,136,0.15)', text: '#e0ffe8', textMuted: '#7da88a' },
matrix: { name: 'Matrix', primary: '#00ff00', primaryRgb: '0,255,0', secondary: '#00cc00', accent: '#66ff66', accentRgb: '102,255,102', success: '#00ff00', warning: '#ccff00', danger: '#ff3333', bgDark: '#000800', bgCard: '#001a00', bgElevated: '#002200', border: 'rgba(0,255,0,0.12)', text: '#ccffcc', textMuted: '#669966' },
toxic: { name: 'Toxic', primary: '#39ff14', primaryRgb: '57,255,20', secondary: '#7fff00', accent: '#adff2f', accentRgb: '173,255,47', success: '#39ff14', warning: '#ffff00', danger: '#ff6347', bgDark: '#080a05', bgCard: '#101408', bgElevated: '#181f0c', border: 'rgba(57,255,20,0.12)', text: '#e8ffe0', textMuted: '#8faa7d' },
midnight: { name: 'Midnight', primary: '#6366f1', primaryRgb: '99,102,241', secondary: '#8b5cf6', accent: '#22d3ee', accentRgb: '34,211,238', success: '#10b981', warning: '#f59e0b', danger: '#ef4444', bgDark: '#0a0a0f', bgCard: '#12121a', bgElevated: '#1a1a24', border: 'rgba(255,255,255,0.08)', text: '#e4e4e7', textMuted: '#71717a' },
crimson: { name: 'Crimson', primary: '#dc2626', primaryRgb: '220,38,38', secondary: '#f43f5e', accent: '#fb7185', accentRgb: '251,113,133', success: '#10b981', warning: '#f59e0b', danger: '#ef4444', bgDark: '#0f0505', bgCard: '#1a0a0a', bgElevated: '#241010', border: 'rgba(255,100,100,0.1)', text: '#fecaca', textMuted: '#a8a29e' },
ocean: { name: 'Ocean', primary: '#0ea5e9', primaryRgb: '14,165,233', secondary: '#38bdf8', accent: '#7dd3fc', accentRgb: '125,211,252', success: '#14b8a6', warning: '#fbbf24', danger: '#f87171', bgDark: '#042f42', bgCard: '#0a3d55', bgElevated: '#0f4c68', border: 'rgba(56,189,248,0.15)', text: '#e0f2fe', textMuted: '#7ca8c0' },
sunset: { name: 'Sunset', primary: '#f97316', primaryRgb: '249,115,22', secondary: '#fb923c', accent: '#fbbf24', accentRgb: '251,191,36', success: '#22c55e', warning: '#eab308', danger: '#ef4444', bgDark: '#3b0d11', bgCard: '#4f151b', bgElevated: '#641e26', border: 'rgba(251,146,60,0.15)', text: '#ffedd5', textMuted: '#c49a7a' },
lavender: { name: 'Lavender', primary: '#a855f7', primaryRgb: '168,85,247', secondary: '#c084fc', accent: '#d8b4fe', accentRgb: '216,180,254', success: '#34d399', warning: '#facc15', danger: '#fb7185', bgDark: '#1e0a33', bgCard: '#2a1245', bgElevated: '#361b58', border: 'rgba(192,132,252,0.15)', text: '#f3e8ff', textMuted: '#b89ad4' },
forest: { name: 'Forest', primary: '#16a34a', primaryRgb: '22,163,74', secondary: '#22c55e', accent: '#86efac', accentRgb: '134,239,172', success: '#16a34a', warning: '#ca8a04', danger: '#dc2626', bgDark: '#052e12', bgCard: '#0a3d1a', bgElevated: '#0f4d23', border: 'rgba(34,197,94,0.12)', text: '#dcfce7', textMuted: '#7aad8c' },
gold: { name: 'Gold', primary: '#f59e0b', primaryRgb: '245,158,11', secondary: '#fbbf24', accent: '#fde68a', accentRgb: '253,230,138', success: '#10b981', warning: '#f59e0b', danger: '#ef4444', bgDark: '#2b1d04', bgCard: '#3d2a08', bgElevated: '#4f370c', border: 'rgba(251,191,36,0.15)', text: '#fef9c3', textMuted: '#c9ab5e' },
ice: { name: 'Ice', primary: '#67e8f9', primaryRgb: '103,232,249', secondary: '#22d3ee', accent: '#cffafe', accentRgb: '207,250,254', success: '#34d399', warning: '#fbbf24', danger: '#fb7185', bgDark: '#083344', bgCard: '#0c425a', bgElevated: '#115270', border: 'rgba(103,232,249,0.15)', text: '#cffafe', textMuted: '#7fc4d6' },
bloodorange: { name: 'Blood Orange', primary: '#ea580c', primaryRgb: '234,88,12', secondary: '#f97316', accent: '#fdba74', accentRgb: '253,186,116', success: '#22c55e', warning: '#eab308', danger: '#ef4444', bgDark: '#1f0a02', bgCard: '#2e1006', bgElevated: '#3d170a', border: 'rgba(234,88,12,0.15)', text: '#ffedd5', textMuted: '#bf8a60' },
cyberpunk: { name: 'Cyberpunk', primary: '#ff00ff', primaryRgb: '255,0,255', secondary: '#00ffff', accent: '#ff66ff', accentRgb: '255,102,255', success: '#00ff88', warning: '#ffff00', danger: '#ff3333', bgDark: '#0a0014', bgCard: '#14001f', bgElevated: '#1e002e', border: 'rgba(255,0,255,0.15)', text: '#f0e6ff', textMuted: '#b380d4' },
rose: { name: 'Rose', primary: '#e11d48', primaryRgb: '225,29,72', secondary: '#fb7185', accent: '#fda4af', accentRgb: '253,164,175', success: '#10b981', warning: '#f59e0b', danger: '#ef4444', bgDark: '#1a040a', bgCard: '#2a0812', bgElevated: '#3a0c1a', border: 'rgba(251,113,133,0.12)', text: '#fce7f3', textMuted: '#c48a9a' },
mint: { name: 'Mint', primary: '#14b8a6', primaryRgb: '20,184,166', secondary: '#2dd4bf', accent: '#5eead4', accentRgb: '94,234,212', success: '#14b8a6', warning: '#eab308', danger: '#ef4444', bgDark: '#022c22', bgCard: '#053d32', bgElevated: '#084f42', border: 'rgba(45,212,191,0.15)', text: '#ccfbf1', textMuted: '#7ab8a8' },
sky: { name: 'Sky', primary: '#3b82f6', primaryRgb: '59,130,246', secondary: '#60a5fa', accent: '#93c5fd', accentRgb: '147,197,253', success: '#22c55e', warning: '#eab308', danger: '#ef4444', bgDark: '#0a1e3d', bgCard: '#0f2850', bgElevated: '#153364', border: 'rgba(96,165,250,0.15)', text: '#dbeafe', textMuted: '#809ec8' },
coral: { name: 'Coral', primary: '#f43f5e', primaryRgb: '244,63,94', secondary: '#fb7185', accent: '#fda4af', accentRgb: '253,164,175', success: '#22c55e', warning: '#eab308', danger: '#dc2626', bgDark: '#1f0a0f', bgCard: '#2e0f16', bgElevated: '#3d151e', border: 'rgba(251,113,133,0.12)', text: '#ffe4e6', textMuted: '#cf8a94' },
slate: { name: 'Slate', primary: '#6366f1', primaryRgb: '99,102,241', secondary: '#818cf8', accent: '#a5b4fc', accentRgb: '165,180,252', success: '#34d399', warning: '#fbbf24', danger: '#f87171', bgDark: '#0c0f15', bgCard: '#141a24', bgElevated: '#1c2433', border: 'rgba(129,140,248,0.1)', text: '#e2e8f0', textMuted: '#7c8594' },
auburn: { name: 'Auburn', primary: '#b45309', primaryRgb: '180,83,9', secondary: '#d97706', accent: '#f59e0b', accentRgb: '245,158,11', success: '#22c55e', warning: '#eab308', danger: '#dc2626', bgDark: '#140a02', bgCard: '#1f1004', bgElevated: '#2a1607', border: 'rgba(217,119,6,0.15)', text: '#fef3c7', textMuted: '#b8934a' },
violet: { name: 'Violet', primary: '#7c3aed', primaryRgb: '124,58,237', secondary: '#a78bfa', accent: '#c4b5fd', accentRgb: '196,181,253', success: '#34d399', warning: '#fbbf24', danger: '#f87171', bgDark: '#120526', bgCard: '#1a0a33', bgElevated: '#241042', border: 'rgba(167,139,250,0.12)', text: '#ede9fe', textMuted: '#a898c9' },
emerald: { name: 'Emerald', primary: '#059669', primaryRgb: '5,150,105', secondary: '#10b981', accent: '#6ee7b7', accentRgb: '110,231,183', success: '#059669', warning: '#d97706', danger: '#dc2626', bgDark: '#022015', bgCard: '#053321', bgElevated: '#08462e', border: 'rgba(16,185,129,0.12)', text: '#d1fae5', textMuted: '#70ad90' },
peach: { name: 'Peach', primary: '#fb923c', primaryRgb: '251,146,60', secondary: '#fdba74', accent: '#fed7aa', accentRgb: '254,215,170', success: '#22c55e', warning: '#eab308', danger: '#ef4444', bgDark: '#1f0f06', bgCard: '#2e180b', bgElevated: '#3d2211', border: 'rgba(253,186,116,0.15)', text: '#fff7ed', textMuted: '#cfab80' },
slateblue: { name: 'Slate Blue', primary: '#4f46e5', primaryRgb: '79,70,229', secondary: '#818cf8', accent: '#a5b4fc', accentRgb: '165,180,252', success: '#22c55e', warning: '#eab308', danger: '#ef4444', bgDark: '#0b0b1a', bgCard: '#111128', bgElevated: '#181838', border: 'rgba(129,140,248,0.1)', text: '#e0e7ff', textMuted: '#7c82b8' },
cherry: { name: 'Cherry', primary: '#be123c', primaryRgb: '190,18,60', secondary: '#e11d48', accent: '#fb7185', accentRgb: '251,113,133', success: '#22c55e', warning: '#eab308', danger: '#dc2626', bgDark: '#14030a', bgCard: '#1f0610', bgElevated: '#2a0917', border: 'rgba(225,29,72,0.12)', text: '#fce7f3', textMuted: '#bd8098' },
amber: { name: 'Amber', primary: '#d97706', primaryRgb: '217,119,6', secondary: '#f59e0b', accent: '#fbbf24', accentRgb: '251,191,36', success: '#22c55e', warning: '#d97706', danger: '#dc2626', bgDark: '#1a0f02', bgCard: '#261705', bgElevated: '#331f08', border: 'rgba(245,158,11,0.15)', text: '#fef3c7', textMuted: '#c9a052' }
};
let playerMapping = null;
let _isRanked = window.location.pathname.startsWith('/ranked');
let _matchStartTime = null;
let _finalScoreAppliedThisMatch = false;
const _origPushState = history.pushState;
history.pushState = function(...args) {
_origPushState.apply(this, args);
_isRanked = window.location.pathname.startsWith('/ranked');
};
window.addEventListener('popstate', () => {
_isRanked = window.location.pathname.startsWith('/ranked');
});
function tryDecode(data) {
try {
const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;
if (!(bytes instanceof Uint8Array)) return null;
const text = new TextDecoder().decode(bytes);
const m = text.match(/\{[^}]+\}/);
if (m) try { return { json: JSON.parse(m[0]), bytes, fullText: text }; } catch(e) {}
try { return { json: JSON.parse(text), bytes, fullText: text }; } catch(e) {}
let depth = 0, start = -1;
for (let i = 0; i < text.length; i++) {
if (text[i] === '{') { if (start === -1) start = i; depth++; }
else if (text[i] === '}') { depth--; if (depth === 0 && start !== -1) try { return { json: JSON.parse(text.substring(start, i + 1)), bytes, fullText: text }; } catch(e) { start = -1; } }
}
} catch (e) {}
return null;
}
function rewriteBytes(originalBytes, oldJSON, newJSON) {
const originalText = new TextDecoder().decode(originalBytes);
const newText = originalText.replace(JSON.stringify(oldJSON), JSON.stringify(newJSON));
return new TextEncoder().encode(newText);
}
const _origDcSend = RTCDataChannel.prototype.send;
function _hookDataChannel(dc) {
if (dc.__cmHooked) return;
const origSend = _origDcSend.bind(dc);
dc.send = function(data) {
if (data instanceof ArrayBuffer || data instanceof Uint8Array) {
const size = data instanceof ArrayBuffer ? data.byteLength : data.length;
try {
const str = new TextDecoder().decode(data instanceof Uint8Array ? data : new Uint8Array(data));
const clean = str.replace(/[^\x20-\x7E]/g, '');
if ((clean.includes('score') || clean.includes('elo') || clean.includes('overall') || clean.includes('SCAN_STATE') || /\d+\.\d+/.test(clean)) && (!_lastDcLogTime || Date.now() - _lastDcLogTime > 2000)) {
_lastDcLogTime = Date.now();
log(`[DC SEND bin ${size}B] ${clean.substring(0, 200)}`);
}
} catch(e) {
log(`[DC SEND bin ${size}B] (undecodable)`);
}
} else if (typeof data === 'string') {
if (data.includes('score') || data.includes('elo') || data.includes('q')) {
log('[DC SEND text] ' + data.substring(0, 300));
}
}
const parsed = tryDecode(data);
if (parsed?.json) {
const { json, bytes, fullText } = parsed;
const hasP = typeof json.p !== 'undefined';
const hasQ = typeof json.q !== 'undefined';
const hasScore = typeof json.score !== 'undefined';
const hasS = typeof json.s !== 'undefined';
const keys = Object.keys(json);
const isScoreFrame = hasQ || hasScore || hasS || keys.some(k => k.includes('score') || k.includes('elo'));
if (isScoreFrame || json.type === 'SCAN_STATE') {
log('[DC SEND] keys=' + keys.join(',') + ' q=' + json.q + ' score=' + json.score + ' s=' + json.s + ' type=' + json.type + ' overall=' + (json.payload?.overall ?? '?'));
}
const isNormalFrame = hasP && hasQ && json.m === undefined && !json.type;
const isRankedFrame = hasP && hasQ && json.m !== undefined;
if (isRankedFrame && !_isRanked) {
_isRanked = true;
log('Locked: RANKED mode (m field detected in frame)');
}
if (isNormalFrame || isRankedFrame) {
if (json.p <= 2 && _matchStartTime === null) {
_matchStartTime = Date.now();
_finalScoreAppliedThisMatch = false;
log(`Match started - tracking time from now`);
}
if (!playerMapping && json.q > 0) {
playerMapping = { myKey: 'q' };
log(`q confirmed as your score [${isRankedFrame ? 'RANKED' : 'NORMAL'} frame]`);
}
if (json.q > 0) {
if (!CONFIG.scoreEnabled) return origSend.call(this, data);
const modified = { ...json };
let newScore;
const matchElapsed = _matchStartTime ? (Date.now() - _matchStartTime) / 1000 : 0;
const shouldUseFinalScore = CONFIG.resultEnabled && matchElapsed >= 14;
if (shouldUseFinalScore) {
newScore = _getFinalTarget();
if (!_finalScoreAppliedThisMatch) {
_finalScoreAppliedThisMatch = true;
log(`[FINAL SCORE] Match at ${matchElapsed.toFixed(1)}s - switching to final score: ${newScore} (${newScore/10000})`);
}
} else if (CONFIG.scoreMode === 'fixed') {
newScore = CONFIG.fixedScore;
log(`[FIXED MODE] Using fixed score: ${newScore} (${newScore/10000})`);
} else {
if (_dynamicCap === null) {
_dynamicCap = Math.round((CONFIG.scoreRangeMin + CONFIG.scoreRangeMax) / 2000) * 1000;
}
if (Math.random() < 0.5) _dynamicCap += 1000;
else _dynamicCap -= 1000;
_dynamicCap = Math.max(CONFIG.scoreRangeMin, Math.min(CONFIG.scoreRangeMax, _dynamicCap));
newScore = _dynamicCap;
}
modified.q = newScore;
if (json.m !== undefined) modified.m = json.m;
if (json.type !== undefined) modified.type = json.type;
log(`[${isRankedFrame ? 'RANKED' : 'NORMAL'}] frame=${json.p} q: ${json.q}→${modified.q} (${(json.q/10000).toFixed(2)}→${(modified.q/10000).toFixed(2)})`);
_lastSpoofedScore = _getTargetScore();
spoofPanel();
return origSend.call(this, rewriteBytes(bytes, json, modified));
}
}
// SCAN_STATE spoofing removed to prevent opponent overall score from being overwritten
if (hasScore && CONFIG.scoreEnabled) {
const modified = { ...json };
const target = _getTargetScore();
modified.score = target;
_lastSpoofedScore = target;
log(`[SCORE type] score: ${json.score}→${modified.score}`);
spoofPanel();
return origSend.call(this, rewriteBytes(bytes, json, modified));
}
}
return origSend.call(this, data);
};
dc.__cmHooked = true;
}
RTCDataChannel.prototype.send = function(data) {
if (!this.__cmHooked) _hookDataChannel(this);
return this.send(data);
};
const _origCreateDC = RTCPeerConnection.prototype.createDataChannel;
if (_origCreateDC) {
RTCPeerConnection.prototype.createDataChannel = function(label, options) {
const dc = _origCreateDC.call(this, label, options);
_hookDataChannel(dc);
return dc;
};
}
const _origOndcDesc = Object.getOwnPropertyDescriptor(RTCPeerConnection.prototype, 'ondatachannel');
if (_origOndcDesc && _origOndcDesc.set) {
Object.defineProperty(RTCPeerConnection.prototype, 'ondatachannel', {
set(fn) {
_origOndcDesc.set.call(this, function(event) {
_hookDataChannel(event.channel);
return fn.call(this, event);
});
},
get: _origOndcDesc.get
});
}
const _origAddEL = RTCPeerConnection.prototype.addEventListener;
if (_origAddEL) {
RTCPeerConnection.prototype.addEventListener = function(type, listener, options) {
if (type === 'datachannel') {
const wrapped = function(event) {
_hookDataChannel(event.channel);
return listener.call(this, event);
};
return _origAddEL.call(this, type, wrapped, options);
}
return _origAddEL.call(this, type, listener, options);
};
}
const _wsProtoSendCandidates = [WebSocket.prototype];
if (_window.WebSocket && _window.WebSocket.prototype !== WebSocket.prototype) {
_wsProtoSendCandidates.push(_window.WebSocket.prototype);
}
const _origWsSend = WebSocket.prototype.send;
for (const proto of _wsProtoSendCandidates) {
const orig = proto.send;
proto.send = function(data) { return _wsSendHook.call(this, data, orig); };
}
function _wsSendHook(data, origSend) {
try {
if (typeof data === 'string') {
log('[WS OUT] ' + data.substring(0, 300));
try {
const parsed = JSON.parse(data);
if (parsed.type === 'score_update' && parsed.payload && typeof parsed.payload.score === 'number') {
const origScore = parsed.payload.score;
let boosted;
if (CONFIG.scoreMode === 'fixed') {
boosted = CONFIG.fixedScore / 10000;
} else {
if (_dynamicCap === null) {
_dynamicCap = Math.round((CONFIG.scoreRangeMin + CONFIG.scoreRangeMax) / 2000) * 1000;
}
if (Math.random() < 0.5) _dynamicCap += 1000;
else _dynamicCap -= 1000;
_dynamicCap = Math.max(CONFIG.scoreRangeMin, Math.min(CONFIG.scoreRangeMax, _dynamicCap));
boosted = _dynamicCap / 10000;
}
parsed.payload.score = boosted;
log(`[WS SCORE] ${origScore.toFixed(4)} → ${boosted.toFixed(4)}`);
return origSend.call(this, JSON.stringify(parsed));
}
} catch(e) {}
} else if (data instanceof ArrayBuffer || data instanceof Uint8Array) {
const str = new TextDecoder().decode(data instanceof Uint8Array ? data : new Uint8Array(data));
const clean = str.replace(/[^\x20-\x7E]/g, '');
if (clean.includes('score') || clean.includes('p1_') || clean.includes('p2_')) {
log('[WS OUT bin] contains score/p1/p2: ' + clean.substring(0, 200));
}
if (clean.includes('score_update')) {
try {
const jsonStart = clean.indexOf('{');
const jsonEnd = clean.lastIndexOf('}') + 1;
const jsonStr = clean.substring(jsonStart, jsonEnd);
const parsed = JSON.parse(jsonStr);
if (parsed.type === 'score_update' && parsed.payload && typeof parsed.payload.score === 'number') {
const origScore = parsed.payload.score;
let boosted;
if (CONFIG.scoreMode === 'fixed') {
boosted = CONFIG.fixedScore / 10000;
} else {
if (_dynamicCap === null) {
_dynamicCap = Math.round((CONFIG.scoreRangeMin + CONFIG.scoreRangeMax) / 2000) * 1000;
}
if (Math.random() < 0.5) _dynamicCap += 1000;
else _dynamicCap -= 1000;
_dynamicCap = Math.max(CONFIG.scoreRangeMin, Math.min(CONFIG.scoreRangeMax, _dynamicCap));
boosted = _dynamicCap / 10000;
}
parsed.payload.score = boosted;
log(`[WS SCORE bin] ${origScore.toFixed(4)} → ${boosted.toFixed(4)}`);
return origSend.call(this, JSON.stringify(parsed));
}
} catch(e) {}
}
}
} catch(e) {}
return origSend.call(this, data);
}
const origAddEventListener = RTCPeerConnection.prototype.addEventListener;
if (origAddEventListener) {
RTCPeerConnection.prototype.addEventListener = function(type, listener, options) {
if (type === 'datachannel') {
const wrapped = function(event) {
_hookDataChannel(event.channel);
return listener.call(this, event);
};
return origAddEventListener.call(this, type, wrapped, options);
}
return origAddEventListener.call(this, type, listener, options);
};
}
const origOnMessageDesc = Object.getOwnPropertyDescriptor(RTCDataChannel.prototype, 'onmessage');
if (origOnMessageDesc) {
Object.defineProperty(RTCDataChannel.prototype, 'onmessage', {
set(fn) {
origOnMessageDesc.set.call(this, function(event) {
const parsed = tryDecode(event.data);
if (parsed?.json) {
const { json } = parsed;
if (typeof json.p !== 'undefined' && typeof json.q !== 'undefined' && !json.type && json.q > 0) {
log(`OPP frame=${json.p} score=${(json.q/10000).toFixed(2)}`);
}
}
return fn.call(this, event);
});
},
get: origOnMessageDesc.get,
configurable: true
});
}
const originalAEL = RTCDataChannel.prototype.addEventListener;
RTCDataChannel.prototype.addEventListener = function (type, listener, options) {
if (type !== 'message' || typeof listener !== 'function')
return originalAEL.call(this, type, listener, options);
const wrapped = function (event) {
const parsed = tryDecode(event.data);
if (parsed?.json) {
const { json } = parsed;
if (typeof json.p !== 'undefined' && typeof json.q !== 'undefined' && !json.type && json.q > 0) {
log(`OPP (AEL) frame=${json.p} score=${(json.q/10000).toFixed(2)}`);
}
}
return listener.call(this, event);
};
return originalAEL.call(this, type, wrapped, options);
};
let _lkRoomHooked = false;
function _hookLiveKitRoom(room) {
if (_lkRoomHooked) return;
try {
const part = room.localParticipant;
if (!part || typeof part.publishData !== 'function') return;
const origPublish = part.publishData;
part.publishData = function(data, kind) {
if (data instanceof Uint8Array || data instanceof ArrayBuffer) {
const str = new TextDecoder().decode(data instanceof Uint8Array ? data : new Uint8Array(data));
const clean = str.replace(/[^\x20-\x7E]/g, '');
if (clean.includes('score') || clean.includes('q') || /\d+\.\d+/.test(clean)) {
log(`[LK publishData] ${clean.substring(0, 300)}`);
}
} else if (typeof data === 'string') {
if (data.includes('score') || data.includes('q')) {
log(`[LK publishData str] ${data.substring(0, 300)}`);
}
}
return origPublish.call(this, data, kind);
};
_lkRoomHooked = true;
log('[LK] publishData hooked on room');
} catch(e) {}
}
const _origETAEL = EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener = function(type, fn, opts) {
try {
const t = this;
if (t && typeof t.connect === 'function' && t.localParticipant) {
setTimeout(() => _hookLiveKitRoom(t), 0);
} else if (t && typeof t.connect === 'function') {
const orig = t.connect;
if (!orig.__cmHooked) {
t.connect = function(...args) {
setTimeout(() => _hookLiveKitRoom(t), 100);
return orig.apply(this, args);
};
t.connect.__cmHooked = true;
}
}
} catch(e) {}
return _origETAEL.call(this, type, fn, opts);
};
const FINALIZE_SCORE_FIELDS = [
'selfScore', 'player1Score', 'player2Score',
'hostScore', 'actualScore', 'verifiedScore',
'serverScore', 'realFinalScore', 'clientScore',
'adjustedScore', 'opponentScore'
];
const origFetch = _window.fetch;
_window.fetch = async function(url, options) {
const urlStr = typeof url === 'string' ? url : (url?.url || '');
if (urlStr.includes('/api/match/finalize') || urlStr.includes('/api/ranked/finalize')) {
if (options?.body && CONFIG.resultEnabled) {
try {
const body = JSON.parse(options.body);
log('FINALIZE (original):', JSON.stringify(body).substring(0, 500));
const finalTarget = _getFinalTarget();
const finalFloat = finalTarget / 10000;
let patched = false;
const scoreObj = body.u || body.i;
if (scoreObj && scoreObj.e !== undefined) {
const realE = parseInt(scoreObj.e) || 0;
scoreObj.e = String(finalTarget);
if (body.i) _isRanked = true;
log(`[LEGACY] score.e: ${realE} → ${scoreObj.e}`);
patched = true;
}
for (const field of FINALIZE_SCORE_FIELDS) {
if (field in body && body[field] !== undefined) {
if (field === 'opponentScore' || field === 'rivalScore') continue;
const old = body[field];
if (typeof old === 'number') {
body[field] = old > 100 ? finalTarget : finalFloat;
log(`[FLAT] ${field}: ${old} → ${body[field]}`);
patched = true;
} else if (typeof old === 'string') {
body[field] = String(old > '100' ? finalTarget : finalFloat);
log(`[FLAT STR] ${field}: ${old} → ${body[field]}`);
patched = true;
}
}
}
if (body.settlement?.scores && Array.isArray(body.settlement.scores)) {
const s = body.settlement.scores;
const myIdx = s[0] >= s[1] ? 0 : 1;
const old = s[myIdx];
s[myIdx] = old > 100 ? finalTarget : finalFloat;
log(`[SETTLEMENT] scores[${myIdx}]: ${old} → ${s[myIdx]}`);
patched = true;
}
if (body.hud?.scores && Array.isArray(body.hud.scores)) {
const s = body.hud.scores;
const myIdx = s[0] >= s[1] ? 0 : 1;
const old = s[myIdx];
s[myIdx] = old > 100 ? finalTarget : finalFloat;
log(`[HUD] scores[${myIdx}]: ${old} → ${s[myIdx]}`);
patched = true;
}
if (!patched) {
log('[FINALIZE] No known score fields found in body — sending as-is');
}
options = { ...options, body: JSON.stringify(body) };
log('FINALIZE REQUEST (modified):', JSON.stringify(body));
} catch(e) {
log('Could not parse finalize body:', e);
}
}
const response = await origFetch.call(this, url, options);
const clone = response.clone();
clone.json().then(data => {
log('FINALIZE RESPONSE:', JSON.stringify(data));
if (response.ok) {
_lockedFinalTarget = null;
_finalApplied = false;
_lastSpoofedScore = null;
_matchStartTime = null;
_finalScoreAppliedThisMatch = false;
}
}).catch(() => {});
return response;
}
const BOOSTED_STATS = { is_pro: true };
if (urlStr.includes('supabase.co/rest/v1/profiles')) {
const response = await origFetch.call(this, url, options);
const clone = response.clone();
try {
const data = await clone.json();
if (Array.isArray(data) && data.length > 0) {
const modified = data.map(profile => ({ ...profile, ...BOOSTED_STATS }));
const newHeaders = new Headers(response.headers);
newHeaders.set('content-type', 'application/json');
return new Response(JSON.stringify(modified), {
status: response.status,
statusText: response.statusText,
headers: newHeaders
});
}
} catch(e) {}
return response;
}
if (urlStr.includes('/api/profiles/public/')) {
const response = await origFetch.call(this, url, options);
const clone = response.clone();
try {
const data = await clone.json();
if (data && data.profile) {
const modified = {
...data,
profile: { ...data.profile, is_pro: true }
};
return new Response(JSON.stringify(modified), {
status: response.status,
statusText: response.statusText,
headers: response.headers
});
}
} catch(e) {}
return response;
}
if (urlStr.includes('/api/profile/ranked-stats')) {
const response = await origFetch.call(this, url, options);
return response;
}
if (urlStr.includes('/api/profile/world-rank')) {
const response = await origFetch.call(this, url, options);
return response;
}
if (urlStr.includes('/api/profile/lobby-summary')) {
const response = await origFetch.call(this, url, options);
const clone = response.clone();
try {
const data = await clone.json();
if (data && typeof data === 'object') {
const modified = { ...data, is_pro: true };
return new Response(JSON.stringify(modified), {
status: response.status,
statusText: response.statusText,
headers: response.headers
});
}
} catch(e) {}
return response;
}
if (urlStr === '/api/profile' || urlStr.endsWith('/api/profile')) {
const response = await origFetch.call(this, url, options);
const clone = response.clone();
try {
const data = await clone.json();
if (data && data.profile) {
const modified = {
...data,
profile: { ...data.profile, is_pro: true }
};
return new Response(JSON.stringify(modified), {
status: response.status,
statusText: response.statusText,
headers: response.headers
});
}
} catch(e) {}
return response;
}
return origFetch.call(this, url, options);
};
let _lockedFinalTarget = null;
let _lastFinalMode = null;
let _finalApplied = false;
function _getFinalTarget() {
if (_lockedFinalTarget === null || _lastFinalMode !== CONFIG.finalScoreMode) {
_finalApplied = false;
_lastFinalMode = CONFIG.finalScoreMode;
if (CONFIG.finalScoreMode === 'range') {
_lockedFinalTarget = Math.round(CONFIG.finalScoreRangeMin + Math.random() * (CONFIG.finalScoreRangeMax - CONFIG.finalScoreRangeMin));
} else {
_lockedFinalTarget = parseInt(CONFIG.myFinalScore);
}
log(`_getFinalTarget locked: ${_lockedFinalTarget} (${CONFIG.finalScoreMode})`);
}
if (CONFIG.finalScoreMode === 'fixed') {
return parseInt(CONFIG.myFinalScore);
}
return _lockedFinalTarget;
}
const _STORE_NAMES = ['T', 'default', 'store', 'Zustand', 'useStore', 'Store'];
function _isZustandStore(val) {
if (!val || typeof val.getState !== 'function') return false;
try {
const s = val.getState();
if (!s || typeof s !== 'object') return false;
return typeof s.setMyScore === 'function' ||
typeof s.setFinalPayloads === 'function' ||
typeof s.setActiveMatchId === 'function' ||
typeof s.myScore !== 'undefined' ||
typeof s.myScoreRaw !== 'undefined' ||
typeof s.applyFinalScores === 'function';
} catch(e) { return false; }
}
function _findStoreInMod(mod) {
if (!mod || typeof mod !== 'object') return null;
for (const name of _STORE_NAMES) {
try {
const val = mod[name];
if (_isZustandStore(val)) return val;
} catch(e) {}
}
for (const val of Object.values(mod)) {
if (_isZustandStore(val)) return val;
}
return null;
}
function patchZustandStore() {
try {
const wpChunk = _window.webpackChunk_N_E || _window.webpackChunknextjs_app || _window.webpackChunk;
if (!wpChunk) return false;
let req;
try {
req = wpChunk.push([[Symbol()], {}, e => e]);
} catch(e) { return false; }
if (typeof req !== 'function') return false;
let store = null;
const knownIds = [16225, 74952, 41746, 61107, 28344, 50231, 89540, 41747, 28343, 50230];
for (const id of knownIds) {
try {
const mod = req(id);
const found = _findStoreInMod(mod);
if (found) { store = found; log(`Zustand store found in module ${id}`); break; }
} catch(e) {}
}
if (!store && req.m) {
for (const id of Object.keys(req.m)) {
try {
const mod = req(id);
const found = _findStoreInMod(mod);
if (found) { store = found; log(`Zustand store found via scan module ${id}`); break; }
} catch(e) {}
}
}
if (!store) return false;
return patchStore(store);
} catch(e) {
log('patchZustandStore error:', e);
return false;
}
}
function _toScore(num) {
if (typeof num === 'number') {
if (num > 100) return num / 10000;
return num;
}
return parseFloat(num) || 0;
}
function _getTargetScore() {
if (CONFIG.scoreMode === 'fixed') {
return Math.min(CONFIG.fixedScore / 10000, 10);
} else {
if (_dynamicCap === null) {
_dynamicCap = Math.round((CONFIG.scoreRangeMin + CONFIG.scoreRangeMax) / 2000) * 1000;
}
if (Math.random() < 0.5) _dynamicCap += 1000;
else _dynamicCap -= 1000;
_dynamicCap = Math.max(CONFIG.scoreRangeMin, Math.min(CONFIG.scoreRangeMax, _dynamicCap));
return _dynamicCap / 10000;
}
}
function patchStore(store) {
try {
if (store.__cmSetStatePatched) return true;
const origSetState = store.setState.bind(store);
store.setState = function(partial) {
if (!CONFIG.scoreEnabled) return origSetState(partial);
let mod = partial;
if (typeof partial === 'function') {
mod = partial(store.getState());
}
if (mod && typeof mod === 'object' && ('myScore' in mod || 'myScoreRaw' in mod)) {
const target = _getTargetScore();
mod = { ...mod };
if ('myScore' in mod) {
mod.myScore = target;
}
if ('myScoreRaw' in mod) {
mod.myScoreRaw = target;
}
// DO NOT modify opponentScore or opponentScoreRaw - leave them real
_lastSpoofedScore = target;
spoofPanel();
return origSetState(mod);
}
return origSetState(partial);
};
store.__cmSetStatePatched = true;
log('patchStore: setState intercepted for myScore only (opponent score unchanged)');
return true;
} catch(e) {
log('patchStore error:', e);
return false;
}
}
let patchAttempts = 0;
const patchPoll = setInterval(() => {
patchAttempts++;
if (patchZustandStore()) {
clearInterval(patchPoll);
log(`Zustand store patched after ${patchAttempts} attempts`);
} else if (patchAttempts % 50 === 0) {
log(`Still looking for Zustand store... (attempt ${patchAttempts})`);
}
}, 200);
const TIER_MAP = [
{ name: 'Adam', emoji: '🍎', hexColor: '#ef4444', textShadow: '0 0 12px rgba(239,68,68,0.95)', min: 9.7 },
{ name: 'Slayer', emoji: '☠️', hexColor: '#f472b6', textShadow: '0 0 12px rgba(244,114,182,0.9)', min: 9.5 },
{ name: 'Chad', emoji: '👑', hexColor: '#fb923c', textShadow: '0 0 10px rgba(251,146,60,0.8)', min: 8.9 },
{ name: 'Chadlite', emoji: '⚜️', hexColor: '#facc15', textShadow: '0 0 8px rgba(250,204,21,0.8)', min: 8.3 },
{ name: 'HTN', emoji: '🌟', hexColor: '#a3e635', textShadow: '0 0 8px rgba(163,230,53,0.8)', min: 7.0 },
{ name: 'MTN', emoji: '⭐', hexColor: '#86efac', textShadow: '0 0 6px rgba(134,239,172,0.7)', min: 5.6 },
{ name: 'LTN', emoji: '🌙', hexColor: '#34d399', textShadow: '0 0 6px rgba(52,211,153,0.6)', min: 3.1 },
{ name: 'Sub3', emoji: '🦀', hexColor: '#b45309', textShadow: '0 0 6px rgba(180,83,9,0.7)', min: 0.1 },
];
let _lastSpoofedScore = null;
let _lastLogTime = 0;
let _lastDcLogTime = 0;
let _dynamicCap = null;
let _scoreFluctuationInterval = null;
function startScoreFluctuation() {
if (_scoreFluctuationInterval) return;
_scoreFluctuationInterval = setInterval(() => {
if (!CONFIG.scoreEnabled || CONFIG.scoreMode !== 'range') return;
if (_dynamicCap === null) {
_dynamicCap = Math.round((CONFIG.scoreRangeMin + CONFIG.scoreRangeMax) / 2000) * 1000;
}
if (Math.random() < 0.5) {
_dynamicCap += 1000;
} else {
_dynamicCap -= 1000;
}
_dynamicCap = Math.max(CONFIG.scoreRangeMin, Math.min(CONFIG.scoreRangeMax, _dynamicCap));
spoofPanel();
}, 1500);
}
function stopScoreFluctuation() {
if (_scoreFluctuationInterval) {
clearInterval(_scoreFluctuationInterval);
_scoreFluctuationInterval = null;
}
}
startScoreFluctuation();
function getTierForScore(score) {
for (const tier of TIER_MAP) {
if (score >= tier.min) return tier;
}
return TIER_MAP[TIER_MAP.length - 1];
}
function spoofPanel() {
if (_lastSpoofedScore === null) return;
const displayScore = _lastSpoofedScore;
const tier = getTierForScore(displayScore);
const myPanel = document.querySelector('.glass-panel.absolute.top-5') ||
document.querySelector('.glass-panel.absolute.top-8') ||
document.querySelector('[class*="glass-panel"][class*="absolute"][class*="left"]') ||
document.querySelector('[class*="glass-panel"][class*="absolute"][class*="top"]') ||
document.querySelector('[class*="ranked"][class*="score"]') ||
document.querySelector('[class*="player-score"]') ||
document.querySelector('[class*="my-score"]') ||
(() => {
const allPanels = document.querySelectorAll('[class*="glass"], [class*="panel"], [class*="score-card"]');
for (const p of allPanels) {
const spans = p.querySelectorAll('span.font-mono');
for (const s of spans) {
if (/^\d+\.?\d*$/.test(s.textContent.trim())) return p;
}
}
return null;
})();
if (!myPanel) return;
const allMono = myPanel.querySelectorAll('span.font-mono');
let scoreSpan = null;
for (const s of allMono) {
if (/^\d+\.?\d*$/.test(s.textContent.trim())) {
scoreSpan = s;
break;
}
}
if (!scoreSpan) return;
if (scoreSpan.textContent.trim() !== displayScore.toFixed(1)) {
scoreSpan.textContent = displayScore.toFixed(1);
}
const tierSpan = scoreSpan.nextElementSibling;
if (tierSpan) {
const want = `${tier.emoji} ${tier.name}`;
if (tierSpan.textContent !== want) tierSpan.textContent = want;
if (tierSpan.style.color !== tier.hexColor) tierSpan.style.color = tier.hexColor;
if (tierSpan.style.textShadow !== tier.textShadow) tierSpan.style.textShadow = tier.textShadow;
}
const allSpans = myPanel.querySelectorAll('span');
for (const span of allSpans) {
if (span === scoreSpan) continue;
const t = span.textContent.trim();
const tierNames = ['Adam','Slayer','Chad','Chadlite','HTN','MTN','LTN','Sub3'];
if (tierNames.some(n => t.includes(n)) && !t.includes(tier.name)) {
span.textContent = `${tier.emoji} ${tier.name}`;
span.style.color = tier.hexColor;
span.style.textShadow = tier.textShadow;
}
if (span.style.color && span.style.color !== tier.hexColor) {
const tierColors = ['#f472b6','#fb923c','#facc15','#a3e635','#86efac','#34d399','#b45309'];
if (tierColors.includes(span.style.color)) {
span.style.color = tier.hexColor;
span.style.textShadow = tier.textShadow;
}
}
}
}
const _bodyObserver = new MutationObserver(() => { try { spoofPanel(); } catch(e) {} });
_bodyObserver.observe(document.documentElement || document.body, { childList: true, subtree: true });
setInterval(() => { try { spoofPanel(); } catch(e) {} }, 100);
const OriginalWebSocket = _window.WebSocket;
_window.WebSocket = function(...args) {
const ws = new OriginalWebSocket(...args);
ws.addEventListener('message', function(event) {
if (typeof event.data === 'string') {
if (event.data.includes('FINAL_SCORES') || event.data.includes('elo') || event.data.includes('score')) {
log('WS TEXT:', event.data);
}
return;
}
const buf = event.data instanceof ArrayBuffer ? event.data : null;
if (!buf) return;
const bytes = new Uint8Array(buf);
const size = bytes.length;
const text = new TextDecoder('utf-8', { fatal: false }).decode(bytes);
const strings = text.match(/[\x20-\x7E]{4,}/g) || [];
if (size === 108 || size > 50) {
log(`WS RECV binary [${size} bytes] strings:`, strings);
strings.forEach(s => {
if (/\d\.\d/.test(s) || s.includes('score') || s.includes('win') || s.includes('elo')) {
log(' Possible score string:', s);
}
});
}
});
return ws;
};
Object.setPrototypeOf(_window.WebSocket, OriginalWebSocket);
_window.WebSocket.prototype = OriginalWebSocket.prototype;
['CONNECTING','OPEN','CLOSING','CLOSED'].forEach(k => {
try {
Object.defineProperty(_window.WebSocket, k, {
value: OriginalWebSocket[k],
writable: false,
configurable: true
});
} catch(e) {}
});
log('v13.6.2 cheatmoggle loaded - opponent score fix + color picker + language selector + FREE badge + hidden control bar + resizable panel');
const _trueOriginalGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);
let _camSpoofActive = false;
let _camStream = null;
navigator.mediaDevices.getUserMedia = async function(constraints) {
if (_camSpoofActive && _camStream && constraints && (constraints.video || constraints.video === true)) {
log('[CAM SPOOF] Intercepting getUserMedia - returning spoofed stream');
setTimeout(() => {
const scannerVid = document.querySelector('video.scanner-video');
if (scannerVid) scannerVid.srcObject = _camStream;
if (window._mogPCs) {
const fakeTrack = _camStream.getVideoTracks()[0];
for (const pc of window._mogPCs) {
try {
pc.getSenders().forEach(sender => {
if (sender.track?.kind === 'video') {
sender.replaceTrack(fakeTrack).catch(() => {});
}
});
} catch(e) {}
}
}
}, 100);
if (constraints.audio) {
try {
const realAudio = await _trueOriginalGetUserMedia({ audio: constraints.audio });
return new MediaStream([
..._camStream.getVideoTracks(),
...realAudio.getAudioTracks()
]);
} catch(e) {
return _camStream;
}
}
return _camStream;
}
const stream = await _trueOriginalGetUserMedia(constraints);
stream.getVideoTracks().forEach(t => {
t.addEventListener('ended', () => log('VIDEO TRACK ENDED:', t.label));
t.addEventListener('mute', () => log('VIDEO TRACK MUTED:', t.label));
});
return stream;
};
const _OrigRTCPC = window.RTCPeerConnection;
window.RTCPeerConnection = function(...args) {
const pc = new _OrigRTCPC(...args);
const _origAddTrack = pc.addTrack.bind(pc);
pc.addTrack = function(track, ...streams) {
return _origAddTrack(track, ...streams);
};
return pc;
};
Object.setPrototypeOf(window.RTCPeerConnection, _OrigRTCPC);
window.RTCPeerConnection.prototype = _OrigRTCPC.prototype;
function applyAccentColor(color) {
document.documentElement.style.setProperty('--cm-primary', color);
const rgb = hexToRgb(color);
if (rgb) document.documentElement.style.setProperty('--cm-primary-rgb', `${rgb.r},${rgb.g},${rgb.b}`);
CONFIG.accentColor = color;
saveConfig();
}
function hexToRgb(hex) {
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? { r: parseInt(result[1],16), g: parseInt(result[2],16), b: parseInt(result[3],16) } : null;
}
function applyLanguage(lang) {
const t = LANGUAGES[lang] || LANGUAGES.en;
// Update elements with data-i18n
document.querySelectorAll('[data-i18n]').forEach(el => {
const key = el.getAttribute('data-i18n');
if (t[key] !== undefined) {
if (el.tagName === 'INPUT' && el.type === 'text' && el.placeholder !== undefined) {
el.placeholder = t[key];
} else if (el.tagName === 'BUTTON' && el.classList.contains('cm-cb-label')) {
// skip, handled separately
} else {
el.textContent = t[key];
}
}
});
// Update dynamic text nodes not covered by data-i18n
const statusPill = document.getElementById('cm-status-pill');
const modePill = document.getElementById('cm-mode-pill');
const enabledVal = document.getElementById('cm-enabled-val');
const modeVal = document.getElementById('cm-mode-val');
const clearCookiesBtn = document.getElementById('cm-clearcookies-btn');
const verifBypassBtn = document.getElementById('cm-verifbypass-btn');
if (statusPill) statusPill.textContent = CONFIG.enabled ? t.active : t.inactive;
if (modePill) modePill.textContent = _isRanked ? 'RANKED' : 'NORMAL';
if (enabledVal) enabledVal.textContent = CONFIG.enabled ? t.active : t.inactive;
if (modeVal) modeVal.textContent = _isRanked ? 'RANKED' : 'NORMAL';
if (clearCookiesBtn) clearCookiesBtn.textContent = t.unbanClearCookies;
if (verifBypassBtn) verifBypassBtn.textContent = t.verificationBypass;
// Update mode buttons
document.querySelectorAll('[data-smode]').forEach(btn => {
if (btn.dataset.smode === 'range') btn.textContent = t.range;
if (btn.dataset.smode === 'fixed') btn.textContent = t.fixed;
});
document.querySelectorAll('[data-fmode]').forEach(btn => {
if (btn.dataset.fmode === 'fixed') btn.textContent = t.staticScore;
if (btn.dataset.fmode === 'range') btn.textContent = t.dynamic;
});
document.querySelectorAll('[data-src]').forEach(btn => {
if (btn.dataset.src === 'video') btn.textContent = t.video;
if (btn.dataset.src === 'image') btn.textContent = t.image;
});
const panicNowBtn = document.getElementById('cm-panic-now');
if (panicNowBtn) panicNowBtn.textContent = t.hideAllNow;
// Control bar labels
const cbLabels = document.querySelectorAll('#cm-controlbar .cm-cb-label');
if (cbLabels.length >= 3) {
cbLabels[0].textContent = t.active;
cbLabels[1].textContent = t.video;
cbLabels[2].textContent = t.audioSpoof;
}
// Hook status badge uses hooked string
const hookBadge = document.getElementById('cm-zustand-val');
if (hookBadge && hookBadge.textContent === 'HOOKED') {
hookBadge.textContent = t.hooked;
} else if (hookBadge && hookBadge.textContent === 'PENDING') {
hookBadge.textContent = t.pending;
}
}
function buildMenu() {
if (document.getElementById('cm-root')) return;
function applyTheme(themeName) {
const theme = THEMES[themeName] || THEMES.midnight;
CONFIG.theme = themeName;
document.documentElement.style.setProperty('--cm-primary', theme.primary);
document.documentElement.style.setProperty('--cm-primary-rgb', theme.primaryRgb);
document.documentElement.style.setProperty('--cm-secondary', theme.secondary);
document.documentElement.style.setProperty('--cm-accent', theme.accent);
document.documentElement.style.setProperty('--cm-accent-rgb', theme.accentRgb);
document.documentElement.style.setProperty('--cm-success', theme.success);
document.documentElement.style.setProperty('--cm-warning', theme.warning);
document.documentElement.style.setProperty('--cm-danger', theme.danger);
document.documentElement.style.setProperty('--cm-bg-dark', theme.bgDark);
document.documentElement.style.setProperty('--cm-bg-card', theme.bgCard);
document.documentElement.style.setProperty('--cm-bg-elevated', theme.bgElevated);
document.documentElement.style.setProperty('--cm-border', theme.border);
document.documentElement.style.setProperty('--cm-text', theme.text);
document.documentElement.style.setProperty('--cm-text-muted', theme.textMuted);
saveConfig();
}
const style = document.createElement('style');
style.textContent = `
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap');
:root {
--cm-primary: #6366f1;
--cm-primary-rgb: 99,102,241;
--cm-secondary: #8b5cf6;
--cm-accent: #22d3ee;
--cm-accent-rgb: 34,211,238;
--cm-success: #10b981;
--cm-warning: #f59e0b;
--cm-danger: #ef4444;
--cm-bg-dark: #0a0a0f;
--cm-bg-card: #12121a;
--cm-bg-elevated: #1a1a24;
--cm-border: rgba(255,255,255,0.08);
--cm-text: #e4e4e7;
--cm-text-muted: #71717a;
--cm-glow: 0 0 30px rgba(var(--cm-primary-rgb),0.3);
}
#cm-toggle-btn {
position: fixed;
top: 16px;
right: 16px;
z-index: 999999;
width: 42px;
height: 42px;
border-radius: 50%;
background: radial-gradient(circle at 30% 25%, rgba(var(--cm-primary-rgb),0.35), rgba(0,0,0,0.92) 72%);
border: 2px solid var(--cm-primary);
padding: 0;
overflow: visible;
cursor: grab;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 0 0 1px rgba(var(--cm-primary-rgb),0.35), 0 0 18px rgba(var(--cm-primary-rgb),0.55), 0 6px 20px rgba(0,0,0,0.5);
transition: transform 0.22s cubic-bezier(0.34,1.56,0.64,1), box-shadow 0.22s ease, border-color 0.22s ease;
user-select: none;
touch-action: none;
}
/* pulsating themed rings */
#cm-toggle-btn::before,
#cm-toggle-btn::after {
content: '';
position: absolute;
inset: -2px;
border-radius: 50%;
border: 2px solid var(--cm-primary);
pointer-events: none;
will-change: transform, opacity;
}
#cm-toggle-btn::before { animation: cmPulseRing 2.1s cubic-bezier(0.2,0.6,0.3,1) infinite; }
#cm-toggle-btn::after { animation: cmPulseRing 2.1s cubic-bezier(0.2,0.6,0.3,1) infinite 1.05s; }
@keyframes cmPulseRing {
0% { transform: scale(1); opacity: 0.85; }
70% { transform: scale(1.95); opacity: 0; }
100% { transform: scale(1.95); opacity: 0; }
}
#cm-toggle-btn img {
width: 100% !important;
height: 100% !important;
border-radius: 50% !important;
object-fit: cover;
position: relative;
z-index: 2;
box-shadow: inset 0 0 0 1px rgba(0,0,0,0.45);
}
#cm-toggle-btn:active { cursor: grabbing; }
#cm-toggle-btn:hover {
transform: scale(1.12);
border-color: var(--cm-accent);
box-shadow: 0 0 0 1px rgba(var(--cm-accent-rgb),0.6), 0 0 30px rgba(var(--cm-primary-rgb),0.85), 0 10px 26px rgba(0,0,0,0.6);
}
#cm-toggle-btn.dragging { cursor: grabbing; transition: none; }
#cm-toggle-btn svg {
width: 24px;
height: 24px;
fill: white;
filter: drop-shadow(0 1px 2px rgba(0,0,0,0.3));
}
#cm-root {
position: fixed;
top: 70px;
right: 16px;
z-index: 999998;
min-width: 220px;
min-height: 200px;
background: var(--cm-bg-dark);
border-radius: 12px;
font-family: 'Inter', -apple-system, sans-serif;
color: var(--cm-text);
border: 1px solid var(--cm-border);
box-shadow: 0 0 40px rgba(var(--cm-primary-rgb),0.1), 0 15px 30px rgba(0,0,0,0.4);
display: none;
opacity: 0;
overflow: auto;
transition: opacity 0.2s ease, transform 0.2s ease;
transform: translateY(-10px) scale(0.98);
resize: both;
}
#cm-root.visible {
display: flex;
flex-direction: column;
opacity: 1;
transform: translateY(0) scale(1);
}
#cm-root.dragging { transition: none; user-select: none; }
/* Custom resize handle (optional, but adds visibility) */
#cm-root::-webkit-resizer {
background: linear-gradient(135deg, var(--cm-text-muted), var(--cm-text));
border-radius: 0 0 8px 0;
width: 12px;
height: 12px;
}
.cm-header {
padding: 8px 10px 6px;
background: linear-gradient(180deg, rgba(var(--cm-primary-rgb),0.08) 0%, transparent 100%);
border-bottom: 1px solid var(--cm-border);
cursor: grab;
user-select: none;
flex-shrink: 0;
}
.cm-header:active { cursor: grabbing; }
.cm-title-row {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 6px;
}
.cm-logo { display: flex; align-items: center; gap: 6px; }
.cm-logo-icon {
width: 24px; height: 24px;
border-radius: 6px;
background: linear-gradient(135deg, var(--cm-primary), var(--cm-secondary));
display: flex; align-items: center; justify-content: center;
box-shadow: 0 2px 8px rgba(var(--cm-primary-rgb),0.3);
}
.cm-logo-icon svg { width: 14px; height: 14px; fill: white; }
.cm-title {
font-family: 'Space Grotesk', sans-serif;
font-size: 13px; font-weight: 700; letter-spacing: -0.02em;
background: linear-gradient(135deg, #fff 0%, var(--cm-accent) 100%);
-webkit-background-clip: text; -webkit-text-fill-color: transparent;
}
.cm-free-badge {
background: linear-gradient(135deg, #10b981, #059669);
color: white;
font-size: 8px;
font-weight: 700;
padding: 2px 6px;
border-radius: 12px;
margin-left: 8px;
letter-spacing: 0.5px;
box-shadow: 0 0 6px rgba(16,185,129,0.5);
text-transform: uppercase;
}
.cm-version {
font-size: 8px; font-weight: 600; color: var(--cm-text-muted);
background: var(--cm-bg-elevated); padding: 1px 4px; border-radius: 3px; margin-left: 4px;
}
.cm-status-row { display: flex; align-items: center; gap: 4px; }
.cm-pill {
padding: 2px 5px; border-radius: 4px;
font-size: 8px; font-weight: 700;
text-transform: uppercase; letter-spacing: 0.04em;
}
.cm-pill.active {
background: rgba(16,185,129,0.2); color: var(--cm-success);
border: 1px solid rgba(16,185,129,0.3);
}
.cm-pill.mode {
background: rgba(var(--cm-primary-rgb),0.2); color: var(--cm-primary);
border: 1px solid rgba(var(--cm-primary-rgb),0.3);
}
.cm-discord-link {
display: flex; align-items: center; gap: 6px;
padding: 6px 10px;
background: linear-gradient(135deg, #5865F2 0%, #7289da 100%);
border-radius: 8px; font-size: 10px; font-weight: 600;
color: white; text-decoration: none; transition: all 0.2s ease; margin-left: auto;
}
.cm-discord-link:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(88,101,242,0.4); }
.cm-discord-link svg { width: 14px; height: 14px; fill: currentColor; }
.cm-tabs {
display: flex; gap: 2px;
background: var(--cm-bg-card); padding: 2px; border-radius: 6px;
}
.cm-tab {
flex: 1; padding: 5px 4px; border-radius: 4px;
font-size: 9px; font-weight: 600; text-align: center;
cursor: pointer; transition: all 0.15s ease;
color: var(--cm-text-muted); background: transparent; border: none; white-space: nowrap;
}
.cm-tab:hover { color: var(--cm-text); background: rgba(255,255,255,0.03); }
.cm-tab.active {
background: var(--cm-bg-elevated); color: white;
box-shadow: 0 1px 4px rgba(0,0,0,0.2);
}
.cm-body { padding: 8px; overflow-y: auto; flex: 1; }
.cm-body::-webkit-scrollbar { width: 4px; }
.cm-body::-webkit-scrollbar-track { background: transparent; }
.cm-body::-webkit-scrollbar-thumb { background: rgba(var(--cm-primary-rgb),0.3); border-radius: 2px; }
.cm-panel { display: none; }
.cm-panel.active { display: block; animation: cmFadeIn 0.2s ease; }
@keyframes cmFadeIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } }
.cm-section { margin-bottom: 8px; }
.cm-section:last-child { margin-bottom: 0; }
.cm-section-title {
font-size: 8px; font-weight: 700;
text-transform: uppercase; letter-spacing: 0.1em;
color: var(--cm-text-muted); margin-bottom: 4px;
display: flex; align-items: center; gap: 4px; justify-content: space-between;
}
.cm-section-title > span { display: flex; align-items: center; gap: 4px; }
.cm-section-title > span::after {
content: ''; width: 20px; height: 1px;
background: linear-gradient(90deg, var(--cm-border), transparent);
}
.cm-section-toggle { transform: scale(0.7); }
.cm-section-disabled { opacity: 0.4; pointer-events: none; }
.cm-divider { height: 1px; background: var(--cm-border); margin: 10px 0; }
.cm-card {
background: var(--cm-bg-card); border-radius: 8px;
padding: 6px; border: 1px solid var(--cm-border);
}
.cm-live-score {
text-align: center; padding: 8px 6px;
background: linear-gradient(135deg, rgba(var(--cm-primary-rgb),0.08), rgba(var(--cm-accent-rgb),0.05));
border-radius: 8px;
}
.cm-score-value {
font-family: 'JetBrains Mono', monospace;
font-size: 24px; font-weight: 800; letter-spacing: -0.02em; line-height: 1; margin-bottom: 2px;
}
.cm-score-tier { font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; }
.cm-row {
display: flex; align-items: center; justify-content: space-between;
padding: 4px 0; border-bottom: 1px solid var(--cm-border);
}
.cm-row:last-child { border-bottom: none; }
.cm-label { font-size: 10px; font-weight: 500; color: var(--cm-text); }
.cm-value { font-family: 'JetBrains Mono', monospace; font-size: 9px; font-weight: 600; color: var(--cm-text); }
.cm-number-control {
display: flex;
align-items: center;
gap: 4px;
}
.cm-number-btn {
background: var(--cm-bg-elevated);
border: 1px solid var(--cm-border);
border-radius: 4px;
width: 22px;
height: 22px;
font-size: 12px;
font-weight: 700;
cursor: pointer;
transition: all 0.1s ease;
color: var(--cm-text);
}
.cm-number-btn:hover {
background: rgba(var(--cm-primary-rgb),0.2);
border-color: rgba(var(--cm-primary-rgb),0.5);
}
.cm-number-input {
width: 60px;
text-align: center;
background: var(--cm-bg-elevated);
border: 1px solid var(--cm-border);
border-radius: 4px;
padding: 4px 0;
font-family: 'JetBrains Mono', monospace;
font-size: 11px;
color: var(--cm-text);
}
.cm-slider-row { display: flex; flex-direction: column; gap: 2px; padding: 4px 0; border-bottom: 1px solid var(--cm-border); }
.cm-slider-row:last-child { border-bottom: none; }
.cm-slider-header { display: flex; justify-content: space-between; align-items: center; }
.cm-slider-label { font-size: 9px; font-weight: 500; }
.cm-slider-value {
font-family: 'JetBrains Mono', monospace; font-size: 9px; font-weight: 600; color: var(--cm-text);
background: var(--cm-bg-elevated); border: 1px solid var(--cm-border); padding: 1px 4px; border-radius: 3px;
}
.cm-slider-track {
position: relative; height: 4px;
background: var(--cm-bg-elevated); border-radius: 2px; overflow: hidden; border: 1px solid var(--cm-border);
}
.cm-slider-fill {
position: absolute; top: 0; left: 0; height: 100%;
background: var(--cm-text-muted); border-radius: 2px; transition: width 0.1s ease; opacity: 0.4;
}
.cm-slider {
position: absolute; top: 0; left: 0; width: 100%; height: 100%;
-webkit-appearance: none; background: transparent; cursor: pointer; margin: 0;
}
.cm-slider::-webkit-slider-thumb {
-webkit-appearance: none; width: 14px; height: 14px; border-radius: 50%;
background: var(--cm-text); cursor: pointer;
box-shadow: 0 2px 6px rgba(0,0,0,0.4); transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.cm-slider::-webkit-slider-thumb:hover { transform: scale(1.15); box-shadow: 0 2px 10px rgba(0,0,0,0.5); }
.cm-toggle { position: relative; width: 32px; height: 18px; cursor: pointer; }
.cm-toggle input { opacity: 0; width: 0; height: 0; }
.cm-toggle-track {
position: absolute; inset: 0; border-radius: 11px;
background: var(--cm-bg-elevated); border: 1px solid var(--cm-border); transition: all 0.25s ease;
}
.cm-toggle input:checked + .cm-toggle-track { background: var(--cm-text); border-color: var(--cm-text); }
.cm-toggle-thumb {
position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%;
background: var(--cm-text); box-shadow: 0 1px 3px rgba(0,0,0,0.3);
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}
.cm-toggle input:checked ~ .cm-toggle-thumb { left: 16px; background: var(--cm-bg-dark); }
.cm-btn-group { display: flex; gap: 3px; background: var(--cm-bg-elevated); padding: 2px; border-radius: 6px; }
.cm-btn-opt {
padding: 6px 10px; border-radius: 6px; font-size: 10px; font-weight: 700;
text-transform: uppercase; letter-spacing: 0.03em; cursor: pointer; transition: all 0.15s ease;
background: transparent; color: var(--cm-text-muted); border: none;
}
.cm-btn-opt:hover { color: var(--cm-text); }
.cm-btn-opt.active { background: var(--cm-text); color: var(--cm-bg-dark); box-shadow: 0 2px 6px rgba(0,0,0,0.3); }
.cm-preview {
margin-top: 12px; padding: 16px;
background: linear-gradient(135deg, rgba(var(--cm-primary-rgb),0.08), rgba(var(--cm-accent-rgb),0.05));
border-radius: 10px; text-align: center; border: 1px solid rgba(var(--cm-primary-rgb),0.15);
}
.cm-preview-score { font-family: 'JetBrains Mono', monospace; font-size: 32px; font-weight: 800; }
.cm-preview-tier { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; margin-top: 4px; }
.cm-file-picker {
display: flex; align-items: center; gap: 8px; padding: 8px;
background: var(--cm-bg-elevated); border: 1px dashed var(--cm-border);
border-radius: 6px; cursor: pointer; transition: all 0.15s ease;
}
.cm-file-picker:hover { border-color: var(--cm-text); background: rgba(var(--cm-accent-rgb),0.05); }
.cm-file-icon {
width: 28px; height: 28px; border-radius: 6px;
background: var(--cm-bg-card); display: flex; align-items: center; justify-content: center;
}
.cm-file-icon svg { width: 14px; height: 14px; fill: var(--cm-text-muted); }
.cm-file-name { font-size: 10px; color: var(--cm-text-muted); flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cm-file-name.selected { color: var(--cm-success); }
.cm-preset-section { margin-top: 6px; padding-top: 6px; border-top: 1px solid var(--cm-border); }
.cm-preset-label { font-size: 8px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--cm-text-muted); display: block; margin-bottom: 4px; }
.cm-preset-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; }
.cm-preset-btn {
padding: 4px 6px; font-size: 8px; font-weight: 500;
border: 1px solid var(--cm-border); border-radius: 4px;
background: var(--cm-bg-elevated); color: var(--cm-text); cursor: pointer; transition: all 0.15s ease; text-align: center;
}
.cm-preset-btn:hover { background: var(--cm-text); color: var(--cm-bg-dark); border-color: var(--cm-text); }
.cm-preset-btn.active { background: var(--cm-text); color: var(--cm-bg-dark); border-color: var(--cm-text); }
.cm-color-row { display: flex; align-items: center; gap: 10px; }
.cm-color-input { width: 32px; height: 32px; border-radius: 8px; border: none; cursor: pointer; padding: 0; background: none; }
.cm-input {
background: var(--cm-bg-elevated); border: 1px solid var(--cm-border);
border-radius: 6px; padding: 6px 10px;
font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--cm-text);
outline: none; transition: all 0.2s ease;
}
.cm-input:focus { border-color: var(--cm-primary); box-shadow: 0 0 0 2px rgba(var(--cm-primary-rgb),0.2); }
.cm-score-input {
-moz-appearance: textfield;
}
.cm-score-input::-webkit-outer-spin-button,
.cm-score-input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
.cm-select {
background: var(--cm-bg-elevated); border: 1px solid var(--cm-border);
border-radius: 6px; padding: 6px 10px;
font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--cm-text);
outline: none; cursor: pointer; transition: all 0.2s ease;
}
.cm-select:focus { border-color: var(--cm-primary); box-shadow: 0 0 0 2px rgba(var(--cm-primary-rgb),0.2); }
.cm-select option { background: var(--cm-bg-dark); color: var(--cm-text); }
.cm-btn-small {
background: linear-gradient(135deg, var(--cm-primary), var(--cm-secondary));
border: none; border-radius: 4px; padding: 4px 10px;
font-family: 'Inter', sans-serif; font-size: 10px; font-weight: 600;
color: white; cursor: pointer; transition: all 0.2s ease;
}
.cm-btn-small:hover { transform: scale(1.02); filter: brightness(1.1); }
.cm-shapes { display: flex; gap: 4px; }
.cm-shape-btn {
width: 32px; height: 32px; border-radius: 8px;
border: 1px solid var(--cm-border); background: var(--cm-bg-elevated);
cursor: pointer; font-size: 14px; display: flex; align-items: center; justify-content: center; transition: all 0.15s ease;
}
.cm-shape-btn:hover { background: rgba(var(--cm-primary-rgb),0.15); }
.cm-shape-btn.active { background: linear-gradient(135deg, var(--cm-primary), var(--cm-secondary)); border-color: transparent; }
.cm-theme-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; margin-top: 4px; }
.cm-theme-btn {
padding: 6px 4px; border-radius: 6px; border: 1px solid var(--cm-border);
background: var(--cm-bg-elevated); cursor: pointer; transition: all 0.15s ease; text-align: center;
}
.cm-theme-btn:hover { border-color: rgba(var(--cm-primary-rgb),0.4); }
.cm-theme-btn.active { border-color: var(--cm-text); box-shadow: 0 0 8px rgba(var(--cm-primary-rgb),0.2); }
.cm-theme-preview { width: 16px; height: 16px; border-radius: 4px; margin: 0 auto 3px; }
.cm-theme-name { font-size: 8px; font-weight: 600; color: var(--cm-text); }
.cm-panic-btn {
width: 100%; padding: 6px 10px; font-size: 9px; font-weight: 600;
border: 1px solid var(--cm-danger); border-radius: 4px;
background: rgba(239,68,68,0.1); color: var(--cm-danger); cursor: pointer; transition: all 0.15s ease;
}
.cm-panic-btn:hover { background: var(--cm-danger); color: white; }
#cm-root.stream-hidden,
#cm-toggle-btn.stream-hidden { display: none !important; opacity: 0 !important; pointer-events: none !important; }
#cm-watermark {
position: fixed; bottom: 16px; right: 16px; z-index: 999990;
padding: 6px 12px; border-radius: 8px;
background: rgba(var(--cm-primary-rgb),0.1); backdrop-filter: blur(8px);
border: 1px solid rgba(var(--cm-primary-rgb),0.2);
font-family: 'JetBrains Mono', monospace; font-size: 9px; font-weight: 600;
color: rgba(255,255,255,0.35); letter-spacing: 0.05em; cursor: grab; user-select: none;
}
.cm-toggle-track, .cm-toggle-thumb, .cm-btn-opt, .cm-tab, .cm-card, .cm-section,
.cm-file-picker, .cm-theme-btn, .cm-panic-btn, .cm-input, .cm-slider-fill {
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1) !important;
}
.cm-card:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0,0,0,0.15); }
.cm-btn-opt:active, .cm-tab:active { transform: scale(0.96); }
.cm-toggle input:checked ~ .cm-toggle-thumb { transform: translateX(0); }
#cm-root { transition: opacity 0.3s ease, transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), visibility 0.3s ease; }
#cm-root:not(.visible) { opacity: 0; transform: translateX(20px) scale(0.95); visibility: hidden; pointer-events: none; }
#cm-root.visible { opacity: 1; transform: translateX(0) scale(1); visibility: visible; }
#cm-disclaimer {
position: fixed; bottom: 16px; left: 16px; z-index: 999999;
padding: 10px 14px; border-radius: 8px;
background: rgba(234, 179, 8, 0.15); backdrop-filter: blur(10px);
border: 1px solid rgba(234, 179, 8, 0.4);
font-family: 'Inter', -apple-system, sans-serif; font-size: 11px; font-weight: 500;
color: #eab308; display: flex; align-items: center; gap: 10px;
animation: cm-slide-in 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
#cm-disclaimer.hiding {
animation: cm-slide-out 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
@keyframes cm-slide-in {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes cm-slide-out {
from { opacity: 1; transform: translateY(0); }
to { opacity: 0; transform: translateY(20px); }
}
#cm-disclaimer-close {
background: none; border: none; color: #eab308; cursor: pointer;
padding: 2px; display: flex; align-items: center; justify-content: center;
border-radius: 4px; transition: all 0.2s ease;
}
#cm-disclaimer-close:hover { background: rgba(234, 179, 8, 0.2); }
#cm-disclaimer-close svg { width: 14px; height: 14px; }
/* ============================================================
ENHANCED UI LAYER — visual polish & animations
============================================================ */
@keyframes cmGlowPulse {
0%,100% { box-shadow: 0 0 0 0 rgba(var(--cm-primary-rgb),0.45); }
50% { box-shadow: 0 0 10px 2px rgba(var(--cm-primary-rgb),0.0); }
}
@keyframes cmSheen {
0% { background-position: -150% 0; }
100% { background-position: 250% 0; }
}
@keyframes cmBorderFlow {
0% { background-position: 0% 50%; }
100% { background-position: 200% 50%; }
}
@keyframes cmRise {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes cmScorePulse {
0%,100% { transform: scale(1); text-shadow: 0 0 14px rgba(var(--cm-primary-rgb),0.35); }
50% { transform: scale(1.04); text-shadow: 0 0 22px rgba(var(--cm-primary-rgb),0.6); }
}
@keyframes cmSpin { to { transform: rotate(360deg); } }
/* ---- Panel shell: glassy + animated gradient top accent ---- */
#cm-root {
background:
linear-gradient(180deg, rgba(var(--cm-primary-rgb),0.05), transparent 140px),
rgba(10,8,10,0.82) !important;
backdrop-filter: blur(18px) saturate(135%);
-webkit-backdrop-filter: blur(18px) saturate(135%);
border: 1px solid var(--cm-border) !important;
border-radius: 16px !important;
box-shadow:
0 0 0 1px rgba(255,255,255,0.03),
0 0 50px rgba(var(--cm-primary-rgb),0.14),
0 24px 60px rgba(0,0,0,0.55) !important;
}
#cm-root::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0;
height: 2px;
border-radius: 16px 16px 0 0;
background: linear-gradient(90deg,
transparent, var(--cm-primary), var(--cm-accent), var(--cm-primary), transparent);
background-size: 200% 100%;
animation: cmBorderFlow 4s linear infinite;
opacity: 0.9;
pointer-events: none;
z-index: 5;
}
/* ---- Header: subtle moving sheen ---- */
.cm-header {
position: relative;
padding: 12px 12px 10px !important;
overflow: hidden;
background:
linear-gradient(180deg, rgba(var(--cm-primary-rgb),0.10) 0%, transparent 100%) !important;
}
.cm-header::after {
content: '';
position: absolute; inset: 0;
background: linear-gradient(115deg, transparent 35%, rgba(255,255,255,0.06) 50%, transparent 65%);
background-size: 250% 100%;
animation: cmSheen 6s ease-in-out infinite;
pointer-events: none;
}
.cm-title {
background: linear-gradient(135deg, #fff 0%, var(--cm-accent) 50%, var(--cm-primary) 100%) !important;
background-size: 200% auto !important;
-webkit-background-clip: text !important;
background-clip: text !important;
-webkit-text-fill-color: transparent !important;
animation: cmBorderFlow 5s linear infinite;
font-size: 14px !important;
}
.cm-logo-icon { animation: cmGlowPulse 2.6s ease-in-out infinite; }
/* ---- Status pill: live glow ---- */
.cm-pill.active {
position: relative;
animation: cmGlowPulse 2s ease-in-out infinite;
}
.cm-pill { transition: all 0.25s ease; }
/* ---- Tabs: animated hover + active ---- */
.cm-tabs { gap: 3px !important; border-radius: 9px !important; padding: 3px !important; }
.cm-tab {
position: relative; overflow: hidden; border-radius: 7px !important;
transition: color 0.2s ease, background 0.2s ease, transform 0.12s ease;
}
.cm-tab.active {
background: linear-gradient(135deg, rgba(var(--cm-primary-rgb),0.22), rgba(var(--cm-accent-rgb),0.12)) !important;
color: #fff !important;
box-shadow: 0 0 0 1px rgba(var(--cm-primary-rgb),0.3), 0 2px 8px rgba(var(--cm-primary-rgb),0.18) !important;
}
.cm-tab.active::after {
content: '';
position: absolute; bottom: 2px; left: 50%; transform: translateX(-50%);
width: 16px; height: 2px; border-radius: 2px;
background: var(--cm-primary);
box-shadow: 0 0 6px var(--cm-primary);
}
.cm-tab:hover { transform: translateY(-1px); }
/* ---- Panels stagger rows on enter ---- */
.cm-panel.active .cm-section { animation: cmRise 0.35s ease both; }
.cm-panel.active .cm-section:nth-child(2) { animation-delay: 0.05s; }
.cm-panel.active .cm-section:nth-child(3) { animation-delay: 0.10s; }
.cm-panel.active .cm-section:nth-child(4) { animation-delay: 0.15s; }
.cm-panel.active .cm-section:nth-child(5) { animation-delay: 0.20s; }
/* ---- Cards: gradient + glow lift ---- */
.cm-card {
background: linear-gradient(160deg, var(--cm-bg-card), var(--cm-bg-dark)) !important;
border: 1px solid var(--cm-border) !important;
border-radius: 10px !important;
padding: 8px !important;
position: relative;
}
.cm-card:hover {
transform: translateY(-2px);
border-color: rgba(var(--cm-primary-rgb),0.35) !important;
box-shadow: 0 8px 22px rgba(0,0,0,0.4), 0 0 0 1px rgba(var(--cm-primary-rgb),0.15) !important;
}
.cm-section-title { font-size: 9px !important; }
/* ---- Rows: hover highlight ---- */
.cm-row { transition: background 0.2s ease, padding 0.2s ease; border-radius: 6px; }
.cm-row:hover { background: rgba(var(--cm-primary-rgb),0.05); }
/* ---- Toggles: glow when on ---- */
.cm-toggle input:checked + .cm-toggle-track {
background: linear-gradient(135deg, var(--cm-primary), var(--cm-secondary)) !important;
border-color: transparent !important;
box-shadow: 0 0 10px rgba(var(--cm-primary-rgb),0.5);
}
.cm-toggle input:checked ~ .cm-toggle-thumb {
background: #fff !important;
box-shadow: 0 0 8px rgba(var(--cm-primary-rgb),0.6), 0 1px 3px rgba(0,0,0,0.4);
}
.cm-toggle:hover .cm-toggle-thumb { transform: scale(1.08); }
/* ---- Sliders: themed fill + glowing thumb ---- */
.cm-slider-fill {
background: linear-gradient(90deg, var(--cm-secondary), var(--cm-primary)) !important;
opacity: 1 !important;
box-shadow: 0 0 8px rgba(var(--cm-primary-rgb),0.5);
}
.cm-slider::-webkit-slider-thumb {
background: #fff !important;
box-shadow: 0 0 0 3px rgba(var(--cm-primary-rgb),0.25), 0 2px 6px rgba(0,0,0,0.5) !important;
}
.cm-slider::-webkit-slider-thumb:hover {
box-shadow: 0 0 0 5px rgba(var(--cm-primary-rgb),0.35), 0 2px 10px rgba(0,0,0,0.6) !important;
}
.cm-slider-value {
background: rgba(var(--cm-primary-rgb),0.12) !important;
border-color: rgba(var(--cm-primary-rgb),0.3) !important;
color: var(--cm-text) !important;
}
/* ---- Segmented buttons: gradient active ---- */
.cm-btn-group { border-radius: 8px !important; }
.cm-btn-opt { border-radius: 6px !important; }
.cm-btn-opt.active {
background: linear-gradient(135deg, var(--cm-primary), var(--cm-secondary)) !important;
color: #fff !important;
box-shadow: 0 2px 10px rgba(var(--cm-primary-rgb),0.4) !important;
}
/* ---- Live / preview score: breathing animation ---- */
.cm-live-score, .cm-preview {
border: 1px solid rgba(var(--cm-primary-rgb),0.2) !important;
border-radius: 12px !important;
}
.cm-score-value, .cm-preview-score { animation: cmScorePulse 3s ease-in-out infinite; }
/* ---- File pickers ---- */
.cm-file-picker { border-radius: 8px !important; }
.cm-file-picker:hover {
border-color: var(--cm-primary) !important;
box-shadow: 0 0 0 2px rgba(var(--cm-primary-rgb),0.12);
}
/* ---- Theme swatches ---- */
.cm-theme-btn { border-radius: 8px !important; }
.cm-theme-btn:hover { transform: translateY(-2px) scale(1.03); }
.cm-theme-btn.active { box-shadow: 0 0 0 1px var(--cm-primary), 0 0 12px rgba(var(--cm-primary-rgb),0.35) !important; }
.cm-theme-preview { box-shadow: 0 2px 6px rgba(0,0,0,0.4); }
/* ---- Small / panic buttons ---- */
.cm-btn-small { border-radius: 6px !important; box-shadow: 0 2px 8px rgba(var(--cm-primary-rgb),0.3); }
.cm-btn-small:active { transform: scale(0.96); }
.cm-panic-btn { border-radius: 6px !important; transition: all 0.2s ease; }
.cm-panic-btn:hover { box-shadow: 0 0 14px rgba(239,68,68,0.5); }
/* ---- Inputs ---- */
.cm-input, .cm-select { border-radius: 8px !important; }
/* ---- Discord link shine ---- */
.cm-discord-link { position: relative; overflow: hidden; }
.cm-discord-link::after {
content: ''; position: absolute; inset: 0;
background: linear-gradient(115deg, transparent 40%, rgba(255,255,255,0.25) 50%, transparent 60%);
background-size: 250% 100%;
animation: cmSheen 4.5s ease-in-out infinite;
}
/* ---- Scrollbar ---- */
.cm-body::-webkit-scrollbar-thumb {
background: linear-gradient(var(--cm-secondary), var(--cm-primary)) !important;
border-radius: 3px !important;
}
/* ---- Hook status spinner when pending ---- */
#cm-zustand-val[data-pending="1"]::before {
content: '';
display: inline-block; width: 7px; height: 7px;
margin-right: 5px; vertical-align: middle;
border: 1.5px solid var(--cm-warning);
border-top-color: transparent; border-radius: 50%;
animation: cmSpin 0.8s linear infinite;
}
/* ============================================================
TOP-CENTER QUICK CONTROL BAR
============================================================ */
#cm-controlbar {
position: fixed;
top: 14px;
left: 50%;
transform: translateX(-50%) translateY(-4px);
z-index: 999999;
display: flex;
align-items: center;
gap: 6px;
padding: 7px 9px;
border-radius: 14px;
background: rgba(10,8,14,0.78);
backdrop-filter: blur(16px) saturate(140%);
-webkit-backdrop-filter: blur(16px) saturate(140%);
border: 1px solid rgba(var(--cm-primary-rgb),0.28);
box-shadow:
0 0 0 1px rgba(255,255,255,0.03),
0 0 26px rgba(var(--cm-primary-rgb),0.12),
0 12px 30px rgba(0,0,0,0.5);
font-family: 'Inter', -apple-system, sans-serif;
opacity: 0;
pointer-events: none;
cursor: grab;
transition: opacity 0.35s ease, transform 0.35s cubic-bezier(0.34,1.56,0.64,1);
}
#cm-controlbar.cm-cb-show { opacity: 1; transform: translateX(-50%) translateY(0); pointer-events: auto; }
#cm-controlbar.cm-cb-hidden { display: none !important; }
#cm-controlbar.cm-cb-dragging { cursor: grabbing; transition: opacity 0.35s ease; }
#cm-controlbar::before {
content: '';
position: absolute; inset: 0;
border-radius: 14px;
padding: 1px;
background: linear-gradient(90deg, transparent, rgba(var(--cm-primary-rgb),0.5), transparent);
background-size: 200% 100%;
animation: cmBorderFlow 4s linear infinite;
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
pointer-events: none;
}
.cm-cb-item {
display: flex;
align-items: center;
gap: 6px;
padding: 5px 9px 5px 6px;
border-radius: 10px;
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.06);
cursor: pointer;
user-select: none;
transition: background 0.2s ease, border-color 0.2s ease, transform 0.12s ease, box-shadow 0.2s ease;
}
.cm-cb-item:hover { transform: translateY(-1px); background: rgba(255,255,255,0.06); }
.cm-cb-item:active { transform: translateY(0) scale(0.97); }
.cm-cb-key {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 22px;
height: 22px;
padding: 0 5px;
border-radius: 7px;
font-size: 11px;
font-weight: 800;
color: var(--cm-text);
background: linear-gradient(180deg, rgba(var(--cm-primary-rgb),0.18), rgba(var(--cm-primary-rgb),0.06));
border: 1px solid rgba(var(--cm-primary-rgb),0.4);
box-shadow: 0 1px 0 rgba(0,0,0,0.4), inset 0 1px 0 rgba(255,255,255,0.08);
text-shadow: 0 0 6px rgba(var(--cm-primary-rgb),0.4);
}
.cm-cb-label {
font-size: 11px;
font-weight: 600;
letter-spacing: 0.2px;
color: rgba(235,235,245,0.72);
white-space: nowrap;
}
.cm-cb-dot {
width: 7px; height: 7px; border-radius: 50%;
background: #4b4b55;
box-shadow: 0 0 0 2px rgba(255,255,255,0.04);
transition: background 0.25s ease, box-shadow 0.25s ease;
}
.cm-cb-item.cm-on { border-color: rgba(var(--cm-primary-rgb),0.55); background: rgba(var(--cm-primary-rgb),0.10); }
.cm-cb-item.cm-on .cm-cb-label { color: var(--cm-text); }
.cm-cb-item.cm-on .cm-cb-dot {
background: var(--cm-primary);
box-shadow: 0 0 8px rgba(var(--cm-primary-rgb),0.8), 0 0 0 2px rgba(var(--cm-primary-rgb),0.18);
}
.cm-cb-item.cm-flash { animation: cmCbFlash 0.45s ease; }
@keyframes cmCbFlash {
0% { box-shadow: 0 0 0 0 rgba(var(--cm-primary-rgb),0.55); }
40% { box-shadow: 0 0 0 5px rgba(var(--cm-primary-rgb),0.0); }
100% { box-shadow: 0 0 0 0 rgba(var(--cm-primary-rgb),0.0); }
}
.cm-cb-sep { width: 1px; height: 20px; background: rgba(255,255,255,0.08); margin: 0 1px; }
#cm-controlbar.stream-hidden { display: none !important; }
@media (prefers-reduced-motion: reduce) {
#cm-toggle-btn::before, #cm-toggle-btn::after,
.cm-header::after, .cm-discord-link::after, .cm-title,
#cm-root::before, .cm-logo-icon, .cm-pill.active,
.cm-score-value, .cm-preview-score,
#cm-controlbar::before, .cm-cb-item.cm-flash { animation: none !important; }
}
`;
document.head.appendChild(style);
applyTheme(CONFIG.theme || 'midnight');
applyAccentColor(CONFIG.accentColor || '#6366f1');
const btn = document.createElement('button');
btn.id = 'cm-toggle-btn';
btn.innerHTML = `<img src="https://cdn.discordapp.com/icons/1508543746214465648/44b1c062230c1103016d7928805df398.webp?size=1024" style="width:26px;height:26px;border-radius:4px;object-fit:cover;">`;
document.body.appendChild(btn);
// Top-center quick control bar
const controlBar = document.createElement('div');
controlBar.id = 'cm-controlbar';
controlBar.innerHTML = `
<div class="cm-cb-item" data-cb="master" title="Toggle Master Switch (M)">
<span class="cm-cb-key">M</span>
<span class="cm-cb-label" data-i18n="active">Master</span>
<span class="cm-cb-dot"></span>
</div>
<div class="cm-cb-sep"></div>
<div class="cm-cb-item" data-cb="camera" title="Toggle Camera Spoof (C)">
<span class="cm-cb-key">C</span>
<span class="cm-cb-label" data-i18n="video">Camera</span>
<span class="cm-cb-dot"></span>
</div>
<div class="cm-cb-sep"></div>
<div class="cm-cb-item" data-cb="audio" title="Toggle Audio Spoof (A)">
<span class="cm-cb-key">A</span>
<span class="cm-cb-label" data-i18n="audioSpoof">Audio</span>
<span class="cm-cb-dot"></span>
</div>
`;
document.body.appendChild(controlBar);
// Control bar hidden by default
if (CONFIG.showControlBar) controlBar.classList.add('cm-cb-show');
else controlBar.classList.add('cm-cb-hidden');
const root = document.createElement('div');
root.id = 'cm-root';
// restore saved size if any
if (CONFIG.panelWidth) root.style.width = CONFIG.panelWidth + 'px';
if (CONFIG.panelHeight) root.style.height = CONFIG.panelHeight + 'px';
root.addEventListener('resize', () => {
// save new size when user stops resizing (debounced)
clearTimeout(root._resizeTimer);
root._resizeTimer = setTimeout(() => {
CONFIG.panelWidth = root.offsetWidth;
CONFIG.panelHeight = root.offsetHeight;
saveConfig();
}, 300);
});
root.innerHTML = `
<div class="cm-header">
<div class="cm-title-row">
<div class="cm-logo">
<div class="cm-logo-icon">
<img src="https://cdn.discordapp.com/icons/1508543746214465648/44b1c062230c1103016d7928805df398.webp?size=1024" style="width:24px;height:24px;border-radius:6px;object-fit:cover;display:block;">
</div>
<div>
<span class="cm-title">cheatmoggle</span>
<span class="cm-free-badge">FREE</span>
<span class="cm-version">v13.6.2</span>
</div>
</div>
<a href="https://discord.gg/f8GwCMHhD9" target="_blank" class="cm-discord-link">
<svg viewBox="0 0 24 24"><path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/></svg>
Join Discord
</a>
</div>
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;">
<div class="cm-status-row">
<span class="cm-pill active" id="cm-status-pill" data-i18n="active">ON</span>
<span class="cm-pill mode" id="cm-mode-pill" data-i18n="matchType">NORMAL</span>
</div>
</div>
<div class="cm-tabs">
<button class="cm-tab active" data-tab="home" data-i18n="systemStatus">Home</button>
<button class="cm-tab" data-tab="score" data-i18n="scoreControl">Score</button>
<button class="cm-tab" data-tab="automation" data-i18n="matchmaking">Auto</button>
<button class="cm-tab" data-tab="camera" data-i18n="virtualCamera">Camera</button>
<button class="cm-tab" data-tab="settings" data-i18n="appearance">Settings</button>
<button class="cm-tab" data-tab="credits" data-i18n="credits">Credits</button>
</div>
</div>
<div class="cm-body">
<!-- HOME PANEL -->
<div class="cm-panel active" data-panel="home">
<div class="cm-section">
<div class="cm-section-title" data-i18n="systemStatus">System Status</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="masterSwitch">Master Switch</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-enable-toggle" checked>
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="powerStatus">Power Status</span>
<span class="cm-value" id="cm-enabled-val" style="color: var(--cm-success)">ACTIVE</span>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="matchType">Match Type</span>
<span class="cm-value" id="cm-mode-val">NORMAL</span>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="hookStatus">Hook Status</span>
<span class="cm-value" id="cm-zustand-val" data-pending="1" style="color: var(--cm-warning)">PENDING</span>
</div>
<div class="cm-row" style="border-bottom:none;padding-top:6px;display:flex;gap:6px;">
<button class="cm-panic-btn" id="cm-clearcookies-btn" style="margin:0;flex:1;" data-i18n="unbanClearCookies">Unban / Clear Cookies</button>
<button class="cm-panic-btn" id="cm-verifbypass-btn" style="margin:0;flex:1;background:var(--cm-accent);color:#fff;" data-i18n="verificationBypass">Verification Bypass</button>
</div>
</div>
</div>
</div>
<!-- SCORE PANEL -->
<div class="cm-panel" data-panel="score">
<div class="cm-section">
<div class="cm-section-title">
<span data-i18n="scoreControl">Score Control</span>
<label class="cm-toggle cm-section-toggle">
<input type="checkbox" id="cm-score-enabled" checked>
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-card" id="cm-score-content">
<div class="cm-row">
<span class="cm-label" data-i18n="mode">Mode</span>
<div class="cm-btn-group">
<button class="cm-btn-opt active" data-smode="range" data-i18n="range">Range</button>
<button class="cm-btn-opt" data-smode="fixed" data-i18n="fixed">Fixed</button>
</div>
</div>
<div id="cm-score-fixed" style="display:none;">
<div class="cm-slider-row">
<div class="cm-slider-header">
<span class="cm-slider-label" data-i18n="target">Target (1-10)</span>
<div class="cm-number-control">
<button class="cm-number-btn" data-dec="cm-fixed-score">-</button>
<input type="number" class="cm-number-input cm-score-input" id="cm-fixed-score" min="1" max="10" step="0.1" value="9.4">
<button class="cm-number-btn" data-inc="cm-fixed-score">+</button>
</div>
</div>
</div>
</div>
<div id="cm-score-range">
<div class="cm-slider-row">
<div class="cm-slider-header">
<span class="cm-slider-label" data-i18n="scoreMin">Min (1-10)</span>
<div class="cm-number-control">
<button class="cm-number-btn" data-dec="cm-score-min">-</button>
<input type="number" class="cm-number-input cm-score-input" id="cm-score-min" min="1" max="10" step="0.1" value="8.5">
<button class="cm-number-btn" data-inc="cm-score-min">+</button>
</div>
</div>
</div>
<div class="cm-slider-row">
<div class="cm-slider-header">
<span class="cm-slider-label" data-i18n="scoreMax">Max (1-10)</span>
<div class="cm-number-control">
<button class="cm-number-btn" data-dec="cm-score-max">-</button>
<input type="number" class="cm-number-input cm-score-input" id="cm-score-max" min="1" max="10" step="0.1" value="9.5">
<button class="cm-number-btn" data-inc="cm-score-max">+</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="cm-section">
<div class="cm-section-title">
<span data-i18n="resultSettings">Result Settings</span>
<label class="cm-toggle cm-section-toggle">
<input type="checkbox" id="cm-result-enabled" checked>
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-card" id="cm-result-content">
<div class="cm-row">
<span class="cm-label" data-i18n="type">Type</span>
<div class="cm-btn-group">
<button class="cm-btn-opt active" data-fmode="fixed" data-i18n="staticScore">Static</button>
<button class="cm-btn-opt" data-fmode="range" data-i18n="dynamic">Dynamic</button>
</div>
</div>
<div id="cm-final-fixed">
<div class="cm-slider-row">
<div class="cm-slider-header">
<span class="cm-slider-label" data-i18n="target">Target (1-10)</span>
<div class="cm-number-control">
<button class="cm-number-btn" data-dec="cm-final-score">-</button>
<input type="number" class="cm-number-input cm-score-input" id="cm-final-score" min="1" max="10" step="0.1" value="9.4">
<button class="cm-number-btn" data-inc="cm-final-score">+</button>
</div>
</div>
</div>
</div>
<div id="cm-final-range" style="display:none;">
<div class="cm-slider-row">
<div class="cm-slider-header">
<span class="cm-slider-label" data-i18n="lowerBound">Lower Bound (1-10)</span>
<div class="cm-number-control">
<button class="cm-number-btn" data-dec="cm-final-range-min">-</button>
<input type="number" class="cm-number-input cm-score-input" id="cm-final-range-min" min="1" max="10" step="0.1" value="8.5">
<button class="cm-number-btn" data-inc="cm-final-range-min">+</button>
</div>
</div>
</div>
<div class="cm-slider-row">
<div class="cm-slider-header">
<span class="cm-slider-label" data-i18n="upperBound">Upper Bound (1-10)</span>
<div class="cm-number-control">
<button class="cm-number-btn" data-dec="cm-final-range-max">-</button>
<input type="number" class="cm-number-input cm-score-input" id="cm-final-range-max" min="1" max="10" step="0.1" value="9.7">
<button class="cm-number-btn" data-inc="cm-final-range-max">+</button>
</div>
</div>
</div>
</div>
</div>
<div class="cm-preview">
<div class="cm-preview-score" id="cm-score-preview-num" style="color:#f472b6">9.6</div>
<div class="cm-preview-tier" id="cm-score-preview-tier" style="color:#f472b6">Slayer</div>
</div>
</div>
</div>
<!-- AUTOMATION PANEL -->
<div class="cm-panel" data-panel="automation">
<div class="cm-section">
<div class="cm-section-title" data-i18n="matchmaking">Matchmaking</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="autoQueue">Auto Queue</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-autoqueuetoggle">
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="requestDelayMs">Request Delay (ms)</span>
<input type="number" class="cm-input" id="cm-queue-delay" min="100" max="60000" step="100" value="1000" style="width:80px;">
</div>
<div class="cm-row" style="border-bottom:none;">
<span class="cm-label" data-i18n="autoFindNewMatch">Auto Find New Match</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-autofindnew-toggle" checked>
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
</div>
</div>
<div class="cm-section">
<div class="cm-section-title" data-i18n="spoofCycling">Spoof Cycling</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="autoCycleCamera">Auto Cycle Camera</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-autocam-toggle">
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="cameraIntervalSec">Camera Interval (s)</span>
<input type="number" class="cm-input" id="cm-autocam-interval" min="1" max="600" step="1" value="5" style="width:80px;">
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="autoCycleAudio">Auto Cycle Audio</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-autoaudio-toggle">
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-row" style="border-bottom:none;">
<span class="cm-label" data-i18n="audioIntervalSec">Audio Interval (s)</span>
<input type="number" class="cm-input" id="cm-autoaudio-interval" min="1" max="600" step="1" value="5" style="width:80px;">
</div>
</div>
</div>
<div class="cm-section">
<div class="cm-section-title" data-i18n="convenience">Convenience</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="autoDismissPopups">Auto Dismiss Popups</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-autodismiss-toggle">
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-row" style="border-bottom:none;">
<span class="cm-label" data-i18n="autoClearCookiesOnBan">Auto Clear Cookies on Ban</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-autounban-toggle">
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
</div>
</div>
</div>
<!-- CAMERA PANEL -->
<div class="cm-panel" data-panel="camera">
<div class="cm-section">
<div class="cm-section-title" data-i18n="virtualCamera">Virtual Camera</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="activateSpoof">Activate Spoof</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-camspoof-toggle">
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="flipHorizontal">Flip Horizontal</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-cammirror-toggle">
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="loopVideo">Loop Video</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-camloop-toggle" checked>
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-slider-row">
<div class="cm-slider-header">
<span class="cm-slider-label" data-i18n="playbackSpeed">Playback Speed</span>
<span class="cm-slider-value" id="cm-camspeed-val">1.0x</span>
</div>
<div class="cm-slider-track">
<div class="cm-slider-fill" id="cm-camspeed-fill" style="width:25%"></div>
<input type="range" class="cm-slider" id="cm-camspeed" min="0.25" max="4.0" step="0.25" value="1.0">
</div>
</div>
</div>
</div>
<div class="cm-section">
<div class="cm-section-title" data-i18n="source">Source</div>
<div class="cm-card">
<div class="cm-btn-group" style="margin-bottom:6px;">
<button class="cm-btn-opt active" data-src="video" data-i18n="video">Video</button>
<button class="cm-btn-opt" data-src="image" data-i18n="image">Image</button>
</div>
<div class="cm-file-picker" id="cm-video-picker">
<div class="cm-file-icon"><svg viewBox="0 0 24 24"><path d="M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13z"/></svg></div>
<span class="cm-file-name" id="cm-video-name" data-i18n="selectVideo">Select video file...</span>
</div>
<div class="cm-file-picker" id="cm-image-picker" style="display:none;">
<div class="cm-file-icon"><svg viewBox="0 0 24 24"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></svg></div>
<span class="cm-file-name" id="cm-image-name" data-i18n="selectImage">Select image file...</span>
</div>
</div>
</div>
<div class="cm-section">
<div class="cm-section-title" data-i18n="textOverlay">Text Overlay</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="enableText">Enable Text</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-camtext-toggle">
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="content">Content</span>
<input type="text" class="cm-input" id="cm-camtext-content" value="Your Text Here" style="width:100px;">
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="color">Color</span>
<input type="color" class="cm-color-input" id="cm-camtext-color" value="#ffffff">
</div>
<div class="cm-slider-row">
<div class="cm-slider-header">
<span class="cm-slider-label" data-i18n="size">Size</span>
<span class="cm-slider-value" id="cm-camtext-size-val">24px</span>
</div>
<div class="cm-slider-track">
<div class="cm-slider-fill" id="cm-camtext-size-fill" style="width:50%"></div>
<input type="range" class="cm-slider" id="cm-camtext-size" min="8" max="72" step="1" value="24">
</div>
</div>
</div>
</div>
<div class="cm-section">
<div class="cm-section-title" data-i18n="audioSpoof">Audio Spoof</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="activateAudioSpoof">Activate Audio Spoof</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-audiospoof-toggle">
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-file-picker" id="cm-audio-picker">
<div class="cm-file-icon"><svg viewBox="0 0 24 24"><path d="M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"/></svg></div>
<span class="cm-file-name" id="cm-audio-name" data-i18n="selectAudio">Select audio file...</span>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="loop">Loop</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-audioloop-toggle" checked>
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-slider-row">
<div class="cm-slider-header"><span class="cm-slider-label" data-i18n="speed">Speed</span><span class="cm-slider-value" id="cm-audiospeed-val">1.0x</span></div>
<div class="cm-slider-track"><div class="cm-slider-fill" style="width:25%"></div><input type="range" class="cm-slider" id="cm-audiospeed" min="0.25" max="3.0" step="0.05" value="1.0"></div>
</div>
<div class="cm-slider-row">
<div class="cm-slider-header"><span class="cm-slider-label" data-i18n="volume">Volume</span><span class="cm-slider-value" id="cm-audiovolume-val">100%</span></div>
<div class="cm-slider-track"><div class="cm-slider-fill" style="width:100%"></div><input type="range" class="cm-slider" id="cm-audiovolume" min="0" max="100" step="1" value="100"></div>
</div>
<div class="cm-slider-row">
<div class="cm-slider-header"><span class="cm-slider-label" data-i18n="bass">Bass (dB)</span><span class="cm-slider-value" id="cm-audiobass-val">0 dB</span></div>
<div class="cm-slider-track"><div class="cm-slider-fill" style="width:50%"></div><input type="range" class="cm-slider" id="cm-audiobass" min="-12" max="12" step="1" value="0"></div>
</div>
<div class="cm-slider-row">
<div class="cm-slider-header"><span class="cm-slider-label" data-i18n="treble">Treble (dB)</span><span class="cm-slider-value" id="cm-audiotreble-val">0 dB</span></div>
<div class="cm-slider-track"><div class="cm-slider-fill" style="width:50%"></div><input type="range" class="cm-slider" id="cm-audiotreble" min="-12" max="12" step="1" value="0"></div>
</div>
<div class="cm-slider-row">
<div class="cm-slider-header"><span class="cm-slider-label" data-i18n="warmth">Warmth (dB)</span><span class="cm-slider-value" id="cm-audiowarmth-val">0 dB</span></div>
<div class="cm-slider-track"><div class="cm-slider-fill" style="width:50%"></div><input type="range" class="cm-slider" id="cm-audiowarmth" min="-12" max="12" step="1" value="0"></div>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="status">Status</span>
<span class="cm-value" id="cm-audio-status">Inactive</span>
</div>
</div>
</div>
<div class="cm-section" id="cm-overlay-section" style="display:block;">
<div class="cm-section-title" data-i18n="overlayEffects">Overlay Effects</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="banOverlay">Ban Overlay</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-ban-overlay-toggle">
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="loadingOverlay">Loading Overlay</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-loading-overlay-toggle">
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="status">Active</span>
<span class="cm-value" id="cm-overlay-status">None</span>
</div>
</div>
</div>
</div>
<!-- SETTINGS PANEL -->
<div class="cm-panel" data-panel="settings">
<div class="cm-section">
<div class="cm-section-title" data-i18n="developer">Developer</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="consoleLogs">Console Logs</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-debug-toggle" checked>
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
</div>
</div>
<div class="cm-section">
<div class="cm-section-title" data-i18n="hotkeys">Hotkeys</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="openPanel">Open Panel</span>
<input type="text" class="cm-input" id="cm-menukey" value="h" style="width:50px;">
</div>
</div>
</div>
<div class="cm-section">
<div class="cm-section-title" data-i18n="streamProof">Stream Proof</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="panicKey">Panic Key</span>
<input type="text" class="cm-input" id="cm-panic-key" value="p" style="width:50px;">
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="mobileTripleTap">Mobile: Triple-tap button</span>
<span class="cm-value" style="font-size:8px;color:var(--cm-text-muted);">to hide/show</span>
</div>
<div class="cm-row">
<span class="cm-label" data-i18n="showControlBar">Show Control Bar</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-show-cb-toggle" ${CONFIG.showControlBar ? 'checked' : ''}>
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-row">
<button class="cm-panic-btn" id="cm-panic-now" data-i18n="hideAllNow">Hide All Now</button>
</div>
<div class="cm-row" style="margin-top:6px;border-top:1px solid var(--cm-border);padding-top:6px;">
<span class="cm-label" data-i18n="iframeModeObs">Iframe Mode (OBS)</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-iframe-mode">
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-row">
<span class="cm-label" style="font-size:8px;color:var(--cm-text-muted);" data-i18n="hidesGui">Hides GUI from screen capture</span>
</div>
</div>
</div>
<div class="cm-section">
<div class="cm-section-title" data-i18n="branding">Branding</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="displayBadge">Display Badge</span>
<label class="cm-toggle">
<input type="checkbox" id="cm-wm-show" checked>
<div class="cm-toggle-track"></div>
<div class="cm-toggle-thumb"></div>
</label>
</div>
<div class="cm-slider-row">
<div class="cm-slider-header">
<span class="cm-slider-label" data-i18n="visibility">Visibility</span>
<span class="cm-slider-value" id="cm-wm-alpha-val">20%</span>
</div>
<div class="cm-slider-track">
<div class="cm-slider-fill" id="cm-wm-alpha-fill" style="width:20%"></div>
<input type="range" class="cm-slider" id="cm-wm-alpha" min="0" max="100" step="5" value="20">
</div>
</div>
</div>
</div>
<div class="cm-section">
<div class="cm-section-title" data-i18n="appearance">Appearance</div>
<div class="cm-card">
<div class="cm-theme-grid" id="cm-theme-grid"></div>
</div>
</div>
<div class="cm-section">
<div class="cm-section-title" data-i18n="customization">Customization</div>
<div class="cm-card">
<div class="cm-row">
<span class="cm-label" data-i18n="accentColor">Accent Color</span>
<input type="color" id="cm-accent-color" value="${CONFIG.accentColor || '#6366f1'}" style="width:50px;height:30px;">
</div>
<div class="cm-row" style="margin-top:6px;">
<span class="cm-label" data-i18n="language">Language</span>
<select id="cm-language-select" class="cm-select">
${Object.entries(LANGUAGES).map(([code, lang]) => `<option value="${code}" ${code === currentLang ? 'selected' : ''}>${lang.name}</option>`).join('')}
</select>
</div>
</div>
</div>
</div>
<!-- CREDITS PANEL -->
<div class="cm-panel" data-panel="credits">
<div class="cm-section">
<div class="cm-section-title" data-i18n="credits">Credits</div>
<div class="cm-card">
<div class="cm-row"><span class="cm-label" data-i18n="developers">Developers</span></div>
<div class="cm-row"><span class="cm-value">c6 / cosmic</span></div>
<div class="cm-row"><span class="cm-value">david</span></div>
<div class="cm-row"><span class="cm-value">a5f3</span></div>
<div class="cm-row"><span class="cm-value">zzemie</span></div>
<div class="cm-row"><span class="cm-value">4rx67</span></div>
</div>
</div>
</div>
</div>
`;
document.body.appendChild(root);
// Language selector
const langSelect = document.getElementById('cm-language-select');
if (langSelect) {
langSelect.addEventListener('change', (e) => {
CONFIG.language = e.target.value;
saveConfig();
currentLang = CONFIG.language;
applyLanguage(currentLang);
});
}
applyLanguage(currentLang);
// Color picker
const accentPicker = document.getElementById('cm-accent-color');
if (accentPicker) {
accentPicker.addEventListener('input', (e) => applyAccentColor(e.target.value));
}
// Create hidden file inputs
const videoFileInput = document.createElement('input');
videoFileInput.type = 'file';
videoFileInput.accept = 'video/mp4,video/webm,video/quicktime';
videoFileInput.style.display = 'none';
videoFileInput.id = 'cm-video-input';
document.body.appendChild(videoFileInput);
const imageFileInput = document.createElement('input');
imageFileInput.type = 'file';
imageFileInput.accept = 'image/jpeg,image/png,image/gif,image/webp';
imageFileInput.style.display = 'none';
imageFileInput.id = 'cm-image-input';
document.body.appendChild(imageFileInput);
const audioFileInput = document.createElement('input');
audioFileInput.type = 'file';
audioFileInput.accept = 'audio/mpeg,audio/wav,audio/ogg,audio/mp4';
audioFileInput.style.display = 'none';
audioFileInput.id = 'cm-audio-input';
document.body.appendChild(audioFileInput);
// Build theme grid
const themeGrid = document.getElementById('cm-theme-grid');
Object.entries(THEMES).forEach(([key, theme]) => {
const tbtn = document.createElement('button');
tbtn.className = 'cm-theme-btn' + (key === (CONFIG.theme || 'midnight') ? ' active' : '');
tbtn.dataset.theme = key;
tbtn.innerHTML = `<div class="cm-theme-preview" style="background: linear-gradient(135deg, ${theme.primary}, ${theme.secondary})"></div><div class="cm-theme-name">${theme.name}</div>`;
tbtn.addEventListener('click', function() {
themeGrid.querySelectorAll('.cm-theme-btn').forEach(b => b.classList.remove('active'));
this.classList.add('active');
applyTheme(key);
applyAccentColor(CONFIG.accentColor);
});
themeGrid.appendChild(tbtn);
});
// ========== HANDLERS FOR +/- BUTTONS (Number Controls) ==========
function setupNumberControls() {
document.querySelectorAll('.cm-number-btn[data-dec]').forEach(btn => {
btn.addEventListener('click', () => {
const inputId = btn.getAttribute('data-dec');
const input = document.getElementById(inputId);
if (input) {
let val = parseFloat(input.value);
if (isNaN(val)) val = input.min ? parseFloat(input.min) : 1;
let step = parseFloat(input.step) || 0.1;
val = Math.max(parseFloat(input.min) || 1, val - step);
input.value = val.toFixed(step < 1 ? 1 : 0);
input.dispatchEvent(new Event('input', { bubbles: true }));
}
});
});
document.querySelectorAll('.cm-number-btn[data-inc]').forEach(btn => {
btn.addEventListener('click', () => {
const inputId = btn.getAttribute('data-inc');
const input = document.getElementById(inputId);
if (input) {
let val = parseFloat(input.value);
if (isNaN(val)) val = input.min ? parseFloat(input.min) : 1;
let step = parseFloat(input.step) || 0.1;
val = Math.min(parseFloat(input.max) || 10, val + step);
input.value = val.toFixed(step < 1 ? 1 : 0);
input.dispatchEvent(new Event('input', { bubbles: true }));
}
});
});
}
setupNumberControls();
// Toggle menu
let _btnDragged = false;
function _toggleMenu() {
if (_btnDragged) { _btnDragged = false; return; }
root.classList.toggle('visible');
}
btn.addEventListener('click', _toggleMenu);
// Toggle button drag
let _btnDragging = false, _btnDragOffX = 0, _btnDragOffY = 0, _btnStartX = 0, _btnStartY = 0;
btn.addEventListener('mousedown', function(e) {
_btnDragging = true; _btnDragged = false;
_btnStartX = e.clientX; _btnStartY = e.clientY;
const rect = btn.getBoundingClientRect();
_btnDragOffX = e.clientX - rect.left; _btnDragOffY = e.clientY - rect.top;
btn.classList.add('dragging'); e.preventDefault();
});
document.addEventListener('mousemove', function(e) {
if (!_btnDragging) return;
if (Math.abs(e.clientX - _btnStartX) > 5 || Math.abs(e.clientY - _btnStartY) > 5) _btnDragged = true;
btn.style.left = (e.clientX - _btnDragOffX) + 'px';
btn.style.top = (e.clientY - _btnDragOffY) + 'px';
btn.style.right = 'auto';
});
document.addEventListener('mouseup', function() {
if (_btnDragging) { _btnDragging = false; btn.classList.remove('dragging'); }
});
btn.addEventListener('touchstart', function(e) {
const touch = e.touches[0];
_btnDragging = true; _btnDragged = false;
_btnStartX = touch.clientX; _btnStartY = touch.clientY;
const rect = btn.getBoundingClientRect();
_btnDragOffX = touch.clientX - rect.left; _btnDragOffY = touch.clientY - rect.top;
btn.classList.add('dragging');
}, { passive: true });
document.addEventListener('touchmove', function(e) {
if (!_btnDragging) return;
const touch = e.touches[0];
if (Math.abs(touch.clientX - _btnStartX) > 5 || Math.abs(touch.clientY - _btnStartY) > 5) _btnDragged = true;
btn.style.left = (touch.clientX - _btnDragOffX) + 'px';
btn.style.top = (touch.clientY - _btnDragOffY) + 'px';
btn.style.right = 'auto';
}, { passive: true });
document.addEventListener('touchend', function() {
if (_btnDragging) { _btnDragging = false; btn.classList.remove('dragging'); }
});
let _menuKey = 'KeyH';
let _panicKey = 'KeyP';
let _streamHidden = false;
function toggleStreamProof() {
_streamHidden = !_streamHidden;
root.classList.toggle('stream-hidden', _streamHidden);
btn.classList.toggle('stream-hidden', _streamHidden);
controlBar.classList.toggle('stream-hidden', _streamHidden);
log('[STREAM PROOF] ' + (_streamHidden ? 'Hidden' : 'Visible'));
}
document.addEventListener('keydown', function(e) {
if (e.code === _menuKey && !e.target.matches('input[type="text"], input[type="search"], textarea')) {
_toggleMenu();
}
if (e.code === _panicKey && !e.target.matches('input[type="text"], input[type="search"], textarea')) {
toggleStreamProof();
}
});
// ===== Quick control bar (top-center) wiring =====
const _cbMap = {
master: 'cm-enable-toggle',
camera: 'cm-camspoof-toggle',
audio: 'cm-audiospoof-toggle'
};
function _cbItem(name) { return controlBar.querySelector('.cm-cb-item[data-cb="' + name + '"]'); }
function _cbSyncState() {
Object.keys(_cbMap).forEach(function(name) {
const cbx = document.getElementById(_cbMap[name]);
const item = _cbItem(name);
if (cbx && item) item.classList.toggle('cm-on', cbx.checked);
});
}
function _cbFlash(name) {
const item = _cbItem(name);
if (!item) return;
item.classList.remove('cm-flash');
void item.offsetWidth;
item.classList.add('cm-flash');
}
function _cbToggle(name) {
const cbx = document.getElementById(_cbMap[name]);
if (!cbx) return;
cbx.checked = !cbx.checked;
cbx.dispatchEvent(new Event('change', { bubbles: true }));
_cbSyncState();
_cbFlash(name);
}
controlBar.querySelectorAll('.cm-cb-item').forEach(function(item) {
item.addEventListener('click', function() { _cbToggle(item.getAttribute('data-cb')); });
});
// Keep bar in sync when toggled from inside the menu
Object.keys(_cbMap).forEach(function(name) {
const cbx = document.getElementById(_cbMap[name]);
if (cbx) cbx.addEventListener('change', _cbSyncState);
});
_cbSyncState();
// Keyboard shortcuts: M = master, C = camera spoof, A = audio spoof
document.addEventListener('keydown', function(e) {
if (e.ctrlKey || e.metaKey || e.altKey) return;
if (e.target.matches('input, textarea, select, [contenteditable="true"]')) return;
const k = e.key.toLowerCase();
if (k === 'm') { _cbToggle('master'); }
else if (k === 'c') { _cbToggle('camera'); }
else if (k === 'a') { _cbToggle('audio'); }
});
// ===== Control bar drag =====
let _cbDragging = false, _cbOffX = 0, _cbOffY = 0;
function _cbStartDrag(clientX, clientY, target) {
if (target.closest('.cm-cb-item')) return false;
_cbDragging = true;
controlBar.classList.add('cm-cb-dragging');
const rect = controlBar.getBoundingClientRect();
// switch from translateX centering to absolute left positioning
controlBar.style.left = rect.left + 'px';
controlBar.style.top = rect.top + 'px';
controlBar.style.transform = 'none';
_cbOffX = clientX - rect.left;
_cbOffY = clientY - rect.top;
return true;
}
function _cbMoveDrag(clientX, clientY) {
if (!_cbDragging) return;
controlBar.style.left = (clientX - _cbOffX) + 'px';
controlBar.style.top = (clientY - _cbOffY) + 'px';
}
function _cbEndDrag() {
if (_cbDragging) { _cbDragging = false; controlBar.classList.remove('cm-cb-dragging'); }
}
controlBar.addEventListener('mousedown', function(e) {
if (_cbStartDrag(e.clientX, e.clientY, e.target)) e.preventDefault();
});
document.addEventListener('mousemove', function(e) { _cbMoveDrag(e.clientX, e.clientY); });
document.addEventListener('mouseup', _cbEndDrag);
controlBar.addEventListener('touchstart', function(e) {
const t = e.touches[0];
_cbStartDrag(t.clientX, t.clientY, e.target);
}, { passive: true });
document.addEventListener('touchmove', function(e) {
if (!_cbDragging) return;
const t = e.touches[0];
_cbMoveDrag(t.clientX, t.clientY);
}, { passive: true });
document.addEventListener('touchend', _cbEndDrag);
// Menu drag
let _menuDragging = false, _menuDragOffX = 0, _menuDragOffY = 0;
const _menuHeader = root.querySelector('.cm-header');
_menuHeader.addEventListener('mousedown', function(e) {
if (e.target.matches('input, button, label, .cm-tab, a')) return;
_menuDragging = true; root.classList.add('dragging');
const rect = root.getBoundingClientRect();
_menuDragOffX = e.clientX - rect.left; _menuDragOffY = e.clientY - rect.top;
e.preventDefault();
});
document.addEventListener('mousemove', function(e) {
if (!_menuDragging) return;
root.style.left = (e.clientX - _menuDragOffX) + 'px';
root.style.top = (e.clientY - _menuDragOffY) + 'px';
root.style.right = 'auto';
});
document.addEventListener('mouseup', function() {
if (_menuDragging) { _menuDragging = false; root.classList.remove('dragging'); }
});
_menuHeader.addEventListener('touchstart', function(e) {
if (e.target.matches('input, button, label, .cm-tab, a')) return;
const touch = e.touches[0];
_menuDragging = true; root.classList.add('dragging');
const rect = root.getBoundingClientRect();
_menuDragOffX = touch.clientX - rect.left; _menuDragOffY = touch.clientY - rect.top;
}, { passive: true });
document.addEventListener('touchmove', function(e) {
if (!_menuDragging) return;
const touch = e.touches[0];
root.style.left = (touch.clientX - _menuDragOffX) + 'px';
root.style.top = (touch.clientY - _menuDragOffY) + 'px';
root.style.right = 'auto';
}, { passive: true });
document.addEventListener('touchend', function() {
if (_menuDragging) { _menuDragging = false; root.classList.remove('dragging'); }
});
// Tab switching
root.querySelectorAll('.cm-tab').forEach(tab => {
tab.addEventListener('click', function() {
root.querySelectorAll('.cm-tab').forEach(t => t.classList.remove('active'));
root.querySelectorAll('.cm-panel').forEach(p => p.classList.remove('active'));
this.classList.add('active');
root.querySelector(`[data-panel="${this.dataset.tab}"]`).classList.add('active');
});
});
function updateSliderFill(slider, fill, min, max) {
const pct = ((slider.value - min) / (max - min)) * 100;
fill.style.width = pct + '%';
}
// Enable toggle
document.getElementById('cm-enable-toggle').addEventListener('change', function() {
CONFIG.enabled = this.checked;
document.getElementById('cm-enabled-val').textContent = this.checked ? LANGUAGES[currentLang].active : LANGUAGES[currentLang].inactive;
document.getElementById('cm-enabled-val').style.color = this.checked ? 'var(--cm-success)' : 'var(--cm-danger)';
document.getElementById('cm-status-pill').textContent = this.checked ? LANGUAGES[currentLang].active : LANGUAGES[currentLang].inactive;
document.getElementById('cm-status-pill').classList.toggle('active', this.checked);
});
document.getElementById('cm-score-enabled').addEventListener('change', function() {
CONFIG.scoreEnabled = this.checked;
document.getElementById('cm-score-content').classList.toggle('cm-section-disabled', !this.checked);
saveConfig();
});
document.getElementById('cm-result-enabled').addEventListener('change', function() {
CONFIG.resultEnabled = this.checked;
document.getElementById('cm-result-content').classList.toggle('cm-section-disabled', !this.checked);
saveConfig();
});
// Auto Queue
let _autoQueueInterval = null;
let _connectingStart = null;
function _clearCookies() {
const saved = localStorage.getItem('cheatmoggle _config');
document.cookie.split(';').forEach(c => {
const name = c.split('=')[0].trim();
document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
});
localStorage.clear();
if (saved) localStorage.setItem('cheatmoggle _config', saved);
}
document.getElementById('cm-clearcookies-btn').addEventListener('click', function() {
_clearCookies();
this.textContent = 'Cleared! Reloading...';
setTimeout(() => location.reload(), 500);
});
function _queueTick() {
try {
const _txt = b => b.textContent.replace(/\s+/g, ' ').trim();
const _up = b => _txt(b).toUpperCase();
// Suspended check
if (document.body.textContent.includes('Ranked Arena is temporarily suspended for this account')) {
if (document.getElementById('cm-autounban-toggle')?.checked) {
_clearCookies();
setTimeout(() => location.reload(), 300);
}
document.getElementById('cm-autoqueuetoggle').checked = false;
clearInterval(_autoQueueInterval);
_autoQueueInterval = null;
_connectingStart = null;
return;
}
// Connecting timeout check
const btns = Array.from(document.querySelectorAll('button, [role="button"], [onclick]'));
const connecting = btns.find(b => /connecting/i.test(_txt(b))) || document.querySelector('[class*="connecting"], [class*="loading"]');
if (connecting) {
if (_connectingStart === null) _connectingStart = Date.now();
else if (Date.now() - _connectingStart > 17000) {
const backBtn = btns.find(b => /leave|cancel|disconnect|return/i.test(_txt(b)));
if (backBtn) backBtn.click();
_connectingStart = null;
}
return;
} else {
_connectingStart = null;
}
// ARENA — find button by aria-label
const arenaEl = document.querySelector('button[aria-label="Find an Arena match"]');
if (arenaEl) {
log(`[AUTOQ] clicking ARENA button`);
arenaEl.click();
return;
}
// Find new match button (after match ends)
if (document.getElementById('cm-autofindnew-toggle')?.checked) {
const findNewBtn = btns.find(b => {
const t = _up(b);
return t.includes('FIND NEW') && t.includes('MATCH');
});
if (findNewBtn) {
log(`[AUTOQ] clicking find new match: "${_txt(findNewBtn).substring(0, 60)}"`);
findNewBtn.click();
return;
}
}
} catch(e) {
log('[AUTOQ] tick error:', e);
}
}
function _startAutoQueue() {
_connectingStart = null;
if (_autoQueueInterval) clearInterval(_autoQueueInterval);
const delay = Math.max(100, parseInt(CONFIG.queueDelay) || 1000);
_autoQueueInterval = setInterval(_queueTick, delay);
}
document.getElementById('cm-autoqueuetoggle').addEventListener('change', function() {
CONFIG.autoQueue = this.checked;
saveConfig();
if (this.checked) {
_startAutoQueue();
} else {
if (_autoQueueInterval) {
clearInterval(_autoQueueInterval);
_autoQueueInterval = null;
}
_connectingStart = null;
}
});
// Request delay (ms)
const queueDelayInput = document.getElementById('cm-queue-delay');
queueDelayInput.value = CONFIG.queueDelay;
queueDelayInput.addEventListener('input', function() {
let v = parseInt(this.value);
if (isNaN(v)) v = 1000;
v = Math.max(100, Math.min(60000, v));
CONFIG.queueDelay = v;
saveConfig();
if (_autoQueueInterval) _startAutoQueue();
});
// ===== Auto cycle spoofing =====
let _autoCamInterval = null, _autoAudioInterval = null;
function _toggleCheckbox(id) {
const cbx = document.getElementById(id);
if (!cbx) return;
cbx.checked = !cbx.checked;
cbx.dispatchEvent(new Event('change', { bubbles: true }));
}
const autoCamIntervalInput = document.getElementById('cm-autocam-interval');
autoCamIntervalInput.value = CONFIG.autoCamInterval;
const autoAudioIntervalInput = document.getElementById('cm-autoaudio-interval');
autoAudioIntervalInput.value = CONFIG.autoAudioInterval;
function _startAutoCam() {
if (_autoCamInterval) clearInterval(_autoCamInterval);
const secs = Math.max(1, parseInt(CONFIG.autoCamInterval) || 5);
_autoCamInterval = setInterval(() => _toggleCheckbox('cm-camspoof-toggle'), secs * 1000);
}
function _startAutoAudio() {
if (_autoAudioInterval) clearInterval(_autoAudioInterval);
const secs = Math.max(1, parseInt(CONFIG.autoAudioInterval) || 5);
_autoAudioInterval = setInterval(() => _toggleCheckbox('cm-audiospoof-toggle'), secs * 1000);
}
document.getElementById('cm-autocam-toggle').addEventListener('change', function() {
if (this.checked) _startAutoCam();
else if (_autoCamInterval) { clearInterval(_autoCamInterval); _autoCamInterval = null; }
});
document.getElementById('cm-autoaudio-toggle').addEventListener('change', function() {
if (this.checked) _startAutoAudio();
else if (_autoAudioInterval) { clearInterval(_autoAudioInterval); _autoAudioInterval = null; }
});
autoCamIntervalInput.addEventListener('input', function() {
let v = parseInt(this.value); if (isNaN(v)) v = 5;
v = Math.max(1, Math.min(600, v));
CONFIG.autoCamInterval = v; saveConfig();
if (_autoCamInterval) _startAutoCam();
});
autoAudioIntervalInput.addEventListener('input', function() {
let v = parseInt(this.value); if (isNaN(v)) v = 5;
v = Math.max(1, Math.min(600, v));
CONFIG.autoAudioInterval = v; saveConfig();
if (_autoAudioInterval) _startAutoAudio();
});
// ===== Auto dismiss popups =====
let _autoDismissInterval = null;
document.getElementById('cm-autodismiss-toggle').addEventListener('change', function() {
if (this.checked) {
_autoDismissInterval = setInterval(() => {
const btn = Array.from(document.querySelectorAll('button')).find(b => {
const t = b.textContent.trim();
return t === 'OK' || t === 'Okay' || t === 'Got it' || t === 'Continue' || t === 'Close' || t === 'Dismiss';
});
if (btn) btn.click();
}, 1500);
} else if (_autoDismissInterval) {
clearInterval(_autoDismissInterval); _autoDismissInterval = null;
}
});
function setScoreModeUI(mode) {
CONFIG.scoreMode = mode;
document.querySelectorAll('[data-smode]').forEach(b => b.classList.toggle('active', b.dataset.smode === mode));
document.getElementById('cm-score-fixed').style.display = mode === 'fixed' ? 'block' : 'none';
document.getElementById('cm-score-range').style.display = mode === 'range' ? 'block' : 'none';
_dynamicCap = null;
saveConfig();
}
document.querySelectorAll('[data-smode]').forEach(b => {
b.addEventListener('click', function() { setScoreModeUI(this.dataset.smode); });
});
const fixedScoreInput = document.getElementById('cm-fixed-score');
fixedScoreInput.addEventListener('input', function() {
let val = parseFloat(this.value);
if (isNaN(val)) val = 1;
val = Math.max(1, Math.min(10, val));
CONFIG.fixedScore = Math.round(val * 10000);
saveConfig();
});
const scoreMinInput = document.getElementById('cm-score-min');
scoreMinInput.addEventListener('input', function() {
let val = parseFloat(this.value);
if (isNaN(val)) val = 1;
val = Math.max(1, Math.min(10, val));
CONFIG.scoreRangeMin = Math.round(val * 10000);
_dynamicCap = null; saveConfig();
});
const scoreMaxInput = document.getElementById('cm-score-max');
scoreMaxInput.addEventListener('input', function() {
let val = parseFloat(this.value);
if (isNaN(val)) val = 1;
val = Math.max(1, Math.min(10, val));
CONFIG.scoreRangeMax = Math.round(val * 10000);
_dynamicCap = null; saveConfig();
});
const finalInput = document.getElementById('cm-final-score');
finalInput.addEventListener('input', function() {
let val = parseFloat(this.value);
if (isNaN(val)) val = 1;
val = Math.max(1, Math.min(10, val));
CONFIG.myFinalScore = String(Math.round(val * 10000));
updateScorePreview(); saveConfig();
});
function setFinalModeUI(mode) {
CONFIG.finalScoreMode = mode;
document.querySelectorAll('[data-fmode]').forEach(b => b.classList.toggle('active', b.dataset.fmode === mode));
document.getElementById('cm-final-fixed').style.display = mode === 'fixed' ? 'block' : 'none';
document.getElementById('cm-final-range').style.display = mode === 'range' ? 'block' : 'none';
updateScorePreview(); saveConfig();
}
document.querySelectorAll('[data-fmode]').forEach(b => {
b.addEventListener('click', function() { setFinalModeUI(this.dataset.fmode); });
});
const finalMinInput = document.getElementById('cm-final-range-min');
finalMinInput.addEventListener('input', function() {
let val = parseFloat(this.value);
if (isNaN(val)) val = 1;
val = Math.max(1, Math.min(10, val));
CONFIG.finalScoreRangeMin = Math.round(val * 10000);
updateScorePreview(); saveConfig();
});
const finalMaxInput = document.getElementById('cm-final-range-max');
finalMaxInput.addEventListener('input', function() {
let val = parseFloat(this.value);
if (isNaN(val)) val = 1;
val = Math.max(1, Math.min(10, val));
CONFIG.finalScoreRangeMax = Math.round(val * 10000);
updateScorePreview(); saveConfig();
});
function updateScorePreview() {
let score;
if (CONFIG.finalScoreMode === 'range') {
score = Math.round(CONFIG.finalScoreRangeMin + Math.random() * (CONFIG.finalScoreRangeMax - CONFIG.finalScoreRangeMin)) / 10000;
} else {
score = parseInt(CONFIG.myFinalScore) / 10000;
}
const tier = getTierForScore(score);
const numEl = document.getElementById('cm-score-preview-num');
const tierEl = document.getElementById('cm-score-preview-tier');
numEl.textContent = score.toFixed(1);
numEl.style.color = tier.hexColor;
numEl.style.textShadow = tier.textShadow;
tierEl.textContent = `${tier.emoji} ${tier.name}`;
tierEl.style.color = tier.hexColor;
}
updateScorePreview();
setInterval(() => { if (CONFIG.finalScoreMode === 'range') updateScorePreview(); }, 2000);
function restoreUIFromConfig() {
document.getElementById('cm-score-enabled').checked = CONFIG.scoreEnabled;
document.getElementById('cm-score-content').classList.toggle('cm-section-disabled', !CONFIG.scoreEnabled);
document.getElementById('cm-result-enabled').checked = CONFIG.resultEnabled;
document.getElementById('cm-result-content').classList.toggle('cm-section-disabled', !CONFIG.resultEnabled);
setScoreModeUI(CONFIG.scoreMode);
document.getElementById('cm-fixed-score').value = (CONFIG.fixedScore / 10000).toFixed(1);
document.getElementById('cm-score-min').value = (CONFIG.scoreRangeMin / 10000).toFixed(1);
document.getElementById('cm-score-max').value = (CONFIG.scoreRangeMax / 10000).toFixed(1);
setFinalModeUI(CONFIG.finalScoreMode);
document.getElementById('cm-final-score').value = (parseInt(CONFIG.myFinalScore) / 10000).toFixed(1);
document.getElementById('cm-final-range-min').value = (CONFIG.finalScoreRangeMin / 10000).toFixed(1);
document.getElementById('cm-final-range-max').value = (CONFIG.finalScoreRangeMax / 10000).toFixed(1);
const cbToggle = document.getElementById('cm-show-cb-toggle');
if (cbToggle) {
cbToggle.checked = CONFIG.showControlBar !== false;
controlBar.classList.toggle('cm-cb-hidden', !CONFIG.showControlBar);
}
const aqToggle = document.getElementById('cm-autoqueuetoggle');
if (aqToggle) {
aqToggle.checked = CONFIG.autoQueue === true;
if (aqToggle.checked) _startAutoQueue();
}
if (CONFIG.theme && THEMES[CONFIG.theme]) applyTheme(CONFIG.theme);
if (CONFIG.accentColor) applyAccentColor(CONFIG.accentColor);
}
restoreUIFromConfig();
// Menu keybind
const menuKeyInput = document.getElementById('cm-menukey');
let _menuKeyListening = false;
menuKeyInput.addEventListener('focus', function() {
_menuKeyListening = true; this.value = 'press';
this.style.borderColor = 'var(--cm-primary)';
});
menuKeyInput.addEventListener('keydown', function(e) {
if (!_menuKeyListening) return;
e.preventDefault();
_menuKey = e.code;
this.value = e.key === ' ' ? 'Space' : e.key;
this.style.borderColor = 'var(--cm-success)';
_menuKeyListening = false; this.blur();
});
// Panic keybind
const panicKeyInput = document.getElementById('cm-panic-key');
let _panicKeyListening = false;
panicKeyInput.addEventListener('focus', function() {
_panicKeyListening = true; this.value = 'press';
this.style.borderColor = 'var(--cm-primary)';
});
panicKeyInput.addEventListener('keydown', function(e) {
if (!_panicKeyListening) return;
e.preventDefault();
_panicKey = e.code;
this.value = e.key === ' ' ? 'Space' : e.key;
this.style.borderColor = 'var(--cm-success)';
_panicKeyListening = false; this.blur();
});
document.getElementById('cm-panic-now').addEventListener('click', toggleStreamProof);
document.getElementById('cm-show-cb-toggle').addEventListener('change', function() {
CONFIG.showControlBar = this.checked;
controlBar.classList.toggle('cm-cb-hidden', !this.checked);
saveConfig();
});
// Mobile triple-tap
let _tripleTapCount = 0, _tripleTapTimer = null;
btn.addEventListener('touchend', function(e) {
if (_btnDragged) return;
_tripleTapCount++;
if (_tripleTapCount === 1) {
_tripleTapTimer = setTimeout(() => { _tripleTapCount = 0; }, 500);
}
if (_tripleTapCount === 3) {
clearTimeout(_tripleTapTimer); _tripleTapCount = 0;
toggleStreamProof(); e.preventDefault();
}
});
// Iframe mode
let _iframeMode = false, _iframeWrapper = null;
function enableIframeMode() {
if (_iframeWrapper) return;
_iframeWrapper = document.createElement('div');
_iframeWrapper.id = 'cm-iframe-wrapper';
_iframeWrapper.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:999996;';
const iframe = document.createElement('iframe');
iframe.id = 'cm-stream-iframe';
iframe.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;border:none;background:transparent;pointer-events:none;';
iframe.setAttribute('allowtransparency', 'true');
_iframeWrapper.appendChild(iframe);
document.body.appendChild(_iframeWrapper);
setTimeout(() => {
try {
const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
iframeDoc.open();
iframeDoc.write('<!DOCTYPE html><html><head><style>body{margin:0;background:transparent;overflow:hidden;}</style></head><body></body></html>');
iframeDoc.close();
const styles = document.createElement('style');
styles.textContent = Array.from(document.styleSheets).map(sheet => {
try { return Array.from(sheet.cssRules).map(r => r.cssText).join('\n'); } catch(e) { return ''; }
}).join('\n');
iframeDoc.head.appendChild(styles);
btn.style.pointerEvents = 'auto';
root.style.pointerEvents = 'auto';
iframeDoc.body.appendChild(btn);
iframeDoc.body.appendChild(root);
iframe.style.pointerEvents = 'auto';
iframeDoc.addEventListener('keydown', function(e) {
if (e.code === _menuKey) _toggleMenu();
if (e.code === _panicKey) toggleStreamProof();
});
log('[IFRAME MODE] Enabled');
} catch(err) {
log('[IFRAME MODE] Error:', err);
disableIframeMode();
}
}, 100);
}
function disableIframeMode() {
if (!_iframeWrapper) return;
try {
const iframe = document.getElementById('cm-stream-iframe');
if (iframe) {
const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
if (iframeDoc.body.contains(btn)) document.body.appendChild(btn);
if (iframeDoc.body.contains(root)) document.body.appendChild(root);
}
} catch(e) {}
btn.style.position = ''; btn.style.top = ''; btn.style.left = ''; btn.style.right = '';
root.style.position = ''; root.style.top = ''; root.style.left = ''; root.style.right = '';
_iframeWrapper.remove(); _iframeWrapper = null;
log('[IFRAME MODE] Disabled');
}
document.getElementById('cm-iframe-mode').addEventListener('change', function() {
_iframeMode = this.checked;
if (_iframeMode) enableIframeMode(); else disableIframeMode();
});
document.getElementById('cm-debug-toggle').addEventListener('change', function() {
CONFIG.debug = this.checked;
});
// Watermark
const _wm = document.createElement('div');
_wm.id = 'cm-watermark';
_wm.textContent = 'by cheatmoggle v13.6.2';
document.body.appendChild(_wm);
// Disclaimer popup
const _disclaimer = document.createElement('div');
_disclaimer.id = 'cm-disclaimer';
_disclaimer.innerHTML = `
<span>⚠️ This script only works for ranked mode</span>
<button id="cm-disclaimer-close">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
`;
document.body.appendChild(_disclaimer);
document.getElementById('cm-disclaimer-close').addEventListener('click', function() {
_disclaimer.classList.add('hiding');
setTimeout(() => _disclaimer.remove(), 300);
});
function applyWmStyle() { _wm.style.opacity = CONFIG.wmAlpha / 100; }
applyWmStyle();
document.getElementById('cm-wm-show').addEventListener('change', function() {
_wm.style.display = this.checked ? 'block' : 'none';
});
const wmAlphaSlider = document.getElementById('cm-wm-alpha');
const wmAlphaFill = document.getElementById('cm-wm-alpha-fill');
wmAlphaSlider.addEventListener('input', function() {
CONFIG.wmAlpha = parseInt(this.value);
document.getElementById('cm-wm-alpha-val').textContent = this.value + '%';
updateSliderFill(this, wmAlphaFill, 0, 100);
applyWmStyle();
});
// Watermark drag
let _wmDragging = false, _wmDragOffX = 0, _wmDragOffY = 0;
_wm.addEventListener('mousedown', function(e) {
_wmDragging = true;
_wmDragOffX = e.clientX - _wm.getBoundingClientRect().left;
_wmDragOffY = e.clientY - _wm.getBoundingClientRect().top;
_wm.style.cursor = 'grabbing'; e.preventDefault();
});
document.addEventListener('mousemove', function(e) {
if (!_wmDragging) return;
_wm.style.left = (e.clientX - _wmDragOffX) + 'px';
_wm.style.top = (e.clientY - _wmDragOffY) + 'px';
_wm.style.bottom = 'auto'; _wm.style.right = 'auto';
});
document.addEventListener('mouseup', function() {
if (_wmDragging) { _wmDragging = false; _wm.style.cursor = 'grab'; }
});
// Live status updater
setInterval(() => {
try {
const _modePill = document.getElementById('cm-mode-pill');
const _modeVal = document.getElementById('cm-mode-val');
if (_modePill) _modePill.textContent = _isRanked ? 'RANKED' : 'NORMAL';
if (_modeVal) _modeVal.textContent = _isRanked ? 'RANKED' : 'NORMAL';
if (_lastSpoofedScore !== null) {
const tier = getTierForScore(_lastSpoofedScore);
const liveScore = document.getElementById('cm-live-score');
const liveTier = document.getElementById('cm-live-tier');
if (liveScore) {
liveScore.textContent = _lastSpoofedScore.toFixed(2);
liveScore.style.color = tier.hexColor;
liveScore.style.textShadow = tier.textShadow;
}
if (liveTier) {
liveTier.textContent = `${tier.emoji} ${tier.name}`;
liveTier.style.color = tier.hexColor;
}
}
} catch(e) {}
}, 200);
// ==================== CAMERA SPOOF LOGIC ====================
let _camSrcType = 'video';
let _camVideoFile = null;
let _camImageFile = null;
let _camMirror = false;
let _camLoop = true;
let _camSpeed = 1.0;
let _camVideoEl = null;
let _camCanvasEl = null;
let _origAddTrack = null;
let _camSrcObjPatch = null;
let _camDrawRAF = null;
let _camImageEl = null;
let _camVideoUrl = null;
let _camImageUrl = null;
// Camera text overlay settings
let _camTextEnabled = false;
let _camTextContent = 'Your Text Here';
let _camTextColor = '#ffffff';
let _camTextSize = 24;
window._mogPCs = window._mogPCs || [];
const _OrigPC2 = window.RTCPeerConnection;
window.RTCPeerConnection = function(...args) {
const pc = new _OrigPC2(...args);
window._mogPCs.push(pc);
pc.addEventListener('connectionstatechange', () => {
if (pc.connectionState === 'closed') {
const idx = window._mogPCs.indexOf(pc);
if (idx > -1) window._mogPCs.splice(idx, 1);
}
});
return pc;
};
Object.setPrototypeOf(window.RTCPeerConnection, _OrigPC2);
window.RTCPeerConnection.prototype = _OrigPC2.prototype;
// File history storage - disabled (removed URL and history)
// No history arrays, no addToHistory, no updateHistorySelect
// Source selection
document.querySelectorAll('[data-src]').forEach(b => {
b.addEventListener('click', function() {
_camSrcType = this.dataset.src;
document.querySelectorAll('[data-src]').forEach(x => x.classList.toggle('active', x.dataset.src === _camSrcType));
const videoPicker = document.getElementById('cm-video-picker');
const imagePicker = document.getElementById('cm-image-picker');
if (videoPicker) videoPicker.style.display = _camSrcType === 'video' ? 'flex' : 'none';
if (imagePicker) imagePicker.style.display = _camSrcType === 'image' ? 'flex' : 'none';
if (_camSpoofActive) {
stopCamSpoof();
startCamSpoof();
}
});
});
// File picker handlers
videoFileInput.addEventListener('change', function(e) {
if (this.files.length) {
_camVideoFile = this.files[0];
_camVideoUrl = null;
document.getElementById('cm-video-name').textContent = this.files[0].name;
document.getElementById('cm-video-name').classList.add('selected');
if (_camSpoofActive) {
stopCamSpoof();
startCamSpoof();
}
}
});
imageFileInput.addEventListener('change', function(e) {
if (this.files.length) {
_camImageFile = this.files[0];
_camImageUrl = null;
document.getElementById('cm-image-name').textContent = this.files[0].name;
document.getElementById('cm-image-name').classList.add('selected');
if (_camSpoofActive) {
stopCamSpoof();
startCamSpoof();
}
}
});
audioFileInput.addEventListener('change', function(e) {
if (this.files.length) {
_audioFile = this.files[0];
_audioUrl = null;
document.getElementById('cm-audio-name').textContent = this.files[0].name;
document.getElementById('cm-audio-name').classList.add('selected');
if (_audioSpoofActive) {
stopAudioSpoof();
startAudioSpoof();
}
}
});
document.getElementById('cm-video-picker').addEventListener('click', () => videoFileInput.click());
document.getElementById('cm-image-picker').addEventListener('click', () => imageFileInput.click());
document.getElementById('cm-audio-picker').addEventListener('click', () => audioFileInput.click());
document.getElementById('cm-camloop-toggle').addEventListener('change', function() {
_camLoop = this.checked;
if (_camVideoEl) _camVideoEl.loop = _camLoop;
});
const camSpeedSlider = document.getElementById('cm-camspeed');
const camSpeedFill = document.getElementById('cm-camspeed-fill');
camSpeedSlider.addEventListener('input', function() {
_camSpeed = parseFloat(this.value);
document.getElementById('cm-camspeed-val').textContent = _camSpeed.toFixed(2) + 'x';
updateSliderFill(this, camSpeedFill, 0.25, 3.0);
if (_camVideoEl) _camVideoEl.playbackRate = _camSpeed;
});
document.getElementById('cm-cammirror-toggle').addEventListener('change', function() { _camMirror = this.checked; });
// Camera text overlay handlers
document.getElementById('cm-camtext-toggle').addEventListener('change', function() {
_camTextEnabled = this.checked;
if (_camTextEnabled && !_camSpoofActive) {
startRealCamWithText();
} else if (!_camTextEnabled && !_camSpoofActive) {
stopRealCamText();
}
});
document.getElementById('cm-camtext-content').addEventListener('input', function() {
_camTextContent = this.value;
});
document.getElementById('cm-camtext-color').addEventListener('input', function() {
_camTextColor = this.value;
});
const camTextSizeSlider = document.getElementById('cm-camtext-size');
const camTextSizeFill = document.getElementById('cm-camtext-size-fill');
camTextSizeSlider.addEventListener('input', function() {
_camTextSize = parseInt(this.value);
document.getElementById('cm-camtext-size-val').textContent = _camTextSize + 'px';
updateSliderFill(this, camTextSizeFill, 12, 72);
});
// Real cam + text overlay (no spoof needed)
let _realCamStream = null;
let _realCamCanvas = null;
let _realCamVideoEl = null;
let _realCamRAF = null;
function startRealCamWithText() {
if (_realCamRAF) stopRealCamText();
_trueOriginalGetUserMedia({ video: true }).then(stream => {
_realCamStream = stream;
_realCamVideoEl = document.createElement('video');
_realCamVideoEl.srcObject = stream;
_realCamVideoEl.muted = true;
_realCamVideoEl.playsInline = true;
_realCamVideoEl.play().catch(() => {});
_realCamCanvas = document.createElement('canvas');
_realCamCanvas.width = 640;
_realCamCanvas.height = 480;
const ctx = _realCamCanvas.getContext('2d');
function drawLoop() {
if (!_camTextEnabled || _camSpoofActive) { _realCamRAF = null; return; }
ctx.clearRect(0, 0, 640, 480);
if (_realCamVideoEl.readyState >= 2) {
ctx.drawImage(_realCamVideoEl, 0, 0, 640, 480);
}
if (_camTextContent) {
ctx.save();
ctx.font = 'bold ' + _camTextSize + 'px Arial, sans-serif';
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
ctx.fillStyle = 'rgba(0,0,0,0.6)';
ctx.fillText(_camTextContent, 322, 472);
ctx.fillStyle = _camTextColor;
ctx.shadowColor = 'rgba(0,0,0,0.9)';
ctx.shadowBlur = 8;
ctx.shadowOffsetX = 2;
ctx.shadowOffsetY = 2;
ctx.fillText(_camTextContent, 320, 470);
ctx.restore();
}
_realCamRAF = requestAnimationFrame(drawLoop);
}
drawLoop();
const canvasStream = _realCamCanvas.captureStream(30);
const fakeTrack = canvasStream.getVideoTracks()[0];
if (fakeTrack && window._mogPCs) {
for (const pc of window._mogPCs) {
try {
pc.getSenders().forEach(sender => {
if (sender.track?.kind === 'video') sender.replaceTrack(fakeTrack).catch(() => {});
});
} catch(e) {}
}
}
const scannerVid = document.querySelector('video.scanner-video');
if (scannerVid) scannerVid.srcObject = canvasStream;
log('[CAM TEXT] Real cam text overlay started');
}).catch(e => log('[CAM TEXT] Error getting real cam:', e));
}
function stopRealCamText() {
if (_realCamRAF) { cancelAnimationFrame(_realCamRAF); _realCamRAF = null; }
if (_realCamVideoEl) { _realCamVideoEl.srcObject = null; _realCamVideoEl = null; }
if (_realCamStream) { _realCamStream.getTracks().forEach(t => t.stop()); _realCamStream = null; }
_realCamCanvas = null;
_trueOriginalGetUserMedia({ video: true }).then(stream => {
const scannerVid = document.querySelector('video.scanner-video');
if (scannerVid) scannerVid.srcObject = stream;
if (window._mogPCs) {
for (const pc of window._mogPCs) {
try {
pc.getSenders().forEach(sender => {
if (sender.track?.kind === 'video') sender.replaceTrack(stream.getVideoTracks()[0]).catch(() => {});
});
} catch(e) {}
}
}
}).catch(() => {});
log('[CAM TEXT] Real cam text overlay stopped');
}
function buildFakeStream() {
if (_camDrawRAF) cancelAnimationFrame(_camDrawRAF);
if (_camVideoEl) { _camVideoEl.pause(); _camVideoEl.src = ''; }
_camCanvasEl = document.createElement('canvas');
_camCanvasEl.width = 640; _camCanvasEl.height = 480;
const ctx = _camCanvasEl.getContext('2d');
function drawLoop() {
if (!_camSpoofActive) { _camDrawRAF = null; return; }
ctx.fillStyle = '#000';
ctx.fillRect(0, 0, 640, 480);
ctx.save();
if (_camMirror) { ctx.translate(640, 0); ctx.scale(-1, 1); }
if (_camSrcType === 'video' && _camVideoEl && _camVideoEl.readyState >= 2) {
ctx.drawImage(_camVideoEl, 0, 0, 640, 480);
} else if (_camSrcType === 'image' && _camImageEl && _camImageEl.complete && _camImageEl.naturalWidth > 0) {
ctx.drawImage(_camImageEl, 0, 0, 640, 480);
}
ctx.restore();
ctx.shadowBlur = 0;
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 0;
if (_camTextEnabled && _camTextContent) {
ctx.save();
ctx.font = 'bold ' + _camTextSize + 'px Arial, sans-serif';
ctx.fillStyle = 'rgba(0,0,0,0.6)';
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
ctx.fillText(_camTextContent, 322, 472);
ctx.fillStyle = _camTextColor;
ctx.shadowColor = 'rgba(0,0,0,0.9)';
ctx.shadowBlur = 8;
ctx.shadowOffsetX = 2;
ctx.shadowOffsetY = 2;
ctx.fillText(_camTextContent, 320, 470);
ctx.restore();
}
_camDrawRAF = requestAnimationFrame(drawLoop);
}
if (_camSrcType === 'video' && (_camVideoFile || _camVideoUrl)) {
_camVideoEl = document.createElement('video');
_camVideoEl.src = _camVideoFile ? URL.createObjectURL(_camVideoFile) : _camVideoUrl;
_camVideoEl.loop = _camLoop;
_camVideoEl.muted = true;
_camVideoEl.playsInline = true;
_camVideoEl.crossOrigin = 'anonymous';
_camVideoEl.playbackRate = _camSpeed;
_camVideoEl.play().catch(() => {});
drawLoop();
} else if (_camSrcType === 'image' && (_camImageFile || _camImageUrl)) {
_camImageEl = new Image();
if (_camImageUrl && !_camImageUrl.startsWith('blob:')) _camImageEl.crossOrigin = 'anonymous';
_camImageEl.src = _camImageFile ? URL.createObjectURL(_camImageFile) : _camImageUrl;
_camImageEl.onload = () => { if (!_camDrawRAF) drawLoop(); };
drawLoop();
} else {
log('[CAM] No source selected');
return null;
}
return _camCanvasEl.captureStream(30);
}
function startCamSpoof() {
const fakeStream = buildFakeStream();
if (!fakeStream) return;
_camStream = fakeStream;
const _srcObjDesc = Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, 'srcObject');
if (!_camSrcObjPatch) {
_camSrcObjPatch = function(stream) {
if (this.classList?.contains('scanner-video') && stream && _camSpoofActive && _camStream) {
_srcObjDesc.set.call(this, _camStream); return;
}
_srcObjDesc.set.call(this, stream);
};
Object.defineProperty(HTMLMediaElement.prototype, 'srcObject', {
get() { return _srcObjDesc.get.call(this); },
set: _camSrcObjPatch,
configurable: true
});
}
const scannerVid = document.querySelector('video.scanner-video');
if (scannerVid) scannerVid.srcObject = _camStream;
if (!_origAddTrack) {
_origAddTrack = RTCPeerConnection.prototype.addTrack;
RTCPeerConnection.prototype.addTrack = function(track, ...streams) {
if (track.kind === 'video' && _camSpoofActive && _camStream) {
const fakeTrack = _camStream.getVideoTracks()[0];
if (fakeTrack) return _origAddTrack.call(this, fakeTrack, ...streams);
}
return _origAddTrack.call(this, track, ...streams);
};
}
try {
const fakeTrack = _camStream.getVideoTracks()[0];
if (fakeTrack && window._mogPCs) {
for (const pc of window._mogPCs) {
pc.getSenders().forEach(sender => {
if (sender.track?.kind === 'video') sender.replaceTrack(fakeTrack).catch(() => {});
});
}
}
} catch(e) {}
}
function stopCamSpoof() {
if (_camDrawRAF) { cancelAnimationFrame(_camDrawRAF); _camDrawRAF = null; }
if (_camVideoEl) { _camVideoEl.pause(); _camVideoEl.src = ''; _camVideoEl = null; }
if (_camImageEl) _camImageEl = null;
if (_camStream) { _camStream.getTracks().forEach(t => t.stop()); _camStream = null; }
_trueOriginalGetUserMedia({ video: true }).then(realStream => {
const realTrack = realStream.getVideoTracks()[0];
const scannerVid = document.querySelector('video.scanner-video');
if (scannerVid) scannerVid.srcObject = realStream;
if (realTrack && window._mogPCs) {
for (const pc of window._mogPCs) {
pc.getSenders().forEach(sender => {
if (sender.track?.kind === 'video') sender.replaceTrack(realTrack).catch(() => {});
});
}
}
}).catch(() => {});
}
document.getElementById('cm-camspoof-toggle').addEventListener('change', function() {
_camSpoofActive = this.checked;
if (_camSpoofActive) startCamSpoof(); else stopCamSpoof();
});
// ==================== AUDIO SPOOF ====================
let _audioSpoofActive = false;
let _audioFile = null;
let _audioUrl = null;
let _audioEl = null;
let _audioLoop = true;
let _audioSpeed = 1.0;
let _audioVolume = 1.0;
let _audioStream = null;
let _audioContext = null;
let _audioSource = null;
let _audioDestination = null;
let _audioBassFilter = null;
let _audioTrebleFilter = null;
let _audioWarmthFilter = null;
let _audioBass = 0;
let _audioTreble = 0;
let _audioWarmth = 0;
document.getElementById('cm-audioloop-toggle').addEventListener('change', function() {
_audioLoop = this.checked;
if (_audioEl) _audioEl.loop = _audioLoop;
});
const audioSpeedSlider = document.getElementById('cm-audiospeed');
const audioSpeedFill = document.getElementById('cm-audiospeed-fill');
audioSpeedSlider.addEventListener('input', function() {
_audioSpeed = parseFloat(this.value);
document.getElementById('cm-audiospeed-val').textContent = _audioSpeed.toFixed(2) + 'x';
updateSliderFill(this, audioSpeedFill, 0.25, 3.0);
if (_audioEl) _audioEl.playbackRate = _audioSpeed;
});
const audioVolumeSlider = document.getElementById('cm-audiovolume');
const audioVolumeFill = document.getElementById('cm-audiovolume-fill');
audioVolumeSlider.addEventListener('input', function() {
_audioVolume = parseInt(this.value) / 100;
document.getElementById('cm-audiovolume-val').textContent = this.value + '%';
updateSliderFill(this, audioVolumeFill, 0, 100);
if (_audioEl) _audioEl.volume = _audioVolume;
});
const audioBassSlider = document.getElementById('cm-audiobass');
const audioBassFill = document.getElementById('cm-audiobass-fill');
audioBassSlider.addEventListener('input', function() {
_audioBass = parseInt(this.value);
document.getElementById('cm-audiobass-val').textContent = _audioBass + ' dB';
updateSliderFill(this, audioBassFill, -12, 12);
if (_audioBassFilter) _audioBassFilter.gain.value = _audioBass;
});
const audioTrebleSlider = document.getElementById('cm-audiotreble');
const audioTrebleFill = document.getElementById('cm-audiotreble-fill');
audioTrebleSlider.addEventListener('input', function() {
_audioTreble = parseInt(this.value);
document.getElementById('cm-audiotreble-val').textContent = _audioTreble + ' dB';
updateSliderFill(this, audioTrebleFill, -12, 12);
if (_audioTrebleFilter) _audioTrebleFilter.gain.value = _audioTreble;
});
const audioWarmthSlider = document.getElementById('cm-audiowarmth');
const audioWarmthFill = document.getElementById('cm-audiowarmth-fill');
audioWarmthSlider.addEventListener('input', function() {
_audioWarmth = parseInt(this.value);
document.getElementById('cm-audiowarmth-val').textContent = _audioWarmth + ' dB';
updateSliderFill(this, audioWarmthFill, -12, 12);
if (_audioWarmthFilter) _audioWarmthFilter.gain.value = _audioWarmth;
});
function startAudioSpoof() {
if (!_audioFile && !_audioUrl) {
document.getElementById('cm-audio-status').textContent = 'No file selected';
document.getElementById('cm-audio-status').style.color = 'var(--cm-warning)';
return;
}
try {
_audioEl = document.createElement('audio');
_audioEl.src = _audioFile ? URL.createObjectURL(_audioFile) : _audioUrl;
_audioEl.crossOrigin = 'anonymous';
_audioEl.loop = _audioLoop;
_audioEl.playbackRate = _audioSpeed;
_audioEl.volume = _audioVolume;
_audioContext = new (window.AudioContext || window.webkitAudioContext)();
_audioSource = _audioContext.createMediaElementSource(_audioEl);
_audioBassFilter = _audioContext.createBiquadFilter();
_audioBassFilter.type = 'lowshelf';
_audioBassFilter.frequency.value = 150;
_audioBassFilter.gain.value = _audioBass;
_audioTrebleFilter = _audioContext.createBiquadFilter();
_audioTrebleFilter.type = 'highshelf';
_audioTrebleFilter.frequency.value = 4000;
_audioTrebleFilter.gain.value = _audioTreble;
_audioWarmthFilter = _audioContext.createBiquadFilter();
_audioWarmthFilter.type = 'peaking';
_audioWarmthFilter.frequency.value = 500;
_audioWarmthFilter.Q.value = 1;
_audioWarmthFilter.gain.value = _audioWarmth;
_audioDestination = _audioContext.createMediaStreamDestination();
_audioSource.connect(_audioBassFilter);
_audioBassFilter.connect(_audioWarmthFilter);
_audioWarmthFilter.connect(_audioTrebleFilter);
_audioTrebleFilter.connect(_audioDestination);
_audioTrebleFilter.connect(_audioContext.destination);
_audioStream = _audioDestination.stream;
_audioEl.play().catch(e => log('[AUDIO SPOOF] Play error:', e));
document.getElementById('cm-audio-status').textContent = 'Active';
document.getElementById('cm-audio-status').style.color = 'var(--cm-success)';
log('[AUDIO SPOOF] Started');
} catch(e) {
log('[AUDIO SPOOF] Error:', e);
document.getElementById('cm-audio-status').textContent = 'Error';
document.getElementById('cm-audio-status').style.color = 'var(--cm-danger)';
}
}
function stopAudioSpoof() {
if (_audioEl) {
_audioEl.pause();
_audioEl.src = '';
_audioEl = null;
}
if (_audioContext) {
_audioContext.close().catch(() => {});
_audioContext = null;
}
_audioSource = null;
_audioDestination = null;
_audioBassFilter = null;
_audioTrebleFilter = null;
_audioWarmthFilter = null;
_audioStream = null;
document.getElementById('cm-audio-status').textContent = 'Inactive';
document.getElementById('cm-audio-status').style.color = 'var(--cm-text-muted)';
log('[AUDIO SPOOF] Stopped');
}
document.getElementById('cm-audiospoof-toggle').addEventListener('change', function() {
_audioSpoofActive = this.checked;
if (_audioSpoofActive) startAudioSpoof(); else stopAudioSpoof();
});
// Patch getUserMedia to inject spoofed audio
const _origGetUserMediaForAudio = navigator.mediaDevices.getUserMedia;
navigator.mediaDevices.getUserMedia = async function(constraints) {
if (_audioSpoofActive && _audioStream && constraints && constraints.audio) {
log('[AUDIO SPOOF] Intercepting getUserMedia - injecting spoofed audio');
const realStream = await _trueOriginalGetUserMedia(constraints);
if (constraints.video) {
const combinedTracks = [
...realStream.getVideoTracks(),
..._audioStream.getAudioTracks()
];
return new MediaStream(combinedTracks);
} else {
return _audioStream;
}
}
return _origGetUserMediaForAudio.call(navigator.mediaDevices, constraints);
};
// Cam spoof enforcer
setInterval(() => {
if (!_camSpoofActive) return;
if (!_camStream || (_camStream.getVideoTracks()[0] && _camStream.getVideoTracks()[0].readyState === 'ended')) {
log('[CAM SPOOF] Stream dead, rebuilding...');
const fakeStream = buildFakeStream();
if (fakeStream) _camStream = fakeStream;
}
if (!_camStream) return;
const scannerVid = document.querySelector('video.scanner-video');
if (scannerVid && scannerVid.srcObject !== _camStream) {
log('[CAM SPOOF] Re-applying spoof to scanner-video');
scannerVid.srcObject = _camStream;
}
const fakeTrack = _camStream.getVideoTracks()[0];
if (fakeTrack && window._mogPCs) {
for (const pc of window._mogPCs) {
try {
pc.getSenders().forEach(sender => {
if (sender.track?.kind === 'video' && sender.track !== fakeTrack) {
sender.replaceTrack(fakeTrack).catch(() => {});
}
});
} catch(e) {}
}
}
}, 500);
// VS text detector - re-apply cam spoof on new match
const vsDetector = new MutationObserver((mutations) => {
if (!_camSpoofActive) return;
for (const m of mutations) {
for (const node of m.addedNodes) {
if (node.nodeType !== 1) continue;
const text = node.textContent?.trim();
if (text === 'VS' || node.innerText?.trim() === 'VS') {
log('[CAM SPOOF] VS detected, re-applying cam spoof');
if (!_camStream || (_camStream.getVideoTracks()[0] && _camStream.getVideoTracks()[0].readyState === 'ended')) {
const fakeStream = buildFakeStream();
if (fakeStream) _camStream = fakeStream;
}
if (_camStream) {
const sv = document.querySelector('video.scanner-video');
if (sv) sv.srcObject = _camStream;
const fakeTrack = _camStream.getVideoTracks()[0];
if (fakeTrack && window._mogPCs) {
for (const pc of window._mogPCs) {
try {
pc.getSenders().forEach(sender => {
if (sender.track?.kind === 'video') sender.replaceTrack(fakeTrack).catch(() => {});
});
} catch(e) {}
}
}
}
return;
}
}
}
});
vsDetector.observe(document.body, { childList: true, subtree: true });
// ==================== VERIFICATION BYPASS ====================
const VERIF_VIDEO_URL = 'https://cdn.frostedbrowser.cfd/cheatmoggle-assets/verification-omoggle.mov';
let _verifBypassActive = false;
let _verifBypassFlipTimer = null;
document.getElementById('cm-verifbypass-btn').addEventListener('click', function() {
_verifBypassActive = !_verifBypassActive;
this.style.background = _verifBypassActive ? 'var(--cm-success)' : 'var(--cm-accent)';
this.textContent = _verifBypassActive ? 'Bypass Active' : LANGUAGES[currentLang].verificationBypass;
if (_verifBypassActive) {
startVerifBypass();
} else {
stopVerifBypass();
}
});
function startVerifBypass() {
_camVideoUrl = VERIF_VIDEO_URL;
_camVideoFile = null;
_camImageFile = null;
_camSrcType = 'video';
_camMirror = false;
_camLoop = true;
_camSpeed = 1.0;
if (_camDrawRAF) { cancelAnimationFrame(_camDrawRAF); _camDrawRAF = null; }
if (_camVideoEl) { _camVideoEl.pause(); _camVideoEl.src = ''; }
if (_camStream) { _camStream.getTracks().forEach(t => t.stop()); _camStream = null; }
_camSpoofActive = true;
const camToggle = document.getElementById('cm-camspoof-toggle');
if (camToggle) camToggle.checked = true;
startCamSpoof();
log('[VERIF BYPASS] Started with virtual cam');
_verifBypassFlipTimer = setInterval(() => {
if (!_verifBypassActive) { clearInterval(_verifBypassFlipTimer); return; }
_camMirror = !_camMirror;
if (_camVideoEl) {
_camVideoEl.currentTime = 0;
_camVideoEl.play().catch(() => {});
}
log('[VERIF BYPASS] Flipped:', _camMirror);
}, 3000);
}
function stopVerifBypass() {
if (_verifBypassFlipTimer) { clearInterval(_verifBypassFlipTimer); _verifBypassFlipTimer = null; }
_camMirror = false;
log('[VERIF BYPASS] Stopped');
}
// ==================== OVERLAY IMAGES ====================
const OVERLAY_URLS = {
ban: 'https://raw.githubusercontent.com/sevkabevka/sevkabevka.github.io/main/ChatGPT%20Image%2023%20%D0%BC%D0%B0%D1%8F%202026%20%D0%B3.,%2019_13_02.png',
loading: 'https://raw.githubusercontent.com/sevkabevka/sevkabevka.github.io/main/ChatGPT%20Image%2023%20%D0%BC%D0%B0%D1%8F%202026%20%D0%B3.,%2017_59_13_Nero_AI_Image_Upscaler_Photo_Face.png'
};
let _overlayActive = null;
let _overlayImg = { ban: null, loading: null };
let _overlayCanvas = null, _overlayStream = null, _overlayRAF = null;
['ban', 'loading'].forEach(key => {
const img = new Image();
img.crossOrigin = 'anonymous';
img.src = OVERLAY_URLS[key];
img.onload = () => { _overlayImg[key] = img; };
});
function _pushTrackToAll(stream) {
const track = stream ? stream.getVideoTracks()[0] : null;
if (!track) return;
const scannerVid = document.querySelector('video.scanner-video');
if (scannerVid) scannerVid.srcObject = stream;
if (window._mogPCs) {
for (const pc of window._mogPCs) {
try {
pc.getSenders().forEach(sender => {
if (sender.track?.kind === 'video') sender.replaceTrack(track).catch(() => {});
});
} catch(e) {}
}
}
}
function startOverlay(key) {
if (_overlayRAF) { cancelAnimationFrame(_overlayRAF); _overlayRAF = null; }
if (_overlayStream) { _overlayStream.getTracks().forEach(t => t.stop()); _overlayStream = null; }
_overlayCanvas = null; _overlayActive = null;
const img = _overlayImg[key];
if (!img) {
const statusSpan = document.getElementById('cm-overlay-status');
if (statusSpan) statusSpan.textContent = 'Loading...';
return;
}
_overlayActive = key;
_overlayCanvas = document.createElement('canvas');
_overlayCanvas.width = 640; _overlayCanvas.height = 480;
const ctx = _overlayCanvas.getContext('2d');
function drawOverlay() {
if (!_overlayActive) return;
ctx.save(); ctx.translate(640, 0); ctx.scale(-1, 1);
ctx.drawImage(img, 0, 0, 640, 480);
ctx.restore();
_overlayRAF = requestAnimationFrame(drawOverlay);
}
drawOverlay();
_overlayStream = _overlayCanvas.captureStream(30);
_pushTrackToAll(_overlayStream);
const statusSpan = document.getElementById('cm-overlay-status');
if (statusSpan) {
statusSpan.textContent = key.toUpperCase();
statusSpan.style.color = key === 'ban' ? 'var(--cm-danger)' : 'var(--cm-accent)';
}
}
function stopOverlay() {
if (_overlayRAF) { cancelAnimationFrame(_overlayRAF); _overlayRAF = null; }
if (_overlayStream) { _overlayStream.getTracks().forEach(t => t.stop()); _overlayStream = null; }
_overlayActive = null; _overlayCanvas = null;
if (_camSpoofActive && _camStream) {
_pushTrackToAll(_camStream);
} else {
_trueOriginalGetUserMedia({ video: true }).then(realStream => { _pushTrackToAll(realStream); }).catch(() => {});
}
const statusSpan = document.getElementById('cm-overlay-status');
if (statusSpan) {
statusSpan.textContent = 'None';
statusSpan.style.color = 'var(--cm-text-muted)';
}
}
document.getElementById('cm-ban-overlay-toggle')?.addEventListener('change', function() {
const loadingToggle = document.getElementById('cm-loading-overlay-toggle');
if (loadingToggle) loadingToggle.checked = false;
if (this.checked) startOverlay('ban'); else stopOverlay();
});
document.getElementById('cm-loading-overlay-toggle')?.addEventListener('change', function() {
const banToggle = document.getElementById('cm-ban-overlay-toggle');
if (banToggle) banToggle.checked = false;
if (this.checked) startOverlay('loading'); else stopOverlay();
});
}
// ── ZUSTAND STATUS BADGE ──────────────────────────────────────────────
const _zustandInterval = setInterval(() => {
const badge = document.getElementById('cm-zustand-val');
if (!badge) return;
try {
const wpChunk = _window.webpackChunk_N_E || _window.webpackChunknextjs_app || _window.webpackChunk;
if (!wpChunk) return;
let req;
try { req = wpChunk.push([[Symbol()], {}, e => e]); } catch(e) { return; }
if (typeof req !== 'function') return;
let store = null;
for (const id of [16225, 74952, 41746, 61107, 28344, 50231, 89540]) {
try {
const mod = req(id);
const found = _findStoreInMod(mod);
if (found) { store = found; break; }
} catch(e) {}
}
if (store && store.__cmSetStatePatched) {
badge.textContent = LANGUAGES[currentLang]?.hooked || 'HOOKED';
badge.style.color = 'var(--cm-success)';
badge.removeAttribute('data-pending');
clearInterval(_zustandInterval);
}
} catch(e) {}
}, 500);
function log(...args) {
if (CONFIG.debug) console.log('[cheatmoggle]', ...args);
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', buildMenu);
} else {
buildMenu();
}
})();