Berkayin Aimbotu

Turk Yapti aq esp + aimbot

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.greasyfork.org/scripts/575338/1807932/Berkayin%20Aimbotu.js

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Berkayin Aimbotu
// @namespace    http://tampermonkey.net/
// @version      1.0.0
// @description  Turk Yapti aq esp + aimbot
// @author       You
// @match        https://tribals.io/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=tribals.io
// @grant        none
// @run-at       document-end
// ==/UserScript==

console.log('[EVENT] Tribals Client Loaded v1.0.0');

/* Safe logging helper: stores simple debug messages locally */
function sendLogSafe(msg) {
    try {
        console.log('[HACK-LOG]', msg);
        const key = 'tribals_cheat_logs_v1';
        const logs = JSON.parse(localStorage.getItem(key) || '[]');
        logs.push({ ts: Date.now(), text: String(msg) });
        localStorage.setItem(key, JSON.stringify(logs.slice(-200)));
    } catch (e) {
        console.error('[HACK-LOG] failed', e);
    }
}

/* UI HTML / CSS - Vanilla JS */
function initializeUI() {
    // Create style element
    const style = document.createElement('style');
    style.textContent = `
        #tribals-hack {
            position: absolute;
            top: 100px;
            left: 15px;
            z-index: 9999;
            font-family: Arial, sans-serif;
            cursor: move;
            background-color: rgba(0, 0, 0, 0.0);
            user-select: none;
        }
        #esp-status {
            background-color: rgba(0, 0, 0, 0.3);
            border: 2px solid #00ff00;
            color: #00ff00;
            font-size: 16px;
            padding: 4px 10px;
            border-radius: 5px;
            box-shadow: 0 0 10px #00ff00;
            display: inline-block;
            font-weight: bold;
            backdrop-filter: blur(3px);
        }
        #esp {
            font-weight: bold;
        }
    `;
    document.head.appendChild(style);

    // Create UI element
    const uiDiv = document.createElement('div');
    uiDiv.id = 'tribals-hack';
    uiDiv.innerHTML = '<p id="esp-status">ESP: <span id="esp">Disabled</span></p>';
    document.body.appendChild(uiDiv);

    // Make draggable
    let isDragging = false;
    let offsetX = 0;
    let offsetY = 0;

    uiDiv.addEventListener('mousedown', function(e) {
        isDragging = true;
        offsetX = e.clientX - uiDiv.offsetLeft;
        offsetY = e.clientY - uiDiv.offsetTop;
        e.preventDefault();
    });

    document.addEventListener('mousemove', function(e) {
        if (!isDragging) return;
        uiDiv.style.left = (e.clientX - offsetX) + 'px';
        uiDiv.style.top = (e.clientY - offsetY) + 'px';
    });

    document.addEventListener('mouseup', function() {
        isDragging = false;
    });

    // Key control: 'e' toggles ESP/Aimbot
    document.addEventListener('keydown', function(e) {
        if (e.key === 'e' || e.key === 'E') {
            window.toggleESP();
            const espText = document.getElementById('esp');
            if (espText) {
                espText.innerHTML = window.espEnabled ? 'Enabled' : 'Disabled';
                espText.style.color = window.espEnabled ? '#00ff00' : 'red';
                addGlowEffect(espText);
            }
        }
    });

    console.log('[UI] Initialized successfully');
}

function addGlowEffect(element) {
    element.style.textShadow = window.espEnabled
        ? '0 0 5px #00ff00, 0 0 10px #00ff00, 0 0 20px #00ff00'
        : '0 0 5px red, 0 0 10px red, 0 0 20px red';
}

// Initialize when DOM is ready
if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', initializeUI);
} else {
    initializeUI();
}

// ===================== ESP & AIMBOT =====================
window.tribals = {
    players: [],
    localPlayer: {},
    espDelay: 16
};

window.espEnabled = false;
let espInterval;
let originalCameraState = null;
const AIMBOT_MAX_PITCH = (Math.PI / 2) - 0.01;
const RAD_TO_DEG = 180 / Math.PI;

function cloneQuat(quat) {
    if (!quat) return null;
    return {
        x: Number(quat.x) || 0,
        y: Number(quat.y) || 0,
        z: Number(quat.z) || 0,
        w: Number.isFinite(Number(quat.w)) ? Number(quat.w) : 1
    };
}

