Default, flowers: Improve plant selection boxes
[oweals/minetest_game.git] / mods / flowers / init.lua
1 -- Minetest 0.4 mod: default
2 -- See README.txt for licensing and other information.
3
4
5 -- Namespace for functions
6
7 flowers = {}
8
9
10 -- Map Generation
11
12 dofile(minetest.get_modpath("flowers") .. "/mapgen.lua")
13
14
15 --
16 -- Flowers
17 --
18
19 -- Aliases for original flowers mod
20
21 minetest.register_alias("flowers:flower_rose", "flowers:rose")
22 minetest.register_alias("flowers:flower_tulip", "flowers:tulip")
23 minetest.register_alias("flowers:flower_dandelion_yellow", "flowers:dandelion_yellow")
24 minetest.register_alias("flowers:flower_geranium", "flowers:geranium")
25 minetest.register_alias("flowers:flower_viola", "flowers:viola")
26 minetest.register_alias("flowers:flower_dandelion_white", "flowers:dandelion_white")
27
28
29 -- Flower registration
30
31 local function add_simple_flower(name, desc, box, f_groups)
32         -- Common flowers' groups
33         f_groups.snappy = 3
34         f_groups.flower = 1
35         f_groups.flora = 1
36         f_groups.attached_node = 1
37
38         minetest.register_node("flowers:" .. name, {
39                 description = desc,
40                 drawtype = "plantlike",
41                 waving = 1,
42                 tiles = {"flowers_" .. name .. ".png"},
43                 inventory_image = "flowers_" .. name .. ".png",
44                 wield_image = "flowers_" .. name .. ".png",
45                 sunlight_propagates = true,
46                 paramtype = "light",
47                 walkable = false,
48                 buildable_to = true,
49                 stack_max = 99,
50                 groups = f_groups,
51                 sounds = default.node_sound_leaves_defaults(),
52                 selection_box = {
53                         type = "fixed",
54                         fixed = box
55                 }
56         })
57 end
58
59 flowers.datas = {
60         {
61                 "rose",
62                 "Rose",
63                 {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16},
64                 {color_red = 1, flammable = 1}
65         },
66         {
67                 "tulip",
68                 "Orange Tulip",
69                 {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
70                 {color_orange = 1, flammable = 1}
71         },
72         {
73                 "dandelion_yellow",
74                 "Yellow Dandelion",
75                 {-2 / 16, -0.5, -2 / 16, 2 / 16, 4 / 16, 2 / 16},
76                 {color_yellow = 1, flammable = 1}
77         },
78         {
79                 "geranium",
80                 "Blue Geranium",
81                 {-2 / 16, -0.5, -2 / 16, 2 / 16, 2 / 16, 2 / 16},
82                 {color_blue = 1, flammable = 1}
83         },
84         {
85                 "viola",
86                 "Viola",
87                 {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16},
88                 {color_violet = 1, flammable = 1}
89         },
90         {
91                 "dandelion_white",
92                 "White dandelion",
93                 {-5 / 16, -0.5, -5 / 16, 5 / 16, -2 / 16, 5 / 16},
94                 {color_white = 1, flammable = 1}
95         },
96 }
97
98 for _,item in pairs(flowers.datas) do
99         add_simple_flower(unpack(item))
100 end
101
102
103 -- Flower spread
104 -- Public function to enable override by mods
105
106 function flowers.flower_spread(pos, node)
107         pos.y = pos.y - 1
108         local under = minetest.get_node(pos)
109         pos.y = pos.y + 1
110         if under.name == "default:desert_sand" then
111                 minetest.set_node(pos, {name = "default:dry_shrub"})
112                 return
113         elseif under.name ~= "default:dirt_with_grass" and
114                         under.name ~= "default:dirt_with_dry_grass" then
115                 return
116         end
117
118         local light = minetest.get_node_light(pos)
119         if not light or light < 13 then
120                 return
121         end
122
123         local pos0 = vector.subtract(pos, 4)
124         local pos1 = vector.add(pos, 4)
125         if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 then
126                 return
127         end
128
129         local seedling = minetest.find_nodes_in_area_under_air(pos0, pos1,
130                 {"default:dirt_with_grass", "default:dirt_with_dry_grass"})
131         if #seedling > 0 then
132                 seedling = seedling[math.random(#seedling)]
133                 seedling.y = seedling.y + 1
134                 light = minetest.get_node_light(seedling)
135                 if not light or light < 13 then
136                         return
137                 end
138                 minetest.set_node(seedling, {name = node.name})
139         end
140 end
141
142 minetest.register_abm({
143         label = "Flower spread",
144         nodenames = {"group:flora"},
145         neighbors = {"default:dirt_with_grass", "default:dirt_with_dry_grass",
146                 "default:desert_sand"},
147         interval = 13,
148         chance = 96,
149         action = function(...)
150                 flowers.flower_spread(...)
151         end,
152 })
153
154
155 --
156 -- Mushrooms
157 --
158
159 minetest.register_node("flowers:mushroom_red", {
160         description = "Red Mushroom",
161         tiles = {"flowers_mushroom_red.png"},
162         inventory_image = "flowers_mushroom_red.png",
163         wield_image = "flowers_mushroom_red.png",
164         drawtype = "plantlike",
165         paramtype = "light",
166         sunlight_propagates = true,
167         walkable = false,
168         buildable_to = true,
169         groups = {snappy = 3, attached_node = 1, flammable = 1},
170         sounds = default.node_sound_leaves_defaults(),
171         on_use = minetest.item_eat(-5),
172         selection_box = {
173                 type = "fixed",
174                 fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16},
175         }
176 })
177
178 minetest.register_node("flowers:mushroom_brown", {
179         description = "Brown Mushroom",
180         tiles = {"flowers_mushroom_brown.png"},
181         inventory_image = "flowers_mushroom_brown.png",
182         wield_image = "flowers_mushroom_brown.png",
183         drawtype = "plantlike",
184         paramtype = "light",
185         sunlight_propagates = true,
186         walkable = false,
187         buildable_to = true,
188         groups = {snappy = 3, attached_node = 1, flammable = 1},
189         sounds = default.node_sound_leaves_defaults(),
190         on_use = minetest.item_eat(1),
191         selection_box = {
192                 type = "fixed",
193                 fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16},
194         }
195 })
196
197
198 -- Mushroom spread and death
199
200 minetest.register_abm({
201         label = "Mushroom spread",
202         nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"},
203         interval = 11,
204         chance = 50,
205         action = function(pos, node)
206                 if minetest.get_node_light(pos, nil) == 15 then
207                         minetest.remove_node(pos)
208                         return
209                 end
210                 local random = {
211                         x = pos.x + math.random(-2, 2),
212                         y = pos.y + math.random(-1, 1),
213                         z = pos.z + math.random(-2, 2)
214                 }
215                 local random_node = minetest.get_node_or_nil(random)
216                 if not random_node or random_node.name ~= "air" then
217                         return
218                 end
219                 local node_under = minetest.get_node_or_nil({x = random.x,
220                         y = random.y - 1, z = random.z})
221                 if not node_under then
222                         return
223                 end
224
225                 if (minetest.get_item_group(node_under.name, "soil") ~= 0 or
226                                 minetest.get_item_group(node_under.name, "tree") ~= 0) and
227                                 minetest.get_node_light(pos, 0.5) <= 3 and
228                                 minetest.get_node_light(random, 0.5) <= 3 then
229                         minetest.set_node(random, {name = node.name})
230                 end
231         end
232 })
233
234
235 -- These old mushroom related nodes can be simplified now
236
237 minetest.register_alias("flowers:mushroom_spores_brown", "flowers:mushroom_brown")
238 minetest.register_alias("flowers:mushroom_spores_red", "flowers:mushroom_red")
239 minetest.register_alias("flowers:mushroom_fertile_brown", "flowers:mushroom_brown")
240 minetest.register_alias("flowers:mushroom_fertile_red", "flowers:mushroom_red")
241 minetest.register_alias("mushroom:brown_natural", "flowers:mushroom_brown")
242 minetest.register_alias("mushroom:red_natural", "flowers:mushroom_red")
243
244
245 --
246 -- Waterlily
247 --
248
249 minetest.register_node("flowers:waterlily", {
250         description = "Waterlily",
251         drawtype = "nodebox",
252         paramtype = "light",
253         paramtype2 = "facedir",
254         tiles = {"flowers_waterlily.png", "flowers_waterlily_bottom.png"},
255         inventory_image = "flowers_waterlily.png",
256         wield_image = "flowers_waterlily.png",
257         liquids_pointable = true,
258         walkable = false,
259         buildable_to = true,
260         sunlight_propagates = true,
261         floodable = true,
262         groups = {snappy = 3, flower = 1, flammable = 1},
263         sounds = default.node_sound_leaves_defaults(),
264         node_placement_prediction = "",
265         node_box = {
266                 type = "fixed",
267                 fixed = {-0.5, -0.5, -0.5, 0.5, -15 / 32, 0.5}
268         },
269         selection_box = {
270                 type = "fixed",
271                 fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16}
272         },
273
274         on_place = function(itemstack, placer, pointed_thing)
275                 local pos = pointed_thing.above
276                 local node = minetest.get_node(pointed_thing.under).name
277                 local def = minetest.registered_nodes[node]
278                 local player_name = placer:get_player_name()
279
280                 if def and def.liquidtype == "source" and
281                                 minetest.get_item_group(node, "water") > 0 then
282                         if not minetest.is_protected(pos, player_name) then
283                                 minetest.set_node(pos, {name = "flowers:waterlily",
284                                         param2 = math.random(0, 3)})
285                                 if not minetest.setting_getbool("creative_mode") then
286                                         itemstack:take_item()
287                                 end
288                         else
289                                 minetest.chat_send_player(player_name, "Node is protected")
290                                 minetest.record_protection_violation(pos, player_name)
291                         end
292                 end
293
294                 return itemstack
295         end
296 })