您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add Cost-per-battle to all market lots
// ==UserScript== // @name LWM Market Utility // @author Prozyk // @description Add Cost-per-battle to all market lots // @match https://www.lordswm.com/auction.php?*\ // @match https://www.lordswm.com/auction.php?*art_type* // @namespace https://greasyfork.org/users/722588 // @version 0.0.1.20210113191835 // ==/UserScript== //Put above inside Userscript definition if also want cpb on all *weapons* page, rather than only art_specific //Do at own risk, since it will initiate lot of requests to obtain all repair costs, might get admin's attention // 1] Detect Table // 3] Catch Relevant Values: Price, Dura, Name // 4] Parse Repair Cost, store to name so don't have to recalculate // 5] Attach form asking repair rate // 6] Calculate CPB // 7] Add Cpb, Repair till, and number of battles in Columns // 8] Add sort abiility // 9] Make CPB sort option part of dropdown // (Maybe) // Add generic CPB calculator above page // Contact Author with more ideas. console.log("Market Utility Script is On"); var xpath = "//td[contains(text(),'Bids')]"; var BidsElement = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; var table = BidsElement.parentNode.parentNode; var rows = table.childNodes; var settings = rows[0]; var header = rows[1]; var len = rows.length; var smithEffi = 90; var smithCharge = 101; var price = []; var dura_cur = []; var dura_max = []; var art_name = []; var repair_cost = []; var repair_cost_dict = {}; var initiated = false; var current_url = document.location.href; var sleep_time = 10000; if (current_url.includes("art_type")) sleep_time = 2000; function extend_header(){ var repair_header = document.createElement('td'); repair_header.innerHTML = "<span align = center> Repair Cost </span> "; repair_header.setAttribute("width", "100"); header.appendChild(repair_header); var cpb_header = document.createElement('td'); cpb_header.innerHTML = "<span align = center> CPB </span> "; cpb_header.setAttribute("width", "100"); header.appendChild(cpb_header); var final_header = document.createElement('td'); final_header.innerHTML = "<span align = center> Repair Till </span> "; final_header.setAttribute("width", "100"); header.appendChild(final_header); var usage_header = document.createElement('td'); usage_header.innerHTML = "<span align = center> Total Fights </span> "; usage_header.setAttribute("width", "100"); header.appendChild(usage_header); } function add_cpb_form(){ settings.childNodes[0].setAttribute('colspan', "2"); settings.childNodes[1].setAttribute('align', "center"); settings.childNodes[1].setAttribute('valign', "center"); settings.childNodes[1].setAttribute('colspan', "3"); var myform = document.createElement('td'); myform.setAttribute("align", "right"); myform.setAttribute("valign", "center"); myform.setAttribute("colspan", "4"); var str = "<table align = center> <tr><td align = center> <b> Cost Per Battle</b> </td> </tr>"; str += "<tr> <td align = center > Smith Efficiency :<input type=text id=smithEffi size = '4' value='90'>%</td></tr>"; str += " <tr> <td align = center> Smith Charge <input type=text id=smithCharge size = '4' value='101'>%</td></tr>" str += "<tr><td align = center> <input type = button value = 'Calculate' id = 'calculate' </td> </tr></table> "; myform.innerHTML = str; settings.appendChild(myform); document.getElementById('calculate').onclick = upgrade_table; document.getElementById('smithEffi').oninput = function(){ smithEffi = document.getElementById('smithEffi').value }; document.getElementById('smithCharge').oninput = function(){ smithCharge = document.getElementById('smithCharge').value }; } function parse_table(){ var arts = new Set(); for(var i = 2; i<len; i++){ art_name[i] = rows[i].childNodes[0].textContent.split('-')[1].split('[')[0].trim(); durability = rows[i].childNodes[0].textContent.split("Durability: ")[1]; if (durability.includes("pcs")) durability = durability.substring(0, durability.length-6) dura_cur[i] = Number(durability.split('/')[0]); dura_max[i]= Number(durability.split('/')[1].split(" ")[0].match(/\d+/)[0]); price[i] = Number(rows[i].childNodes[2].textContent.replaceAll(',', '').match(/\d+/)[0]); // console.log(rows[i].childNodes[2].textContent.replace(, price[i]); if(!arts.has(art_name[i])){ get_repair_cost(i); arts.add(art_name[i]); } } console.log(arts); } function get_repair_cost(i){ art_url = rows[i].childNodes[0].querySelectorAll('a')[1].href; var req = new XMLHttpRequest(); req.open("GET", art_url, true); req.overrideMimeType('text/html; charset=windows-1251'); req.send(); req.onreadystatechange = function(){ var text = req.responseText; repair_cost_dict[art_name[i]] = Number(text.split("Repairing")[1].replace(',', '').split('<td>')[2].split('</td>')[0]); console.log(art_name[i], repair_cost_dict[art_name[i]]); } } function set_repairs(){ new Promise(r => setTimeout(r, sleep_time)).then(() => { for(var i = 2; i<len; i++){ repair_cost[i] = repair_cost_dict[art_name[i]]; rows[i].innerHTML += "<td width=100> </td>".repeat(4); rows[i].childNodes[5].innerHTML = repair_cost[i]; } }); } function set_opt_cpb(){ for(var i = 2; i<len; i++){ var opt_cpb = cpb_calc(dura_cur[i], dura_max[i], price[i], repair_cost[i]); console.log(art_name[i], dura_cur[i], dura_max[i], price[i], repair_cost[i]); console.log(opt_cpb); // rows[i].childNodes[6].innerHTML = "Hello"; rows[i].childNodes[6].innerHTML = opt_cpb[0]; rows[i].childNodes[7].innerHTML = "0/" + opt_cpb[1]; rows[i].childNodes[8].innerHTML = opt_cpb[2]; } } function cpb_calc(currDura, maxDura, iniCost, repCost) { var tempMaxDura, tempDura, totDura, optDura, optFights; var iniCost, repCost; var se, sc; var totCostTillNow, costPerBattle = 0, minCPB; var i; var repCount = 1; //Assigning the values se = smithEffi / 100; sc = smithCharge / 100; tempMaxDura = maxDura; tempDura = currDura; totDura = tempDura; totCostTillNow = iniCost; costPerBattle = totCostTillNow / totDura; minCPB = costPerBattle; optDura = tempMaxDura; optFights = totDura; for(i=1; i<=maxDura; i++) { totCostTillNow += parseFloat(repCost * sc); tempDura = parseInt(tempMaxDura * se); totDura += tempDura; costPerBattle = (totCostTillNow / parseFloat(totDura)); tempMaxDura -= 1; if ( minCPB >= costPerBattle ) { minCPB = costPerBattle; optDura = tempMaxDura; optFights = totDura; } } optOut = [eval(minCPB.toFixed(2)), optDura, optFights]; return optOut; } function add_sort_form(){ dropdown = document.getElementById("ss") var option = document.createElement("option"); option.value = "304"; option.textContent = "Cost per Battle: Ascending"; dropdown.appendChild(option); var option2 = document.createElement("option"); option2.value = "0"; option2.textContent = "Random Order"; dropdown.appendChild(option2); dropdown.onchange = function(){ if(dropdown.value != "304" && dropdown.value != "0") findsort(); //predefined by them else if (dropdown.value == "304") cpb_sort(); } } function cpb_sort(){ var sign_sort = -1; var NumberC = 6; var sorted = []; var m, t, p, f, i, j; for(i=2; i<len; i++){ sorted[i] = []; for(j=0; j<9; j++){ sorted[i][j] = rows[i].childNodes[j].innerHTML; } } while(true){ f = 0; for(i=2; i<len-1; i++){ m = sign_sort*Number(sorted[i][NumberC]); t = sign_sort*Number(sorted[i+1][NumberC]); if(m<t){ f = 1; for(j=0; j<9; j++){ p = sorted[i][j]; sorted[i][j]=sorted[i+1][j]; sorted[i+1][j] = p; } } } if(f == 0)break; } for(i=2; i<len ; i++){ for(j=0; j<9; j++){ rows[i].childNodes[j].innerHTML = sorted[i][j]; } } } function upgrade_table(){ if(!initiated){ initiated = true; add_cpb_form(); document.getElementById('calculate').disabled = true; extend_header(); parse_table(); set_repairs(); new Promise(r => setTimeout(r, sleep_time + 2000)).then(() => { set_opt_cpb(); document.getElementById('calculate').disabled = false; add_sort_form(); }) } else{ document.getElementById("ss").value = "0"; set_opt_cpb(); } } upgrade_table();