Melvor drop chance

Adds drop chances to the view drops screen (percentage to 3 significant figures)

// ==UserScript==
// @name         Melvor drop chance
// @version      0.1.2
// @description  Adds drop chances to the view drops screen (percentage to 3 significant figures)
// @author       8992
// @match        https://*.melvoridle.com/*
// @grant        none
// @namespace    http://tampermonkey.net/
// @noframes
// ==/UserScript==

let loadCheckInterval = setInterval(() => {
  if (isLoaded) {
    clearInterval(loadCheckInterval);
    loadScript();
  }
}, 200);

function loadScript() {
  window.viewMonsterDrops = (monsterID) => {
    if (monsterID === null) monsterID = combatData.enemy.id;
    if (monsterID >= 0 && MONSTERS[monsterID].lootTable !== undefined) {
      let drops = "";
      let dropsOrdered = [];
      let totalWeight = MONSTERS[monsterID].lootTable.reduce((sum, a) => sum + a[1], 0);
      if (MONSTERS[monsterID].lootChance != undefined) {
        totalWeight = totalWeight * 100 / MONSTERS[monsterID].lootChance;
      }
      for (let i = 0; i < MONSTERS[monsterID].lootTable.length; i++) {
        dropsOrdered.push({
          itemID: MONSTERS[monsterID].lootTable[i][0],
          w: MONSTERS[monsterID].lootTable[i][1],
          qty: MONSTERS[monsterID].lootTable[i][2],
          chance: ` (${(MONSTERS[monsterID].lootTable[i][1] / totalWeight * 100).toPrecision(3)}%)`
        });
      }
      dropsOrdered.sort(function (a, b) {
        return b.w - a.w;
      });
      for (let i = 0; i < dropsOrdered.length; i++) {
        drops +=
          "Up to " +
          dropsOrdered[i].qty +
          ' x <img class="skill-icon-xs mr-2" src="' +
          getItemMedia(dropsOrdered[i].itemID) +
          '">' +
          items[dropsOrdered[i].itemID].name +
          dropsOrdered[i].chance +
          "<br>";
      }
      let bones = "";
      if (MONSTERS[monsterID].bones !== null)
        bones =
          'Always Drops:<br><small><img class="skill-icon-xs mr-2" src="' +
          getItemMedia(MONSTERS[monsterID].bones) +
          '">' +
          items[MONSTERS[monsterID].bones].name +
          "</small><br><br>";
      Swal.fire({
        title: MONSTERS[monsterID].name,
        html:
          bones +
          "Possible Extra Drops:<br><small>In order of most common to least common<br>" +
          drops,
        imageUrl: MONSTERS[monsterID].media,
        imageWidth: 64,
        imageHeight: 64,
        imageAlt: MONSTERS[monsterID].name,
      });
    }
  }

  window.viewItemContents = (itemID = -1) => {
    if (itemID < 0) itemID = selectedBankItem;
    let drops = "";
    let dropsOrdered = [];
    let totalWeight = items[itemID].dropTable.reduce((sum, a) => sum + a[1], 0);
    for (let i = 0; i < items[itemID].dropTable.length; i++) {
      dropsOrdered.push({
        itemID: items[itemID].dropTable[i][0],
        w: items[itemID].dropTable[i][1],
        id: i,
        chance: ` (${(items[itemID].dropTable[i][1] / totalWeight * 100).toPrecision(3)}%)`,
      });
    }
    dropsOrdered.sort(function (a, b) {
      return b.w - a.w;
    });
    for (let i = 0; i < dropsOrdered.length; i++) {
      drops +=
        "Up to " +
        numberWithCommas(items[itemID].dropQty[dropsOrdered[i].id]) +
        ' x <img class="skill-icon-xs mr-2" src="' +
        getItemMedia(dropsOrdered[i].itemID) +
        '">' +
        items[dropsOrdered[i].itemID].name +
        dropsOrdered[i].chance +
        "<br>";
    }
    Swal.fire({
      title: items[itemID].name,
      html: "Possible Items:<br><small>" + drops,
      imageUrl: getItemMedia(itemID),
      imageWidth: 64,
      imageHeight: 64,
      imageAlt: items[itemID].name,
    });
  }
}