TerriX Executor v2.3

Roblox-style Executor. Now recommends the pre-hooked TerriX-Client on GitHub Pages.

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.3
// @namespace    http://tampermonkey.net/
// @version      10.3
// @description  Roblox-style Executor. Now recommends the pre-hooked TerriX-Client on GitHub Pages.
// @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";

    // --- 1. THE TRAP ---
    let leakedAg = null, leakedAd = null, myDetectedId = -1;

    Object.defineProperty(Object.prototype, 'h7', {
        set: function(v) { this._h7 = v; if (this.gt && this.zU && !leakedAg) leakedAg = this; },
        get: function() { return this._h7; },
        configurable: true
    });

    Object.defineProperty(Object.prototype, 'ep', {
        set: function(v) { this._ep = v; myDetectedId = v; if (this.f2 === 512 && !leakedAd) leakedAd = this; },
        get: function() { return this._ep; },
        configurable: true
    });

    const resolveMyId = (ag) => {
        if (leakedAd && typeof leakedAd.ep !== 'undefined') return leakedAd.ep;
        const input = document.getElementById('input0');
        const myName = input ? input.value.trim() : "";
        if (myName && ag && ag.zU) {
            for (let i = 0; i < 512; i++) if (ag.zU[i] === myName && ag.mz[i] !== 0) return i;
        }
        return myDetectedId;
    };

    // --- 2. STYLES ---
    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: 600px; height: 420px;
            background: rgba(0, 0, 0, 0.9); border: 1.8px solid white; 
            display: none; flex-direction: column; color: white; overflow: hidden;
            box-shadow: 10px 10px 0px rgba(0,0,0,0.5);
        }
        #tx-header { padding: 8px 15px; background: rgba(40, 40, 40, 0.9); display: flex; justify-content: space-between; cursor: move; border-bottom: 1.8px solid white; font-weight: bold; font-size: 14px; text-transform: uppercase; letter-spacing: 1px; }
        #tx-body { display: flex; flex: 1; overflow: hidden; }
        #tx-sidebar { width: 140px; background: rgba(20, 20, 20, 0.9); border-right: 1.8px solid white; padding: 10px; 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: rgba(10, 10, 10, 1); 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; text-align: center; }
        .tx-btn:hover { background: rgba(100, 100, 100, 0.9); }
        .tx-btn.active { background: rgb(0, 100, 0); }
        .tx-btn.hook-btn { background: rgb(70, 50, 20); margin-top: auto; }
        .tx-btn.exec-btn { background: rgb(0, 80, 0); padding: 10px; font-size: 13px; }
        .tx-btn.client-btn { background: #3a47ff; border-color: #777; font-size: 9px; animation: glow 2s infinite; }

        @keyframes glow { 0% {box-shadow: 0 0 5px #3a47ff;} 50% {box-shadow: 0 0 15px #3a47ff;} 100% {box-shadow: 0 0 5px #3a47ff;} }

        #tx-toggle { position: fixed; top: 0; left: 50%; transform: translateX(-50%); padding: 4px 20px; background: rgba(0, 80, 0, 0.9); color: white; border: 1.8px solid white; border-top: none; border-radius: 0 0 5px 5px; cursor: pointer; font-weight: bold; font-size: 12px; z-index: 1000002; }

        #tx-chart { display: none; flex: 1; flex-direction: column; gap: 4px; overflow-y: auto; }
        .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; font-weight: bold; }
        .bar-name { width: 120px; font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: #ddd; }
        .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; text-shadow: 1px 1px 1px black;}
        .me-row .bar-name { color: #ffd700; }
        .me-row .bar-fill { background: #ffd700; border: 1px solid white; }
        .me-row .bar-val { color: black; text-shadow: none; }
    `;
    document.documentElement.appendChild(style);

    // --- 3. UI GENERATION ---
    const wrapper = document.createElement('div');
    wrapper.id = 'tx-wrapper';
    document.documentElement.appendChild(wrapper);

    const render = () => {
        wrapper.innerHTML = `
            <div id="tx-toggle">TERRIX EXECUTOR</div>
            <div id="tx-gui">
                <div id="tx-header"><span>TERRIX <span style="color:#3a47ff">CLIENT</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>
                        <a href="${CLIENT_URL}" target="_blank" style="text-decoration:none">
                            <button class="tx-btn client-btn">🚀 USE TERRIX CLIENT</button>
                        </a>
                        <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.3 Ready */
// Pre-hooked Client detected: window.G is fully available.</textarea>
                        <div id="tx-chart"></div>
                    </div>
                </div>
                <div style="padding: 10px 20px; background: rgba(20,20,20,1); display: flex; justify-content: space-between; align-items: center; border-top: 1.8px solid white;">
                    <button class="tx-btn exec-btn" id="tx-execute">EXECUTE</button>
                    <div style="font-size: 10px; color: #888;">
                        SCOPE: <span id="tx-stat" style="color:#f33">UNHOOKED</span>
                    </div>
                </div>
            </div>
        `;
        setupLogic();
    };

    const setupLogic = () => {
        const gui = document.getElementById('tx-gui');
        const toggle = document.getElementById('tx-toggle');
        const editor = document.getElementById('tx-editor');
        const chart = document.getElementById('tx-chart');
        const hookBtn = document.getElementById('tx-hook');
        const stat = document.getElementById('tx-stat');

        // Auto-Hook if on TerriX-Client (Github Pages)
        if (window.location.hostname.includes("github.io") || window.l) {
            setTimeout(() => {
                if (window.l && window.aD) {
                    window.G = { l, aD, ag, bS, b8, bf, al, ad, t, bC };
                    hookBtn.innerText = "CLIENT CONNECTED";
                    hookBtn.style.background = "#228B22";
                    stat.innerText = "TERRIX-CLIENT";
                    stat.style.color = "#00ff00";
                }
            }, 1000);
        }

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

        document.getElementById('nav-editor').onclick = function() {
            this.classList.add('active'); document.getElementById('nav-chart').classList.remove('active');
            editor.style.display = 'block'; chart.style.display = 'none';
        };
        document.getElementById('nav-chart').onclick = function() {
            this.classList.add('active'); document.getElementById('nav-editor').classList.remove('active');
            editor.style.display = 'none'; chart.style.display = 'flex';
        };

        hookBtn.onclick = function() {
            if (window.G) return;
            if (leakedAg) {
                window.G = { ag: leakedAg, aD: leakedAd || { f2: 512, ep: myDetectedId } };
                this.innerText = "HOOKED";
                this.style.background = "#228B22";
                stat.innerText = "INJECTED";
                stat.style.color = "#00ff00";
            } else {
                const choice = confirm("IIFE Hook failed on this domain.\n\nWould you like to switch to the TerriX Pro Client? (Supports all features & God Mode)");
                if (choice) window.open(CLIENT_URL, "_blank");
            }
        };

        document.getElementById('tx-execute').onclick = () => {
            if (!window.G) return alert("You must Hook or use TerriX Client first.");
            try { eval(editor.value); } catch(e) { alert(e); }
        };

        let drag = false, x, y;
        document.getElementById('tx-header').onmousedown = (e) => { drag = true; x = e.clientX - gui.offsetLeft; y = e.clientY - gui.offsetTop; };
        window.onmousemove = (e) => { if (drag) { gui.style.left = (e.clientX - x) + 'px'; gui.style.top = (e.clientY - y) + 'px'; } };
        window.onmouseup = () => drag = false;
    };

    render();

    // --- 4. CHART ENGINE ---
    const barCache = {};
    setInterval(() => {
        const chart = document.getElementById('tx-chart');
        if (!chart || chart.style.display !== 'flex' || !window.G) return;

        const { ag } = window.G;
        const myActualId = resolveMyId(ag);

        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] || "Unknown", val: score, isMe: i === myActualId });
            }
        }
        players.sort((a, b) => b.val - a.val);
        const top = players.slice(0, 14);
        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;
            if (p.isMe) row.classList.add('me-row'); else row.classList.remove('me-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);

})();