// ==UserScript==
// @name wsmud_funny
// @namespace suqing
// @version 0.1.1
// @author suqing
// @match http://game.wsmud.com/*
// @homepage https://greasyfork.org/zh-CN/scripts/380709
// @description 适用于 PC 端,利用了界面的无用区域,可以方便查看信息,然而目前并没有什么实用价值。
// @run-at document-start
// @require http://code.jquery.com/jquery-3.3.1.slim.min.js
// @grant unsafeWindow
// @grant GM_addStyle
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_getValue
// @grant GM_setClipboard
// ==/UserScript==
(function() {
'use strict';
if (!WebSocket) {
console.log("(Error) 无法获取 window.WebSocket!");
}
var suqing = {
name: GM_info.script.name,
version: GM_info.script.version,
webSocket: null,
role: {},
onmessage_fn: null,
getData: function() {
async function action() { // 模拟点击 获取数据
$("[command=showtool]").click(); // 点击菜单
$("[command=score]").click(); // 点击属性
await sleep(200);
$("[for=1]").click(); // 点击属性第二页
await sleep(200);
$("[command=skills]").click(); // 点击技能
$(".dialog-close").click(); // 关闭
await sleep(200);
$("[command=showcombat]").click(); // 点击动作
};
action();
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
};
},
onmessage: function(message) {
suqing.onmessage_fn.apply(this, arguments);
var data = message.data;
if (data.includes("你的最大内力增加了") && data.includes("点。")) {
var n = parseInt(data.toString().replace(/[^0-9]/ig,""));
var max = parseInt(suqing.role.max_mp);
var limit = parseInt(suqing.role.limit_mp);
var time = (limit - max) / (n * 6); // 分钟
$(".role_dazuo_time").html(timeText(time));
suqing.getData();
// *分钟 ->转化为-> *天*小时*分钟
function timeText(t) {
if (t < 60) {
var text = "";
text = text + parseInt(t) + "分钟";
return text;
} else {
var text = "";
var d = "";
var h = parseInt(t / 60);
var m = parseInt(t % 60);
if (h > 24) {
var d = parseInt(h / 24);
h = h % 24;
text = text + d + "天";
}
text = text + h + "小时" + m + "分钟";
return text;
}
}
} else if ((data.includes("{") && data.includes("}")) || (data.includes("[") && data.includes("]"))) {
data = new Function("return " + data + ";")();
} else if (data.includes("重新连线。")) {
// 登录
suqing.getData();
}
if (data.type === "state") { // 【状态】
console.log("STATE");
} else if (data.type === "dialog") { // 【会话】
console.log("DIALOG");
if (data.dialog === "score") { // 1. 角色数值
var role = suqing.role;
for (const key in data) {
if (data.hasOwnProperty(key)) role[key] = data[key];
}
for (const key in role) {
if (role.hasOwnProperty(key)) {
const value = role[key];
$(`.role_${key}`).html(value);
}
}
} else if (data.dialog === "skills") { // 2. 技能列表
if (data.items) {
var skills = data.items; // array
skills.sort(function(a, b) {
return a.level <= b.level;
});
$(".skill tbody").html("");
for (var skill of skills) {
$(".skill tbody").append(`<tr>
<td>${skill.name}</td>
<td>${skill.id}</td>
<td>${skill.level}</td>
</tr>`);
}
$(".skill tbody").append(`<tr><td colspan="3">当前技能上限为<hic>${data.limit}</hic>级</td></tr>`);
}
} else if (data.dialog === "pack") { // 3. 获得物品
}
} else if (data.type === "msg") {
return;
}
console.log(data);
},
sendmessage: function(message) {
console.log("Sending Message: ", message);
if ($("#sendmessage").attr("cmd")) {
$("#sendmessage").attr("cmd", message);
} else {
$(".container").append($(`<span id="sendmessage" cmd="${message}"><span>`));
}
$("#sendmessage").click();
},
};
unsafeWindow.WebSocket = function(url) {
suqing.webSocket = new WebSocket(url);
}
unsafeWindow.WebSocket.prototype = {
get url() {
return suqing.webSocket.url;
},
get protocol() {
return suqing.webSocket.protocol;
},
get readyState() {
return suqing.webSocket.readyState;
},
get bufferedAmount() {
return suqing.webSocket.bufferedAmount;
},
get extensions() {
return suqing.webSocket.extensions;
},
get binaryType() {
return suqing.webSocket.binaryType;
},
set binaryType(type) {
suqing.webSocket.binaryType = type;
},
get onopen() {
return suqing.webSocket.onopen;
},
set onopen(fn) {
suqing.webSocket.onopen = fn;
},
get onclose() {
return suqing.webSocket.onclose;
},
set onclose(fn) {
suqing.webSocket.onclose = fn;
},
get onerror() {
return suqing.webSocket.onerror;
},
set onerror(fn) {
suqing.webSocket.onerror = fn;
},
close: function () {
suqing.webSocket.close();
},
get onmessage() {
return suqing.webSocket.onmessage;
},
set onmessage(fn) { // 截获接收到的数据
suqing.onmessage_fn = fn;
suqing.webSocket.onmessage = suqing.onmessage;
},
send: function (message) { // 截获发送出的数据
suqing.webSocket.send(message);
$(".console").append($(`<div><hig> >> ${message}</hig></div>`));
fn(); // 滚动效果
function fn() {
var a = $(".console")[0].scrollTop;
var b = $(".console")[0].scrollHeight;
console.log(a, b);
if (a < b - 269) {
$(".console")[0].scrollTop = a + 1;
setTimeout(fn, 1000/60);
} else {
// $(".console")[0].scrollTop = b;
// 440 - 171 = 340-70-1 = 300-30-1 = 270 - 1=269
}
};
},
};
$(document).ready(function() {
addDiv();
addStyle();
});
function addDiv() {
$("body").append($(`<div class="left"></div>`));
$("body").append($(`<div class="right"></div>`));
$("body").append($(`<div class="extra"></div>`));
$(".left").append(`
<table class="role">
<tr><td colspan="4">角色信息</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>/<span class="role_max_hp"></span></td></tr>
<tr><td>内力</td><td colspan="3"><span class="role_mp"></span>/<span class="role_max_mp"></span></td></tr>
<tr><td>内力上限</td><td colspan="3"><hic class="role_limit_mp"></hic></td></tr>
<tr><td>打坐计算</td><td colspan="3"><hir class="role_dazuo_time"></hir></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 class="role_gj"></td><td>终伤</td><td class="role_add_sh"></td></tr>
<tr><td>防御</td><td class="role_fy"></td><td>命中</td><td class="role_mz"></td></tr>
<tr><td>招架</td><td class="role_zj"></td><td>躲闪</td><td class="role_ds"></td></tr>
<tr><td>暴击</td><td class="role_bj"></td><td>攻速</td><td class="role_gjsd"></td></tr>
<tr><td>门派</td><td class="role_family"></td><td>功绩</td><td><hig class="role_gongji"></hig></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>
<div class="msg_title"><hiy>指令记录</hiy></div>
<div class="console"></div>
<div class="send"><input type="text" autocomplete="off" id="send_value"><button type="button" id="send_btn">发送</button></div>
`);
$("#send_btn").click(function() { // 发送按钮
var value = $("#send_value").val();
suqing.sendmessage(value);
$("#send_value").val("");
});
$("#send_value").keypress(function(key) { // 监控回车
if (key.which == 13) $("#send_btn").click();
});
$(".right").append(`
<table class="skill_title">
<tr><td colspan="3">技能列表</td></tr>
<tr>
<td>技能</td>
<td>代码</td>
<td>等级</td>
<tr>
</table>
<div class="skill_box"><table class="skill">
<tbody></tbody>
</table></div>
`);
}
function addStyle() {
GM_addStyle(`
body {
display: flex;
flex-flow: row no-wrap;
width: 100vw;
}
.signinfo {
display: none;
}
.login-content, .container {
flex: 0 0 28rem;
border: 0.05em solid #008000;
}
.container {
width: 28rem;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select": none;
}
.left {
order: -1;
flex: 0 0 20rem;
display: flex;
flex-direction: column;
}
.right {
order: 1;
flex: 0 0 20rem;
display: flex;
flex-direction: column;
}
.extra {
order: 100;
flex: 0 1 100rem;
}
.left table {
border-collapse: collapse;
table-layout: fixed;
width: 20.05rem;
}
.left td {
border: #008000 solid 0.05rem;
text-align: center;
overflow: hidden;
white-space: nowrap;
}
/* ROLE */
.role {
flex: 0 0 auto;
}
.role tr td:first-child, .role tr td:first-child+td+td {
width: 3.95rem;
}
.role tr td:first-child+td, .role tr td:first-child+td+td+td {
width: 5.95rem;
}
/* MESSAGE */
.msg_title {
flex: 0 0 auto;
text-align: center;
border: #008000 solid 0.05rem;
}
.console {
flex: 0 1 100rem;
width: 20rem;
overflow: scroll;
white-space: nowrap;
border-left: #008000 solid 0.05rem;
}
.send {
flex: 0 0 auto;
display: flex;
height: 2rem;
}
.send input {
flex: 1 0 auto;
}
.send button {
height: auto;
}
/* SKILL */
.right .skill_title {
flex: 0 0 auto;
}
.right .skill_box {
flex: 1 1 auto;
overflow: scroll;
}
.right table {
border-collapse: collapse;
table-layout: fixed;
width: 20rem;
}
.right td {
border: #008000 solid 0.05rem;
text-align: center;
overflow: hidden;
white-space: nowrap;
}
.skill td:first-child, .skill_title td:first-child {
width: 6rem;
}
.skill td:first-child+td, skill_title td:first-child+td {
width: 8rem;
}
.skill td:first-child+td+td, skill_title td:first-child+td+td {
width: 4rem;
}
`);
}
})();