Narrow one Aimbot & ESP & Fly & No clip MODMENU

(F) To toggle Aimbot (E) to toggle ESP

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         Narrow one Aimbot & ESP & Fly & No clip MODMENU
// @namespace    http://tampermonkey.net/
// @version      3.0
// @description  (F) To toggle Aimbot (E) to toggle ESP
// @author       Dominus Gabi
// @match        https://narrow.one/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=narrow.one
// @grant        none
// @require      https://unpkg.com/[email protected]/build/three.min.js
// @license      MIT
// ==/UserScript==


window.state = {
    dragging: false,
    ready: false,
    game: null,
    scene: null,
    myPlayer: null,
    rigidBody: null,
    playerList: [],
    enemyList: [],
    closestEnemy: { index: -1, distance: Infinity },
    aimbotEnabled: false,
    espEnabled: true
};

document.addEventListener("keyup", (e) => {
    if (e.key === "f") {
        document.querySelectorAll("[type='checkbox']")[0].checked^=1
        state.aimbotEnabled ^= 1;
    }
    if (e.key === "e") {
        document.querySelectorAll("[type='checkbox']")[1].checked^=1
        state.espEnabled ^= 1;
    }
});

function updateGame() {
    if (!state.game?.gameStarted) return;

    state.myPlayer = state.game.getMyPlayer();
    state.rigidBody = [...state.myPlayer?.physicsManager.rigidBodies].filter((e) => {
        return e.player?.id == state.myPlayer.id
    })[0]

    if (!state.myPlayer) {
        state.ready = false;
        state.playerList = [];
        state.enemyList = [];
        state.closestEnemy.index = -1;
        state.closestEnemy.distance = Infinity;
        return;
    }

    state.ready = true;
    state.playerList = [...state.game.players.values()]
        .filter(e => e && e.id !== state.myPlayer.id);
    state.enemyList = state.playerList.filter(
        e => e.teamId !== state.myPlayer.teamId
    );

    findClosestEnemy();
    aimbot();
    esp();
}

function findClosestEnemy() {
    state.closestEnemy.index = -1;
    state.closestEnemy.distance = Infinity;
    1
    var myPos = state.myPlayer?.obj?.position;
    if (!myPos) return;

    state.enemyList.forEach((e, i) => {
        var pos = e?.obj?.position;
        if (!pos) return;

        var distance = myPos.distanceTo(pos);

        if (distance < state.closestEnemy.distance) {
            state.closestEnemy.index = i;
            state.closestEnemy.distance = distance;
        }
    });
}

function aimbot() {
    if (!state.aimbotEnabled || !state.ready) return;

    var enemy = state.enemyList[state.closestEnemy.index];
    if (!enemy?.pos) return;

    var dx = enemy.pos.x - state.myPlayer.pos.x;
    var dy = enemy.pos.y - state.myPlayer.pos.y;
    var dz = enemy.pos.z - state.myPlayer.pos.z;

    state.myPlayer.lookRot.x = Math.atan2(-dx, -dz);
    state.myPlayer.lookRot.y = Math.atan2(
        dy,
        Math.sqrt(dx * dx + dz * dz)
    );
}

function esp() {
    state.playerList.forEach(player => {
        var obj = player?.obj;
        if (!obj) return;

        if (!state.espEnabled) {
            if (obj.espBox) obj.espBox.visible = false;
            return;
        }

        if (obj.espBox) {
            obj.espBox.visible = true;
            return;
        }

        var bbox = new THREE.Box3().setFromObject(obj);
        var size = new THREE.Vector3();
        var center = new THREE.Vector3();

        bbox.getSize(size);
        bbox.getCenter(center);

        var geometry = new THREE.EdgesGeometry(
            new THREE.BoxGeometry(size.x, size.y, size.z)
        );

        var material = new THREE.LineBasicMaterial({
            color: player.teamId === state.myPlayer.teamId
            ? 0x00ff00
            : 0xff0000,
            depthTest: false
        });

        var box = new THREE.LineSegments(geometry, material);

        box.position.copy(obj.worldToLocal(center.clone()));
        box.position.y += 1;
        box.frustumCulling = false;
        box.renderOrder = 9999;

        obj.add(box);
        obj.espBox = box;
    });
}

