70 lines
2.1 KiB
Lua
70 lines
2.1 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local math, minetest, nodecore, pairs, vector
|
|
= math, minetest, nodecore, pairs, vector
|
|
local math_ceil, math_pow
|
|
= math.ceil, math.pow
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
local modname = minetest.get_current_modname()
|
|
|
|
local function isfluid(pos)
|
|
local def = minetest.registered_nodes[minetest.get_node(pos).name]
|
|
return def and def.groups and def.groups.lux_fluid
|
|
end
|
|
|
|
local indirs = {}
|
|
for _, v in pairs(nodecore.dirs()) do
|
|
if v.y == 0 then
|
|
indirs[#indirs + 1] = v
|
|
end
|
|
end
|
|
|
|
function nodecore.lux_soak_rate(pos)
|
|
local above = vector.add(pos, {x = 0, y = 1, z = 0})
|
|
if not isfluid(above) then return false end
|
|
local qty = 1
|
|
for _, v in pairs(indirs) do
|
|
if isfluid(vector.add(pos, v)) then qty = qty + 1 end
|
|
end
|
|
|
|
local dist = nodecore.scan_flood(above, 14, function(p, d)
|
|
if p.dir and p.dir.y < 0 then return false end
|
|
local nn = minetest.get_node(p).name
|
|
if nn == modname .. ":flux_source" then return d end
|
|
if nn ~= modname .. ":flux_flowing" then return false end
|
|
end)
|
|
if not dist then return false end
|
|
|
|
return qty * 20 / math_pow(2, dist / 2)
|
|
end
|
|
|
|
local function is_lux_cobble(stack)
|
|
return (not stack:is_empty()) and minetest.get_item_group(stack:get_name(), "lux_cobble") > 0
|
|
end
|
|
|
|
function nodecore.lux_react_qty(pos, adjust)
|
|
local minp = vector.subtract(pos, {x = 1, y = 1, z = 1})
|
|
local maxp = vector.add(pos, {x = 1, y = 1, z = 1})
|
|
local qty = #minetest.find_nodes_in_area(minp, maxp, {"group:lux_cobble"})
|
|
if adjust then qty = qty + adjust end
|
|
for _, p in pairs(minetest.find_nodes_with_meta(minp, maxp)) do
|
|
if is_lux_cobble(nodecore.stack_get(p)) then
|
|
qty = qty + 1
|
|
end
|
|
end
|
|
for _, p in pairs(minetest.get_connected_players()) do
|
|
if vector.distance(pos, vector.add(p:get_pos(), {x = 0, y = 1, z = 0})) < 2 then
|
|
local inv = p:get_inventory()
|
|
for i = 1, inv:get_size("main") do
|
|
if is_lux_cobble(inv:get_stack("main", i)) then
|
|
qty = qty + 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
qty = math_ceil(qty / 2)
|
|
if qty > 8 then qty = 8 end
|
|
if qty < 1 then qty = 1 end
|
|
return qty
|
|
end
|