If digilines is enabled, create digiline conducting copies of all
registered pole nodes, with simple texture overlays to make it evident. Also, create suitable spawners for these, but only if the light source to be spawned is also digilines compatible. When using a digiline-compat spawner, you can set the channel for the light source (and thus all future lights you place) by shift-punching while wielding the spawner. This setting persists until the next restart, or until you change it with another shift-punch.
This commit is contained in:
parent
85c7ed8425
commit
4da69dd206
@ -6,3 +6,4 @@ gloopblocks?
|
||||
homedecor_fences?
|
||||
homedecor_lighting?
|
||||
streetspoles?
|
||||
digilines?
|
||||
|
136
simple.lua
136
simple.lua
@ -1,4 +1,3 @@
|
||||
|
||||
local fdir_to_right = {
|
||||
{ 1, 0 },
|
||||
{ 0, -1 },
|
||||
@ -6,16 +5,72 @@ local fdir_to_right = {
|
||||
{ 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)
|
||||
local function check_and_place(itemstack, placer, pointed_thing, pole, light, param2, needs_digiline_wire)
|
||||
local sneak = placer:get_player_control().sneak
|
||||
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(placer:get_player_name(), "*** You don't have permission to use a streetlight spawner.")
|
||||
minetest.chat_send_player(playername, "*** You don't have permission to use a streetlight spawner.")
|
||||
return
|
||||
end
|
||||
local player_name = placer:get_player_name()
|
||||
@ -63,18 +118,23 @@ local function check_and_place(itemstack, placer, pointed_thing, pole, light, pa
|
||||
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(placer:get_player_name(), "*** You don't have enough "..pole.." in your inventory!")
|
||||
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(placer:get_player_name(), "*** You don't have any "..light.." in your inventory!")
|
||||
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) then
|
||||
minetest.chat_send_player(playername, "*** You don't have any digiline wires in your inventory!")
|
||||
return
|
||||
end
|
||||
|
||||
if sneak then
|
||||
if not inv:contains_item("main", streetlights.concrete) then
|
||||
minetest.chat_send_player(placer:get_player_name(), "*** You don't have any concrete in your inventory!")
|
||||
minetest.chat_send_player(playername, "*** You don't have any concrete in your inventory!")
|
||||
return
|
||||
else
|
||||
inv:remove_item("main", streetlights.concrete)
|
||||
@ -83,6 +143,7 @@ local function check_and_place(itemstack, placer, pointed_thing, pole, light, pa
|
||||
|
||||
inv:remove_item("main", pole.." 6")
|
||||
inv:remove_item("main", light)
|
||||
inv:remove_item("main", digiline_wire_node)
|
||||
|
||||
end
|
||||
|
||||
@ -96,6 +157,10 @@ local function check_and_place(itemstack, placer, pointed_thing, pole, light, pa
|
||||
end
|
||||
minetest.set_node(pos3, { name = pole })
|
||||
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 = {
|
||||
@ -127,6 +192,36 @@ for _, pole in ipairs(poles_tab) do
|
||||
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}
|
||||
}
|
||||
}
|
||||
}
|
||||
minetest.register_node(":"..matnode.."_digilines", def)
|
||||
end
|
||||
|
||||
if minetest.get_modpath(lightmod) then
|
||||
|
||||
minetest.register_tool("simple_streetlights:spawner_"..matname.."_"..lightname, {
|
||||
@ -154,6 +249,35 @@ for _, pole in ipairs(poles_tab) do
|
||||
}
|
||||
})
|
||||
|
||||
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.."_digilines", 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,
|
||||
}
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
BIN
textures/simple_streetlights_inv_pole_digiline_overlay.png
Normal file
BIN
textures/simple_streetlights_inv_pole_digiline_overlay.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 651 B |
BIN
textures/simple_streetlights_pole_digiline_overlay_cnb.png
Normal file
BIN
textures/simple_streetlights_pole_digiline_overlay_cnb.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 144 B |
BIN
textures/simple_streetlights_pole_digiline_overlay_fl.png
Normal file
BIN
textures/simple_streetlights_pole_digiline_overlay_fl.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 146 B |
Loading…
x
Reference in New Issue
Block a user