EvoWars Classic Mod

Advanced sandbox engine tool with unrestricted closeness thresholds, standalone bot size scaling, and distinct animation state overriding loops.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

Advertisement:

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

Advertisement:

// ==UserScript==
// @name         EvoWars Classic Mod
// @namespace    http://tampermonkey.net/
// @version      2026-06-19_v25.3
// @description  Advanced sandbox engine tool with unrestricted closeness thresholds, standalone bot size scaling, and distinct animation state overriding loops.
// @author       KILLER & Assistant
// @match        https://evowars.io/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    let rt = null;
    let currentMode = 'circle';
    let globalAngle = 0;
    let pulseWave = 0;
    let visualInvisibleMask = false;

    // Lowered threshold limit allows bots to move directly into your immediate weapon range
    let baseDistanceModifier = -250;
    let botSizeMultiplier = 1.0;
    let forcedAnimationIndex = 0; // 0 = Standard, 1 = Attack Pose, 2 = Run Sprint State

    const textMatrix = [
        [1,0,1,0,0,1,0,1,0,1,0,0,0,1,0,0,1,1,1,0,1,1,0,0],
        [1,0,1,0,0,1,0,1,0,1,0,0,0,1,0,0,1,0,0,0,1,0,1,0],
        [1,1,1,0,0,1,0,1,0,1,0,0,0,1,0,0,1,1,0,0,1,1,0,0],
        [1,0,1,0,0,1,0,1,0,1,0,0,0,1,0,0,1,0,0,0,1,0,1,0],
        [1,0,1,0,0,1,0,1,1,1,1,0,1,1,1,0,1,1,1,0,1,0,0,1]
    ];

    function initUI() {
        if (document.getElementById('neon-sandbox-shell')) return;

        const style = document.createElement('style');
        style.innerHTML = `
            #neon-sandbox-shell {
                position: fixed;
                top: 40px;
                left: 40px;
                background: rgba(10, 10, 16, 0.96);
                border: 2px solid #ff1493;
                border-radius: 10px;
                padding: 12px;
                z-index: 999999;
                font-family: 'Segoe UI', system-ui, sans-serif;
                color: #fff;
                width: 240px;
                box-shadow: 0 0 15px rgba(255, 20, 147, 0.3);
                cursor: move;
                user-select: none;
            }
            .panel-header {
                text-align: center;
                font-weight: 900;
                color: #fff;
                letter-spacing: 1.5px;
                margin-bottom: 10px;
                font-size: 13px;
                border-bottom: 1px solid rgba(255, 255, 255, 0.1);
                padding-bottom: 6px;
            }
            .panel-header span {
                color: #ff1493;
            }
            .scroll-container {
                max-height: 240px;
                overflow-y: auto;
                padding-right: 4px;
            }
            .scroll-container::-webkit-scrollbar {
                width: 4px;
            }
            .scroll-container::-webkit-scrollbar-track {
                background: rgba(255, 255, 255, 0.02);
            }
            .scroll-container::-webkit-scrollbar-thumb {
                background: #ff1493;
                border-radius: 2px;
            }
            .cyber-btn {
                display: flex;
                justify-content: space-between;
                align-items: center;
                width: 100%;
                margin-bottom: 6px;
                background: rgba(255, 255, 255, 0.04);
                color: #ccc;
                border: 1px solid rgba(255, 255, 255, 0.08);
                border-radius: 4px;
                padding: 6px 10px;
                cursor: pointer;
                font-size: 11px;
                font-weight: 600;
                transition: all 0.15s ease;
            }
            .cyber-btn:hover {
                background: rgba(255, 20, 147, 0.12);
                color: #fff;
                border-color: #ff1493;
            }
            .cyber-btn.active {
                border-color: #00ffff;
                color: #00ffff;
                background: rgba(0, 255, 255, 0.05);
            }
            .btn-status {
                width: 8px;
                height: 8px;
                border-radius: 50%;
                background: rgba(255, 255, 255, 0.15);
                border: 1px solid rgba(255, 255, 255, 0.3);
            }
            .cyber-btn.active .btn-status {
                background: #00ffff;
                box-shadow: 0 0 6px #00ffff;
                border-color: #00ffff;
            }
            .toggle-btn {
                width: 100%;
                margin-bottom: 10px;
                background: #200015;
                color: #ff1493;
                border: 1px solid #ff1493;
                border-radius: 5px;
                padding: 6px;
                cursor: pointer;
                font-weight: bold;
                font-size: 11px;
                text-transform: uppercase;
                transition: all 0.15s ease;
            }
            .toggle-btn.active {
                background: #001f1f;
                color: #00ffff;
                border-color: #00ffff;
            }
            .control-row {
                display: flex;
                justify-content: space-between;
                align-items: center;
                margin-bottom: 6px;
                background: rgba(255, 255, 255, 0.02);
                padding: 4px 6px;
                border-radius: 4px;
                border: 1px solid rgba(255, 255, 255, 0.05);
            }
            .ctrl-label {
                font-size: 9px;
                font-weight: bold;
                color: #aaa;
            }
            .step-btn {
                width: 22px;
                height: 22px;
                background: #111;
                color: #ff1493;
                border: 1px solid #ff1493;
                border-radius: 4px;
                font-weight: bold;
                cursor: pointer;
                font-size: 12px;
                display: flex;
                align-items: center;
                justify-content: center;
                transition: all 0.15s;
            }
            .step-btn:hover {
                background: #ff1493;
                color: #fff;
            }
        `;
        document.head.appendChild(style);

        const menu = document.createElement('div');
        menu.id = 'neon-sandbox-shell';

        menu.innerHTML = `
            <div class="panel-header">🎭 <span>K I L L E R</span> 🎭</div>

            <div class="control-row">
                <span class="ctrl-label">DISTANCE MATRIX</span>
                <div style="display:flex; gap:6px;">
                    <button id="dist-down" class="step-btn">-</button>
                    <button id="dist-up" class="step-btn">+</button>
                </div>
            </div>

            <div class="control-row">
                <span class="ctrl-label">BOT SCALE SIZE</span>
                <div style="display:flex; gap:6px;">
                    <button id="size-down" class="step-btn">-</button>
                    <button id="size-up" class="step-btn">+</button>
                </div>
            </div>

            <div class="control-row">
                <span class="ctrl-label">ANIMATION INDEX</span>
                <div style="display:flex; gap:6px;">
                    <button id="anim-cycle" class="step-btn">🔄</button>
                </div>
            </div>

            <button id="t-visual" class="toggle-btn">Lag Cleaner: OFF</button>

            <div class="scroll-container">
                <button id="m-killer" class="cyber-btn">KILLER Matrix Word <div class="btn-status"></div></button>
                <button id="m-circle" class="cyber-btn">Strike Orbit <div class="btn-status"></div></button>
                <button id="m-duoring" class="cyber-btn">Double Ring Shell <div class="btn-status"></div></button>
                <button id="m-vortex" class="cyber-btn">Vortex Storm <div class="btn-status"></div></button>
                <button id="m-lattice" class="cyber-btn">Matrix Grid Lattice <div class="btn-status"></div></button>
                <button id="m-maploop" class="cyber-btn">Map Boundary Patrol <div class="btn-status"></div></button>
                <button id="m-singularity" class="cyber-btn">Cosmic Singularity <div class="btn-status"></div></button>
                <button id="m-dna" class="cyber-btn">Double Helix DNA <div class="btn-status"></div></button>
                <button id="m-atom" class="cyber-btn">Satellite Shells <div class="btn-status"></div></button>
                <button id="m-star" class="cyber-btn">Pentagram Matrix <div class="btn-status"></div></button>
                <button id="m-infinity" class="cyber-btn">Infinity Loop <div class="btn-status"></div></button>
                <button id="m-square" class="cyber-btn">Box Perimeter <div class="btn-status"></div></button>
                <button id="m-warp" class="cyber-btn">Hyperdrive Warp <div class="btn-status"></div></button>
            </div>
        `;
        document.body.appendChild(menu);

        const modes = ['killer', 'circle', 'duoring', 'vortex', 'lattice', 'maploop', 'singularity', 'dna', 'atom', 'star', 'infinity', 'square', 'warp'];
        modes.forEach(mode => {
            document.getElementById(`m-${mode}`).onclick = function() {
                currentMode = mode;
                modes.forEach(m => document.getElementById(`m-${m}`).classList.remove('active'));
                this.classList.add('active');
            };
        });
        document.getElementById('m-killer').classList.add('active');
        currentMode = 'killer';

        // Expanded control parameters allowing overlapping ranges
        document.getElementById('dist-up').onclick = () => baseDistanceModifier += 25;
        document.getElementById('dist-down').onclick = () => baseDistanceModifier -= 25; // Removed strict minimum baseline limit

        document.getElementById('size-up').onclick = () => botSizeMultiplier = Math.min(10.0, botSizeMultiplier + 0.2);
        document.getElementById('size-down').onclick = () => botSizeMultiplier = Math.max(0.1, botSizeMultiplier - 0.2);

        document.getElementById('anim-cycle').onclick = () => {
            forcedAnimationIndex = (forcedAnimationIndex + 1) % 3;
        };

        const vToggle = document.getElementById('t-visual');
        vToggle.onclick = () => {
            visualInvisibleMask = !visualInvisibleMask;
            vToggle.classList.toggle('active', visualInvisibleMask);
            vToggle.innerText = visualInvisibleMask ? "Lag Cleaner: ACTIVE ✨" : "Lag Cleaner: OFF";
        };

        let isDragging = false;
        let offsetX, offsetY;
        menu.addEventListener('mousedown', (e) => {
            if (e.target.tagName === 'BUTTON' || e.target.closest('.scroll-container')) return;
            isDragging = true;
            offsetX = e.clientX - menu.offsetLeft;
            offsetY = e.clientY - menu.offsetTop;
        });
        window.addEventListener('mousemove', (e) => {
            if (!isDragging) return;
            menu.style.left = (e.clientX - offsetX) + 'px';
            menu.style.top = (e.clientY - offsetY) + 'px';
        });
        window.addEventListener('mouseup', () => isDragging = false);
    }

    function tickProcessingPipeline() {
        if (!rt || !rt.types_by_index) return;

        let me = null;
        let enemies = [];

        for (let i = 0; i < rt.types_by_index.length; i++) {
            const type = rt.types_by_index[i];
            if (!type || !type.instances || type.instances.length === 0) continue;
            const sample = type.instances[0];
            if (!sample || !sample.instance_vars) continue;

            if (type.instances.length === 1 && sample.instance_vars.length >= 60 && sample.instance_vars.length <= 64) {
                me = sample;
            } else if (type.instances.length > 1 && sample.instance_vars.length >= 64 && sample.instance_vars.length <= 72) {
                enemies = type.instances;
            }
        }

        if (!me) return;

        globalAngle += 0.025;
        pulseWave += 0.04;

        const playerSizeFactor = me.width || 64;
        const minimumSafeRadius = (playerSizeFactor * 2.5) + 120 + baseDistanceModifier;
        const separationSpacing = 240;

        let wordPoints = [];
        for (let r = 0; r < textMatrix.length; r++) {
            for (let c = 0; c < textMatrix[r].length; c++) {
                if (textMatrix[r][c] === 1) {
                    wordPoints.push({ r: r, c: c });
                }
            }
        }

        for (let i = 0; i < enemies.length; i++) {
            const p = enemies[i];
            if (!p || p.uid === me.uid) continue;

            if (visualInvisibleMask) {
                p.x = -5000;
                p.y = -5000;
                continue;
            }

            // Independent Bot Scaling Interface Logic
            if (!p.baseWidthStorage) {
                p.baseWidthStorage = p.width || 64;
                p.baseHeightStorage = p.height || 64;
            }
            p.width = p.baseWidthStorage * botSizeMultiplier;
            p.height = p.baseHeightStorage * botSizeMultiplier;

            // Forced Engine Animation Overriding States
            if (p.cur_animation) {
                if (forcedAnimationIndex === 1) {
                    p.cur_animation.name = "attack";
                } else if (forcedAnimationIndex === 2) {
                    p.cur_animation.name = "run";
                }
            }

            if (p.instance_vars) {
                if (typeof p.instance_vars[0] === 'number') p.instance_vars[0] = 9999999;
                if (typeof p.instance_vars[12] === 'number') p.instance_vars[12] = 0;
                if (p.instance_vars[1] === true) p.instance_vars[1] = false;
            }

            const spreadFactor = (i / Math.max(1, enemies.length));
            const spreadAngle = spreadFactor * Math.PI * 2;

            switch(currentMode) {
                case 'killer': {
                    if (wordPoints.length > 0) {
                        const ptIndex = i % wordPoints.length;
                        const pt = wordPoints[ptIndex];
                        const textSpacingX = 55;
                        const textSpacingY = 65;

                        const textCenterX = me.x - ((textMatrix[0].length * textSpacingX) / 2);
                        const textCenterY = me.y - (minimumSafeRadius + 100);

                        p.x = textCenterX + (pt.c * textSpacingX);
                        p.y = textCenterY + (pt.r * textSpacingY);
                    } else {
                        p.x = me.x;
                        p.y = me.y - minimumSafeRadius;
                    }
                    break;
                }

                case 'circle': {
                    const individualAngle = globalAngle + spreadAngle;
                    p.x = me.x + Math.cos(individualAngle) * minimumSafeRadius;
                    p.y = me.y + Math.sin(individualAngle) * minimumSafeRadius;
                    break;
                }

                case 'duoring': {
                    const layer = i % 2;
                    const ringSize = minimumSafeRadius + (layer * separationSpacing);
                    const ringAngle = globalAngle + (Math.floor(i / 2) * (Math.PI * 2 / Math.ceil(enemies.length / 2)));
                    p.x = me.x + Math.cos(ringAngle) * ringSize;
                    p.y = me.y + Math.sin(ringAngle) * ringSize;
                    break;
                }

                case 'vortex': {
                    const depthFactor = (i % 4) + 1;
                    const dynamicRadius = minimumSafeRadius + (depthFactor * (separationSpacing - 50));
                    const vortexAngle = (globalAngle * (3 / depthFactor)) + spreadAngle;
                    p.x = me.x + Math.cos(vortexAngle) * dynamicRadius;
                    p.y = me.y + Math.sin(vortexAngle) * dynamicRadius;
                    break;
                }

                case 'lattice': {
                    const columns = Math.ceil(Math.sqrt(enemies.length));
                    const row = Math.floor(i / columns);
                    const col = i % columns;
                    const gridGapX = 230;
                    const gridGapY = 230;

                    const originX = me.x - ((columns - 1) * gridGapX / 2);
                    const originY = me.y - (minimumSafeRadius + 260);

                    p.x = originX + (col * gridGapX);
                    p.y = originY - (row * gridGapY);
                    break;
                }

                case 'maploop': {
                    const mapWidth = rt.original_width || 6000;
                    const mapHeight = rt.original_height || 6000;
                    const loopSpeed = globalAngle * 0.15;

                    const individualProgress = (spreadFactor + loopSpeed) % 1.0;
                    const perimeter = (mapWidth * 2) + (mapHeight * 2);
                    const currentPos = individualProgress * perimeter;

                    if (currentPos < mapWidth) {
                        p.x = currentPos; p.y = 150;
                    } else if (currentPos < mapWidth + mapHeight) {
                        p.x = mapWidth - 150; p.y = currentPos - mapWidth;
                    } else if (currentPos < (mapWidth * 2) + mapHeight) {
                        p.x = mapWidth - (currentPos - (mapWidth + mapHeight)); p.y = mapHeight - 150;
                    } else {
                        p.x = 150; p.y = mapHeight - (currentPos - ((mapWidth * 2) + mapHeight));
                    }
                    break;
                }

                case 'singularity': {
                    const mouseX = rt.mouseX || me.x;
                    const mouseY = rt.mouseY || me.y;
                    const suctionAngle = globalAngle * 2 + spreadAngle;
                    p.x = mouseX + Math.cos(suctionAngle) * (80 + (i * 22));
                    p.y = mouseY + Math.sin(suctionAngle) * (80 + (i * 22));
                    break;
                }

                case 'dna': {
                    const backAngle = (me.angle || 0) + Math.PI;
                    const downstreamDistance = minimumSafeRadius + (Math.floor(i / 2) * separationSpacing);
                    const coreTrailX = me.x + Math.cos(backAngle) * downstreamDistance;
                    const coreTrailY = me.y + Math.sin(backAngle) * downstreamDistance;

                    const weaveWidth = 200 * Math.sin(pulseWave + (Math.floor(i / 2) * 0.5));
                    const sideAngle = backAngle + (Math.PI / 2);
                    const directionMultiplier = ((i % 2) === 0) ? 1 : -1;

                    p.x = coreTrailX + Math.cos(sideAngle) * (weaveWidth * directionMultiplier);
                    p.y = coreTrailY + Math.sin(sideAngle) * (weaveWidth * directionMultiplier);
                    break;
                }

                case 'atom': {
                    const shell = i % 3;
                    const atomAngle = globalAngle + (Math.floor(i / 3) * (Math.PI * 2 / 5));
                    let targetAngleX = atomAngle;
                    let targetAngleY = atomAngle;

                    if (shell === 1) targetAngleY += Math.PI / 3;
                    if (shell === 2) targetAngleX += Math.PI / 3;

                    p.x = me.x + Math.cos(targetAngleX) * (minimumSafeRadius + (shell * separationSpacing));
                    p.y = me.y + Math.sin(targetAngleY) * (minimumSafeRadius + (shell * separationSpacing));
                    break;
                }

                case 'star': {
                    const points = 5;
                    const pointIndex = i % points;
                    const fraction = Math.floor(i / points) / Math.max(1, Math.floor(enemies.length / points));

                    const angle1 = (pointIndex * (Math.PI * 2 / points)) + globalAngle;
                    const angle2 = (((pointIndex + 2) % points) * (Math.PI * 2 / points)) + globalAngle;

                    const x1 = me.x + Math.cos(angle1) * (minimumSafeRadius + 180);
                    const y1 = me.y + Math.sin(angle1) * (minimumSafeRadius + 180);
                    const x2 = me.x + Math.cos(angle2) * (minimumSafeRadius + 180);
                    const y2 = me.y + Math.sin(angle2) * (minimumSafeRadius + 180);

                    p.x = x1 + (x2 - x1) * fraction;
                    p.y = y1 + (y2 - y1) * fraction;
                    break;
                }

                case 'infinity': {
                    const scaleFactor = (minimumSafeRadius + 100) * 1.4;
                    const t = spreadAngle + (globalAngle * 0.8);

                    const infX = (scaleFactor * Math.cos(t)) / (1 + Math.sin(t) * Math.sin(t));
                    const infY = (scaleFactor * Math.sin(t) * Math.cos(t)) / (1 + Math.sin(t) * Math.sin(t));

                    p.x = me.x + infX;
                    p.y = me.y + infY;
                    break;
                }

                case 'square': {
                    const side = i % 4;
                    const steps = Math.floor(i / 4);
                    const maxSteps = Math.ceil(enemies.length / 4);
                    const perimeterRatio = steps / maxSteps;
                    const halfSize = minimumSafeRadius + 120;

                    if (side === 0) {
                        p.x = me.x - halfSize + (halfSize * 2 * perimeterRatio);
                        p.y = me.y - halfSize;
                    } else if (side === 1) {
                        p.x = me.x + halfSize;
                        p.y = me.y - halfSize + (halfSize * 2 * perimeterRatio);
                    } else if (side === 2) {
                        p.x = me.x + halfSize - (halfSize * 2 * perimeterRatio);
                        p.y = me.y + halfSize;
                    } else if (side === 3) {
                        p.x = me.x - halfSize;
                        p.y = me.y + halfSize - (halfSize * 2 * perimeterRatio);
                    }
                    break;
                }

                case 'warp': {
                    const trackingAngle = globalAngle + (i * 45);
                    p.x = me.x + Math.cos(trackingAngle) * (minimumSafeRadius + (Math.sin(pulseWave + i) * 380));
                    p.y = me.y + Math.sin(trackingAngle) * (minimumSafeRadius + (Math.cos(pulseWave + i) * 380));
                    break;
                }
            }
        }
    }

    const discovery = setInterval(() => {
        if (window.cr_getC2Runtime && window.cr_getC2Runtime()) {
            clearInterval(discovery);
            rt = window.cr_getC2Runtime();

            initUI();

            if (rt && typeof rt.tick === 'function') {
                const nativeTick = rt.tick;
                rt.tick = function () {
                    nativeTick.apply(this, arguments);
                    try { tickProcessingPipeline(); } catch (err) {}
                };
            }
        }
    }, 400);
})();