TerriX Executor v2.6

Elite Intelligence Suite. Adds Threat Radar, Interest Sync, and Reactive Defense.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         TerriX Executor v2.6
// @namespace    http://tampermonkey.net/
// @version      2.6
// @description  Elite Intelligence Suite. Adds Threat Radar, Interest Sync, and Reactive Defense.
// @author       Assistant
// @match        *://territorial.io/*
// @match        *://everythingtt.github.io/TerriX-Client/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    const CLIENT_URL = "https://everythingtt.github.io/TerriX-Client/Territorial.io.html";

    // --- 1. SCRIPT LIBRARY (The Elite Tools) ---
    const SCRIPT_LIB = {
        ThreatRadar: `/* Threat Radar: Detects ships in Fog of War */
if(!window.radar_loop) {
    window.radar_loop = setInterval(() => {
        const { bN, aD, ag } = window.G;
        const myId = aD.ep;
        const ships = bN.y;
        for(let i=0; i < ships.mG; i++) {
            // Check destination of ship (logic simplified for brevity)
            const targetPlayer = ships.mK[i] >> 3; 
            if(targetPlayer === myId) {
                console.warn("⚠️ TERRIX RADAR: INCOMING SHIP DETECTED!");
                document.getElementById('tx-header').style.background = 'red';
                setTimeout(() => document.getElementById('tx-header').style.background = '', 500);
            }
        }
    }, 1000);
    alert("Threat Radar Active.");
} else { clearInterval(window.radar_loop); window.radar_loop = null; alert("Radar Disabled."); }`,

        InterestSync: `/* Interest Sync: Highlights the economic pulse */
const G = window.G;
let lastTroops = G.ag.h7[G.aD.ep];
window.interest_watch = setInterval(() => {
    const current = G.ag.h7[G.aD.ep];
    if (current > lastTroops + 100) { // Large jump detected (Interest)
        const indicator = document.createElement('div');
        indicator.style = "position:fixed; top:50%; left:50%; color:gold; font-size:40px; z-index:999999; transform:translate(-50%,-50%); pointer-events:none; font-weight:bold;";
        indicator.innerText = "💰 TICK";
        document.body.appendChild(indicator);
        setTimeout(() => indicator.remove(), 300);
    }
    lastTroops = current;
}, 50);
alert("Economic Sync Active.");`,

        AutoColonize: `/* Optimization for early game expansion */
if(!window.tx_loop) {
    window.tx_loop = setInterval(() => {
        const G = window.G;
        if (!G || !G.b8 || !G.b8.hV) return;
        if (G.ag.h7[G.aD.ep] > 2000) G.b8.hV.hc(250, 512); 
    }, 1200);
    alert("Auto-Colonizer: ON");
} else { clearInterval(window.tx_loop); window.tx_loop = null; alert("OFF"); }`
    };

    // --- 2. UI STYLES (Territorial Glass Theme) ---
    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: 680px; height: 480px;
            background: rgba(10, 10, 10, 0.95); border: 1.8px solid white; 
            display: none; flex-direction: column; color: white; box-shadow: 0 0 40px rgba(0,0,0,1);
        }
        #tx-header { padding: 12px 20px; background: rgba(30, 30, 30, 1); display: flex; justify-content: space-between; cursor: move; border-bottom: 1.8px solid white; font-weight: 900; letter-spacing: 2px;}
        #tx-body { display: flex; flex: 1; overflow: hidden; }
        #tx-sidebar { width: 160px; background: rgba(15, 15, 15, 1); border-right: 1.8px solid white; padding: 15px; display: flex; flex-direction: column; gap: 10px; }
        #tx-main { flex: 1; display: flex; flex-direction: column; padding: 15px; background: #000; }
        #tx-editor { flex: 1; background: #050505; color: #00ff00; border: 1.5px solid #333; padding: 15px; font-family: 'Consolas', monospace; resize: none; outline: none; font-size: 13px; }
        
        .tx-btn { padding: 8px; background: rgba(50, 50, 50, 0.9); border: 1.8px solid white; color: white; cursor: pointer; font-size: 11px; font-weight: bold; text-transform: uppercase; }
        .tx-btn:hover { background: #444; border-color: #00ff00; }
        .tx-btn.active { background: #006400; }
        .tx-btn.hook-btn { background: #4b3214; margin-top: auto; border-color: #ffd700; }
        .tx-btn.client-btn { background: #1a1aff; border-color: #fff; animation: tx_glow 1.5s infinite; }
        
        @keyframes tx_glow { 0% { box-shadow: 0 0 5px #1a1aff; } 50% { box-shadow: 0 0 20px #1a1aff; } 100% { box-shadow: 0 0 5px #1a1aff; } }

        #tx-toggle { position: fixed; top: 0; left: 50%; transform: translateX(-50%); padding: 5px 30px; background: #005000; color: white; border: 1.8px solid white; border-top: none; border-radius: 0 0 10px 10px; cursor: pointer; font-weight: bold; z-index: 1000003; font-size: 10px;}

        #tx-chart, #tx-scripts { display: none; flex: 1; flex-direction: column; gap: 5px; overflow-y: auto; }
        .script-item { background: #111; border: 1.5px solid #444; padding: 10px; display: flex; justify-content: space-between; align-items: center; border-radius: 4px; }
        .script-info { font-size: 12px; font-weight: bold; color: #00d2ff; }

        /* Chart Styling */
        .bar-row { display: flex; align-items: center; gap: 10px; height: 28px; width: 100%; flex-shrink: 0; transition: transform 0.3s ease; }
        .bar-rank { width: 35px; font-size: 12px; color: #777; font-weight: bold; text-align: right; }
        .bar-name { width: 140px; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: #eee; }
        .bar-track { flex: 1; background: #111; height: 16px; border: 1px solid #333; position: relative; }
        .bar-fill { height: 100%; width: 0%; background: #2e7d32; transition: width 0.4s ease; border-right: 2px solid #fff; }
        .bar-val { position: absolute; left: 100%; margin-left: 10px; font-size: 10px; color: #00ff00; font-family: monospace; }
        
        .me-row .bar-name { color: #ffd700; font-weight: bold; }
        .me-row .bar-fill { background: #ffd700; border: 1px solid white; }
    `;
    document.documentElement.appendChild(style);

    // --- 3. CORE LOGIC & UI ---
    const trap = { ag: null, aD: null, b8: null, bf: null, al: null, bN: null };
    const createTrap = (prop, name) => {
        Object.defineProperty(Object.prototype, prop, {
            set: function(v) { this["_" + prop] = v; if (!trap[name]) trap[name] = this; },
            get: function() { return this["_" + prop]; },
            configurable: true
        });
    };
    ['h7', 'ag'], ['ep', 'aD'], ['hV', 'b8'], ['aCP', 'bf'], ['kw', 'al'], ['mG', 'bN'].forEach(t => createTrap(t[0], t[1]));

    const build = () => {
        const wrapper = document.createElement('div');
        wrapper.id = 'tx-wrapper';
        wrapper.innerHTML = `
            <div id="tx-toggle">TERRIX EXECUTOR v2.6</div>
            <div id="tx-gui">
                <div id="tx-header"><span>TERRIX <span style="color:#00ff00">ELITE</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">MODS</button>
                        <button class="tx-btn client-btn" onclick="window.open('${CLIENT_URL}')">🚀 PRO 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 Elite Interface */</textarea>
                        <div id="tx-chart"></div>
                        <div id="tx-scripts">
                            <div class="script-item"><span class="script-info">Threat Radar (ESP)</span><button class="tx-btn" onclick="tx_load('ThreatRadar')">LOAD</button></div>
                            <div class="script-item"><span class="script-info">Interest Sync</span><button class="tx-btn" onclick="tx_load('InterestSync')">LOAD</button></div>
                            <div class="script-item"><span class="script-info">Auto-Colonizer</span><button class="tx-btn" onclick="tx_load('AutoColonize')">LOAD</button></div>
                        </div>
                    </div>
                </div>
                <div style="padding: 10px 20px; background: #0a0a0a; display: flex; justify-content: space-between; border-top: 1.8px solid white;">
                    <button class="tx-btn" style="background:#008000; border:none; padding: 5px 20px;" id="tx-execute">RUN SCRIPT</button>
                    <div style="font-size: 10px; color: #555;">STATUS: <span id="tx-stat" style="color:#ff4444">WAITING</span></div>
                </div>
            </div>
        `;
        document.documentElement.appendChild(wrapper);

        const gui = document.getElementById('tx-gui');
        document.getElementById('tx-toggle').onclick = () => gui.style.display = gui.style.display === 'flex' ? 'none' : 'flex';
        document.getElementById('tx-close').onclick = () => gui.style.display = 'none';

        const tabs = [document.getElementById('tx-editor'), document.getElementById('tx-chart'), document.getElementById('tx-scripts')];
        const navBtns = ['nav-editor', 'nav-chart', 'nav-scripts'];
        navBtns.forEach((id, i) => {
            document.getElementById(id).onclick = () => {
                navBtns.forEach(b => document.getElementById(id).classList.remove('active'));
                tabs.forEach(t => t.style.display = 'none');
                document.getElementById(id).classList.add('active');
                tabs[i].style.display = i === 0 ? 'block' : 'flex';
            };
        });

        document.getElementById('tx-hook').onclick = function() {
            if (window.G || (trap.ag && trap.aD)) {
                window.G = window.G || { ...trap };
                this.innerText = "HOOKED"; this.style.background = "#008000";
                document.getElementById('tx-stat').innerText = "CONNECTED";
                document.getElementById('tx-stat').style.color = "#00ff00";
            } else alert("Error: Engine Not Found.");
        };

        document.getElementById('tx-execute').onclick = () => { try { new Function(document.getElementById('tx-editor').value)(); } catch(e) { alert(e); } };

        window.tx_load = (k) => { document.getElementById('tx-editor').value = SCRIPT_LIB[k]; document.getElementById('nav-editor').click(); };

        // Draggable
        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;
    };

    build();

    // --- 4. LEADERBOARD ---
    const bars = {};
    setInterval(() => {
        if (!window.G || document.getElementById('tx-chart').style.display !== 'flex') 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 pwr = (ag.gt[i] * 10) + (ag.h7[i] / 50);
                players.push({ id: i, name: ag.zU[i] || "Bot", val: pwr, 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 (!bars[p.id]) {
                const r = document.createElement('div');
                r.className = 'bar-row';
                r.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>`;
                document.getElementById('tx-chart').appendChild(r);
                bars[p.id] = r;
            }
            const r = bars[p.id];
            r.style.display = 'flex'; r.style.order = idx;
            r.className = p.isMe ? 'bar-row me-row' : 'bar-row';
            r.querySelector('.bar-rank').innerText = "#" + (idx + 1);
            r.querySelector('.bar-name').innerText = p.name;
            r.querySelector('.bar-fill').style.width = (p.val / max * 100) + '%';
            r.querySelector('.bar-val').innerText = Math.floor(p.val).toLocaleString();
        });
        Object.keys(bars).forEach(id => { if (!top.find(p => p.id == id)) bars[id].style.display = 'none'; });
    }, 500);

})();