- // ==UserScript==
- // @name Canadian100's client (survev.io)
- // @namespace http://tampermonkey.net/
- // @version 4.5
- // @description Aimbot, Auto-Shoot, Spinbot, Explosive Warning, Red Lines, See Through Buildings, Enemy Health Bars for Survev.io with GUI toggle system, brightness changer, opacity changerr, fps regualtor, and other key features.
- // @author Canadian100
- // @match *://survev.io/*
- // @grant unsafeWindow
- // @run-at document-end
- // ==/UserScript==
- (function () {
- // Default feature states
- let espEnabled = false;
- let aimbotEnabled = false;
- let autoShootEnabled = false;
- let spinbotEnabled = false;
- let explosiveWarningEnabled = true;
- let drawEnemyLines = false;
- let seeThroughBuildingsEnabled = false;
- let showHealthBars = false;
- let meleeAimbotEnabled = false;
-
- // FPS and Ping variables
- let fps = 0;
- let ping = 0;
- let lastTime = performance.now();
- let frames = 0;
-
- // Canvas Overlay Setup
- const canvas = document.createElement('canvas');
- canvas.style.position = 'fixed';
- canvas.style.top = '0';
- canvas.style.left = '0';
- canvas.style.pointerEvents = 'none';
- canvas.style.zIndex = '9998';
- document.body.appendChild(canvas);
- const ctx = canvas.getContext('2d');
-
- // Update Canvas Size
- function updateCanvasSize() {
- canvas.width = window.innerWidth;
- canvas.height = window.innerHeight;
- }
- window.addEventListener('resize', updateCanvasSize);
- updateCanvasSize();
- // FPS Calculation
- function updateFPS() {
- const currentTime = performance.now();
- frames++;
- if (currentTime - lastTime >= 1000) {
- fps = frames;
- frames = 0;
- lastTime = currentTime;
- }
- }
-
- // Ping Calculation
- function updatePing() {
- const startTime = performance.now();
- fetch("https://www.google.com/")
- .then(response => response.text())
- .then(() => {
- const endTime = performance.now();
- ping = endTime - startTime;
- })
- .catch(() => ping = 0);
- }
-
- // Stats Box Setup
- const statsBox = document.createElement('div');
- statsBox.style.position = 'fixed';
- statsBox.style.top = '300px';
- statsBox.style.left = '20px';
- statsBox.style.padding = '15px';
- statsBox.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
- statsBox.style.borderRadius = '10px';
- statsBox.style.color = 'white';
- statsBox.style.fontFamily = 'Arial, sans-serif';
- statsBox.style.zIndex = '9999';
- statsBox.style.boxShadow = '0 0 10px rgba(255, 255, 255, 0.5)';
- document.body.appendChild(statsBox);
- const fpsElement = document.createElement('div');
- const pingElement = document.createElement('div');
- const killsElement = document.createElement('div');
-
- fpsElement.style.fontSize = '18px';
- pingElement.style.fontSize = '18px';
- killsElement.style.fontSize = '18px';
-
- statsBox.appendChild(fpsElement);
- statsBox.appendChild(pingElement);
- statsBox.appendChild(killsElement);
-
- function updateStats() {
- fpsElement.textContent = `FPS: ${fps}`;
- pingElement.textContent = `Ping: ${ping.toFixed(2)} ms`;
- killsElement.textContent = `Kills: ${unsafeWindow.activePlayer?.kills || 0}`;
- }
-
- setInterval(() => {
- updateFPS();
- updatePing();
- updateStats();
- }, 1000 / 60);
- const popupWindow = document.createElement('div');
- popupWindow.style.position = 'fixed';
- popupWindow.style.top = '50%';
- popupWindow.style.left = '50%';
- popupWindow.style.transform = 'translate(-50%, -50%)';
- popupWindow.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
- popupWindow.style.color = 'white';
- popupWindow.style.padding = '20px';
- popupWindow.style.borderRadius = '10px';
- popupWindow.style.display = 'none';
- popupWindow.style.zIndex = '9999';
- document.body.appendChild(popupWindow);
-
- popupWindow.innerHTML = `
- <h2>Enable Features</h2>
- <label><input type="checkbox" id="aimbotCheckbox"> Aimbot [X]</label><br>
- <label><input type="checkbox" id="autoShootCheckbox"> Trigger Bot [Z]</label><br>
- <label><input type="checkbox" id="spinbotCheckbox"> Spinbot [C]</label><br>
- <label><input type="checkbox" id="explosiveWarningCheckbox"> Explosive Warning [I]</label><br>
- <label><input type="checkbox" id="enemyLinesCheckbox"> Red Lines to Enemies [K]</label><br>
- <label><input type="checkbox" id="seeThroughCheckbox"> See Through Buildings [Y]</label><br>
- <label><input type="checkbox" id="healthBarCheckbox"> Show Enemy Health Bars [H]</label><br>
- <label><input type="checkbox" id="espCheckbox"> ESP Line to Player [E]</label><br>
- <label><input type="checkbox" id="meleeAimbotCheckbox"> Melee Aimbot [M]</label><br>
- <button id="closePopupButton">Close</button>
- `;
- const espCheckbox = document.getElementById('espCheckbox');
- const aimbotCheckbox = document.getElementById('aimbotCheckbox');
- const autoShootCheckbox = document.getElementById('autoShootCheckbox');
- const spinbotCheckbox = document.getElementById('spinbotCheckbox');
- const explosiveWarningCheckbox = document.getElementById('explosiveWarningCheckbox');
- const enemyLinesCheckbox = document.getElementById('enemyLinesCheckbox');
- const seeThroughCheckbox = document.getElementById('seeThroughCheckbox');
- const healthBarCheckbox = document.getElementById('healthBarCheckbox');
- const meleeAimbotCheckbox = document.getElementById('meleeAimbotCheckbox');
- const closePopupButton = document.getElementById('closePopupButton');
-
- function togglePopup() {
- popupWindow.style.display = popupWindow.style.display === 'none' ? 'block' : 'none';
- }
-
- closePopupButton.addEventListener('click', togglePopup);
-
- window.addEventListener('keydown', (e) => {
- switch (e.key.toLowerCase()) {
- case 'e': espEnabled = !espEnabled; espCheckbox.checked = espEnabled; break;
- case 'x': aimbotEnabled = !aimbotEnabled; aimbotCheckbox.checked = aimbotEnabled; break;
- case 'z': autoShootEnabled = !autoShootEnabled; autoShootCheckbox.checked = autoShootEnabled; break;
- case 'c': spinbotEnabled = !spinbotEnabled; spinbotCheckbox.checked = spinbotEnabled; break;
- case 'i': explosiveWarningEnabled = !explosiveWarningEnabled; explosiveWarningCheckbox.checked = explosiveWarningEnabled; break;
- case 'k': drawEnemyLines = !drawEnemyLines; enemyLinesCheckbox.checked = drawEnemyLines; break;
- case 'y': seeThroughBuildingsEnabled = !seeThroughBuildingsEnabled; seeThroughCheckbox.checked = seeThroughBuildingsEnabled; break;
- case 'h': showHealthBars = !showHealthBars; healthBarCheckbox.checked = showHealthBars; break;
- case 'm': meleeAimbotEnabled = !meleeAimbotEnabled; meleeAimbotCheckbox.checked = meleeAimbotEnabled; break;
- case 't': togglePopup(); break;
- }
- });
- function triggerBot(player) {
- if (!autoShootEnabled || !player || !player.weapon || !player.weapon.canShoot) return;
-
- const enemies = unsafeWindow.players.filter(p =>
- p && p.isAlive && p.team !== player.team && isVisible(player, p)
- );
-
- const target = enemies.find(enemy => {
- const dist = distance(player.x, player.y, enemy.x, enemy.y);
- return dist < 400;
- });
-
- if (target) player.weapon.shoot();
- }
- function drawExplosiveWarning(ctx, player) {
- if (!explosiveWarningEnabled) return;
-
- unsafeWindow.projectiles.forEach(proj => {
- if (proj.type === 'explosive') {
- const dist = distance(player.x, player.y, proj.x, proj.y);
- if (dist < 200) {
- ctx.beginPath();
- ctx.arc(proj.x, proj.y, 30, 0, 2 * Math.PI);
- ctx.strokeStyle = 'red';
- ctx.lineWidth = 2;
- ctx.stroke();
- }
- }
- });
- }
- function drawHealthBars(ctx, player) {
- if (!showHealthBars) return;
-
- unsafeWindow.players.forEach(enemy => {
- if (enemy.team !== player.team && enemy.isAlive) {
- ctx.fillStyle = 'green';
- ctx.fillRect(enemy.x - 20, enemy.y - 40, 40 * (enemy.health / enemy.maxHealth), 5);
- ctx.strokeStyle = 'black';
- ctx.strokeRect(enemy.x - 20, enemy.y - 40, 40, 5);
- }
- });
- }
- function drawESP(ctx, player) {
- if (!espEnabled) return;
- ctx.lineWidth = 2;
- ctx.strokeStyle = 'lime';
-
- unsafeWindow.players.forEach(enemy => {
- if (enemy.team !== player.team && enemy.isAlive) {
- ctx.beginPath();
- ctx.moveTo(player.x, player.y);
- ctx.lineTo(enemy.x, enemy.y);
- ctx.stroke();
- }
- });
- }
- function seeThroughBuildings() {
- if (!seeThroughBuildingsEnabled) return;
-
- const obstacles = document.querySelectorAll('.bunker, .building');
- obstacles.forEach(obs => {
- obs.style.opacity = '0.3';
- });
- }
- function aimbot(player) {
- if (!aimbotEnabled || !player || !player.weapon) return;
-
- const enemies = unsafeWindow.players.filter(p =>
- p && p.isAlive && p.team !== player.team && isVisible(player, p)
- );
-
- let closest = null;
- let closestDist = Infinity;
-
- enemies.forEach(enemy => {
- const dist = distance(player.x, player.y, enemy.x, enemy.y);
- if (dist < closestDist) {
- closestDist = dist;
- closest = enemy;
- }
- });
-
- if (closest) {
- const dx = closest.x - player.x;
- const dy = closest.y - player.y;
- const angle = Math.atan2(dy, dx);
- player.aimAngle = angle;
- }
- }
- function meleeAimbot(player) {
- if (!meleeAimbotEnabled || !player || !player.weapon || player.weapon.type !== 'melee') return;
-
- const enemies = unsafeWindow.players.filter(p =>
- p && p.isAlive && p.team !== player.team && isVisible(player, p)
- );
-
- let closest = null;
- let closestDist = Infinity;
-
- enemies.forEach(enemy => {
- const dist = distance(player.x, player.y, enemy.x, enemy.y);
- if (dist < closestDist) {
- closestDist = dist;
- closest = enemy;
- }
- });
-
- if (closest) {
- const dx = closest.x - player.x;
- const dy = closest.y - player.y;
- player.aimAngle = Math.atan2(dy, dx);
-
- player.moveX = Math.sign(dx);
- player.moveY = Math.sign(dy);
-
- if (closestDist < 50 && player.weapon.canAttack) {
- player.weapon.attack();
- }
- }
- }
- let spinAngle = 0;
- function spinbot(player) {
- if (!spinbotEnabled || !player) return;
- spinAngle += 0.3;
- player.aimAngle = spinAngle;
- }
- function drawTracerLines(ctx, player) {
- if (!drawEnemyLines) return;
-
- ctx.strokeStyle = 'red';
- ctx.lineWidth = 10;
-
- unsafeWindow.players.forEach(enemy => {
- if (enemy.isAlive && enemy.team !== player.team) {
- ctx.beginPath();
- ctx.moveTo(player.x, player.y);
- ctx.lineTo(enemy.x + enemy.vx * 3, enemy.y + enemy.vy * 3); // Predictive
- ctx.stroke();
- }
- });
- }
- function distance(x1, y1, x2, y2) {
- return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
- }
-
- function isVisible(player, enemy) {
- return true; // Placeholder: add raycast/visibility check here if needed
- }
- setInterval(() => {
- const player = unsafeWindow.activePlayer;
- if (!player) return;
-
- ctx.clearRect(0, 0, canvas.width, canvas.height);
- aimbot(player);
- meleeAimbot(player);
- triggerBot(player);
- spinbot(player);
- seeThroughBuildings();
- drawESP(ctx, player);
- drawTracerLines(ctx, player);
- drawExplosiveWarning(ctx, player);
- drawHealthBars(ctx, player);
- }, 1000 / 60);
- })(); // END of entire userscript
-
- (function () {
- // Declare the GUI container but don't append it yet
- let guiContainer;
-
- // Function to create and display the GUI container when the 'L' key is pressed
- function createGUI() {
- // Create the draggable GUI container
- guiContainer = document.createElement('div');
- guiContainer.style.position = 'fixed';
- guiContainer.style.left = '50%';
- guiContainer.style.top = '50%';
- guiContainer.style.transform = 'translate(-50%, -50%)';
- guiContainer.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
- guiContainer.style.padding = '20px';
- guiContainer.style.borderRadius = '10px';
- guiContainer.style.color = 'white';
- guiContainer.style.zIndex = '9999';
- guiContainer.style.display = 'none'; // Initially hidden
- guiContainer.style.display = 'flex';
- guiContainer.style.flexDirection = 'column'; // Stack elements vertically
- guiContainer.style.gap = '10px'; // Adds space between elements
- guiContainer.style.maxWidth = '150px'; // Max width of the HUD container
- guiContainer.style.width = '100%'; // Allows for responsive resizing while respecting max-width
- document.body.appendChild(guiContainer);
-
- // Add title to the GUI
- const title = document.createElement('h2');
- title.innerText = 'Game Settings';
- guiContainer.appendChild(title);
-
- // Brightness control label
- const brightnessLabel = document.createElement('label');
- brightnessLabel.innerText = 'Set Game Brightness: ';
- guiContainer.appendChild(brightnessLabel);
-
- // Create brightness slider
- const brightnessSlider = document.createElement('input');
- brightnessSlider.type = 'range';
- brightnessSlider.min = '0';
- brightnessSlider.max = '2';
- brightnessSlider.step = '0.01';
- brightnessSlider.value = '1'; // Default brightness
- guiContainer.appendChild(brightnessSlider);
-
- // Event listener for brightness slider
- brightnessSlider.addEventListener('input', function () {
- // Update the brightness of the game
- const brightnessValue = brightnessSlider.value;
- document.body.style.filter = `brightness(${brightnessValue})`;
- });
-
- // Opacity control label for environment elements (trees, buildings, containers, bushes)
- const opacityLabel = document.createElement('label');
- opacityLabel.innerText = 'Set Environment Opacity: ';
- guiContainer.appendChild(opacityLabel);
-
- // Create opacity slider
- const opacitySlider = document.createElement('input');
- opacitySlider.type = 'range';
- opacitySlider.min = '0';
- opacitySlider.max = '1';
- opacitySlider.step = '0.01';
- opacitySlider.value = '1'; // Default opacity
- guiContainer.appendChild(opacitySlider);
-
- // Event listener for opacity slider
- opacitySlider.addEventListener('input', function () {
- // Update opacity of in-game objects (trees, buildings, containers, bushes)
- const opacityValue = opacitySlider.value;
- const environmentObjects = document.querySelectorAll('.tree, .building, .container, .bush'); // Example classes
- environmentObjects.forEach(object => {
- object.style.opacity = opacityValue; // Apply opacity to each object
- });
- });
-
- // Max FPS control label
- const fpsLabel = document.createElement('label');
- fpsLabel.innerText = 'Set Max FPS: ';
- guiContainer.appendChild(fpsLabel);
-
- // Create FPS slider
- const fpsSlider = document.createElement('input');
- fpsSlider.type = 'range';
- fpsSlider.min = '0';
- fpsSlider.max = '500';
- fpsSlider.step = '1';
- fpsSlider.value = '60'; // Default FPS
- guiContainer.appendChild(fpsSlider);
-
- // Event listener for FPS slider
- fpsSlider.addEventListener('input', function () {
- // Set the max FPS based on slider value
- const fpsValue = fpsSlider.value;
- // Example FPS limiter (adjust as needed)
- document.querySelector('canvas').style['max-fps'] = fpsValue;
- });
-
- // Add Lock HUD checkbox (placed under the last slider)
- const lockHudLabel = document.createElement('label');
- lockHudLabel.innerText = 'Lock HUD in Place: ';
- guiContainer.appendChild(lockHudLabel);
-
- const lockHudCheckbox = document.createElement('input');
- lockHudCheckbox.type = 'checkbox';
- guiContainer.appendChild(lockHudCheckbox);
-
- // Draggable HUD logic
- let isDragging = false;
- let offsetX, offsetY;
- let isHudLocked = false;
-
- // Make the GUI container draggable (if not locked)
- guiContainer.addEventListener('mousedown', (e) => {
- if (!isHudLocked) {
- isDragging = true;
- offsetX = e.clientX - guiContainer.offsetLeft;
- offsetY = e.clientY - guiContainer.offsetTop;
- }
- });
-
- document.addEventListener('mousemove', (e) => {
- if (isDragging && !isHudLocked) {
- guiContainer.style.left = `${e.clientX - offsetX}px`;
- guiContainer.style.top = `${e.clientY - offsetY}px`;
- }
- });
-
- document.addEventListener('mouseup', () => {
- isDragging = false;
- });
-
- // Listen for lock/unlock checkbox change
- lockHudCheckbox.addEventListener('change', function () {
- isHudLocked = lockHudCheckbox.checked; // Lock or unlock the HUD based on checkbox state
- });
- }
-
- // Toggle GUI visibility with "L" key
- let guiVisible = false;
- function toggleGUI() {
- if (!guiVisible) {
- createGUI(); // Create the GUI if not already created
- }
- guiVisible = !guiVisible;
- guiContainer.style.display = guiVisible ? 'block' : 'none'; // Show/hide the container
- }
-
- // Keybind for showing/hiding the GUI
- window.addEventListener('keydown', (event) => {
- if (event.key.toLowerCase() === 'l') {
- toggleGUI();
- }
- });
- })();
- (function () {
- let locked = false;
-
- // 🧹 Remove any existing HUD first
- const existingHud = document.getElementById('customHud');
- if (existingHud) {
- existingHud.remove();
- }
-
- // Create the HUD
- const hud = document.createElement('div');
- hud.id = 'customHud'; // Unique ID to detect duplicates
- Object.assign(hud.style, {
- position: 'fixed',
- top: '50%',
- left: '50%',
- transform: 'translate(-50%, -50%)',
- backgroundColor: 'rgba(0, 0, 0, 0.8)',
- color: 'white',
- padding: '20px',
- borderRadius: '10px',
- zIndex: '9999',
- cursor: 'move',
- display: 'block'
- });
- document.body.appendChild(hud);
-
- // Draggable logic
- let isDragging = false;
- let offsetX = 0, offsetY = 0;
-
- hud.addEventListener('mousedown', (e) => {
- if (!locked) {
- isDragging = true;
- offsetX = e.clientX - hud.offsetLeft;
- offsetY = e.clientY - hud.offsetTop;
- document.addEventListener('mousemove', onMouseMove);
- }
- });
-
- document.addEventListener('mouseup', () => {
- isDragging = false;
- document.removeEventListener('mousemove', onMouseMove);
- });
-
- function onMouseMove(e) {
- if (isDragging && !locked) {
- hud.style.left = `${e.clientX - offsetX}px`;
- hud.style.top = `${e.clientY - offsetY}px`;
- }
- }
-
- // HUD content
- const naturalFeaturesElement = document.createElement('div');
- const featuresElement = document.createElement('div');
- const quickSwitchElement = document.createElement('div');
- const fpsElement = document.createElement('div');
- const pingElement = document.createElement('div');
- const devInfoElement = document.createElement('div');
- const disableTextElement = document.createElement('div');
-
- naturalFeaturesElement.textContent = 'L = Natural Game Features';
- featuresElement.textContent = 'T = Key Features 👀';
- quickSwitchElement.textContent = 'O = Quick Switch Feature';
- fpsElement.textContent = 'FPS Rate: Adjusts every 100ms';
- pingElement.textContent = 'Ping: Developing at the moment';
- devInfoElement.textContent = 'This client is still under development. Report bugs to canadian100.0 on Discord.';
- disableTextElement.textContent = "Press 'n' to disable this HUD";
-
- hud.appendChild(naturalFeaturesElement);
- hud.appendChild(featuresElement);
- hud.appendChild(quickSwitchElement);
- hud.appendChild(fpsElement);
- hud.appendChild(pingElement);
- hud.appendChild(devInfoElement);
- hud.appendChild(disableTextElement);
-
- // Lock checkbox
- const lockCheckbox = document.createElement('input');
- lockCheckbox.type = 'checkbox';
- lockCheckbox.id = 'lockHudCheckbox';
- const lockLabel = document.createElement('label');
- lockLabel.textContent = ' Lock HUD in Place';
- lockLabel.setAttribute('for', 'lockHudCheckbox');
- hud.appendChild(lockCheckbox);
- hud.appendChild(lockLabel);
-
- lockCheckbox.addEventListener('change', () => {
- locked = lockCheckbox.checked;
- });
-
- // FPS tracking
- let fps = 0;
- let frames = 0;
- let lastTime = performance.now();
-
- function updateFPS() {
- const currentTime = performance.now();
- frames++;
- if (currentTime - lastTime >= 100) {
- fps = frames;
- frames = 0;
- lastTime = currentTime;
- fpsElement.textContent = `FPS Rate: Adjusts every 100ms - ${fps}`;
- }
- }
-
- setInterval(updateFPS, 100);
-
- // Toggle HUD visibility with 'n'
- window.addEventListener('keydown', (e) => {
- if (e.key.toLowerCase() === 'n') {
- hud.style.display = hud.style.display === 'none' ? 'block' : 'none';
- }
- });
- })();
- (function () {
- let isHudVisible = false;
- let isLocked = false;
- let switchDelay = 1000;
- let singleShotEnabled = false;
- let outOfAmmoEnabled = false;
-
- // Create HUD
- const hud = document.createElement('div');
- Object.assign(hud.style, {
- position: 'fixed',
- left: '50%',
- top: '50%',
- transform: 'translate(-50%, -50%)',
- background: 'rgba(0,0,0,0.8)',
- color: '#fff',
- padding: '15px',
- borderRadius: '10px',
- maxWidth: '180px',
- zIndex: 9999,
- fontSize: '12px',
- userSelect: 'none',
- flexDirection: 'column',
- gap: '8px',
- cursor: 'move',
- display: 'none'
- });
- hud.style.display = 'none';
- hud.style.display = 'flex';
- hud.style.display = 'none'; // Make sure it starts hidden
- document.body.appendChild(hud);
-
- // Delay Slider
- const delayLabel = document.createElement('label');
- delayLabel.textContent = 'Switch Delay (ms)';
- const delaySlider = document.createElement('input');
- delaySlider.type = 'range';
- delaySlider.min = 100;
- delaySlider.max = 3000;
- delaySlider.step = 100;
- delaySlider.value = switchDelay;
- delaySlider.addEventListener('input', () => {
- switchDelay = parseInt(delaySlider.value);
- });
-
- // Checkbox: After Single Shot
- const singleShotBox = document.createElement('input');
- singleShotBox.type = 'checkbox';
- singleShotBox.addEventListener('change', () => {
- singleShotEnabled = singleShotBox.checked;
- });
- const singleShotLabel = document.createElement('label');
- singleShotLabel.textContent = 'After Single Shot';
- singleShotLabel.prepend(singleShotBox);
-
- // Checkbox: Out of Ammo
- const outOfAmmoBox = document.createElement('input');
- outOfAmmoBox.type = 'checkbox';
- outOfAmmoBox.addEventListener('change', () => {
- outOfAmmoEnabled = outOfAmmoBox.checked;
- });
- const outOfAmmoLabel = document.createElement('label');
- outOfAmmoLabel.textContent = 'Out of Ammo';
- outOfAmmoLabel.prepend(outOfAmmoBox);
-
- // Checkbox: Lock HUD
- const lockBox = document.createElement('input');
- lockBox.type = 'checkbox';
- lockBox.addEventListener('change', () => {
- isLocked = lockBox.checked;
- });
- const lockLabel = document.createElement('label');
- lockLabel.textContent = 'Lock HUD';
- lockLabel.prepend(lockBox);
-
- // Append to HUD
- hud.appendChild(delayLabel);
- hud.appendChild(delaySlider);
- hud.appendChild(singleShotLabel);
- hud.appendChild(outOfAmmoLabel);
- hud.appendChild(lockLabel);
-
- // Drag logic
- let isDragging = false, offsetX = 0, offsetY = 0;
- hud.addEventListener('mousedown', (e) => {
- if (isLocked) return;
- isDragging = true;
- offsetX = e.clientX - hud.offsetLeft;
- offsetY = e.clientY - hud.offsetTop;
- });
- document.addEventListener('mousemove', (e) => {
- if (isDragging && !isLocked) {
- hud.style.left = `${e.clientX - offsetX}px`;
- hud.style.top = `${e.clientY - offsetY}px`;
- }
- });
- document.addEventListener('mouseup', () => isDragging = false);
-
- // Toggle HUD with 'O'
- window.addEventListener('keydown', (e) => {
- if (e.key.toLowerCase() === 'o') {
- isHudVisible = !isHudVisible;
- hud.style.display = isHudVisible ? 'flex' : 'none';
- }
- });
-
- // Dummy game interaction simulation (replace with real logic)
- function switchWeaponSlot() {
- const slots = [1, 2, 3].filter(slot => true); // All usable
- let currentSlot = getCurrentSlot(); // Replace this
- let nextIndex = (slots.indexOf(currentSlot) + 1) % slots.length;
- simulateKeyPress(slots[nextIndex].toString());
- }
-
- function getCurrentSlot() {
- return 1; // Replace with actual game detection
- }
-
- function simulateKeyPress(key) {
- document.dispatchEvent(new KeyboardEvent('keydown', { key }));
- }
-
- function switchWeaponSlotWithDelay() {
- setTimeout(() => switchWeaponSlot(), switchDelay);
- }
-
- // Trigger test loop (replace with actual game events)
- setInterval(() => {
- if (singleShotEnabled || outOfAmmoEnabled) {
- switchWeaponSlotWithDelay();
- }
- }, 3000);
- })();