// ==UserScript==
// @name IdlePixel Combat Presets Plus
// @namespace mippo.idle-pixel
// @version 1.0.1
// @description CombatPresets (5x5) / Don't use with "Slap Chop".
// @author mippo
// @license MIT
// @match *://idle-pixel.com/login/play*
// @grant none
// @require https://greasyfork.org/scripts/441206-idlepixel/code/IdlePixel+.js?anticache=20220905
// ==/UserScript==
(function () {
"use strict";
// Overall Declarations for different variables used throughout the script
let IPP, getVar, getThis;
const IMAGE_URL_BASE = document
.querySelector("itembox[data-item=copper] img")
.src.replace(/\/[^/]+.png$/, "");
let loaded = false;
let onLoginLoaded = false;
// Start New Code Base Const/Functions
const misc = function () {
return {
initStyles: function () {
var style = document.createElement("style");
style.id = "styles-slapchop";
style.innerHTML = `
#slapchop-quickpreset > .slapchop-quickpreset-buttons {
display: flex;
flex-direction: row;
justify-content: start;
}
#slapchop-quickpreset > .slapchop-quickpreset-buttons > div {
display: flex;
flex-direction: column;
justify-content: start;
}
#combat-stats #slapchop-quickpreset > .slapchop-quickpreset-buttons {
display: grid;
grid-template-columns: auto auto;
justify-content: start;
column-gap: 1em;
}
#combat-stats #slapchop-quickpreset > .slapchop-quickpreset-buttons > div {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
#combat-stats #slapchop-quickpreset > .slapchop-quickpreset-buttons > div > div {
display: flex;
flex-direction: column;
justify-content: flex-start;
}
#slapchop-quickpreset-buttons-unlink,
#slapchop-quickpreset-buttons-unlink-lock {
font-size: 0.8em;
}
#slapchop-quickpreset-buttons-unlink.current-group-0,
#slapchop-quickpreset-buttons-unlink-lock.current-group-99,
#combat-stats #slapchop-quickpreset-buttons-groups.current-group-6 > .slapchop-quickpreset-buttons-group6 > button,
#combat-stats #slapchop-quickpreset-buttons-groups.current-group-7 > .slapchop-quickpreset-buttons-group7 > button,
#combat-stats #slapchop-quickpreset-buttons-groups.current-group-8 > .slapchop-quickpreset-buttons-group8 > button,
#combat-stats #slapchop-quickpreset-buttons-groups.current-group-9 > .slapchop-quickpreset-buttons-group9 > button,
#combat-stats #slapchop-quickpreset-buttons-groups.current-group-10 > .slapchop-quickpreset-buttons-group10 > button,
#in-combat-presets-icon-6.current,
#in-combat-presets-icon-7.current,
#in-combat-presets-icon-8.current,
#in-combat-presets-icon-9.current,
#in-combat-presets-icon-10.current {
background-color: limegreen;
}
#slapchop-quickpreset button {
margin: 0.125em;
}
.combat-presets-area,
.combat-potions-area,
.combat-cannon-area {
vertical-align: text-top;
}
`;
document.head.appendChild(style);
},
};
};
const combat = function () {
window.SCUSERNAME = getVar("username", "", "string");
// Define keys for localStorage in a centralized manner
const COMBAT_PRESETS_KEY = SCUSERNAME + ".combat_presets";
const COMBAT_PRESETS_LINK_KEY = SCUSERNAME + ".combat_presets_link";
return {
loadPresetGroups: function (buttonNum) {
// Suppress popup "Combat preset saved"
const openImageModalOriginal = Modals.open_image_modal;
Modals.open_image_modal = (title, image_path, message, primary_button_text, secondary_button_text, command, force_unclosable) => {
if (message === "Successfully saved preset based on what you are currently wearing.") {
return;
}
openImageModalOriginal(title, image_path, message, primary_button_text, secondary_button_text, command, force_unclosable);
}
// Set shortcut number presets to 1-5
for (let combatpresetNum = 1; combatpresetNum < 6; combatpresetNum++) {
let presetName = `CombatPreset ${buttonNum * 10 + combatpresetNum}`;
// Retrieve all presets from local storage
let allPresets =
JSON.parse(localStorage.getItem(COMBAT_PRESETS_KEY)) ||
{};
// Check if the requested preset exists
if (!allPresets[presetName]) {
console.error("Preset not found for button number:", presetName);
return;
}
// Load the preset and equip each item
IdlePixelPlus.sendMessage("UNEQUIP_ALL");
allPresets[presetName].forEach((item) => {
if (item) {
IdlePixelPlus.sendMessage("EQUIP=" + item);
}
});
IdlePixelPlus.sendMessage(`PRESET_SAVE=${combatpresetNum}`);
}
IdlePixelPlus.sendMessage('PRESET_LOAD=1~1');
sCCombat().saveLinkedPresetNum(buttonNum);
},
savePresetGroups: function (buttonNum) {
// Presets 1-5 are saved as shortcut numbers
for (let combatpresetNum = 1; combatpresetNum < 6; combatpresetNum++) {
let presetName = `CombatPreset ${buttonNum * 10 + combatpresetNum}`;
// Retrieve all presets from local storage, or initialize a new object if none exist
let allPresets =
JSON.parse(localStorage.getItem(COMBAT_PRESETS_KEY)) ||
{};
// Save current equipment settings into the relevant key of the allPresets object
allPresets[presetName] = [
getVar(`preset_head_${combatpresetNum}`, null, "string"),
getVar(`preset_body_${combatpresetNum}`, null, "string"),
getVar(`preset_legs_${combatpresetNum}`, null, "string"),
getVar(`preset_boots_${combatpresetNum}`, null, "string"),
getVar(`preset_gloves_${combatpresetNum}`, null, "string"),
getVar(`preset_amulet_${combatpresetNum}`, null, "string"),
getVar(`preset_weapon_${combatpresetNum}`, null, "string"),
getVar(`preset_shield_${combatpresetNum}`, null, "string"),
getVar(`preset_arrows_${combatpresetNum}`, null, "string"),
];
// Update the single entry in local storage with the modified allPresets object
localStorage.setItem(COMBAT_PRESETS_KEY, JSON.stringify(allPresets));
}
sCCombat().saveLinkedPresetNum(buttonNum);
},
saveCurrentPresets: function (buttonNum) {
IdlePixelPlus.sendMessage(`PRESET_SAVE=${buttonNum}`)
// Get linked preset numbers
const LinkedPresetNum =
JSON.parse(localStorage.getItem(COMBAT_PRESETS_LINK_KEY)) ||
0;
if (LinkedPresetNum === 0 || LinkedPresetNum === 99) {
return;
}
sCCombat().savePresetGroups(LinkedPresetNum);
let presetName = `CombatPreset ${LinkedPresetNum * 10 + buttonNum}`;
// Retrieve all presets from local storage, or initialize a new object if none exist
let allPresets =
JSON.parse(localStorage.getItem(COMBAT_PRESETS_KEY)) ||
{};
// Save current equipment settings into the relevant key of the allPresets object
allPresets[presetName] = [
getVar("head", null, "string"),
getVar("body", null, "string"),
getVar("legs", null, "string"),
getVar("boots", null, "string"),
getVar("gloves", null, "string"),
getVar("amulet", null, "string"),
getVar("weapon", null, "string"),
getVar("shield", null, "string"),
getVar("arrows", null, "string"),
];
// Update the single entry in local storage with the modified allPresets object
localStorage.setItem(COMBAT_PRESETS_KEY, JSON.stringify(allPresets));
},
saveLinkedPresetNum: function (buttonNum) {
const LinkedPresetNum =
JSON.parse(localStorage.getItem(COMBAT_PRESETS_LINK_KEY)) ||
0;
// Lock button on/off switching
if (LinkedPresetNum === 99) {
if (buttonNum === 99) {
buttonNum = 0;
} else {
return;
}
}
localStorage.setItem(COMBAT_PRESETS_LINK_KEY, buttonNum);
sCCombat().removeHighlightPresetButtons();
sCCombat().highlightPresetButtons();
},
highlightPresetButtons: function () {
// Retrieve the preset number from localStorage (default to 0 if not found)
const LinkedPresetNum =
JSON.parse(localStorage.getItem(COMBAT_PRESETS_LINK_KEY)) || 0;
if (LinkedPresetNum >= 6 && LinkedPresetNum <= 10) {
// For numbers between 6 and 10, apply a highlight to the corresponding group and icon
const groupElem = document.getElementById("slapchop-quickpreset-buttons-groups");
if (groupElem) {
groupElem.className = "current-group-" + LinkedPresetNum;
}
const iconElem = document.getElementById("in-combat-presets-icon-" + LinkedPresetNum);
if (iconElem) {
iconElem.classList.add("current");
}
} else {
const unlinkElem = document.getElementById("slapchop-quickpreset-buttons-unlink");
if (unlinkElem) {
// If LinkedPresetNum is 0, apply highlight to the unlink button
unlinkElem.className = "current-group-0";
}
if (LinkedPresetNum === 99) {
// If LinkedPresetNum is 99, apply highlight to the unlink-lock button
const unlinkLockElem = document.getElementById("slapchop-quickpreset-buttons-unlink-lock");
if (unlinkLockElem) {
unlinkLockElem.className = "current-group-99";
}
}
}
},
removeHighlightPresetButtons: function () {
// Remove highlight for the entire preset group container
const groupElem = document.getElementById("slapchop-quickpreset-buttons-groups");
if (groupElem) {
groupElem.className = ""; // Reset the container's class
}
// Remove highlights from preset icons for groups 6 to 10
for (let i = 6; i <= 10; i++) {
const iconElem = document.getElementById("in-combat-presets-icon-" + i);
if (iconElem) {
iconElem.classList.remove("current");
}
}
// Remove highlights from the unlink and unlink-lock buttons
const unlinkElem = document.getElementById("slapchop-quickpreset-buttons-unlink");
if (unlinkElem) {
unlinkElem.className = "";
}
const unlinkLockElem = document.getElementById("slapchop-quickpreset-buttons-unlink-lock");
if (unlinkLockElem) {
unlinkLockElem.className = "";
}
},
initQuickFight: async function () {
let html = `
</div>
<hr>
</div>
<div id="slapchop-quickpreset">
<div class="slapchop-quickpreset-buttons">
<h5>Quick Current Presets:</h5>
<h5>Current Preset Groups:
<button id="slapchop-quickpreset-buttons-unlink" onclick="sCCombat().saveLinkedPresetNum(0)">Unlink Current Gr</button>
≪
<button id="slapchop-quickpreset-buttons-unlink-lock" onclick="sCCombat().saveLinkedPresetNum(99)">Lock</button>
</h5>
<div>
<div>
<button onclick="sCCombat().saveCurrentPresets(1);">Save 1</button>
<button onclick="IdlePixelPlus.sendMessage('PRESET_LOAD=1~1')">Load 1</button>
</div>
<div>
<button onclick="sCCombat().saveCurrentPresets(2);">Save 2</button>
<button onclick="IdlePixelPlus.sendMessage('PRESET_LOAD=2~1')">Load 2</button>
</div>
<div>
<button onclick="sCCombat().saveCurrentPresets(3);">Save 3</button>
<button onclick="IdlePixelPlus.sendMessage('PRESET_LOAD=3~1')">Load 3</button>
</div>
<div>
<button onclick="sCCombat().saveCurrentPresets(4);">Save 4</button>
<button onclick="IdlePixelPlus.sendMessage('PRESET_LOAD=4~1')">Load 4</button>
</div>
<div>
<button onclick="sCCombat().saveCurrentPresets(5);">Save 5</button>
<button onclick="IdlePixelPlus.sendMessage('PRESET_LOAD=5~1')">Load 5</button>
</div>
</div>
<div id="slapchop-quickpreset-buttons-groups" class="">
<div class="slapchop-quickpreset-buttons-group6">
<button onclick="sCCombat().savePresetGroups(6)">Save Gr6</button>
<button onclick="sCCombat().loadPresetGroups(6)">Load Gr6</button>
</div>
<div class="slapchop-quickpreset-buttons-group7">
<button onclick="sCCombat().savePresetGroups(7)">Save Gr7</button>
<button onclick="sCCombat().loadPresetGroups(7)">Load Gr7</button>
</div>
<div class="slapchop-quickpreset-buttons-group8">
<button onclick="sCCombat().savePresetGroups(8)">Save Gr8</button>
<button onclick="sCCombat().loadPresetGroups(8)">Load Gr8</button>
</div>
<div class="slapchop-quickpreset-buttons-group9">
<button onclick="sCCombat().savePresetGroups(9)">Save Gr9</button>
<button onclick="sCCombat().loadPresetGroups(9)">Load Gr9</button>
</div>
<div class="slapchop-quickpreset-buttons-group10">
<button onclick="sCCombat().savePresetGroups(10)">Save Gr10</button>
<button onclick="sCCombat().loadPresetGroups(10)">Load Gr10</button>
</div>
</div>
</div>
</div>
<hr>
`;
const panelCombat = document.getElementById("combat-stats").querySelectorAll("div")[4];
if (panelCombat) {
panelCombat.insertAdjacentHTML("afterend", html);
}
},
initPresets: function () {
const combatPresetsHtml = `
<br />
<br />
<img data-tooltip="Presets group 6" id="in-combat-presets-icon-6" onclick="sCCombat().loadPresetGroups(6)" class="combat-presets-combat-icon hover w30" src="${IMAGE_URL_BASE}/melee.png" />
<img data-tooltip="Presets group 7" id="in-combat-presets-icon-7" onclick="sCCombat().loadPresetGroups(7)" class="combat-presets-combat-icon hover w30" src="${IMAGE_URL_BASE}/melee.png" />
<img data-tooltip="Presets group 8" id="in-combat-presets-icon-8" onclick="sCCombat().loadPresetGroups(8)" class="combat-presets-combat-icon hover w30" src="${IMAGE_URL_BASE}/melee.png" />
<img data-tooltip="Presets group 9" id="in-combat-presets-icon-9" onclick="sCCombat().loadPresetGroups(9)" class="combat-presets-combat-icon hover w30" src="${IMAGE_URL_BASE}/melee.png" />
<img data-tooltip="Presets group 10" id="in-combat-presets-icon-10" onclick="sCCombat().loadPresetGroups(10)" class="combat-presets-combat-icon hover w30" src="${IMAGE_URL_BASE}/melee.png" />
`;
const combatPresetsArea = document.getElementById(
"combat-presets-area"
);
if (combatPresetsArea) {
combatPresetsArea.insertAdjacentHTML("beforeend", combatPresetsHtml);
}
},
initPresetListener: function () {
const KEY_ACTIONS = {
54: () => sCCombat().loadPresetGroups(6), //key [6]
55: () => sCCombat().loadPresetGroups(7), //key [7]
56: () => sCCombat().loadPresetGroups(8), //key [8]
57: () => sCCombat().loadPresetGroups(9), //key [9]
48: () => sCCombat().loadPresetGroups(10), //key [0]
};
document.addEventListener("keyup", (e) => {
const chatInput = document.getElementById("chat-area-input");
let chatFocused = chatInput && document.activeElement === chatInput;
let isRelevantPanel = [
"panel-combat-canvas",
"panel-combat",
"panel-combat-canvas-raids",
].includes(Globals.currentPanel);
if (chatFocused || !isRelevantPanel) {
return; // Early exit if chat is focused or the panel is not relevant
}
const action = KEY_ACTIONS[e.keyCode];
if (action) {
action(); // Execute the action associated with the key code
}
});
},
};
};
window.sCMisc = misc;
window.sCCombat = combat;
// End New Code Base Const/Functions
class SlapChopPlugin extends IdlePixelPlusPlugin {
constructor() {
super("slapchop", {
about: {
name: GM_info.script.name + " (ver: " + GM_info.script.version + ")",
version: GM_info.script.version,
author: GM_info.script.author,
description: GM_info.script.description,
},
});
}
onConfigsChanged() {
if (onLoginLoaded) {
const slapchopQuickPreset = document.querySelector(
"#slapchop-quickpreset"
);
const presetsUnlocked = IdlePixelPlus.getVar("combat_presets") == "1";
if (presetsUnlocked) {
slapchopQuickPreset.style.display = "block";
} else {
slapchopQuickPreset.style.display = "none";
}
}
}
onLogin() {
IPP = IdlePixelPlus;
getVar = IdlePixelPlus.getVarOrDefault;
getThis = IdlePixelPlus.plugins.slapchop;
sCMisc().initStyles();
sCCombat().initQuickFight();
sCCombat().initPresets();
sCCombat().initPresetListener();
sCCombat().highlightPresetButtons();
setTimeout(function () {
onLoginLoaded = true;
IdlePixelPlus.plugins.slapchop.onConfigsChanged();
}, 5000);
loaded = true;
}
async delay() {
await new Promise((resolve) => {
const checkLoaded = () => {
if (loaded) {
resolve();
} else {
setTimeout(checkLoaded, 2000);
}
};
checkLoaded();
});
}
}
const plugin = new SlapChopPlugin();
IdlePixelPlus.registerPlugin(plugin);
})();