Greasy Fork is available in English.

scum8_teleport_pro_v2

为scum8商城传送界面添加传送按钮可移动、删除

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name         scum8_teleport_pro_v2
// @name:zh-CN   scum8商城传送页面增强
// @namespace    https://github.com/playboytzy/scum8_teleport_pro/
// @version      2.02
// @description  为scum8商城传送界面添加传送按钮可移动、删除
// @author       Meow-小猫
// @match        https://*.scum8.com/chuansong.html*
// @match        https://*.scum.plus/chuansong.html*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';
const targetClasses = ["leaflet-marker-icon", "leaflet-daisy-label", "leaflet-zoom-animated", "leaflet-interactive"];
const targetSelector = targetClasses.map(cls => `.${cls}`).join('');

// 添加简洁样式
GM_addStyle(`
    .simplified-draggable {
        cursor: grab !important;
        position: relative;
    }
    .simplified-draggable:active {
        cursor: grabbing !important;
    }
    .marker-highlight {
        box-shadow: 0 0 0 2px #4299e1 !important;
        z-index: 999 !important;
    }
    .marker-delete-animation {
        animation: fadeOutScale 0.4s ease forwards;
    }
    .delete-button {
        position: absolute;
        top: -8px;
        right: -8px;
        width: 16px;
        height: 16px;
        background: #e53e3e;
        color: white;
        border-radius: 50%;
        font-size: 12px;
        line-height: 16px;
        text-align: center;
        cursor: pointer;
        display: none;
        border: 1px solid white;
        font-weight: bold;
    }
    .simplified-draggable:hover .delete-button {
        display: block;
    }
    @keyframes fadeOutScale {
        0% { opacity: 1; transform: scale(1); }
        100% { opacity: 0; transform: scale(0.1); }
    }
`);

let selectedMarker = null;

function initializeSimplifiedControls() {
    const markers = document.querySelectorAll(targetSelector);

    if (markers.length === 0) {
        setTimeout(initializeSimplifiedControls, 1500);
        return;
    }

    markers.forEach(marker => {
        if (!marker.classList.contains('simplified-controlled')) {
            setupMarkerFunctionality(marker);
            marker.classList.add('simplified-controlled');
        }
    });
}

function setupMarkerFunctionality(marker) {
    marker.classList.add('simplified-draggable');
    enableDrag(marker);

    // 添加删除按钮
    const deleteBtn = document.createElement('div');
    deleteBtn.className = 'delete-button';
    deleteBtn.textContent = '×';
    marker.appendChild(deleteBtn);

    // 删除按钮点击事件
    deleteBtn.addEventListener('click', function(e) {
        e.preventDefault();
        e.stopPropagation();
        deleteMarker(marker);
    });
}

function selectMarker(marker) {
    // 清除之前的选择
    if (selectedMarker) {
        selectedMarker.classList.remove('marker-highlight');
    }

    selectedMarker = marker;
    marker.classList.add('marker-highlight');

    // 显示操作提示(3秒后消失)
    showQuickTip('已选择传送点:拖拽移动 | 点击×按钮删除');
}

function enableDrag(element) {
    let dragging = false;
    let startX, startY, initialX, initialY;

    element.addEventListener('mousedown', function(e) {
        if (e.button !== 2) return; // 只响应右键

        dragging = true;
        startX = e.clientX;
        startY = e.clientY;
        initialX = parseFloat(element.style.left) || 0;
        initialY = parseFloat(element.style.top) || 0;
    });

    document.addEventListener('mousemove', function(e) {
        if (!dragging) return;

        const deltaX = e.clientX - startX;
        const deltaY = e.clientY - startY;

        element.style.left = (initialX + deltaX) + 'px';
        element.style.top = (initialY + deltaY) + 'px';
    });

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


function deleteMarker(marker) {
    if (confirm('确定要删除这个传送点吗?\n\n删除操作刷新后重置!')) {
        marker.classList.add('marker-delete-animation');
        setTimeout(() => {
            marker.remove();
            selectedMarker = null;
        }, 400);
    }
}

function showQuickTip(message) {
    // 移除现有提示
    const existingTip = document.getElementById('marker-quick-tip');
    if (existingTip) {
        existingTip.remove();
    }

    // 创建新提示
    const tip = document.createElement('div');
    tip.id = 'marker-quick-tip';
    tip.textContent = message;
    tip.style.cssText = `
        position: fixed;
        top: 20px;
        left: 50%;
        transform: translateX(-50%);
        background: rgba(45, 55, 72, 0.95);
        color: white;
        padding: 8px 16px;
        border-radius: 6px;
        font-size: 12px;
        z-index: 10000;
        backdrop-filter: blur(10px);
        border: 1px solid #4a5568;
        box-shadow: 0 4px 12px rgba(0,0,0,0.3);
        transition: opacity 0.3s ease;
    `;

    document.body.appendChild(tip);

    // 3秒后淡出
    setTimeout(() => {
        tip.style.opacity = '0';
        setTimeout(() => tip.remove(), 300);
    }, 3000);
}

// 点击页面其他区域取消选择
document.addEventListener('click', function(e) {
    if (!e.target.closest(targetSelector) && selectedMarker) {
        selectedMarker.classList.remove('marker-highlight');
        selectedMarker = null;
    }
});

// 使用MutationObserver监听新标记
const observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        if (mutation.addedNodes.length > 0) {
            setTimeout(initializeSimplifiedControls, 500);
        }
    });
});

