// ==UserScript== // @name Alguien Client - Surve.io Client // @namespace https://github.com/SoyAlguien0/AlguienClient // @version 0.0.1 // @description A client to enhance the survev.io in-game experience with many features, as well as future features. // @author SoyAlguien // @license AGPL-3.0 // @require https://update.greasyfork.org/scripts/391611/743919/WSHook.js // @run-at document-end // @match *://survev.io/* // @match *://66.179.254.36/* // @match *://expandedwater.online/* // @grant none // @downloadURL none // ==/UserScript== class GameMod { constructor() { this.lastFrameTime = performance.now(); this.frameCount = 0; this.fps = 0; this.isFpsUncapped = false; this.isFpsVisible = true; this.isMenuVisible = true; this.animationFrameCallback = window.requestAnimationFrame.bind(window); this.initFpsCounter(); this.initMenu(); this.startUpdateLoop(); this.setupWeaponBorderHandler(); this.setupKeyListeners(); } initFpsCounter() { this.fpsCounter = document.createElement("div"); this.fpsCounter.id = "fpsCounter"; Object.assign(this.fpsCounter.style, { position: "fixed", top: "10px", left: "10px", color: "white", backgroundColor: "rgba(0, 0, 0, 0.2)", padding: "5px 10px", borderRadius: "5px", fontFamily: "Arial, sans-serif", fontSize: "14px", zIndex: "10000", pointerEvents: "none", }); document.body.appendChild(this.fpsCounter); this.updateFpsVisibility(); } updateFpsVisibility() { this.fpsCounter.style.display = this.isFpsVisible ? "block" : "none"; } toggleFpsDisplay() { this.isFpsVisible = !this.isFpsVisible; this.updateFpsVisibility(); } toggleFpsUncap() { this.isFpsUncapped = !this.isFpsUncapped; this.animationFrameCallback = this.isFpsUncapped ? (callback) => setTimeout(callback, 1) : window.requestAnimationFrame.bind(window); } updateHealthBars() { const healthBars = document.querySelectorAll("#ui-health-container"); healthBars.forEach((container) => { const bar = container.querySelector("#ui-health-actual"); if (bar) { const width = Math.round(parseFloat(bar.style.width)); let percentageText = container.querySelector(".health-text"); if (!percentageText) { percentageText = document.createElement("span"); percentageText.classList.add("health-text"); Object.assign(percentageText.style, { width: "100%", textAlign: "center", marginTop: "5px", color: "#333", fontSize: "20px", fontWeight: "bold", position: "absolute", zIndex: "10", }); container.appendChild(percentageText); } percentageText.textContent = `${width}%`; } }); } updateBoostBars() { const boostCounter = document.querySelector("#ui-boost-counter"); if (boostCounter) { const boostBars = boostCounter.querySelectorAll( ".ui-boost-base .ui-bar-inner", ); let totalBoost = 0; const weights = [25, 25, 40, 10]; boostBars.forEach((bar, index) => { const width = parseFloat(bar.style.width); if (!isNaN(width)) { totalBoost += width * (weights[index] / 100); } }); const averageBoost = Math.round(totalBoost); let boostDisplay = boostCounter.querySelector(".boost-display"); if (!boostDisplay) { boostDisplay = document.createElement("div"); boostDisplay.classList.add("boost-display"); Object.assign(boostDisplay.style, { position: "absolute", bottom: "75px", right: "335px", color: "#FF901A", backgroundColor: "rgba(0, 0, 0, 0.4)", padding: "5px 10px", borderRadius: "5px", fontFamily: "Arial, sans-serif", fontSize: "14px", zIndex: "10", textAlign: "center", }); boostCounter.appendChild(boostDisplay); } boostDisplay.textContent = `AD: ${averageBoost}%`; } } setupWeaponBorderHandler() { const weaponContainers = Array.from( document.getElementsByClassName("ui-weapon-switch"), ); weaponContainers.forEach((container) => { if (container.id === "ui-weapon-id-4") { container.style.border = "3px solid #2f4032"; } else { container.style.border = "3px solid #FFFFFF"; } }); const weaponNames = Array.from( document.getElementsByClassName("ui-weapon-name"), ); weaponNames.forEach((weaponNameElement) => { const weaponContainer = weaponNameElement.closest(".ui-weapon-switch"); const observer = new MutationObserver(() => { const weaponName = weaponNameElement.textContent.trim(); let border = "#FFFFFF"; switch (weaponName.toUpperCase()) { case "CZ-3A1": case "G18C": case "M9": case "M93R": case "MAC-10": case "MP5": case "P30L": case "DUAL P30L": case "UMP9": case "VECTOR (9MM)": case "VSS": case "FLAMETHROWER": border = "#FFAE00"; break; case "AK-47": case "OT-38": case "OTS-38": case "M39 EMR": case "DP-28": case "MOSIN-NAGANT": case "SCAR-H": case "SV-98": case "M1 GARAND": case "PKP PECHENEG": case "AN-94": case "BAR M1918": case "BLR 81": case "SVD-63": case "M134": case "WATER GUN": border = "#007FFF"; break; case "FAMAS": case "M416": case "M249": case "QBB-97": case "MK 12 SPR": case "M4A1-S": case "SCOUT ELITE": case "L86A2": border = "#0f690d"; break; case "M870": case "MP220": case "SAIGA-12": case "SPAS-12": case "USAS-12": case "SUPER 90": case "LASR GUN": case "M1100": border = "#FF0000"; break; case "DEAGLE 50": case "RAINBOW BLASTER": border = "#000000"; break; case "AWM-S": case "MK 20 SSR": border = "#808000"; break; case "FLARE GUN": border = "#FF4500"; break; case "MODEL 94": case "PEACEMAKER": case "VECTOR (.45 ACP)": case "M1911": case "M1A1": border = "#800080"; break; case "M79": border = "#008080"; break; case "POTATO CANNON": case "SPUD GUN": border = "#A52A2A"; break; case "HEART CANNON": border = "#FFC0CB"; break; default: border = "#FFFFFF"; break; } if (weaponContainer.id !== "ui-weapon-id-4") { weaponContainer.style.border = `3px solid ${border}`; } }); observer.observe(weaponNameElement, { childList: true, characterData: true, subtree: true, }); }); } updateMenuButtonText() { const hideButton = document.getElementById("hideMenuButton"); hideButton.textContent = this.isMenuVisible ? "Hide Menu [P]" : "Show Menu [P]"; } setupKeyListeners() { document.addEventListener("keydown", (event) => { if (event.key.toLowerCase() === "p") { this.toggleMenuVisibility(); } }); } initMenu() { const menu = document.createElement("div"); menu.id = "soyAlguienMenu"; Object.assign(menu.style, { position: "fixed", top: "50px", left: "10px", backgroundColor: "rgba(0, 0, 0, 0.8)", padding: "15px", borderRadius: "10px", boxShadow: "0 4px 10px rgba(0, 0, 0, 0.6)", zIndex: "10001", width: "250px", fontFamily: "Arial, sans-serif", color: "#fff", }); const title = document.createElement("h2"); title.textContent = "SoyAlguien Mod Menu"; title.style.margin = "0 0 10px"; title.style.textAlign = "center"; title.style.fontSize = "18px"; title.style.color = "#FFAE00"; menu.appendChild(title); const fpsToggle = document.createElement("button"); fpsToggle.textContent = "Show FPS"; Object.assign(fpsToggle.style, { backgroundColor: "#FFAE00", border: "none", color: "#fff", padding: "10px", borderRadius: "5px", width: "100%", marginBottom: "10px", fontSize: "14px", cursor: "pointer", }); fpsToggle.onclick = () => this.toggleFpsDisplay(); menu.appendChild(fpsToggle); const uncapFpsToggle = document.createElement("button"); uncapFpsToggle.textContent = "Uncap FPS"; Object.assign(uncapFpsToggle.style, { backgroundColor: "#FF4500", border: "none", color: "#fff", padding: "10px", borderRadius: "5px", width: "100%", marginBottom: "10px", fontSize: "14px", cursor: "pointer", }); uncapFpsToggle.onclick = () => this.toggleFpsUncap(); menu.appendChild(uncapFpsToggle); const hideShowToggle = document.createElement("button"); hideShowToggle.textContent = "Hide/Show Menu [P]"; Object.assign(hideShowToggle.style, { backgroundColor: "#808080", border: "none", color: "#fff", padding: "10px", borderRadius: "5px", width: "100%", marginBottom: "10px", fontSize: "14px", cursor: "pointer", }); hideShowToggle.onclick = () => this.toggleMenuVisibility(); menu.appendChild(hideShowToggle); document.body.appendChild(menu); this.menu = menu; } toggleMenuVisibility() { const isVisible = this.menu.style.display !== "none"; this.menu.style.display = isVisible ? "none" : "block"; } startUpdateLoop() { const now = performance.now(); const delta = now - this.lastFrameTime; this.frameCount++; if (delta >= 1000) { this.fps = Math.round((this.frameCount * 1000) / delta); this.frameCount = 0; this.lastFrameTime = now; if (this.isFpsVisible) { this.fpsCounter.textContent = `FPS: ${this.fps}`; } } this.updateHealthBars(); this.updateBoostBars(); this.animationFrameCallback(() => this.startUpdateLoop()); } } const gameMod = new GameMod();