simple_streetlights/simple.lua
Vanessa Dannenberg fac56f263c Allow speciying custom top and overhang nodes
Can be true, false, or a table with two entries (topnode, overhang).

If false, the main pole extends all the way up to the specified height,
and the light is simply placed next to it.

if true, the main pole extends all the way up, and then steps right by
1m, with the light hanging from it.  This is the default.

if a table, the main pole stops 1m short of the top, and the two
specified nodes are placed above it, with the overhang to the right, and
the light hanging under it.

also fixed the custom base node not getting _digilines extension when
called-for
2021-06-27 20:25:58 -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, 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 topnodes = 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,
topnodes = topnodes,
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,
topnodes = topnodes,
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,
topnodes = topnodes,
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