2017-03-08 07:50:58 +01:00
-- internationalization boilerplate
local MP = minetest.get_modpath ( minetest.get_current_modname ( ) )
local S , NS = dofile ( MP .. " /intllib.lua " )
-----------------------------------------------------------------------
-- Plants
2018-12-31 19:46:27 +01:00
minetest.register_node ( " df_farming:dead_fungus " , {
2017-03-11 21:29:06 +01:00
description = S ( " Dead Fungus " ) ,
2018-12-31 19:46:27 +01:00
_doc_items_longdesc = df_farming.doc . dead_fungus_desc ,
_doc_items_usagehelp = df_farming.doc . dead_fungus_usage ,
2017-03-11 21:29:06 +01:00
drawtype = " plantlike " ,
tiles = { " dfcaverns_dead_fungus.png " } ,
inventory_image = " dfcaverns_dead_fungus.png " ,
paramtype = " light " ,
walkable = false ,
2019-11-11 05:47:10 +01:00
is_ground_content = false ,
2017-03-11 21:29:06 +01:00
buildable_to = true ,
2018-12-31 19:46:27 +01:00
floodable = true ,
2017-03-26 22:38:53 +02:00
groups = { snappy = 3 , flammable = 2 , plant = 1 , not_in_creative_inventory = 1 , attached_node = 1 , flow_through = 1 } ,
2017-03-11 21:29:06 +01:00
sounds = default.node_sound_leaves_defaults ( ) ,
selection_box = {
type = " fixed " ,
fixed = { - 0.5 , - 0.5 , - 0.5 , 0.5 , 0.0 , 0.5 } ,
} ,
} )
2017-03-16 09:18:32 +01:00
minetest.register_craft ( {
type = " fuel " ,
2018-12-31 19:46:27 +01:00
recipe = " df_farming:dead_fungus " ,
2017-03-16 09:18:32 +01:00
burntime = 2
} )
2017-03-11 21:29:06 +01:00
2018-12-31 19:46:27 +01:00
local c_dead_fungus = minetest.get_content_id ( " df_farming:dead_fungus " )
df_farming.spawn_dead_fungus_vm = function ( vi , area , data , param2_data )
data [ vi ] = c_dead_fungus
param2_data [ vi ] = 0
end
2017-03-16 22:23:23 +01:00
-- not DF canon
2018-12-31 19:46:27 +01:00
minetest.register_node ( " df_farming:cavern_fungi " , {
2017-03-16 22:23:23 +01:00
description = S ( " Cavern Fungi " ) ,
2018-12-31 19:46:27 +01:00
_doc_items_longdesc = df_farming.doc . cavern_fungi_desc ,
_doc_items_usagehelp = df_farming.doc . cavern_fungi_usage ,
2017-03-16 22:23:23 +01:00
drawtype = " plantlike " ,
tiles = { " dfcaverns_fungi.png " } ,
inventory_image = " dfcaverns_fungi.png " ,
paramtype = " light " ,
walkable = false ,
2019-11-11 05:47:10 +01:00
is_ground_content = false ,
2017-03-16 22:23:23 +01:00
buildable_to = true ,
2018-12-31 19:46:27 +01:00
floodable = true ,
2017-03-19 06:43:44 +01:00
light_source = 6 ,
2017-03-26 22:38:53 +02:00
groups = { snappy = 3 , flammable = 2 , plant = 1 , not_in_creative_inventory = 1 , attached_node = 1 , light_sensitive_fungus = 11 , flow_through = 1 } ,
2017-03-16 22:23:23 +01:00
sounds = default.node_sound_leaves_defaults ( ) ,
selection_box = {
type = " fixed " ,
fixed = { - 0.5 , - 0.5 , - 0.5 , 0.5 , 0.0 , 0.5 } ,
} ,
} )
minetest.register_craft ( {
type = " fuel " ,
2018-12-31 19:46:27 +01:00
recipe = " df_farming:cavern_fungi " ,
2017-03-16 22:23:23 +01:00
burntime = 2
} )
2018-12-31 19:46:27 +01:00
local c_cavern_fungi = minetest.get_content_id ( " df_farming:cavern_fungi " )
df_farming.spawn_cavern_fungi_vm = function ( vi , area , data , param2_data )
data [ vi ] = c_cavern_fungi
param2_data [ vi ] = 0
end
2017-03-16 22:23:23 +01:00
-----------------------------------------------------------------------------------------
2018-12-31 19:46:27 +01:00
local marginal = { [ " default:dirt " ] = true , [ " df_farming:dirt_with_cave_moss " ] = true , [ " df_farming:cobble_with_floor_fungus " ] = true }
local growable = { [ " farming:soil_wet " ] = true , [ " default:dirt " ] = true , [ " df_farming:dirt_with_cave_moss " ] = true , [ " df_farming:cobble_with_floor_fungus " ] = true }
2017-04-02 23:39:31 +02:00
2018-12-31 19:46:27 +01:00
df_farming.plant_timer = function ( pos , plantname , elapsed )
2017-04-02 23:39:31 +02:00
local next_stage_time = minetest.registered_nodes [ plantname ] . _dfcaverns_next_stage_time
if not next_stage_time then return end
next_stage_time = next_stage_time + math.random ( next_stage_time * - 0.1 , next_stage_time * 0.1 )
local below = minetest.get_node ( vector.add ( pos , { x = 0 , y =- 1 , z = 0 } ) )
if marginal [ below.name ] then
next_stage_time = next_stage_time * 5
end
if elapsed ~= nil then
minetest.get_node_timer ( pos ) : set ( next_stage_time , elapsed - next_stage_time )
else
minetest.get_node_timer ( pos ) : start ( next_stage_time )
end
end
2017-03-17 07:06:21 +01:00
local place_seed = function ( itemstack , placer , pointed_thing , plantname )
local pt = pointed_thing
-- check if pointing at a node
if not pt then
return itemstack
end
if pt.type ~= " node " then
return itemstack
end
local under = minetest.get_node ( pt.under )
local above = minetest.get_node ( pt.above )
if minetest.is_protected ( pt.under , placer : get_player_name ( ) ) then
minetest.record_protection_violation ( pt.under , placer : get_player_name ( ) )
return
end
if minetest.is_protected ( pt.above , placer : get_player_name ( ) ) then
minetest.record_protection_violation ( pt.above , placer : get_player_name ( ) )
return
end
-- return if any of the nodes is not registered
if not minetest.registered_nodes [ under.name ] then
return itemstack
end
if not minetest.registered_nodes [ above.name ] then
return itemstack
end
-- check if pointing at the top of the node
if pt.above . y ~= pt.under . y + 1 then
return itemstack
end
-- check if you can replace the node above the pointed node
if not minetest.registered_nodes [ above.name ] . buildable_to then
return itemstack
end
2017-04-02 23:39:31 +02:00
2017-03-17 07:06:21 +01:00
-- add the node and remove 1 item from the itemstack
minetest.add_node ( pt.above , { name = plantname , param2 = 1 } )
2018-12-31 19:46:27 +01:00
df_farming.plant_timer ( pt.above , plantname )
2017-03-17 07:06:21 +01:00
if not minetest.setting_getbool ( " creative_mode " ) then
itemstack : take_item ( )
end
return itemstack
end
2018-12-31 19:46:27 +01:00
df_farming.register_seed = function ( name , description , image , stage_one , grow_time , desc , usage )
2017-03-16 09:18:32 +01:00
local def = {
2017-03-12 04:22:03 +01:00
description = description ,
2017-09-10 20:24:22 +02:00
_doc_items_longdesc = desc ,
_doc_items_usagehelp = usage ,
2017-03-12 04:22:03 +01:00
tiles = { image } ,
inventory_image = image ,
2017-03-17 07:06:21 +01:00
wield_image = image ,
2017-03-12 04:22:03 +01:00
drawtype = " signlike " ,
2017-03-16 09:18:32 +01:00
paramtype2 = " wallmounted " ,
2017-10-20 03:53:22 +02:00
groups = { seed = 1 , snappy = 3 , attached_node = 1 , flammable = 2 , dfcaverns_cookable = 1 , digtron_on_place = 1 } ,
2017-03-16 09:18:32 +01:00
_dfcaverns_next_stage = stage_one ,
2017-04-02 23:39:31 +02:00
_dfcaverns_next_stage_time = grow_time ,
2017-03-12 04:22:03 +01:00
paramtype = " light " ,
walkable = false ,
2019-11-11 05:47:10 +01:00
is_ground_content = false ,
2018-12-31 19:46:27 +01:00
floodable = true ,
2017-03-12 04:22:03 +01:00
sunlight_propagates = true ,
selection_box = {
type = " fixed " ,
fixed = { - 0.5 , - 0.5 , - 0.5 , 0.5 , - 5 / 16 , 0.5 } ,
} ,
2017-04-02 23:39:31 +02:00
2017-03-17 07:06:21 +01:00
on_place = function ( itemstack , placer , pointed_thing )
2018-12-31 19:46:27 +01:00
return place_seed ( itemstack , placer , pointed_thing , " df_farming: " .. name )
2017-03-17 07:06:21 +01:00
end ,
2017-04-02 23:39:31 +02:00
on_timer = function ( pos , elapsed )
2018-12-31 19:46:27 +01:00
df_farming.grow_underground_plant ( pos , " df_farming: " .. name , elapsed )
2017-04-02 23:39:31 +02:00
end ,
2017-03-16 09:18:32 +01:00
}
2018-12-31 19:46:27 +01:00
minetest.register_node ( " df_farming: " .. name , def )
2017-03-16 09:18:32 +01:00
minetest.register_craft ( {
type = " fuel " ,
2018-12-31 19:46:27 +01:00
recipe = " df_farming: " .. name ,
2017-03-16 09:18:32 +01:00
burntime = 1
2017-03-12 04:22:03 +01:00
} )
end
2018-12-31 19:46:27 +01:00
df_farming.grow_underground_plant = function ( pos , plant_name , elapsed )
2017-04-02 23:39:31 +02:00
local node_def = minetest.registered_nodes [ plant_name ]
2017-03-16 22:55:53 +01:00
local next_stage = node_def._dfcaverns_next_stage
if next_stage then
2017-04-02 23:39:31 +02:00
local soil = minetest.get_node ( vector.add ( pos , { x = 0 , y =- 1 , z = 0 } ) ) . name
if growable [ soil ] then
local next_def = minetest.registered_nodes [ next_stage ]
local node = minetest.get_node ( pos )
minetest.swap_node ( pos , { name = next_stage , param2 = next_def.place_param2 or node.param2 } )
2018-12-31 19:46:27 +01:00
df_farming.plant_timer ( pos , next_stage , elapsed )
2017-04-02 23:39:31 +02:00
else
2018-12-31 19:46:27 +01:00
df_farming.plant_timer ( pos , plant_name ) -- reset timer, check again later
2017-03-16 09:18:32 +01:00
end
2017-04-02 23:39:31 +02:00
end
2017-03-16 09:18:32 +01:00
end
2017-03-16 22:26:14 +01:00
2018-12-31 19:46:27 +01:00
if df_farming.config . light_kills_fungus then
2017-03-16 22:26:14 +01:00
minetest.register_abm ( {
2018-12-31 19:46:27 +01:00
label = " df_farming:kill_light_sensitive_fungus " ,
2017-03-16 22:26:14 +01:00
nodenames = { " group:light_sensitive_fungus " } ,
catch_up = true ,
interval = 30 ,
chance = 5 ,
action = function ( pos , node )
local node_def = minetest.registered_nodes [ node.name ]
2019-02-27 04:21:12 +01:00
local light_sensitive_fungus_level = node_def.groups . light_sensitive_fungus
if not light_sensitive_fungus_level then return end -- This should never be the case, but I've received a report of it happening anyway so guarding against it.
2018-12-31 19:46:27 +01:00
local dead_node = node_def._dfcaverns_dead_node or " df_farming:dead_fungus "
2017-03-16 22:26:14 +01:00
-- 11 is the value adjacent to a torch
local light_level = minetest.get_node_light ( pos )
2019-02-27 04:21:12 +01:00
if light_level and light_level > light_sensitive_fungus_level then
2017-03-16 22:26:14 +01:00
minetest.set_node ( pos , { name = dead_node , param2 = node.param2 } )
end
end
} )
end