Full Stack Hook for Territorial.io. Fixed Auto-Colonizer and SpeedHack. Added Pro-Client Redirect.
// ==UserScript==
// @name TerriX Executor v2.5.1
// @namespace http://tampermonkey.net/
// @version 2.5.1
// @description Full Stack Hook for Territorial.io. Fixed Auto-Colonizer and SpeedHack. Added Pro-Client Redirect.
// @author Assistant
// @match *://territorial.io/*
// @match *://everythingtt.github.io/TerriX-Client/*
// @match file:///*/*.html
// @grant none
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
const CLIENT_URL = "https://everythingtt.github.io/TerriX-Client/Territorial.io.html";
const isOfficialSite = window.location.hostname === "territorial.io";
// --- 1. THE FULL STACK TRAP (IIFE PIERCER) ---
let trap = { ag: null, aD: null, b8: null, bf: null, al: null };
// This captures the core objects by watching for their unique internal property assignments
const createTrap = (prop, name) => {
Object.defineProperty(Object.prototype, prop, {
set: function(v) {
this["_" + prop] = v;
if (!trap[name]) {
trap[name] = this;
console.log(`TerriX: Captured System Object [${name}]`);
}
},
get: function() { return this["_" + prop]; },
configurable: true
});
};
createTrap('h7', 'ag'); // Player Data
createTrap('ep', 'aD'); // Game Config
createTrap('hV', 'b8'); // Command Handler (Fixes Auto-Colonizer)
createTrap('aCP', 'bf'); // Engine Clock (Fixes SpeedHack)
createTrap('kw', 'al'); // Live Player List
// --- 2. SCRIPT LIBRARY ---
const SCRIPT_LIB = {
AutoColonize: `/* Auto-Colonizer: Perfect for Openings */
if(!window.tx_loop) {
window.tx_loop = setInterval(() => {
const G = window.G;
if (!G || !G.b8 || !G.b8.hV) return;
const myId = G.aD.ep;
if (G.ag.h7[myId] > 1000 && G.ag.mz[myId] !== 0) {
G.b8.hV.hc(300, G.aD.f2); // 30% attack on neutral
}
}, 1000);
alert("Auto-Colonizer: ON");
} else { clearInterval(window.tx_loop); window.tx_loop = null; alert("Auto-Colonizer: OFF"); }`,
FullESP: `/* Full ESP: Console Data Dump */
const G = window.G;
console.log("--- LIVE WAR INTELLIGENCE ---");
for(let i=0; i<G.aD.f2; i++) {
if(G.ag.mz[i] !== 0) {
console.log(\`Rank: \${i} | Name: \${G.ag.zU[i]} | Troops: \${Math.floor(G.ag.h7[i])}\`);
}
}
alert("Check Console (F12) for player data.");`,
SpeedHack: `/* Tick Speed Hack (Single Player) */
const speed = prompt("Tick Speed (Default 56, Pro 10):", "10");
if(window.G.bf) window.G.bf.aCP = parseInt(speed);`
};
// --- 3. UI STYLES (Territorial Aesthetic) ---
const style = document.createElement('style');
style.innerHTML = `
#tx-wrapper { position: fixed; top: 0; left: 0; width: 0; height: 0; z-index: 2147483647; font-family: 'system-ui', sans-serif; }
#tx-gui {
position: fixed; top: 100px; left: 100px; width: 620px; height: 450px;
background: rgba(0, 0, 0, 0.92); border: 1.8px solid white;
display: none; flex-direction: column; color: white; box-shadow: 10px 10px 0px rgba(0,0,0,0.5);
}
#tx-header { padding: 10px 15px; background: rgba(40, 40, 40, 1); display: flex; justify-content: space-between; cursor: move; border-bottom: 1.8px solid white; font-weight: bold; }
#tx-body { display: flex; flex: 1; overflow: hidden; }
#tx-sidebar { width: 150px; background: rgba(20, 20, 20, 1); border-right: 1.8px solid white; padding: 12px; display: flex; flex-direction: column; gap: 8px; }
#tx-main { flex: 1; display: flex; flex-direction: column; padding: 12px; background: black; }
#tx-editor { flex: 1; background: #050505; color: #00ff00; border: 1.8px solid #444; padding: 10px; font-family: monospace; resize: none; outline: none; font-size: 12px; }
.tx-btn { padding: 6px; background: rgba(60, 60, 60, 0.85); border: 1.8px solid white; color: white; cursor: pointer; font-size: 10px; font-weight: bold; }
.tx-btn:hover { background: rgba(100, 100, 100, 1); }
.tx-btn.active { background: rgb(0, 100, 0); }
.tx-btn.hook-btn { background: rgb(70, 50, 20); margin-top: auto; }
.tx-btn.client-btn { background: #3a47ff; color: white; border-color: #fff; animation: tx_pulse 2s infinite; }
@keyframes tx_pulse { 0% { opacity: 0.8; } 50% { opacity: 1; } 100% { opacity: 0.8; } }
#tx-toggle { position: fixed; top: 0; left: 50%; transform: translateX(-50%); padding: 4px 20px; background: rgba(0, 80, 0, 1); color: white; border: 1.8px solid white; border-top: none; border-radius: 0 0 5px 5px; cursor: pointer; font-weight: bold; z-index: 1000002; }
#tx-chart, #tx-scripts { display: none; flex: 1; flex-direction: column; gap: 4px; overflow-y: auto; }
.script-card { background: #111; border: 1.8px solid white; padding: 8px; margin-bottom: 5px; display: flex; justify-content: space-between; align-items: center; }
.bar-row { display: flex; align-items: center; gap: 8px; height: 24px; width: 100%; flex-shrink: 0; }
.bar-rank { width: 30px; font-size: 11px; color: #aaa; text-align: right; }
.bar-name { width: 120px; font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.bar-track { flex: 1; background: #222; height: 14px; border: 1px solid #444; position: relative; }
.bar-fill { height: 100%; width: 0%; background: #228B22; transition: width 0.3s ease; }
.bar-val { position: absolute; right: 5px; top: 0px; font-size: 9px; color: white; line-height: 14px; font-weight: bold;}
.me-row { color: #ffd700; font-weight: bold; }
.me-row .bar-fill { background: #ffd700; border: 1px solid white; }
`;
document.documentElement.appendChild(style);
// --- 4. UI CONSTRUCTION ---
const wrapper = document.createElement('div');
wrapper.id = 'tx-wrapper';
document.documentElement.appendChild(wrapper);
const render = () => {
wrapper.innerHTML = `
<div id="tx-toggle">TERRIX MENU</div>
<div id="tx-gui">
<div id="tx-header"><span>TERRIX <span style="color:#228B22">SYSTEM</span></span> <span id="tx-close" style="cursor:pointer">✕</span></div>
<div id="tx-body">
<div id="tx-sidebar">
<button class="tx-btn active" id="nav-editor">EDITOR</button>
<button class="tx-btn" id="nav-chart">POWER INDEX</button>
<button class="tx-btn" id="nav-scripts">SCRIPTS</button>
${isOfficialSite ? `<button class="tx-btn client-btn" onclick="window.open('${CLIENT_URL}')">🚀 TERRIX CLIENT</button>` : ''}
<button class="tx-btn hook-btn" id="tx-hook">INJECT HOOK</button>
</div>
<div id="tx-main">
<textarea id="tx-editor" spellcheck="false">/* TerriX 2.5 */</textarea>
<div id="tx-chart"></div>
<div id="tx-scripts">
<div class="script-card"><span>Auto-Colonizer</span><button class="tx-btn" onclick="tx_load('AutoColonize')">LOAD</button></div>
<div class="script-card"><span>Fog-of-War ESP</span><button class="tx-btn" onclick="tx_load('FullESP')">LOAD</button></div>
<div class="script-card"><span>Speed Hack</span><button class="tx-btn" onclick="tx_load('SpeedHack')">LOAD</button></div>
</div>
</div>
</div>
<div style="padding: 10px 20px; background: #111; display: flex; justify-content: space-between; border-top: 1.8px solid white;">
<button class="tx-btn" style="background:rgb(0,80,0); padding: 5px 15px;" id="tx-execute">EXECUTE</button>
<div style="font-size: 10px; color: #888;">STATUS: <span id="tx-stat" style="color:#f33">DISCONNECTED</span></div>
</div>
</div>
`;
setupLogic();
};
window.tx_load = (k) => { document.getElementById('tx-editor').value = SCRIPT_LIB[k]; document.getElementById('nav-editor').click(); };
const setupLogic = () => {
const gui = document.getElementById('tx-gui');
const editor = document.getElementById('tx-editor');
const chart = document.getElementById('tx-chart');
const scriptTab = document.getElementById('tx-scripts');
const hookBtn = document.getElementById('tx-hook');
const stat = document.getElementById('tx-stat');
document.getElementById('tx-toggle').onclick = () => gui.style.display = gui.style.display === 'flex' ? 'none' : 'flex';
document.getElementById('tx-close').onclick = () => gui.style.display = 'none';
const nav = (idx) => {
[editor, chart, scriptTab].forEach((el, i) => el.style.display = i === idx ? (i === 0 ? 'block' : 'flex') : 'none');
['nav-editor', 'nav-chart', 'nav-scripts'].forEach((id, i) => document.getElementById(id).classList.toggle('active', i === idx));
};
document.getElementById('nav-editor').onclick = () => nav(0);
document.getElementById('nav-chart').onclick = () => nav(1);
document.getElementById('nav-scripts').onclick = () => nav(2);
hookBtn.onclick = function() {
if (window.G || (trap.ag && trap.aD)) {
window.G = window.G || { ...trap, b8: trap.b8 || window.b8, bf: trap.bf || window.bf };
this.innerText = "HOOKED";
this.style.background = "#228B22";
stat.innerText = isOfficialSite ? "INJECTED (LIMITED)" : "CONNECTED (FULL)";
stat.style.color = "#00ff00";
if(isOfficialSite) alert("Limited Hook on Official Site. For full exploits (Speed/Auto), use the TerriX Client button.");
} else {
alert("Engine not found. Expand territory once then try again.");
}
};
document.getElementById('tx-execute').onclick = () => {
if(!window.G) return alert("Hook First");
try { new Function(editor.value)(); } catch(e) { alert(e); }
};
let d = false, x, y;
document.getElementById('tx-header').onmousedown = (e) => { d = true; x = e.clientX - gui.offsetLeft; y = e.clientY - gui.offsetTop; };
window.onmousemove = (e) => { if (d) { gui.style.left = (e.clientX - x) + 'px'; gui.style.top = (e.clientY - y) + 'px'; } };
window.onmouseup = () => d = false;
};
render();
// --- 5. PERMANENT CHART ENGINE ---
const barCache = {};
setInterval(() => {
const chart = document.getElementById('tx-chart');
if (!chart || chart.style.display !== 'flex' || !window.G) return;
const { ag, aD } = window.G;
const myId = aD ? aD.ep : -1;
let players = [];
for (let i = 0; i < 512; i++) {
if (ag.gt[i] > 0) {
const score = (ag.gt[i] * 10) + (ag.h7[i] / 50);
players.push({ id: i, name: ag.zU[i] || "Bot", val: score, isMe: i === myId });
}
}
players.sort((a, b) => b.val - a.val);
const top = players.slice(0, 15);
const max = top[0]?.val || 1;
top.forEach((p, idx) => {
if (!barCache[p.id]) {
const row = document.createElement('div');
row.className = 'bar-row';
row.innerHTML = `<div class="bar-rank"></div><div class="bar-name"></div><div class="bar-track"><div class="bar-fill"></div><span class="bar-val"></span></div>`;
chart.appendChild(row);
barCache[p.id] = row;
}
const row = barCache[p.id];
row.style.display = 'flex';
row.style.order = idx;
row.className = p.isMe ? 'bar-row me-row' : 'bar-row';
row.querySelector('.bar-rank').innerText = `#${idx + 1}`;
row.querySelector('.bar-name').innerText = p.name;
row.querySelector('.bar-fill').style.width = (p.val / max * 100) + '%';
row.querySelector('.bar-val').innerText = Math.floor(p.val).toLocaleString();
});
Object.keys(barCache).forEach(id => { if (!top.find(p => p.id == id)) barCache[id].style.display = 'none'; });
}, 500);
})();