// ==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 = '';
}