GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 2225|回复: 50
收起左侧

[功能优化] 【油猴脚本】GM论坛勋章百宝箱 部分魔改

    [复制链接] |关注本帖

裸体克里斯圣甲虫秘典永远的克叔【新春限定】果体 隆生金蛋的鹅亚瑟‧摩根史莱姆牧场業火死鬥Forever Titanic自由

     楼主| 星之子 发表于 2024-11-8 14:31:21 | 显示全部楼层 |阅读模式 <
    本帖最后由 星之子 于 2024-11-8 15:12 编辑
    前言
    本魔改是基于 @咸鱼鱼 开发的 GM 这一插件编写的(原帖链接 油叉链接)。

    主要改动

    1. 在“保存勋章顺序”时指定名称,保存多个不同的方案,以便随时切换配装。
    这个功能有点像QQ秀/小花仙保存装扮的感觉,一键切换成另一套衣服。具体使用方法如下:
    ①保存顺序时可以任意指定名称,以“keyOrder_后缀”的形式储存到 localStorage。
    但一些过于刁钻的字符可能导致出错,这里没做测试(偷懒)。


    ②还原顺序时会弹出窗口。
    点击取消无事发生。对于已保存的方案:左键单击即进行排序;右键单击删除方案(会弹出窗口二次确认)。



    2. 保存顺序时,在“忽略列表”中的勋章默认排在末尾。

    上述列表中,第一行是不可续期的赠礼/咒术,第二行是可续期的。
    这个忽略列表可以依据个人喜好自行调整,比如把长得难看、不喜欢的勋章写进去等等。

    代码

    使用方法:请直接用下方代码,替换原脚本的 795 - 964 行。
    1. // 对照版本:GM论坛勋章百宝箱 2.1.1【数据库更新时间2024.11.04】
    2. // 使用方法:请用本段代码替换原来的 795 - 964 行
    3. // 勋章排序
    4. createLink('按照类型排序', kindOrder);

    5. // 忽略列表设置 将想要直接移动到保存顺序末尾的勋章(通常是赠礼或咒术类)按你想要的顺序排在这里即可
    6. const ignoreList = [
    7.     "遗忘之水", "萨赫的蛋糕", "神秘商店贵宾卡", "雷霆晶球", "吞食魂魄", "闪光糖果盒", "杀意人偶", "太空列车票", "水泡术", "霍格沃茨五日游", "送情书", "千杯不醉", "变骚喷雾", "丢肥皂", "茉香啤酒", "咆哮诅咒", "灵光补脑剂", "祈祷术", "没有梦想的咸鱼",
    8.     "思绪骤聚", "召唤古代战士", "炼金之心", "黑暗交易", "石肤术"];

    9. function kindOrder() {
    10.     // 获取所有匹配的元素
    11.     const elements = document.querySelectorAll('.my_fenlei .myblok');
    12.     const elementsArray = Array.from(elements);

    13.     // 使用 map 函数处理每个元素
    14.     const xunzhangList = elementsArray.map(myBlock => {
    15.         const key = myBlock.getAttribute('key');
    16.         const nameElement = myBlock.querySelector('p b'); // 找到包含名称的 <b> 标签
    17.         const name = nameElement ? nameElement.textContent : '';
    18.         return { [name]: key };
    19.     });

    20.     // 使用 reduce 合并字典
    21.     const mergedDict = xunzhangList.reduce((acc, curr) => {
    22.         return { ...acc, ...curr };
    23.     }, {});

    24.     // 填补未知的勋章
    25.     const mergedDictKey = Object.keys(mergedDict);
    26.     const allCategoriesData = Object.values(categoriesData).flat();
    27.     categoriesData.other = findUniqueValues(mergedDictKey, allCategoriesData);

    28.     function findUniqueValues(a, b) {
    29.         // 将数组 b 转换为一个 Set,以提高查找效率
    30.         const setB = new Set(b);

    31.         // 过滤出在 a 中且不在 b 中的值
    32.         const uniqueValues = a.filter(value => !setB.has(value));

    33.         return uniqueValues;
    34.     }

    35.     const previousInput = localStorage.getItem('sortInput') || orderList.join(' ');

    36.     // 弹出输入框,默认值为之前的内容
    37.     const userInput = prompt("您正在进行按类别排序,是否需要类别顺序?(用空格分隔):", previousInput);

    38.     // 如果用户输入了内容
    39.     if (userInput !== null) {
    40.         // 将输入的内容转换为数组并进行排序
    41.         const sortedArray = userInput.split(' ').map(item => item.trim());

    42.         // 验证用户输入的合理性,如果不全或者输入错误,就给他补全
    43.         // 过滤 userInput,保留在 orderList 中的项
    44.         const filteredInput = sortedArray.filter(item => orderList.includes(item));

    45.         // 找出 orderList 中缺失的元素
    46.         const missingItems = orderList.filter(item => !filteredInput.includes(item));

    47.         // 将 filteredInput 和 missingItems 合并,missingItems 加在最后
    48.         const resultInput = [...filteredInput, ...missingItems];

    49.         // 保存到 localStorage
    50.         localStorage.setItem('sortInput', resultInput.join(' '));

    51.         // 按类别拼接对应的Key
    52.         const order1 = sortedArray.map(e => categoriesData[linkList[e]]);
    53.         const order2 = [].concat(...order1);
    54.         const result = order2.map(key => mergedDict[key]).filter(value => value !== undefined);

    55.         postOrder(result);

    56.         // 输出排序后的结果
    57.         alert("排序后的结果:\n" + sortedArray.join(', '));
    58.     }
    59. }

    60. // 新增按钮保存/还原勋章顺序
    61. createLink('保存勋章顺序', saveKeysOrder);
    62. createLink('还原勋章顺序', showSchemeSelectionModal);

    63. // 保存勋章顺序
    64. function saveKeysOrder() {
    65.     const keys = getKeysFromDivs();
    66.     const filteredKeys = keys.filter(key => !ignoreList.includes(key)); // 过滤掉忽略列表中的勋章
    67.     const schemeName = prompt("请输入保存方案的名称");
    68.     if (schemeName) {
    69.         // 追加忽略列表到最后
    70.         const finalKeysOrder = [...filteredKeys, ...ignoreList];
    71.         saveArrayToLocalStorage(`keyOrder_${schemeName}`, finalKeysOrder);
    72.         //alert('保存成功');
    73.     }
    74. }

    75. // 显示方案选择窗口
    76. function showSchemeSelectionModal() {
    77.     const schemeNames = Object.keys(localStorage).filter(key => key.startsWith('keyOrder_')).map(key => key.replace('keyOrder_', ''));
    78.     const modal = document.createElement('div');
    79.     modal.classList.add('modal-scheme-selection');

    80.     const closeButton = document.createElement('button');
    81.     closeButton.textContent = '取消';
    82.     closeButton.classList.add('close-button');
    83.     closeButton.onclick = () => {
    84.         document.body.removeChild(modal);
    85.     };

    86.     // 先添加“取消”按钮
    87.     modal.appendChild(closeButton);

    88.     schemeNames.forEach(schemeName => {
    89.         const button = document.createElement('button');
    90.         button.textContent = schemeName;
    91.         button.classList.add('scheme-button');

    92.         // 左键单击还原
    93.         button.onclick = () => {
    94.             loadKeysOrder(schemeName);
    95.             document.body.removeChild(modal);
    96.         };

    97.         // 右键单击删除
    98.         button.oncontextmenu = (e) => {
    99.             e.preventDefault(); // 阻止默认右键菜单
    100.             if (confirm(`确定删除方案 "${schemeName}" 吗?`)) {
    101.                 removeArrayFromLocalStorage(`keyOrder_${schemeName}`);
    102.                 //alert(`方案 "${schemeName}" 已删除`);
    103.                 document.body.removeChild(modal); // 关闭窗口以刷新列表
    104.                 showSchemeSelectionModal(); // 重新显示更新后的方案列表
    105.             }
    106.         };

    107.         modal.appendChild(button);
    108.     });

    109.     document.body.appendChild(modal);
    110. }

    111. // 增加 CSS 样式
    112. const style = document.createElement('style');
    113. style.textContent = `
    114.     .modal-scheme-selection {
    115.         position: fixed;
    116.         top: 50%;
    117.         left: 50%;
    118.         transform: translate(-50%, -50%);
    119.         padding: 24px;
    120.         z-index: 1000;
    121.         border-radius: 10px;
    122.         background-color: #f3f3f3;
    123.     }
    124.     .scheme-button, .close-button {
    125.         background-color: transparent;
    126.         border: 0.125em solid #1A1A1A;
    127.         border-radius: 0.4em;
    128.         color: #3B3B3B;
    129.         font-size: 14px;
    130.         font-weight: 600;
    131.         margin: 0px 0.8em;
    132.         padding: 0.4em 1.2em;
    133.         text-align: center;
    134.         text-decoration: none;
    135.         cursor: pointer;
    136.         transition: all 300ms cubic-bezier(.23, 1, 0.32, 1);
    137.         font-family: Noto Sans SC, Microsoft Yahei, Arial, sans-serif;
    138.     }
    139.     .scheme-button:hover, .close-button:hover {
    140.         color: #fff;
    141.         background-color: #1A1A1A;
    142.         box-shadow: rgba(0, 0, 0, 0.25) 0 8px 15px;
    143.         transform: translateY(-2px);
    144.     }
    145.     .scheme-button:active, .close-button:active {
    146.         box-shadow: none;
    147.         transform: translateY(0);
    148.     }
    149. `;
    150. document.head.appendChild(style);

    151. // 获取所有具有指定类名的div元素
    152. function getKeysFromDivs() {
    153.     const divs = document.querySelectorAll(`div.myblok`);
    154.     const keys = Array.from(divs).map(div => div.querySelector('img').alt);
    155.     return keys;
    156. }

    157. // 从本地存储获取数组
    158. function getArrayFromLocalStorage(key) {
    159.     const storedArray = localStorage.getItem(key);
    160.     return storedArray ? JSON.parse(storedArray) : null;
    161. }

    162. // 从本地存储删除数组
    163. function removeArrayFromLocalStorage(key) {
    164.     localStorage.removeItem(key);
    165. }

    166. // 保存数组到本地存储
    167. function saveArrayToLocalStorage(key, array) {
    168.     localStorage.setItem(key, JSON.stringify(array));
    169. }

    170. // 还原勋章顺序
    171. function loadKeysOrder(schemeName) {
    172.     const keys = getArrayFromLocalStorage(`keyOrder_${schemeName}`);
    173.     if (!keys) {
    174.         alert(`未找到方案 "${schemeName}"`);
    175.         return;
    176.     }

    177.     const divs = document.querySelectorAll(`div.myblok`);
    178.     const array = Array.from(divs).map(div => {
    179.         return {
    180.             name: div.querySelector('img').alt,
    181.             key: div.getAttribute('key')
    182.         };
    183.     });

    184.     // 创建 name 到 key 的索引映射
    185.     const indexMap = {};
    186.     keys.forEach((value, index) => {
    187.         indexMap[value] = index + 1;
    188.     });

    189.     // 根据映射对 array 排序
    190.     array.sort((a, b) => {
    191.         return (indexMap[a.name] || Infinity) - (indexMap[b.name] || Infinity);
    192.     });

    193.     const orderKey = array.map(e => e.key);
    194.     postOrder(orderKey);
    195. }

    196. // 发送排序请求
    197. function postOrder(newOrder) {
    198.     const url = 'https://www.gamemale.com/plugin.php?id=wodexunzhang:showxunzhang';
    199.     const formData = new FormData();
    200.     const data = { newOrder, action: 'newOrder' };

    201.     for (const key in data) {
    202.         if (data.hasOwnProperty(key)) {
    203.             formData.append(key, data[key]);
    204.         }
    205.     }

    206.     fetch(url, {
    207.         method: 'POST',
    208.         body: formData,
    209.     })
    210.         .then(response => {
    211.             location.reload(); // 刷新页面
    212.             if (!response.ok) {
    213.                 throw new Error('Network response was not ok');
    214.             }
    215.         })
    216.         .then(data => {
    217.             console.log('Success:', data);
    218.         })
    219.         .catch(error => {
    220.             console.error('Error:', error);
    221.         });
    222. }
    复制代码

    求赞环节


    来自群组: 星象占卜

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    评分

    参与人数 14血液 +45 追随 +14 堕落 +8 收起 理由
    Hadley0T + 5 + 1 + 1 很给力!
    chisono7 + 1
    singto + 1 + 1
    Pshall4Cle + 1 + 1
    仿生人2778号 + 1 + 1
    Okabe + 2 + 1 很给力!
    折木 + 5 + 1 + 1 很给力!
    大零食主义 + 1 + 1 + 1 赞一个
    PURO_ + 1 + 1 不错!
    黑炭先森 + 1

    查看全部评分

    本帖被以下淘专辑推荐:

    回复

    使用道具 举报

    漂洋小船冒险用指南针破损的旧书人鱼之泪雪王的心脏苏格兰圆脸胖鸡[Pro Max]丛林的鸟飞走了不曾寄出的信件幽灵竹筒『随时随地开启!』

      凯诺斯 发表于 2024-11-8 14:41:19 | 显示全部楼层 <
      回复

      举报

      亚瑟‧摩根【新春限定】果体 隆真·天使之赐金钱马车黄金树的恩惠吃饱金币的Doge和你一起飞行的皮卡丘诺曼底号史莱姆牧场男巫之歌

        大河内太 发表于 2024-11-8 14:50:04 | 显示全部楼层 <
        回复

        举报

        GHOST神奇四叶草枕套幽灵

          折棒 发表于 2024-11-8 14:50:28 | 显示全部楼层 <
          回复

          举报

          真理世界【新春限定】果体 隆『不败之花』男巫之歌『逆境中的幸运女神』『冰雕马拉橇』巴比伦辞典金钱马车『召唤好运的角笛』史莱姆牧场

            紫漾Aro 发表于 2024-11-8 14:58:50 | 显示全部楼层 <
            回复

            举报

            实现梦想業火死鬥魔法不朽·传奇不熄卡洛斯·奥利维拉白野威十年一梦官复原职男巫之歌永浴爱河虚空之海的鲸

              Burry 发表于 2024-11-8 15:01:03 | 显示全部楼层 <
              回复

              举报

              森林鹿邦尼尼熔岩鹰不曾寄出的信件格拉迪欧拉斯小丑与格雷与星光璀璨御医神兔月光骑士最终幻想XVI

                随心110 发表于 2024-11-8 15:35:03 | 显示全部楼层 <
                回复

                举报

                猩红魔鹫裸体克里斯永远的克叔【圣诞限定】心心念念小雪人极·龙の意史莱姆牧场组成家庭我的天使男巫之歌

                  亚洛斯 发表于 2024-11-8 15:36:52 | 显示全部楼层 <
                  回复

                  举报

                  萨赫的蛋糕史莱哲林福卡·锰紫[1]福卡·澄黄[8]福卡·曙红[2]新春福袋【圣诞限定】心心念念小雪人虚空之海的鲸吃饱金币的Doge黑曜石赤螯蝎

                    cinder 发表于 2024-11-8 15:47:52 | 显示全部楼层 <
                    回复

                    举报

                    黄粱一梦死灵之书【新春限定】果体 隆百鬼夜行永远的克叔業火死鬥实现梦想官复原职虚空之海的鲸Zootopia

                      娱乐法师火布偶 发表于 2024-11-8 16:01:51 | 显示全部楼层 <
                      回复

                      举报

                      杰西·麦克雷莱因哈特·威尔海姆新春福袋Hank - 重逢禽兽扒手森林羊男约翰-117大黄蜂(ChevroletCamaro)

                        kimidave 发表于 2024-11-8 16:05:19 | 显示全部楼层 <
                        好细心的功能,用心了,可惜我现在勋章很少呢,不过总有一天用得上先码住啦
                        回复

                        举报

                        和你一起飞行的皮卡丘吃饱金币的Doge官复原职实现梦想冰原史莱姆牧场丹妮莉丝·坦格利安妙手空空骑兽之子不朽之恋

                          2297988 发表于 2024-11-8 16:10:03 | 显示全部楼层 <
                          回复

                          举报

                          诺曼底号和你一起飞行的皮卡丘『落樱缤纷』枕套幽灵诺克提斯·路西斯·伽拉姆巴哈姆特卡利亚权杖时间尽头的虚空『冰雕马拉橇』无瑕的回忆

                            2674820557 发表于 2024-11-8 16:35:38 | 显示全部楼层 <
                            回复

                            举报

                            人鱼之泪吃饱金币的Doge和你一起飞行的皮卡丘丹雀衔五穗,人间始丰登寶可夢 Pokémon崩朽之青铜龙王『冰雕马拉橇』金牌矿工岛田源氏杰西·麦克雷

                              PURO_ 发表于 2024-11-8 16:36:37 | 显示全部楼层 <
                              这个脚本适合勋章多的人使用,而且原脚本有过了勋章统计这对俺来说已经够用了
                              回复

                              举报

                              阿怪GHOST裸体克里斯【圣诞限定】心心念念小雪人【夏日限定】夏日的泰凯斯史莱姆牧场虚空之海的鲸遗留之人的城堡

                                前方无怪 发表于 2024-11-8 16:38:25 | 显示全部楼层 <
                                启动!超级形态!一键变装!这下可以每次不用花大把力气在整理排列美观上了!
                                回复

                                举报

                                20x43 隐形➀吃饱金币的Doge冒险用指南针金牌矿工小小安全帽小小舞台阿拉喵?神灯图腾饼干『梦旅存根』

                                  不是卖萌的基佬 发表于 2024-11-8 16:46:32 | 显示全部楼层 <
                                  回复

                                  举报

                                  BIG BOSS肥皂铁牛吃饱金币的Doge亚瑟‧摩根妙手空空杰夫‧莫罗艾吉奥自由

                                    提尔特 发表于 2024-11-8 16:56:10 | 显示全部楼层 <
                                    回复

                                    举报

                                    未散的宴席20x43 隐形➀爬行植物Ⓛ『泥潭颂唱者』爬行植物Ⓡ不朽之恋缘起星空虚空之海的鲸卡利亚权杖

                                      Riverlethe 发表于 2024-11-8 17:02:16 | 显示全部楼层 <
                                      回复

                                      举报

                                      史莱哲林收到情书变骚喷雾千杯不醉捡到了肥皂我的天使GM吸血伯爵吃饱金币的Doge阿拉喵?神灯苏格兰圆脸胖鸡

                                        毛茸茸兽兽 发表于 2024-11-8 17:57:01 | 显示全部楼层 <
                                        看到有个奇奇怪怪的命名诶(´×ω×`)
                                        挺方便一键切换金币向或血液向之类的排名哇
                                        回复

                                        举报

                                        【圣诞限定】心心念念小雪人吃饱金币的Doge被释放的灵魂【新春限定】果体 隆不朽之恋業火死鬥男巫之歌虚空之海的鲸卡利亚权杖

                                          折木 发表于 2024-11-8 18:51:10 | 显示全部楼层 <
                                          回复

                                          举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          关闭

                                          站长公告上一条 1/2 下一条

                                          【维护论坛环境从你我做起】
                                          【维护论坛环境从你我做起】
                                          论坛从即日起全面禁止任何挂人行为,如有出现将会直接删除。请大家自觉维护论坛环境,遵守论坛秩序,营造一个良好的论坛环境。如有疑问可以私信相关板块的管理/超版/坛花

                                          查看 »

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2025-1-31 15:20 , Processed in 0.179968 second(s), 144 queries , Redis On.

                                          Copyright © 2013-2025 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表