function getAimNode(cameraEntity) {
    if (!cameraEntity) return null;

    if (typeof cameraEntity.setLocalEulerAngles === 'function' ||
        typeof cameraEntity.setLocalRotation === 'function' ||
        cameraEntity.quaternion) {
        return cameraEntity;
    }

    if (cameraEntity.entity) {
        return cameraEntity.entity;
    }

    if (cameraEntity.camera && cameraEntity.camera.entity) {
        return cameraEntity.camera.entity;
    }

    return cameraEntity;
}

function getNodeWorldPosition(node) {
    if (!node) return null;

    if (typeof node.getPosition === 'function') {
        return node.getPosition().clone();
    }

    if (node.position) {
        return typeof node.position.clone === 'function'
            ? node.position.clone()
            : { x: Number(node.position.x) || 0, y: Number(node.position.y) || 0, z: Number(node.position.z) || 0 };
    }

    if (node.entity) {
        return getNodeWorldPosition(node.entity);
    }

    return null;
}

function getNodeLocalQuaternion(node) {
    if (!node) return null;

    if (typeof node.getLocalRotation === 'function') {
        return cloneQuat(node.getLocalRotation());
    }

    if (node.quaternion) {
        return cloneQuat(node.quaternion);
    }

    if (node.entity) {
        return getNodeLocalQuaternion(node.entity);
    }

    return null;
}

function getNodeParentQuaternion(node) {
    if (!node) return null;

    const parent = node.parent || (node.entity && node.entity.parent) || (node.camera && node.camera.entity && node.camera.entity.parent);
    if (!parent) return null;

    if (typeof parent.getRotation === 'function') {
        return cloneQuat(parent.getRotation());
    }

    if (parent.quaternion) {
        return cloneQuat(parent.quaternion);
    }

    return null;
}

function setNodeLocalQuaternion(node, quat) {
    if (!node || !quat) return false;

    if (typeof node.setLocalEulerAngles === 'function') {
        const forward = rotateVecByQuat({ x: 0, y: 0, z: -1 }, quat);
        const pitch = Math.atan2(forward.y, Math.hypot(forward.x, forward.z));
        const yaw = Math.atan2(-forward.x, -forward.z);
        node.setLocalEulerAngles(pitch * RAD_TO_DEG, yaw * RAD_TO_DEG, 0);
        return true;
    }

    if (typeof node.setLocalRotation === 'function' && window.pc && typeof window.pc.Quat === 'function') {
        node.setLocalRotation(new window.pc.Quat(quat.x, quat.y, quat.z, quat.w));
        return true;
    }

    if (node.quaternion) {
        if (typeof node.quaternion.set === 'function') {
            node.quaternion.set(quat.x, quat.y, quat.z, quat.w);
        } else {
            node.quaternion.x = quat.x;
            node.quaternion.y = quat.y;
            node.quaternion.z = quat.z;
            node.quaternion.w = quat.w;
        }
        return true;
    }

    return false;
}

function normalizeVec3(vec) {
    const length = Math.hypot(vec.x, vec.y, vec.z);
    if (!length) return null;

    return {
        x: vec.x / length,
        y: vec.y / length,
        z: vec.z / length
    };
}

function invertQuat(quat) {
    const lengthSq = (quat.x * quat.x) + (quat.y * quat.y) + (quat.z * quat.z) + (quat.w * quat.w) || 1;
    return {
        x: -quat.x / lengthSq,
        y: -quat.y / lengthSq,
        z: -quat.z / lengthSq,
        w: quat.w / lengthSq
    };
}

function rotateVecByQuat(vec, quat) {
    const qx = quat.x;
    const qy = quat.y;
    const qz = quat.z;
    const qw = quat.w;
    const vx = vec.x;
    const vy = vec.y;
    const vz = vec.z;

    const ix = (qw * vx) + (qy * vz) - (qz * vy);
    const iy = (qw * vy) + (qz * vx) - (qx * vz);
    const iz = (qw * vz) + (qx * vy) - (qy * vx);
    const iw = (-qx * vx) - (qy * vy) - (qz * vz);

    return {
        x: (ix * qw) + (iw * -qx) + (iy * -qz) - (iz * -qy),
        y: (iy * qw) + (iw * -qy) + (iz * -qx) - (ix * -qz),
        z: (iz * qw) + (iw * -qz) + (ix * -qy) - (iy * -qx)
    };
}

function crossVec3(a, b) {
    return {
        x: (a.y * b.z) - (a.z * b.y),
        y: (a.z * b.x) - (a.x * b.z),
        z: (a.x * b.y) - (a.y * b.x)
    };
}

