Ultimate Dino Hack GUI

Hack Chrome Dino: Modern Dark GUI, Draggable, Collapsible, Smart Auto Jump.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name         Ultimate Dino Hack GUI  
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description  Hack Chrome Dino: Modern Dark GUI, Draggable, Collapsible, Smart Auto Jump.
// @author       Max Stewie  
// @match        *://chromedino.com/*
// @match        chrome://dino
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Đợi game load
    const waitForRunner = setInterval(() => {
        if (typeof Runner !== 'undefined' && Runner.instance_) {
            clearInterval(waitForRunner);
            initHack();
        }
    }, 100);

    function initHack() {
        // --- STATE ---
        const state = {
            isInvincible: false,
            autoJump: false,
            originalGameOver: Runner.prototype.gameOver,
            isMinimized: false
        };

        // --- STYLES (Modern Dark Theme) ---
        const style = document.createElement('style');
        style.innerHTML = `
            #dino-hack-container {
                position: fixed; top: 20px; right: 20px; z-index: 99999;
                width: 240px;
                font-family: 'Consolas', 'Monaco', monospace;
                user-select: none;
                box-shadow: 0 10px 30px rgba(0,0,0,0.5);
                border-radius: 12px;
                overflow: hidden;
                backdrop-filter: blur(10px);
                background: rgba(30, 30, 30, 0.9);
                border: 1px solid rgba(255, 255, 255, 0.1);
                transition: height 0.3s ease;
            }
            #hack-header {
                padding: 12px 15px;
                background: linear-gradient(90deg, #00C853, #64DD17);
                color: #000; font-weight: bold; cursor: move;
                display: flex; justify-content: space-between; align-items: center;
                font-size: 14px; text-transform: uppercase; letter-spacing: 1px;
            }
            #hack-minimize {
                cursor: pointer; font-weight: 900; padding: 0 5px;
                transition: transform 0.2s;
            }
            #hack-minimize:hover { transform: scale(1.2); }
            #hack-body {
                padding: 15px; display: flex; flex-direction: column; gap: 12px;
            }
            .hack-row { display: flex; gap: 10px; }
            .hack-btn {
                flex: 1; padding: 10px; border: none; border-radius: 6px;
                background: #333; color: #aaa; font-weight: bold;
                cursor: pointer; transition: all 0.2s; font-size: 12px;
                border: 1px solid #444;
            }
            .hack-btn:hover { background: #444; color: #fff; }
            .hack-btn.active {
                background: rgba(0, 200, 83, 0.2);
                color: #00C853; border-color: #00C853;
                box-shadow: 0 0 8px rgba(0, 200, 83, 0.3);
            }
            .hack-label { font-size: 11px; color: #888; margin-bottom: 4px; display: block; }
            .hack-input {
                width: 100%; background: #222; border: 1px solid #444;
                color: #fff; padding: 6px; border-radius: 4px;
                font-family: monospace;
            }
            /* Custom Range Slider */
            input[type=range] {
                -webkit-appearance: none; width: 100%; background: transparent;
            }
            input[type=range]::-webkit-slider-runnable-track {
                width: 100%; height: 6px; background: #444; border-radius: 3px;
            }
            input[type=range]::-webkit-slider-thumb {
                -webkit-appearance: none; height: 16px; width: 16px;
                border-radius: 50%; background: #00C853;
                margin-top: -5px; cursor: pointer;
            }
            .hidden-body { display: none !important; }
        `;
        document.head.appendChild(style);

        // --- LOGIC ---
        
        function toggleInvincible(btn) {
            state.isInvincible = !state.isInvincible;
            if (state.isInvincible) {
                Runner.prototype.gameOver = function() {};
                btn.classList.add('active');
            } else {
                Runner.prototype.gameOver = state.originalGameOver;
                btn.classList.remove('active');
            }
        }

        function toggleAutoJump(btn) {
            state.autoJump = !state.autoJump;
            if (state.autoJump) {
                btn.classList.add('active');
                requestAnimationFrame(autoJumpLoop);
            } else {
                btn.classList.remove('active');
            }
        }

        function autoJumpLoop() {
            if (!state.autoJump) return;
            const instance = Runner.instance_;
            
            if (!instance.playing || instance.crashed) {
                requestAnimationFrame(autoJumpLoop);
                return;
            }

            const tRex = instance.tRex;
            const obstacles = instance.horizon.obstacles;

            if (obstacles.length > 0) {
                const obstacle = obstacles[0];
                // Thuật toán tính khoảng cách nhảy thông minh
                const actionDistance = 100 + (instance.currentSpeed * 15);
                
                // Thêm check loại chướng ngại vật (Pterodactyl trên cao thì cúi xuống nếu cần - ở đây chỉ nhảy)
                const dist = obstacle.xPos - tRex.xPos;
                if (dist > 0 && dist < actionDistance && !tRex.jumping) {
                    tRex.startJump(instance.currentSpeed);
                }
            }
            requestAnimationFrame(autoJumpLoop);
        }

        // --- GUI CONSTRUCTION ---

        const gui = document.createElement('div');
        gui.id = 'dino-hack-container';

        // Header (Drag Handle)
        const header = document.createElement('div');
        header.id = 'hack-header';
        header.innerHTML = `<span>⚡ Dino Hack</span> <span id="hack-minimize">_</span>`;
        gui.appendChild(header);

        // Body
        const body = document.createElement('div');
        body.id = 'hack-body';

        // Buttons Row
        const btnRow = document.createElement('div');
        btnRow.className = 'hack-row';
        
        const btnGod = document.createElement('button');
        btnGod.className = 'hack-btn';
        btnGod.textContent = 'GOD MODE';
        btnGod.onclick = () => toggleInvincible(btnGod);

        const btnJump = document.createElement('button');
        btnJump.className = 'hack-btn';
        btnJump.textContent = 'AUTO JUMP';
        btnJump.onclick = () => toggleAutoJump(btnJump);

        btnRow.appendChild(btnGod);
        btnRow.appendChild(btnJump);
        body.appendChild(btnRow);

        // Speed Slider
        const speedContainer = document.createElement('div');
        const speedLabel = document.createElement('span');
        speedLabel.className = 'hack-label';
        speedLabel.innerHTML = 'SPEED: <span id="speed-val">10</span>';
        
        const speedInput = document.createElement('input');
        speedInput.type = 'range';
        speedInput.min = '10'; speedInput.max = '200'; speedInput.step = '1'; speedInput.value = '10';
        speedInput.oninput = function() {
            Runner.instance_.setSpeed(parseFloat(this.value));
            document.getElementById('speed-val').textContent = this.value;
        };

        speedContainer.appendChild(speedLabel);
        speedContainer.appendChild(speedInput);
        body.appendChild(speedContainer);

        // Score Input
        const scoreContainer = document.createElement('div');
        scoreContainer.innerHTML = '<span class="hack-label">SET SCORE:</span>';
        const scoreInput = document.createElement('input');
        scoreInput.className = 'hack-input';
        scoreInput.type = 'number';
        scoreInput.placeholder = 'Example: 99999';
        scoreInput.onchange = function() {
            const val = parseInt(this.value);
            Runner.instance_.distanceMeter.setHighScore(val);
            Runner.instance_.distanceRan = val / Runner.instance_.distanceMeter.config.COEFFICIENT;
        };
        scoreContainer.appendChild(scoreInput);
        body.appendChild(scoreContainer);

        // Reset
        const btnReset = document.createElement('button');
        btnReset.className = 'hack-btn';
        btnReset.style.width = '100%';
        btnReset.textContent = 'RESTART GAME';
        btnReset.onclick = () => location.reload();
        body.appendChild(btnReset);

        gui.appendChild(body);
        document.body.appendChild(gui);

        // --- DRAG & DROP LOGIC ---
        let isDragging = false, startX, startY, initialLeft, initialTop;

        header.onmousedown = function(e) {
            // Ngăn drag khi click nút minimize
            if(e.target.id === 'hack-minimize') return;
            
            isDragging = true;
            startX = e.clientX;
            startY = e.clientY;
            initialLeft = gui.offsetLeft;
            initialTop = gui.offsetTop;
            header.style.cursor = 'grabbing';
        };

        document.onmousemove = function(e) {
            if (isDragging) {
                gui.style.left = (initialLeft + e.clientX - startX) + 'px';
                gui.style.top = (initialTop + e.clientY - startY) + 'px';
                gui.style.right = 'auto'; // Disable default right positioning
            }
        };

        document.onmouseup = function() {
            isDragging = false;
            header.style.cursor = 'move';
        };

        // --- MINIMIZE LOGIC ---
        const minimizeBtn = document.getElementById('hack-minimize');
        minimizeBtn.onclick = () => {
            state.isMinimized = !state.isMinimized;
            if(state.isMinimized) {
                body.classList.add('hidden-body');
                minimizeBtn.textContent = '+';
            } else {
                body.classList.remove('hidden-body');
                minimizeBtn.textContent = '_';
            }
        };

        // --- KEYBOARD SHORTCUT (H) ---
        document.addEventListener('keydown', (e) => {
            if (e.key.toLowerCase() === 'h' && document.activeElement.tagName !== 'INPUT') {
                gui.style.display = gui.style.display === 'none' ? 'block' : 'none';
            }
        });
    }
})();