differentiate between items with different nbt data
This commit is contained in:
parent
ff661daa7d
commit
c1a3ca6bb8
@ -3,6 +3,20 @@ local ensure_width = require("cc.strings").ensure_width
|
|||||||
local ui = require("ui")
|
local ui = require("ui")
|
||||||
local main_view = {}
|
local main_view = {}
|
||||||
|
|
||||||
|
local nbt_sensitive_names = {
|
||||||
|
"minecraft:potion", "minecraft:enchanted_book"
|
||||||
|
}
|
||||||
|
|
||||||
|
local display_name_transformers = {
|
||||||
|
["minecraft:enchanted_book"] = function(detail)
|
||||||
|
local enchantments = {}
|
||||||
|
for _, enchant in ipairs(detail.enchantments) do
|
||||||
|
table.insert(enchantments, enchant.displayName)
|
||||||
|
end
|
||||||
|
return table.concat(enchantments, ", ") .. " Book"
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
local function clamp(x, min, max)
|
local function clamp(x, min, max)
|
||||||
return math.min(math.max(x, min), max)
|
return math.min(math.max(x, min), max)
|
||||||
end
|
end
|
||||||
@ -23,12 +37,43 @@ local function is_integer(num)
|
|||||||
return num % 1 == 0
|
return num % 1 == 0
|
||||||
end
|
end
|
||||||
|
|
||||||
local function list_items(inventories)
|
local function does_array_contain(array, value)
|
||||||
|
for _, v in ipairs(array) do
|
||||||
|
if v == value then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function add_item_detail(item_details, name, detail)
|
||||||
|
if item_details[name] then return end
|
||||||
|
|
||||||
|
local display_name
|
||||||
|
if not display_name_transformers[detail.name] then
|
||||||
|
display_name = detail.displayName
|
||||||
|
else
|
||||||
|
display_name = display_name_transformers[detail.name](detail)
|
||||||
|
end
|
||||||
|
|
||||||
|
item_details[name] = {
|
||||||
|
display_name = display_name,
|
||||||
|
stack_size = detail.maxCount
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local function list_items(inventories, item_details)
|
||||||
local item_registry = {}
|
local item_registry = {}
|
||||||
for _, name in ipairs(inventories) do
|
for _, name in ipairs(inventories) do
|
||||||
for slot, item in pairs(peripheral.call(name, "list")) do
|
for slot, item in pairs(peripheral.call(name, "list")) do
|
||||||
item_registry[item.name] = item_registry[item.name] or {}
|
local item_name = item.name
|
||||||
table.insert(item_registry[item.name], {
|
if does_array_contain(nbt_sensitive_names, item_name) then
|
||||||
|
local detail = peripheral.call(name, "getItemDetail", slot)
|
||||||
|
item_name = item_name .. "#" .. item.nbt
|
||||||
|
add_item_detail(item_details, item_name, detail)
|
||||||
|
end
|
||||||
|
item_registry[item_name] = item_registry[item_name] or {}
|
||||||
|
table.insert(item_registry[item_name], {
|
||||||
count = item.count,
|
count = item.count,
|
||||||
slot = slot,
|
slot = slot,
|
||||||
peripheral = name
|
peripheral = name
|
||||||
@ -51,10 +96,7 @@ local function populate_item_details(item_details, item_registry)
|
|||||||
local item = items[1]
|
local item = items[1]
|
||||||
if item and not item_details[name] then
|
if item and not item_details[name] then
|
||||||
local detail = peripheral.call(item.peripheral, "getItemDetail", item.slot)
|
local detail = peripheral.call(item.peripheral, "getItemDetail", item.slot)
|
||||||
item_details[name] = {
|
add_item_detail(item_details, name, detail)
|
||||||
display_name = detail.displayName,
|
|
||||||
stack_size = detail.maxCount
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -209,8 +251,8 @@ function main_view:prepare(inventories, bundles, result_inventory)
|
|||||||
self.inventories = inventories
|
self.inventories = inventories
|
||||||
remove_value(self.inventories, result_inventory)
|
remove_value(self.inventories, result_inventory)
|
||||||
|
|
||||||
self.item_registry = list_items(self.inventories)
|
|
||||||
self.item_details = {}
|
self.item_details = {}
|
||||||
|
self.item_registry = list_items(self.inventories, self.item_details)
|
||||||
populate_item_details(self.item_details, self.item_registry)
|
populate_item_details(self.item_details, self.item_registry)
|
||||||
|
|
||||||
self.bundles = bundles or {}
|
self.bundles = bundles or {}
|
||||||
@ -501,7 +543,7 @@ function main_view:has_selected_items()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function main_view:refresh_items()
|
function main_view:refresh_items()
|
||||||
self.item_registry = list_items(self.inventories)
|
self.item_registry = list_items(self.inventories, self.item_details)
|
||||||
populate_item_details(self.item_details, self.item_registry)
|
populate_item_details(self.item_details, self.item_registry)
|
||||||
|
|
||||||
self.right_store.items = {}
|
self.right_store.items = {}
|
||||||
|
Loading…
Reference in New Issue
Block a user