Melvor Completion Log Helper

Replaces question mark icon in the Item Completion Log, Mastery Progression, Pet Completion and Monster Completion Log with greyed out images of items/pets/monsters that you have yet to get/kill and adds links to the wiki.

当前为 2020-08-14 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Melvor Completion Log Helper
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.2.0
  5. // @description Replaces question mark icon in the Item Completion Log, Mastery Progression, Pet Completion and Monster Completion Log with greyed out images of items/pets/monsters that you have yet to get/kill and adds links to the wiki.
  6. // @author Breindahl#2660
  7. // @match https://*.melvoridle.com/*
  8. // @grant none
  9. // ==/UserScript==
  10. /* jshint esversion: 6 */
  11.  
  12. // Made for version 0.16
  13.  
  14. (main => {
  15. var script = document.createElement('script');
  16. script.textContent = `try {(${main})();} catch (e) {console.log(e);}`;
  17. document.body.appendChild(script).parentNode.removeChild(script);
  18. })(() => {
  19.  
  20. // Loading script
  21. console.log('Melvor Completion Log Helper Loaded');
  22.  
  23. function openItemLogExtra() {
  24. let timesFound = (timesSold = gpFromSale = deathCount = damageTaken = damageDealt = missedAttacks = timesEaten = healedFor = totalAttacks = amountUsedInCombat = timeWaited = timesDied = timesGrown = harvestAmount = enemiesKilled = timesOpened = '');
  25. $('#itemlog-container').html('');
  26. for (let i = 0; i < itemStats.length; i++) {
  27. let itemTooltip;
  28. if (itemStats[i].timesFound > 0) {
  29. timesFound = timesSold = gpFromSale = deathCount = damageTaken = damageDealt = missedAttacks = timesEaten = healedFor = totalAttacks = amountUsedInCombat = timeWaited = timesDied = timesGrown = harvestAmount = enemiesKilled = timesOpened = '';
  30. if (itemStats[i].timesFound > 0) timesFound = "<br>Times Found: <small class='text-warning'>" + formatNumber(itemStats[i].timesFound) + '</small>';
  31. if (itemStats[i].timesSold > 0) timesSold = "<br>Quantity Sold: <small class='text-warning'>" + formatNumber(itemStats[i].timesSold) + '</small>';
  32. if (itemStats[i].gpFromSale > 0) gpFromSale = "<br>GP Gained from sales: <small class='text-warning'>" + formatNumber(itemStats[i].gpFromSale) + '</small>';
  33. if (itemStats[i].deathCount > 0) deathCount = "<br>Times lost due to death: <small class='text-warning'>" + formatNumber(itemStats[i].deathCount) + '</small>';
  34. if (itemStats[i].damageTaken > 0) damageTaken = "<br>Damage Taken whilst Equipped: <small class='text-warning'>" + formatNumber(itemStats[i].damageTaken) + '</small>';
  35. if (itemStats[i].damageDealt > 0) damageDealt = "<br>Damage Dealt: <small class='text-warning'>" + formatNumber(itemStats[i].damageDealt) + '</small>';
  36. if (itemStats[i].missedAttacks > 0) missedAttacks = "<br>Attacks Missed: <small class='text-warning'>" + formatNumber(itemStats[i].missedAttacks) + '</small>';
  37. if (itemStats[i].timesEaten > 0) timesEaten = "<br>Times Eaten: <small class='text-warning'>" + formatNumber(itemStats[i].timesEaten) + '</small>';
  38. if (itemStats[i].healedFor > 0) healedFor = "<br>Healed for: <small class='text-warning'>" + formatNumber(itemStats[i].healedFor) + '</small>';
  39. if (itemStats[i].totalAttacks > 0) totalAttacks = "<br>Total Attacks: <small class='text-warning'>" + formatNumber(itemStats[i].totalAttacks) + '</small>';
  40. if (itemStats[i].amountUsedInCombat > 0) amountUsedInCombat = "<br>Amount used in combat: <small class='text-warning'>" + formatNumber(itemStats[i].amountUsedInCombat) + '</small>';
  41. if (itemStats[i].timeWaited > 0) timeWaited = "<br>Time spent waiting to grow: <small class='text-warning'>" + formatNumber(itemStats[i].timeWaited) + '</small>';
  42. if (itemStats[i].timesDied > 0) timesDied = "<br>Crop deaths: <small class='text-warning'>" + formatNumber(itemStats[i].timesDied) + '</small>';
  43. if (itemStats[i].timesGrown > 0) timesGrown = "<br>Successful grows: <small class='text-warning'>" + formatNumber(itemStats[i].timesGrown) + '</small>';
  44. if (itemStats[i].harvestAmount > 0) harvestAmount = "<br>Amount harvested: <small class='text-warning'>" + formatNumber(itemStats[i].harvestAmount) + '</small>';
  45. if (itemStats[i].enemiesKilled > 0) enemiesKilled = "<br>Enemies killed: <small class='text-warning'>" + formatNumber(itemStats[i].enemiesKilled) + '</small>';
  46. if (itemStats[i].timesOpened > 0) timesOpened = "<br>Opened: <small class='text-warning'>" + formatNumber(itemStats[i].timesOpened) + '</small>';
  47. $('#itemlog-container').append('<img class="skill-icon-sm" id="item-log-img-' + i + '" src="' + items[i].media + '">');
  48. itemTooltip = "<div class='text-center'>" + items[i].name + "<small class='text-info'> " + timesFound + timesSold + gpFromSale + totalAttacks + missedAttacks + damageDealt + damageTaken + enemiesKilled + amountUsedInCombat + timesEaten + healedFor + timesGrown + timesDied + timeWaited + harvestAmount + timesOpened + '</small></div>';
  49. } else {
  50. $('#itemlog-container').append('<a href="https://wiki.melvoridle.com/index.php?title=' + items[i].name + '" target="blank"><img class="skill-icon-sm" id="item-log-img-' + i + '" style="opacity:0.3;filter: grayscale(30%);" src="' + items[i].media + '"></a>');
  51. itemTooltip = "<div class='text-center'>" + items[i].name + "</div>";
  52. }
  53. tippy('#item-log-img-' + i, {
  54. content: itemTooltip,
  55. placement: 'bottom',
  56. allowHTML: true,
  57. interactive: false,
  58. animation: false,
  59. });
  60. }
  61. //updateTooltips();
  62. $('#modal-item-log').modal('show');
  63. }
  64.  
  65. function openMonsterLogExtra() {
  66. let damageDealtToPlayer = (damageTakenFromPlayer = killedByPlayer = killedPlayer = hitsToPlayer = hitsFromPlayer = enemyMissed = playerMissed = seen = ranAway = '');
  67. $('#monsterlog-container').html('');
  68. for (let i = 0; i < monsterStats.length; i++) {
  69. let monsterTooltip;
  70. if (monsterStats[i].killedByPlayer > 0) {
  71. damageDealtToPlayer = damageTakenFromPlayer = killedByPlayer = killedPlayer = hitsToPlayer = hitsFromPlayer = enemyMissed = playerMissed = seen = ranAway = '';
  72. damageTakenFromPlayer = "<br>Total Damage Dealt to Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].damageTakenFromPlayer) + '</small>';
  73. damageDealtToPlayer = "<br>Total Damage Taken from Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].damageDealtToPlayer) + '</small>';
  74. killedByPlayer = "<br>Times Slain: <small class='text-warning'>" + formatNumber(monsterStats[i].killedByPlayer) + '</small>';
  75. killedPlayer = "<br>Times Killed by Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].killedPlayer) + '</small>';
  76. hitsToPlayer = "<br>Successful hits by Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].hitsToPlayer) + '</small>';
  77. hitsFromPlayer = "<br>Successful hits to Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].hitsFromPlayer) + '</small>';
  78. enemyMissed = "<br>Missed Attacks by Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].enemyMissed) + '</small>';
  79. playerMissed = "<br>Missed Attacks to Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].playerMissed) + '</small>';
  80. seen = "<br>Times Fought: <small class='text-warning'>" + formatNumber(monsterStats[i].seen) + '</small>';
  81. ranAway = "<br>Times Ran Away: <small class='text-warning'>" + formatNumber(monsterStats[i].ranAway) + '</small>';
  82. $('#monsterlog-container').append('<img class="skill-icon-md" id="monster-log-img-' + i + '" src="' + MONSTERS[i].media + '">');
  83. monsterTooltip = "<div class='text-center'>" + MONSTERS[i].name + "<small class='text-info'> " + seen + killedByPlayer + killedPlayer + damageTakenFromPlayer + damageDealtToPlayer + hitsFromPlayer + hitsToPlayer + playerMissed + enemyMissed + ranAway + "</small></div>";
  84. } else {
  85. $('#monsterlog-container').append('<a href="https://wiki.melvoridle.com/index.php?title=' + MONSTERS[i].name + '" target="blank"><img class="skill-icon-md" id="monster-log-img-' + i + '" style="opacity:0.3;filter: grayscale(30%);" src="' + MONSTERS[i].media + '"></a>');
  86. monsterTooltip = "<div class='text-center'>" + MONSTERS[i].name + "</div>";
  87. }
  88. tippy('#monster-log-img-' + i, {
  89. content: monsterTooltip,
  90. placement: 'bottom',
  91. allowHTML: true,
  92. interactive: false,
  93. animation: false,
  94. });
  95. }
  96. updateTooltips();
  97. $('#modal-monster-log').modal('show');
  98. }
  99.  
  100. function openPetLogExtra() {
  101. $('#petlog-container').html('');
  102. for (let i = 0; i < PETS.length; i++) {
  103. let tooltop;
  104. if (petUnlocked[i]) {
  105. $('#petlog-container').append('<img class="skill-icon-md" id="pet-log-img-' + i + '" src="' + PETS[i].media + '">');
  106. tooltip = '<div class="text-center"><span class="text-warning">' + PETS[i].name + '</span><br><span class="text-info">' + PETS[i].description + '</span></div>';
  107. } else {
  108. $('#petlog-container').append('<a href="https://wiki.melvoridle.com/index.php?title=' + PETS[i].name + '" target="blank"><img class="skill-icon-md" id="pet-log-img-' + i + '" style="opacity:0.3;filter: grayscale(50%);" src="' + PETS[i].media + '"></a>');
  109. tooltip = '<div class="text-center">' + PETS[i].name + '<br><small class=\'text-danger\'>Hint: ' + PETS[i].acquiredBy + '</small></div>';
  110. }
  111. tippy('#pet-log-img-' + i, {
  112. content: tooltip,
  113. placement: 'bottom',
  114. allowHTML: true,
  115. interactive: false,
  116. animation: false,
  117. });
  118. }
  119. $('#modal-pet-log').modal('show');
  120. }
  121. function showMasteryProgressExtra(skill, masteryArray) {
  122. $('#modal-content-mastery').html('');
  123. let masteryHtml = '';
  124. masteryHtml += '<div class="block block-rounded block-link-pop border-top border-' + setToLowercase(skillName[skill]) + ' border-4x">';
  125. masteryHtml += '<div class="block-header">';
  126. masteryHtml += '<h3 class="block-title"><img class="mastery-icon-xs mr-2" src="assets/media/main/mastery_header.svg">' + skillName[skill] + '</h3>';
  127. masteryHtml += '<div class="block-options"><button type="button" class="btn-block-option" data-dismiss="modal" aria-label="Close"><i class="fa fa-fw fa-times"></i></button></div>';
  128. masteryHtml += '</div>';
  129. masteryHtml += '<div class="row"><div class="col-12"><div class="block-content">';
  130. masteryHtml += '<table class="table table-sm table-vcenter">';
  131. masteryHtml += '<thead><tr><th class="text-center" style="width: 65px;">Item</th><th class="text-center" style="width: 65px;">Level</th><th>Progress</th></tr></thead><tbody>';
  132. let currentLevelXP;
  133. let nextLevelXP;
  134. let nextMasteryProgress;
  135. if (skill === CONSTANTS.skill.Smithing) {
  136. for (let i = 0; i < smithingSorted.length; i++) {
  137. masteryHtml += '<tr>';
  138. masteryHtml += '<th class="text-center" scope="row">';
  139. if (masteryArray[smithingSorted[i].smithingID].masteryXP < 1) {
  140. let media = getMasteryMedia(i, skill);
  141. masteryHtml += '<img class="milestone-icon" style="opacity:0.3;filter: grayscale(50%);" src="' + media + '">';
  142. } else {
  143. let media = getMasteryMedia(i, skill);
  144. masteryHtml += '<img class="milestone-icon" src="' + media + '">';
  145. }
  146. masteryHtml += '</th>';
  147. masteryHtml += '<th class="text-center" scope="row">';
  148. masteryHtml += masteryArray[smithingSorted[i].smithingID].mastery;
  149. masteryHtml += '</th>';
  150. masteryHtml += '<td class="font-w600 font-size-sm">';
  151. masteryHtml += '<div class="progress active" style="height: 10px">';
  152. currentLevelXP = masteryExp.level_to_xp(masteryArray[smithingSorted[i].smithingID].mastery);
  153. nextLevelXP = masteryExp.level_to_xp(masteryArray[smithingSorted[i].smithingID].mastery + 1);
  154. //Figure out next level progress percentage
  155. nextMasteryProgress = (masteryArray[smithingSorted[i].smithingID].masteryXP - currentLevelXP) / (nextLevelXP - currentLevelXP) * 100;
  156. masteryHtml += '<div class="progress-bar bg-info" role="progressbar" style="width: ' + nextMasteryProgress + '%;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">';
  157. masteryHtml += '</div></div></td></tr>';
  158. }
  159. } else {
  160. for (let i = 0; i < masteryArray.length; i++) {
  161. masteryHtml += '<tr>';
  162. masteryHtml += '<th class="text-center" scope="row">';
  163. if (masteryArray[i].masteryXP < 1) {
  164. let media = getMasteryMedia(i, skill);
  165. masteryHtml += '<img class="milestone-icon" style="opacity:0.3;filter: grayscale(50%);" src="' + media + '">';
  166. } else {
  167. let media = getMasteryMedia(i, skill);
  168. masteryHtml += '<img class="milestone-icon" src="' + media + '">';
  169. }
  170. masteryHtml += '</th>';
  171. if (masteryArray[i].mastery < 99) masteryHtml += '<th class="text-center" scope="row">';
  172. else masteryHtml += '<th class="text-center text-complete" scope="row">';
  173. if (masteryArray[i].mastery > 99) masteryHtml += '99';
  174. else masteryHtml += masteryArray[i].mastery;
  175. masteryHtml += '</th>';
  176. masteryHtml += '<td class="font-w600 font-size-sm">';
  177. masteryHtml += '<div class="progress active" style="height: 10px">';
  178. currentLevelXP = masteryExp.level_to_xp(masteryArray[i].mastery);
  179. nextLevelXP = masteryExp.level_to_xp(masteryArray[i].mastery + 1);
  180. if (masteryArray[i].mastery < 99) {
  181. nextMasteryProgress = (masteryArray[i].masteryXP - currentLevelXP) / (nextLevelXP - currentLevelXP) * 100;
  182. masteryHtml += '<div class="progress-bar bg-info" role="progressbar" style="width: ' + nextMasteryProgress + '%;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">';
  183. } else {
  184. nextMasteryProgress = 100;
  185. masteryHtml += '<div class="progress-bar bg-success" role="progressbar" style="width: ' + nextMasteryProgress + '%;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">';
  186. }
  187. masteryHtml += '</div></div></td></tr>';
  188. }
  189. }
  190. masteryHtml += '</tbody></table></div></div></div></div>';
  191. $('#modal-content-mastery').append(masteryHtml);
  192. $('#modal-mastery').modal('show');
  193. }
  194.  
  195. window.openItemLog = function() {
  196. openItemLogExtra();
  197. };
  198.  
  199. window.openMonsterLog = function() {
  200. openMonsterLogExtra();
  201. };
  202.  
  203. window.openPetLog = function() {
  204. openPetLogExtra();
  205. };
  206.  
  207. window.showMasteryProgress = function(...args) {
  208. showMasteryProgressExtra(...args);
  209. };
  210.  
  211. });

QingJ © 2025

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