observer.observe(document.body, {
    childList: true,
    subtree: true
});

// 初始执行
if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', function() {
        setTimeout(initializeSimplifiedControls, 2000);
    });
} else {
    setTimeout(initializeSimplifiedControls, 2000);
}
    // 禁用右键菜单的主要功能
    function disableContextMenu() {
        // 阻止右键菜单弹出
        document.addEventListener('contextmenu', function(e) {
            e.preventDefault();
            e.stopPropagation();
            return false;
        }, true);

        // 阻止键盘快捷键F10和Shift+F10(在某些浏览器中会触发右键菜单)
        document.addEventListener('keydown', function(e) {
            if (e.key === 'F10' || (e.shiftKey && e.key === 'F10')) {
                e.preventDefault();
                e.stopPropagation();
                return false;
            }
        }, true);

        // 阻止通过JavaScript代码触发的右键菜单
        document.addEventListener('DOMContentLoaded', function() {
            // 重新定义可能被页面脚本使用的相关属性
            if (document.oncontextmenu !== null) {
                document.oncontextmenu = function() {
                    return false;
                };
            }

            // 阻止通过element.oncontextmenu属性设置的右键菜单
            const elements = document.querySelectorAll('*');
            elements.forEach(element => {
                if (element.oncontextmenu) {
                    element.oncontextmenu = function() {
                        return false;
                    };
                }
            });
        });

        // 为动态添加的元素也禁用右键菜单
        const observer = new MutationObserver(function(mutations) {
            mutations.forEach(function(mutation) {
                if (mutation.addedNodes.length > 0) {
                    mutation.addedNodes.forEach(function(node) {
                        if (node.nodeType === 1) { // 元素节点
                            if (node.oncontextmenu) {
                                node.oncontextmenu = function() {
                                    return false;
                                };
                            }
                        }
                    });
                }
            });
        });

        observer.observe(document.body, {
            childList: true,
            subtree: true
        });

        console.log('右键菜单禁用脚本已启用');
    }

    // 执行禁用功能
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', disableContextMenu);
    } else {
        disableContextMenu();
    }

//     // 添加样式提示用户右键已被禁用
//     const style = document.createElement('style');
//     style.textContent = `
//         body::after {
//             content: "右键功能已被禁用";
//             position: fixed;
//             bottom: 10px;
//             right: 10px;
//             background: rgba(255, 59, 48, 0.9);
//             color: white;
//             padding: 5px 10px;
//             border-radius: 4px;
//             font-size: 12px;
//             z-index: 10000;
//             opacity: 0;
//             transition: opacity 0.3s;
//             pointer-events: none;
//         }

//         body.context-menu-disabled::after {
//             opacity: 1;
//         }
//     `;
//     document.head.appendChild(style);

//     // 添加右键被阻止时的视觉反馈
//     document.addEventListener('mousedown', function(e) {
//         if (e.button === 2) { // 右键
//             document.body.classList.add('context-menu-disabled');
//             setTimeout(function() {
//                 document.body.classList.remove('context-menu-disabled');
//             }, 2000);
//         }
//     });

    // 删除下边栏
    // 查找所有包含指定类的元素
    const elements = document.querySelectorAll('.fixed.bottom-0.w-full.bg-base-200.bg-opacity-80.text-center.py-1.shadow-md');
    const elements1 = document.querySelectorAll('.fixed.bottom-4.right-4.z-50');
    // 移除这些元素
    elements.forEach(element => {
        element.remove();
    });
    elements1.forEach(element => {
        element.remove();
    });
    // 删除猫币span
    // 主要删除函数
    function removeTargetButtons() {
    // 查找所有类名为"opacity-80 ml-1"的元素
    const targetButtons = document.querySelectorAll('.opacity-80.ml-1');

    // 遍历并删除找到的元素
    targetButtons.forEach(button => {
        button.remove();
        console.log('已删除目标按钮元素');
    });

    // 如果找到了元素,显示操作结果
    if (targetButtons.length > 0) {
        console.log(`成功删除 ${targetButtons.length} 个目标按钮`);
    }
    }

    // 页面加载完成后执行
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', removeTargetButtons);
    } else {
        removeTargetButtons();
    }

    // 监听动态内容变化(适用于SPA或异步加载内容)
    const observer1 = new MutationObserver(function(mutations) {
        removeTargetButtons();
    });

    // 开始观察文档变化
    observer1.observe(document.body, {
        childList: true,
        subtree: true
    });
})();