44d4a31d894d9df5494bbd5880d3d26113a16f93
[oweals/minetest_game.git] / mods / fireflies / init.lua
1 -- firefly
2 minetest.register_node("fireflies:firefly", {
3         description = "Firefly",
4         drawtype = "plantlike",
5         tiles = {{
6                 name = "fireflies_firefly_animated.png",
7                 animation = {
8                         type = "vertical_frames",
9                         aspect_w = 16,
10                         aspect_h = 16,
11                         length = 1.5
12                 },
13         }},
14         inventory_image = "fireflies_firefly.png",
15         wield_image =  "fireflies_firefly.png",
16         waving = 1,
17         paramtype = "light",
18         sunlight_propagates = true,
19         buildable_to = true,
20         walkable = false,
21         groups = {catchable = 1},
22         selection_box = {
23                 type = "fixed",
24                 fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1},
25         },
26         light_source = 6,
27         floodable = true,
28         on_place = function(itemstack, placer, pointed_thing)
29                 local player_name = placer:get_player_name()
30                 local pos = pointed_thing.above
31
32                 if not minetest.is_protected(pos, player_name) and
33                                 not minetest.is_protected(pointed_thing.under, player_name) and
34                                 minetest.get_node(pos).name == "air" then
35                         minetest.set_node(pos, {name = "fireflies:firefly"})
36                         minetest.get_node_timer(pos):start(1)
37                         itemstack:take_item()
38                 end
39                 return itemstack
40         end,
41         on_timer = function(pos, elapsed)
42                 if minetest.get_node_light(pos) > 11 then
43                         minetest.set_node(pos, {name = "fireflies:hidden_firefly"})
44                 end
45                 minetest.get_node_timer(pos):start(30)
46         end
47 })
48
49 minetest.register_node("fireflies:hidden_firefly", {
50         description = "Hidden Firefly",
51         drawtype = "airlike",
52         inventory_image = "fireflies_firefly.png",
53         wield_image =  "fireflies_firefly.png",
54         paramtype = "light",
55         sunlight_propagates = true,
56         walkable = false,
57         pointable = false,
58         diggable = false,
59         buildable_to = true,
60         drop = "",
61         groups = {not_in_creative_inventory = 1},
62         floodable = true,
63         on_place = function(itemstack, placer, pointed_thing)
64                 local player_name = placer:get_player_name()
65                 local pos = pointed_thing.above
66
67                 if not minetest.is_protected(pos, player_name) and
68                                 not minetest.is_protected(pointed_thing.under, player_name) and
69                                 minetest.get_node(pos).name == "air" then
70                         minetest.set_node(pos, {name = "fireflies:hidden_firefly"})
71                         minetest.get_node_timer(pos):start(1)
72                         itemstack:take_item()
73                 end
74                 return itemstack
75         end,
76         on_timer = function(pos, elapsed)
77                 if minetest.get_node_light(pos) <= 11 then
78                         minetest.set_node(pos, {name = "fireflies:firefly"})
79                 end
80                 minetest.get_node_timer(pos):start(30)
81         end
82 })
83
84
85 -- bug net
86 minetest.register_tool("fireflies:bug_net", {
87         description = "Bug Net",
88         inventory_image = "fireflies_bugnet.png",
89         on_use = function(itemstack, player, pointed_thing)
90                 if not pointed_thing or pointed_thing.type ~= "node" or
91                                 minetest.is_protected(pointed_thing.under, player:get_player_name()) then
92                         return
93                 end
94                 local node_name = minetest.get_node(pointed_thing.under).name
95                 local inv = player:get_inventory()
96                 if minetest.get_item_group(node_name, "catchable") == 1 then
97                         minetest.set_node(pointed_thing.under, {name = "air"})
98                         local stack = ItemStack(node_name.." 1")
99                         local leftover = inv:add_item("main", stack)
100                         if leftover:get_count() > 0 then
101                                 minetest.add_item(pointed_thing.under, node_name.." 1")
102                         end
103                 end
104                 if not (creative and creative.is_enabled_for(player:get_player_name())) then
105                         itemstack:add_wear(256)
106                         return itemstack
107                 end
108         end
109 })
110
111 minetest.register_craft( {
112         output = "fireflies:bug_net",
113         recipe = {
114                 {"farming:string", "farming:string"},
115                 {"farming:string", "farming:string"},
116                 {"default:stick", ""}
117         }
118 })
119
120
121 -- firefly in a bottle
122 minetest.register_node("fireflies:firefly_bottle", {
123         description = "Firefly in a Bottle",
124         inventory_image = "fireflies_bottle.png",
125         wield_image = "fireflies_bottle.png",
126         tiles = {{
127                 name = "fireflies_bottle_animated.png",
128                 animation = {
129                         type = "vertical_frames",
130                         aspect_w = 16,
131                         aspect_h = 16,
132                         length = 1.5
133                 },
134         }},
135         drawtype = "plantlike",
136         paramtype = "light",
137         sunlight_propagates = true,
138         light_source = 9,
139         walkable = false,
140         groups = {dig_immediate = 3, attached_node = 1},
141         selection_box = {
142                 type = "fixed",
143                 fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25}
144         },
145         sounds = default.node_sound_glass_defaults(),
146         on_rightclick = function(pos, node, player, itemstack, pointed_thing)
147                 local lower_pos = {x = pos.x, y = pos.y + 1, z = pos.z}
148                 if minetest.is_protected(pos, player:get_player_name()) or
149                                 minetest.get_node(lower_pos).name ~= "air" then
150                         return
151                 end
152
153                 local upper_pos = {x = pos.x, y = pos.y + 2, z = pos.z}
154                 local firefly_pos
155
156                 if not minetest.is_protected(upper_pos, player:get_player_name()) and
157                                 minetest.get_node(upper_pos).name == "air" then
158                         firefly_pos = upper_pos
159                 elseif not minetest.is_protected(lower_pos, player:get_player_name()) then
160                         firefly_pos = lower_pos
161                 end
162
163                 if firefly_pos then
164                         minetest.set_node(pos, {name = "vessels:glass_bottle"})
165                         minetest.set_node(firefly_pos, {name = "fireflies:firefly"})
166                         minetest.get_node_timer(firefly_pos):start(1)
167                 end
168         end
169 })
170
171 minetest.register_craft( {
172         output = "fireflies:firefly_bottle",
173         recipe = {
174                 {"fireflies:firefly"},
175                 {"vessels:glass_bottle"}
176         }
177 })
178
179
180 -- register fireflies as decorations
181
182 if minetest.get_mapgen_setting("mg_name") == "v6" then
183
184         minetest.register_decoration({
185                 name = "fireflies:firefly_low",
186                 deco_type = "simple",
187                 place_on = "default:dirt_with_grass",
188                 place_offset_y = 2,
189                 sidelen = 80,
190                 fill_ratio = 0.0002,
191                 y_max = 31000,
192                 y_min = 1,
193                 decoration = "fireflies:hidden_firefly",
194         })
195
196         minetest.register_decoration({
197                 name = "fireflies:firefly_high",
198                 deco_type = "simple",
199                 place_on = "default:dirt_with_grass",
200                 place_offset_y = 3,
201                 sidelen = 80,
202                 fill_ratio = 0.0002,
203                 y_max = 31000,
204                 y_min = 1,
205                 decoration = "fireflies:hidden_firefly",
206         })
207
208 else
209
210         minetest.register_decoration({
211                 name = "fireflies:firefly_low",
212                 deco_type = "simple",
213                 place_on = {
214                         "default:dirt_with_grass",
215                         "default:dirt_with_coniferous_litter",
216                         "default:dirt_with_rainforest_litter",
217                         "default:dirt"
218                 },
219                 place_offset_y = 2,
220                 sidelen = 80,
221                 fill_ratio = 0.0005,
222                 biomes = {
223                         "deciduous_forest",
224                         "coniferous_forest",
225                         "rainforest",
226                         "rainforest_swamp"
227                 },
228                 y_max = 31000,
229                 y_min = -1,
230                 decoration = "fireflies:hidden_firefly",
231         })
232
233         minetest.register_decoration({
234                 name = "fireflies:firefly_high",
235                 deco_type = "simple",
236                 place_on = {
237                         "default:dirt_with_grass",
238                         "default:dirt_with_coniferous_litter",
239                         "default:dirt_with_rainforest_litter",
240                         "default:dirt"
241                 },
242                 place_offset_y = 3,
243                 sidelen = 80,
244                 fill_ratio = 0.0005,
245                 biomes = {
246                         "deciduous_forest",
247                         "coniferous_forest",
248                         "rainforest",
249                         "rainforest_swamp"
250                 },
251                 y_max = 31000,
252                 y_min = -1,
253                 decoration = "fireflies:hidden_firefly",
254         })
255
256 end
257
258
259 -- get decoration IDs
260 local firefly_low = minetest.get_decoration_id("fireflies:firefly_low")
261 local firefly_high = minetest.get_decoration_id("fireflies:firefly_high")
262
263 minetest.set_gen_notify({decoration = true}, {firefly_low, firefly_high})
264
265 -- start nodetimers
266 minetest.register_on_generated(function(minp, maxp, blockseed)
267         local gennotify = minetest.get_mapgen_object("gennotify")
268         local poslist = {}
269
270         for _, pos in ipairs(gennotify["decoration#"..firefly_low] or {}) do
271                 local firefly_low_pos = {x = pos.x, y = pos.y + 3, z = pos.z}
272                 table.insert(poslist, firefly_low_pos)
273         end
274         for _, pos in ipairs(gennotify["decoration#"..firefly_high] or {}) do
275                 local firefly_high_pos = {x = pos.x, y = pos.y + 4, z = pos.z}
276                 table.insert(poslist, firefly_high_pos)
277         end
278
279         if #poslist ~= 0 then
280                 for i = 1, #poslist do
281                         local pos = poslist[i]
282                         minetest.get_node_timer(pos):start(1)
283                 end
284         end
285 end)