Aaron Suen ce1200e135 Hint refactors, chat alert upon completion.
The new chat stream message is an experimental
feature; it MAY be too intrusive for some players, so
may have to be disabled by default or removed.
2020-01-21 20:41:20 -05:00

82 lines
1.8 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local ipairs, minetest, nodecore, pairs, type
= ipairs, minetest, nodecore, pairs, type
-- LUALOCALS > ---------------------------------------------------------
nodecore.hints = {}
local function conv(spec)
if not spec then
return function() return true end
end
if type(spec) == "function" then return spec end
if type(spec) == "table" then
local f = spec[1]
if f == true then
return function(db)
for i = 2, #spec do
if db[spec[i]] then return true end
end
end
end
return function(db)
for i = 1, #spec do
if not db[spec[i]] then return end
end
return true
end
end
return function(db) return db[spec] end
end
function nodecore.addhint(text, goal, reqs)
local hints = nodecore.hints
local t = nodecore.translate(text)
local h = {
text = t,
goal = conv(goal),
reqs = conv(reqs)
}
hints[#hints + 1] = h
return h
end
function nodecore.hint_state(player)
local rawdb = nodecore.statsdb[type(player) == "string"
and player or player:get_player_name()] or {}
local db = {}
for _, r in ipairs({"inv", "punch", "dig", "place", "craft", "witness"}) do
for k, v in pairs(rawdb[r] or {}) do
db[k] = v
db[r .. ":" .. k] = v
end
end
for k, v in pairs(minetest.registered_items) do
if db[k] then
if v.tool_capabilities and v.tool_capabilities.groupcaps then
for gn, gv in pairs(v.tool_capabilities.groupcaps) do
for gt in pairs(gv.times or {}) do
db["toolcap:" .. gn .. ":" .. gt] = true
end
end
end
for gn, gv in pairs(v.groups or {}) do
db["group:" .. gn] = gv
end
end
end
local done = {}
local found = {}
for _, hint in ipairs(nodecore.hints) do
if hint.goal(db) then
done[#done + 1] = hint
elseif hint.reqs(db) then
found[#found + 1] = hint
end
end
return found, done
end