Greasy Fork 支持简体中文。

GI AppSample Map - More Markable Markers

Gets the markers_all json file and change user defined markers to be markable.

// ==UserScript==
// @name         GI AppSample Map - More Markable Markers
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Gets the markers_all json file and change user defined markers to be markable.
// @author       2KRN4U
// @match        https://genshin-impact-map.appsample.com/*
// @icon         https://genshin-impact-map.appsample.com/favicon.ico
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    // List of markers to change
    const list = "o596, o601, o602, o639, o641, o647, o128"; // EDIT THIS LINE ONLY, seperate by comma. Example "o596, o317";

    const targetFilenameStart = "markers_all"; // Filename of the markers file

    const keys = list.split(",").map(key => key.trim()); // Convert list to an array of trimmed keys

    const allowMarkComment = 5; // Value to allow marking and commenting

    // Save references to the original XHR methods
    const originalOpen = XMLHttpRequest.prototype.open;
    const originalSend = XMLHttpRequest.prototype.send;

    // Override the open method
    XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
        this._filename = url.split('/').pop(); // Extract the filename from the URL
        this._url = url; // Store the URL for later use
        originalOpen.apply(this, arguments); // Call the original open method
    };

    // Override the send method
    XMLHttpRequest.prototype.send = function (body) {
        this.addEventListener('readystatechange', function () {
            // Only process requests if the filename matches the target prefix
            if (
                this.readyState === 4 &&
                this.status === 200 &&
                this._filename.startsWith(targetFilenameStart) // Check if filename starts with the target string
            ) {
                try {
                    let modifiedResponseText = this.responseText;

                    // Apply replacements for each key in the list
                    keys.forEach(key => {
                        const searchPattern = new RegExp(`("${key}",\\d+,)(\\d+)(,)`, 'g'); // Search pattern for markers
                        modifiedResponseText = modifiedResponseText.replace(
                            searchPattern,
                            (_, prefix, lastDigits, suffix) => `${prefix}${allowMarkComment}${suffix}`
                        ); // Replace to allow marking and commenting
                    });

                    // Overwrite the responseText property with the modified content
                    Object.defineProperty(this, 'responseText', {
                        value: modifiedResponseText,
                        configurable: true,
                    });

                    // Optional: Overwrite response (useful if response is accessed differently)
                    Object.defineProperty(this, 'response', {
                        value: modifiedResponseText,
                        configurable: true,
                    });
                } catch (e) {
                    console.error('Error modifying JSON response:', e);
                }
            }
        });

        // Call the original send method
        originalSend.apply(this, arguments);
    };

    // Wait for the DOM to fully load
    window.addEventListener('load', function () {
        // Function to modify the title
        const modifyTitle = (originalTitle, dataTestId) => {
            // Trim the first 4 characters of data-testid
            const trimmedData = dataTestId ? dataTestId.slice(4) : 'Unknown';
            // Combine the original title with the trimmed data-testid
            return `${originalTitle}: ${trimmedData}`;
        };

        // Select all buttons with the class "MuiButtonBase-root"
        const buttons = document.querySelectorAll('.MuiButtonBase-root');

        // Iterate over each button
        buttons.forEach(button => {
            const originalTitle = button.getAttribute('title');
            const dataTestId = button.getAttribute('data-testid');

            // Only proceed if both title and data-testid exist
            if (originalTitle && dataTestId) {
                const newTitle = modifyTitle(originalTitle, dataTestId);
                button.setAttribute('title', newTitle);
            }
        });
    });
})();