1 -- Wear out hoes, place soil
2 -- TODO Ignore group:flower
3 farming
.hoe_on_use
= function(itemstack
, user
, pointed_thing
, uses
)
4 local pt
= pointed_thing
5 -- check if pointing at a node
9 if pt
.type ~= "node" then
13 local under
= minetest
.get_node(pt
.under
)
14 local p
= {x
=pt
.under
.x
, y
=pt
.under
.y
+1, z
=pt
.under
.z
}
15 local above
= minetest
.get_node(p
)
17 -- return if any of the nodes is not registered
18 if not minetest
.registered_nodes
[under
.name
] then
21 if not minetest
.registered_nodes
[above
.name
] then
25 -- check if the node above the pointed thing is air
26 if above
.name
~= "air" then
30 -- check if pointing at soil
31 if minetest
.get_item_group(under
.name
, "soil") ~= 1 then
35 -- check if (wet) soil defined
36 local regN
= minetest
.registered_nodes
37 if regN
[under
.name
].soil
== nil or regN
[under
.name
].soil
.wet
== nil or regN
[under
.name
].soil
.dry
== nil then
41 -- turn the node into soil, wear out item and play sound
42 minetest
.set_node(pt
.under
, {name
= regN
[under
.name
].soil
.dry
})
43 minetest
.sound_play("default_dig_crumbly", {
48 if not minetest
.settings
:get_bool("creative_mode") then
49 itemstack
:add_wear(65535/(uses
-1))
55 farming
.register_hoe
= function(name
, def
)
56 -- Check for : prefix (register new hoes in your mod's namespace)
57 if name
:sub(1,1) ~= ":" then
61 if def
.description
== nil then
62 def
.description
= "Hoe"
64 if def
.inventory_image
== nil then
65 def
.inventory_image
= "unknown_item.png"
67 if def
.recipe
== nil then
70 {"","group:stick",""},
74 if def
.max_uses
== nil then
78 minetest
.register_tool(name
, {
79 description
= def
.description
,
80 inventory_image
= def
.inventory_image
,
81 on_use
= function(itemstack
, user
, pointed_thing
)
82 return farming
.hoe_on_use(itemstack
, user
, pointed_thing
, def
.max_uses
)
85 -- Register its recipe
86 if def
.material
== nil then
87 minetest
.register_craft({
93 if def
.material_handle
then
94 handle
= def
.material_handle
96 handle
= "group:stick"
98 minetest
.register_craft({
101 {def
.material
, def
.material
, ""},
110 farming
.place_seed
= function(itemstack
, placer
, pointed_thing
, plantname
)
111 local pt
= pointed_thing
112 -- check if pointing at a node
116 if pt
.type ~= "node" then
120 local under
= minetest
.get_node(pt
.under
)
121 local above
= minetest
.get_node(pt
.above
)
123 -- return if any of the nodes is not registered
124 if not minetest
.registered_nodes
[under
.name
] then
127 if not minetest
.registered_nodes
[above
.name
] then
131 -- check if pointing at the top of the node
132 if pt
.above
.y
~= pt
.under
.y
+1 then
136 -- check if you can replace the node above the pointed node
137 if not minetest
.registered_nodes
[above
.name
].buildable_to
then
141 -- check if pointing at soil
142 if minetest
.get_item_group(under
.name
, "soil") < 2 then
146 -- add the node and remove 1 item from the itemstack
147 minetest
.add_node(pt
.above
, {name
= plantname
, param2
= 1})
148 if not minetest
.settings
:get_bool("creative_mode") then
149 itemstack
:take_item()
155 farming
.register_plant
= function(name
, def
)
156 local mname
= name
:split(":")[1]
157 local pname
= name
:split(":")[2]
160 if not def
.description
then
161 def
.description
= "Seed"
163 if not def
.inventory_image
then
164 def
.inventory_image
= "unknown_item.png"
166 if not def
.steps
then
169 if not def
.minlight
then
172 if not def
.maxlight
then
175 if not def
.fertility
then
180 local g
= {seed
= 1, snappy
= 3, attached_node
= 1}
181 for k
, v
in pairs(def
.fertility
) do
184 minetest
.register_node(":" .. mname
.. ":seed_" .. pname
, {
185 description
= def
.description
,
186 tiles
= {def
.inventory_image
},
187 inventory_image
= def
.inventory_image
,
188 wield_image
= def
.inventory_image
,
189 drawtype
= "signlike",
192 paramtype2
= "wallmounted",
194 sunlight_propagates
= true,
197 fixed
= {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
199 fertility
= def
.fertility
,
200 on_place
= function(itemstack
, placer
, pointed_thing
)
201 return farming
.place_seed(itemstack
, placer
, pointed_thing
, mname
.. ":seed_" .. pname
)
206 minetest
.register_craftitem(":" .. mname
.. ":" .. pname
, {
207 description
= def
.description_harvest
,
208 groups
= { food
= 1, eatable
= def
.food_points
},
209 on_use
= minetest
.item_eat(def
.food_points
),
210 inventory_image
= mname
.. "_" .. pname
.. ".png",
213 -- Register growing steps
217 {items
= {mname
.. ":seed_" .. pname
}, rarity
= 4 - i
},
218 {items
= {mname
.. ":seed_" .. pname
}, rarity
= 8 - i
* 2},
219 {items
= {mname
.. ":" .. pname
}, rarity
= 4 - i
},
220 {items
= {mname
.. ":" .. pname
}, rarity
= 6 - i
},
221 {items
= {mname
.. ":" .. pname
}, rarity
= 8 - i
* 2},
222 {items
= {mname
.. ":" .. pname
}, rarity
= 9 - i
* 2},
225 local nodegroups
= {snappy
= 3, flammable
= 2, plant
= 1, not_in_creative_inventory
= 1, attached_node
= 1}
226 nodegroups
[pname
] = i
227 if pname
== "corn" then
228 minetest
.register_node(mname
.. ":" .. pname
.. "_" .. i
, {
229 drawtype
= "plantlike",
232 tiles
= {mname
.. "_" .. pname
.. "_" .. i
.. ".png"},
236 is_ground_content
= true,
240 fixed
= {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
243 sounds
= hades_sounds
.node_sound_leaves_defaults(),
245 elseif pname
== "beens" then
246 minetest
.register_node(mname
.. ":" .. pname
.. "_" .. i
, {
247 drawtype
= "plantlike",
250 tiles
= {mname
.. "_" .. pname
.. "_" .. i
.. ".png"},
254 is_ground_content
= true,
258 fixed
= {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
261 sounds
= hades_sounds
.node_sound_leaves_defaults(),
264 minetest
.register_node(mname
.. ":" .. pname
.. "_" .. i
, {
265 drawtype
= "plantlike",
266 tiles
= {mname
.. "_" .. pname
.. "_" .. i
.. ".png"},
270 is_ground_content
= true,
274 fixed
= {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
277 sounds
= hades_sounds
.node_sound_leaves_defaults(),
283 minetest
.register_abm({
284 label
= "Grow seeds",
285 nodenames
= {"group:" .. pname
, "group:seed"},
286 neighbors
= {"group:soil"},
289 action
= function(pos
, node
)
290 local plant_height
= minetest
.get_item_group(node
.name
, pname
)
292 -- return if already full grown
293 if plant_height
== def
.steps
then
297 local node_def
= minetest
.registered_items
[node
.name
] or nil
300 if minetest
.get_item_group(node
.name
, "seed") and node_def
.fertility
then
301 local can_grow
= false
302 local soil_node
= minetest
.get_node_or_nil({x
= pos
.x
, y
= pos
.y
- 1, z
= pos
.z
})
303 if not soil_node
then
306 for _
, v
in pairs(node_def
.fertility
) do
307 if minetest
.get_item_group(soil_node
.name
, v
) ~= 0 then
312 minetest
.set_node(pos
, {name
= node
.name
:gsub("seed_", "") .. "_1"})
317 -- check if on wet soil
319 local n
= minetest
.get_node(pos
)
320 if minetest
.get_item_group(n
.name
, "soil") < 3 then
326 local ll
= minetest
.get_node_light(pos
)
328 if not ll
or ll
< def
.minlight
or ll
> def
.maxlight
then
333 minetest
.set_node(pos
, {name
= mname
.. ":" .. pname
.. "_" .. plant_height
+ 1})
339 seed
= mname
.. ":seed_" .. pname
,
340 harvest
= mname
.. ":" .. pname