wsmud_funny

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

当前为 2019-04-20 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        wsmud_funny
// @namespace   suqing
// @version     0.2.3
// @author      sq
// @match       http://www.wsmud.com/*
// @match       http://game.wsmud.com/*
// @homepage    https://greasyfork.org/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 funny = {
        version: GM_info.script.version,
        data: {},
        role: {},
        // skills: [],
        data_skill_limit: 0,
        data_login: 0,
        data_id: "12345678910",
        data_jy: 0,
        data_qn: 0,
        state: "data.state",
        data_autokill_xy: true,
        layout_left: true,
    };
    unsafeWindow.funny = funny;
    let fn = {
        send: function(message) {
            if (typeof message === "string") {
                sendmessage(message);
            } else if (message instanceof Array) {
                action(message);
                async function action(message) {
                    for (const m of message) (typeof m === "number") ? (await fn.sleep(m)) : sendmessage(m);
                }
            }
            function sendmessage(message) {
                $("#sendmessage").attr("cmd") ? $("#sendmessage").attr("cmd", message) : $(".container").append($(`<span id="sendmessage" cmd="${message}"><span>`));
                $("#sendmessage").click();
            }
        },
        sleep: function(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
        },
        scroll: function(name) {
            if (name === undefined) return;
            let a = $(name)[0].scrollTop,
                b = $(name)[0].scrollHeight,
                h = Math.ceil($(name).height()); // 向上取整
                // console.log(`fn.scroll => a=${a} b=${b} h=${h}`);
            if (a < b - h) {
                let add = (b - h < 120) ? 1 : Math.ceil((b - h) / 120);
                $(name)[0].scrollTop = a + add;
                setTimeout(`fn.scroll("${name}")`, 1000/120);
            }
        },
        deepCopy: function (object) {
            let result = {};
            for (const key in object) {
                result[key] = typeof object[key] === "object" ? fn.deepCopy(object[key]) : object[key];
            }
            return result;
        },
        getTime: function() {
            let date = new Date();
            let h = parseInt(date.getHours());
            let m = parseInt(date.getMinutes());
            h = h < 10 ? `0${h}` : `${h}`;
            m = m < 10 ? `0${m}` : `${m}`;
            return `${h}:${m}`;
        },
    };
    unsafeWindow.fn = fn;
    let listener = {
        onmessage: function(message) {
            let data = message.data;
            if (/{(.*)}/.test(data)) data = (new Function(`return ${data};`))();
            if (typeof data === "string") {
                listener.extends.text.forEach(fn => fn(message));
                return;
            } else if (typeof data === "object") {
                switch (data.type) {
                    case "roles":
                        funny.data.roles = data;
                        break;
                    case "login":
                        funny.data.id === data.id;
                        break;
                    case "dialog":
                        listener.extends.dialog.forEach(fn => fn(data));
                        break;
                    case "msg":
                        listener.extends.msg.forEach(fn => fn(data));
                        funny.onmessage_fn.apply(this, arguments);
                        $(".channel").html("");
                        return;
                    case "room":
                        listener.extends.room.forEach(fn => fn(message, data));
                        return;
                    case "exits":
                        break;
                    case "item":
                        break;
                    case "items":
                        break;
                    case "itemadd":
                        listener.extends.itemadd.forEach(fn => fn(data));
                        break;
                    case "itemremove":
                        break;
                    case "actions":
                        break;
                    case "addAction":
                        break;
                    case "state":
                        funny.state = data.state;
                        listener.extends.state.forEach(fn => fn(message, data));
                        return;
                    case "perform":
                        break;
                    case "status":
                        break;
                    case "combat":
                        break;
                    case "dispfm":
                        break;
                    case "sc":
                        break;
                    case "time":
                        break;
                    case "disobj":
                        // {type: "disobj", id: "9s0d3e59a38", time: 0, count: 1}
                        break;
                    default:
                        console.log(data);
                        break;
                }
            }
            funny.onmessage_fn.apply(this, arguments);
        },
        sendmessage: function(message) {
            funny.webSocket.send(message);
            $(".console").append(`<div> >> ${message}</div>`);
            fn.scroll(".console");
        },
        extends: {
            text: [],
            dialog: [],
            msg: [],
            room: [],
            state: [],
            itemadd: [],
        },
        addListener: function(type, fn) {
            listener.extends[type].push(fn);
        },
    };
    unsafeWindow.listener = listener;
    listener.addListener("text", function(message) {
        let data = message.data;
        // 一阵风吹去,纥石烈问倡的尸体已经不见了。
        if (/重新连线|欢迎登陆/.test(data)) {
            funny.data_login += 1;
            $(".content-message pre").append(`${data}\n`);
            if (funny.data_login === 1) {
                $(".content-message pre").append(`wsmud_funny ${funny.version} 苏轻祝您游戏愉快!\n`);
                getScore();
            }
            async function getScore() {
                $("[command=score]").click();
                await fn.sleep(100);
                $("[for=1]").click();
                await fn.sleep(100);
                $("[for=0]").click();
                await fn.sleep(100);
                $("[command=skills]").click();
                await fn.sleep(100);
                $("[command=pack]").click();
                await fn.sleep(100);
                $("[command=tasks]").click();
                await fn.sleep(100);
                $("[command=showcombat]").click(); // 点击动作
                await fn.sleep(100);
                $("[command=showtool]").click();   // 点击菜单
                await fn.sleep(1000);
                $(".dialog-close").click();
            };
        } else if (/你获得了(.*)点经验,(.*)点潜能/.test(data)) {
            funny.onmessage_fn.apply(this, arguments);
            let a = data.match(/你获得了(.*)点经验,(.*)点潜能/);
            funny.data_jy += parseInt(a[1]);
            funny.data_qn += parseInt(a[2]);
            $(".remove_data_jyqn").remove();
            $(".content-message pre").append(
                $(`<span class="remove_data_jyqn"></span>`)
                .append(`合计 => 经验:${funny.data_jy} 潜能:${funny.data_qn}\n`)
            );
        } else if (/你轻声吟道/.test(data)) {
        } else if (/看起来(.*)想杀死你/.test(data)) {
            let a = data.match(/看起来(.*)想杀死你!/);
            $(".content-message pre").append(`<hir>${a[1]} => 开始攻击你!<hir>\n`);
        } else if (/你对著(.*)喝道/.test(data)) {
            let a = data.match(/你对著(.*)喝道/);
            $(".content-message pre").append(`<hir>你 => 开始攻击${a[1]}!<hir>\n`);
        } else if (/你扑向(.*)/.test(data)) {
            let a = data.match(/你扑向(.*)!/);
            $(".content-message pre").append(`<hir>你 => 开始攻击${a[1]}!<hir>\n`);
        } else if (/造成(.*)点/.test(data)) {
            let a = data.split(/.*造成<wht>|.*造成<hir>|<\/wht>点|<\/hir>点/);
            let b = a[2].split(/伤害|\(|</);
            if (b[0] === "暴击") {
                $(".content-message pre").append(`${b[2]}受到<hir>${a[1]}</hir>点<hir>${b[0]}</hir>伤害!\n`);
            } else {
                $(".content-message pre").append(`${b[2]}受到<wht>${a[1]}</wht>点伤害!\n`);
            }
        } else if (/你的最大内力增加了/.test(data)) {
            funny.onmessage_fn.apply(this, arguments);
            let a = data.match(/你的最大内力增加了(.*)点。/);
            let n = parseInt(a[1]),
              max = parseInt(funny.role.max_mp),
            limit = parseInt(funny.role.limit_mp);
            let time = (limit - max) / (n * 6); // X分钟 => X小时X分钟
            let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
            $(".remove_dzsj").remove();
            $(".content-message pre").append(`<span class="remove_dzsj">当前内力: ${max}\n上限内力: ${limit}\n需要时间: ${timeString}\n</span>`);
        } else if (/无数花瓣夹杂着寒气/.test(data)) {
            let a = data.match(/无数花瓣夹杂着寒气将(.*)围起/);
            $(".content-message pre").append(`<him>「太上忘情」 => ${a[1]}(无法躲闪)</him>\n`);
        } else if (/数息后只留下一堆玄色石头/.test(data)) {
            let a = data.match(/只见(.*)发出一阵白光/);
            $(".content-message pre").append(`你分解了 => ${a[1]}\n`);
        } else {
            funny.onmessage_fn.apply(this, arguments);
            // console.log(data);
        }
        fn.scroll(".content-message");
    });
    listener.addListener("msg", function(data) {
        data.name = (data.name === "" || data.name === undefined) ? "" : `${data.name}:`;
        if (data.ch === "chat") {
            let levels = ["<hic>闲聊</hic>", "<hic>闲聊</hic>", "<hic>闲聊</hic>", "<hiy>宗师</hiy>", "<hiz>武圣</hiz>", "<hio>武帝</hio>", "<hir>武神</hir>"];
            $(".chat").append(
                $(`<span cmd="look3 ${data.uid}"><hic>【${levels[data.lv]}】${data.name}${data.content}</hic><br></span>`)
                .click(function() { fn.send(`${$(this).attr("cmd")}`); })
            );
        } else if (data.ch === "fam") {
            $(".fam").append(
                $(`<span cmd="look3 ${data.uid}"><hiy>【${data.fam}】${data.name}${data.content}</hiy><br></span>`)
                .click(function() { fn.send(`${$(this).attr("cmd")}`); })
            );
        } else if (data.ch === "pty") {
            $(".pty").append(
                $(`<span cmd="look3 ${data.uid}"><hiz>【帮派】${data.name}${data.content}</hiz><br></span>`)
                .click(function() { fn.send(`${$(this).attr("cmd")}`); })
            );
        } else if (data.ch === "tm") {
            $(".tm").append(`<hig>【队伍】${data.name}${data.content}</hig><br>`);
        } else if (data.ch === "es") {
            $(".es").append(`<hio>【${data.server}】${data.name}${data.content}</hio><br>`);
        } else if (data.ch === "rumor") {
            if (data.content.includes("闭关修炼")) {
                let a = data.content.match(/听说武帝(.*)闭关修炼似有所悟,你随之受益获得了(.*)经验,(.*)潜能/);
                $(".rumor").append(`<him>【谣言】武帝「${a[1]}」出关,奖励经验潜能${a[3]}点。</him><br>`);
            } else if (data.content.includes("听说郭大侠收到线报蒙古大军近日将会进攻襄阳")) {
                $(".rumor").append(`<him>【谣言】蒙古大军将会进攻襄阳! <wht>${fn.getTime()}</wht></him><br>`);
            } else if (data.content.includes("出现在")) {
                // 听说邀月出现在逍遥派-青草坪一带。
                let a = data.content.match(/听说(.*)出现在(.*)-(.*)一带。/);
                $(".rumor").append(`<him>【谣言】${a[1]}出现在${a[2]}${a[3]}! <wht>${fn.getTime()}</wht></him><br>`);
            } else {
                $(".rumor").append(`<him>【谣言】${data.content}</him><br>`);
            }
            // if (funny.data.id === "j9h729c52bc") fn.send("chat *好样的");
        } else if (data.ch === "sys") {
            if (/欢迎登录|非法收益/.test(data.content)) return;
            if (data.content.includes("挖矿技巧")) {
                let a = data.content.match(/(.*)捡到一本挖矿指南/);
                data.content = `${a[1]}使用了挖矿指南!`;
            }
            $(".sys").append(`<hir>【系统】${data.content} <wht>${fn.getTime()}</wht></hir><br>`);
        } else {
            console.log(data);
        }
        fn.scroll(`.${data.ch}`);
    });
    // tasks
    listener.addListener("dialog", function(data) {
        if (data.dialog === "tasks" && data.items) {
            let fb, qa, wd1, wd2, wd3, sm1, sm2, ym1, ym2, yb1, yb2;
            data.items.forEach(item => {
                if (item.state === 2) fn.send(`taskover ${item.id}`); // 自动完成
                if (item.id === "signin") {
                    let a = item.desc.match(/师门任务:(.*),副本:<(.*)>(.*)\/20<(.*)>/);
                    let b = item.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 (item.id === "sm") {
                    let a = item.desc.match(/目前完成(.*)\/20个,共连续完成(.*)个。/);
                    (parseInt(a[1]) < 20) ? sm1 = `<hig>${a[1]}</hig>` : sm1 = a[1];
                    sm2 = a[2];
                } else if (item.id === "yamen") {
                    let a = item.desc.match(/目前完成(.*)\/20个,共连续完成(.*)个。/);
                    (parseInt(a[1]) < 20) ? ym1 = `<hig>${a[1]}</hig>` : ym1 = a[1];
                    ym2 = a[2];
                } else if (item.id === "yunbiao") {
                    let a = item.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_tasks").remove();
            $(".content-message pre").append($(`<span class="remove_tasks"><span>`).html(html));
            fn.scroll(".content-message");
        }
    });
    // score
    listener.addListener("dialog", function(data) {
        if (data.dialog === "score") {
            for (const key in data) funny.role[key] = data[key];
            for (const key in funny.role) $(`.role_${key}`).html(funny.role[key]);
        }
    });
    // skills
    listener.addListener("dialog", function(data) {
        if (data.dialog === "skills") {
            if (data.items) {
                funny.skills = data.items;
                funny.data_skill_limit = parseInt(data.limit);
            } else if (data.id && data.level) { // 单个技能变动
                for (const skill of funny.skills) {
                    if (skill.id === data.id) {
                        skill.level = data.level;
                        break;
                    }
                }
            } else if (data.id && data.exp) {
                let name = "", k = 0, level = 0;
                let djsx = funny.data_skill_limit; // 上限
                let xxxl = parseInt(funny.role.study_per);   // 学习效率
                let lxxl = parseInt(funny.role.lianxi_per);  // 练习效率
                let xtwx = parseInt(funny.role.int);         // 先天悟性
                let htwx = parseInt(funny.role.int_add);     // 后天悟性
                if (funny.skills) {
                    for (const skill of funny.skills) {
                        if (skill.id === data.id) {
                            name = skill.name;
                            level = parseInt(skill.level);
                            if (/<wht>.*/.test(name)) k = 1; // 白
                            if (/<hig>.*/.test(name)) k = 2;
                            if (/<hic>.*/.test(name)) k = 3;
                            if (/<hiy>.*/.test(name)) k = 4;
                            if (/<hiz>.*/.test(name)) k = 5;
                            if (/<hio>.*/.test(name)) k = 6; // 橙
                            if (/<hir>.*/.test(name)) k = 7; // 红
                            break;
                        }
                    }
                }
                let qianneng = (djsx * djsx - level * level) * 2.5 * k;
                if (funny.state === "你正在练习技能") {
                    let time = qianneng / (xtwx + htwx) / (1 + lxxl / 100 - xtwx / 100) / 12;
                    let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
                    $(".remove_lx").remove();
                    // 练习每一跳的消耗公式=(先天悟性+后天悟性)×(1+练习效率%-先天悟性%)
                    $(".content-message pre").append(`练习${name}消耗了${parseInt(qianneng / time / 12)}点潜能。\n`);
                    $(".content-message pre").append(`<span class="remove_lx">角色悟性: ${xtwx}+${htwx}\n练习效率: ${lxxl}%\n等级上限: ${djsx}级\n需要潜能: ${qianneng}\n需要时间: ${timeString}\n</span>`);
                    fn.scroll(".content-message");
                }
            }
        }
    });
    // pack
    listener.addListener("dialog", function(data) {
        if (data.dialog === "pack") {
            funny.pack = funny.pack || {};
            funny.pack.money = data.money || funny.pack.money || 0;
            funny.pack.max = data.max_item_count || funny.pack.max || 0;
            funny.pack.items = data.items || funny.pack.items || [];
            funny.pack.eqs = data.eqs || funny.pack.eqs || [];
            console.log(funny.pack);

            if (data.name && !/wht/.test(data.name)) {
                funny.pack.total = funny.pack.total || {};
                funny.pack.total[data.name] ?
                (funny.pack.total[data.name] ++) : (funny.pack.total[data.name] = 1);
                let remove = "remove_pack_" + data.name.replace(/\/|<|>/g, "");
                $(`.${remove}`).remove();
                $(".channel-pack").append(`<span class="${remove}">统计 => ${data.name} => <wht>${funny.pack.total[data.name]}</wht><br></span>`);
                fn.scroll(".channel-pack");
            }

            // can_use: 1
            // count: 5
            // id: "u8ql3e4c184"
            // name: "<hig>突破丹</hig>"
            // unit: "粒"
            // value: 10000
            if (data.can_use == 1 && /养精丹|朱果|潜灵果/.test(data.name)) {
                let count = data.count > 10 ? 10 : data.count;
                let cmd = [];
                for (let i = 0; i < count; i ++) {
                    cmd.push(`use ${data.id}`);
                    cmd.push(500);
                }

                $(".content-message pre").append(
                    $(`<div class="item-commands"></div>`).append(
                        $(`<span>快捷使用${count}次 => ${data.name}</span>`).click(() => {
                            fn.send(cmd);
                        }),
                    ),
                );
            }

            // console.log(data);
            if (data.name) {
                if (/<hig>大宋(.*)<\/hig>|<hig>蒙古(.*)<\/hig>|<hig>笠子帽<\/hig>/.test(data.name)) {
                    fn.send(`fenjie ${data.id}`);
                } else {
                    console.log(data.name);
                }
            }
        }
    });

    listener.addListener("room", function(message, data) {
        if (/cmd cmd=/.test(data.desc)) {
            data.desc = data.desc.replace("<hig>椅子</hig>", "椅子");
            let a = data.desc.match(/<cmd cmd='([^']+)'>([^<]+)<\/cmd>/g);
            a.forEach(desc => data.desc = `<hic>${desc}</hic> ${data.desc}`);
            let mask = fn.deepCopy(message);
            mask.data = JSON.stringify(data);
            funny.onmessage_fn.apply(this, [mask]);
        } else {
            funny.onmessage_fn.apply(this, [message]);
        }
    });
    listener.addListener("state", function(message, data) {
        if (data.desc && data.desc.length > 0) {
            data.desc = [];
            let mask = fn.deepCopy(message);
            mask.data = JSON.stringify(data);
            funny.onmessage_fn.apply(this, [mask]);
        } else {
            funny.onmessage_fn.apply(this, [message]);
        }
    });

    listener.addListener("itemadd", function(data) {
        if (/蒙古兵|十夫长|百夫长|千夫长|万夫长/.test(data.name)) {
            if (data.id) fn.send(`kill ${data.id}`);
        }
    });



    if (WebSocket) {
        $(".console").append(`wsmud_funny ${funny.version} 加载成功!!!`);
        unsafeWindow.WebSocket = function(url) {
            funny.webSocket = new WebSocket(url);
        };
        unsafeWindow.WebSocket.prototype = {
            get url() {
                return funny.webSocket.url;
            },
            get protocol() {
                return funny.webSocket.protocol;
            },
            get readyState() {
                return funny.webSocket.readyState;
            },
            get bufferedAmount() {
                return funny.webSocket.bufferedAmount;
            },
            get extensions() {
                return funny.webSocket.extensions;
            },
            get binaryType() {
                return funny.webSocket.binaryType;
            },
            set binaryType(type) {
                funny.webSocket.binaryType = type;
            },
            get onerror() {
                return funny.webSocket.onerror;
            },
            set onerror(fn) {
                funny.webSocket.onerror = fn;
            },
            get onopen() {
                return funny.webSocket.onopen;
            },
            set onopen(fn) {
                funny.webSocket.onopen = fn;
            },
            get onclose() {
                return funny.webSocket.onclose;
            },
            set onclose(fn) {
                funny.webSocket.onclose = fn;
            },
            close: function () {
                funny.webSocket.close();
            },
            get onmessage() {
                return funny.webSocket.onmessage;
            },
            set onmessage(fn) {
                funny.onmessage_fn = fn;
                funny.webSocket.onmessage = listener.onmessage;
            },
            send: function (message) {
                listener.sendmessage(message);
            },
        };
    } else $(".console").append("脚本加载失败!!!");

    $(document).ready(function() {
        // mobile
        let agent = navigator.userAgent.toLowerCase();
        let isMobile = /ipad|iphone|android|mobile/.test(agent);
        if (isMobile) {
            console.log(agent);
            return;
        }
        // 样式优化
        $(".signinfo").addClass("hide");
        GM_addStyle(`.room_desc{overflow:hidden;white-space:nowrap;}`);
        GM_addStyle(`.channel{display:none;}`);
        GM_addStyle(`.content-bottom{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;}`);
        GM_addStyle(`.room-item>.item-name{margin-left:14px;}`);
        $(".room_items")[0].style.maxHeight = "240px";
        $(".state-bar")[0].style.overflow = "hidden";
        $(".combat-commands")[0].style.overflow = "hidden";
        $(".dialog-content")[0].style.overflowX = "hidden";
        // 三栏布局
        $("body").append($(`<div class="left box"></div>`));
        $("body").append($(`<div class="right box"></div>`));
        $(".container").addClass("box");
        $(".login-content").addClass("box");
        GM_addStyle(`body{width:100%;display:flex;flex-flow:row no-wrap;}`);
        GM_addStyle(`.box{width:360px;flex: 0 0 auto;}`);
        GM_addStyle(`.container,.login-content{flex:1 0 auto;}`);
        GM_addStyle(`.left{order:-1;} .right{order:1;}`);
        // 左边
        $(".left").append(
            $(`<div class="left-nav item-commands" style="text-align:center;margin-left:10px;"></div>`).append(
                $(`<span id="click_role">属性</span>`).click(function() {
                    $(".left-hide").hide();
                    $(".left-role").show();
                }),
                $(`<span>技能</span>`).click(function() {
                    layoutSkill();
                    $(".left-hide").hide();
                    $(".left-skill").show();
                }),
                $(`<span>背包</span>`).click(function() {
                    // layoutPack();
                    $(".left-hide").hide();
                    $(".left-pack").show();
                }),
                $(`<span>备用</span>`),
                $(`<span>备用</span>`),
            ),
            $(`<div class="left-role left-hide"></div>`).append(
                $(`<table></table>`).append(
                    $(`<tr></tr>`).append(`<td colspan="4"><hiy>角色信息</hiy></td>`),
                    $(`<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></tr>`).append(
                        $(`<td>气血</td>`), $(`<td colspan="3"><span class="role_hp"></span>/<hic class="role_max_hp"></hic></td>`),
                    ),
                    $(`<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>`)
                ),
            ),
            $(`<div class="left-skill left-hide"></div>`).append(
                $(`<table></table>`).append(
                    $(`<thead></thead>`).append(
                        $(`<tr><td colspan="3"><hiy>技能信息</hiy></td></tr>`),
                        $(`<tr><td>技能</td><td>代码</td><td>等级</td></tr>`),
                    ),
                    $(`<tbody></tbody>`),
                ),
            ),
            $(`<div class="left-pack left-hide"></div>`).append(
                $(`<table><thead><hiy>还没敲</hiy></thead><tbody></tbody></table>`),
            ),
            $(`<div class="left-console console"></div>`),
            $(`<div class="left-send item-commands"></div>`).append(
                $(`<input type="text" readonly onfocus="this.removeAttribute('readonly');" id="send_value">`)
                .keypress(function(key) {
                    if (key.which == 13) $("#send_btn").click();
                }),
                $(`<span id="send_btn">发送</span>`).click(function() {
                    let value = $("#send_value").val();
                    if (value) fn.send(value);
                    $("#send_value").val("");
                }),
            ),
        );


        GM_addStyle(`.left{display:flex;flex-direction:column;flex-wrap:nowrap;}`);
        GM_addStyle(`.left table{table-layout:fixed;border-collapse:collapse;margin:0 10px 0 10px;}`);
        GM_addStyle(`.left td{width:88px;text-align:center;white-space:nowrap;border:gray solid 1px;}`);

        GM_addStyle(`.left-role{flex: 0 0 auto;}`);
        GM_addStyle(`.left-skill{flex: 1 0 auto;height:500px;overflow:auto;}`);
        GM_addStyle(`.left-pack{flex: 1 0 auto;height:500px;overflow:auto;font-size:12px;}`);
        GM_addStyle(`.left-console{flex:1 0 auto;height:100px;overflow:auto;border:gray solid 1px;margin:10px 10px 0 10px}`);
        GM_addStyle(`.left-send{flex:0 0 auto;height:auto;display:flex;}`);

        GM_addStyle(`.left-send input{flex:1 0 auto;height:auto;background-color:gray;color:white;font-size:16px;margin:5px 10px 0 10px;}`);

        $(".left span")[0].click();
        function layoutSkill() {
            let array = funny.skills || [];
            array.sort((a, b) => {
                return (b.level - a.level);
            });
            array.forEach(skill => {
                $(".left-skill tbody").append(
                    $(`<tr></tr>`).append(
                        $(`<td></td>`).append(`${skill.name}`),
                        $(`<td></td>`).append(`${skill.id}`),
                        $(`<td></td>`).append(`${skill.level}`),
                    ),
                );
            });
        }
        function layoutPack() {
            let array = funny.pack.items || [];
            $(".left-pack tbody").append(
                $(`<tr></tr>`).append(
                    $(`<td colspan="3"></td>`).append(`<hiy>背包</hiy>`)
                ),
                $(`<tr><td>物品</td><td>指令</td></tr>`),
            )
            array.forEach(item => {
                
                $(".left-pack tbody").append(
                    $(`<tr></tr>`).append(
                        $(`<td></td>`).append(`${item.name}<br>${item.count} ${item.unit}`),
                        $(`<td class="item-commands"></td>`).append(
                            $(`<span>查看</span>`).click(function() {
                                fn.send(`checkobj ${item.id} from item`);
                            }),
                            item.can_combine ? $(`<span cmd="_confirm combine ${item.id} 10">合成</span>`) : $(),
                        ),
                    ),
                );
            });
        }





        // 右边
        $(".right").append(
            $(`<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 pickup channel-pack"></div>`),
            $(`<div class="msg item-commands"></div>`).append(
                $(`<span>切</span>`).click(function() {
                    if (funny.layout_left) {
                        $(".left")[0].style.order = "1";
                        $(".right")[0].style.order = "-1";
                    } else {
                        $(".left")[0].style.order = "-1";
                        $(".right")[0].style.order = "1";
                    }
                    funny.layout_left = !funny.layout_left;
                }),
                $(`<span>点</span>`).click(function() {
                    $(".clear-channel").show(500, function() {
                        setTimeout(function() {
                            $(".clear-channel").hide(500);
                        }, 10000);
                    });
                }),

            ),
            $(`<div class="msg item-commands clear-channel"></div>`).append(
                $(`<span>世界清屏</span>`).click(() => $(".chat").html("")),
                $(`<span>队伍清屏</span>`).click(() => $(".tm").html("")),
                $(`<span>门派清屏</span>`).click(() => $(".fam").html("")),
                $(`<span>全区清屏</span>`).click(() => $(".es").html("")),
                $(`<span>帮派清屏</span>`).click(() => $(".pty").html("")),
                $(`<span>系统清屏</span>`).click(() => $(".sys").html("")),
                $(`<span>统计清屏</span>`).click(() => $(".channel-pack").html("")),
                $(`<span>游戏清屏</span>`).click(() => $(".content-message pre").html("")),
            ),
        );
        $(".clear-channel").hide();
        GM_addStyle(`.right{height:100%;display:flex;flex-direction:column;}`);
        GM_addStyle(`.msg{height:auto;overflow:auto;flex: 0 0 auto;font-size:14px;line-height:16px;max-height:160px;}`);
        GM_addStyle(`.chat{flex:1 1 auto;max-height:100%;}`);
    });
})();