wsmud_funny

武神传说脚本,内置了许多小功能。

目前为 2019-05-01 提交的版本。查看 最新版本

// ==UserScript==
// @name        wsmud_funny
// @namespace   suqing.fun
// @version     0.3.13.test
// @author      SuQing
// @match       http://*.wsmud.com/*
// @homepage    https://gf.qytechs.cn/zh-CN/scripts/380709
// @description 武神传说脚本,内置了许多小功能。
// @run-at      document-start
// @require     http://code.jquery.com/jquery-3.3.1.min.js
// @grant       unsafeWindow
// @grant       GM_addStyle
// @grant       GM_setValue
// @grant       GM_deleteValue
// @grant       GM_getValue
// @grant       GM_setClipboard
// ==/UserScript==

(function() {
    "use strict";

    let wsmud = {
        name: GM_info.script.name,
        version: GM_info.script.version,
        isMoblie: false,
        state: {},

        id: null,
        title: {name: "武神传说", state: " Mud"},
        roles: {},
        room: {name: "a-b(c)", map: "a", room: "n", path: ""},
        items: [], //房间的玩家/NPC/尸体/物品
        skills: {},

        role: {},
        pack: {"items": [], "pick": {}, "eqs": [], "money": "", max: 0},

        settings: {
            layout_left_right: true,
            needTimeStr: false,
        },

        webSocket: null,
        send: function(message) {
            let event = null;
            wsmud.listener["send"].forEach(fn => {
                if (fn(event, message)) {
                    wsmud.webSocket.send(message);
                }
            });
        },
        fn_onopen: null,
        onopen: function() {
            if (wsmud.id) {
                wsmud.title.state = "<已连接>";
                RefreshTitle();
            }
            wsmud.fn_onopen.apply(this, arguments);
        },
        fn_onclose: null,
        onclose: function() {
            if (wsmud.id) {
                wsmud.title.state = "<已离线>";
                RefreshTitle();
            }
            wsmud.fn_onclose.apply(this, arguments);
        },
        fn_onmessage: null,
        onmessage: function(event) {
            let message = Str2Obj(event.data);
            console.log(message);
            let type = message.type || "";
            if (type === "dialog") {
                type = message.dialog || "";
            }
            let listeners = wsmud.listener[type];
            if (listeners instanceof Array && listeners.length > 0) {
                for (let i = 0; i < listeners.length; i++) {
                    let fn = listeners[i];
                    if (fn(event, message)) {
                        if (i < listeners.length - 1) continue;
                        wsmud.fn_onmessage.apply(this, arguments);
                    } else {
                        break;
                    }
                }
                // listeners.forEach(fn => { // });
            } else {
                wsmud.fn_onmessage.apply(this, arguments);
            }
        },
        listener: {"": [], "send": []}
    };

    let commands = {
        "扬州城": {
            "回宅修炼": ["jh fam 0 start", "go west", "go west", "go north", "go enter", "go west", "xiulian"],
            "回宅打坐": ["jh fam 0 start", "go west", "go west", "go north", "go enter", "go west", "dazuo"],
            "武庙疗伤": ["jh fam 0 start", "go north", "go north", "go west", "liaoshang"],
            "当铺清包": ["jh fam 0 start", "go south", "go east"],
        },
        "小号常用": {
            "挖矿": "wakuang",
            "送给配偶99朵玫瑰": "greet 99",
            "向师傅请安": "greet master",
        }


    };







    if (!/test/.test(wsmud.version)) {
        console.log = (target) => {
            return;
        };
    }

    if (navigator.userAgent) {
        let agent = navigator.userAgent.toLowerCase();
        if (/ipad|iphone|android|mobile/.test(agent)) {
            wsmud.isMoblie = true;
        }
        console.log(agent);
    }

    if (WebSocket) {
        wsmud.state = {"state": 1, "message": "wsmud_funny 加载成功!"};
        unsafeWindow.WebSocket = function(uri) {
            wsmud.webSocket = new WebSocket(uri);
        };
        unsafeWindow.WebSocket.prototype = {
            get url() {
                return wsmud.webSocket.url;
            },
            get protocol() {
                return wsmud.webSocket.protocol;
            },
            get readyState() {
                return wsmud.webSocket.readyState;
            },
            get bufferedAmount() {
                return wsmud.webSocket.bufferedAmount;
            },
            get extensions() {
                return wsmud.webSocket.extensions;
            },
            get binaryType() {
                return wsmud.webSocket.binaryType;
            },
            set binaryType(type) {
                wsmud.webSocket.binaryType = type;
            },
            get onerror() {
                return wsmud.webSocket.onerror;
            },
            set onerror(fn) {
                wsmud.webSocket.onerror = fn;
            },
            get onopen() {
                return wsmud.webSocket.onopen;
            },
            set onopen(fn) {
                wsmud.fn_onopen = fn;
                wsmud.webSocket.onopen = wsmud.onopen;
            },
            get onclose() {
                return wsmud.webSocket.onclose;
            },
            set onclose(fn) {
                wsmud.fn_onclose = fn;
                wsmud.webSocket.onclose = wsmud.onclose;
            },
            close: function () {
                wsmud.webSocket.close();
            },
            get onmessage() {
                return wsmud.webSocket.onmessage;
            },
            set onmessage(fn) {
                wsmud.fn_onmessage = fn;
                wsmud.webSocket.onmessage = wsmud.onmessage;
            },
            send: function (command) {
                wsmud.send(command);
            },
        };
    } else {
        wsmud.state = {"state": 0, "message": "wsmud_funny 加载失败!"};
    }

    function Str2Obj(str) {
        if (str[0] === "{") {
            return (new Function("return " + str))();
        } else {
            return {
                "type": "text",
                "text": str
            };
        }
    }
    function DeepCopy(object) {
        let result = {};
        for (const key in object) {
            result[key] = (typeof object[key] === "object") ? DeepCopy(object[key]) : object[key];
        }
        return result;
    }
    function TimeStr() {
        let date = new Date();
        let str = date.toString().substr(16, 5);
        return str;
    }
    function AutoScroll(name) {
        if (name) {
            let scrollTop = $(name)[0].scrollTop;
            let scrollHeight = $(name)[0].scrollHeight;
            let height = Math.ceil($(name).height());
            console.log(`AutoScroll => scrollTop=${scrollTop} scrollHeight=${scrollHeight} height=${height}`);
            if (scrollTop < scrollHeight - height) {
                let add = (scrollHeight - height < 120) ? 1 : Math.ceil((scrollHeight - height) / 120);
                $(name)[0].scrollTop = scrollTop + add;
                setTimeout(function() {
                    AutoScroll(name);
                }, 1000/120);
            }
        }
    }

    function RefreshTitle() {
        $("head title").html(wsmud.title.name + wsmud.title.state);
    }
    function Money2Str(number) {
        if (number == 0 || isNaN(number)) return 0;
        let str = "" + number;
        let c = str.substring(str.length - 2, str.length);
        if (c && c!== "00") {
            c = c + "个<yel>铜板</yel>";
        } else c = "";
        let b = str.substring(str.length - 4, str.length - 2);
        if (b && b !== "00") {
            b = b + "两<wht>白银</wht>";
        } else b = "";
        let a = str.substring(0, str.length - 4);
        if (a) a = a + "两<hiy>黄金</hiy>";
        return "<hiw>" + a + b + c + "</hiw>";
    }
    function AddContent(element) {
        $(".content-message pre").append(element);
        AutoScroll(".content-message");
    }
    function SendCommand(command) {
        if (typeof command === "string") {
            wsmud.send(command);
        } else if (command instanceof Array) {
            let sum = 0, ms = 250;
            let wait = () => {return sum += ms};
            command.forEach(cmd => setTimeout(function() {
                wsmud.send(cmd);
            }, wait()));
        }
    }

    function AddListener(type, fn) {
        wsmud.listener[type] = wsmud.listener[type] || [];
        wsmud.listener[type].push(fn);
    }


    AddListener("send", function(event, message) {
        if (!wsmud.isMoblie) {
            $(".console").append(`<div> >> ${message}</div>`);
            AutoScroll(".console");
        }
        console.log(message);
        return true;
    });

    AddListener("roles", function(event, message) {
        if (message.roles && message.roles instanceof Array) {
            message.roles.forEach(role => {
                let id = role.id;
                let name = role.name;
                wsmud.roles[id] = name;
            });
        }
        return true;
    });
    AddListener("login", function(event, message) {
        if (message.id) {
            wsmud.id = message.id;
            wsmud.title.name = wsmud.roles[wsmud.id];
            wsmud.title.state = "<已登录(不可用)>";
            RefreshTitle();
        }
        return true;
    });

    AddListener("room", function(event, message) {
        if (message.name && message.path) {
            message.name = message.name.replace("(副本区域)", "");
            let array = message.name.match(/(.*)-(.*)/);
            wsmud.room.name = message.name;
            wsmud.room.map = array[1];
            wsmud.room.room = array[2];
            wsmud.room.path = message.path;
        }
        return true;
    });
    AddListener("room", function(event, message) {
        if (message.desc && (message.commands instanceof Array)) {
            let str = message.desc;
            if (/cmd/.test(str)) {
                str = str.replace("<hig>椅子</hig>", "椅子"); //新手教程椅子
                str = str.replace("<CMD cmd='look men'>门(men)<CMD>", "<cmd cmd='look men'>门</cmd>"); //兵营副本门
                str = str.replace(/\((.*)\)/g, "");
                let cmds = str.match(/<cmd cmd='([^']+)'>([^<]+)<\/cmd>/g);
                cmds.forEach(item => {
                    let x = item.match(/<cmd cmd='(.*)'>(.*)<\/cmd>/);
                    message.commands.unshift({
                        cmd: x[1],
                        name: x[2]
                    });
                });
            }
            message.desc = str.substr(0, 20) + "……";
            let cheat = DeepCopy(event);
            cheat.data = JSON.stringify(message);
            wsmud.fn_onmessage.apply(this, [cheat]);
            return false;
        }
        return true;
    });

    AddListener("exits", function(event, message) {
        if (message.items) {
            wsmud.exits = {};
            for (const key in message.items) {
                wsmud.exits[key] = message.items[key];
            }
        }
        return true;
    });

    AddListener("items", function(event, message) {
        if (message.items && message.items instanceof Array) {
            wsmud.items = [];
            message.items.forEach(item => {
                if (item === 0) {
                } else if (item.id && item.name && Object.entries(item).length === 2) {
                    if (/尸体/.test(item.name)) {
                        SendCommand("get all from " + item.id); //自动捡尸
                    } else {
                        SendCommand("get " + item.id); //自动拾取
                    }
                } else if (item.p !== 1) {
                    wsmud.items.push(item);
                }
            });
        }
        return true;
    });
    AddListener("items", function(event, message) {
        wsmud.items.forEach(item => {
            if (item.name === "当铺老板 唐楠") {
                SendCommand("sell all");
                SendCommand("list " + item.id);
            }
        });
        return true;
    });
    AddListener("itemadd", function(event, message) {
        if (message.p !== 1) {
            wsmud.items.push(message);
        }
        return true;
    });
    AddListener("itemremove", function(event, message) {
        if (message.id) {
            let index = wsmud.items.findIndex(item => {
                return item.id === message.id;
            });
            if (index !== -1) wsmud.items.splice(index, 1); //remove
        }
        return true;
    });

    AddListener("state", function(event, message) {
        if (message.state) {
            let str = message.state.replace("你正在", "");
            wsmud.title.state = "<" + str + ">";
        } else {
            wsmud.title.state = "<闲逛中>";
        }
        RefreshTitle();

        if (message.desc instanceof Array && message.desc.length > 0) {
            message.desc = []; //清空状态文本
            let cheat = DeepCopy(event);
            cheat.data = JSON.stringify(message);
            wsmud.fn_onmessage.apply(this, [cheat]);
            return false;
        } else {
            return true;
        }
    });
    AddListener("combat", function(event, message) {
        if (message.start === 1) {
            wsmud.title.state = "<战斗中>";
        } else if (message.end === 1) {
            wsmud.title.state = "<闲逛中>";
        }
        RefreshTitle();
        return true;
    });

    AddListener("die", function(event, message) {
        if (!message.relive) {
            AddContent(`<hiw>若不点击原地复活,则 10 秒后自动武庙复活。</hiw>\n`);
            let timer = setTimeout(() => SendCommand("relive"), 10000);
            AddContent(
                $(`<div class="item-commands" timer="${timer}"><span cmd="relive locale">原地复活</span></div>`)
                .click(function() {
                    let timer = $(this).attr("timer");
                    clearTimeout(timer);
                })
            );
        }
        return true;
    });

    AddListener("text", function(event, message) {
        if (/重新连线|欢迎登陆/.test(message.text)) {
            AddContent(message.text + "\n");
            AddContent(wsmud.name + " " + wsmud.version + " 苏轻祝您游戏愉快!\n");
            if (wsmud.version.includes("test")) AddContent("<hiw>当前测试版,如有问题可回退版本。\n</hiw>");
            if (wsmud.login === undefined) {
                wsmud.login = true;
                let ms = 0, add = 500;
                let wait =  function() {return ms += add};
                setTimeout(() => $("[command=score]").click(), wait());
                setTimeout(() => $("[for=1]").click(), wait());
                setTimeout(() => $("[command=pack]").click(), wait());
                setTimeout(() => $("[command=skills]").click(), wait());
                setTimeout(() => $(".dialog-close").click(), wait());
                if (!unsafeWindow.WG) {
                    setTimeout(() => $("[command=showtool]").click(), wait());
                    setTimeout(() => $("[command=showcombat]").click(), wait());
                }
            }
            return false;
        }
        return true;
    });
    AddListener("text", function(event, message) {
        if (/你获得了(.*)点经验,(.*)点潜能/.test(message.text)) {
            AddContent(message.text + "\n");
            let array = message.text.match(/获得了(.*)点经验,(.*)点潜能/);
            wsmud.jy = wsmud.jy ? (wsmud.jy + parseInt(array[1])) : parseInt(array[1]);
            wsmud.qn = wsmud.qn ? (wsmud.qn + parseInt(array[2])) : parseInt(array[2]);
            $(".remove_jy_qn").remove();
            AddContent(`<span class="remove_jy_qn">合计 => 经验:${wsmud.jy} 潜能:${wsmud.qn}\n</span>`);
            return false;
        }
        return true;
    });
    AddListener("text", function(event, message) {
        if (/看起来(.*)想杀死你/.test(message.text)) {
            let array = message.text.match(/看起来(.*)想杀死你/);
            AddContent(`<hir>${array[1]} => 开始攻击你!<hir>\n`);
            return false;
        } else if (/你对著(.*)喝道/.test(message.text)) {
            let array = message.text.match(/你对著(.*)喝道/);
            AddContent(`<hir>你 => 开始攻击${array[1]}!<hir>\n`);
            return false;
        } else if (/你扑向(.*)/.test(message.text)) {
            let array = message.text.match(/你扑向(.*)!/);
            AddContent(`<hir>你 => 开始攻击${array[1]}!<hir>\n`);
            return false;
        }
        return true;
    });
    AddListener("text", function(event, message) {
        if (/造成(.*)点/.test(message.text)) {
            let x = message.text.split(/.*造成<wht>|.*造成<hir>|<\/wht>点|<\/hir>点/);
            if (x[2]) {
                let y = x[2].split(/伤害|\(|</);
                if (y[0] === "暴击") {
                    AddContent(`${y[2]}受到<hir>${x[1]}</hir>点<hir>暴击伤害</hir>!\n`);
                } else {
                    AddContent(`${y[2]}受到<hiw>${x[1]}</hiw>点伤害!\n`);
                }
                return false;
            }
        }
        return true;
    });
    AddListener("text", function(event, message) {
        if (/你的最大内力增加了/.test(message.text)) {
            AddContent(message.text + "\n");
            let a = message.text.match(/你的最大内力增加了(.*)点。/);
            let n = parseInt(a[1]), max = parseInt(funny.role.max_mp), limit = parseInt(funny.role.limit_mp);
            let time = (limit - max) / (n * 6);
            let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
            $(".remove_dzsj").remove();
            AddContent(`<span class="remove_dzsj">当前内力: ${max}\n上限内力: ${limit}\n需要时间: ${timeString}\n</span>`);
        }
        return true;
    });
    AddListener("text", function(event, message) {
        if (/只留下一堆玄色石头/.test(message.text) && message.text.includes("你")) {
            let array = message.text.match(/只见(.*)发出一阵白光/);
            AddContent(`你分解了 => ${array[1]}\n`);
            return false;
        }
        return true;
    });
    AddListener("text", function(event, message) {
        if (/你轻声吟道/.test(message.text)) {
            return false;
        } else if (/你的(.*)等级提升了!/.test(message.text)) {
            return false;
        }
        return true;
    });
    // AddListener("text", function(event, message) {
    //     } else  else if (/无数花瓣夹杂着寒气/.test(text)) {
    //         let x = text.match(/无数花瓣夹杂着寒气将(.*)围起/);
    //         AddContent(`<him>太上忘情 => ${x[1]}</him>\n`);
    // });


    AddListener("msg", function(event, message) {
        if (wsmud.isMoblie) {
            return true;
        } else {
            let uid = message.uid;
            let content = message.content;
            let name = message.name ? message.name + ":" : "";
            let timeStr = wsmud.settings.needTimeStr ? "<hiw>" + TimeStr() + "</hiw>" : "";
            let look3 = function() {
                SendCommand("look3 " + $(this).attr("uid"));
            };
            if (message.ch === "chat") {
                let levels = ["<hic>闲聊</hic>", "<hic>闲聊</hic>", "<hic>闲聊</hic>", "<hiy>宗师</hiy>", "<hiz>武圣</hiz>", "<hio>武帝</hio>", "<hir>武神</hir>"];
                $(".chat").append($(`<hic uid="${uid}">【${levels[message.lv]}】${name}${content} ${timeStr}<br></hic>`).click(look3));
            } else if (message.ch === "fam") {
                $(".fam").append($(`<hiy uid="${uid}">【${message.fam}】${name}${content} ${timeStr}<br></hiy>`).click(look3));
            } else if (message.ch === "pty") {
                $(".pty").append($(`<hiz uid="${uid}">【帮派】${name}${content} ${timeStr}<br></hiz>`).click(look3));
            } else if (message.ch === "tm") {
                $(".tm").append(`<hig>【队伍】${name}${content} ${timeStr}<br></hig>`);
            } else if (message.ch === "es") {
                $(".es").append(`<hio>【${message.server}】${name}${content} ${timeStr}<br></hio>`);
            }
            AutoScroll("." + message.ch);
            setTimeout(() => $(".channel pre").html(""), 1000);
            return true;
        }
    });

    AddListener("msg", function(event, message) {
        if (wsmud.isMoblie) {
            return true;
        } else {
            if (message.ch === "rumor") {
                let content = message.content;
                if (/闭关修炼/.test(content)) {
                    let x = content.match(/武帝(.*)闭关修炼似有所悟,你随之受益获得了(.*)经验,(.*)潜能/);
                    $(".rumor").append("<him>【谣言】武帝<hio>" + x[1] + "</hio>出关奖励<hio>" + x[2] + "</hio>点。</him><br>");
                } else if (/战胜了/.test(content)) {
                    let x = content.match(/听说(.*)战胜了(.*)获得了(.*)称号!/);
                    $(".rumor").append("<him>【谣言】" + x[1] + "获得了" + x[3] + "称号!</him><br>");
                } else if (/郭大侠收到线报/.test(content)) {
                    $(".rumor").append("<him>【谣言】蒙古大军将会进攻襄阳!<wht>" + TimeStr() + "</wht></him><br>");
                } else if (/出现在/.test(content)) {
                    let x = content.match(/听说(.*)出现在(.*)-(.*)一带。/);
                    x[1] = "<hio>" + x[1] + "</hio>";
                    $(".rumor").append("<him>【谣言】" + x[1] + "出现在" + x[2] + x[3] + "!<wht>" + TimeStr() + "</wht></him><br>");
                } else {
                    $(".rumor").append("<him>【谣言】" + content + "</him><br>");
                }
                AutoScroll(".rumor");
            }
            $(".channel pre").html("");
            return true;
        }
    });
    AddListener("msg", function(event, message) {
        if (wsmud.isMoblie) {
            return true;
        } else {
            if (message.ch === "sys") {
                let content = message.content;
                if (/欢迎登录(不可用)|非法收益/.test(content)) return true;
                else if (/挖矿技巧/.test(content)) content = content.match(/(.*)捡到一本挖矿指南/)[1] + "使用了挖矿指南!";
                else if (/,望各路英雄鼎力相助/.test(content)) content = content.replace(",望各路英雄鼎力相助", "");
                else if (/蒙古大军挥军南下/.test(content)) content = content.replace("蒙古大军挥军南下,", "");
                else if (/蒙古大汗蒙哥出现在战场中央/.test(content)) content = "蒙古大汗蒙哥出现在战场中央!";
                else if (/蒙古可汗蒙哥被击杀于襄阳城下/.test(content)) content = content.replace("蒙古可汗蒙哥被击杀于襄阳城下,", "");
                $(".sys").append("<hir>【系统】" + content + "<wht> " + TimeStr() + "</wht></hir><br>");
                AutoScroll(".sys");
            }
            $(".channel pre").html("");
            return true;
        }
    });

    AddListener("tasks", function(event, message) {
        if (message.items) {
            let fb, qa, wd1, wd2, wd3, sm1, sm2, ym1, ym2, yb1, yb2;
            message.items.forEach(task => {
                if (task.state === 2) SendCommand("taskover " + task.id); //自动完成
                if (task.id === "signin") {
                    let a = task.desc.match(/师门任务:(.*),副本:<(.*)>(.*)\/20<(.*)>/);
                    let b = task.desc.match(/(.*)武道塔(.*),进度(.*)\/(.*)<(.*)>,<(.*)>(.*)首席请安。<(.*)>/);
                    (parseInt(a[3]) < 20) ? fb = `<hig>${a[3]}</hig>` : fb = a[3];
                    (parseInt(b[3]) < parseInt(b[4])) ? wd1 = `<hig>${b[3]}</hig>` : wd1 = b[3];
                    wd2 = b[4];
                    /可以重置/.test(b[2]) ? wd3 = "<hig>可以重置</hig>" : wd3 = "已经重置";
                    /已经/.test(b[7]) ? qa = "已经请安" : qa = "<hig>尚未请安</hig>";
                } else if (task.id === "sm") {
                    let a = task.desc.match(/目前完成(.*)\/20个,共连续完成(.*)个。/);
                    (parseInt(a[1]) < 20) ? sm1 = `<hig>${a[1]}</hig>` : sm1 = a[1];
                    sm2 = a[2];
                } else if (task.id === "yamen") {
                    let a = task.desc.match(/目前完成(.*)\/20个,共连续完成(.*)个。/);
                    (parseInt(a[1]) < 20) ? ym1 = `<hig>${a[1]}</hig>` : ym1 = a[1];
                    ym2 = a[2];
                } else if (task.id === "yunbiao") {
                    let a = task.desc.match(/本周完成(.*)\/20个,共连续完成(.*)个。/);
                    (parseInt(a[1]) < 20) ? yb1 = `<hig>${a[1]}</hig>` : yb1 = a[1];
                    yb2 = a[2];
                }
            });
            let html = `门派请安 => ${qa}\n武道之塔 => ${wd1}/${wd2} ${wd3}\n`;
            html += `日常副本 => ${fb}/20\n师门任务 => ${sm1}/20 ${sm2}连\n`;
            html += `衙门追捕 => ${ym1}/20 ${ym2}连\n每周运镖 => ${yb1}/20 ${yb2}连\n`;
            $(".remove_task").remove();
            AddContent(`<span class="remove_task">${html}<span>`);
        }
        return true;
    });

    AddListener("score", function(event, message) {
        for (const key in message) wsmud.role[key] = message[key];
        wsmud.role.name = wsmud.title.name;
        RefreshRole();
        return true;
    });

    AddListener("pack", function(event, message) {
        if (message.money) wsmud.pack.money = Money2Str(message.money);
        if (message.max_item_count) wsmud.pack.max = message.max_item_count;
        if (message.eqs) wsmud.pack.eqs = message.eqs;
        if (message.items) {
            wsmud.pack.items = message.items;
            wsmud.pack.items.forEach(item => {
                if (/养精丹|小箱子|朱果|潜灵果|背包扩充石|师门补给包/.test(item.name)) {
                    let cmd = [];
                    let count = item.count;
                    let zl = "use";
                    if (/<hig>养精丹<\/hig>/.test(item.name)) count = count > 10 ? 10 : count;
                    if (/小箱子|师门补给包/.test(item.name)) zl = "open";

                    for (let i = 0; i < count; i++) cmd.push(zl + " " + item.id);
                    AddContent(
                        $(`<div class="item-commands"></div>`).append(
                            $(`<span>快捷 ${zl} ${count} 次 => ${item.name}</span>`).click(() => SendCommand(cmd))
                        )
                    );
                }
            });
        }
        return true;
    });
    AddListener("pack", function(event, message) {
        if (/养精丹|朱果|潜灵果|背包扩充石/.test(message.name)) {
            let cmd = [];
            let count = message.count;
            let zl = "use";
            if (/<hig>养精丹<\/hig>/.test(message.name)) count = count > 10 ? 10 : count;
            for (let i = 0; i < count; i++) cmd.push(zl + " " + message.id);
            AddContent(
                $(`<div class="item-commands"></div>`).append(
                    $(`<span>快捷 ${zl} ${count} 次 => ${message.name}</span>`).click(() => SendCommand(cmd))
                )
            );
        }
        return true;
    });
    AddListener("pack", function(event, message) {
        if (!funny.isMoblie) {
            if (message.name) {
                let name = message.name;
                if (name.includes("wht")) return true;

                let pick = wsmud.pack.pick;
                let count = message.count;
                if (pick[name]) {
                    if (pick[name].count < count) {
                        pick[name].add += (count - pick[name].count);
                        pick[name].count = count;
                    } else {
                        pick[name].count += count;
                        pick[name].add += count;
                    }
                } else {
                    let array = wsmud.pack.items;
                    let sum = 0;
                    for (let i = 0; i < array.length; i++) {
                        let item = array[i];
                        if (item.name === name) {
                            sum += item.count;
                        }
                    }
                    if (sum < count) {
                        pick[name] = {count: count, add: count - sum};
                    } else {
                        pick[name] = {count: sum + count, add: count};
                    }
                }

                let nameStr = message.name.replace(/<|>|\//g, "");
                let remove = "remove_pick_" + nameStr;
                let html = `${message.name} => 累计获得${pick[name].add}${message.unit} => 共有${pick[name].count}${message.unit}`;
                $("." + remove).remove();
                $(".channel-pick").append(`<span class="${remove}">${html}<br></span>`);
                AutoScroll(".channel-pick");
            }
        }
        return true;
    });
    AddListener("pack", function(event, message) {
        if (typeof message.eq === "number") {
            let index = message.eq;
            let itemIndex = wsmud.pack.items.findIndex(item => {
                return item.id === message.id;
            });
            let eq = DeepCopy(wsmud.pack.items[itemIndex]);
            wsmud.pack.eqs[index] = eq;
            wsmud.pack.items.splice(itemIndex, 1);
        }
        if (typeof message.uneq === "number") {
            let index = message.uneq;
            let item = DeepCopy(wsmud.pack.eqs[index]);
            item.count = 1;
            wsmud.pack.items.push(item);
            wsmud.pack.eqs[index] = null;
        }
        RefreshPack();
        RefreshEq();
        return true;
    });

    // {type: "dialog", dialog: "pack", id: "c7mj3f552d3", eq: 3}

    AddListener("skills", function(event, message) {
        if (message.limit) wsmud.role.skill_limit = parseInt(message.limit);
        if (message.items) {
            message.items.forEach(item => {
                wsmud.skills[item.id] = item;
                let color = ["wht", "hig", "hic", "hiy", "hiz", "hio", "hir"];
                for (let i = 0; i < color.length; i++) {
                    if (item.name.includes(color[i])) {
                        wsmud.skills[item.id].color = i + 1;
                        break; // => 白1 .. 橙6 红7
                    }
                }
            });
        }
        return true;
    });
    AddListener("skills", function(event, message) {
        if (message.id && message.exp && wsmud.skills) {
            let skill = wsmud.skills[message.id];
            if (skill) {
                if (message.level) {
                    skill.level = message.level;
                    AddContent(`${skill.name} => 提升到${skill.level}级!\n`);
                }
                let limit = wsmud.role.skill_limit,
                study_per = parseInt(wsmud.role.study_per),
               lianxi_per = parseInt(wsmud.role.lianxi_per),
                      int = parseInt(wsmud.role.int),
                  int_add = parseInt(wsmud.role.int_add),
                    level = parseInt(skill.level),
                        k = skill.color * 2.5; // k 系数 => 白2.5/../橙15/红17.5

                let qn = (limit * limit - level * level) * k;
                if (wsmud.title.state.includes("练习技能")) {
                    let time = qn / (int + int_add) / (1 + lianxi_per / 100 - int / 100) / (60 / 5);
                    let timeStr = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
                    //练习每一跳的消耗公式=(先天悟性+后天悟性)×(1+练习效率%-先天悟性%)
                    let cost = parseInt(qn / time / 12);
                    wsmud.role.lianxi_cost = cost;
                    AddContent(`练习${skill.name}消耗了${cost}点潜能。\n`);
                    $(".remove_lxsj").remove();
                    AddContent(`<span class="remove_lxsj">角色悟性: ${int}+${int_add}\n练习效率: ${lianxi_per}%\n等级上限: ${limit}级\n需要潜能: ${qn}\n需要时间: ${timeStr}\n</span>`);
                } else if (wsmud.title.state.includes("学习")) {
                    //学习每一跳的消耗公式=(先天悟性+后天悟性)×(1+学习效率%-先天悟性%)×3
                    let cost = parseInt((int + int_add) * (1 + study_per / 100 - int / 100) * 3);
                    wsmud.role.study_cost = cost;
                    AddContent(`学习${skill.name}消耗了${parseInt(cost)}点潜能。\n`);
                }
            }
        }
        return true;
    });
    AddListener("skills", function(event, message) {
        if (message.enable && message.id) {//装备上一个技能
            wsmud.skills[message.id].enable_skill = message.enable;
        }
        if (message.item) {//新学会技能
            let id = message.item.id;
            wsmud.skills[id] = message.item;
        }
        RefreshSkill();
        return true;
    });
    AddListener("", function(event, message) {
        return true;
    });
    AddListener("", function(event, message) {
        return true;
    });
    AddListener("", function(event, message) {
        return true;
    });


    function RefreshRole() {
        for (const key in funny.role) {
            $(".role_" + key).html(wsmud.role[key]);
        }
    }
    function RefreshSkill() {
        $(".left-skill-list").html(""); //Clear
        let base = ["unarmed", "force", "parry", "dodge", "sword", "blade", "club", "staff", "whip", "throwing", "literate", "lianyao"];
        let skills = wsmud.skills;
        base.forEach(id => {
            if (skills[id]) {
                let name = skills[id].name, level = skills[id].level, exp = skills[id].exp, enable = "";
                if (skills[id].enable_skill) enable = " 已装备:" +skills[skills[id].enable_skill].name;
                $(".left-skill-list").append(`<div class="skill-line">
                    <span class="skill-line-name">${name}${enable}</span>
                    <span class="skill-line-level">${id} ${level}级</span>
                <div>`);
            }
        });

        let skillArray = [];
        for (const id in skills) if (!base.includes(id)) skillArray.push(skills[id]);
        skillArray.sort((a, b) => {
            if (b.level === a.level) return b.color - a.color;
            else return b.level - a.level;
        });

        skillArray.forEach(skill => {
            let enables = skill.can_enables;
            let str = "enable";
            enables.forEach(enable => str = str + "," + enable);

            $(".left-skill-list").append(
                $(`<div class="skill-line" enable="${str}">
                <span class="skill-line-name">${skill.name}</span><span class="skill-line-level">${skill.id} ${skill.level}级</span>
                <div>`).click(function() {
                    let enables = $(this).attr("enable");
                    let x = enables.split(",");
                    x.splice(0, 1);
                    $(this).after(`<div class="item-commands enable_${skill.id}"></div>`);
                    $(this).removeAttr("enable");
                    setTimeout(() => {
                        $(`.enable_${skill.id}`).remove();
                        $(this).attr("enable", enables);
                    }, 5000);

                    x.forEach(enable => {
                        $(`.enable_${skill.id}`).append(
                            $(`<span>装备${wsmud.skills[enable].name}</span>`)
                            .click(() => SendCommand("enable " + enable + " " + skill.id))
                        );
                    });
                    $(`.enable_${skill.id}`).append(
                        $(`<span>练习</span>`).click(() => SendCommand("lianxi " + skill.id))
                    );
                })
            );
        });
        RefreshEq();
    }
    function RefreshPack() {
        // $(".left-pack-list");
        let itemArray = wsmud.pack.items;
        $(".left-pack-list").html("");
        itemArray.forEach(item => {
            let id = item.id;
            let name = item.name;
            let unit = item.unit;
            let count = item.count;
            let value = Money2Str(item.value);
            if (value === 0) value = "<small>不可出售</small>";
            else value = `<small>每${unit}价值${value}</small>`;

            $(".left-pack-list").append(
                $(`<div class="pack-line">
                <span class="pack-line-name">${name}</span>
                <span class="pack-line-count">${value} 共${count}${unit}</span>
                </div>`)
            );
        });
    }
    function RefreshEq() {
        let eqArray = wsmud.pack.eqs;
        let nameArray = ["武器", "衣服", "鞋子", "头饰", "披风", "戒指", "项链", "饰品", "护腕", "腰带", "暗器"];
        $(".left-eq-list").html("");
        for (let i = 0; i < nameArray.length; i++) {
            let html = nameArray[i] + ":";
            if (eqArray[i] && eqArray[i].name) {
                html += eqArray[i].name;
            }
            $(".left-eq-list").append(
                $(`<div class="eq-line">${html}</div>`)
            );
        }
    }


    $(document).ready(function() {
        GM_addStyle(`.content-bottom {
            -webkit-user-select: none;
            -moz-user-select: none;
            -ms-user-select: none;
        }`);
        if (wsmud.isMoblie) return;
        $(".signinfo").addClass("hide");
        $(".room_items")[0].style.maxHeight = "240px";
        $(".state-bar")[0].style.overflow = "hidden";
        $(".combat-commands")[0].style.overflow = "hidden";
        $(".dialog-content")[0].style.overflowX = "hidden";
        GM_addStyle(`
        .channel{ display: none; }
        .room-item > .item-name { margin-left: 14px; }

        body { width: 100%; display: flex; flex-flow: row nowrap; }
        .left { order: -1; }
        .right { order: 1; }
        .left, .right { width: 370px; height: 100%; display: flex; flex: 0 0 auto; margin: 0 10px 0 10px; flex-flow: column nowrap; }
        .container, .login-content { width: 450px; flex: 1 0 auto; margin: 0; }

        .left-nav { flex: 0 0 auto; text-align: center; }

        .left-role { flex: 0 0 auto; }

        .left-skill { flex: 1 0 auto; height: auto; display: flex; flex-flow: column nowrap; }
            .left-skill-list { height: 480px; flex: 1 1 auto; line-height: 24px; padding: 10px 5px 0 5px; overflow: auto; border: gray solid 1px; }
                .skill-line { display: flex; padding: 2px 0 2px 0; border-top: #343434 solid 1px; }
                .skill-line-name { flex: 1 0 auto; }
                .skill-line-level { flex: 0 0 auto; }
            .left-eq { height: 245px; flex: 0 0 auto; display: flex; flex-flow: row nowrap; margin: 10px 0 10px 0; }
                .left-eq-list { width: 250px; flex: 0 0 auto; border: gray solid 1px; }
                .left-eq-change { width: 100px; flex: 1 1 auto; border: gray solid 1px; display: flex; flex-flow: column nowrap; margin-left: 10px; }
                .left-eq-change div { flex: 1 1 auto; text-align: center; padding-left: 5px; }
        .left-pack { flex: 1 0 auto; height: 500px; overflow: auto; }
            .left-skill-list { height: 480px; flex: 1 1 auto; line-height: 24px; padding: 10px 5px 0 5px; overflow: auto; }
                .pack-line { display: flex; padding: 2px 0 2px 0; border-top: #343434 solid 1px; }
                .pack-line-name { flex: 1 0 auto; }
                .pack-line-count { flex: 0 0 auto; }

        .left-hotkey { flex: 1 0 auto; height: 500px; display: flex; flex-flow: column nowrap; }
            .list-commands { flex: 0 1 auto; height: 1000px; border: gray solid 1px; padding-left: 5px; }
            .left-console { flex: 0 0 auto; height: 240px; overflow: auto; border: gray solid 1px; }
            .left-send { flex: 0 0 auto; height: auto; display: flex; }
            .left-send input { flex:1 0 auto; height: auto; background-color: gray; color: white; font-size: 16px; margin: 5px 10px 0 0; }

        .left-setting { }

        .left table { table-layout: fixed; border-collapse: collapse; margin: 0; }
        .left td { width: 88px; text-align: center; white-space: nowrap; border: #343434 solid 1px; }

        .msg { height: auto; overflow: auto; flex: 0 0 auto; font-size: 14px; line-height: 16px; max-height: 160px; }
        .chat { flex: 1 1 auto; max-height: 100%; }
        `);

        $("body").append(`<div class="left">
            <div class="left-nav item-commands"></div>
            <div class="left-role left-hide"></div>
            <div class="left-skill left-hide"></div>
            <div class="left-pack left-hide"></div>
            <div class="left-hotkey left-hide"></div>
            <div class="left-setting left-hide"></div>
        </div>`);
        $("body").append(`<div class="right">
            <div class="msg chat"></div>
            <div class="msg tm"></div>
            <div class="msg fam"></div>
            <div class="msg pty"></div>
            <div class="msg es"></div>
            <div class="msg sys rumor"></div>
            <div class="msg channel-pick"></div>
        </div>`);


        $(".left-role").append(`<table>
            <tr><td colspan="4" class="role_name">ROLE_NAME</td></tr>
            <tr><td>ID</td><td colspan="3" class="role_id"></td></tr>
            <tr><td>性别</td><td class="role_gender"></td><td>境界</td><td class="role_level"></td></tr>
            <tr><td>年龄</td><td colspan="3" class="role_age"></td></tr>
            <tr><td>经验</td><td colspan="3"><hig class="role_exp"></hig></td></tr>
            <tr><td>潜能</td><td colspan="3"><hig class="role_pot"></hig></td></tr>
            <tr><td>气血</td><td colspan="3"><span class="role_hp"></span>/<hic class="role_max_hp"></hic></td></tr>
            <tr><td>内力</td><td colspan="3"><span class="role_mp"></span>/<hic class="role_max_mp"></hic></td></tr>
            <tr><td>内力上限</td><td colspan="3"><hic class="role_limit_mp"></hic></td></tr>
            <tr>
                <td>臂力</td><td><hiy class="role_str"></hiy>+<span class="role_str_add"></span></td>
                <td>根骨</td><td><hiy class="role_con"></hiy>+<span class="role_con_add"></span></td>
            </tr>
            <tr>
                <td>身法</td><td><hiy class="role_dex"></hiy>+<span class="role_dex_add"></span></td>
                <td>悟性</td><td><hiy class="role_int"></hiy>+<span class="role_int_add"></span></td>
            </tr>
            <tr><td>攻击</td><td><hig class="role_gj"></hig></td><td>终伤</td><td><hig class="role_add_sh"></hig></td></tr>
            <tr><td>防御</td><td><hig class="role_fy"></hig></td><td>命中</td><td><hig class="role_mz"></hig></td></tr>
            <tr><td>招架</td><td><hig class="role_zj"></hig></td><td>躲闪</td><td><hig class="role_ds"></hig></td></tr>
            <tr><td>暴击</td><td><hig class="role_bj"></hig></td><td>攻速</td><td><hig class="role_gjsd"></hig></td></tr>
            <tr><td>门派</td><td><hic class="role_family"></hic></td><td>功绩</td><td><hic class="role_gongji"></hic></td></tr>
            <tr><td>忽视防御</td><td class="role_diff_fy"></td><td>伤害减免</td><td class="role_diff_sh"></td></tr>
                <tr><td>暴击伤害</td><td class="role_add_bj"></td><td>暴击抵抗</td><td class="role_diff_bj"></td></tr>
                <tr><td>增加忙乱</td><td class="role_busy"></td><td>忽视忙乱</td><td class="role_diff_busy"></td></tr>
                <tr><td>释放速度</td><td class="role_releasetime"></td><td>冷却速度</td><td class="role_distime"></td></tr>
                <tr><td>打坐效率</td><td class="role_dazuo_per"></td><td>内力减耗</td><td class="role_expend_mp"></td></tr>
                <tr><td>练习效率</td><td class="role_lianxi_per"></td><td>学习效率</td><td class="role_study_per"></td></tr>
        </table>`);
        $(".left-skill").append(`
        <div class="left-skill-list"></div>
        <div class="left-eq">
            <div class="left-eq-list"></div>
            <div class="left-eq-change">
                <div class="item-commands"><span class="save_eq" i="1">存配置壹</span><span class="load_eq" i="1">换配置壹</span></div>
                <div class="item-commands"><span class="save_eq" i="2">存配置贰</span><span class="load_eq" i="2">换配置贰</span></div>
                <div class="item-commands"><span class="save_eq" i="3">存配置叁</span><span class="load_eq" i="3">换配置叁</span></div>
            </div>
        </div>`);//技能
        $(".save_eq").click(function() {
            let i = $(this).attr("i");
            let key = wsmud.id + ".eq." + i;
            let cmd = [];
            let str = "<hir>以下配置被保存!</hio>\n";
            // wsmud.skills
            let base = ["unarmed", "force", "parry", "dodge", "sword", "blade", "club", "staff", "whip", "throwing"];
            let skills = wsmud.skills;
            base.forEach(id => {
                if (skills[id]) {
                    if (skills[id].enable_skill) {
                        cmd.push("enable " + id + " " + skills[id].enable_skill);
                        str += skills[skills[id].enable_skill].name + "\n";
                    }
                }
            });
            wsmud.pack.eqs.forEach(eq => {
                if (eq && eq.id) {
                    cmd.unshift("eq " + eq.id);
                    str += eq.name + "\n";
                }
            });
            AddContent(str);
            let value = JSON.stringify(cmd);
            localStorage.setItem(key, value);
        });
        $(".load_eq").click(function() {
            let i = $(this).attr("i");
            let key = wsmud.id + ".eq." + i;
            let value = localStorage.getItem(key);
            let cmd = JSON.parse(value);
            AddContent("<hir>加载配置!</hio>\n");
            SendCommand(cmd);
        });

        $(".left-pack").append(`<div class="left-pack-list"></div>`);//背包


        // $(`<div class="msg "></div>`).append(
        //     $(`<small>扬州城</small>`), $(`<br>`),
        //     $(``).click(() => SendCommand(commands["修炼"])),
        // )
        $(".left-hotkey").append(`
        <div class="list-commands"></div>
        <div class="left-console console"></div>
        <div class="left-send item-commands"></div>
        `);//指令


        for (const name in commands) {
            $(".list-commands").append(`<div class="item-commands ${name}"><small>${name}</small><br></div>`);
            for (const key in commands[name]) {
                $(`.${name}`).append(
                    $(`<span>${key}</span>`).click(() => SendCommand(commands[name][key]))
                );
            }
        }



        $(".left-send").append(
            $(`<input type="text" readonly onfocus="this.removeAttribute('readonly');" id="send_command">`)
            .keypress(function(key) {
                if (key.which == 13) $("#send_btn").click();
            }),
            $(`<span id="send_btn">发送</span>`).click(function() {
                let command = $("#send_command").val();
                if (command) {
                    $(".console").append(
                        $(`<div class="item-commands"> >> <span><hiy>${command}</hiy></span></div>`)
                        .click(() => SendCommand(command))
                    );
                    wsmud.send(command);
                    AutoScroll(".console");
                    $("#send_command").val("");
                }
            })
        );
        $(".left-setting").append(
            $(`<div class="item-commands"></div>`).append(
                $(`<small>频道消息清屏</small>`), $(`<br>`),
                $(`<span>世界</span>`).click(() => $(".chat").html("")),
                $(`<span>队伍</span>`).click(() => $(".tm").html("")),
                $(`<span>门派</span>`).click(() => $(".fam").html("")),
                $(`<span>全区</span>`).click(() => $(".es").html("")), $(`<br>`),
                $(`<span>帮派</span>`).click(() => $(".pty").html("")),
                $(`<span>系统</span>`).click(() => $(".sys").html("")),
                $(`<span>统计</span>`).click(() => $(".channel-pack").html("")),
                $(`<span>游戏</span>`).click(() => $(".content-message pre").html("")),
                $(`<br>`), $(`<small>左右边栏操作</small>`), $(`<br>`),
                $(`<span>左右交换</span>`).click(function() {
                    if (wsmud.layout_left_right) {
                        $(".left")[0].style.order = "1";
                        $(".right")[0].style.order = "-1";
                    } else {
                        $(".left")[0].style.order = "-1";
                        $(".right")[0].style.order = "1";
                    }
                    wsmud.layout_left_right = !wsmud.layout_left_right;
                }),
                $(`<span>隐藏功能栏</span>`).click(function() {
                    $(".left").hide();
                    $(".right").append(
                        $(`<div class="msg item-commands killleft"><span>恢复功能边栏</span></div>`).click(function() {
                            $(this).remove();
                            $(".left").show();
                        }),
                    );
                    $("[command=showtool]").click(function() {
                        $(".left").show();
                        $(".killleft").remove();
                    });
                }),
                $(`<span>隐藏聊天栏</span>`).click(function() {
                    let html = $(this).html();
                    if (html.includes("隐藏")) {
                        $(".right").hide();
                        $(this).html("恢复聊天边栏");
                    } else {
                        $(".right").show();
                        $(this).html("隐藏聊天边栏");
                    }
                }),
            ),
        );

        $(".left-nav").append(
            $(`<span show="left-role">角色</span>`).click(LeftShow).click(RefreshRole),
            $(`<span show="left-skill">技能</span>`).click(LeftShow).click(RefreshSkill),
            $(`<span show="left-pack">背包</span>`).click(LeftShow).click(RefreshPack),
            $(`<span show="left-hotkey">指令</span>`).click(LeftShow).click(() => AutoScroll(".console")).click(),
            $(`<span show="left-setting">设置</span>`).click(LeftShow),
        );
        function LeftShow() {
            $(".left-hide").hide();
            $("." + $(this).attr("show")).show();
        }
    });

    unsafeWindow.funny = wsmud;
    unsafeWindow.funny.SendCommand = SendCommand;
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址