您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Arrange worlds in custom order within "Lumile tale" section + add editable input in corner
- // ==UserScript==
- // @name The West - Custom World Order (Lightning Fast + UI Input)
- // @namespace https://www.the-west.ro/
- // @author honeydew (Texas)
- // @version 3.1
- // @description Arrange worlds in custom order within "Lumile tale" section + add editable input in corner
- // @match https://www.the-west.ro/*
- // @grant none
- // ==/UserScript==
- (function () {
- 'use strict';
- // 🎯 Load from localStorage or default to empty
- let PREFERRED_ORDER = JSON.parse(localStorage.getItem("preferredWorldOrder") || "[]");
- const ALL_WORLDS_ID = "allWorlds";
- const LUMILE_TALE_TEXT = "Lumile tale";
- let isProcessing = false;
- function getWorldNumber(worldElement) {
- const match = worldElement.id?.match(/world_(\d+)/);
- return match ? parseInt(match[1], 10) : null;
- }
- function arrangeWorldsInOrder() {
- if (isProcessing) return false;
- isProcessing = true;
- try {
- const allWorlds = document.getElementById(ALL_WORLDS_ID);
- if (!allWorlds || allWorlds.offsetParent === null) return false;
- const lumileTaleRow = Array.from(allWorlds.querySelectorAll(".worlds-row"))
- .find(row => row.querySelector("h2")?.textContent?.includes(LUMILE_TALE_TEXT));
- if (!lumileTaleRow) return false;
- const content = lumileTaleRow.querySelector(".row-content");
- if (!content) return false;
- const worldElements = Array.from(content.querySelectorAll('[id^="world_"]'));
- if (worldElements.length === 0) return false;
- const orderedWorlds = [];
- const remainingWorlds = [];
- const worldMap = new Map();
- worldElements.forEach(element => {
- const worldNum = getWorldNumber(element);
- if (worldNum !== null) {
- worldMap.set(worldNum, element);
- }
- });
- PREFERRED_ORDER.forEach(worldNum => {
- if (worldMap.has(worldNum)) {
- orderedWorlds.push(worldMap.get(worldNum));
- worldMap.delete(worldNum);
- }
- });
- worldElements.forEach(element => {
- const worldNum = getWorldNumber(element);
- if (worldNum !== null && worldMap.has(worldNum)) {
- remainingWorlds.push(element);
- }
- });
- const newOrder = [...orderedWorlds, ...remainingWorlds];
- const currentOrder = Array.from(content.children).filter(child =>
- child.id && child.id.startsWith('world_')
- );
- let needsReordering = false;
- if (newOrder.length === currentOrder.length) {
- for (let i = 0; i < newOrder.length; i++) {
- if (newOrder[i] !== currentOrder[i]) {
- needsReordering = true;
- break;
- }
- }
- } else {
- needsReordering = true;
- }
- if (needsReordering) {
- const referenceElement = Array.from(content.children)
- .find(child => !child.id || !child.id.startsWith('world_'));
- newOrder.forEach((worldElement, index) => {
- if (index === 0) {
- content.insertBefore(worldElement, referenceElement || content.firstChild);
- } else {
- const previousWorld = newOrder[index - 1];
- content.insertBefore(worldElement, previousWorld.nextSibling);
- }
- });
- const orderedNumbers = orderedWorlds.map(el => getWorldNumber(el)).filter(n => n !== null);
- const remainingNumbers = remainingWorlds.map(el => getWorldNumber(el)).filter(n => n !== null);
- console.log(`[⚡] Worlds reordered! Priority: [${orderedNumbers.join(', ')}], Others: [${remainingNumbers.join(', ')}]`);
- return true;
- }
- return false;
- } finally {
- isProcessing = false;
- }
- }
- function instantArrangeWorlds() {
- requestAnimationFrame(() => {
- arrangeWorldsInOrder();
- });
- }
- const observer = new MutationObserver((mutations) => {
- let shouldCheck = false;
- for (const mutation of mutations) {
- if (mutation.type === 'childList') {
- for (const node of mutation.addedNodes) {
- if (node.nodeType === 1) {
- if (node.id === ALL_WORLDS_ID ||
- node.querySelector?.(`#${ALL_WORLDS_ID}`) ||
- node.id?.startsWith('world_') ||
- node.querySelector?.('[id^="world_"]') ||
- node.classList?.contains('worlds-row') ||
- node.classList?.contains('row-content')) {
- shouldCheck = true;
- break;
- }
- }
- }
- } else if (mutation.type === 'attributes') {
- const target = mutation.target;
- if (target.id === ALL_WORLDS_ID ||
- target.querySelector?.(`#${ALL_WORLDS_ID}`) ||
- (mutation.attributeName === 'style' && target.style?.display !== 'none')) {
- shouldCheck = true;
- }
- }
- if (shouldCheck) break;
- }
- if (shouldCheck) {
- instantArrangeWorlds();
- }
- });
- observer.observe(document.body, {
- childList: true,
- subtree: true,
- attributes: true,
- attributeFilter: ['style', 'class']
- });
- const events = ['click', 'keydown', 'focus', 'mousedown'];
- events.forEach(eventType => {
- document.addEventListener(eventType, (e) => {
- const target = e.target;
- if (target.closest?.('.menulink') ||
- target.closest?.('[data-menu]') ||
- target.closest?.('.ui-dialog') ||
- target.id?.includes('world') ||
- target.className?.includes('world')) {
- setTimeout(instantArrangeWorlds, 50);
- setTimeout(instantArrangeWorlds, 150);
- }
- }, true);
- });
- let checkCount = 0;
- const periodicCheck = () => {
- checkCount++;
- const allWorlds = document.getElementById(ALL_WORLDS_ID);
- if (allWorlds && allWorlds.offsetParent !== null) {
- const content = allWorlds.querySelector('.worlds-row h2')?.textContent?.includes(LUMILE_TALE_TEXT)
- ? allWorlds.querySelector('.worlds-row .row-content')
- : null;
- if (content) {
- const firstWorldElement = content.querySelector('[id^="world_"]');
- if (firstWorldElement) {
- const firstWorldNum = getWorldNumber(firstWorldElement);
- if (PREFERRED_ORDER.length > 0 &&
- (!PREFERRED_ORDER.includes(firstWorldNum) || firstWorldNum !== PREFERRED_ORDER[0])) {
- const hasPriorityWorlds = PREFERRED_ORDER.some(num =>
- content.querySelector(`#world_${num}`)
- );
- if (hasPriorityWorlds) {
- instantArrangeWorlds();
- }
- }
- }
- }
- }
- const delay = Math.min(100 + (checkCount * 10), 500);
- setTimeout(periodicCheck, delay);
- };
- function createCornerInputUI() {
- const wrapper = document.createElement('div');
- wrapper.style.position = 'fixed';
- wrapper.style.top = '10px';
- wrapper.style.right = '10px';
- wrapper.style.background = 'rgba(0,0,0,0.75)';
- wrapper.style.padding = '8px';
- wrapper.style.borderRadius = '6px';
- wrapper.style.zIndex = '9999';
- wrapper.style.fontSize = '12px';
- wrapper.style.color = 'white';
- wrapper.style.fontFamily = 'monospace';
- const label = document.createElement('label');
- label.textContent = 'World order:';
- label.style.marginRight = '4px';
- const input = document.createElement('input');
- input.type = 'text';
- input.value = PREFERRED_ORDER.join(', ');
- input.style.width = '160px';
- input.style.marginRight = '4px';
- input.style.borderRadius = '4px';
- input.style.border = 'none';
- input.style.padding = '2px 4px';
- const button = document.createElement('button');
- button.textContent = 'Save';
- button.style.cursor = 'pointer';
- button.style.border = 'none';
- button.style.padding = '2px 6px';
- button.style.borderRadius = '4px';
- button.style.background = '#4CAF50';
- button.style.color = 'white';
- button.onclick = () => {
- const newValue = input.value.trim();
- updatePreferredOrder(newValue);
- localStorage.setItem("preferredWorldOrder", JSON.stringify(PREFERRED_ORDER));
- instantArrangeWorlds();
- };
- wrapper.appendChild(label);
- wrapper.appendChild(input);
- wrapper.appendChild(button);
- document.body.appendChild(wrapper);
- }
- function updatePreferredOrder(input) {
- const list = input.split(',')
- .map(str => parseInt(str.trim(), 10))
- .filter(num => !isNaN(num));
- if (list.length > 0) {
- PREFERRED_ORDER = list;
- console.log(`[⚙️] Updated preferred world order: [${PREFERRED_ORDER.join(', ')}]`);
- } else {
- console.warn('[⚠️] Invalid input. Could not update world order.');
- }
- }
- function initialize() {
- console.log(`[⚡] Custom World Order script loaded! Priority order: [${PREFERRED_ORDER.join(', ')}]`);
- setTimeout(instantArrangeWorlds, 100);
- setTimeout(periodicCheck, 200);
- createCornerInputUI();
- let lastUrl = location.href;
- setInterval(() => {
- if (location.href !== lastUrl) {
- lastUrl = location.href;
- setTimeout(instantArrangeWorlds, 300);
- }
- }, 1000);
- }
- if (document.readyState === 'loading') {
- document.addEventListener('DOMContentLoaded', initialize);
- } else {
- initialize();
- }
- setTimeout(initialize, 50);
- })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址