simple_streetlights/simple.lua
Vanessa Dannenberg 92eb5b9e8d allow specifying a custom "base" node for the pole
(like if the bottom part should be bigger than the rest of the pole,
or has some details such as bolts securing it to the ground)
2021-06-27 19:22:59 -04:00

267 lines
8.5 KiB
Lua

-- generate the simple fence-based streetlights
local enable_digilines = minetest.get_modpath("digilines")
ilights.player_channels = {} -- last light source channel name that was set by a given player
if enable_digilines then
minetest.register_on_player_receive_fields(function(player, formname, fields)
if not player then return end
if fields.channel and fields.channel ~= "" and formname == "simple_streetlights:set_channel" then
local playername = player:get_player_name()
minetest.chat_send_player(playername, "*** The light source on all streetlights placed from now on will have the channel set to \""..fields.channel.."\"")
ilights.player_channels[playername] = fields.channel
end
end)
function ilights.digiline_on_use(itemstack, user, pointed_thing)
if user and user:get_player_control().sneak then
local name = user:get_player_name()
local form ="formspec_version[4]"..
"size[8,4]"..
"button_exit[3,2.5;2,0.5;proceed;Proceed]"..
"field[1.75,1.5;4.5,0.5;channel;Channel for future streetlights;]"
minetest.show_formspec(name, "simple_streetlights:set_channel", form)
end
end
end
local digiline_wire_node = "digilines:wire_std_00000000"
local poles_tab = {
-- material name, mod name, node name, optional base, optional height, has top section
{ "wood", "default", "default:fence_wood" },
{ "junglewood", "default", "default:fence_junglewood" },
{ "brass", "homedecor_fences", "homedecor:fence_brass"},
{ "wrought_iron", "homedecor_fences", "homedecor:fence_wrought_iron" },
{ "steel", "gloopblocks", "gloopblocks:fence_steel" }
}
local lights_tab = {
-- light name, mod name, node name, optional param2
{ "meselamp", "default", "default:meselamp" },
{ "ilight", "ilights", "ilights:light" },
{ "glowlight_cube", "homedecor_lighting", "homedecor:glowlight_small_cube" }
}
for _, pole in ipairs(poles_tab) do
local matname = pole[1]
local matmod = pole[2]
local matnode = pole[3]
local basenode = pole[4]
local height = pole[5]
local has_top = pole[6]
if minetest.get_modpath(matmod) then
for _, light in ipairs(lights_tab) do
local lightname = light[1]
local lightmod = light[2]
local lightnode = light[3]
local lightparam2 = light[4] or 0
if enable_digilines then
local def = table.copy(minetest.registered_nodes[matnode])
local dl_overlay
if def.drawtype == "fencelike" then
dl_overlay = "simple_streetlights_pole_digiline_overlay_fl.png"
else
dl_overlay = "simple_streetlights_pole_digiline_overlay_cnb.png"
end
for i,t in ipairs(def.tiles) do
def.tiles[i] = t.."^"..dl_overlay
end
def.description = def.description.." (digilines conducting)"
def.digiline = {
wire = {
rules = {
{x= 0, y= 0, z=-1},
{x= 0, y= 0, z= 1},
{x= 1, y= 0, z= 0},
{x=-1, y= 0, z= 0},
{x= 0, y=-1, z= 0},
{x= 0, y= 1, z= 0},
{x= 0, y=-2, z= 0}
}
}
}
def.drop = {
items = {
{items = { matnode.."_digilines" } },
}
}
def.palette = nil -- if the coloredwood mod exists and loads first, it'll create these
def.groups.ud_param2_colorable = nil -- settings, which we don't want in the cloned node.
minetest.register_node(":"..matnode.."_digilines", def)
minetest.register_craft({
output = matnode.."_digilines",
type = "shapeless",
recipe = {
matnode,
digiline_wire_node,
}
})
end
if minetest.get_modpath(lightmod) then
minetest.register_tool("simple_streetlights:spawner_"..matname.."_"..lightname, {
description = "Streetlight spawner ("..matname.." pole, "..lightname..")",
inventory_image = "simple_streetlights_inv_pole_"..matname..".png"..
"^simple_streetlights_inv_light_source_"..lightname..".png",
use_texture_alpha = true,
tool_capabilities = { full_punch_interval=0.1 },
on_place = function(itemstack, placer, pointed_thing)
streetlights.check_and_place(itemstack, placer, pointed_thing, {
base=basenode,
pole=matnode,
light=lightnode,
param2=lightparam2,
has_top = has_top,
height = height
})
end
})
minetest.register_craft({
output = "simple_streetlights:spawner_"..matname.."_"..lightname,
type = "shapeless",
recipe = {
matnode,
matnode,
matnode,
matnode,
matnode,
matnode,
lightnode
}
})
if enable_digilines and minetest.registered_nodes[lightnode].digiline then
minetest.register_tool("simple_streetlights:spawner_"..matname.."_"..lightname.."_digilines", {
description = "Streetlight spawner ("..matname.." pole, with "..lightname..", digilines conducting pole)",
inventory_image = "simple_streetlights_inv_pole_"..matname..".png"..
"^simple_streetlights_inv_pole_digiline_overlay.png"..
"^simple_streetlights_inv_light_source_"..lightname..".png",
use_texture_alpha = true,
tool_capabilities = { full_punch_interval=0.1 },
on_place = function(itemstack, placer, pointed_thing)
streetlights.check_and_place(itemstack, placer, pointed_thing, {
base=basenode,
pole=matnode,
light=lightnode,
param2=lightparam2,
has_top = has_top,
height = height,
needs_digiline_wire=true
})
end,
on_use = ilights.digiline_on_use
})
minetest.register_craft({
output = "simple_streetlights:spawner_"..matname.."_"..lightname.."_digilines",
type = "shapeless",
recipe = {
matnode,
matnode,
matnode,
matnode,
matnode,
matnode,
lightnode,
digiline_wire_node,
}
})
minetest.register_craft({
output = "simple_streetlights:spawner_"..matname.."_"..lightname.."_digilines",
type = "shapeless",
recipe = {
"simple_streetlights:spawner_"..matname.."_"..lightname,
digiline_wire_node
}
})
local distributor = nil
local dist_overlay = nil
if minetest.registered_items[streetlights.distributor] then
distributor = streetlights.distributor
dist_overlay = "^simple_streetlights_inv_pole_distributor_overlay.png"
elseif minetest.registered_items[streetlights.vert_digiline] then
distributor = streetlights.vert_digiline
dist_overlay = "^simple_streetlights_inv_pole_vertical_digiline_overlay.png"
end
if distributor then
minetest.register_tool("simple_streetlights:spawner_"..matname.."_"..lightname.."_digilines_distributor", {
description = "Streetlight spawner ("..matname.." pole, with "..lightname..", digilines conducting pole, with distributor 2m below)",
inventory_image = "simple_streetlights_inv_pole_"..matname..".png"..
"^simple_streetlights_inv_pole_digiline_overlay.png"..
dist_overlay..
"^simple_streetlights_inv_light_source_"..lightname..".png",
use_texture_alpha = true,
tool_capabilities = { full_punch_interval=0.1 },
on_place = function(itemstack, placer, pointed_thing)
streetlights.check_and_place(itemstack, placer, pointed_thing, {
base=basenode,
pole=matnode,
light=lightnode,
param2=lightparam2,
has_top = has_top,
height = height,
needs_digiline_wire=true,
distributor_node=distributor
})
end,
on_use = ilights.digiline_on_use
})
minetest.register_craft({
output = "simple_streetlights:spawner_"..matname.."_"..lightname.."_digilines_distributor",
type = "shapeless",
recipe = {
matnode,
matnode,
matnode,
matnode,
matnode,
matnode,
lightnode,
digiline_wire_node,
distributor
}
})
minetest.register_craft({
output = "simple_streetlights:spawner_"..matname.."_"..lightname.."_digilines_distributor",
type = "shapeless",
recipe = {
"simple_streetlights:spawner_"..matname.."_"..lightname,
digiline_wire_node,
distributor
}
})
minetest.register_craft({
output = "simple_streetlights:spawner_"..matname.."_"..lightname.."_digilines_distributor",
type = "shapeless",
recipe = {
"simple_streetlights:spawner_"..matname.."_"..lightname.."_digilines",
distributor
}
})
end
end
end
end
end
end