Melvor offline cap remover

Removes 12hr offline cap

// ==UserScript==
// @name         Melvor offline cap remover
// @version      0.3.0
// @description  Removes 12hr offline cap
// @author       8992
// @match        https://*.melvoridle.com/*
// @exclude      https://wiki.melvoridle.com/*
// @grant        none
// @namespace    http://tampermonkey.net/
// @noframes
// ==/UserScript==

let times = null;
let cloudLoaded = false;

let loadCheckInterval = setInterval(() => {
  if (isLoaded && !currentlyCatchingUp && !modalIsOpen) {
    clearInterval(loadCheckInterval);
    extraOffline();
  }
}, 200);

function extraOffline() {
  let offlineData = JSON.parse(window.localStorage.getItem("12hr"));
  if (offlineData != null) {
    //remove limit from updateOffline function then overwrite
    patchCode(updateOffline, /> *43200000/, "== 43200000");
    //"fix" issue with sample_from_binomial
    patchCode(
      sample_from_binomial,
      /(let binomial[^;]+;)/,
      "$1if (binomial.length > numberTrials) return Math.floor(numberTrials * chance);"
    );
    offlineData.timestamp = Math.min(new Date().getTime(), offlineData.timestamp + 43200000);
    console.log(
      `Calculating additional ${Math.floor(
        (new Date().getTime() - offlineData.timestamp) / 1000 / 60 / 60
      )}hrs of offline time`
    );
    window.offline = offlineData;
    offlinePause = true;
    pauseOfflineAction(offline.skill);
    offlineCatchup();
    offlinePause = false;
    window.localStorage.removeItem("12hr");
  }
}

function patchCode(code, match, replacement) {
  const codeString = code
    .toString()
    .replace(match, replacement)
    .replace(/^function (\w+)/, "window.$1 = function");
  eval(codeString);
}

setTimeout(() => {
  //fetch offline save data
  times = {
    0: ["", "-1-", "-2-", "-3-", "-4-"].map((a) => getItem("MI-A04" + a + "offline")),
    1: [],
  };

  const _toggleCharacterSelectionView = toggleCharacterSelectionView;
  window.toggleCharacterSelectionView = () => {
    if (!cloudLoaded) {
      for (let i = 0; i < 5; i++) {
        if (playFabSaves[i] !== null) {
          times[1][i] = getItemFromSave(playFabSaves[i], "offline");
        } else if (storedCloudSaves[i] !== null) {
          times[1][i] = getItemFromSave(storedCloudSaves[i], "offline");
        } else times[1][i] = null;
      }
      cloudLoaded = true;
    }
    _toggleCharacterSelectionView();
  };

  const _selectCharacter = selectCharacter;
  window.selectCharacter = (char, confirmed = false) => {
    if (confirmed || !connectedToCloud) {
      let offline = times[currentView][char];
      if (
        offline != null &&
        typeof offline == "object" &&
        typeof offline.timestamp == "number" &&
        new Date().getTime() - offline.timestamp > 43200000
      ) {
        window.localStorage.setItem("12hr", JSON.stringify(offline));
      } else {
        window.localStorage.removeItem("12hr");
      }
    }
    _selectCharacter(char, confirmed);
  };
}, 100);