您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Will you manage to take over the world?
// ==UserScript== // @name Fucker Menu fly rapid fire trigger bot and more! // @namespace http://tampermonkey.net/ // @version 20230909.1.1 // @description Will you manage to take over the world? // @author OliwiaTheOla // @match https://craftnite.io/* // @icon https://www.google.com/s2/favicons?sz=64&domain=craftnite.io // @grant none // @license by-nd 4.0 // ==/UserScript== //VHC designed by OliwiaTheOla //dispose of old client (if any) if(client) { client.dispose(); }; var client = { Hacks: [], version: "By OliwiaTheOla", keyBinds: {}, inGame: false, }; client.Hack = class { constructor(enable, mainLoop, disable, name, description, key, delay, configurationDefinition){ this.enable = function(){try {enable(this_);}catch(e){}; this.isEnabled = true}; this.mainLoop = mainLoop; this.disable = function(){try {disable(this_);}catch(e){}; this.isEnabled = false}; this.name = name; this.description = description; this.isEnabled = false; this.key = key; this.configurationDefinition = configurationDefinition; this.config = {}; setTimeout(function() { this_.configurationDefinition && Object.keys(this_.configurationDefinition).forEach(function (e) { this_.config[e] = localStorage[this_.name] && JSON.parse(localStorage[this_.name]).config[e] ? JSON.parse(localStorage[this_.name]).config[e] : this_.configurationDefinition[e].defaultValue != undefined ? this_.configurationDefinition[e].defaultValue : (this_.configurationDefinition[e].possibleValues && this_.configurationDefinition[e].possibleValues[0] != undefined) ? this_.configurationDefinition[e].possibleValues[0] : false; }); }, 1); client.keyBinds[this.key] = this.name; var this_ = this; if(!delay){ delay = 10; }; function loop(){ if(this_.isEnabled && client){ this_.mainLoop(this_); }; setTimeout(loop, delay); }; setTimeout(loop, 100); client.Hacks.push(this); }; }; client.MenuElement = class { constructor(Hacks, title, left, top){ var menuElement = document.createElement("div"); menuElement.style = "left:"+left+"; color: rgba(0, 0, 0, 1) !important; top:"+top+"; margin: 25px; text-align: center; background: rgba(114, 154, 232, 1) !important; font-family: inherit; width:20%; height: 60%; position: absolute; border: solid black 4px"; menuElement.id = title; menuElement.innerHTML = "<div style='border-bottom: solid black 4px; /*height: 2.5%;*/ padding: 5%; background-color: rgba(149, 180, 240, 1); font-size: 200%' id="+title+"header >"+title+"</div>"; client.menuElement.appendChild(menuElement); for(let i = 0; i < Hacks.length; i++) { var part = document.createElement("div"); part.style = 'border-bottom: solid black 4px; font-size: 200%'; part.id = Hacks[i].name; if(Hacks[i].configurationDefinition) { let random = Math.floor(Math.random()*1000000); part.innerHTML = "<null>"+Hacks[i].name+"</null><img style='width: 25px;float:right;cursor:pointer' onmouseover='this.style.filter=`brightness(0.5)`' onmouseleave='this.style.filter=`brightness(1)`' id="+random+" src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAu1JREFUeJzt2L1qFFEAhuEv0Ub8KawsBBuDVqK9pBS8g9yGhY2VVyEItl6AYqmdipb2NoJFEAOCXTDEwh+yyv7Nzu45c+Z54FS7xcfMvDuwCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBOlR4ww6Ukd5LcSrKd5EvZOSzgdJLbSXaTXE6yn+Sw6KIGnUnyKMmPJMcnzrsk1wvuYra7ST5l8p59T3IvyVbBXU3ZTvIikxf55DlIcrPYOqbZS3KU6fftYbFljdnL9IsskjrNi+P49+c7pQa25FnmByKSeiwSx5/zoNDGpnzIYhdbJOUtE8dxkidlZq5mu/SAfxws8d2LSV5FJCXsJXma5Z6fr2vaMir3s/gvkjdJGcu+Of6c3RJjW3MuyceIpFZd43gef/X25mqSzxFJbbrG8TbJhQJ7m7YTkdREHBUSSR3EUTGRlCWOARBJGeIYEJFsljgGSCSbIY4BE8l6iaMBIlkPcTREJP0SR4NE0g9xNEwkqxHHCIikG3GMiEiW0zWONxHHYIlkMeIYMZHMJg5EMoU4+Eskk8TBf0TyiziYauyRiIO5xhqJOFjY2CIRB0sbSyTioLPWIxEHK2s1EnHQm9YiEQe9ayUScbA2Q49klTjOF9jLAA01EnGwMUOLRBxs3FAiEQfF1B6JOCiu1kjEQTVqi0QcVKeWSMRBtUpHIg6qVyoScTAYm45EHAzOpiIRB4O17kjEweCtKxJx0Iy+I+kax+uIg0r1FYk4aNaqkYiD5nWN5FvEwUh0jUQcjMa6IxEHg7euSMRBM/qORBw0p69IxEGzVo1EHDSvayTiYDSWjUQcjM6ikYiD0ZoXiTgYvStJXmYyjKMkj5OcLbiLKbZKDxipa0luJDlM8j7Jftk5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzwEyaMP2qlEyFaAAAAAElFTkSuQmCC'>"; setTimeout(function () { document.getElementById(random).onclick = function (event,element) { client.renderConfig(Hacks[i]); } document.getElementById(random).onmouseover = function () { client.followText = Hacks[i].name+" options"; } document.getElementById(random).onmouseleave = function () { client.followText = ""; } }, 10); } else { part.innerHTML = "<null>"+Hacks[i].name+"</null>"; } document.getElementById(title).appendChild(part); document.getElementById(Hacks[i].name).addEventListener("mousedown", function (event){ if(event.target!=document.getElementById(Hacks[i].name) && event.target!=document.getElementById(Hacks[i].name).children[0]) { return; } if(!window.GAME) {client.error("You must be in a game to enable hacks!"); return}; if(!Hacks[i].isEnabled){ Hacks[i].enable(); document.getElementById(Hacks[i].name).style.backgroundColor = "white"; } else { Hacks[i].disable(); document.getElementById(Hacks[i].name).style.backgroundColor = "rgba(114, 154, 232, 1)"; }; }); document.getElementById(Hacks[i].name).addEventListener("mouseover", function (event){ if(event.target!=document.getElementById(Hacks[i].name) && event.target!=document.getElementById(Hacks[i].name).children[0]) { return; } client.followText = Hacks[i].description; }); document.getElementById(Hacks[i].name).addEventListener("mouseleave", function (event){ if(event.target!=document.getElementById(Hacks[i].name) && event.target!=document.getElementById(Hacks[i].name).children[0]) { return; } client.followText = ""; }); }; }; }; client.menuToggled = 0; client.menuElement = document.createElement("div"); document.body.appendChild(client.menuElement); client.menuElement.id = "vhc-menu"; client.menuElement.style.width = "100%"; client.menuElement.style.height = "100%"; client.menuElement.style.background = "rgba(0, 0, 0, 0.5)"; client.menuElement.style.position = "absolute"; client.menuElement.style.zIndex = 1000; client.menuElement.style.top = "0"; client.hackList = document.createElement("h1"); document.body.appendChild(client.hackList); client.hackList.style.color = "#fff"; client.hackList.style.position = "fixed"; client.hackList.style.top = "40%"; client.hackList.innerHTML = "VHC version "+client.version+"<br>"; client.hackList.style.zIndex = 1000; client.hackList.style.fontSize = "20px"; client.hackList.style.textAlign = "left"; client.keyBindElement = document.createElement("h1"); document.body.appendChild(client.keyBindElement); client.keyBindElement.style.color = "#fff"; client.keyBindElement.style.position = "fixed"; client.keyBindElement.style.top = "40%"; client.keyBindElement.style.fontSize = "132%"; client.keyBindElement.style.right = 0; client.keyBindElement.innerHTML = "Keybinds:<br>z - open menu<br><br>"; client.keyBindElement.style.zIndex = 1000; client.keyBindElement.style.textAlign = "right"; client.errorElement = document.createElement("h1"); document.body.appendChild(client.errorElement); client.errorElement.style.color = "#fff"; client.errorElement.style.position = "absolute"; client.errorElement.style.top = "10%"; client.errorElement.style.width = "10%"; client.errorElement.style.fontSize = "100%"; client.errorElement.style.left = "40%"; client.errorElement.style.border = "solid red 1px"; client.errorElement.style.borderRadius = "7px"; client.errorElement.style.backgroundColor = "red"; client.errorElement.innerHTML = "client.errorElement"; client.errorElement.style.opacity = 0; client.errorElement.style.transition = "all 0.3s"; client.errorElement.style.zIndex = "1000"; client.followText = ""; client.follow = document.createElement("div"); client.follow.style.pointerEvents = "none"; client.follow.style.position = "absolute"; client.follow.style.minWidth = "10em"; client.follow.style.maxWidth = "20em"; client.follow.style.zIndex = "9999"; client.follow.style.backgroundColor = "rgba(114, 154, 232, 1)"; document.body.appendChild(client.follow); document.body.addEventListener("mousemove", function (e){ client.follow.innerHTML = client.followText; client.followText ? client.follow.style.border = "solid black 1px" : client.follow.style.border = ""; x = e.pageX; y = e.pageY; client.follow.style.left = (x+10)+"px"; client.follow.style.top = (y+10)+"px"; if(x+10 > innerWidth-client.follow.getBoundingClientRect().width) client.follow.style.left = (innerWidth-client.follow.getBoundingClientRect().width)+"px" }); client.error = function (text) { var audio = document.createElement("Audio"); audio.src = "files/assets/31197478/1/Error-UI.mp3"; audio.play(); client.errorElement.innerHTML = text; client.errorElement.style.opacity = 1; setTimeout(function(){client.errorElement.style.opacity = 0;}, 1000) }; document.addEventListener("keydown", function(event) { if (event.key == "z") { client.menuToggled = !client.menuToggled; if(!client.menuToggled && client.inGame){if(client.menuToggled){GAME.uiManager.menuActive=false;};GAME.a865.player.controls.lock(); GAME.closea793(); GAME.inChat = false}; }; if (client.keyBinds[event.key]) { try { if(document.activeElement==document.getElementById("chat")) return; } catch (e) {} if(!client.inGame) {client.error("You must be in a game to enable hacks!"); return}; for(let i = 0; i < client.Hacks.length; i++){ if(client.Hacks[i].name == client.keyBinds[event.key]){ if(client.Hacks[i].isEnabled){ client.Hacks[i].disable(); document.getElementById(client.Hacks[i].name).style.backgroundColor = "rgba(114, 154, 232, 1)"; } else { client.Hacks[i].enable(); document.getElementById(client.Hacks[i].name).style.backgroundColor = "white"; }; }; }; }; }); client.MAIN = function() { /* try { client.inGame = !!pc.app.root.findByName("Game").findByName("NetworkManager").script.networkManager.ws; } catch (e) { client.inGame && stophacks.enable(); client.inGame = false; } */ client.hackList.innerHTML = "Fucker Menu "+client.version+"<br>"; client.keyBindElement.innerHTML = "Keybinds:<br>z - open menu<br><br>"; for(let i = 0; i < client.Hacks.length; i++){ if(client.Hacks[i].isEnabled){ client.hackList.innerHTML += client.Hacks[i].name+(client.Hacks[i].type ? " <b style='color: skyblue'>["+client.Hacks[i].type+"]</b>" : " ")+"<br>"; }; if(client.Hacks[i].key == "no keybind") continue; client.keyBindElement.innerHTML += client.Hacks[i].key+" - "+client.Hacks[i].name+"<br>"; }; if (client.menuToggled) { document.exitPointerLock(); client.menuElement.style.display = "block"; } else { client.menuElement.style.display = "none"; } setTimeout(client.MAIN, 10); }; client.dispose = function () { console.log("disposing of client version "+client.version); client.Hacks.forEach(hack => { if(hack.isEnabled) { hack.disable(); }; }); for (element in client) { client[element].outerHTML = ""; delete client[element]; }; client = undefined; }; client.renderConfig = function (hack) { var elem = document.getElementById(hack.name); if(!elem.children[2]) { var config = document.createElement("div"); config.style.background = "rgba(149, 180, 240, 1)"; config.style.border = "solid black 4px"; config.style.position = "fixed"; config.style.width = "20%"; config.style.marginLeft = "-4px"; config.innerHTML = "<div style='border-bottom:4px solid black'>Settings</div><div></div>"; elem.appendChild(config); var list = config.children[1]; list.style.fontSize = "25px"; //render configs Object.values(hack.configurationDefinition).forEach(function(config, index){ switch(config.type) { case 0: list.innerHTML += Object.keys(hack.configurationDefinition)[index]+" <input type='checkbox' id='"+Object.keys(hack.configurationDefinition)[index]+"' onchange='client.processConfigChange.call(this, client.Hacks["+client.Hacks.indexOf(hack)+"], "+index+")'></input><br>"; setTimeout(function(){ document.getElementById(Object.keys(hack.configurationDefinition)[index]).checked = hack.config[Object.keys(hack.configurationDefinition)[index]]; }, 10); break case 1: list.innerHTML += Object.keys(hack.configurationDefinition)[index]+" <select id='"+Object.keys(hack.configurationDefinition)[index]+"' onchange='client.processConfigChange.call(this, client.Hacks["+client.Hacks.indexOf(hack)+"], "+index+")'></select><br>"; config.possibleValues.forEach(function(possibleValue) { document.getElementById(Object.keys(hack.configurationDefinition)[index]).innerHTML += "<option value='"+possibleValue+"'>"+possibleValue+"</option>"; }); setTimeout(function(){ document.getElementById(Object.keys(hack.configurationDefinition)[index]).value = hack.config[Object.keys(hack.configurationDefinition)[index]]; }, 10); break case 2: list.innerHTML += Object.keys(hack.configurationDefinition)[index]+" <input id='"+Object.keys(hack.configurationDefinition)[index]+"' onchange='client.processConfigChange.call(this, client.Hacks["+client.Hacks.indexOf(hack)+"], "+index+")'></input><br>"; setTimeout(function(){ document.getElementById(Object.keys(hack.configurationDefinition)[index]).value = hack.config[Object.keys(hack.configurationDefinition)[index]]; }, 10); break } }); } if(elem.children[2].style.display == "block") { elem.children[2].style.display = "none"; elem.children[1].style.transform = "rotate(0deg)"; } else { elem.children[2].style.display = "block"; elem.children[1].style.transform = "rotate(180deg)"; } } client.processConfigChange = function (hack,index) { var value = this.type == "checkbox" ? this.checked : this.value; var configName = Object.keys(hack.config)[index]; hack.config[configName]=value; localStorage[hack.name] = localStorage[hack.name] || "{\"config\":{}}"; var newData = JSON.parse(localStorage[hack.name]); newData.config[configName] = value; localStorage[hack.name] = JSON.stringify(newData); } client.init = function() { console.log(client.version+" running on "+navigator.platform); //hacks var Fly = new client.Hack(function () { G.CONFIG.a143 = true; }, function () { }, function () { G.CONFIG.a143 = false; }, "Fly", "Enable flight", "c"); var WaterLevel = new client.Hack(function (this_) { this_.a = GAME.oceanHeightTo }, function () { GAME.oceanHeightTo = Number(this.config["water level"]); this.type = this.config["water level"]; if(!Number(this.config["water level"])) this.config["water level"] = this.oldlev; this.oldlev = this.config["water level"]; }, function (this_) { GAME.oceanHeightTo = this_.a; }, "WaterLevel", "Change the water height on your side", "no keybind", false, {"water level":{defaultValue:260,type:2}}); var SpeedHack = new client.Hack(function () { }, function () { if(G.Keybinds.moveForward.a730) GAME.a865.player.vZ=2.5; }, function () { }, "SpeedHack", "Increase walking speed", "t"); var RapidFire = new client.Hack(function (this_) { if(!Date.now.a) { window.a = Date.now; Date.now=function(){ function getStackTrace(){ var obj = this; Error.captureStackTrace(obj, getStackTrace); return obj.stack; } if(getStackTrace().includes("a822er.update")) { return a.call(Date); } else { return a.call(Date)*(window.multiplier||1)-(window.warp||0); } } Date.now.a=true; } }, function () { this.type = this.config.multiplier+"x"; if(this.oldmult != undefined && this.config.multiplier != this.oldmult) { if(!Number(this.config.multiplier)) this.config.multiplier = this.oldmult; window.warp = a.call(Date)-Date.now(); } window.multiplier = this.config.multiplier; this.oldmult = this.config.multiplier; }, function (this_) { window.warp = a.call(Date)-Date.now(); window.multiplier = 1; }, "RapidFire", "Shoot and reload faster", "no keybind", false, {multiplier:{defaultValue:2,type:2}}); var InfAmmo = new client.Hack(function (this_) { this_.a = GAME.a865.player.updatea809Total; GAME.a865.player.updatea809Total = new Function; }, function () { }, function (this_) { GAME.a865.player.updatea809Total = this_.a; }, "InfAmmo", "Never run out of ammunition", "k"); var TriggerBot = new client.Hack(function (this_) { this_.geometry = new THREE.BufferGeometry(); this_.geometry.setFromPoints([new THREE.Vector3(0, 0, 0),new THREE.Vector3(0, 0, 1)]); this_.material = new THREE.LineBasicMaterial({ depthTest: false, depthWrite: false, fog: false, }); this_.hitboxes = []; }, function () { var chunks = []; GAME.scene.children.forEach(function(e) { if(e.type == "Mesh") { chunks.push(e); } }); var this_ = this; G.othera822ers.forEach(function (player) { if(player && player.a240 && !player.hitbox_triggerBot) { var hitbox = new THREE.Mesh(new THREE.BoxGeometry); hitbox.scale.set(3,10,3); hitbox.renderOrder = 9999; hitbox.material.depthTest = false; hitbox.material.transparent = true; hitbox.material.opacity = 0; player.hitbox_triggerBot = hitbox; this_.hitboxes.push(hitbox); player.a240.add(hitbox); hitbox.visible = true; hitbox.player = player; } }); this.raycaster = this.raycaster || new THREE.Raycaster(); this.raycaster.set(GAME.a865.player.camera.position, vec=new THREE.Vector3(),GAME.a865.player.camera.getWorldDirection(vec),vec); var result = this.raycaster.intersectObjects(this.hitboxes.concat(chunks)); if(result[0] && result[0].object.player && result[0].object.parent) { G.Keybinds.shoot.a730=true setTimeout(function () { G.Keybinds.shoot.a730=false; }, 10); } }, function (this_) { this_.hitboxes.forEach(function (hitbox) { hitbox.parent.remove(hitbox); delete hitbox.player.hitbox_triggerBot; }); GAME.pointerLockEnabled=false; }, "TriggerBot", "Shoots your gun when automatically there is a player under your crosshair", "no keybind"); var ESP = new client.Hack(function (this_) { this_.hitboxes = []; }, function () { var this_ = this; G.othera822ers.forEach(function (e) { if(e &&e.a240 && !e.hitbox) { var hitbox = new THREE.Mesh(new THREE.BoxGeometry,new THREE.MeshBasicMaterial({color:"red",fog:false,depthTest:false})); hitbox.scale.set(3,10,3); hitbox.renderOrder=Infinity hitbox.position.y++; this_.hitboxes.push(hitbox); hitbox.player=e; e.hitbox=hitbox; e.a240.add(hitbox); } }); }, function (this_) { this_.hitboxes.forEach(function (e) { e.parent.remove(e); delete e.player.hitbox; }); this_.hitboxes = [] }, "ESP", "See players through walls!", ";"); var InfoHUD = new client.Hack(function (this_){ if(!this_.HUD) { this_.HUD = document.createElement("div"); this_.HUD.style = "position: fixed; top: 2vh; right: 15vw; background-color:black; opacity: 0.7; width: 20vw" } document.body.appendChild(this_.HUD); this_.HUD.style.display = "block"; this_.kills = this_.kills || 0; this_.old = this_.old || 0; }, function () { this.HUD.innerHTML = "Player position: X "+Math.trunc(GAME.a865.player.position.x*100)/100+" Y "+Math.trunc(GAME.a865.player.position.x*100)/100+" Z "+Math.trunc(GAME.a865.player.position.x*100)/100+"<br>Connected to: "+G.socket.url.split("/")[2]+"<br>Total kills: "+(this.kills+GAME.a865.player.a649)+"<br>"+new Date().toGMTString(); if(GAME.a865.player.a649 == 0) { this.kills += this.old; } this.old = GAME.a865.player.a649; }, function (this_) { this_.HUD.style.display = "none"; }, "InfoHUD", "Nice HUD for valuable info!", "m"); var NoFog = new client.Hack(function (this_) { this_.a = GAME.a865.scene.fog.far; GAME.a865.scene.fog.far = Infinity; }, function () { }, function (this_) { GAME.a865.scene.fog.far = this_.a; }, "NoFog", "Get rid of the fog", "no keybind"); var ChatSpam = new client.Hack(function () { }, function () { document.getElementById("chat").value = crypto.randomUUID(); var e = new a201; e.msg = GAME.chatInput.value; G.socket.send(e.a614()); }, function () { }, "ChatSpam", "Spam the game chat", "no keybind", false); window.stophacks = new client.Hack(function () { client.Hacks.forEach(function (hack) { if(!hack.isEnabled) return hack.disable(); document.getElementById(hack.name).style.backgroundColor = "rgba(114, 154, 232, 1)"; }); }, function () { stophacks.disable(); document.getElementById(stophacks.name).style.backgroundColor = "rgba(114, 154, 232, 1)"; }, function () { }, "Disable all hacks", "Disable all hacks", "y"); //menu elements new client.MenuElement([Fly, WaterLevel, SpeedHack], "Movement", "0%", "0%"); new client.MenuElement([RapidFire, InfAmmo, TriggerBot], "Combat", "25%", "0%"); new client.MenuElement([ESP, InfoHUD, NoFog], "Render", "50%", "0%"); new client.MenuElement([ChatSpam, stophacks], "Game", "75%", "0%"); //win message //pc.app.on("Game:Finish", function(){if(autoGG.isEnabled){pc.app.fire("Network:Chat", autoGG.type)}; client.inGame = false; stophacks.enable();}); function tempLoop(){ if(window.GAME) { client.inGame = true; GAME.disconnect=function(){if(!client.menuToggled){location.reload()}}; try { var obj = JSON.parse(localStorage.config); client.Hacks.forEach(function (hack) { if(hack.name in obj) { hack.enable(); document.getElementById(hack.name).style.backgroundColor = "white"; } }); } catch (e) {} return; } setTimeout(tempLoop, 1); } tempLoop(); //config localStorage.config = localStorage.config || "{\"autoGG\":true}"; client.MAIN(); }; client.init(); cheatnite.esp = true; cheatnite.activatedCheats = ['ESP']; function initEsp() { espGeometry = new THREE.EdgesGeometry(new THREE.BoxGeometry(5, 10, 5).translate(0, -3, 0)); lineMaterial = new THREE.LineBasicMaterial({ color: 0xff0000 }); red = ` void main() { gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 ); } `; espMaterial = 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: red }); textCanvas = new G.Canvas2d(); textCanvas.alpha = 0; textCanvas.init(); } function animate() { window.requestAnimationFrame(animate); const players = []; for (const p of G.othera822ers) if (p && p.id && p.id !== GAME.a865.player.id) players.push(p); textCanvas.clear(); const drawnTextPositions = []; const minSpacing = 4; const textOffset = 24; for (let i = 0; i < players.length; i++) { const player = players[i]; if (!player.a472.box) { const box = new THREE.LineSegments(espGeometry, espMaterial); box.frustumCulled = false; player.a472.add(box); player.a472.box = box; } player.a472.box.visible = cheatnite.esp; if (player.a472.visible && cheatnite.esp) { const worldPos = new THREE.Vector3(); player.a472.box.getWorldPosition(worldPos); let screenPos = G.worldPosToScreenCoords(worldPos, GAME.camera, window.innerWidth, window.innerHeight); if (screenPos.orientation !== 'center') continue; let playerName = `(${player.id}) ` + (player.name.length > 20 ? player.name.substring(0, 17) + '...' : player.name); let color = "#FFFFFF"; if (player.ID === GAME.myKillerId) { playerName = '(killer) '+playerName; color = "#FF8080"; } const textSize = 16; let yPos = screenPos.coords.y - 10; for (const drawnPos of drawnTextPositions) { if (Math.abs(drawnPos.x - screenPos.coords.x) < textSize && Math.abs(drawnPos.y - yPos) < textSize) { yPos = drawnPos.y - textSize - minSpacing; } } drawnTextPositions.push({ x: screenPos.coords.x, y: yPos }); textCanvas.text( [screenPos.coords.x, yPos], playerName, color, textSize, "middle", "center" ); } } textCanvas.flip(); }