// ==UserScript==
// @name Krunkax - levifrsn63
// @namespace http://tampermonkey.net/
// @version 0.6(Beta)
// @description Locks aim to the nearest player in krunker.io and shows players behind walls. Also shows a line between you and them.
// @author levifrsn63
// @match *://krunker.io/*
// @match *://browserfps.com/*
// @exclude *://krunker.io/social*
// @exclude *://krunker.io/editor*
// @icon https://www.google.com/s2/favicons?domain=krunker.io
// @grant none
// @license MIT
// @run-at document-start
// @require https://unpkg.com/[email protected]/build/three.min.js
// ==/UserScript==
const THREE = window.THREE;
delete window.THREE;
// LocalStorage key for persistence
const STORAGE_KEY = 'krunkax_settings';
// Default settings
const defaultSettings = {
aimbotEnabled: true,
aimbotOnRightMouse: true,
espEnabled: true,
espLines: false,
wireframe: false,
fovCircle: true,
fovRadius: 200,
aimSmoothing: false,
antiRecoil: false,
teamCheck: false,
iPadMode: false,
aimSmoothingSpeed: 30,
antiRecoilOffset: 0,
antiRecoilAmount: 0,
allHacksEnabled: true,
dialogDismissed: false,
nearestPlayerIndicator: false
};
// Load settings from localStorage or use defaults
function loadSettings() {
try {
const saved = localStorage.getItem(STORAGE_KEY);
if (saved) {
const parsed = JSON.parse(saved);
return { ...defaultSettings, ...parsed };
}
} catch (e) {
console.log('Error loading settings:', e);
}
return { ...defaultSettings };
}
// Save settings to localStorage
function saveSettings() {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
} catch (e) {
console.log('Error saving settings:', e);
}
}
// Clear settings from localStorage
function clearSettings() {
try {
localStorage.removeItem(STORAGE_KEY);
// Reset to defaults
Object.assign(settings, defaultSettings);
console.log('Settings cleared and reset to defaults');
} catch (e) {
console.log('Error clearing settings:', e);
}
}
// Clear all cookies and storage to unban
function unban() {
try {
// Clear all cookies
document.cookie.split(';').forEach(cookie => {
const eqPos = cookie.indexOf('=');
const name = eqPos > -1 ? cookie.substring(0, eqPos).trim() : cookie.trim();
document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';
document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/;domain=' + location.hostname;
document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/;domain=.' + location.hostname;
});
// Clear localStorage
localStorage.clear();
// Clear sessionStorage
sessionStorage.clear();
console.log('All cookies and storage cleared for unban');
} catch (e) {
console.log('Error during unban:', e);
}
}
// Initialize settings
const settings = loadSettings();
const keyToSetting = {
Digit5: 'aimbotEnabled',
Digit6: 'aimbotOnRightMouse',
Digit7: 'espEnabled',
Digit8: 'espLines',
Digit9: 'wireframe',
Digit0: 'fovCircle',
Digit1: 'aimSmoothing',
Digit2: 'antiRecoil'
};
// Default keybinds
const defaultKeybinds = {
aimbotEnabled: 'Digit5',
aimbotOnRightMouse: 'Digit6',
espEnabled: 'Digit7',
espLines: 'Digit8',
wireframe: 'Digit9',
fovCircle: 'Digit0',
aimSmoothing: 'Digit1',
antiRecoil: 'Digit2',
teamCheck: '',
rightMouseAimbot: ''
};
// Custom keybinds (will be updated by user)
const customKeybinds = { ...defaultKeybinds };
const gui = createGUI();
// Create FOV circle canvas
const fovCanvas = document.createElement('canvas');
fovCanvas.style.position = 'fixed';
fovCanvas.style.top = '0';
fovCanvas.style.left = '0';
fovCanvas.style.width = '100%';
fovCanvas.style.height = '100%';
fovCanvas.style.pointerEvents = 'none';
fovCanvas.style.zIndex = '9999';
let scene;
const x = {
window: window,
document: document,
querySelector: document.querySelector,
consoleLog: console.log,
ReflectApply: Reflect.apply,
ArrayPrototype: Array.prototype,
ArrayPush: Array.prototype.push,
ObjectPrototype: Object.prototype,
clearInterval: window.clearInterval,
setTimeout: window.setTimeout,
reToString: RegExp.prototype.toString,
indexOf: String.prototype.indexOf,
requestAnimationFrame: window.requestAnimationFrame
};
x.consoleLog( 'Waiting to inject...' );
const proxied = function ( object ) {
// [native code]
try {
if ( typeof object === 'object' &&
typeof object.parent === 'object' &&
object.parent.type === 'Scene' &&
object.parent.name === 'Main' ) {
x.consoleLog( 'Found Scene!' )
scene = object.parent;
x.ArrayPrototype.push = x.ArrayPush;
}
} catch ( error ) {}
return x.ArrayPush.apply( this, arguments );
}
const tempVector = new THREE.Vector3();
const tempObject = new THREE.Object3D();
tempObject.rotation.order = 'YXZ';
// Store target player info for indicator
let targetPlayerScreenPos = { x: null, y: null };
let targetPlayerDistance = null;
// FOV circle drawing function
function drawFOVCircle() {
const ctx = fovCanvas.getContext('2d');
ctx.clearRect(0, 0, fovCanvas.width, fovCanvas.height);
if (settings.fovCircle) {
const centerX = fovCanvas.width / 2;
const centerY = fovCanvas.height / 2;
ctx.beginPath();
ctx.arc(centerX, centerY, settings.fovRadius, 0, 2 * Math.PI);
ctx.strokeStyle = 'rgba(255, 0, 0, 0.5)';
ctx.lineWidth = 2;
ctx.stroke();
// Draw crosshair
ctx.beginPath();
ctx.moveTo(centerX - 10, centerY);
ctx.lineTo(centerX + 10, centerY);
ctx.moveTo(centerX, centerY - 10);
ctx.lineTo(centerX, centerY + 10);
ctx.strokeStyle = 'rgba(0, 255, 0, 0.7)';
ctx.lineWidth = 2;
ctx.stroke();
}
// Draw nearest player indicator on circle around crosshair
if (settings.nearestPlayerIndicator && targetPlayerScreenPos.x !== null && targetPlayerDistance !== null) {
const centerX = fovCanvas.width / 2;
const centerY = fovCanvas.height / 2;
// Calculate direction to target
const dx = targetPlayerScreenPos.x - centerX;
const dy = targetPlayerScreenPos.y - centerY;
const angle = Math.atan2(dy, dx);
// Position indicator on 240px radius circle around crosshair
const indicatorRadius = 240;
const indicatorX = centerX + Math.cos(angle) * indicatorRadius;
const indicatorY = centerY + Math.sin(angle) * indicatorRadius;
// Draw triangle pointing toward nearest player
const triangleSize = 12;
ctx.save();
ctx.translate(indicatorX, indicatorY);
ctx.rotate(angle);
ctx.beginPath();
ctx.moveTo(0, -triangleSize);
ctx.lineTo(-triangleSize / 2, triangleSize / 2);
ctx.lineTo(triangleSize / 2, triangleSize / 2);
ctx.closePath();
ctx.fillStyle = 'rgba(255, 100, 100, 0.8)';
ctx.fill();
ctx.strokeStyle = 'rgba(255, 100, 100, 1)';
ctx.lineWidth = 2;
ctx.stroke();
ctx.restore();
}
// Always show distance at bottom of screen if we have a target
if (targetPlayerDistance !== null) {
const centerX = fovCanvas.width / 2;
const distanceText = `Closest Player: ${Math.round(targetPlayerDistance)}m`;
ctx.font = 'bold 14px monospace';
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
// Draw text shadow for better visibility
ctx.fillStyle = 'rgba(0, 0, 0, 0.8)';
ctx.fillText(distanceText, centerX + 1, fovCanvas.height - 9);
// Draw text
ctx.fillStyle = 'rgba(255, 255, 255, 0.95)';
ctx.fillText(distanceText, centerX, fovCanvas.height - 10);
}
}
// Check if point is within FOV
function isWithinFOV(screenX, screenY) {
// When FOV circle is disabled, always return true to target closest person overall
if (!settings.fovCircle) return true;
const centerX = window.innerWidth / 2;
const centerY = window.innerHeight / 2;
const distance = Math.sqrt(
Math.pow(screenX - centerX, 2) +
Math.pow(screenY - centerY, 2)
);
return distance <= settings.fovRadius;
}
const geometry = new THREE.EdgesGeometry( new THREE.BoxGeometry( 5, 15, 5 ).translate( 0, 7.5, 0 ) );
function createBoxMaterial() {
return new THREE.RawShaderMaterial( {
uniforms: {
boxColor: { value: new THREE.Color( 1.0, 0.0, 0.0 ) }
},
vertexShader: `
attribute vec3 position;
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
gl_Position.z = 1.0;
}
`,
fragmentShader: `
precision mediump float;
uniform vec3 boxColor;
void main() {
gl_FragColor = vec4( boxColor, 1.0 );
}
`
} );
}
const material = new THREE.RawShaderMaterial( {
vertexShader: `
attribute vec3 position;
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
gl_Position.z = 1.0;
}
`,
fragmentShader: `
void main() {
gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );
}
`
} );
const line = new THREE.LineSegments( new THREE.BufferGeometry(), material );
line.frustumCulled = false;
const linePositions = new THREE.BufferAttribute( new Float32Array( 100 * 2 * 3 ), 3 );
line.geometry.setAttribute( 'position', linePositions );
let injectTimer = null;
let lastRotation = { x: 0, y: 0 };
let lockedTarget = null;
let isMouseDown = false;
function animate() {
x.requestAnimationFrame.call( x.window, animate );
// Draw FOV circle
drawFOVCircle();
if ( ! scene && ! injectTimer ) {
const el = x.querySelector.call( x.document, '#loadingBg' );
if ( el && el.style.display === 'none' ) {
x.consoleLog( 'Inject timer started!' );
injectTimer = x.setTimeout.call( x.window, () => {
x.consoleLog( 'Injected!' );
x.ArrayPrototype.push = proxied;
}, 2e3 );
}
}
if ( scene === undefined || ! scene.children ) {
return;
}
const players = [];
let myPlayer;
for ( let i = 0; i < scene.children.length; i ++ ) {
const child = scene.children[ i ];
if ( child.type === 'Object3D' ) {
try {
if ( child.children[ 0 ].children[ 0 ].type === 'PerspectiveCamera' ) {
myPlayer = child;
} else {
players.push( child );
}
} catch ( err ) {}
} else if ( child.material ) {
child.material.wireframe = settings.wireframe;
}
}
if ( ! myPlayer ) {
x.consoleLog( 'Player not found, finding new scene.' );
x.ArrayPrototype.push = proxied;
return;
}
let counter = 0;
let targetPlayer;
let minDistance = Infinity;
tempObject.matrix.copy( myPlayer.matrix ).invert()
const camera = myPlayer.children[ 0 ].children[ 0 ];
const validTargets = [];
for ( let i = 0; i < players.length; i ++ ) {
const player = players[ i ];
if ( ! player.box ) {
const boxMaterial = createBoxMaterial();
const box = new THREE.LineSegments( geometry, boxMaterial );
box.frustumCulled = false;
player.add( box );
player.box = box;
}
if ( player.position.x === myPlayer.position.x && player.position.z === myPlayer.position.z ) {
player.box.visible = false;
if ( line.parent !== player ) {
player.add( line );
}
continue;
}
linePositions.setXYZ( counter ++, 0, 10, - 5 );
tempVector.copy( player.position );
tempVector.y += 9;
tempVector.applyMatrix4( tempObject.matrix );
linePositions.setXYZ(
counter ++,
tempVector.x,
tempVector.y,
tempVector.z
);
player.visible = (settings.allHacksEnabled && settings.espEnabled) || player.visible;
player.box.visible = settings.allHacksEnabled && settings.espEnabled;
const distance = player.position.distanceTo( myPlayer.position );
// Check if player is within FOV before adding to valid targets
tempVector.setScalar( 0 );
player.children[ 0 ].children[ 0 ].localToWorld( tempVector );
const targetScreen = tempVector.clone();
targetScreen.project( camera );
const screenX = ( targetScreen.x + 1 ) / 2 * window.innerWidth;
const screenY = ( -targetScreen.y + 1 ) / 2 * window.innerHeight;
if ( isWithinFOV( screenX, screenY ) ) {
// When FOV is enabled, only target players in front (not behind)
let isInFront = true;
if ( settings.fovCircle ) {
// Check if player is in front using projected Z coordinate
isInFront = targetScreen.z < 1; // Z < 1 means in front of camera
}
if ( isInFront ) {
// Team check - don't add teammates to valid targets
if ( settings.teamCheck ) {
// Check if both players have team property and are on same team
if ( myPlayer.team !== undefined && player.team !== undefined && myPlayer.team === player.team ) {
// Skip adding teammate to valid targets
} else {
validTargets.push({ player, distance });
}
} else {
validTargets.push({ player, distance });
}
}
}
}
// Natural target locking - only use when FOV circle is enabled
if ( settings.fovCircle && lockedTarget ) {
// Check if locked target is still within FOV
const lockedStillInFOV = validTargets.find( t => t.player === lockedTarget );
if ( lockedStillInFOV ) {
targetPlayer = lockedTarget;
} else {
// Release lock if target left FOV
lockedTarget = null;
}
}
// Select nearest target from valid targets
if ( !targetPlayer && validTargets.length > 0 ) {
validTargets.sort( ( a, b ) => a.distance - b.distance );
targetPlayer = validTargets[ 0 ].player;
// Only lock target when FOV circle is enabled
if ( settings.fovCircle ) {
lockedTarget = targetPlayer;
}
}
// Clear locked target when FOV circle is disabled
if ( !settings.fovCircle ) {
lockedTarget = null;
}
// Update ESP box colors based on targeting
for ( let i = 0; i < players.length; i ++ ) {
const player = players[ i ];
if ( player.box && player.box.material && player.box.material.uniforms ) {
// Set color to green if this player is the target, red otherwise
if ( player === targetPlayer ) {
player.box.material.uniforms.boxColor.value.setRGB( 0.0, 1.0, 0.0 );
} else {
player.box.material.uniforms.boxColor.value.setRGB( 1.0, 0.0, 0.0 );
}
}
}
// Store target player screen position and distance for indicator
if ( targetPlayer ) {
// Use same projection method as ESP lines
tempVector.setScalar( 0 );
targetPlayer.children[ 0 ].children[ 0 ].localToWorld( tempVector );
const targetScreen = tempVector.clone();
targetScreen.project( camera );
targetPlayerScreenPos.x = ( targetScreen.x + 1 ) / 2 * window.innerWidth;
targetPlayerScreenPos.y = ( -targetScreen.y + 1 ) / 2 * window.innerHeight;
// Calculate distance (in 3D space)
targetPlayerDistance = targetPlayer.position.distanceTo( myPlayer.position );
} else {
targetPlayerScreenPos.x = null;
targetPlayerScreenPos.y = null;
targetPlayerDistance = null;
}
linePositions.needsUpdate = true;
line.geometry.setDrawRange( 0, counter );
line.visible = settings.allHacksEnabled && settings.espLines;
// Check if aimbot should be active
const shouldAimbot = settings.allHacksEnabled && settings.aimbotEnabled && targetPlayer !== undefined && (
( settings.iPadMode && isTouching ) || // iPad mode: active when touching
( rightMouseAimbotKeyPressed ) || // Right mouse aimbot keybind
( !settings.iPadMode && settings.aimbotOnRightMouse && rightMouseDown ) || // Right mouse mode
( !settings.iPadMode && !settings.aimbotOnRightMouse && !rightMouseAimbotKeyPressed ) // Always on mode
);
if ( !shouldAimbot ) {
// Update lastRotation with current camera position when aimbot is not active
// This ensures smooth transition when aimbot activates
lastRotation.x = myPlayer.children[ 0 ].rotation.x;
lastRotation.y = myPlayer.rotation.y;
return;
}
tempVector.setScalar( 0 );
targetPlayer.children[ 0 ].children[ 0 ].localToWorld( tempVector );
tempObject.position.copy( myPlayer.position );
tempObject.lookAt( tempVector );
let targetRotX = - tempObject.rotation.x;
let targetRotY = tempObject.rotation.y + Math.PI;
// Apply smoothing
if ( settings.aimSmoothing ) {
const smoothness = settings.aimSmoothingSpeed / 100;
targetRotX = lastRotation.x + ( targetRotX - lastRotation.x ) * smoothness;
targetRotY = lastRotation.y + ( targetRotY - lastRotation.y ) * smoothness;
}
lastRotation.x = targetRotX;
lastRotation.y = targetRotY;
// Apply offset when locked on target
const offsetRadians = ( settings.antiRecoilOffset / 100 );
targetRotX += offsetRadians;
// Apply anti-recoil compensation (moves down while shooting)
if ( settings.antiRecoil && isMouseDown ) {
const recoilCompensation = -( settings.antiRecoilAmount / 100 );
targetRotX += recoilCompensation;
}
myPlayer.children[ 0 ].rotation.x = targetRotX;
myPlayer.rotation.y = targetRotY;
}
const el = document.createElement( 'div' );
el.innerHTML = `<style>
.dialog {
position: absolute;
left: 50%;
top: 50%;
padding: 30px;
background: rgba(18, 18, 18, 0.98);
border: 1px solid rgba(80, 80, 90, 0.5);
border-radius: 8px;
color: #e5e5e5;
transform: translate(-50%, -50%);
text-align: center;
z-index: 999999;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.6);
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', sans-serif;
}
.dialog * {
color: #e5e5e5;
}
.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: 10px 20px;
background: linear-gradient(135deg, rgba(60, 60, 70, 0.9), rgba(50, 50, 60, 0.9));
border: 1px solid rgba(100, 100, 110, 0.3);
border-radius: 8px;
color: white;
font-weight: 600;
transition: all 0.2s ease;
}
.btn:active {
transform: scale(0.95);
}
.btn:hover {
background: linear-gradient(135deg, rgba(70, 70, 80, 0.95), rgba(60, 60, 70, 0.95));
}
.msg {
position: absolute;
left: 15px;
bottom: 15px;
color: #e5e5e5;
background: rgba(18, 18, 18, 0.95);
font-weight: 600;
padding: 12px 20px;
border-radius: 6px;
border: 1px solid rgba(80, 80, 90, 0.5);
animation: msg 0.5s forwards, msg 0.5s reverse forwards 3s;
z-index: 999999;
pointer-events: none;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', sans-serif;
display: none !important;
}
@keyframes msg {
from {
transform: translate(-120%, 0);
}
to {
transform: none;
}
}
.zui {
position: fixed;
right: 15px;
top: 15px;
z-index: 999;
display: flex;
flex-direction: column;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', sans-serif;
font-size: 13px;
color: #fff;
width: 420px;
height: 480px;
user-select: none;
border: 1px solid rgba(80, 80, 90, 0.5);
border-radius: 8px;
overflow: hidden;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
transition: all 0.3s ease;
background: rgba(18, 18, 18, 1);
}
.zui.minimized {
width: auto;
height: auto;
}
.zui.minimized .zui-content,
.zui.minimized .zui-tabs,
.zui.minimized .zui-footer {
display: none;
}
.zui.minimized .zui-header {
padding: 8px 12px;
border-radius: 8px;
justify-content: space-between;
}
.zui.minimized .zui-header-title {
display: inline-block;
}
.zui.minimized .zui-window-controls {
position: static;
}
.zui-content {
overflow-y: auto;
overflow-x: hidden;
flex: 1;
scrollbar-width: thin;
scrollbar-color: rgba(100, 100, 110, 0.5) transparent;
}
.zui-content::-webkit-scrollbar {
width: 5px;
}
.zui-content::-webkit-scrollbar-track {
background: transparent;
}
.zui-content::-webkit-scrollbar-thumb {
background: rgba(100, 100, 110, 0.5);
border-radius: 3px;
}
.zui-content::-webkit-scrollbar-thumb:hover {
background: rgba(120, 120, 130, 0.7);
}
.zui-item {
padding: 10px 14px;
display: flex;
justify-content: space-between;
align-items: center;
background: rgba(25, 25, 25, 0.6);
cursor: pointer;
transition: all 0.2s ease;
margin: 6px 10px;
border-radius: 6px;
}
.zui-item.text {
justify-content: center;
cursor: unset;
text-align: center;
background: rgba(30, 30, 30, 0.8);
font-weight: 600;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(180, 180, 190, 0.9);
margin: 12px 10px 8px 10px;
}
.zui-item:hover {
background: rgba(30, 30, 30, 0.8);
}
.zui-item:active {
transform: scale(0.98);
}
.zui-item span {
color: #e5e7eb;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', sans-serif;
font-size: 12px;
}
.zui-header {
background: rgba(20, 20, 20, 1);
padding: 12px 14px;
display: flex;
justify-content: center;
align-items: center;
cursor: move;
border-bottom: 1px solid rgba(80, 80, 90, 0.4);
position: relative;
}
.zui-header-title {
font-size: 13px;
font-weight: 700;
letter-spacing: 0.5px;
text-transform: uppercase;
color: #ffffff;
}
.zui-window-controls {
display: flex;
gap: 8px;
position: absolute;
right: 12px;
}
.zui-window-btn {
width: 20px;
height: 20px;
border-radius: 50%;
cursor: pointer;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
font-weight: bold;
border: 2px solid;
}
.zui-window-btn.close {
background: rgba(15, 15, 15, 1);
border-color: rgba(15, 15, 15, 1);
color: rgb(220, 80, 80);
}
.zui-window-btn.minimize {
background: rgba(120, 120, 130, 0.2);
border-color: rgba(120, 120, 130, 0.6);
color: rgb(180, 180, 190);
}
.zui-window-btn:hover {
transform: scale(1.05);
opacity: 0.8;
}
.zui-window-btn:active {
transform: scale(0.95);
}
.zui-header:hover {
background: rgba(25, 25, 25, 1);
}
.zui-on {
color: #10b981;
}
.zui-item-value {
font-size: 11px;
font-weight: 700;
padding: 4px 10px;
border-radius: 6px;
background: rgba(15, 15, 15, 1);
border: 1px solid rgba(100, 100, 110, 0.4);
}
.zui-content .zui-item-value {
font-weight: 700;
}
.zui-tabs {
display: flex;
background: rgba(15, 15, 15, 0.8);
border-bottom: 1px solid rgba(80, 80, 90, 0.4);
}
.zui-tab {
flex: 1;
padding: 10px;
text-align: center;
cursor: pointer;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(140, 140, 150, 0.8);
transition: all 0.2s ease;
border-bottom: 2px solid transparent;
}
.zui-tab:hover {
color: rgba(180, 180, 190, 0.9);
background: rgba(25, 25, 25, 0.4);
}
.zui-tab.active {
color: rgba(200, 200, 210, 1);
border-bottom-color: rgba(120, 120, 130, 1);
background: rgba(25, 25, 25, 0.6);
}
.zui-tab-content {
display: none;
}
.zui-tab-content.active {
display: block;
}
.zui-slider-container {
padding: 12px 14px;
background: rgba(25, 25, 25, 0.6);
margin: 6px 10px;
border-radius: 6px;
}
.zui-slider-label {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
color: #e5e7eb;
font-size: 12px;
font-weight: 500;
}
.zui-slider-value {
color: #e5e7eb;
font-weight: 700;
}
.zui-slider {
width: 100%;
height: 5px;
border-radius: 3px;
background: rgba(30, 30, 30, 0.8);
outline: none;
-webkit-appearance: none;
appearance: none;
}
.zui-slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 16px;
height: 16px;
border-radius: 50%;
background: rgb(140, 140, 150);
cursor: pointer;
transition: all 0.2s ease;
}
.zui-slider::-webkit-slider-thumb:hover {
background: rgb(160, 160, 170);
transform: scale(1.1);
}
.zui-slider::-moz-range-thumb {
width: 16px;
height: 16px;
border-radius: 50%;
background: rgb(140, 140, 150);
cursor: pointer;
border: none;
transition: all 0.2s ease;
}
.zui-slider::-moz-range-thumb:hover {
background: rgb(160, 160, 170);
transform: scale(1.1);
}
.zui-footer {
padding: 8px 14px;
background: rgba(15, 15, 15, 0.95);
text-align: center;
font-size: 10px;
color: rgba(140, 140, 150, 0.6);
border-top: 1px solid rgba(80, 80, 90, 0.4);
font-weight: 500;
letter-spacing: 0.3px;
}
</style>
<div class="msg" style="display: none;"></div>
<div class="dialog">${`<div class="close" onclick="this.parentNode.style.display='none';"></div>
<big>🎯 Advanced Aimbot & ESP</big>
<br>
<br>
<strong>Aimbot Controls:</strong><br>
[5] Toggle Aimbot | [6] Right Mouse Mode<br>
[0] FOV Circle | [1] Aim Smoothing<br>
[2] Anti Recoil<br>
<br>
<strong>ESP Controls:</strong><br>
[7] Toggle ESP | [8] ESP Lines<br>
[9] Wireframe Mode<br>
<br>
<strong>UI Controls:</strong><br>
[H] Show/Hide Help | [/] Toggle Menu<br>
<br>
</div>
` }
</div>`;
const msgEl = el.querySelector( '.msg' );
const dialogEl = el.querySelector( '.dialog' );
// Setup dialog close persistence
const closeBtn = dialogEl.querySelector( '.close' );
closeBtn.onclick = function() {
dialogEl.style.display = 'none';
settings.dialogDismissed = true;
saveSettings();
};
window.addEventListener( 'DOMContentLoaded', function () {
while ( el.children.length > 0 ) {
document.body.appendChild( el.children[ 0 ] );
}
document.body.appendChild( gui );
document.body.appendChild( fovCanvas );
// Hide dialog if it was previously dismissed
if ( settings.dialogDismissed ) {
dialogEl.style.display = 'none';
}
// Set canvas size
fovCanvas.width = window.innerWidth;
fovCanvas.height = window.innerHeight;
// Update canvas size on window resize
window.addEventListener('resize', function() {
fovCanvas.width = window.innerWidth;
fovCanvas.height = window.innerHeight;
});
} );
let rightMouseDown = false;
let isTouching = false;
let rightMouseAimbotKeyPressed = false;
function handleMouse( event ) {
if ( event.button === 2 ) {
rightMouseDown = event.type === 'pointerdown' ? true : false;
}
// Track left mouse button for shooting
if ( event.button === 0 ) {
isMouseDown = event.type === 'pointerdown' ? true : false;
}
}
function handleTouch( event ) {
// For iPad/mobile mode
isTouching = event.type === 'touchstart' ? true : false;
}
window.addEventListener( 'pointerdown', handleMouse );
window.addEventListener( 'pointerup', handleMouse );
window.addEventListener( 'touchstart', handleTouch );
window.addEventListener( 'touchend', handleTouch );
window.addEventListener( 'keyup', function ( event ) {
if ( x.document.activeElement && x.document.activeElement.value !== undefined ) return;
// Check custom keybinds first
Object.keys(customKeybinds).forEach(settingKey => {
if (customKeybinds[settingKey] === event.code && customKeybinds[settingKey] !== '') {
if (settingKey !== 'rightMouseAimbot') {
toggleSetting( settingKey );
}
}
});
// Handle right mouse aimbot keybind release
if (customKeybinds.rightMouseAimbot === event.code && customKeybinds.rightMouseAimbot !== '') {
rightMouseAimbotKeyPressed = false;
}
switch ( event.code ) {
case 'Slash' :
if ( gui.style.display === 'none' ) {
gui.style.display = '';
} else {
toggleElementVisibility( gui );
}
break;
case 'KeyH' :
toggleElementVisibility( dialogEl );
break;
}
} );
// Handle right mouse aimbot keybind press
window.addEventListener( 'keydown', function ( event ) {
if ( x.document.activeElement && x.document.activeElement.value !== undefined ) return;
// Handle right mouse aimbot keybind press
if (customKeybinds.rightMouseAimbot === event.code && customKeybinds.rightMouseAimbot !== '') {
rightMouseAimbotKeyPressed = true;
}
} );
function toggleElementVisibility( el ) {
el.style.display = el.style.display === '' ? 'none' : '';
}
function showMsg( name, bool ) {
msgEl.innerText = name + ': ' + ( bool ? 'ON' : 'OFF' );
msgEl.style.display = 'none';
void msgEl.offsetWidth;
msgEl.style.display = '';
}
animate();
function createGUI() {
const guiEl = fromHtml( `<div class="zui">
<div class="zui-header">
<span class="zui-header-title">KRUNKAX AIMBOT</span>
<div class="zui-window-controls">
<div class="zui-window-btn minimize">-</div>
<div class="zui-window-btn close">×</div>
</div>
</div>
<div class="zui-tabs">
<div class="zui-tab active" data-tab="cheats">Cheats</div>
<div class="zui-tab" data-tab="settings">Settings</div>
<div class="zui-tab" data-tab="keybinds" style="display:none;">Keybinds</div>
</div>
<div class="zui-content">
<div class="zui-tab-content active" id="cheats-tab"></div>
<div class="zui-tab-content" id="settings-tab"></div>
<div class="zui-tab-content" id="keybinds-tab"></div>
</div>
<div class="zui-footer">Created by levifrsn63</div>
</div>` );
const headerEl = guiEl.querySelector( '.zui-header' );
const cheatsContent = guiEl.querySelector( '#cheats-tab' );
const settingsContent = guiEl.querySelector( '#settings-tab' );
const keybindsContent = guiEl.querySelector( '#keybinds-tab' );
const closeBtn = guiEl.querySelector( '.zui-window-btn.close' );
const minimizeBtn = guiEl.querySelector( '.zui-window-btn.minimize' );
const tabs = guiEl.querySelectorAll( '.zui-tab' );
const tabContents = guiEl.querySelectorAll( '.zui-tab-content' );
const keybindsTab = guiEl.querySelector( '.zui-tab[data-tab="keybinds"]' );
// Tab switching
tabs.forEach( tab => {
tab.onclick = function() {
tabs.forEach( t => t.classList.remove('active') );
tabContents.forEach( tc => tc.classList.remove('active') );
tab.classList.add('active');
const tabName = tab.getAttribute('data-tab');
guiEl.querySelector( `#${tabName}-tab` ).classList.add('active');
};
});
// Close button
closeBtn.onclick = function(e) {
e.stopPropagation();
guiEl.style.display = 'none';
};
// Minimize button
minimizeBtn.onclick = function(e) {
e.stopPropagation();
guiEl.classList.toggle('minimized');
};
// Make draggable
let isDragging = false;
let currentX;
let currentY;
let initialX;
let initialY;
headerEl.addEventListener('mousedown', function(e) {
if (e.target.classList.contains('zui-window-btn')) return;
isDragging = true;
initialX = e.clientX - guiEl.offsetLeft;
initialY = e.clientY - guiEl.offsetTop;
});
document.addEventListener('mousemove', function(e) {
if (isDragging) {
e.preventDefault();
currentX = e.clientX - initialX;
currentY = e.clientY - initialY;
guiEl.style.left = currentX + 'px';
guiEl.style.top = currentY + 'px';
guiEl.style.right = 'auto';
}
});
document.addEventListener('mouseup', function() {
isDragging = false;
});
const settingToKey = {};
for ( const key in keyToSetting ) {
settingToKey[ keyToSetting[ key ] ] = key;
}
// Define which settings go to which tab
const cheatsSettings = ['aimbotEnabled', 'aimbotOnRightMouse', 'aimSmoothing', 'antiRecoil', 'teamCheck', 'fovCircle', 'espEnabled', 'espLines', 'wireframe'];
const settingsTabSettings = ['fovRadius', 'aimSmoothingSpeed', 'antiRecoilOffset', 'antiRecoilAmount'];
// Add section header helper
function addSectionHeader(parent, title) {
const headerEl = fromHtml( `<div class="zui-item text"><span>${title}</span></div>` );
parent.appendChild( headerEl );
}
// Populate Cheats Tab
// Master toggle button
const masterToggle = fromHtml( `<div class="zui-item" style="background: rgba(40, 40, 40, 0.9); margin-bottom: 8px;">
<span style="font-weight: 700; font-size: 13px;">Master Toggle</span>
<span class="zui-item-value master-toggle-value"></span>
</div>` );
const masterToggleValue = masterToggle.querySelector( '.master-toggle-value' );
function updateMasterToggle() {
const value = settings.allHacksEnabled;
masterToggleValue.innerText = value ? 'DISABLE HACKS' : 'ENABLE HACKS';
masterToggleValue.style.color = value ? '#ef4444' : '#10b981';
masterToggleValue.style.background = value ? 'rgba(239, 68, 68, 0.2)' : 'rgba(16, 185, 129, 0.2)';
}
masterToggle.onclick = function() {
settings.allHacksEnabled = ! settings.allHacksEnabled;
}
updateMasterToggle();
cheatsContent.appendChild( masterToggle );
const masterP = '__allHacksEnabled';
settings[ masterP ] = settings.allHacksEnabled;
Object.defineProperty( settings, 'allHacksEnabled', {
get() {
return this[ masterP ];
},
set( value ) {
this[ masterP ] = value;
updateMasterToggle();
saveSettings();
}
} );
addSectionHeader(cheatsContent, 'Aimbot/Exploits');
['aimbotEnabled', 'aimbotOnRightMouse', 'aimSmoothing', 'antiRecoil', 'teamCheck'].forEach(prop => {
let name = fromCamel( prop );
let shortKey = settingToKey[ prop ];
if ( shortKey ) {
if ( shortKey.startsWith( 'Key' ) ) shortKey = shortKey.slice( 3 );
if ( shortKey.startsWith( 'Digit' ) ) shortKey = shortKey.slice( 5 );
name = `[${shortKey}] ${name}`;
}
const itemEl = fromHtml( `<div class="zui-item">
<span>${name}</span>
<span class="zui-item-value"></span>
</div>` );
const valueEl = itemEl.querySelector( '.zui-item-value' );
function updateValueEl() {
const value = settings[ prop ];
valueEl.innerText = value ? 'ON' : 'OFF';
valueEl.style.color = value ? '#10b981' : '#ef4444';
}
itemEl.onclick = function() {
settings[ prop ] = ! settings[ prop ];
}
updateValueEl();
cheatsContent.appendChild( itemEl );
const p = `__${prop}`;
settings[ p ] = settings[ prop ];
Object.defineProperty( settings, prop, {
get() {
return this[ p ];
},
set( value ) {
this[ p ] = value;
updateValueEl();
saveSettings();
}
} );
});
addSectionHeader(cheatsContent, 'ESP / Visual');
['fovCircle', 'espEnabled', 'espLines', 'nearestPlayerIndicator', 'wireframe'].forEach(prop => {
let name = fromCamel( prop );
let shortKey = settingToKey[ prop ];
if ( shortKey ) {
if ( shortKey.startsWith( 'Key' ) ) shortKey = shortKey.slice( 3 );
if ( shortKey.startsWith( 'Digit' ) ) shortKey = shortKey.slice( 5 );
name = `[${shortKey}] ${name}`;
}
const itemEl = fromHtml( `<div class="zui-item">
<span>${name}</span>
<span class="zui-item-value"></span>
</div>` );
const valueEl = itemEl.querySelector( '.zui-item-value' );
function updateValueEl() {
const value = settings[ prop ];
valueEl.innerText = value ? 'ON' : 'OFF';
valueEl.style.color = value ? '#10b981' : '#ef4444';
}
itemEl.onclick = function() {
settings[ prop ] = ! settings[ prop ];
}
updateValueEl();
cheatsContent.appendChild( itemEl );
const p = `__${prop}`;
settings[ p ] = settings[ prop ];
// Create setter with proper closure
const propName = prop; // Capture in closure
Object.defineProperty( settings, prop, {
get() {
return this[ p ];
},
set( value ) {
this[ p ] = value;
updateValueEl();
// Auto-disable aim smoothing when FOV is turned on
if ( propName === 'fovCircle' && value === true ) {
this.aimSmoothing = false;
}
saveSettings();
}
} );
});
// Populate Settings Tab with sliders
// FOV Radius slider
const fovSlider = fromHtml( `<div class="zui-slider-container">
<div class="zui-slider-label">
<span style="color: #e5e7eb;">FOV Radius</span>
<span class="zui-slider-value">${settings.fovRadius}px</span>
</div>
<input type="range" min="50" max="400" value="${settings.fovRadius}" class="zui-slider" />
</div>` );
const fovSliderInput = fovSlider.querySelector( '.zui-slider' );
const fovSliderValue = fovSlider.querySelector( '.zui-slider-value' );
fovSliderInput.addEventListener( 'input', function() {
settings.fovRadius = parseInt( fovSliderInput.value );
fovSliderValue.innerText = fovSliderInput.value + 'px';
saveSettings();
});
settingsContent.appendChild( fovSlider );
// Aimbot Smoothing Speed slider
const smoothSlider = fromHtml( `<div class="zui-slider-container">
<div class="zui-slider-label">
<span style="color: #e5e7eb;">Aimbot Smoothing Speed</span>
<span class="zui-slider-value">${settings.aimSmoothingSpeed}%</span>
</div>
<input type="range" min="1" max="100" value="${settings.aimSmoothingSpeed}" class="zui-slider" />
</div>` );
const smoothSliderInput = smoothSlider.querySelector( '.zui-slider' );
const smoothSliderValue = smoothSlider.querySelector( '.zui-slider-value' );
smoothSliderInput.addEventListener( 'input', function() {
settings.aimSmoothingSpeed = parseInt( smoothSliderInput.value );
smoothSliderValue.innerText = smoothSliderInput.value + '%';
saveSettings();
});
settingsContent.appendChild( smoothSlider );
// Anti-Recoil Offset slider
const recoilSlider = fromHtml( `<div class="zui-slider-container">
<div class="zui-slider-label">
<span style="color: #e5e7eb;">Aimbot Lock Offset</span>
<span class="zui-slider-value">${settings.antiRecoilOffset.toFixed(1)}</span>
</div>
<input type="range" min="0" max="20" step="0.1" value="${settings.antiRecoilOffset}" class="zui-slider" />
</div>` );
const recoilSliderInput = recoilSlider.querySelector( '.zui-slider' );
const recoilSliderValue = recoilSlider.querySelector( '.zui-slider-value' );
recoilSliderInput.addEventListener( 'input', function() {
settings.antiRecoilOffset = parseFloat( recoilSliderInput.value );
recoilSliderValue.innerText = parseFloat(recoilSliderInput.value).toFixed(1);
saveSettings();
});
settingsContent.appendChild( recoilSlider );
// Anti-Recoil Amount slider
const recoilAmountSlider = fromHtml( `<div class="zui-slider-container">
<div class="zui-slider-label">
<span style="color: #e5e7eb;">Anti-Recoil Strength</span>
<span class="zui-slider-value">${settings.antiRecoilAmount}</span>
</div>
<input type="range" min="0" max="10" value="${settings.antiRecoilAmount}" class="zui-slider" />
</div>` );
const recoilAmountSliderInput = recoilAmountSlider.querySelector( '.zui-slider' );
const recoilAmountSliderValue = recoilAmountSlider.querySelector( '.zui-slider-value' );
recoilAmountSliderInput.addEventListener( 'input', function() {
settings.antiRecoilAmount = parseInt( recoilAmountSliderInput.value );
recoilAmountSliderValue.innerText = recoilAmountSliderInput.value;
saveSettings();
});
settingsContent.appendChild( recoilAmountSlider );
// iPad Mode toggle
const iPadModeItem = fromHtml( `<div class="zui-item">
<span>iPad Mode</span>
<span class="zui-item-value"></span>
</div>` );
const iPadValueEl = iPadModeItem.querySelector( '.zui-item-value' );
function updateIPadModeValue() {
const value = settings.iPadMode;
iPadValueEl.innerText = value ? 'ON' : 'OFF';
iPadValueEl.style.color = value ? '#10b981' : '#ef4444';
}
iPadModeItem.onclick = function() {
settings.iPadMode = ! settings.iPadMode;
}
updateIPadModeValue();
settingsContent.appendChild( iPadModeItem );
const iPadP = `__iPadMode`;
settings[ iPadP ] = settings.iPadMode;
Object.defineProperty( settings, 'iPadMode', {
get() {
return this[ iPadP ];
},
set( value ) {
this[ iPadP ] = value;
updateIPadModeValue();
saveSettings();
}
} );
// Clear Settings button
const clearSettingsButton = fromHtml( `<div class="zui-item" style="justify-content: center; background: rgba(239, 68, 68, 0.2); cursor: pointer; margin-top: 10px;">
<span style="font-weight: 600; color: #ef4444;">🗑️ Clear Settings</span>
</div>` );
clearSettingsButton.onclick = function() {
if (confirm('Are you sure you want to reset all settings to defaults?')) {
clearSettings();
// Refresh the page to reload with default settings
location.reload();
}
};
settingsContent.appendChild( clearSettingsButton );
// Unban button
const unbanButton = fromHtml( `<div class="zui-item" style="justify-content: center; background: rgba(59, 130, 246, 0.2); cursor: pointer; margin-top: 10px;">
<span style="font-weight: 600; color: #3b82f6;">🔓 Unban</span>
</div>` );
unbanButton.onclick = function() {
if (confirm('Clear all cookies and storage to remove ban? The page will reload.')) {
unban();
// Refresh the page
location.reload();
}
};
settingsContent.appendChild( unbanButton );
// Config Keybinds button
const keybindsButton = fromHtml( `<div class="zui-item" style="justify-content: center;">
<span style="font-weight: 600;">⌨️ Config Keybinds</span>
</div>` );
keybindsButton.onclick = function() {
tabs.forEach( t => t.classList.remove('active') );
tabContents.forEach( tc => tc.classList.remove('active') );
keybindsTab.classList.add('active');
keybindsContent.classList.add('active');
};
settingsContent.appendChild( keybindsButton );
// Populate Keybinds Tab
const backButton = fromHtml( `<div class="zui-item" style="justify-content: center; background: rgba(30, 30, 30, 0.9); cursor: pointer; font-weight: 600;">
<span>← Back to Settings</span>
</div>` );
backButton.onclick = function() {
tabs.forEach( t => t.classList.remove('active') );
tabContents.forEach( tc => tc.classList.remove('active') );
tabs[1].classList.add('active'); // Settings tab
settingsContent.classList.add('active');
};
keybindsContent.appendChild( backButton );
addSectionHeader(keybindsContent, 'Configure Keybinds');
const keybindSettings = [
{ key: 'aimbotEnabled', label: 'Aimbot Enabled' },
{ key: 'aimbotOnRightMouse', label: 'Aimbot On Right Mouse' },
{ key: 'aimSmoothing', label: 'Aim Smoothing' },
{ key: 'antiRecoil', label: 'Anti Recoil' },
{ key: 'teamCheck', label: 'Team Check' },
{ key: 'espEnabled', label: 'ESP Enabled' },
{ key: 'espLines', label: 'ESP Lines' },
{ key: 'wireframe', label: 'Wireframe' },
{ key: 'fovCircle', label: 'FOV Circle' },
{ key: 'rightMouseAimbot', label: 'Right Mouse Aimbot Trigger' }
];
keybindSettings.forEach(setting => {
const defaultKey = defaultKeybinds[setting.key] || 'None';
const currentKey = customKeybinds[setting.key] || 'None';
const keybindItem = fromHtml( `<div class="zui-item" style="cursor: default;">
<span>${setting.label} <span style="color: rgba(140, 140, 150, 0.7); font-size: 11px;">(${defaultKey})</span></span>
<span class="zui-item-value keybind-value" data-setting="${setting.key}" style="cursor: pointer; min-width: 80px; text-align: center; background: rgba(60, 60, 70, 0.5); padding: 6px 12px; border-radius: 4px;">
${currentKey}
</span>
</div>` );
const valueEl = keybindItem.querySelector('.keybind-value');
valueEl.onclick = function(e) {
e.stopPropagation();
const originalValue = valueEl.innerText;
valueEl.innerText = 'Press key...';
valueEl.style.color = '#fbbf24';
valueEl.style.background = 'rgba(251, 191, 36, 0.2)';
const keyHandler = function(event) {
event.preventDefault();
event.stopPropagation();
const newKey = event.code;
customKeybinds[setting.key] = newKey;
valueEl.innerText = newKey;
valueEl.style.color = '#10b981';
valueEl.style.background = 'rgba(16, 185, 129, 0.2)';
window.removeEventListener('keydown', keyHandler);
// Reset color after a moment
setTimeout(() => {
valueEl.style.color = '#e5e7eb';
valueEl.style.background = 'rgba(60, 60, 70, 0.5)';
}, 1000);
};
const escHandler = function(event) {
if (event.code === 'Escape') {
event.preventDefault();
valueEl.innerText = originalValue;
valueEl.style.color = '#e5e7eb';
valueEl.style.background = 'rgba(60, 60, 70, 0.5)';
window.removeEventListener('keydown', keyHandler);
window.removeEventListener('keydown', escHandler);
}
};
window.addEventListener('keydown', keyHandler, { once: true });
window.addEventListener('keydown', escHandler);
};
keybindsContent.appendChild( keybindItem );
});
// Reset button at bottom
const resetButton = fromHtml( `<div class="zui-item" style="justify-content: center; background: rgba(220, 80, 80, 0.3); margin-top: 10px; border: 1px solid rgba(220, 80, 80, 0.5);">
<span style="font-weight: 600; color: rgb(220, 80, 80);">🔄 Reset to Defaults</span>
</div>` );
resetButton.onclick = function() {
Object.keys(defaultKeybinds).forEach(key => {
customKeybinds[key] = defaultKeybinds[key];
});
// Update all keybind displays
keybindsContent.querySelectorAll('.keybind-value').forEach(el => {
const settingKey = el.getAttribute('data-setting');
el.innerText = customKeybinds[settingKey] || 'None';
el.style.color = '#10b981';
el.style.background = 'rgba(16, 185, 129, 0.2)';
setTimeout(() => {
el.style.color = '#e5e7eb';
el.style.background = 'rgba(60, 60, 70, 0.5)';
}, 1000);
});
};
keybindsContent.appendChild( resetButton );
return guiEl;
}
function fromCamel( text ) {
const result = text.replace( /([A-Z])/g, ' $1' );
return result.charAt( 0 ).toUpperCase() + result.slice( 1 );
}
function fromHtml( html ) {
const div = document.createElement( 'div' );
div.innerHTML = html;
return div.children[ 0 ];
}
function toggleSetting( key ) {
settings[ key ] = ! settings[ key ];
showMsg( fromCamel( key ), settings[ key ] );
}