// ==UserScript==
// @name Idlescape - Snippet
// @namespace test
// @version 0.12
// @description collections of snippets
// @author snefrukai
// @match *://*.idlescape.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=idlescape.com
// @grant none
// @license MIT
// ==/UserScript==
;(function () {
;('use strict')
// ========================================================================== //
// * setDefaultPage
// ========================================================================== //
// Default Page on Load
// openDefaultPage(setDefaultPage[0]) // ! test
var setDefaultPage = [
// ! change and comment out the default page
'active skill',
// 'Fighting',
// 'Mining',
// 'Foraging',
// 'Fishing',
// 'Smithing',
// 'Farming',
// 'Cooking',
// 'Crafting',
// 'Runecrafting',
// 'Enchanting',
]
function openDefaultPage(setDefaultPage = 'active skill') {
var leftNav = document.getElementsByClassName('drawer-item-left')
// console.log(leftNav)
var idlingPage = 'Attack' // set idling page (no action)
var defaultPage = ''
// get default page from setting
if (setDefaultPage != 'active skill') defaultPage = setDefaultPage
else {
// get action
var foo = document.getElementsByClassName('status-action')[0].innerText
var getAction = foo.match(/[A-z]+/)[0]
if (getAction == 'Fighting') defaultPage = 'Attack'
else if (getAction == 'Idling') defaultPage = idlingPage
else defaultPage = getAction
}
// check default page w left nav. if hit, click
for (let i = 0; i < leftNav.length; i++) {
let sample = leftNav[i].textContent
// console.log(sample)
if (sample == defaultPage) {
leftNav[i].click()
console.log('default page loaded:', defaultPage)
}
}
}
// ========================================================================== //
// * shortcuts
// ========================================================================== //
// shortcuts() // ! test}
function shortcuts(params) {
// ========================================================================== //
// close popups
var popupSelector = '.MuiDialog-container'
// when press 'Esc'
document.onkeydown = function (e) {
var closePopup = e.key === 'Escape' || e.key === 'Esc'
if (closePopup) if (checkExist(popupSelector)) clickClose()
}
// when click outside of popup box
document.querySelector('#root').onclick = function (e) {
// only when popup is shown, only add click to popup
if (checkExist(popupSelector)) {
var popup = document.querySelectorAll(popupSelector)[0]
popup.onclick = function (e) {
// document.querySelector('#root').onclick = function (e) {
var isClosest = e.target.closest('.MuiPaper-root') // popupBox
if (!isClosest) clickClose()
}
}
}
function checkExist(selector) {
var tar = document.querySelectorAll(selector)
var isExist = tar.length !== 0
// if (isExist) console.log(selector, 'exist') // ! test
return isExist
}
function clickClose() {
foo = '.close-dialog-button'
if (checkExist(foo)) {
document.querySelectorAll(foo)[0].click()
}
}
}
// * upgrade selected item by item ID at set interval
// window.upgradeItem_repeat = function (itemID, fn, count, minute) {
// function upgradedItemID(itemID) {
// return items[itemID].trimmedItemID
// }
// // function upgrade(itemID, qty) {
// // confirmUpgradeItem(itemID, upgradedItemID(itemID), qty)
// // }
// // ! func name 'upgradeItemAll' could cause freeze in tampermonkley
// function upgradeAll(itemID) {
// for (let k = 0; k < itemID.length; k++) {
// confirmUpgradeItemAll(itemID[k], upgradedItemID(itemID[k]))
// console.log('upgrading item ID', itemID[k])
// }
// }
// function repeat(itemID, fn = upgradeAll, count = 10000, minute = 5) {
// let i = 0
// function recur() {
// fn(itemID)
// i += 1
// console.log('upgraded', i, 'times')
// setTimeout(function () {
// if (i < count) {
// recur()
// }
// }, 1000 * 60 * minute)
// }
// recur()
// }
// repeat(
// (itemID = [
// 768, // air shard
// 769, // water ...
// 770, // earth ...
// 771, // fire ...
// // 890, // mys stone
// // 886, // mys stone charge
// ])
// )
// }
// * hide no gathering account's skills
window.checkNoGathering = function () {
var noGatheringSkills = [
0, // woodcutting
1, // mining
2, // firemaking
4, // fishing
10, // thiving
20, // agility
22, // astrology
]
if (username && username.includes('NG')) {
console.log('Detected "No Gathering".')
noGatheringSkills.forEach((skill) => {
$('#nav-skill-tooltip-' + skill.toString()).remove()
// in-game func
if (skillsUnlocked[skill] != false) {
skillsUnlocked[skill] = false
forceStopSkill(skill)
if (
PAGES[currentPage].skillID !== undefined &&
PAGES[currentPage].skillID === skill
)
changePage(Pages.Bank)
if (defaultPageOnLoad === skill)
changeSetting(2, Pages.Bank, false, false)
updateSkillWindow(skill) // update ui
updateSkillLevelCap()
}
})
console.log('"No Gathering" skills locked and hidden.')
}
}
// * eat to full hp
window.autoEatToFull_repeat = function (sec = 1) {
let hp = {
current: 0,
max: 1,
food: 0,
}
let hpSelector = {
current: '#combat-player-hitpoints-current',
max: '#combat-player-hitpoints-max',
}
var activeFoodSelector = '#combat-food-container .text-combat-smoke'
function autoEatToFull(params) {
var hpSelectorArr = Object.entries(hpSelector)
for (let i = 0; i < hpSelectorArr.length; i++) {
let str = $(hpSelectorArr[i][1])[0].textContent
hp[hpSelectorArr[i][0]] = getInt(str)
// console.log(str)
}
var foodSrc = $(activeFoodSelector)[0].childNodes[1]['src']
var foodName = foodSrc.match(/\w+\.\w+$/g)[0] // match return array
hp['food'] = getInt($(activeFoodSelector)[0].childNodes[2].textContent)
// console.log(foodName)
var hpLoss = hp['max'] - hp['current']
var eatFoodAmount = Math.floor(hpLoss / hp['food'])
if (hpLoss > 0) {
for (let i = 0; i < eatFoodAmount; i++) {
$('#combat-footer-minibar-eat-btn').click()
}
console.log('hp loss:', hpLoss, ', ate *', eatFoodAmount, foodName)
} else {
console.log('hp full')
}
}
function getInt(str) {
var numb = Number(str.replace(/\D+/g, ''))
return numb
}
function repeat(fn = autoEatToFull, count = 60 * 24, sec = 10) {
let i = 0
function recur() {
fn()
i += 1
console.log('auto eat', i, 'times, next check in', sec, 'sec')
setTimeout(function () {
if (i < count) {
recur()
}
}, 1000 * sec)
}
recur()
}
repeat(autoEatToFull, (count = (3600 / sec) * 24 * 10), (sec = sec))
}
// * add mastery pool xp to skill after overnight
window.addPoolXPForCount = function (skillID, count, sec = 30) {
var i = 0
var checkPool = setInterval(() => {
checkPoint = parseFloat(
document.querySelector('.mastery-pool-xp-progress-15').textContent
)
// if (checkPoint < 95.5) {
addMasteryXPToPool(skillID, 4046897, false, true)
i = i + 1
console.log('add pool xp:', Skills[skillID], i, 'times')
if (i == count) {
clearInterval(checkPool)
console.log('add pool xp: finished')
}
// }
}, 1000 * sec)
}
// * get current gears
// getCurrentGears(3) // ! test
window.getCurrentGears = function (iSet = player.selectedEquipmentSet) {
// function getCurrentGears(iSet = player.selectedEquipmentSet) {
var arr = []
player.equipmentSets[iSet].slotArray.forEach((e) => {
const s = ActiveSkills[game.activeSkill].toLowerCase()
activeSkillNew = s[0].toUpperCase() + s.slice(1)
const itemID = e.item.id
const item = Items[itemID]
const nonCombatUniversal = [
'Crown_of_Rhaelyx',
'Clue_Chasers_Insignia',
'Aorpheats_Signet_Ring',
'Ring_Of_Wealth',
'Max_Skillcape',
'Ancient_Ring_Of_Mastery', // passive
].includes(item)
// console.log(itemID, item, nonCombatUniversal)
if (itemID != -1 && !nonCombatUniversal) {
arr.push(Items[itemID])
}
})
console.log(`${activeSkillNew}\ncurrentGears:`, arr)
}
// ========================================================================== //
// * folked from Action Queue
window.actionQueue = function (params) {
// setAction('Build Agility Obstacle', 1, 'Cargo Net')()
window.setAction = function (
actionCategory,
actionName,
skillItem,
skillItem2,
qty
) {
qty = parseInt(qty, 10)
const itemID = items.findIndex((a) => a.name == actionName)
switch (actionCategory) {
case 'Start Skill':
return setSkillAction(actionName, skillItem, skillItem2)
case 'Start Combat': {
//slayer task selection
if (actionName == 'Slayer Task') {
return () => {
if (combatManager.slayerTask.killsLeft > 0) {
const mID = combatManager.slayerTask.monster.id
const areaData = [
...areaMenus.combat.areas,
...areaMenus.slayer.areas,
].find((a) => a.monsters.includes(mID))
if (
combatManager.isInCombat &&
combatManager.selectedMonster == mID
)
return true
combatManager.stopCombat()
combatManager.selectMonster(mID, areaData)
return true
}
return false
}
}
//dungeon selection
const dungeonIndex = DUNGEONS.findIndex((a) => a.name == actionName)
if (dungeonIndex >= 0) {
return () => {
if (
DUNGEONS[dungeonIndex].requiresCompletion === undefined ||
dungeonCompleteCount[DUNGEONS[dungeonIndex].requiresCompletion] >=
1
) {
combatManager.selectDungeon(dungeonIndex)
return true
}
return false
}
}
//regular monster selection
const monsterIndex = MONSTERS.findIndex((a) => a.name == actionName)
const areaData = [
...areaMenus.combat.areas,
...areaMenus.slayer.areas,
].find((a) => a.monsters.includes(monsterIndex))
return () => {
if (checkRequirements(areaData.entryRequirements)) {
if (
!(
combatManager.isInCombat &&
combatManager.selectedMonster == monsterIndex
)
)
combatManager.selectMonster(monsterIndex, areaData)
return true
}
return false
}
}
case 'Change Attack Style': {
if (actionName == 'Select Spell') {
switch (skillItem) {
case 'Normal':
return () => {
const spellID = SPELLS.findIndex((a) => a.name == skillItem2)
//check level req
if (
skillLevel[CONSTANTS.skill.Magic] <
SPELLS[spellID].magicLevelRequired
)
return false
player.toggleSpell(spellID)
return true
}
case 'Curse':
return () => {
const spellID = CURSES.findIndex((a) => a.name == skillItem2)
//check level req
if (
skillLevel[CONSTANTS.skill.Magic] <
CURSES[spellID].magicLevelRequired
)
return false
player.toggleCurse(spellID)
return true
}
case 'Aurora':
return () => {
const spellID = AURORAS.findIndex((a) => a.name == skillItem2)
//check level req
if (
skillLevel[CONSTANTS.skill.Magic] <
AURORAS[spellID].magicLevelRequired
)
return false
//check item req
if (
AURORAS[spellID].requiredItem >= 0 &&
!player.equipment.slotArray
.map((a) => a.item.id)
.includes(AURORAS[spellID].requiredItem)
)
return false
player.toggleAurora(spellID)
return true
}
case 'Ancient':
return () => {
const spellID = ANCIENT.findIndex((a) => a.name == skillItem2)
//check level req
if (
skillLevel[CONSTANTS.skill.Magic] <
ANCIENT[spellID].magicLevelRequired
)
return false
//check dungeon req
if (
dungeonCompleteCount[
ANCIENT[spellID].requiredDungeonCompletion[0]
] < ANCIENT[spellID].requiredDungeonCompletion[1]
)
return false
player.toggleSpellAncient(spellID)
return true
}
}
}
const style = CONSTANTS.attackStyle[actionName]
return () => {
if (player.attackType == 'magic') {
if (style < 6) return false
} else if (player.attackType === 'ranged') {
if (style > 5 || style < 3) return false
} else {
if (style > 2) return false
}
player.setAttackStyle(player.attackType, actionName)
return true
}
}
case 'Switch Equipment Set': {
const equipSet = parseInt(actionName) - 1
return () => {
if (player.equipmentSets.length > equipSet) {
player.changeEquipmentSet(equipSet)
return true
}
return false
}
}
case 'Equip Item':
return () => {
const bankID = getBankId(itemID)
if (bankID === -1) return false
if (sellItemMode) toggleSellItemMode()
if (items[itemID].canEat) {
selectBankItem(itemID)
equipFoodQty = bank[bankID].qty
equipFood()
return getBankQty(itemID) == 0 //returns false if there is any of the item left in bank (couldn't equip)
}
if (items[itemID].type == 'Familiar') {
let slot = player.equipment.slotArray
.slice(-3)
.findIndex((a) => a.item.id == itemID)
if (slot >= 0) {
player.equipItem(
itemID,
player.selectedEquipmentSet,
`Summon${slot}`,
bank[bankID].qty
)
} else if (player.equipment.slotArray[12].quantity == 0) {
player.equipItem(
itemID,
player.selectedEquipmentSet,
'Summon1',
bank[bankID].qty
)
} else if (player.equipment.slotArray[13].quantity == 0) {
player.equipItem(
itemID,
player.selectedEquipmentSet,
'Summon2',
bank[bankID].qty
)
}
return getBankQty(itemID) == 0
}
if (items[itemID].validSlots[0] == 'Quiver') {
player.equipItem(
itemID,
player.selectedEquipmentSet,
'Quiver',
bank[bankID].qty
)
return getBankQty(itemID) == 0 //returns false if there is any of the item left in bank (couldn't equip)
}
player.equipItem(itemID, player.selectedEquipmentSet)
return (
player.equipment.slots[items[itemID].validSlots[0]].item.id ===
itemID
) //returns false if the item is not equipped
}
case 'Equip Passive':
return () => {
if (dungeonCompleteCount[15] < 1 || getBankId(itemID) === -1)
return false
player.equipCallback(itemID, 'Passive')
return player.equipment.slots.Passive.item.id === itemID
}
case 'Unequip Item': {
return () => {
for (const i in player.equipment.slots) {
if (player.equipment.slots[i].item.id == itemID) {
player.unequipCallback(i)()
return getBankQty(itemID) > 0 //returns false if there is 0 of the items in bank (no space to unequip)
}
}
return false
}
}
case 'Buy Item':
return () => {
return shop[actionName].buy(qty)
}
case 'Sell Item':
return () => {
if (!bank.find((a) => a.id == itemID)) return false
if (sellItemMode) toggleSellItemMode()
selectBankItem(itemID)
sellItem()
if (showSaleNotifications) swal.clickConfirm()
return true
}
case 'Use Potion':
return () => {
if (!bank.find((a) => a.id == itemID)) return false
usePotion(itemID)
return true
}
case 'Activate Prayers': {
let choice = []
if (actionName != 'None') {
choice.push(PRAYER.findIndex((a) => a.name == actionName))
if (skillItem != 'None') {
choice.push(PRAYER.findIndex((a) => a.name == skillItem))
}
}
return () => {
const validPrayers = choice.filter(
(a) => skillLevel[CONSTANTS.skill.Prayer] > PRAYER[a].prayerLevel
)
changePrayers(validPrayers)
return true
}
}
case 'Build Agility Obstacle': {
const obstacleID = Agility.obstacles.findIndex(
(a) => a.name == skillItem
)
const obstacleNumber = parseInt(actionName) - 1
return () => {
if (chosenAgilityObstacles[obstacleNumber] == obstacleID) return true
if (
!canIAffordThis(
Agility.obstacles[obstacleID].cost,
Agility.obstacles[obstacleID].skillRequirements,
obstacleID
)
)
return false
if (chosenAgilityObstacles[obstacleNumber] >= 0)
destroyAgilityObstacle(obstacleNumber, true)
buildAgilityObstacle(obstacleID, true)
return true
}
}
case 'Remove Agility Obstacle': {
const obstacleNumber = parseInt(actionName) - 1
return () => {
if (chosenAgilityObstacles[obstacleNumber] >= 0)
destroyAgilityObstacle(obstacleNumber, true)
return true
}
}
}
}
}
// * start skill
// call
// start: setAction(actionCategory, actionName, skillItem, skillItem2, qty)
// result = action.start()
window.setSkillAction = function (actionName, skillItem1, skillItem2) {
const itemID = items.findIndex((a) => a.name == skillItem1)
let actionID = 0
switch (actionName) {
case 'Agility':
return () => {
if (game.activeSkill !== globalThis.ActiveSkills.Agility)
game.agility.start()
return true
}
case 'Astrology': {
const constellation = Astrology.constellations.find(
(a) => a.name == skillItem1
) // Find constellation
return () => {
if (skillLevel[CONSTANTS.skill.Astrology] < constellation.level)
return false
if (
game.astrology.activeConstellation.id != constellation.id ||
game.activeSkill != globalThis.ActiveSkills.ASTROLOGY
)
game.astrology.studyConstellationOnClick(constellation)
return true
}
}
case 'Cooking': {
const itemID = items.findIndex((a) => a.name == skillItem2)
const recipe = Cooking.recipes.find((a) => a.itemID == itemID)
const category = recipe.category
if (skillItem1 == 'Active') {
return () => {
const passives = []
;[0, 1, 2].forEach((c) => {
game.cooking.onCollectStockpileClick(c)
if (c != category && game.cooking.passiveCookTimers.has(c))
passives.push(c)
})
if (skillLevel[CONSTANTS.skill.Cooking] < recipe.cookingLevel)
return false
if (game.cooking.selectedRecipes.get(category).itemID != itemID)
game.cooking.onRecipeSelectionClick(recipe)
if (
game.activeSkill == globalThis.ActiveSkills.COOKING &&
game.cooking.activeCookingCategory == category
)
return true
game.cooking.onActiveCookButtonClick(category)
passives.forEach((a) => game.cooking.onPassiveCookButtonClick(a))
return true
}
} else {
return () => {
;[0, 1, 2].forEach((category) =>
game.cooking.onCollectStockpileClick(category)
)
if (
skillLevel[CONSTANTS.skill.Cooking] <
Cooking.recipes.find((a) => a.itemID == itemID).level
)
return false
if (game.cooking.selectedRecipes.get(category).itemID != itemID)
game.cooking.onRecipeSelectionClick(recipe)
if (game.cooking.passiveCookTimers.has(category)) return true
game.cooking.onPassiveCookButtonClick(category)
return true
}
}
}
case 'Crafting':
actionID = Crafting.recipes.find((a) => a.itemID == itemID).masteryID
return () => {
if (
skillLevel[CONSTANTS.skill.Crafting] <
Crafting.recipes[actionID].level
)
return false
if (game.crafting.selectedRecipeID !== actionID)
game.crafting.selectRecipeOnClick(actionID)
if (game.activeSkill !== globalThis.ActiveSkills.CRAFTING)
game.crafting.start(true)
return true
}
case 'Firemaking':
actionID = Firemaking.recipes.findIndex((x) => x.logID == itemID)
return () => {
if (
skillLevel[CONSTANTS.skill.Firemaking] <
Firemaking.recipes[actionID].levelRequired
)
return false
if (
!game.firemaking.activeRecipe ||
game.firemaking.activeRecipe.logID !== actionID
)
game.firemaking.selectLog(actionID)
if (!game.firemaking.isActive) game.firemaking.burnLog()
return true
}
case 'Fishing': {
const fish = Fishing.data.find((a) => a.itemID == itemID)
const area = Fishing.areas.find((a) => a.fish.includes(fish))
return () => {
if (
(!player.equipment.slotArray
.map((a) => a.item.id)
.includes(CONSTANTS.item.Barbarian_Gloves) &&
area.id == 6) ||
(!game.fishing.secretAreaUnlocked && area.id == 7) ||
skillLevel[CONSTANTS.skill.Fishing] < fish.level
)
return false
game.fishing.onAreaFishSelection(area, fish)
if (
game.activeSkill !== globalThis.ActiveSkills.FISHING ||
game.fishing.activeFishingArea != area
) {
game.fishing.onAreaStartButtonClick(area)
}
return true
}
}
case 'Fletching':
actionID = Fletching.recipes.find((a) => a.itemID == itemID).masteryID
const log = items.findIndex((a) => a.name == skillItem2)
if (skillItem1 != 'Arrow Shafts') {
return () => {
if (
skillLevel[CONSTANTS.skill.Fletching] <
Fletching.recipes[actionID].level
)
return false
if (game.fletching.selectedRecipeID !== actionID)
game.fletching.selectRecipeOnClick(actionID)
if (game.activeSkill !== globalThis.ActiveSkills.FLETCHING)
game.fletching.start()
return true
}
}
return () => {
if (
skillLevel[CONSTANTS.skill.Fletching] <
Fletching.recipes[actionID].level ||
!checkBankForItem(log)
)
return false
if (
game.fletching.selectedAltRecipe != log ||
selectedFletch !== actionID
)
game.fletching.selectAltRecipeOnClick(log)
if (game.activeSkill !== globalThis.ActiveSkills.FLETCHING)
game.fletching.start()
return true
}
case 'Herblore':
actionID = Herblore.potions.findIndex((a) => a.name == skillItem1)
return () => {
if (
skillLevel[CONSTANTS.skill.Herblore] <
Herblore.potions[actionID].level
)
return false
if (game.herblore.selectedRecipeID !== actionID)
game.herblore.selectRecipeOnClick(actionID)
if (!game.herblore.isActive) game.herblore.start()
return true
}
case 'Mining':
actionID = Mining.rockData.findIndex((a) => a.name == skillItem1)
// game.mining.onRockClick(actionID)
return () => {
if (
(actionID === 9 && !game.mining.canMineDragonite) ||
skillLevel[CONSTANTS.skill.Mining] <
Mining.rockData[actionID].levelRequired
)
return false
if (!game.mining.isActive || game.mining.selectedRockId != actionID)
game.mining.onRockClick(actionID)
return true
}
case 'Magic': {
actionID = AltMagic.spells.findIndex((a) => a.name == skillItem1)
const magicItem = items.findIndex((a) => a.name == skillItem2)
return () => {
if (skillLevel[CONSTANTS.skill.Magic] < AltMagic.spells[actionID].level)
return false
if (game.altMagic.selectedSpellID !== actionID)
game.altMagic.selectSpellOnClick(actionID)
switch (AltMagic.spells[actionID].consumes) {
case 3:
case 2:
const bar = Smithing.recipes.find((a) => a.itemID == magicItem)
if (skillLevel[CONSTANTS.skill.Smithing] < bar.level) return false
if (game.altMagic.selectedSmithingRecipe != bar)
game.altMagic.selectBarOnClick(bar)
break
case 1:
case 0:
if (game.altMagic.selectedConversionItem != magicItem)
game.altMagic.selectItemOnClick(magicItem)
break
}
if (!game.altMagic.isActive) game.altMagic.start()
return true
}
}
case 'Runecrafting':
actionID = Runecrafting.recipes.findIndex((a) => a.itemID == itemID)
return () => {
if (
skillLevel[CONSTANTS.skill.Runecrafting] <
Runecrafting.recipes[actionID].level
)
return false
if (game.runecrafting.selectedRecipeID !== actionID)
game.runecrafting.selectRecipeOnClick(actionID)
if (game.activeSkill !== globalThis.ActiveSkills.RUNECRAFTING)
game.runecrafting.start(true)
return true
}
case 'Smithing':
actionID = Smithing.recipes.findIndex((a) => a.itemID == itemID)
return () => {
if (
skillLevel[CONSTANTS.skill.Smithing] <
Smithing.recipes[actionID].level
)
return false
if (game.smithing.selectedRecipeID !== actionID)
game.smithing.selectRecipeOnClick(actionID)
if (!game.smithing.isActive) game.smithing.start()
return true
}
case 'Summoning': {
const summonID = Summoning.marks.findIndex((a) => a.itemID == itemID)
let recipeID = 0
if (options.actions['Start Skill']['Summoning'][skillItem1] != null) {
const ingredientID = items.findIndex((a) => a.name == skillItem2)
recipeID = Summoning.marks[summonID].nonShardItemCosts.findIndex(
(a) => a == ingredientID
)
}
return () => {
//exit if low level
if (
skillLevel[CONSTANTS.skill.Summoning] <
Summoning.marks[summonID].level
)
return false
//if summon is not selected, choose it
if (
game.summoning.selectedRecipeID != summonID ||
game.summoning.selectedAltRecipe != recipeID
) {
game.summoning.selectRecipeOnClick(summonID)
game.summoning.selectAltRecipeOnClick(recipeID)
}
if (game.activeSkill !== globalThis.ActiveSkills.SUMMONING)
game.summoning.start()
return game.activeSkill === globalThis.ActiveSkills.SUMMONING
}
}
case 'Thieving': {
const npc = Thieving.npcs.find((a) => a.name == skillItem1)
const area = Thieving.areas.find((a) => a.npcs.includes(npc.id))
const panel = thievingMenu.areaPanels.find((a) => a.area == area)
return () => {
if (skillLevel[CONSTANTS.skill.Thieving] < npc.level) return false
if (
game.activeSkill == globalThis.ActiveSkills.THIEVING &&
game.thieving.currentNPC == npc
)
return true
thievingMenu.selectNPCInPanel(npc, panel)
game.thieving.startThieving(area, npc)
return true
}
}
case 'Woodcutting':
actionID = [itemID, items.findIndex((a) => a.name == skillItem2)].slice(
0,
playerModifiers.increasedTreeCutLimit + 1
)
return () => {
let result = true
let currentTrees = []
game.woodcutting.activeTrees.forEach((a) => currentTrees.push(a.id))
currentTrees.forEach((tree) => {
if (actionID.includes(tree)) {
actionID.splice(
actionID.findIndex((a) => a == tree),
1
)
} else {
actionID.unshift(tree)
}
})
actionID.forEach((i) => {
if (
skillLevel[CONSTANTS.skill.Woodcutting] >=
Woodcutting.trees[i].levelRequired
) {
game.woodcutting.selectTree(Woodcutting.trees[i])
} else {
result = false
}
})
return result
}
}
}
// ========================================================================== //
// * footer
// ========================================================================== //
function onGameReady(callback) {
const foo = 'play-area-container'
// const foo = 'status-action'
const gameContainer = document.getElementsByClassName(foo)
// gameContainer.length
if (gameContainer.length === 0) {
setTimeout(function () {
onGameReady(callback)
}, 500)
} else {
callback()
}
}
function init() {
openDefaultPage(setDefaultPage[0])
shortcuts()
}
onGameReady(function () {
init()
})
})()