额外工具

武神传说 MUD

目前为 2024-03-20 提交的版本。查看 最新版本

// ==UserScript==
// @name            额外工具
// @namespace       ewgn
// @version         24.3.20
// @date            16/2/2024
// @modified        16/2/2024
// @description     武神传说 MUD
// @author          Bob.cn, 初心, 白三三,HS
// @match           http://*.wsmud.com/*
// @match           http://*.wamud.com/*
// @run-at          document-end
// @require         https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @grant           unsafeWindow
// @grant           GM_addStyle
// @grant           GM_getValue
// @grant           GM_setValue
// @grant           GM_deleteValue
// @grant           GM_listValues
// @grant           GM_setClipboard
// @license			MIT

// ==/UserScript==

(function () {
	"use strict";
	//***********************************************************************************\
	console.log(unsafeWindow.websocket);
	var WG = undefined;

	//***********************************************************************************\

	function AddContent(element) {
		$(".content-message pre").append(element);
		AutoScroll(".content-message");
		return false;
	}

	function AutoScroll(name) {
		if (name) {
			let scrollTop = $(name)[0].scrollTop;
			let scrollHeight = $(name)[0].scrollHeight;
			let height = Math.ceil($(name).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 SendCommand(command) {
		if (command instanceof Array) {
			if (command.length === 0) return;
			let cmd1 = command[0];
			let cmd2 = command.slice(1);
			if (typeof cmd1 === "number") {
				setTimeout(() => SendCommand(cmd2), cmd1);
			} else if (cmd1) {
				SendCommand(cmd1);
				SendCommand(cmd2);
			}
		} else if (typeof command === "string") {
			if (WG == null) {
				WG = unsafeWindow.WG;
			}
			WG.Send(command);
		}
	} //发送

	function sleep(ms) {
		return new Promise((resolve) => setTimeout(resolve, ms));
	} //延时

	//***********************************************************************************\

	async function tongji() {
		let map = new Map(); //背包数据
		let wenben = ""; //输出文本
		let 残页回收 = "";
		//对比数据
		let 秘籍 = new Map();
		let 绿色秘籍 = ["太祖长拳", "唐诗剑法", "五虎断门刀", "云龙鞭法", "意形步法", "神龙剑", "华山剑法", "混元一气", "飞檐走壁", "伏虎拳", "绝门棍", "猴拳", "云龙身法", "云龙心法", "秋风拂尘", "密宗心法", "密宗大手印", "冷月神功", "金雁功"];
		let 蓝色秘籍 = ["神龙心法", "云龙剑", "神形百变", "蛇岛奇功", "化骨绵掌", "胡家刀法", "四象步法", "金蛇锥法", "八卦拳", "八卦棍", "五毒神功", "恒山身法", "踏歌行", "穿云纵", "流云掌", "泰山拳法", "碧波神功", "蟾蜍步法", "摘星功", "飞星术", "青蝠身法", "绝情掌", "神剑诀", "鹰爪功", "圣火令法", "天南步", "身空行", "蒙古心法", "无常杖"];
		let 黄色秘籍 = ["金蛇剑法", "金蛇游身掌", "金蛇游身步", "五毒烟萝步", "五毒钩法", "千蛛万毒手", "白云心法", "恒山剑法", "天长掌法", "狂风快刀", "摧心掌", "松风剑法", "镇岳诀", "衡山五神剑", "泰山剑法", "磐石神功", "大嵩阳神掌", "嵩山剑法", "暗影浮香", "落英神剑", "三阴蜈蚣爪", "七伤拳", "移风剑法", "天羽奇剑", "圣火神功", "段家剑", "玉女心经", "银索金铃", "全真剑法", "中平枪法", "蒙古骑枪"];
		let 紫色秘籍 = ["寒冰真气", "弹指神通", "空明拳", "灵蛇杖法", "蛤蟆功", "化功大法", "移花接木", "明玉功", "参合指", "枯木神功", "神照经", "血海魔功", "一阳指", "玄虚步", "伏魔棍", "彼岸剑法", "圆月弯刀", "先天功"];
		let 橙色秘籍 = ["斗转星移", "辟邪剑法", "葵花神功", "不老长春功", "九阳神功", "乾坤大挪移", "六脉神剑", "血刀", "黯然销魂掌", "玄铁剑法", "九阴神功", "太玄功", "无念禅功", "伏魔杖", "如来神掌", "真言手印", "灵犀步", "天地交征阴阳大悲赋", "龙象般若功"];
		let 红色秘籍 = ["长生诀", "慈航剑典", "阴阳九转", "战神图录", "覆雨剑法", "天魔策", "逆天道"];
		let 进阶秘籍 = ["太极拳进阶", "梯云纵进阶", "先天太极进阶", "太极剑法进阶", "混元天罡进阶", "逍遥游进阶", "打狗棒进阶", "降龙十八掌进阶", "劈石破玉拳进阶", "紫霞神功进阶", "狂风快剑进阶", "独孤九剑进阶", "九阴白骨爪进阶", "诸天化身步进阶", "临济十二庄进阶", "倚天剑法进阶", "一指禅进阶", "一苇渡江进阶", "燃木刀法进阶", "金刚不坏体进阶", "北冥神功进阶", "天山六阳掌进阶", "凌波微步进阶", "小无相功进阶", "穿心掌进阶", "杀生决进阶", "踏雪寻梅进阶", "漫天花雨进阶"];
		秘籍.set("绿色秘籍", 绿色秘籍).set("蓝色秘籍", 蓝色秘籍).set("黄色秘籍", 黄色秘籍).set("紫色秘籍", 紫色秘籍).set("橙色秘籍", 橙色秘籍).set("红色秘籍", 红色秘籍).set("进阶秘籍", 进阶秘籍);

		function mergeArrays(maps, DOMdatas) {
			for (const DOMdata of DOMdatas) {
				if (DOMdata.innerHTML == "") continue;
				let key = DOMdata.innerHTML.match(/<.*?>(.*?)</)[1];
				let value = +(DOMdata.innerHTML.match(/<span class="obj-value">(\d*).*?</)[1] || "1");
				maps.has(key) ? maps.set(key, maps.get(key) + value) : maps.set(key, value);
			}
		}

		SendCommand(YZC["打开仓库"]);
		let ck;
		do {
			ck = document.querySelector(".dialog-title").innerHTML.indexOf("你的仓库中");
			await sleep(200);
		} while (ck == -1);
		let bagdatas = document.querySelectorAll(".obj-item");
		mergeArrays(map, bagdatas);

		SendCommand(YZC["打开书架"]);
		let sj;
		do {
			sj = document.querySelector(".dialog-title").innerHTML.indexOf("你的书架上");
			await sleep(200);
		} while (sj == -1);
		let shujia = document.querySelectorAll(".obj-list:first-child>.obj-item");
		mergeArrays(map, shujia);

		let changdu = [];
		for (let amount of 秘籍.values()) {
			amount.forEach((item) => {
				changdu.push(item.length);
			});
		}
		let changmax = Math.max(...changdu) + 2;
		function jiakg(str, alength = changmax, kongge = "ㅤ") {
			let newstr = str;
			if (str.length < alength) {
				for (let i = 0; i < +alength - +str.length; i++) {
					newstr = kongge + newstr;
				}
			}
			return newstr;
		}

		秘籍.forEach((value, key) => {
			let keycd = changmax * 2 + 12;
			let keywb1 = key.padStart(keycd / 2, "——");
			let keywb2 = keywb1.padEnd(keycd, "——");
			wenben += "<p>" + keywb2 + "</p>";

			value.forEach((item) => {
				const miji = item + "秘籍";
				const mjsl = ((map.get(miji) || " ") + "").padStart(3, " ");

				const canye = item + "残页";
				const cysl = ((map.get(canye) || " ") + "").padStart(3, " ");

				if ((map.get(miji) || 0) > 0 && key != "红色秘籍" && key != "进阶秘籍") {
					残页回收 += canye + ",";
				}

				wenben += `<p>${jiakg(miji)}&nbsp;${mjsl}||${jiakg(canye)}&nbsp;${cysl}</p>`;
			});
		});
		let html = `
    <!DOCTYPE html>
    <html lang="zh">
    <head>
      <meta charset="utf-8">
      <style>
      *{
        white-space: pre;
        font-family: monospace;
        padding: 0;
        margin: 0;
        font-size: 16px;
		background-color: black;
      }
	  p{color: #00FF00;}
      </style>
    </head>
    <body>
      ${wenben}
      <hr>
	  <p>残页回收代码(在设置-高级里)</p>
      <p>${残页回收}</p>
    </body>
    </html>`;
		let blob = new Blob([html], { type: "text/html" });
		let url = URL.createObjectURL(blob);
		window.open(url, "_blank");
		残页回收 = "";
		map.clear();
	} //统计功能

	let 稀有度 = [
		["<wht>", "</wht>"],
		["<hig>", "</hig>"],
		["<hic>", "</hic>"],
		["<hiy>", "</hiy>"],
		["<hiz>", "</hiz>"],
		["<hio>", "</hio>"],
		["<ord>", "</ord>"],
	];
	let 宝石排序 = ["碎裂的红宝石", "红宝石", "精致的红宝石", "完美的红宝石", "攻击之石", "朱雀之魂", "碎裂的黄宝石", "黄宝石", "精致的黄宝石", "完美的黄宝石", "气血之石", "玄武之魂", "碎裂的蓝宝石", "蓝宝石", "精致的蓝宝石", "完美的蓝宝石", "躲闪之石", "青龙之魂", "碎裂的绿宝石", "绿宝石", "精致的绿宝石", "完美的绿宝石", "命中之石", "白虎之魂", "碎裂的紫薇", "紫薇", "碎裂的破军", "破军", "碎裂的七杀", "七杀", "碎裂的贪狼", "贪狼"];
	let 鱼排序 = ["鱼饵", "鲤鱼", "鲢鱼", "草鱼", "鲂鱼", "鳊鱼", "鲮鱼", "黄金鳉", "黄颡鱼", "太湖银鱼", "虹鳟", "反天刀", "孔雀鱼", "罗汉鱼", "黑龙鱼", "银龙鱼", "七星刀鱼", "巨骨舌鱼", "帝王老虎魟"];
	let 药材排序 = ["芦荟", "当归", "山楂叶", "柴胡", "石楠叶", "金银花", "沉香", "茯苓", "熟地黄", "九香虫", "络石藤", "冬虫夏草", "人参", "何首乌", "凌霄花", "灵芝", "盘龙参", "天仙藤", "沉天叶", "凤鸣花", "龙鳞草", "轮回蛊", "神血藤"];
	let 丹药排序 = ["冰心丹", "玄灵丹", "突破丹", "大还丹", "大力丸", "凝神丹", "归心散", "石龟丹", "风行散", "风雷丹", "赤火丹", "赤血丹", "玄武丹", "破军丹", "风神丹", "生机丸", "玄冰丹", "归元散", "风行丹", "造化丹", "无常丹", "清心丹", "蕴象丹", "顿悟丹", "金创药", "引气丹", "聚气丹"];
	let 其他排序 = ["玄晶", "师门令牌", "喜宴:碧螺春卷", "喜宴:蝴蝶暇卷", "喜宴:佛手金卷", "喜宴:金丝酥雀", "喜宴:山珍刺龙芽", "鳄鱼皮", "火龙筋"];
	let 物品排序 = [].concat(宝石排序, 鱼排序, 药材排序, 丹药排序, 其他排序);
	let 物品排序加颜色 = [];
	物品排序.forEach((item) => {
		稀有度.forEach((item1) => {
			物品排序加颜色.push(item1[0] + item + item1[1]);
		});
	});

	function 取东西(asd){
		let value = String(asd.value)==""?1:String(asd.value);
		let wu = String(asd.id);
		//let wupin = document.querySelector()
		let qu="qu "+value+" "+wu;
		WG.Send(qu)
	}
	
	async function 仓库排序() {
		let room =$('.room-name').text();
		if(room == "住房-卧室") {
			WG.Send("store");}
		else{
			SendCommand(YZC["打开仓库"]);
		}
		let ck;
		do {
			ck = document.querySelector(".dialog-title").innerHTML.indexOf("你的仓库中");
			await sleep(500);
		} while (ck == -1);

		let bagDatas = document.querySelectorAll(".obj-list:first-child>.obj-item");
		//let bag = document.querySelector(".obj-list");

		let right = document.querySelector(".right");
		let list = document.querySelector(".right>.obj-list");
		if (list) list.remove();
		right.insertAdjacentHTML("afterbegin", `<div class="obj-list1" style="overflow: auto;"></div>`);
		right = document.querySelector(".right>.obj-list1");

		物品排序加颜色.forEach((item) => {
			for (let a of bagDatas) {
				if (a.innerHTML != "") {
					let 物品名 = a.innerHTML.match(/([^ ]*?<\/.*?>)/)[1];
					if (item == 物品名) {
						let 物品代码 = a.getAttribute("obj");
						let 物品数量 = a.innerHTML.match(/<span class="obj-value">(\d*).*/);
						if(物品数量[1]=="") {物品数量 = 1}
						else {物品数量 = 物品数量[1]};
						right.insertAdjacentHTML(
							"beforeend",
							`
			<div class="obj-item">
			${物品名}<span class="quantity">${物品数量}</span>
			<button onclick="WG.Send('qu 1 ${物品代码}')">取一个</button> 
			<button onclick="WG.Send('qu 10 ${物品代码}')">取十个</button> 
			<button onclick="取东西(${物品代码})">取</button><input type="text" style="width:50px;" id="${物品代码}" value="${物品数量}">
			</div>`
						);
					}
				}
			}
		});
		bagDatas = null;
		right = null;
		list = null;
	}

	
	//***********************************************************************************\

	$(document).ready(function () {
		WG = unsafeWindow.WG;
		$(".right-bar").before($("<div></div>").append($(`<span class="span-btn"></span>`).append("功能").click(togn)));

		GM_addStyle(`.right>.obj-list1 .obj-item{display: flex;align-items: center;}
		.right>.obj-list1 .obj-item>:nth-child(n+3){margin-left: auto;}
		.right>.obj-list1 .obj-item>:nth-child(n+4){margin-left: 0;}
	`);
		
	});
	let togn = function () {
		AddContent(
			$("<div></div>").append(
				$(`<span class="span-btn"></span>`)
					.append("统计残页秘籍数量")
					.click(() => tongji()),
				$(`<span class="span-btn"></span>`)
					.append("仓库排序")
					.click(() => 仓库排序()),
				$(`<br>`)
			)
		);
	};

	//***********************************************************************************\

	let YZC = {
		打开仓库: ["stopstate", "jh fam 0 start", "go west", "go west", "go north", "go enter", "go north", "store"],
		打开书架: ["stopstate", "jh fam 0 start", "go west", "go west", "go north", "go enter", "go north", "select ltvxd096a69", "sj"],
	};
	unsafeWindow.取东西 = 取东西;
})();

QingJ © 2025

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