- // ==UserScript==
- // @name Survev UI Mod v5
- // @namespace http://tampermonkey.net/
- // @version 2024-08-31
- // @description QoL features for Survev.io (works with expandedwater, untested)
- // @author Blubbled
- // @match https://survev.io/*
- // @match https://expandedwater.online/
- // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
- // @grant none
- // @license MIT
- // ==/UserScript==
-
-
-
- (function() {
-
- var lastCalledTime;
- var fps;
- var frameTimes = [];
- var maxFrames = 100;
- var uncappedFPS = false;
- var uiElementsEnabled = true;
- var fpsCounterEnabled = true;
- var currentCountdown = null;
- var healthBarSettingsCreated = false;
- var switchDelayEnabled = localStorage.getItem('switchDelayEnabled') === 'true';
- var customColor = localStorage.getItem('customColor') || '#ffffff';
- var colorToggleState = localStorage.getItem('colorToggle') === 'true';
-
- function requestAnimFrame() {
- if (!lastCalledTime) {
- lastCalledTime = Date.now();
- fps = 0;
- return;
- }
-
- var currentTime = Date.now();
- var delta = (currentTime - lastCalledTime) / 1000;
- lastCalledTime = currentTime;
-
- frameTimes.push(delta);
-
- if (frameTimes.length > maxFrames) {
- frameTimes.shift();
- }
-
- var totalTime = frameTimes.reduce((sum, time) => sum + time, 0);
- fps = (frameTimes.length / totalTime).toFixed(0);
- }
-
- function createFPSCounter() {
- var fpsCounter = document.createElement('div');
- fpsCounter.id = 'fps-counter';
- fpsCounter.style.position = 'fixed';
- fpsCounter.style.left = '10px';
- fpsCounter.style.top = '130px';
- fpsCounter.style.color = customColor;
- fpsCounter.style.fontSize = '20px';
- fpsCounter.style.fontWeight = 'bold';
- fpsCounter.style.zIndex = '1000';
- fpsCounter.style.backgroundColor = 'rgba(0, 0, 0, 0)';
- fpsCounter.style.padding = '5px';
- fpsCounter.style.borderRadius = '5px';
- document.body.appendChild(fpsCounter);
-
- var lastUpdate = Date.now();
-
- function updateFPSCounter() {
- requestAnimFrame();
- var now = Date.now();
- if (now - lastUpdate >= 1000) {
- fpsCounter.textContent = `FPS: ${fps}`;
- lastUpdate = now;
- }
-
- requestAnimationFrame(updateFPSCounter);
- }
-
- updateFPSCounter();
- }
-
- createFPSCounter();
-
- function toggleFPSCounter(enabled) {
- var fpsCounter = document.getElementById('fps-counter');
- if (enabled) {
- fpsCounter.style.display = 'block';
- } else {
- fpsCounter.style.display = 'none';
- }
- }
-
- function resetTextColors() {
- var fpsCounter = document.getElementById('fps-counter');
- var ammoCount = document.getElementById('ui-current-clip');
- var healCounts = document.querySelectorAll('.ui-loot-count');
-
- if (fpsCounter) fpsCounter.style.color = '';
- if (ammoCount) ammoCount.style.color = '';
- healCounts.forEach(function(healCount) {
- healCount.style.color = '';
- });
- }
-
- function updateTextColor(newColor) {
- if (!colorToggleState) {
- resetTextColors();
- return;
- }
-
- customColor = newColor;
- localStorage.setItem('customColor', newColor);
-
- var fpsCounter = document.getElementById('fps-counter');
- var ammoCount = document.getElementById('ui-current-clip');
- var healCounts = document.querySelectorAll('.ui-loot-count');
-
- if (fpsCounter) fpsCounter.style.color = newColor;
- if (ammoCount) ammoCount.style.color = newColor;
- healCounts.forEach(function(healCount) {
- healCount.style.color = newColor;
- });
- }
-
- function applyInitialTextColor() {
- if (!colorToggleState) {
- return;
- }
-
- var ammoCount = document.getElementById('ui-current-clip');
- var healCounts = document.querySelectorAll('.ui-loot-count');
-
- if (ammoCount) ammoCount.style.color = customColor;
- healCounts.forEach(function(healCount) {
- healCount.style.color = customColor;
- });
- }
-
- function applyColorOnGameUI() {
- var observer = new MutationObserver(function(mutations) {
- mutations.forEach(function(mutation) {
- if (mutation.addedNodes.length) {
- applyInitialTextColor();
- }
- });
- });
-
- observer.observe(document.body, { childList: true, subtree: true });
- }
-
- var uiTopLeft = document.getElementById('ui-top-left');
- if (uiTopLeft) {
- uiTopLeft.style.position = 'relative';
- uiTopLeft.style.left = '100px';
- }
-
- document.addEventListener("DOMContentLoaded", function() {
- if (colorToggleState) {
- applyInitialTextColor();
- }
-
- applyColorOnGameUI();
- });
-
- function createSwitchDelayToggle(settingsTab) {
- var switchDelayLabel = document.createElement('label');
- switchDelayLabel.textContent = 'Show Switch Delay';
- settingsTab.appendChild(switchDelayLabel);
-
- var switchDelayCheckbox = document.createElement('input');
- switchDelayCheckbox.type = 'checkbox';
- switchDelayCheckbox.id = 'switch-delay-checkbox';
- switchDelayCheckbox.checked = switchDelayEnabled;
- settingsTab.appendChild(switchDelayCheckbox);
- settingsTab.appendChild(document.createElement('br'));
-
- switchDelayCheckbox.addEventListener('change', function() {
- switchDelayEnabled = switchDelayCheckbox.checked;
- localStorage.setItem('switchDelayEnabled', switchDelayEnabled);
- });
- }
-
- var settingsButton = document.createElement('button');
- settingsButton.id = 'settings-button';
- settingsButton.textContent = 'Mod Settings';
- settingsButton.style.position = 'fixed';
- settingsButton.style.left = '10px';
- settingsButton.style.top = '50%';
- settingsButton.style.transform = 'translateY(-50%)';
- settingsButton.style.padding = '10px';
- settingsButton.style.fontSize = '18px';
- settingsButton.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
- settingsButton.style.color = 'white';
- settingsButton.style.zIndex = '1000';
- settingsButton.style.display = 'none';
- document.body.appendChild(settingsButton);
-
- var settingsTab = document.createElement('div');
- settingsTab.id = 'settings-tab';
- settingsTab.style.position = 'fixed';
- settingsTab.style.left = '200px';
- settingsTab.style.top = '50%';
- settingsTab.style.width = '300px';
- settingsTab.style.height = '400px';
- settingsTab.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
- settingsTab.style.color = 'white';
- settingsTab.style.padding = '20px';
- settingsTab.style.borderRadius = '10px';
- settingsTab.style.display = 'none';
- settingsTab.innerHTML = '<h2>Mod Settings (buggy, reenable uncapped FPS a few times if cursor info doesnt update)</h2>';
- document.body.appendChild(settingsTab);
-
- var fpsSettingWrapper = document.createElement('div');
- fpsSettingWrapper.style.textAlign = 'left';
-
- var fpsLabel = document.createElement('label');
- fpsLabel.textContent = 'Enable Uncapped FPS';
- fpsLabel.setAttribute('for', 'uncapped-fps-checkbox');
-
- var fpsCheckbox = document.createElement('input');
- fpsCheckbox.type = 'checkbox';
- fpsCheckbox.id = 'uncapped-fps-checkbox';
-
- fpsSettingWrapper.appendChild(fpsLabel);
- fpsSettingWrapper.appendChild(fpsCheckbox);
-
- settingsTab.appendChild(fpsSettingWrapper);
-
- var uiSettingWrapper = document.createElement('div');
- uiSettingWrapper.style.textAlign = 'left';
-
- var uiLabel = document.createElement('label');
- uiLabel.textContent = 'Show Cursor Info';
- uiLabel.setAttribute('for', 'ui-elements-checkbox');
-
- var uiCheckbox = document.createElement('input');
- uiCheckbox.type = 'checkbox';
- uiCheckbox.id = 'ui-elements-checkbox';
-
- uiSettingWrapper.appendChild(uiLabel);
- uiSettingWrapper.appendChild(uiCheckbox);
-
- settingsTab.appendChild(uiSettingWrapper);
-
- var fpsCounterWrapper = document.createElement('div');
- fpsCounterWrapper.style.textAlign = 'left';
-
- var fpsCounterLabel = document.createElement('label');
- fpsCounterLabel.textContent = 'Show FPS Counter';
- fpsCounterLabel.setAttribute('for', 'fps-counter-checkbox');
-
- var fpsCounterCheckbox = document.createElement('input');
- fpsCounterCheckbox.type = 'checkbox';
- fpsCounterCheckbox.id = 'fps-counter-checkbox';
-
- fpsCounterWrapper.appendChild(fpsCounterLabel);
- fpsCounterWrapper.appendChild(fpsCounterCheckbox);
-
- settingsTab.appendChild(fpsCounterWrapper);
-
- createSwitchDelayToggle(settingsTab);
- settingsTab.appendChild(document.createElement('br'));
-
- function toggleUncappedFPS(enabled) {
- if (enabled) {
- window.requestAnimationFrame = function(callback) {
- return setTimeout(callback, 1);
- };
- } else {
- window.requestAnimationFrame = function(callback) {
- return setTimeout(callback, 1000 / 60);
- };
- }
- }
-
-
-
- var colorToggleLabel = document.createElement('label');
- colorToggleLabel.textContent = 'Enable Custom Text Color';
- settingsTab.appendChild(colorToggleLabel);
-
- var colorToggleCheckbox = document.createElement('input');
- colorToggleCheckbox.type = 'checkbox';
- colorToggleCheckbox.id = 'color-toggle-checkbox';
- colorToggleCheckbox.checked = colorToggleState;
- settingsTab.appendChild(colorToggleCheckbox);
- settingsTab.appendChild(document.createElement('br'));
-
- var colorPickerLabel = document.createElement('label');
- colorPickerLabel.textContent = 'Select Text Color';
- settingsTab.appendChild(colorPickerLabel);
-
- var colorPicker = document.createElement('input');
- colorPicker.type = 'color';
- colorPicker.value = customColor;
- colorPicker.disabled = !colorToggleState;
- settingsTab.appendChild(colorPicker);
- settingsTab.appendChild(document.createElement('br'));
-
- colorToggleCheckbox.addEventListener('change', function() {
- colorToggleState = colorToggleCheckbox.checked;
- colorPicker.disabled = !colorToggleState;
- if (colorToggleState) {
- updateTextColor(colorPicker.value);
- } else {
- resetTextColors();
- }
- localStorage.setItem('colorToggle', colorToggleState);
- });
- colorPicker.addEventListener('input', function() {
- if (colorToggleState) {
- updateTextColor(colorPicker.value);
- }
- });
-
- function updateSettingsButtonVisibility() {
- var loadingOverlay = document.querySelector('.play-loading-outer');
-
- if (loadingOverlay && window.getComputedStyle(loadingOverlay).opacity === '0') {
- settingsButton.style.display = 'block';
- } else {
- settingsButton.style.display = 'none';
- settingsTab.style.display = 'none';
- }
-
- if (!healthBarSettingsCreated) {
- createHealthBarSettingsUI(settingsTab);
- healthBarSettingsCreated = true;
- }
-
- if (healthBarColorToggleState) {
- observeHealthBar();
- }
- }
-
- setInterval(updateSettingsButtonVisibility, 100);
-
- settingsButton.addEventListener('click', function() {
- if (settingsTab.style.display === 'none') {
- settingsTab.style.display = 'block';
- } else {
- settingsTab.style.display = 'none';
- }
- });
-
- function loadSettings() {
- var uncappedFPSSetting = localStorage.getItem('uncappedFPS') === 'true';
- var uiElementsSetting = localStorage.getItem('uiElementsEnabled') === 'true';
- var fpsCounterSetting = localStorage.getItem('fpsCounterEnabled') === 'true';
-
- fpsCheckbox.checked = uncappedFPSSetting;
- uiCheckbox.checked = uiElementsSetting;
- fpsCounterCheckbox.checked = fpsCounterSetting;
-
- toggleUncappedFPS(uncappedFPSSetting);
- toggleUIElementDisplay(uiElementsSetting);
- toggleFPSCounter(fpsCounterSetting);
-
- if (colorToggleState) {
- updateTextColor(customColor);
- }
- }
-
- function saveSettings() {
- var uncappedFPSSetting = fpsCheckbox.checked;
- var uiElementsSetting = uiCheckbox.checked;
- var fpsCounterSetting = fpsCounterCheckbox.checked;
-
- localStorage.setItem('uncappedFPS', uncappedFPSSetting);
- localStorage.setItem('uiElementsEnabled', uiElementsSetting);
- localStorage.setItem('fpsCounterEnabled', fpsCounterSetting);
-
- toggleUncappedFPS(uncappedFPSSetting);
- toggleUIElementDisplay(uiElementsSetting);
- toggleFPSCounter(fpsCounterSetting);
- }
-
- loadSettings();
-
- fpsCheckbox.addEventListener('change', saveSettings);
- uiCheckbox.addEventListener('change', saveSettings);
- fpsCounterCheckbox.addEventListener('change', saveSettings);
-
- var healthBarColor = localStorage.getItem('healthBarColor') || '#00ff00';
- var healthBarDegradationColor = localStorage.getItem('healthBarDegradationColor') || '#ff0000';
- var healthBarColorToggleState = localStorage.getItem('healthBarColorToggle') === 'true';
-
- function interpolateColor(color1, color2, factor) {
- var result = color1.slice(1).match(/.{2}/g).map((hex, i) => {
- return Math.round(parseInt(hex, 16) * (1 - factor) + parseInt(color2.slice(1).match(/.{2}/g)[i], 16) * factor).toString(16).padStart(2, '0');
- });
- return `#${result.join('')}`;
- }
-
-
- function updateHealthBarColor(percentage) {
- if (!healthBarColorToggleState) return;
- var interpolatedColor = interpolateColor(healthBarColor, healthBarDegradationColor, 1 - percentage);
- var healthBar = document.getElementById('ui-health-actual');
- if (healthBar) {
- healthBar.style.backgroundColor = interpolatedColor;
- }
- }
-
- function observeHealthBar() {
- var healthBar = document.getElementById('ui-health-actual');
- if (!healthBar) return;
-
- var observer = new MutationObserver(function() {
- var width = parseFloat(healthBar.style.width);
- var percentage = width / 100;
- updateHealthBarColor(percentage);
- });
-
- observer.observe(healthBar, { attributes: true, attributeFilter: ['style'] });
- }
-
-
- function createHealthBarSettingsUI(settingsTab) {
-
- var healthBarColorToggleLabel = document.createElement('label');
- settingsTab.appendChild(document.createElement('br'));
- healthBarColorToggleLabel.textContent = 'Enable Custom Health Bar Color';
- settingsTab.appendChild(healthBarColorToggleLabel);
-
- var healthBarColorToggleCheckbox = document.createElement('input');
- healthBarColorToggleCheckbox.type = 'checkbox';
- healthBarColorToggleCheckbox.id = 'health-bar-color-toggle-checkbox';
- healthBarColorToggleCheckbox.checked = healthBarColorToggleState;
- settingsTab.appendChild(healthBarColorToggleCheckbox);
- settingsTab.appendChild(document.createElement('br'));
-
-
- var healthBarColorLabel = document.createElement('label');
- healthBarColorLabel.textContent = 'Health Bar Color:';
- settingsTab.appendChild(healthBarColorLabel);
-
- var healthBarColorPicker = document.createElement('input');
- healthBarColorPicker.type = 'color';
- healthBarColorPicker.value = healthBarColor;
- healthBarColorPicker.disabled = !healthBarColorToggleState;
- settingsTab.appendChild(healthBarColorPicker);
- settingsTab.appendChild(document.createElement('br'));
-
-
- var healthBarDegradationColorLabel = document.createElement('label');
- healthBarDegradationColorLabel.textContent = 'Health Bar Degradation Color:';
- settingsTab.appendChild(healthBarDegradationColorLabel);
-
- var healthBarDegradationColorPicker = document.createElement('input');
- healthBarDegradationColorPicker.type = 'color';
- healthBarDegradationColorPicker.value = healthBarDegradationColor;
- healthBarDegradationColorPicker.disabled = !healthBarColorToggleState;
- settingsTab.appendChild(healthBarDegradationColorPicker);
- settingsTab.appendChild(document.createElement('br'));
-
-
- healthBarColorToggleCheckbox.addEventListener('change', function() {
- healthBarColorToggleState = healthBarColorToggleCheckbox.checked;
- localStorage.setItem('healthBarColorToggle', healthBarColorToggleState);
- healthBarColorPicker.disabled = !healthBarColorToggleState;
- healthBarDegradationColorPicker.disabled = !healthBarColorToggleState;
-
- if (healthBarColorToggleState) {
- observeHealthBar();
- }
- });
-
- healthBarColorPicker.addEventListener('input', function() {
- healthBarColor = healthBarColorPicker.value;
- localStorage.setItem('healthBarColor', healthBarColor);
- });
-
- healthBarDegradationColorPicker.addEventListener('input', function() {
- healthBarDegradationColor = healthBarDegradationColorPicker.value;
- localStorage.setItem('healthBarDegradationColor', healthBarDegradationColor);
- });
- }
- var gunSwitchDelayMap = {
- "AWM-S": 1000,
- "BLR 81": 1000,
- "Model 94": 1000,
- "Mosin-Nagant": 1000,
- "SV-98": 1000,
- "Scout Elite": 1000,
-
- "Hawk 12G": 900,
- "Heart Cannon": 900,
- "M1100": 900,
- "M134": 900,
- "M79": 900,
- "M870": 900,
- "Potato Cannon": 900,
-
- "AK-47": 750,
- "AN-94": 750,
- "BAR M1918": 750,
- "CZ-3A1": 750,
- "DP-28": 750,
- "FAMAS": 750,
- "Groza": 750,
- "Groza-S": 750,
- "L86A2": 750,
- "M1 Garand": 750,
- "M1014": 750,
- "M1A1": 750,
- "M249": 750,
- "M39 EMR": 750,
- "M416": 750,
- "M4A1-S": 750,
- "MAC-10": 750,
- "MP5": 750,
- "Mk 12 SPR": 750,
- "Mk45G": 750,
- "PKM": 750,
- "PKP Pecheneg": 750,
- "QBB-97": 750,
- "SCAR-H": 750,
- "SCAR-SSR": 750,
- "SPAS-12": 750,
- "SVD-63": 750,
- "Saiga-12": 750,
- "Spud Gun": 750,
- "UMP9": 750,
- "USAS-12": 750,
- "VSS": 750,
- "Vector": 750,
-
- "Bugle": 300,
- "DEagle 50": 300,
- "Dual DEagle 50": 300,
- "Dual Flare Gun": 300,
- "Dual OT-38": 300,
- "Dual OTs-38": 300,
- "Dual P30L": 300,
- "Dual Peacemaker": 300,
- "Flare Gun": 300,
- "MP220": 300,
- "OT-38": 300,
- "OTs-38": 300,
- "Peacemaker": 300,
- "Rainbow Blaster": 300,
-
- "Dual G18C": 250,
- "Dual M1911": 250,
- "Dual M9": 250,
- "Dual M93R": 250,
- "G18C": 250,
- "M1911": 250,
- "M9": 250,
- "M9 Cursed": 250,
- "M93R": 250,
- "P30L": 250
- };
-
-
- var currentCountdown = null;
-
- function createSwitchDelayText() {
- var delayText = document.createElement('div');
- delayText.id = 'switch-delay-text';
- delayText.style.position = 'fixed';
- delayText.style.color = 'red';
- delayText.style.fontSize = '25px';
- delayText.style.fontWeight = 'bold';
- delayText.style.zIndex = '1000';
- delayText.style.left = '50%';
- delayText.style.transform = 'translateX(-50%)';
- delayText.style.top = '40%';
- document.body.appendChild(delayText);
- return delayText;
- }
-
-
- function showSwitchDelay(gunName, delayMs) {
- if (!switchDelayEnabled) return;
-
- if (currentCountdown) {
- clearInterval(currentCountdown);
- }
-
- if (!gunSwitchDelayMap[gunName]) {
- return;
- }
-
- var delayInSeconds = (delayMs / 1000).toFixed(2);
- var delayText = document.getElementById('switch-delay-text') || createSwitchDelayText();
-
- delayText.textContent = `${delayInSeconds}s`;
- delayText.style.display = 'block';
-
- currentCountdown = setInterval(function() {
- delayInSeconds -= 0.01;
- delayText.textContent = `${delayInSeconds.toFixed(2)}s`;
-
- if (delayInSeconds <= 0) {
- clearInterval(currentCountdown);
- delayText.style.display = 'none';
- currentCountdown = null;
- }
- }, 10);
- }
-
-
- function detectWeaponSwitch() {
- var previousWeapon = null;
-
- setInterval(function() {
- var equippedWeapon = document.querySelector('.ui-weapon-switch[style*="background-color: rgba(0, 0, 0, 0.4)"], .ui-weapon-switch[style*="opacity: 1"]');
- if (equippedWeapon) {
- var weaponName = equippedWeapon.querySelector('.ui-weapon-name').textContent.trim();
- if (weaponName !== previousWeapon) {
- previousWeapon = weaponName;
-
- var delayMs = gunSwitchDelayMap[weaponName];
- if (delayMs) {
- showSwitchDelay(weaponName, delayMs);
- }
- }
- }
- }, 100);
- }
-
- detectWeaponSwitch();
-
-
- function periodicallyShowKillCounter() {
- showKillCounter();
- setTimeout(periodicallyShowKillCounter, 100);
- }
-
- function showKillCounter() {
- var killCounter = document.getElementById('ui-kill-counter-wrapper');
- if (killCounter) {
- killCounter.style.display = 'block';
- killCounter.style.position = 'fixed';
- killCounter.style.left = '5px';
- killCounter.style.top = '-25px';
- killCounter.style.color = 'white';
- killCounter.style.fontSize = '20px';
- killCounter.style.fontWeight = 'bold';
- killCounter.style.zIndex = '1000';
- killCounter.style.backgroundColor = 'rgba(0, 0, 0, 0)';
- killCounter.style.padding = '5px';
- killCounter.style.borderRadius = '5px';
-
- var counterText = killCounter.querySelector('.counter-text');
- if (counterText) {
- counterText.style.minWidth = '30px';
- }
- }
- }
-
- function calculateAverageBoostWidth() {
- var counterLengths = [98.5, 98.5, 147.75, 49.25];
- var boostCounters = document.querySelectorAll('#ui-boost-counter .ui-bar-inner');
- var totalWidth = 0;
-
- boostCounters.forEach(function(counter, index) {
- var widthPercentage = parseFloat(counter.style.width);
- var unitLength = counterLengths[index];
- totalWidth += (widthPercentage / 100) * unitLength;
- });
-
- var totalUnitLength = counterLengths.reduce((a, b) => a + b, 0);
- var averageWidthPercentage = (totalWidth / totalUnitLength) * 100;
-
- return averageWidthPercentage.toFixed(2) + "%";
- }
-
- function toggleUIElementDisplay(enabled) {
- if (enabled) {
-
- var healthBarWidthCopy = document.createElement('span');
- healthBarWidthCopy.id = 'health-bar-width-copy';
- healthBarWidthCopy.classList.add('unselectable');
- healthBarWidthCopy.style.position = 'fixed';
- healthBarWidthCopy.style.fontSize = '25px';
- healthBarWidthCopy.style.fontWeight = 'bold';
- healthBarWidthCopy.style.display = 'none';
-
- var ammoCountCopy = document.createElement('span');
- ammoCountCopy.id = 'ammo-count-copy';
- ammoCountCopy.classList.add('unselectable');
- ammoCountCopy.style.position = 'fixed';
- ammoCountCopy.style.fontSize = '25px';
- ammoCountCopy.style.fontWeight = 'bold';
- ammoCountCopy.style.display = 'none';
-
- var weaponNameCopy = document.createElement('span');
- weaponNameCopy.id = 'weapon-name-copy';
- weaponNameCopy.classList.add('unselectable');
- weaponNameCopy.style.position = 'fixed';
- weaponNameCopy.style.fontSize = '20px';
- weaponNameCopy.style.fontWeight = 'bold';
- weaponNameCopy.style.display = 'none';
-
- var boostWidthCopy = document.createElement('span');
- boostWidthCopy.id = 'boost-width-copy';
- boostWidthCopy.classList.add('unselectable');
- boostWidthCopy.style.position = 'fixed';
- boostWidthCopy.style.fontSize = '20px';
- boostWidthCopy.style.fontWeight = 'bold';
- boostWidthCopy.style.color = 'orange';
- boostWidthCopy.style.display = 'none';
-
- function updateHealthBarWidthCopy() {
- var healthBar = document.getElementById('ui-health-actual');
- if (healthBar && healthBar.offsetWidth > 0 && healthBar.offsetHeight > 0) {
- var healthBarWidth = Math.round(parseFloat(healthBar.style.width));
- var healthBarColor = healthBar.style.backgroundColor;
-
- healthBarWidthCopy.textContent = healthBarWidth + "%";
- healthBarWidthCopy.style.color = healthBarColor;
- healthBarWidthCopy.style.display = 'block';
- } else {
- healthBarWidthCopy.style.display = 'none';
- }
- }
-
- function updateAmmoCountCopy() {
- var ammoCountElement = document.getElementById('ui-current-clip');
-
- if (ammoCountElement && window.getComputedStyle(ammoCountElement).display !== 'none' && parseFloat(window.getComputedStyle(ammoCountElement).opacity) > 0) {
- var ammoCount = ammoCountElement.textContent;
- ammoCountCopy.textContent = ammoCount;
- ammoCountCopy.style.color = ammoCountElement.style.color;
- ammoCountCopy.style.display = 'block';
- } else {
- ammoCountCopy.style.display = 'none';
- }
- }
-
- function updateWeaponNameCopy() {
- var equippedWeapon = document.querySelector('.ui-weapon-switch[style*="background-color: rgba(0, 0, 0, 0.4)"], .ui-weapon-switch[style*="opacity: 1"]');
- if (equippedWeapon) {
- var weaponName = equippedWeapon.querySelector('.ui-weapon-name').textContent;
- weaponNameCopy.textContent = weaponName;
- weaponNameCopy.style.color = 'white';
- weaponNameCopy.style.display = 'block';
- } else {
- weaponNameCopy.style.display = 'none';
- }
- }
-
- function updateBoostWidthCopy() {
- var boostElement = document.getElementById('ui-boost-counter');
- if (boostElement && window.getComputedStyle(boostElement).display !== 'none' && parseFloat(window.getComputedStyle(boostElement).opacity) > 0) {
- var averageBoostWidth = calculateAverageBoostWidth();
- boostWidthCopy.textContent = averageBoostWidth;
- boostWidthCopy.style.display = 'block';
- } else {
- boostWidthCopy.style.display = 'none';
- }
- }
-
- function followCursor(event) {
- healthBarWidthCopy.style.left = `${event.clientX - 70}px`;
- healthBarWidthCopy.style.top = `${event.clientY + 25}px`;
-
- ammoCountCopy.style.left = `${event.clientX + 40}px`;
- ammoCountCopy.style.top = `${event.clientY + 25}px`;
-
- weaponNameCopy.style.left = `${event.clientX + 40}px`;
- weaponNameCopy.style.top = `${event.clientY + 50}px`;
-
- boostWidthCopy.style.left = `${event.clientX - 70}px`;
- boostWidthCopy.style.top = `${event.clientY + 50}px`;
- }
- document.addEventListener('mousemove', followCursor);
-
- healthBarWidthCopy.style.webkitTouchCallout = 'none'; /* iOS Safari */
- healthBarWidthCopy.style.webkitUserSelect = 'none'; /* Safari */
- healthBarWidthCopy.style.userSelect = 'none'; /* Standard syntax */
-
- ammoCountCopy.style.webkitTouchCallout = 'none'; /* iOS Safari */
- ammoCountCopy.style.webkitUserSelect = 'none'; /* Safari */
- ammoCountCopy.style.userSelect = 'none'; /* Standard syntax */
-
- weaponNameCopy.style.webkitTouchCallout = 'none'; /* iOS Safari */
- weaponNameCopy.style.webkitUserSelect = 'none'; /* Safari */
- weaponNameCopy.style.userSelect = 'none'; /* Standard syntax */
-
- boostWidthCopy.style.webkitTouchCallout = 'none'; /* iOS Safari */
- boostWidthCopy.style.webkitUserSelect = 'none'; /* Safari */
- boostWidthCopy.style.userSelect = 'none'; /* Standard syntax */
-
- document.body.appendChild(healthBarWidthCopy);
- document.body.appendChild(ammoCountCopy);
- document.body.appendChild(weaponNameCopy);
- document.body.appendChild(boostWidthCopy);
-
- updateHealthBarWidthCopy();
- updateAmmoCountCopy();
- updateWeaponNameCopy();
- updateBoostWidthCopy();
-
- var healthObserver = new MutationObserver(updateHealthBarWidthCopy);
- var healthTargetNode = document.getElementById('ui-health-actual');
- if (healthTargetNode) {
- healthObserver.observe(healthTargetNode, { attributes: true, attributeFilter: ['style', 'class'] });
- }
- if (healthTargetNode && healthTargetNode.parentElement) {
- healthObserver.observe(healthTargetNode.parentElement, { attributes: true, attributeFilter: ['style', 'class'] });
- }
-
- var ammoObserver = new MutationObserver(updateAmmoCountCopy);
- var ammoTargetNode = document.getElementById('ui-current-clip');
- if (ammoTargetNode) {
- ammoObserver.observe(ammoTargetNode, { attributes: true, childList: true, subtree: true });
- }
-
- var weaponObserver = new MutationObserver(updateWeaponNameCopy);
- var weaponTargetNodes = document.querySelectorAll('.ui-weapon-switch');
- weaponTargetNodes.forEach(function(node) {
- weaponObserver.observe(node, { attributes: true, attributeFilter: ['style', 'class'] });
- });
-
- var boostObserver = new MutationObserver(updateBoostWidthCopy);
- var boostTargetNodes = document.querySelectorAll('#ui-boost-counter .ui-bar-inner');
- boostTargetNodes.forEach(function(node) {
- boostObserver.observe(node, { attributes: true, attributeFilter: ['style', 'class'] });
- });
-
- } else {
- var healthBarWidthCopy = document.getElementById('health-bar-width-copy');
- if (healthBarWidthCopy) {
- healthBarWidthCopy.parentNode.removeChild(healthBarWidthCopy);
- }
-
- var ammoCountCopy = document.getElementById('ammo-count-copy');
- if (ammoCountCopy) {
- ammoCountCopy.parentNode.removeChild(ammoCountCopy);
- }
-
- var weaponNameCopy = document.getElementById('weapon-name-copy');
- if (weaponNameCopy) {
- weaponNameCopy.parentNode.removeChild(weaponNameCopy);
- }
-
- var boostWidthCopy = document.getElementById('boost-width-copy');
- if (boostWidthCopy) {
- boostWidthCopy.parentNode.removeChild(boostWidthCopy);
- }
- }
- }
-
- toggleUIElementDisplay(true);
- showKillCounter();
- periodicallyShowKillCounter();
- })();