minetest_bitumen/lights.lua

187 lines
3.5 KiB
Lua

local function swap_node(pos, name)
local node = minetest.get_node(pos)
if node.name == name then
return
end
node.name = name
minetest.swap_node(pos, node)
end
local loffs = {
{x=0, y=4, z=4},
{x=0, y=4, z=-4},
{x=4, y=4, z=0},
{x=-4, y=4, z=0},
{x=7, y=8, z=7},
{x=7, y=8, z=-7},
{x=-7, y=8, z=7},
{x=-7, y=8, z=-7},
{x=9, y=8, z=0},
{x=-9, y=8, z=0},
{x=0, y=8, z=-9},
{x=0, y=8, z=-9},
{x=0, y=16, z=0},
}
local function destruct_light(pos)
for _,v in ipairs(loffs) do
local p = vector.add(pos, v)
local n = minetest.get_node(p)
if n.name == "bitumen:magic_light" then
minetest.set_node(p, {name="air"})
end
end
end
local function try_turn_on(pos)
local bpos = {x=pos.x, y=pos.y - 1, z=pos.z}
local bnode = minetest.get_node(bpos)
local bmeta = minetest.env:get_meta(bpos)
if not bmeta or bnode.name ~= "bitumen:oil_drum" then
swap_node(pos, "bitumen:kerosene_light")
destruct_light(pos)
return
end
local fluid = bmeta:get_string("fluid")
local fill = bmeta:get_int("fill")
local max_fill = bmeta:get_int("maxfill")
if not fill or fill == 0 then
swap_node(pos, "bitumen:kerosene_light")
destruct_light(pos)
return
end
local taken = 1
-- turn on
for _,v in ipairs(loffs) do
local p = vector.add(pos, v)
local n = minetest.get_node(p)
if n.name == "air" then
minetest.set_node(p, {name="bitumen:magic_light"})
-- else
end
end
bmeta:set_float("fill", math.max(fill - taken, 0))
bmeta:set_string("infotext", fluid .." (".. math.floor(((fill-taken)*100/max_fill)+0.5) .."%)")
end
minetest.register_node("bitumen:kerosene_light", {
description = "Kerosene Light",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -.1, -.4, -.1, .1, .5, .1},
{ -.4, -.5, -.4, .4, -.3, .4},
{ -.4, .5, -.4, .41, .51, .41},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
},
},
paramtype = "light",
is_ground_content = false,
tiles = { "default_wood.png" },
walkable = true,
groups = { cracky = 3, petroleum_fixture = 1 },
light_source = 1,
on_punch = function(pos)
swap_node(pos, "bitumen:kerosene_light_on")
try_turn_on(pos)
end,
on_destruct = destruct_light,
})
minetest.register_node("bitumen:kerosene_light_on", {
description = "Kerosene Light",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -.1, -.4, -.1, .1, .5, .1},
{ -.4, -.5, -.4, .4, -.3, .4},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
},
},
paramtype = "light",
is_ground_content = false,
tiles = { "default_meselamp.png" },
walkable = true,
groups = { cracky = 3, petroleum_fixture = 1 },
light_source = default.LIGHT_MAX,
on_punch = function(pos)
swap_node(pos, "bitumen:kerosene_light")
destruct_light(pos)
end,
on_destruct = destruct_light,
})
minetest.register_node("bitumen:magic_light", {
description = "Hidden Magic Light",
drawtype = "airlike",
-- tiles = {"default_mese.png"},
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
light_source = default.LIGHT_MAX,
})
minetest.register_abm({
nodenames = {"bitumen:kerosene_light_on"},
-- neighbors = {"bitumen:oil_drum"},
interval = 60,
chance = 1,
action = function(pos, node)
try_turn_on(pos)
end,
})
--[[ cleanup failsafe
minetest.register_abm({
nodenames = {"bitumen:magic_light"},
interval = 30,
chance = 1,
action = function(pos, node)
minetest.set_node(pos, {name="air"})
end,
})
]]