2020-02-08 14:04:34 -05:00

72 lines
1.8 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore, pairs, vector
= math, minetest, nodecore, pairs, vector
local math_exp, math_random
= math.exp, math.random
-- LUALOCALS > ---------------------------------------------------------
local maxdist = 8
local function getdps(pos)
if nodecore.quenched(pos) then return 0 end
local rel = {
x = math_random() * 2 - 1,
y = math_random() * 2 - 1,
z = math_random() * 2 - 1
}
local len = vector.length(rel)
if len == 0 or len > 1 then return end
rel = vector.multiply(rel, maxdist / len)
for pt in minetest.raycast(pos, vector.add(pos, rel), false, true) do
local p = pt.under
local n = minetest.get_node(p)
local def = minetest.registered_items[n.name]
local dps = def and def.damage_per_second
if dps and dps > 0 then
local r = vector.subtract(pos, p)
local dsqr = vector.dot(r, r) / 2 + 1
return dps / dsqr
end
if not (nodecore.air_pass(n) or def.sunlight_propagates)
then return 0 end
end
return 0
end
local heat = {}
local function check(player, dtime)
local pos = player:get_pos()
pos.y = pos.y + 1
local dps = getdps(pos)
if not dps then return end
local w = math_exp(-dtime)
local pname = player:get_player_name()
heat[pname] = (heat[pname] or 0) * w + dps * (1 - w)
end
minetest.register_globalstep(function(dtime)
if nodecore.stasis then return end
for _, p in pairs(minetest.get_connected_players()) do
if nodecore.player_visible(p) then check(p, dtime) end
end
end)
local function applyheat()
minetest.after(1, applyheat)
if nodecore.stasis then return end
for _, p in pairs(minetest.get_connected_players()) do
if nodecore.player_visible(p) then
local pname = p:get_player_name()
local ow = heat[pname]
if ow and ow > 0.1 then
nodecore.addphealth(p, -ow)
end
end
end
end
applyheat()