您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
在线统计强化成功/失败次数
当前为
- // ==UserScript==
- // @name [MWI]Enhancement Tool
- // @name:zh-CN [银河奶牛]强化工具(血压工具)
- // @name:zh-TW [銀河奶牛]強化工具
- // @namespace http://tampermonkey.net/
- // @version 1.05
- // @description Track the number of enhancement successes and failures
- // @description:zh-CN 在线统计强化成功/失败次数
- // @description:zh-TW 統計強化成功/失敗次數
- // @author Truth_Light
- // @license Truth_Light
- // @match https://www.milkywayidle.com/*
- // @match https://test.milkywayidle.com/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=milkywayidle.com
- // @grant GM.xmlHttpRequest
- // @grant GM_registerMenuCommand
- // ==/UserScript==
- (function() {
- 'use strict';
- let enhancementLevel;
- let currentEnhancingIndex = 1;
- let enhancementData = {
- [currentEnhancingIndex]: { "强化数据": {}, "其他数据": {} }
- };
- const userLanguage = navigator.language || navigator.userLanguage;
- const isZH = userLanguage.startsWith("zh");
- function hookWS() {
- const dataProperty = Object.getOwnPropertyDescriptor(MessageEvent.prototype, "data");
- const oriGet = dataProperty.get;
- dataProperty.get = hookedGet;
- Object.defineProperty(MessageEvent.prototype, "data", dataProperty);
- function hookedGet() {
- const socket = this.currentTarget;
- if (!(socket instanceof WebSocket)) {
- return oriGet.call(this);
- }
- if (socket.url.indexOf("api.milkywayidle.com/ws") <= -1 && socket.url.indexOf("api-test.milkywayidle.com/ws") <= -1) {
- return oriGet.call(this);
- }
- const message = oriGet.call(this);
- Object.defineProperty(this, "data", { value: message });
- return handleMessage(message);
- }
- }
- function handleMessage(message) {
- try {
- let obj = JSON.parse(message);
- if (obj && obj.type === "action_completed" && obj.endCharacterAction && obj.endCharacterAction.actionHrid === "/actions/enhancing/enhance") {
- const now_enhancementLevel = parseInt(obj.endCharacterAction.upgradeItemHash.match(/::(\d+)$/)[1]);
- const currentCount = obj.endCharacterAction.currentCount;
- if (enhancementLevel !== undefined) {
- // 开始新的物品的强化
- if (currentCount < enhancementData[currentEnhancingIndex]["强化次数"]) {
- currentEnhancingIndex++;
- enhancementData[currentEnhancingIndex] = { "强化数据": {}, "其他数据": {} };
- enhancementLevel = undefined;
- return message
- }
- const currentItem = enhancementData[currentEnhancingIndex]["强化数据"];
- if (!currentItem[enhancementLevel]) {
- currentItem[enhancementLevel] = { "成功次数": 0, "失败次数": 0, "成功率": 0 };
- }
- if (enhancementLevel < now_enhancementLevel) {
- currentItem[enhancementLevel]["成功次数"]++;
- } else {
- currentItem[enhancementLevel]["失败次数"]++;
- }
- const success = currentItem[enhancementLevel]["成功次数"];
- const failure = currentItem[enhancementLevel]["失败次数"];
- currentItem[enhancementLevel]["成功率"] = success / (success + failure);
- // 计算强化状态
- const highestSuccessLevel = Math.max(...Object.keys(currentItem).filter(level => currentItem[level]["成功次数"] > 0));
- const enhancementState = (highestSuccessLevel + 1 >= enhancementData[currentEnhancingIndex]["其他数据"]["目标强化等级"]) ? "强化成功" : "强化失败";
- enhancementData[currentEnhancingIndex]["强化状态"] = enhancementState;
- enhancementLevel = now_enhancementLevel;
- } else {
- // 初始化数据
- enhancementLevel = now_enhancementLevel;
- const itemName = formatItemName(obj.endCharacterAction.upgradeItemHash);
- enhancementData[currentEnhancingIndex]["其他数据"] = {
- "物品名称": itemName,
- "目标强化等级": obj.endCharacterAction.enhancingMaxLevel
- };
- }
- enhancementData[currentEnhancingIndex]["强化次数"] = currentCount;
- updateDisplay();
- } else {
- return message;
- }
- } catch (error) {
- console.error("Error processing message:", error);
- }
- return message;
- }
- function updateDisplay() {
- const targetElement = document.querySelector(".SkillActionDetail_enhancingComponent__17bOx");
- if (!targetElement) return;
- let enhancementStatsContainer = document.querySelector("#enhancementStatsContainer");
- if (!enhancementStatsContainer) {
- enhancementStatsContainer = document.createElement("div");
- enhancementStatsContainer.id = "enhancementStatsContainer";
- enhancementStatsContainer.style.display = "grid";
- enhancementStatsContainer.style.gridTemplateColumns = "repeat(4, 1fr)";
- enhancementStatsContainer.style.gap = "10px";
- enhancementStatsContainer.style.textAlign = "center";
- enhancementStatsContainer.style.marginTop = "10px";
- // 添加下拉框
- const dropdown = document.createElement("select");
- dropdown.id = "enhancementDropdown";
- dropdown.style.marginBottom = "10px";
- dropdown.addEventListener("change", function () {
- renderStats(this.value);
- });
- targetElement.appendChild(dropdown);
- targetElement.appendChild(enhancementStatsContainer);
- }
- // 获取当前选中的选项
- const dropdown = document.querySelector("#enhancementDropdown");
- const previousSelectedValue = dropdown.value;
- dropdown.innerHTML = "";
- Object.keys(enhancementData).forEach(key => {
- const item = enhancementData[key];
- const option = document.createElement("option");
- const itemName = item["其他数据"]["物品名称"];
- const targetLevel = item["其他数据"]["目标强化等级"];
- const currentLevel = Math.max(...Object.keys(item["强化数据"]));
- const enhancementState = item["强化状态"];
- option.text = `${itemName} (目标: ${targetLevel})`;
- option.value = key;
- option.style.color = enhancementState === "强化成功" ? "green" : (currentLevel < targetLevel && Object.keys(enhancementData).indexOf(key) === Object.keys(enhancementData).length - 1) ? "Orange" : "red";
- dropdown.appendChild(option);
- });
- if (Object.keys(enhancementData).length > 0) {
- dropdown.value = previousSelectedValue || Object.keys(enhancementData)[0];
- renderStats(dropdown.value);
- }
- }
- function formatItemName(upgradeItemHash) {
- const namePartMatch = upgradeItemHash.match(/\/([^\/]+?)::[^:]+$/);
- if (namePartMatch && namePartMatch[1]) {
- const namePart = namePartMatch[1];
- const formattedName = namePart.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
- return formattedName;
- }
- return "Unknown Item";
- }
- function renderStats(selectedKey) {
- const enhancementStatsContainer = document.querySelector("#enhancementStatsContainer");
- enhancementStatsContainer.innerHTML = "";
- const item = enhancementData[selectedKey];
- // 表头
- const headers = ["等级", "成功次数", "失败次数", "成功率"];
- headers.forEach(headerText => {
- const headerDiv = document.createElement("div");
- headerDiv.style.fontWeight = "bold";
- headerDiv.textContent = isZH ? headerText : (headerText === "等级" ? "Level" : headerText === "成功次数" ? "Success" : headerText === "失败次数" ? "Failure" : "Success Rate");
- enhancementStatsContainer.appendChild(headerDiv);
- });
- // 总计信息
- const totalSuccess = Object.values(item["强化数据"]).reduce((acc, val) => acc + val["成功次数"], 0);
- const totalFailure = Object.values(item["强化数据"]).reduce((acc, val) => acc + val["失败次数"], 0);
- const totalCount = totalSuccess + totalFailure;
- const totalRate = totalCount > 0 ? (totalSuccess / totalCount * 100).toFixed(2) : "0.00";
- ["总计", totalSuccess, totalFailure, `${totalRate}%`].forEach((totalText, index) => {
- const totalDiv = document.createElement("div");
- totalDiv.textContent = isZH ? totalText : index === 0 ? "Total" : totalText;
- enhancementStatsContainer.appendChild(totalDiv);
- });
- Object.keys(item["强化数据"]).sort((a, b) => b - a).forEach(level => {
- [level, item["强化数据"][level]["成功次数"], item["强化数据"][level]["失败次数"], `${(item["强化数据"][level]["成功率"] * 100).toFixed(2)}%`].forEach(data => {
- const dataDiv = document.createElement("div");
- dataDiv.textContent = data;
- enhancementStatsContainer.appendChild(dataDiv);
- });
- });
- }
- hookWS();
- })();