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. Also includes toggle for highlighting items in bank.

当前为 2021-03-17 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Melvor Completion Log Helper
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.5.4
  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. Also includes toggle for highlighting items in bank.
  6. // @author Breindahl#2660
  7. // @author GMiclotte
  8. // @match https://*.melvoridle.com/*
  9. // @exclude https://wiki.melvoridle.com*
  10. // @noframes
  11. // @grant none
  12. // ==/UserScript==
  13. /* jshint esversion: 6 */
  14.  
  15. // Made for version 0.18
  16. // Big thanks to Visua#9999 for helping with parts of the code and troubleshooting
  17.  
  18. (function () {
  19. function injectScript(main) {
  20. var script = document.createElement('script');
  21. script.textContent = `try {(${main})();} catch (e) {console.log(e);}`;
  22. document.body.appendChild(script).parentNode.removeChild(script);
  23. }
  24.  
  25. function script() {
  26. // Loading script
  27. console.log('Melvor Completion Log Helper Loaded');
  28. var sheet = document.styleSheets[5];
  29. sheet.insertRule(".item-in-bank-on {border: 1px gold dotted}");
  30.  
  31. $('#modal-item-log').find('.block-options').prepend('<button id="toggleItems" class="btn btn-sm btn-success" style="margin:0px 10px; float:left;">Toggle Found</button>');
  32. $('#modal-item-log').find('.block-options').prepend('<img class="skill-icon-xs m-1 BankBordersOn pointer-enabled" id="toggleBankBorders" style="opacity:50%" src="assets/media/main/bank_header.svg">');
  33. //<img id="toggleBankBorders" class="btn btn-sm btn-success" style="margin:0px 10px; float:left;">Toggle Found</button>')
  34. $(document).ready(function () {
  35. $("#toggleItems").click(function () {
  36. $(".item-found").toggle();
  37. });
  38. $("#toggleBankBorders").click(function () {
  39. if ($("#toggleBankBorders").hasClass("BankBordersOff")) {
  40. $("#toggleBankBorders").removeClass("BankBordersOff").addClass("BankBordersOn").css('opacity', '100%');
  41. $(".item-in-bank").removeClass("item-in-bank-off").addClass("item-in-bank-on");
  42. } else {
  43. $("#toggleBankBorders").removeClass("BankBordersOn").addClass("BankBordersOff").css('opacity', '50%');
  44. $(".item-in-bank").removeClass("item-in-bank-on").addClass("item-in-bank-off");
  45. }
  46. });
  47. });
  48.  
  49. $('#modal-item-log').find('.block-options').prepend('<div class="input-group" style="float:left;width:auto"><input type="text" class="form-control text-danger btn btn-sm" id="searchTextboxItemLog" style="height:auto; text-align:left;" name="searchTextboxItemLog" placeholder="Search Item Log..." autocomplete="off"><div class="input-group-append"><button type="button" class="btn btn-danger btn-sm" id="clearItemLog">X</button></div></div>');
  50.  
  51. const itemIds = items.map((_, id) => id);
  52.  
  53. function updateItemLogSearch(search) {
  54. if (search === '') {
  55. $('#itemlog-container img').removeClass('d-none');
  56. return;
  57. }
  58. search = search.toLowerCase();
  59. const itemsResults = itemIds.filter(id => items[id].name.toLowerCase().includes(search) || items[id].category.toLowerCase().includes(search) || items[id].type.toLowerCase().includes(search) || id == search);
  60. $('#itemlog-container img').addClass('d-none');
  61. for (let i = 0; i < itemsResults.length; i++) {
  62. document.getElementById('item-log-img-' + itemsResults[i]).classList.remove('d-none');
  63. }
  64. }
  65.  
  66. function clearItemLogSearch() {
  67. $('#searchTextboxItemLog').val('');
  68. updateItemLogSearch($('#searchTextboxItemLog').val());
  69. }
  70.  
  71. $("#clearItemLog").click(function () {
  72. clearItemLogSearch();
  73. });
  74.  
  75. $(document).ready(function () {
  76. $("#searchTextboxItemLog").on("keyup", function () {
  77. updateItemLogSearch($(this).val());
  78. });
  79. });
  80.  
  81. function openItemLogExtra() {
  82. let timesFound = (ignoreCompletion = timesSold = gpFromSale = deathCount = damageTaken = damageDealt = missedAttacks = timesEaten = healedFor = totalAttacks = amountUsedInCombat = timeWaited = timesDied = timesGrown = harvestAmount = enemiesKilled = timesOpened = "");
  83. $("#itemlog-container").html("");
  84. $("#toggleBankBorders").removeClass("BankBordersOn").addClass("BankBordersOff").css('opacity', '50%');
  85. clearItemLogSearch();
  86. for (let i = 0; i < itemStats.length; i++) {
  87. let itemTooltip;
  88. if (itemStats[i].stats[0] > 0) {
  89. timesFound = ignoreCompletion = timesSold = gpFromSale = deathCount = damageTaken = damageDealt = missedAttacks = timesEaten = healedFor = totalAttacks = amountUsedInCombat = timeWaited = timesDied = timesGrown = harvestAmount = enemiesKilled = timesOpened = "";
  90. if (items[i].ignoreCompletion)
  91. ignoreCompletion = "<br><span class='text-danger'>Item does not count towards completion.</span>";
  92. if (itemStats[i].stats[0] > 0)
  93. timesFound = "<br>Times Found: <small class='text-warning'>" + formatNumber(itemStats[i].stats[0]) + "</small>";
  94. if (itemStats[i].stats[1] > 0)
  95. timesSold = "<br>Quantity Sold: <small class='text-warning'>" + formatNumber(itemStats[i].stats[1]) + "</small>";
  96. if (itemStats[i].stats[2] > 0)
  97. gpFromSale = "<br>GP Gained from sales: <small class='text-warning'>" + formatNumber(itemStats[i].stats[2]) + "</small>";
  98. if (itemStats[i].stats[3] > 0)
  99. deathCount = "<br>Times lost due to death: <small class='text-warning'>" + formatNumber(itemStats[i].stats[3]) + "</small>";
  100. if (itemStats[i].stats[4] > 0)
  101. damageTaken = "<br>Damage Taken whilst Equipped: <small class='text-warning'>" + formatNumber(itemStats[i].stats[4]) + "</small>";
  102. if (itemStats[i].stats[5] > 0)
  103. damageDealt = "<br>Damage Dealt: <small class='text-warning'>" + formatNumber(itemStats[i].stats[5]) + "</small>";
  104. if (itemStats[i].stats[6] > 0)
  105. missedAttacks = "<br>Attacks Missed: <small class='text-warning'>" + formatNumber(itemStats[i].stats[6]) + "</small>";
  106. if (itemStats[i].stats[7] > 0)
  107. timesEaten = "<br>Times Eaten: <small class='text-warning'>" + formatNumber(itemStats[i].stats[7]) + "</small>";
  108. if (itemStats[i].stats[8] > 0)
  109. healedFor = "<br>Healed for: <small class='text-warning'>" + formatNumber(itemStats[i].stats[8]) + "</small>";
  110. if (itemStats[i].stats[9] > 0)
  111. totalAttacks = "<br>Total Attacks: <small class='text-warning'>" + formatNumber(itemStats[i].stats[9]) + "</small>";
  112. if (itemStats[i].stats[10] > 0)
  113. amountUsedInCombat = "<br>Amount used in combat: <small class='text-warning'>" + formatNumber(itemStats[i].stats[10]) + "</small>";
  114. if (itemStats[i].stats[11] > 0)
  115. timeWaited = "<br>Time spent waiting to grow: <small class='text-warning'>" + formatNumber(itemStats[i].stats[11]) + "</small>";
  116. if (itemStats[i].stats[12] > 0)
  117. timesDied = "<br>Crop deaths: <small class='text-warning'>" + formatNumber(itemStats[i].stats[12]) + "</small>";
  118. if (itemStats[i].stats[13] > 0)
  119. timesGrown = "<br>Successful grows: <small class='text-warning'>" + formatNumber(itemStats[i].stats[13]) + "</small>";
  120. if (itemStats[i].stats[14] > 0)
  121. harvestAmount = "<br>Amount harvested: <small class='text-warning'>" + formatNumber(itemStats[i].stats[14]) + "</small>";
  122. if (itemStats[i].stats[15] > 0)
  123. enemiesKilled = "<br>Enemies killed: <small class='text-warning'>" + formatNumber(itemStats[i].stats[15]) + "</small>";
  124. if (itemStats[i].stats[16] > 0)
  125. timesOpened = "<br>Opened: <small class='text-warning'>" + formatNumber(itemStats[i].stats[16]) + "</small>";
  126. $("#itemlog-container").append('<img class="skill-icon-sm item-found" id="item-log-img-' + i + '" src="' + getItemMedia(i) + '">');
  127. 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 + ignoreCompletion + "</small></div>";
  128. if (items[i].ignoreCompletion && i !== CONSTANTS.item.Cape_of_Completion)
  129. $("#item-log-img-" + i).attr("onClick", "addItemToBank(" + i + ", 1);");
  130. } else {
  131. ignoreCompletion = "";
  132. if (items[i].ignoreCompletion)
  133. ignoreCompletion = "<br><span class='text-danger'>Item does not count towards completion.</span>";
  134. $("#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>');
  135. itemTooltip = "<div class='text-center'>" + items[i].name + ignoreCompletion + "</div>";
  136. }
  137. let haveInBank = getBankId(i);
  138. if (haveInBank !== false) {
  139. $('#item-log-img-' + i).addClass("item-in-bank").addClass("item-in-bank-off");
  140. }
  141. tippy("#item-log-img-" + i, {
  142. content: itemTooltip,
  143. placement: "bottom",
  144. allowHTML: true,
  145. interactive: false,
  146. animation: false,
  147. });
  148. }
  149. $("#modal-item-log").modal("show");
  150. }
  151.  
  152. $('#modal-monster-log').find('.block-options').prepend('<button id="toggleMonsters" class="btn btn-sm btn-success">Toggle Found</button>');
  153. $(document).ready(function () {
  154. $("#toggleMonsters").click(function () {
  155. $(".monster-found").toggle();
  156. });
  157. });
  158.  
  159. function openMonsterLogExtra() {
  160. let damageDealtToPlayer = (damageTakenFromPlayer = killedByPlayer = killedPlayer = hitsToPlayer = hitsFromPlayer = enemyMissed = playerMissed = seen = ranAway = "");
  161. $("#monsterlog-container").html("");
  162. for (let i = 0; i < monsterStats.length; i++) {
  163. let monsterTooltip;
  164. ignoreCompletion = "";
  165. if (MONSTERS[i].ignoreCompletion) {
  166. ignoreCompletion = "<br><span class='text-danger'>Monster does not count towards completion.</span>";
  167. }
  168. if (monsterStats[i].stats[2] > 0) {
  169. damageDealtToPlayer = damageTakenFromPlayer = killedByPlayer = killedPlayer = hitsToPlayer = hitsFromPlayer = enemyMissed = playerMissed = seen = ranAway = "";
  170. damageTakenFromPlayer = "<br>Total Damage Dealt to Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].stats[1]) + "</small>";
  171. damageDealtToPlayer = "<br>Total Damage Taken from Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].stats[0]) + "</small>";
  172. killedByPlayer = "<br>Times Slain: <small class='text-warning'>" + formatNumber(monsterStats[i].stats[2]) + "</small>";
  173. killedPlayer = "<br>Times Killed by Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].stats[3]) + "</small>";
  174. hitsToPlayer = "<br>Successful hits by Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].stats[4]) + "</small>";
  175. hitsFromPlayer = "<br>Successful hits to Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].stats[5]) + "</small>";
  176. enemyMissed = "<br>Missed Attacks by Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].stats[6]) + "</small>";
  177. playerMissed = "<br>Missed Attacks to Monster: <small class='text-warning'>" + formatNumber(monsterStats[i].stats[7]) + "</small>";
  178. seen = "<br>Times Fought: <small class='text-warning'>" + formatNumber(monsterStats[i].stats[8]) + "</small>";
  179. ranAway = "<br>Times Ran Away: <small class='text-warning'>" + formatNumber(monsterStats[i].stats[9]) + "</small>";
  180. $("#monsterlog-container").append('<img class="skill-icon-md monster-found" id="monster-log-img-' + i + '" src="' + MONSTERS[i].media + '">');
  181. monsterTooltip = "<div class='text-center'>" + MONSTERS[i].name + "<small class='text-info'> " + seen + killedByPlayer + killedPlayer + damageTakenFromPlayer + damageDealtToPlayer + hitsFromPlayer + hitsToPlayer + playerMissed + enemyMissed + ranAway + ignoreCompletion + "</small></div>";
  182. } else {
  183. $('#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>');
  184. monsterTooltip = "<div class='text-center'>" + MONSTERS[i].name + ignoreCompletion + "</div>";
  185. }
  186. tippy("#monster-log-img-" + i, {
  187. content: monsterTooltip,
  188. placement: "bottom",
  189. allowHTML: true,
  190. interactive: false,
  191. animation: false,
  192. });
  193. }
  194. updateTooltips();
  195. $("#modal-monster-log").modal("show");
  196. }
  197.  
  198. $('#modal-pet-log').find('.block-options').prepend('<button id="togglePets" class="btn btn-sm btn-success">Toggle Found</button>');
  199. $(document).ready(function () {
  200. $("#togglePets").click(function () {
  201. $(".pet-found").toggle();
  202. });
  203. });
  204.  
  205. function openPetLogExtra() {
  206. $('#petlog-container').html('');
  207. for (let i = 0; i < PETS.length; i++) {
  208. let tooltop;
  209. if (petUnlocked[i]) {
  210. $('#petlog-container').append('<img class="skill-icon-md pet-found" id="pet-log-img-' + i + '" src="' + PETS[i].media + '">');
  211. tooltip = '<div class="text-center"><span class="text-warning">' + PETS[i].name + '</span><br><span class="text-info">' + PETS[i].description + '</span></div>';
  212. } else {
  213. $('#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>');
  214. tooltip = '<div class="text-center">' + PETS[i].name + '<br><small class=\'text-danger\'>Hint: ' + PETS[i].acquiredBy + '</small></div>';
  215. }
  216. tippy('#pet-log-img-' + i, {
  217. content: tooltip,
  218. placement: 'bottom',
  219. allowHTML: true,
  220. interactive: false,
  221. animation: false,
  222. });
  223. }
  224. $('#modal-pet-log').modal('show');
  225. }
  226.  
  227. window.openItemLog = function () {
  228. openItemLogExtra();
  229. };
  230.  
  231. window.openMonsterLog = function () {
  232. openMonsterLogExtra();
  233. };
  234.  
  235. window.openPetLog = function () {
  236. openPetLogExtra();
  237. };
  238. }
  239.  
  240. function loadScript() {
  241. if (window.isLoaded || (typeof unsafeWindow !== 'undefined' && unsafeWindow.isLoaded)) {
  242. clearInterval(scriptLoader);
  243. injectScript(script);
  244. }
  245. }
  246.  
  247. const scriptLoader = setInterval(loadScript, 200);
  248. })();

QingJ © 2025

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