// ==UserScript==
// @name Territorial.io Auto-Join & Play (with UI Dashboard)
// @namespace Violentmonkey Scripts
// @version 16.0
// @description Adds a UI with instructions. Random names, 5-sec space spam. F7 arms, F6 toggles spam.
// @author Assistant
// @match https://territorial.io/*
// @match https://*.croxyproxy.com/*territorial.io*
// @match https://*/*?__cpo=*
// @grant none
// @run-at document-end
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// --- Configuration: MASSIVE Random Username Parts ---
const baseNames = [
'Abyss', 'Ace', 'Aegis', 'Agent', 'Algorithm', 'Alpha', 'Alpine', 'Amazon', 'Ambush', 'Android', 'Annihilator',
'Apex', 'Apollo', 'Arcane', 'Archer', 'Arctic', 'Argon', 'Argus', 'Ares', 'Armada', 'Arrow', 'Artillery', 'Asgard',
'Ash', 'Assassin', 'Asteroid', 'Astra', 'Atlas', 'Atom', 'Aurora', 'Avalanche', 'Avatar', 'Avenger', 'Axiom',
'Azrael', 'Azure', 'Ballista', 'Bandit', 'Banshee', 'Barbarian', 'Baron', 'Barrage', 'Basilisk', 'Bastion', 'Battalion',
'Beacon', 'Bear', 'Behemoth', 'Berserker', 'Biscuit', 'Blackout', 'Blade', 'Blaster', 'Blaze', 'Blitz', 'Blizzard',
'Blockade', 'Bolt', 'Bomber', 'Boop', 'Borealis', 'Breaker', 'Brigade', 'Brutal', 'BubbleGum', 'Bullet', 'Button',
'Cabal', 'Cadet', 'Caliber', 'Canyon', 'Captain', 'Cascade', 'Cataclysm', 'Catalyst', 'Catapult', 'Cavalry', 'Centurion',
'Cerberus', 'Chaos', 'Charger', 'Chief', 'Chimera', 'Cinder', 'Cipher', 'Citadel', 'Cleric', 'Cliff', 'Cobra',
'Colonel', 'Colossus', 'Comet', 'Commander', 'Commando', 'Conqueror', 'Constellation', 'Cosmic', 'Cougar', 'Coyote',
'Crash', 'Crater', 'Creek', 'Crescent', 'Crossbow', 'Crown', 'Crucible', 'Crusader', 'Cryptic', 'Crystal', 'Curse',
'Cyber', 'Cyclone', 'Cyclops', 'Daemon', 'Dagger', 'Deadeye', 'Deathwish', 'Decoy', 'Delta', 'Demon', 'Desert',
'Desolator', 'Destroyer', 'Diablo', 'Diamond', 'Digger', 'Disco', 'Doodle', 'Doomsday', 'Dozer', 'Draco', 'Dragon',
'Drifter', 'Droid', 'Druid', 'Duke', 'Dune', 'Dust', 'Dynamite', 'Dynamo', 'Dynasty', 'Eagle', 'Earthquake', 'Echo',
'Eclipse', 'Edict', 'Einherjar', 'Elder', 'Element', 'Elite', 'Elysium', 'Ember', 'Emperor', 'Empire', 'Enforcer',
'Enigma', 'Entity', 'Envoy', 'Eon', 'Epoch', 'Era', 'Eruption', 'Eternal', 'Everest', 'Executioner', 'Exile', 'Exodus',
'Factor', 'Falcon', 'Famine', 'Fang', 'Faze', 'Fenrir', 'Firewall', 'Fissure', 'Flame', 'Flash', 'Flux', 'Forerunner',
'Forest', 'Forge', 'Fortress', 'Fox', 'Fragment', 'Frenzy', 'Frost', 'Fury', 'Fuse', 'Fusion', 'Fuzzy', 'Gadget',
'Gale', 'Gamma', 'Gamer', 'Gargoyle', 'Garrison', 'Gauntlet', 'Geist', 'General', 'Genesis', 'Ghost', 'Giant',
'Giggle', 'Glacier', 'Gladiator', 'Glitch', 'Gloom', 'Gnasher', 'Goblin', 'Golem', 'Goliath', 'Gorgon', 'Granite',
'Gravity', 'Gremlin', 'Griffin', 'Grim', 'Grizzly', 'Groove', 'Guardian', 'Guerilla', 'Gully', 'GummyBear', 'Gunner',
'Hades', 'Hailstorm', 'Hammer', 'Harbinger', 'Harpy', 'Havoc', 'Hawk', 'Hazard', 'Haze', 'Headhunter', 'Hellfire',
'Hellion', 'Herald', 'Hermes', 'Hero', 'Hex', 'Hive', 'Horizon', 'Hornet', 'Hunter', 'Hurricane', 'Husk', 'Hydra',
'Hyperion', 'Ice', 'Icarus', 'Icon', 'Ifrit', 'Illusionist', 'Impact', 'Impulse', 'Incendiary', 'Inferno', 'Infinity',
'Infantry', 'Inquisitor', 'Ion', 'Iron', 'Ironclad', 'Jaguar', 'Javelin', 'Jawbreaker', 'Jellyfish', 'Jester', 'Jet',
'Jinx', 'Jotun', 'Juggernaut', 'Jungle', 'Juno', 'Jupiter', 'Kaiser', 'Kami', 'Karma', 'Kestrel', 'King', 'Kismet',
'Knight', 'Kodiak', 'Kraken', 'Kyrie', 'Labyrinth', 'Lagoon', 'Lancer', 'Landslide', 'Laser', 'Lava', 'Legacy',
'Legend', 'Legion', 'Leopard', 'Leviathan', 'Lightning', 'Lion', 'Lizard', 'Locus', 'Lotus', 'Lumberjack', 'Luna',
'Lynx', 'Maelstrom', 'Mage', 'Magma', 'Magnet', 'Major', 'Malice', 'Mamba', 'Mammoth', 'Manticore', 'Mantis',
'Marauder', 'Marine', 'Marshal', 'Martian', 'Martyr', 'Master', 'Matrix', 'Maverick', 'Mecha', 'Medusa', 'Mega',
'Menace', 'Mercenary', 'Mercury', 'Meridian', 'Mesa', 'Meteor', 'Midgard', 'Mirage', 'Monarch', 'Monsoon', 'Monster',
'Monolith', 'Moon', 'Mountain', 'Murdock', 'Mutant', 'Myrmidon', 'Myth', 'Nadir', 'Nanite', 'Napalm', 'Nebula',
'Necromancer', 'Nemesis', 'Neptune', 'Nether', 'Nexus', 'Nightfall', 'Nightmare', 'Ninja', 'Nitro', 'Nomad', 'Noodle',
'North', 'Nova', 'Nuke', 'Null', 'Nyx', 'Oasis', 'Oblivion', 'Obsidian', 'Ocean', 'Octane', 'Odin', 'Odyssey',
'Olympus', 'Omega', 'Omen', 'Oni', 'Onslaught', 'Onyx', 'Oracle', 'Orbital', 'Orc', 'Origin', 'Outcast', 'Outlaw',
'Outpost', 'Overdrive', 'Overlord', 'Overwatch', 'Paladin', 'Panda', 'Pandemonium', 'Pandora', 'Panther', 'Paragon',
'Paradigm', 'Paradox', 'Parallax', 'Pathfinder', 'Patriot', 'Patrol', 'Pestilence', 'Phalanx', 'Phantom', 'Pharaoh',
'Phoenix', 'Pickle', 'Pioneer', 'Piranha', 'Piston', 'Pixel', 'Plague', 'Plasma', 'Platoon', 'Pluto', 'Polaris',
'Praetorian', 'Primal', 'Prime', 'Pro', 'Prodigy', 'Prophet', 'Protocol', 'Psycho', 'Puma', 'Pulse', 'Punisher',
'Pyramid', 'Pyro', 'Python', 'Quake', 'Quantum', 'Quasar', 'Queen', 'Quest', 'Quicksilver', 'Rabbit', 'Radical',
'Rage', 'Raider', 'Rain', 'Rampage', 'Rampart', 'Ranger', 'Raptor', 'Ratchet', 'Raven', 'Ravine', 'Razor', 'Reaper',
'Rebel', 'Recon', 'Recruit', 'Redline', 'Regiment', 'Relic', 'Renegade', 'Replicant', 'Retro', 'Revenant', 'Riddle',
'Rift', 'Ringer', 'Ripper', 'River', 'Roamer', 'Rocket', 'Rogue', 'Ronin', 'Rook', 'Rubble', 'Ruby', 'Ruin',
'Ruler', 'Rune', 'Sabotage', 'Sabre', 'Saint', 'Salamander', 'Samurai', 'Sanctum', 'Sandman', 'Sapphire', 'Sarge',
'Sasquatch', 'Satellite', 'Saturn', 'Savage', 'Savanna', 'Scarab', 'Scavenger', 'Scepter', 'Scimitar', 'Scorpion',
'Scourge', 'Scout', 'Scribble', 'Scythe', 'Seeker', 'Sentinel', 'Seraph', 'Sergeant', 'Serpent', 'Shade', 'Shadow',
'Shaman', 'Shard', 'Shark', 'Sharpshooter', 'Shell', 'Sheriff', 'Shield', 'Shogun', 'Shrapnel', 'Shrine', 'Siege',
'Sierra', 'Sigma', 'Signal', 'Silver', 'Siren', 'Sirocco', 'Skeptic', 'Skull', 'Slayer', 'Sledge', 'Sling', 'Slingshot',
'Snake', 'Sniper', 'Socks', 'Solar', 'Soldier', 'Solitude', 'Solstice', 'Sonar', 'Sorcerer', 'Soul', 'South',
'Sovereign', 'Sparky', 'Spartan', 'Specter', 'Sphinx', 'Spider', 'Spike', 'Spire', 'Spirit', 'Spitfire', 'Squadron',
'Squall', 'Stalker', 'Star', 'Stardust', 'Stargate', 'Stasis', 'Static', 'Stealth', 'Steel', 'Stinger', 'Stone',
'Storm', 'Stratus', 'Striker', 'Stryker', 'Summit', 'Sun', 'Supernova', 'Surge', 'Swamp', 'Swiftstrike', 'Switch',
'Swoop', 'Sylvan', 'Symbol', 'Synapse', 'Syndicate', 'System', 'Tachyon', 'Tactician', 'Talisman', 'Talon', 'Tank',
'Tarantula', 'Tartarus', 'Taskmaster', 'Tau', 'Tempest', 'Templar', 'Terminal', 'Terminator', 'Terminus', 'Terra',
'Tesseract', 'Testament', 'Tether', 'Thanatos', 'Theta', 'Thorn', 'Thor', 'Thrasher', 'Thunder', 'Tiger', 'Titan',
'Titanium', 'Tokamak', 'Tomahawk', 'Tombstone', 'Tornado', 'Torpedo', 'Torque', 'Totem', 'Toxin', 'Tracer', 'Trance',
'Tranquility', 'Trapper', 'Trauma', 'Trench', 'Triad', 'Tribune', 'Trident', 'Trigger', 'Trinity', 'Trojan', 'Trooper',
'Tsunami', 'Tundra', 'Tunnel', 'Turret', 'Turtle', 'Twister', 'Typhoon', 'Tyrant', 'UFO', 'Ultra', 'Ulysses',
'Umbra', 'Unicorn', 'Union', 'Unity', 'Universe', 'Uprising', 'Uranus', 'Ursa', 'Vagabond', 'Valhalla', 'Valkyrie',
'Valley', 'Valor', 'Vampire', 'Vandal', 'Vanguard', 'Vanish', 'Vector', 'Vega', 'Vengeance', 'Venom', 'Ventura',
'Venus', 'Vertex', 'Veteran', 'Vex', 'Vibration', 'Victor', 'Vindicator', 'Viper', 'Virus', 'Vision', 'Visitor',
'Void', 'Volcano', 'Volt', 'Voltage', 'Voodoo', 'Vortex', 'Vulture', 'Waffle', 'Wanderer', 'War', 'Warden', 'Warlock',
'Warlord', 'Warp', 'Warrior', 'Warthog', 'Wasp', 'Watcher', 'Wave', 'Wayfarer', 'Wendigo', 'West', 'Whisper', 'Whiz',
'Wildcard', 'Wildfire', 'Wind', 'Wing', 'Winter', 'Wisp', 'Witch', 'Wizard', 'Wolf', 'Wolverine', 'Wraith', 'Wrath',
'Wreckage', 'Wyvern', 'Xenon', 'Xenomorph', 'Yeti', 'Yggdrasil', 'Yoru', 'Zealot', 'Zenith', 'Zephyr', 'Zeus',
'Zipper', 'Zodiac', 'Zombie', 'Zone', 'Zoom'
];
const tags = ['[Anti-og]', '[ANTI-OG]', '[Anti-OG]'];
// --- State Variables ---
let isAutomationRunning = false;
let isSpammingActive = false;
let spaceSpamIntervalId = null;
let isArmed = sessionStorage.getItem('territorialAutoStartArmed') === 'true';
// Stop immediately if this isn't a territorial.io page.
if (!isTerritorialPage()) return;
// --- NEW: Dashboard UI Creation ---
function createDashboardUI() {
// Main container
const dashboard = document.createElement('div');
Object.assign(dashboard.style, {
position: 'fixed', top: '20px', left: '20px', zIndex: '10000',
backgroundColor: 'rgba(0, 0, 0, 0.75)', color: 'white',
border: '1px solid #888', borderRadius: '8px',
fontFamily: 'sans-serif', fontSize: '14px',
minWidth: '280px', userSelect: 'none'
});
// Header (for dragging and title)
const header = document.createElement('div');
Object.assign(header.style, {
padding: '8px 12px', backgroundColor: '#333',
cursor: 'move', borderTopLeftRadius: '8px', borderTopRightRadius: '8px',
display: 'flex', justifyContent: 'space-between', alignItems: 'center'
});
header.innerHTML = '<strong>Auto-Play Dashboard</strong>';
// Minimize/Maximize Button
const toggleButton = document.createElement('button');
toggleButton.innerText = '−';
Object.assign(toggleButton.style, {
background: '#555', border: '1px solid #777', color: 'white',
borderRadius: '4px', cursor: 'pointer', width: '24px', height: '24px',
fontSize: '16px', lineHeight: '1', padding: '0'
});
// Content panel with instructions
const content = document.createElement('div');
content.id = 'dashboard-content';
Object.assign(content.style, {
padding: '12px', borderTop: '1px solid #555',
display: 'block' // Initially visible
});
content.innerHTML = `
<ul style="margin: 0; padding-left: 20px; list-style-type: '» ';">
<li>Press <code>F7</code> to arm/disarm auto-start on focus.</li>
<li>Press <code>F6</code> to manually start/stop the script.</li>
<li><strong>Status:</strong> <span id="dashboard-status">Idle</span></li>
</ul>`;
header.appendChild(toggleButton);
dashboard.appendChild(header);
dashboard.appendChild(content);
document.body.appendChild(dashboard);
// --- UI Functionality ---
toggleButton.onclick = () => {
const isMinimized = content.style.display === 'none';
content.style.display = isMinimized ? 'block' : 'none';
toggleButton.innerText = isMinimized ? '−' : '+';
};
makeDraggable(dashboard, header);
}
function makeDraggable(element, handle) {
let isDragging = false, offsetX, offsetY;
handle.onmousedown = (e) => {
isDragging = true;
offsetX = e.clientX - element.offsetLeft;
offsetY = e.clientY - element.offsetTop;
document.onmousemove = (e) => {
if (!isDragging) return;
element.style.left = `${e.clientX - offsetX}px`;
element.style.top = `${e.clientY - offsetY}px`;
};
document.onmouseup = () => { isDragging = false; document.onmousemove = document.onmouseup = null; };
};
}
function updateDashboardStatus(statusText) {
const statusEl = document.getElementById('dashboard-status');
if (statusEl) statusEl.innerText = statusText;
}
// --- Core Script Logic ---
console.log(`[Auto-Play] Script ready. Auto-start is ${isArmed ? 'ARMED' : 'DISARMED'}. Press F7 to toggle. Press F6 to control spam.`);
document.addEventListener('keydown', (event) => {
if (event.key === 'F6') { event.preventDefault(); toggleManualSequence(); }
if (event.key === 'F7') { event.preventDefault(); toggleArmedState(); }
});
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible' && isArmed && !isAutomationRunning && !isSpammingActive) {
isAutomationRunning = true;
startAutomation();
}
});
function toggleManualSequence() {
if (isSpammingActive) { stopSpaceSpam(); }
else if (!isAutomationRunning) { isAutomationRunning = true; startAutomation(); }
}
function toggleArmedState() {
isArmed = !isArmed;
sessionStorage.setItem('territorialAutoStartArmed', isArmed);
console.log(`[Auto-Play] Auto-start on focus is now ${isArmed ? 'ARMED' : 'DISARMED'}.`);
updateDashboardStatus(`Auto-start ${isArmed ? 'ARMED' : 'DISARMED'}.`);
}
function startAutomation() {
console.log('[Auto-Play] Starting automation sequence...');
updateDashboardStatus('Running sequence...');
autoFillUsername()
.then(() => waitForElementAndClick(findMultiplayerButton, "'Multiplayer' button"))
.then(() => waitForElementAndClick(findReadyButton, "'Ready' button"))
.then(() => {
isAutomationRunning = false;
startSpaceSpam();
})
.catch(error => {
console.error(error);
isAutomationRunning = false;
updateDashboardStatus('Error!');
});
}
function autoFillUsername() {
return new Promise((resolve, reject) => {
waitForElement(findUsernameInput, 'Username Input Field').then(nameInput => {
const username = generateRandomUsername();
console.log(`[Auto-Play] Setting username to: ${username}`);
nameInput.value = username;
nameInput.dispatchEvent(new Event('input', { bubbles: true, cancelable: true }));
nameInput.focus();
nameInput.blur();
setTimeout(resolve, 200);
}).catch(reject);
});
}
function generateRandomUsername() {
const randomBase = baseNames[Math.floor(Math.random() * baseNames.length)];
const randomTag = tags[Math.floor(Math.random() * tags.length)];
return Math.random() < 0.5 ? randomTag + randomBase : randomBase + randomTag;
}
function startSpaceSpam() {
if (isSpammingActive) return;
isSpammingActive = true;
updateDashboardStatus('Spamming Space key every 5s...');
console.log('[Auto-Play] Starting spacebar spam every 5 seconds. Press F6 to stop.');
spaceSpamIntervalId = setInterval(() => {
console.log('[Auto-Play] Pressing Spacebar...');
document.dispatchEvent(new KeyboardEvent('keydown', { 'key': ' ', 'code': 'Space', 'keyCode': 32, 'bubbles': true }));
}, 5000);
}
function stopSpaceSpam() {
if (!isSpammingActive) return;
clearInterval(spaceSpamIntervalId);
isSpammingActive = false;
console.log('[Auto-Play] Spacebar spam stopped.');
updateDashboardStatus('Idle.');
}
// --- Helper Functions ---
function isTerritorialPage() {
const href = window.location.href;
if (href.includes('territorial.io')) return true;
if (href.includes('?__cpo=')) { try { return atob(new URLSearchParams(window.location.search).get('__cpo')).includes('territorial.io'); } catch (e) { return false; } }
return false;
}
function waitForElement(findFunction, description) {
return new Promise((resolve, reject) => {
let attempts = 0, maxAttempts = 75; // 15 seconds
const interval = setInterval(() => {
if (attempts++ >= maxAttempts) { clearInterval(interval); reject(new Error(`[Auto-Play] Timed out: ${description}`)); return; }
const element = findFunction();
if (element) { clearInterval(interval); resolve(element); }
}, 200);
});
}
function waitForElementAndClick(findFunction, description) {
return waitForElement(findFunction, description).then(element => element.click());
}
const findUsernameInput = () => document.getElementById('input0');
const findMultiplayerButton = () => Array.from(document.querySelectorAll('button')).find(btn => btn.innerText.includes('Multiplayer'));
const findReadyButton = () => Array.from(document.querySelectorAll('button')).find(btn => btn.innerText.trim().startsWith('Ready'));
// --- Initializer ---
createDashboardUI();
})();