wsmud_funny

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

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        wsmud_funny
// @namespace   suqing
// @version     0.2.2
// @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,
        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,
    };
    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) {
                $(name)[0].scrollTop = a + 1;
                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;
        },
    };
    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") {
                if (data.type === "roles") {

                } else if (data.type === "login") {
                    if (data.id) funny.data_id === data.id;
                } else if (data.type === "room") {
                    console.log(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]);
                        return;
                    }
                } else if (data.type === "exits") {

                } else if (data.type === "state") {
                    funny.state = data.state;
                    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]);
                        return;
                    }
                } else if (data.type === "status") {
                    console.log(data);
                    // {type: "status", action: "remove", id: "kjiv3d6cd56", sid: "force"}
                } else if (data.type === "items") {
                    // 当前房间人物 data.items Array
                } else if (data.type === "itemadd") {
                    if (/蒙古兵|十夫长|百夫长|千夫长|万夫长/.test(data.name)) {
                        if (data.id) funny.sendmessage(`kill ${data.id}`);
                    }
                } else if (data.type === "itemremove") {

                } else if (data.type === "perform") {

                } else if (data.type === "msg") {
                    listener.extends.msg.forEach(fn => fn(data));
                    funny.onmessage_fn.apply(this, arguments);
                    $(".channel").html("");
                    return;
                } else if (data.type === "dialog") {
                    funny.onmessage_fn.apply(this, arguments);
                    listener.extends.dialog.forEach(fn => fn(data));
                    return;
                } else if (data.type === "sc") {

                } else if (data.type === "actions") {

                } else if (data.type === "addAction") {
                    if (data.name === "养精丹") fn.send(`use ${data.id}`);
                    console.log(data);
                } else if (data.type === "combat") {
                    // {type: "combat", end: 1}
                } else {
                    console.log(data);
                }
            }
            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: [],
        },
        addListener: function(type, fn) {
            listener.extends[type].push(fn);
        },
    };

    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)) {
            funny.onmessage_fn.apply(this, arguments);
            if (/你获得了(.*)<wht>|银子/.test(data)) {
            } else {
                $(".pickup").append(`${data}<br>`);
                fn.scroll(".pickup");
            }
        } else if (/恭喜你得到一颗/.test(data)) {
            funny.onmessage_fn.apply(this, arguments);
            let a = data.match(/恭喜你得到一颗<(.*)>(.*)<(.*)>。/);
            let key = a[2];
            (funny[key] === undefined) ? funny[key] = 1 : funny[key] += 1;
            $(`.remove_${key}`).remove();
            $(".content-message pre").append(
                $(`<span class="remove_${key}"></span>`).append(`合计 => ${key}:${funny[key]}\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.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 {
            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") {
            $(".rumor").append(`<him>【谣言】${data.content}</him><br>`);
            if (data.content.includes("闭关修炼")) {
                let a = data.content.match(/听说武帝(.*)闭关修炼似有所悟,你随之受益获得了(.*)经验,(.*)潜能/);
                funny.send(`tm 武帝「${a[1]}」出关,奖励经验${a[2]},潜能${a[3]}。`);
            } else if (data.content.includes("有人得到")) {
                let a = data.content.match(/听说有人得到了(.*)。/);
                console.log(a);
            }
        } else if (data.ch === "sys") {
            if (data.content.includes("挖矿技巧")) {
                let a = data.content.match(/(.*)捡到一本挖矿指南/);
                $(".sys").append(`<hir>【系统】${a[1]}使用了挖矿指南!</hir><br>`);
            } else {
                $(".sys").append(`<hir>【系统】${data.content}</hir><br>`);
            }
            // 武神历三千一百五十八年蒙古可汗蒙哥被击杀于襄阳城下,襄阳城大获全胜!
            // 郭大侠犒赏全军,所有玩家获得200军功!
        } 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.id === "signin") {
                    if (item.state === 2) fn.send("taskover 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 skills
    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]);
        } else 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();
                    $(".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") {
            if (data.name) {
                // if (/大宋|蒙古|笠子|混天|曙光|鲲鹏|真武|君子|罗汉/.test(data.name)) {
                //     fn.send(`fenjie ${data.id}`);
                // }
            }
        }
    });

    if (WebSocket) {
        console.log(`Complete.`);
        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.log(`Failed.`);

    $(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(
            $(`<table class="role"></table>`).append(
                $(`<tr><td colspan="4"><hiy>角色信息</hiy></td></tr>`),
                $(`<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>`),
            ),

            $(`<div class="console"></div>`),
            $(`<div class="send_controller"></div>`).append(
                $(`<input type="text" autocomplete="off" readonly="readonly" id="send_value">`).keypress(function(key) {
                    if (key.which == 13) $("#send_btn").click();
                }),
                $(`<button type="button" id="send_btn">发送</button>`).click(function() {
                    let value = $("#send_value").val();
                    if (value) fn.send(value);
                    $("#send_value").val("");
                }),
            ),
            $(`<div class="buttons"></div>`).append(
                $(`<button type="button">切换左右边栏</button>`).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;
                }),
                $(`<button type="button">世界清屏</button>`).click(() => $(".chat").html("")),
                $(`<button type="button">队伍清屏</button>`).click(() => $(".tm").html("")),
                $(`<button type="button">门派清屏</button>`).click(() => $(".fam").html("")),
                $(`<button type="button">帮派清屏</button>`).click(() => $(".pty").html("")),
                $(`<button type="button">全区清屏</button>`).click(() => $(".es").html("")),
                $(`<button type="button">系统清屏</button>`).click(() => $(".sys").html("")),
                $(`<button type="button">游戏清屏</button>`).click(() => $(".content-message pre").html("")),
            ),
            // $(`<button class="test">TEST</button>`).click(() => {
            //     fn.send([1000, "tm test"]);
            // }),
            // $(`<input type="checkbox" value="">`),
        );
        setTimeout(() => $(".send_controller input")[0].removeAttribute("readonly"), 5000);


        GM_addStyle(`.left{display:flex;flex-direction:column;}`);
        GM_addStyle(`.role{order:0;flex: 0 0 auto;width:100%;table-layout:fixed;border-collapse:collapse;}`);
        GM_addStyle(`.role td{width:88px;text-align:center;white-space:nowrap;border:#008000 solid 1px;}`);
        GM_addStyle(`.console {order:5;flex:1 0 auto;height:80px;overflow:auto;}`);
        GM_addStyle(`.buttons{order:9;flex:0 0 auto;}`);
        GM_addStyle(`.send_controller{order: 6;flex: 0 0 auto;height: 30px;display: flex;}`);
        GM_addStyle(`.send_controller input {flex: 1 0 auto;height: auto;} .send_controller button{height:auto;}`);
        GM_addStyle(`.test{order:999;flex:0 0 auto;height:auto;text-align:center;}`);
        // 右边
        $(".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"></div>`),
        );
        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%;}`);
    });

})();