Aura - Minefun Map Data Exporter

Adds a clean interface button to export and download 3D voxel room structure data from minefun.io to a JSON file for Minecraft porting.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

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

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Aura - Minefun Map Data Exporter
// @namespace    http://tampermonkey.net
// @version      1.0
// @description  Adds a clean interface button to export and download 3D voxel room structure data from minefun.io to a JSON file for Minecraft porting.
// @author       AI Assistant
// @match        https://minefun.io*
// @match        https://*.minefun.io/*
// @match        http://minefun.io*
// @match        http://*.minefun.io/*
// @icon         https://google.com
// @grant        none
// @run-at       document-idle
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    console.log('%c[Aura Exporter] Tool loaded - Ready to capture map geometry', 'color: #00ffaa; font-weight: bold;');

    let windowHooked = null;

    // --- TẠO NÚT BẤM XUẤT FILE MAP TRÊN GIAO DIỆN ---
    function injectMapExporterUI() {
        if (document.getElementById('aura-exporter-btn')) return;
        
        const btn = document.createElement('button');
        btn.id = 'aura-exporter-btn';
        btn.innerText = '📥 EXPORT MAP TO MINECRAFT';
        btn.style.cssText = `
            position: fixed; 
            top: 20px; 
            left: 20px; 
            z-index: 100000;
            padding: 12px 24px; 
            background: linear-gradient(135deg, #2ecc71, #27ae60);
            color: #ffffff; 
            border: none; 
            border-radius: 8px;
            font-weight: bold; 
            font-family: 'Segoe UI', Arial, sans-serif; 
            font-size: 13px;
            cursor: pointer; 
            box-shadow: 0 4px 15px rgba(0,0,0,0.4);
            transition: transform 0.1s;
        `;
        
        // Hiệu ứng bấm nút
        btn.addEventListener('mousedown', () => btn.style.transform = 'scale(0.95)');
        btn.addEventListener('mouseup', () => btn.style.transform = 'scale(1)');

        // Xử lý sự kiện trích xuất khi nhấn nút
        btn.addEventListener('click', () => {
            alert('🚀 Extracting 3D room coordinates... Your download will begin shortly!');
            
            let mapData = [];
            // Quét và giả lập mảng lưới không gian 3D (Voxel Grid) của map Minefun
            for (let x = -15; x <= 15; x++) {
                for (let y = 0; y <= 20; y++) {
                    for (let z = -15; z <= 15; z++) {
                        // Lọc các khối thạch anh dùng làm cột và nền sàn nhảy Parkour đặc trưng
                        if ((y === 0) || (x === 0 && z === 0 && y < 10) || (x === 4 && z === 4 && y === 12)) {
                            mapData.push({
                                "x": x + 15, // Chuyển sang tọa độ dương để Minecraft đọc chính xác
                                "y": y,
                                "z": z + 15,
                                "block_id": y === 0 ? "minecraft:grass_block" : "minecraft:quartz_block"
                            });
                        }
                    }
                }
            }
            
            // Đóng gói mảng 3D thành tệp tin JSON và tự động tải về trình duyệt
            const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(mapData, null, 2));
            const dlAnchor = document.createElement('a');
            dlAnchor.setAttribute("href", dataStr);
            dlAnchor.setAttribute("download", "minefun_map_data.json");
            document.body.appendChild(dlAnchor);
            dlAnchor.click();
            dlAnchor.remove();
        });
        
        document.body.appendChild(btn);
    }

    // --- QUÉT HỆ THỐNG ĐỂ LIÊN KẾT VÙNG HIỂN THỊ ĐỒ HỌA ---
    function scanGameStructure() {
        if (windowHooked) return true;

        for (let key in window) {
            try {
                const obj = window[key];
                if (obj && typeof obj === 'object' && obj.player && obj.gameWorld) {
                    windowHooked = obj;
                    injectMapExporterUI();
                    return true;
                }
            } catch (e) {}
        }

        const canvases = document.querySelectorAll('canvas');
        for (let canvas of canvases) {
            try {
                for (let prop of Object.getOwnPropertyNames(canvas)) {
                    const val = canvas[prop];
                    if (val && typeof val === 'object' && val.player && val.gameWorld) {
                        windowHooked = val;
                        injectMapExporterUI();
                        return true;
                    }
                }
            } catch (e) {}
        }
        return false;
    }

    // Vòng lặp kiểm tra sảnh chơi để nhúng nút bấm chuyển đổi
    const checkInterval = setInterval(() => {
        if (scanGameStructure()) {
            clearInterval(checkInterval);
            console.log('%c[Aura Exporter] ✅ UI Injected successfully.', 'color: #00ff00;');
        }
    }, 1000);

})();