--- item_repo.lua --- Library for fetching Skyblocker item repository items by NEU id. --- Returns LuaItemStack objects usable like any other item stack in scripts. ---@class item_repo local ItemRepo = {} local ItemRepository = luajava.bindClass("de.hysky.skyblocker.skyblock.itemlist.ItemRepository") local ItemUtils = luajava.bindClass("de.hysky.skyblocker.utils.ItemUtils") local LuaItemStackClass = "com.nekiplay.neoscripts.features.lua.objects.datatypes.LuaItemStack" local function toPrice(optional) if not optional then return nil end if not optional:isPresent() then return nil end return optional:getAsDouble() end --- Whether the item repository files have finished loading. --- @return boolean true when items/recipes are ready to be queried. function ItemRepo.isImported() return ItemRepository:filesImported() end --- Get a LuaItemStack from the repository by NEU id. --- @param neuId string NEU item id (e.g. "HYPERION"). --- @return LuaItemStack|nil Wrapped item stack, or nil if not found or repo not loaded yet. function ItemRepo.getItemStack(neuId) local flex = ItemRepository:getItemStack(neuId) if not flex then return nil end local stack = flex:getStack() if not stack then return nil end return luajava.newInstance(LuaItemStackClass, stack) end --- Get the raw Minecraft ItemStack from the repository by NEU id. --- @param neuId string NEU item id (e.g. "HYPERION"). --- @return userdata|nil Raw net.minecraft.world.item.ItemStack, or nil if not found. function ItemRepo.getStack(neuId) local flex = ItemRepository:getItemStack(neuId) if not flex then return nil end return flex:getStack() end --- Get a LuaItemStack with a fallback when not found. --- @param neuId string NEU item id (e.g. "HYPERION"). --- @param defaultStack userdata LuaItemStack to return when lookup fails. --- @return LuaItemStack|userdata|nil Found stack, defaultStack, or nil. function ItemRepo.getItemStackOr(neuId, defaultStack) local stack = ItemRepo.getItemStack(neuId) return stack or defaultStack end --- Get the current price of an item from the repository by NEU id. --- Uses bazaar sell price or lowest bin via Skyblocker price data. --- @param neuId string NEU item id (e.g. "HYPERION"). --- @param useBazaarBuyPrice boolean|nil Use bazaar buy price instead of sell price (default false). --- @return number|nil Price in coins, or nil if no price data. function ItemRepo.getPrice(neuId, useBazaarBuyPrice) local flex = ItemRepository:getItemStack(neuId) if not flex then return nil end local apiId = flex:getSkyblockApiId() if not apiId or apiId == "" then return nil end return toPrice(ItemUtils:getItemPrice(apiId, useBazaarBuyPrice or false)) end --- Get the current price of a LuaItemStack. --- Works on any LuaItemStack, not just repository items. --- @param luaStack userdata LuaItemStack to price. --- @param useBazaarBuyPrice boolean|nil Use bazaar buy price instead of sell price (default false). --- @return number|nil Price in coins, or nil if no price data. function ItemRepo.getItemPrice(luaStack, useBazaarBuyPrice) local stack = luaStack.javaClass if not stack then return nil end local apiId = stack:getSkyblockApiId() if not apiId or apiId == "" then return nil end return toPrice(ItemUtils:getItemPrice(apiId, useBazaarBuyPrice or false)) end --- Get the craft cost of an item by NEU id. --- @param neuId string NEU item id (e.g. "HYPERION"). --- @return number|nil Craft cost in coins. function ItemRepo.getCraftCost(neuId) local cost = ItemUtils:getCraftCost(neuId) if not cost or cost <= 0 then return nil end return cost end return ItemRepo