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
.is_creative_enabled(user
:get_player_name()) 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 minetest
.sound_play({name
="default_place_node", gain
=1.0}, {pos
=pt
.under
})
151 -- add the node and remove 1 item from the itemstack
152 minetest
.add_node(pt
.above
, {name
= plantname
, param2
= 1})
153 if not minetest
.is_creative_enabled(placer
:get_player_name()) then
154 itemstack
:take_item()
160 farming
.register_plant
= function(name
, def
)
161 local mname
= name
:split(":")[1]
162 local pname
= name
:split(":")[2]
165 if not def
.description
then
166 def
.description
= "Seed"
168 if not def
.inventory_image
then
169 def
.inventory_image
= "unknown_item.png"
171 if not def
.steps
then
174 if not def
.minlight
then
177 if not def
.maxlight
then
180 if not def
.fertility
then
185 local g
= {seed
= 1, snappy
= 3, attached_node
= 1}
186 for k
, v
in pairs(def
.fertility
) do
189 minetest
.register_node(":" .. mname
.. ":seed_" .. pname
, {
190 description
= def
.description
,
191 _tt_help
= def
._tt_help
,
192 tiles
= {def
.inventory_image
, def
.inventory_image
, "blank.png"},
193 inventory_image
= def
.inventory_image
,
194 wield_image
= def
.inventory_image
,
195 drawtype
= "nodebox",
200 sunlight_propagates
= true,
203 fixed
= {-0.5, -0.5, -0.5, 0.5, -31/64, 0.5},
207 fixed
= {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
209 fertility
= def
.fertility
,
210 on_place
= function(itemstack
, placer
, pointed_thing
)
211 return farming
.place_seed(itemstack
, placer
, pointed_thing
, mname
.. ":seed_" .. pname
)
216 minetest
.register_craftitem(":" .. mname
.. ":" .. pname
, {
217 description
= def
.description_harvest
,
218 groups
= { food
= 1, eatable
= def
.food_points
},
219 on_use
= minetest
.item_eat(def
.food_points
),
220 inventory_image
= mname
.. "_" .. pname
.. ".png",
223 -- Register growing steps
227 {items
= {mname
.. ":seed_" .. pname
}, rarity
= 4 - i
},
228 {items
= {mname
.. ":seed_" .. pname
}, rarity
= 8 - i
* 2},
229 {items
= {mname
.. ":" .. pname
}, rarity
= 4 - i
},
230 {items
= {mname
.. ":" .. pname
}, rarity
= 6 - i
},
231 {items
= {mname
.. ":" .. pname
}, rarity
= 8 - i
* 2},
232 {items
= {mname
.. ":" .. pname
}, rarity
= 9 - i
* 2},
235 local nodegroups
= {snappy
= 3, flammable
= 2, plant
= 1, not_in_creative_inventory
= 1, attached_node
= 1}
236 nodegroups
[pname
] = i
237 if pname
== "corn" then
238 minetest
.register_node(mname
.. ":" .. pname
.. "_" .. i
, {
239 drawtype
= "plantlike",
242 tiles
= {mname
.. "_" .. pname
.. "_" .. i
.. ".png"},
247 is_ground_content
= true,
251 fixed
= {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
254 sounds
= hades_sounds
.node_sound_leaves_defaults(),
256 elseif pname
== "beens" then
257 minetest
.register_node(mname
.. ":" .. pname
.. "_" .. i
, {
258 drawtype
= "plantlike",
261 tiles
= {mname
.. "_" .. pname
.. "_" .. i
.. ".png"},
266 is_ground_content
= true,
270 fixed
= {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
273 sounds
= hades_sounds
.node_sound_leaves_defaults(),
276 minetest
.register_node(mname
.. ":" .. pname
.. "_" .. i
, {
277 drawtype
= "plantlike",
278 tiles
= {mname
.. "_" .. pname
.. "_" .. i
.. ".png"},
283 is_ground_content
= true,
287 fixed
= {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
290 sounds
= hades_sounds
.node_sound_leaves_defaults(),
296 minetest
.register_abm({
297 label
= "Grow seeds",
298 nodenames
= {"group:" .. pname
, "group:seed"},
299 neighbors
= {"group:soil"},
302 action
= function(pos
, node
)
303 local plant_height
= minetest
.get_item_group(node
.name
, pname
)
305 -- return if already full grown
306 if plant_height
== def
.steps
then
310 local node_def
= minetest
.registered_items
[node
.name
] or nil
313 if minetest
.get_item_group(node
.name
, "seed") and node_def
.fertility
then
314 local can_grow
= false
315 local soil_node
= minetest
.get_node_or_nil({x
= pos
.x
, y
= pos
.y
- 1, z
= pos
.z
})
316 if not soil_node
then
319 for _
, v
in pairs(node_def
.fertility
) do
320 if minetest
.get_item_group(soil_node
.name
, v
) ~= 0 then
325 minetest
.set_node(pos
, {name
= node
.name
:gsub("seed_", "") .. "_1"})
330 -- check if on wet soil
332 local n
= minetest
.get_node(pos
)
333 if minetest
.get_item_group(n
.name
, "soil") < 3 then
339 local ll
= minetest
.get_node_light(pos
)
341 if not ll
or ll
< def
.minlight
or ll
> def
.maxlight
then
346 minetest
.set_node(pos
, {name
= mname
.. ":" .. pname
.. "_" .. plant_height
+ 1})
352 seed
= mname
.. ":seed_" .. pname
,
353 harvest
= mname
.. ":" .. pname