// ==UserScript== // @name SB-AUI // @namespace http://tampermonkey.net/ // @version 1.1.0 // @description Advanced UI for Starblast with extra features // @author Halcyon // @license All rights reserved, this code may not be reproduced or used in any way without the express written consent of the author. // @match https://starblast.io/ // @icon https://www.google.com/s2/favicons?sz=64&domain=starblast.io // @grant none // @downloadURL none // ==/UserScript== 'use strict'; const API_LINK = "https://starblast.dankdmitron.dev/api/simstatus.json"; const applyBaseStyles = (element, includeFont = true) => { element.style.boxShadow = "black 0px 0px 0px"; element.style.textShadow = "black 0px 0px 0px"; if (includeFont) { element.style.fontFamily = `"DM Sans", sans-serif`; } element.style.fontWeight = "400"; element.style.background = "#0b0b0b"; element.style.border = "1px solid #1a1a1a" element.style.color = "#FFF"; element.style.borderRadius = "10px"; } const applyStyles = (styles, element) => { if (!element) { return; } if (!styles) { return; } for (let key of Object.keys(styles)) { try { element.style[key] = styles[key] } catch (ex) {console.error(`applyStyles: Cannot apply style '${key}' to ${element}`)} } return; } try { var styleElement = document.createElement('style'); var importRule = ` @import url('https://fonts.googleapis.com/css2?family=Abel&family=DM+Sans:wght@400;500;700&display=swap'); `; styleElement.textContent = importRule; document.head.appendChild(styleElement); document.addEventListener("DOMContentLoaded", function() { var elementsToStyle = document.querySelectorAll("body"); elementsToStyle.forEach(function(element) { element.style.fontFamily = '"DM Sans", sans-serif'; }); }); } catch (ex) {} try { var style = document.createElement('style'); var fontFaceRule = ` @font-face { font-family: 'Ships'; /* Name your font */ src: url('https://starblast.dankdmitron.dev/fonts/Starblast/starblast-vanilla-ships.ttf') format('truetype'); } `; style.textContent = fontFaceRule; document.head.appendChild(style); } catch (ex) {} for (let el of document.querySelectorAll('button')) { applyBaseStyles(el) } document.documentElement.style.scrollbarWidth = 'thin'; // Internet Explorer and Microsoft Edge (legacy) document.documentElement.style.msOverflowStyle = 'none'; // For Microsoft Edge (Chromium-based) and modern browsers with standard scrollbar support var style = document.createElement('style'); var css = ` /* Webkit and Blink */ ::-webkit-scrollbar { width: 0.2em; } ::-webkit-scrollbar-thumb { background-color: #1a1a1a; border: none; border-radius: 0.1em; } ::-webkit-scrollbar-track { background-color: transparent; border: none; } /* Firefox */ scrollbar-width: thin; scrollbar-color: transparent transparent; `; style.appendChild(document.createTextNode(css)); document.head.appendChild(style); //document.querySelector("body").style.backgroundImage = "url(https://www.wallpaperflare.com/static/760/797/225/galaxy-space-stars-universe-wallpaper.jpg)"; document.querySelector("body").style.backgroundColor = "#0b0b0b"; let overlayStyles = { backgroundColor: "#1a1a1a", background: "repeating-linear-gradient(45deg, #1a1a1a 0, #131313 1px, #0b0b0b 0, #0b0b0b 50%)", backgroundSize: "10px 10px", maxWidth: "calc(100% - 60px)", maxHeight: "calc(100% - 60px)", margin: "auto auto", boxSizing: "content-box", boxShadow: "black 0px 0px 0px", border: "6px solid #131313", outline: "54px solid #0b0b0b", }; applyStyles(overlayStyles, document.querySelector("#overlay")); try { document.querySelector("#logo > img").src = "https://i.ibb.co/t25sFmR/SBAUI.png"; } catch (ex) { try { setTimeout(() => { document.querySelector("#logo > img").src = "https://i.ibb.co/t25sFmR/SBAUI.png"; }, 500) } catch (ex) { setTimeout(() => { document.querySelector("#logo > img").src = "https://i.ibb.co/t25sFmR/SBAUI.png"; }, 1000) } } document.querySelector("body").style.height = "100dvh"; document.querySelector("body").style.width = "100vw"; document.querySelector("#play").style.fontFamily = `"DM Sans", sans-serif`; document.querySelector("#play").style.letterSpacing = "4px" document.querySelector("#play").style.fontSize = "2.2rem" document.querySelector("#play").style.fontWeight = "600"; document.querySelector("#game_modes").style.background = `transparent`; document.querySelector("#game_modes").style.textShadow = `black 0px 0px 0px`; document.querySelector("#game_modes").style.fontFamily = `'Abel', sans-serif`; document.querySelector("#game_modes").style.fontSize = `1rem`; document.querySelector("#game_modes").style.letterSpacing = `0px`; document.querySelector("#game_modes").style.marginTop = `5px`; document.querySelector("#game_modes").style.marginLeft = `auto`; document.querySelector("#game_modes").style.marginRight = `auto`; document.querySelector("#game_modes").style.width = `80%`; document.querySelector("#game_modes").style.borderTop = `1px solid #1a1a1a`; document.querySelector("#game_modes").style.color = `gray`; document.querySelector(".changelog-new").style.fontFamily = `"DM Sans", sans-serif`; let removalQueries = ['[data-translate-base="music"]','[data-translate-base="community"]']; for (let query of removalQueries) { for (let el of document.querySelectorAll(query)) { el.style.display = "none" } } //followtools bottom-left document.querySelector('.followtools').style.left = '0'; document.querySelector('.followtools').style.width = 'max-content'; document.querySelector('.followtools').style.zIndex = '500'; document.querySelector('.bottom-left').style.top = '0'; document.querySelector('.bottom-left').style.height = 'max-content'; document.querySelector('.inputwrapper').style.background = '#0b0b0b'; document.querySelector('.inputwrapper').style.border = '1px solid #1a1a1a'; document.querySelector('.inputwrapper').style.fontFamily = 'DM Sans'; document.querySelector('.inputwrapper').style.boxShadow = 'black 0px 0px 0px'; document.querySelector('.inputwrapper').style.borderRadius = '10px'; const leftRight = [document.querySelector('#prevMode'),document.querySelector('#nextMode')]; for (let el of leftRight) { el.style.color = '#FFFFFF'; el.style.textShadow = 'black 0px 0px 0px'; } const baseStyleQueries = ['.changelog-new', '#moddingspace', "#donate", "#rankings", "#training"]; for (let query of baseStyleQueries) { applyBaseStyles(document.querySelector(query)); } const ml = ['#moddingspace', "#donate", "#rankings", "#training"] for (let query of ml) { let item = document.querySelector(query); item.style.paddingBottom = "0.5rem"; let icon = document.querySelector(`${query} > i`); icon.style.margin = "0.5rem auto 0.5rem auto"; icon.style.paddingBottom = '0.5rem'; icon.style.width = '80%'; icon.style.borderBottom = '1px solid #1a1a1a'; let span = document.querySelector(`${query} > span`); span.style.color = "#FFF"; span.style.letterSpacing = '1px'; span.style.textShadow = 'black 0px 0px 0px'; span.style.fontWeight = '500'; } for (let el of document.querySelectorAll('.modal')) { applyBaseStyles(el); } for (let el of document.querySelectorAll('.social i')) { applyBaseStyles(el, false); } var J = document.createElement("div"); J.id = "SL_INTEGRATION"; document.querySelector('#overlay').appendChild(J); const SL_INTEGRATION = document.querySelector('#SL_INTEGRATION'); let styles = { position: 'absolute', height: '100%', width: '25%', top: '0', right: '0', display: 'flex', flexDirection: 'column' } for (let key of Object.keys(styles)) { SL_INTEGRATION.style[key] = styles[key] } let options = { activePanel: "listing", activeRegion: "europe", modes: { team: true, survival: false, deathmatch: false, modded: false, invasion: false } }; let filteredSystems = []; let statusReportActive = false; let statusReportData = { name: "", id: "", team_1: { hue: null, gems: 0, level: 0, potentialOutput: 0, PBS: 0, PPBS: 0, players: [] }, team_2: { hue: null, gems: 0, level: 0, potentialOutput: 0, PBS: 0, PPBS: 0, players: [] }, team_3: { hue: null, gems: 0, level: 0, potentialOutput: 0, PBS: 0, PPBS: 0, players: [] } }; const templateStatusData = () => ({name: "",team_1: {hue: null,players: []},team_2: {hue: null,players: []},team_3: {hue: null,players: []}}) window.switchActivePanel = (panel) => { options.activePanel = panel; refreshSL(); } window.switchActiveRegion = (region) => { options.activeRegion = region; refreshSL(); } window.toggleMode = (mode) => { options.modes[mode] = !options.modes[mode]; refreshSL(); } let API_TIMER = setInterval(async () => { if (options.activePanel !== 'listing') { return; } let raw = await(await fetch(API_LINK)).json(); let allSystems = []; for (let item of raw) { if (item.hasOwnProperty("modding") && item.modding) { if (!options.modes.modding) { continue; } } if (item.location.toLowerCase() !== options.activeRegion) { continue; } for (let system of item.systems) { if (options.modes[system.mode]) { allSystems.push({ ...system, IP_ADDR: item.address }); } } } filteredSystems = allSystems.sort((a, b) => a.time - b.time); refreshSL(); }, 3000) const capitalize = str => str.charAt(0).toUpperCase() + str.slice(1); let STATUS_TIMER = null; window.statusReport = async (query) => { if (STATUS_TIMER) {return}; STATUS_TIMER = setInterval(async () => { statusReportActive = true; refreshSL(); let raw = await (await fetch(`https://starblast.dankdmitron.dev/api/status/${query}`)).json(); statusReportData = templateStatusData(); statusReportData.name = raw.name; statusReportData.id = query.split('@')[0]; for (let key of Object.keys(raw.players)) { let player = raw.players[key]; statusReportData[`team_${player.friendly + 1}`].players.push({ name: player.player_name, ecp: !!player.custom, score: player.score, type: player.type, PBS: calculatePlayerScore(player.type, !!player.custom) }) statusReportData[`team_${player.friendly + 1}`].hue = player.hue; } for (let team of raw.mode.teams) { for (let num of ["team_1", "team_2", "team_3"]) { if (team.hue === statusReportData[num].hue) { statusReportData[num].gems = team.crystals statusReportData[num].level = team.level break } } } for (let team of ["team_1", "team_2", "team_3"]) { let sPBS = 0, sPPBS = 0, potentialOutput = 0; for (let i = 0; i < statusReportData[team].players.length; i++) { sPBS += Number(statusReportData[team].players[i].PBS.currentScore); sPPBS += Number(statusReportData[team].players[i].PBS.potentialScore); potentialOutput += statusReportData[team].players[i].PBS.energyOutput; } statusReportData[team].PBS = sPBS.toFixed(2); statusReportData[team].PPBS = sPPBS.toFixed(2); statusReportData[team].potentialOutput = potentialOutput; } statusReportData.team_1.players = statusReportData.team_1.players.sort((a, b) => a.score - b.score).reverse(); statusReportData.team_2.players = statusReportData.team_2.players.sort((a, b) => a.score - b.score).reverse(); statusReportData.team_3.players = statusReportData.team_3.players.sort((a, b) => a.score - b.score).reverse(); }, 2000) } window.closeStatusReport = () => { statusReportActive = false; clearInterval(STATUS_TIMER); STATUS_TIMER = null; refreshSL(); } document.querySelector('#play').addEventListener('click', () => { clearInterval(API_TIMER); clearInterval(STATUS_TIMER); SL_INTEGRATION.style.display = 'none'; }); const refreshSL = () => { SL_INTEGRATION.innerHTML = ` ${ !statusReportActive ? "" : ` ` }
Starblast AUI v1.1.0
API (Serverlist+): dankdmitron
Design and integration: Halcyon
LISTING
SETTINGS
${ filteredSystems.length === 0 ? "" : filteredSystems.map(system => { return `
${system.name}
${system.mode === 'modding' ? capitalize(system.mod_id) : capitalize(system.mode)}
${~~(system.time / 60)} min
${system.players} players
` }).join('') }
REGION:
Europe
${ options.activeRegion == "europe" ? `` : `` }
America
${ options.activeRegion == "america" ? `` : `` }
Asia
${ options.activeRegion == "asia" ? `` : `` }
MODE:
Team Mode
${ options.modes.team ? `` : `` }
Survival
${ options.modes.survival ? `` : `` }
Deathmatch
${ options.modes.deathmatch ? `` : `` }
Modded
${ options.modes.modded ? `` : `` }
Invasion
${ options.modes.invasion ? `` : `` }
` } function hueToColorName(hue) { const colorMap = [ { hueRange: [0, 15], colorName: 'Red' }, { hueRange: [15, 45], colorName: 'Orange' }, { hueRange: [45, 75], colorName: 'Yellow' }, { hueRange: [75, 150], colorName: 'Green' }, { hueRange: [150, 195], colorName: 'Cyan' }, { hueRange: [195, 285], colorName: 'Blue' }, { hueRange: [285, 330], colorName: 'Magenta' }, { hueRange: [330, 360], colorName: 'Red' } ]; const matchedColor = colorMap.find(entry => hue >= entry.hueRange[0] && hue < entry.hueRange[1]); return matchedColor ? matchedColor.colorName : 'Undefined'; } const calculatePlayerScore = (type, ecp) => { const playerScore = { currentScore: Number(String(type).split('')[0]) / 15, potentialScore: 0.7, energyOutput: 0 } if (ecp) { playerScore.currentScore += 0.25 playerScore.potentialScore += 0.25 } let energyOutput = 0; switch (type) { case 701: if (ecp) { playerScore.currentScore += 2.5 playerScore.potentialScore = playerScore.currentScore } else { playerScore.currentScore += 1.5 playerScore.potentialScore = playerScore.currentScore } energyOutput = 150; break case 702: if (ecp) { playerScore.currentScore += 1.7 playerScore.potentialScore = playerScore.currentScore } else { playerScore.currentScore += 1 playerScore.potentialScore = playerScore.currentScore } energyOutput = 50; break case 703: if (ecp) { playerScore.currentScore += 1.4 playerScore.potentialScore = playerScore.currentScore } else { playerScore.currentScore += 0.4 playerScore.potentialScore = playerScore.currentScore } energyOutput = 100; break case 704: if (ecp) { playerScore.currentScore += 1 playerScore.potentialScore = playerScore.currentScore } else { playerScore.currentScore += 0.3 playerScore.potentialScore = playerScore.currentScore } energyOutput = 175; break case 601: if (ecp) { playerScore.currentScore += 1.2 playerScore.potentialScore += 2.5 } else { playerScore.currentScore += 0.5 playerScore.potentialScore += 1.5 } energyOutput = 60; break case 602: if (ecp) { playerScore.currentScore += 1.2 playerScore.potentialScore += 2.5 } else { playerScore.currentScore += 0.45 playerScore.potentialScore += 1.5 } energyOutput = 50; break case 603: if (ecp) { playerScore.currentScore += 0.9 playerScore.potentialScore += 1.7 } else { playerScore.currentScore += 0.25 playerScore.potentialScore += 1 } energyOutput = 40; break case 604: if (ecp) { playerScore.currentScore += 0.5 playerScore.potentialScore += 1.7 } else { playerScore.currentScore += 0.25 playerScore.potentialScore += 1 } energyOutput = 48; break case 605: if (ecp) { playerScore.currentScore += 0.9 playerScore.potentialScore += 1.7 } else { playerScore.currentScore += 0.25 playerScore.potentialScore += 1 } energyOutput = 45; break case 606: if (ecp) { playerScore.currentScore += 0.9 playerScore.potentialScore += 1.7 } else { playerScore.currentScore += 0.2 playerScore.potentialScore += 1 } energyOutput = 45; break case 607: if (ecp) { playerScore.currentScore += 1.75 playerScore.potentialScore += 1.65 } else { playerScore.currentScore += 0.3 playerScore.potentialScore += 0.2 } energyOutput = 0; break case 608: if (ecp) { playerScore.currentScore += 0.5 playerScore.potentialScore += 1.4 } else { playerScore.currentScore += 0.1 playerScore.potentialScore += 0.4 } energyOutput = 40; break case 501: if (ecp) { playerScore.currentScore += 1.05 playerScore.potentialScore += 2.5 } else { playerScore.currentScore += 0.45 playerScore.potentialScore += 1.5 } energyOutput = 60; break case 502: if (ecp) { playerScore.currentScore += 0.75 playerScore.potentialScore += 2.5 } else { playerScore.currentScore += 0.3 playerScore.potentialScore += 1.5 } energyOutput = 40; break case 503: if (ecp) { playerScore.currentScore += 0.2 playerScore.potentialScore += 1.7 } else { playerScore.currentScore += 0.1 playerScore.potentialScore += 1 } energyOutput = 50; break case 504: if (ecp) { playerScore.currentScore += 0.1 playerScore.potentialScore += 1.7 } else { playerScore.currentScore += 0.1 playerScore.potentialScore += 1 } energyOutput = 45; break case 505: if (ecp) { playerScore.currentScore += 0.1 playerScore.potentialScore += 1.7 } else { playerScore.currentScore += 0.1 playerScore.potentialScore += 1 } energyOutput = 29; break case 506: if (ecp) { playerScore.currentScore += 0.9 playerScore.potentialScore += 1.75 } else { playerScore.currentScore += 0.5 playerScore.potentialScore += 0.3 } energyOutput = 50; break case 507: if (ecp) { playerScore.currentScore += 0.1 playerScore.potentialScore += 1.75 } else { playerScore.currentScore += 0.1 playerScore.potentialScore += 0.3 } energyOutput = 35; break case 401: if (ecp) { playerScore.currentScore += 0.3 playerScore.potentialScore += 2.5 } else { playerScore.currentScore += 0.05 playerScore.potentialScore += 1.5 } energyOutput = 35; break case 402: if (ecp) { playerScore.currentScore += 0.55 playerScore.potentialScore += 2.5 } else { playerScore.currentScore += 0.25 playerScore.potentialScore += 1.5 } energyOutput = 50; break case 403: if (ecp) { playerScore.currentScore += 0.4 playerScore.potentialScore += 1.7 } else { playerScore.currentScore += 0.2 playerScore.potentialScore += 1 } energyOutput = 55; break case 404: if (ecp) { playerScore.currentScore += 0.3 playerScore.potentialScore += 1.7 } else { playerScore.currentScore += 0.15 playerScore.potentialScore += 1 } energyOutput = 40; break case 405: energyOutput = 30; break case 406: energyOutput = 25; break case 301: if (ecp) { playerScore.currentScore += 0.2 playerScore.potentialScore += 2.5 } else { playerScore.currentScore += 0.05 playerScore.potentialScore += 1.5 } energyOutput = 30; break case 302: if (ecp) { playerScore.currentScore += 0.15 playerScore.potentialScore += 1.7 } else { playerScore.currentScore += 0.08 playerScore.potentialScore += 1 } energyOutput = 35; break case 303: if (ecp) { playerScore.currentScore += 0 playerScore.potentialScore += 1.7 } else { playerScore.currentScore += 0 playerScore.potentialScore += 1 } energyOutput = 16; break case 304: if (ecp) { playerScore.currentScore += 0.15 playerScore.potentialScore += 1.75 } else { playerScore.currentScore += 0.05 playerScore.potentialScore += 0.3 } energyOutput = 25; break case 201: if (ecp) { playerScore.currentScore += 0.05 playerScore.potentialScore += 2.5 } else { playerScore.currentScore += 0 playerScore.potentialScore += 1.5 } energyOutput = 25; break case 202: if (ecp) { playerScore.currentScore += 0.02 playerScore.potentialScore += 1.75 } else { playerScore.currentScore += 0 playerScore.potentialScore += 0.3 } energyOutput = 20; break default: break } playerScore.energyOutput = energyOutput; return playerScore } const SHIP_LINKS = [ "https://i.ibb.co/6gjB0Y9/504.png", "https://i.ibb.co/h1BWddj/505.png", "https://i.ibb.co/ZG2wQtk/506.png", "https://i.ibb.co/ZxY43kc/507.png", "https://i.ibb.co/f8zzwcS/601.png", "https://i.ibb.co/hXgqvHQ/602.png", "https://i.ibb.co/HxNmSPY/603.png", "https://i.ibb.co/DVZrPT7/604.png", "https://i.ibb.co/w6jZfmK/605.png", "https://i.ibb.co/p4qBj2k/606.png", "https://i.ibb.co/4fjJcBC/607.png", "https://i.ibb.co/wYMGzCs/608.png", "https://i.ibb.co/ZNmcHfC/701.png", "https://i.ibb.co/JWZFqVv/702.png", "https://i.ibb.co/X2w682R/703.png", "https://i.ibb.co/RQrfMGW/704.png", "https://i.ibb.co/s3YVpVW/101.png", "https://i.ibb.co/w7GFPR5/201.png", "https://i.ibb.co/4JsJz8G/202.png", "https://i.ibb.co/Pz0xp1s/301.png", "https://i.ibb.co/M7PWNz7/302.png", "https://i.ibb.co/4ZKStWk/303.png", "https://i.ibb.co/df72XT8/304.png", "https://i.ibb.co/VM2kJgD/401.png", "https://i.ibb.co/8g6qgBw/402.png", "https://i.ibb.co/HnqK41P/403.png", "https://i.ibb.co/s2grnKB/404.png", "https://i.ibb.co/cvj9FWz/405.png", "https://i.ibb.co/64fsKPt/406.png", "https://i.ibb.co/27fLBPx/501.png", "https://i.ibb.co/3SfYGZX/502.png", "https://i.ibb.co/9pJt735/503.png" ] refreshSL(); const SL_SETTINGS_REF = document.querySelector('#SL_SETTINGS_REF'); const SL_LISTING_REF = document.querySelector('#SL_LISTING_REF'); /*var element = document.getElementById("content"); element.style.marginTop = "0px" var observer = new MutationObserver(function(mutationsList, observer) { for (var mutation of mutationsList) { if (mutation.type === "attributes" && mutation.attributeName === "style") { if (element.style.marginTop !== "0px") { element.style.marginTop = "0px"; } } } }); observer.observe(element, { attributes: true });*/