// ==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;
})();