1v1.LOL Aimbot, ESP & Wireframe View

Lets you see players behind walls. Comes with a wireframe view mode and an aimbot too. Press M, N, and T to toggle them.

// ==UserScript==
// @name         1v1.LOL Aimbot, ESP & Wireframe View
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Lets you see players behind walls. Comes with a wireframe view mode and an aimbot too. Press M, N, and T to toggle them.
// @author       maxence (Zert)
// @match        *://1v1.lol/*
// @match        *://1v1.school/*
// @icon         https://www.google.com/s2/favicons?domain=1v1.lol
// @grant        none
// @run-at       document-start
// @require      https://cdn.jsdelivr.net/npm/lil-gui@0.19
// ==/UserScript==

const isSchoolLink = window.location.hostname.indexOf('1v1.school') > -1;

const searchSize = 300;
const threshold = 4.5;

const settings = {
    aimbot: false,
    aimbotSpeed: 0.15,
    esp: true,
    wireframe: true,
    createdBy: 'Zertalious',
    showHelp() {
        dialogEl.style.display = dialogEl.style.display === '' ? 'none' : '';
    }
};

let gui;

function initGui() {
    gui = new lil.GUI();
    const controllers = {};
    for (const key in settings) {
        controllers[key] = gui.add(settings, key).name(fromCamel(key)).listen();
    }
    controllers.aimbotSpeed.min(0.05).max(0.5).step(0.01);
    controllers.createdBy.disable();
}

function fromCamel(text) {
    const result = text.replace(/([A-Z])/g, ' $1');
    return result.charAt(0).toUpperCase() + result.slice(1);
}

const WebGL = WebGL2RenderingContext.prototype;

HTMLCanvasElement.prototype.getContext = new Proxy(HTMLCanvasElement.prototype.getContext, {
    apply(target, thisArgs, args) {
        if (args[1]) {
            args[1].preserveDrawingBuffer = true;
        }
        return Reflect.apply(...arguments);
    }
});

WebGL.shaderSource = new Proxy(WebGL.shaderSource, {
    apply(target, thisArgs, args) {
        let [shader, src] = args;
        if (src.indexOf('gl_Position') > -1) {
            if (src.indexOf('OutlineEnabled') > -1) {
                shader.isPlayerShader = true;
            }
            src = src.replace('void main', `
                out float vDepth;
                uniform bool enabled;
                uniform float threshold;
                void main
            `).replace(/return;/, `
                vDepth = gl_Position.z;
                if (enabled && vDepth > threshold) {
                    gl_Position.z = 1.0;
                }
            `);
        } else if (src.indexOf('SV_Target0') > -1) {
            src = src.replace('void main', `
                in float vDepth;
                uniform bool enabled;
                uniform float threshold;
                void main
            `).replace(/return;/, `
                if (enabled && vDepth > threshold) {
                    SV_Target0 = vec4(1.0, 0.0, 0.0, 1.0);
                }
            `);
        }
        args[1] = src;
        return Reflect.apply(...arguments);
    }
});

WebGL.attachShader = new Proxy(WebGL.attachShader, {
    apply(target, thisArgs, [program, shader]) {
        if (shader.isPlayerShader) program.isPlayerProgram = true;
        return Reflect.apply(...arguments);
    }
});

WebGL.getUniformLocation = new Proxy(WebGL.getUniformLocation, {
    apply(target, thisArgs, [program, name]) {
        const result = Reflect.apply(...arguments);
        if (result) {
            result.name = name;
            result.program = program;
        }
        return result;
    }
});

WebGL.uniform4fv = new Proxy(WebGL.uniform4fv, {
    apply(target, thisArgs, [uniform]) {
        const name = uniform && uniform.name;
        if (name === 'hlslcc_mtx4x4unity_ObjectToWorld' ||
            name === 'hlslcc_mtx4x4unity_ObjectToWorld[0]') {
            uniform.program.isUIProgram = true;
        }
        return Reflect.apply(...arguments);
    }
});

let movementX = 0, movementY = 0;
let count = 0;

let gl;

const handler = {
    apply(target, thisArgs, args) {
        const program = thisArgs.getParameter(thisArgs.CURRENT_PROGRAM);
        if (!program.uniforms) {
            program.uniforms = {
                enabled: thisArgs.getUniformLocation(program, 'enabled'),
                threshold: thisArgs.getUniformLocation(program, 'threshold')
            };
        }
        const couldBePlayer = (isSchoolLink || program.isPlayerProgram) && args[1] > 3000;
        program.uniforms.enabled && thisArgs.uniform1i(program.uniforms.enabled, (settings.esp || settings.aimbot) && couldBePlayer);
        program.uniforms.threshold && thisArgs.uniform1f(program.uniforms.threshold, threshold);
        args[0] = settings.wireframe && !program.isUIProgram && args[1] > 6 ? thisArgs.LINES : args[0];
        if (couldBePlayer) {
            gl = thisArgs;
        }
        Reflect.apply(...arguments);
    }
};

WebGL.drawElements = new Proxy(WebGL.drawElements, handler);
WebGL.drawElementsInstanced = new Proxy(WebGL.drawElementsInstanced, handler);

window.requestAnimationFrame = new Proxy(window.requestAnimationFrame, {
    apply(target, thisArgs, args) {
        args[0] = new Proxy(args[0], {
            apply() {
                update();
                return Reflect.apply(...arguments);
            }
        });
        return Reflect.apply(...arguments);
    }
});

