Drawaria Pincel Transparente con UI (Simulador)

Añade pincel con transparencia a Drawaria.online y botón para activar/desactivar y ajustar transparencia.

当前为 2025-07-28 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Drawaria Pincel Transparente con UI (Simulador)
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Añade pincel con transparencia a Drawaria.online y botón para activar/desactivar y ajustar transparencia.
// @author       YouTubeDrawaria
// @match        https://drawaria.online/*
// @grant        none
// @license      MIT
// @icon         https://www.google.com/s2/favicons?sz=64&domain=drawaria.online
// ==/UserScript==

(function() {
    'use strict';

    console.log("[Drawaria Transparency Script] Script cargado. Intentando inicializar...");

    // --- Crear UI flotante ---
    function createControlPanel() {
        const wrapper = document.createElement('div');
        wrapper.id = 'transparentBrushControlPanel'; // Añadimos un ID para identificarlo
        wrapper.style.position = 'fixed';
        wrapper.style.top = '30px';
        wrapper.style.right = '30px';
        wrapper.style.zIndex = '9999';
        wrapper.style.background = '#222c';
        wrapper.style.padding = '13px 20px 10px 20px';
        wrapper.style.borderRadius = '10px';
        wrapper.style.fontFamily = 'sans-serif';
        wrapper.style.color = '#fff';
        wrapper.style.userSelect = 'none';
        wrapper.style.boxShadow = '0 1px 6px #0008';
        wrapper.style.cursor = 'grab'; // Indica que se puede arrastrar

        const title = document.createElement('h3');
        title.textContent = 'Pincel Transparente';
        title.style.margin = '0 0 10px 0';
        title.style.textAlign = 'center';
        title.style.fontSize = '1.1em';
        title.style.color = '#ccc';

        const toggleBtn = document.createElement('button');
        toggleBtn.textContent = 'Pincel: OFF';
        toggleBtn.style.margin = '0 0 8px 0';
        toggleBtn.style.width = '100%';
        toggleBtn.style.padding = '7px 0';
        toggleBtn.style.background = '#492';
        toggleBtn.style.border = 'none';
        toggleBtn.style.borderRadius = '7px';
        toggleBtn.style.color = '#fff';
        toggleBtn.style.fontWeight = 'bold';
        toggleBtn.style.cursor = 'pointer';

        const label = document.createElement('label');
        label.textContent = 'Opacidad:';
        label.style.marginRight = '8px';

        const slider = document.createElement('input');
        slider.type = 'range';
        slider.min = '0.05';
        slider.max = '1';
        slider.step = '0.01';
        slider.value = '0.3';
        slider.style.width = '70px';
        slider.style.verticalAlign = 'middle'; // Alinea con el texto

        const percent = document.createElement('span');
        percent.textContent = '30%';
        percent.style.display = 'inline-block';
        percent.style.minWidth = '35px'; // Evita que se mueva al cambiar el valor
        percent.style.textAlign = 'right';

        wrapper.appendChild(title);
        wrapper.appendChild(toggleBtn);
        wrapper.appendChild(document.createElement('br'));
        wrapper.appendChild(label);
        wrapper.appendChild(slider);
        wrapper.appendChild(percent);

        document.body.appendChild(wrapper);

        console.log("[Drawaria Transparency Script] Panel de control creado.");
        return {wrapper, toggleBtn, slider, percent};
    }

    // --- Funcionalidad de Arrastrar el Panel ---
    function makeDraggable(element) {
        let isDragging = false;
        let offsetX, offsetY;

        element.addEventListener('mousedown', (e) => {
            // Solo arrastra si el clic no es en un botón o slider
            if (e.target === element || e.target.tagName === 'H3') {
                isDragging = true;
                offsetX = e.clientX - element.getBoundingClientRect().left;
                offsetY = e.clientY - element.getBoundingClientRect().top;
                element.style.cursor = 'grabbing';
                e.preventDefault(); // Evita la selección de texto
                console.log("[Drawaria Transparency Script] Empezando a arrastrar.");
            }
        });

        document.addEventListener('mousemove', (e) => {
            if (!isDragging) return;

            const newX = e.clientX - offsetX;
            const newY = e.clientY - offsetY;

            element.style.left = `${newX}px`;
            element.style.top = `${newY}px`;
            element.style.right = 'auto'; // Desactiva right para que left tome control
            element.style.bottom = 'auto'; // Desactiva bottom

            // Limitar el movimiento para que no se salga de la ventana
            const panelRect = element.getBoundingClientRect();
            if (panelRect.left < 0) element.style.left = '0px';
            if (panelRect.top < 0) element.style.top = '0px';
            if (panelRect.right > window.innerWidth) element.style.left = `${window.innerWidth - panelRect.width}px`;
            if (panelRect.bottom > window.innerHeight) element.style.top = `${window.innerHeight - panelRect.height}px`;
        });

        document.addEventListener('mouseup', () => {
            if (isDragging) {
                isDragging = false;
                element.style.cursor = 'grab';
                console.log("[Drawaria Transparency Script] Terminando de arrastrar.");
            }
        });
    }

    // --- MAIN ---
    let transparentMode = false;
    let customAlpha = 0.3; // Valor inicial
    let ctx;

    // UI
    const {wrapper, toggleBtn, slider, percent} = createControlPanel();
    makeDraggable(wrapper); // Hacer el panel arrastrable

    toggleBtn.addEventListener('click', function() {
        transparentMode = !transparentMode;
        toggleBtn.textContent = transparentMode ? 'Pincel: ON' : 'Pincel: OFF';
        toggleBtn.style.background = transparentMode ? '#2a5' : '#492';
        console.log(`[Drawaria Transparency Script] Pincel transparente: ${transparentMode ? 'ON' : 'OFF'}`);
    });

    slider.oninput = function() {
        customAlpha = parseFloat(slider.value);
        percent.textContent = Math.round(customAlpha*100) + "%";
        console.log(`[Drawaria Transparency Script] Opacidad ajustada a: ${customAlpha}`);
    };

    // Espía el contexto para manipular la opacidad
    function hookBrush() {
        const canvas = document.querySelector('canvas');
        if (!canvas) {
            console.log("[Drawaria Transparency Script] No se encontró el canvas. Reintentando...");
            return false;
        }
        if (!canvas.getContext) {
            console.log("[Drawaria Transparency Script] El canvas no soporta getContext. Reintentando...");
            return false;
        }

        ctx = canvas.getContext('2d');
        if (!ctx) {
            console.log("[Drawaria Transparency Script] No se pudo obtener el contexto 2D. Reintentando...");
            return false;
        }
        if (ctx._pincelTransparenteHooked) {
            console.log("[Drawaria Transparency Script] Contexto ya enganchado.");
            return true;
        }

        // Guardamos las referencias originales a los métodos
        const origStroke = ctx.stroke;
        const origFill = ctx.fill;

        // Sobrescribimos stroke
        ctx.stroke = function() {
            let prevAlpha = ctx.globalAlpha;
            if (transparentMode) {
                ctx.globalAlpha = customAlpha;
            }
            origStroke.apply(this, arguments); // Usamos 'this' para asegurar el contexto correcto
            ctx.globalAlpha = prevAlpha;
        };

        // Sobrescribimos fill
        ctx.fill = function() {
            let prevAlpha = ctx.globalAlpha;
            if (transparentMode) {
                ctx.globalAlpha = customAlpha;
            }
            origFill.apply(this, arguments); // Usamos 'this' para asegurar el contexto correcto
            ctx.globalAlpha = prevAlpha;
        };

        ctx._pincelTransparenteHooked = true; // Marca para evitar doble enganche
        console.log("[Drawaria Transparency Script] Canvas context enganchado exitosamente!");
        return true;
    }

    // Prueba hook cada segundo hasta éxito
    let tryTimes = 0;
    const maxRetries = 60; // Intentar durante 60 segundos
    function tryHook() {
        if (!hookBrush()) {
            tryTimes++;
            if (tryTimes < maxRetries) {
                setTimeout(tryHook, 1000);
            } else {
                console.error("[Drawaria Transparency Script] No se pudo enganchar el canvas después de varios intentos. Asegúrate de estar en Drawaria.online.");
            }
        }
    }

    // Esperar a que el DOM esté completamente cargado antes de intentar
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', tryHook);
    } else {
        tryHook(); // Si ya está cargado, ejecutar inmediatamente
    }

})();