Implemented ME-bridge readout for pages
This commit is contained in:
+100
-13
@@ -12,6 +12,7 @@ local mf = require("morefonts-pe")
|
|||||||
|
|
||||||
local frame = Pine3D.newFrame()
|
local frame = Pine3D.newFrame()
|
||||||
frame:setBackgroundColor(colors.black)
|
frame:setBackgroundColor(colors.black)
|
||||||
|
local meSystem = peripheral.find("meBridge") or peripheral.find("rsBridge")
|
||||||
|
|
||||||
local chainItemsByBaseId
|
local chainItemsByBaseId
|
||||||
local baseItemIds
|
local baseItemIds
|
||||||
@@ -118,6 +119,78 @@ local function getItemIcon(item)
|
|||||||
return item.icon or nil
|
return item.icon or nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function getMeItemCount(itemId)
|
||||||
|
if not meSystem or not itemId then
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
if type(meSystem.getItem) == "function" then
|
||||||
|
local ok, item = pcall(meSystem.getItem, { name = itemId })
|
||||||
|
if ok and item then
|
||||||
|
return tonumber(item.amount or item.count or item.qty) or 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local function getMeItemCounts(itemIds)
|
||||||
|
local counts = {}
|
||||||
|
|
||||||
|
for i = 1, #itemIds do
|
||||||
|
counts[itemIds[i]] = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
if not meSystem then
|
||||||
|
return counts
|
||||||
|
end
|
||||||
|
|
||||||
|
local unresolved = {}
|
||||||
|
local unresolvedCount = 0
|
||||||
|
|
||||||
|
for i = 1, #itemIds do
|
||||||
|
local itemId = itemIds[i]
|
||||||
|
local count = getMeItemCount(itemId)
|
||||||
|
counts[itemId] = count
|
||||||
|
|
||||||
|
if count == 0 then
|
||||||
|
unresolved[itemId] = true
|
||||||
|
unresolvedCount = unresolvedCount + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if unresolvedCount == 0 then
|
||||||
|
return counts
|
||||||
|
end
|
||||||
|
|
||||||
|
local listItems = meSystem.listItems or meSystem.getItems or meSystem.listAvailableItems
|
||||||
|
if not listItems then
|
||||||
|
return counts
|
||||||
|
end
|
||||||
|
|
||||||
|
local ok, items = pcall(listItems)
|
||||||
|
if not ok or type(items) ~= "table" then
|
||||||
|
return counts
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = 1, #items do
|
||||||
|
local item = items[i]
|
||||||
|
local itemId = item and (item.name or item.id or item.item_id)
|
||||||
|
|
||||||
|
if itemId and unresolved[itemId] then
|
||||||
|
counts[itemId] = tonumber(item.amount or item.count or item.qty) or 0
|
||||||
|
unresolved[itemId] = nil
|
||||||
|
unresolvedCount = unresolvedCount - 1
|
||||||
|
|
||||||
|
if unresolvedCount == 0 then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return counts
|
||||||
|
end
|
||||||
|
|
||||||
local function getFallbackIcon()
|
local function getFallbackIcon()
|
||||||
if fallbackIcon == false then
|
if fallbackIcon == false then
|
||||||
local ok, image = pcall(paintutils.loadImage, "/icons16/diamond16.nfp")
|
local ok, image = pcall(paintutils.loadImage, "/icons16/diamond16.nfp")
|
||||||
@@ -285,25 +358,39 @@ local function drawPage(base_id)
|
|||||||
local backIcon = getBackButton()
|
local backIcon = getBackButton()
|
||||||
local backWidth, backHeight = imageSize(backIcon)
|
local backWidth, backHeight = imageSize(backIcon)
|
||||||
local backX = SCREEN_WIDTH - backWidth + 1
|
local backX = SCREEN_WIDTH - backWidth + 1
|
||||||
|
local pageItemIds = {}
|
||||||
|
local visibleItemCount = math.min(math.max(#pageItems, 9), 9)
|
||||||
|
|
||||||
frame.buffer:clear()
|
for i = 1, visibleItemCount do
|
||||||
drawNfpScaled(frame.buffer, backIcon, (backX - 1) * 2 + 1, 1)
|
pageItemIds[i] = pageItems[i].id
|
||||||
|
|
||||||
-- TODO LATER get item counts from me-system using item ids. For now, just use random numbers.
|
|
||||||
|
|
||||||
for i = 1, math.min(math.max(#pageItems, 9), 9) do
|
|
||||||
local item = pageItems[i]
|
|
||||||
local icon = getItemIcon(item) or defaultIcon
|
|
||||||
drawItem(icon, 4+(8+4)*((i-1)%3), 2+(5+1)*math.floor((i-1)/3), math.random(0, 1000000000000))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
assertBufferValid(frame)
|
local function renderPage()
|
||||||
frame:drawBuffer()
|
local itemCounts = getMeItemCounts(pageItemIds)
|
||||||
|
|
||||||
|
frame.buffer:clear()
|
||||||
|
drawNfpScaled(frame.buffer, backIcon, (backX - 1) * 2 + 1, 1)
|
||||||
|
|
||||||
|
for i = 1, visibleItemCount do
|
||||||
|
local item = pageItems[i]
|
||||||
|
local icon = getItemIcon(item) or defaultIcon
|
||||||
|
drawItem(icon, 4+(8+4)*((i-1)%3), 2+(5+1)*math.floor((i-1)/3), itemCounts[item.id] or 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
assertBufferValid(frame)
|
||||||
|
frame:drawBuffer()
|
||||||
|
end
|
||||||
|
|
||||||
|
renderPage()
|
||||||
|
local refreshTimer = os.startTimer(5)
|
||||||
|
|
||||||
while true do
|
while true do
|
||||||
local _, side, x, y = os.pullEvent("monitor_touch")
|
local event, p1, x, y = os.pullEvent()
|
||||||
|
|
||||||
if side == monName and x >= backX and x < backX + backWidth and y >= 1 and y <= backHeight then
|
if event == "timer" and p1 == refreshTimer then
|
||||||
|
renderPage()
|
||||||
|
refreshTimer = os.startTimer(5)
|
||||||
|
elseif event == "monitor_touch" and p1 == monName and x >= backX and x < backX + backWidth and y >= 1 and y <= backHeight then
|
||||||
drawOverview()
|
drawOverview()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user