function update() {
    const isPlaying = document.querySelector('canvas').style.cursor === 'none';
    rangeEl.style.display = isPlaying && settings.aimbot ? '' : 'none';
    if (settings.aimbot && gl) {
        const width = Math.min(searchSize, gl.canvas.width);
        const height = Math.min(searchSize, gl.canvas.height);
        const pixels = new Uint8Array(width * height * 4);
        const centerX = gl.canvas.width / 2;
        const centerY = gl.canvas.height / 2;
        const x = Math.floor(centerX - width / 2);
        const y = Math.floor(centerY - height / 2);
        gl.readPixels(x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
        for (let i = 0; i < pixels.length; i += 4) {
            if (pixels[i] === 255 && pixels[i + 1] === 0 && pixels[i + 2] === 0 && pixels[i + 3] === 255) {
                const idx = i / 4;
                const dx = idx % width;
                const dy = (idx - dx) / width;
                movementX += (x + dx - centerX);
                movementY += - (y + dy - centerY);
                count++;
            }
        }
    }
    if (count > 0 && isPlaying) {
        const f = settings.aimbotSpeed / count;
        movementX *= f;
        movementY *= f;
        window.dispatchEvent(new MouseEvent('mousemove', { movementX, movementY }));
        rangeEl.classList.add('range-active');
    } else {
        rangeEl.classList.remove('range-active');
    }
    movementX = 0;
    movementY = 0;
    count = 0;
    gl = null;
}

const el = document.createElement('div');

el.innerHTML = `<style>
.dialog {
    position: absolute;
    left: 50%;
    top: 50%;
    padding: 20px;
    background: #1e294a;
    color: #fff;
    transform: translate(-50%, -50%);
    text-align: center;
    z-index: 999999;
    font-family: cursive;
}
.dialog * {
    color: #fff;
}
.close {
    position: absolute;
    right: 5px;
    top: 5px;
    width: 20px;
    height: 20px;
    opacity: 0.5;
    cursor: pointer;
}
.close:before, .close:after {
    content: ' ';
    position: absolute;
    left: 50%;
    top: 50%;
    width: 100%;
    height: 20%;
    transform: translate(-50%, -50%) rotate(-45deg);
    background: #fff;
}
.close:after {
    transform: translate(-50%, -50%) rotate(45deg);
}
.close:hover {
    opacity: 1;
}
.btn {
    cursor: pointer;
    padding: 0.5em;
    background: red;
    border: 3px solid rgba(0, 0, 0, 0.2);
}
.btn:active {
    transform: scale(0.8);
}
.msg {
    position: absolute;
    left: 10px;
    top: 10px;
    background: #1e294a;
    color: #fff;
    font-family: cursive;
    font-weight: bolder;
    padding: 15px;
    animation: msg 0.5s forwards, msg 0.5s reverse forwards 3s;
    z-index: 999999;
    pointer-events: none;
}
@keyframes msg {
    from {
        transform: translate(-120%, 0);
    }
    to {
        transform: none;
    }
}
.range {
    position: absolute;
    left: 50%;
    top: 50%;
    width: ${searchSize}px;
    height: ${searchSize}px;
    max-width: 100%;
    max-height: 100%;
    border: 1px solid white;
    transform: translate(-50%, -50%);
}
.range-active {
    border: 2px solid red;
}
</style>
<div class="dialog">
    <big>1v1.LOL Aimbot, ESP & Wireframe</big>
    <br><br>
    [T] to toggle aimbot<br>
    [M] to toggle ESP<br>
    [N] to toggle wireframe<br>
    [H] to show/hide help<br>
    [/ ] to show/hide control panel<br>
    <br>By Zertalious
    <br><br>
    <div style="display: grid; grid-template-columns: 1fr 1fr; grid-gap: 5px;">
        <div class="btn" onclick="window.open('https://discord.gg/K24Zxy88VM', '_blank')">Discord</div>
        <div class="btn" onclick="window.open('https://www.instagram.com/zertalious/', '_blank')">Instagram</div>
        <div class="btn" onclick="window.open('https://twitter.com/Zertalious', '_blank')">Twitter</div>
        <div class="btn" onclick="window.open('https://greasyfork.org/en/users/662330-zertalious', '_blank')">More scripts</div>
    </div>
</div>
<div class="msg" style="display: none;"></div>
<div class="range" style="display: none;"></div>`;

const msgEl = el.querySelector('.msg');
const dialogEl = el.querySelector('.dialog');
const rangeEl = el.querySelector('.range');

window.addEventListener('DOMContentLoaded', function () {
    while (el.children.length > 0) {
        document.body.appendChild(el.children[0]);
    }
    initGui();
});

function toggleSetting(key) {
    settings[key] = !settings[key];
    showMsg(fromCamel(key), settings[key]);
}

const keyToSetting = {
    'KeyM': 'esp',
    'KeyN': 'wireframe',
    'KeyT': 'aimbot'
};

window.addEventListener('keyup', function (event) {
    if (document.activeElement && document.activeElement.value !== undefined) return;
    if (keyToSetting[event.code]) {
        toggleSetting(keyToSetting[event.code]);
    }
    switch (event.code) {
        case 'KeyH':
            settings.showHelp();
            break;
        case 'Slash':
            gui._hidden ? gui.show() : gui.hide();
            break;
    }
});

function showMsg(name, bool) {
    msgEl.innerText = name + ': ' + (bool ? 'ON' : 'OFF');
    msgEl.style.display = 'none';
    void msgEl.offsetWidth;
    msgEl.style.display = '';
}