433161466b
All base-game priv checks should now only require one priv lookup per player per tick, except in special cases where a player's privs changed during that tick.
98 lines
2.6 KiB
Lua
98 lines
2.6 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local math, minetest, nodecore, pairs, table
|
|
= math, minetest, nodecore, pairs, table
|
|
local math_floor, math_random, table_insert
|
|
= math.floor, math.random, table.insert
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
local pcache = {}
|
|
|
|
local strings = {
|
|
progress = "@1 discovered, @2 available, @3 future",
|
|
explore = "The discovery system only alerts you to the existence of"
|
|
.. " some basic game mechanics. More advanced content, such as"
|
|
.. " emergent systems and automation, you will have to"
|
|
.. " invent yourself!",
|
|
hint = "- @1",
|
|
done = "- DONE: @1",
|
|
future = "- FUTURE: @1"
|
|
}
|
|
|
|
for k, v in pairs(strings) do
|
|
nodecore.translate_inform(v)
|
|
strings[k] = function(...) return nodecore.translate(v, ...) end
|
|
end
|
|
|
|
local function shuffle(t)
|
|
for i = #t, 2, -1 do
|
|
local j = math_random(1, i)
|
|
t[i], t[j] = t[j], t[i]
|
|
end
|
|
end
|
|
|
|
local function gethint(player)
|
|
local pname = player:get_player_name()
|
|
|
|
local now = math_floor(minetest.get_us_time() / 1000000)
|
|
local cached = pcache[pname]
|
|
if cached and cached.time == now then return cached.found end
|
|
|
|
local found, done = nodecore.hint_state(pname)
|
|
local future
|
|
if nodecore.get_player_privs_cached(pname).debug then
|
|
local seen = {}
|
|
for _, v in pairs(found) do seen[v] = true end
|
|
for _, v in pairs(done) do seen[v] = true end
|
|
future = {}
|
|
for _, v in pairs(nodecore.hints) do
|
|
if not seen[v] then
|
|
future[#future + 1] = strings.future(v.text)
|
|
end
|
|
end
|
|
shuffle(future)
|
|
end
|
|
for k, v in pairs(found) do found[k] = strings.hint(v.text) end
|
|
shuffle(found)
|
|
for k, v in pairs(done) do done[k] = strings.done(v.text) end
|
|
shuffle(done)
|
|
|
|
local prog = #found
|
|
local left = #(nodecore.hints) - prog - #done
|
|
|
|
table_insert(found, 1, "")
|
|
table_insert(found, 1, strings.progress(#done, prog, left))
|
|
found[#found + 1] = ""
|
|
found[#found + 1] = strings.explore()
|
|
found[#found + 1] = ""
|
|
for i = 1, #done do found[#found + 1] = done[i] end
|
|
if future then
|
|
found[#found + 1] = ""
|
|
for i = 1, #future do found[#found + 1] = future[i] end
|
|
end
|
|
|
|
pcache[pname] = {time = now, found = found}
|
|
return found
|
|
end
|
|
|
|
local function clearcache(_, pname)
|
|
pcache[pname] = nil
|
|
return true
|
|
end
|
|
|
|
local mytab = {
|
|
title = "Discovery",
|
|
visible = function(_, player)
|
|
return nodecore.interact(player)
|
|
and not nodecore.hints_disabled()
|
|
or false
|
|
end,
|
|
content = gethint,
|
|
on_discover = clearcache,
|
|
on_privchange = clearcache
|
|
}
|
|
nodecore.register_inventory_tab(mytab)
|
|
|
|
nodecore.register_on_discover(function(player)
|
|
return nodecore.inventory_notify(player, "discover")
|
|
end)
|