Lora major refactor
This commit is contained in:
174
inventoryManager/plugins/learn.lua
Normal file
174
inventoryManager/plugins/learn.lua
Normal file
@@ -0,0 +1,174 @@
|
||||
local Craft = require('turtle.craft')
|
||||
local itemDB = require('itemDB')
|
||||
local Lora = require('lora/lora')
|
||||
local UI = require('ui')
|
||||
local Util = require('util')
|
||||
|
||||
local device = _G.device
|
||||
local turtle = _G.turtle
|
||||
|
||||
local context = Lora:getContext()
|
||||
|
||||
-- TODO: try networked module
|
||||
local introspectionModule = device['plethora:introspection'] or
|
||||
error('Introspection module not found')
|
||||
|
||||
local function getTurtleInventory()
|
||||
local list = { }
|
||||
for i = 1,16 do
|
||||
list[i] = introspectionModule.getInventory().getItemMeta(i)
|
||||
end
|
||||
return list
|
||||
end
|
||||
|
||||
local function learnRecipe()
|
||||
local ingredients = getTurtleInventory()
|
||||
local listingPage = UI:getPage('listing')
|
||||
|
||||
if ingredients then
|
||||
turtle.select(1)
|
||||
if turtle.craft() then
|
||||
local results = getTurtleInventory()
|
||||
if results and results[1] then
|
||||
Lora:clearGrid()
|
||||
|
||||
local maxCount
|
||||
local newRecipe = {
|
||||
ingredients = ingredients,
|
||||
}
|
||||
|
||||
local numResults = 0
|
||||
for _,v in pairs(results) do
|
||||
if v.count > 0 then
|
||||
numResults = numResults + 1
|
||||
end
|
||||
end
|
||||
if numResults > 1 then
|
||||
for _,v1 in pairs(results) do
|
||||
for _,v2 in pairs(ingredients) do
|
||||
if v1.name == v2.name and
|
||||
v1.nbtHash == v2.nbtHash and
|
||||
(v1.damage == v2.damage or
|
||||
(v1.maxDamage > 0 and v2.maxDamage > 0 and
|
||||
v1.damage ~= v2.damage)) then
|
||||
if not newRecipe.crafingTools then
|
||||
newRecipe.craftingTools = { }
|
||||
end
|
||||
local tool = Util.shallowCopy(v2)
|
||||
if tool.maxDamage > 0 then
|
||||
tool.damage = '*'
|
||||
end
|
||||
|
||||
--[[
|
||||
Turtles can only craft one item at a time using a tool :(
|
||||
]]--
|
||||
maxCount = 1
|
||||
|
||||
newRecipe.craftingTools[Lora:uniqueKey(tool)] = true
|
||||
v1.craftingTool = true
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local recipe
|
||||
for _,v in pairs(results) do
|
||||
if not v.craftingTool then
|
||||
recipe = v
|
||||
if maxCount then
|
||||
recipe.maxCount = maxCount
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not recipe then
|
||||
debug(results)
|
||||
debug(newRecipe)
|
||||
error('Failed - view system log')
|
||||
end
|
||||
|
||||
newRecipe.count = recipe.count
|
||||
|
||||
local key = Lora:uniqueKey(recipe)
|
||||
if recipe.maxCount ~= 64 then
|
||||
newRecipe.maxCount = recipe.maxCount
|
||||
end
|
||||
for k,ingredient in pairs(Util.shallowCopy(ingredients)) do
|
||||
if ingredient.maxDamage > 0 then
|
||||
-- ingredient.damage = '*' -- I don't think this is right
|
||||
end
|
||||
ingredients[k] = Lora:uniqueKey(ingredient)
|
||||
end
|
||||
|
||||
context.userRecipes[key] = newRecipe
|
||||
Util.writeTable(Lora.RECIPES_FILE, context.userRecipes)
|
||||
Craft.loadRecipes()
|
||||
|
||||
local displayName = itemDB:getName(recipe)
|
||||
|
||||
listingPage.statusBar.filter:setValue(displayName)
|
||||
listingPage.notification:success('Learned: ' .. displayName)
|
||||
listingPage.filter = displayName
|
||||
listingPage:refresh()
|
||||
listingPage.grid:draw()
|
||||
|
||||
Lora:eject(recipe, recipe.count)
|
||||
return true
|
||||
end
|
||||
else
|
||||
listingPage.notification:error('Failed to craft', 3)
|
||||
end
|
||||
else
|
||||
listingPage.notification:error('No recipe defined', 3)
|
||||
end
|
||||
end
|
||||
|
||||
local learnPage = UI.Dialog {
|
||||
height = 7, width = UI.term.width - 6,
|
||||
title = 'Learn Recipe',
|
||||
idField = UI.Text {
|
||||
x = 5,
|
||||
y = 3,
|
||||
width = UI.term.width - 10,
|
||||
value = 'Place recipe in turtle'
|
||||
},
|
||||
accept = UI.Button {
|
||||
x = -14, y = -3,
|
||||
text = 'Ok', event = 'accept',
|
||||
},
|
||||
cancel = UI.Button {
|
||||
x = -9, y = -3,
|
||||
text = 'Cancel', event = 'cancel'
|
||||
},
|
||||
statusBar = UI.StatusBar {
|
||||
status = 'Crafting paused'
|
||||
}
|
||||
}
|
||||
|
||||
function learnPage:enable()
|
||||
Lora:pauseCrafting()
|
||||
self:focusFirst()
|
||||
UI.Dialog.enable(self)
|
||||
end
|
||||
|
||||
function learnPage:disable()
|
||||
Lora:resumeCrafting()
|
||||
UI.Dialog.disable(self)
|
||||
end
|
||||
|
||||
function learnPage:eventHandler(event)
|
||||
if event.type == 'cancel' then
|
||||
UI:setPreviousPage()
|
||||
elseif event.type == 'accept' then
|
||||
if learnRecipe(self) then
|
||||
UI:setPreviousPage()
|
||||
end
|
||||
else
|
||||
return UI.Dialog.eventHandler(self, event)
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
UI:addPage('learn', learnPage)
|
||||
Reference in New Issue
Block a user