Custom Cursors!!!

Press ` to open cursor menu. Upload custom cursor or disable it. R/F pulse crosshair.

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

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

ستحتاج إلى تثبيت إضافة مثل Stylus لتثبيت هذا النمط.

ستحتاج إلى تثبيت إضافة لإدارة أنماط المستخدم لتتمكن من تثبيت هذا النمط.

ستحتاج إلى تثبيت إضافة لإدارة أنماط المستخدم لتثبيت هذا النمط.

ستحتاج إلى تثبيت إضافة لإدارة أنماط المستخدم لتثبيت هذا النمط.

(لدي بالفعل مثبت أنماط للمستخدم، دعني أقم بتثبيته!)

// ==UserScript==
// @name         Custom Cursors!!!
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Press ` to open cursor menu. Upload custom cursor or disable it. R/F pulse crosshair.
// @match        *://bloxd.io/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // ============================================================
    // CROSSHAIR PULSE (R/F)
    // ============================================================
    const BASE_SIZE = 20;
    const PULSE_SIZE = 45;
    const PULSE_SPEED = 90;
    const SHRINK_SPEED = 90;

    const crosshair = document.createElement('div');
    Object.assign(crosshair.style, {
        position: 'fixed',
        left: '50%',
        top: '50%',
        transform: 'translate(-50%, -50%)',
        width: BASE_SIZE + 'px',
        height: BASE_SIZE + 'px',
        pointerEvents: 'none',
        zIndex: '999999',
        borderLeft: '2px solid white',
        borderTop: '2px solid white',
        borderRight: '2px solid white',
        borderBottom: '2px solid white',
        filter: 'drop-shadow(0 0 2px black)',
        transition: `width ${PULSE_SPEED}ms ease, height ${PULSE_SPEED}ms ease`
    });
    document.body.appendChild(crosshair);

    let pulsing = false;

    function pulse() {
        if (pulsing) return;
        pulsing = true;

        crosshair.style.width = PULSE_SIZE + 'px';
        crosshair.style.height = PULSE_SIZE + 'px';

        setTimeout(() => {
            crosshair.style.width = BASE_SIZE + 'px';
            crosshair.style.height = BASE_SIZE + 'px';

            setTimeout(() => {
                pulsing = false;
            }, SHRINK_SPEED);

        }, PULSE_SPEED);
    }

    window.addEventListener('keydown', (e) => {
        const k = e.key.toLowerCase();
        if (k === 'r' || k === 'f') pulse();
    });

    // ============================================================
    // CUSTOM CURSOR OVERLAY
    // ============================================================
    let cursorEnabled = false;
    let cursorURL = null;

    const cursorOverlay = document.createElement('img');
    Object.assign(cursorOverlay.style, {
        position: 'fixed',
        left: '0px',
        top: '0px',
        width: '32px',
        height: '32px',
        pointerEvents: 'none',
        zIndex: '999998',
        display: 'none'
    });
    document.body.appendChild(cursorOverlay);

    window.addEventListener('mousemove', (e) => {
        if (!cursorEnabled) return;
        cursorOverlay.style.left = e.clientX + 'px';
        cursorOverlay.style.top = e.clientY + 'px';
    });

    function enableCursor() {
        if (!cursorURL) return;
        cursorOverlay.src = cursorURL;
        cursorOverlay.style.display = 'block';
        document.body.style.cursor = 'none';
        cursorEnabled = true;
    }

    function disableCursor() {
        cursorOverlay.style.display = 'none';
        document.body.style.cursor = 'default';
        cursorEnabled = false;
    }

    // ============================================================
    // MENU UI (press ` to toggle)
    // ============================================================
    const menu = document.createElement('div');
    Object.assign(menu.style, {
        position: 'fixed',
        left: '20px',
        top: '20px',
        width: '220px',
        padding: '12px',
        background: 'rgba(20,20,20,0.85)',
        backdropFilter: 'blur(6px)',
        borderRadius: '8px',
        color: 'white',
        fontFamily: 'Arial',
        fontSize: '14px',
        zIndex: '999999',
        display: 'none',
        border: '1px solid rgba(255,255,255,0.15)'
    });

    menu.innerHTML = `
        <b>Custom Cursor</b><br><br>
        <input type="file" id="cursorUpload" accept="image/*"><br><br>
        <button id="enableBtn" style="width:100%;margin-bottom:6px;">Enable Cursor</button>
        <button id="disableBtn" style="width:100%;">Disable Cursor</button>
    `;

    document.body.appendChild(menu);

    // Upload handler
    menu.querySelector("#cursorUpload").addEventListener("change", (e) => {
        const file = e.target.files[0];
        if (!file) return;
        const reader = new FileReader();
        reader.onload = () => {
            cursorURL = reader.result;
            alert("Cursor uploaded!");
        };
        reader.readAsDataURL(file);
    });

    // Buttons
    menu.querySelector("#enableBtn").onclick = enableCursor;
    menu.querySelector("#disableBtn").onclick = disableCursor;

    // Toggle menu with `
    window.addEventListener('keydown', (e) => {
        if (e.key === '`') {
            menu.style.display = menu.style.display === 'none' ? 'block' : 'none';
        }
    });
})();