07239de73c
- Make handhold nodes glow, to visually simulate the player character's now "familarity" with them by feel. We have to represent it synesthetically because the game only gives us sight and sound to work with. - Make floors "scalable" so that they glow, even though they don't affect maneuverability. The effect of this is to allow a player who has fallen into a dark cavern to navigate, slowly, by feel, allowing more extensive self-rescue possibilities.
89 lines
2.4 KiB
Lua
89 lines
2.4 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local minetest, nodecore, pairs, type
|
|
= minetest, nodecore, pairs, type
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
local match_skip = {
|
|
name = true,
|
|
param2 = true,
|
|
param = true,
|
|
groups = true,
|
|
stack = true,
|
|
count = true,
|
|
excess = true,
|
|
wear = true,
|
|
stacked = true,
|
|
any = true
|
|
}
|
|
|
|
function nodecore.match(thing, crit)
|
|
if not thing then return end
|
|
|
|
if type(crit) == "string" then crit = {name = crit} end
|
|
|
|
if crit.any then
|
|
for _, v in pairs(crit.any) do
|
|
local found = nodecore.match(thing, v)
|
|
if found then return found end
|
|
end
|
|
return
|
|
end
|
|
|
|
thing.count = thing.count or 1
|
|
|
|
thing = nodecore.underride({}, thing)
|
|
if thing.stack then
|
|
thing.name = thing.stack:get_name()
|
|
thing.count = thing.stack:get_count()
|
|
thing.wear = thing.stack:get_wear()
|
|
thing.stacked = true
|
|
end
|
|
if not thing.name then
|
|
thing = nodecore.underride(thing, minetest.get_node(thing))
|
|
end
|
|
local def = minetest.registered_items[thing.name]
|
|
if (not thing.stacked) and def and def.groups and def.groups.is_stack_only then
|
|
local stack = nodecore.stack_get(thing)
|
|
if stack and not stack:is_empty() then
|
|
thing.name = stack:get_name()
|
|
def = minetest.registered_items[thing.name]
|
|
thing.count = stack:get_count()
|
|
thing.wear = stack:get_wear()
|
|
end
|
|
thing.stacked = true
|
|
end
|
|
if crit.stacked and not thing.stacked then return end
|
|
if crit.stacked == false and thing.stacked then return end
|
|
|
|
if crit.name and thing.name ~= crit.name then return end
|
|
if crit.param2 and thing.param2 ~= crit.param2 then return end
|
|
if crit.param and thing.param ~= crit.param then return end
|
|
if crit.count and thing.count < crit.count then return end
|
|
if crit.count and (not crit.excess) and thing.count > crit.count then return end
|
|
if crit.count == nil and thing.count ~= 1 then return end
|
|
if crit.wear then
|
|
if crit.wear < 1 then crit.wear = crit.wear * 65535 end
|
|
if thing.wear > crit.wear then return end
|
|
end
|
|
|
|
if crit.groups then
|
|
if (not def) or (not def.groups) then return end
|
|
for k, v in pairs(crit.groups) do
|
|
if v == true then
|
|
if not def.groups[k] then return end
|
|
elseif v == false then
|
|
if def.groups[k] then return end
|
|
else
|
|
if def.groups[k] ~= v then return end
|
|
end
|
|
end
|
|
end
|
|
for k, v in pairs(crit) do
|
|
if not match_skip[k] then
|
|
if not def or def[k] ~= v then return end
|
|
end
|
|
end
|
|
|
|
return thing
|
|
end
|