123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491 |
- -- Minetest 0.4 mod: farming
- -- See README.txt for licensing and other information.
- farming = {}
- --
- -- Soil
- --
- minetest.register_node("farming:soil", {
- description = "Soil",
- tiles = {"farming_soil.png", "default_dirt.png"},
- drop = "default:dirt",
- is_ground_content = true,
- groups = {crumbly=3, not_in_creative_inventory=1, soil=2},
- sounds = default.node_sound_dirt_defaults(),
- })
- minetest.register_node("farming:soil_wet", {
- description = "Wet Soil",
- tiles = {"farming_soil_wet.png", "farming_soil_wet_side.png"},
- drop = "default:dirt",
- is_ground_content = true,
- groups = {crumbly=3, not_in_creative_inventory=1, soil=3},
- sounds = default.node_sound_dirt_defaults(),
- })
- minetest.register_abm({
- nodenames = {"farming:soil", "farming:soil_wet"},
- interval = 15,
- chance = 4,
- action = function(pos, node)
- pos.y = pos.y+1
- local nn = minetest.get_node(pos).name
- pos.y = pos.y-1
- if minetest.registered_nodes[nn] and
- minetest.registered_nodes[nn].walkable and
- minetest.get_item_group(nn, "plant") == 0
- then
- minetest.set_node(pos, {name="default:dirt"})
- end
- -- check if there is water nearby
- if minetest.find_node_near(pos, 3, {"group:water"}) then
- -- if it is dry soil turn it into wet soil
- if node.name == "farming:soil" then
- minetest.set_node(pos, {name="farming:soil_wet"})
- end
- else
- -- turn it back into dirt if it is already dry
- if node.name == "farming:soil" then
- -- only turn it back if there is no plant on top of it
- if minetest.get_item_group(nn, "plant") == 0 then
- minetest.set_node(pos, {name="default:dirt"})
- end
- -- if its wet turn it back into dry soil
- elseif node.name == "farming:soil_wet" then
- minetest.set_node(pos, {name="farming:soil"})
- end
- end
- end,
- })
- --
- -- Hoes
- --
- -- turns nodes with group soil=1 into soil
- function farming.hoe_on_use(itemstack, user, pointed_thing, uses)
- local pt = pointed_thing
- -- check if pointing at a node
- if not pt then
- return
- end
- if pt.type ~= "node" then
- return
- end
- local under = minetest.get_node(pt.under)
- local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z}
- local above = minetest.get_node(p)
- -- return if any of the nodes is not registered
- if not minetest.registered_nodes[under.name] then
- return
- end
- if not minetest.registered_nodes[above.name] then
- return
- end
- -- check if the node above the pointed thing is air
- if above.name ~= "air" then
- return
- end
- -- check if pointing at dirt
- if minetest.get_item_group(under.name, "soil") ~= 1 then
- return
- end
- -- turn the node into soil, wear out item and play sound
- minetest.set_node(pt.under, {name="farming:soil"})
- minetest.sound_play("default_dig_crumbly", {
- pos = pt.under,
- gain = 0.5,
- })
- itemstack:add_wear(65535/(uses-1))
- return itemstack
- end
- minetest.register_tool("farming:hoe_wood", {
- description = "Wooden Hoe",
- inventory_image = "farming_tool_woodhoe.png",
- on_use = function(itemstack, user, pointed_thing)
- return farming.hoe_on_use(itemstack, user, pointed_thing, 30)
- end,
- })
- minetest.register_tool("farming:hoe_stone", {
- description = "Stone Hoe",
- inventory_image = "farming_tool_stonehoe.png",
- on_use = function(itemstack, user, pointed_thing)
- return farming.hoe_on_use(itemstack, user, pointed_thing, 90)
- end,
- })
- minetest.register_tool("farming:hoe_steel", {
- description = "Steel Hoe",
- inventory_image = "farming_tool_steelhoe.png",
- on_use = function(itemstack, user, pointed_thing)
- return farming.hoe_on_use(itemstack, user, pointed_thing, 200)
- end,
- })
- minetest.register_tool("farming:hoe_bronze", {
- description = "Bronze Hoe",
- inventory_image = "farming_tool_bronzehoe.png",
- on_use = function(itemstack, user, pointed_thing)
- return farming.hoe_on_use(itemstack, user, pointed_thing, 220)
- end,
- })
- minetest.register_craft({
- output = "farming:hoe_wood",
- recipe = {
- {"group:wood", "group:wood"},
- {"", "group:stick"},
- {"", "group:stick"},
- }
- })
- minetest.register_craft({
- output = "farming:hoe_stone",
- recipe = {
- {"group:stone", "group:stone"},
- {"", "group:stick"},
- {"", "group:stick"},
- }
- })
- minetest.register_craft({
- output = "farming:hoe_steel",
- recipe = {
- {"default:steel_ingot", "default:steel_ingot"},
- {"", "group:stick"},
- {"", "group:stick"},
- }
- })
- minetest.register_craft({
- output = "farming:hoe_bronze",
- recipe = {
- {"default:bronze_ingot", "default:bronze_ingot"},
- {"", "group:stick"},
- {"", "group:stick"},
- }
- })
- --
- -- Override grass for drops
- --
- minetest.override_item("default:grass_1", {
- drop = {
- max_items = 1,
- items = {
- {items = {'farming:seed_wheat'},rarity = 7},
- {items = {'farming:seed_cotton'},rarity = 7},
- {items = {'default:grass_1'}},
- }
- }
- })
- for i=2,5 do
- minetest.override_item("default:grass_"..i, {
- drop = {
- max_items = 1,
- items = {
- {items = {'farming:seed_wheat'},rarity = 7},
- {items = {'farming:seed_cotton'},rarity = 7},
- {items = {'default:grass_1'}},
- }
- }
- })
- end
- minetest.register_node(":default:junglegrass", {
- description = "Jungle Grass",
- drawtype = "plantlike",
- visual_scale = 1.3,
- tiles = {"default_junglegrass.png"},
- inventory_image = "default_junglegrass.png",
- wield_image = "default_junglegrass.png",
- paramtype = "light",
- waving = 1,
- walkable = false,
- buildable_to = true,
- is_ground_content = true,
- drop = {
- max_items = 1,
- items = {
- {items = {'farming:seed_cotton'},rarity = 8},
- {items = {'default:junglegrass'}},
- }
- },
- groups = {snappy=3,flammable=2,flora=1,attached_node=1},
- sounds = default.node_sound_leaves_defaults(),
- selection_box = {
- type = "fixed",
- fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
- },
- })
- --
- -- Place seeds
- --
- local function place_seed(itemstack, placer, pointed_thing, plantname)
- local pt = pointed_thing
- -- check if pointing at a node
- if not pt then
- return
- end
- if pt.type ~= "node" then
- return
- end
- local under = minetest.get_node(pt.under)
- local above = minetest.get_node(pt.above)
- -- return if any of the nodes is not registered
- if not minetest.registered_nodes[under.name] then
- return
- end
- if not minetest.registered_nodes[above.name] then
- return
- end
- -- check if pointing at the top of the node
- if pt.above.y ~= pt.under.y+1 then
- return
- end
- -- check if you can replace the node above the pointed node
- if not minetest.registered_nodes[above.name].buildable_to then
- return
- end
- -- check if pointing at soil
- if minetest.get_item_group(under.name, "soil") <= 1 then
- return
- end
- -- add the node and remove 1 item from the itemstack
- minetest.add_node(pt.above, {name=plantname})
- if not minetest.setting_getbool("creative_mode") then
- itemstack:take_item()
- end
- return itemstack
- end
- --
- -- Wheat
- --
- minetest.register_craftitem("farming:seed_wheat", {
- description = "Wheat Seed",
- inventory_image = "farming_wheat_seed.png",
- on_place = function(itemstack, placer, pointed_thing)
- return place_seed(itemstack, placer, pointed_thing, "farming:wheat_1")
- end,
- })
- minetest.register_craftitem("farming:wheat", {
- description = "Wheat",
- inventory_image = "farming_wheat.png",
- })
- minetest.register_craftitem("farming:flour", {
- description = "Flour",
- inventory_image = "farming_flour.png",
- })
- minetest.register_craftitem("farming:bread", {
- description = "Bread",
- inventory_image = "farming_bread.png",
- on_use = minetest.item_eat(4),
- })
- minetest.register_craft({
- type = "shapeless",
- output = "farming:flour",
- recipe = {"farming:wheat", "farming:wheat", "farming:wheat", "farming:wheat"}
- })
- minetest.register_craft({
- type = "cooking",
- cooktime = 15,
- output = "farming:bread",
- recipe = "farming:flour"
- })
- for i=1,8 do
- local drop = {
- items = {
- {items = {'farming:wheat'},rarity=9-i},
- {items = {'farming:wheat'},rarity=18-i*2},
- {items = {'farming:seed_wheat'},rarity=9-i},
- {items = {'farming:seed_wheat'},rarity=18-i*2},
- }
- }
- minetest.register_node("farming:wheat_"..i, {
- drawtype = "plantlike",
- tiles = {"farming_wheat_"..i..".png"},
- paramtype = "light",
- waving = 1,
- walkable = false,
- buildable_to = true,
- is_ground_content = true,
- drop = drop,
- selection_box = {
- type = "fixed",
- fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
- },
- groups = {snappy=3,flammable=2,plant=1,wheat=i,not_in_creative_inventory=1,attached_node=1},
- sounds = default.node_sound_leaves_defaults(),
- })
- end
- minetest.register_abm({
- nodenames = {"group:wheat"},
- neighbors = {"group:soil"},
- interval = 60,
- chance = 20,
- action = function(pos, node)
- -- return if already full grown
- if minetest.get_item_group(node.name, "wheat") == 8 then
- return
- end
- -- check if on wet soil
- pos.y = pos.y-1
- local n = minetest.get_node(pos)
- if minetest.get_item_group(n.name, "soil") < 3 then
- return
- end
- pos.y = pos.y+1
- -- check light
- local light_level = minetest.get_node_light(pos)
- if not light_level then
- return
- end
- local c = math.ceil(2 * (light_level - 13) ^ 2 + 1)
- if light_level > 7 and (math.random(1, c) == 1 or light_level >= 13) then
- local height = minetest.get_item_group(node.name, "wheat") + 1
- minetest.set_node(pos, {name="farming:wheat_" .. height})
- end
- end
- })
- --
- -- Cotton
- --
- minetest.register_craftitem("farming:seed_cotton", {
- description = "Cotton Seed",
- inventory_image = "farming_cotton_seed.png",
- on_place = function(itemstack, placer, pointed_thing)
- return place_seed(itemstack, placer, pointed_thing, "farming:cotton_1")
- end,
- })
- minetest.register_craftitem("farming:string", {
- description = "String",
- inventory_image = "farming_string.png",
- })
- minetest.register_craft({
- output = "wool:white",
- recipe = {
- {"farming:string", "farming:string"},
- {"farming:string", "farming:string"},
- }
- })
- for i=1,8 do
- local drop = {
- items = {
- {items = {'farming:string'},rarity=9-i},
- {items = {'farming:string'},rarity=18-i*2},
- {items = {'farming:string'},rarity=27-i*3},
- {items = {'farming:seed_cotton'},rarity=9-i},
- {items = {'farming:seed_cotton'},rarity=18-i*2},
- {items = {'farming:seed_cotton'},rarity=27-i*3},
- }
- }
- minetest.register_node("farming:cotton_"..i, {
- drawtype = "plantlike",
- tiles = {"farming_cotton_"..i..".png"},
- paramtype = "light",
- waving = 1,
- walkable = false,
- buildable_to = true,
- is_ground_content = true,
- drop = drop,
- selection_box = {
- type = "fixed",
- fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
- },
- groups = {snappy=3,flammable=2,plant=1,cotton=i,not_in_creative_inventory=1,attached_node=1},
- sounds = default.node_sound_leaves_defaults(),
- })
- end
- minetest.register_abm({
- nodenames = {"group:cotton"},
- neighbors = {"group:soil"},
- interval = 60,
- chance = 20,
- action = function(pos, node)
- -- return if already full grown
- if minetest.get_item_group(node.name, "cotton") == 8 then
- return
- end
- -- check if on wet soil
- pos.y = pos.y-1
- local n = minetest.get_node(pos)
- if minetest.get_item_group(n.name, "soil") < 3 then
- return
- end
- pos.y = pos.y+1
- -- check light
- local light_level = minetest.get_node_light(pos)
- if not light_level then
- return
- end
- local c = math.ceil(2 * (light_level - 13) ^ 2 + 1)
- if light_level > 7 and (math.random(1, c) == 1 or light_level >= 13) then
- local height = minetest.get_item_group(node.name, "cotton") + 1
- minetest.set_node(pos, {name="farming:cotton_"..height})
- end
- end
- })
- minetest.register_node("farming:straw", {
- description = "Straw",
- tiles = {"farming_straw.png"},
- is_ground_content = false,
- groups = {snappy=3, flammable=4, fall_damage_add_percent=-30},
- sounds = default.node_sound_leaves_defaults(),
- })
- minetest.register_craft({
- output = "farming:straw 3",
- recipe = {
- {"farming:wheat", "farming:wheat", "farming:wheat"},
- {"farming:wheat", "farming:wheat", "farming:wheat"},
- {"farming:wheat", "farming:wheat", "farming:wheat"},
- }
- })
- minetest.register_craft({
- output = "farming:wheat 3",
- recipe = {
- {"farming:straw"},
- }
- })
|