您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
This script tracks your daily activities by monitoring experience, guilds, and faction points
// ==UserScript== // @name LWMActivityTracker // @author Theatre Of Pain (http://www.lordswm.com/pl_info.php?id=4821925) // @version 2.0.161216 // @description This script tracks your daily activities by monitoring experience, guilds, and faction points // @include http://www.lordswm.com/home.php // @grant GM_getValue // @grant GM_setValue // @grant GM_log // @namespace https://gf.qytechs.cn/users/86247 // ==/UserScript== var debug = false; //turn to true to display debug messages in the error console const COMPARTMENT_SIZE = 7; // grouping per date const MAX_COMPARTMENTS = 8; // maximum number of groups const GRAPH_RECORDS = COMPARTMENT_SIZE * MAX_COMPARTMENTS; // number of tracker records const GRAPH_COLOR = 'blue'; const INVERT_GRAPH_COLOR = 'orange'; const LIGHT_BG = '#FFFFFF'; const DARK_BG = '#DDD9CD'; const DATESTAMP_SIZE = 8; const EXPERIENCE_RECORD = 26; const DATESTAMP = 0; const EXP = 1; const FSP = 2; const KNIGHT = 3; const NECRO = 4; const WIZARD = 5; const ELF = 6; const BARBARIAN = 7; const DARK_ELF = 8; const DEMON = 9; const DWARF = 10; const TRIBAL = 11; const XX = 12; // reserved for future expansion const YY = 13; // reserved for future expansion const ZZ = 14; // reserved for future expansion const HG = 15; const LG = 16; const GG = 17; const TG = 18; const MG = 19; const CG = 20; const SG = 21; const EG = 22; const RG = 23; const WG = 24; const AG = 25; // list labels const EXP_L = 'Experience'; const FSP_L = 'Faction Skill Points'; const KNIGHT_L = 'Knight FSP'; const NECRO_L = 'Necromancer FSP'; const WIZARD_L = 'Wizard FSP'; const ELF_L = 'Elf FSP'; const BARBARIAN_L = 'Barbarian FSP'; const DARK_ELF_L = 'Dark Elf FSP'; const DEMON_L = 'Demon FSP'; const DWARF_L = 'Dwarf FSP'; const TRIBAL_L = 'Tribal FSP'; const XX_L = '- Reserved for future expansion -'; const YY_L = '- Reserved for future expansion -'; const ZZ_L = '- Reserved for future expansion -'; const HG_L = 'Hunters\' guild'; const LG_L = 'Laborers\' guild'; const GG_L = 'Gamblers\' guild'; const TG_L = 'Thieves\' guild'; const RG_L = 'Rangers\' guild'; const MG_L = 'Mercenaries\' guild'; const CG_L = 'Commanders\' guild'; const SG_L = 'Smiths\' guild'; const EG_L = 'Enchanters\' guild'; const WG_L = 'Watchers\' guild'; const AG_L = 'Adventurers\' guild'; // graph labels var labels = new Array(); labels[DATESTAMP] = 'Date'; labels[EXP] = 'Experience'; labels[FSP] = 'Total FSP'; labels[KNIGHT] = 'Knight'; labels[NECRO] = 'Necromancer'; labels[WIZARD] = 'Wizard'; labels[ELF] = 'Elf'; labels[BARBARIAN] = 'Barbarian'; labels[DARK_ELF] = 'Dark Elf'; labels[DEMON] = 'Demon'; labels[DWARF] = 'Dwarf'; labels[TRIBAL] = 'Tribal'; labels[XX] = 'RESERVED'; labels[YY] = 'RESERVED'; labels[ZZ] = 'RESERVED'; labels[HG] = 'HG'; labels[LG] = 'LG'; labels[GG] = 'GG'; labels[TG] = 'TG'; labels[RG] = 'RG'; labels[MG] = 'MG'; labels[CG] = 'CG'; labels[SG] = 'SG'; labels[EG] = 'EG'; labels[WG] = 'WG'; labels[AG] = 'AG'; var experience = new Array(); var tracker = new Array(); var experience_record = new Array(EXPERIENCE_RECORD); var graph_width = 100; var empty_cell_size = 3; var date_cell_width = 60; var graph_div, backup_div, options_div; var graph; var select; var player_name; var server_name; main(); function main() { getPlayerAndServer(); getExperienceData(); experience_record = getExperienceRecord(); createExperienceRecord(experience_record); setExperienceData(); buildTracker(); tooltipStyle(); displayTracker(); } function getPlayerAndServer() { var all_params = document.getElementsByTagName('param'); for (var i = 0; i < all_params.length; i++) { if (all_params[i].name == 'FlashVars') { player_name = all_params[i].value.split('|')[3]; break; } } if (location.href.indexOf('.com') != -1) { server_name = '.com'; } else { server_name = '.ru'; } if (debug) {GM_log( 'Server name = ' + server_name + '\nPlayer name = ' + player_name )} } function getExperienceData() { var temp_data; // migrate earlier version that didn't store experience by player name temp_data = GM_getValue('Experience', -1); if (temp_data != -1) { GM_setValue(player_name + server_name + ' Experience', temp_data); GM_deleteValue('Experience'); document.cookie = 'ActivityTrackerBackup=0;expires=' + new Date('1999'); } temp_data = GM_getValue(player_name + server_name + ' Experience', -1); if (temp_data != -1) { experience = temp_data.split(','); // migrate earlier version that didn't store watchers and adventurers data if (experience[0].split('#').length != EXPERIENCE_RECORD) { var experience_record = new Array(EXPERIENCE_RECORD); for (var x = 0; x < experience.length; x++) { experience[x] = experience[x] + '#0#0'; } document.cookie = player_name + server_name + 'ActivityTrackerBackup=0' + ';expires=' + new Date('1999'); } else { var backup_data = getCookie(player_name + server_name + 'ActivityTrackerBackup'); if (backup_data != 0) { var backup_array = backup_data.split(','); for (var z = 0; z < backup_array.length; z++) { var updated = false; for (var y = 0; y < experience.length; y++) { if (experience[y].substring(0,DATESTAMP_SIZE) == backup_array[z].substring(0,DATESTAMP_SIZE)) { experience[y] = backup_array[z]; updated = true; } } if (!updated) { experience.push(backup_array[z]); } } experience.sort(); experience.reverse(); } } } else { experience = new Array(); } } // this function returns the value of a stored cookie function getCookie(cookie_key) { var i,x,y,ARRcookies=document.cookie.split(';'); for (i=0;i<ARRcookies.length;i++) { x=ARRcookies[i].substr(0,ARRcookies[i].indexOf('=')); y=ARRcookies[i].substr(ARRcookies[i].indexOf('=')+1); x=x.replace(/^\s+|\s+$/g,''); if (x==cookie_key) { return unescape(y); } } return 0; } function setExperienceData() { experience.sort(); experience.reverse(); GM_setValue(player_name + server_name + ' Experience', experience.toString()); // keep last n days of data as cookie to recover from broswer crashes // n is determined by COMPARTMENT_SIZE var backup_data = new Array(); var days_to_keep; (experience.length > COMPARTMENT_SIZE) ? (days_to_keep = COMPARTMENT_SIZE) : (days_to_keep = experience.length); var z = 0; while (z < days_to_keep) { backup_data.push(experience[z]); z++; } document.cookie = player_name + server_name + 'ActivityTrackerBackup=' + backup_data.toString() + ';expires=' + new Date('2050'); } function createExperienceRecord(passed_experience_record) { new_record = passed_experience_record.toString().replace(/,/g,'#'); for (var z = 0; z < experience.length; z++) { if (experience[z].substring(0,DATESTAMP_SIZE) == new_record.substring(0,DATESTAMP_SIZE)) { if (experience[z] != new_record) { experience[z] = new_record; } return; } } if (experience.length == 0) { var first_record = (parseInt(new_record.substring(0,DATESTAMP_SIZE)) - 1) + new_record.substring(DATESTAMP_SIZE); experience.push(first_record); } experience.push(new_record); } // parse experience, faction, and guild points and return as an array function getExperienceRecord() { var all_tables = document.getElementsByTagName('table'); var main_table; var matched; var combat_level; var experience_td, faction_td; var faction_array = new Array(); var temp_experience_record = new Array(EXPERIENCE_RECORD); for (var i = 0; i < all_tables.length; i++) { if ((all_tables[i].innerHTML.indexOf('Combat level') != -1) && (all_tables[i].innerHTML.indexOf('Necromancer') != -1) && (all_tables[i].innerHTML.indexOf('Laborers') != -1)) { main_table = all_tables[i]; } } var all_tds = main_table.getElementsByTagName('td'); for (var i = 0; i < all_tds.length; i++) { if ((all_tds[i].innerHTML.indexOf('Necromancer') != -1) && (all_tds[i].innerHTML.indexOf('Laborers') != -1)) { faction_td = all_tds[i]; } if (all_tds[i].innerHTML.indexOf('Combat level') != -1) { experience_td = all_tds[i]; } } matched = experience_td.innerHTML.replace(/,/g, '').match(/\((\d*)\)/); temp_experience_record[EXP] = RegExp.$1; faction_array = faction_td.innerHTML.split(' '); for (var i = 0; i < faction_array.length; i++) { // faction points matched = faction_array[i].match(/Knight: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[KNIGHT] = RegExp.$1; } matched = faction_array[i].match(/Necromancer: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[NECRO] = RegExp.$1; } matched = faction_array[i].match(/Wizard: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[WIZARD] = RegExp.$1; } matched = faction_array[i].match(/Elf: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[ELF] = RegExp.$1; } matched = faction_array[i].match(/Barbarian: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[BARBARIAN] = RegExp.$1; } matched = faction_array[i].match(/Dark elf: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[DARK_ELF] = RegExp.$1; } matched = faction_array[i].match(/Demon: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[DEMON] = RegExp.$1; } matched = faction_array[i].match(/Dwarf: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[DWARF] = RegExp.$1; } matched = faction_array[i].match(/Tribal: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[TRIBAL] = RegExp.$1; } //guilds matched = faction_array[i].match(/Hunters' guild:/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[HG] = RegExp.$1; } matched = faction_array[i].match(/Laborers' guild: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[LG] = RegExp.$1; } matched = faction_array[i].match(/Gamblers' guild: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[GG] = RegExp.$1; } matched = faction_array[i].match(/Thieves' guild: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[TG] = RegExp.$1; } matched = faction_array[i].match(/Rangers' Guild: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[RG] = RegExp.$1; } matched = faction_array[i].match(/Mercenaries' guild: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[MG] = RegExp.$1; } matched = faction_array[i].match(/Commanders' guild: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[CG] = RegExp.$1; } matched = faction_array[i].match(/Smiths' guild: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[SG] = RegExp.$1; } matched = faction_array[i].match(/Watchers' guild: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[WG] = RegExp.$1; } matched = faction_array[i].match(/Adventurers' guild: (\d*)/); if (matched != null) { matched = faction_array[i].match(/\((\d*.\d*)\)/); temp_experience_record[AG] = RegExp.$1; } } matched = document.getElementById('home_2').innerHTML.match(/\((\d*.\d*)\)/); temp_experience_record[EG] = RegExp.$1; var localDate = new Date(); var utcDate = localDate.getTime() + (localDate.getTimezoneOffset() * 60000); //in ms var serverDate = new Date(utcDate + (3600000*4)); //GMT+4 var year = serverDate.getFullYear(); var month = serverDate.getMonth() + 1; if (month.toString().length == 1) { month = '0' + month; } var day = serverDate.getDate(); if (day.toString().length == 1) { day = '0' + day; } temp_experience_record[DATESTAMP] = '' + year + month + day; temp_experience_record[FSP] = roundNumber((parseFloat(temp_experience_record[KNIGHT]) + parseFloat(temp_experience_record[NECRO]) + parseFloat(temp_experience_record[WIZARD]) + parseFloat(temp_experience_record[ELF]) + parseFloat(temp_experience_record[BARBARIAN]) + parseFloat(temp_experience_record[DARK_ELF]) + parseFloat(temp_experience_record[DEMON]) + parseFloat(temp_experience_record[DWARF]) + parseFloat(temp_experience_record[TRIBAL])), 2); temp_experience_record[XX] = 0; temp_experience_record[YY] = 0; temp_experience_record[ZZ] = 0; if (debug) {GM_log( '\nServer timestamp = ' + serverDate + '\n\nKnight FSP = ' + temp_experience_record[KNIGHT] + '\nNecromancer FSP = ' + temp_experience_record[NECRO] + '\nWizard FSP = ' + temp_experience_record[WIZARD] + '\nElf FSP = ' + temp_experience_record[ELF] + '\nBarbarian FSP = ' + temp_experience_record[BARBARIAN] + '\nDark elf FSP = ' + temp_experience_record[DARK_ELF] + '\nDemon FSP = ' + temp_experience_record[DEMON] + '\nDwarf FSP = ' + temp_experience_record[DWARF] + '\nTribal FSP = ' + temp_experience_record[TRIBAL] + '\n\n\nHunters\' guild = ' + temp_experience_record[HG] + '\nLaborers\' guild = ' + temp_experience_record[LG] + '\nGamblers\' guild = ' + temp_experience_record[GG] + '\nThieves\' guild = ' + temp_experience_record[TG] + '\nRangers\' guild = ' + temp_experience_record[RG] + '\nMercenaries\' guild = ' + temp_experience_record[MG] + '\nCommanders\' guild = ' + temp_experience_record[CG] + '\nSmiths\' guild = ' + temp_experience_record[SG] + '\nWatchers\' guild = ' + temp_experience_record[WG] + '\nAdventurers\' guild = ' + temp_experience_record[AG] )} return temp_experience_record; } function buildTracker() { var record1, record2; for (var z = 0; z < experience.length - 1; z++) { var difference_record = new Array(); record1 = experience[z].split('#'); record2 = experience[z + 1].split('#'); difference_record[DATESTAMP] = record1[DATESTAMP]; for (var y = 1; y < record1.length; y++) { if (record1[y] != record2[y]) { difference_record[y] = record1[y] - record2[y]; } else { difference_record[y] = ''; } } tracker.push(difference_record); // no need to track historical data that will not be displayed on the graph if (tracker.length == GRAPH_RECORDS) { break; } } } function displayTracker() { var all_tables = document.getElementsByTagName('tbody'); var main_table; var experience_td, faction_td; for (var i = 0; i < all_tables.length; i++) { if ((all_tables[i].innerHTML.indexOf('Combat level') != -1) && (all_tables[i].innerHTML.indexOf('Necromancer') != -1) && (all_tables[i].innerHTML.indexOf('Laborers') != -1)) { main_table = all_tables[i]; } } faction_td = main_table.getElementsByTagName('td')[1]; faction_td.rowSpan = 2; var tr = document.createElement('tr'); var td = document.createElement('td'); graph_div = document.createElement('div'); graph_div.id = 'graph_div'; td.appendChild(graph_div); select = document.createElement('select'); select.id = 'select'; addOption(select, EXP, EXP_L); addOption(select, FSP, FSP_L); addOption(select, KNIGHT, KNIGHT_L); addOption(select, NECRO, NECRO_L); addOption(select, WIZARD, WIZARD_L); addOption(select, ELF, ELF_L); addOption(select, BARBARIAN, BARBARIAN_L); addOption(select, DARK_ELF, DARK_ELF_L); addOption(select, DEMON, DEMON_L); addOption(select, DWARF, DWARF_L); addOption(select, TRIBAL, TRIBAL_L); addOption(select, HG, HG_L); addOption(select, LG, LG_L); addOption(select, GG, GG_L); addOption(select, TG, TG_L); addOption(select, MG, MG_L); addOption(select, CG, CG_L); addOption(select, SG, SG_L); addOption(select, EG, EG_L); addOption(select, RG, RG_L); addOption(select, WG, WG_L); addOption(select, AG, AG_L); select.onchange = function() { if (document.getElementById('graph') != null) { document.getElementById('graph_div').removeChild(document.getElementById('graph')); } GM_setValue('default activity', parseInt(select.options[select.selectedIndex].value)); if(debug) {GM_log('Display tracking for: ' + select.options[select.selectedIndex].text)} document.getElementById('graph_div').appendChild(getActivityGraph(parseInt(select.options[select.selectedIndex].value))); } td.insertBefore(document.createElement('br'), td.firstChild); td.insertBefore(document.createElement('br'), td.firstChild); td.insertBefore(select, td.firstChild); var temp_activity = GM_getValue('default activity', -1); if (temp_activity != -1) { graph_div.appendChild(getActivityGraph(temp_activity)); for(var i=0; i < select.options.length; i++){ if(select.options[i].value == temp_activity) select.selectedIndex = i; } } else { GM_setValue('default activity', EXP); graph_div.appendChild(getActivityGraph(EXP)); } td.appendChild(createOptionsDiv()); tr.appendChild(td); main_table.appendChild(tr); function addOption(optionList, value, text) { var option; option = document.createElement('option'); option.value = value; option.text = text; optionList.appendChild(option); } } function createOptionsDiv(){ options_div = document.createElement('div'); var button_div = document.createElement('div'); options_div.appendChild(button_div); var el = document.createElement('input'); el.type = 'button'; el.addEventListener('click', backupActivityData, false); el.setAttribute('value', 'Backup'); button_div.appendChild(el); el = document.createElement('input'); el.type = 'button'; el.addEventListener('click', updateActivityData, false); el.setAttribute('value', 'Update'); button_div.appendChild(el); el = document.createElement('input'); el.type = 'button'; el.addEventListener('click', restoreActivityData, false); el.setAttribute('value', 'Restore'); button_div.appendChild(el); button_div.appendChild(document.createElement('br')); backup_div = document.createElement('div'); backup_div.id = 'activityTrackerDataDiv'; backup_div.style.display = 'none'; options_div.appendChild(backup_div); backup_div.appendChild(document.createTextNode('Paste modified data below and click Update to update graph or Restore to restore last backup of data')); el = document.createElement('textarea'); el.id = 'activityTrackerData'; el.style.width = graph_width * empty_cell_size + date_cell_width; el.style.height = graph_width; el.style.resize = 'none'; backup_div.appendChild(el); return options_div; } function getActivityGraph(activity_type) { var max_value = 0; var second_max_value = 0; var activity_value; var header_sections = 5; // find maximum value for (var z = 0; z < tracker.length; z++) { if (tracker[z][activity_type] > max_value) { second_max_value = max_value; max_value = tracker[z][activity_type]; } else if (tracker[z][activity_type] > second_max_value) { second_max_value = tracker[z][activity_type]; } } max_value = roundUp(max_value); second_max_value = roundUp(second_max_value); if (second_max_value != 0) { // prevent value spikes from distorting the look of the graph if (max_value/2 > second_max_value) { max_value = second_max_value; } } // graph values var tr, td; var bgcolor = DARK_BG; graph = document.createElement('table'); graph.id = 'graph'; graph.className='wblight'; graph.align = 'center'; graph.border = 0; graph.cellSpacing = 0; tr = document.createElement('tr'); tr.className = 'wb'; tr.bgColor = DARK_BG; td = document.createElement('td'); td.width = date_cell_width; td.className = 'wb'; td.style.fontSize = 8; td.innerHTML = labels[activity_type].bold(); td.align = 'center'; tr.appendChild(td); if (max_value != 0) { if (max_value <= 5) { max_value = 5; } else if (max_value <=10) { max_value = 10; } for (var z = 0; z < header_sections; z++) { td = document.createElement('td'); td.className = 'wb'; td.colSpan = graph_width / header_sections; td.align = 'right'; td.style.fontSize = 8; td.innerHTML = roundNumber((max_value * (z + 1)) / header_sections , 2); tr.appendChild(td); } } else { td = document.createElement('td'); td.className = 'wb'; td.colSpan = graph_width; tr.appendChild(td); } graph.appendChild(tr); var line_counter = COMPARTMENT_SIZE; var class_name = 'wblight'; for (var z = 0; z < lineCount(tracker.length); z++) { if (z == GRAPH_RECORDS) { break; } tr = document.createElement('tr'); tr.bgColor = GRAPH_COLOR; tr.onmouseover = invertColor; tr.onmouseout = restoreColor; if (line_counter == COMPARTMENT_SIZE) { line_counter = 0; td = document.createElement('td'); td.width = date_cell_width; td.align = 'center'; td.style.fontSize = 8; if (z < tracker.length) { td.innerHTML = tracker[z][DATESTAMP].substr(0,4) + '-' + tracker[z][DATESTAMP].substr(4,2) + '-' + tracker[z][DATESTAMP].substr(6,2); } (bgcolor == LIGHT_BG) ? bgcolor = DARK_BG : bgcolor = LIGHT_BG; td.className = 'wb'; td.bgColor = bgcolor; td.rowSpan = COMPARTMENT_SIZE; tr.appendChild(td); tr.style.borderTop = '1px solid black'; } line_counter++; if (z < tracker.length) { activity_value = roundNumber(tracker[z][activity_type]*graph_width/max_value, 0); if (tracker[z][activity_type] > 0) { tr.id = tracker[z][DATESTAMP].substr(0,4) + '-' + tracker[z][DATESTAMP].substr(4,2) + '-' + tracker[z][DATESTAMP].substr(6,2) + ':\u00a0\u00a0\u00a0' + roundNumber(tracker[z][activity_type], 2); } } else { activity_value = 0; } for (var y = 0; y < graph_width; y++) { td = document.createElement('td'); td.style.height = empty_cell_size; td.style.width = empty_cell_size; activity_value--; if (activity_value >= 0) { td.className = 'NormalColor'; } else { td.bgColor = bgcolor; } tr.appendChild(td); } graph.appendChild(tr); } if (tracker.length > COMPARTMENT_SIZE) { var average_points = getAveragePoints(activity_type); if (average_points != -1) { var estimate = provideEstimate(average_points, activity_type); if (estimate != -1) { tr = document.createElement('tr'); tr.className = 'wb'; (bgcolor == LIGHT_BG) ? tr.bgColor = DARK_BG : tr.bgColor = LIGHT_BG; td = document.createElement('td'); td.colSpan = graph_width + 1; td.className = 'wb'; td.style.fontSize = 8; td.innerHTML = estimate; td.align = 'center'; tr.appendChild(td); graph.appendChild(tr); } } } return graph; } function getAveragePoints(activity_type) { var points_total = 0; for (var z = 1; z < COMPARTMENT_SIZE + 1; z++) { if (tracker[z][activity_type] != '') { points_total += roundNumber(parseFloat(tracker[z][activity_type]), 2); } } if (points_total == 0) { return -1; } else { return roundNumber(points_total / COMPARTMENT_SIZE, 2); //daily average } } function provideEstimate(average_points, activity_type) { //define experience, faction, and guild levels var combat_lvl = [0,1500,4500,15000,32000,90000,190000,400000,860000,1650000,3000000, 5000000,8500000,14500000,25000000,43000000,70000000,108000000, 160000000,230000000,325000000]; var faction_lvl = [20,50,90,160,280,500,900,1600,2900,5300,9600,17300]; var hg_lvl = [16,60,180,400,700,1200,2000,3000,4300,6000,8000,10500]; var lg_lvl = [90,180,360,720,1500,3000,5000,8000,12000,17000,23000,30000,38000,47000,57000]; var gg_lvl = [10,30,60,100,150,210,280,360,450,550,660,800,1000,1300,2000]; var tg_lvl = [50,120,240,400,600,840,1200,2000,3000,4300,6000,8000,10800,14000,17600,21600,26000]; var rg_lvl = [100,240,480,800,1200,1680,2400,4000,6000,8600,12000]; var mg_lvl = [50,120,300,600,1000,1500,2200,3000,4000,5500,7800,11000,14500,18200,22200]; var cg_lvl = [150, 350, 750, 1400,2200,3200,4300,5600,7000,8500]; var sg_lvl = [30,80,165,310,555,970,1680,2885,5770]; var eg_lvl = [104,588,2200,7000,10000]; var wg_lvl = [60,200,450,850,1500]; var working_array = new Array(); switch(activity_type) { case EXP: working_array = combat_lvl; break; case FSP: return -1; case KNIGHT: case NECRO: case WIZARD: case ELF: case BARBARIAN: case DARK_ELF: case DEMON: case DWARF: case TRIBAL: working_array = faction_lvl; break; case HG: working_array = hg_lvl; break; case LG: working_array = lg_lvl; break; case GG: working_array = gg_lvl; break; case TG: working_array = tg_lvl; break; case RG: working_array = rg_lvl; break; case MG: working_array = mg_lvl; break; case CG: working_array = cg_lvl; break; case SG: working_array = sg_lvl; break; case EG: working_array = eg_lvl; break; case WG: working_array = wg_lvl; break; default: return -1; } var current_points = experience[0].split('#')[activity_type]; if (current_points >= working_array[working_array.length - 1]) { // player has reached the maximum already return -1; } var points_required; var next_level; if (current_points < working_array[0]) { points_required = working_array[0] - current_points; } else { for (var x = 0; x < working_array.length; x++) { if ((current_points >= working_array[x]) && (current_points < working_array[x + 1])) { points_required = working_array[x + 1] - current_points; next_level = x + 2; break; } } } var message = 'In the past ' + COMPARTMENT_SIZE + ' days you averaged ' + average_points + ' per day. '; message += 'If you maintain your daily average, you will reach '; message += 'level ' + next_level; if (roundNumber(points_required / average_points, 0) == 0){ message += ' today.' } else if (roundNumber(points_required / average_points, 0) == 1){ message += ' tomorrow.' } else { message += ' in ' + roundNumber(points_required / average_points, 0) + ' days.'; } return message; } function backupActivityData() { var backup_value = GM_getValue(player_name + server_name + ' Experience Backup', -1); if (backup_value != -1) { var backup_value_date = GM_getValue(player_name + server_name + ' Experience Backup Date', -1); var response = confirm('The script has detected a backup dated:\n' + backup_value_date + '\nIf you proceed, the script will overwrite it.\nAre you sure you want to continue?'); if (!response) {return;} } GM_setValue(player_name + server_name + ' Experience Backup', experience.toString()); GM_setValue(player_name + server_name + ' Experience Backup Date', new Date().toString()); backup_div.style.display = 'block'; var header = ''; for (var z = 0; z < labels.length; z++) { header += labels[z]; if (z < labels.length - 1) { header += '\t'; } } header += '\n'; document.getElementById('activityTrackerData').value = header + experience.toString().replace(/#/g, '\t').replace(/,/g, '\n'); document.getElementById('activityTrackerData').select(); } function updateActivityData() { if (backup_div.style.display == 'none') {return;} var temp_data = document.getElementById('activityTrackerData').value.replace(/\t/g, '#').replace(/\n/g, ','); if (temp_data.substring(temp_data.length - 1) == ',') {temp_data = temp_data.substring(0, temp_data.length - 1);} var temp_array = new Array(); temp_array = temp_data.split(','); for (var z = 1; z < temp_array.length; z++) { var temp_record = temp_array[z].split('#'); for (var y = 0; y < temp_record.length; y++) { if (!isNumber(temp_record[y])) { alert('Encountered an invalid value: ' + temp_record[y] + '\nFound in Row: ' + z + ' Col: ' + (y + 1) + '\nPlease correct the value and try again.'); return; } } } temp_array.splice(0, 1); // remove column names experience = temp_array; setExperienceData(); window.location.reload(); } function restoreActivityData() { var backup_value = GM_getValue(player_name + server_name + ' Experience Backup', -1); if (backup_value != -1) { var backup_value_date = GM_getValue(player_name + server_name + ' Experience Backup Date', -1); var response = confirm('The script has detected a backup dated:\n' + backup_value_date + '\nIf you proceed, the script will replace current data with this backup.\nAre you sure you want to continue?'); if (!response) {return;} experience = backup_value.split(','); setExperienceData(); window.location.reload(); } else { alert('The script didn\'t find any backup to restore.'); } } function invertColor() { if (this.id) { this.bgColor = INVERT_GRAPH_COLOR; tooltip.show(this.id); } } function restoreColor() { if (this.id) { this.bgColor = GRAPH_COLOR; tooltip.hide(); } } function roundNumber(unrounded_number, decimals) { var rounded_number = Math.round(unrounded_number*Math.pow(10,decimals))/Math.pow(10,decimals); return rounded_number; } function roundUp(unrounded_number){ var float_number, int_number, rounded_number, without_round_up; if (parseInt(unrounded_number) != unrounded_number) { //float if (roundNumber(unrounded_number, 0) != roundNumber(unrounded_number + 0.5, 0)) { //need to prevent rounding down unrounded_number += 0.5; } } unrounded_number = roundNumber(unrounded_number, 0); rounded_number = (parseInt(unrounded_number.toString().substring(0,1)) + 1); without_round_up = parseInt(unrounded_number.toString().substring(0,1)); for (var z = 1; z < unrounded_number.toString().length; z++) { rounded_number *= 10; without_round_up *= 10; } return (without_round_up == unrounded_number) ? without_round_up : rounded_number; } function isNumber(n) { return !isNaN(parseFloat(n)) && isFinite(n); } function lineCount(data_lines) { return (data_lines < COMPARTMENT_SIZE) ? COMPARTMENT_SIZE : Math.ceil(parseInt(data_lines)/COMPARTMENT_SIZE)*COMPARTMENT_SIZE; } function tooltipStyle() { var style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = '#tt { position:absolute; display:block;}'; style.innerHTML += '#ttcont { display:block; padding:2px 12px 3px 7px; margin-left:5px; background:#666; color:#fff; }'; document.body.appendChild(style); } var tooltip = function(){ var id = 'tt'; var top = 3; var left = 3; var speed = 10; var timer = 20; var endalpha = 95; var alpha = 0; var tt,t,c,b,h; return{ show:function(v,w){ if(tt == null){ tt = document.createElement('div'); tt.setAttribute('id',id); c = document.createElement('div'); c.setAttribute('id',id + 'cont'); tt.appendChild(c); document.body.appendChild(tt); tt.style.opacity = 0; tt.style.filter = 'alpha(opacity=0)'; document.onmousemove = this.pos; } tt.style.display = 'block'; c.innerHTML = v; tt.style.width = v.length * 8; h = parseInt(tt.offsetHeight) + top; clearInterval(tt.timer); tt.timer = setInterval(function(){tooltip.fade(1)},timer); }, pos:function(e){ var u = e.pageY; var l = e.pageX; tt.style.top = (u + 5) + 'px'; tt.style.left = (l + left) + 'px'; }, fade:function(d){ var a = alpha; if((a != endalpha && d == 1) || (a != 0 && d == -1)){ var i = speed; if(endalpha - a < speed && d == 1){ i = endalpha - a; }else if(alpha < speed && d == -1){ i = a; } alpha = a + (i * d); tt.style.opacity = alpha * .01; tt.style.filter = 'alpha(opacity=' + alpha + ')'; }else{ clearInterval(tt.timer); if(d == -1){tt.style.display = 'none'} } }, hide:function(){ clearInterval(tt.timer); tt.timer = setInterval(function(){tooltip.fade(-1)},timer); } }; }(); function supportsHTML5Storage() { try { return 'localStorage' in window && window['localStorage'] !== null; } catch (e) { if (debug) GM_log('HTML5 Storage is not supported'); return false; } }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址