// ==UserScript==
// @name Vortex Client
// @namespace http://tampermonkey.net/
// @version Beta
// @description Vortex Client for Bloxd.io
// @author GEORGECR
// @homepageURL https://georgecr0.github.io/Vortex-Client/
// @icon https://i.postimg.cc/fRpcmPqN/Vortex-Logo.png
// @match https://bloxd.io/*
// @license All Rights Reserved – Permission Required
// @grant none
// ==/UserScript==
(function () {
'use strict';
// No copyright.
// If you have questions about the code or want to use parts of it, feel free to DM me on Discord: ge0rgecr_
const storageKey = 'vortexClientModuleStates';
const settingsStorageKey = 'vortexClientModuleSettings';
//MODULES (this is not ai bruh its just so its more clean)
const modules = {
'Combat': [
{
name: 'Keystrokes', description: '(coming soon)', hasSettings: true, enabled: false,
onEnable: () => { },
onDisable: () => { },
settings: [
]
},
{
name: 'Combat Log Timer', description: '(coming soon)', enabled: false,
onEnable: () => { },
onDisable: () => { },
},
{
name: 'Anti Shake', description: '(coming soon)', enabled: false,
onEnable: () => { },
onDisable: () => { },
},
],
'Visual': [
{
name: 'Armour View', description: 'Shows your armor status\nand durability.', hasSettings: true, enabled: true,
onEnable: () => { armorDisplayModule.start() },
onDisable: () => { armorDisplayModule.stop() },
settings: [
{ id: 'armourview_scale', label: 'Scale', type: 'slider', min: 0.5, max: 2.0, step: 0.1, defaultValue: 1.0 },
{ id: 'armourview_orientation', label: 'Orientation', type: 'dropdown', options: ['Horizontal', 'Vertical'], defaultValue: 'Horizontal' }
]
},
{
name: 'Cps Counter', description: 'Displays your clicks per\nsecond (CPS).', enabled: true,
onEnable: () => { cpsModule.start() },
onDisable: () => { cpsModule.stop() }
},
{
name: 'Ping Counter', description: 'Shows your current ping\nto the server.', enabled: true,
onEnable: () => { pingModule.start() },
onDisable: () => { pingModule.stop() }
},
{
name: 'Custom Crosshair', description: 'Customize your crosshair\nstyle and color.', hasSettings: true, enabled: false,
onEnable: () => { crosshairModule.start() },
onDisable: () => { crosshairModule.stop() },
settings: [
{ id: 'crosshair_color', label: 'Color', type: 'color', defaultValue: '#ffffff' },
{ id: 'crosshair_size', label: 'Size', type: 'slider', min: 1, max: 10, step: 1, defaultValue: 4 },
{ id: 'crosshair_shape', label: 'Shape', type: 'dropdown', options: ['Default', 'Cross', 'Square', 'Dot', 'Arrow', 'Crossed'], defaultValue: 'Default' }
]
}
],
'Player': [
{
name: 'Cinematic Mode', description: '(coming soon)', hasSettings: true, enabled: false,
onEnable: () => { },
onDisable: () => { },
settings: [
]
}
],
'Utility': [
{
name: 'Resolution Adjuster', description: 'Change game resolution\nwithout restarting.', hasSettings: true, enabled: false,
onEnable: () => {resolutionAdjusterModule.start()},
onDisable: () => {resolutionAdjusterModule.stop() },
settings: [
{ id: 'resolution_value', label: 'Resolution', type: 'slider', min: 0.1, max: 1.0, step: 0.1, defaultValue: 1.0 },
]
},
{
name: 'Snap Look', description: '(coming soon)', hasSettings: true, enabled: false,
onEnable: () => {},
onDisable: () => { },
settings: [
]
},
{
name: 'Better Zoom', description: '(coming soon)', hasSettings: true, enabled: false,
onEnable: () => {},
onDisable: () => {},
settings: [
]
},
],
'Cosmetics': [
{
name: 'Nametags', description: 'Customize appearance\nof player nametags.', hasSettings: true, enabled: false,
onEnable: () => nametagsModule.start(),
onDisable: () => nametagsModule.stop(),
settings: [
{ id: 'nametags_custom_ui', type: 'custom' }
]
},
{
name: 'Custom Capes', description:'(coming soon)', hasSettings: true, enabled: false,
onEnable: () => nametagsModule.start(),
onDisable: () => nametagsModule.stop(),
settings: [
]
},
],
'Settings': [
]
};
function getModuleByName(moduleName) {
for (const category of Object.values(modules)) {
const foundModule = category.find(m => m.name === moduleName);
if (foundModule) {
return foundModule;
}
}
return null;
}
function initializeModules() {
const savedStates = JSON.parse(localStorage.getItem(storageKey)) || {};
Object.values(modules).flat().forEach(module => {
const isEnabled = savedStates[module.name] !== undefined ? savedStates[module.name] : module.enabled;
if (isEnabled && typeof module.onEnable === 'function') {
module.onEnable();
}
});
}
//CLIENT UI & SHIT (this is not ai bruh its just so its more clean)
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'https://cdn.jsdelivr.net/npm/[email protected]/fonts/remixicon.css';
document.head.appendChild(link);
const gameui = document.querySelector('.WholeAppWrapper');
gameui.style.display = 'block';
gameui.style.filter = 'grayscale(80%) brightness(0.6)';
gameui.style.transition = 'all 0.2s ease';
let menuInterval, gameInterval;
const ClientHud = document.createElement('div');
ClientHud.style.position = 'fixed';
ClientHud.style.left = '0px';
ClientHud.style.top = '0px';
ClientHud.style.backgroundColor = 'transparent';
ClientHud.style.width = '100%';
ClientHud.style.height = '100%';
ClientHud.style.display = 'block';
ClientHud.style.zIndex = '1';
ClientHud.style.pointerEvents = 'none';
document.body.appendChild(ClientHud);
function inMenu() {
ClientHud.style.display = 'none';
['LogoLoaderOuter' , 'LogoLoaderInner' , 'AdBannerContainer' ,'HomeHeaderRight LinkIconList'].forEach(className => {
document.querySelectorAll('.' + className).forEach(el => el.remove());
});
document.title = "Bloxd.io - Vortex Client";
const MainTitle = document.querySelector('.Title');
if (MainTitle) {
MainTitle.style.webkitTextStroke = "0px";
MainTitle.textContent = "VORTEX CLIENT";
MainTitle.style.textShadow = "none";
MainTitle.style.fontSize = "55px";
}
const background = document.querySelector(".HomePageBackground");
if (background) {
background.style.backgroundImage = 'url(https://i.postimg.cc/dQZ3BwG5/194693-Minecraft-video-games-shaders-748x421.png)';
}
const TitleContainer = document.querySelector('.TitleContainer');
TitleContainer.style.width = '70%';
document.querySelectorAll('.AvailableGameText.SmallTextBold').forEach(CardText => {
CardText.style.backgroundColor = 'transparent';
CardText.style.textShadow = '1px 1px 2px black';
});
document.querySelectorAll('.AvailableGame').forEach(GameCardContainer => {
GameCardContainer.style.boxShadow = "0 4px 12px rgba(0, 0, 0, 0.2)";
});
}
function inGame() {
ClientHud.style.display = 'block';
document.querySelectorAll(".AdBannerContainer").forEach(adHolder => {
adHolder.remove();
});
const GameHeader = document.querySelector('.InGameHeader');
if (GameHeader) {
GameHeader.style.backgroundColor = 'rgba(30, 33, 41, 0.85)';
GameHeader.style.padding = '23px 5px';
GameHeader.style.borderRadius = '9px';
function makeMessagesTransparent() {
document.querySelectorAll('.MessageWrapper').forEach(msg => {
msg.style.backgroundColor = 'transparent';
});
}
makeMessagesTransparent();
const chatContainer = document.querySelector('.Chat');
if (chatContainer) {
const observer = new MutationObserver(() => {
makeMessagesTransparent();
});
observer.observe(chatContainer, {
childList: true,
subtree: true
});
}
const InGameChat = document.querySelector('.Chat');
InGameChat.style.backgroundColor = 'rgba(30, 33, 41 ,0.85)';
InGameChat.style.borderRadius = '9px';
InGameChat.style.maxHeight = '350px';
InGameChat.style.width = '400px';
InGameChat.style.maxWidth = '400px';
InGameChat.style.padding = '10px 0px';
if (GameHeader && InGameChat) {
const headerRect = GameHeader.getBoundingClientRect();
InGameChat.style.position = "absolute";
InGameChat.style.top = `${headerRect.bottom + 5 + window.scrollY}px`;
}
if (!document.querySelector('.VortexInGameLogo')) {
const InGameLogoHolder = document.createElement('div');
InGameLogoHolder.classList.add('VortexInGameLogo');
InGameLogoHolder.style.display = 'flex';
InGameLogoHolder.style.alignItems = 'center';
InGameLogoHolder.style.marginRight = '0px';
const VortexInGameLogo = document.createElement('div');
VortexInGameLogo.style.backgroundImage = 'url(https://i.postimg.cc/WpkLShLM/Vortex-Client-Logo-Bigger.png)';
VortexInGameLogo.style.backgroundRepeat = 'no-repeat';
VortexInGameLogo.style.backgroundSize = 'contain';
VortexInGameLogo.style.backgroundPosition = 'center';
VortexInGameLogo.style.color = '#fff';
VortexInGameLogo.style.width = '2em';
VortexInGameLogo.style.height = '1.5em';
VortexInGameLogo.style.display = 'flex';
VortexInGameLogo.style.alignItems = 'center';
VortexInGameLogo.style.justifyContent = 'center';
VortexInGameLogo.style.margin = '0 0 0 3px';
const text = document.createElement('span');
text.textContent = 'ortex';
text.style.fontSize = '1.1em';
text.style.fontWeight = 'bolder';
text.style.color = '#fff';
text.style.display = 'flex';
text.style.alignItems = 'center';
text.style.marginLeft = '-10px';
text.style.marginTop = '-2px';
InGameLogoHolder.appendChild(VortexInGameLogo);
InGameLogoHolder.appendChild(text);
GameHeader.prepend(InGameLogoHolder);
} ['LikeButton', 'InGameHeaderLogo', 'InGameHeaderSpacer'].forEach(className => {
document.querySelectorAll('.' + className).forEach(Hidden => {
Hidden.style.display = 'none';
Hidden.style.opacity = '0';
});
});
const LobbyName = document.querySelector('.InGameHeaderLobbyName');
if (LobbyName) {
LobbyName.style.color = 'gray';
LobbyName.style.borderRadius = '8px';
} ['FpsWrapperDiv', 'CoordinateUI'].forEach(className => {
document.querySelectorAll('.' + className).forEach(headerbox => {
headerbox.style.backgroundColor = 'rgba(30, 33, 41 ,0.85)';
headerbox.style.borderRadius = '9px';
headerbox.style.paddingTop = '23px';
headerbox.style.paddingBottom = '23px';
});
});
['FpsCanvas', 'CoordinateCanvas'].forEach(className => {
document.querySelectorAll('.' + className).forEach(canvasstyle => {
canvasstyle.style.height = '14px';
});
})
}
}
function checkState() {
const homePage = document.querySelector(".HomePage");
if (homePage && window.getComputedStyle(homePage).display !== "none") {
if (!menuInterval) {
menuInterval = setInterval(inMenu, 1000);
}
if (gameInterval) {
clearInterval(gameInterval);
gameInterval = null;
}
} else {
if (!gameInterval) {
gameInterval = setInterval(inGame, 1000);
}
if (menuInterval) {
clearInterval(menuInterval);
menuInterval = null;
}
}
}
checkState();
setInterval(checkState, 1000);
const hud = document.createElement('div');
hud.style.position = 'fixed';
hud.style.top = '0';
hud.style.left = '0';
hud.style.width = '100%';
hud.style.height = '100%';
hud.style.zIndex = '999999';
hud.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
hud.style.pointerEvents = 'auto';
hud.style.backdropFilter = 'blur(5px)';
hud.style.transition = 'all 0.2s ease';
document.body.appendChild(hud);
const menu = document.createElement('div');
menu.style.position = 'fixed';
menu.style.top = '50%';
menu.style.left = '50%';
menu.style.transform = 'translate(-50%, -50%)';
menu.style.width = '30vw';
menu.style.height = '40vh';
menu.style.maxWidth = '500px';
menu.style.maxHeight = '400px';
menu.style.minWidth = '300px';
menu.style.minHeight = '250px';
menu.style.zIndex = '1000000';
menu.style.display = 'flex';
menu.style.flexDirection = 'column';
menu.style.justifyContent = 'center';
menu.style.alignItems = 'center';
menu.style.backgroundImage = 'url(https://i.postimg.cc/fyR7DMPB/Vortex-Client-png.png)';
menu.style.backgroundRepeat = 'no-repeat';
menu.style.backgroundSize = '265px 230px';
menu.style.backgroundPosition = 'center calc(50% - 70px)';
hud.appendChild(menu);
const mainMenuCon = document.createElement('div');
mainMenuCon.style.width = '50vw';
mainMenuCon.style.height = '65vh';
mainMenuCon.style.position = 'fixed';
mainMenuCon.style.top = '50%';
mainMenuCon.style.left = '50%';
mainMenuCon.style.transform = 'translate(-50%, -50%)';
mainMenuCon.style.display = 'none';
mainMenuCon.style.flexDirection = 'column';
mainMenuCon.style.justifyContent = 'center';
mainMenuCon.style.alignItems = 'center';
mainMenuCon.style.maxWidth = '1000px';
mainMenuCon.style.maxHeight = '800px';
mainMenuCon.style.minWidth = '900px';
mainMenuCon.style.minHeight = '700px';
hud.appendChild(mainMenuCon);
const mainMenu = document.createElement('div');
mainMenu.style.width = '50vw';
mainMenu.style.height = '45vh';
mainMenu.style.zIndex = '999999';
mainMenu.style.position = 'relative';
mainMenu.style.backdropFilter = 'blur(0.45rem)';
mainMenu.style.backgroundColor = 'rgba(10, 12, 16, 0.6)';
mainMenu.style.borderRadius = '1rem';
mainMenu.style.padding = '20px';
mainMenu.style.border = '1px solid rgba(255, 255, 255, 0.07)';
mainMenu.style.display = 'flex';
mainMenu.style.justifyContent = 'center';
mainMenu.style.alignItems = 'center';
mainMenu.style.boxShadow = '0 10px 30px rgba(0, 0, 0, 0.1)';
mainMenu.style.maxWidth = '1000px';
mainMenu.style.maxHeight = '550px';
mainMenu.style.minWidth = '900px';
mainMenu.style.minHeight = '550px';
mainMenuCon.appendChild(mainMenu);
const contentArea = document.createElement('div');
contentArea.style.marginLeft = '230px';
contentArea.style.padding = '20px';
contentArea.style.width = 'calc(100% - 230px)';
contentArea.style.height = '100%';
contentArea.style.display = 'flex';
contentArea.style.flexDirection = 'column';
contentArea.style.alignItems = 'flex-start';
contentArea.style.justifyContent = 'flex-start';
contentArea.style.color = 'white';
contentArea.style.fontSize = '18px';
contentArea.style.fontWeight = 'bold';
mainMenu.appendChild(contentArea);
const tabBar = document.createElement('div');
tabBar.style.width = '240px';
tabBar.style.height = '100%';
tabBar.style.display = 'flex';
tabBar.style.flexDirection = 'column';
tabBar.style.justifyContent = 'flex-start';
tabBar.style.alignItems = 'center';
tabBar.style.gap = '15px';
tabBar.style.position = 'absolute';
tabBar.style.top = '0';
tabBar.style.left = '0';
tabBar.style.borderRight = '1.4px solid rgba(255, 255, 255, 0.07)';
tabBar.style.backgroundColor = 'rgba(0, 4, 9, 0.7)';
tabBar.style.borderTopLeftRadius = '1rem';
tabBar.style.borderBottomLeftRadius = '1rem';
mainMenu.appendChild(tabBar);
const logoWrapper = document.createElement('div');
logoWrapper.style.display = 'flex';
logoWrapper.style.flexDirection = 'column';
logoWrapper.style.alignItems = 'center';
logoWrapper.style.marginTop = '20px';
tabBar.appendChild(logoWrapper);
const sidebarLogo = document.createElement('img');
sidebarLogo.src = 'https://i.postimg.cc/rwqnpQbv/logo-v2.png';
sidebarLogo.style.width = '200px';
sidebarLogo.style.height = 'auto';
sidebarLogo.style.borderRadius = '0.4rem';
logoWrapper.appendChild(sidebarLogo);
const versionLabel = document.createElement('div');
versionLabel.textContent = 'Version Beta';
versionLabel.style.fontSize = '13px';
versionLabel.style.fontWeight = 'lighter';
versionLabel.style.color = 'rgba(255, 255, 255, 0.3)';
versionLabel.style.marginTop = '-2px';
logoWrapper.appendChild(versionLabel);
const separator = document.createElement('div');
separator.style.width = '85%';
separator.style.height = '1px';
separator.style.backgroundColor = 'rgba(255, 255, 255, 0.07)';
separator.style.marginBottom = '5px';
tabBar.appendChild(separator);
const tabs = [
{ name: 'Combat', icon: 'ri-sword-fill', description: '#Modules for fighting and attacks (coming soon)' },
{ name: 'Visual', icon: 'ri-eye-fill', description: '#Modules for graphics and effects' },
{ name: 'Player', icon: 'ri-walk-fill', description: '#Modules for movement and stats (coming soon)' },
{ name: 'Utility', icon: 'ri-tools-fill', description: '#Modules for extra tools and functions' },
{ name: 'Cosmetics', icon: 'ri-magic-fill', description: '#Modules for skins and appearance' }
];
const tabButtons = [];
let currentTabName = tabs[0].name;
let currentTabDescription = tabs[0].description;
tabs.forEach((tab, index) => {
const tabBtn = document.createElement('button');
tabBtn.innerHTML = `<i class="${tab.icon}" style="margin-right:8px; font-size:18px;"></i> ${tab.name}`;
tabBtn.style.width = '80%';
tabBtn.style.height = '48px';
tabBtn.style.display = 'flex';
tabBtn.style.alignItems = 'center';
tabBtn.style.justifyContent = 'flex-start';
tabBtn.style.gap = '8px';
tabBtn.style.padding = '10px';
tabBtn.style.borderRadius = '8px';
tabBtn.style.cursor = 'pointer';
tabBtn.style.fontSize = '14px';
tabBtn.style.fontWeight = 'bold';
tabBtn.style.color = 'rgba(255, 255, 255, 0.35)';
tabBtn.style.transition = 'all 0.35s ease';
tabBtn.style.backgroundColor = 'transparent';
tabBtn.style.border = 'none';
tabBtn.style.boxShadow = 'none';
if (index === 0) setActive(tabBtn);
tabBtn.addEventListener('mouseover', () => { if (!tabBtn.classList.contains('active')) { tabBtn.style.border = '1px solid rgba(255, 255, 255, 0.1)'; tabBtn.style.backgroundColor = 'rgba(255, 255, 255, 0.05)'; tabBtn.style.color = 'rgba(255, 255, 255, 0.6)'; } });
tabBtn.addEventListener('mouseout', () => { if (!tabBtn.classList.contains('active')) { tabBtn.style.border = 'none'; tabBtn.style.backgroundColor = 'transparent'; tabBtn.style.color = 'rgba(255, 255, 255, 0.35)'; } });
tabBtn.addEventListener('click', () => {
tabButtons.forEach(btn => { btn.classList.remove('active'); btn.style.backgroundColor = 'transparent'; btn.style.border = 'none'; btn.style.boxShadow = 'none'; btn.style.color = 'rgba(255, 255, 255, 0.35)'; });
setActive(tabBtn);
setContent(tab.name, tab.description);
});
tabButtons.push(tabBtn);
tabBar.appendChild(tabBtn);
});
function setActive(btn) {
btn.classList.add('active');
btn.style.backgroundColor = 'rgba(110, 40, 40, 0.8)';
btn.style.border = '1px solid rgba(255, 255, 255, 0.1)';
btn.style.boxShadow = '0px 0px 15px 0px rgb(110, 40, 40)';
btn.style.color = 'white';
}
const bottomSeparator = document.createElement('div');
bottomSeparator.style.width = '85%';
bottomSeparator.style.height = '1.5px';
bottomSeparator.style.backgroundColor = 'rgba(255, 255, 255, 0.07)';
bottomSeparator.style.margin = '7px 0 7px 0';
tabBar.appendChild(bottomSeparator);
const footerButtons = [{ name: 'Settings', icon: 'ri-settings-5-fill' }, { name: 'Exit', icon: 'ri-logout-box-r-fill' }];
footerButtons.forEach(footer => {
const fBtn = document.createElement('button');
fBtn.innerHTML = `<i class="${footer.icon}" style="margin-right:8px; font-size:18px;"></i> ${footer.name}`;
fBtn.style.width = '80%';
fBtn.style.height = '48px';
fBtn.style.display = 'flex';
fBtn.style.alignItems = 'center';
fBtn.style.justifyContent = 'flex-start';
fBtn.style.gap = '8px';
fBtn.style.padding = '8px';
fBtn.style.borderRadius = '8px';
fBtn.style.cursor = 'pointer';
fBtn.style.fontSize = '14px';
fBtn.style.fontWeight = 'bold';
fBtn.style.color = 'rgba(255, 255, 255, 0.35)';
fBtn.style.transition = 'all 0.3s ease';
fBtn.style.backgroundColor = 'transparent';
fBtn.style.border = 'none';
fBtn.addEventListener('mouseover', () => { if (!fBtn.classList.contains('active')) { fBtn.style.backgroundColor = 'rgba(255, 255, 255, 0.05)'; fBtn.style.color = 'rgba(255, 255, 255, 0.6)'; fBtn.style.border = '1px solid rgba(255, 255, 255, 0.1)'; } });
fBtn.addEventListener('mouseout', () => { if (!fBtn.classList.contains('active')) { fBtn.style.backgroundColor = 'transparent'; fBtn.style.color = 'rgba(255, 255, 255, 0.35)'; fBtn.style.border = 'none'; } });
if (footer.name === 'Exit') { fBtn.addEventListener('click', () => { mainMenuCon.style.display = 'none'; menu.style.display = 'flex'; }); }
else if (footer.name === 'Settings') {
fBtn.addEventListener('click', () => {
tabButtons.forEach(btn => { btn.classList.remove('active'); btn.style.backgroundColor = 'transparent'; btn.style.border = 'none'; btn.style.boxShadow = 'none'; btn.style.color = 'rgba(255, 255, 255, 0.35)'; });
setContent('Settings', '#Configure client settings');
fBtn.classList.remove('active');
fBtn.style.backgroundColor = 'rgba(255, 255, 255, 0.05)';
fBtn.style.color = 'rgba(255, 255, 255, 0.6)';
fBtn.style.border = '1px solid rgba(255, 255, 255, 0.1)';
});
}
tabBar.appendChild(fBtn);
});
function createModuleCard(moduleName, iconClass, descriptionText, hasSettings = false, isEnabled = false) {
const card = document.createElement('div');
card.style.backgroundColor = 'rgba(255, 255, 255, 0.05)';
card.style.borderRadius = '12px';
card.style.padding = '20px';
card.style.border = '1px solid rgba(255, 255, 255, 0.1)';
card.style.textAlign = 'center';
card.style.cursor = 'pointer';
card.style.transition = 'transform 0.3s ease, box-shadow 0.3s ease';
card.style.display = 'flex';
card.style.flexDirection = 'column';
card.style.justifyContent = 'space-between';
const textWrapper = document.createElement('div');
const name = document.createElement('div');
name.textContent = moduleName;
name.style.marginTop = '10px';
name.style.fontSize = '16px';
name.style.fontWeight = 'bold';
name.style.color = 'white';
textWrapper.appendChild(name);
const desc = document.createElement('div');
desc.textContent = descriptionText;
desc.style.fontSize = '12px';
desc.style.color = 'rgba(255, 255, 255, 0.6)';
desc.style.marginTop = '5px';
textWrapper.appendChild(desc);
card.appendChild(textWrapper);
const controls = document.createElement('div');
controls.style.display = 'flex';
controls.style.justifyContent = 'center';
controls.style.alignItems = 'center';
controls.style.marginTop = '15px';
controls.style.gap = '10px';
const switchLabel = document.createElement('label');
switchLabel.style.position = 'relative';
switchLabel.style.display = 'inline-block';
switchLabel.style.width = '54px';
switchLabel.style.height = '28px';
controls.appendChild(switchLabel);
const switchInput = document.createElement('input');
switchInput.type = 'checkbox';
switchInput.style.opacity = '0';
switchInput.style.width = '0';
switchInput.style.height = '0';
switchLabel.appendChild(switchInput);
const slider = document.createElement('span');
slider.style.position = 'absolute';
slider.style.cursor = 'pointer';
slider.style.top = '0';
slider.style.left = '0';
slider.style.right = '0';
slider.style.bottom = '0';
slider.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
slider.style.transition = '.4s';
slider.style.borderRadius = '34px';
switchLabel.appendChild(slider);
const sliderKnob = document.createElement('span');
sliderKnob.style.position = 'absolute';
sliderKnob.style.content = '""';
sliderKnob.style.height = '20px';
sliderKnob.style.width = '20px';
sliderKnob.style.left = '4px';
sliderKnob.style.bottom = '4px';
sliderKnob.style.backgroundColor = 'white';
sliderKnob.style.transition = '.4s';
sliderKnob.style.borderRadius = '50%';
slider.appendChild(sliderKnob);
if (isEnabled) {
switchInput.checked = true;
slider.style.backgroundColor = 'rgba(110, 40, 40, 0.8)';
sliderKnob.style.transform = 'translateX(26px)';
}
switchInput.addEventListener('change', () => {
const isChecked = switchInput.checked;
if (isChecked) {
slider.style.backgroundColor = 'rgba(110, 40, 40, 0.8)';
sliderKnob.style.transform = 'translateX(26px)';
} else {
slider.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
sliderKnob.style.transform = 'translateX(0)';
}
let savedStates = JSON.parse(localStorage.getItem(storageKey)) || {};
savedStates[moduleName] = isChecked;
localStorage.setItem(storageKey, JSON.stringify(savedStates));
const module = getModuleByName(moduleName);
if (!module) return;
if (isChecked && typeof module.onEnable === 'function') {
module.onEnable();
} else if (!isChecked && typeof module.onDisable === 'function') {
module.onDisable();
}
});
if (hasSettings) {
const settingsBtn = document.createElement('button');
settingsBtn.innerHTML = '<i class="ri-settings-4-fill"></i>';
settingsBtn.style.width = '28px';
settingsBtn.style.height = '28px';
settingsBtn.style.borderRadius = '10px';
settingsBtn.style.border = 'none';
settingsBtn.style.cursor = 'pointer';
settingsBtn.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
settingsBtn.style.color = 'white';
settingsBtn.style.fontSize = '18px';
settingsBtn.style.transition = 'background-color 0.3s ease';
settingsBtn.style.display = 'flex';
settingsBtn.style.alignItems = 'center';
settingsBtn.style.justifyContent = 'center';
settingsBtn.addEventListener('click', (e) => {
e.stopPropagation();
const module = getModuleByName(moduleName);
if (module) { showSettingsPanel(module); }
});
settingsBtn.addEventListener('mouseover', () => { settingsBtn.style.backgroundColor = 'rgba(255, 255, 255, 0.2)'; });
settingsBtn.addEventListener('mouseout', () => { settingsBtn.style.backgroundColor = 'rgba(255, 255, 255, 0.1)'; });
controls.appendChild(settingsBtn);
}
card.appendChild(controls);
card.addEventListener('mouseover', () => { card.style.transform = 'translateY(-5px) scale(1.02)'; });
card.addEventListener('mouseout', () => { card.style.transform = 'translateY(0) scale(1)'; });
return card;
}
function showSettingsPanel(module) {
contentArea.innerHTML = '';
contentArea.style.display = 'flex';
contentArea.style.flexDirection = 'column';
contentArea.style.alignItems = 'flex-start';
const headerContainer = document.createElement('div');
headerContainer.style.display = 'flex';
headerContainer.style.alignItems = 'center';
headerContainer.style.width = '100%';
headerContainer.style.marginBottom = '15px';
contentArea.appendChild(headerContainer);
const backButton = document.createElement('button');
backButton.innerHTML = `<i class="ri-arrow-left-line"></i>`;
backButton.style.fontSize = '20px';
backButton.style.color = 'white';
backButton.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
backButton.style.border = '1px solid rgba(255, 255, 255, 0.15)';
backButton.style.borderRadius = '8px';
backButton.style.width = '40px';
backButton.style.height = '40px';
backButton.style.cursor = 'pointer';
backButton.style.marginRight = '15px';
backButton.style.transition = 'background-color 0.3s ease';
backButton.style.display = 'flex';
backButton.style.alignItems = 'center';
backButton.style.justifyContent = 'center';
backButton.addEventListener('mouseover', () => { backButton.style.backgroundColor = 'rgba(255, 255, 255, 0.2)'; });
backButton.addEventListener('mouseout', () => { backButton.style.backgroundColor = 'rgba(255, 255, 255, 0.1)'; });
backButton.addEventListener('click', () => { setContent(currentTabName, currentTabDescription); });
headerContainer.appendChild(backButton);
const title = document.createElement('div');
title.textContent = `${module.name} Settings`;
title.style.fontSize = '22px';
title.style.fontWeight = 'bold';
headerContainer.appendChild(title);
const separator = document.createElement('div');
separator.style.width = '100%';
separator.style.height = '1px';
separator.style.backgroundColor = 'rgba(255, 255, 255, 0.07)';
separator.style.marginBottom = '20px';
contentArea.appendChild(separator);
if (module.name === 'Nametags') {
const settingsContentArea = document.createElement('div');
settingsContentArea.style.width = '100%';
settingsContentArea.style.height = 'calc(100% - 100px)';
settingsContentArea.style.overflowY = 'auto';
settingsContentArea.style.display = 'flex';
settingsContentArea.style.flexDirection = 'column';
settingsContentArea.style.gap = '20px';
contentArea.appendChild(settingsContentArea);
const nameWrapper = document.createElement('div');
nameWrapper.style.fontSize = '16px';
nameWrapper.style.padding = '10px';
nameWrapper.style.backgroundColor = 'rgba(0,0,0,0.2)';
nameWrapper.style.borderRadius = '8px';
const nameLabel = document.createElement('span');
nameLabel.textContent = 'Bloxd Username: ';
nameLabel.style.color = 'rgba(255,255,255,0.7)';
const nameValue = document.createElement('span');
nameValue.id = 'vortex_nametag_username';
nameValue.textContent = nametagsModule.getUsername() || 'loading...';
nameValue.style.fontWeight = 'bold';
nameValue.style.color = 'white';
nameWrapper.appendChild(nameLabel);
nameWrapper.appendChild(nameValue);
settingsContentArea.appendChild(nameWrapper);
const gridTitle = document.createElement('div');
gridTitle.textContent = 'Select a Nametag Image';
gridTitle.style.fontSize = '18px';
gridTitle.style.fontWeight = 'bold';
gridTitle.style.marginTop = '10px';
settingsContentArea.appendChild(gridTitle);
const imageGrid = document.createElement('div');
imageGrid.style.display = 'grid';
imageGrid.style.gridTemplateColumns = 'repeat(auto-fill, minmax(120px, 1fr))';
imageGrid.style.gap = '15px';
imageGrid.style.marginTop = '10px';
settingsContentArea.appendChild(imageGrid);
const nametagImageUrls = [
'https://i.postimg.cc/NMG91FWH/space-BG-loco.jpg',
'https://i.postimg.cc/1XzTTzhW/galaxy.png',
'https://i.postimg.cc/NfRTSvBt/custom-moving-skies-1-androidioswin10fps-friendly-5.webp',
'https://i.postimg.cc/J4Q0jrRs/14896441-xl.webp',
'https://i.postimg.cc/tC9CqKFp/banner.jpg',
'https://i.postimg.cc/906dTW28/15220236-xl.webp',
'https://i.postimg.cc/1RfHnC6F/2023-12-19-11-14-34.png',
'https://i.postimg.cc/ZKNxjWwK/6843ea27816c80d1186125192cbf582ece88036e-2-690x326.jpg',
'https://i.postimg.cc/GhjHcr2x/swirling-clouds-create-captivating-natural-vortex-sky-138943-2179.avif',
'https://i.postimg.cc/bwb6mgmr/1.webp'
];
nametagImageUrls.forEach(url => {
const imgContainer = document.createElement('div');
imgContainer.style.cursor = 'pointer';
imgContainer.style.border = '2px solid transparent';
imgContainer.style.borderRadius = '8px';
imgContainer.style.transition = 'all 0.2s ease';
imgContainer.style.padding = '4px';
imgContainer.style.backgroundColor = 'rgba(255,255,255,0.05)';
const img = document.createElement('img');
img.src = url;
img.style.width = '100%';
img.style.height = '100%';
img.style.display = 'block';
img.style.borderRadius = '6px';
img.style.objectFit = 'cover';
imgContainer.appendChild(img);
imgContainer.addEventListener('mouseover', () => { imgContainer.style.borderColor = 'rgba(110, 40, 40, 0.8)'; imgContainer.style.transform = 'scale(1.05)'; });
imgContainer.addEventListener('mouseout', () => { imgContainer.style.borderColor = 'transparent'; imgContainer.style.transform = 'scale(1.0)'; });
imgContainer.addEventListener('click', () => {
nametagsModule.setNametag(url);
document.querySelectorAll('.nametag-img-container').forEach(c => c.style.borderColor = 'transparent');
imgContainer.style.borderColor = 'rgb(110, 40, 40)';
});
imgContainer.className = 'nametag-img-container';
imageGrid.appendChild(imgContainer);
});
return;
}
const settingsContentArea = document.createElement('div');
settingsContentArea.style.width = '100%';
settingsContentArea.style.display = 'flex';
settingsContentArea.style.flexDirection = 'column';
settingsContentArea.style.gap = '20px';
contentArea.appendChild(settingsContentArea);
if (!module.settings || module.settings.length === 0) {
settingsContentArea.textContent = 'No configurable settings are available for this module.';
settingsContentArea.style.color = 'rgba(255, 255, 255, 0.5)';
settingsContentArea.style.fontSize = '14px';
return;
}
const savedSettings = JSON.parse(localStorage.getItem(settingsStorageKey)) || {};
function saveSetting(id, value) {
savedSettings[id] = value;
localStorage.setItem(settingsStorageKey, JSON.stringify(savedSettings));
}
module.settings.forEach(setting => {
const value = savedSettings[setting.id] !== undefined ? savedSettings[setting.id] : setting.defaultValue;
const settingWrapper = document.createElement('div');
settingWrapper.style.display = 'flex';
settingWrapper.style.justifyContent = 'space-between';
settingWrapper.style.alignItems = 'center';
settingWrapper.style.width = '100%';
const label = document.createElement('label');
label.textContent = setting.label;
label.style.fontSize = '16px';
settingWrapper.appendChild(label);
switch (setting.type) {
case 'slider': {
const controlWrapper = document.createElement('div');
controlWrapper.style.display = 'flex';
controlWrapper.style.alignItems = 'center';
controlWrapper.style.gap = '10px';
const slider = document.createElement('input');
slider.type = 'range';
slider.min = setting.min;
slider.max = setting.max;
slider.step = setting.step;
slider.value = value;
const valueLabel = document.createElement('span');
valueLabel.textContent = parseFloat(value).toFixed(1);
valueLabel.style.minWidth = '30px';
slider.addEventListener('input', () => {
valueLabel.textContent = parseFloat(slider.value).toFixed(1);
saveSetting(setting.id, parseFloat(slider.value));
});
controlWrapper.appendChild(slider);
controlWrapper.appendChild(valueLabel);
settingWrapper.appendChild(controlWrapper);
break;
}
case 'toggle': {
const switchLabel = document.createElement('label');
switchLabel.style.position = 'relative';
switchLabel.style.display = 'inline-block';
switchLabel.style.width = '54px';
switchLabel.style.height = '28px';
const switchInput = document.createElement('input');
switchInput.type = 'checkbox';
switchInput.style.opacity = '0';
switchInput.style.width = '0';
switchInput.style.height = '0';
const sliderSpan = document.createElement('span');
sliderSpan.style.position = 'absolute';
sliderSpan.style.cursor = 'pointer';
sliderSpan.style.top = '0';
sliderSpan.style.left = '0';
sliderSpan.style.right = '0';
sliderSpan.style.bottom = '0';
sliderSpan.style.transition = '.4s';
sliderSpan.style.borderRadius = '34px';
const sliderKnob = document.createElement('span');
sliderKnob.style.position = 'absolute';
sliderKnob.style.height = '20px';
sliderKnob.style.width = '20px';
sliderKnob.style.left = '4px';
sliderKnob.style.bottom = '4px';
sliderKnob.style.backgroundColor = 'white';
sliderKnob.style.transition = '.4s';
sliderKnob.style.borderRadius = '50%';
function updateToggle(checked) {
if (checked) {
sliderSpan.style.backgroundColor = 'rgba(110, 40, 40, 0.8)';
sliderKnob.style.transform = 'translateX(26px)';
} else {
sliderSpan.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
sliderKnob.style.transform = 'translateX(0)';
}
}
switchInput.checked = value;
updateToggle(value);
switchInput.addEventListener('change', () => {
updateToggle(switchInput.checked);
saveSetting(setting.id, switchInput.checked);
});
sliderSpan.appendChild(sliderKnob);
switchLabel.appendChild(switchInput);
switchLabel.appendChild(sliderSpan);
settingWrapper.appendChild(switchLabel);
break;
}
case 'color': {
const colorInput = document.createElement('input');
colorInput.type = 'color';
colorInput.value = value;
colorInput.style.border = 'none';
colorInput.style.background = 'none';
colorInput.style.width = '40px';
colorInput.style.height = '40px';
colorInput.addEventListener('input', () => {
saveSetting(setting.id, colorInput.value);
});
settingWrapper.appendChild(colorInput);
break;
}
case 'dropdown': {
const select = document.createElement('select');
select.id = setting.id;
select.style.backgroundColor = 'rgba(0,0,0,0.3)';
select.style.color = 'white';
select.style.border = '1px solid rgba(255,255,255,0.1)';
select.style.borderRadius = '5px';
select.style.padding = '5px';
setting.options.forEach(opt => {
const option = document.createElement('option');
option.value = opt;
option.textContent = opt;
select.appendChild(option);
});
select.value = value;
select.addEventListener('change', () => {
saveSetting(setting.id, select.value);
});
settingWrapper.appendChild(select);
break;
}
case 'text': {
const textInput = document.createElement('input');
textInput.type = 'text';
textInput.placeholder = setting.placeholder;
textInput.value = value;
textInput.style.backgroundColor = 'rgba(0,0,0,0.3)';
textInput.style.color = 'white';
textInput.style.border = '1px solid rgba(255,255,255,0.1)';
textInput.style.borderRadius = '5px';
textInput.style.padding = '8px';
textInput.style.textAlign = 'right';
textInput.addEventListener('change', () => {
saveSetting(setting.id, textInput.value);
});
settingWrapper.appendChild(textInput);
break;
}
}
settingsContentArea.appendChild(settingWrapper);
});
}
function setContent(tabName, tabDescription) {
currentTabName = tabName;
currentTabDescription = tabDescription;
contentArea.innerHTML = '';
contentArea.style.position = 'relative';
const headerContainer = document.createElement('div');
headerContainer.style.textAlign = 'center';
headerContainer.style.width = '100%';
headerContainer.style.marginBottom = '15px';
contentArea.appendChild(headerContainer);
const tabLabel = document.createElement('div');
tabLabel.textContent = tabName;
tabLabel.style.fontSize = '22px';
tabLabel.style.fontWeight = 'bold';
tabLabel.style.color = 'white';
tabLabel.style.marginBottom = '5px';
tabLabel.style.textShadow = '0 0 10px rgba(255, 255, 255, 0.2)';
tabLabel.style.transition = 'all 0.4s ease-in-out';
headerContainer.appendChild(tabLabel);
const description = document.createElement('div');
description.textContent = tabDescription;
description.style.fontSize = '11px';
description.style.fontWeight = 'normal';
description.style.color = 'rgba(255, 255, 255, 0.5)';
description.style.textTransform = 'uppercase';
headerContainer.appendChild(description);
const separator = document.createElement('div');
separator.style.width = '100%';
separator.style.height = '1px';
separator.style.backgroundColor = 'rgba(255, 255, 255, 0.07)';
separator.style.marginBottom = '20px';
contentArea.appendChild(separator);
const gridContainer = document.createElement('div');
gridContainer.style.width = '100%';
gridContainer.style.maxHeight = 'calc(100% - 100px)';
gridContainer.style.overflowY = 'auto';
gridContainer.style.display = 'grid';
gridContainer.style.gridTemplateColumns = 'repeat(auto-fill, minmax(180px, 1fr))';
gridContainer.style.gap = '20px';
gridContainer.style.padding = '10px';
contentArea.appendChild(gridContainer);
let savedStates = JSON.parse(localStorage.getItem(storageKey)) || {};
const currentModules = modules[tabName] || [];
currentModules.forEach(module => {
const isEnabled = savedStates[module.name] !== undefined ? savedStates[module.name] : module.enabled;
const card = createModuleCard(module.name, module.icon, module.description, module.hasSettings, isEnabled);
gridContainer.appendChild(card);
});
}
const createStyledButton = (options = {}) => {
const btn = document.createElement('button');
btn.style.width = options.width || '60px';
btn.style.height = options.height || '60px';
btn.style.backgroundImage = 'linear-gradient(45deg, rgba(0, 4, 9, 1) 40%, rgba(14, 14, 19, 1) 100%)';
btn.style.backgroundSize = 'cover';
btn.style.backgroundPosition = '0% 0%';
btn.style.backgroundRepeat = 'repeat';
btn.style.backgroundColor = 'transparent';
btn.style.border = 'none';
btn.style.borderRadius = '0.7rem';
btn.style.cursor = 'pointer';
btn.style.boxShadow = 'none';
btn.style.fontSize = options.fontSize || '20px';
btn.style.color = 'white';
btn.style.transition = 'box-shadow 0.3s ease';
btn.addEventListener('mouseover', function () { btn.style.transition = 'background-image 0.3s ease, box-shadow 0.3s ease'; btn.style.backgroundImage = 'linear-gradient(45deg, rgba(110, 40, 40, 1) 40%, rgba(124, 54, 59, 1) 100%)'; btn.style.boxShadow = '0px 0px 29px 0px rgb(110, 40, 40)'; });
btn.addEventListener('mouseout', function () { btn.style.transition = 'none'; btn.style.backgroundImage = 'linear-gradient(45deg, rgba(0, 4, 9, 1) 40%, rgba(14, 14, 19, 1) 100%)'; btn.style.boxShadow = 'none'; });
if (options.text) btn.textContent = options.text;
if (options.html) btn.innerHTML = options.html;
return btn;
};
const VortexContainer = document.createElement('div');
VortexContainer.style.display = 'flex';
VortexContainer.style.flexDirection = 'column';
VortexContainer.style.alignItems = 'center';
VortexContainer.style.gap = '10px';
menu.appendChild(VortexContainer);
const VortexSettingsBtn = createStyledButton({ width: '250px', height: '60px', fontSize: '16px', text: 'Vortex Settings' });
VortexSettingsBtn.style.marginTop = '120px';
VortexSettingsBtn.addEventListener('click', function () { mainMenuCon.style.display = 'flex'; menu.style.display = 'none'; gameui.style.display = ''; });
VortexContainer.appendChild(VortexSettingsBtn);
const VortexMenuBtnDiv = document.createElement('div');
VortexMenuBtnDiv.style.width = '250px';
VortexMenuBtnDiv.style.height = '60px';
VortexMenuBtnDiv.style.display = 'flex';
VortexMenuBtnDiv.style.flexDirection = 'row';
VortexMenuBtnDiv.style.alignItems = 'center';
VortexMenuBtnDiv.style.marginTop = '10px';
VortexMenuBtnDiv.style.gap = '10px';
menu.appendChild(VortexMenuBtnDiv);
const icons = ['ri-pencil-fill', 'ri-group-fill', 'ri-magic-fill', 'ri-settings-5-fill'];
icons.forEach(icon => {
const btn = createStyledButton({ html: `<i class="${icon}"></i>` });
VortexMenuBtnDiv.appendChild(btn);
if (icon === 'ri-pencil-fill') {
btn.addEventListener('click', startHudEditMode);
}
});
let hudEditOverlay = null;
function startHudEditMode() {
if (hudEditOverlay && hudEditOverlay.style.display === 'flex') return;
hud.style.backgroundColor = 'transparent';
hud.style.backdropFilter = 'blur(0px)';
gameui.style.filter = 'grayscale(0%) brightness(1)';
menu.style.display = 'none';
hud.style.pointerEvents = 'none';
if (!hudEditOverlay) {
hudEditOverlay = document.createElement('div');
Object.assign(hudEditOverlay.style, { position: 'fixed', top: 0, left: 0, width: '100%', height: '100%', zIndex: '999998', display: 'flex', justifyContent: 'center', alignItems: 'center', paddingBottom: '30px', pointerEvents: 'none' });
const doneButton = document.createElement('button');
doneButton.textContent = 'Done';
Object.assign(doneButton.style, { padding: '12px 25px', fontSize: '18px', cursor: 'pointer', color: 'white', boxShadow : '0px 0px 15px 0px rgb(20, 20, 20)', border: '1px solid rgba(125, 125, 125, 0.5)', borderRadius: '8px', backgroundColor: 'rgb(20, 20, 20)', transition: 'transform 0.2s ease', pointerEvents: 'auto' });
doneButton.addEventListener('mouseover', () => doneButton.style.transform = 'scale(1.05)');
doneButton.addEventListener('mouseout', () => doneButton.style.transform = 'scale(1.0)');
doneButton.addEventListener('click', endHudEditMode);
hudEditOverlay.appendChild(doneButton);
document.body.appendChild(hudEditOverlay);
}
hudEditOverlay.style.display = 'flex';
if (typeof armorDisplayModule.setEditable === 'function') armorDisplayModule.setEditable(true);
}
function endHudEditMode() {
if (hudEditOverlay) hudEditOverlay.style.display = 'none';
menu.style.display = 'flex';
hud.style.pointerEvents = 'auto';
hud.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
hud.style.backdropFilter = 'blur(5px)';
gameui.style.filter = 'grayscale(80%) brightness(0.6))';
if (typeof armorDisplayModule.setEditable === 'function') armorDisplayModule.setEditable(false);
}
let menuVisible = true;
const toggleMenuKey = 'ShiftRight';
window.addEventListener('keydown', function (e) {
if (e.code === toggleMenuKey) {
if (hudEditOverlay && hudEditOverlay.style.display === 'flex') {endHudEditMode();return;}
menuVisible = !menuVisible;
menu.style.display = menuVisible ? 'flex' : 'none';
hud.style.backgroundColor = menuVisible ? 'rgba(0, 0, 0, 0.8)' : 'transparent';
hud.style.backdropFilter = menuVisible ? 'blur(5px)' : 'blur(0px)';
hud.style.pointerEvents = menuVisible ? 'auto' : 'none';
mainMenuCon.style.display = 'none';
gameui.style.display = 'block';
gameui.style.filter = menuVisible ? 'grayscale(80%) brightness(0.6)' : 'grayscale(0%) brightness(1)';
if (menuVisible && document.pointerLockElement) { document.exitPointerLock(); }
}
});
setContent(tabs[0].name, tabs[0].description);
setTimeout(initializeModules, 2000);
//CPS COUNTER MODULE (this is not ai bruh its just so its more clean)
const cpsModule = (function () {
let cpsHud = null;
let clicksTextSpan = null;
let clickListener = null;
let updateIntervalId = null;
let positionIntervalId = null;
let leftClicks = 0;
let rightClicks = 0;
let lastLeftClickTime = 0;
let lastRightClickTime = 0;
const start = () => {
if (cpsHud) return;
cpsHud = document.createElement("div");
cpsHud.style.position = "fixed";
cpsHud.id = 'cpsDisplay';
cpsHud.style.background = "rgba(0, 0, 0, 0.6)";
cpsHud.style.color = "#fff";
cpsHud.style.alignItems = 'center';
cpsHud.style.justifyContent = 'center';
cpsHud.style.fontWeight = '500';
cpsHud.style.zIndex = '0.5';
cpsHud.style.display = 'none';
const cpsTextSpan = document.createElement("span");
cpsTextSpan.style.color = "#cfcfcf";
cpsTextSpan.innerText = "CPS ";
cpsTextSpan.style.marginRight = '5px';
clicksTextSpan = document.createElement("span");
clicksTextSpan.style.color = "#fff";
clicksTextSpan.innerText = "0 │ 0";
cpsHud.appendChild(cpsTextSpan);
cpsHud.appendChild(clicksTextSpan);
ClientHud.appendChild(cpsHud);
lastLeftClickTime = Date.now();
lastRightClickTime = Date.now();
clickListener = (e) => {
if (e.button === 0) {
leftClicks++;
} else if (e.button === 2) {
rightClicks++;
}
};
document.addEventListener("mousedown", clickListener);
const updateBoxPosition = () => {
if (!cpsHud) return;
const header = document.querySelector('.InGameHeader');
if (!header || header.offsetHeight === 0) {
cpsHud.style.display = 'none';
return;
}
cpsHud.style.display = 'flex';
const fps = document.querySelector('.FpsWrapperDiv');
const coords = document.querySelectorAll('.CoordinateUI');
const fpsVisible = fps && window.getComputedStyle(fps).display !== 'none';
const visibleCoords = Array.from(coords).filter(c => window.getComputedStyle(c).display !== 'none');
let targetRect = null;
if (visibleCoords.length > 0) {
const rightmostCoord = visibleCoords.reduce((a, b) => a.getBoundingClientRect().right > b.getBoundingClientRect().right ? a : b);
targetRect = rightmostCoord.getBoundingClientRect();
} else if (fpsVisible) {
targetRect = fps.getBoundingClientRect();
} else {
targetRect = header.getBoundingClientRect();
}
cpsHud.style.top = `${targetRect.top}px`;
cpsHud.style.left = `${targetRect.right + 5}px`;
cpsHud.style.height = `${header.offsetHeight}px`;
const headerStyle = window.getComputedStyle(header);
cpsHud.style.background = headerStyle.backgroundColor;
cpsHud.style.border = headerStyle.border;
cpsHud.style.borderRadius = headerStyle.borderRadius;
cpsHud.style.width = 'auto';
cpsHud.style.width = `${cpsHud.offsetWidth + 10}px`;
};
setInterval(() => {
clicksTextSpan.innerText = `${leftClicks} │ ${rightClicks}`;
leftClicks = 0;
rightClicks = 0;
}, 1000);
positionIntervalId = setInterval(updateBoxPosition, 250);
};
const stop = () => {
clearInterval(updateIntervalId);
clearInterval(positionIntervalId);
updateIntervalId = positionIntervalId = null;
if (clickListener) {
document.removeEventListener("mousedown", clickListener);
clickListener = null;
}
if (cpsHud) {
cpsHud.remove();
cpsHud = null;
}
leftClicks = 0;
rightClicks = 0;
};
return {
start,
stop
};
})();
//PING COUNTER MODULE (this is not ai bruh its just so its more clean)
const pingModule = (function () {
let pingHud = null;
let msTextSpan = null;
let pingUpdateIntervalId = null;
let textUpdateIntervalId = null;
let positionIntervalId = null;
let ping = 0;
const start = () => {
if (pingHud) return;
pingHud = document.createElement("div");
pingHud.style.position = "fixed";
pingHud.style.color = "#fff";
pingHud.style.display = 'none';
pingHud.style.alignItems = 'center';
pingHud.style.justifyContent = 'center';
pingHud.style.fontWeight = '500';
pingHud.style.zIndex = '0.5';
const pingTextSpan = document.createElement("span");
pingTextSpan.style.color = "#cfcfcf";
pingTextSpan.innerText = "PING ";
pingTextSpan.style.marginRight = '5px';
msTextSpan = document.createElement("span");
msTextSpan.style.color = "#fff";
msTextSpan.innerText = "--ms";
pingHud.appendChild(pingTextSpan);
pingHud.appendChild(msTextSpan);
ClientHud.appendChild(pingHud);
const updatePing = () => {
const startTime = Date.now();
fetch(window.location.origin, { method: 'HEAD', mode: 'no-cors', cache: 'no-store' })
.then(() => {
ping = Date.now() - startTime;
})
.catch(() => {
ping = -1;
});
};
const updateBoxPosition = () => {
if (!pingHud) return;
const header = document.querySelector('.InGameHeader');
if (!header || header.offsetHeight === 0) {
pingHud.style.display = 'none';
return;
}
pingHud.style.display = 'flex';
const fps = document.querySelector('.FpsWrapperDiv');
const coords = document.querySelectorAll('.CoordinateUI');
const cpsElement = document.getElementById('cpsDisplay');
const fpsVisible = fps && window.getComputedStyle(fps).display !== 'none';
const visibleCoords = Array.from(coords).filter(c => window.getComputedStyle(c).display !== 'none');
const cpsVisible = cpsElement && window.getComputedStyle(cpsElement).display !== 'none';
let targetRect = null;
if (cpsVisible) {
targetRect = cpsElement.getBoundingClientRect();
} else if (visibleCoords.length > 0) {
targetRect = visibleCoords.reduce((rightmost, c) => {
const rect = c.getBoundingClientRect();
return !rightmost || rect.right > rightmost.right ? rect : rightmost;
}, null);
} else if (fpsVisible) {
targetRect = fps.getBoundingClientRect();
} else {
targetRect = header.getBoundingClientRect();
}
pingHud.style.top = `${targetRect.top}px`;
pingHud.style.left = `${targetRect.right + 5}px`;
pingHud.style.height = `${header.offsetHeight}px`;
const headerStyle = window.getComputedStyle(header);
pingHud.style.background = headerStyle.backgroundColor;
pingHud.style.border = headerStyle.border;
pingHud.style.borderRadius = headerStyle.borderRadius;
pingHud.style.width = 'auto';
pingHud.style.width = `${pingHud.offsetWidth + 10}px`;
};
textUpdateIntervalId = setInterval(() => {
if (msTextSpan) {
msTextSpan.innerText = ping >= 0 ? `${ping}ms` : "--";
}
}, 1000);
pingUpdateIntervalId = setInterval(updatePing, 2500);
positionIntervalId = setInterval(updateBoxPosition, 300);
updatePing();
updateBoxPosition();
};
const stop = () => {
clearInterval(pingUpdateIntervalId);
clearInterval(textUpdateIntervalId);
clearInterval(positionIntervalId);
pingUpdateIntervalId = textUpdateIntervalId = positionIntervalId = null;
if (pingHud) {
pingHud.remove();
pingHud = null;
}
msTextSpan = null;
ping = 0;
};
return {
start,
stop
};
})();
// ARMOUR VIEW MODULE (this is not ai bruh its just so its more clean)
const armorDisplayModule = (function() {
const ARMOR_IMG_URL = 'https://i.postimg.cc/5t7RH0NN/Untitledyjffggggg.png';
const ARMOR_INDEXES = [46, 47, 48, 49, 50];
const POSITION_STORAGE_KEY = 'armorDisplayPosition';
let displayBox = null;
let overrideStyleSheet = null;
let updateIntervalId = null;
let isEditable = false;
let isDragging = false;
let dragOffsetX = 0;
let dragOffsetY = 0;
const setStyles = (element, styles) => {
Object.assign(element.style, styles);
};
const getSettings = () => {
const savedSettings = JSON.parse(localStorage.getItem(settingsStorageKey)) || {};
return {
scale: savedSettings.armourview_scale !== undefined ? savedSettings.armourview_scale : 1.0,
orientation: savedSettings.armourview_orientation || 'Horizontal'
};
};
const savePosition = () => {
if (!displayBox) return;
const position = { top: displayBox.style.top, left: displayBox.style.left };
localStorage.setItem(POSITION_STORAGE_KEY, JSON.stringify(position));
};
const loadPosition = () => {
const savedPosition = localStorage.getItem(POSITION_STORAGE_KEY);
return savedPosition ? JSON.parse(savedPosition) : null;
};
const onMouseDown = (e) => {
if (!isEditable || e.button !== 0) return;
isDragging = true;
e.preventDefault();
const rect = displayBox.getBoundingClientRect();
setStyles(displayBox, {
top: `${rect.top}px`,
left: `${rect.left}px`,
bottom: 'auto',
right: 'auto',
transformOrigin: 'top left'
});
dragOffsetX = e.clientX - rect.left;
dragOffsetY = e.clientY - rect.top;
displayBox.style.cursor = 'move';
document.addEventListener('mousemove', onMouseMove);
document.addEventListener('mouseup', onMouseUp);
};
const onMouseMove = (e) => {
if (!isDragging) return;
e.preventDefault();
let newLeft = e.clientX - dragOffsetX;
let newTop = e.clientY - dragOffsetY;
newLeft = Math.max(0, Math.min(newLeft, window.innerWidth - displayBox.offsetWidth));
newTop = Math.max(0, Math.min(newTop, window.innerHeight - displayBox.offsetHeight));
displayBox.style.left = `${newLeft}px`;
displayBox.style.top = `${newTop}px`;
};
const onMouseUp = () => {
if (!isDragging) return;
isDragging = false;
displayBox.style.cursor = 'grab';
savePosition();
document.removeEventListener('mousemove', onMouseMove);
document.removeEventListener('mouseup', onMouseUp);
};
const setEditable = (editable) => {
isEditable = editable;
if (!displayBox) return;
if (editable) {
setStyles(displayBox, {cursor: 'grab', border: '2px dashed rgba(30, 33, 41 ,0.85)', pointerEvents: 'auto'});
displayBox.addEventListener('mousedown', onMouseDown);
} else {
setStyles(displayBox, {cursor: 'default', border: 'none', pointerEvents: 'none'});
displayBox.removeEventListener('mousedown', onMouseDown);
if (isDragging) onMouseUp();
}
};
const injectOverrideCSS = () => {
if (overrideStyleSheet) return;
overrideStyleSheet = document.createElement('style');
overrideStyleSheet.innerHTML = `
.InvenItem.inven-item-clone {
background: none !important;
background-color: transparent !important;
border: none !important;
outline: none !important;
background-image: none !important;
}
`;
document.head.appendChild(overrideStyleSheet);
};
const createDisplayBox = () => {
displayBox = document.createElement('div');
const savedPosition = loadPosition();
const initialStyles = {
position: 'fixed', zIndex: '0.5', display: 'flex', padding: '5px',
backgroundColor: 'transparent', pointerEvents: 'none'
};
if (savedPosition) {
Object.assign(initialStyles, {
top: savedPosition.top,
left: savedPosition.left,
transformOrigin: 'top left'
});
} else {
Object.assign(initialStyles, {
bottom: '20px',
right: '20px',
transformOrigin: 'bottom right'
});
}
setStyles(displayBox, initialStyles);
ClientHud.appendChild(displayBox);
};
const applyStylesFromSettings = () => {
if (!displayBox) return;
const settings = getSettings();
if (settings.orientation === 'Horizontal') {
setStyles(displayBox, { flexDirection: 'row', width: 'auto', height: '60px', alignItems: 'center' });
} else {
setStyles(displayBox, { flexDirection: 'column', width: '60px', height: 'auto', alignItems: 'center' });
}
displayBox.style.transform = `scale(${settings.scale})`;
};
const updateItems = () => {
if (!displayBox) return;
applyStylesFromSettings();
displayBox.querySelectorAll('.inven-item-clone').forEach(item => item.remove());
ARMOR_INDEXES.forEach(idx => {
const originalItem = document.querySelector(`.InvenItem[data-inven-idx="${idx}"]`);
if (!originalItem) return;
const clone = originalItem.cloneNode(true);
clone.className = 'InvenItem inven-item-clone';
clone.removeAttribute('id');
setStyles(clone, { backgroundColor: 'transparent', border: 'none', marginBottom: '-7px', transform: 'scale(1.0)' });
const unfilledSlot = clone.querySelector('.InvenItemUnfilled');
if (unfilledSlot) {
unfilledSlot.style.backgroundImage = `url("${ARMOR_IMG_URL}")`;
}
displayBox.appendChild(clone);
});
};
const start = () => {
if (displayBox) return;
injectOverrideCSS();
createDisplayBox();
updateItems();
updateIntervalId = setInterval(updateItems, 500);
};
const stop = () => {
clearInterval(updateIntervalId);
updateIntervalId = null;
if (displayBox) {
displayBox.remove();
displayBox = null;
}
if (overrideStyleSheet) {
overrideStyleSheet.remove();
overrideStyleSheet = null;
}
};
return {
start,
stop,
setEditable
};
})();
// NAMETAG MODULE (this is not ai bruh its just so its more clean)
const nametagsModule = (function() {
let username = 'unknown';
let getNameIntervalId = null;
let originalGetContext = null;
let db = null;
let patterns = {};
let unsubscribeSnapshot = null;
function GetBloxdName() {
const playername = document.querySelector(".PlayerNamePreview")?.textContent.trim();
if (playername && playername !== username) {
username = playername;
const nameUIElement = document.getElementById("vortex_nametag_username");
if (nameUIElement) {
nameUIElement.textContent = username;
}
}
}
function loadFirebaseScripts(callback) {
if (window.firebase && window.firebase.firestore) {
return callback();
}
const scripts = [
"https://www.gstatic.com/firebasejs/9.6.1/firebase-app-compat.js",
"https://www.gstatic.com/firebasejs/9.6.1/firebase-firestore-compat.js"
];
let loaded = 0;
scripts.forEach(src => {
const script = document.createElement('script');
script.src = src;
script.onload = () => {
loaded++;
if (loaded === scripts.length) callback();
};
document.head.appendChild(script);
});
}
function patchCanvas(patterns) {
const originalGetContext = HTMLCanvasElement.prototype.getContext;
HTMLCanvasElement.prototype.getContext = function (type, ...args) {
const ctx = originalGetContext.call(this, type, ...args);
if (type === '2d') hookCanvas(ctx, patterns);
return ctx;
};
function hookCanvas(ctx, patterns) {
if (ctx._hooked) return;
ctx._hooked = true;
const originalFillText = ctx.fillText;
ctx.fillText = function (text, x, y, maxWidth) {
const isInsideNametagBox = x >= 0 && x <= 800 && y >= 30 && y <= 300;
if (typeof text === "string" && text.length > 1 && isInsideNametagBox && patterns[text]) {
const cfg = patterns[text];
this.save();
this.globalCompositeOperation = 'source-over';
originalFillText.call(this, text, x, y, maxWidth);
const originalFillRect = this.fillRect;
this.fillRect = function (x, y, w, h) {
const isBoxForNametag = w > 30 && w < 200 && h >= 10 && h <= 25 && y >= 30 && y <= 300;
if (isBoxForNametag) return;
this.save();
this.globalAlpha = 0.8;
this.globalCompositeOperation = 'screen';
try {
if (cfg.img.complete && cfg.img.naturalWidth > 0) {
if (!cfg.pattern) {
cfg.pattern = this.createPattern(cfg.img, 'repeat');
}
this.fillStyle = cfg.pattern;
}
} catch (e) {}
originalFillRect.call(this, x, y, w, h);
this.restore();
};
this.restore();
} else {
this.save();
originalFillText.call(this, text, x, y, maxWidth);
this.restore();
}
};
}
}
const start = () => {
if (originalGetContext) return;
originalGetContext = HTMLCanvasElement.prototype.getContext;
loadFirebaseScripts(() => {
if (firebase.apps.length === 0) {
const firebaseConfig = {
apiKey: "AIzaSyDmvmcxP55DQ0guGF81rLf5XCpArEr2mQs",
authDomain: "vortex-client-database.firebaseapp.com",
projectId: "vortex-client-database",
};
firebase.initializeApp(firebaseConfig);
}
db = firebase.firestore();
unsubscribeSnapshot = db.collection("nametags").onSnapshot((snapshot) => {
snapshot.forEach(doc => {
const { name, imgUrl } = doc.data();
const img = new Image();
img.crossOrigin = "anonymous";
img.src = imgUrl;
patterns[name] = { img, pattern: null };
});
});
patchCanvas(patterns);
});
getNameIntervalId = setInterval(GetBloxdName, 500);
};
const stop = () => {
if (getNameIntervalId) clearInterval(getNameIntervalId);
if (unsubscribeSnapshot) unsubscribeSnapshot();
if (originalGetContext) HTMLCanvasElement.prototype.getContext = originalGetContext;
getNameIntervalId = unsubscribeSnapshot = originalGetContext = db = null;
patterns = {};
};
return {
start,
stop,
setNametag: function(imageUrl) {
if (!db || username === 'unknown' || !imageUrl) {
alert("You have to be in menu to set your nametag");
return;
}
const name = username;
db.collection("nametags").doc(name).set({ name, imgUrl: imageUrl })
.then(() => { /* Yay it sented */ })
.catch(err => {
});
},
getUsername: () => username,
};
})();
const crosshairModule = (function () {
let crosshairElement = null;
let hideStyle = null;
let updateIntervalId = null;
const getSettings = () => {
const savedSettings = JSON.parse(localStorage.getItem(settingsStorageKey)) || {};
return {
crosshair_color: savedSettings.crosshair_color || '#ffffff',
crosshair_size: savedSettings.crosshair_size !== undefined ? savedSettings.crosshair_size : 4,
crosshair_shape: savedSettings.crosshair_shape || 'Default'
};
};
const renderCrosshair = () => {
if (!crosshairElement) return;
const { crosshair_color, crosshair_size, crosshair_shape } = getSettings();
const size = parseInt(crosshair_size, 10);
let html = "";
if (crosshair_shape === "Dot") {
html = `<div style="width:${size * 2}px;height:${size * 2}px;background:${crosshair_color};border-radius:50%;position:absolute;top:-${size}px;left:-${size}px;"></div>`;
} else if (crosshair_shape === "Arrow") {
html = `
<div style="width:2px;height:${size * 2.5}px;background:${crosshair_color};position:absolute;top:0;left:-1px;transform-origin:top center;transform:rotate(-35deg);"></div>
<div style="width:2px;height:${size * 2.5}px;background:${crosshair_color};position:absolute;top:0;left:-1px;transform-origin:top center;transform:rotate(35deg);"></div>
`;
} else if (crosshair_shape === "Crossed") {
html = `
<div style="width:2px;height:${size * 2.2}px;background:${crosshair_color};position:absolute;top:0;left:-1px;transform-origin:top center;transform:rotate(-40deg);"></div>
<div style="width:2px;height:${size * 2.2}px;background:${crosshair_color};position:absolute;top:0;left:-1px;transform-origin:top center;transform:rotate(40deg);"></div>
<div style="width:2px;height:${size * 2.2}px;background:${crosshair_color};position:absolute;top:-${size * 2.2}px;left:-1px;transform-origin:bottom center;transform:rotate(40deg);"></div>
<div style="width:2px;height:${size * 2.2}px;background:${crosshair_color};position:absolute;top:-${size * 2.2}px;left:-1px;transform-origin:bottom center;transform:rotate(-40deg);"></div>
`;
} else if (crosshair_shape === "Cross") {
html = `
<div style="position:absolute;width:2px;height:${size * 2}px;background:${crosshair_color};top:-${size * 3}px;left:-1px;"></div>
<div style="position:absolute;width:2px;height:${size * 2}px;background:${crosshair_color};top:${size + 1}px;left:-1px;"></div>
<div style="position:absolute;width:${size * 2}px;height:2px;background:${crosshair_color};top:-1px;left:-${size * 3}px;"></div>
<div style="position:absolute;width:${size * 2}px;height:2px;background:${crosshair_color};top:-1px;left:${size + 1}px;"></div>
`;
} else if (crosshair_shape === "Square") {
const squareSide = size * 3;
const offset = squareSide / 2;
html = `<div style="position:absolute; width:${squareSide}px; height:${squareSide}px; background:${crosshair_color}; top:-${offset}px; left:-${offset}px;"></div>`;
} else {
html = `
<div style="position:absolute;width:2px;height:${size * 4}px;background:${crosshair_color};top:-${size * 2}px;left:-1px;"></div>
<div style="position:absolute;width:${size * 4}px;height:2px;background:${crosshair_color};top:-1px;left:-${size * 2}px;"></div>
`;
}
crosshairElement.innerHTML = html;
};
const start = () => {
if (crosshairElement) return;
hideStyle = document.createElement("style");
hideStyle.innerHTML = `.CrossHair { opacity: 0 !important; }`;
document.head.appendChild(hideStyle);
crosshairElement = document.createElement("div");
Object.assign(crosshairElement.style, {
position: "fixed",
top: "50%",
left: "50%",
zIndex: "0.5",
pointerEvents: "none"
});
ClientHud.appendChild(crosshairElement);
renderCrosshair();
updateIntervalId = setInterval(renderCrosshair, 250);
};
const stop = () => {
clearInterval(updateIntervalId);
updateIntervalId = null;
if (crosshairElement) {
crosshairElement.remove();
crosshairElement = null;
}
if (hideStyle) {
hideStyle.remove();
hideStyle = null;
}
};
return { start, stop };
})();
const resolutionAdjusterModule = (function() {
const UPDATE_INTERVAL_MS = 2000;
const FIND_CANVAS_INTERVAL_MS = 1000;
let findCanvasInterval = null;
let updateIntervalId = null;
let gameCanvas = null;
const getResolutionSetting = () => {
const savedSettings = JSON.parse(localStorage.getItem(settingsStorageKey)) || {};
return savedSettings.resolution_value !== undefined ? savedSettings.resolution_value : 1.0;
};
const resizeCanvas = (scale) => {
if (!gameCanvas) return;
const newWidth = Math.round(window.innerWidth * scale);
const newHeight = Math.round(window.innerHeight * scale);
if (gameCanvas.width !== newWidth || gameCanvas.height !== newHeight) {
gameCanvas.width = newWidth;
gameCanvas.height = newHeight;
}
};
const start = () => {
if (findCanvasInterval || updateIntervalId) return;
findCanvasInterval = setInterval(() => {
gameCanvas = document.getElementById('noa-canvas');
if (gameCanvas && gameCanvas.width > 0) {
clearInterval(findCanvasInterval);
findCanvasInterval = null;
const updateResolution = () => {
const currentScale = getResolutionSetting();
resizeCanvas(currentScale);
};
updateResolution();
updateIntervalId = setInterval(updateResolution, UPDATE_INTERVAL_MS);
}
}, FIND_CANVAS_INTERVAL_MS);
};
const stop = () => {
if (findCanvasInterval) {
clearInterval(findCanvasInterval);
findCanvasInterval = null;
}
if (updateIntervalId) {
clearInterval(updateIntervalId);
updateIntervalId = null;
}
if (gameCanvas) {
resizeCanvas(1.0);
}
gameCanvas = null;
};
return {
start,
stop
};
})();
})();