minefuncheat- Fixed Fly & Teleport

we do a little trolling (fixed fly & tp 2026)

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name         minefuncheat- Fixed Fly & Teleport
// @description  we do a little trolling (fixed fly & tp 2026)
// @version      4.0.6
// @author       FORGEX
// @match        *://minefun.io/*
// @grant        none
// @namespace https://greasyfork.org/users/1547600
// ==/UserScript==

(() => {
    "use strict";

    // ────────────────────────────────────────────────
    //  Các phần webpack_modules, style, hooks... giữ nguyên như cũ
    //  (bạn copy nguyên từ code cũ vào đây, mình không paste lại để ngắn gọn)
    // ────────────────────────────────────────────────

    // ── Chỉnh sửa và bổ sung các module quan trọng ──

    class Fly extends Module {
        constructor() {
            super("Fly", "Movement", {
                "Vertical Speed": 6,
                "Horizontal Speed": 8
            });
            this.toggleKey = "KeyF";
            this._original = {};
            document.addEventListener("keydown", e => {
                if (e.code === this.toggleKey && !e.repeat) this.toggle();
            });
        }

        onEnable() {
            const p = hooks.A?.gameWorld?.player;
            if (!p) return;
            this._original.gravity = p.velocity?.gravity ?? 23;
            this._original.moveSpeed = p.velocity?.moveSpeed ?? 4.5;
            console.log("[Fly] Đã lưu giá trị gốc → gravity:", this._original.gravity);
        }

        onDisable() {
            const p = hooks.A?.gameWorld?.player;
            if (!p) return;
            if (this._original.gravity !== undefined) p.velocity.gravity = this._original.gravity;
            if (this._original.moveSpeed !== undefined) p.velocity.moveSpeed = this._original.moveSpeed;
            p.velocity.fastMoveSpeed = 6.4;
            console.log("[Fly] Đã khôi phục gravity & speed gốc");
        }

        onRender() {
            const p = hooks.A?.gameWorld?.player;
            if (!p || !this.isEnabled) return;

            // Tắt các cơ chế chống bay phổ biến
            p.velocity.gravity = 0;
            p.collision.isGrounded = false;
            p.collision.wasOnGround = false;
            p.onGround = false;           // một số game dùng tên này
            p.isFalling = false;
            p.fallDistance = 0;

            // Lấy hướng nhìn (yaw + pitch)
            const yaw = p.rotation.y;
            const pitch = p.rotation.x;
            const forwardX = -Math.sin(yaw) * Math.cos(pitch);
            const forwardZ = Math.cos(yaw) * Math.cos(pitch);
            const upY = Math.sin(pitch);

            const hSpeed = this.options["Horizontal Speed"];
            const vSpeed = this.options["Vertical Speed"];

            // Di chuyển ngang theo hướng nhìn + phím W/S/A/D
            let vx = 0, vz = 0;
            if (p.inputs.forward) { vx += forwardX; vz += forwardZ; }
            if (p.inputs.backward) { vx -= forwardX; vz -= forwardZ; }
            if (p.inputs.left) { vx += forwardZ; vz -= forwardX; }
            if (p.inputs.right) { vx -= forwardZ; vz += forwardX; }

            const hLen = Math.hypot(vx, vz) || 1;
            vx = (vx / hLen) * hSpeed;
            vz = (vz / hLen) * hSpeed;

            p.velocity.velVec3.x = vx;
            p.velocity.velVec3.z = vz;

            // Di chuyển dọc (Space / Ctrl)
            if (p.inputs.jump) {
                p.velocity.velVec3.y = vSpeed;
            } else if (p.inputs.crouch) {
                p.velocity.velVec3.y = -vSpeed;
            } else {
                p.velocity.velVec3.y *= 0.92; // giảm dần để không bay vèo vèo
            }

            // Giữ cho player không bị kẹt hoặc rơi đột ngột
            p.velocity.velVec3.y = Math.max(-vSpeed * 1.5, Math.min(vSpeed * 1.5, p.velocity.velVec3.y));
        }
    }

    class TeleportModule extends Module {
        constructor() {
            super("Teleport", "Misc");
            this.key = "KeyT";
            document.addEventListener("keydown", e => {
                if (e.code === this.key && !e.repeat) {
                    this.tryTeleport();
                }
            });
        }

        tryTeleport() {
            const w = hooks.A?.gameWorld;
            if (!w?.player) {
                console.warn("[TP] Không tìm thấy player");
                return;
            }

            let blockPos = null;

            // Cách 1: Dùng outline / selection system (phổ biến nhất)
            const selSystem = w.systemsManager?.activeSystems?.find(s => 
                s.currBlockPos || s.selectedPos || s.outlinePos || s.hoverPos
            );
            if (selSystem?.currBlockPos) {
                blockPos = selSystem.currBlockPos;
            }

            // Cách 2: Nếu không có → tự raycast đơn giản (dùng three.js)
            if (!blockPos && w.threeScene?.camera && w.threeScene?.scene) {
                try {
                    const THREE = window.THREE || w.threeScene.THREE;
                    if (THREE) {
                        const cam = w.threeScene.camera;
                        const dir = new THREE.Vector3();
                        cam.getWorldDirection(dir);
                        const origin = new THREE.Vector3().copy(w.player.position);
                        origin.y += 1.62; // eye height

                        const raycaster = new THREE.Raycaster(origin, dir, 0, 120);
                        const intersects = raycaster.intersectObjects(w.threeScene.scene.children, true);

                        if (intersects.length > 0) {
                            const pt = intersects[0].point;
                            blockPos = {
                                x: Math.floor(pt.x),
                                y: Math.floor(pt.y),
                                z: Math.floor(pt.z)
                            };
                        }
                    }
                } catch(e) {
                    console.warn("[TP] Raycast thủ công lỗi:", e);
                }
            }

            if (!blockPos) {
                console.warn("[TP] Không tìm thấy block đang nhìn vào");
                return;
            }

            // Teleport lên trên block 1.5–2 block để tránh kẹt
            const dest = {
                x: blockPos.x + 0.5,
                y: blockPos.y + 2,
                z: blockPos.z + 0.5
            };

            console.log("[TP] Thử dịch chuyển tới:", dest);

            // Thử nhiều cách set position (tùy game engine)
            const tries = [
                () => { w.player.position.set(dest.x, dest.y, dest.z); },
                () => { w.player.physicsPosComp?.copyPos?.(dest); },
                () => { w.player.transform?.position?.set?.(dest.x, dest.y, dest.z); },
                () => { w.player._physics?.setPosition?.(dest); },
                () => { Object.assign(w.player.position, dest); w.player.physicsPosComp?.sync?.(); }
            ];

            let success = false;
            for (const fn of tries) {
                try {
                    fn();
                    success = true;
                    console.log("[TP] Thành công với cách:", fn.toString().slice(0,60)+"...");
                    break;
                } catch(e) {}
            }

            if (!success) {
                console.error("[TP] Không cách nào set position thành công. Kiểm tra console xem player có thuộc tính position/physics không.");
            }
        }
    }

    // ── Thêm Fly & Teleport vào module manager (thay thế phiên bản cũ) ──
    // Trong phần module_moduleManager.init(), thay thế hoặc thêm lại:

    // ... các module khác giữ nguyên ...

    module_moduleManager.addModule(new Fly());
    module_moduleManager.addModule(new TeleportModule());

    // Nếu bạn đã add trước đó thì có thể xóa dòng cũ và add lại 2 module này

    // ── Phần còn lại của script (Minebuns class, events, init...) giữ nguyên ──

    const main = new Minebuns();
})();