function quatFromBasis(right, up, back) {
    const m00 = right.x;
    const m01 = up.x;
    const m02 = back.x;
    const m10 = right.y;
    const m11 = up.y;
    const m12 = back.y;
    const m20 = right.z;
    const m21 = up.z;
    const m22 = back.z;

    const trace = m00 + m11 + m22;
    let x;
    let y;
    let z;
    let w;

    if (trace > 0) {
        const s = Math.sqrt(trace + 1) * 2;
        w = 0.25 * s;
        x = (m21 - m12) / s;
        y = (m02 - m20) / s;
        z = (m10 - m01) / s;
    } else if (m00 > m11 && m00 > m22) {
        const s = Math.sqrt(1 + m00 - m11 - m22) * 2;
        w = (m21 - m12) / s;
        x = 0.25 * s;
        y = (m01 + m10) / s;
        z = (m02 + m20) / s;
    } else if (m11 > m22) {
        const s = Math.sqrt(1 + m11 - m00 - m22) * 2;
        w = (m02 - m20) / s;
        x = (m01 + m10) / s;
        y = 0.25 * s;
        z = (m12 + m21) / s;
    } else {
        const s = Math.sqrt(1 + m22 - m00 - m11) * 2;
        w = (m10 - m01) / s;
        x = (m02 + m20) / s;
        y = (m12 + m21) / s;
        z = 0.25 * s;
    }

    return cloneQuat({ x, y, z, w });
}

function quatFromLookDirection(direction) {
    const forward = normalizeVec3(direction);
    if (!forward) return null;

    let right = normalizeVec3(crossVec3(forward, { x: 0, y: 1, z: 0 }));
    if (!right) {
        right = { x: 1, y: 0, z: 0 };
    }

    const up = normalizeVec3(crossVec3(right, forward)) || { x: 0, y: 1, z: 0 };
    return quatFromBasis(right, up, {
        x: -forward.x,
        y: -forward.y,
        z: -forward.z
    });
}

function aimNodeAtTarget(cameraEntity, targetPosition) {
    const aimNode = getAimNode(cameraEntity);
    const worldPosition = getNodeWorldPosition(aimNode);
    if (!aimNode || !worldPosition || !targetPosition) return false;

    const worldDirection = normalizeVec3({
        x: (Number(targetPosition.x) || 0) - worldPosition.x,
        y: (Number(targetPosition.y) || 0) - worldPosition.y,
        z: (Number(targetPosition.z) || 0) - worldPosition.z
    });
    if (!worldDirection) return false;

    const parentQuat = getNodeParentQuaternion(aimNode);
    const localDirection = parentQuat
        ? normalizeVec3(rotateVecByQuat(worldDirection, invertQuat(parentQuat)))
        : worldDirection;
    if (!localDirection) return false;

    const pitch = Math.max(-AIMBOT_MAX_PITCH, Math.min(AIMBOT_MAX_PITCH, Math.atan2(localDirection.y, Math.hypot(localDirection.x, localDirection.z))));
    const yaw = Math.atan2(-localDirection.x, -localDirection.z);
    const clampedDirection = normalizeVec3({
        x: -Math.sin(yaw) * Math.cos(pitch),
        y: Math.sin(pitch),
        z: -Math.cos(yaw) * Math.cos(pitch)
    });
    if (!clampedDirection) return false;

    const localQuat = quatFromLookDirection(clampedDirection);
    return setNodeLocalQuaternion(aimNode, localQuat);
}

const sym = Symbol('Local Player Hook');

Object.defineProperty(Object.prototype, 'isSleeping', {
    set(data) {
        this[sym] = data;
        if (this.protected) {
            window.tribals.localPlayer = this;
            window.tribals.localPlayer.randomChecks = function () {};
        }
        if (this.username !== undefined) {
            window.tribals.players.unshift({
                username: this.username,
                obj: this,
                lastPosition: {
                    x: this.entity.position.x,
                    y: this.entity.position.y,
                    z: this.entity.position.z
                },
                lastMoveTime: Date.now()
            });
        }
    }
});

window.getAllPlayers = function () {
    let players = [];
    window.tribals.players.forEach(plr => {
        if (!players.some(p => p.username === plr.username)) {
            players.unshift(plr);
        }
    });
    return players;
};

