Files
opus-apps/milo/plugins/turtleLearn.lua
2018-11-23 11:39:39 -05:00

161 lines
3.4 KiB
Lua

local Craft = require('craft2')
local itemDB = require('itemDB')
local Milo = require('milo')
local sync = require('sync')
local UI = require('ui')
local Util = require('util')
local turtle = _G.turtle
local context = Milo:getContext()
local function learnRecipe()
local ingredients = Milo:getTurtleInventory()
if not ingredients then
return false, 'No recipe defined'
end
turtle.select(1)
if not turtle.craft() then
return false, 'Failed to craft'
end
local results = Milo:getTurtleInventory()
if not results or not results[1] then
return false, 'Failed to craft'
end
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[Milo: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 = Milo: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] = Milo:uniqueKey(ingredient)
end
context.userRecipes[key] = newRecipe
Util.writeTable(Craft.USER_RECIPES, context.userRecipes)
Craft.loadRecipes()
turtle.emptyInventory()
return recipe
end
local turtleLearnWizard = UI.Page {
titleBar = UI.TitleBar { title = 'Learn a crafting recipe' },
wizard = UI.Wizard {
y = 2, ey = -3,
pages = {
confirmation = UI.Window {
index = 1,
notice = UI.TextArea {
x = 2, ex = -2, y = 2, ey = -2,
value =
[[Place recipe in turtle!]],
},
},
},
},
notification = UI.Notification { },
}
function turtleLearnWizard:disable()
Milo:resumeCrafting({ key = 'gridInUse' })
sync.release(turtle)
UI.Page.disable(self)
end
function turtleLearnWizard.wizard.pages.confirmation:validate()
local recipe, msg = learnRecipe(self)
if recipe then
local listingPage = UI:getPage('listing')
local displayName = itemDB:getName(recipe)
listingPage.statusBar.filter:setValue(displayName)
listingPage.notification:success('Learned: ' .. displayName)
listingPage.filter = displayName
listingPage:refresh()
listingPage.grid:draw()
return true
else
turtleLearnWizard.notification:error(msg)
end
end
function turtleLearnWizard:eventHandler(event)
if event.type == 'cancel' or event.type == 'accept' then
UI:setPage('listing')
else
return UI.Page.eventHandler(self, event)
end
return true
end
context.learnTypes['Turtle crafting'] = turtleLearnWizard