var originalPush = Array.prototype.push;

Array.prototype.push = function (...args) {
    var game = args[0]?.playerCollider?.rigidBody?.player?.game;
    if (game) {
        state.game = game;
        state.scene = game.scene?.parent;
        updateGame();
    }
    return originalPush.apply(this, args);
};


var c = document.createElement('div')
c.innerHTML = `
<div id="wrap">
    <div id="header">
        <h2>double click to hide</h2>
        <p>by gabi</p>
    </div>
    <div id="options">

        <div class="option">
            <span>aimbot (toggle f)</span>
            <input type="checkbox">
        </div>
        <div class="option">
            <span>esp (toggle e)</span>
            <input type="checkbox" checked>
        </div>
        <div class="option">
            <span>fly</span>
            <input type="checkbox">
        </div>
        <div class="option">
            <span>noclip</span>
            <input type="checkbox">
        </div>


        <div class="option">
            <span>walk speed <br>(60)</span>
            <input type="range" min="0" max="200" value="60">
        </div>

        <div class="option">
            <span>jump height <br>(8.6)</span>
            <input type="range" step="0.2" min="0" max="30" value="8.6">
        </div>

    </div>
</div>

<style>
@font-face {
    font-family: BlueNight;
    src: url(BlueNight.woff2);
}

body {
    margin: 0;
    background: gray;
}
.hidden {
    width: 50px !important;
    height: 50px !important;
    border-radius: 50%;
}
.hidden #options {display: none;}
.hidden h2 {display: none;}
.hidden p {display: none;}

#wrap {
    font-family: BlueNight, sans-serif;
    position: absolute;
    width: 250px;
    height: 300px;
    top: 30%;
    left: 70%;
    background: white;
    border: 3px solid black;
    display: flex;
    flex-direction: column;
}


#header {
    height: 12%;
    border-bottom: 3px solid black;
    padding: 5px;
    cursor: grab;
}

#header h2 {margin: 0;font-size: 20px;}
#header p {margin: 0;font-size: 14px;}
#options {flex: 1;overflow-y: auto;}

.option {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 8px 10px;
    border-bottom: 2px solid black;
    min-height: 38px;
}

.option:last-child {border-bottom: none;}
.option span {font-size: 20px;}

input[type="checkbox"] {
    width: 20px;
    height: 20px;
}
input[type="range"] {width: 100px;}
#options::-webkit-scrollbar {width: 5px;}
#options::-webkit-scrollbar-track {background: #ddd;}
#options::-webkit-scrollbar-thumb {background: black;}
</style>
`
document.body.appendChild(c)

var options = document.querySelectorAll(".option")
var wrap = document.querySelector("#wrap")
var os = wrap.style

wrap.ondblclick =_=> wrap.classList.toggle("hidden");
wrap.children[0].onmousedown=_=>state.dragging=1
document.onmouseup=_=>state.dragging=0
document.onmousemove=e=>{
    if(!state.dragging) return
    wrap.style.left = (e.clientX-30)+"px"
    wrap.style.top = (e.clientY+100)+"px"
}

function mode(i,v){
    switch (i){
        case (0): state.aimbotEnabled = v;break
        case (1): state.espEnabled = v;break
        case (2): state.rigidBody.fly = v;break
        case (3): state.rigidBody.noclip = v;break
        case (4): state.myPlayer.walkSpeed = v;break
        case (5): state.myPlayer.jumpForce = v;break
    }
}
options.forEach((e,i)=>{
    e.addEventListener("click",()=>{
        const input = e.children[1]
        const value = input.type === "range"
        ? Number(input.value)
        : input.checked

        mode(i,value)
    })
})