UNPKG

farming-weight

Version:

Tools for calculating farming weight and fortune in Hypixel Skyblock

165 lines 5.97 kB
import { FARMING_ENCHANTS } from '../constants/enchants.js'; import { ReforgeTarget } from '../constants/reforges.js'; import { Stat } from '../constants/stats.js'; import { EQUIPMENT_INFO } from '../items/equipment.js'; import { ZorroMode } from '../player/playeroptions.js'; import { GEAR_FORTUNE_SOURCES } from '../upgrades/sources/gearsources.js'; import { getSourceProgress } from '../upgrades/upgrades.js'; import { getFortuneFromEnchant } from '../util/enchants.js'; import { extractNumberFromLine } from '../util/lore.js'; import { UpgradeableBase } from './upgradeable.js'; export class FarmingEquipment extends UpgradeableBase { get type() { return ReforgeTarget.Equipment; } get slot() { return this.info.slot; } constructor(item, options) { super({ item, options, items: EQUIPMENT_INFO }); this.getFortune(); } getProgress(zereod = false) { return getSourceProgress(this, GEAR_FORTUNE_SOURCES, zereod); } setOptions(options) { this.options = options; this.getFortune(); } getFortune() { this.fortuneBreakdown = {}; let sum = 0; // Base fortune const base = this.info.baseStats?.[Stat.FarmingFortune] ?? 0; if (base > 0) { this.fortuneBreakdown['Base Stats'] = base; sum += base; } // Reforge const reforge = this.reforgeStats?.stats?.[Stat.FarmingFortune] ?? 0; if (reforge > 0) { this.fortuneBreakdown['Reforge'] = reforge; sum += reforge; } // Enchantments for (const [key, level] of Object.entries(this.item.enchantments ?? {})) { const enchant = FARMING_ENCHANTS[key]; if (!enchant || !level || enchant.cropSpecific) continue; const fortune = getFortuneFromEnchant(level, enchant, this.options); if (fortune > 0) { this.fortuneBreakdown[enchant.name] = fortune; sum += fortune; } } // Lotus Piece Specific if (this.info.family === 'LOTUS') { // Green thumb from lore as a fallback if (!this.options?.uniqueVisitors) { const visitors = this.getFortuneFromVisitors(base, reforge); if (visitors > 0) { this.fortuneBreakdown['Green Thumb'] = visitors; sum += visitors; } } // Salesperson lotus piece bonus const pieceBonus = this.getPieceBonus(); if (pieceBonus > 0) { this.fortuneBreakdown['Salesperson'] = pieceBonus; sum += pieceBonus; } } if (this.item.skyblockId === 'ZORROS_CAPE') { // If Zorro is disabled, set fortune to 0 if (this.options?.zorro?.enabled === false) { this.fortune = 0; return 0; } // Zorro's Cape const zorro = this.options?.zorro ?? { enabled: true, mode: ZorroMode.Normal, }; switch (zorro.mode) { case ZorroMode.Averaged: sum *= 1.3333; for (const key in this.fortuneBreakdown) { if (this.fortuneBreakdown[key] === undefined) continue; this.fortuneBreakdown[key] *= 1.3333; } break; case ZorroMode.Contest: sum *= 2; for (const key in this.fortuneBreakdown) { if (this.fortuneBreakdown[key] === undefined) continue; this.fortuneBreakdown[key] *= 2; } break; case ZorroMode.Normal: default: break; } } this.fortune = sum; return sum; } getFortuneFromVisitors(base, reforge) { if (!this.item.enchantments?.green_thumb) return 0; const regex = /§7Farming Fortune: §a\+(\d+.?\d+)/g; let found = 0; for (const line of this.item.lore ?? []) { const number = extractNumberFromLine(line, regex) ?? 0; if (!number) continue; found = +number; break; } if (found === 0) return 0; return Math.max(0, found - base - reforge); } /** * Get the bonus from the Salesperson lotus piece * @returns {number} Fortune from the Salesperson lotus piece */ getPieceBonus() { const regex = /§7Piece Bonus: §6\+(\d+)☘/g; let found = 0; for (const line of (this.item.lore ?? []).reverse()) { const number = extractNumberFromLine(line, regex) ?? 0; if (!number) continue; found = number; break; } return found; } static isValid(item) { return EQUIPMENT_INFO[item.skyblockId] !== undefined; } static fromArray(items, options) { return items .filter((item) => FarmingEquipment.isValid(item)) .map((item) => new FarmingEquipment(item, options)) .sort((a, b) => b.fortune - a.fortune); } static fakeItem(info, options) { const fake = { name: 'Fake Item', skyblockId: info.skyblockId, lore: [], attributes: {}, enchantments: {}, }; if (!FarmingEquipment.isValid(fake)) return undefined; return new FarmingEquipment(fake, options); } } // For backwards compatibility // eslint-disable-next-line @typescript-eslint/naming-convention export const LotusGear = FarmingEquipment; //# sourceMappingURL=farmingequipment.js.map