diff options
Diffstat (limited to 'melon.lua')
-rw-r--r-- | melon.lua | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/melon.lua b/melon.lua new file mode 100644 index 0000000..014335a --- /dev/null +++ b/melon.lua @@ -0,0 +1,191 @@ + +-- FIXME - timers!!! + +local faces = { + [1] = { x = -1, z = 0, r = 3, o = 1 } , + [2] = { x = 1, z = 0, r = 1, o = 3 } , + [3] = { x = 0, z = -1, r = 2, o = 0 } , + [4] = { x = 0, z = 1, r = 0, o = 2 } +} + +minetest.register_node("crops:melon_seed", { + description = "melon seed", + inventory_image = "crops_melon_seed.png", + tiles = { "crops_melon_plant_1.png" }, + drawtype = "plantlike", + sunlight_propagates = false, + use_texture_alpha = true, + walkable = false, + paramtype = "light", + groups = { snappy=3,flammable=3,flora=1,attached_node=1 }, + + on_place = function(itemstack, placer, pointed_thing) + local under = minetest.get_node(pointed_thing.under) + if minetest.get_item_group(under.name, "soil") <= 1 then + return + end + minetest.set_node(pointed_thing.above, {name="crops:melon_plant_1"}) + itemstack:take_item() + return itemstack + end +}) + +for stage = 1, 5 do +minetest.register_node("crops:melon_plant_" .. stage , { + description = "melon plant", + tiles = { "crops_melon_plant_" .. stage .. ".png" }, + drawtype = "plantlike", + sunlight_propagates = true, + use_texture_alpha = true, + walkable = false, + paramtype = "light", + groups = { snappy=3, flammable=3, flora=1, attached_node=1, not_in_creative_inventory=1 }, + drop = "crops:melon_seed", + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.5 + (((3 * stage) + 1) / 16), 0.5} + } +}) +end + +minetest.register_node("crops:melon_plant_5_attached", { + visual = "mesh", + mesh = "crops_plant_extra_face.obj", + description = "melon plant", + tiles = { "crops_melon_stem.png", "crops_melon_plant_5.png" }, + drawtype = "mesh", + paramtype2 = "facedir", + sunlight_propagates = true, + use_texture_alpha = true, + walkable = false, + paramtype = "light", + groups = { snappy=3, flammable=3, flora=1, attached_node=1, }, + drop = "crops:melon_seed", +}) + + +minetest.register_craftitem("crops:melon_slice", { + description = "Melon slice", + inventory_image = "crops_melon_slice.png", + on_use = minetest.item_eat(1) +}) + +minetest.register_craft({ + type = "shapeless", + output = "crops:melon_seed", + recipe = { "crops:melon_slice" } +}) + +-- +-- the melon "block" +-- +minetest.register_node("crops:melon", { + description = "Melon", + inventory_image = "crops_melon_inv.png", + tiles = { "crops_melon_top.png", "crops_melon_bottom.png", "crops_melon.png", "crops_melon.png", "crops_melon.png", "crops_melon.png" }, + sunlight_propagates = false, + use_texture_alpha = false, + walkable = true, + groups = { snappy=3, flammable=3, oddly_breakable_by_hand=2 }, + drop = {max_items = 5, items = { + { items = {'crops:melon_slice'}, rarity = 1 }, + { items = {'crops:melon_slice'}, rarity = 1 }, + { items = {'crops:melon_slice'}, rarity = 1 }, + { items = {'crops:melon_slice'}, rarity = 2 }, + { items = {'crops:melon_slice'}, rarity = 5 }, + }}, + sounds = default.node_sound_wood_defaults({ + dig = { name = "default_dig_oddly_breakable_by_hand" }, + dug = { name = "default_dig_choppy" } + }), + on_dig = function(pos, node, digger) + local code = minetest.node_dig(pos, node, digger) + for face = 1, 4 do + local s = { x = pos.x + faces[face].x, y = pos.y, z = pos.z + faces[face].z } + local n = minetest.get_node(s) + if n.name == "crops:melon_plant_5_attached" then + -- make sure it was actually attached to this stem + if n.param2 == faces[face].o then + minetest.set_node(s, { name = "crops:melon_plant_5" }) + return code + end + end + end + return code + end +}) + +-- +-- grows a plant to mature size +-- +minetest.register_abm({ + nodenames = { "crops:melon_plant_1", "crops:melon_plant_2", "crops:melon_plant_3","crops:melon_plant_4" }, + interval = 30, + chance = 10, + action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.get_node_light(pos, nil) < 13 then + return + end + local n = string.gsub(node.name, "4", "5") + n = string.gsub(n, "3", "4") + n = string.gsub(n, "2", "3") + n = string.gsub(n, "1", "2") + minetest.set_node(pos, { name = n }) + end +}) + +-- +-- grows a melon +-- +minetest.register_abm({ + nodenames = { "crops:melon_plant_5" }, + interval = 30, + chance = 10, + action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.get_node_light(pos, nil) < 13 then + return + end + for face = 1, 4 do + local t = { x = pos.x + faces[face].x, y = pos.y, z = pos.z + faces[face].z } + if minetest.get_node(t).name == "crops:melon" then + return + end + end + local r = math.random(1, 4) + local t = { x = pos.x + faces[r].x, y = pos.y, z = pos.z + faces[r].z } + local n = minetest.get_node(t) + if n.name == "ignore" then + return + end + + if minetest.registered_nodes[minetest.get_node({ x = t.x, y = t.y - 1, z = t.z }).name].walkable == false then + return + end + + if minetest.registered_nodes[n.name].drawtype == "plantlike" or + minetest.registered_nodes[n.name].groups.flora == 1 or + n.name == "air" then + minetest.set_node(t, {name = "crops:melon"}) + minetest.set_node(pos, {name = "crops:melon_plant_5_attached", param2 = faces[r].r}) + end + end +}) + +-- +-- return a melon to a normal one if there is no melon attached, so it can +-- grow a new melon again +-- +minetest.register_abm({ + nodenames = { "crops:melon_plant_5_attached" }, + interval = 30, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + for face = 1, 4 do + local t = { x = pos.x + faces[face].x, y = pos.y, z = pos.z + faces[face].z } + if minetest.get_node(t).name == "crops:melon" then + return + end + end + minetest.set_node(pos, {name = "crops:melon_plant_5" }) + end +}) |