// ==UserScript== // @name VELTRIXJS - Narrow One Mod Menu // @namespace https://github.com/VeltrixJS/Cheat-Narrow-One // @version 7.3 // @description Mod menu tout-en-un pour Narrow One // @author VeltrixJS // @match https://narrow.one/* // @grant none // @run-at document-start // @license MIT // @homepageURL https://github.com/VeltrixJS/Cheat-Narrow-One // @supportURL https://github.com/VeltrixJS/Cheat-Narrow-One/issues // @downloadURL https://raw.githubusercontent.com/VeltrixJS/Cheat-Narrow-One/main/VELTRIXJS.user.js // @updateURL https://raw.githubusercontent.com/VeltrixJS/Cheat-Narrow-One/main/VELTRIXJS.user.js // ==/UserScript== (function() { 'use strict'; // ═══════════ AD SKIPPER ═══════════ const NarrowSDK = {}; Function.prototype.bind = new Proxy(Function.prototype.bind, { apply(target, thisArg, args) { if (args[0] != null && args[0].input !== undefined) { NarrowSDK.Main = args[0]; setTimeout(() => hooksActivateAds(), 0); } return Reflect.apply(target, thisArg, args); } }); Function.prototype.bind.toString = function() { return "function bind() { [native code] }"; }; Function.prototype.bind.toString.toString = function() { return "function toString() { [native code] }"; }; function hooksActivateAds() { if (!NarrowSDK.Main?.poki) return; NarrowSDK.Main.poki.originalCommercialBreak ??= NarrowSDK.Main.poki.commercialBreak; NarrowSDK.Main.poki.originalRewardedBreak ??= NarrowSDK.Main.poki.rewardedBreak; NarrowSDK.Main.poki.commercialBreak = async function() {}; NarrowSDK.Main.poki.rewardedBreak = async function() { return { success: true }; }; } // ═══════════ CONFIG ═══════════ const defaultConfig = { // Combat speedV1Enabled: true, speedV1Value: 1.6, speedV2Enabled: false, speedV2Value: 60, jumpV1Enabled: false, jumpV1Value: 35, jumpV2Enabled: true, jumpV2Value: 19, flyEnabled: false, noClipV1Enabled: false, noClipV2Enabled: true, bunnyHopEnabled: false, zoomEnabled: false, zoomPower: 2.5, // FOV caméra camFovEnabled: true, camFovValue: 117, // ESP espGabiEnabled: true, espApolloEnabled: false, espAllyColor: '#c7feff', espEnemyColor: '#00e1e1', espTeamFilter: 'all', espMaxDistance: 500, distanceEnabled: true, nameEnabled: true, healthEnabled: true, tracersEnabled: true, tracersOrigin: 'top', radarEnabled: true, radarSize: 210, radarPos: { x: 1311, y: 19 }, // Visual skyEnabled: true, skyMode: 'custom', skyColor: '#00c8c8', xrayEnabled: false, xrayAlpha: 0.5, xrayWireframe: false, // Viseur chEnabled: true, chModel: 'cross', chColor: '#ffffff', chSize: 24, chThick: 2, chGap: 5, chDynamic: true, chDynamicColor: '#00e1e1', chRainbow: true, chRainbowSpeed: 30, // Anti-AFK afkEnabled: true, // Aimbot aimbotEnabled: true, aimbotBind: 'rightclick', aimbotTargetZone: 'chest', aimbotCustomOffset: 0.6, aimbotSmooth: 0, aimbotTargeting: 'crosshair', aimbotHumanization: 0, aimbotReactionDelay: 0, fovEnabled: true, fovRadius: 340, fovCircleVisible: true, // Binds bindMenu: 'insert', bindAimbotToggle: 'f', bindEspToggle: 'e', bindNoClipV2: 'x', bindChat: 't', // Overlays debugEnabled: false, watermarkEnabled: true, bindsOverlayEnabled: true, // UI uiAccent: '#00dce1', menuPos: { x: 246, y: 5 } }; let cfg = JSON.parse(localStorage.getItem('veltrix_cfg_v7_3')) || defaultConfig; cfg = Object.assign({}, defaultConfig, cfg); const save = () => localStorage.setItem('veltrix_cfg_v7_3', JSON.stringify(cfg)); const applyAccent = () => { document.documentElement.style.setProperty('--vel-accent', cfg.uiAccent); }; applyAccent(); // ═══════════ ÉTAT ═══════════ const state = { game: null, scene: null, myPlayer: null, rigidBody: null, playerList: [], enemyList: [], closestEnemy: { index: -1, distance: Infinity }, aimbotHeld: false, aimbotHeldSince: 0, ready: false, originalFov: null }; window.__veltrixState = state; const debugStats = { fps: 0, frameCount: 0, lastFpsUpdate: 0, enemiesInFov: 0, targetName: '-', rigOk: false }; let isX = false, noclipToggle = false, isSpace = false; let bindingTarget = null; let menu = null; let debugEl = null, watermarkEl = null, bindsOverlayEl = null; let refreshAimbotButton = null; let refreshAllBindButtons = null; let syncUI = null; let hookedCamera = null; // ═══════════ HOOKS ═══════════ const originalPerformanceNow = window.performance.now.bind(window.performance); const perfStart = originalPerformanceNow(); function installSpeedHook() { const newNow = function() { const realTime = originalPerformanceNow(); let phasedTime = realTime; if (isX && cfg.noClipV1Enabled) { noclipToggle = !noclipToggle; phasedTime = noclipToggle ? realTime + 100 : realTime - 50; } if (cfg.speedV1Enabled) { return perfStart + (phasedTime - perfStart) * cfg.speedV1Value; } return phasedTime; }; try { Object.defineProperty(window.performance, 'now', { configurable: true, writable: false, value: newNow }); } catch(e) { window.performance.now = newNow; } } installSpeedHook(); const orgSign = Math.sign; Math.sign = function(n) { if (isX && cfg.noClipV1Enabled && n !== 0) { return (Math.random() > 0.5) ? -orgSign(n) : orgSign(n); } return orgSign(n); }; Object.defineProperty(Object.prototype, 'name', { get() { return this._gt_name; }, set(v) { this._gt_name = v; if (cfg.espApolloEnabled && v === 'player') { if (this.material) { const mats = Array.isArray(this.material) ? this.material : [this.material]; mats.forEach(m => { if (m) { m.depthTest = false; m.wireframe = true; } }); } } }, configurable: true }); Object.defineProperty(Object.prototype, 'jumpForce', { get() { return (cfg.jumpV1Enabled && isSpace) ? cfg.jumpV1Value : (this._jf ?? 65); }, set(v) { this._jf = v; }, configurable: true }); // ═══════════ SKY HOOK ═══════════ const TARGET_UNIFORMS = ['skyHighCol','skyMidCol','skyLowCol']; const uniformMap = new WeakMap(); const hslToRgb = (h,s,l) => { const q=l<0.5?l*(1+s):l+s-l*s, p=2*l-q; const f=t=>{if(t<0)t+=1;if(t>1)t-=1;if(t<1/6)return p+(q-p)*6*t;if(t<1/2)return q;if(t<2/3)return p+(q-p)*(2/3-t)*6;return p;}; return [f(h+1/3)*255,f(h)*255,f(h-1/3)*255]; }; const hexToRgb = hex => [parseInt(hex.slice(1,3),16),parseInt(hex.slice(3,5),16),parseInt(hex.slice(5,7),16)]; const orgGetContext = HTMLCanvasElement.prototype.getContext; HTMLCanvasElement.prototype.getContext = function() { const ctx = orgGetContext.apply(this, arguments); if ((arguments[0]==='webgl'||arguments[0]==='webgl2') && ctx && !ctx._hooked) { const orgGetLoc = ctx.getUniformLocation; ctx.getUniformLocation = function(prog,name) { const loc = orgGetLoc.apply(this,arguments); if (loc && TARGET_UNIFORMS.includes(name)) uniformMap.set(loc,name); return loc; }; const skyColor = () => cfg.skyMode==='rainbow' ? hslToRgb((originalPerformanceNow()/(100/3))%360/360,1,0.5) : hexToRgb(cfg.skyColor); const orgU3fv = ctx.uniform3fv; ctx.uniform3fv = function(loc,val) { if (uniformMap.has(loc)&&cfg.skyEnabled){const c=skyColor();return orgU3fv.call(this,loc,new Float32Array([c[0]/255,c[1]/255,c[2]/255]));} return orgU3fv.apply(this,arguments); }; const orgU3f = ctx.uniform3f; ctx.uniform3f = function(loc,v1,v2,v3) { if (uniformMap.has(loc)&&cfg.skyEnabled){const c=skyColor();return orgU3f.call(this,loc,c[0]/255,c[1]/255,c[2]/255);} return orgU3f.apply(this,arguments); }; ctx._hooked = true; } return ctx; }; // ═══════════ X-RAY HOOK ═══════════ const glProto = WebGLRenderingContext.prototype; const gl2Proto = typeof WebGL2RenderingContext!=='undefined' ? WebGL2RenderingContext.prototype : null; const xrayHook = org => function(mode,count,type,offset,ic) { if (!cfg.xrayEnabled) return org.call(this,mode,count,type,offset,ic); this.enable(this.BLEND);this.blendFunc(this.SRC_ALPHA,this.ONE_MINUS_SRC_ALPHA); this.disable(this.DEPTH_TEST);this.depthMask(false); org.call(this,cfg.xrayWireframe?this.LINES:mode,count,type,offset,ic); if (cfg.xrayAlpha>0.05){this.enable(this.DEPTH_TEST);this.depthMask(cfg.xrayAlpha>0.8);org.call(this,mode,count,type,offset,ic);} }; const orgDA = glProto.drawArrays; glProto.drawArrays = function(mode,first,count) { if (!cfg.xrayEnabled) return orgDA.call(this,mode,first,count); this.disable(this.DEPTH_TEST);orgDA.call(this,cfg.xrayWireframe?this.LINES:mode,first,count); this.enable(this.DEPTH_TEST);if(cfg.xrayAlpha>0.1)orgDA.call(this,mode,first,count); }; glProto.drawElements = xrayHook(glProto.drawElements); if (gl2Proto) { gl2Proto.drawElements = xrayHook(gl2Proto.drawElements); gl2Proto.drawElementsInstanced = xrayHook(gl2Proto.drawElementsInstanced); const orgDAI = gl2Proto.drawArraysInstanced; gl2Proto.drawArraysInstanced = function(mode,first,count,ic) { if (!cfg.xrayEnabled) return orgDAI.call(this,mode,first,count,ic); this.disable(this.DEPTH_TEST);orgDAI.call(this,cfg.xrayWireframe?this.LINES:mode,first,count,ic); this.enable(this.DEPTH_TEST);if(cfg.xrayAlpha>0.1)orgDAI.call(this,mode,first,count,ic); }; } // ═══════════ BACKEND JEU ═══════════ const originalPush = Array.prototype.push; Array.prototype.push = function (...args) { try { const game = args[0]?.playerCollider?.rigidBody?.player?.game; if (game) { state.game = game; state.scene = game.scene?.parent; } } catch(e) {} return originalPush.apply(this, args); }; if (!window.THREE) { const s = document.createElement('script'); s.src = 'https://unpkg.com/three@0.150.0/build/three.min.js'; document.head.appendChild(s); } function getCamera() { if (!state.game) return null; if (state.game.camera) return state.game.camera; if (state.game.scene?.camera) return state.game.scene.camera; if (state.scene?.camera) return state.scene.camera; if (state.myPlayer?.camera) return state.myPlayer.camera; if (state.scene) { let found = null; state.scene.traverse(obj => { if (!found && obj.isCamera) found = obj; }); if (found) return found; } for (const key in state.game) { const val = state.game[key]; if (val && val.isCamera) return val; } return null; } // ═══════════ FILTRES ESP ═══════════ function playerPassesFilter(player) { if (!state.myPlayer) return false; const isEnemy = player.teamId !== state.myPlayer.teamId; if (cfg.espTeamFilter === 'enemy' && !isEnemy) return false; if (cfg.espTeamFilter === 'ally' && isEnemy) return false; const myPos = state.myPlayer.obj?.position; const pPos = player.obj?.position; if (myPos && pPos) { const d = myPos.distanceTo(pPos); if (d > cfg.espMaxDistance) return false; } return true; } // ═══════════ BUNNY HOP ═══════════ let lastHopTime = 0; function doBunnyHop() { if (!cfg.bunnyHopEnabled || !state.ready) return; const now = Date.now(); if (now - lastHopTime < 100) return; lastHopTime = now; document.dispatchEvent(new KeyboardEvent('keydown', { key:' ', code:'Space', keyCode:32, which:32, bubbles:true })); setTimeout(() => { document.dispatchEvent(new KeyboardEvent('keyup', { key:' ', code:'Space', keyCode:32, which:32, bubbles:true })); }, 40); } // ═══════════ FOV CAMÉRA ═══════════ function hookCameraFov(cam) { if (!cam || cam._veltrixFovHooked) return; cam._veltrixFovHooked = true; cam._veltrixOrigUpdateProjection = cam.updateProjectionMatrix.bind(cam); cam.updateProjectionMatrix = function() { if (cfg.camFovEnabled) { this.fov = cfg.camFovValue; } return this._veltrixOrigUpdateProjection(); }; } function doCameraFov() { const cam = getCamera(); if (!cam) return; if (state.originalFov === null && cam.fov) state.originalFov = cam.fov; if (hookedCamera !== cam) { hookedCamera = cam; hookCameraFov(cam); } if (cfg.camFovEnabled) { if (cam.fov !== cfg.camFovValue) { cam.fov = cfg.camFovValue; cam.updateProjectionMatrix(); } } else if (state.originalFov !== null && cam.fov !== state.originalFov) { cam.fov = state.originalFov; cam.updateProjectionMatrix(); } } // ═══════════ BOUCLE ═══════════ function updateGame() { if (!state.game?.gameStarted) return; try { state.myPlayer = state.game.getMyPlayer(); if (!state.myPlayer) { state.ready = false; state.playerList = []; state.enemyList = []; state.rigidBody = null; return; } state.rigidBody = [...state.myPlayer.physicsManager.rigidBodies].filter( e => e.player?.id === state.myPlayer.id )[0]; debugStats.rigOk = !!state.rigidBody; state.ready = true; state.playerList = [...state.game.players.values()].filter(e => e && e.id !== state.myPlayer.id); state.enemyList = state.playerList.filter(e => e.teamId !== state.myPlayer.teamId); if (state.rigidBody) { state.rigidBody.fly = cfg.flyEnabled; state.rigidBody.noclip = cfg.noClipV2Enabled ? isX : false; } if (state.myPlayer) { if (cfg.speedV2Enabled) state.myPlayer.walkSpeed = cfg.speedV2Value; if (cfg.jumpV2Enabled) state.myPlayer.jumpForce = cfg.jumpV2Value; } if (state.game?.chat) { const chat = state.game.chat; if (!chat.toggledVisible) chat.toggledVisible = true; if (!chat.visible && typeof chat.updateVisibility === 'function') chat.updateVisibility(); } findClosestEnemy(); doAimbot(); doEspGabi(); updateEspInfos(); updateTracers(); updateRadar(); updateDynamicCrosshair(); doBunnyHop(); doCameraFov(); } catch(e) {} } function rafLoop(t) { debugStats.frameCount++; if (t - debugStats.lastFpsUpdate >= 500) { debugStats.fps = Math.round(debugStats.frameCount * 1000 / (t - debugStats.lastFpsUpdate)); debugStats.frameCount = 0; debugStats.lastFpsUpdate = t; } updateGame(); if (debugEl) updateDebugOverlay(); if (watermarkEl) updateWatermark(); if (cfg.chRainbow && cfg.chEnabled && window.__veltrixUpdateCH) { window.__veltrixUpdateCH(); } requestAnimationFrame(rafLoop); } requestAnimationFrame(rafLoop); setInterval(() => { if (cfg.speedV1Enabled || cfg.noClipV1Enabled) installSpeedHook(); }, 200); function findClosestEnemy() { state.closestEnemy.index = -1; state.closestEnemy.distance = Infinity; const myPos = state.myPlayer?.obj?.position; if (!myPos) return; state.enemyList.forEach((e, i) => { const pos = e?.obj?.position; if (!pos) return; const d = myPos.distanceTo(pos); if (d < state.closestEnemy.distance) { state.closestEnemy.index = i; state.closestEnemy.distance = d; } }); } // ═══════════ AIMBOT ═══════════ function getEnemyHP(player) { let raw = null; if (player.health !== undefined) raw = player.health; else if (player.hp !== undefined) raw = player.hp; else if (player.playerHealth !== undefined) raw = player.playerHealth; else if (player.currentHealth !== undefined) raw = player.currentHealth; else if (player.life !== undefined) raw = player.life; if (raw === null) return 100; return (raw <= 1.5 && raw >= -1.5) ? raw * 100 : raw; } function findTargetByMode() { const cam = getCamera(); if (!state.myPlayer) return null; let candidates = state.enemyList.slice(); if (cfg.fovEnabled) { if (!cam) return null; const w = window.innerWidth / 2, h = window.innerHeight / 2; candidates = candidates.filter(enemy => { const pos = enemy?.obj?.position; if (!pos) return false; const p = pos.clone(); p.y += 0.6; const proj = p.project(cam); if (proj.z > 1) return false; const sx = (proj.x * 0.5 + 0.5) * window.innerWidth; const sy = (-proj.y * 0.5 + 0.5) * window.innerHeight; const d = Math.sqrt((sx - w) ** 2 + (sy - h) ** 2); return d < cfg.fovRadius; }); } if (!candidates.length) return null; if (cfg.aimbotTargeting === 'lowest_hp') { let best = null, bestHp = Infinity; candidates.forEach(e => { const hp = getEnemyHP(e); if (hp < bestHp) { bestHp = hp; best = e; } }); return best; } if (cfg.aimbotTargeting === 'crosshair' && cam) { let best = null, bestDist = Infinity; const w = window.innerWidth / 2, h = window.innerHeight / 2; candidates.forEach(enemy => { const pos = enemy?.obj?.position; if (!pos) return; const p = pos.clone(); p.y += 0.6; const proj = p.project(cam); if (proj.z > 1) return; const sx = (proj.x * 0.5 + 0.5) * window.innerWidth; const sy = (-proj.y * 0.5 + 0.5) * window.innerHeight; const d = Math.sqrt((sx - w) ** 2 + (sy - h) ** 2); if (d < bestDist) { bestDist = d; best = enemy; } }); return best; } let best = null, bestDist = Infinity; const myPos = state.myPlayer.obj?.position; if (!myPos) return candidates[0]; candidates.forEach(e => { const pos = e?.obj?.position; if (!pos) return; const d = myPos.distanceTo(pos); if (d < bestDist) { bestDist = d; best = e; } }); return best; } function doAimbot() { if (!cfg.aimbotEnabled || !state.aimbotHeld || !state.ready) return; if (!state.myPlayer?.lookRot) return; if (cfg.aimbotReactionDelay > 0) { const elapsed = Date.now() - state.aimbotHeldSince; if (elapsed < cfg.aimbotReactionDelay) return; } const enemy = findTargetByMode(); if (!enemy?.pos) return; if (cfg.debugEnabled) { const nm = enemy.username || enemy.nickname || enemy.name || '?'; debugStats.targetName = String(nm); } let offsetY = 0; switch (cfg.aimbotTargetZone) { case 'head': offsetY = 0.6; break; case 'chest': offsetY = 0.3; break; case 'body': offsetY = 0.0; break; case 'legs': offsetY = -0.3; break; case 'feet': offsetY = -0.6; break; case 'custom': offsetY = cfg.aimbotCustomOffset; break; } const dx = enemy.pos.x - state.myPlayer.pos.x; const dy = (enemy.pos.y + offsetY) - state.myPlayer.pos.y; const dz = enemy.pos.z - state.myPlayer.pos.z; let targetX = Math.atan2(-dx, -dz); let targetY = Math.atan2(dy, Math.sqrt(dx*dx + dz*dz)); if (cfg.aimbotHumanization > 0) { const h = cfg.aimbotHumanization / 100; targetX += (Math.random() - 0.5) * 0.03 * h; targetY += (Math.random() - 0.5) * 0.03 * h; } const smoothFactor = 1 - cfg.aimbotSmooth; let deltaX = targetX - state.myPlayer.lookRot.x; while (deltaX > Math.PI) deltaX -= 2 * Math.PI; while (deltaX < -Math.PI) deltaX += 2 * Math.PI; state.myPlayer.lookRot.x += deltaX * smoothFactor; state.myPlayer.lookRot.y += (targetY - state.myPlayer.lookRot.y) * smoothFactor; } // ═══════════ FOV CIRCLE ═══════════ let fovCircleEl = null; function updateFovCircle() { if (!document.body) return; if (!fovCircleEl) { fovCircleEl = document.createElement('div'); fovCircleEl.id = 'veltrix-fov'; fovCircleEl.style.cssText = ` position:fixed;top:50%;left:50%; transform:translate(-50%,-50%); border:2px solid rgba(255,255,255,0.5); border-radius:50%;pointer-events:none;z-index:9998; display:none; `; document.body.appendChild(fovCircleEl); } if (cfg.fovEnabled && cfg.fovCircleVisible) { fovCircleEl.style.display = 'block'; fovCircleEl.style.width = (cfg.fovRadius * 2) + 'px'; fovCircleEl.style.height = (cfg.fovRadius * 2) + 'px'; } else { fovCircleEl.style.display = 'none'; } } // ═══════════ ESP BOX3 ═══════════ function doEspGabi() { if (!window.THREE || !state.myPlayer) return; state.playerList.forEach(player => { const obj = player?.obj; if (!obj) return; const pass = playerPassesFilter(player); if (!cfg.espGabiEnabled || !pass) { if (obj.espBox) obj.espBox.visible = false; return; } if (obj.espBox) { obj.espBox.visible = true; const colorHex = player.teamId === state.myPlayer.teamId ? cfg.espAllyColor : cfg.espEnemyColor; if (obj.espBox.material.color.getHexString() !== colorHex.replace('#','')) { obj.espBox.material.color.set(colorHex); } return; } try { const bbox = new THREE.Box3().setFromObject(obj); const size = new THREE.Vector3(), center = new THREE.Vector3(); bbox.getSize(size); bbox.getCenter(center); const geometry = new THREE.EdgesGeometry(new THREE.BoxGeometry(size.x, size.y, size.z)); const colorHex = player.teamId === state.myPlayer.teamId ? cfg.espAllyColor : cfg.espEnemyColor; const material = new THREE.LineBasicMaterial({ color: new THREE.Color(colorHex), depthTest: false }); const box = new THREE.LineSegments(geometry, material); box.position.copy(obj.worldToLocal(center.clone())); box.position.y += 1; box.frustumCulled = false; box.renderOrder = 9999; obj.add(box); obj.espBox = box; } catch(e) {} }); } // ═══════════ SPRITES ESP ═══════════ function makeTextSprite(text, color) { const canvas = document.createElement('canvas'); canvas.width = 256; canvas.height = 64; const ctx = canvas.getContext('2d'); ctx.font = 'bold 40px Segoe UI, sans-serif'; ctx.fillStyle = color; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.strokeStyle = 'rgba(0,0,0,0.8)'; ctx.lineWidth = 6; ctx.strokeText(text, 128, 32); ctx.fillText(text, 128, 32); const texture = new THREE.CanvasTexture(canvas); texture.minFilter = THREE.LinearFilter; const material = new THREE.SpriteMaterial({ map: texture, depthTest: false, transparent: true }); const sprite = new THREE.Sprite(material); sprite.scale.set(2, 0.5, 1); return sprite; } function updateTextSprite(sprite, text, color) { const canvas = sprite.material.map.image; const ctx = canvas.getContext('2d'); ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.font = 'bold 40px Segoe UI, sans-serif'; ctx.fillStyle = color; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.strokeStyle = 'rgba(0,0,0,0.8)'; ctx.lineWidth = 6; ctx.strokeText(text, 128, 32); ctx.fillText(text, 128, 32); sprite.material.map.needsUpdate = true; } function updateEspInfos() { if (!window.THREE || !state.myPlayer) return; state.playerList.forEach(player => { const obj = player?.obj; if (!obj) return; const isEnemy = player.teamId !== state.myPlayer.teamId; const color = isEnemy ? cfg.espEnemyColor : cfg.espAllyColor; const pass = playerPassesFilter(player); if (cfg.distanceEnabled && pass) { if (!obj._espDist) { obj._espDist = makeTextSprite('0m', color); obj._espDist.position.y = 3.5; obj.add(obj._espDist); } const d = state.myPlayer.obj.position.distanceTo(obj.position); updateTextSprite(obj._espDist, `${Math.round(d)}m`, color); obj._espDist.visible = true; } else if (obj._espDist) obj._espDist.visible = false; if (cfg.nameEnabled && pass) { if (!obj._espName) { obj._espName = makeTextSprite('?', color); obj._espName.position.y = 3.0; obj._espName.scale.set(3, 0.7, 1); obj.add(obj._espName); } let pseudo = player.username || player.nickname || player.displayName || player.userName || player.pseudo || player.playerName || player.tag || player.user?.name || player.user?.username || player.data?.name || player.info?.name; if (!pseudo && typeof player.name === 'string' && player.name !== 'player') pseudo = player.name; updateTextSprite(obj._espName, String(pseudo || '???'), color); obj._espName.visible = true; } else if (obj._espName) obj._espName.visible = false; if (cfg.healthEnabled && pass) { if (!obj._espHP) { obj._espHP = makeTextSprite('100', color); obj._espHP.position.y = 2.5; obj.add(obj._espHP); } let hp = Math.round(getEnemyHP(player)); let hpColor = color; if (hp <= 0) hpColor = '#666666'; else if (hp < 30) hpColor = '#ff4444'; else if (hp < 60) hpColor = '#ffaa00'; updateTextSprite(obj._espHP, `❤ ${hp}`, hpColor); obj._espHP.visible = true; } else if (obj._espHP) obj._espHP.visible = false; }); } // ═══════════ TRACERS ═══════════ const tracers = new Map(); function getTracerOrigin() { const cam = getCamera(); if (!cam) { if (state.myPlayer?.obj?.position) return state.myPlayer.obj.position.clone(); return new THREE.Vector3(); } let ndcY = 0; if (cfg.tracersOrigin === 'top') ndcY = 0.95; else if (cfg.tracersOrigin === 'bottom') ndcY = -0.95; const DIST = 0.5; const fovRad = (cam.fov || 75) * Math.PI / 180; const halfHeight = Math.tan(fovRad / 2) * DIST; const localY = ndcY * halfHeight; const localPoint = new THREE.Vector3(0, localY, -DIST); const worldPoint = localPoint.clone(); cam.localToWorld(worldPoint); return worldPoint; } function updateTracers() { if (!window.THREE || !state.scene) return; const currentIds = new Set(); if (state.myPlayer) { state.playerList.forEach(player => { const obj = player?.obj; if (!obj) return; currentIds.add(player.id); const pass = playerPassesFilter(player); if (!cfg.tracersEnabled || !pass) { const t = tracers.get(player.id); if (t) t.visible = false; return; } const isEnemy = player.teamId !== state.myPlayer.teamId; const color = isEnemy ? cfg.espEnemyColor : cfg.espAllyColor; let tracer = tracers.get(player.id); if (!tracer) { const geometry = new THREE.BufferGeometry().setFromPoints([ new THREE.Vector3(), new THREE.Vector3() ]); const material = new THREE.LineBasicMaterial({ color: new THREE.Color(color), depthTest: false, transparent: true, opacity: 0.85 }); tracer = new THREE.Line(geometry, material); tracer.frustumCulled = false; tracer.renderOrder = 9998; state.scene.add(tracer); tracers.set(player.id, tracer); } tracer.material.color.set(color); const start = getTracerOrigin(); const end = obj.position.clone(); end.y += 0.6; tracer.geometry.setFromPoints([start, end]); tracer.geometry.attributes.position.needsUpdate = true; tracer.geometry.computeBoundingSphere(); tracer.visible = true; }); } tracers.forEach((tracer, id) => { if (!currentIds.has(id) || !cfg.tracersEnabled || !state.myPlayer) { if (tracer.parent) tracer.parent.remove(tracer); tracer.geometry.dispose(); tracer.material.dispose(); tracers.delete(id); } }); } // ═══════════ RADAR ═══════════ let radarCanvas = null, radarCtx = null; let radarDragging = false, radarDragOffset = { x: 0, y: 0 }; function initRadar() { if (radarCanvas || !document.body) return; radarCanvas = document.createElement('canvas'); radarCanvas.id = 'veltrix-radar'; radarCanvas.style.cssText = ` position:fixed; border-radius:12px;background:rgba(0,0,0,0.6); border:1px solid rgba(255,255,255,0.15); backdrop-filter:blur(6px); z-index:9997;display:none; cursor:grab;user-select:none;touch-action:none; `; radarCtx = radarCanvas.getContext('2d'); document.body.appendChild(radarCanvas); applyRadarPosition(); radarCanvas.addEventListener('mousedown', e => { if (e.button !== 0) return; e.preventDefault(); e.stopPropagation(); radarDragging = true; const rect = radarCanvas.getBoundingClientRect(); radarDragOffset.x = e.clientX - rect.left; radarDragOffset.y = e.clientY - rect.top; radarCanvas.style.cursor = 'grabbing'; }); document.addEventListener('mousemove', e => { if (!radarDragging) return; const x = e.clientX - radarDragOffset.x; const y = e.clientY - radarDragOffset.y; const maxX = window.innerWidth - cfg.radarSize; const maxY = window.innerHeight - cfg.radarSize; const cx = Math.max(0, Math.min(maxX, x)); const cy = Math.max(0, Math.min(maxY, y)); cfg.radarPos = { x: cx, y: cy }; radarCanvas.style.left = cx + 'px'; radarCanvas.style.top = cy + 'px'; save(); }); document.addEventListener('mouseup', () => { if (radarDragging) { radarDragging = false; radarCanvas.style.cursor = 'grab'; } }); } function applyRadarPosition() { if (!radarCanvas) return; if (cfg.radarPos && cfg.radarPos.x != null && cfg.radarPos.y != null) { radarCanvas.style.left = cfg.radarPos.x + 'px'; radarCanvas.style.top = cfg.radarPos.y + 'px'; } else { radarCanvas.style.left = (window.innerWidth - cfg.radarSize - 20) + 'px'; radarCanvas.style.top = '20px'; } } function updateRadar() { if (!radarCanvas || !radarCtx) return; const size = cfg.radarSize; if (radarCanvas.width !== size) { radarCanvas.width = size; radarCanvas.height = size; radarCanvas.style.width = size + 'px'; radarCanvas.style.height = size + 'px'; } radarCanvas.style.display = cfg.radarEnabled ? 'block' : 'none'; if (!cfg.radarEnabled) return; radarCtx.clearRect(0, 0, size, size); const myPos = state.myPlayer?.obj?.position; if (!myPos) return; const RANGE = 60; const scale = (size / 2) / RANGE; const cx = size / 2, cy = size / 2; radarCtx.strokeStyle = 'rgba(255,255,255,0.1)'; radarCtx.lineWidth = 1; radarCtx.beginPath(); radarCtx.arc(cx, cy, size/2 - 4, 0, Math.PI * 2); radarCtx.stroke(); state.playerList.forEach(p => { const pos = p?.obj?.position; if (!pos) return; const dx = pos.x - myPos.x; const dz = pos.z - myPos.z; if (Math.sqrt(dx*dx + dz*dz) > RANGE) return; const isEnemy = p.teamId !== state.myPlayer.teamId; const color = isEnemy ? cfg.espEnemyColor : cfg.espAllyColor; const rot = state.myPlayer.lookRot?.x || 0; const cosR = Math.cos(-rot), sinR = Math.sin(-rot); const rotX = dx * cosR - dz * sinR; const rotZ = dx * sinR + dz * cosR; radarCtx.fillStyle = color; radarCtx.beginPath(); radarCtx.arc(cx + rotX * scale, cy + rotZ * scale, 4, 0, Math.PI * 2); radarCtx.fill(); }); radarCtx.fillStyle = '#ffffff'; radarCtx.beginPath(); radarCtx.arc(cx, cy, 5, 0, Math.PI * 2); radarCtx.fill(); radarCtx.strokeStyle = '#ffffff'; radarCtx.lineWidth = 2; radarCtx.beginPath(); radarCtx.moveTo(cx, cy); radarCtx.lineTo(cx, cy - 12); radarCtx.stroke(); } // ═══════════ ANTI-AFK ═══════════ let afkTimer, isAFK = false; const AFK_DELAY = 10000; function afkJumpLoop() { if (!isAFK || !cfg.afkEnabled) return; document.dispatchEvent(new KeyboardEvent('keydown', { key:' ', code:'Space', keyCode:32, which:32, bubbles:true })); setTimeout(() => document.dispatchEvent(new KeyboardEvent('keyup', { key:' ', code:'Space', keyCode:32, which:32, bubbles:true })), 150); setTimeout(afkJumpLoop, 5000 + Math.random() * 7000); } function resetAfkTimer() { isAFK = false; clearTimeout(afkTimer); if (!cfg.afkEnabled) return; afkTimer = setTimeout(() => { isAFK = true; afkJumpLoop(); }, AFK_DELAY); } ['mousemove','keydown','mousedown','touchstart'].forEach(evt => window.addEventListener(evt, resetAfkTimer, { passive:true }) ); // ═══════════ CROSSHAIR DYNAMIQUE ═══════════ let chDynamicActive = false; function updateDynamicCrosshair() { if (!cfg.chEnabled) return; let active = false; if (cfg.chDynamic && state.myPlayer) { const radius = cfg.fovRadius; const cam = getCamera(); if (cam) { const w = window.innerWidth / 2, h = window.innerHeight / 2; for (const enemy of state.enemyList) { const pos = enemy?.obj?.position; if (!pos) continue; const p = pos.clone(); p.y += 0.6; const proj = p.project(cam); if (proj.z > 1) continue; const sx = (proj.x * 0.5 + 0.5) * window.innerWidth; const sy = (-proj.y * 0.5 + 0.5) * window.innerHeight; const d = Math.sqrt((sx - w) ** 2 + (sy - h) ** 2); if (d < radius) { active = true; break; } } } } if (active !== chDynamicActive) { chDynamicActive = active; if (window.__veltrixUpdateCH) window.__veltrixUpdateCH(); } } // ═══════════ DEBUG OVERLAY ═══════════ function initDebugOverlay() { if (debugEl || !document.body) return; debugEl = document.createElement('div'); debugEl.id = 'veltrix-debug'; debugEl.style.cssText = ` position:fixed;top:55px;left:10px; background:rgba(0,0,0,0.75); border:1px solid rgba(255,255,255,0.15); border-radius:8px;padding:8px 12px; font-family:'Consolas','Monaco',monospace; font-size:11px;color:#0f0;line-height:1.5; z-index:9999;pointer-events:none;display:none; white-space:pre;min-width:180px; `; document.body.appendChild(debugEl); } function updateDebugOverlay() { if (!debugEl) return; debugEl.style.display = cfg.debugEnabled ? 'block' : 'none'; if (!cfg.debugEnabled) return; const lines = [ `FPS ${debugStats.fps}`, `Ready ${state.ready ? 'yes' : 'no'}`, `Rigid ${debugStats.rigOk ? 'yes' : 'no'}`, `Players ${state.playerList.length}`, `Enemies ${state.enemyList.length}`, `Target ${debugStats.targetName}`, `Aimbot ${state.aimbotHeld ? 'HOLD' : 'idle'}` ]; debugEl.textContent = lines.join('\n'); } // ═══════════ WATERMARK ═══════════ function initWatermark() { if (watermarkEl || !document.body) return; watermarkEl = document.createElement('div'); watermarkEl.id = 'veltrix-watermark'; watermarkEl.style.cssText = ` position:fixed;top:10px;left:10px; background:rgba(20,20,30,0.7); border:1px solid rgba(255,255,255,0.15); border-radius:8px;padding:5px 12px; font-family:'Segoe UI',sans-serif; font-size:11px;font-weight:700;letter-spacing:1px; color:var(--vel-accent);z-index:9999; pointer-events:none;display:none; text-transform:uppercase; `; document.body.appendChild(watermarkEl); } function updateWatermark() { if (!watermarkEl) return; watermarkEl.style.display = cfg.watermarkEnabled ? 'block' : 'none'; if (!cfg.watermarkEnabled) return; watermarkEl.textContent = `VELTRIXJS v7.3 | ${debugStats.fps} FPS`; } // ═══════════ BINDS OVERLAY ═══════════ function initBindsOverlay() { if (bindsOverlayEl || !document.body) return; bindsOverlayEl = document.createElement('div'); bindsOverlayEl.id = 'veltrix-binds'; bindsOverlayEl.style.cssText = ` position:fixed;top:10px;right:10px; background:rgba(20,20,30,0.7); border:1px solid rgba(255,255,255,0.15); border-radius:8px;padding:8px 14px; font-family:'Consolas','Monaco',monospace; font-size:11px;color:rgba(255,255,255,0.85); z-index:9999;pointer-events:none;display:none; line-height:1.6;min-width:150px; `; document.body.appendChild(bindsOverlayEl); } function updateBindsOverlay() { if (!bindsOverlayEl) return; bindsOverlayEl.style.display = cfg.bindsOverlayEnabled ? 'block' : 'none'; if (!cfg.bindsOverlayEnabled) return; const k = cfg.bindMenu.toUpperCase().padEnd(6); const f = cfg.bindAimbotToggle.toUpperCase().padEnd(6); const e = cfg.bindEspToggle.toUpperCase().padEnd(6); const x = cfg.bindNoClipV2.toUpperCase().padEnd(6); const t = cfg.bindChat.toUpperCase().padEnd(6); bindsOverlayEl.innerHTML = `
VELTRIXJS
` + `
${k} Menu
` + `
${f} Aimbot
` + `
${e} ESP
` + `
${x} NoClip
` + `
${t} Chat
`; } // ═══════════ INPUT ═══════════ window.addEventListener('keydown', e => { const tag = document.activeElement?.tagName; if (tag === 'INPUT' || tag === 'TEXTAREA' || document.activeElement?.isContentEditable) return; if (bindingTarget) { e.preventDefault(); const key = e.key.toLowerCase(); switch (bindingTarget) { case 'aimbot': cfg.aimbotBind = key; break; case 'menu': cfg.bindMenu = key; break; case 'aimbotToggle': cfg.bindAimbotToggle = key; break; case 'espToggle': cfg.bindEspToggle = key; break; case 'noClipV2': cfg.bindNoClipV2 = key; break; case 'chat': cfg.bindChat = key; break; } bindingTarget = null; save(); refreshAllBindButtons && refreshAllBindButtons(); refreshAimbotButton && refreshAimbotButton(); updateBindsOverlay(); return; } if (e.key.toLowerCase() === cfg.bindChat && state.game?.chat) { const chat = state.game.chat; chat.toggledVisible = true; if (typeof chat.updateVisibility === 'function') chat.updateVisibility(); if (chat.textBoxEl) chat.textBoxEl.focus(); e.preventDefault(); return; } if (e.key.toLowerCase() === cfg.bindNoClipV2) isX = true; if (e.code === 'Space') isSpace = true; if (e.key.toLowerCase() === cfg.bindMenu && menu) menu.classList.toggle('open'); if (cfg.aimbotEnabled && cfg.aimbotBind === e.key.toLowerCase()) { state.aimbotHeld = true; state.aimbotHeldSince = Date.now(); } if (e.key.toLowerCase() === cfg.bindAimbotToggle) { cfg.aimbotEnabled = !cfg.aimbotEnabled; save(); syncUI && syncUI(); } if (e.key.toLowerCase() === cfg.bindEspToggle) { cfg.espGabiEnabled = !cfg.espGabiEnabled; save(); syncUI && syncUI(); } }); window.addEventListener('keyup', e => { if (e.key.toLowerCase() === cfg.bindNoClipV2) isX = false; if (e.code === 'Space') isSpace = false; if (cfg.aimbotBind === e.key.toLowerCase()) state.aimbotHeld = false; }); window.addEventListener('mousedown', e => { if (bindingTarget) { e.preventDefault(); e.stopPropagation(); if (bindingTarget === 'aimbot') { cfg.aimbotBind = e.button === 2 ? 'rightclick' : (e.button === 0 ? 'leftclick' : 'middleclick'); bindingTarget = null; save(); refreshAimbotButton && refreshAimbotButton(); } return; } if (cfg.aimbotEnabled) { const b = cfg.aimbotBind; if (b === 'rightclick' && e.button === 2) { state.aimbotHeld = true; state.aimbotHeldSince = Date.now(); } if (b === 'leftclick' && e.button === 0) { state.aimbotHeld = true; state.aimbotHeldSince = Date.now(); } if (b === 'middleclick'&& e.button === 1) { state.aimbotHeld = true; state.aimbotHeldSince = Date.now(); } } if (e.button === 2 && cfg.zoomEnabled) { const c = document.querySelector('canvas'); if (c) c.style.transform = `scale(${cfg.zoomPower})`; } }); window.addEventListener('mouseup', e => { if (cfg.aimbotBind === 'rightclick' && e.button === 2) state.aimbotHeld = false; if (cfg.aimbotBind === 'leftclick' && e.button === 0) state.aimbotHeld = false; if (cfg.aimbotBind === 'middleclick'&& e.button === 1) state.aimbotHeld = false; if (e.button === 2) { const c = document.querySelector('canvas'); if (c) c.style.transform = 'scale(1)'; } }); window.addEventListener('contextmenu', e => e.preventDefault()); // ═══════════ HUD ═══════════ const injectHUD = () => { if (document.getElementById('neo-hud')) return; const bar = document.querySelector('.health-ui-bar.clip'); if (!bar) { setTimeout(injectHUD, 500); return; } const style = document.createElement('style'); style.innerHTML = ` #neo-hud{position:fixed;bottom:28px;left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:10px;background:rgba(0,0,0,0.45);border:1px solid rgba(255,255,255,0.08);border-radius:10px;padding:8px 16px;backdrop-filter:blur(6px);z-index:10000;pointer-events:none;} #neo-hud-bar-bg{width:140px;height:5px;background:rgba(255,255,255,0.12);border-radius:3px;overflow:hidden;} #neo-hud-bar-fill{height:100%;border-radius:3px;transition:width .25s ease,background .25s ease;} #neo-hud-val{font-family:'Segoe UI',sans-serif;font-size:11px;font-weight:600;color:rgba(255,255,255,0.75);min-width:24px;text-align:right;letter-spacing:.5px;} `; document.head.appendChild(style); const hud = document.createElement('div'); hud.id = 'neo-hud'; hud.innerHTML = `
100
`; document.body.appendChild(hud); const fill = document.getElementById('neo-hud-bar-fill'); const valEl = document.getElementById('neo-hud-val'); const heart = document.getElementById('neo-hud-heart'); const update = () => { const pct = Math.round(parseFloat(bar.style.width)) || 100; fill.style.width = pct + '%'; valEl.textContent = pct; if (pct>60) { fill.style.background='rgba(220,220,220,0.9)'; heart.setAttribute('fill','rgba(255,255,255,0.7)'); } else if (pct>30) { fill.style.background='rgba(255,200,80,0.9)'; heart.setAttribute('fill','rgba(255,200,80,0.85)'); } else { fill.style.background='rgba(220,60,60,0.9)'; heart.setAttribute('fill','rgba(220,60,60,0.95)'); } }; new MutationObserver(update).observe(bar, { attributes:true, attributeFilter:['style'] }); update(); }; setTimeout(injectHUD, 3000); // ═══════════ UI ═══════════ const toPct = (val,min,max) => Math.round((val-min)/(max-min)*100); const bindLabel = (b) => { if (b === 'rightclick') return 'Clic Droit'; if (b === 'leftclick') return 'Clic Gauche'; if (b === 'middleclick')return 'Clic Milieu'; return b.toUpperCase(); }; const injectUI = () => { if (!document.body) { setTimeout(injectUI, 500); return; } if (document.getElementById('neo-menu')) return; const style = document.createElement('style'); style.innerHTML = ` :root { --vel-accent: ${cfg.uiAccent}; } #neo-crosshair{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);pointer-events:none;z-index:10000;display:flex;align-items:center;justify-content:center;} .ch-part{position:absolute;}.ch-dot{border-radius:50%;}.ch-bar{border-radius:2px;}.ch-circle{border-radius:50%;background:transparent!important;border-style:solid;} #neo-menu{position:fixed;width:370px;max-height:90vh;overflow-y:auto;overflow-x:hidden;background:rgba(20,20,30,0.78);backdrop-filter:blur(15px) saturate(180%);-webkit-backdrop-filter:blur(15px) saturate(180%);border:1px solid rgba(255,255,255,0.15);border-radius:24px;color:white;padding:22px;font-family:'Segoe UI',sans-serif;z-index:10001;box-shadow:0 10px 30px rgba(0,0,0,0.4);user-select:none;display:none;scrollbar-width:none;} #neo-menu.open{display:block;} #neo-menu::-webkit-scrollbar{display:none;} #vel-brand{font-size:11px;font-weight:800;letter-spacing:3px;color:var(--vel-accent);opacity:0.9;text-align:center;margin-bottom:8px;} .neo-tabs{display:flex;gap:6px;margin-bottom:16px;border-bottom:1px solid rgba(255,255,255,0.1);padding-bottom:12px;flex-wrap:wrap;} .neo-tab{background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.12);color:rgba(255,255,255,0.6);border-radius:8px;padding:5px 10px;cursor:pointer;font-size:10px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;transition:.15s;} .neo-tab.active{background:rgba(255,255,255,0.18);color:var(--vel-accent);border-color:var(--vel-accent);} .neo-page{display:none;}.neo-page.active{display:block;} .section-title{font-size:10px;font-weight:700;color:rgba(255,255,255,0.4);letter-spacing:1.5px;text-transform:uppercase;margin:14px 0 8px;padding-bottom:4px;border-bottom:1px dashed rgba(255,255,255,0.1);} .section-title:first-child{margin-top:0;} .control-group{margin-bottom:12px;} .control-group label{font-size:10px;display:block;margin-bottom:5px;color:rgba(255,255,255,0.6);text-transform:uppercase;} .neo-select,.neo-slider,.neo-color{background:rgba(0,0,0,0.3);border:1px solid rgba(255,255,255,0.1);border-radius:12px;color:white;outline:none;padding:5px;} .neo-select,.neo-color{width:100%;} .flex-row{display:flex;justify-content:space-between;align-items:center;} .slider-row{display:flex;align-items:center;gap:8px;margin-top:4px;} .neo-slider{flex:1;} .pct-label{font-size:11px;color:#fff;min-width:36px;text-align:right;font-weight:bold;} .neo-btn-tgl{background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.2);color:white;border-radius:8px;padding:4px 10px;cursor:pointer;font-size:10px;min-width:60px;transition:.2s;} .neo-btn-tgl.active{background:var(--vel-accent);color:#000;font-weight:bold;border-color:var(--vel-accent);} .neo-btn-full{background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.2);color:white;border-radius:10px;padding:8px 14px;cursor:pointer;font-size:11px;font-weight:600;letter-spacing:1px;transition:.2s;width:100%;text-transform:uppercase;} .neo-btn-full:hover{background:rgba(255,255,255,0.18);} .neo-btn-full.danger:hover{background:rgba(220,60,60,0.3);border-color:rgba(220,60,60,0.6);} .neo-btn-bind{background:rgba(80,140,255,0.2);border:1px solid rgba(80,140,255,0.5);color:#aaccff;border-radius:8px;padding:5px 12px;cursor:pointer;font-size:10px;font-weight:600;transition:.2s;font-family:monospace;min-width:110px;} .neo-btn-bind.waiting{background:rgba(255,200,0,0.2);border-color:rgba(255,200,0,0.6);color:#ffdd66;animation:pulse 1s infinite;} @keyframes pulse{0%,100%{opacity:1;}50%{opacity:0.5;}} #neo-drag-bar{cursor:grab;padding-bottom:10px;margin-bottom:10px;border-bottom:1px solid rgba(255,255,255,0.1);} #neo-drag-bar:active{cursor:grabbing;} .aim-key{display:inline-block;background:rgba(255,255,255,0.12);border:1px solid rgba(255,255,255,0.2);border-radius:5px;padding:2px 7px;font-size:10px;margin:0 2px;} .aim-dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:5px;vertical-align:middle;} .info-box{background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.08);border-radius:10px;padding:10px 12px;font-size:10px;color:rgba(255,255,255,0.5);line-height:1.7;text-align:center;margin-top:10px;} `; document.head.appendChild(style); const chContainer = document.createElement('div'); chContainer.id = 'neo-crosshair'; document.body.appendChild(chContainer); menu = document.createElement('div'); menu.id = 'neo-menu'; menu.classList.add('open'); menu.style.left = cfg.menuPos.x + 'px'; menu.style.top = cfg.menuPos.y + 'px'; menu.innerHTML = `
VELTRIXJS
Combat
Visual
Autre
Aimbot
Params
Vitesse
Hauteur de saut
Bunny Hop
Fly
No Clip
Wallhack (ESP)
Zoom (Clic Droit)
Caméra
Sky Mod
X-Ray
ESP Infos
ESP Filtres
Tracers
Radar
Attrape le radar pour le déplacer
Couleur joueurs
Viseur
Crosshair dynamique
Rainbow Crosshair
1 lent · 30 très rapide
Anti-AFK
Aimbot
Touche de visée
Cible
Zone de visée
Lissage (Smooth)
Humanisation
Délai de réaction
FOV Aimbot
Configuration
Apparence
Raccourcis
Overlays
Clique sur un bouton puis appuie sur la touche
`; document.body.appendChild(menu); menu.querySelectorAll('.neo-tab').forEach(tab => { tab.addEventListener('click', () => { menu.querySelectorAll('.neo-tab').forEach(t => t.classList.remove('active')); menu.querySelectorAll('.neo-page').forEach(p => p.classList.remove('active')); tab.classList.add('active'); document.getElementById('page-' + tab.dataset.tab).classList.add('active'); }); }); let lastCHStructure = ''; const updateCH = () => { if (!cfg.chEnabled) { chContainer.innerHTML = ''; lastCHStructure = ''; return; } const { chModel:model, chSize:size, chThick:thickness, chGap:gap } = cfg; let color; if (cfg.chDynamic && chDynamicActive) { color = cfg.chDynamicColor; } else if (cfg.chRainbow) { const speed = cfg.chRainbowSpeed || 5; const hue = (performance.now() / (1000 / speed)) % 360; color = `hsl(${hue}, 100%, 55%)`; } else { color = cfg.chColor; } const structure = `${model}|${size}|${thickness}|${gap}`; if (structure === lastCHStructure && chContainer.children.length > 0) { chContainer.querySelectorAll('.ch-part').forEach(p => { if (p.classList.contains('ch-circle')) { p.style.borderColor = color; } else { p.style.background = color; } }); chContainer.style.width = size + 'px'; chContainer.style.height = size + 'px'; return; } lastCHStructure = structure; chContainer.innerHTML = ''; const half=size/2, tHalf=thickness/2; const create = (w,h,t,l,r=0,c=false) => { const p = document.createElement('div'); p.className = `ch-part ${r?'ch-dot':'ch-bar'} ${c?'ch-circle':''}`; p.style.cssText = `width:${w}px;height:${h}px;top:${t}px;left:${l}px;background:${c?'transparent':color};border-color:${color};border-width:${thickness}px;`; return p; }; if (model==='cross') { chContainer.appendChild(create(thickness,size/2-gap,0,half-tHalf)); chContainer.appendChild(create(thickness,size/2-gap,half+gap,half-tHalf)); chContainer.appendChild(create(size/2-gap,thickness,half-tHalf,0)); chContainer.appendChild(create(size/2-gap,thickness,half-tHalf,half+gap)); } else if (model==='dot') { chContainer.appendChild(create(thickness*2,thickness*2,half-thickness,half-thickness,1)); } else if (model==='circle') { chContainer.appendChild(create(size,size,0,0,1,true)); } else if (model==='box') { const l=size/4; chContainer.appendChild(create(thickness,l,gap,gap)); chContainer.appendChild(create(l,thickness,gap,gap)); chContainer.appendChild(create(thickness,l,gap,size-gap-thickness)); chContainer.appendChild(create(l,thickness,gap,size-gap-l)); chContainer.appendChild(create(thickness,l,size-gap-l,gap)); chContainer.appendChild(create(l,thickness,size-gap-thickness,gap)); chContainer.appendChild(create(thickness,l,size-gap-l,size-gap-thickness)); chContainer.appendChild(create(l,thickness,size-gap-thickness,size-gap-l)); } chContainer.style.width = size + 'px'; chContainer.style.height = size + 'px'; }; window.__veltrixUpdateCH = updateCH; const sliderCfg = { 'val-speed1': { key:'speedV1Value', min:1.0, max:4.0, pct:'pct-speed1' }, 'val-speed2': { key:'speedV2Value', min:0, max:200, pct:'pct-speed2' }, 'val-jump1': { key:'jumpV1Value', min:10, max:150, pct:'pct-jump1' }, 'val-jump2': { key:'jumpV2Value', min:0, max:30, pct:'pct-jump2' }, 'val-zoom': { key:'zoomPower', min:1.1, max:6.0, pct:'pct-zoom' }, 'val-camfov': { key:'camFovValue', min:30, max:140, pct:'pct-camfov' }, 'ch-size': { key:'chSize', min:5, max:80, pct:'pct-size' }, 'ch-gap': { key:'chGap', min:0, max:30, pct:'pct-gap' }, 'ch-thick': { key:'chThick', min:1, max:15, pct:'pct-thick' }, 'val-ch-rainbow-speed': { key:'chRainbowSpeed', min:1, max:30, pct:'pct-ch-rainbow-speed' }, 'val-aim-custom': { key:'aimbotCustomOffset', min:-1, max:2, pct:'pct-aim-custom' }, 'val-aim-smooth': { key:'aimbotSmooth', min:0, max:95, pct:'pct-aim-smooth' }, 'val-aim-human': { key:'aimbotHumanization', min:0, max:100, pct:'pct-aim-human' }, 'val-aim-delay': { key:'aimbotReactionDelay', min:0, max:500, pct:'pct-aim-delay' }, 'val-fov-radius': { key:'fovRadius', min:50, max:500, pct:'pct-fov-radius' }, 'val-radar-size': { key:'radarSize', min:100, max:300, pct:'pct-radar-size' }, 'val-esp-max-dist':{ key:'espMaxDistance', min:10, max:500, pct:'pct-esp-max-dist' }, 'val-xray-alpha': { key:'xrayAlpha', min:0, max:100, pct:'pct-xray-alpha' } }; const updateSliderPct = id => { const sc = sliderCfg[id]; const val = parseFloat(document.getElementById(id).value); if (id === 'val-aim-custom') { const sign = val >= 0 ? '+' : ''; document.getElementById(sc.pct).textContent = sign + val.toFixed(2); return; } if (id === 'val-aim-delay') { document.getElementById(sc.pct).textContent = val + 'ms'; return; } if (id === 'val-esp-max-dist') { document.getElementById(sc.pct).textContent = val + 'm'; return; } if (id === 'val-camfov') { document.getElementById(sc.pct).textContent = val + '°'; return; } if (id === 'val-ch-rainbow-speed') { document.getElementById(sc.pct).textContent = val + 'x'; return; } document.getElementById(sc.pct).textContent = toPct(val, sc.min, sc.max) + '%'; }; refreshAimbotButton = () => { const btn = document.getElementById('bind-aimbot'); if (!btn) return; if (bindingTarget === 'aimbot') { btn.textContent = 'En attente...'; btn.className = 'neo-btn-bind waiting'; } else { btn.textContent = bindLabel(cfg.aimbotBind); btn.className = 'neo-btn-bind'; } }; refreshAllBindButtons = () => { const set = (id, key, target) => { const el = document.getElementById(id); if (!el) return; if (bindingTarget === target) { el.textContent = 'En attente...'; el.className = 'neo-btn-bind waiting'; } else { el.textContent = bindLabel(cfg[key]); el.className = 'neo-btn-bind'; } }; set('bind-menu', 'bindMenu', 'menu'); set('bind-aimbot-toggle', 'bindAimbotToggle', 'aimbotToggle'); set('bind-esp-toggle', 'bindEspToggle', 'espToggle'); set('bind-noclip', 'bindNoClipV2', 'noClipV2'); set('bind-chat', 'bindChat', 'chat'); }; syncUI = () => { const btn = (id, state) => { const el = document.getElementById(id); if (!el) return; el.innerText = state ? 'ACTIF' : 'OFF'; el.className = state ? 'neo-btn-tgl active' : 'neo-btn-tgl'; }; btn('tgl-speed1', cfg.speedV1Enabled); btn('tgl-speed2', cfg.speedV2Enabled); btn('tgl-jump1', cfg.jumpV1Enabled); btn('tgl-jump2', cfg.jumpV2Enabled); btn('tgl-bhop', cfg.bunnyHopEnabled); btn('tgl-fly', cfg.flyEnabled); btn('tgl-noclip1',cfg.noClipV1Enabled); btn('tgl-noclip2',cfg.noClipV2Enabled); btn('tgl-espg', cfg.espGabiEnabled); btn('tgl-espa', cfg.espApolloEnabled); btn('tgl-zoom', cfg.zoomEnabled); btn('tgl-camfov', cfg.camFovEnabled); btn('tgl-sky', cfg.skyEnabled); btn('tgl-xray', cfg.xrayEnabled); btn('tgl-ch', cfg.chEnabled); btn('tgl-afk', cfg.afkEnabled); btn('tgl-aimbot', cfg.aimbotEnabled); btn('tgl-distance', cfg.distanceEnabled); btn('tgl-name', cfg.nameEnabled); btn('tgl-health', cfg.healthEnabled); btn('tgl-tracers',cfg.tracersEnabled); btn('tgl-radar', cfg.radarEnabled); btn('tgl-fov', cfg.fovEnabled); btn('tgl-fov-circle', cfg.fovCircleVisible); btn('tgl-ch-dynamic', cfg.chDynamic); btn('tgl-ch-rainbow', cfg.chRainbow); btn('tgl-debug', cfg.debugEnabled); btn('tgl-watermark', cfg.watermarkEnabled); btn('tgl-binds-overlay', cfg.bindsOverlayEnabled); const wireBtn = document.getElementById('tgl-xray-wire'); if (wireBtn) { wireBtn.innerText = cfg.xrayWireframe ? 'MODE: FILS DE FER' : 'MODE: PLEIN'; wireBtn.className = cfg.xrayWireframe ? 'neo-btn-tgl active' : 'neo-btn-tgl'; } const afkStatus = document.getElementById('afk-status-line'); if (afkStatus) { afkStatus.innerHTML = cfg.afkEnabled ? 'Actif' : 'Inactif'; } document.getElementById('val-speed1').value = cfg.speedV1Value; document.getElementById('val-speed2').value = cfg.speedV2Value; document.getElementById('val-jump1').value = cfg.jumpV1Value; document.getElementById('val-jump2').value = cfg.jumpV2Value; document.getElementById('val-zoom').value = cfg.zoomPower; document.getElementById('val-camfov').value = cfg.camFovValue; document.getElementById('sky-mode').value = cfg.skyMode; document.getElementById('sky-color').value = cfg.skyColor; document.getElementById('ch-model').value = cfg.chModel; document.getElementById('ch-color').value = cfg.chColor; document.getElementById('ch-size').value = cfg.chSize; document.getElementById('ch-gap').value = cfg.chGap; document.getElementById('ch-thick').value = cfg.chThick; document.getElementById('val-ch-rainbow-speed').value = cfg.chRainbowSpeed; document.getElementById('val-xray-alpha').value = Math.round(cfg.xrayAlpha * 100); document.getElementById('esp-ally-color').value = cfg.espAllyColor; document.getElementById('esp-enemy-color').value = cfg.espEnemyColor; document.getElementById('ui-accent').value = cfg.uiAccent; document.getElementById('ch-dynamic-color').value = cfg.chDynamicColor; document.getElementById('aim-zone').value = cfg.aimbotTargetZone; document.getElementById('aim-targeting').value = cfg.aimbotTargeting; document.getElementById('val-aim-custom').value = cfg.aimbotCustomOffset; document.getElementById('val-aim-smooth').value = Math.round(cfg.aimbotSmooth * 100); document.getElementById('val-aim-human').value = cfg.aimbotHumanization; document.getElementById('val-aim-delay').value = cfg.aimbotReactionDelay; document.getElementById('val-fov-radius').value = cfg.fovRadius; document.getElementById('val-radar-size').value = cfg.radarSize; document.getElementById('val-esp-max-dist').value = cfg.espMaxDistance; document.getElementById('esp-team-filter').value = cfg.espTeamFilter; document.getElementById('tracers-origin').value = cfg.tracersOrigin; document.getElementById('aim-custom-group').style.display = cfg.aimbotTargetZone === 'custom' ? 'block' : 'none'; document.getElementById('sky-color').style.display = cfg.skyMode==='custom' ? 'block' : 'none'; Object.keys(sliderCfg).forEach(updateSliderPct); updateCH(); refreshAimbotButton(); refreshAllBindButtons(); updateFovCircle(); updateBindsOverlay(); if (cfg.afkEnabled) resetAfkTimer(); else { clearTimeout(afkTimer); isAFK = false; } }; const bindToggle = (id, key) => { document.getElementById(id).onclick = () => { cfg[key] = !cfg[key]; save(); syncUI(); }; }; bindToggle('tgl-speed1', 'speedV1Enabled'); bindToggle('tgl-speed2', 'speedV2Enabled'); bindToggle('tgl-jump1', 'jumpV1Enabled'); bindToggle('tgl-jump2', 'jumpV2Enabled'); bindToggle('tgl-bhop', 'bunnyHopEnabled'); bindToggle('tgl-fly', 'flyEnabled'); bindToggle('tgl-noclip1','noClipV1Enabled'); bindToggle('tgl-noclip2','noClipV2Enabled'); bindToggle('tgl-espg', 'espGabiEnabled'); bindToggle('tgl-espa', 'espApolloEnabled'); bindToggle('tgl-zoom', 'zoomEnabled'); bindToggle('tgl-camfov', 'camFovEnabled'); bindToggle('tgl-sky', 'skyEnabled'); bindToggle('tgl-xray', 'xrayEnabled'); bindToggle('tgl-ch', 'chEnabled'); bindToggle('tgl-afk', 'afkEnabled'); bindToggle('tgl-aimbot', 'aimbotEnabled'); bindToggle('tgl-distance', 'distanceEnabled'); bindToggle('tgl-name', 'nameEnabled'); bindToggle('tgl-health', 'healthEnabled'); bindToggle('tgl-tracers','tracersEnabled'); bindToggle('tgl-radar', 'radarEnabled'); bindToggle('tgl-fov', 'fovEnabled'); bindToggle('tgl-fov-circle', 'fovCircleVisible'); bindToggle('tgl-ch-dynamic', 'chDynamic'); bindToggle('tgl-ch-rainbow', 'chRainbow'); bindToggle('tgl-debug', 'debugEnabled'); bindToggle('tgl-watermark', 'watermarkEnabled'); bindToggle('tgl-binds-overlay', 'bindsOverlayEnabled'); document.getElementById('tgl-xray-wire').onclick = () => { cfg.xrayWireframe = !cfg.xrayWireframe; save(); syncUI(); }; document.getElementById('bind-aimbot').onclick = () => { bindingTarget = 'aimbot'; refreshAimbotButton(); }; document.getElementById('bind-menu').onclick = () => { bindingTarget = 'menu'; refreshAllBindButtons(); }; document.getElementById('bind-aimbot-toggle').onclick = () => { bindingTarget = 'aimbotToggle'; refreshAllBindButtons(); }; document.getElementById('bind-esp-toggle').onclick = () => { bindingTarget = 'espToggle'; refreshAllBindButtons(); }; document.getElementById('bind-noclip').onclick = () => { bindingTarget = 'noClipV2'; refreshAllBindButtons(); }; document.getElementById('bind-chat').onclick = () => { bindingTarget = 'chat'; refreshAllBindButtons(); }; document.getElementById('sky-mode').onchange = e => { cfg.skyMode = e.target.value; save(); syncUI(); }; document.getElementById('sky-color').oninput = e => { cfg.skyColor = e.target.value; save(); }; document.getElementById('ch-model').onchange = e => { cfg.chModel = e.target.value; save(); updateCH(); }; document.getElementById('ch-color').oninput = e => { cfg.chColor = e.target.value; save(); updateCH(); }; document.getElementById('ch-dynamic-color').oninput = e => { cfg.chDynamicColor = e.target.value; save(); updateCH(); }; document.getElementById('esp-ally-color').oninput = e => { cfg.espAllyColor = e.target.value; save(); }; document.getElementById('esp-enemy-color').oninput = e => { cfg.espEnemyColor = e.target.value; save(); }; document.getElementById('tracers-origin').onchange = e => { cfg.tracersOrigin = e.target.value; save(); }; document.getElementById('ui-accent').oninput = e => { cfg.uiAccent = e.target.value; save(); applyAccent(); }; document.getElementById('aim-zone').onchange = e => { cfg.aimbotTargetZone = e.target.value; save(); syncUI(); }; document.getElementById('aim-targeting').onchange = e => { cfg.aimbotTargeting = e.target.value; save(); }; document.getElementById('esp-team-filter').onchange = e => { cfg.espTeamFilter = e.target.value; save(); }; document.getElementById('cfg-save').onclick = () => { const blob = new Blob([JSON.stringify(cfg, null, 2)], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'veltrixjs-config.json'; a.click(); URL.revokeObjectURL(url); }; document.getElementById('cfg-load').onclick = () => document.getElementById('cfg-file').click(); document.getElementById('cfg-file').onchange = e => { const file = e.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = ev => { try { const loaded = JSON.parse(ev.target.result); cfg = Object.assign({}, defaultConfig, loaded); save(); applyAccent(); syncUI(); applyRadarPosition(); } catch(err) { console.error('Config invalide:', err); } }; reader.readAsText(file); e.target.value = ''; }; document.getElementById('cfg-reset').onclick = () => { cfg = Object.assign({}, defaultConfig); save(); applyAccent(); syncUI(); applyRadarPosition(); }; Object.keys(sliderCfg).forEach(id => { document.getElementById(id).oninput = e => { const val = parseFloat(e.target.value); if (id === 'val-xray-alpha') cfg.xrayAlpha = val / 100; else if (id === 'val-aim-smooth') cfg.aimbotSmooth = val / 100; else cfg[sliderCfg[id].key] = val; save(); updateSliderPct(id); updateCH(); if (id === 'val-fov-radius') updateFovCircle(); }; }); const dragBar = document.getElementById('neo-drag-bar'); let drag=false, ox, oy; dragBar.addEventListener('mousedown', e => { drag=true; ox=e.clientX-menu.offsetLeft; oy=e.clientY-menu.offsetTop; e.preventDefault(); }); document.addEventListener('mousemove', e => { if(!drag)return; menu.style.left=(e.clientX-ox)+'px'; menu.style.top=(e.clientY-oy)+'px'; cfg.menuPos={x:e.clientX-ox,y:e.clientY-oy}; save(); }); document.addEventListener('mouseup', () => { drag=false; }); document.addEventListener('click', e => { if (menu && !menu.contains(e.target)) { if (document.activeElement && document.activeElement !== document.body && document.activeElement.tagName !== 'CANVAS') { document.activeElement.blur(); } } }); syncUI(); }; let uiAttempts = 0; const tryInject = () => { if (uiAttempts < 30) { injectUI(); if (!document.getElementById('neo-menu')) { uiAttempts++; setTimeout(tryInject, 500); } } }; tryInject(); const waitForBodyAndInit = () => { if (!document.body) { setTimeout(waitForBodyAndInit, 300); return; } initRadar(); initDebugOverlay(); initWatermark(); initBindsOverlay(); }; waitForBodyAndInit(); })();