wsmud_mo_simple

基于 wsmud_funny_mobile 修改

  1. // ==UserScript==
  2. // @name wsmud_mo_simple
  3. // @namespace mos
  4. // @version 0.1.2.3
  5. // @author sq, 白三三
  6. // @match http://*.wsmud.com/*
  7. // @homepage https://gf.qytechs.cn/zh-CN/scripts/394530-wsmud-mo-simple
  8. // @description 基于 wsmud_funny_mobile 修改
  9. // @run-at document-start
  10. // @require https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js
  11. // @grant unsafeWindow
  12. // @grant GM_addStyle
  13. // @grant GM_setValue
  14. // @grant GM_deleteValue
  15. // @grant GM_getValue
  16. // @grant GM_setClipboard
  17. // ==/UserScript==
  18.  
  19. (function() {
  20. 'use strict';
  21. let funny = {
  22. version: GM_info.script.version,
  23. data: {},
  24. role: {},
  25. data_skill_limit: 0,
  26. data_login: 0,
  27. data_id: "12345678910",
  28. state: "data.state",
  29. data_autokill_xy: true,
  30. layout_left: true,
  31. // Beep: function() {
  32. // document.getElementById("beep").play();
  33. // },
  34. };
  35. unsafeWindow.funny = funny;
  36. let fn = {
  37. send: function(message) {
  38. if (typeof message === "string") {
  39. sendmessage(message);
  40. } else if (message instanceof Array) {
  41. action(message);
  42. async function action(message) {
  43. for (const m of message) (typeof m === "number") ? (await fn.sleep(m)) : sendmessage(m);
  44. }
  45. }
  46. function sendmessage(message) {
  47. $("#sendmessage").attr("cmd") ? $("#sendmessage").attr("cmd", message) : $(".container").append($(`<span id="sendmessage" cmd="${message}"><span>`));
  48. $("#sendmessage").click();
  49. }
  50. },
  51. sleep: function(ms) {
  52. return new Promise(resolve => setTimeout(resolve, ms));
  53. },
  54. scroll: function(name) {
  55. if (name === undefined) return;
  56. let a = $(name)[0].scrollTop,
  57. b = $(name)[0].scrollHeight,
  58. h = Math.ceil($(name).height()); // 向上取整
  59. // console.log(`fn.scroll => a=${a} b=${b} h=${h}`);
  60. if (a < b - h) {
  61. let add = (b - h < 120) ? 1 : Math.ceil((b - h) / 120);
  62. $(name)[0].scrollTop = a + add;
  63. setTimeout(`fn.scroll("${name}")`, 1000/120);
  64. }
  65. },
  66. deepCopy: function (object) {
  67. let result = {};
  68. for (const key in object) {
  69. result[key] = typeof object[key] === "object" ? fn.deepCopy(object[key]) : object[key];
  70. }
  71. return result;
  72. },
  73. getTime: function() {
  74. let date = new Date();
  75. let h = parseInt(date.getHours());
  76. let m = parseInt(date.getMinutes());
  77. h = h < 10 ? `0${h}` : `${h}`;
  78. m = m < 10 ? `0${m}` : `${m}`;
  79. return `${h}:${m}`;
  80. },
  81. addContent: function(element) {
  82. $(".content-message pre").append(element);
  83. fn.scroll(".content-message");
  84. return false;
  85. },
  86. // beep: function() {
  87. // document.getElementById("beep").play();
  88. // },
  89. };
  90. unsafeWindow.fn = fn;
  91. let listener = {
  92. onmessage: function(message) {
  93. let data = message.data;
  94. if (/{(.*)}/.test(data)) data = (new Function(`return ${data};`))();
  95. if (typeof data === "string") {
  96. listener.extends.text.forEach(fn => fn(message));
  97. return;
  98. } else if (typeof data === "object") {
  99. switch (data.type) {
  100. case "roles":
  101. funny.data.roles = data;
  102. break;
  103. case "login":
  104. funny.data.id = data.id;
  105. break;
  106. case "dialog":
  107. listener.extends.dialog.forEach(fn => fn(data));
  108. break;
  109. case "msg":
  110. funny.onmessage_fn.apply(this, arguments);
  111. return;
  112. case "room":
  113. listener.extends.room.forEach(fn => fn(message, data));
  114. return;
  115. case "exits":
  116. break;
  117. case "item":
  118. break;
  119. case "items":
  120. break;
  121. case "itemadd":
  122. listener.extends.itemadd.forEach(fn => fn(data));
  123. break;
  124. case "itemremove":
  125. break;
  126. case "actions":
  127. break;
  128. case "addAction":
  129. break;
  130. case "state":
  131. funny.state = data.state;
  132. listener.extends.state.forEach(fn => fn(message, data));
  133. return;
  134. case "perform":
  135. break;
  136. case "status":
  137. break;
  138. case "combat":
  139. break;
  140. case "dispfm":
  141. break;
  142. case "sc":
  143. break;
  144. case "time":
  145. break;
  146. case "disobj":
  147. break;
  148. default:
  149. console.log(data);
  150. break;
  151. }
  152. }
  153. funny.onmessage_fn.apply(this, arguments);
  154. },
  155. sendmessage: function(message) {
  156. funny.webSocket.send(message);
  157. },
  158. extends: {
  159. text: [],
  160. dialog: [],
  161. msg: [],
  162. room: [],
  163. state: [],
  164. itemadd: [],
  165. },
  166. addListener: function(type, fn) {
  167. listener.extends[type].push(fn);
  168. },
  169. };
  170. unsafeWindow.listener = listener;
  171. listener.addListener("text", function(message) {
  172. let data = message.data;
  173. if (/重新连线|欢迎登陆/.test(data)) {
  174. funny.data_login += 1;
  175. $(".content-message pre").append(`${data}\n`);
  176. if (funny.data_login === 1) {
  177. $(".content-message pre").append(`wsmud_mo_simple ${funny.version}(基于funny修改)\n`);
  178. getScore();
  179. }
  180. async function getScore() {
  181. $("[command=score]").click();
  182. await fn.sleep(100);
  183. $("[for=1]").click();
  184. await fn.sleep(100);
  185. $("[for=0]").click();
  186. await fn.sleep(100);
  187. $("[command=skills]").click();
  188. await fn.sleep(100);
  189. $("[command=pack]").click();
  190. await fn.sleep(100);
  191. $("[command=tasks]").click();
  192. await fn.sleep(100);
  193. $("[command=showcombat]").click(); // 点击动作
  194. await fn.sleep(100);
  195. $("[command=showtool]").click(); // 点击菜单
  196. await fn.sleep(1000);
  197. $(".dialog-close").click();
  198. };
  199. } else if (/只留下一堆玄色石头/.test(data) && data.includes("你")) {
  200. let a = data.match(/只见(.*)发出一阵白光/);
  201. $(".content-message pre").append(`你分解了 => ${a[1]}\n`)
  202. // } else if (/你身上东西太多了|你拿不下那么多东西。/.test(data)) {
  203. // $(".content-message pre").append(`<hir>友情提示:请检查是否背包已满!</hir>`);
  204. // fn.send(`tm 友情提示:请检查是否背包已满!`);
  205. // fn.beep();
  206. } else if (/你身上没有挖矿工具。/.test(data)) {
  207. // SendCommand([]);//小号没有铁镐的情况
  208. } else if (/你的最大内力增加了/.test(data)) {
  209. funny.onmessage_fn.apply(this, arguments);
  210. let a = data.match(/你的最大内力增加了(.*)点。/);
  211. let n = parseInt(a[1]),
  212. max = parseInt(funny.role.max_mp),
  213. limit = parseInt(funny.role.limit_mp);
  214. let time = (limit - max) / (n * 6); // X分钟 => X小时X分钟
  215. let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
  216. $(".remove_dzsj").remove();
  217. $(".content-message pre").append(`<span class="remove_dzsj">当前内力: ${max}\n上限内力: ${limit}\n需要时间: ${timeString}\n</span>`);
  218. } else {
  219. funny.onmessage_fn.apply(this, arguments);
  220. }
  221. fn.scroll(".content-message");
  222. });
  223.  
  224. // tasks
  225. listener.addListener("dialog", function(data) {
  226. if (data.dialog === "tasks" && data.items) {
  227. let fb, qa, wd, wd1, wd2, wd3, xy, mpb, boss, wdtz, sm1, sm2, ym1, ym2, yb1, yb2;
  228. data.items.forEach(item => {
  229. if (item.state === 2) fn.send(`taskover ${item.id}`); // 自动完成
  230. if (item.id === "signin") {
  231. let a = item.desc.match(/师门任务:(.*),精力消耗:<(.*)>(.*)\/200<(.*)>/);
  232. let b = item.desc.match(/(.*)武道塔(.*),进度(\d+)\/(\d+)<(.*)/);
  233. let c = item.desc.match(/<.+?>(.+)首席请安<.+?>/);
  234. let d = item.desc.match(/尚未协助襄阳守城/);
  235. let e = item.desc.match(/尚未挑战门派BOSS/);
  236. let f = item.desc.match(/挑战武神BOSS(\d+)次/);
  237. let g = item.desc.match(/尚未挑战武道塔塔主/);
  238. (parseInt(a[3]) < 200) ? fb = `<hig>${a[3]}</hig>` : fb = a[3];
  239. if (b) {
  240. (parseInt(b[3]) < parseInt(b[4])) ? wd1 = `<hig>${b[3]}</hig>` : wd1 = b[3];
  241. wd2 = b[4];
  242. /可以重置/.test(b[2]) ? wd3 = "<hig>可以重置</hig>" : wd3 = "已经重置";
  243. wd = wd1+"/"+wd2+" "+wd3
  244. }else {wd = "只打塔主"}
  245. if (c) {
  246. /已经/.test(c[1]) ? qa = "已经请安" : qa = "<hig>尚未请安</hig>";
  247. }else {qa = "无需请安"}
  248. (d) ? xy = `<hig>0</hig>` : xy = 1;
  249. (e) ? mpb = `<hig>0</hig>` : mpb = 1;
  250. if (f) {
  251. boss = 5 - parseInt(f[1]);
  252. boss = `<hig>${boss}</hig>`;
  253. }else{
  254. if (G.level && G.level.indexOf('武神') >= 0) boss = 5;
  255. }
  256. (g) ? wdtz = `<hig>0</hig>/1` : wdtz = `已打或未解锁`;
  257. } else if (item.id === "sm") {
  258. let a = item.desc.match(/目前完成(.*)\/20个,共连续完成(.*)个。/);
  259. (parseInt(a[1]) < 20) ? sm1 = `<hig>${a[1]}</hig>` : sm1 = a[1];
  260. sm2 = a[2];
  261. } else if (item.id === "yamen") {
  262. let a = item.desc.match(/目前完成(.*)\/20个,共连续完成(.*)个。/);
  263. (parseInt(a[1]) < 20) ? ym1 = `<hig>${a[1]}</hig>` : ym1 = a[1];
  264. ym2 = a[2];
  265. } else if (item.id === "yunbiao") {
  266. let a = item.desc.match(/本周完成(.*)\/20个,共连续完成(.*)个。/);
  267. (parseInt(a[1]) < 20) ? yb1 = `<hig>${a[1]}</hig>` : yb1 = a[1];
  268. yb2 = a[2];
  269. }
  270. });
  271. let html = `门派请安 => ${qa}\n武道之塔 => ${wd}\n`;
  272. html += `精力消耗 => ${fb}/200\n师门任务 => ${sm1}/20 ${sm2}连\n`;
  273. html += `衙门追捕 => ${ym1}/20 ${ym2}连\n每周运镖 => ${yb1}/20 ${yb2}连\n`;
  274. html += `襄阳守城 => ${xy}/1 门派BOSS => ${mpb}/1\n`
  275. html += `武道塔主 => ${wdtz}\n`;
  276. if (boss) html += `武神BOSS => ${boss}/5\n`;
  277. $(".remove_tasks").remove();
  278. $(".content-message pre").append($(`<span class="remove_tasks"><span>`).html(html));
  279. fn.scroll(".content-message");
  280. }
  281. });
  282.  
  283. // score
  284. listener.addListener("dialog", function(data) {
  285. if (data.dialog === "score") {
  286. for (const key in data) funny.role[key] = data[key];
  287. }
  288. });
  289.  
  290. // skills
  291. listener.addListener("dialog", function(data) {
  292. if (data.dialog === "skills") {
  293. funny.skills = data.items || funny.skills || [];
  294. if (data.items) {
  295. funny.data_skill_limit = parseInt(data.limit);
  296. } else if (data.id && data.exp) {
  297. if (data.level) {
  298. for (const skill of funny.skills) {
  299. if (skill.id === data.id) {
  300. skill.level = data.level;
  301. break;
  302. }
  303. }
  304. }
  305. let name = "", k = 0, level = 0;
  306. let djsx = funny.data_skill_limit; // 上限
  307. let xxxl = parseInt(funny.role.study_per); // 学习效率
  308. let lxxl = parseInt(funny.role.lianxi_per); // 练习效率
  309. let xtwx = parseInt(funny.role.int); // 先天悟性
  310. let htwx = parseInt(funny.role.int_add); // 后天悟性
  311. if (funny.skills) {
  312. for (const skill of funny.skills) {
  313. if (skill.id === data.id) {
  314. name = skill.name;
  315. level = parseInt(skill.level);
  316. if (/<wht>.*/.test(name)) k = 1; // 白
  317. if (/<hig>.*/.test(name)) k = 2;
  318. if (/<hic>.*/.test(name)) k = 3;
  319. if (/<hiy>.*/.test(name)) k = 4;
  320. if (/<hiz>.*/.test(name)) k = 5;
  321. if (/<hio>.*/.test(name)) k = 6; // 橙
  322. if (/<ord>.*/.test(name)) k = 7; // 红
  323. break;
  324. }
  325. }
  326. }
  327. let qianneng = (djsx * djsx - level * level) * 2.5 * k;
  328. //if (funny.state === "你正在练习技能") {
  329. if (funny.state.indexOf("练习") != -1) {
  330. let time = qianneng / (xtwx + htwx) / (1 + lxxl / 100 - xtwx / 100) / 12;
  331. let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
  332. $(".remove_lx").remove();
  333. // 练习每一跳的消耗公式=(先天悟性+后天悟性)×(1+练习效率%-先天悟性%)
  334. $(".content-message pre").append(`练习${name}消耗了${parseInt(qianneng / time / 12)}点潜能。\n`);
  335. $(".content-message pre").append(`<span class="remove_lx">悟性: ${xtwx}+${htwx} 效率: ${lxxl}%\n等级上限: ${djsx}级\n需要潜能: ${qianneng}\n需要时间: ${timeString}\n</span>`);
  336. fn.scroll(".content-message");
  337. // } else if (funny.state.search(/读书|学习/) != -1) {
  338. // // 学习每一跳的消耗公式=(先天悟性+后天悟性)×(1+学习效率%-先天悟性%)×3
  339. // let cost = (xtwx + htwx) * (1 + xxxl / 100 - xtwx / 100) * 3;
  340. // $(".content-message pre").append(`学习${name}消耗了${parseInt(cost)}点潜能。\n`);
  341. // let time = qianneng / cost / 12;
  342. // let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
  343. // $(".content-message pre").append(`<span class="remove_xx">练满时间 => ${timeString}\n</span>`);
  344. // fn.scroll(".content-message");
  345. }
  346. }
  347. }
  348. });
  349. // pack
  350. listener.addListener("dialog", function(data) {
  351. if (data.dialog === "pack") {
  352.  
  353. if (data.can_use == 1 && /养精丹|朱果|潜灵果|背包扩充石|小箱子|师门补给包|随从礼包/.test(data.name)) {
  354. let cmd = ["stopstate"];
  355. let count = data.count;
  356. let zl = "use";
  357. if (/<hig>养精丹<\/hig>/.test(data.name)) count = count > 10 ? 10 : count;
  358. if (/小箱子|师门补给包|随从礼包/.test(data.name)) zl = "open";
  359. for (let i = 0; i < count; i ++) {
  360. cmd.push(zl + " " + data.id);
  361. cmd.push(500);
  362. }
  363. $(".content-message pre").append(
  364. $(`<div class="item-commands"></div>`).append(
  365. $(`<span>快捷使用${count}次 => ${data.name}</span>`).click(() => {
  366. fn.send(cmd);
  367. }),
  368. ),
  369. );
  370. }
  371.  
  372. // if (data.name) {
  373. // if (/<hig>大宋(.*)<\/hig>|<hig>蒙古(.*)<\/hig>|<hig>笠子帽<\/hig>|<hic>大宋(.*)<\/hic>|<hic>蒙古(.*)<\/hic>|<hic>笠子帽<\/hic>|<hiy>大宋(.*)<\/hiy>|<hiy>蒙古(.*)<\/hiy>|<hiy>笠子帽<\/hiy>/.test(data.name)) {
  374. // fn.send(`fenjie ${data.id}`);
  375. // }
  376. // }
  377.  
  378. // if (data.jldesc) {
  379. // let jl = data.jldesc.match(/<hio>(.*)<\/hio><br\/>精炼<(hig|hic|hiy|hiz|hio|ord)>+(.*)\s</i);
  380. // if (jl) {
  381. // let n = "<hio>" + jl[1] + "</hio>";
  382. // let j = parseInt(jl[3]);
  383. // let c = 13 - j;
  384. // let cmd = [];
  385. // for (let i = 0; i < c; i ++) {
  386. // cmd.push(`jinglian ${data.id} ok`);
  387. // cmd.push(500);
  388. // }
  389. // $(".content-message pre").append(
  390. // $(`<div class="item-commands"></div>`).append(
  391. // $(`<span>精炼6星 => ${n}</span>`).click(() => {
  392. // fn.send(cmd);
  393. // }),
  394. // ),
  395. // );
  396. // fn.scroll(".content-message");
  397. // }
  398. // }
  399. }
  400. });
  401.  
  402. let room = new Proxy({ str: "a-b", name1: "a", name2: "b", path: "a/b/c", items: [] }, {
  403. set: function (room, key, value) {
  404. room[key] = value;
  405. return true;
  406. },
  407. get: function (room, key) {
  408. return room[key];
  409. }
  410. });
  411. listener.addListener("room", function(message, data) {
  412. room.str = data.name.replace("(副本区域)", "");
  413. let x = room.str.match(/(.*)-(.*)/);
  414. room.name1 = x[1];
  415. room.name2 = x[2];
  416. room.path = data.path;
  417. room.desc = data.desc;
  418. if (room.desc.length > 20) {
  419. let desc0 = room.desc.replace(/<([^<]+)>/g, "");
  420. let desc1 = desc0.substr(0, 20);
  421. let desc2 = desc0.substr(20);
  422. data.desc = `${desc1}<span id="show"> <hic>»»»</hic></span><span id="more" style="display:none">${desc2}</span><span id="hide" style="display:none"> <hic>«««</hic></span>`;
  423. }
  424. if (room.desc.includes("cmd")) {
  425. room.desc = room.desc.replace("<hig>椅子</hig>", "椅子");
  426. room.desc = room.desc.replace("<CMD cmd='look men'>门(men)<CMD>", "<cmd cmd='look men'>门</cmd>");//兵营副本的门
  427. room.desc = room.desc.replace(/span/g, "cmd");//房间描述中<span>标签的命令改为<cmd>
  428. room.desc = room.desc.replace(/"/g, "'"); // "" => ''
  429. room.desc = room.desc.replace(/\((.*?)\)/g, "");//去除括号和里面的英文单词
  430. //console.log(room.desc);
  431. // let c = `◆`;
  432. let cmds = room.desc.match(/<cmd cmd='([^']+)'>([^<]+)<\/cmd>/g);
  433. //console.log(cmds);
  434. cmds.forEach(cmd => {
  435. let x = cmd.match(/<cmd cmd='(.*)'>(.*)<\/cmd>/);
  436. data.commands.unshift({ cmd: x[1], name: `<hic>${x[2]}</hic>` });
  437. });
  438. //room.desc = room.desc.replace(/<([^<]+)>/g, "");
  439. cmds.forEach(desc => data.desc = `<hic>${desc}</hic> ${data.desc}`);
  440. }
  441. let mask = fn.deepCopy(message);
  442. mask.data = JSON.stringify(data);
  443. funny.onmessage_fn.apply(this, [mask]);
  444. $("#show").click(() => {
  445. $("#more").show();
  446. $("#show").hide();
  447. $("#hide").show();
  448. });
  449. $("#hide").click(() => {
  450. $("#more").hide();
  451. $("#show").show();
  452. $("#hide").hide();
  453. });
  454. });
  455. listener.addListener("state", function(message, data) {
  456. if (data.desc && data.desc.length > 0) {
  457. data.desc = [];
  458. let mask = fn.deepCopy(message);
  459. mask.data = JSON.stringify(data);
  460. funny.onmessage_fn.apply(this, [mask]);
  461. } else {
  462. funny.onmessage_fn.apply(this, [message]);
  463. }
  464. });
  465.  
  466. /* listener.addListener("itemadd", function(data) {
  467. if (/蒙古兵|十夫长|百夫长|千夫长|万夫长/.test(data.name)) {
  468. if (data.id) fn.send(`kill ${data.id}`);
  469. }
  470. }); */
  471.  
  472.  
  473.  
  474. if (WebSocket) {
  475. unsafeWindow.WebSocket = function(url) {
  476. funny.webSocket = new WebSocket(url);
  477. };
  478. unsafeWindow.WebSocket.prototype = {
  479. get url() {
  480. return funny.webSocket.url;
  481. },
  482. get protocol() {
  483. return funny.webSocket.protocol;
  484. },
  485. get readyState() {
  486. return funny.webSocket.readyState;
  487. },
  488. get bufferedAmount() {
  489. return funny.webSocket.bufferedAmount;
  490. },
  491. get extensions() {
  492. return funny.webSocket.extensions;
  493. },
  494. get binaryType() {
  495. return funny.webSocket.binaryType;
  496. },
  497. set binaryType(type) {
  498. funny.webSocket.binaryType = type;
  499. },
  500. get onerror() {
  501. return funny.webSocket.onerror;
  502. },
  503. set onerror(fn) {
  504. funny.webSocket.onerror = fn;
  505. },
  506. get onopen() {
  507. return funny.webSocket.onopen;
  508. },
  509. set onopen(fn) {
  510. funny.webSocket.onopen = fn;
  511. },
  512. get onclose() {
  513. return funny.webSocket.onclose;
  514. },
  515. set onclose(fn) {
  516. funny.webSocket.onclose = fn;
  517. },
  518. close: function () {
  519. funny.webSocket.close();
  520. },
  521. get onmessage() {
  522. return funny.webSocket.onmessage;
  523. },
  524. set onmessage(fn) {
  525. funny.onmessage_fn = fn;
  526. funny.webSocket.onmessage = listener.onmessage;
  527. },
  528. send: function (message) {
  529. listener.sendmessage(message);
  530. },
  531. };
  532. };
  533.  
  534. $(document).ready(function() {
  535. //GM_addStyle(`.room_desc{overflow:hidden;white-space:nowrap;}`);
  536. GM_addStyle(`.content-bottom{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;}`);
  537. // $("body").append(
  538. // $(`<audio id="beep" preload="auto"></audio>`).append(`<source src="http://47.102.126.255/wav/complete.wav">`)
  539. // );
  540. });
  541. })();

QingJ © 2025

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