102 lines
2.6 KiB
Lua
Raw Normal View History

-- LUALOCALS < ---------------------------------------------------------
local ipairs, math, minetest, nodecore, pairs, table
= ipairs, math, minetest, nodecore, pairs, table
local math_random, table_concat, table_sort
= math.random, table.concat, table.sort
-- LUALOCALS > ---------------------------------------------------------
local donecache = {}
2020-03-25 08:49:55 -04:00
local msgcache = {}
local msg = "discovered - @1"
nodecore.translate_inform(msg)
local function hintinit(player)
local pname = player:get_player_name()
local _, done = nodecore.hint_state(pname)
local t = {}
for _, v in pairs(done) do t[v.text] = true end
donecache[pname] = t
msgcache[pname] = {}
end
nodecore.register_on_joinplayer("join hint setup", hintinit)
local function alertcheck(pname)
local dc = donecache[pname]
if not dc then return end
local mc = msgcache[pname]
if not mc then return end
local _, done = nodecore.hint_state(pname)
for _, v in pairs(done) do
if not dc[v.text] then
dc[v.text] = true
mc[v.text] = nodecore.gametime + 10
end
end
end
nodecore.register_on_discover(function(_, key, pname)
if not key then donecache[pname] = {} end
return alertcheck(pname)
end)
2020-03-25 08:49:55 -04:00
do
local queue = {}
local function scan()
if #queue > 0 then
local pname = queue[#queue]
queue[#queue] = nil
local player = minetest.get_player_by_name(pname)
if player then alertcheck(pname) end
return minetest.after(0, scan)
else
return minetest.after(2 + math_random() * 3, function()
queue = {}
for _, p in ipairs(minetest.get_connected_players()) do
queue[#queue + 1] = p:get_player_name()
end
return minetest.after(0, scan)
end)
2020-03-25 08:49:55 -04:00
end
end
minetest.after(0, scan)
end
2020-03-25 08:49:55 -04:00
2020-06-22 22:46:48 -04:00
nodecore.register_playerstep({
label = "hint alerts",
action = function(player, data)
if nodecore.hints_disabled() then return end
if not nodecore.interact(player) then
data.hints_nointeract = true
elseif data.hints_nointeract then
data.hints_nointeract = nil
hintinit(player)
end
local mc = msgcache[data.pname] or {}
2020-06-22 22:46:48 -04:00
local t = {}
local o = {}
2020-06-22 22:46:48 -04:00
for k, v in pairs(mc) do
if v < nodecore.gametime then
mc[k] = nil
else
t[#t + 1] = nodecore.translate(msg, k)
o[t[#t]] = v
2020-06-22 22:46:48 -04:00
end
end
table_sort(t, function(a, b)
return o[a] < o[b] or o[a] == o[b] and a < b
end)
2020-06-22 22:46:48 -04:00
nodecore.hud_set_multiline(player, {
label = "hintcomplete",
hud_elem_type = "text",
position = {x = 0.5, y = 0.25},
text = table_concat(t, "\n"),
number = 0xE0FF80,
alignment = {x = 0, y = 0},
offset = {x = 0, y = 0}
}, nodecore.translate)
end
2020-06-22 22:46:48 -04:00
})