Size
13.5 KB
Version
1.1.1
Created
Feb 2, 2026
Updated
2 days ago
1// ==UserScript==
2// @name Veck.io Aimbot & ESP
3// @description Aimbot and ESP features for veck.io FPS game
4// @version 1.1.1
5// @match https://*.veck.io/*
6// @icon https://veck.io/favicon/favicon.ico
7// @grant GM.getValue
8// @grant GM.setValue
9// ==/UserScript==
10(function() {
11 'use strict';
12
13 console.log('[Veck.io Aimbot] Extension loaded');
14
15 // Configuration
16 let config = {
17 espEnabled: true,
18 aimbotEnabled: true,
19 espColor: '#00ff00',
20 espBoxColor: '#ff0000',
21 aimbotFOV: 200,
22 aimbotSmoothing: 0.3,
23 showFOVCircle: true
24 };
25
26 // Game state
27 let players = [];
28 let localPlayer = null;
29 let canvas = null;
30 let overlayCanvas = null;
31 let ctx = null;
32
33 // Initialize
34 async function init() {
35 console.log('[Veck.io Aimbot] Initializing...');
36
37 // Load saved config
38 const savedConfig = await GM.getValue('veckio_config', null);
39 if (savedConfig) {
40 config = { ...config, ...JSON.parse(savedConfig) };
41 }
42
43 // Wait for game canvas
44 waitForCanvas();
45
46 // Create overlay
47 createOverlay();
48
49 // Create control panel
50 createControlPanel();
51
52 // Hook into Unity game
53 hookUnityGame();
54
55 // Start render loop
56 requestAnimationFrame(renderLoop);
57
58 console.log('[Veck.io Aimbot] Initialized successfully');
59 }
60
61 function waitForCanvas() {
62 const checkCanvas = setInterval(() => {
63 canvas = document.querySelector('#unity-canvas');
64 if (canvas) {
65 console.log('[Veck.io Aimbot] Game canvas found');
66 clearInterval(checkCanvas);
67 }
68 }, 1000);
69 }
70
71 function createOverlay() {
72 // Create overlay canvas
73 overlayCanvas = document.createElement('canvas');
74 overlayCanvas.id = 'veckio-overlay';
75 overlayCanvas.style.cssText = `
76 position: absolute;
77 top: 0;
78 left: 0;
79 width: 100%;
80 height: 100%;
81 pointer-events: none;
82 z-index: 9999;
83 `;
84
85 const container = document.querySelector('#unity-container');
86 if (container) {
87 container.style.position = 'relative';
88 container.appendChild(overlayCanvas);
89
90 // Match canvas size
91 const resizeObserver = new ResizeObserver(() => {
92 if (canvas) {
93 overlayCanvas.width = canvas.width;
94 overlayCanvas.height = canvas.height;
95 }
96 });
97 resizeObserver.observe(container);
98
99 ctx = overlayCanvas.getContext('2d');
100 console.log('[Veck.io Aimbot] Overlay created');
101 }
102 }
103
104 function createControlPanel() {
105 const panel = document.createElement('div');
106 panel.id = 'veckio-control-panel';
107 panel.innerHTML = `
108 <div style="background: rgba(0, 0, 0, 0.9); color: white; padding: 15px; border-radius: 8px; font-family: Arial; font-size: 12px; min-width: 200px;">
109 <h3 style="margin: 0 0 10px 0; font-size: 14px; color: #00ff00;">Veck.io Aimbot & ESP</h3>
110 <div style="margin-bottom: 8px;">
111 <label style="display: flex; align-items: center; cursor: pointer;">
112 <input type="checkbox" id="esp-toggle" ${config.espEnabled ? 'checked' : ''} style="margin-right: 8px;">
113 <span>ESP (Wallhack) [G]</span>
114 </label>
115 </div>
116 <div style="margin-bottom: 8px;">
117 <label style="display: flex; align-items: center; cursor: pointer;">
118 <input type="checkbox" id="aimbot-toggle" ${config.aimbotEnabled ? 'checked' : ''} style="margin-right: 8px;">
119 <span>Aimbot [H]</span>
120 </label>
121 </div>
122 <div style="margin-bottom: 8px;">
123 <label style="display: flex; align-items: center; cursor: pointer;">
124 <input type="checkbox" id="fov-toggle" ${config.showFOVCircle ? 'checked' : ''} style="margin-right: 8px;">
125 <span>Show FOV Circle</span>
126 </label>
127 </div>
128 <div style="margin-bottom: 8px;">
129 <label style="display: block; margin-bottom: 4px;">Aimbot FOV: <span id="fov-value">${config.aimbotFOV}</span></label>
130 <input type="range" id="fov-slider" min="50" max="500" value="${config.aimbotFOV}" style="width: 100%;">
131 </div>
132 <div style="margin-bottom: 8px;">
133 <label style="display: block; margin-bottom: 4px;">Smoothing: <span id="smooth-value">${config.aimbotSmoothing}</span></label>
134 <input type="range" id="smooth-slider" min="0.1" max="1" step="0.1" value="${config.aimbotSmoothing}" style="width: 100%;">
135 </div>
136 <div style="margin-top: 10px; padding-top: 10px; border-top: 1px solid #333; font-size: 10px; color: #888;">
137 <div>Players detected: <span id="player-count" style="color: #00ff00;">0</span></div>
138 </div>
139 </div>
140 `;
141 panel.style.cssText = `
142 position: fixed;
143 top: 20px;
144 right: 20px;
145 z-index: 10000;
146 pointer-events: auto;
147 `;
148 document.body.appendChild(panel);
149
150 // Event listeners
151 document.getElementById('esp-toggle').addEventListener('change', async (e) => {
152 config.espEnabled = e.target.checked;
153 await saveConfig();
154 });
155
156 document.getElementById('aimbot-toggle').addEventListener('change', async (e) => {
157 config.aimbotEnabled = e.target.checked;
158 await saveConfig();
159 });
160
161 document.getElementById('fov-toggle').addEventListener('change', async (e) => {
162 config.showFOVCircle = e.target.checked;
163 await saveConfig();
164 });
165
166 document.getElementById('fov-slider').addEventListener('input', async (e) => {
167 config.aimbotFOV = parseInt(e.target.value);
168 document.getElementById('fov-value').textContent = config.aimbotFOV;
169 await saveConfig();
170 });
171
172 document.getElementById('smooth-slider').addEventListener('input', async (e) => {
173 config.aimbotSmoothing = parseFloat(e.target.value);
174 document.getElementById('smooth-value').textContent = config.aimbotSmoothing;
175 await saveConfig();
176 });
177
178 // Keyboard shortcuts
179 document.addEventListener('keydown', async (e) => {
180 if (e.key === 'g' || e.key === 'G') {
181 e.preventDefault();
182 config.espEnabled = !config.espEnabled;
183 document.getElementById('esp-toggle').checked = config.espEnabled;
184 await saveConfig();
185 console.log('[Veck.io Aimbot] ESP:', config.espEnabled ? 'ON' : 'OFF');
186 } else if (e.key === 'h' || e.key === 'H') {
187 e.preventDefault();
188 config.aimbotEnabled = !config.aimbotEnabled;
189 document.getElementById('aimbot-toggle').checked = config.aimbotEnabled;
190 await saveConfig();
191 console.log('[Veck.io Aimbot] Aimbot:', config.aimbotEnabled ? 'ON' : 'OFF');
192 }
193 });
194
195 console.log('[Veck.io Aimbot] Control panel created');
196 }
197
198 async function saveConfig() {
199 await GM.setValue('veckio_config', JSON.stringify(config));
200 }
201
202 function hookUnityGame() {
203 // Hook into Unity's WebGL memory to find player data
204 // This is a simplified version - real implementation would need to reverse engineer the game
205 console.log('[Veck.io Aimbot] Hooking into Unity game...');
206
207 // Simulate player detection for demonstration
208 setInterval(() => {
209 // In a real implementation, this would read from Unity's memory
210 // For now, we'll create mock players for testing
211 players = generateMockPlayers();
212 updatePlayerCount();
213 }, 100);
214 }
215
216 function generateMockPlayers() {
217 // Mock player data for testing
218 // In production, this would come from Unity memory
219 const mockPlayers = [];
220 const numPlayers = Math.floor(Math.random() * 5) + 2;
221
222 for (let i = 0; i < numPlayers; i++) {
223 mockPlayers.push({
224 id: i,
225 name: `Player${i}`,
226 position: {
227 x: Math.random() * (overlayCanvas?.width || 800),
228 y: Math.random() * (overlayCanvas?.height || 600),
229 z: Math.random() * 100
230 },
231 health: Math.random() * 100,
232 isEnemy: true,
233 distance: Math.random() * 100
234 });
235 }
236
237 return mockPlayers;
238 }
239
240 function updatePlayerCount() {
241 const countElement = document.getElementById('player-count');
242 if (countElement) {
243 countElement.textContent = players.length;
244 }
245 }
246
247 function renderLoop() {
248 if (!ctx || !overlayCanvas) {
249 requestAnimationFrame(renderLoop);
250 return;
251 }
252
253 // Clear canvas
254 ctx.clearRect(0, 0, overlayCanvas.width, overlayCanvas.height);
255
256 // Draw FOV circle
257 if (config.showFOVCircle && config.aimbotEnabled) {
258 drawFOVCircle();
259 }
260
261 // Draw ESP
262 if (config.espEnabled) {
263 drawESP();
264 }
265
266 // Process aimbot
267 if (config.aimbotEnabled) {
268 processAimbot();
269 }
270
271 requestAnimationFrame(renderLoop);
272 }
273
274 function drawFOVCircle() {
275 const centerX = overlayCanvas.width / 2;
276 const centerY = overlayCanvas.height / 2;
277
278 ctx.beginPath();
279 ctx.arc(centerX, centerY, config.aimbotFOV, 0, Math.PI * 2);
280 ctx.strokeStyle = 'rgba(255, 255, 255, 0.3)';
281 ctx.lineWidth = 2;
282 ctx.stroke();
283
284 // Draw crosshair
285 ctx.beginPath();
286 ctx.moveTo(centerX - 10, centerY);
287 ctx.lineTo(centerX + 10, centerY);
288 ctx.moveTo(centerX, centerY - 10);
289 ctx.lineTo(centerX, centerY + 10);
290 ctx.strokeStyle = 'rgba(0, 255, 0, 0.8)';
291 ctx.lineWidth = 2;
292 ctx.stroke();
293 }
294
295 function drawESP() {
296 players.forEach(player => {
297 if (!player.isEnemy) return;
298
299 const x = player.position.x;
300 const y = player.position.y;
301 const width = 40;
302 const height = 60;
303
304 // Draw box
305 ctx.strokeStyle = config.espBoxColor;
306 ctx.lineWidth = 2;
307 ctx.strokeRect(x - width/2, y - height/2, width, height);
308
309 // Draw health bar
310 const healthBarWidth = width;
311 const healthBarHeight = 5;
312 const healthPercent = player.health / 100;
313
314 ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';
315 ctx.fillRect(x - healthBarWidth/2, y - height/2 - 10, healthBarWidth, healthBarHeight);
316
317 ctx.fillStyle = healthPercent > 0.5 ? '#00ff00' : healthPercent > 0.25 ? '#ffff00' : '#ff0000';
318 ctx.fillRect(x - healthBarWidth/2, y - height/2 - 10, healthBarWidth * healthPercent, healthBarHeight);
319
320 // Draw name and distance
321 ctx.font = '12px Arial';
322 ctx.fillStyle = config.espColor;
323 ctx.textAlign = 'center';
324 ctx.fillText(player.name, x, y - height/2 - 15);
325 ctx.fillText(`${Math.floor(player.distance)}m`, x, y + height/2 + 15);
326
327 // Draw line to player
328 ctx.beginPath();
329 ctx.moveTo(overlayCanvas.width / 2, overlayCanvas.height);
330 ctx.lineTo(x, y);
331 ctx.strokeStyle = 'rgba(0, 255, 0, 0.3)';
332 ctx.lineWidth = 1;
333 ctx.stroke();
334 });
335 }
336
337 function processAimbot() {
338 const centerX = overlayCanvas.width / 2;
339 const centerY = overlayCanvas.height / 2;
340
341 let closestPlayer = null;
342 let closestDistance = Infinity;
343
344 // Find closest player within FOV
345 players.forEach(player => {
346 if (!player.isEnemy) return;
347
348 const dx = player.position.x - centerX;
349 const dy = player.position.y - centerY;
350 const distance = Math.sqrt(dx * dx + dy * dy);
351
352 if (distance < config.aimbotFOV && distance < closestDistance) {
353 closestDistance = distance;
354 closestPlayer = player;
355 }
356 });
357
358 // Aim at closest player
359 if (closestPlayer) {
360 const targetX = closestPlayer.position.x;
361 const targetY = closestPlayer.position.y;
362
363 // Draw target indicator
364 ctx.beginPath();
365 ctx.arc(targetX, targetY, 20, 0, Math.PI * 2);
366 ctx.strokeStyle = 'rgba(255, 0, 0, 0.8)';
367 ctx.lineWidth = 3;
368 ctx.stroke();
369
370 // In a real implementation, this would move the mouse/camera
371 // For Unity games, you'd need to hook into the camera rotation
372 console.log(`[Veck.io Aimbot] Targeting ${closestPlayer.name} at distance ${Math.floor(closestDistance)}px`);
373 }
374 }
375
376 // Start the extension
377 if (document.readyState === 'loading') {
378 document.addEventListener('DOMContentLoaded', init);
379 } else {
380 init();
381 }
382
383})();