sopo

Super Pro Autohit + Strong Antiban + Advanced Aim Assist

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

You will need to install an extension such as Tampermonkey to install this script.

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         sopo
// @namespace    sopo
// @version      4.1
// @description  Super Pro Autohit + Strong Antiban + Advanced Aim Assist
// @author       sopo
// @match        *://*.evoworld.io/*
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function () {
    'use strict';

    let enabled = false;
    let lastHitTime = 0;
    let isResting = false;
    let clickStreak = 0;
    let sessionStart = Date.now();

    // === SUPER ANTIBAN ===
    let lastHumanAction = Date.now();
    let suspiciousLevel = 0;
    let longBreakChance = 0;

    const statusDiv = document.createElement('div');
    statusDiv.style.position = 'fixed';
    statusDiv.style.bottom = '75px';
    statusDiv.style.left = '50%';
    statusDiv.style.transform = 'translateX(-50%)';
    statusDiv.style.background = 'rgba(0, 0, 0, 0.96)';
    statusDiv.style.padding = '12px 28px';
    statusDiv.style.borderRadius = '12px';
    statusDiv.style.fontFamily = 'Arial, sans-serif';
    statusDiv.style.fontSize = '18px';
    statusDiv.style.fontWeight = 'bold';
    statusDiv.style.zIndex = '999999';
    statusDiv.style.pointerEvents = 'none';
    statusDiv.style.border = '3px solid #00ff88';
    statusDiv.style.boxShadow = '0 0 25px rgba(0, 255, 136, 0.8)';
    document.body.appendChild(statusDiv);

    function updateStatus() {
        const playTime = Math.floor((Date.now() - sessionStart) / 60000);
        statusDiv.innerHTML = enabled 
            ? `🔥 sopo <span style='color:#00ff88'>ON</span><br><span style='font-size:14px'>Thời gian: ${playTime} phút</span>` 
            : `⛔ sopo <span style='color:#ff4444'>OFF</span>`;
        statusDiv.style.borderColor = enabled ? '#00ff88' : '#ff4444';
    }

    document.addEventListener('keydown', (e) => {
        if (e.key.toLowerCase() === 'r') {
            enabled = !enabled;
            updateStatus();
        }
    });

    function getRandomInt(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }

    function getClickDelay() {
        if (isResting) return getRandomInt(950, 2450);

        const playTime = (Date.now() - sessionStart) / 60000;
        let cps = getRandomInt(19, 24);

        if (playTime > 25) cps = getRandomInt(17, 22);
        if (playTime > 60) cps = getRandomInt(16, 20);

        let delay = 1000 / cps;
        delay += getRandomInt(-30, 65);

        if (Math.random() < 0.12 + longBreakChance) {
            delay += getRandomInt(2200, 5200);
            longBreakChance = 0;
        } else if (Math.random() < 0.28) {
            delay += getRandomInt(320, 780);
        }

        return Math.max(40, Math.floor(delay));
    }

    function performProAutohit() {
        const canvas = document.querySelector('canvas');
        if (!canvas) return;

        clickStreak++;
        const rect = canvas.getBoundingClientRect();

        const mouseX = window.mouseX || (rect.left + rect.width * 0.5);
        const mouseY = window.mouseY || (rect.top + rect.height * 0.5);

        let x = mouseX + getRandomInt(-48, 48);
        let y = mouseY + getRandomInt(-48, 48);

        if (Math.random() < 0.35) {
            x += getRandomInt(-25, 25);
            y += getRandomInt(-22, 22);
        }

        const holdTime = getRandomInt(13, 31);

        const eventsDown = [
            new PointerEvent('pointerdown', {bubbles: true, clientX: x, clientY: y, button: 0}),
            new MouseEvent('mousedown', {bubbles: true, clientX: x, clientY: y, button: 0})
        ];
        eventsDown.forEach(ev => canvas.dispatchEvent(ev));

        setTimeout(() => {
            const eventsUp = [
                new PointerEvent('pointerup', {bubbles: true, clientX: x, clientY: y, button: 0}),
                new MouseEvent('mouseup', {bubbles: true, clientX: x, clientY: y, button: 0}),
                new MouseEvent('click', {bubbles: true, clientX: x, clientY: y, button: 0})
            ];
            eventsUp.forEach(ev => canvas.dispatchEvent(ev));
        }, holdTime);

        if (clickStreak > getRandomInt(8, 14)) {
            isResting = true;
            suspiciousLevel++;
            setTimeout(() => {
                isResting = false;
                clickStreak = 0;
            }, getRandomInt(850, 2350));
        }

        lastHumanAction = Date.now();
    }

    document.addEventListener('mousemove', (e) => {
        window.mouseX = e.clientX;
        window.mouseY = e.clientY;
        lastHumanAction = Date.now();
        longBreakChance = Math.max(0, longBreakChance - 0.08);
    });

    function proLoop() {
        if (!enabled) {
            requestAnimationFrame(proLoop);
            return;
        }

        if (Date.now() - lastHumanAction > 28000) {
            isResting = true;
            setTimeout(() => { isResting = false; }, getRandomInt(4500, 11000));
        }

        if (Date.now() - lastHitTime > getClickDelay()) {
            performProAutohit();
            lastHitTime = Date.now();
        }

        requestAnimationFrame(proLoop);
    }

    updateStatus();
    requestAnimationFrame(proLoop);

    console.log('%c✅ sopo v4.1 LOADED! Press R to toggle', 
        'color: #00ff88; font-weight: bold; font-size: 15px');
})();