window.toggleESP = function () {
    window.espEnabled = !window.espEnabled;

    if (window.espEnabled) {
        const espCanvas = document.createElement('canvas');
        espCanvas.id = 'espCanvas';
        espCanvas.style.position = 'absolute';
        espCanvas.style.top = '0';
        espCanvas.style.left = '0';
        espCanvas.style.zIndex = '2147483647';
        espCanvas.style.pointerEvents = 'none';
        document.body.appendChild(espCanvas);
        const ctx = espCanvas.getContext('2d');

        espInterval = setInterval(() => {
            espCanvas.width = window.innerWidth;
            espCanvas.height = window.innerHeight;
            ctx.clearRect(0, 0, espCanvas.width, espCanvas.height);

            // ESP drawing
            window.getAllPlayers().forEach(plr => {
                if (!plr.obj || !plr.obj.entity || !plr.obj.entity.position) return;

                const currentPosition = plr.obj.entity.position;
                const lastPosition = plr.lastPosition;
                const distanceMoved = Math.hypot(
                    currentPosition.x - lastPosition.x,
                    currentPosition.y - lastPosition.y,
                    currentPosition.z - lastPosition.z
                );

                if (distanceMoved > 0) {
                    plr.lastMoveTime = Date.now();
                    plr.lastPosition = { ...currentPosition };
                }

                const timeSinceLastMove = Date.now() - plr.lastMoveTime;

                if (timeSinceLastMove < 10000) {
                    if (!window.tribals.localPlayer || !window.tribals.localPlayer.cameraEntity) return;

                    const screen = window.tribals.localPlayer.cameraEntity.camera.worldToScreen(currentPosition.clone());
                    if (screen.z >= 1.0) {
                        const scale = 4 / screen.z;
                        const w = 60 * scale;
                        const h = 150 * scale;
                        const x = screen.x - w / 2;
                        const y = screen.y - h / 2;

                        ctx.shadowColor = 'cyan';
                        ctx.shadowBlur = 20;
                        ctx.strokeStyle = 'cyan';
                        ctx.lineWidth = 2;
                        ctx.strokeRect(x, y, w, h);
                        ctx.shadowBlur = 0;

                        ctx.font = 'bold 14px Arial';
                        ctx.fillStyle = 'cyan';
                        ctx.fillText(plr.username, screen.x - 30, screen.y - 30);
                    }
                }
            });

            // ====== Aimbot logic ======
            const centerX = window.innerWidth / 2;
            const centerY = window.innerHeight / 2;
            const radius = 120;

            ctx.beginPath();
            ctx.arc(centerX, centerY, radius, 0, 2 * Math.PI);
            ctx.strokeStyle = 'yellow';
            ctx.lineWidth = 2;
            ctx.stroke();

            let target = null;
            let minDist = Infinity;

            window.getAllPlayers().forEach(plr => {
                if (!window.tribals.localPlayer) return;
                if (plr.obj === window.tribals.localPlayer) return;
                if (!plr.obj || !plr.obj.entity || !plr.obj.entity.position) return;

                const screen = window.tribals.localPlayer.cameraEntity.camera.worldToScreen(plr.obj.entity.position.clone());
                if (screen.z < 1.0) return;

                const dx = screen.x - centerX;
                const dy = screen.y - centerY;
                const dist = Math.sqrt(dx*dx + dy*dy);

                if (dist < radius && dist < minDist) {
                    target = plr;
                    minDist = dist;
                }
            });

            const aimNode = getAimNode(window.tribals.localPlayer.cameraEntity);

            if (target) {
                if (!originalCameraState && aimNode) {
                    originalCameraState = {
                        quaternion: getNodeLocalQuaternion(aimNode)
                    };
                }
                aimNodeAtTarget(window.tribals.localPlayer.cameraEntity, target.obj.entity.position);
            } else {
                if (originalCameraState && aimNode && originalCameraState.quaternion) {
                    setNodeLocalQuaternion(aimNode, originalCameraState.quaternion);
                    originalCameraState = null;
                }
            }

        }, window.tribals.espDelay);
        sendLogSafe('ESP enabled');
    } else {
        clearInterval(espInterval);
        const canvas = document.getElementById('espCanvas');
        if (canvas) canvas.remove();
        if (originalCameraState && window.tribals.localPlayer && window.tribals.localPlayer.cameraEntity) {
            const aimNode = getAimNode(window.tribals.localPlayer.cameraEntity);
            if (aimNode && originalCameraState.quaternion) {
                setNodeLocalQuaternion(aimNode, originalCameraState.quaternion);
            }
        }
        originalCameraState = null;
        sendLogSafe('ESP disabled');
    }
};