VoxeLibre/mods/ITEMS/mcl_flowers/init.lua

383 lines
16 KiB
Lua
Raw Normal View History

2015-06-29 19:55:56 +02:00
-- Minetest 0.4 mod: default
-- See README.txt for licensing and other information.
local init = os.clock()
2015-06-29 19:55:56 +02:00
flower_tmp={}
-- Simple flower template
2017-03-11 01:51:06 +01:00
local smallflowerlongdesc = "This is a small flower. Small flowers are mainly used for dye production and can also be potted."
2017-06-09 21:26:26 +02:00
local flowerusagehelp = "It can only be placed on a block on which it would also survive."
2015-06-29 19:55:56 +02:00
2017-06-09 20:20:29 +02:00
-- on_place function for flowers
local on_place_flower = mcl_util.generate_on_place_plant_function(function(pos, node)
local below = {x=pos.x, y=pos.y-1, z=pos.z}
local soil_node = minetest.get_node_or_nil(below)
2017-06-09 20:39:46 +02:00
if not soil_node then return false end
2017-06-09 20:20:29 +02:00
--[[ Placement requirements:
* Dirt or grass block
* Light level >= 8 at any time or exposed to sunlight at day
]]
local light_night = minetest.get_node_light(pos, 0.0)
local light_day = minetest.get_node_light(pos, 0.5)
local light_ok = false
if (light_night and light_night >= 8) or (light_day and light_day >= minetest.LIGHT_MAX) then
light_ok = true
end
2017-06-09 20:39:46 +02:00
return (soil_node.name == "mcl_core:dirt" or soil_node.name == "mcl_core:dirt_with_grass" or soil_node.name == "mcl_core:dirt_with_grass_snow" or soil_node.name == "mcl_core:coarse_dirt" or soil_node.name == "mcl_core:podzol" or soil_node.name == "mcl_core:podzol_snow") and light_ok
2017-06-09 20:20:29 +02:00
end)
local function add_simple_flower(name, desc, image, simple_selection_box)
2017-01-31 23:32:56 +01:00
minetest.register_node("mcl_flowers:"..name, {
2015-06-29 19:55:56 +02:00
description = desc,
2017-03-11 01:51:06 +01:00
_doc_items_longdesc = smallflowerlongdesc,
2017-06-09 21:26:26 +02:00
_doc_items_usagehelp = flowerusagehelp,
2015-06-29 19:55:56 +02:00
drawtype = "plantlike",
tiles = { image..".png" },
inventory_image = image..".png",
wield_image = image..".png",
sunlight_propagates = true,
paramtype = "light",
walkable = false,
stack_max = 64,
groups = {dig_immediate=3,flammable=2,plant=1,flower=1,place_flowerlike=1,non_mycelium_plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1},
sounds = mcl_sounds.node_sound_leaves_defaults(),
node_placement_prediction = "",
2017-06-09 20:20:29 +02:00
on_place = on_place_flower,
2015-06-29 19:55:56 +02:00
selection_box = {
type = "fixed",
fixed = simple_selection_box,
2015-06-29 19:55:56 +02:00
},
})
end
local box_tulip = { -0.15, -0.5, -0.15, 0.15, 5/16, 0.15 }
2015-06-29 19:55:56 +02:00
add_simple_flower("poppy", "Poppy", "mcl_flowers_poppy", { -0.15, -0.5, -0.15, 0.15, 3/16, 0.15 })
add_simple_flower("dandelion", "Dandelion", "flowers_dandelion_yellow", { -0.15, -0.5, -0.15, 0.15, 0, 0.15 })
add_simple_flower("oxeye_daisy", "Oxeye Daisy", "mcl_flowers_oxeye_daisy", { -0.15, -0.5, -0.15, 0.15, 5/16, 0.15 })
add_simple_flower("tulip_orange", "Orange Tulip", "flowers_tulip", box_tulip)
add_simple_flower("tulip_pink", "Pink Tulip", "mcl_flowers_tulip_pink", box_tulip)
add_simple_flower("tulip_red", "Red Tulip", "mcl_flowers_tulip_red", box_tulip)
add_simple_flower("tulip_white", "White Tulip", "mcl_flowers_tulip_white", box_tulip)
add_simple_flower("allium", "Allium", "mcl_flowers_allium", { -0.2, -0.5, -0.2, 0.2, 6/16, 0.2 })
add_simple_flower("azure_bluet", "Azure Bluet", "mcl_flowers_azure_bluet", { -3/16, -0.5, -3/16, 3/16, 2/16, 3/16 })
add_simple_flower("blue_orchid", "Blue Orchid", "mcl_flowers_blue_orchid", { -5/16, -0.5, -5/16, 5/16, 6/16, 5/16 })
2015-06-29 19:55:56 +02:00
2017-03-14 19:26:48 +01:00
local wheat_seed_drop = {
max_items = 1,
items = {
{
items = {'mcl_farming:wheat_seeds'},
rarity = 8,
},
}
2017-03-15 00:03:02 +01:00
}
2017-03-14 19:26:48 +01:00
-- Tall Grass
minetest.register_node("mcl_flowers:tallgrass", {
description = "Tall Grass",
_doc_items_longdesc = "Tall grass is a small plant which often occours on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.",
_doc_items_hidden = false,
drawtype = "plantlike",
tiles = {"mcl_flowers_tallgrass.png"},
inventory_image = "mcl_flowers_tallgrass.png",
wield_image = "mcl_flowers_tallgrass.png",
selection_box = {
type = "fixed",
fixed = {{ -6/16, -8/16, -6/16, 6/16, 8/16, 6/16 }},
},
paramtype = "light",
sunlight_propagates = true,
walkable = false,
buildable_to = true,
is_ground_content = true,
-- CHECKME: How does tall grass behave when pushed by a piston?
2017-06-11 23:20:50 +02:00
groups = {dig_immediate=3, flammable=3,attached_node=1,plant=1,place_flowerlike=1,non_mycelium_plant=1,dig_by_water=1,destroy_by_lava_flow=1,deco_block=1},
sounds = mcl_sounds.node_sound_leaves_defaults(),
drop = wheat_seed_drop,
node_placement_prediction = "",
on_place = on_place_flower,
after_dig_node = function(pos, oldnode, oldmetadata, user)
local item = user:get_wielded_item()
if item:get_name() == "mcl_tools:shears" then
minetest.add_item(pos, oldnode.name)
end
end,
_mcl_blast_resistance = 0,
_mcl_hardness = 0,
})
2015-06-29 19:55:56 +02:00
--- Fern ---
2017-01-31 12:03:18 +01:00
minetest.register_node("mcl_flowers:fern", {
2015-06-29 19:55:56 +02:00
description = "Fern",
_doc_items_longdesc = "Ferns are small plants which occour naturally in grasslands. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.",
2015-06-29 19:55:56 +02:00
drawtype = "plantlike",
2017-01-31 12:03:18 +01:00
tiles = { "mcl_flowers_fern.png" },
inventory_image = "mcl_flowers_fern.png",
wield_image = "mcl_flowers_fern.png",
2015-06-29 19:55:56 +02:00
sunlight_propagates = true,
paramtype = "light",
walkable = false,
stack_max = 64,
-- CHECKME: How does a fern behave when pushed by a piston?
2017-06-11 23:20:50 +02:00
groups = {dig_immediate=3,flammable=2,attached_node=1,plant=1,place_flowerlike=1,non_mycelium_plant=1,dig_by_water=1,destroy_by_lava_flow=1,deco_block=1},
buildable_to = true,
sounds = mcl_sounds.node_sound_leaves_defaults(),
node_placement_prediction = "",
on_place = on_place_flower,
after_dig_node = function(pos, oldnode, oldmetadata, user)
local item = user:get_wielded_item()
if item:get_name() == "mcl_tools:shears" then
minetest.add_item(pos, oldnode.name)
end
end,
2017-03-14 19:26:48 +01:00
drop = wheat_seed_drop,
2015-06-29 19:55:56 +02:00
selection_box = {
type = "fixed",
fixed = { -4/16, -0.5, -4/16, 4/16, 7/16, 4/16 },
2015-06-29 19:55:56 +02:00
},
})
2017-06-06 13:07:46 +02:00
local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_img, selbox_radius, selbox_top_height, drop, is_flower)
2017-03-14 18:53:31 +01:00
if not inv_img then
inv_img = top_img
end
2017-06-09 21:26:26 +02:00
local flowergroup, usagehelp
if is_flower == nil then
is_flower = true
end
if is_flower then
flowergroup = 1
2017-06-09 21:26:26 +02:00
usagehelp = flowerusagehelp
end
2017-03-14 18:45:21 +01:00
minetest.register_node("mcl_flowers:"..name, {
description = desc,
_doc_items_longdesc = longdesc,
2017-06-09 21:26:26 +02:00
_doc_items_usagehelp = usagehelp,
2017-03-14 18:45:21 +01:00
drawtype = "plantlike",
tiles = { bottom_img },
inventory_image = inv_img,
wield_image = inv_img,
sunlight_propagates = true,
paramtype = "light",
walkable = false,
2017-03-31 20:25:16 +02:00
buildable_to = true,
2017-03-14 19:26:48 +01:00
drop = drop,
2017-03-14 18:45:21 +01:00
node_placement_prediction = "",
2017-06-06 13:07:46 +02:00
selection_box = {
type = "fixed",
fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, 0.5, selbox_radius },
},
2017-03-14 18:45:21 +01:00
on_place = function(itemstack, placer, pointed_thing)
-- We can only place on nodes
if pointed_thing.type ~= "node" then
--return
end
-- Call on_rightclick if the pointed node defines it
local node = minetest.get_node(pointed_thing.under)
if placer and not placer:get_player_control().sneak then
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack
end
end
2017-03-14 18:45:21 +01:00
-- Check for a floor and a space of 1×2×1
local ptu_node = minetest.get_node(pointed_thing.under)
local bottom
if not minetest.registered_nodes[ptu_node.name] then
return itemstack
end
2017-03-14 18:45:21 +01:00
if minetest.registered_nodes[ptu_node.name].buildable_to then
bottom = pointed_thing.under
else
bottom = pointed_thing.above
end
if not minetest.registered_nodes[minetest.get_node(bottom).name] then
return itemstack
end
2017-03-14 18:45:21 +01:00
local top = { x = bottom.x, y = bottom.y + 1, z = bottom.z }
local bottom_buildable = minetest.registered_nodes[minetest.get_node(bottom).name].buildable_to
local top_buildable = minetest.registered_nodes[minetest.get_node(top).name].buildable_to
local floorname = minetest.get_node({x=bottom.x, y=bottom.y-1, z=bottom.z}).name
if not minetest.registered_nodes[floorname] then
return itemstack
end
2017-06-09 19:41:23 +02:00
local light_night = minetest.get_node_light(bottom, 0.0)
local light_day = minetest.get_node_light(bottom, 0.5)
local light_ok = false
if (light_night and light_night >= 8) or (light_day and light_day >= minetest.LIGHT_MAX) then
light_ok = true
end
-- Placement rules:
-- * Allowed on dirt or grass block
-- * Only with light level >= 8
-- * Only if two enough space
2017-06-09 20:39:46 +02:00
if (floorname == "mcl_core:dirt" or floorname == "mcl_core:dirt_with_grass" or floorname == "mcl_core:dirt_with_grass_snow" or floorname == "mcl_core:coarse_dirt" or floorname == "mcl_core:podzol" or floorname == "mcl_core:podzol_snow") and bottom_buildable and top_buildable and light_ok then
2017-03-14 18:45:21 +01:00
-- Success! We can now place the flower
minetest.sound_play(minetest.registered_nodes["mcl_flowers:"..name].sounds.place, {pos = bottom, gain=1})
minetest.set_node(bottom, {name="mcl_flowers:"..name})
minetest.set_node(top, {name="mcl_flowers:"..name.."_top"})
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
end
return itemstack
end,
after_destruct = function(pos, oldnode)
-- Remove top half of flower (if it exists)
local bottom = pos
local top = { x = bottom.x, y = bottom.y + 1, z = bottom.z }
2017-03-31 20:25:16 +02:00
if minetest.get_node(bottom).name ~= "mcl_flowers:"..name and minetest.get_node(top).name == "mcl_flowers:"..name.."_top" then
2017-03-14 18:45:21 +01:00
minetest.remove_node(top)
end
end,
2017-06-11 23:20:50 +02:00
groups = {dig_immediate=3,flammable=2,flower=flowergroup,place_flowerlike=1,non_mycelium_plant=1,attached_node=1, dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1, plant=1,double_plant=1,deco_block=1},
2017-03-14 18:45:21 +01:00
sounds = mcl_sounds.node_sound_leaves_defaults(),
})
2015-06-29 19:55:56 +02:00
2017-03-14 18:45:21 +01:00
-- Top
minetest.register_node("mcl_flowers:"..name.."_top", {
description = desc.." (Top Part)",
_doc_items_create_entry = false,
drawtype = "plantlike",
tiles = { top_img },
sunlight_propagates = true,
paramtype = "light",
walkable = false,
2017-03-31 20:25:16 +02:00
buildable_to = true,
2017-06-06 13:07:46 +02:00
selection_box = {
type = "fixed",
fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, selbox_top_height, selbox_radius },
},
2017-03-14 18:45:21 +01:00
drop = "",
after_destruct = function(pos, oldnode)
-- "Dig" bottom half of flower (if it exists)
local top = pos
local bottom = { x = top.x, y = top.y - 1, z = top.z }
2017-03-31 20:25:16 +02:00
if minetest.get_node(top).name ~= "mcl_flowers:"..name.."_top" and minetest.get_node(bottom).name == "mcl_flowers:"..name then
2017-03-14 18:45:21 +01:00
minetest.dig_node(bottom)
end
end,
2017-06-11 23:20:50 +02:00
groups = {dig_immediate=3,flammable=2,flower=flowergroup,place_flowerlike=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1, not_in_creative_inventory = 1, plant=1,double_plant=2},
2017-03-14 18:45:21 +01:00
sounds = mcl_sounds.node_sound_leaves_defaults(),
})
if minetest.get_modpath("doc") then
doc.add_entry_alias("nodes", "mcl_flowers:"..name, "nodes", "mcl_flowers:"..name.."_top")
end
2015-06-29 19:55:56 +02:00
end
2017-06-06 13:07:46 +02:00
add_large_plant("peony", "Peony", "A peony is a large plant which occupies two blocks. It is mainly used in dye protection.", "mcl_flowers_double_plant_paeonia_bottom.png", "mcl_flowers_double_plant_paeonia_top.png", nil, 5/16, 4/16)
add_large_plant("rose_bush", "Rose Bush", "A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye protection.", "mcl_flowers_double_plant_rose_bottom.png", "mcl_flowers_double_plant_rose_top.png", nil, 6/16, 7/16)
add_large_plant("lilac", "Lilac", "A lilac is a large plant which occupies two blocks. It is mainly used in dye production.", "mcl_flowers_double_plant_syringa_bottom.png", "mcl_flowers_double_plant_syringa_top.png", nil, 6/16, 7/16)
2017-03-14 19:26:48 +01:00
2017-03-15 00:42:06 +01:00
-- TODO: Make the sunflower face East. Requires a mesh for the top node.
2017-06-06 13:07:46 +02:00
add_large_plant("sunflower", "Sunflower", "A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.", "mcl_flowers_double_plant_sunflower_bottom.png", "mcl_flowers_double_plant_sunflower_top.png^mcl_flowers_double_plant_sunflower_front.png", "mcl_flowers_double_plant_sunflower_front.png", 3/16, 4/16)
2017-03-15 00:42:06 +01:00
2017-06-06 13:07:46 +02:00
add_large_plant("double_grass", "Double Tallgrass", "Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.", "mcl_flowers_double_plant_grass_bottom.png", "mcl_flowers_double_plant_grass_top.png", nil, 5/16, 7/16, wheat_seed_drop, false)
add_large_plant("double_fern", "Large Fern", "Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.", "mcl_flowers_double_plant_fern_bottom.png", "mcl_flowers_double_plant_fern_top.png", nil, 6/16, 5/16, wheat_seed_drop, false)
2015-06-29 19:55:56 +02:00
2017-06-09 19:59:49 +02:00
minetest.register_abm({
2017-06-09 20:39:46 +02:00
label = "Pop out flowers",
nodenames = {"group:flower"},
2017-06-09 19:59:49 +02:00
interval = 12,
chance = 2,
action = function(pos, node)
2017-06-10 04:12:13 +02:00
-- Ignore the upper part of double plants
if minetest.get_item_group(node.name, "double_plant") == 2 then
return
end
2017-06-09 19:59:49 +02:00
local below = minetest.get_node_or_nil({x=pos.x, y=pos.y-1, z=pos.z})
if not below then
return
end
-- Pop out flower if not on dirt, grass block or too low brightness
if (below.name ~= "mcl_core:dirt" and below.name ~= "mcl_core:dirt_with_grass" and below.name ~= "mcl_core:dirt_with_grass_snow") or (minetest.get_node_light(pos, 0.5) < 8) then
minetest.dig_node(pos)
return
end
end,
})
2017-01-12 04:37:36 +01:00
-- Lily Pad
2017-01-31 12:03:18 +01:00
minetest.register_node("mcl_flowers:waterlily", {
2017-01-12 04:37:36 +01:00
description = "Lily Pad",
2017-03-11 01:51:06 +01:00
_doc_items_longdesc = "A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.",
2017-01-12 04:37:36 +01:00
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
2017-02-01 00:35:04 +01:00
tiles = {"flowers_waterlily.png", "flowers_waterlily.png^[transformFY"},
2017-01-12 04:37:36 +01:00
inventory_image = "flowers_waterlily.png",
wield_image = "flowers_waterlily.png",
liquids_pointable = true,
walkable = true,
sunlight_propagates = true,
2017-05-20 04:11:14 +02:00
groups = {dig_immediate = 3, plant=1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1, deco_block=1},
sounds = mcl_sounds.node_sound_leaves_defaults(),
2017-01-12 04:37:36 +01:00
node_placement_prediction = "",
node_box = {
type = "fixed",
fixed = {-0.5, -31/64, -0.5, 0.5, -15/32, 0.5}
2017-01-12 04:37:36 +01:00
},
selection_box = {
type = "fixed",
fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16}
},
on_place = function(itemstack, placer, pointed_thing)
local pos = pointed_thing.above
local node = minetest.get_node(pointed_thing.under)
local nodename = node.name
local def = minetest.registered_nodes[nodename]
2017-01-12 04:37:36 +01:00
local node_above = minetest.get_node(pointed_thing.above).name
local def_above = minetest.registered_nodes[node_above]
local player_name = placer:get_player_name()
if def then
-- Use pointed node's on_rightclick function first, if present
if placer and not placer:get_player_control().sneak then
if def and def.on_rightclick then
return def.on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack
end
end
if (pointed_thing.under.x == pointed_thing.above.x and pointed_thing.under.z == pointed_thing.above.z) and
((def.liquidtype == "source" and minetest.get_item_group(nodename, "water") > 0) or
(nodename == "mcl_core:ice") or
(minetest.get_item_group(nodename, "frosted_ice") > 0)) and
2017-01-12 04:37:36 +01:00
(def_above.buildable_to and minetest.get_item_group(node_above, "liquid") == 0) then
if not minetest.is_protected(pos, player_name) then
2017-07-24 21:26:49 +02:00
minetest.set_node(pos, {name = "mcl_flowers:waterlily", param2 = math.random(0, 3)})
local idef = itemstack:get_definition()
if idef.sounds and idef.sounds.place then
minetest.sound_play(idef.sounds.place, {pos=above, gain=1})
end
2017-01-12 04:37:36 +01:00
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
else
minetest.chat_send_player(player_name, "Node is protected")
minetest.record_protection_violation(pos, player_name)
end
end
end
return itemstack
end
})
2017-01-05 07:23:25 +01:00
-- Legacy support
minetest.register_alias("mcl_core:tallgrass", "mcl_flowers:tallgrass")
-- Show loading time
local time_to_load= os.clock() - init
print(string.format("[MOD] "..minetest.get_current_modname().." loaded in %.4f s", time_to_load))