1 local S
= minetest
.get_translator("farming")
3 -- Wear out hoes, place soil
4 -- TODO Ignore group:flower
5 farming
.hoe_on_use
= function(itemstack
, user
, pointed_thing
, uses
)
6 local pt
= pointed_thing
7 -- check if pointing at a node
11 if pt
.type ~= "node" then
15 local under
= minetest
.get_node(pt
.under
)
16 local p
= {x
=pt
.under
.x
, y
=pt
.under
.y
+1, z
=pt
.under
.z
}
17 local above
= minetest
.get_node(p
)
19 -- return if any of the nodes is not registered
20 if not minetest
.registered_nodes
[under
.name
] then
23 if not minetest
.registered_nodes
[above
.name
] then
27 -- check if the node above the pointed thing is air
28 if above
.name
~= "air" then
32 -- check if pointing at soil
33 if minetest
.get_item_group(under
.name
, "soil") ~= 1 then
37 -- check if (wet) soil defined
38 local regN
= minetest
.registered_nodes
39 if regN
[under
.name
].soil
== nil or regN
[under
.name
].soil
.wet
== nil or regN
[under
.name
].soil
.dry
== nil then
43 -- turn the node into soil, wear out item and play sound
44 minetest
.set_node(pt
.under
, {name
= regN
[under
.name
].soil
.dry
})
45 minetest
.sound_play("default_dig_crumbly", {
50 if not minetest
.settings
:get_bool("creative_mode") then
51 itemstack
:add_wear(65535/(uses
-1))
57 farming
.register_hoe
= function(name
, def
)
58 -- Check for : prefix (register new hoes in your mod's namespace)
59 if name
:sub(1,1) ~= ":" then
63 if def
.description
== nil then
64 def
.description
= "Hoe"
66 if def
.inventory_image
== nil then
67 def
.inventory_image
= "unknown_item.png"
69 if def
.recipe
== nil then
72 {"","group:stick",""},
76 if def
.max_uses
== nil then
80 minetest
.register_tool(name
, {
81 description
= def
.description
,
82 _tt_help
= def
._tt_help
.. "\n" .. S("Uses: @1", def
.max_uses
),
83 inventory_image
= def
.inventory_image
,
84 on_use
= function(itemstack
, user
, pointed_thing
)
85 return farming
.hoe_on_use(itemstack
, user
, pointed_thing
, def
.max_uses
)
88 -- Register its recipe
89 if def
.material
== nil then
90 minetest
.register_craft({
96 if def
.material_handle
then
97 handle
= def
.material_handle
99 handle
= "group:stick"
101 minetest
.register_craft({
102 output
= name
:sub(2),
104 {def
.material
, def
.material
, ""},
113 farming
.place_seed
= function(itemstack
, placer
, pointed_thing
, plantname
)
114 local pt
= pointed_thing
115 -- check if pointing at a node
119 if pt
.type ~= "node" then
123 local under
= minetest
.get_node(pt
.under
)
124 local above
= minetest
.get_node(pt
.above
)
126 -- return if any of the nodes is not registered
127 if not minetest
.registered_nodes
[under
.name
] then
130 if not minetest
.registered_nodes
[above
.name
] then
134 -- check if pointing at the top of the node
135 if pt
.above
.y
~= pt
.under
.y
+1 then
139 -- check if you can replace the node above the pointed node
140 if not minetest
.registered_nodes
[above
.name
].buildable_to
then
144 -- check if pointing at soil
145 if minetest
.get_item_group(under
.name
, "soil") < 2 then
149 -- add the node and remove 1 item from the itemstack
150 minetest
.add_node(pt
.above
, {name
= plantname
, param2
= 1})
151 if not minetest
.settings
:get_bool("creative_mode") then
152 itemstack
:take_item()
158 farming
.register_plant
= function(name
, def
)
159 local mname
= name
:split(":")[1]
160 local pname
= name
:split(":")[2]
163 if not def
.description
then
164 def
.description
= "Seed"
166 if not def
.inventory_image
then
167 def
.inventory_image
= "unknown_item.png"
169 if not def
.steps
then
172 if not def
.minlight
then
175 if not def
.maxlight
then
178 if not def
.fertility
then
183 local g
= {seed
= 1, snappy
= 3, attached_node
= 1}
184 for k
, v
in pairs(def
.fertility
) do
187 minetest
.register_node(":" .. mname
.. ":seed_" .. pname
, {
188 description
= def
.description
,
189 _tt_help
= def
._tt_help
,
190 tiles
= {def
.inventory_image
, def
.inventory_image
, "blank.png"},
191 inventory_image
= def
.inventory_image
,
192 wield_image
= def
.inventory_image
,
193 drawtype
= "nodebox",
197 sunlight_propagates
= true,
200 fixed
= {-0.5, -0.5, -0.5, 0.5, -31/64, 0.5},
204 fixed
= {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
206 fertility
= def
.fertility
,
207 on_place
= function(itemstack
, placer
, pointed_thing
)
208 return farming
.place_seed(itemstack
, placer
, pointed_thing
, mname
.. ":seed_" .. pname
)
213 minetest
.register_craftitem(":" .. mname
.. ":" .. pname
, {
214 description
= def
.description_harvest
,
215 groups
= { food
= 1, eatable
= def
.food_points
},
216 on_use
= minetest
.item_eat(def
.food_points
),
217 inventory_image
= mname
.. "_" .. pname
.. ".png",
220 -- Register growing steps
224 {items
= {mname
.. ":seed_" .. pname
}, rarity
= 4 - i
},
225 {items
= {mname
.. ":seed_" .. pname
}, rarity
= 8 - i
* 2},
226 {items
= {mname
.. ":" .. pname
}, rarity
= 4 - i
},
227 {items
= {mname
.. ":" .. pname
}, rarity
= 6 - i
},
228 {items
= {mname
.. ":" .. pname
}, rarity
= 8 - i
* 2},
229 {items
= {mname
.. ":" .. pname
}, rarity
= 9 - i
* 2},
232 local nodegroups
= {snappy
= 3, flammable
= 2, plant
= 1, not_in_creative_inventory
= 1, attached_node
= 1}
233 nodegroups
[pname
] = i
234 if pname
== "corn" then
235 minetest
.register_node(mname
.. ":" .. pname
.. "_" .. i
, {
236 drawtype
= "plantlike",
239 tiles
= {mname
.. "_" .. pname
.. "_" .. i
.. ".png"},
243 is_ground_content
= true,
247 fixed
= {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
250 sounds
= hades_sounds
.node_sound_leaves_defaults(),
252 elseif pname
== "beens" then
253 minetest
.register_node(mname
.. ":" .. pname
.. "_" .. i
, {
254 drawtype
= "plantlike",
257 tiles
= {mname
.. "_" .. pname
.. "_" .. i
.. ".png"},
261 is_ground_content
= true,
265 fixed
= {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
268 sounds
= hades_sounds
.node_sound_leaves_defaults(),
271 minetest
.register_node(mname
.. ":" .. pname
.. "_" .. i
, {
272 drawtype
= "plantlike",
273 tiles
= {mname
.. "_" .. pname
.. "_" .. i
.. ".png"},
277 is_ground_content
= true,
281 fixed
= {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
284 sounds
= hades_sounds
.node_sound_leaves_defaults(),
290 minetest
.register_abm({
291 label
= "Grow seeds",
292 nodenames
= {"group:" .. pname
, "group:seed"},
293 neighbors
= {"group:soil"},
296 action
= function(pos
, node
)
297 local plant_height
= minetest
.get_item_group(node
.name
, pname
)
299 -- return if already full grown
300 if plant_height
== def
.steps
then
304 local node_def
= minetest
.registered_items
[node
.name
] or nil
307 if minetest
.get_item_group(node
.name
, "seed") and node_def
.fertility
then
308 local can_grow
= false
309 local soil_node
= minetest
.get_node_or_nil({x
= pos
.x
, y
= pos
.y
- 1, z
= pos
.z
})
310 if not soil_node
then
313 for _
, v
in pairs(node_def
.fertility
) do
314 if minetest
.get_item_group(soil_node
.name
, v
) ~= 0 then
319 minetest
.set_node(pos
, {name
= node
.name
:gsub("seed_", "") .. "_1"})
324 -- check if on wet soil
326 local n
= minetest
.get_node(pos
)
327 if minetest
.get_item_group(n
.name
, "soil") < 3 then
333 local ll
= minetest
.get_node_light(pos
)
335 if not ll
or ll
< def
.minlight
or ll
> def
.maxlight
then
340 minetest
.set_node(pos
, {name
= mname
.. ":" .. pname
.. "_" .. plant_height
+ 1})
346 seed
= mname
.. ":seed_" .. pname
,
347 harvest
= mname
.. ":" .. pname