2021-05-29 17:12:33 +03:00
local S = minetest.get_translator ( minetest.get_current_modname ( ) )
2019-03-08 02:07:41 +02:00
2022-02-07 16:52:15 +02:00
local function path_to_sunlight_exists ( position , light_level )
local neighbours = {
{ x = 0 , y = 0 , z =- 1 } ,
{ x = 0 , y = 0 , z = 1 } ,
{ x = 0 , y =- 1 , z = 0 } ,
{ x = 0 , y = 1 , z = 0 } ,
{ x =- 1 , y = 0 , z = 0 } ,
{ x = 1 , y = 0 , z = 0 } ,
}
for i = 1 , # neighbours do
local offset = neighbours [ i ]
local position_new = vector.add (
position ,
offset
)
local light_level_new = minetest.get_node_light (
position_new ,
nil
)
if 15 == light_level_new then
-- found the sunlight
return true
elseif light_level_new > light_level then
-- search where light is brighter
if path_to_sunlight_exists (
position_new ,
light_level_new
) then
return true
end
end
end
end
local function sunlight_visible ( position )
local light_level
-- Minetest 5.4.0+ can measure the daylight level at a position
if nil ~= minetest.get_natural_light then
light_level = minetest.get_natural_light (
position ,
nil
)
if light_level >= 12 then
return true
end
else -- Minetest 5.3.0 or less can only measure the light level
local time = minetest.get_timeofday ( ) * 24000
-- only check light level during day
if time > 6000 and time < 18000 then
light_level = minetest.get_node_light (
position ,
nil
)
if light_level >= 12 then
return path_to_sunlight_exists (
position ,
12
)
end
end
end
return false
end
2018-01-13 04:37:41 +02:00
local boxes = { - 8 / 16 , - 8 / 16 , - 8 / 16 , 8 / 16 , - 2 / 16 , 8 / 16 }
2015-06-29 20:55:56 +03:00
2018-01-13 04:37:41 +02:00
-- Daylight Sensor
2015-06-29 20:55:56 +03:00
minetest.register_node ( " mesecons_solarpanel:solar_panel_on " , {
drawtype = " nodebox " ,
tiles = { " jeija_solar_panel.png " , " jeija_solar_panel.png " , " jeija_solar_panel_side.png " ,
" jeija_solar_panel_side.png " , " jeija_solar_panel_side.png " , " jeija_solar_panel_side.png " , } ,
wield_image = " jeija_solar_panel.png " ,
2017-02-14 21:52:34 +02:00
wield_scale = { x = 1 , y = 1 , z = 3 } ,
2015-06-29 20:55:56 +03:00
paramtype = " light " ,
2017-01-04 23:36:51 +02:00
is_ground_content = false ,
2015-06-29 20:55:56 +03:00
selection_box = {
type = " fixed " ,
fixed = boxes
} ,
node_box = {
type = " fixed " ,
fixed = boxes
} ,
drop = " mesecons_solarpanel:solar_panel_off " ,
2017-03-02 20:53:53 +02:00
_doc_items_create_entry = false ,
2020-04-19 00:24:42 +03:00
groups = { handy = 1 , axey = 1 , not_in_creative_inventory = 1 , material_wood = 1 , flammable =- 1 } ,
2017-02-11 19:46:23 +02:00
sounds = mcl_sounds.node_sound_glass_defaults ( ) ,
2015-06-29 20:55:56 +03:00
mesecons = { receptor = {
2017-09-14 03:20:47 +03:00
state = mesecon.state . on ,
2018-01-13 04:37:41 +02:00
rules = mesecon.rules . pplate ,
2017-01-28 13:21:43 +02:00
} } ,
on_rightclick = function ( pos , node , clicker , pointed_thing )
2019-02-08 22:59:01 +02:00
local protname = clicker : get_player_name ( )
if minetest.is_protected ( pos , protname ) then
minetest.record_protection_violation ( pos , protname )
return
end
2017-01-28 13:21:43 +02:00
minetest.swap_node ( pos , { name = " mesecons_solarpanel:solar_panel_inverted_off " } )
2018-01-13 04:37:41 +02:00
mesecon.receptor_off ( pos , mesecon.rules . pplate )
2017-01-28 13:21:43 +02:00
end ,
2020-04-17 22:40:13 +03:00
_mcl_blast_resistance = 0.2 ,
2017-03-20 22:39:39 +02:00
_mcl_hardness = 0.2 ,
2015-06-29 20:55:56 +03:00
} )
minetest.register_node ( " mesecons_solarpanel:solar_panel_off " , {
drawtype = " nodebox " ,
tiles = { " jeija_solar_panel.png " , " jeija_solar_panel.png " , " jeija_solar_panel_side.png " ,
" jeija_solar_panel_side.png " , " jeija_solar_panel_side.png " , " jeija_solar_panel_side.png " , } ,
wield_image = " jeija_solar_panel.png " ,
2017-02-14 21:52:34 +02:00
wield_scale = { x = 1 , y = 1 , z = 3 } ,
2015-06-29 20:55:56 +03:00
paramtype = " light " ,
2017-01-04 23:36:51 +02:00
is_ground_content = false ,
selection_box = {
2015-06-29 20:55:56 +03:00
type = " fixed " ,
fixed = boxes
} ,
node_box = {
type = " fixed " ,
fixed = boxes
} ,
2017-03-20 22:39:39 +02:00
groups = { handy = 1 , axey = 1 , material_wood = 1 } ,
2019-03-08 02:07:41 +02:00
description = S ( " Daylight Sensor " ) ,
2020-02-19 05:54:17 +02:00
_tt_help = S ( " Provides redstone power when in sunlight " ) .. " \n " .. S ( " Can be inverted " ) ,
2019-03-25 13:15:37 +02:00
_doc_items_longdesc = S ( " Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted. " ) .. " \n " ..
S ( " In inverted state, they provide redstone power when they are not in sunlight and no power otherwise. " ) ,
_doc_items_usagehelp = S ( " Use the daylight sensor to toggle its state. " ) ,
2017-02-11 19:46:23 +02:00
sounds = mcl_sounds.node_sound_glass_defaults ( ) ,
2015-06-29 20:55:56 +03:00
mesecons = { receptor = {
2017-09-14 03:20:47 +03:00
state = mesecon.state . off ,
2018-01-13 04:37:41 +02:00
rules = mesecon.rules . pplate ,
2017-01-28 13:21:43 +02:00
} } ,
on_rightclick = function ( pos , node , clicker , pointed_thing )
2019-02-08 22:59:01 +02:00
local protname = clicker : get_player_name ( )
if minetest.is_protected ( pos , protname ) then
minetest.record_protection_violation ( pos , protname )
return
end
2017-01-28 13:21:43 +02:00
minetest.swap_node ( pos , { name = " mesecons_solarpanel:solar_panel_inverted_on " } )
2018-01-13 04:37:41 +02:00
mesecon.receptor_on ( pos , mesecon.rules . pplate )
2017-01-28 13:21:43 +02:00
end ,
2020-04-17 22:40:13 +03:00
_mcl_blast_resistance = 0.2 ,
2017-03-20 22:39:39 +02:00
_mcl_hardness = 0.2 ,
2015-06-29 20:55:56 +03:00
} )
minetest.register_craft ( {
2021-05-29 17:12:33 +03:00
output = " mesecons_solarpanel:solar_panel_off " ,
2015-06-29 20:55:56 +03:00
recipe = {
2021-05-29 17:12:33 +03:00
{ " mcl_core:glass " , " mcl_core:glass " , " mcl_core:glass " } ,
{ " mcl_nether:quartz " , " mcl_nether:quartz " , " mcl_nether:quartz " } ,
{ " group:wood_slab " , " group:wood_slab " , " group:wood_slab " } ,
2015-06-29 20:55:56 +03:00
}
} )
2017-05-15 01:45:54 +03:00
minetest.register_abm ( {
label = " Daylight turns on solar panels " ,
nodenames = { " mesecons_solarpanel:solar_panel_off " } ,
2015-06-29 20:55:56 +03:00
interval = 1 ,
chance = 1 ,
action = function ( pos , node , active_object_count , active_object_count_wider )
2022-02-07 16:52:15 +02:00
if sunlight_visible ( pos ) then
2017-01-11 19:21:46 +02:00
minetest.set_node ( pos , { name = " mesecons_solarpanel:solar_panel_on " , param2 = node.param2 } )
2018-01-13 04:37:41 +02:00
mesecon.receptor_on ( pos , mesecon.rules . pplate )
2015-06-29 20:55:56 +03:00
end
end ,
} )
2017-05-15 01:45:54 +03:00
minetest.register_abm ( {
label = " Darkness turns off solar panels " ,
nodenames = { " mesecons_solarpanel:solar_panel_on " } ,
2015-06-29 20:55:56 +03:00
interval = 1 ,
chance = 1 ,
action = function ( pos , node , active_object_count , active_object_count_wider )
2022-02-07 16:52:15 +02:00
if not sunlight_visible ( pos ) then
2017-01-11 19:21:46 +02:00
minetest.set_node ( pos , { name = " mesecons_solarpanel:solar_panel_off " , param2 = node.param2 } )
2018-01-13 04:37:41 +02:00
mesecon.receptor_off ( pos , mesecon.rules . pplate )
2015-06-29 20:55:56 +03:00
end
end ,
} )
2018-01-13 04:37:41 +02:00
--- Inverted Daylight Sensor
2015-06-29 20:55:56 +03:00
minetest.register_node ( " mesecons_solarpanel:solar_panel_inverted_on " , {
drawtype = " nodebox " ,
tiles = { " jeija_solar_panel_inverted.png " , " jeija_solar_panel_inverted.png " , " jeija_solar_panel_side.png " ,
" jeija_solar_panel_side.png " , " jeija_solar_panel_side.png " , " jeija_solar_panel_side.png " , } ,
wield_image = " jeija_solar_panel_inverted.png " ,
2017-02-14 21:52:34 +02:00
wield_scale = { x = 1 , y = 1 , z = 3 } ,
2015-06-29 20:55:56 +03:00
paramtype = " light " ,
2017-01-04 23:36:51 +02:00
is_ground_content = false ,
2015-06-29 20:55:56 +03:00
selection_box = {
type = " fixed " ,
fixed = boxes
} ,
node_box = {
type = " fixed " ,
fixed = boxes
} ,
2017-01-28 13:21:43 +02:00
drop = " mesecons_solarpanel:solar_panel_off " ,
2017-03-20 22:39:39 +02:00
groups = { handy = 1 , axey = 1 , not_in_creative_inventory = 1 , material_wood = 1 } ,
2017-03-02 20:53:53 +02:00
_doc_items_create_entry = false ,
2017-02-11 19:46:23 +02:00
sounds = mcl_sounds.node_sound_glass_defaults ( ) ,
2015-06-29 20:55:56 +03:00
mesecons = { receptor = {
2018-01-13 04:37:41 +02:00
state = mesecon.state . on ,
rules = mesecon.rules . pplate ,
2017-01-28 13:21:43 +02:00
} } ,
on_rightclick = function ( pos , node , clicker , pointed_thing )
2019-02-08 22:59:01 +02:00
local protname = clicker : get_player_name ( )
if minetest.is_protected ( pos , protname ) then
minetest.record_protection_violation ( pos , protname )
return
end
2017-01-28 13:21:43 +02:00
minetest.swap_node ( pos , { name = " mesecons_solarpanel:solar_panel_off " } )
2018-01-13 04:37:41 +02:00
mesecon.receptor_off ( pos , mesecon.rules . pplate )
2017-01-28 13:21:43 +02:00
end ,
2020-04-17 22:40:13 +03:00
_mcl_blast_resistance = 0.2 ,
2017-03-20 22:39:39 +02:00
_mcl_hardness = 0.2 ,
2015-06-29 20:55:56 +03:00
} )
minetest.register_node ( " mesecons_solarpanel:solar_panel_inverted_off " , {
drawtype = " nodebox " ,
tiles = { " jeija_solar_panel_inverted.png " , " jeija_solar_panel_inverted.png " , " jeija_solar_panel_side.png " ,
" jeija_solar_panel_side.png " , " jeija_solar_panel_side.png " , " jeija_solar_panel_side.png " , } ,
wield_image = " jeija_solar_panel_inverted.png " ,
2017-02-14 21:52:34 +02:00
wield_scale = { x = 1 , y = 1 , z = 3 } ,
2015-06-29 20:55:56 +03:00
p aramtype = " light " ,
2017-01-04 23:36:51 +02:00
is_ground_content = false ,
selection_box = {
2015-06-29 20:55:56 +03:00
type = " fixed " ,
fixed = boxes
} ,
node_box = {
type = " fixed " ,
fixed = boxes
} ,
2017-01-28 13:21:43 +02:00
drop = " mesecons_solarpanel:solar_panel_off " ,
2017-03-20 22:39:39 +02:00
groups = { handy = 1 , axey = 1 , not_in_creative_inventory = 1 , material_wood = 1 } ,
2019-03-08 02:07:41 +02:00
description = S ( " Inverted Daylight Sensor " ) ,
2019-03-25 13:15:37 +02:00
_doc_items_create_entry = false ,
2017-02-11 19:46:23 +02:00
sounds = mcl_sounds.node_sound_glass_defaults ( ) ,
2015-06-29 20:55:56 +03:00
mesecons = { receptor = {
2018-01-13 04:37:41 +02:00
state = mesecon.state . off ,
rules = mesecon.rules . pplate ,
2017-01-28 13:21:43 +02:00
} } ,
on_rightclick = function ( pos , node , clicker , pointed_thing )
2019-02-08 22:59:01 +02:00
local protname = clicker : get_player_name ( )
if minetest.is_protected ( pos , protname ) then
minetest.record_protection_violation ( pos , protname )
return
end
2017-01-28 13:21:43 +02:00
minetest.swap_node ( pos , { name = " mesecons_solarpanel:solar_panel_on " } )
2018-01-13 04:37:41 +02:00
mesecon.receptor_on ( pos , mesecon.rules . pplate )
2017-01-28 13:21:43 +02:00
end ,
2020-04-17 22:40:13 +03:00
_mcl_blast_resistance = 0.2 ,
2017-03-20 22:39:39 +02:00
_mcl_hardness = 0.2 ,
2015-06-29 20:55:56 +03:00
} )
2017-05-15 01:45:54 +03:00
minetest.register_abm ( {
label = " Darkness turns on inverted solar panels " ,
nodenames = { " mesecons_solarpanel:solar_panel_inverted_off " } ,
2015-06-29 20:55:56 +03:00
interval = 1 ,
chance = 1 ,
action = function ( pos , node , active_object_count , active_object_count_wider )
2022-02-07 16:52:15 +02:00
if not sunlight_visible ( pos ) then
2017-01-11 19:21:46 +02:00
minetest.set_node ( pos , { name = " mesecons_solarpanel:solar_panel_inverted_on " , param2 = node.param2 } )
2018-01-13 04:37:41 +02:00
mesecon.receptor_on ( pos , mesecon.rules . pplate )
2015-06-29 20:55:56 +03:00
end
end ,
} )
2017-05-15 01:45:54 +03:00
minetest.register_abm ( {
label = " Daylight turns off inverted solar panels " ,
nodenames = { " mesecons_solarpanel:solar_panel_inverted_on " } ,
2015-06-29 20:55:56 +03:00
interval = 1 ,
chance = 1 ,
action = function ( pos , node , active_object_count , active_object_count_wider )
2022-02-07 16:52:15 +02:00
if sunlight_visible ( pos ) then
2017-01-11 19:21:46 +02:00
minetest.set_node ( pos , { name = " mesecons_solarpanel:solar_panel_inverted_off " , param2 = node.param2 } )
2018-01-13 04:37:41 +02:00
mesecon.receptor_off ( pos , mesecon.rules . pplate )
2015-06-29 20:55:56 +03:00
end
end ,
} )
2017-01-10 07:43:07 +02:00
minetest.register_craft ( {
type = " fuel " ,
recipe = " mesecons_solarpanel:solar_panel_off " ,
burntime = 15
} )
2017-03-21 05:27:50 +02:00
if minetest.get_modpath ( " doc " ) then
doc.add_entry_alias ( " nodes " , " mesecons_solarpanel:solar_panel_off " , " nodes " , " mesecons_solarpanel:solar_panel_on " )
2019-03-25 13:15:37 +02:00
doc.add_entry_alias ( " nodes " , " mesecons_solarpanel:solar_panel_off " , " nodes " , " mesecons_solarpanel:solar_panel_inverted_off " )
doc.add_entry_alias ( " nodes " , " mesecons_solarpanel:solar_panel_off " , " nodes " , " mesecons_solarpanel:solar_panel_inverted_off " )
doc.add_entry_alias ( " nodes " , " mesecons_solarpanel:solar_panel_off " , " nodes " , " mesecons_solarpanel:solar_panel_inverted_on " )
2017-03-21 05:27:50 +02:00
end