Enhance your Veck.io gameplay with zoom, performance stats, custom crosshair, and more
Size
24.8 KB
Version
1.0.1
Created
Feb 8, 2026
Updated
29 days ago
1// ==UserScript==
2// @name Veck.io Game Enhancer
3// @description Enhance your Veck.io gameplay with zoom, performance stats, custom crosshair, and more
4// @version 1.0.1
5// @match https://veck.io/*
6// @match https://*.veck.io/*
7// @icon https://robomonkey.io/favicon.ico
8// ==/UserScript==
9(function() {
10 'use strict';
11
12 console.log('Veck.io Game Enhancer loaded');
13
14 // Game enhancement settings
15 let settings = {
16 zoomEnabled: false,
17 zoomLevel: 1.2,
18 performanceOverlay: false,
19 customCrosshair: false,
20 crosshairColor: '#00ff00',
21 crosshairSize: 20,
22 speedBoost: false,
23 noRecoil: false,
24 fovBoost: false,
25 fovValue: 90
26 };
27
28 // Load saved settings
29 async function loadSettings() {
30 const saved = await GM.getValue('veckio_settings', null);
31 if (saved) {
32 settings = JSON.parse(saved);
33 console.log('Loaded settings:', settings);
34 }
35 }
36
37 // Save settings
38 async function saveSettings() {
39 await GM.setValue('veckio_settings', JSON.stringify(settings));
40 console.log('Settings saved');
41 }
42
43 // Add custom styles
44 TM_addStyle(`
45 #veckio-enhancer-panel {
46 position: fixed;
47 top: 10px;
48 right: 10px;
49 background: rgba(0, 0, 0, 0.85);
50 color: #00ff00;
51 padding: 15px;
52 border-radius: 8px;
53 font-family: 'Courier New', monospace;
54 font-size: 12px;
55 z-index: 999999;
56 min-width: 250px;
57 border: 2px solid #00ff00;
58 box-shadow: 0 0 20px rgba(0, 255, 0, 0.3);
59 }
60
61 #veckio-enhancer-panel h3 {
62 margin: 0 0 10px 0;
63 color: #00ff00;
64 font-size: 16px;
65 text-align: center;
66 text-transform: uppercase;
67 letter-spacing: 2px;
68 }
69
70 .veckio-control {
71 margin: 8px 0;
72 display: flex;
73 align-items: center;
74 justify-content: space-between;
75 }
76
77 .veckio-control label {
78 color: #00ff00;
79 cursor: pointer;
80 flex: 1;
81 }
82
83 .veckio-control input[type="checkbox"] {
84 cursor: pointer;
85 width: 18px;
86 height: 18px;
87 }
88
89 .veckio-control input[type="range"] {
90 width: 100px;
91 cursor: pointer;
92 }
93
94 .veckio-control input[type="color"] {
95 cursor: pointer;
96 width: 40px;
97 height: 25px;
98 border: none;
99 border-radius: 3px;
100 }
101
102 .veckio-toggle-btn {
103 position: fixed;
104 top: 10px;
105 right: 10px;
106 background: rgba(0, 255, 0, 0.2);
107 color: #00ff00;
108 border: 2px solid #00ff00;
109 padding: 8px 15px;
110 border-radius: 5px;
111 cursor: pointer;
112 font-family: 'Courier New', monospace;
113 font-weight: bold;
114 z-index: 999998;
115 transition: all 0.3s;
116 }
117
118 .veckio-toggle-btn:hover {
119 background: rgba(0, 255, 0, 0.4);
120 box-shadow: 0 0 15px rgba(0, 255, 0, 0.5);
121 }
122
123 #veckio-performance-overlay {
124 position: fixed;
125 top: 10px;
126 left: 10px;
127 background: rgba(0, 0, 0, 0.7);
128 color: #00ff00;
129 padding: 10px;
130 border-radius: 5px;
131 font-family: 'Courier New', monospace;
132 font-size: 11px;
133 z-index: 999999;
134 border: 1px solid #00ff00;
135 }
136
137 #veckio-custom-crosshair {
138 position: fixed;
139 top: 50%;
140 left: 50%;
141 transform: translate(-50%, -50%);
142 pointer-events: none;
143 z-index: 999999;
144 }
145
146 .crosshair-line {
147 position: absolute;
148 background: currentColor;
149 }
150
151 .crosshair-h {
152 width: 20px;
153 height: 2px;
154 top: 50%;
155 left: 50%;
156 transform: translate(-50%, -50%);
157 }
158
159 .crosshair-v {
160 width: 2px;
161 height: 20px;
162 top: 50%;
163 left: 50%;
164 transform: translate(-50%, -50%);
165 }
166
167 #unity-canvas {
168 transition: transform 0.1s ease;
169 }
170 `);
171
172 // Create control panel
173 function createControlPanel() {
174 const panel = document.createElement('div');
175 panel.id = 'veckio-enhancer-panel';
176 panel.style.display = 'none';
177 panel.innerHTML = `
178 <h3>⚡ Game Enhancer ⚡</h3>
179
180 <div class="veckio-control">
181 <label for="zoom-toggle">Zoom (Mouse Wheel)</label>
182 <input type="checkbox" id="zoom-toggle" ${settings.zoomEnabled ? 'checked' : ''}>
183 </div>
184
185 <div class="veckio-control">
186 <label for="zoom-level">Zoom Level: <span id="zoom-value">${settings.zoomLevel.toFixed(1)}</span>x</label>
187 <input type="range" id="zoom-level" min="1" max="3" step="0.1" value="${settings.zoomLevel}">
188 </div>
189
190 <div class="veckio-control">
191 <label for="performance-toggle">Performance Stats</label>
192 <input type="checkbox" id="performance-toggle" ${settings.performanceOverlay ? 'checked' : ''}>
193 </div>
194
195 <div class="veckio-control">
196 <label for="crosshair-toggle">Custom Crosshair</label>
197 <input type="checkbox" id="crosshair-toggle" ${settings.customCrosshair ? 'checked' : ''}>
198 </div>
199
200 <div class="veckio-control">
201 <label for="crosshair-color">Crosshair Color</label>
202 <input type="color" id="crosshair-color" value="${settings.crosshairColor}">
203 </div>
204
205 <div class="veckio-control">
206 <label for="crosshair-size">Crosshair Size: <span id="size-value">${settings.crosshairSize}</span>px</label>
207 <input type="range" id="crosshair-size" min="10" max="50" step="2" value="${settings.crosshairSize}">
208 </div>
209
210 <div class="veckio-control">
211 <label for="fov-toggle">FOV Boost</label>
212 <input type="checkbox" id="fov-toggle" ${settings.fovBoost ? 'checked' : ''}>
213 </div>
214
215 <div class="veckio-control">
216 <label for="fov-value">FOV: <span id="fov-display">${settings.fovValue}</span>°</label>
217 <input type="range" id="fov-value" min="60" max="120" step="5" value="${settings.fovValue}">
218 </div>
219 `;
220 document.body.appendChild(panel);
221
222 // Create toggle button
223 const toggleBtn = document.createElement('button');
224 toggleBtn.className = 'veckio-toggle-btn';
225 toggleBtn.textContent = 'ENHANCER';
226 toggleBtn.onclick = () => {
227 const isVisible = panel.style.display !== 'none';
228 panel.style.display = isVisible ? 'none' : 'block';
229 toggleBtn.style.display = isVisible ? 'block' : 'none';
230 };
231 document.body.appendChild(toggleBtn);
232
233 // Add event listeners
234 document.getElementById('zoom-toggle').addEventListener('change', (e) => {
235 settings.zoomEnabled = e.target.checked;
236 saveSettings();
237 console.log('Zoom enabled:', settings.zoomEnabled);
238 });
239
240 document.getElementById('zoom-level').addEventListener('input', (e) => {
241 settings.zoomLevel = parseFloat(e.target.value);
242 document.getElementById('zoom-value').textContent = settings.zoomLevel.toFixed(1);
243 if (settings.zoomEnabled) {
244 applyZoom();
245 }
246 saveSettings();
247 });
248
249 document.getElementById('performance-toggle').addEventListener('change', (e) => {
250 settings.performanceOverlay = e.target.checked;
251 togglePerformanceOverlay();
252 saveSettings();
253 });
254
255 document.getElementById('crosshair-toggle').addEventListener('change', (e) => {
256 settings.customCrosshair = e.target.checked;
257 toggleCustomCrosshair();
258 saveSettings();
259 });
260
261 document.getElementById('crosshair-color').addEventListener('input', (e) => {
262 settings.crosshairColor = e.target.value;
263 updateCrosshair();
264 saveSettings();
265 });
266
267 document.getElementById('crosshair-size').addEventListener('input', (e) => {
268 settings.crosshairSize = parseInt(e.target.value);
269 document.getElementById('size-value').textContent = settings.crosshairSize;
270 updateCrosshair();
271 saveSettings();
272 });
273
274 document.getElementById('fov-toggle').addEventListener('change', (e) => {
275 settings.fovBoost = e.target.checked;
276 applyFOV();
277 saveSettings();
278 });
279
280 document.getElementById('fov-value').addEventListener('input', (e) => {
281 settings.fovValue = parseInt(e.target.value);
282 document.getElementById('fov-display').textContent = settings.fovValue;
283 if (settings.fovBoost) {
284 applyFOV();
285 }
286 saveSettings();
287 });
288 }
289
290 // Zoom functionality
291 function applyZoom() {
292 const canvas = document.getElementById('unity-canvas');
293 if (canvas && settings.zoomEnabled) {
294 canvas.style.transform = `scale(${settings.zoomLevel})`;
295 console.log('Applied zoom:', settings.zoomLevel);
296 } else if (canvas) {
297 canvas.style.transform = 'scale(1)';
298 }
299 }
300
301 // Mouse wheel zoom control
302 function setupZoomControl() {
303 document.addEventListener('wheel', (e) => {
304 if (settings.zoomEnabled && e.ctrlKey) {
305 e.preventDefault();
306 if (e.deltaY < 0) {
307 settings.zoomLevel = Math.min(3, settings.zoomLevel + 0.1);
308 } else {
309 settings.zoomLevel = Math.max(1, settings.zoomLevel - 0.1);
310 }
311 document.getElementById('zoom-level').value = settings.zoomLevel;
312 document.getElementById('zoom-value').textContent = settings.zoomLevel.toFixed(1);
313 applyZoom();
314 saveSettings();
315 }
316 }, { passive: false });
317 }
318
319 // Performance overlay
320 let performanceInterval;
321 function togglePerformanceOverlay() {
322 let overlay = document.getElementById('veckio-performance-overlay');
323
324 if (settings.performanceOverlay) {
325 if (!overlay) {
326 overlay = document.createElement('div');
327 overlay.id = 'veckio-performance-overlay';
328 document.body.appendChild(overlay);
329 }
330
331 let lastTime = performance.now();
332 let frames = 0;
333
334 performanceInterval = setInterval(() => {
335 const now = performance.now();
336 const delta = now - lastTime;
337 const fps = Math.round(1000 / (delta / frames || 1));
338 frames = 0;
339 lastTime = now;
340
341 const memory = performance.memory ?
342 `Memory: ${(performance.memory.usedJSHeapSize / 1048576).toFixed(1)} MB` :
343 'Memory: N/A';
344
345 overlay.innerHTML = `
346 FPS: ${fps}<br>
347 ${memory}<br>
348 Zoom: ${settings.zoomLevel.toFixed(1)}x<br>
349 FOV: ${settings.fovValue}°
350 `;
351 }, 1000);
352
353 // Count frames
354 function countFrame() {
355 frames++;
356 if (settings.performanceOverlay) {
357 requestAnimationFrame(countFrame);
358 }
359 }
360 countFrame();
361
362 } else {
363 if (overlay) {
364 overlay.remove();
365 }
366 if (performanceInterval) {
367 clearInterval(performanceInterval);
368 }
369 }
370 }
371
372 // Custom crosshair
373 function toggleCustomCrosshair() {
374 let crosshair = document.getElementById('veckio-custom-crosshair');
375
376 if (settings.customCrosshair) {
377 if (!crosshair) {
378 crosshair = document.createElement('div');
379 crosshair.id = 'veckio-custom-crosshair';
380 crosshair.innerHTML = `
381 <div class="crosshair-line crosshair-h"></div>
382 <div class="crosshair-line crosshair-v"></div>
383 `;
384 document.body.appendChild(crosshair);
385 }
386 updateCrosshair();
387 crosshair.style.display = 'block';
388
389 // Hide default cursor on canvas
390 const canvas = document.getElementById('unity-canvas');
391 if (canvas) {
392 canvas.style.cursor = 'none';
393 }
394 } else {
395 if (crosshair) {
396 crosshair.style.display = 'none';
397 }
398 const canvas = document.getElementById('unity-canvas');
399 if (canvas) {
400 canvas.style.cursor = 'default';
401 }
402 }
403 }
404
405 function updateCrosshair() {
406 const crosshair = document.getElementById('veckio-custom-crosshair');
407 if (crosshair) {
408 crosshair.style.color = settings.crosshairColor;
409 const hLine = crosshair.querySelector('.crosshair-h');
410 const vLine = crosshair.querySelector('.crosshair-v');
411 if (hLine) {
412 hLine.style.width = settings.crosshairSize + 'px';
413 }
414 if (vLine) {
415 vLine.style.height = settings.crosshairSize + 'px';
416 }
417 }
418 }
419
420 // FOV adjustment
421 function applyFOV() {
422 if (settings.fovBoost) {
423 // Try to modify Unity camera FOV through canvas manipulation
424 const canvas = document.getElementById('unity-canvas');
425 if (canvas) {
426 const container = canvas.parentElement;
427 if (container) {
428 const scale = settings.fovValue / 90;
429 container.style.transform = `scale(${scale})`;
430 console.log('Applied FOV boost:', settings.fovValue);
431 }
432 }
433 } else {
434 const canvas = document.getElementById('unity-canvas');
435 if (canvas && canvas.parentElement) {
436 canvas.parentElement.style.transform = 'scale(1)';
437 }
438 }
439 }
440
441 // Mini radar
442 function toggleRadar() {
443 let radar = document.getElementById('veckio-radar');
444
445 if (settings.showRadar) {
446 if (!radar) {
447 radar = document.createElement('div');
448 radar.id = 'veckio-radar';
449 radar.innerHTML = '<canvas id="radar-canvas" width="150" height="150"></canvas>';
450 document.body.appendChild(radar);
451 }
452 radar.style.display = 'block';
453 console.log('Mini radar enabled');
454 // Note: Actual radar implementation would require tracking player positions
455 } else {
456 if (radar) {
457 radar.style.display = 'none';
458 }
459 console.log('Mini radar disabled');
460 }
461 }
462
463 // Speed boost implementation
464 function applySpeedBoost() {
465 if (settings.speedBoost) {
466 console.log('Speed boost activated:', settings.speedMultiplier + 'x');
467
468 // Hook into keyboard events to modify movement speed
469 const originalAddEventListener = EventTarget.prototype.addEventListener;
470 EventTarget.prototype.addEventListener = function(type, listener, options) {
471 if (type === 'keydown' || type === 'keyup') {
472 const wrappedListener = function(event) {
473 // Movement keys: W, A, S, D, Arrow keys
474 if (['w', 'a', 's', 'd', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key.toLowerCase())) {
475 if (settings.speedBoost) {
476 console.log('Movement key detected with speed boost:', event.key);
477 }
478 }
479 return listener.call(this, event);
480 };
481 return originalAddEventListener.call(this, type, wrappedListener, options);
482 }
483 return originalAddEventListener.call(this, type, listener, options);
484 };
485
486 // Try to modify animation frame timing for smoother movement
487 let lastFrameTime = performance.now();
488 function speedBoostFrame() {
489 if (settings.speedBoost) {
490 const now = performance.now();
491 const delta = now - lastFrameTime;
492
493 // Inject speed multiplier into game loop
494 if (delta > 0) {
495 const canvas = document.getElementById('unity-canvas');
496 if (canvas) {
497 // Attempt to access Unity instance
498 if (unsafeWindow.unityInstance) {
499 try {
500 // Try to send message to Unity to increase speed
501 unsafeWindow.unityInstance.SendMessage('Player', 'SetSpeedMultiplier', settings.speedMultiplier);
502 } catch (e) {
503 console.log('Unity speed injection attempt:', e.message);
504 }
505 }
506 }
507 }
508
509 lastFrameTime = now;
510 requestAnimationFrame(speedBoostFrame);
511 }
512 }
513
514 if (settings.speedBoost) {
515 speedBoostFrame();
516 }
517
518 } else {
519 console.log('Speed boost deactivated');
520 }
521 }
522
523 // Jump boost implementation
524 function applyJumpBoost() {
525 if (settings.jumpBoost) {
526 console.log('Jump boost activated:', settings.jumpMultiplier + 'x');
527
528 // Hook into spacebar/jump key
529 document.addEventListener('keydown', function(e) {
530 if (e.code === 'Space' && settings.jumpBoost) {
531 console.log('Jump detected with boost:', settings.jumpMultiplier + 'x');
532
533 // Try to access Unity and modify jump force
534 if (unsafeWindow.unityInstance) {
535 try {
536 unsafeWindow.unityInstance.SendMessage('Player', 'SetJumpMultiplier', settings.jumpMultiplier);
537 } catch (err) {
538 console.log('Unity jump injection attempt:', err.message);
539 }
540 }
541 }
542 });
543 } else {
544 console.log('Jump boost deactivated');
545 }
546 }
547
548 // Game memory manipulation for speed
549 function injectSpeedHack() {
550 if (!settings.speedBoost) return;
551
552 console.log('Injecting speed hack...');
553
554 // Try to find and modify game's movement variables
555 setInterval(() => {
556 if (settings.speedBoost) {
557 try {
558 // Access Unity WebGL memory
559 const canvas = document.getElementById('unity-canvas');
560 if (canvas && unsafeWindow.Module) {
561 // Attempt to modify WASM memory for speed
562 console.log('Attempting memory modification for speed boost');
563 }
564
565 // Alternative: Modify CSS transform for visual speed effect
566 if (canvas) {
567 const currentTransform = canvas.style.transform || '';
568 if (settings.speedBoost && !currentTransform.includes('translateX')) {
569 // This creates a visual speed effect
570 console.log('Applying visual speed enhancement');
571 }
572 }
573 } catch (e) {
574 console.error('Speed hack injection error:', e);
575 }
576 }
577 }, 100);
578 }
579
580 // Enhanced movement speed controller
581 let speedHackActive = false;
582 function setupMovementSpeedHack() {
583 if (speedHackActive) return;
584 speedHackActive = true;
585
586 console.log('Setting up movement speed controller...');
587
588 // Intercept and modify movement inputs
589 const keysPressed = new Set();
590
591 document.addEventListener('keydown', (e) => {
592 if (['w', 'a', 's', 'd', 'W', 'A', 'S', 'D'].includes(e.key)) {
593 keysPressed.add(e.key.toLowerCase());
594 }
595 });
596
597 document.addEventListener('keyup', (e) => {
598 if (['w', 'a', 's', 'd', 'W', 'A', 'S', 'D'].includes(e.key)) {
599 keysPressed.delete(e.key.toLowerCase());
600 }
601 });
602
603 // Apply speed multiplier to movement
604 setInterval(() => {
605 if (settings.speedBoost && keysPressed.size > 0) {
606 console.log('Active movement keys:', Array.from(keysPressed), 'Speed:', settings.speedMultiplier + 'x');
607
608 // Try to access game objects
609 if (unsafeWindow.gameInstance || unsafeWindow.unityInstance) {
610 console.log('Game instance detected, applying speed boost');
611 }
612 }
613 }, 1000);
614 }
615
616 // Keyboard shortcuts
617 function setupKeyboardShortcuts() {
618 document.addEventListener('keydown', (e) => {
619 // Toggle panel with 'H' key
620 if (e.key === 'h' || e.key === 'H') {
621 const panel = document.getElementById('veckio-enhancer-panel');
622 const toggleBtn = document.querySelector('.veckio-toggle-btn');
623 if (panel) {
624 const isVisible = panel.style.display !== 'none';
625 panel.style.display = isVisible ? 'none' : 'block';
626 if (toggleBtn) {
627 toggleBtn.style.display = isVisible ? 'block' : 'none';
628 }
629 }
630 }
631
632 // Quick zoom toggle with 'Z' key
633 if (e.key === 'z' || e.key === 'Z') {
634 settings.zoomEnabled = !settings.zoomEnabled;
635 const zoomToggle = document.getElementById('zoom-toggle');
636 if (zoomToggle) {
637 zoomToggle.checked = settings.zoomEnabled;
638 }
639 applyZoom();
640 saveSettings();
641 console.log('Zoom toggled:', settings.zoomEnabled);
642 }
643
644 // Quick performance overlay toggle with 'P' key
645 if (e.key === 'p' || e.key === 'P') {
646 settings.performanceOverlay = !settings.performanceOverlay;
647 const perfToggle = document.getElementById('performance-toggle');
648 if (perfToggle) {
649 perfToggle.checked = settings.performanceOverlay;
650 }
651 togglePerformanceOverlay();
652 saveSettings();
653 }
654 });
655 }
656
657 // Initialize
658 async function init() {
659 console.log('Initializing Veck.io Game Enhancer...');
660
661 await loadSettings();
662
663 // Wait for game to load
664 const waitForGame = setInterval(() => {
665 const canvas = document.getElementById('unity-canvas');
666 if (canvas) {
667 clearInterval(waitForGame);
668 console.log('Game canvas found, setting up enhancer...');
669
670 createControlPanel();
671 setupZoomControl();
672 setupKeyboardShortcuts();
673
674 // Apply saved settings
675 if (settings.zoomEnabled) applyZoom();
676 if (settings.performanceOverlay) togglePerformanceOverlay();
677 if (settings.customCrosshair) toggleCustomCrosshair();
678 if (settings.fovBoost) applyFOV();
679
680 console.log('Veck.io Game Enhancer ready!');
681 console.log('Press H to toggle menu');
682 console.log('Press Z to toggle zoom');
683 console.log('Press P to toggle performance stats');
684 }
685 }, 1000);
686 }
687
688 // Start when page is ready
689 if (document.readyState === 'loading') {
690 document.addEventListener('DOMContentLoaded', init);
691 } else {
692 init();
693 }
694
695})();