138 lines
4.0 KiB
Lua
138 lines
4.0 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local ItemStack, math, minetest, nodecore, rawset, vector
|
|
= ItemStack, math, minetest, nodecore, rawset, vector
|
|
local math_floor
|
|
= math.floor
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
local countdescs = {"@1"}
|
|
for i = 2, 9 do countdescs[i] = "@1 (" .. i .. ")" end
|
|
for j = 10, 90, 10 do
|
|
for i = 0, 9 do
|
|
countdescs[j + i] = "@1 (" .. j .. "@2)"
|
|
end
|
|
end
|
|
countdescs[100] = "@1 (100@2)"
|
|
for i = 2, #countdescs do nodecore.translate_inform(countdescs[i]) end
|
|
local plus = nodecore.translate("+")
|
|
|
|
local weardescs = {"@1"}
|
|
for i = 1, 65535 do
|
|
local q = math_floor(i * 5 / 65536 + 0.5)
|
|
local t = "@1 "
|
|
for _ = 1, (5 - q) do t = t .. "|" end
|
|
for _ = 1, q do t = t .. "." end
|
|
weardescs[i] = t
|
|
nodecore.translate_inform(weardescs[i])
|
|
end
|
|
|
|
function nodecore.touchtip_stack(s, noqty)
|
|
if s:is_empty() then return "" end
|
|
|
|
local n = s:get_name()
|
|
local d = minetest.registered_items[n] or {}
|
|
|
|
local t = s:get_meta():get_string("description")
|
|
t = t ~= "" and t or d.description or n
|
|
|
|
if not noqty then
|
|
local c = s:get_count()
|
|
if c > 1 then
|
|
t = nodecore.translate(t)
|
|
local cd = countdescs[c > 100 and 100 or c]
|
|
if c >= 10 then
|
|
t = nodecore.translate(cd, t, c >= s:get_stack_max() and "" or plus)
|
|
else
|
|
t = nodecore.translate(cd, t)
|
|
end
|
|
else
|
|
local w = s:get_wear()
|
|
if w > 1 then
|
|
t = nodecore.translate(t)
|
|
t = nodecore.translate(weardescs[w], t)
|
|
end
|
|
end
|
|
end
|
|
|
|
if d.on_stack_touchtip then
|
|
return d.on_stack_touchtip(s, t) or t
|
|
end
|
|
return t
|
|
end
|
|
|
|
local function rawnodedesc(pos, node, name, def, puncher, pointed, ...)
|
|
node = node or minetest.get_node(pos)
|
|
name = name or node.name
|
|
def = def or minetest.registered_items[name] or {}
|
|
|
|
local metaname = minetest.get_meta(pos):get_string("description")
|
|
if metaname and metaname ~= "" then
|
|
name = metaname
|
|
elseif def.groups and def.groups.is_stack_only then
|
|
name = nodecore.touchtip_stack(nodecore.stack_get(pos))
|
|
elseif def.description then
|
|
name = def.description
|
|
end
|
|
|
|
if def.groups and def.groups.visinv and not def.groups.is_stack_only then
|
|
local s = nodecore.stack_get(pos)
|
|
local t = nodecore.touchtip_stack(s)
|
|
if t and t ~= "" then name = name .. "\n" .. t end
|
|
end
|
|
|
|
if def.on_node_touchtip then
|
|
return def.on_node_touchtip(pos, node, name, puncher, pointed, ...) or name
|
|
end
|
|
return name
|
|
end
|
|
|
|
function nodecore.touchtip_node(pos, node, puncher, pointed, ...)
|
|
if not (puncher and puncher:is_player()) then return end
|
|
|
|
local adesc = " "
|
|
if pointed and pointed.above and pointed.under
|
|
and vector.equals(pos, pointed.under) then
|
|
local anode = minetest.get_node(pointed.above)
|
|
local def = minetest.registered_items[anode.name] or {}
|
|
if def.on_node_touchthru then
|
|
return def.on_node_touchthru(pointed.above,
|
|
anode, pointed.under, puncher, ...)
|
|
else
|
|
local tt = def.touchthru or def.touchthru ~= false
|
|
and def.liquidtype ~= "none" and not def.pointable
|
|
|
|
if tt then
|
|
adesc = rawnodedesc(pointed.above, anode,
|
|
anode.name, def, puncher, pointed, ...)
|
|
local ppos = puncher:get_pos()
|
|
ppos.y = ppos.y + puncher:get_properties().eye_height
|
|
local pnode = minetest.get_node(ppos)
|
|
local pdesc = rawnodedesc(ppos, pnode, pnode.name,
|
|
minetest.registered_items[pnode.name] or {},
|
|
puncher, pointed, ...)
|
|
if adesc == pdesc then adesc = " " end
|
|
end
|
|
end
|
|
end
|
|
node = node or minetest.get_node(pos)
|
|
local name = node.name
|
|
local def = minetest.registered_items[name] or {}
|
|
if def.air_equivalent or def.pointable == false then return end
|
|
|
|
return adesc .. "\n" .. rawnodedesc(pos, node,
|
|
name, def, puncher, pointed, ...)
|
|
end
|
|
|
|
nodecore.show_touchtip = function() end
|
|
|
|
local function adddesc(entname, func)
|
|
local def = minetest.registered_entities[entname]
|
|
rawset(def, "description", func)
|
|
end
|
|
adddesc("__builtin:item", function(self)
|
|
return nodecore.touchtip_stack(ItemStack(self.itemstring))
|
|
end)
|
|
adddesc("__builtin:falling_node", function(self)
|
|
return nodecore.touchtip_stack(ItemStack(self.node.name))
|
|
end)
|