1-- flowers/init.lua
2
3-- Minetest 0.4 mod: default
4-- See README.txt for licensing and other information.
5
6
7-- Namespace for functions
8
9flowers = {}
10
11-- Load support for MT game translation.
12local S = minetest.get_translator("flowers")
13
14
15-- Map Generation
16
17dofile(minetest.get_modpath("flowers") .. "/mapgen.lua")
18
19
20--
21-- Flowers
22--
23
24-- Aliases for original flowers mod
25
26minetest.register_alias("flowers:flower_rose", "flowers:rose")
27minetest.register_alias("flowers:flower_tulip", "flowers:tulip")
28minetest.register_alias("flowers:flower_dandelion_yellow", "flowers:dandelion_yellow")
29minetest.register_alias("flowers:flower_geranium", "flowers:geranium")
30minetest.register_alias("flowers:flower_viola", "flowers:viola")
31minetest.register_alias("flowers:flower_dandelion_white", "flowers:dandelion_white")
32
33
34-- Flower registration
35
36local function add_simple_flower(name, desc, box, f_groups)
37	-- Common flowers' groups
38	f_groups.snappy = 3
39	f_groups.flower = 1
40	f_groups.flora = 1
41	f_groups.attached_node = 1
42
43	minetest.register_node("flowers:" .. name, {
44		description = desc,
45		drawtype = "plantlike",
46		waving = 1,
47		tiles = {"flowers_" .. name .. ".png"},
48		inventory_image = "flowers_" .. name .. ".png",
49		wield_image = "flowers_" .. name .. ".png",
50		sunlight_propagates = true,
51		paramtype = "light",
52		walkable = false,
53		buildable_to = true,
54		groups = f_groups,
55		sounds = default.node_sound_leaves_defaults(),
56		selection_box = {
57			type = "fixed",
58			fixed = box
59		}
60	})
61end
62
63flowers.datas = {
64	{
65		"rose",
66		S("Red Rose"),
67		{-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16},
68		{color_red = 1, flammable = 1}
69	},
70	{
71		"tulip",
72		S("Orange Tulip"),
73		{-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
74		{color_orange = 1, flammable = 1}
75	},
76	{
77		"dandelion_yellow",
78		S("Yellow Dandelion"),
79		{-4 / 16, -0.5, -4 / 16, 4 / 16, -2 / 16, 4 / 16},
80		{color_yellow = 1, flammable = 1}
81	},
82	{
83		"chrysanthemum_green",
84		S("Green Chrysanthemum"),
85		{-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16},
86		{color_green = 1, flammable = 1}
87	},
88	{
89		"geranium",
90		S("Blue Geranium"),
91		{-2 / 16, -0.5, -2 / 16, 2 / 16, 2 / 16, 2 / 16},
92		{color_blue = 1, flammable = 1}
93	},
94	{
95		"viola",
96		S("Viola"),
97		{-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16},
98		{color_violet = 1, flammable = 1}
99	},
100	{
101		"dandelion_white",
102		S("White Dandelion"),
103		{-5 / 16, -0.5, -5 / 16, 5 / 16, -2 / 16, 5 / 16},
104		{color_white = 1, flammable = 1}
105	},
106	{
107		"tulip_black",
108		S("Black Tulip"),
109		{-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
110		{color_black = 1, flammable = 1}
111	},
112}
113
114for _,item in pairs(flowers.datas) do
115	add_simple_flower(unpack(item))
116end
117
118
119-- Flower spread
120-- Public function to enable override by mods
121
122function flowers.flower_spread(pos, node)
123	pos.y = pos.y - 1
124	local under = minetest.get_node(pos)
125	pos.y = pos.y + 1
126	-- Replace flora with dry shrub in desert sand and silver sand,
127	-- as this is the only way to generate them.
128	-- However, preserve grasses in sand dune biomes.
129	if minetest.get_item_group(under.name, "sand") == 1 and
130			under.name ~= "default:sand" then
131		minetest.set_node(pos, {name = "default:dry_shrub"})
132		return
133	end
134
135	if minetest.get_item_group(under.name, "soil") == 0 then
136		return
137	end
138
139	local light = minetest.get_node_light(pos)
140	if not light or light < 13 then
141		return
142	end
143
144	local pos0 = vector.subtract(pos, 4)
145	local pos1 = vector.add(pos, 4)
146	-- Testing shows that a threshold of 3 results in an appropriate maximum
147	-- density of approximately 7 flora per 9x9 area.
148	if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 then
149		return
150	end
151
152	local soils = minetest.find_nodes_in_area_under_air(
153		pos0, pos1, "group:soil")
154	local num_soils = #soils
155	if num_soils >= 1 then
156		for si = 1, math.min(3, num_soils) do
157			local soil = soils[math.random(num_soils)]
158			local soil_name = minetest.get_node(soil).name
159			local soil_above = {x = soil.x, y = soil.y + 1, z = soil.z}
160			light = minetest.get_node_light(soil_above)
161			if light and light >= 13 and
162					-- Only spread to same surface node
163					soil_name == under.name and
164					-- Desert sand is in the soil group
165					soil_name ~= "default:desert_sand" then
166				minetest.set_node(soil_above, {name = node.name})
167			end
168		end
169	end
170end
171
172minetest.register_abm({
173	label = "Flower spread",
174	nodenames = {"group:flora"},
175	interval = 13,
176	chance = 300,
177	action = function(...)
178		flowers.flower_spread(...)
179	end,
180})
181
182
183--
184-- Mushrooms
185--
186
187minetest.register_node("flowers:mushroom_red", {
188	description = S("Red Mushroom"),
189	tiles = {"flowers_mushroom_red.png"},
190	inventory_image = "flowers_mushroom_red.png",
191	wield_image = "flowers_mushroom_red.png",
192	drawtype = "plantlike",
193	paramtype = "light",
194	sunlight_propagates = true,
195	walkable = false,
196	buildable_to = true,
197	groups = {mushroom = 1, snappy = 3, attached_node = 1, flammable = 1},
198	sounds = default.node_sound_leaves_defaults(),
199	on_use = minetest.item_eat(-5),
200	selection_box = {
201		type = "fixed",
202		fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16},
203	}
204})
205
206minetest.register_node("flowers:mushroom_brown", {
207	description = S("Brown Mushroom"),
208	tiles = {"flowers_mushroom_brown.png"},
209	inventory_image = "flowers_mushroom_brown.png",
210	wield_image = "flowers_mushroom_brown.png",
211	drawtype = "plantlike",
212	paramtype = "light",
213	sunlight_propagates = true,
214	walkable = false,
215	buildable_to = true,
216	groups = {mushroom = 1, food_mushroom = 1, snappy = 3, attached_node = 1, flammable = 1},
217	sounds = default.node_sound_leaves_defaults(),
218	on_use = minetest.item_eat(1),
219	selection_box = {
220		type = "fixed",
221		fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16},
222	}
223})
224
225
226-- Mushroom spread and death
227
228function flowers.mushroom_spread(pos, node)
229	if minetest.get_node_light(pos, 0.5) > 3 then
230		if minetest.get_node_light(pos, nil) == 15 then
231			minetest.remove_node(pos)
232		end
233		return
234	end
235	local positions = minetest.find_nodes_in_area_under_air(
236		{x = pos.x - 1, y = pos.y - 2, z = pos.z - 1},
237		{x = pos.x + 1, y = pos.y + 1, z = pos.z + 1},
238		{"group:soil", "group:tree"})
239	if #positions == 0 then
240		return
241	end
242	local pos2 = positions[math.random(#positions)]
243	pos2.y = pos2.y + 1
244	if minetest.get_node_light(pos2, 0.5) <= 3 then
245		minetest.set_node(pos2, {name = node.name})
246	end
247end
248
249minetest.register_abm({
250	label = "Mushroom spread",
251	nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"},
252	interval = 11,
253	chance = 150,
254	action = function(...)
255		flowers.mushroom_spread(...)
256	end,
257})
258
259
260-- These old mushroom related nodes can be simplified now
261
262minetest.register_alias("flowers:mushroom_spores_brown", "flowers:mushroom_brown")
263minetest.register_alias("flowers:mushroom_spores_red", "flowers:mushroom_red")
264minetest.register_alias("flowers:mushroom_fertile_brown", "flowers:mushroom_brown")
265minetest.register_alias("flowers:mushroom_fertile_red", "flowers:mushroom_red")
266minetest.register_alias("mushroom:brown_natural", "flowers:mushroom_brown")
267minetest.register_alias("mushroom:red_natural", "flowers:mushroom_red")
268
269
270--
271-- Waterlily
272--
273
274local waterlily_def = {
275	description = S("Waterlily"),
276	drawtype = "nodebox",
277	paramtype = "light",
278	paramtype2 = "facedir",
279	tiles = {"flowers_waterlily.png", "flowers_waterlily_bottom.png"},
280	inventory_image = "flowers_waterlily.png",
281	wield_image = "flowers_waterlily.png",
282	use_texture_alpha = "clip",
283	liquids_pointable = true,
284	walkable = false,
285	buildable_to = true,
286	floodable = true,
287	groups = {snappy = 3, flower = 1, flammable = 1},
288	sounds = default.node_sound_leaves_defaults(),
289	node_placement_prediction = "",
290	node_box = {
291		type = "fixed",
292		fixed = {-0.5, -31 / 64, -0.5, 0.5, -15 / 32, 0.5}
293	},
294	selection_box = {
295		type = "fixed",
296		fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16}
297	},
298
299	on_place = function(itemstack, placer, pointed_thing)
300		local pos = pointed_thing.above
301		local node = minetest.get_node(pointed_thing.under)
302		local def = minetest.registered_nodes[node.name]
303
304		if def and def.on_rightclick then
305			return def.on_rightclick(pointed_thing.under, node, placer, itemstack,
306					pointed_thing)
307		end
308
309		if def and def.liquidtype == "source" and
310				minetest.get_item_group(node.name, "water") > 0 then
311			local player_name = placer and placer:get_player_name() or ""
312			if not minetest.is_protected(pos, player_name) then
313				minetest.set_node(pos, {name = "flowers:waterlily" ..
314					(def.waving == 3 and "_waving" or ""),
315					param2 = math.random(0, 3)})
316				if not minetest.is_creative_enabled(player_name) then
317					itemstack:take_item()
318				end
319			else
320				minetest.chat_send_player(player_name, "Node is protected")
321				minetest.record_protection_violation(pos, player_name)
322			end
323		end
324
325		return itemstack
326	end
327}
328
329local waterlily_waving_def = table.copy(waterlily_def)
330waterlily_waving_def.waving = 3
331waterlily_waving_def.drop = "flowers:waterlily"
332waterlily_waving_def.groups.not_in_creative_inventory = 1
333
334minetest.register_node("flowers:waterlily", waterlily_def)
335minetest.register_node("flowers:waterlily_waving", waterlily_waving_def)
336
337