fcc34bbfd1a7b03a61efb8c2a66138d3cf758b92
[oweals/minetest_game.git] / mods / default / nodes.lua
1 -- mods/default/nodes.lua
2
3 minetest.register_node("default:stone", {
4         description = "Stone",
5         tiles = {"default_stone.png"},
6         is_ground_content = true,
7         groups = {cracky=3, stone=1},
8         drop = 'default:cobble',
9         legacy_mineral = true,
10         sounds = default.node_sound_stone_defaults(),
11 })
12
13 minetest.register_node("default:desert_stone", {
14         description = "Desert Stone",
15         tiles = {"default_desert_stone.png"},
16         is_ground_content = true,
17         groups = {cracky=3, stone=1},
18         drop = 'default:desert_cobble',
19         legacy_mineral = true,
20         sounds = default.node_sound_stone_defaults(),
21 })
22
23 minetest.register_node("default:stone_with_coal", {
24         description = "Coal Ore",
25         tiles = {"default_stone.png^default_mineral_coal.png"},
26         is_ground_content = true,
27         groups = {cracky=3},
28         drop = 'default:coal_lump',
29         sounds = default.node_sound_stone_defaults(),
30 })
31
32 minetest.register_node("default:stone_with_iron", {
33         description = "Iron Ore",
34         tiles = {"default_stone.png^default_mineral_iron.png"},
35         is_ground_content = true,
36         groups = {cracky=2},
37         drop = 'default:iron_lump',
38         sounds = default.node_sound_stone_defaults(),
39 })
40
41 minetest.register_node("default:stone_with_copper", {
42         description = "Copper Ore",
43         tiles = {"default_stone.png^default_mineral_copper.png"},
44         is_ground_content = true,
45         groups = {cracky=2},
46         drop = 'default:copper_lump',
47         sounds = default.node_sound_stone_defaults(),
48 })
49
50 minetest.register_node("default:stone_with_mese", {
51         description = "Mese Ore",
52         tiles = {"default_stone.png^default_mineral_mese.png"},
53         is_ground_content = true,
54         groups = {cracky=1},
55         drop = "default:mese_crystal",
56         sounds = default.node_sound_stone_defaults(),
57 })
58
59 minetest.register_node("default:stone_with_gold", {
60         description = "Gold Ore",
61         tiles = {"default_stone.png^default_mineral_gold.png"},
62         is_ground_content = true,
63         groups = {cracky=2},
64         drop = "default:gold_lump",
65         sounds = default.node_sound_stone_defaults(),
66 })
67
68 minetest.register_node("default:stone_with_diamond", {
69         description = "Diamond Ore",
70         tiles = {"default_stone.png^default_mineral_diamond.png"},
71         is_ground_content = true,
72         groups = {cracky=1},
73         drop = "default:diamond",
74         sounds = default.node_sound_stone_defaults(),
75 })
76
77 minetest.register_node("default:stonebrick", {
78         description = "Stone Brick",
79         tiles = {"default_stone_brick.png"},
80         groups = {cracky=2, stone=1},
81         sounds = default.node_sound_stone_defaults(),
82 })
83
84 minetest.register_node("default:desert_stonebrick", {
85         description = "Desert Stone Brick",
86         tiles = {"default_desert_stone_brick.png"},
87         groups = {cracky=2, stone=1},
88         sounds = default.node_sound_stone_defaults(),
89 })
90
91 minetest.register_node("default:dirt_with_grass", {
92         description = "Dirt with Grass",
93         tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
94         is_ground_content = true,
95         groups = {crumbly=3,soil=1},
96         drop = 'default:dirt',
97         sounds = default.node_sound_dirt_defaults({
98                 footstep = {name="default_grass_footstep", gain=0.25},
99         }),
100 })
101
102 minetest.register_node("default:dirt_with_grass_footsteps", {
103         description = "Dirt with Grass and Footsteps",
104         tiles = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
105         is_ground_content = true,
106         groups = {crumbly=3,soil=1,not_in_creative_inventory=1},
107         drop = 'default:dirt',
108         sounds = default.node_sound_dirt_defaults({
109                 footstep = {name="default_grass_footstep", gain=0.25},
110         }),
111 })
112
113 minetest.register_node("default:dirt_with_snow", {
114         description = "Dirt with Snow",
115         tiles = {"default_snow.png", "default_dirt.png", "default_dirt.png^default_snow_side.png"},
116         is_ground_content = true,
117         groups = {crumbly=3,soil=1},
118         drop = 'default:dirt',
119         sounds = default.node_sound_dirt_defaults({
120                 footstep = {name="default_snow_footstep", gain=0.25},
121         }),
122 })
123
124 minetest.register_node("default:dirt", {
125         description = "Dirt",
126         tiles = {"default_dirt.png"},
127         is_ground_content = true,
128         groups = {crumbly=3,soil=1},
129         sounds = default.node_sound_dirt_defaults(),
130 })
131
132 minetest.register_abm({
133         nodenames = {"default:dirt"},
134         interval = 2,
135         chance = 200,
136         action = function(pos, node)
137                 local above = {x=pos.x, y=pos.y+1, z=pos.z}
138                 local name = minetest.get_node(above).name
139                 local nodedef = minetest.registered_nodes[name]
140                 if nodedef and (nodedef.sunlight_propagates or nodedef.paramtype == "light")
141                                 and nodedef.liquidtype == "none"
142                                 and (minetest.get_node_light(above) or 0) >= 13 then
143                         if name == "default:snow" or name == "default:snowblock" then
144                                 minetest.set_node(pos, {name = "default:dirt_with_snow"})
145                         else
146                                 minetest.set_node(pos, {name = "default:dirt_with_grass"})
147                         end
148                 end
149         end
150 })
151
152 minetest.register_abm({
153         nodenames = {"default:dirt_with_grass"},
154         interval = 2,
155         chance = 20,
156         action = function(pos, node)
157                 local above = {x=pos.x, y=pos.y+1, z=pos.z}
158                 local name = minetest.get_node(above).name
159                 local nodedef = minetest.registered_nodes[name]
160                 if name ~= "ignore" and nodedef
161                                 and not ((nodedef.sunlight_propagates or nodedef.paramtype == "light")
162                                 and nodedef.liquidtype == "none") then
163                         minetest.set_node(pos, {name = "default:dirt"})
164                 end
165         end
166 })
167
168 minetest.register_node("default:sand", {
169         description = "Sand",
170         tiles = {"default_sand.png"},
171         is_ground_content = true,
172         groups = {crumbly=3, falling_node=1, sand=1},
173         sounds = default.node_sound_sand_defaults(),
174 })
175
176 minetest.register_node("default:desert_sand", {
177         description = "Desert Sand",
178         tiles = {"default_desert_sand.png"},
179         is_ground_content = true,
180         groups = {crumbly=3, falling_node=1, sand=1},
181         sounds = default.node_sound_sand_defaults(),
182 })
183
184 minetest.register_node("default:gravel", {
185         description = "Gravel",
186         tiles = {"default_gravel.png"},
187         is_ground_content = true,
188         groups = {crumbly=2, falling_node=1},
189         sounds = default.node_sound_dirt_defaults({
190                 footstep = {name="default_gravel_footstep", gain=0.5},
191                 dug = {name="default_gravel_footstep", gain=1.0},
192         }),
193 })
194
195 minetest.register_node("default:sandstone", {
196         description = "Sandstone",
197         tiles = {"default_sandstone.png"},
198         is_ground_content = true,
199         groups = {crumbly=2,cracky=3},
200         sounds = default.node_sound_stone_defaults(),
201 })
202
203 minetest.register_node("default:sandstonebrick", {
204         description = "Sandstone Brick",
205         tiles = {"default_sandstone_brick.png"},
206         is_ground_content = true,
207         groups = {cracky=2},
208         sounds = default.node_sound_stone_defaults(),
209 })
210
211 minetest.register_node("default:clay", {
212         description = "Clay",
213         tiles = {"default_clay.png"},
214         is_ground_content = true,
215         groups = {crumbly=3},
216         drop = 'default:clay_lump 4',
217         sounds = default.node_sound_dirt_defaults(),
218 })
219
220 minetest.register_node("default:brick", {
221         description = "Brick Block",
222         tiles = {"default_brick.png"},
223         is_ground_content = false,
224         groups = {cracky=3},
225         sounds = default.node_sound_stone_defaults(),
226 })
227
228 minetest.register_node("default:tree", {
229         description = "Tree",
230         tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
231         paramtype2 = "facedir",
232         is_ground_content = false,
233         groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
234         sounds = default.node_sound_wood_defaults(),
235         on_place = minetest.rotate_node
236 })
237
238 minetest.register_node("default:jungletree", {
239         description = "Jungle Tree",
240         tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
241         paramtype2 = "facedir",
242         is_ground_content = false,
243         groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
244         sounds = default.node_sound_wood_defaults(),
245         on_place = minetest.rotate_node
246 })
247
248 minetest.register_node("default:junglewood", {
249         description = "Junglewood Planks",
250         tiles = {"default_junglewood.png"},
251         groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
252         sounds = default.node_sound_wood_defaults(),
253 })
254
255 minetest.register_node("default:jungleleaves", {
256         description = "Jungle Leaves",
257         drawtype = "allfaces_optional",
258         waving = 1,
259         visual_scale = 1.3,
260         tiles = {"default_jungleleaves.png"},
261         paramtype = "light",
262         is_ground_content = false,
263         groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
264         drop = {
265                 max_items = 1,
266                 items = {
267                         {
268                                 -- player will get sapling with 1/20 chance
269                                 items = {'default:junglesapling'},
270                                 rarity = 20,
271                         },
272                         {
273                                 -- player will get leaves only if he get no saplings,
274                                 -- this is because max_items is 1
275                                 items = {'default:jungleleaves'},
276                         }
277                 }
278         },
279         sounds = default.node_sound_leaves_defaults(),
280         after_place_node = default.after_place_leaves,
281 })
282
283 minetest.register_node("default:junglesapling", {
284         description = "Jungle Sapling",
285         drawtype = "plantlike",
286         visual_scale = 1.0,
287         tiles = {"default_junglesapling.png"},
288         inventory_image = "default_junglesapling.png",
289         wield_image = "default_junglesapling.png",
290         paramtype = "light",
291         walkable = false,
292         selection_box = {
293                 type = "fixed",
294                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
295         },
296         groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
297         sounds = default.node_sound_leaves_defaults(),
298 })
299
300 minetest.register_node("default:junglegrass", {
301         description = "Jungle Grass",
302         drawtype = "plantlike",
303         waving = 1,
304         visual_scale = 1.3,
305         tiles = {"default_junglegrass.png"},
306         inventory_image = "default_junglegrass.png",
307         wield_image = "default_junglegrass.png",
308         paramtype = "light",
309         walkable = false,
310         buildable_to = true,
311         is_ground_content = true,
312         groups = {snappy=3,flammable=2,flora=1,attached_node=1},
313         sounds = default.node_sound_leaves_defaults(),
314         selection_box = {
315                 type = "fixed",
316                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
317         },
318 })
319
320 minetest.register_node("default:leaves", {
321         description = "Leaves",
322         drawtype = "allfaces_optional",
323         waving = 1,
324         visual_scale = 1.3,
325         tiles = {"default_leaves.png"},
326         paramtype = "light",
327         is_ground_content = false,
328         groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
329         drop = {
330                 max_items = 1,
331                 items = {
332                         {
333                                 -- player will get sapling with 1/20 chance
334                                 items = {'default:sapling'},
335                                 rarity = 20,
336                         },
337                         {
338                                 -- player will get leaves only if he get no saplings,
339                                 -- this is because max_items is 1
340                                 items = {'default:leaves'},
341                         }
342                 }
343         },
344         sounds = default.node_sound_leaves_defaults(),
345         after_place_node = default.after_place_leaves,
346 })
347
348 minetest.register_node("default:cactus", {
349         description = "Cactus",
350         tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
351         paramtype2 = "facedir",
352         is_ground_content = true,
353         groups = {snappy=1,choppy=3,flammable=2},
354         sounds = default.node_sound_wood_defaults(),
355         on_place = minetest.rotate_node,
356         after_dig_node = function(pos, node, metadata, digger)
357                 default.dig_up(pos, node, digger)
358         end,
359 })
360
361 minetest.register_node("default:papyrus", {
362         description = "Papyrus",
363         drawtype = "plantlike",
364         tiles = {"default_papyrus.png"},
365         inventory_image = "default_papyrus.png",
366         wield_image = "default_papyrus.png",
367         paramtype = "light",
368         walkable = false,
369         is_ground_content = true,
370         selection_box = {
371                 type = "fixed",
372                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3}
373         },
374         groups = {snappy=3,flammable=2},
375         sounds = default.node_sound_leaves_defaults(),
376         after_dig_node = function(pos, node, metadata, digger)
377                 default.dig_up(pos, node, digger)
378         end,
379 })
380
381 default.bookshelf_formspec =
382         "size[8,7;]"..
383         default.gui_bg..
384         default.gui_bg_img..
385         default.gui_slots..
386         "list[context;books;0,0.3;8,2;]"..
387         "list[current_player;main;0,2.85;8,1;]"..
388         "list[current_player;main;0,4.08;8,3;8]"..
389         default.get_hotbar_bg(0,2.85)
390
391 minetest.register_node("default:bookshelf", {
392         description = "Bookshelf",
393         tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
394         is_ground_content = false,
395         groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3},
396         sounds = default.node_sound_wood_defaults(),
397         on_construct = function(pos)
398                 local meta = minetest.get_meta(pos)
399                 meta:set_string("formspec", default.bookshelf_formspec)
400                 local inv = meta:get_inventory()
401                 inv:set_size("books", 8*2)
402         end,
403         can_dig = function(pos,player)
404                 local meta = minetest.get_meta(pos);
405                 local inv = meta:get_inventory()
406                 return inv:is_empty("books")
407         end,
408
409         allow_metadata_inventory_put = function(pos, listname, index, stack, player)
410                 local meta = minetest.get_meta(pos)
411                 local inv = meta:get_inventory()
412                 local to_stack = inv:get_stack(listname, index)
413                 if listname == "books" then
414                         if minetest.get_item_group(stack:get_name(), "book") ~= 0
415                                         and to_stack:is_empty() then
416                                 return 1
417                         else
418                                 return 0
419                         end
420                 end
421         end,
422
423         allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
424                 local meta = minetest.get_meta(pos)
425                 local inv = meta:get_inventory()
426                 local stack = inv:get_stack(from_list, from_index)
427                 local to_stack = inv:get_stack(to_list, to_index)
428                 if to_list == "books" then
429                         if stack:get_name() == "default:book" and to_stack:is_empty() then
430                                 return 1
431                         else
432                                 return 0
433                         end
434                 end
435         end,
436
437         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
438                 minetest.log("action", player:get_player_name()..
439                            " moves stuff in bookshelf at "..minetest.pos_to_string(pos))
440         end,
441         on_metadata_inventory_put = function(pos, listname, index, stack, player)
442                 minetest.log("action", player:get_player_name()..
443                            " moves stuff to bookshelf at "..minetest.pos_to_string(pos))
444         end,
445         on_metadata_inventory_take = function(pos, listname, index, stack, player)
446                 minetest.log("action", player:get_player_name()..
447                            " takes stuff from bookshelf at "..minetest.pos_to_string(pos))
448         end,
449 })
450
451 minetest.register_node("default:glass", {
452         description = "Glass",
453         drawtype = "glasslike_framed_optional",
454         tiles = {"default_glass.png", "default_glass_detail.png"},
455         inventory_image = minetest.inventorycube("default_glass.png"),
456         paramtype = "light",
457         sunlight_propagates = true,
458         is_ground_content = false,
459         groups = {cracky=3,oddly_breakable_by_hand=3},
460         sounds = default.node_sound_glass_defaults(),
461 })
462
463 local fence_texture = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126"
464 minetest.register_node("default:fence_wood", {
465         description = "Wooden Fence",
466         drawtype = "fencelike",
467         tiles = {"default_wood.png"},
468         inventory_image = fence_texture,
469         wield_image = fence_texture,
470         paramtype = "light",
471         is_ground_content = false,
472         selection_box = {
473                 type = "fixed",
474                 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
475         },
476         groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2},
477         sounds = default.node_sound_wood_defaults(),
478 })
479
480 minetest.register_node("default:rail", {
481         description = "Rail",
482         drawtype = "raillike",
483         tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
484         inventory_image = "default_rail.png",
485         wield_image = "default_rail.png",
486         paramtype = "light",
487         walkable = false,
488         is_ground_content = false,
489         selection_box = {
490                 type = "fixed",
491                 -- but how to specify the dimensions for curved and sideways rails?
492                 fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
493         },
494         groups = {bendy=2,dig_immediate=2,attached_node=1},
495 })
496
497 minetest.register_node("default:ladder", {
498         description = "Ladder",
499         drawtype = "signlike",
500         tiles = {"default_ladder.png"},
501         inventory_image = "default_ladder.png",
502         wield_image = "default_ladder.png",
503         paramtype = "light",
504         paramtype2 = "wallmounted",
505         walkable = false,
506         climbable = true,
507         is_ground_content = false,
508         selection_box = {
509                 type = "wallmounted",
510                 --wall_top = = <default>
511                 --wall_bottom = = <default>
512                 --wall_side = = <default>
513         },
514         groups = {choppy=2,oddly_breakable_by_hand=3,flammable=2},
515         legacy_wallmounted = true,
516         sounds = default.node_sound_wood_defaults(),
517 })
518
519 minetest.register_node("default:wood", {
520         description = "Wooden Planks",
521         tiles = {"default_wood.png"},
522         groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
523         sounds = default.node_sound_wood_defaults(),
524 })
525
526 minetest.register_node("default:cloud", {
527         description = "Cloud",
528         tiles = {"default_cloud.png"},
529         sounds = default.node_sound_defaults(),
530         groups = {not_in_creative_inventory=1},
531 })
532
533 minetest.register_node("default:water_flowing", {
534         description = "Flowing Water",
535         inventory_image = minetest.inventorycube("default_water.png"),
536         drawtype = "flowingliquid",
537         tiles = {"default_water.png"},
538         special_tiles = {
539                 {
540                         image="default_water_flowing_animated.png",
541                         backface_culling=false,
542                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8}
543                 },
544                 {
545                         image="default_water_flowing_animated.png",
546                         backface_culling=true,
547                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8}
548                 },
549         },
550         alpha = 160,
551         paramtype = "light",
552         paramtype2 = "flowingliquid",
553         walkable = false,
554         pointable = false,
555         diggable = false,
556         buildable_to = true,
557         drop = "",
558         drowning = 1,
559         liquidtype = "flowing",
560         liquid_alternative_flowing = "default:water_flowing",
561         liquid_alternative_source = "default:water_source",
562         liquid_viscosity = 1,
563         post_effect_color = {a=64, r=100, g=100, b=200},
564         groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1},
565 })
566
567 minetest.register_node("default:water_source", {
568         description = "Water Source",
569         inventory_image = minetest.inventorycube("default_water.png"),
570         drawtype = "liquid",
571         tiles = {
572                 {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}
573         },
574         special_tiles = {
575                 -- New-style water source material (mostly unused)
576                 {
577                         name="default_water_source_animated.png",
578                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0},
579                         backface_culling = false,
580                 }
581         },
582         alpha = 160,
583         paramtype = "light",
584         walkable = false,
585         pointable = false,
586         diggable = false,
587         buildable_to = true,
588         drop = "",
589         drowning = 1,
590         liquidtype = "source",
591         liquid_alternative_flowing = "default:water_flowing",
592         liquid_alternative_source = "default:water_source",
593         liquid_viscosity = 1,
594         post_effect_color = {a=64, r=100, g=100, b=200},
595         groups = {water=3, liquid=3, puts_out_fire=1},
596 })
597
598 minetest.register_node("default:lava_flowing", {
599         description = "Flowing Lava",
600         inventory_image = minetest.inventorycube("default_lava.png"),
601         drawtype = "flowingliquid",
602         tiles = {"default_lava.png"},
603         special_tiles = {
604                 {
605                         image="default_lava_flowing_animated.png",
606                         backface_culling=false,
607                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3}
608                 },
609                 {
610                         image="default_lava_flowing_animated.png",
611                         backface_culling=true,
612                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3}
613                 },
614         },
615         paramtype = "light",
616         paramtype2 = "flowingliquid",
617         light_source = default.LIGHT_MAX - 1,
618         walkable = false,
619         pointable = false,
620         diggable = false,
621         buildable_to = true,
622         drop = "",
623         drowning = 1,
624         liquidtype = "flowing",
625         liquid_alternative_flowing = "default:lava_flowing",
626         liquid_alternative_source = "default:lava_source",
627         liquid_viscosity = 7,
628         liquid_renewable = false,
629         damage_per_second = 4*2,
630         post_effect_color = {a=192, r=255, g=64, b=0},
631         groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1},
632 })
633
634 minetest.register_node("default:lava_source", {
635         description = "Lava Source",
636         inventory_image = minetest.inventorycube("default_lava.png"),
637         drawtype = "liquid",
638         tiles = {
639                 {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
640         },
641         special_tiles = {
642                 -- New-style lava source material (mostly unused)
643                 {
644                         name="default_lava_source_animated.png",
645                         animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0},
646                         backface_culling = false,
647                 }
648         },
649         paramtype = "light",
650         light_source = default.LIGHT_MAX - 1,
651         walkable = false,
652         pointable = false,
653         diggable = false,
654         buildable_to = true,
655         drop = "",
656         drowning = 1,
657         liquidtype = "source",
658         liquid_alternative_flowing = "default:lava_flowing",
659         liquid_alternative_source = "default:lava_source",
660         liquid_viscosity = 7,
661         liquid_renewable = false,
662         damage_per_second = 4*2,
663         post_effect_color = {a=192, r=255, g=64, b=0},
664         groups = {lava=3, liquid=2, hot=3, igniter=1},
665 })
666
667 minetest.register_node("default:torch", {
668         description = "Torch",
669         drawtype = "torchlike",
670         --tiles = {"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"},
671         tiles = {
672                 {name="default_torch_on_floor_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}},
673                 {name="default_torch_on_ceiling_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}},
674                 {name="default_torch_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
675         },
676         inventory_image = "default_torch_on_floor.png",
677         wield_image = "default_torch_on_floor.png",
678         paramtype = "light",
679         paramtype2 = "wallmounted",
680         sunlight_propagates = true,
681         is_ground_content = false,
682         walkable = false,
683         light_source = default.LIGHT_MAX - 1,
684         selection_box = {
685                 type = "wallmounted",
686                 wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
687                 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
688                 wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
689         },
690         groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1},
691         legacy_wallmounted = true,
692         sounds = default.node_sound_defaults(),
693 })
694
695 minetest.register_node("default:sign_wall", {
696         description = "Sign",
697         drawtype = "nodebox",
698         tiles = {"default_sign.png"},
699         inventory_image = "default_sign_wall.png",
700         wield_image = "default_sign_wall.png",
701         paramtype = "light",
702         paramtype2 = "wallmounted",
703         sunlight_propagates = true,
704         is_ground_content = false,
705         walkable = false,
706         node_box = {
707                 type = "wallmounted",
708                 wall_top    = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125},
709                 wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125},
710                 wall_side   = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375},
711         },
712         groups = {choppy=2,dig_immediate=2,attached_node=1},
713         legacy_wallmounted = true,
714         sounds = default.node_sound_defaults(),
715         on_construct = function(pos)
716                 --local n = minetest.get_node(pos)
717                 local meta = minetest.get_meta(pos)
718                 meta:set_string("formspec", "field[text;;${text}]")
719                 meta:set_string("infotext", "\"\"")
720         end,
721         on_receive_fields = function(pos, formname, fields, sender)
722                 --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
723                 if minetest.is_protected(pos, sender:get_player_name()) then
724                         minetest.record_protection_violation(pos, sender:get_player_name())
725                         return
726                 end
727                 local meta = minetest.get_meta(pos)
728                 if not fields.text then return end
729                 minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text..
730                                 "\" to sign at "..minetest.pos_to_string(pos))
731                 meta:set_string("text", fields.text)
732                 meta:set_string("infotext", '"'..fields.text..'"')
733         end,
734 })
735
736 default.chest_formspec =
737         "size[8,9]"..
738         default.gui_bg..
739         default.gui_bg_img..
740         default.gui_slots..
741         "list[current_name;main;0,0.3;8,4;]"..
742         "list[current_player;main;0,4.85;8,1;]"..
743         "list[current_player;main;0,6.08;8,3;8]"..
744         default.get_hotbar_bg(0,4.85)
745
746 function default.get_locked_chest_formspec(pos)
747         local spos = pos.x .. "," .. pos.y .. "," ..pos.z
748         local formspec =
749                 "size[8,9]"..
750                 default.gui_bg..
751                 default.gui_bg_img..
752                 default.gui_slots..
753                 "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]"..
754                 "list[current_player;main;0,4.85;8,1;]"..
755                 "list[current_player;main;0,6.08;8,3;8]"..
756                 default.get_hotbar_bg(0,4.85)
757  return formspec
758 end
759
760
761 minetest.register_node("default:chest", {
762         description = "Chest",
763         tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
764                 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
765         paramtype2 = "facedir",
766         groups = {choppy=2,oddly_breakable_by_hand=2},
767         legacy_facedir_simple = true,
768         is_ground_content = false,
769         sounds = default.node_sound_wood_defaults(),
770         on_construct = function(pos)
771                 local meta = minetest.get_meta(pos)
772                 meta:set_string("formspec",default.chest_formspec)
773                 meta:set_string("infotext", "Chest")
774                 local inv = meta:get_inventory()
775                 inv:set_size("main", 8*4)
776         end,
777         can_dig = function(pos,player)
778                 local meta = minetest.get_meta(pos);
779                 local inv = meta:get_inventory()
780                 return inv:is_empty("main")
781         end,
782         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
783                 minetest.log("action", player:get_player_name()..
784                                 " moves stuff in chest at "..minetest.pos_to_string(pos))
785         end,
786     on_metadata_inventory_put = function(pos, listname, index, stack, player)
787                 minetest.log("action", player:get_player_name()..
788                                 " moves stuff to chest at "..minetest.pos_to_string(pos))
789         end,
790     on_metadata_inventory_take = function(pos, listname, index, stack, player)
791                 minetest.log("action", player:get_player_name()..
792                                 " takes stuff from chest at "..minetest.pos_to_string(pos))
793         end,
794 })
795
796 local function has_locked_chest_privilege(meta, player)
797         if player:get_player_name() ~= meta:get_string("owner") then
798                 return false
799         end
800         return true
801 end
802
803 minetest.register_node("default:chest_locked", {
804         description = "Locked Chest",
805         tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
806                 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
807         paramtype2 = "facedir",
808         groups = {choppy=2,oddly_breakable_by_hand=2},
809         legacy_facedir_simple = true,
810         is_ground_content = false,
811         sounds = default.node_sound_wood_defaults(),
812         after_place_node = function(pos, placer)
813                 local meta = minetest.get_meta(pos)
814                 meta:set_string("owner", placer:get_player_name() or "")
815                 meta:set_string("infotext", "Locked Chest (owned by "..
816                                 meta:get_string("owner")..")")
817         end,
818         on_construct = function(pos)
819                 local meta = minetest.get_meta(pos)
820                 meta:set_string("infotext", "Locked Chest")
821                 meta:set_string("owner", "")
822                 local inv = meta:get_inventory()
823                 inv:set_size("main", 8*4)
824         end,
825         can_dig = function(pos,player)
826                 local meta = minetest.get_meta(pos);
827                 local inv = meta:get_inventory()
828                 return inv:is_empty("main") and has_locked_chest_privilege(meta, player)
829         end,
830         allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
831                 local meta = minetest.get_meta(pos)
832                 if not has_locked_chest_privilege(meta, player) then
833                         return 0
834                 end
835                 return count
836         end,
837     allow_metadata_inventory_put = function(pos, listname, index, stack, player)
838                 local meta = minetest.get_meta(pos)
839                 if not has_locked_chest_privilege(meta, player) then
840                         return 0
841                 end
842                 return stack:get_count()
843         end,
844     allow_metadata_inventory_take = function(pos, listname, index, stack, player)
845                 local meta = minetest.get_meta(pos)
846                 if not has_locked_chest_privilege(meta, player) then
847                         return 0
848                 end
849                 return stack:get_count()
850         end,
851     on_metadata_inventory_put = function(pos, listname, index, stack, player)
852                 minetest.log("action", player:get_player_name()..
853                                 " moves stuff to locked chest at "..minetest.pos_to_string(pos))
854         end,
855     on_metadata_inventory_take = function(pos, listname, index, stack, player)
856                 minetest.log("action", player:get_player_name()..
857                                 " takes stuff from locked chest at "..minetest.pos_to_string(pos))
858         end,
859         on_rightclick = function(pos, node, clicker)
860                 local meta = minetest.get_meta(pos)
861                 if has_locked_chest_privilege(meta, clicker) then
862                         minetest.show_formspec(
863                                 clicker:get_player_name(),
864                                 "default:chest_locked",
865                                 default.get_locked_chest_formspec(pos)
866                         )
867                 end
868         end,
869 })
870
871 minetest.register_node("default:cobble", {
872         description = "Cobblestone",
873         tiles = {"default_cobble.png"},
874         is_ground_content = true,
875         groups = {cracky=3, stone=2},
876         sounds = default.node_sound_stone_defaults(),
877 })
878
879 minetest.register_node("default:desert_cobble", {
880         description = "Desert Cobblestone",
881         tiles = {"default_desert_cobble.png"},
882         is_ground_content = true,
883         groups = {cracky=3, stone=2},
884         sounds = default.node_sound_stone_defaults(),
885 })
886
887 minetest.register_node("default:mossycobble", {
888         description = "Mossy Cobblestone",
889         tiles = {"default_mossycobble.png"},
890         is_ground_content = true,
891         groups = {cracky=3},
892         sounds = default.node_sound_stone_defaults(),
893 })
894
895 minetest.register_node("default:coalblock", {
896         description = "Coal Block",
897         tiles = {"default_coal_block.png"},
898         is_ground_content = true,
899         groups = {cracky=3},
900         sounds = default.node_sound_stone_defaults(),
901 })
902
903 minetest.register_node("default:steelblock", {
904         description = "Steel Block",
905         tiles = {"default_steel_block.png"},
906         is_ground_content = true,
907         groups = {cracky=1,level=2},
908         sounds = default.node_sound_stone_defaults(),
909 })
910
911 minetest.register_node("default:copperblock", {
912         description = "Copper Block",
913         tiles = {"default_copper_block.png"},
914         is_ground_content = true,
915         groups = {cracky=1,level=2},
916         sounds = default.node_sound_stone_defaults(),
917 })
918
919 minetest.register_node("default:bronzeblock", {
920         description = "Bronze Block",
921         tiles = {"default_bronze_block.png"},
922         is_ground_content = true,
923         groups = {cracky=1,level=2},
924         sounds = default.node_sound_stone_defaults(),
925 })
926
927 minetest.register_node("default:mese", {
928         description = "Mese Block",
929         tiles = {"default_mese_block.png"},
930         is_ground_content = true,
931         groups = {cracky=1,level=2},
932         sounds = default.node_sound_stone_defaults(),
933 })
934 minetest.register_alias("default:mese_block", "default:mese")
935
936 minetest.register_node("default:goldblock", {
937         description = "Gold Block",
938         tiles = {"default_gold_block.png"},
939         is_ground_content = true,
940         groups = {cracky=1},
941         sounds = default.node_sound_stone_defaults(),
942 })
943
944 minetest.register_node("default:diamondblock", {
945         description = "Diamond Block",
946         tiles = {"default_diamond_block.png"},
947         is_ground_content = true,
948         groups = {cracky=1,level=3},
949         sounds = default.node_sound_stone_defaults(),
950 })
951
952 minetest.register_node("default:obsidian_glass", {
953         description = "Obsidian Glass",
954         drawtype = "glasslike",
955         tiles = {"default_obsidian_glass.png"},
956         paramtype = "light",
957         is_ground_content = false,
958         sunlight_propagates = true,
959         sounds = default.node_sound_glass_defaults(),
960         groups = {cracky=3,oddly_breakable_by_hand=3},
961 })
962
963 minetest.register_node("default:obsidian", {
964         description = "Obsidian",
965         tiles = {"default_obsidian.png"},
966         is_ground_content = true,
967         sounds = default.node_sound_stone_defaults(),
968         groups = {cracky=1,level=2},
969 })
970
971 minetest.register_node("default:obsidianbrick", {
972         description = "Obsidian Brick",
973         tiles = {"default_obsidian_brick.png"},
974         sounds = default.node_sound_stone_defaults(),
975         groups = {cracky=1,level=2},
976 })
977
978 minetest.register_node("default:nyancat", {
979         description = "Nyan Cat",
980         tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
981                 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
982         paramtype2 = "facedir",
983         groups = {cracky=2},
984         is_ground_content = false,
985         legacy_facedir_simple = true,
986         sounds = default.node_sound_defaults(),
987 })
988
989 minetest.register_node("default:nyancat_rainbow", {
990         description = "Nyan Cat Rainbow",
991         tiles = {"default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90",
992                 "default_nc_rb.png", "default_nc_rb.png"},
993         paramtype2 = "facedir",
994         groups = {cracky=2},
995         is_ground_content = false,
996         sounds = default.node_sound_defaults(),
997 })
998
999 minetest.register_node("default:sapling", {
1000         description = "Sapling",
1001         drawtype = "plantlike",
1002         visual_scale = 1.0,
1003         tiles = {"default_sapling.png"},
1004         inventory_image = "default_sapling.png",
1005         wield_image = "default_sapling.png",
1006         paramtype = "light",
1007         walkable = false,
1008         is_ground_content = true,
1009         selection_box = {
1010                 type = "fixed",
1011                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
1012         },
1013         groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
1014         sounds = default.node_sound_leaves_defaults(),
1015 })
1016
1017 minetest.register_node("default:apple", {
1018         description = "Apple",
1019         drawtype = "plantlike",
1020         visual_scale = 1.0,
1021         tiles = {"default_apple.png"},
1022         inventory_image = "default_apple.png",
1023         paramtype = "light",
1024         sunlight_propagates = true,
1025         walkable = false,
1026         is_ground_content = true,
1027         selection_box = {
1028                 type = "fixed",
1029                 fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
1030         },
1031         groups = {fleshy=3,dig_immediate=3,flammable=2,leafdecay=3,leafdecay_drop=1},
1032         on_use = minetest.item_eat(1),
1033         sounds = default.node_sound_leaves_defaults(),
1034         after_place_node = function(pos, placer, itemstack)
1035                 if placer:is_player() then
1036                         minetest.set_node(pos, {name="default:apple", param2=1})
1037                 end
1038         end,
1039 })
1040
1041 minetest.register_node("default:dry_shrub", {
1042         description = "Dry Shrub",
1043         drawtype = "plantlike",
1044         waving = 1,
1045         visual_scale = 1.0,
1046         tiles = {"default_dry_shrub.png"},
1047         inventory_image = "default_dry_shrub.png",
1048         wield_image = "default_dry_shrub.png",
1049         paramtype = "light",
1050         walkable = false,
1051         is_ground_content = true,
1052         buildable_to = true,
1053         groups = {snappy=3,flammable=3,attached_node=1},
1054         sounds = default.node_sound_leaves_defaults(),
1055         selection_box = {
1056                 type = "fixed",
1057                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1058         },
1059 })
1060
1061 minetest.register_node("default:grass_1", {
1062         description = "Grass",
1063         drawtype = "plantlike",
1064         waving = 1,
1065         tiles = {"default_grass_1.png"},
1066         -- use a bigger inventory image
1067         inventory_image = "default_grass_3.png",
1068         wield_image = "default_grass_3.png",
1069         paramtype = "light",
1070         walkable = false,
1071         is_ground_content = true,
1072         buildable_to = true,
1073         groups = {snappy=3,flammable=3,flora=1,attached_node=1},
1074         sounds = default.node_sound_leaves_defaults(),
1075         selection_box = {
1076                 type = "fixed",
1077                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1078         },
1079         on_place = function(itemstack, placer, pointed_thing)
1080                 -- place a random grass node
1081                 local stack = ItemStack("default:grass_"..math.random(1,5))
1082                 local ret = minetest.item_place(stack, placer, pointed_thing)
1083                 return ItemStack("default:grass_1 "..itemstack:get_count()-(1-ret:get_count()))
1084         end,
1085 })
1086
1087 for i=2,5 do
1088         minetest.register_node("default:grass_"..i, {
1089                 description = "Grass",
1090                 drawtype = "plantlike",
1091                 waving = 1,
1092                 tiles = {"default_grass_"..i..".png"},
1093                 inventory_image = "default_grass_"..i..".png",
1094                 wield_image = "default_grass_"..i..".png",
1095                 paramtype = "light",
1096                 walkable = false,
1097                 buildable_to = true,
1098                 is_ground_content = true,
1099                 drop = "default:grass_1",
1100                 groups = {snappy=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1},
1101                 sounds = default.node_sound_leaves_defaults(),
1102                 selection_box = {
1103                         type = "fixed",
1104                         fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1105                 },
1106         })
1107 end
1108
1109 minetest.register_node("default:ice", {
1110         description = "Ice",
1111         tiles = {"default_ice.png"},
1112         is_ground_content = true,
1113         paramtype = "light",
1114         groups = {cracky=3},
1115         sounds = default.node_sound_glass_defaults(),
1116 })
1117
1118 minetest.register_node("default:snow", {
1119         description = "Snow",
1120         tiles = {"default_snow.png"},
1121         inventory_image = "default_snowball.png",
1122         wield_image = "default_snowball.png",
1123         is_ground_content = true,
1124         paramtype = "light",
1125         buildable_to = true,
1126         drawtype = "nodebox",
1127         node_box = {
1128                 type = "fixed",
1129                 fixed = {
1130                         {-0.5, -0.5, -0.5,  0.5, -0.5+2/16, 0.5},
1131                 },
1132         },
1133         groups = {crumbly=3,falling_node=1},
1134         sounds = default.node_sound_dirt_defaults({
1135                 footstep = {name="default_snow_footstep", gain=0.25},
1136                 dug = {name="default_snow_footstep", gain=0.75},
1137         }),
1138         on_construct = function(pos)
1139                 pos.y = pos.y - 1
1140                 if minetest.get_node(pos).name == "default:dirt_with_grass" then
1141                         minetest.set_node(pos, {name="default:dirt_with_snow"})
1142                 end
1143         end,
1144 })
1145 minetest.register_alias("snow", "default:snow")
1146
1147 minetest.register_node("default:snowblock", {
1148         description = "Snow Block",
1149         tiles = {"default_snow.png"},
1150         is_ground_content = true,
1151         groups = {crumbly=3},
1152         sounds = default.node_sound_dirt_defaults({
1153                 footstep = {name="default_snow_footstep", gain=0.25},
1154                 dug = {name="default_snow_footstep", gain=0.75},
1155         }),
1156 })
1157
1158 minetest.register_node("default:pine_needles",{
1159         description = "Pine Needles",
1160         drawtype = "allfaces_optional",
1161         visual_scale = 1.3,
1162         tiles = {"default_pine_needles.png"},
1163         waving = 1,
1164         paramtype = "light",
1165         is_ground_content = false,
1166         groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
1167         drop = {
1168                 max_items = 1,
1169                 items = {
1170                         {
1171                                 -- player will get sapling with 1/20 chance
1172                                 items = {"default:pine_sapling"},
1173                                 rarity = 20,
1174                         },
1175                         {
1176                                 -- player will get leaves only if he get no saplings,
1177                                 -- this is because max_items is 1
1178                                 items = {"default:pine_needles"},
1179                         }
1180                 }
1181         },
1182         sounds = default.node_sound_leaves_defaults(),
1183         after_place_node = default.after_place_leaves,
1184 })
1185
1186 minetest.register_node("default:pine_sapling", {
1187         description = "Pine Sapling",
1188         drawtype = "plantlike",
1189         visual_scale = 1.0,
1190         tiles = {"default_pine_sapling.png"},
1191         inventory_image = "default_pine_sapling.png",
1192         wield_image = "default_pine_sapling.png",
1193         paramtype = "light",
1194         walkable = false,
1195         is_ground_content = true,
1196         selection_box = {
1197                 type = "fixed",
1198                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
1199         },
1200         groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
1201         sounds = default.node_sound_leaves_defaults(),
1202 })
1203
1204 minetest.register_node("default:pinetree", {
1205         description = "Pine Tree",
1206         tiles = {"default_pinetree_top.png", "default_pinetree_top.png", "default_pinetree.png"},
1207         paramtype2 = "facedir",
1208         is_ground_content = false,
1209         groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
1210         sounds = default.node_sound_wood_defaults(),
1211         on_place = minetest.rotate_node
1212 })
1213
1214 minetest.register_node("default:pinewood", {
1215         description = "Pinewood Planks",
1216         tiles = {"default_pinewood.png"},
1217         groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
1218         sounds = default.node_sound_wood_defaults(),
1219 })
1220