您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
This mod allows you to see tierlist values of your character such as DPS, Burst, eHP, Build Score and Rank
// ==UserScript== // @name Stat Mod // @namespace http://tampermonkey.net/ // @version 0.2.1.1 // @description This mod allows you to see tierlist values of your character such as DPS, Burst, eHP, Build Score and Rank // @author Daria // @license MIT // @match https://hordes.io/play // @icon https://www.google.com/s2/favicons?sz=64&domain=hordes.io // @grant none // ==/UserScript== const ranks = ["F", "E", "D-", "D", "D+", "C-", "C", "C+", "B-", "B", "B+", "A-", "A", "A+", "S", "SS"] const rankColors = ["#9f46c6", "#5a46c6", "#467bc6", "#46c0c6", "#46c695", "#46c661", "#81c646", "#b8c646", "#c6ba46", "#c69346", "#c67546", "#c66446", "#c65746", "#740000", "#910c0c"] const sheetIDs = ["1ZltP6iegg8ON6ypbim7KbayYB35NvmWQqU0RlitTjE0", "1k3nb7xaTJmh4zxYRH_45JoWtnh5H0fkOiqdbiklPYPg", "1z7JHoIZdOPrj_VYSGLxoJVw1RA1Nfptj8AClcUXc6O0", "1LibjJwlpYdnHlRZV8ns_m_y2VeZaZHFZF8cpSr3jY7A"] let rankMetrics = [] const classes = [" Warrior", " Mage", " Archer", " Shaman"] window.addEventListener('load', function() { 'use strict'; let entered = false let interval = setInterval(function() { let statColumns = document.getElementsByClassName("statcol panel-black svelte-ggsnc") let update if (statColumns.length > 0 && !entered) { entered = true; let column = "X" if(document.getElementsByClassName("statcol panel-black svelte-ggsnc")[0].getElementsByTagName("span")[5].textContent == " Warrior"){ column = "AG" } const url = `https://sheets.googleapis.com/v4/spreadsheets/${sheetIDs[classes.indexOf(document.getElementsByClassName("statcol panel-black svelte-ggsnc")[0].getElementsByTagName("span")[5].textContent)]}/values/data!${column}6:${column}21?key=AIzaSyDiSyzf40CaBHAKOrzDd5Ut193MuSlpW_Y`; fetch(url).then(data => data.json()).then(data => { rankMetrics = data.values statColumns[4].removeChild(statColumns[4].childNodes[0]) statColumns[4].removeChild(statColumns[4].childNodes[0]) statColumns[4].removeChild(statColumns[4].childNodes[0]) statColumns[4].removeChild(statColumns[4].childNodes[0]) statColumns[4].removeChild(statColumns[4].childNodes[4]) statColumns[4].removeChild(statColumns[4].childNodes[4]) let dps = document.createElement("span") dps.textContent = "DPS" dps.id = "dpsTextAdded" dps.style.color = "cyan" let dpsValue = document.createElement("span") dpsValue.id = "dpsValueAdded" dpsValue.className = "statnumber textprimary" let dpsn = Math.round((parseFloat(statColumns[3].childNodes[1].textContent) + parseFloat(statColumns[3].childNodes[3].textContent)) / 2 * (1 + parseFloat(statColumns[3].childNodes[7].textContent) / 100) * (1 + parseFloat(statColumns[3].childNodes[9].textContent) / 100)) dpsValue.textContent = dpsn //--------------------------- let burst = document.createElement("span") burst.textContent = "Burst" burst.id = "burstTextAdded" burst.style.color = "cyan" let burstValue = document.createElement("span") burstValue.className = "statnumber textprimary" burstValue.id = "burstValueAdded" let burstn = Math.round((parseFloat(statColumns[3].childNodes[1].textContent) + parseFloat(statColumns[3].childNodes[3].textContent)) / 2 * (1 + parseFloat(statColumns[3].childNodes[7].textContent) / 100)) burstValue.textContent = burstn //---------------------------- let ehp = document.createElement("span") ehp.textContent = "Effective HP" ehp.style.color = "cyan" ehp.id = "ehpTextAdded" let ehpValue = document.createElement("span") ehpValue.className = "statnumber textprimary" ehpValue.id = "ehpValueAdded" let ehpn = Math.round(parseFloat(statColumns[2].childNodes[1].textContent) * 100 / ((100 - 87 * (1 - Math.pow(Math.E, -1 * parseFloat(statColumns[2].childNodes[9].textContent) * 0.0022)))) * 125 / (125 - parseFloat(statColumns[2].childNodes[11].textContent.substring(0, statColumns[2].childNodes[11].textContent.length - 1)))) ehpValue.textContent = ehpn //------------------------------ let bs = document.createElement("span") bs.textContent = "Build Score" bs.style.color = "cyan" bs.id = "bsTextAdded" let bsValue = document.createElement("span") bsValue.className = "statnumber textprimary" bsValue.id = "bsValueAdded" let bsn = buildScore() bsValue.textContent = bsn statColumns[4].insertBefore(burstValue, statColumns[4].childNodes[0]) statColumns[4].insertBefore(burst, statColumns[4].childNodes[0]) statColumns[4].insertBefore(dpsValue, statColumns[4].childNodes[0]) statColumns[4].insertBefore(dps, statColumns[4].childNodes[0]) statColumns[4].insertBefore(ehpValue, statColumns[4].childNodes[0]) statColumns[4].insertBefore(ehp, statColumns[4].childNodes[0]) statColumns[4].append(bs, bsValue) update = setInterval(function(){ if(statColumns.length == 0){ clearInterval(update) } let dpsn = Math.round((parseFloat(statColumns[3].childNodes[1].textContent) + parseFloat(statColumns[3].childNodes[3].textContent)) / 2 * (1 + parseFloat(statColumns[3].childNodes[7].textContent) / 100) * (1 + parseFloat(statColumns[3].childNodes[9].textContent) / 100)) let burstn = Math.round((parseFloat(statColumns[3].childNodes[1].textContent) + parseFloat(statColumns[3].childNodes[3].textContent)) / 2 * (1 + parseFloat(statColumns[3].childNodes[7].textContent) / 100)) let ehpn = Math.round(parseFloat(statColumns[2].childNodes[1].textContent) * 100 / ((100 - 87 * (1 - Math.pow(Math.E, -1 * parseFloat(statColumns[2].childNodes[9].textContent) * 0.0022)))) / (1 - parseFloat(statColumns[2].childNodes[11].textContent.substring(0, statColumns[2].childNodes[11].textContent.length - 1)) / 100 * (document.getElementsByClassName("statcol panel-black svelte-ggsnc")[0].getElementsByTagName("span")[5].textContent == " Warrior" ? 0.6 : 0.45))) let bsn = buildScore() document.getElementById("dpsValueAdded").textContent = dpsn document.getElementById("burstValueAdded").textContent = burstn document.getElementById("ehpValueAdded").textContent = ehpn document.getElementById("bsValueAdded").textContent = bsn }, 100) }); } else if (statColumns.length == 0 && entered){ entered = false; clearInterval(update) } }, 1) }); function buildScore(){ let statColumns = document.getElementsByClassName("statcol panel-black svelte-ggsnc") let cclass = document.getElementsByClassName("statcol panel-black svelte-ggsnc")[0].getElementsByTagName("span")[5].textContent let prestige = document.querySelector(".textprestige").textContent.split(" ")[1].split(",").length == 1 ? parseInt(document.querySelector(".textprestige").textContent.split(" ")[1].split(",")[0]) : parseInt(document.querySelector(".textprestige").textContent.split(" ")[1].split(",")[0]) * 1000 + parseInt(document.querySelector(".textprestige").textContent.split(" ")[1].split(",")[1]) let damageBonus = (prestige < 48000 ? 10 : 0) + (prestige < 16000 ? 10 : 0) let dps = Math.round((parseFloat(statColumns[3].childNodes[1].textContent) + parseFloat(statColumns[3].childNodes[3].textContent) + damageBonus) / 2 * (1 + (parseFloat(statColumns[3].childNodes[7].textContent) + (prestige < 36000 ? 5 : 0)) / 100) * (1 + (parseFloat(statColumns[3].childNodes[9].textContent) + (prestige < 40000 ? 3 : 0)) / 100)) let burst = Math.round((parseFloat(statColumns[3].childNodes[1].textContent) + parseFloat(statColumns[3].childNodes[3].textContent) + damageBonus) / 2 * (1 + (parseFloat(statColumns[3].childNodes[7].textContent) + (prestige < 36000 ? 5 : 0)) / 100)) let ehp = Math.round((parseFloat(statColumns[2].childNodes[1].textContent) + (prestige < 28000 ? 30 : 0) + (prestige < 44000 ? 30 : 0)) * 100 / ((100 - 87 * (1 - Math.pow(Math.E, -1 * parseFloat(statColumns[2].childNodes[9].textContent) * 0.0022)))) / (1 - parseFloat(statColumns[2].childNodes[11].textContent.substring(0, statColumns[2].childNodes[11].textContent.length - 1)) / 100 * (document.getElementsByClassName("statcol panel-black svelte-ggsnc")[0].getElementsByTagName("span")[5].textContent == " Warrior" ? 0.6 : 0.45))) let damage let hybrid let tank let haste let mit let health switch (cclass){ case " Mage": damage = l((dps + burst)/2,2) hybrid = (l(ehp,5) + l(burst, 5) + l(dps, 4))/3 tank = (l(ehp,2.5) + l(burst, 6) + l(dps, 6))/3 rank(((damage/3)+tank+hybrid)*225/3, 1) return Math.round(((damage/3)+tank+hybrid)*225/3 * 100) / 100 case " Archer": damage = (l(dps,2) + l(burst,2))/2 hybrid = (l(ehp,5) + l(burst, 5) + l(dps, 4))/3 tank = (l(ehp,2.5) + l(burst, 6) + l(dps, 6))/3 rank(((damage/3)+tank+hybrid)*226/3, 2) return Math.round(((damage/3)+tank+hybrid)*226/3 * 100) / 100 case " Warrior": mit = (1-Math.exp(-parseFloat(document.getElementsByClassName("statcol panel-black svelte-ggsnc")[2].childNodes[9].textContent)*0.0022))*0.87 + (((parseFloat(document.getElementsByClassName("statcol panel-black svelte-ggsnc")[2].childNodes[11].textContent)/100)*0.6)) haste = parseFloat(document.getElementsByClassName("statcol panel-black svelte-ggsnc")[3].childNodes[9].textContent) + (prestige < 40000 ? 3 : 0) damage = (l(ehp, 5) + l(dps, 2) + l(burst, 2))/3 tank = (l(ehp,2) + l(mit*100, 2) + l(haste, 6))/3 hybrid = (l(ehp,5) + l(dps, 4) + l(burst, 5) + l(mit*100, 5))/4 rank((damage+(tank/3)+hybrid)*210/3, 0) return Math.round((damage+(tank/3)+hybrid)*210/3 * 100) / 100 case " Shaman": haste = parseFloat(statColumns[3].childNodes[9].textContent + (prestige < 40000 ? 3 : 0)); health = parseFloat(statColumns[2].childNodes[1].textContent) + (prestige < 44000 ? 30 : 0) + (prestige < 28000 ? 30 : 0); damage = (l(dps, 2) + l(burst, 2) + l(ehp, 10))/3; tank = (l(dps, 10) + l(burst, 11) + l(ehp, 2) + l(ehp/health*60, 7) + l(haste*8, 16))/5; hybrid = (l(dps, 3) + l(burst, 4) + l(ehp, 6) + l(ehp/health*50, 10) + l(haste*8, 9))/5; rank(((damage/1.75)+(tank)+hybrid)*235/3, 3) return Math.round(((damage/1.75)+(tank)+hybrid)*235/3 * 100) / 100; } return "-" } function rank(bs, pclass){ let rankValue if(document.getElementById("rank") == null){ document.getElementsByClassName("statcol panel-black svelte-ggsnc")[0].childNodes[12].remove() document.getElementsByClassName("statcol panel-black svelte-ggsnc")[0].childNodes[12].remove() let rankText = document.createElement("span") rankText.textContent = "Rank" rankText.style.color = "cyan" rankValue = document.createElement("span") rankValue.id = "rank" document.getElementsByClassName("statcol panel-black svelte-ggsnc")[0].append(rankText, rankValue) } else { rankValue = document.querySelector("#rank") } for(let i = 1; i < rankMetrics.length; i++){ if(rankMetrics[i][0] > bs){ rankValue.textContent = ranks[i - 1] rankValue.style = "color:" + rankColors[15 - i] return } } rankValue.textContent = "SS" rankValue.style = "color:#c646a0" } function l(y, x) { return Math.log(y) / Math.log(x); }