Lux-Ferre

Untitled

Apr 8th, 2024
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         IdlePixel Slap Chop - GodofNades Fork
  3. // @namespace    com.anwinity.idlepixel
  4. // @version      3.0.11
  5. // @description  Ain't nobody got time for that! Adds some QoL 1-click actions.
  6. // @author       Original Author: Anwinity || Modded By: GodofNades
  7. // @license      MIT
  8. // @match        *://idle-pixel.com/login/play*
  9. // @grant        none
  10. // @require      https://greasyfork.org/scripts/441206-idlepixel/code/IdlePixel+.js?anticache=20220905
  11. // @downloadURL https://update.greasyfork.org/scripts/459139/IdlePixel%20Slap%20Chop%20-%20GodofNades%20Fork.user.js
  12. // @updateURL https://update.greasyfork.org/scripts/459139/IdlePixel%20Slap%20Chop%20-%20GodofNades%20Fork.meta.js
  13. // ==/UserScript==
  14.  
  15. (function () {
  16.     "use strict";
  17.  
  18.     // Overall Declarations for different variables used throughout the script
  19.     let IPP, getVar, getThis, singleOverride;
  20.     let foundryToggle = true;
  21.     let smelteryToggle = true;
  22.     const IMAGE_URL_BASE = document
  23.         .querySelector("itembox[data-item=copper] img")
  24.         .src.replace(/\/[^/]+.png$/, "");
  25.     let loaded = false;
  26.     let onLoginLoaded = false;
  27.  
  28.     // Start New Code Base Const/Functions
  29.     const misc = function () {
  30.         return {
  31.             initStyles: function () {
  32.                 var style = document.createElement("style");
  33.                 style.id = "styles-slapchop";
  34.                 style.innerHTML = `
  35.                     #slapchop-quickfight, #slapchop-quickpreset {
  36.                         position: relative;
  37.                     }
  38.  
  39.                     #slapchop-quickpreset > .slapchop-quickpreset-buttons {
  40.                         display: flex;
  41.                         flex-direction: row;
  42.                         justify-content: start;
  43.                     }
  44.  
  45.                     #slapchop-quickpreset > .slapchop-quickpreset-buttons > div {
  46.                         display: flex;
  47.                         flex-direction: column;
  48.                         justify-content: start;
  49.                     }
  50.  
  51.                     #slapchop-quickpreset > .slapchop-quickpreset-buttons > div > button {
  52.                         margin: 0.125em;
  53.                     }
  54.  
  55.                     #slapchop-quickfight > .slapchop-quickfight-buttons {
  56.                         display: flex;
  57.                         flex-direction: row;
  58.                         flex-wrap: wrap;
  59.                     }
  60.  
  61.                     #slapchop-quickfight > .slapchop-quickfight-buttons .slapchop-quickfight-zone {
  62.                         width: 150px;
  63.                         max-width: 150px;
  64.                         display: flex;
  65.                         flex-direction: column;
  66.                         justify-content: start;
  67.                         align-items: center;
  68.                         position: relative;
  69.                     }
  70.  
  71.                     #slapchop-quickfight > .slapchop-quickfight-buttons .slapchop-quickfight-zone.blood button {
  72.                         font-weight: 550;
  73.                         background-color: rgb(136, 8, 8) !important;
  74.                         color: rgb(255,255,255);
  75.                     }
  76.  
  77.                     #slapchop-quickfight > .slapchop-quickfight-buttons .slapchop-quickfight-zone.blood button:disabled {
  78.                         color: rgba(255,255,255,0.3);
  79.                         background-color: rgba(136, 8, 8, 0.3) !important;
  80.                     }
  81.  
  82.                     #slapchop-quickfight > .slapchop-quickfight-buttons .slapchop-quickfight-zone > * {
  83.                         width: 100%;
  84.                     }
  85.  
  86.                     #slapchop-quickfight > .slapchop-quickfight-buttons .slapchop-quickfight-zone > .slapchop-quickfight-progress-container {
  87.                         width: 100%;
  88.                         color: white;
  89.                         text-shadow: 1px 0 0 #000, 0 -1px 0 #000, 0 1px 0 #000, -1px 0 0 #000;
  90.                         text-align: left;
  91.                         position: relative;
  92.                     }
  93.  
  94.                     #slapchop-quickfight > .slapchop-quickfight-buttons .slapchop-quickfight-zone > .slapchop-quickfight-progress-container > .slapchop-quickfight-progress-value {
  95.                         position: relative;
  96.                         z-index: 5;
  97.                         margin-left: 4px;
  98.                         font-weight: bold;
  99.                     }
  100.  
  101.                     #slapchop-quickfight > .slapchop-quickfight-buttons .slapchop-quickfight-zone > .slapchop-quickfight-progress-container.slapchop-quickfight-fightpoints {
  102.                         background-color: rgba(255, 216, 0, 0.5);
  103.                         border: 1px solid rgb(255, 216, 0);
  104.                     }
  105.  
  106.                     #slapchop-quickfight > .slapchop-quickfight-buttons .slapchop-quickfight-zone > .slapchop-quickfight-progress-container.slapchop-quickfight-fightpoints .slapchop-quickfight-progress {
  107.                         background-color: #ffd800;
  108.                     }
  109.  
  110.                     #slapchop-quickfight > .slapchop-quickfight-buttons .slapchop-quickfight-zone > .slapchop-quickfight-progress-container.slapchop-quickfight-energy {
  111.                         background-color: rgba(215, 0, 71, 0.5);
  112.                         border: 1px solid rgb(215, 0, 71);
  113.                     }
  114.  
  115.                     #slapchop-quickfight > .slapchop-quickfight-buttons .slapchop-quickfight-zone > .slapchop-quickfight-progress-container.slapchop-quickfight-energy .slapchop-quickfight-progress {
  116.                         background-color: #d70047;
  117.                     }
  118.  
  119.                     #slapchop-quickfight > .slapchop-quickfight-buttons .slapchop-quickfight-zone > .slapchop-quickfight-progress-container > .slapchop-quickfight-progress {
  120.                         position: absolute;
  121.                         top: 0;
  122.                         left: 0;
  123.                         height: 100%;
  124.                         width: 0; /* will be overwritten inline */
  125.                         z-index: 3;
  126.                     }
  127.  
  128.                     #slapchop-quicklamp > .slapchop-quickfight-buttons .slapchop-quickfight-zone {
  129.                         width: 150px;
  130.                         max-width: 150px;
  131.                         display: flex;
  132.                         flex-direction: column;
  133.                         justify-content: start;
  134.                         align-items: center;
  135.                         position: relative;
  136.                     }
  137.  
  138.                     #brewing-table .slapchop-quickbrew-button {
  139.                         border: 1px solid rgba(124, 218, 255, 0.86);
  140.                         background-color: rgba(124, 218, 255, 0.1);
  141.                         padding: 2px;
  142.                         display: flex;
  143.                         justify-content: center;
  144.                         align-items: center;
  145.                         margin: 0.5em auto 0.125em auto;
  146.                         max-width: 100px;
  147.                     }
  148.  
  149.                     #brewing-table .slapchop-quickbrew-button:hover {
  150.                         background-color: rgba(69, 177, 216, 0.5);
  151.                     }
  152.  
  153.                     #crafting-table .slapchop-rocketfuelmax-button {
  154.                         border: 1px solid rgba(124, 218, 255, 0.86);
  155.                         background-color: rgba(124, 218, 255, 0.1);
  156.                         padding: 2px;
  157.                         display: flex;
  158.                         justify-content: center;
  159.                         align-items: center;
  160.                         margin: 0.5em auto 0.125em auto;
  161.                         max-width: 150px;
  162.                     }
  163.  
  164.                     #crafting-table .slapchop-rocketfuelmax-button:hover {
  165.                         background-color: rgba(69, 177, 216, 0.5);
  166.                     }
  167.  
  168.                     #crafting-table .slapchop-rocketfuelsingle-button {
  169.                         border: 1px solid rgba(124, 218, 255, 0.86);
  170.                         background-color: rgba(124, 218, 255, 0.1);
  171.                         padding: 2px;
  172.                         display: flex;
  173.                         justify-content: center;
  174.                         align-items: center;
  175.                         margin: 0.5em auto 0.125em auto;
  176.                         max-width: 150px;
  177.                     }
  178.  
  179.                     #crafting-table .slapchop-rocketfuelsingle-button:hover {
  180.                         background-color: rgba(69, 177, 216, 0.5);
  181.                     }
  182.  
  183.                     #quick-lamp-zone {
  184.                         display: flex;
  185.                         flex-direction: row;
  186.                         flex-wrap: wrap;
  187.                     }
  188.  
  189.                     #lamp-zone-all {
  190.                         display: inline-flex;
  191.                     }
  192.  
  193.                     #melee-lamp-zone {
  194.                         display: flex;
  195.                         flex-direction: column;
  196.                         justify-content: start;
  197.                         align-items: center;
  198.                         position: relative;
  199.                     }
  200.  
  201.                     #archery-lamp-zone {
  202.                         display: flex;
  203.                         flex-direction: column;
  204.                         justify-content: start;
  205.                         align-items: center;
  206.                         position: relative;
  207.                         padding-left: 20px;
  208.                     }
  209.  
  210.                     #magic-lamp-zone {
  211.                         display: flex;
  212.                         flex-direction: column;
  213.                         justify-content: start;
  214.                         align-items: center;
  215.                         position: relative;
  216.                         padding-left: 20px;
  217.                     }
  218.  
  219.                     .fighting-monster-loot-potion {
  220.                         background-color: rgba(32, 36, 33, 0.67);
  221.                         border-color: rgb(255, 255, 255) rgb(255, 255, 255) rgb(255, 255, 255) rgb(255, 255, 255);
  222.                         color: rgb(232, 230, 227);
  223.                         border: 1px solid black;
  224.                         border-top-color: black;
  225.                         border-top-style: solid;
  226.                         border-top-width: 1px;
  227.                         border-right-color: black;
  228.                         border-bottom-color: black;
  229.                         border-bottom-style: solid;
  230.                         border-bottom-width: 1px;
  231.                         border-left-color: black;
  232.                         border-left-style: solid;
  233.                         border-left-width: 1px;
  234.                         padding: 10px;
  235.                         color: white;
  236.                         border-bottom-right-radius: 5px;
  237.                         border-top-right-radius: 5px;
  238.                         margin-right: -3px;
  239.                         margin-top: 20px;
  240.                     }
  241.  
  242.                     .fighting-monster-rain-potion {
  243.                         background-color: rgba(38, 115, 153, 0.67);
  244.                         border-color: rgb(33, 207, 247);
  245.                         color: rgb(232, 230, 227);
  246.                         border: 1px solid black;
  247.                         border-top-color: black;
  248.                         border-top-style: solid;
  249.                         border-top-width: 1px;
  250.                         border-right-color: black;
  251.                         border-bottom-color: black;
  252.                         border-bottom-style: solid;
  253.                         border-bottom-width: 1px;
  254.                         border-left-color: black;
  255.                         border-left-style: solid;
  256.                         border-left-width: 1px;
  257.                         padding: 10px;
  258.                         color: white;
  259.                         border-bottom-right-radius: 5px;
  260.                         border-top-right-radius: 5px;
  261.                         margin-right: -3px;
  262.                         margin-top: 20px;
  263.                     }
  264.  
  265.                     .lumberjack-rain-pot-woodcutting {
  266.                         width:100px;
  267.                         height:100px;
  268.                         display: inline-block;
  269.                         border:1px solid rgb(66, 66, 66);
  270.                         background: rgb(8,115,0);
  271.                         background: linear-gradient(0deg, rgba(8,115,0,1) 6%, rgba(55,45,253,1) 25%, rgba(55,45,253,1) 50%, rgba(101,101,101,1) 75%, rgba(52,52,52,1) 100%);
  272.                         border-radius: 5pt;
  273.                         color:white;
  274.                     }
  275.  
  276.                     #rare_monster_potion-brew {
  277.                         padding: 3px;
  278.                         width: 50px;
  279.                     }
  280.  
  281.                     #rare_monster_potion-use {
  282.                         padding: 3px;
  283.                         width: 50px;
  284.                     }
  285.  
  286.                     #super_rare_monster_potion-brew {
  287.                         padding: 3px;
  288.                         width: 50px;
  289.                     }
  290.  
  291.                     #super_rare_monster_potion-use {
  292.                         padding: 3px;
  293.                         width: 50px;
  294.                     }
  295.  
  296.                     #combat_loot_potion-label {
  297.                         color: white;
  298.                     }
  299.  
  300.                     #rain_potion-in-combat-label {
  301.                         color: white;
  302.                     }
  303.  
  304.                     #rain_potion-brew {
  305.                         padding: 3px;
  306.                         width: 50px;
  307.                     }
  308.  
  309.                     #rain_potion-use {
  310.                         padding: 3px;
  311.                         width: 50px;
  312.                     }
  313.  
  314.                     .itembox-fight-center {
  315.                         margin-top: 0.55rem;
  316.                         text-align: center;
  317.                     }
  318.  
  319.                     .center-flex {
  320.                         display: flex;
  321.                         justify-content: center;
  322.                         text-align: center;
  323.                     }
  324.                 `;
  325.                 document.head.appendChild(style);
  326.             },
  327.  
  328.             updateButtons: function () {
  329.                 let potions = ["rare_monster_potion", "super_rare_monster_potion"];
  330.                 potions.forEach((potion) => {
  331.                     let useButton = document.getElementById(`${potion}-use`);
  332.                     let brewButton = document.getElementById(`${potion}-brew`);
  333.                     getVar(potion, 0, "int")
  334.                         ? (useButton.style.color = "white")
  335.                         : (useButton.style.color = "red");
  336.                     sCBrewing().canBrew(potion)
  337.                         ? (brewButton.style.color = "white")
  338.                         : (brewButton.style.color = "red");
  339.                 });
  340.                 let combatLootPotionsAmount = document.getElementById(
  341.                     "combat_loot_potion-label"
  342.                 );
  343.                 combatLootPotionsAmount.textContent =
  344.                     getVar("combat_loot_potion_timer", 0, "int") == 0
  345.                         ? "Loot Potions: " + getVar("combat_loot_potion", 0, "int")
  346.                         : format_time(getVar("combat_loot_potion_timer", 0, "int"));
  347.                 let rainPotionsAmount = document.getElementById(
  348.                     "rain_potion-in-combat-label"
  349.                 );
  350.                 rainPotionsAmount.textContent =
  351.                     getVar("rain_potion_timer", 0, "int") == 0
  352.                         ? "Rain Potions: " + getVar("rain_potion", 0, "int")
  353.                         : format_time(getVar("rain_potion_timer", 0, "int"));
  354.             },
  355.         };
  356.     };
  357.  
  358.     const actionType = function () {
  359.         return {
  360.             primary: function (event) {
  361.                 const prop = getThis.getConfig("primaryActionKey") || "none";
  362.                 if (prop == "none") {
  363.                     return !(event.altKey || event.ctrlKey || event.shiftKey);
  364.                 } else {
  365.                     return event[prop];
  366.                 }
  367.             },
  368.  
  369.             alt: function (event) {
  370.                 const prop = getThis.getConfig("altActionKey") || "altKey";
  371.                 return event[prop];
  372.             },
  373.         };
  374.     };
  375.  
  376.     const mining_crafting = function () {
  377.         window.SCMACHINES = [
  378.             "drill",
  379.             "crusher",
  380.             "giant_drill",
  381.             "excavator",
  382.             "giant_excavator",
  383.             "massive_excavator",
  384.         ];
  385.  
  386.         window.SCMINERAL = [
  387.             "amber_mineral",
  388.             "amethyst_mineral",
  389.             "blood_crystal_mineral",
  390.             "blue_marble_mineral",
  391.             "clear_marble_mineral",
  392.             "dense_marble_mineral",
  393.             "fluorite_mineral",
  394.             "frozen_mineral",
  395.             "jade_mineral",
  396.             "lime_quartz_mineral",
  397.             "magnesium_mineral",
  398.             "opal_mineral",
  399.             "purple_quartz_mineral",
  400.             "sea_crystal_mineral",
  401.             "smooth_pearl_mineral",
  402.             "sulfer_mineral",
  403.             "tanzanite_mineral",
  404.             "topaz_mineral",
  405.         ];
  406.  
  407.         window.SCMINING = [
  408.             "small_stardust_prism",
  409.             "medium_stardust_prism",
  410.             "large_stardust_prism",
  411.             "huge_stardust_prism",
  412.             "grey_geode",
  413.             "blue_geode",
  414.             "green_geode",
  415.             "red_geode",
  416.             "cyan_geode",
  417.             "ancient_geode",
  418.             "meteor",
  419.         ];
  420.  
  421.         window.SCSMELTABLES = [
  422.             "copper",
  423.             "iron",
  424.             "silver",
  425.             "gold",
  426.             "promethium",
  427.             "titanium",
  428.             "ancient_ore",
  429.             "dragon_ore",
  430.         ];
  431.  
  432.         return {
  433.             // Quick Smelting
  434.             initQuickSmelt: function () {
  435.                 let htmlMining = `
  436.                     <div id="slapchop-quicksmelt-mining" class="slapchop-quicksmelt">
  437.                       <h5>Quick Smelt:</h5>
  438.                       <div class="slapchop-quicksmelt-buttons">
  439.                     `;
  440.                 SCSMELTABLES.forEach((ore) => {
  441.                     htmlMining += `
  442.                         <button type="button" onclick="sCMiningCrafting().quickSmelt('${ore}')">
  443.                             <img src="${IMAGE_URL_BASE}/${ore}.png" class="img-20" />
  444.                             ${ore
  445.                                                             .replace(/_/g, " ")
  446.                                                             .replace(/(^|\s)\w/g, (s) => s.toUpperCase())}
  447.                             (<span data-slap="max-smelt-${ore}">?</span>)
  448.                         </button>
  449.                     `;
  450.                 });
  451.                 htmlMining += `
  452.                         </div>
  453.                         <hr>
  454.                     </div>
  455.                 `;
  456.                 const panelMining = document.querySelector("#panel-mining .panel-logo-xp-area");
  457.                 panelMining.insertAdjacentHTML("afterend", htmlMining);
  458.  
  459.                 let htmlCrafting = `
  460.                     <div id="slapchop-quicksmelt-crafting" class="slapchop-quicksmelt">
  461.                         <h5>Quick Smelt:</h5>
  462.                         <div class="slapchop-quicksmelt-buttons">
  463.                  `;
  464.                 SCSMELTABLES.forEach((ore) => {
  465.                     htmlCrafting += `
  466.                         <button type="button" onclick="sCMiningCrafting().quickSmelt('${ore}')">
  467.                             <img src="${IMAGE_URL_BASE}/${ore}.png" class="img-20" />
  468.                             ${ore
  469.                                                             .replace(/_/g, " ")
  470.                                                             .replace(/(^|\s)\w/g, (s) => s.toUpperCase())}
  471.                            (<span data-slap="max-smelt-${ore}">?</span>)
  472.                         </button>
  473.                     `;
  474.                 });
  475.                 htmlCrafting += `
  476.                         </div>
  477.                         <hr>
  478.                     </div>
  479.                 `;
  480.  
  481.                 const panelCrafting = document.querySelector("#panel-crafting .panel-logo-xp-area");
  482.                 panelCrafting.insertAdjacentHTML("afterend", htmlCrafting);
  483.  
  484.                 SCSMELTABLES.forEach((ore) => {
  485.                     const itemboxes = document.querySelectorAll(
  486.                         `itembox[data-item="${ore}"]`
  487.                     );
  488.                     itemboxes.forEach((itembox) => {
  489.                         itembox.addEventListener("contextmenu", (event) => {
  490.                             if (getThis.getConfig("quickSmeltRightClickEnabled")) {
  491.                                 const primary = sCActionType().primary(event);
  492.                                 const alt = sCActionType().alt(event);
  493.                                 if (primary || alt) {
  494.                                     sCMiningCrafting().quickSmelt(ore, !primary);
  495.                                     event.stopPropagation();
  496.                                     event.preventDefault();
  497.                                     return false;
  498.                                 }
  499.                             }
  500.                             return true;
  501.                         });
  502.                     });
  503.                 });
  504.             },
  505.  
  506.             maxSmeltable: function (ore) {
  507.                 const oilPerOre = Crafting.getOilPerBar(ore);
  508.                 const charcoalPerOre = Crafting.getCharcoalPerBar(ore);
  509.                 const lavaPerOre = Crafting.getLavaPerBar(ore);
  510.                 const plasmaPerOre = Crafting.getPlasmaPerBar(ore);
  511.  
  512.                 const oil = getVar("oil", 0, "int");
  513.                 const capacity = Furnace.getFurnaceCapacity();
  514.                 const oreCount = getVar(ore, 0, "int");
  515.                 const maxSmeltFromOil = Math.floor(oil / oilPerOre);
  516.                 const dragonFire = getVar("dragon_fire", 0, "int");
  517.                 let maxSmeltCount = Math.min(capacity, oreCount, maxSmeltFromOil);
  518.  
  519.                 if (charcoalPerOre > 0) {
  520.                     const charcoal = getVar("charcoal", 0, "int");
  521.                     const maxSmeltFromCharcoal = Math.floor(charcoal / charcoalPerOre);
  522.                     maxSmeltCount = Math.min(maxSmeltCount, maxSmeltFromCharcoal);
  523.                 }
  524.                 if (lavaPerOre > 0) {
  525.                     const lava = getVar("lava", 0, "int");
  526.                     const maxSmeltFromLava = Math.floor(lava / lavaPerOre);
  527.                     maxSmeltCount = Math.min(maxSmeltCount, maxSmeltFromLava);
  528.                 }
  529.                 if (plasmaPerOre > 0) {
  530.                     const plasma = getVar("plasma", 0, "int");
  531.                     const maxSmeltFromPlasma = Math.floor(plasma / plasmaPerOre);
  532.                     maxSmeltCount = Math.min(maxSmeltCount, maxSmeltFromPlasma);
  533.                 }
  534.                 if (ore == "dragon_ore") {
  535.                     maxSmeltCount = Math.min(maxSmeltCount, dragonFire);
  536.                 }
  537.                 if (ore == "copper") {
  538.                     maxSmeltCount = Math.min(capacity, oreCount);
  539.                 }
  540.                 return maxSmeltCount || 0;
  541.             },
  542.  
  543.             quickSmelt: function (ore) {
  544.                 if (smelteryToggle) {
  545.                     smelteryToggle = false;
  546.                     const current = getVar("furnace_ore_type", "none");
  547.                     if (current == "none") {
  548.                         const max = sCMiningCrafting().maxSmeltable(ore);
  549.                         if (max > 0) {
  550.                             IdlePixelPlus.sendMessage(`SMELT=${ore}~${max}`);
  551.                         }
  552.                     }
  553.                     setTimeout(function () {
  554.                         smelteryToggle = true;
  555.                     }, 1000);
  556.                 }
  557.             },
  558.  
  559.             maxCraftable: function () {
  560.                 const oilPerFuel = 5000;
  561.                 const charcoalPerFuel = 20;
  562.                 const lavaPerFuel = 1;
  563.                 const oil = getVar("oil", 0, "int");
  564.                 const maxFuelFromOil = Math.floor(oil / oilPerFuel);
  565.                 let maxFuelCount = Math.min(maxFuelFromOil);
  566.                 if (charcoalPerFuel > 0) {
  567.                     const charcoal = getVar("charcoal", 0, "int");
  568.                     const maxCraftFromCharcoal = Math.floor(charcoal / charcoalPerFuel);
  569.                     maxFuelCount = Math.min(maxFuelCount, maxCraftFromCharcoal);
  570.                 }
  571.                 if (lavaPerFuel > 0) {
  572.                     const lava = getVar("lava", 0, "int");
  573.                     const maxCraftFromLava = Math.floor(lava / lavaPerFuel);
  574.                     maxFuelCount = Math.min(maxFuelCount, maxCraftFromLava);
  575.                 }
  576.                 return maxFuelCount || 0;
  577.             },
  578.  
  579.             updateMaxCraftable: function () {
  580.                 const max = sCMiningCrafting().maxCraftable();
  581.                 const maxText = "Quick Craft Max (" + max + ")";
  582.                 const oilMax = 5000 * max;
  583.                 const oilText = "5,000 (" + oilMax.toLocaleString() + ") (oil)";
  584.                 const coalMax = 20 * max;
  585.                 const coalText = "20 (" + coalMax.toLocaleString() + ") (charcoal)";
  586.                 const lavaMax = 1 * max;
  587.                 const lavaText = "1 (" + lavaMax.toLocaleString() + ") (lava)";
  588.                 const label = document.querySelector(
  589.                     "#crafting-table tbody tr[data-crafting-item=rocket_fuel] td item-crafting-table[data-materials-item]"
  590.                 ).dataset.materialsItem;
  591.  
  592.                 const maxCraftableButton = document.querySelector(
  593.                     "#crafting-table .slapchop-rocketfuelmax-button"
  594.                 );
  595.                 const oilTableCell = document.querySelector(
  596.                     "#crafting-table tbody tr[data-crafting-item=rocket_fuel] td item-crafting-table[data-materials-item=oil]"
  597.                 );
  598.                 const coalTableCell = document.querySelector(
  599.                     "#crafting-table tbody tr[data-crafting-item=rocket_fuel] td item-crafting-table[data-materials-item=charcoal]"
  600.                 );
  601.                 const lavaTableCell = document.querySelector(
  602.                     "#crafting-table tbody tr[data-crafting-item=rocket_fuel] td item-crafting-table[data-materials-item=lava"
  603.                 );
  604.                 const singleCraftButton = document.querySelector(
  605.                     "#crafting-table .slapchop-rocketfuelsingle-button"
  606.                 );
  607.  
  608.                 if (maxCraftableButton) {
  609.                     maxCraftableButton.textContent = maxText;
  610.                 }
  611.  
  612.                 if (oilTableCell) {
  613.                     oilTableCell.textContent = oilText;
  614.                 }
  615.  
  616.                 if (coalTableCell) {
  617.                     coalTableCell.textContent = coalText;
  618.                 }
  619.  
  620.                 if (lavaTableCell) {
  621.                     lavaTableCell.textContent = lavaText;
  622.                 }
  623.  
  624.                 if (singleCraftButton) {
  625.                     if (max === 0) {
  626.                         singleCraftButton.style.display = "none";
  627.                     } else {
  628.                         singleCraftButton.style.display = "block";
  629.                     }
  630.                 }
  631.             },
  632.  
  633.             updateQuickSmelt: function () {
  634.                 SCSMELTABLES.forEach((ore) => {
  635.                     const max = sCMiningCrafting().maxSmeltable(ore);
  636.                     const elements = document.querySelectorAll(
  637.                         `[data-slap="max-smelt-${ore}"]`
  638.                     );
  639.                     elements.forEach((element) => {
  640.                         element.textContent = max;
  641.                     });
  642.                 });
  643.             },
  644.  
  645.             // Quick Mining
  646.             initQuickMining: function () {
  647.                 SCMINING.forEach((item) => {
  648.                     const itemboxes = document.querySelectorAll(
  649.                         `itembox[data-item="${item}"]`
  650.                     );
  651.                     itemboxes.forEach((itembox) => {
  652.                         itembox.addEventListener("contextmenu", (event) => {
  653.                             if (getThis.getConfig("quickMiningRightClickEnabled")) {
  654.                                 const primary = sCActionType().primary(event);
  655.                                 const alt = sCActionType().alt(event);
  656.                                 if (primary || alt) {
  657.                                     sCMiningCrafting().quickMining(item, !primary);
  658.                                     event.stopPropagation();
  659.                                     event.preventDefault();
  660.                                     return false;
  661.                                 }
  662.                             }
  663.                             return true;
  664.                         });
  665.                     });
  666.                 });
  667.             },
  668.  
  669.             quickMining: function (item, alt) {
  670.                 let n = getVar(item, 0, "int");
  671.                 if (alt || singleOverride) {
  672.                     console.log("Inside the minus: " + singleOverride);
  673.                     n--;
  674.                 }
  675.                 if (n > 0) {
  676.                     if (item.includes("_stardust_prism")) {
  677.                         IdlePixelPlus.sendMessage(`SMASH_STARDUST_PRISM=${item}~${n}`);
  678.                     } else if (item.includes("_geode")) {
  679.                         IdlePixelPlus.sendMessage(`CRACK_GEODE=${item}~${n}`);
  680.                     } else if (item == "meteor") {
  681.                         websocket.send(`MINE_METEOR`);
  682.                     }
  683.                 }
  684.             },
  685.  
  686.             // Quick Mineral
  687.             initQuickMineral: function () {
  688.                 SCMINERAL.forEach((item) => {
  689.                     const itemboxes = document.querySelectorAll(
  690.                         `itembox[data-item="${item}"]`
  691.                     );
  692.                     itemboxes.forEach((itembox) => {
  693.                         itembox.addEventListener("contextmenu", (event) => {
  694.                             if (getThis.getConfig("quickMineralRightClickEnabled")) {
  695.                                 const primary = sCActionType().primary(event);
  696.                                 const alt = sCActionType().alt(event);
  697.                                 if (primary || alt) {
  698.                                     sCMiningCrafting().quickMineral(item, !primary);
  699.                                     event.stopPropagation();
  700.                                     event.preventDefault();
  701.                                     return false;
  702.                                 }
  703.                             }
  704.                             return true;
  705.                         });
  706.                     });
  707.                 });
  708.             },
  709.  
  710.             quickMineral: function (item, alt) {
  711.                 let n = getVar(item, 0, "int");
  712.                 if (alt || singleOverride) {
  713.                     n--;
  714.                 }
  715.                 if (n > 0) {
  716.                     IdlePixelPlus.sendMessage(`MINERAL_XP=${item}~${n}`);
  717.                 }
  718.             },
  719.  
  720.             // Mining Machine Presets
  721.             initMiningPresets: function () {
  722.                 let html = `
  723.                     <div id="miningmachines-presets">
  724.                         <h5>Mining Machine Presets:</h5>
  725.                         <div id="slapchop-quickpreset">
  726.                             <div class="slapchop-quickpreset-buttons">
  727.                                 <div>
  728.                                     <button onclick="sCMiningCrafting().noMachines()">None</button>
  729.                                 </div>
  730.                                 <div>
  731.                                     <button onclick="sCMiningCrafting().miningPresetSave(2)">Save 2</button>
  732.                                     <button onclick="sCMiningCrafting().miningPresetLoad(2)">Load 2</button>
  733.                                 </div>
  734.                                 <div>
  735.                                     <button onclick="sCMiningCrafting().miningPresetSave(3)">Save 3</button>
  736.                                     <button onclick="sCMiningCrafting().miningPresetLoad(3)">Load 3</button>
  737.                                 </div>
  738.                                 <div>
  739.                                     <button onclick="sCMiningCrafting().miningPresetSave(4)">Save 4</button>
  740.                                     <button onclick="sCMiningCrafting().miningPresetLoad(4)">Load 4</button>
  741.                                 </div>
  742.                                 <div>
  743.                                     <button onclick="sCMiningCrafting().allMachines()">All</button>
  744.                                 </div>
  745.                             </div>
  746.                         </div>
  747.                         <hr>
  748.                     </div>
  749.                 `;
  750.                 document
  751.                     .querySelector("div.fresh-account-buy-pickaxe-text")
  752.                     .insertAdjacentHTML("beforebegin", html);
  753.             },
  754.  
  755.             miningPresetSave: function (presetNumber) {
  756.                 let presetData = {};
  757.                 let presetName = `Preset ${presetNumber}`;
  758.                 let username = getVar("username", "", "string");
  759.  
  760.                 SCMACHINES.forEach(function (machine) {
  761.                     let machineCount = `${machine}_on`;
  762.                     let ippMachineOnCount = getVar(machineCount, 0, "int");
  763.                     presetData[machine] = ippMachineOnCount;
  764.                 });
  765.  
  766.                 let allPresets =
  767.                     JSON.parse(localStorage.getItem(`${username}.miningPresets`)) || {};
  768.  
  769.                 allPresets[presetName] = presetData;
  770.  
  771.                 localStorage.setItem(
  772.                     `${username}.miningPresets`,
  773.                     JSON.stringify(allPresets)
  774.                 );
  775.             },
  776.  
  777.             miningPresetLoad: function (presetNumber) {
  778.                 SCMACHINES.forEach(function (machine) {
  779.                     let machineCount = `${machine}_on`;
  780.                     let ippMachineOnCount = getVar(machineCount, 0, "int");
  781.                     let ippMachineCrafted = getVar(machine, 0, "int");
  782.                     let i = ippMachineOnCount;
  783.                     while (i > 0) {
  784.                         i--;
  785.                         websocket.send(`MACHINERY=${machine}~decrease`);
  786.                     }
  787.                 });
  788.  
  789.                 let username = getVar("username", "", "string");
  790.                 let allPresets =
  791.                     JSON.parse(localStorage.getItem(`${username}.miningPresets`)) || {};
  792.                 let presetName = `Preset ${presetNumber}`;
  793.                 let presetData = allPresets[presetName];
  794.  
  795.                 if (!presetData) {
  796.                     return;
  797.                 }
  798.  
  799.                 SCMACHINES.forEach(function (machine) {
  800.                     let machineCount = `${machine}_on`;
  801.                     let ippMachineOnCount = getVar(machineCount, 0, "int");
  802.                     let ippMachinePresetCount = presetData[machine] || 0;
  803.  
  804.                     let i = 0;
  805.  
  806.                     while (i < ippMachinePresetCount) {
  807.                         i++;
  808.                         websocket.send(`MACHINERY=${machine}~increase`);
  809.                     }
  810.                 });
  811.             },
  812.  
  813.             allMachines: function () {
  814.                 SCMACHINES.forEach(function (machine) {
  815.                     let machineCount = `${machine}_on`;
  816.                     let ippMachineOnCount = getVar(machineCount, 0, "int");
  817.                     let ippMachineCrafted = getVar(machine, 0, "int");
  818.                     let i = ippMachineOnCount;
  819.                     while (i < ippMachineCrafted) {
  820.                         i++;
  821.                         websocket.send(`MACHINERY=${machine}~increase`);
  822.                     }
  823.                 });
  824.             },
  825.  
  826.             noMachines: function () {
  827.                 SCMACHINES.forEach(function (machine) {
  828.                     let machineCount = `${machine}_on`;
  829.                     let ippMachineOnCount = getVar(machineCount, 0, "int");
  830.                     let ippMachineCrafted = getVar(machine, 0, "int");
  831.                     let i = ippMachineOnCount;
  832.                     while (i > 0) {
  833.                         i--;
  834.                         websocket.send(`MACHINERY=${machine}~decrease`);
  835.                     }
  836.                 });
  837.             },
  838.  
  839.             // Rocket Fuel Crafting
  840.             initQuickRocketFuel: function () {
  841.                 const rows = document.querySelectorAll(
  842.                     "#crafting-table tbody tr[data-crafting-item=rocket_fuel]"
  843.                 );
  844.                 rows.forEach((row) => {
  845.                     const craft = row.getAttribute("data-crafting-item");
  846.                     if (!craft) {
  847.                         return;
  848.                     }
  849.  
  850.                     const fourthTd = row.querySelector("td:nth-child(4)");
  851.                     if (fourthTd) {
  852.                         fourthTd.insertAdjacentHTML(
  853.                             "beforeend",
  854.                             `
  855.                             <div class="slapchop-rocketfuelsingle-button"
  856.                                 onclick="event.stopPropagation(); sCMiningCrafting().quickCraftSingle()">Quick Craft 1</div>
  857.                             <div class="slapchop-rocketfuelmax-button"
  858.                                 onclick="event.stopPropagation(); sCMiningCrafting().quickCraft()">Quick Craft Max</div>
  859.                         `
  860.                         );
  861.                     }
  862.                 });
  863.             },
  864.  
  865.             quickCraft: function () {
  866.                 const max = sCMiningCrafting().maxCraftable();
  867.                 if (max > 0) {
  868.                     IdlePixelPlus.sendMessage(`CRAFT=rocket_fuel~${max}`);
  869.                 }
  870.             },
  871.  
  872.             quickCraftSingle: function () {
  873.                 IdlePixelPlus.sendMessage(`CRAFT=rocket_fuel~1`);
  874.             },
  875.         };
  876.     };
  877.  
  878.     const gathering = function () {
  879.         window.SCLOOT_BAGS = Array.from(
  880.             document.querySelectorAll(`itembox[data-item^="gathering_loot_bag_"]`)
  881.         ).map((el) => el.getAttribute("data-item"));
  882.  
  883.         return {
  884.             quickGather: function (bag, alt) {
  885.                 let n = getVar(bag, 0, "int");
  886.                 if (alt || singleOverride) {
  887.                     n--;
  888.                 }
  889.                 if (n > 0) {
  890.                     IdlePixelPlus.sendMessage(
  891.                         `OPEN_GATHERING_LOOT=${bag.replace("gathering_loot_bag_", "")}~${n}`
  892.                     );
  893.                 }
  894.             },
  895.  
  896.             initQuickGather: function () {
  897.                 SCLOOT_BAGS.forEach((item) => {
  898.                     const itemboxes = document.querySelectorAll(
  899.                         `itembox[data-item="${item}"]`
  900.                     );
  901.                     itemboxes.forEach((itembox) => {
  902.                         itembox.addEventListener("contextmenu", (event) => {
  903.                             if (getThis.getConfig("quickGatherRightClickEnabled")) {
  904.                                 const primary = sCActionType().primary(event);
  905.                                 const alt = sCActionType().alt(event);
  906.                                 if (primary || alt) {
  907.                                     sCGathering().quickGather(item, !primary);
  908.                                     event.stopPropagation();
  909.                                     event.preventDefault();
  910.                                     return false;
  911.                                 }
  912.                             }
  913.                             return true;
  914.                         });
  915.                     });
  916.                 });
  917.             },
  918.         };
  919.     };
  920.  
  921.     const farming = function () {
  922.         window.SCBONEMEALABLE = [
  923.             "bones",
  924.             "big_bones",
  925.             "ice_bones",
  926.             "ashes",
  927.             "blood_bones",
  928.         ];
  929.  
  930.         window.SCPLANTABLES = Array.from(
  931.             document.querySelectorAll('itembox[data-item$="_seeds"]')
  932.         ).map((el) => el.getAttribute("data-item"));
  933.  
  934.         return {
  935.             quickBone: function (item, alt) {
  936.                 if (getVar("bonemeal_bin", 0, "int") != 0) {
  937.                     let n = getVar(item, 0, "int");
  938.                     singleOverride = getThis.getConfig("autoSingleEnabled");
  939.                     if (alt || singleOverride) {
  940.                         n--;
  941.                     }
  942.                     if (n > 0) {
  943.                         IdlePixelPlus.sendMessage(`ADD_BONEMEAL=${item}~${n}`);
  944.                     }
  945.                 }
  946.             },
  947.  
  948.             initQuickBones: function () {
  949.                 SCBONEMEALABLE.forEach((item) => {
  950.                     const itemboxes = document.querySelectorAll(
  951.                         `itembox[data-item="${item}"]`
  952.                     );
  953.                     itemboxes.forEach((itembox) => {
  954.                         itembox.addEventListener("contextmenu", (event) => {
  955.                             if (getThis.getConfig("quickBoneRightClickEnabled")) {
  956.                                 const primary = sCActionType().primary(event);
  957.                                 const alt = sCActionType().alt(event);
  958.                                 if (primary || alt) {
  959.                                     sCFarming().quickBone(item, !primary);
  960.                                     event.stopPropagation();
  961.                                     event.preventDefault();
  962.                                     return false;
  963.                                 }
  964.                             }
  965.                             return true;
  966.                         });
  967.                     });
  968.                 });
  969.             },
  970.  
  971.             initQuickHarvest: function () {
  972.                 const firstItemBox = document.querySelector("#panel-farming itembox");
  973.                 if (firstItemBox) {
  974.                     firstItemBox.insertAdjacentHTML(
  975.                         "beforebegin",
  976.                         `
  977.                         <itembox id="slapchop-bob" class="shadow hover" data-item="slapchop_bob" onclick="sCFarming().quickHarvest()">
  978.                             <div class="center mt-1"><img width="50" height="50" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADr8AAA6/ATgFUyQAACJ9SURBVHhe7V0JnF1Vef/uW+7bl1ne7GsymWTISgxZMCAgWnEBWVxKW6WCVbv8Smmt/NqCuCCiNi3+rFoRBUUrkIo0xQAhEAgkIWTPZJ9MZp95y7x9X/v9z71vksmiySSZ91L5w5lz77nLe+/7n28759wbegfv4KLg3ntJp25e0pDU+pJEa4Vh6YxKw9+1O7Uftxm0mmw+T5lsnrKkKXji+Z0D4fwTe4bC31VPvyRwSRKypNl6WZNN89hMh7S8wqSjfKFAWq2OckxILl/gXyVxTZTI5MmXyNOxKK32Jwv3dQ+GDqq3KFto1fqSwbUd1j9f5NK8NM+lbzLrJSaC+xSToNFqKM+EUEEi5kd0NQ0TY5E11GCWLrPopL+2W2W5ssa8ye1LZpW7lR8uKQ25vsP6xRWN+m+5LHAXrAVQA42G0tkcaXU6SrNGgBP+n3mRKMtEQWEKOJfraCpLQwntVk9a9/k/+sTndq/6169/ZEaFeZ7ToteYdBopm81JfE9Jy/fU6vV5dyiZcQeSPxiJpILiC0wDLhlCrplV+bGV9YWnq01a5kDDQiZhogqShv3GcUJyrB55/lmCBGYDnIEckJTK5PgXa6g/nCODTiKbNkdGroUY+P8CaxfMHQCyM1yGYhL1BHLvO+oOvywOXGRcEiZrcWvVvKW19KrLrCEWqRAuen6Gu32ehZjluqgRIADHoBHQliJBTB2fpxBoZRKyfJ3TCHJVEgQREldKEQxxHUvnKKc3W0b80ae58aJDo9ZljSZL5hfVRokJINaCApsorrHNNUhJMwOsHGIbpIha3c4yMYi+WIlEWw6FSdJrCpTgNmhaQTgdbCs1KmwPh9IU4JPCidRG5cDFB7pC2aHdZbp9Xp35WpuU/hQ7Zb3dqJfsMn9VFhxEJqFX81eHyZK4x6Pna7VaYbqEuYJA+RSWvdAWcS7XaWaUHYQwZZGMRC4jDJviZwDFZLFpYxaHmIxwMkfenOGl6pY5N2zevBmKedGBX1ZS1NRYdK0m+rNKo/bdDRbpM5UySTY2JUa9VvTmQJrIoGdFFlJmQrjSILLirw4i4E/YGQsfApuPEFgRM5sp3oawYc5wXSqTZWIkSvJ9a8xsriTcTzFnouaTvLEcBRNZCqU4ZE7rfljR6Pib7dsHpi0qKxkh71sia+So8Z9cRvpqe4VOMuo0wnZnczkWslbdzlOURZHMScQRrvJtWWgSk4AdRUPgOxQNwfmCEBaucOTMBswTtCPF5inFx50GLSFIw3XQFD4krvNzvhKIZynJ2uFOSr6MTv6Lo4Pjz/LhaUXJCLllnm3j4mrtSj2bEJiRPKTG3wbCgcCRQ2AbAhtPaUTIithKx9qBsBSAQGG+EBEhMYSmFAlI55UeDyCicnICWcjyPfizClAbvn8snadgkgtrBPzOeEbKR7La+5d2NT/0zIZ902KiTkZJCGFz1LKsUe5f1iBTFcJY1a5DSCKEZYErviEnejoIgkOGqfHEOStXv7V6CeWybLp00BAmgxvMTICDfY7iH5g0bgM1uDe0LcbmyM/OGpoV4yAhmNHEQ3ndlwPhxKp4nA+WECXTkEanYc1Cl/bDlUYNuax6kVHbDcgp4BeKJCgaAsLENu8gIiqaLGHeik5dr2iIOEd8gkJCjMMvCB0a4I2kheYl2CxZbXYajeZpMJh8xOsP3S0uKQOUjBCgym66vdFCX640Sp1cWDM4WdMT6bm3K2YpTyZ26HYjG32WtOKkVULYTxR9SDjJtj+vEYkfcyM0J8N/IqKzK449mJbIZHWQ02qmOS211FrtIHc4SW8fHsq/sufoimQ6u1V8qRKjpIQUMau9aUE04Lu5udLQwmbnVjmfcdjY+dr1itNFZFTs99CAogmC00aNo/BFaWaDo1WRo7gqnWSvb6XWuUuowlVPbe3t5HA4yWSQSZcMUnr/K2TIp2jAG6avP7Xhx9397s/i/qVGWRByMm6+YaFl2+6hD+USqc9++Y/fc/2bB4fIwpqSSmeo4GqnispqoSXBcISO9PRS0B+gm277GAUPbKEWp55khMCuWdQ8fwWl02n69kMP0Q8efZSuXLlSmLxtLz9HhkMvC1+0s89Dj6/btmb97mM3qh9fUpTl0MnBHncmHEns4+4yuKyz+Y5Kp53et2gGdbXWUZPTRLNX3kDXf/gW+vXqZ+nNrduovqaO7vmHvyenlKQrGkxUX2mnpsvfQ/3DbnroG9+g8UCAPvjBD1Ira8nW3z5Fhp7XROQFbXtlTx8999bBxzlHeUP9+JKiLDXkRDRV2e9b0NH81e986hphqgBk0j5jPWmdDfTqy+s4s7fSXJdMNmTzKuBrRmMF6vYkqaKhjRbMn0e+7jepQU4Kxw6EEmm6+Zur1496/deLhjJA2Q8uhhOp10lvoqsva7rGbpJFm46dvz0fJWt8lObXmanJrqNEMkXBWJISbNZiyQyuoxqLnjqrDNSoi5HOf4zsutwEqcDufi9tPOL+XigU3qI2nRce+8HnjR+98dq7n/vfTZvUpnOGkmGVOZKZzKNHRgPq3qnAfAhC37oKK7kcFqpxWqih0kZjgah6xukB/5FIpp9Qd88bd37hh8l8LvLv6u6UcEkQMjg8OrLhwHBK3T0FMofJ1XazuncczS6HunUqYNL6vJENHo/HrzZdENz1lz88r3GvS4IQYMvhse/1ukP0/LYeCsfPyM1ZYf+gj370Ujft7XOvV5vKBpfMnHooHH5p/2j0S9G0Sd8zOk4LW6tIx7nHacHZO4Zc2GEo22jignr1psP0250jNBrK0IjH92o0kXgdl0w3urq6nD6fL6nuTuCS0RAgGI7/Ws85RjAp09Obj1Eao7wyZ/UGHcU5SdwSNtHWfDsdGLHQ84fZyW6L0AMvD9K3XtwvsvgjI35683CAs3iNIMigx7h+qaBpUTcm4XjIUSYoeA/qJNecbCGwy57NZVemxw8ujB3drNNocrTqF3uuk7S111RWmMluNdB4MEFtlgK11djJKOtoxBembXv7qCuZFqO+I5w81s1povbaCnrk+T3kj2FsTBktxgqVgwMDDwy43V/52AfMS9vqdCtGUtf3XXPdDZ1ms1nrdrtTa9euXbNu3boe9audFW677ZOa1at/NeUByrIihMmQ09mRh1PufXfH+vdQLhmhPPdsDBqSwUZRndPz7Z8eqNFwD9dotRz+aiidCnNnM5JOSlNbtZH6fTG6uquG3jrio8vbK2ndnmEKRNOUzUsk6/XqJxHFk0nqWLRow+VLltTq/au6qqsqqWb2X1Pb7PeqZxB5vV7au3dvX2tr6xNbt25N/eY3v3li8+bNI+rh04IJWcbVdiZlSs697DTkL+/4yPff8+5FXzDp8kxEnnp6h+josWGKxpMUiSXyqahe43I4xUyhKHwNfEMmm1GG7pmoUDRKZoOB2D8QTJyygG5ypx30eOg9N9xw9y233PIN9957zfbKDlp03bfVo6fH8PAwseYM6HS6tevXrx9YtWrVt7h5kuCZEDOTEVd3zxll5dSvWTH3Bw1Vli+Eg0HyeAM0Ph6kDCd6TjvnFtUOqqt2SCaznoZHgxzq6qnAQkb4msO8CW7AThymCKSIkWCYJj4uFtCdgHA8RhaLRLmEb8Wbr6717j+S0jVXHDaMj49RTfMKcX0RuJZJoMHBQUomk0Gr1eoOh8MJi8XiDwQC6QGGeqrA/v3dGXVzSigbDbl6adeDyxa0/1Nzo4s1ISmG4KEBGFAEsK4BixSMBj1tfruPpIyOoywWnJp5Y9AQRRCgklAsgqwToDfl6IpFbXyMyGjEei7u5PlBaqwapH2Dy6hlRhcNuYOFmvrW727bvr376aeffpwvO6/84mxRFhqydNGMj89prf1uW3MtsTnglgLJ7KQR1mq5GGU9mUwG0uu1ZDYZqaHeTjlNlryemDJly5KFlqBg0gq1IIOPnYhcIUsNjVbqnFlLJrNBTIbhc3BuJh2jhmo/a08LJSI+0mbD0va3Ny0ZGx0cb21r3DMw6D7zUMEFgM1mM6bT6WzJCbnyisuqG1y2VztnNstQWAgnlcqKeXL4BPReaEaGC7Sl2F7hMFOBSUln0xSNpvi6ArdzJ4bZAhFqjbGrvJQlpozaZ1TRovktZLMa2cHrmGyJHFaLOKfS2k/NtXHqHanh41aqqrRRhd2saax1LtYW8n9b43J0mQ3SEY8/5la/+gUFyEBdckJmNlU+v3hue6eOTRQ0Q9h/7uGwRJjKLZoiMa2L//gA5tBRVzgsVF1lJdkkkdmiJatNhuMnA+9Da6pcrFWyhjpnuWjunHoOlU1MLDt/JlmQnU6Lz4EsrMZeqnJmqW+sggwc0RlYK/G5VrOZGusrqam2cl4+kbrNyDHzqD+yh79sWvyAKeCtzW/LP37sUQ4dT0VJfciVizs/cu2Krv+prnSIVSfosXDEaeE3eF+jpWQqTf5ARPRY5LEgAlqDJB0kpViY8C+YusWsYSxnIJMmKe4D5wGfo5g01pKCMk2Me8CYZTJ5MptlSnHe0lCxidobs/TGnnbO8pvJwiYtxr4Ma8AwXB/0h+jDnQ1k4fs9v+0IuQPR76/Zdvj5AU/wt/gtZ4vm5ubW/37m2eDS5UtCatMklIyQD121uMVu1x9ZeFmbMFUQkMw+AvFQHgsdVEEcPDpE/mCMVl7RJXIPSBnhMAQNwSYSKeFn0OMRCIxHsuQw42dJ4jwDZ/HIY6AZIA3k4b6sY2waM2Ti+4D0GfWbqaWuQHuP1pI/2kFWi5GisRT7NGVJki2Tovd2NgmNKmJvv5vWbD30zCt7jn1qeDxyyjDIVFASk3XllZ2aQi6/dtHctlaZTUMRECx8CISOtVN9Qx7a1zO0vqW+eobDzj6Dj+SEX8HqEqzfzbEwU8KvoF30+lRSCBGCwzkwPRAoVq7g/tg3GGXRJvN5uw7050Y9/sLRfKvmgL+RxoI2anDYhIbAbyGQSHAOtLDGTk5uOxG1Tistm900N5cv3DXijzwTiiVP2+vPBSUZy9Hl6JaOlprlCGuTbC4SXJJsppLcY+NJrrmMef1MxsgmTuxeQm9NsqPPwvazkOBD4GcEA2qXxSYcu9hCxcBaL2GuuIhFdCIg4HvwZ8F/xFjQklaTeWP7ob/aOd5Bm91dtHvUyonoCOdBforHE4pmcd3Awj8dMPT/6fcuqrtuftv/qk3nhWnXkCWNDbqGlqoXZs9stBvYXCDsFMt+2ByZuQfmWWjo4Tu6j41GM8kbWFM+PHdW8xVYfwVtglAxGQUeoE0gCtdAW1DgU0SUxf4CZgzGEEKFX4LyCSL5YiyqQ0eIJtLpAz2D3zG3zr9To5dJjvnJf/RA6kDf6H94A2HfqDdoHx31+aosJmddhU1o1smAX2p2OWrZhA27g7EdavOUMO2EZPWFLqNRvqPOqLfWgpAs98BkisLhGAVDMTFE4mUn3js0/tm3th/d9K657d/oaGuo1TJJJs5B4KtBntViYj8is7iRs4BYPWl1MukNZu613HN5H2bPwOcIJ84kiVXzzBWuh0OH7/B4A9nFjVV/0ZdzSlqTlTqMCXrwxrm6Ld39qXVbD/+Rs8/9yGtD4//2xv6BwV29Y/N7xwI2zo80Ns6L4POKwELv/YPenYeGxzeoTVPCqXRPA+a11D71s7/76MfhUAFYGEw67e330Nef2biuotL6S43O+LPLF86ozsZi7s4ZDROOHCYLGqBX/QSemsINdHqNOAc/SM85BrQM+yYTwldFM1CDHOQg0VichoZ9NM9pog4Oax/d7qMAWWimKU1/e1Uz9XIe+OSG3Y+bZP1VbTXOmbMbq6m52iHWFsMURjiYgMa11iizkgPeED2+ftdX/uv1vQ+IhimiFIRU33vbSu+nr1uk7ioYDUTpm6s3+l7aedSlNtHKJR23LVvQ8YyrukL4AQtrCHwABAtzVyiwTwBBfAy9HtGY024SRMCB43EGnY5NF/sebAP4CxOJ5DPq9tKVM+uEEDobq9j0THapOPdsBATT2OsO0o9e3PbAb7cd+YraPCVMu1OvsBqvXdBWp+4dx+5jY7Rp/+AqdVeAM+ZW9Hb0bvgARFQIAuAn4mzakCfEuafCF6TY/Ch+AmuAFeGLkJWFDPOF8BfaYjbJXLOvkLXUVGUjD5MI8/Nadx8dG5s8OnI2ZOCzAtEkvbKnN9M94FmtNk8Z005IKJ7cPeibHB0iOprVUEXz22s/ozYJFHI5S6UTIahRmCsL+w0I1WTUiQDAxOErzB6G2BEcmJz1fBWmbNURYBZWljUIREEjlMLEcTSHGcRj3Kthcrzsuxqr7OTgaO5ExPm8k8fDioDGcphL+wa8MG2jz2w6ePWAJ7RPPTxlTDsh/DsOv97dN+kxY2TcmGx6d1dLh9okYLWb52BZrxLOcs2OE/KBH0DvFWNVIvNGpMM/JekTPR+jwHomSNEKaASTxzXCZ5BqZoJl9jkRNWKDQz46GiDDCU46wVr4y9f20D72awfZ1/SM+LEoQmjSUxv30XfXvJX52au7f/7PT778xUdf2tEwOh7awtHcecvzbLTygmNGXcUDT95z65fZfKktRL5wnM2Wm+55bO3n09n8f6Lt9pve3Tenva4Vj6vlsoimlOcIBYHsI8RMIgP+QTZoKRxJsA8xi334EGgOPAHMGHo07oMfDDMWicZFyNzbM0B2ScrdtGy2FlqCsHaUo7zHX96165lN++/Ta7U1ZoPWYuWM0hOO+1lroAXbuSCDveAoSaaeyeaDc1tcn2di1Bb0cGQMEr20o6eXf/QLy6+YbXaY5G/WVHM4inCVAUEilIU2YBtmCdqRZ+eOviXGuJgIaFQeXEnIQZDZY8RYSSaRx4CgWCIt8ha3P0K+gnT7oYGh24bDIXrjYD89+F8b/2rLoaG7+D6HM7nczngquzUYT21mTdrFd8UU7unt2AXAtJssIJpM72Jz8LZ4akqFgZ03BgfnNFX/GfaNZgOnGkYNhjpk9hOcu4jICk4eNfILDGtgnhwjxTqDlUxmO5s+xWRBFUBa0aSBU/R+mDscxGwjgG9gNui0ZvZNFQ4jOR0G4uTu++JgCVASQoBdx9z37eodVfcUwAy111Y4sT0y6M9ZLAbhmItRk+JL1MJagX3ssSKw2iX4x2Q4H2FCQBDfy8BkiSIjqlKIRCCgjAxw9MXkQtvsZsOY8jmgCoSVDiUjhM3Siz/fsGdQlbUAkr0KmwkSMUaj8c/ZLBhQRJaNkV/+qujdXAvTxe14Whf+BL4hywQJzWAoWgDalP8UEhVCIfji+BY+G/ueaPaQQjrftbR8lI4QYNOB/s9u6xlW99h0sHmC2br7xuXeT14550HY/CwngpivgB9IJVMctiqDjwhfU+m0cMzIS8KRuIi64Cvg+MXYFieIGLPCPAgIRP8XBGNL0qo1FjtEZvKlCmvivNKhpIREEpkXf7Ju517RORkWo56uXziDPveBJdZKjpbsNrMIXRFdIf8QZocLxrBQMP8O8wNfYqtqFn4C4saPgotQhuUxustOXRDJhDKJqaSSj6CAPM5lLEymUJLz1ZDDz379vGRaUkKAHb1jX3hhxxGxDXveWiNcCC2eUUcjw15O6hAhKXPsIkJCYfMkBKfWWi6JsEeYPGTnyMyxDTJBnIGJNooik9mIxRI4D0TiDQKI0nKjCh3nj86b/+W8wuGSExKOJ998fP3uNUjETkQ7E/OZZbNolixRbS5LjmiMzVIMLkRESzAw8AmCJJZlPpsW2xi3ynLMq5g7mC7eZy0R5/I+Ql6Mh2FKFyG00WiISPnUQb6d8n+JUXJCgAND3jW9Y5Mf0xjh/ACJooF9ip17eprNiz8QFX4B8xtYgSKErIav8NAIcaFlorCDRw1Hj4gKBQEACgiE6KFpyWTiwHPrDiS5CSuKSuxByoQQtuOPdvd71D0FMXbkLoeZrGxmEMLiKanqKocwRzoOZbGIQazhYoedL3AyKMlqEpgTTh9DImIGMoEBSQxMKoOSysDkcW0KRZMJ/jgO2wqnXQUy3SgLQoBfbti7CosGADwriIE+l93Cjj9NnQ1V1B9LizwC068wQRh6Z06458MRS2x6jOI4CgYeMSBpNnHN98FYFsav0I7AgLNvQSyGWFjD+vkjWddEFFxyFSm1hk5CndPyyY+u6HpkxZzmGvRwzFcjCnp6036ysrYIjeBvLFafwMawGEXYygLGgeJwO85DO8wTBgxBBmYboWkIe32BsJhbCbNf2rLn6Hd2dfd/8RPvmxtZ2FFjRRj91Z9sLJlcyoqQE/CBGoflikq76f1L5zStzLAY4QvgyxF1IcMWjpz9B3yFcOBcTBxBiRFhvkEx8YNpi7P5U8gEiZhuLYh3Z3G7X6+T3//a2we2f+L6y8ILZtXYUqlcSQkpG5N1El7whGJfGx6PtKQ5YkJ+AeGjIDoV/6EWpejUlaireIz/cCMTxteaOY+xGLSk43PxiiYpk6aevlGqqTctBRnicuXGJe+h5UqIgMWkb1YiJCVSUoZKju8rbVxU86SYLPUYzhPnqueg8HWoi6sanbItrH4UnMh55Q8XCheNEP+xPTPUzSnBbieZIywJHV30fBRVI5RabRfbXPiaiX1It9iuFuUeyrVgA38zac1EZMXt4kipcdEIce94rlPdnBIiEelqq1gpqApUCFXxC0LgvA3gmBAkarUcz02U42ITRLJBKp4D05STsxMzZGhWN0uKi0ZI1633vaBuTglshuZgbEsZMlGf91B7ODJxbIssXZCjRFzKuco5aMMb45Rz1PYTruFTyJAtTLzqgY+KtaiwZoxm8bcEuGiEnC/Y9jsrbGbScxKoJIM6MfaEMSjMcaAd+5imxeAi5uTxnl7Mh2DSCr4D0Riuhc8R9+BrkYeghs8pOMw29eOgdUJJxDA/UatoLAHKlhAWlw45hNAM0btZXFww3IEcJV/UEi7haJJ293nD63f0PrL+7Z79WP1Y1JKiVp2oOYqGFCgezk0844FDioaIOKtGNJYAZUuI2aAkd/AdEHox1+BNIWSYKAgWC6a7B8f3uVzVy3z+yN2hROqmw4O+CRKwDKhotnA+7oNjIHX1mo1e9ePwOcLxqISc+SUpFxllSwi73ZuwdhbyKYatMD3YLw4iIlHs7vcVamsq73j9rW7xb4PEYqmenmH/ERAJ4YrHEMT1ytw6SEaB2brxxndNOHUmKwuvjhDaYTG+Q8jJMMq6hSABGoEeDYoA9HJ1k0Z9YRodj/7zprcPblNaFKSzuV+E2IwVTZOwRQxsgwzcAIRFIiE1HJusIWaTbvKKuWlEuRJitpiU18OJJE9N7tBQ1BaWLh1zh/JaneZfcd6JYBP1WjSB4RJlwYOiIaqG4T5QM77bq6/2HPchnJaAdxAm67RY0HXOePhrf6J5+Kt/el4yLVdCPmLnHAS2H0VMOmXZFwg/wH4hmyVfKEYZkn4SCsVO9/DlhkRKGRXGNC38RvEeefihHJszrVbVMwWsTeKdT+BKq4Za54wCWb50/5MTWjcVlCUhbMdnVNhMEAz3ZiyaxiPMSqiKgn1PME43Xr/4jEv/8UQW/Icsy0IrcA32ESoLq0WEeZAJMCExSFT4l+LKvHPEl+7/RUTdnDLKkhCjQW+osLEZZ7FIBchG8QVFoMd7QrHYD3/+8vElKycBD+TADkGjFBy/B3yLpJXeEjsq2IdEcRSFTdaUCLkQKEtCrCa5vvjmHsXew7aLv1xrKISnY2XDr8SBM6CY/ClOXAF8CVapQOgcLhxWWhUwSWFxgEnDAolSoSwJYYHcBTmKCEnNHya2ORjyBWPk9QbOuNyTr73L5TQr1/E1x++DpFKZ5h0ZC4+ppwvwx8UU/cETWNOz5Pk//u3OU+RfdoRYzeYrnVYj+vZE7y5qh4iuGHileCyRPu3DlWz+l7fXV/yoodouersYamfgXgh1QYZYnK2RJs2h8+EJ+z9dFmuAE9iTUXaExBOJa/GaV2UpjzI0cjzT5sLbkVjytJEMi/GqukrrxiVzGoVElcFFZYgF2pJI4uUBeRobj5LdZtktLpqANOFDiktSLzasFuPl6uYEyo4QrVay1bsc7FjVgUMUMaiobMM3cI5xypt5uFe/v72+8rVrFs/UGTmygkbg/OLgIjSFOSG8AWjQF3nF7Q38j3qpABu3ODQKwNz7xcb999664L6vPSVmK09E2RFSYTXVQDDiAX/OG4r5A2q0YWkP+5DN6ukCLMB7ZzVVvbh8frMEswQ/Ica+cA9xvTIAibVcuw4PZ60WwxfVSycALgQd/AfBwMWG02npUzcnoewIYQ34hHgmRBSdWP6JbSzvgabg8bNCIT/RszgA+OnSy5oeuryzUQzLT2gWb4tnSPha5d+o0tCQL4IHNG8e84RO8T/Cr6iYYhpyTrjn3p9NTB+fiLIjxGLUm4uagaI8sKm8UgmaEogk2A+QyKotRvnHKxe03dFa6xTn4TqhFdAQJgHXRfh8aNWRAS/1Dvs/x079tK/AYJcltANaAvJKhbIihO3+7RaTLASCiEqMO7EvOL6P1zHl6IrLZ/Xy9sOLZtXd2VTjEOcgX4EzRjaOEVv0cQzRQzvcgSje6/tkOpv7kfJJpwIEsh8R29opjpxcCJQVISzTDqfFICIi5A7qAKyAeOElt6MjDw37sh2Nlf/YzGQo5yldG9FUcR8Cxr+UMOwJ0lgouaa33yMelTsTcIsiNNMTZJ0WZUUIO+RKjGGJHs5dHFm50tcZahsmlkKh6D/AZ2AMEMeFhigX4ERxOgYXfaE49boja4fH/L/3X88RGgJSuEyHUz8TyooQm0megwdyFChCKZoRIWtuS2VyyaYa+3IMgYiHC1XZwWQp54CMrMjmB8cjb/iDkQ8qrb8bx1+9UWCT9Q4hAiaj3IKejtBVmB5BhiIcaMaAO0T+cEqDfCKagF/Hsh5xWNgcmCysbveyz+jzRHeMukNXqUd/L3L8gcVb8bZN3Zx2lBUhHMLOBBlwwn2jQTo2EqAhb4gC4QRt2u+mHk+SZJNFjuVk2nTQR9uOeMX73gUEkURBjqp6RoO7ls+ed9ZkADmEWSol+VyhWmyUAGVDCGfT9yeyWnlDt5v29Iepz5+hvvEMk5CiLYc8lD3pHQfI3KNpogMjMdrOxOCxt3AsSbuPjh1M5/N//OuNG8/pdd8cLQt9RMkV8sffaDDNKAtCDAbD69XV1V8xGE1MjE6EuEXgVXwG45mnuOH4I0zMW4e8tP/YGI2H4/eMj4fFgodzATt1RT34L7smu9guAUpOCAv/bxwOx1UYbzoZsOoTEdTvAM7LFjTkDad9uVx+rdp8ToCPKjoRjrL+cFedmEymB2F+TgdoB4ZAzgbKFK0etr9NaTk3MCGCDvzRazV/uBrCAv+dEc3v0w6geI5K3kqxc47gCG0iztJqNRaxUQKUnJDTmSoAwikK6GyBcSzGlP6RYWX4K48Pxujx5Bf0TiNKTogQwmmAXo8VI6lUqijo3ws2cb1cTZorP1tkcvk0rBa6APuQkg2elJwQFvgZ/7UBRFscgYlt+BOUM0FZe5V5TN09Z6TT2Vgx0OLP/cMlJJlM3hoKhQYg7KKZOrEUNQh1LBYbDwQCD0ej0QIIwHEAdSQS2cr3+J5omAKiifSz3mAih3cxjgcTL6rN046LOmjz2BO/0t356U/+TntzxzWk8QWlttd6bfMS8XgHmyrRSVjIQtpcgZEQE/Am14fQxrBzVPXnbNJEAsdk5ZmMR7ma/AKuE3DTR29713O/WT1pypQ1Sr7p5o+7ju18fvTAcDq//LKKeqtZvrzJ6n7l8Q10QV6u/w7ewTt4B/9vQfR/q9V/Nv8z/AAAAAAASUVORK5CYII="></div>
  979.                             <div class="center mt-2">Harvest</div>
  980.                         </itembox>
  981.                     `
  982.                     );
  983.                 }
  984.  
  985.                 const notificationFarmingReady = document.querySelector(
  986.                     "#notification-farming-ready"
  987.                 );
  988.                 if (notificationFarmingReady) {
  989.                     if (getThis.getConfig("quickHarvestNotificationEnabled")) {
  990.                         notificationFarmingReady.setAttribute(
  991.                             "onclick",
  992.                             `sCFarming().quickHarvest(); switch_panels('panel-farming')`
  993.                         );
  994.                     } else {
  995.                         notificationFarmingReady.setAttribute(
  996.                             "onclick",
  997.                             `switch_panels('panel-farming')`
  998.                         );
  999.                     }
  1000.                 }
  1001.             },
  1002.  
  1003.             quickHarvest: function () {
  1004.                 for (let i = 1; i <= 5; i++) {
  1005.                     let status = getVar("farm_stage_" + i, 0, "int");
  1006.                     if (status == 4) {
  1007.                         IdlePixelPlus.sendMessage("CLICKS_PLOT=" + i);
  1008.                     }
  1009.                 }
  1010.             },
  1011.  
  1012.             quickPlant: function (seed, alt) {
  1013.                 let n = getVar(seed, 0, "int");
  1014.                 if (alt || singleOverride) {
  1015.                     n--;
  1016.                 }
  1017.                 if (!alt && !singleOverride && n > 1) {
  1018.                     n = 1;
  1019.                 }
  1020.                 const donor = DonorShop.has_donor_active(
  1021.                     Items.getItem("donor_farm_patches_timestamp")
  1022.                 );
  1023.                 const maxPlot = donor ? 5 : 3;
  1024.                 for (let plot = 1; plot <= maxPlot && n > 0; plot++) {
  1025.                     if (getVar(`farm_${plot}`) == "none") {
  1026.                         IdlePixelPlus.sendMessage(`PLANT=${seed}~${plot}`);
  1027.                         n--;
  1028.                     }
  1029.                 }
  1030.             },
  1031.  
  1032.             initQuickPlant: function () {
  1033.                 SCPLANTABLES.forEach((item) => {
  1034.                     const itemboxes = document.querySelectorAll(
  1035.                         `itembox[data-item="${item}"]`
  1036.                     );
  1037.                     itemboxes.forEach((itembox) => {
  1038.                         itembox.addEventListener("contextmenu", (event) => {
  1039.                             if (getThis.getConfig("quickPlantRightClickEnabled")) {
  1040.                                 const primary = sCActionType().primary(event);
  1041.                                 const alt = sCActionType().alt(event);
  1042.                                 if (primary || alt) {
  1043.                                     if (getThis.getConfig("quickPlantHarvestRightClickEnabled")) {
  1044.                                         sCFarming().quickHarvest();
  1045.                                     }
  1046.                                     sCFarming().quickPlant(item, !primary);
  1047.                                     event.stopPropagation();
  1048.                                     event.preventDefault();
  1049.                                     return false;
  1050.                                 }
  1051.                             }
  1052.                             return true;
  1053.                         });
  1054.                     });
  1055.                 });
  1056.             },
  1057.         };
  1058.     };
  1059.  
  1060.     const brewing = function () {
  1061.         window.POTIONS = Object.keys(Brewing.POTION_TIMERS);
  1062.  
  1063.         window.POTIONSNOTIMER = [
  1064.             "cooks_dust_potion",
  1065.             "fighting_dust_potion",
  1066.             "tree_dust_potion",
  1067.             "farm_dust_potion",
  1068.         ];
  1069.  
  1070.         POTIONSNOTIMER.forEach((potion) => {
  1071.             POTIONS.push(potion);
  1072.         });
  1073.  
  1074.         return {
  1075.             canBrew: function (potion) {
  1076.                 let ingredients = Brewing.get_ingredients(potion);
  1077.                 for (let i = 0; i < ingredients.length; i += 2) {
  1078.                     if (getVar(ingredients[i], 0, "int") < ingredients[i + 1])
  1079.                         return false;
  1080.                 }
  1081.                 return true;
  1082.             },
  1083.  
  1084.             quickPotion: function (potion, alt) {
  1085.                 let n = getVar(potion, 0, "int");
  1086.                 //console.log(potion);
  1087.                 if (alt || singleOverride) {
  1088.                     n--;
  1089.                 }
  1090.                 if (!alt && !singleOverride && n > 1) {
  1091.                     n = 1;
  1092.                 }
  1093.                 if (n > 0) {
  1094.                     if (
  1095.                         potion == "combat_loot_potion" &&
  1096.                         var_combat_loot_potion_timer == 0
  1097.                     ) {
  1098.                         websocket.send(`BREWING_DRINK_COMBAT_LOOT_POTION`);
  1099.                     } else if (
  1100.                         potion == "rotten_potion" &&
  1101.                         var_rotten_potion_timer == 0
  1102.                     ) {
  1103.                         websocket.send(`BREWING_DRINK_ROTTEN_POTION`);
  1104.                     } else if (
  1105.                         potion == "merchant_speed_potion" &&
  1106.                         var_merchant_speed_potion_timer == 0
  1107.                     ) {
  1108.                         websocket.send(`BREWING_DRINK_MERCHANT_SPEED_POTION`);
  1109.                     } else {
  1110.                         IdlePixelPlus.sendMessage(`DRINK=${potion}`);
  1111.                     }
  1112.                 }
  1113.             },
  1114.  
  1115.             initQuickPotions: function () {
  1116.                 POTIONS.forEach((item) => {
  1117.                     const itemBox = document.querySelector(`[data-item="${item}"]`);
  1118.                     itemBox.oncontextmenu = "";
  1119.  
  1120.                     if (itemBox) {
  1121.                         itemBox.addEventListener("contextmenu", (event) => {
  1122.                             if (getThis.getConfig("quickPotionRightClickEnabled")) {
  1123.                                 const primary = sCActionType().primary(event);
  1124.                                 const alt = sCActionType().alt(event);
  1125.                                 if (primary || alt) {
  1126.                                     sCBrewing().quickPotion(item, !primary);
  1127.                                     event.stopPropagation();
  1128.                                     event.preventDefault();
  1129.                                     return false;
  1130.                                 }
  1131.                             }
  1132.                             return true;
  1133.                         });
  1134.                     }
  1135.                 });
  1136.  
  1137.                 const combatLootPotion = document.querySelector(
  1138.                     '[data-item="combat_loot_potion"]'
  1139.                 );
  1140.                 combatLootPotion.oncontextmenu = "";
  1141.  
  1142.                 if (combatLootPotion) {
  1143.                     combatLootPotion.addEventListener("contextmenu", (event) => {
  1144.                         if (getThis.getConfig("quickPotionRightClickEnabled")) {
  1145.                             const primary = sCActionType().primary(event);
  1146.                             const alt = sCActionType().alt(event);
  1147.                             if (primary || alt) {
  1148.                                 sCBrewing().quickPotion("combat_loot_potion", !primary);
  1149.                                 event.stopPropagation();
  1150.                                 event.preventDefault();
  1151.                                 return false;
  1152.                             }
  1153.                         }
  1154.                         return true;
  1155.                     });
  1156.                 }
  1157.  
  1158.                 const merchantSpeedPotion = document.querySelector(
  1159.                     '[data-item="merchant_speed_potion"]'
  1160.                 );
  1161.                 merchantSpeedPotion.oncontextmenu = "";
  1162.  
  1163.                 if (merchantSpeedPotion) {
  1164.                     merchantSpeedPotion.addEventListener("contextmenu", (event) => {
  1165.                         if (getThis.getConfig("quickPotionRightClickEnabled")) {
  1166.                             const primary = sCActionType().primary(event);
  1167.                             const alt = sCActionType().alt(event);
  1168.                             if (primary || alt) {
  1169.                                 this.quickPotion("merchant_speed_potion", !primary);
  1170.                                 event.stopPropagation();
  1171.                                 event.preventDefault();
  1172.                                 return false;
  1173.                             }
  1174.                         }
  1175.                         return true;
  1176.                     });
  1177.                 }
  1178.  
  1179.                 const rottenPotion = document.querySelector(
  1180.                     '[data-item="rotten_potion"]'
  1181.                 );
  1182.                 rottenPotion.oncontextmenu = "";
  1183.  
  1184.                 if (rottenPotion) {
  1185.                     rottenPotion.addEventListener("contextmenu", (event) => {
  1186.                         if (getThis.getConfig("quickPotionRightClickEnabled")) {
  1187.                             const primary = sCActionType().primary(event);
  1188.                             const alt = sCActionType().alt(event);
  1189.                             if (primary || alt) {
  1190.                                 sCBrewing().quickPotion("rotten_potion", !primary);
  1191.                                 event.stopPropagation();
  1192.                                 event.preventDefault();
  1193.                                 return false;
  1194.                             }
  1195.                         }
  1196.                         return true;
  1197.                     });
  1198.                 }
  1199.             },
  1200.  
  1201.             quickBrew: function (potion) {
  1202.                 IdlePixelPlus.sendMessage(`BREW=${potion}~1`);
  1203.             },
  1204.  
  1205.             initQuickBrew: function () {
  1206.                 const rows = document.querySelectorAll(
  1207.                     "#brewing-table tbody tr[data-brewing-item]"
  1208.                 );
  1209.                 rows.forEach((row) => {
  1210.                     const potion = row.getAttribute("data-brewing-item");
  1211.                     if (!potion) {
  1212.                         return;
  1213.                     }
  1214.  
  1215.                     const fourthTd = row.querySelector("td:nth-child(4)");
  1216.                     if (fourthTd) {
  1217.                         fourthTd.insertAdjacentHTML(
  1218.                             "beforeend",
  1219.                             `
  1220.                             <div class="slapchop-quickbrew-button"
  1221.                               onclick="event.stopPropagation(); sCBrewing().quickBrew('${potion}')">Quick Brew 1</div>
  1222.                         `
  1223.                         );
  1224.                     }
  1225.                 });
  1226.             },
  1227.         };
  1228.     };
  1229.  
  1230.     const woodcutting = function () {
  1231.         window.SCLOGS = Object.keys(Cooking.LOG_HEAT_MAP);
  1232.  
  1233.         return {
  1234.             quickBurn: function (item, alt) {
  1235.                 let n = getVar(item, 0, "int");
  1236.                 singleOverride = getThis.getConfig("autoSingleEnabled");
  1237.                 if (alt || singleOverride) {
  1238.                     n--;
  1239.                 }
  1240.                 if (n > 0) {
  1241.                     IdlePixelPlus.sendMessage(`ADD_HEAT=${item}~${n}`);
  1242.                 }
  1243.             },
  1244.  
  1245.             initQuickBurn: function () {
  1246.                 SCLOGS.forEach((item) => {
  1247.                     const itemboxes = document.querySelectorAll(
  1248.                         `itembox[data-item="${item}"]`
  1249.                     );
  1250.                     itemboxes.forEach((itembox) => {
  1251.                         itembox.addEventListener("contextmenu", (event) => {
  1252.                             if (getThis.getConfig("quickBurnRightClickEnabled")) {
  1253.                                 const primary = sCActionType().primary(event);
  1254.                                 const alt = sCActionType().alt(event);
  1255.                                 if (primary || alt) {
  1256.                                     sCWoodcutting().quickBurn(item, !primary);
  1257.                                     event.stopPropagation();
  1258.                                     event.preventDefault();
  1259.                                     return false;
  1260.                                 }
  1261.                             }
  1262.                             return true;
  1263.                         });
  1264.                     });
  1265.                 });
  1266.             },
  1267.  
  1268.             initQuickFoundry: function () {
  1269.                 let html = `
  1270.                     <div id="slapchop-quickfoundry" class="slapchop-quickfight">
  1271.                         <h5>Quick Foundry:</h5>
  1272.                         <div class="slapchop-quicksmelt-buttons">
  1273.                     `;
  1274.                 SCLOGS.forEach((log) => {
  1275.                     if (log != "dense_logs") {
  1276.                         html += `
  1277.                             <button id="slapchop-quickfoundry-${log}" type="button" onclick="sCWoodcutting().quickFoundry('${log}')">
  1278.                                 <img src="${IMAGE_URL_BASE}/${log}.png" class="img-20" />
  1279.                                 ${log
  1280.                                                                     .replace("_logs", "")
  1281.                                                                     .replace(/_/g, " ")
  1282.                                                                     .replace(/(^|\s)\w/g, (s) => s.toUpperCase())}
  1283.                                 (<span data-slap="max-foundry-${log}">?</span>)
  1284.                             </button>
  1285.                         `;
  1286.                     }
  1287.                 });
  1288.                 html += `
  1289.                         </div>
  1290.                         <hr>
  1291.                     </div>
  1292.                 `;
  1293.  
  1294.                 const panelWoodcutting = document.querySelector(
  1295.                     "#panel-woodcutting .panel-logo-xp-area"
  1296.                 );
  1297.                 if (panelWoodcutting) {
  1298.                     panelWoodcutting.insertAdjacentHTML("afterend", html);
  1299.                 }
  1300.             },
  1301.  
  1302.             updateQuickFoundry: function () {
  1303.                 const foundryBusy = getVar("foundry_amount", 0, "int") != 0;
  1304.                 SCLOGS.forEach((log) => {
  1305.                     if (log != "dense_logs") {
  1306.                         const max = sCWoodcutting().maxFoundry(log);
  1307.                         const maxFoundryElement = document.querySelector(
  1308.                             `[data-slap="max-foundry-${log}"]`
  1309.                         );
  1310.                         if (maxFoundryElement) {
  1311.                             maxFoundryElement.textContent = max;
  1312.                         }
  1313.  
  1314.                         const button = document.querySelector(
  1315.                             `#slapchop-quickfoundry-${log}`
  1316.                         );
  1317.                         if (button) {
  1318.                             button.disabled = foundryBusy || max <= 0;
  1319.                         }
  1320.                     }
  1321.                 });
  1322.             },
  1323.  
  1324.             quickFoundry: function (log) {
  1325.                 if (foundryToggle) {
  1326.                     foundryToggle = false;
  1327.                     const max = sCWoodcutting().maxFoundry(log);
  1328.                     if (max > 0) {
  1329.                         IdlePixelPlus.sendMessage(`FOUNDRY=${log}~${max}`);
  1330.                     }
  1331.                     setTimeout(function () {
  1332.                         foundryToggle = true;
  1333.                     }, 1000);
  1334.                 }
  1335.             },
  1336.  
  1337.             maxFoundry: function (log) {
  1338.                 if (getVar("charcoal_foundry_crafted", "0") != "1") {
  1339.                     return 0;
  1340.                 }
  1341.                 let max = getVar(log, 0, "int");
  1342.                 let foundryStorage = getVar("foundry_storage_crafted", 0, "int");
  1343.  
  1344.                 if (max >= 1000 && foundryStorage == 1) {
  1345.                     max = 1000;
  1346.                 } else if (max > 100 && foundryStorage != 1) {
  1347.                     max = 100;
  1348.                 }
  1349.  
  1350.                 let oilMax = Math.floor(getVar("oil", 0, "int") / 10);
  1351.                 if (max > oilMax) {
  1352.                     max = oilMax;
  1353.                 }
  1354.                 return max;
  1355.             },
  1356.  
  1357.             initQuickChop: function () {
  1358.                 const panelWoodcutting = document.querySelector("#panel-woodcutting");
  1359.                 const firstItembox = panelWoodcutting.querySelector("itembox");
  1360.  
  1361.                 const lumberjackHtml = `
  1362.                     <itembox id="slapchop-lumberjack" class="shadow hover" data-item="slapchop_lumberjack" onclick="sCWoodcutting().quickChop()">
  1363.                         <div class="center mt-1"><img width="50" height="50" src="data:image/png;base64,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"></div>
  1364.                         <div class="center mt-2">Chop</div>
  1365.                     </itembox>
  1366.                 `;
  1367.                 const rainPotHtml = `
  1368.                     <itembox id="slapchop-rain-pot" class="shadow hover" data-item="slapchop_rainpot" onclick="websocket.send('DRINK=rain_potion')">
  1369.                         <div class="center mt-1"><img width="50" height="50" src="${IMAGE_URL_BASE}/rain_potion.png" title="rain_potion"></div>
  1370.                         <div class="center mt-2">Chop</div>
  1371.                     </itembox>
  1372.                 `;
  1373.                 const rainPotDivHtml = `
  1374.                     <div id="rain_pot-woodcutting" class="lumberjack-rain-pot-woodcutting" data-tooltip="rain_pot">
  1375.                         <div class="itembox-fight-center"><img src="${IMAGE_URL_BASE}/rain_potion.png" title="rain_potion"></div>
  1376.                         <div class="center-flex">
  1377.                             <div id="rain_potion-brew" class="hover" onclick="sCBrewing().quickBrew('rain_potion')">BREW</div>
  1378.                             <div id="rain_potion-use" class="hover" onclick="websocket.send('DRINK=rain_potion')">USE</div>
  1379.                         </div>
  1380.                     </div>
  1381.                 `;
  1382.  
  1383.                 if (firstItembox) {
  1384.                     firstItembox.insertAdjacentHTML("beforebegin", lumberjackHtml);
  1385.                     firstItembox.insertAdjacentHTML("afterend", rainPotHtml);
  1386.                     document
  1387.                         .querySelector("#slapchop-lumberjack")
  1388.                         .insertAdjacentHTML("afterend", rainPotDivHtml);
  1389.                 }
  1390.  
  1391.                 const notificationTreesReady = document.querySelector(
  1392.                     "#notification-trees-ready"
  1393.                 );
  1394.                 if (notificationTreesReady) {
  1395.                     if (
  1396.                         IdlePixelPlus.plugins.slapchop.getConfig(
  1397.                             "quickTreeNotificationHarvestEnabled"
  1398.                         )
  1399.                     ) {
  1400.                         notificationTreesReady.setAttribute(
  1401.                             "onClick",
  1402.                             "sCWoodcutting().quickChop(); switch_panels('panel-woodcutting')"
  1403.                         );
  1404.                     } else {
  1405.                         notificationTreesReady.setAttribute(
  1406.                             "onClick",
  1407.                             "switch_panels('panel-woodcutting')"
  1408.                         );
  1409.                     }
  1410.                 }
  1411.             },
  1412.  
  1413.             quickChop: function () {
  1414.                 for (let i = 1; i <= 5; i++) {
  1415.                     let status = getVar("tree_stage_" + i, 0, "int");
  1416.                     let treeType = getVar("tree_" + i, "none");
  1417.                     let sdCut = getThis.getConfig("quickChopSDTreesEnabled");
  1418.                     let regCut = getThis.getConfig("quickChopRegTreesEnabled");
  1419.                     if (
  1420.                         (status == 4 &&
  1421.                             treeType != "stardust_tree" &&
  1422.                             treeType != "tree") ||
  1423.                         (status == 4 && treeType == "stardust_tree" && sdCut) ||
  1424.                         (status == 4 && treeType == "tree" && regCut)
  1425.                     ) {
  1426.                         IdlePixelPlus.sendMessage("CHOP_TREE=" + i);
  1427.                     }
  1428.                 }
  1429.             },
  1430.         };
  1431.     };
  1432.  
  1433.     const cooking = function () {
  1434.         window.SCEDIBLES = Object.keys(Cooking.ENERGY_MAP).filter(
  1435.             (s) => !s.startsWith("raw_")
  1436.         );
  1437.  
  1438.         window.SCCOOKABLES = Object.keys(Cooking.FOOD_HEAT_REQ_MAP);
  1439.  
  1440.         return {
  1441.             initQuickCook: function () {
  1442.                 SCCOOKABLES.forEach((item) => {
  1443.                     const itemboxes = document.querySelectorAll(
  1444.                         `itembox[data-item="${item}"]`
  1445.                     );
  1446.                     itemboxes.forEach((itembox) => {
  1447.                         itembox.addEventListener("contextmenu", (event) => {
  1448.                             if (getThis.getConfig("quickCookRightClickEnabled")) {
  1449.                                 const primary = sCActionType().primary(event);
  1450.                                 const alt = sCActionType().alt(event);
  1451.                                 if (primary || alt) {
  1452.                                     sCCooking().quickCook(item, !primary);
  1453.                                     event.stopPropagation();
  1454.                                     event.preventDefault();
  1455.                                     return false;
  1456.                                 }
  1457.                             }
  1458.                             return true;
  1459.                         });
  1460.                     });
  1461.                 });
  1462.             },
  1463.  
  1464.             maxCookable: function (food) {
  1465.                 return Cooking.can_cook_how_many(food) || 0;
  1466.             },
  1467.  
  1468.             quickCook: function (food, alt) {
  1469.                 const max = sCCooking().maxCookable(food);
  1470.                 let n = max;
  1471.                 if (alt || singleOverride) {
  1472.                     const owned = getVar(food, 0, "int");
  1473.                     if (owned == max || singleOverride) {
  1474.                         n--;
  1475.                     }
  1476.                 }
  1477.                 if (n > 0) {
  1478.                     IdlePixelPlus.sendMessage(`COOK=${food}~${n}`);
  1479.                 }
  1480.             },
  1481.  
  1482.             quickEat: function (food, alt) {
  1483.                 let n = getVar(food, 0, "int");
  1484.                 if (alt || singleOverride) {
  1485.                     n--;
  1486.                 }
  1487.                 if (n > 0) {
  1488.                     IdlePixelPlus.sendMessage(`CONSUME=${food}~${n}`);
  1489.                 }
  1490.             },
  1491.  
  1492.             initQuickEat: function () {
  1493.                 SCEDIBLES.forEach((item) => {
  1494.                     const itemboxes = document.querySelectorAll(
  1495.                         `itembox[data-item="${item}"]`
  1496.                     );
  1497.                     itemboxes.forEach((itembox) => {
  1498.                         itembox.addEventListener("contextmenu", (event) => {
  1499.                             if (getThis.getConfig("quickEatRightClickEnabled")) {
  1500.                                 const primary = sCActionType().primary(event);
  1501.                                 const alt = sCActionType().alt(event);
  1502.                                 if (primary || alt) {
  1503.                                     sCCooking().quickEat(item, !primary);
  1504.                                     event.stopPropagation();
  1505.                                     event.preventDefault();
  1506.                                     return false;
  1507.                                 }
  1508.                             }
  1509.                             return true;
  1510.                         });
  1511.                     });
  1512.                 });
  1513.             },
  1514.         };
  1515.     };
  1516.  
  1517.     const fishing = function () {
  1518.         window.SCBOATS = Array.from(
  1519.             document.querySelectorAll(
  1520.                 `itembox[data-item$="_boat"], itembox[data-item$="_ship"]`
  1521.             )
  1522.         ).map((el) => el.getAttribute("data-item"));
  1523.  
  1524.         window.SCBAITS = Array.from(
  1525.             document.querySelectorAll(`itembox[data-item$="bait"]`)
  1526.         ).map((el) => el.getAttribute("data-item"));
  1527.  
  1528.         return {
  1529.             quickBoat: function (item) {
  1530.                 const n = getVar(`${item}_timer`);
  1531.                 if (n == "1") {
  1532.                     IdlePixelPlus.sendMessage(`BOAT_COLLECT=${item}`);
  1533.                 } else {
  1534.                     IdlePixelPlus.sendMessage(`BOAT_SEND=${item}`);
  1535.                 }
  1536.             },
  1537.  
  1538.             initQuickBoat: function () {
  1539.                 SCBOATS.forEach((item) => {
  1540.                     const itemboxes = document.querySelectorAll(
  1541.                         `itembox[data-item="${item}"]`
  1542.                     );
  1543.                     itemboxes.forEach((itembox) => {
  1544.                         itembox.addEventListener("contextmenu", (event) => {
  1545.                             if (getThis.getConfig("quickBoatRightClickEnabled")) {
  1546.                                 const primary = sCActionType().primary(event);
  1547.                                 const alt = sCActionType().alt(event);
  1548.                                 if (primary || alt) {
  1549.                                     sCFishing().quickBoat(item, !primary);
  1550.                                     event.stopPropagation();
  1551.                                     event.preventDefault();
  1552.                                     return false;
  1553.                                 }
  1554.                             }
  1555.                             return true;
  1556.                         });
  1557.                     });
  1558.                 });
  1559.             },
  1560.  
  1561.             quickBait: function (item) {
  1562.                 var baitUse = "THROW_" + item.toUpperCase();
  1563.                 websocket.send(`${baitUse}`);
  1564.             },
  1565.  
  1566.             initQuickBait: function () {
  1567.                 SCBAITS.forEach((item) => {
  1568.                     const itemboxes = document.querySelectorAll(
  1569.                         `itembox[data-item="${item}"]`
  1570.                     );
  1571.                     itemboxes.forEach((itembox) => {
  1572.                         itembox.addEventListener("contextmenu", (event) => {
  1573.                             if (getThis.getConfig("quickBaitRightClickEnabled")) {
  1574.                                 const primary = sCActionType().primary(event);
  1575.                                 const alt = sCActionType().alt(event);
  1576.                                 if (primary || alt) {
  1577.                                     sCFishing().quickBait(item, !primary);
  1578.                                     event.stopPropagation();
  1579.                                     event.preventDefault();
  1580.                                     return false;
  1581.                                 }
  1582.                             }
  1583.                             return true;
  1584.                         });
  1585.                     });
  1586.                 });
  1587.             },
  1588.         };
  1589.     };
  1590.  
  1591.     const invention = function () {
  1592.         window.SCGRINDABLE = Array.from(
  1593.             document.querySelectorAll(
  1594.                 `#panel-invention itembox[data-item^="blood_"][onclick^="Invention.clicks_limb"]`
  1595.             )
  1596.         ).map((el) => el.getAttribute("data-item"));
  1597.  
  1598.         return {
  1599.             initQuickGrind: function () {
  1600.                 SCGRINDABLE.forEach((item) => {
  1601.                     const itemboxes = document.querySelectorAll(
  1602.                         `itembox[data-item="${item}"]`
  1603.                     );
  1604.                     itemboxes.forEach((itembox) => {
  1605.                         itembox.addEventListener("contextmenu", (event) => {
  1606.                             if (getThis.getConfig("quickGrindRightClickEnabled")) {
  1607.                                 const primary = sCActionType().primary(event);
  1608.                                 const alt = sCActionType().alt(event);
  1609.                                 if (primary || alt) {
  1610.                                     sCInvention().quickGrind(item, !primary);
  1611.                                     event.stopPropagation();
  1612.                                     event.preventDefault();
  1613.                                     return false;
  1614.                                 }
  1615.                             }
  1616.                             return true;
  1617.                         });
  1618.                     });
  1619.                 });
  1620.             },
  1621.  
  1622.             quickGrind: function (item, alt) {
  1623.                 let n = getVar(item, 0, "int");
  1624.                 if (alt || singleOverride) {
  1625.                     n--;
  1626.                 }
  1627.                 if (!alt && !singleOverride && n > 1) {
  1628.                     n = 1;
  1629.                 }
  1630.                 if (n > 0) {
  1631.                     IdlePixelPlus.sendMessage(`GRIND=${item}~${n}`);
  1632.                 }
  1633.             },
  1634.  
  1635.             quickCleanse: function (item, alt) {
  1636.                 let n = getVar(item, 0, "int");
  1637.                 if (alt || singleOverride) {
  1638.                     n--;
  1639.                 }
  1640.                 if (n > 0) {
  1641.                     IdlePixelPlus.sendMessage(`CLEANSE_EVIL_BLOOD=${item}~${n}`);
  1642.                 }
  1643.             },
  1644.  
  1645.             initQuickCleanse: function () {
  1646.                 const itembox = document.querySelector(
  1647.                     `itembox[data-item="evil_blood"]`
  1648.                 );
  1649.                 itembox.addEventListener("contextmenu", (event) => {
  1650.                     if (getThis.getConfig("quickCleanseRightClickEnabled")) {
  1651.                         const primary = sCActionType().primary(event);
  1652.                         const alt = sCActionType().alt(event);
  1653.                         if (primary || alt) {
  1654.                             sCInvention().quickCleanse("evil_blood", !primary);
  1655.                             event.stopPropagation();
  1656.                             event.preventDefault();
  1657.                             return false;
  1658.                         }
  1659.                     }
  1660.                     return true;
  1661.                 });
  1662.             },
  1663.         };
  1664.     };
  1665.  
  1666.     const combat = function () {
  1667.         window.SCNEEDLEABLE = [
  1668.             "lizard_mask",
  1669.             "lizard_body",
  1670.             "lizard_legs",
  1671.             "lizard_boots",
  1672.             "lizard_gloves",
  1673.             "bat_mask",
  1674.             "bat_body",
  1675.             "bat_legs",
  1676.             "bat_boots",
  1677.             "bat_gloves",
  1678.             "bear_mask",
  1679.             "bear_body",
  1680.             "bear_legs",
  1681.             "bear_boots",
  1682.             "bear_gloves",
  1683.         ];
  1684.  
  1685.         window.SCFEATHER2ARROW = {
  1686.             feathers: {
  1687.                 craft: "wooden_arrows",
  1688.                 required: {
  1689.                     feathers: 15,
  1690.                     logs: 5,
  1691.                     iron_bar: 5,
  1692.                 },
  1693.             },
  1694.             fire_feathers: {
  1695.                 craft: "fire_arrows",
  1696.                 required: {
  1697.                     fire_feathers: 15,
  1698.                     oak_logs: 5,
  1699.                     silver_bar: 5,
  1700.                 },
  1701.             },
  1702.             ice_feathers: {
  1703.                 craft: "ice_arrows",
  1704.                 required: {
  1705.                     ice_feathers: 15,
  1706.                     willow_logs: 5,
  1707.                     gold_bar: 5,
  1708.                 },
  1709.             },
  1710.         };
  1711.  
  1712.         window.SCEXPLOSIVES = ["bomb", "tnt", "large_tnt", "mega_bomb"];
  1713.  
  1714.         window.SCUSERNAME = getVar("username", "", "string");
  1715.  
  1716.         window.SCRINGS = [
  1717.             "accuracy_ring",
  1718.             "ancient_accuracy_ring",
  1719.             "ancient_damage_ring",
  1720.             "ancient_defence_ring",
  1721.             "damage_ring",
  1722.             "defence_ring",
  1723.             "good_accuracy_ring",
  1724.             "good_damage_ring",
  1725.             "good_defence_ring",
  1726.             "great_accuracy_ring",
  1727.             "great_damage_ring",
  1728.             "great_defence_ring",
  1729.             "master_ring",
  1730.             "perfect_accuracy_ring",
  1731.             "perfect_damage_ring",
  1732.             "perfect_defence_ring",
  1733.             "weak_accuracy_ring",
  1734.             "weak_damage_ring",
  1735.             "weak_defence_ring",
  1736.         ];
  1737.  
  1738.         return {
  1739.             loadPresets: function (buttonNum) {
  1740.                 // Retrieve all presets from local storage
  1741.                 let allPresets =
  1742.                     JSON.parse(localStorage.getItem(SCUSERNAME + ".combat_presets")) ||
  1743.                     {};
  1744.  
  1745.                 // Check if the requested preset exists
  1746.                 if (!allPresets[buttonNum]) {
  1747.                     console.error("Preset not found for button number:", buttonNum);
  1748.                     return;
  1749.                 }
  1750.  
  1751.                 // Load the preset and equip each item
  1752.                 IdlePixelPlus.sendMessage("UNEQUIP_ALL");
  1753.                 allPresets[buttonNum].forEach((item) => {
  1754.                     if (item) {
  1755.                         IdlePixelPlus.sendMessage("EQUIP=" + item);
  1756.                     }
  1757.                 });
  1758.             },
  1759.  
  1760.             savePresets: function (buttonNum) {
  1761.                 // Retrieve all presets from local storage, or initialize a new object if none exist
  1762.                 let allPresets =
  1763.                     JSON.parse(localStorage.getItem(SCUSERNAME + ".combat_presets")) ||
  1764.                     {};
  1765.  
  1766.                 // Save current equipment settings into the relevant key of the allPresets object
  1767.                 allPresets[buttonNum] = [
  1768.                     getVar("head", null, "string"),
  1769.                     getVar("body", null, "string"),
  1770.                     getVar("legs", null, "string"),
  1771.                     getVar("boots", null, "string"),
  1772.                     getVar("gloves", null, "string"),
  1773.                     getVar("amulet", null, "string"),
  1774.                     getVar("weapon", null, "string"),
  1775.                     getVar("shield", null, "string"),
  1776.                     getVar("arrows", null, "string"),
  1777.                 ];
  1778.  
  1779.                 // Update the single entry in local storage with the modified allPresets object
  1780.                 localStorage.setItem(
  1781.                     SCUSERNAME + ".combat_presets",
  1782.                     JSON.stringify(allPresets)
  1783.                 );
  1784.             },
  1785.  
  1786.             initQuickFight: async function () {
  1787.                 let html = `
  1788.                     <div id="slapchop-quickfight">
  1789.                         <h5>Quick Fight:</h5>
  1790.                     <div class="slapchop-quickfight-buttons">
  1791.                 `;
  1792.                 Object.values(IdlePixelPlus.info.combatZones).forEach((zone) => {
  1793.                     html += `
  1794.                         <div id="slapchop-quickfight-${
  1795.                                                     zone.id
  1796.                                                 }" class="slapchop-quickfight-zone m-1 ${
  1797.                         zone.blood ? "blood" : ""
  1798.                     }">
  1799.                             <button type="button" onclick="sCCombat().quickFight('${
  1800.                                                             zone.id
  1801.                                                         }')">${zone.id
  1802.                         .replace(/_/g, " ")
  1803.                         .replace(/(^|\s)\w/g, (s) => s.toUpperCase())}
  1804.                             </button>
  1805.                             <div class="slapchop-quickfight-fightpoints slapchop-quickfight-progress-container" title="Fight Points: ${zone.fightPointCost.toLocaleString()}">
  1806.                                 <span class="slapchop-quickfight-progress-value">0</span>
  1807.                                 <div class="slapchop-quickfight-progress"></div>
  1808.                             </div>
  1809.                             <div class="slapchop-quickfight-energy slapchop-quickfight-progress-container" title="Energy: ${zone.energyCost.toLocaleString()}">
  1810.                                 <span class="slapchop-quickfight-progress-value">0</span>
  1811.                                 <div class="slapchop-quickfight-progress"></div>
  1812.                             </div>
  1813.                         </div>
  1814.                     `;
  1815.                 });
  1816.                 html += `
  1817.                     <div id="slapchop-quickfight-pirate" class="slapchop-quickfight-zone m-1 pirate">
  1818.                         <button type="button" onclick="websocket.send('FIGHT_EVIL_PIRATE')">Evil Pirate</button>
  1819.                         <div class="slapchop-quickfight-fightpoints slapchop-quickfight-progress-container" title="Fight Points: Pirate">
  1820.                             <span class="slapchop-quickfight-progress-value">2,000 FP</span>
  1821.                             <div class="slapchop-quickfight-progress"></div>
  1822.                         </div>
  1823.                         <div class="slapchop-quickfight-energy slapchop-quickfight-progress-container" title="Evil Pirate Count">
  1824.                             <span class="slapchop-quickfight-progress-value">0</span>
  1825.                             <div class="slapchop-quickfight-progress"></div>
  1826.                         </div>
  1827.                     </div>
  1828.                 `;
  1829.                 html += `
  1830.                     <div id="slapchop-quickfight-castle" class="slapchop-quickfight-zone m-1 castle">
  1831.                         <button type="button" onclick="Castle.clicks_castle_entrance(); document.getElementById('combat-stats').style.display = 'none'; document.getElementById('game-panels-combat-items-area').style.display = 'none'; Combat.refresh_small_icons_combat_selection();"">Faradox Castle</button>
  1832.                        <div class="slapchop-quickfight-fightpoints slapchop-quickfight-progress-container" title="Fight Points: Castle}">
  1833.                            <span class="slapchop-quickfight-progress-value">No FP to Enter</span>
  1834.                            <div class="slapchop-quickfight-progress"></div>
  1835.                        </div>
  1836.                        <div class="slapchop-quickfight-energy slapchop-quickfight-progress-container" title="Energy: Castle}">
  1837.                            <span class="slapchop-quickfight-progress-value">No Energy to Enter</span>
  1838.                            <div class="slapchop-quickfight-progress"></div>
  1839.                        </div>
  1840.                    </div>
  1841.                </div>
  1842.                `;
  1843.                 html += `
  1844.                    </div>
  1845.                    <hr>
  1846.                    </div>
  1847.                    <div id="slapchop-quickpreset">
  1848.                        <h5>Quick Presets:</h5>
  1849.                        <div class="slapchop-quickpreset-buttons">
  1850.                        <div>
  1851.                            <button onclick="IdlePixelPlus.sendMessage('PRESET_SAVE=1')">Save 1</button>
  1852.                             <button onclick="IdlePixelPlus.sendMessage('PRESET_LOAD=1~1')">Load 1</button>
  1853.                        </div>
  1854.                        <div>
  1855.                            <button onclick="IdlePixelPlus.sendMessage('PRESET_SAVE=2')">Save 2</button>
  1856.                            <button onclick="IdlePixelPlus.sendMessage('PRESET_LOAD=2~1')">Load 2</button>
  1857.                        </div>
  1858.                        <div>
  1859.                            <button onclick="IdlePixelPlus.sendMessage('PRESET_SAVE=3')">Save 3</button>
  1860.                            <button onclick="IdlePixelPlus.sendMessage('PRESET_LOAD=3~1')">Load 3</button>
  1861.                        </div>
  1862.                        <div>
  1863.                            <button onclick="IdlePixelPlus.sendMessage('PRESET_SAVE=4')">Save 4</button>
  1864.                            <button onclick="IdlePixelPlus.sendMessage('PRESET_LOAD=4~1')">Load 4</button>
  1865.                        </div>
  1866.                        <div>
  1867.                            <button onclick="IdlePixelPlus.sendMessage('PRESET_SAVE=5')">Save 5</button>
  1868.                            <button onclick="IdlePixelPlus.sendMessage('PRESET_LOAD=5~1')">Load 5</button>
  1869.                        </div>
  1870.                        <div>
  1871.                            <button onclick="sCCombat().savePresets(6)">Save 6</button>
  1872.                            <button onclick="sCCombat().loadPresets(6)">Load 6</button>
  1873.                        </div>
  1874.                        <div>
  1875.                            <button onclick="sCCombat().savePresets(7)">Save 7</button>
  1876.                            <button onclick="sCCombat().loadPresets(7)">Load 7</button>
  1877.                        </div>
  1878.                        <div>
  1879.                            <button onclick="sCCombat().savePresets(8)">Save 8</button>
  1880.                            <button onclick="sCCombat().loadPresets(8)">Load 8</button>
  1881.                        </div>
  1882.                        <div>
  1883.                            <button onclick="sCCombat().savePresets(9)">Save 9</button>
  1884.                            <button onclick="sCCombat().loadPresets(9)">Load 9</button>
  1885.                        </div>
  1886.                        <div>
  1887.                            <button onclick="sCCombat().savePresets(10)">Save 10</button>
  1888.                            <button onclick="sCCombat().loadPresets(10)">Load 10</button>
  1889.                        </div>
  1890.                    </div>
  1891.                    <br>
  1892.                    <h5>Rings:</h5>
  1893.                    <div>
  1894.                        <button onclick="sCCombat().equipAllRings()">All</button>
  1895.                        <button onclick="sCCombat().unEquipAllRings()">None</button>
  1896.                        <hr>
  1897.                    </div>
  1898.                `;
  1899.                 const panelCombat = document.querySelector("#panel-combat .panel-logo-xp-area");
  1900.                 if (panelCombat) {
  1901.                     panelCombat.insertAdjacentHTML("afterend", html);
  1902.                 }
  1903.  
  1904.                 const gamePanelsCombatItemsArea = document.querySelector(
  1905.                     "#game-panels-combat-items-area .itembox-fight"
  1906.                 );
  1907.                 if (gamePanelsCombatItemsArea) {
  1908.                     gamePanelsCombatItemsArea.insertAdjacentHTML(
  1909.                         "afterend",
  1910.                         `
  1911.                        <div id="rare-monster-pot-in-combat-tab" class="itembox-fight" data-tooltip="fight">
  1912.                            <div class="itembox-fight-center"><img src="${IMAGE_URL_BASE}/rare_monster_potion.png" title="fight"></div>
  1913.                            <div class="center-flex">
  1914.                                <div id="rare_monster_potion-brew" class="hover" onclick="sCBrewing().quickBrew('rare_monster_potion')">BREW</div>
  1915.                                <div id="rare_monster_potion-use" class="hover" onclick="Modals.clicks_rare_monster_potion()">USE</div>
  1916.                            </div>
  1917.                        </div>
  1918.                    `
  1919.                     );
  1920.                 }
  1921.  
  1922.                 const rareMonsterPotInCombatTab = document.querySelector(
  1923.                     "#rare-monster-pot-in-combat-tab"
  1924.                 );
  1925.                 if (rareMonsterPotInCombatTab) {
  1926.                     rareMonsterPotInCombatTab.insertAdjacentHTML(
  1927.                         "afterend",
  1928.                         `
  1929.                        <div id="super_rare-monster-pot-in-combat-tab" class="itembox-fight" data-tooltip="fight">
  1930.                            <div class="itembox-fight-center"><img src="${IMAGE_URL_BASE}/super_rare_monster_potion.png" title="fight"></div>
  1931.                            <div class="center-flex">
  1932.                                <div id="super_rare_monster_potion-brew" class="hover" onclick="sCBrewing().quickBrew('super_rare_monster_potion')">BREW</div>
  1933.                                <div id="super_rare_monster_potion-use" class="hover" onclick="Modals.clicks_super_rare_monster_potion()">USE</div>
  1934.                            </div>
  1935.                        </div>
  1936.                    `
  1937.                     );
  1938.                 }
  1939.  
  1940.                 const fightLeftBorderCombatBottomPanel = document.querySelector(
  1941.                     ".fight-left-border .td-combat-bottom-panel"
  1942.                 );
  1943.                 if (fightLeftBorderCombatBottomPanel) {
  1944.                     fightLeftBorderCombatBottomPanel.insertAdjacentHTML(
  1945.                         "afterend",
  1946.                         `
  1947.                        <div id="fighting-combat_loot_potion" onclick="websocket.send('BREWING_DRINK_COMBAT_LOOT_POTION')" class="fighting-monster-loot-potion hover shadow">
  1948.                            <img src="https://idlepixel.s3.us-east-2.amazonaws.com/images/combat_loot_potion.png" title="combat_loot_potion_icon">
  1949.                             <span id="combat_loot_potion-label">Loot Potions: 0</span>
  1950.                         </div>
  1951.                     `
  1952.                     );
  1953.                 }
  1954.  
  1955.                 const fightLeftBorderFightingCombatLootPotion = document.querySelector(
  1956.                     ".fight-left-border #fighting-combat_loot_potion"
  1957.                 );
  1958.                 if (fightLeftBorderFightingCombatLootPotion) {
  1959.                     fightLeftBorderFightingCombatLootPotion.insertAdjacentHTML(
  1960.                         "afterend",
  1961.                         `
  1962.                         <div id="fighting-rain_potion" onclick="websocket.send('DRINK=rain_potion')" class="fighting-monster-rain-potion hover shadow">
  1963.                             <img src="https://idlepixel.s3.us-east-2.amazonaws.com/images/rain_potion.png" title="rain_potion_in_combat_icon">
  1964.                             <span id="rain_potion-in-combat-label">Rain Potions: 0</span>
  1965.                         </div>
  1966.                     `
  1967.                     );
  1968.                 }
  1969.             },
  1970.  
  1971.             useLamps: function (typeLamp) {
  1972.                 var lampCount = getVar("combat_xp_lamp", 0, "int");
  1973.                 for (let i = lampCount; i > 0; i--) {
  1974.                     websocket.send("COMBAT_XP_LAMP=" + typeLamp);
  1975.                 }
  1976.             },
  1977.  
  1978.             initQuickLamps: function () {
  1979.                 const quickLampContainerHtml = `
  1980.                     <div id="quick-lamp-container">
  1981.                         <div id="quick-lamp-zone">
  1982.                             <h5>Quick Lamps:</h5>
  1983.                             <div id="lamp-zone-all">
  1984.                                 <div id="melee-lamp-zone">
  1985.                                     <div id="melee-zone-label">Melee</div>
  1986.                                     <button id="lamp-melee-max" onclick="sCCombat().useLamps('melee')">Max</button>
  1987.                                 </div>
  1988.                                 <div id="archery-lamp-zone">
  1989.                                     <div id="archery-zone-label">Archery</div>
  1990.                                     <button id="lamp-archery-max" onclick="sCCombat().useLamps('archery')">Max</button>
  1991.                                 </div>
  1992.                                 <div id="magic-lamp-zone">
  1993.                                     <div id="magic-zone-label">Magic</div>
  1994.                                     <button id="lamp-magic-max" onclick="sCCombat().useLamps('magic')">Max</button>
  1995.                                 </div>
  1996.                             </div>
  1997.                         </div>
  1998.                         <hr>
  1999.                     </div>
  2000.                 `;
  2001.  
  2002.                 const gamePanelsCombatItemsArea = document.querySelector(
  2003.                     "#game-panels-combat-items-area"
  2004.                 );
  2005.                 if (gamePanelsCombatItemsArea) {
  2006.                     gamePanelsCombatItemsArea.insertAdjacentHTML(
  2007.                         "beforebegin",
  2008.                         quickLampContainerHtml
  2009.                     );
  2010.                 }
  2011.  
  2012.                 const lamps = getVar("combat_xp_lamp", 0, "int");
  2013.                 const quickLampContainer = document.getElementById("quick-lamp-container");
  2014.                 if (quickLampContainer) {
  2015.                     if (lamps === 0) {
  2016.                         quickLampContainer.style.display = "none";
  2017.                     } else {
  2018.                         quickLampContainer.style.display = "block";
  2019.                     }
  2020.                 }
  2021.             },
  2022.  
  2023.             updateQuickFight: function () {
  2024.                 const fp = getVar("fight_points", 0, "int");
  2025.                 const energy = getVar("energy", 0, "int");
  2026.                 const evilPirate = getVar("evil_pirate", 0, "int");
  2027.  
  2028.                 Object.values(IdlePixelPlus.info.combatZones).forEach((zone) => {
  2029.                     let disabled = fp < zone.fightPointCost || energy < zone.energyCost;
  2030.                     let disabledPirate = fp < 2000 || evilPirate == 0;
  2031.                     let fpPercent = (fp / zone.fightPointCost).toFixed(2).split(".");
  2032.                     let fpPiratePercent = (fp / 2000).toFixed(2).split(".");
  2033.                     let energyPercent = (energy / zone.energyCost).toFixed(2).split(".");
  2034.  
  2035.                     let fpLabel = `&times; ${fpPercent[0]} + ${fpPercent[1].replace(
  2036.                         /^0/,
  2037.                         ""
  2038.                     )}%`;
  2039.                     let fpPirateLabel = `&times; ${
  2040.                         fpPiratePercent[0]
  2041.                     } + ${fpPiratePercent[1].replace(/^0/, "")}%`;
  2042.                     let energyLabel = `&times; ${
  2043.                         energyPercent[0]
  2044.                     } + ${energyPercent[1].replace(/^0/, "")}%`;
  2045.  
  2046.                     if (
  2047.                         zone.id === "volcano" &&
  2048.                         IdlePixelPlus.getVar("volcano_unlocked") !== "1"
  2049.                     ) {
  2050.                         disabled = true;
  2051.                     } else if (
  2052.                         zone.id === "northern_field" &&
  2053.                         IdlePixelPlus.getVar("northern_field_unlocked") !== "1"
  2054.                     ) {
  2055.                         disabled = true;
  2056.                     } else if (
  2057.                         zone.id === "mansion" &&
  2058.                         IdlePixelPlus.getVar("mansion_unlocked") !== "1"
  2059.                     ) {
  2060.                         disabled = true;
  2061.                     } else if (
  2062.                         (zone.id === "blood_field" ||
  2063.                             zone.id === "blood_forest" ||
  2064.                             zone.id === "blood_cave" ||
  2065.                             zone.id === "blood_volcano") &&
  2066.                         IdlePixelPlus.getVar("blood_moon_active") !== "1"
  2067.                     ) {
  2068.                         disabled = true;
  2069.                     }
  2070.  
  2071.                     const button = document.querySelector(
  2072.                         `#slapchop-quickfight-${zone.id} button`
  2073.                     );
  2074.                     button.disabled = disabled;
  2075.  
  2076.                     const fpProgress = document.querySelector(
  2077.                         `#slapchop-quickfight-${zone.id} .slapchop-quickfight-fightpoints .slapchop-quickfight-progress`
  2078.                     );
  2079.                     const energyProgress = document.querySelector(
  2080.                         `#slapchop-quickfight-${zone.id} .slapchop-quickfight-energy .slapchop-quickfight-progress`
  2081.                     );
  2082.                     const fpProgressValue = document.querySelector(
  2083.                         `#slapchop-quickfight-${zone.id} .slapchop-quickfight-fightpoints .slapchop-quickfight-progress-value`
  2084.                     );
  2085.                     const energyProgressValue = document.querySelector(
  2086.                         `#slapchop-quickfight-${zone.id} .slapchop-quickfight-energy .slapchop-quickfight-progress-value`
  2087.                     );
  2088.                     const fpProgressPirate = document.querySelector(
  2089.                         `#slapchop-quickfight-pirate .slapchop-quickfight-fightpoints .slapchop-quickfight-progress`
  2090.                     );
  2091.                     const fpPirateProgressValue = document.querySelector(
  2092.                         `#slapchop-quickfight-pirate .slapchop-quickfight-fightpoints .slapchop-quickfight-progress-value`
  2093.                     );
  2094.                     const energyPirateProgressValue = document.querySelector(
  2095.                         `#slapchop-quickfight-pirate .slapchop-quickfight-energy .slapchop-quickfight-progress-value`
  2096.                     );
  2097.  
  2098.                     const buttonPirate = document.querySelector(
  2099.                         `#slapchop-quickfight-pirate button`
  2100.                     );
  2101.                     buttonPirate.disabled = disabledPirate;
  2102.  
  2103.                     fpProgress.style.width = `${fpPercent}%`;
  2104.                     fpProgressPirate.style.width = `${fpPiratePercent}%`;
  2105.                     energyProgress.style.width = `${energyPercent}%`;
  2106.                     fpProgressValue.innerHTML = fpLabel;
  2107.                     fpPirateProgressValue.innerHTML = fpPirateLabel;
  2108.                     energyProgressValue.innerHTML = energyLabel;
  2109.                     energyPirateProgressValue.innerHTML = `${evilPirate} Remaining`;
  2110.                 });
  2111.             },
  2112.  
  2113.             quickFight: function (zoneId) {
  2114.                 const confirm = getThis.getConfig("quickFightConfirm");
  2115.                 if (confirm) {
  2116.                     if (
  2117.                         sCCombat().confirm(
  2118.                             `FIGHT: ${zoneId
  2119.                                 .replace(/_/g, " ")
  2120.                                 .replace(/(^|\s)\w/g, (s) => s.toUpperCase())} ?`
  2121.                         )
  2122.                     ) {
  2123.                         if (zoneId.startsWith("blood_")) {
  2124.                             Combat.modal_blood_area_last_selected = zoneId;
  2125.                         } else {
  2126.                             Combat.modal_area_last_selected = zoneId;
  2127.                         }
  2128.                         IdlePixelPlus.sendMessage(`START_FIGHT=${zoneId}`);
  2129.                     }
  2130.                 } else {
  2131.                     if (zoneId.startsWith("blood_")) {
  2132.                         Combat.modal_blood_area_last_selected = zoneId;
  2133.                     } else {
  2134.                         Combat.modal_area_last_selected = zoneId;
  2135.                     }
  2136.                     IdlePixelPlus.sendMessage(`START_FIGHT=${zoneId}`);
  2137.                 }
  2138.             },
  2139.  
  2140.             quickExplode: function (item) {
  2141.                 IdlePixelPlus.sendMessage(`USE_${item.toUpperCase()}`);
  2142.             },
  2143.  
  2144.             initQuickExplode: function () {
  2145.                 SCEXPLOSIVES.forEach((item) => {
  2146.                     const itemboxes = document.querySelectorAll(
  2147.                         `itembox[data-item="${item}"]`
  2148.                     );
  2149.                     itemboxes.forEach((itembox) => {
  2150.                         itembox.addEventListener("contextmenu", (event) => {
  2151.                             if (getThis.getConfig("quickExplosionEnabled")) {
  2152.                                 const primary = sCActionType().primary(event);
  2153.                                 const alt = sCActionType().alt(event);
  2154.                                 if (primary || alt) {
  2155.                                     sCCombat().quickExplode(item);
  2156.                                     event.stopPropagation();
  2157.                                     event.preventDefault();
  2158.                                     return false;
  2159.                                 }
  2160.                             }
  2161.                             return true;
  2162.                         });
  2163.                     });
  2164.                 });
  2165.             },
  2166.  
  2167.             quickNeedle: function (item, alt) {
  2168.                 let n = getVar(item, 0, "int");
  2169.                 if (alt || singleOverride) {
  2170.                     n--;
  2171.                 }
  2172.                 if (n > 0) {
  2173.                     IdlePixelPlus.sendMessage(`USE_NEEDLE=${item}~${n}`);
  2174.                 }
  2175.             },
  2176.  
  2177.             initQuickNeedle: function () {
  2178.                 SCNEEDLEABLE.forEach((item) => {
  2179.                     const itemboxes = document.querySelectorAll(
  2180.                         `itembox[data-item="${item}"]`
  2181.                     );
  2182.                     itemboxes.forEach((itembox) => {
  2183.                         itembox.addEventListener("contextmenu", (event) => {
  2184.                             if (getThis.getConfig("quickNeedleRightClickEnabled")) {
  2185.                                 const primary = sCActionType().primary(event);
  2186.                                 const alt = sCActionType().alt(event);
  2187.                                 if (primary || alt) {
  2188.                                     sCCombat().quickNeedle(item, !primary);
  2189.                                     event.stopPropagation();
  2190.                                     event.preventDefault();
  2191.                                     return false;
  2192.                                 }
  2193.                             }
  2194.                             return true;
  2195.                         });
  2196.                     });
  2197.                 });
  2198.             },
  2199.  
  2200.             maxCraftableArrows: function (feather) {
  2201.                 const data = SCFEATHER2ARROW[feather];
  2202.                 if (!data) return 0;
  2203.  
  2204.                 let max = Number.MAX_SAFE_INTEGER;
  2205.                 Object.keys(data.required).forEach((item) => {
  2206.                     const needed = data.required[item];
  2207.                     const owned = getVar(item, 0, "int");
  2208.                     const craftable = Math.floor(owned / needed);
  2209.                     max = Math.min(max, craftable);
  2210.                 });
  2211.                 return max;
  2212.             },
  2213.  
  2214.             quickFeather2Arrow: function (item, alt) {
  2215.                 let n = sCCombat().maxCraftableArrows(item);
  2216.                 if (n > 0) {
  2217.                     IdlePixelPlus.sendMessage(
  2218.                         `CRAFT=${SCFEATHER2ARROW[item].craft}~${n}`
  2219.                     );
  2220.                 }
  2221.             },
  2222.  
  2223.             initQuickFeather2Arrow: function () {
  2224.                 Object.keys(SCFEATHER2ARROW).forEach((item) => {
  2225.                     const itemboxes = document.querySelectorAll(
  2226.                         `itembox[data-item="${item}"]`
  2227.                     );
  2228.                     itemboxes.forEach((itembox) => {
  2229.                         itembox.addEventListener("contextmenu", (event) => {
  2230.                             if (getThis.getConfig("quickCraftArrowRightClickEnabled")) {
  2231.                                 const primary = sCActionType().primary(event);
  2232.                                 const alt = sCActionType().alt(event);
  2233.                                 if (primary || alt) {
  2234.                                     sCCombat().quickFeather2Arrow(item, !primary);
  2235.                                     event.stopPropagation();
  2236.                                     event.preventDefault();
  2237.                                     return false;
  2238.                                 }
  2239.                             }
  2240.                             return true;
  2241.                         });
  2242.                     });
  2243.                 });
  2244.             },
  2245.  
  2246.             initPresets: function () {
  2247.                 const combatPresetsHtml = `
  2248.                     <br />
  2249.                     <br />
  2250.                     <img data-tooltip="Preset 6" id="in-combat-presets-icon-6" onclick="sCCombat().loadPresets(6)" class="combat-presets-combat-icon hover w30" src="${IMAGE_URL_BASE}/melee.png" />
  2251.                     <img data-tooltip="Preset 7" id="in-combat-presets-icon-7" onclick="sCCombat().loadPresets(7)" class="combat-presets-combat-icon hover w30" src="${IMAGE_URL_BASE}/melee.png" />
  2252.                     <img data-tooltip="Preset 8" id="in-combat-presets-icon-8" onclick="sCCombat().loadPresets(8)" class="combat-presets-combat-icon hover w30" src="${IMAGE_URL_BASE}/melee.png" />
  2253.                     <img data-tooltip="Preset 9" id="in-combat-presets-icon-9" onclick="sCCombat().loadPresets(9)" class="combat-presets-combat-icon hover w30" src="${IMAGE_URL_BASE}/melee.png" />
  2254.                     <img data-tooltip="Preset 10" id="in-combat-presets-icon-10" onclick="sCCombat().loadPresets(10)" class="combat-presets-combat-icon hover w30" src="${IMAGE_URL_BASE}/melee.png" />
  2255.                     <br />
  2256.                     <br />
  2257.                     <img id="in-combat-presets-equip-rings" onclick="sCCombat().equipAllRings()" class="combat-presets-combat-icon hover w30" style="background-color: darkgreen" src="${IMAGE_URL_BASE}/rings_icon.png" title="Equip All Rings">
  2258.                     <img id="in-combat-presets-unequip-rings" onclick="sCCombat().unEquipAllRings()" class="combat-presets-combat-icon hover w30" style="background-color: darkred" src="${IMAGE_URL_BASE}/rings_icon.png" title="All Rings">
  2259.                 `;
  2260.  
  2261.                 const combatPresetsArea = document.getElementById(
  2262.                     "combat-presets-area"
  2263.                 );
  2264.                 if (combatPresetsArea) {
  2265.                     combatPresetsArea.insertAdjacentHTML("beforeend", combatPresetsHtml);
  2266.                 }
  2267.             },
  2268.  
  2269.             initPresetListener: function () {
  2270.                 const KEY_ACTIONS = {
  2271.                     54: () => sCCombat().loadPresets(6),
  2272.                     55: () => sCCombat().loadPresets(7),
  2273.                     56: () => sCCombat().loadPresets(8),
  2274.                     57: () => sCCombat().loadPresets(9),
  2275.                     48: () => sCCombat().loadPresets(10),
  2276.                     189: () => sCCombat().equipAllRings(),
  2277.                     187: () => sCCombat().unEquipAllRings(),
  2278.                 };
  2279.  
  2280.                 document.addEventListener("keyup", (e) => {
  2281.                     const chatInput = document.getElementById("chat-area-input");
  2282.                     let chatFocused = chatInput && document.activeElement === chatInput;
  2283.                     let isRelevantPanel = [
  2284.                         "panel-combat-canvas",
  2285.                         "panel-combat",
  2286.                     ].includes(Globals.currentPanel);
  2287.  
  2288.                     if (chatFocused || !isRelevantPanel) {
  2289.                         return; // Early exit if chat is focused or the panel is not relevant
  2290.                     }
  2291.  
  2292.                     const action = KEY_ACTIONS[e.keyCode];
  2293.                     if (action) {
  2294.                         action(); // Execute the action associated with the key code
  2295.                     }
  2296.                 });
  2297.             },
  2298.  
  2299.             equipAllRings: function () {
  2300.                 SCRINGS.forEach((ring) => {
  2301.                     if (
  2302.                         getVar(ring, 0, "int") != 0 &&
  2303.                         getVar(ring + "_equipped", 0, "int") == 0 &&
  2304.                         (getVar(ring + "_crafted", 0, "int") == 1 ||
  2305.                             getVar(ring + "_assembled", 0, "int") == 1)
  2306.                     ) {
  2307.                         IdlePixelPlus.sendMessage(`EQUIP_RING=${ring}`);
  2308.                     }
  2309.                 });
  2310.             },
  2311.  
  2312.             unEquipAllRings: function () {
  2313.                 SCRINGS.forEach((ring) => {
  2314.                     if (getVar(ring + "_equipped", 0, "int") == 1) {
  2315.                         IdlePixelPlus.sendMessage(`EQUIP_RING=${ring}`);
  2316.                     }
  2317.                 });
  2318.             },
  2319.         };
  2320.     };
  2321.  
  2322.     window.sCMisc = misc;
  2323.     window.sCActionType = actionType;
  2324.     window.sCMiningCrafting = mining_crafting;
  2325.     window.sCGathering = gathering;
  2326.     window.sCFarming = farming;
  2327.     window.sCBrewing = brewing;
  2328.     window.sCWoodcutting = woodcutting;
  2329.     window.sCCooking = cooking;
  2330.     window.sCFishing = fishing;
  2331.     window.sCInvention = invention;
  2332.     window.sCCombat = combat;
  2333.  
  2334.     // End New Code Base Const/Functions
  2335.  
  2336.     class SlapChopPlugin extends IdlePixelPlusPlugin {
  2337.         constructor() {
  2338.             super("slapchop", {
  2339.                 about: {
  2340.                     name: GM_info.script.name + " (ver: " + GM_info.script.version + ")",
  2341.                     version: GM_info.script.version,
  2342.                     author: GM_info.script.author,
  2343.                     description: GM_info.script.description,
  2344.                 },
  2345.                 config: [
  2346.                     {
  2347.                         label:
  2348.                             "------------------------------------------------<br/>Key Binds<br/>------------------------------------------------",
  2349.                         type: "label",
  2350.                     },
  2351.                     {
  2352.                         id: "primaryActionKey",
  2353.                         label: "Primary Action Key",
  2354.                         type: "select",
  2355.                         options: [
  2356.                             { value: "none", label: "None" },
  2357.                             { value: "altKey", label: "Alt" },
  2358.                             { value: "shiftKey", label: "Shift" },
  2359.                             { value: "ctrlKey", label: "Ctrl" },
  2360.                         ],
  2361.                         default: "none",
  2362.                     },
  2363.                     {
  2364.                         id: "altActionKey",
  2365.                         label: "Alt Action Key",
  2366.                         type: "select",
  2367.                         options: [
  2368.                             { value: "altKey", label: "Alt" },
  2369.                             { value: "shiftKey", label: "Shift" },
  2370.                             { value: "ctrlKey", label: "Ctrl" },
  2371.                         ],
  2372.                         default: "altKey",
  2373.                     },
  2374.                     {
  2375.                         id: "autoSingleEnabled",
  2376.                         label:
  2377.                             "Enable the ability to use items without having to hold the 'ALT' key<br/>to keep a single item for slapchop commands.",
  2378.                         type: "boolean",
  2379.                         default: true,
  2380.                     },
  2381.                     {
  2382.                         label:
  2383.                             "------------------------------------------------<br/>Brewing<br/>------------------------------------------------",
  2384.                         type: "label",
  2385.                     },
  2386.                     {
  2387.                         id: "quickBrewButtonEnabled",
  2388.                         label: "Quick Brew (buttons): Enabled",
  2389.                         type: "boolean",
  2390.                         default: true,
  2391.                     },
  2392.                     {
  2393.                         id: "quickPotionRightClickEnabled",
  2394.                         label: "Quick Potion (right-click, primary=1): Enabled",
  2395.                         type: "boolean",
  2396.                         default: true,
  2397.                     },
  2398.                     {
  2399.                         label:
  2400.                             "------------------------------------------------<br/>Combat<br/>------------------------------------------------",
  2401.                         type: "label",
  2402.                     },
  2403.                     {
  2404.                         id: "quickCraftArrowRightClickEnabled",
  2405.                         label:
  2406.                             "Quick Craft Arrow (right-click feather, primary=max): Enabled",
  2407.                         type: "boolean",
  2408.                         default: true,
  2409.                     },
  2410.                     {
  2411.                         id: "quickExplosionEnabled",
  2412.                         label:
  2413.                             "Quick Detonation - Quickly use explosives in combat window (right-click): Enabled",
  2414.                         type: "boolean",
  2415.                         default: true,
  2416.                     },
  2417.                     {
  2418.                         id: "quickFightEnabled",
  2419.                         label: "Quick Fight: Enabled",
  2420.                         type: "boolean",
  2421.                         default: true,
  2422.                     },
  2423.                     {
  2424.                         id: "quickFightConfirm",
  2425.                         label: "Quick Fight: Confirm",
  2426.                         type: "boolean",
  2427.                         default: false,
  2428.                     },
  2429.                     {
  2430.                         id: "quickFightEnergyBar",
  2431.                         label: "Quick Fight: Energy Bar",
  2432.                         type: "boolean",
  2433.                         default: true,
  2434.                     },
  2435.                     {
  2436.                         id: "quickFightFPBar",
  2437.                         label: "Quick Fight: FP Bar",
  2438.                         type: "boolean",
  2439.                         default: true,
  2440.                     },
  2441.                     {
  2442.                         id: "quickLampShow",
  2443.                         label: "Quick Lamp Show (When you have Lamps)",
  2444.                         type: "boolean",
  2445.                         default: true,
  2446.                     },
  2447.                     {
  2448.                         id: "quickNeedleRightClickEnabled",
  2449.                         label:
  2450.                             "Quick Needle (right-click, primary=max, alt=keep-1): Enabled",
  2451.                         type: "boolean",
  2452.                         default: false,
  2453.                     },
  2454.                     {
  2455.                         id: "quickPresetsEnabled",
  2456.                         label: "Quick Presets: Enabled",
  2457.                         type: "boolean",
  2458.                         default: true,
  2459.                     },
  2460.                     {
  2461.                         label:
  2462.                             "------------------------------------------------<br/>Cooking/Eating<br/>------------------------------------------------",
  2463.                         type: "label",
  2464.                     },
  2465.                     {
  2466.                         id: "quickCookRightClickEnabled",
  2467.                         label: "Quick Cook (right-click, primary=max, alt=keep-1): Enabled",
  2468.                         type: "boolean",
  2469.                         default: true,
  2470.                     },
  2471.                     {
  2472.                         id: "quickEatRightClickEnabled",
  2473.                         label: "Quick Eat (right-click, primary=max, alt=keep-1): Enabled",
  2474.                         type: "boolean",
  2475.                         default: true,
  2476.                     },
  2477.                     {
  2478.                         label:
  2479.                             "------------------------------------------------<br/>Farming<br/>------------------------------------------------",
  2480.                         type: "label",
  2481.                     },
  2482.                     {
  2483.                         id: "quickBoneRightClickEnabled",
  2484.                         label:
  2485.                             "Quick Bonemeal (right-click, primary=max, alt=keep-1): Enabled",
  2486.                         type: "boolean",
  2487.                         default: true,
  2488.                     },
  2489.                     {
  2490.                         id: "quickHarvestEnabled",
  2491.                         label: "Quick Harvest (Bob): Enabled",
  2492.                         type: "boolean",
  2493.                         default: true,
  2494.                     },
  2495.                     {
  2496.                         id: "quickHarvestNotificationEnabled",
  2497.                         label:
  2498.                             "Harvest Farm plots when clicking on the notification: Enabled",
  2499.                         type: "boolean",
  2500.                         default: true,
  2501.                     },
  2502.                     {
  2503.                         id: "quickPlantRightClickEnabled",
  2504.                         label: "Quick Plant (right-click, primary=1, alt=max): Enabled",
  2505.                         type: "boolean",
  2506.                         default: true,
  2507.                     },
  2508.                     {
  2509.                         id: "quickPlantHarvestRightClickEnabled",
  2510.                         label:
  2511.                             "Quick Harvest And Plant (right-click, primary=1, alt=max): Enabled",
  2512.                         type: "boolean",
  2513.                         default: false,
  2514.                     },
  2515.                     {
  2516.                         label:
  2517.                             "------------------------------------------------<br/>Fishing<br/>------------------------------------------------",
  2518.                         type: "label",
  2519.                     },
  2520.                     {
  2521.                         id: "quickBaitRightClickEnabled",
  2522.                         label: "Quick Bait (right-click): Enabled",
  2523.                         type: "boolean",
  2524.                         default: true,
  2525.                     },
  2526.                     {
  2527.                         id: "quickBoatRightClickEnabled",
  2528.                         label: "Quick Boat (right-click): Enabled",
  2529.                         type: "boolean",
  2530.                         default: true,
  2531.                     },
  2532.                     {
  2533.                         label:
  2534.                             "------------------------------------------------<br/>Foundry/Mining/Smelting<br/>------------------------------------------------",
  2535.                         type: "label",
  2536.                     },
  2537.                     {
  2538.                         id: "quickFoundryEnabled",
  2539.                         label: "Quick Foundry (buttons): Enabled",
  2540.                         type: "boolean",
  2541.                         default: true,
  2542.                     },
  2543.                     {
  2544.                         id: "quickMiningRightClickEnabled",
  2545.                         label: "Quick Geode / Prism Use (right-click, primary=1): Enabled",
  2546.                         type: "boolean",
  2547.                         default: true,
  2548.                     },
  2549.                     {
  2550.                         id: "quickMineralRightClickEnabled",
  2551.                         label:
  2552.                             "Quick Mineral XP Conversion (right-click, primary=1): Enabled",
  2553.                         type: "boolean",
  2554.                         default: true,
  2555.                     },
  2556.                     {
  2557.                         id: "quickSmeltEnabled",
  2558.                         label: "Quick Smelt (buttons): Enabled",
  2559.                         type: "boolean",
  2560.                         default: true,
  2561.                     },
  2562.                     {
  2563.                         id: "quickSmeltRightClickEnabled",
  2564.                         label: "Quick Smelt (right-click, primary=max): Enabled",
  2565.                         type: "boolean",
  2566.                         default: true,
  2567.                     },
  2568.                     {
  2569.                         label:
  2570.                             "------------------------------------------------<br/>Gathering<br/>------------------------------------------------",
  2571.                         type: "label",
  2572.                     },
  2573.                     {
  2574.                         id: "quickGatherRightClickEnabled",
  2575.                         label:
  2576.                             "Quick Gather (right-click, primary=max, alt=keep-1): Enabled",
  2577.                         type: "boolean",
  2578.                         default: true,
  2579.                     },
  2580.                     {
  2581.                         label:
  2582.                             "------------------------------------------------<br/>Invention<br/>------------------------------------------------",
  2583.                         type: "label",
  2584.                     },
  2585.                     {
  2586.                         id: "quickGrindRightClickEnabled",
  2587.                         label: "Quick Blood Grind (right-click, primary=1): Enabled",
  2588.                         type: "boolean",
  2589.                         default: true,
  2590.                     },
  2591.                     {
  2592.                         id: "quickCleanseRightClickEnabled",
  2593.                         label:
  2594.                             "Quick Cleanse Blood in Invention (right-click, primary=1): Enabled",
  2595.                         type: "boolean",
  2596.                         default: true,
  2597.                     },
  2598.                     {
  2599.                         label:
  2600.                             "------------------------------------------------<br/>Woodcutting<br/>------------------------------------------------",
  2601.                         type: "label",
  2602.                     },
  2603.                     {
  2604.                         id: "quickBurnRightClickEnabled",
  2605.                         label:
  2606.                             "Quick Burn Logs (right-click, primary=max, alt=keep-1): Enabled",
  2607.                         type: "boolean",
  2608.                         default: true,
  2609.                     },
  2610.                     {
  2611.                         id: "quickChopEnabled",
  2612.                         label: "Quick Chop (Lumberjack): Enabled",
  2613.                         type: "boolean",
  2614.                         default: true,
  2615.                     },
  2616.                     {
  2617.                         id: "quickChopRegTreesEnabled",
  2618.                         label: "Quick Chop (Normal Trees Lumberjack): Enabled",
  2619.                         type: "boolean",
  2620.                         default: true,
  2621.                     },
  2622.                     {
  2623.                         id: "quickChopSDTreesEnabled",
  2624.                         label: "Quick Chop (SD Trees Lumberjack): Enabled",
  2625.                         type: "boolean",
  2626.                         default: true,
  2627.                     },
  2628.                     {
  2629.                         id: "quickTreeNotificationHarvestEnabled",
  2630.                         label: "Harvest Trees when clicking on the notification: Enabled",
  2631.                         type: "boolean",
  2632.                         default: true,
  2633.                     },
  2634.                 ],
  2635.             });
  2636.         }
  2637.  
  2638.         onPanelChanged(panelBefore, panelAfter) {
  2639.             if (Globals.currentPanel == "panel-woodcutting") {
  2640.                 let woodCuttingElite = Achievements.has_completed_set(
  2641.                     "woodcutting",
  2642.                     "elite"
  2643.                 );
  2644.                 if (woodCuttingElite) {
  2645.                     document.getElementById("rain_pot-woodcutting").style.display = "";
  2646.                 } else {
  2647.                     document.getElementById("rain_pot-woodcutting").style.display =
  2648.                         "none";
  2649.                 }
  2650.                 if (Globals.currentPanel == "panel-combat") {
  2651.                     var lamps = getVar("combat_xp_lamp", 0, "int");
  2652.                     if (lamps == 0) {
  2653.                         document.getElementById("quick-lamp-container").style.display =
  2654.                             "none";
  2655.                     } else {
  2656.                         document.getElementById("quick-lamp-container").style.display = "";
  2657.                     }
  2658.                     sCMisc().updateQuickFight();
  2659.                 }
  2660.             }
  2661.         }
  2662.  
  2663.         onConfigsChanged() {
  2664.             if (onLoginLoaded) {
  2665.                 sCMisc().updateButtons();
  2666.  
  2667.                 const slapchopQuickFight = document.querySelector(
  2668.                     "#slapchop-quickfight"
  2669.                 );
  2670.                 const slapchopQuickFoundry = document.querySelector(
  2671.                     "#slapchop-quickfoundry"
  2672.                 );
  2673.                 const slapchopQuickPreset = document.querySelector(
  2674.                     "#slapchop-quickpreset"
  2675.                 );
  2676.                 const slapchopQuickFightFPBar = document.querySelectorAll(
  2677.                     ".slapchop-quickfight-fightpoints"
  2678.                 );
  2679.                 const slapchopQuickFightEnergyBar = document.querySelectorAll(
  2680.                     ".slapchop-quickfight-energy"
  2681.                 );
  2682.                 const slapchopQuickSmeltMining = document.getElementById(
  2683.                     "slapchop-quicksmelt-mining"
  2684.                 );
  2685.                 const slapchopQuickSmeltCrafting = document.getElementById(
  2686.                     "slapchop-quicksmelt-crafting"
  2687.                 );
  2688.                 const slapchopQuickBrewButton = document.querySelectorAll(
  2689.                     ".slapchop-quickbrew-button"
  2690.                 );
  2691.  
  2692.                 singleOverride = getThis.getConfig("autoSingleEnabled");
  2693.  
  2694.                 if (getThis.getConfig("quickFightEnabled")) {
  2695.                     slapchopQuickFight.style.display = "block";
  2696.                 } else {
  2697.                     slapchopQuickFight.style.display = "none";
  2698.                 }
  2699.  
  2700.                 if (getThis.getConfig("quickFoundryEnabled")) {
  2701.                     slapchopQuickFoundry.style.display = "block";
  2702.                 } else {
  2703.                     slapchopQuickFoundry.style.display = "none";
  2704.                 }
  2705.  
  2706.                 const presetsUnlocked = IdlePixelPlus.getVar("combat_presets") == "1";
  2707.                 if (presetsUnlocked && getThis.getConfig("quickPresetsEnabled")) {
  2708.                     slapchopQuickPreset.style.display = "block";
  2709.                 } else {
  2710.                     slapchopQuickPreset.style.display = "none";
  2711.                 }
  2712.  
  2713.                 if (getThis.getConfig("quickFightFPBar")) {
  2714.                     slapchopQuickFightFPBar.forEach((bar) => {
  2715.                         bar.style.display = "block";
  2716.                     });
  2717.                 } else {
  2718.                     slapchopQuickFightFPBar.forEach((bar) => {
  2719.                         bar.style.display = "none";
  2720.                     });
  2721.                 }
  2722.  
  2723.                 if (getThis.getConfig("quickFightEnergyBar")) {
  2724.                     slapchopQuickFightEnergyBar.forEach((bar) => {
  2725.                         bar.style.display = "block";
  2726.                     });
  2727.                 } else {
  2728.                     slapchopQuickFightEnergyBar.forEach((bar) => {
  2729.                         bar.style.display = "none";
  2730.                     });
  2731.                 }
  2732.  
  2733.                 if (getThis.getConfig("quickSmeltEnabled")) {
  2734.                     slapchopQuickSmeltMining.style.display = "block";
  2735.                     slapchopQuickSmeltCrafting.style.display = "block";
  2736.                 } else {
  2737.                     slapchopQuickSmeltMining.style.display = "none";
  2738.                     slapchopQuickSmeltCrafting.style.display = "none";
  2739.                 }
  2740.  
  2741.                 if (getThis.getConfig("quickBrewButtonEnabled")) {
  2742.                     slapchopQuickBrewButton.forEach((button) => {
  2743.                         button.style.display = "block";
  2744.                     });
  2745.                 } else {
  2746.                     slapchopQuickBrewButton.forEach((button) => {
  2747.                         button.style.display = "none";
  2748.                     });
  2749.                 }
  2750.  
  2751.                 if (
  2752.                     getThis.getConfig("quickLampShow") &&
  2753.                     getVar("combat_xp_lamp", 0, "int") > 0
  2754.                 ) {
  2755.                     document.getElementById("quick-lamp-container").style.display = "";
  2756.                 } else {
  2757.                     document.getElementById("quick-lamp-container").style.display =
  2758.                         "none";
  2759.                 }
  2760.  
  2761.                 if (getThis.getConfig("quickHarvestEnabled")) {
  2762.                     window.var_slapchop_bob = "1";
  2763.                 } else {
  2764.                     window.var_slapchop_bob = "0";
  2765.                 }
  2766.  
  2767.                 if (getThis.getConfig("quickChopEnabled")) {
  2768.                     window.var_slapchop_lumberjack = "1";
  2769.                 } else {
  2770.                     window.var_slapchop_lumberjack = "0";
  2771.                 }
  2772.  
  2773.                 const notificationTreesReady = document.getElementById(
  2774.                     "notification-trees-ready"
  2775.                 );
  2776.                 if (getThis.getConfig("quickTreeNotificationHarvestEnabled")) {
  2777.                     notificationTreesReady.setAttribute(
  2778.                         "onClick",
  2779.                         `sCWoodcutting.quickChop(); switch_panels('panel-woodcutting')`
  2780.                     );
  2781.                 } else {
  2782.                     notificationTreesReady.setAttribute(
  2783.                         "onClick",
  2784.                         `switch_panels('panel-woodcutting')`
  2785.                     );
  2786.                 }
  2787.             }
  2788.         }
  2789.  
  2790.         onLogin() {
  2791.             IPP = IdlePixelPlus;
  2792.             getVar = IdlePixelPlus.getVarOrDefault;
  2793.             getThis = IdlePixelPlus.plugins.slapchop;
  2794.             singleOverride = getThis.getConfig("autoSingleEnabled");
  2795.             sCMisc().initStyles();
  2796.             sCCombat().initQuickFight();
  2797.             sCMiningCrafting().initQuickSmelt();
  2798.             sCCooking().initQuickCook();
  2799.             sCCooking().initQuickEat();
  2800.             sCFarming().initQuickPlant();
  2801.             sCFarming().initQuickBones();
  2802.             sCBrewing().initQuickPotions();
  2803.             sCFishing().initQuickBoat();
  2804.             sCFishing().initQuickBait();
  2805.             sCCombat().initQuickNeedle();
  2806.             sCBrewing().initQuickBrew();
  2807.             sCGathering().initQuickGather();
  2808.             sCWoodcutting().initQuickBurn();
  2809.             sCCombat().initQuickFeather2Arrow();
  2810.             sCWoodcutting().initQuickFoundry();
  2811.             sCWoodcutting().initQuickChop();
  2812.             sCFarming().initQuickHarvest();
  2813.             sCInvention().initQuickGrind();
  2814.             sCMiningCrafting().initQuickRocketFuel();
  2815.             sCMiningCrafting().initQuickMining();
  2816.             sCInvention().initQuickCleanse();
  2817.             sCMiningCrafting().initQuickMineral();
  2818.             sCMiningCrafting().initMiningPresets();
  2819.             sCCombat().initPresets();
  2820.             sCCombat().initPresetListener();
  2821.             sCCombat().initQuickExplode();
  2822.             sCCombat().initQuickLamps();
  2823.  
  2824.             sCCombat().updateQuickFight();
  2825.             sCMiningCrafting().updateQuickSmelt();
  2826.             sCWoodcutting().updateQuickFoundry();
  2827.  
  2828.             setTimeout(function () {
  2829.                 onLoginLoaded = true;
  2830.                 IdlePixelPlus.plugins.slapchop.onConfigsChanged();
  2831.             }, 5000);
  2832.             loaded = true;
  2833.         }
  2834.  
  2835.         onVariableSet(key, valueBefore, valueAfter) {
  2836.             if (onLoginLoaded) {
  2837.                 if (Globals.currentPanel != "panel-combat-canvas") {
  2838.                     if (Globals.currentPanel == "panel-combat") {
  2839.                         if (key.includes("combat_xp_lamp")) {
  2840.                             var lamps = getVar("combat_xp_lamp", 0, "int");
  2841.                             if (lamps == 0 || !getThis.getConfig("quickLampShow")) {
  2842.                                 document.getElementById("quick-lamp-container").style.display =
  2843.                                     "none";
  2844.                             } else {
  2845.                                 document.getElementById("quick-lamp-container").style.display =
  2846.                                     "";
  2847.                             }
  2848.                         }
  2849.                     }
  2850.                     if (
  2851.                         [
  2852.                             "fight_points",
  2853.                             "energy",
  2854.                             "volcano_unlocked",
  2855.                             "northern_field_unlocked",
  2856.                             "blood_moon_active",
  2857.                         ].includes(key)
  2858.                     ) {
  2859.                         sCCombat().updateQuickFight();
  2860.                     }
  2861.                 }
  2862.  
  2863.                 if (
  2864.                     Globals.currentPanel == "panel-mining" ||
  2865.                     Globals.currentPanel == "panel-crafting"
  2866.                 ) {
  2867.                     if (
  2868.                         [
  2869.                             SCSMELTABLES,
  2870.                             "oil",
  2871.                             "charcoal",
  2872.                             "lava",
  2873.                             "dragon_fire",
  2874.                             "stone_furnace",
  2875.                             "bronze_furnace",
  2876.                             "iron_furnace",
  2877.                             "silver_furnace",
  2878.                             "gold_furnace",
  2879.                             "promethium_furnace",
  2880.                             "titanium_furnace",
  2881.                             "ancient_furnace",
  2882.                             "dragon_furnace",
  2883.                         ].includes(key)
  2884.                     ) {
  2885.                         sCMiningCrafting().updateQuickSmelt();
  2886.                         sCMiningCrafting().updateMaxCraftable();
  2887.                     }
  2888.                 }
  2889.  
  2890.                 if (Globals.currentPanel == "panel-woodcutting") {
  2891.                     if ([SCLOGS, "oil", "foundry_amount"].includes(key)) {
  2892.                         sCWoodcutting().updateQuickFoundry();
  2893.                     }
  2894.                 }
  2895.  
  2896.                 if (!loaded) {
  2897.                     this.delay();
  2898.                     return;
  2899.                 }
  2900.  
  2901.                 let variables = [
  2902.                     "dotted_green_leaf",
  2903.                     "strange_leaf",
  2904.                     "red_mushroom",
  2905.                     "rare_monster_potion",
  2906.                     "super_rare_monster_potion",
  2907.                     "combat_loot_potion",
  2908.                     "combat_loot_potion_timer",
  2909.                     "rain_potion",
  2910.                     "rain_potion_timer",
  2911.                 ];
  2912.                 if (variables.includes(key)) {
  2913.                     sCMisc().updateButtons();
  2914.                 }
  2915.             }
  2916.         }
  2917.  
  2918.         async delay() {
  2919.             await new Promise((resolve) => {
  2920.                 const checkLoaded = () => {
  2921.                     if (loaded) {
  2922.                         resolve();
  2923.                     } else {
  2924.                         setTimeout(checkLoaded, 2000);
  2925.                     }
  2926.                 };
  2927.  
  2928.                 checkLoaded();
  2929.             });
  2930.  
  2931.             sCMisc().updateButtons();
  2932.         }
  2933.     }
  2934.  
  2935.     const plugin = new SlapChopPlugin();
  2936.     IdlePixelPlus.registerPlugin(plugin);
  2937. })();
  2938.  
Add Comment
Please, Sign In to add comment