simple_streetlights/simple.lua

389 lines
12 KiB
Lua

local fdir_to_right = {
{ 1, 0 },
{ 0, -1 },
{ -1, 0 },
{ 0, 1 }
}
--digilines compatibility
local rules_alldir = {
{x = 0, y = 0, z = -1}, -- borrowed from lightstones
{x = 1, y = 0, z = 0},
{x = -1, y = 0, z = 0},
{x = 0, y = 0, z = 1},
{x = 1, y = 1, z = 0},
{x = 1, y = -1, z = 0},
{x = -1, y = 1, z = 0},
{x = -1, y = -1, z = 0},
{x = 0, y = 1, z = 1},
{x = 0, y = -1, z = 1},
{x = 0, y = 1, z = -1},
{x = 0, y = -1, z = -1},
{x = 0, y = -1, z = 0},
}
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 = "field[channel;Set a channel for future streetlights;]"
minetest.show_formspec(name, "simple_streetlights:set_channel", form)
end
end
end
local digiline_wire_node = "digilines:wire_std_00000000"
-- clone node
local function clone_node(name)
local node2 = {}
local node = minetest.registered_nodes[name]
for k,v in pairs(node) do
node2[k]=v
end
return node2
end
minetest.register_privilege("streetlight", {
description = "Allows using streetlight spawners",
give_to_singleplayer = true
})
local function check_and_place(itemstack, placer, pointed_thing, pole, light, param2, needs_digiline_wire, needs_distributor)
local controls = placer:get_player_control()
if not placer then return end
local playername = placer:get_player_name()
if not minetest.check_player_privs(placer, "streetlight") then
minetest.chat_send_player(playername, "*** You don't have permission to use a streetlight spawner.")
return
end
local player_name = placer:get_player_name()
local fdir = minetest.dir_to_facedir(placer:get_look_dir())
local pos1 = minetest.get_pointed_thing_position(pointed_thing)
local node1 = minetest.get_node(pos1)
if not node1 or node1.name == "ignore" then return end
local def1 = minetest.registered_items[node1.name]
print(dump(pos1))
print(node1.name)
print(dump(def1))
if (def1 and def1.buildable_to) then
pos1.y = pos1.y-1
end
local node1 = minetest.get_node(pos1)
local node2, node3, node4
local def1 = minetest.registered_items[node1.name]
local def2, def3, def4
local pos2, pos3, pos4
for i = 1, 5 do
pos2 = { x=pos1.x, y = pos1.y+i, z=pos1.z }
node2 = minetest.get_node(pos2)
def2 = minetest.registered_items[node2.name]
if minetest.is_protected(pos2, player_name) or not (def2 and def2.buildable_to) then return end
end
pos3 = { x = pos1.x+fdir_to_right[fdir+1][1], y = pos1.y+5, z = pos1.z+fdir_to_right[fdir+1][2] }
node3 = minetest.get_node(pos3)
def3 = minetest.registered_items[node3.name]
if minetest.is_protected(pos3, player_name) or not (def3 and def3.buildable_to) then return end
pos4 = { x = pos1.x+fdir_to_right[fdir+1][1], y = pos1.y+4, z = pos1.z+fdir_to_right[fdir+1][2] }
node4 = minetest.get_node(pos4)
def4 = minetest.registered_items[node4.name]
local pos0 = { x = pos1.x, y = pos1.y-1, z = pos1.z }
if minetest.is_protected(pos4, player_name) or not (def3 and def4.buildable_to) then return end
if controls.sneak and minetest.is_protected(pos1, player_name) then return end
if needs_distributor and minetest.is_protected(pos0, player_name) then return end
if not creative.is_enabled_for(player_name) then
local inv = placer:get_inventory()
if not inv:contains_item("main", pole.." 6") then
minetest.chat_send_player(playername, "*** You don't have enough "..pole.." in your inventory!")
return
end
if not inv:contains_item("main", light) then
minetest.chat_send_player(playername, "*** You don't have any "..light.." in your inventory!")
return
end
if needs_digiline_wire and not inv:contains_item("main", digiline_wire_node.." 6") then
minetest.chat_send_player(playername, "*** You don't have enough Digiline wires in your inventory!")
return
end
if controls.sneak then
if not inv:contains_item("main", streetlights.concrete) then
minetest.chat_send_player(playername, "*** You don't have any concrete in your inventory!")
return
else
inv:remove_item("main", streetlights.concrete)
end
end
if needs_distributor and needs_digiline_wire then
if not inv:contains_item("main", streetlights.distributor) then
minetest.chat_send_player(playername, "*** You don't have any Digiline distributors in your inventory!")
return
else
inv:remove_item("main", streetlights.distributor)
end
end
inv:remove_item("main", pole.." 6")
inv:remove_item("main", light)
if needs_digiline_wire then
inv:remove_item("main", digiline_wire_node.." 6")
end
end
if needs_distributor and needs_digiline_wire then
minetest.set_node(pos0, { name = streetlights.distributor })
end
if controls.sneak then
minetest.set_node(pos1, { name = streetlights.concrete })
end
local pole2 = pole
if needs_digiline_wire then
pole2 = pole.."_digilines"
end
for i = 1, 5 do
pos2 = {x=pos1.x, y = pos1.y+i, z=pos1.z}
minetest.set_node(pos2, {name = pole2 })
end
minetest.set_node(pos3, { name = pole2 })
minetest.set_node(pos4, { name = light, param2 = param2 })
if needs_digiline_wire and ilights.player_channels[playername] then
minetest.get_meta(pos4):set_string("channel", ilights.player_channels[playername])
end
end
local poles_tab = {
-- material name, mod name, node name
{ "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]
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 = clone_node(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)
check_and_place(itemstack, placer, pointed_thing, matnode, lightnode, lightparam2)
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)
check_and_place(itemstack, placer, pointed_thing, matnode, lightnode, lightparam2, 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
}
})
if minetest.registered_items[streetlights.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"..
"^simple_streetlights_inv_pole_distributor_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)
check_and_place(itemstack, placer, pointed_thing, matnode, lightnode, lightparam2, true, true)
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,
streetlights.distributor
}
})
minetest.register_craft({
output = "simple_streetlights:spawner_"..matname.."_"..lightname.."_digilines_distributor",
type = "shapeless",
recipe = {
"simple_streetlights:spawner_"..matname.."_"..lightname,
digiline_wire_node,
streetlights.distributor
}
})
minetest.register_craft({
output = "simple_streetlights:spawner_"..matname.."_"..lightname.."_digilines_distributor",
type = "shapeless",
recipe = {
"simple_streetlights:spawner_"..matname.."_"..lightname.."_digilines",
streetlights.distributor
}
})
end
end
end
end
end
end