// ==UserScript== // @name Survev.IO-KrityHack // @namespace https://github.com/Drino955/survev-krityhack // @version 0.0.6 // @description Xray, better zoom, smoke/obstacle opacity, player names for survev.io. // @author KrityTeam // @match *://survev.io/* // @icon https://www.google.com/s2/favicons?domain=survev.io // @grant none // @run-at document-end // @webRequest [{"selector":"*app-*.js","action":"cancel"}] // @homepageURL https://github.com/Drino955/survev-krityhack // @supportURL https://github.com/Drino955/survev-krityhack/issues // @downloadURL none // ==/UserScript== console.log('Script injecting...') const script = document.createElement('script'); script.type = 'module'; script.src = '//cdn.jsdelivr.net/gh/drino955/survev-krityhack/survev/app.js'; script.onload = () => console.log('app.js loaded'); script.onerror = (err) => console.error('Error in app.js loading:', err); document.head.append(script); let espEnabled = false; let aimbotEnabled = false; let xrayEnabled = true; const overlay = document.createElement('div'); overlay.className = 'krity-overlay'; document.querySelector('#ui-game').appendChild(overlay); const styles = document.createElement('style'); styles.innerHTML = ` .krity-overlay{ position: absolute; top: 100px; left: 0px; width: 100%; pointer-events: None; color: #fff; font-family: monospace; } .krity-control{ text-align: center; margin-top: 3px; margin-bottom: 3px; font-size: 20px; } `; document.head.append(styles); window.addEventListener('keyup', function (event) { switch (String.fromCharCode(event.keyCode)) { case 'N': espEnabled = !espEnabled; break; case 'B': aimbotEnabled = !aimbotEnabled; break; case 'H': xrayEnabled = !xrayEnabled; break; } updateOverlay(); }); updateOverlay(); // remove ceilings Object.defineProperty( Object.prototype, 'textureCacheIds', { set( value ) { this._textureCacheIds = value; if ( Array.isArray( value ) ) { const scope = this; value.push = new Proxy( value.push, { apply( target, thisArgs, args ) { // console.log(args[0], scope, scope?.baseTexture?.cacheId); // console.log(scope, args[0]); if (args[0].includes('ceiling') || args[0].includes('map-snow-')) { Object.defineProperty( scope, 'valid', { set( value ) { this._valid = value; }, get() { return xrayEnabled ? false : this._valid; } }); } return Reflect.apply( ...arguments ); } }); } }, get() { return this._textureCacheIds; } }); Object.defineProperty(window, 'game', { get () { return this._game; }, set(value) { this._game = value; if (!value) return; initGame(); } }); // Object.defineProperty( Object.prototype, 'obstaclePool', { // get () { // return this._obstaclePool; // }, // set (value) { // this._obstaclePool = value; // console.log('set obstaclePool: ', this); // Object.defineProperty( this, 'pool', { // get () { // return this._pool; // }, // set (value) { // this._pool = value; // console.log('set pool: ', this); // if (Array.isArray(value)) { // const scope = this; // value.push = new Proxy(value.push, { // apply(target, thisArgs, args){ // console.log('poolik: ', scope, args[0]); // args[0].sprite.alpha = 0.5; // return Reflect.apply( ...arguments ); // } // }); // } // } // }); // } // }); // setInterval(() => { // if (!window.game) return; // window.game.map.obstaclePool.pool.forEach(obstacle => obstacle.sprite.alpha = 0.45); // }); function initGame() { console.log('init game...........'); const tasks = [ {isApplied: false, condition: () => window.game?.activePlayer?.localData, action: betterScale}, {isApplied: false, condition: () => window.game?.map?.obstaclePool?.pool != undefined, action: obstacleOpacity}, // {isApplied: false, condition: () => window.game?.smokeBarn?.particles.length == 0, action: smokeOpacity}, {isApplied: false, condition: () => Array.prototype.push === window.game?.smokeBarn?.particles.push, action: smokeOpacity}, // {isApplied: false, condition: () => window.game?.playerBarn?.playerPool?.pool.length == 0, action: visibleNames}, {isApplied: false, condition: () => Array.prototype.push === window.game?.playerBarn?.playerPool?.pool.push, action: visibleNames}, ]; (function checkLocalData(){ if(!window.game.ws) return; console.log('Checking local data') console.log( window.game?.activePlayer?.localData, window.game?.map?.obstaclePool?.pool, window.game?.smokeBarn?.particles, window.game?.playerBarn?.playerPool?.pool ); tasks.forEach(task => console.log(task.action, task.isApplied)) tasks.forEach(task => { if (task.isApplied || !task.condition()) return; task.action(); task.isApplied = true; }); if (tasks.some(task => !task.isApplied)) setTimeout(checkLocalData, 5); else console.log('All functions applied, stopping loop.'); })(); } mousedownClick(); function mousedownClick(){ let timeoutId; function updateMouseButtons() { if (!window.game?.input?.mouseButtonsOld) return; Object.keys(window.game.input.mouseButtonsOld).forEach(key => delete (window.game.input.mouseButtonsOld[key])); timeoutId = setTimeout(updateMouseButtons, 5); } window.addEventListener('mousedown', function (event) { if (event.button === 0) { // 0 is the code for the left mouse button updateMouseButtons(); } }); window.addEventListener('mouseup', function (event) { if (event.button === 0) { // 0 is the code for the left mouse button clearTimeout(timeoutId); } }); } function betterScale(){ Object.defineProperty(window.game.camera, 'zoom', { get() { return Math.max(window.game.camera.targetZoom - 0.45, 0.35); }, set(value) { } }); let oldScope = window.game.activePlayer.localData.scope; Object.defineProperty(window.game.camera, 'targetZoom', { get(){ return this._targetZoom; }, set(value) { const newScope = window.game.activePlayer.localData.scope; const inventory = window.game.activePlayer.localData.inventory; const scopes = ['1xscope', '2xscope', '4xscope', '8xscope', '15xscope'] // console.log(value, oldScope, newScope, newScope == oldScope, (inventory['2xscope'] || inventory['4xscope'] || inventory['8xscope'] || inventory['15xscope'])); if ( (newScope == oldScope) && (inventory['2xscope'] || inventory['4xscope'] || inventory['8xscope'] || inventory['15xscope']) && value >= this._targetZoom // || scopes.indexOf(newScope) > scopes.indexOf(oldScope) && value >= this._targetZoom ) return; oldScope = window.game.activePlayer.localData.scope; this._targetZoom = value; } }); } function smokeOpacity(){ console.log('smokeopacity') const particles = window.game.smokeBarn.particles; console.log('smokeopacity', particles, window.game.smokeBarn.particles) particles.push = new Proxy( particles.push, { apply( target, thisArgs, args ) { console.log('smokeopacity', args[0]); const particle = args[0]; Object.defineProperty(particle.sprite, 'alpha', { get() { return 0.12; }, set(value) { } }); return Reflect.apply( ...arguments ); } }); particles.forEach(particle => { Object.defineProperty(particle.sprite, 'alpha', { get() { return 0.12; }, set(value) { } }); }); } function obstacleOpacity(){ setInterval(() => { window.game.map.obstaclePool.pool.forEach(obstacle => { if (!['bush', 'tree', 'table', 'stairs'].some(substring => obstacle.type.includes(substring))) return; obstacle.sprite.alpha = 0.45 }); }); } function visibleNames(){ const pool = window.game.playerBarn.playerPool.pool; console.log('visibleNames', pool) pool.push = new Proxy( pool.push, { apply( target, thisArgs, args ) { console.log('visibleNames', args[0]); const player = args[0]; player.nameText.tint = 0xff0000; Object.defineProperty(player.nameText, 'visible', { get(){ return true; }, set(value){ } }); return Reflect.apply( ...arguments ); } }); pool.forEach(player => { player.nameText.tint = 0xff0000; Object.defineProperty(player.nameText, 'visible', { get(){ return true; }, set(value){ } }); }); } function esp(){ const pixi = window.game.pixi; const me = window.game.activePlayer; const players = window.game.playerBarn.playerPool.pool; players.push = new Proxy( players.push, { apply( target, thisArgs, args ) { const player = args[0]; if(!player.active || player.netData.dead) return; const playerX = +player.pos.x; const playerY = +player.pos.y; const distanceToPlayer = Math.hypot(meX - playerX, meY - playerY); console.log(`${player.nameText._text}, distance: ${distanceToPlayer}`); graphics.lineStyle(2, 0xFF0000, 1); graphics.moveTo(meX, meY); graphics.lineTo(playerX, playerY); return Reflect.apply( ...arguments ); } }); const meX = me.pos.x; const meY = me.pos.y; const graphics = new pixi.Graphics(); pixi.stage.addChild(graphics); players.forEach(player => { if(!player.active || player.netData.dead) return; const playerX = +player.pos.x; const playerY = +player.pos.y; const distanceToPlayer = Math.hypot(meX - playerX, meY - playerY); console.log(`${player.nameText._text}, distance: ${distanceToPlayer}`); graphics.lineStyle(2, 0xFF0000, 1); graphics.moveTo(meX, meY); graphics.lineTo(playerX, playerY); }); } function updateOverlay() { overlay.innerHTML = ''; const controls = [ // [ '[B] Aimbot', aimbotEnabled ], // [ '[N] ESP', espEnabled ], [ '[H] X-Ray', xrayEnabled ] ]; controls.forEach((control, index) => { // console.log('control', control); let [text, isEnabled] = control; text = `${text} ${isEnabled ? 'ON' : 'OFF'}`; const line = document.createElement('p'); line.className = 'krity-control'; line.style.opacity = isEnabled ? 1 : 0.5; line.textContent = text; overlay.appendChild(line); }); } console.log('Script injected')