Default: Add snow, snowblock, ice to puts_out_fire group
[oweals/minetest_game.git] / mods / default / nodes.lua
1 -- mods/default/nodes.lua
2
3
4 --[[ Node name convention:
5
6 Although many node names are in combined-word form, the required form for new
7 node names is words separated by underscores. If both forms are used in written
8 language (for example pinewood and pine wood) the underscore form should be used.
9
10 --]]
11
12
13 --[[ Index:
14
15 Stone
16 -----
17 (1. Material 2. Cobble variant 3. Brick variant [4. Modified forms])
18
19 default:stone
20 default:cobble
21 default:stonebrick
22 default:mossycobble
23
24 default:desert_stone
25 default:desert_cobble
26 default:desert_stonebrick
27
28 default:sandstone
29 default:sandstonebrick
30
31 default:obsidian
32 default:obsidianbrick
33
34 Soft / Non-Stone
35 ----------------
36 (1. Material [2. Modified forms])
37
38 default:dirt
39 default:dirt_with_grass
40 default:dirt_with_grass_footsteps
41 default:dirt_with_dry_grass
42 default:dirt_with_snow
43
44 default:sand
45 default:desert_sand
46
47 default:gravel
48
49 default:clay
50
51 default:snow
52 default:snowblock
53
54 default:ice
55
56 Trees
57 -----
58 (1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling [5. Fruits])
59
60 default:tree
61 default:wood
62 default:leaves
63 default:sapling
64 default:apple
65
66 default:jungletree
67 default:junglewood
68 default:jungleleaves
69 default:junglesapling
70
71 default:pine_tree
72 default:pine_wood
73 default:pine_needles
74 default:pine_sapling
75
76 default:acacia_tree
77 default:acacia_wood
78 default:acacia_leaves
79 default:acacia_sapling
80
81 Ores
82 ----
83 (1. In stone 2. Block)
84
85 default:stone_with_coal
86 default:coalblock
87
88 default:stone_with_iron
89 default:steelblock
90
91 default:stone_with_copper
92 default:copperblock
93 default:bronzeblock
94
95 default:stone_with_gold
96 default:goldblock
97
98 default:stone_with_mese
99 default:mese
100
101 default:stone_with_diamond
102 default:diamondblock
103
104 Plantlife (non-cubic)
105 ---------------------
106 default:cactus
107 default:papyrus
108 default:dry_shrub
109 default:junglegrass
110
111 default:grass_1
112 default:grass_2
113 default:grass_3
114 default:grass_4
115 default:grass_5
116
117 default:dry_grass_1
118 default:dry_grass_2
119 default:dry_grass_3
120 default:dry_grass_4
121 default:dry_grass_5
122
123 Liquids
124 -------
125 (1. Source 2. Flowing)
126
127 default:water_source
128 default:water_flowing
129
130 default:river_water_source
131 default:river_water_flowing
132
133 default:lava_source
134 default:lava_flowing
135
136 Tools / "Advanced" crafting / Non-"natural"
137 -------------------------------------------
138 default:torch
139
140 default:chest
141 default:chest_locked
142
143 default:bookshelf
144
145 default:sign_wall
146 default:ladder
147 default:fence_wood
148
149 default:glass
150 default:obsidian_glass
151
152 default:rail
153
154 default:brick
155
156 default:meselamp
157
158 Misc
159 ----
160 default:cloud
161 default:nyancat
162 default:nyancat_rainbow
163
164 --]]
165
166 --
167 -- Stone
168 --
169
170 minetest.register_node("default:stone", {
171         description = "Stone",
172         tiles = {"default_stone.png"},
173         groups = {cracky=3, stone=1},
174         drop = 'default:cobble',
175         legacy_mineral = true,
176         sounds = default.node_sound_stone_defaults(),
177 })
178
179 minetest.register_node("default:cobble", {
180         description = "Cobblestone",
181         tiles = {"default_cobble.png"},
182         is_ground_content = false,
183         groups = {cracky=3, stone=2},
184         sounds = default.node_sound_stone_defaults(),
185 })
186
187 minetest.register_node("default:stonebrick", {
188         description = "Stone Brick",
189         tiles = {"default_stone_brick.png"},
190         is_ground_content = false,
191         groups = {cracky=2, stone=1},
192         sounds = default.node_sound_stone_defaults(),
193 })
194
195 minetest.register_node("default:mossycobble", {
196         description = "Mossy Cobblestone",
197         tiles = {"default_mossycobble.png"},
198         is_ground_content = false,
199         groups = {cracky=3, stone=1},
200         sounds = default.node_sound_stone_defaults(),
201 })
202
203
204
205 minetest.register_node("default:desert_stone", {
206         description = "Desert Stone",
207         tiles = {"default_desert_stone.png"},
208         groups = {cracky=3, stone=1},
209         drop = 'default:desert_cobble',
210         legacy_mineral = true,
211         sounds = default.node_sound_stone_defaults(),
212 })
213
214 minetest.register_node("default:desert_cobble", {
215         description = "Desert Cobblestone",
216         tiles = {"default_desert_cobble.png"},
217         is_ground_content = false,
218         groups = {cracky=3, stone=2},
219         sounds = default.node_sound_stone_defaults(),
220 })
221
222 minetest.register_node("default:desert_stonebrick", {
223         description = "Desert Stone Brick",
224         tiles = {"default_desert_stone_brick.png"},
225         is_ground_content = false,
226         groups = {cracky=2, stone=1},
227         sounds = default.node_sound_stone_defaults(),
228 })
229
230
231
232 minetest.register_node("default:sandstone", {
233         description = "Sandstone",
234         tiles = {"default_sandstone.png"},
235         groups = {crumbly=2,cracky=3},
236         sounds = default.node_sound_stone_defaults(),
237 })
238
239 minetest.register_node("default:sandstonebrick", {
240         description = "Sandstone Brick",
241         tiles = {"default_sandstone_brick.png"},
242         is_ground_content = false,
243         groups = {cracky=2},
244         sounds = default.node_sound_stone_defaults(),
245 })
246
247
248
249 minetest.register_node("default:obsidian", {
250         description = "Obsidian",
251         tiles = {"default_obsidian.png"},
252         sounds = default.node_sound_stone_defaults(),
253         groups = {cracky=1,level=2},
254 })
255
256 minetest.register_node("default:obsidianbrick", {
257         description = "Obsidian Brick",
258         tiles = {"default_obsidian_brick.png"},
259         is_ground_content = false,
260         sounds = default.node_sound_stone_defaults(),
261         groups = {cracky=1,level=2},
262 })
263
264 --
265 -- Soft / Non-Stone
266 --
267
268 minetest.register_node("default:dirt", {
269         description = "Dirt",
270         tiles = {"default_dirt.png"},
271         groups = {crumbly=3,soil=1},
272         sounds = default.node_sound_dirt_defaults(),
273 })
274
275 minetest.register_node("default:dirt_with_grass", {
276         description = "Dirt with Grass",
277         tiles = {"default_grass.png", "default_dirt.png",
278                 {name = "default_dirt.png^default_grass_side.png",
279                         tileable_vertical = false}},
280         groups = {crumbly=3,soil=1},
281         drop = 'default:dirt',
282         sounds = default.node_sound_dirt_defaults({
283                 footstep = {name="default_grass_footstep", gain=0.25},
284         }),
285 })
286
287 minetest.register_node("default:dirt_with_grass_footsteps", {
288         description = "Dirt with Grass and Footsteps",
289         tiles = {"default_grass.png^default_footprint.png", "default_dirt.png",
290                 {name = "default_dirt.png^default_grass_side.png",
291                         tileable_vertical = false}},
292         groups = {crumbly=3,soil=1,not_in_creative_inventory=1},
293         drop = 'default:dirt',
294         sounds = default.node_sound_dirt_defaults({
295                 footstep = {name="default_grass_footstep", gain=0.25},
296         }),
297 })
298
299 minetest.register_node("default:dirt_with_dry_grass", {
300         description = "Dirt with Dry Grass",
301         tiles = {"default_dry_grass.png",
302                 "default_dirt.png",
303                 {name = "default_dirt.png^default_dry_grass_side.png",
304                         tileable_vertical = false}},
305         groups = {crumbly = 3, soil = 1},
306         drop = 'default:dirt',
307         sounds = default.node_sound_dirt_defaults({
308                 footstep = {name = "default_grass_footstep", gain = 0.4},
309         }),
310 })
311
312 minetest.register_node("default:dirt_with_snow", {
313         description = "Dirt with Snow",
314         tiles = {"default_snow.png", "default_dirt.png",
315                 {name = "default_dirt.png^default_snow_side.png",
316                         tileable_vertical = false}},
317         groups = {crumbly=3,soil=1},
318         drop = 'default:dirt',
319         sounds = default.node_sound_dirt_defaults({
320                 footstep = {name="default_snow_footstep", gain=0.25},
321         }),
322 })
323
324
325 minetest.register_node("default:sand", {
326         description = "Sand",
327         tiles = {"default_sand.png"},
328         groups = {crumbly=3, falling_node=1, sand=1},
329         sounds = default.node_sound_sand_defaults(),
330 })
331
332 minetest.register_node("default:desert_sand", {
333         description = "Desert Sand",
334         tiles = {"default_desert_sand.png"},
335         groups = {crumbly=3, falling_node=1, sand=1},
336         sounds = default.node_sound_sand_defaults(),
337 })
338
339
340
341 minetest.register_node("default:gravel", {
342         description = "Gravel",
343         tiles = {"default_gravel.png"},
344         groups = {crumbly=2, falling_node=1},
345         sounds = default.node_sound_dirt_defaults({
346                 footstep = {name="default_gravel_footstep", gain=0.5},
347                 dug = {name="default_gravel_footstep", gain=1.0},
348         }),
349 })
350
351
352
353 minetest.register_node("default:clay", {
354         description = "Clay",
355         tiles = {"default_clay.png"},
356         groups = {crumbly=3},
357         drop = 'default:clay_lump 4',
358         sounds = default.node_sound_dirt_defaults(),
359 })
360
361
362
363 minetest.register_node("default:snow", {
364         description = "Snow",
365         tiles = {"default_snow.png"},
366         inventory_image = "default_snowball.png",
367         wield_image = "default_snowball.png",
368         paramtype = "light",
369         buildable_to = true,
370         drawtype = "nodebox",
371         node_box = {
372                 type = "fixed",
373                 fixed = {
374                         {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
375                 },
376         },
377         groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1},
378         sounds = default.node_sound_dirt_defaults({
379                 footstep = {name = "default_snow_footstep", gain = 0.25},
380                 dug = {name = "default_snow_footstep", gain = 0.75},
381         }),
382
383         on_construct = function(pos)
384                 pos.y = pos.y - 1
385                 if minetest.get_node(pos).name == "default:dirt_with_grass" then
386                         minetest.set_node(pos, {name = "default:dirt_with_snow"})
387                 end
388         end,
389 })
390
391
392 minetest.register_node("default:snowblock", {
393         description = "Snow Block",
394         tiles = {"default_snow.png"},
395         groups = {crumbly = 3, puts_out_fire = 1},
396         sounds = default.node_sound_dirt_defaults({
397                 footstep = {name = "default_snow_footstep", gain = 0.25},
398                 dug = {name = "default_snow_footstep", gain = 0.75},
399         }),
400 })
401
402
403
404 minetest.register_node("default:ice", {
405         description = "Ice",
406         tiles = {"default_ice.png"},
407         is_ground_content = false,
408         paramtype = "light",
409         groups = {cracky = 3, puts_out_fire = 1},
410         sounds = default.node_sound_glass_defaults(),
411 })
412
413 --
414 -- Trees
415 --
416
417 minetest.register_node("default:tree", {
418         description = "Tree",
419         tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
420         paramtype2 = "facedir",
421         is_ground_content = false,
422         groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
423         sounds = default.node_sound_wood_defaults(),
424
425         on_place = minetest.rotate_node
426 })
427
428 minetest.register_node("default:wood", {
429         description = "Wooden Planks",
430         tiles = {"default_wood.png"},
431         is_ground_content = false,
432         groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
433         sounds = default.node_sound_wood_defaults(),
434 })
435
436 minetest.register_node("default:sapling", {
437         description = "Sapling",
438         drawtype = "plantlike",
439         visual_scale = 1.0,
440         tiles = {"default_sapling.png"},
441         inventory_image = "default_sapling.png",
442         wield_image = "default_sapling.png",
443         paramtype = "light",
444         sunlight_propagates = true,
445         walkable = false,
446         selection_box = {
447                 type = "fixed",
448                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
449         },
450         groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
451         sounds = default.node_sound_leaves_defaults(),
452 })
453
454 minetest.register_node("default:leaves", {
455         description = "Leaves",
456         drawtype = "allfaces_optional",
457         waving = 1,
458         visual_scale = 1.3,
459         tiles = {"default_leaves.png"},
460         special_tiles = {"default_leaves_simple.png"},
461         paramtype = "light",
462         is_ground_content = false,
463         groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
464         drop = {
465                 max_items = 1,
466                 items = {
467                         {
468                                 -- player will get sapling with 1/20 chance
469                                 items = {'default:sapling'},
470                                 rarity = 20,
471                         },
472                         {
473                                 -- player will get leaves only if he get no saplings,
474                                 -- this is because max_items is 1
475                                 items = {'default:leaves'},
476                         }
477                 }
478         },
479         sounds = default.node_sound_leaves_defaults(),
480
481         after_place_node = default.after_place_leaves,
482 })
483
484 minetest.register_node("default:apple", {
485         description = "Apple",
486         drawtype = "plantlike",
487         visual_scale = 1.0,
488         tiles = {"default_apple.png"},
489         inventory_image = "default_apple.png",
490         paramtype = "light",
491         sunlight_propagates = true,
492         walkable = false,
493         is_ground_content = false,
494         selection_box = {
495                 type = "fixed",
496                 fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
497         },
498         groups = {fleshy=3,dig_immediate=3,flammable=2,leafdecay=3,leafdecay_drop=1},
499         on_use = minetest.item_eat(2),
500         sounds = default.node_sound_leaves_defaults(),
501
502         after_place_node = function(pos, placer, itemstack)
503                 if placer:is_player() then
504                         minetest.set_node(pos, {name="default:apple", param2=1})
505                 end
506         end,
507 })
508
509
510
511 minetest.register_node("default:jungletree", {
512         description = "Jungle Tree",
513         tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
514         paramtype2 = "facedir",
515         is_ground_content = false,
516         groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
517         sounds = default.node_sound_wood_defaults(),
518
519         on_place = minetest.rotate_node
520 })
521
522 minetest.register_node("default:junglewood", {
523         description = "Junglewood Planks",
524         tiles = {"default_junglewood.png"},
525         is_ground_content = false,
526         groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
527         sounds = default.node_sound_wood_defaults(),
528 })
529
530 minetest.register_node("default:jungleleaves", {
531         description = "Jungle Leaves",
532         drawtype = "allfaces_optional",
533         waving = 1,
534         visual_scale = 1.3,
535         tiles = {"default_jungleleaves.png"},
536         special_tiles = {"default_jungleleaves_simple.png"},
537         paramtype = "light",
538         is_ground_content = false,
539         groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
540         drop = {
541                 max_items = 1,
542                 items = {
543                         {
544                                 -- player will get sapling with 1/20 chance
545                                 items = {'default:junglesapling'},
546                                 rarity = 20,
547                         },
548                         {
549                                 -- player will get leaves only if he get no saplings,
550                                 -- this is because max_items is 1
551                                 items = {'default:jungleleaves'},
552                         }
553                 }
554         },
555         sounds = default.node_sound_leaves_defaults(),
556
557         after_place_node = default.after_place_leaves,
558 })
559
560 minetest.register_node("default:junglesapling", {
561         description = "Jungle Sapling",
562         drawtype = "plantlike",
563         visual_scale = 1.0,
564         tiles = {"default_junglesapling.png"},
565         inventory_image = "default_junglesapling.png",
566         wield_image = "default_junglesapling.png",
567         paramtype = "light",
568         sunlight_propagates = true,
569         walkable = false,
570         selection_box = {
571                 type = "fixed",
572                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
573         },
574         groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
575         sounds = default.node_sound_leaves_defaults(),
576 })
577
578
579
580 minetest.register_node("default:pine_tree", {
581         description = "Pine Tree",
582         tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png",
583                 "default_pine_tree.png"},
584         paramtype2 = "facedir",
585         is_ground_content = false,
586         groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
587         sounds = default.node_sound_wood_defaults(),
588
589         on_place = minetest.rotate_node
590 })
591
592 minetest.register_node("default:pine_wood", {
593         description = "Pine Wood Planks",
594         tiles = {"default_pine_wood.png"},
595         is_ground_content = false,
596         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
597         sounds = default.node_sound_wood_defaults(),
598 })
599
600 minetest.register_node("default:pine_needles",{
601         description = "Pine Needles",
602         drawtype = "allfaces_optional",
603         visual_scale = 1.3,
604         tiles = {"default_pine_needles.png"},
605         waving = 1,
606         paramtype = "light",
607         is_ground_content = false,
608         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
609         drop = {
610                 max_items = 1,
611                 items = {
612                         {items = {"default:pine_sapling"}, rarity = 20},
613                         {items = {"default:pine_needles"}}
614                 }
615         },
616         sounds = default.node_sound_leaves_defaults(),
617
618         after_place_node = default.after_place_leaves,
619 })
620
621 minetest.register_node("default:pine_sapling", {
622         description = "Pine Sapling",
623         drawtype = "plantlike",
624         visual_scale = 1.0,
625         tiles = {"default_pine_sapling.png"},
626         inventory_image = "default_pine_sapling.png",
627         wield_image = "default_pine_sapling.png",
628         paramtype = "light",
629         sunlight_propagates = true,
630         walkable = false,
631         selection_box = {
632                 type = "fixed",
633                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
634         },
635         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
636                 attached_node = 1, sapling = 1},
637         sounds = default.node_sound_leaves_defaults(),
638 })
639
640 minetest.register_node("default:acacia_tree", {
641         description = "Acacia Tree",
642         tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png",
643                 "default_acacia_tree.png"},
644         paramtype2 = "facedir",
645         is_ground_content = false,
646         groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
647         sounds = default.node_sound_wood_defaults(),
648
649         on_place = minetest.rotate_node
650 })
651
652 minetest.register_node("default:acacia_wood", {
653         description = "Acacia Wood Planks",
654         tiles = {"default_acacia_wood.png"},
655         is_ground_content = false,
656         groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
657         sounds = default.node_sound_wood_defaults(),
658 })
659
660 minetest.register_node("default:acacia_leaves", {
661         description = "Acacia Leaves",
662         drawtype = "allfaces_optional",
663         visual_scale = 1.3,
664         tiles = {"default_acacia_leaves.png"},
665         paramtype = "light",
666         is_ground_content = false,
667         groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
668         drop = {
669                 max_items = 1,
670                 items = {
671                         {items = {"default:acacia_sapling"}, rarity = 20},
672                         {items = {"default:acacia_leaves"}}
673                 }
674         },
675         sounds = default.node_sound_leaves_defaults(),
676
677         after_place_node = default.after_place_leaves,
678 })
679
680 minetest.register_node("default:acacia_sapling", {
681         description = "Acacia Tree Sapling",
682         drawtype = "plantlike",
683         visual_scale = 1.0,
684         tiles = {"default_acacia_sapling.png"},
685         inventory_image = "default_acacia_sapling.png",
686         wield_image = "default_acacia_sapling.png",
687         paramtype = "light",
688         sunlight_propagates = true,
689         walkable = false,
690         selection_box = {
691                 type = "fixed",
692                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
693         },
694         groups = {snappy = 2, dig_immediate = 3, flammable = 2,
695                 attached_node = 1, sapling = 1},
696         sounds = default.node_sound_leaves_defaults(),
697 })
698
699 --
700 -- Ores
701 --
702
703 minetest.register_node("default:stone_with_coal", {
704         description = "Coal Ore",
705         tiles = {"default_stone.png^default_mineral_coal.png"},
706         groups = {cracky=3},
707         drop = 'default:coal_lump',
708         sounds = default.node_sound_stone_defaults(),
709 })
710
711 minetest.register_node("default:coalblock", {
712         description = "Coal Block",
713         tiles = {"default_coal_block.png"},
714         is_ground_content = false,
715         groups = {cracky=3},
716         sounds = default.node_sound_stone_defaults(),
717 })
718
719
720
721 minetest.register_node("default:stone_with_iron", {
722         description = "Iron Ore",
723         tiles = {"default_stone.png^default_mineral_iron.png"},
724         groups = {cracky=2},
725         drop = 'default:iron_lump',
726         sounds = default.node_sound_stone_defaults(),
727 })
728
729 minetest.register_node("default:steelblock", {
730         description = "Steel Block",
731         tiles = {"default_steel_block.png"},
732         is_ground_content = false,
733         groups = {cracky=1,level=2},
734         sounds = default.node_sound_stone_defaults(),
735 })
736
737
738
739 minetest.register_node("default:stone_with_copper", {
740         description = "Copper Ore",
741         tiles = {"default_stone.png^default_mineral_copper.png"},
742         groups = {cracky=2},
743         drop = 'default:copper_lump',
744         sounds = default.node_sound_stone_defaults(),
745 })
746
747 minetest.register_node("default:copperblock", {
748         description = "Copper Block",
749         tiles = {"default_copper_block.png"},
750         is_ground_content = false,
751         groups = {cracky=1,level=2},
752         sounds = default.node_sound_stone_defaults(),
753 })
754
755 minetest.register_node("default:bronzeblock", {
756         description = "Bronze Block",
757         tiles = {"default_bronze_block.png"},
758         is_ground_content = false,
759         groups = {cracky=1,level=2},
760         sounds = default.node_sound_stone_defaults(),
761 })
762
763
764
765 minetest.register_node("default:stone_with_mese", {
766         description = "Mese Ore",
767         tiles = {"default_stone.png^default_mineral_mese.png"},
768         paramtype = "light",
769         groups = {cracky = 1},
770         drop = "default:mese_crystal",
771         sounds = default.node_sound_stone_defaults(),
772         light_source = 1,
773 })
774
775 minetest.register_node("default:mese", {
776         description = "Mese Block",
777         tiles = {"default_mese_block.png"},
778         paramtype = "light",
779         groups = {cracky = 1, level = 2},
780         sounds = default.node_sound_stone_defaults(),
781         light_source = 3,
782 })
783
784
785
786
787 minetest.register_node("default:stone_with_gold", {
788         description = "Gold Ore",
789         tiles = {"default_stone.png^default_mineral_gold.png"},
790         groups = {cracky=2},
791         drop = "default:gold_lump",
792         sounds = default.node_sound_stone_defaults(),
793 })
794
795 minetest.register_node("default:goldblock", {
796         description = "Gold Block",
797         tiles = {"default_gold_block.png"},
798         is_ground_content = false,
799         groups = {cracky=1},
800         sounds = default.node_sound_stone_defaults(),
801 })
802
803
804
805 minetest.register_node("default:stone_with_diamond", {
806         description = "Diamond Ore",
807         tiles = {"default_stone.png^default_mineral_diamond.png"},
808         groups = {cracky=1},
809         drop = "default:diamond",
810         sounds = default.node_sound_stone_defaults(),
811 })
812
813 minetest.register_node("default:diamondblock", {
814         description = "Diamond Block",
815         tiles = {"default_diamond_block.png"},
816         is_ground_content = false,
817         groups = {cracky=1,level=3},
818         sounds = default.node_sound_stone_defaults(),
819 })
820
821 --
822 -- Plantlife (non-cubic)
823 --
824
825 minetest.register_node("default:cactus", {
826         description = "Cactus",
827         tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
828         paramtype2 = "facedir",
829         groups = {snappy=1,choppy=3,flammable=2},
830         sounds = default.node_sound_wood_defaults(),
831         on_place = minetest.rotate_node,
832
833         after_dig_node = function(pos, node, metadata, digger)
834                 default.dig_up(pos, node, digger)
835         end,
836 })
837
838 minetest.register_node("default:papyrus", {
839         description = "Papyrus",
840         drawtype = "plantlike",
841         tiles = {"default_papyrus.png"},
842         inventory_image = "default_papyrus.png",
843         wield_image = "default_papyrus.png",
844         paramtype = "light",
845         sunlight_propagates = true,
846         walkable = false,
847         selection_box = {
848                 type = "fixed",
849                 fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3}
850         },
851         groups = {snappy=3,flammable=2},
852         sounds = default.node_sound_leaves_defaults(),
853
854         after_dig_node = function(pos, node, metadata, digger)
855                 default.dig_up(pos, node, digger)
856         end,
857 })
858
859 minetest.register_node("default:dry_shrub", {
860         description = "Dry Shrub",
861         drawtype = "plantlike",
862         waving = 1,
863         visual_scale = 1.0,
864         tiles = {"default_dry_shrub.png"},
865         inventory_image = "default_dry_shrub.png",
866         wield_image = "default_dry_shrub.png",
867         paramtype = "light",
868         sunlight_propagates = true,
869         walkable = false,
870         buildable_to = true,
871         groups = {snappy=3,flammable=3,attached_node=1},
872         sounds = default.node_sound_leaves_defaults(),
873         selection_box = {
874                 type = "fixed",
875                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
876         },
877 })
878
879 minetest.register_node("default:junglegrass", {
880         description = "Jungle Grass",
881         drawtype = "plantlike",
882         waving = 1,
883         visual_scale = 1.3,
884         tiles = {"default_junglegrass.png"},
885         inventory_image = "default_junglegrass.png",
886         wield_image = "default_junglegrass.png",
887         paramtype = "light",
888         sunlight_propagates = true,
889         walkable = false,
890         buildable_to = true,
891         groups = {snappy=3,flammable=2,flora=1,attached_node=1},
892         sounds = default.node_sound_leaves_defaults(),
893         selection_box = {
894                 type = "fixed",
895                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
896         },
897 })
898
899 minetest.register_node("default:grass_1", {
900         description = "Grass",
901         drawtype = "plantlike",
902         waving = 1,
903         tiles = {"default_grass_1.png"},
904         -- Use texture of a taller grass stage in inventory
905         inventory_image = "default_grass_3.png",
906         wield_image = "default_grass_3.png",
907         paramtype = "light",
908         sunlight_propagates = true,
909         walkable = false,
910         buildable_to = true,
911         groups = {snappy=3,flammable=3,flora=1,attached_node=1},
912         sounds = default.node_sound_leaves_defaults(),
913         selection_box = {
914                 type = "fixed",
915                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
916         },
917
918         on_place = function(itemstack, placer, pointed_thing)
919                 -- place a random grass node
920                 local stack = ItemStack("default:grass_"..math.random(1,5))
921                 local ret = minetest.item_place(stack, placer, pointed_thing)
922                 return ItemStack("default:grass_1 "..itemstack:get_count()-(1-ret:get_count()))
923         end,
924 })
925
926 for i=2,5 do
927         minetest.register_node("default:grass_"..i, {
928                 description = "Grass",
929                 drawtype = "plantlike",
930                 waving = 1,
931                 tiles = {"default_grass_"..i..".png"},
932                 inventory_image = "default_grass_"..i..".png",
933                 wield_image = "default_grass_"..i..".png",
934                 paramtype = "light",
935                 sunlight_propagates = true,
936                 walkable = false,
937                 buildable_to = true,
938                 drop = "default:grass_1",
939                 groups = {snappy=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1},
940                 sounds = default.node_sound_leaves_defaults(),
941                 selection_box = {
942                         type = "fixed",
943                         fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
944                 },
945         })
946 end
947
948 minetest.register_node("default:dry_grass_1", {
949         description = "Dry Grass",
950         drawtype = "plantlike",
951         waving = 1,
952         tiles = {"default_dry_grass_1.png"},
953         inventory_image = "default_dry_grass_3.png",
954         wield_image = "default_dry_grass_3.png",
955         paramtype = "light",
956         sunlight_propagates = true,
957         walkable = false,
958         buildable_to = true,
959         groups = {snappy=3,flammable=3,flora=1,attached_node=1},
960         sounds = default.node_sound_leaves_defaults(),
961         selection_box = {
962                 type = "fixed",
963                 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
964         },
965
966         on_place = function(itemstack, placer, pointed_thing)
967                 -- place a random dry grass node
968                 local stack = ItemStack("default:dry_grass_"..math.random(1,5))
969                 local ret = minetest.item_place(stack, placer, pointed_thing)
970                 return ItemStack("default:dry_grass_1 "..itemstack:get_count()-(1-ret:get_count()))
971         end,
972 })
973
974 for i=2,5 do
975         minetest.register_node("default:dry_grass_"..i, {
976                 description = "Dry Grass",
977                 drawtype = "plantlike",
978                 waving = 1,
979                 tiles = {"default_dry_grass_"..i..".png"},
980                 inventory_image = "default_dry_grass_"..i..".png",
981                 wield_image = "default_dry_grass_"..i..".png",
982                 paramtype = "light",
983                 sunlight_propagates = true,
984                 walkable = false,
985                 buildable_to = true,
986                 groups = {snappy=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1},
987                 drop = "default:dry_grass_1",
988                 sounds = default.node_sound_leaves_defaults(),
989                 selection_box = {
990                         type = "fixed",
991                         fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
992                 },
993         })
994 end
995
996 --
997 -- Liquids
998 --
999
1000 minetest.register_node("default:water_source", {
1001         description = "Water Source",
1002         inventory_image = minetest.inventorycube("default_water.png"),
1003         drawtype = "liquid",
1004         tiles = {
1005                 {
1006                         name = "default_water_source_animated.png",
1007                         animation = {
1008                                 type = "vertical_frames",
1009                                 aspect_w = 16,
1010                                 aspect_h = 16,
1011                                 length = 2.0,
1012                         },
1013                 },
1014         },
1015         special_tiles = {
1016                 -- New-style water source material (mostly unused)
1017                 {
1018                         name = "default_water_source_animated.png",
1019                         animation = {
1020                                 type = "vertical_frames",
1021                                 aspect_w = 16,
1022                                 aspect_h = 16,
1023                                 length = 2.0,
1024                         },
1025                         backface_culling = false,
1026                 },
1027         },
1028         alpha = 160,
1029         paramtype = "light",
1030         walkable = false,
1031         pointable = false,
1032         diggable = false,
1033         buildable_to = true,
1034         is_ground_content = false,
1035         drop = "",
1036         drowning = 1,
1037         liquidtype = "source",
1038         liquid_alternative_flowing = "default:water_flowing",
1039         liquid_alternative_source = "default:water_source",
1040         liquid_viscosity = 1,
1041         post_effect_color = {a=120, r=30, g=60, b=90},
1042         groups = {water=3, liquid=3, puts_out_fire=1},
1043 })
1044
1045 minetest.register_node("default:water_flowing", {
1046         description = "Flowing Water",
1047         inventory_image = minetest.inventorycube("default_water.png"),
1048         drawtype = "flowingliquid",
1049         tiles = {"default_water.png"},
1050         special_tiles = {
1051                 {
1052                         name = "default_water_flowing_animated.png",
1053                         backface_culling = false,
1054                         animation = {
1055                                 type = "vertical_frames",
1056                                 aspect_w = 16,
1057                                 aspect_h = 16,
1058                                 length = 0.8,
1059                         },
1060                 },
1061                 {
1062                         name = "default_water_flowing_animated.png",
1063                         backface_culling = true,
1064                         animation = {
1065                                 type = "vertical_frames",
1066                                 aspect_w = 16,
1067                                 aspect_h = 16,
1068                                 length = 0.8,
1069                         },
1070                 },
1071         },
1072         alpha = 160,
1073         paramtype = "light",
1074         paramtype2 = "flowingliquid",
1075         walkable = false,
1076         pointable = false,
1077         diggable = false,
1078         buildable_to = true,
1079         is_ground_content = false,
1080         drop = "",
1081         drowning = 1,
1082         liquidtype = "flowing",
1083         liquid_alternative_flowing = "default:water_flowing",
1084         liquid_alternative_source = "default:water_source",
1085         liquid_viscosity = 1,
1086         post_effect_color = {a=120, r=30, g=60, b=90},
1087         groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1},
1088 })
1089
1090
1091 minetest.register_node("default:river_water_source", {
1092         description = "River Water Source",
1093         inventory_image = minetest.inventorycube("default_river_water.png"),
1094         drawtype = "liquid",
1095         tiles = {
1096                 {
1097                         name = "default_river_water_source_animated.png",
1098                         animation = {
1099                                 type = "vertical_frames",
1100                                 aspect_w = 16,
1101                                 aspect_h = 16,
1102                                 length = 2.0,
1103                         },
1104                 },
1105         },
1106         special_tiles = {
1107                 {
1108                         name = "default_river_water_source_animated.png",
1109                         animation = {
1110                                 type = "vertical_frames",
1111                                 aspect_w = 16,
1112                                 aspect_h = 16,
1113                                 length = 2.0,
1114                         },
1115                         backface_culling = false,
1116                 },
1117         },
1118         alpha = 160,
1119         paramtype = "light",
1120         walkable = false,
1121         pointable = false,
1122         diggable = false,
1123         buildable_to = true,
1124         is_ground_content = false,
1125         drop = "",
1126         drowning = 1,
1127         liquidtype = "source",
1128         liquid_alternative_flowing = "default:river_water_flowing",
1129         liquid_alternative_source = "default:river_water_source",
1130         liquid_viscosity = 1,
1131         liquid_renewable = false,
1132         liquid_range = 2,
1133         post_effect_color = {a=120, r=30, g=76, b=90},
1134         groups = {water=3, liquid=3, puts_out_fire=1},
1135 })
1136
1137 minetest.register_node("default:river_water_flowing", {
1138         description = "Flowing River Water",
1139         inventory_image = minetest.inventorycube("default_river_water.png"),
1140         drawtype = "flowingliquid",
1141         tiles = {"default_river_water.png"},
1142         special_tiles = {
1143                 {
1144                         name = "default_river_water_flowing_animated.png",
1145                         backface_culling = false,
1146                         animation = {
1147                                 type = "vertical_frames",
1148                                 aspect_w = 16,
1149                                 aspect_h = 16,
1150                                 length = 0.8,
1151                         },
1152                 },
1153                 {
1154                         name = "default_river_water_flowing_animated.png",
1155                         backface_culling = true,
1156                         animation = {
1157                                 type = "vertical_frames",
1158                                 aspect_w = 16,
1159                                 aspect_h = 16,
1160                                 length = 0.8,
1161                         },
1162                 },
1163         },
1164         alpha = 160,
1165         paramtype = "light",
1166         paramtype2 = "flowingliquid",
1167         walkable = false,
1168         pointable = false,
1169         diggable = false,
1170         buildable_to = true,
1171         is_ground_content = false,
1172         drop = "",
1173         drowning = 1,
1174         liquidtype = "flowing",
1175         liquid_alternative_flowing = "default:river_water_flowing",
1176         liquid_alternative_source = "default:river_water_source",
1177         liquid_viscosity = 1,
1178         liquid_renewable = false,
1179         liquid_range = 2,
1180         post_effect_color = {a=120, r=30, g=76, b=90},
1181         groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1},
1182 })
1183
1184
1185
1186 minetest.register_node("default:lava_source", {
1187         description = "Lava Source",
1188         inventory_image = minetest.inventorycube("default_lava.png"),
1189         drawtype = "liquid",
1190         tiles = {
1191                 {
1192                         name = "default_lava_source_animated.png",
1193                         animation = {
1194                                 type = "vertical_frames",
1195                                 aspect_w = 16,
1196                                 aspect_h = 16,
1197                                 length = 3.0,
1198                         },
1199                 },
1200         },
1201         special_tiles = {
1202                 -- New-style lava source material (mostly unused)
1203                 {
1204                         name = "default_lava_source_animated.png",
1205                         animation = {
1206                                 type = "vertical_frames",
1207                                 aspect_w = 16,
1208                                 aspect_h = 16,
1209                                 length = 3.0,
1210                         },
1211                         backface_culling = false,
1212                 },
1213         },
1214         paramtype = "light",
1215         light_source = default.LIGHT_MAX - 1,
1216         walkable = false,
1217         pointable = false,
1218         diggable = false,
1219         buildable_to = true,
1220         is_ground_content = false,
1221         drop = "",
1222         drowning = 1,
1223         liquidtype = "source",
1224         liquid_alternative_flowing = "default:lava_flowing",
1225         liquid_alternative_source = "default:lava_source",
1226         liquid_viscosity = 7,
1227         liquid_renewable = false,
1228         damage_per_second = 4 * 2,
1229         post_effect_color = {a=192, r=255, g=64, b=0},
1230         groups = {lava=3, liquid=2, hot=3, igniter=1},
1231 })
1232
1233 minetest.register_node("default:lava_flowing", {
1234         description = "Flowing Lava",
1235         inventory_image = minetest.inventorycube("default_lava.png"),
1236         drawtype = "flowingliquid",
1237         tiles = {"default_lava.png"},
1238         special_tiles = {
1239                 {
1240                         name = "default_lava_flowing_animated.png",
1241                         backface_culling = false,
1242                         animation = {
1243                                 type = "vertical_frames",
1244                                 aspect_w = 16,
1245                                 aspect_h = 16,
1246                                 length = 3.3,
1247                         },
1248                 },
1249                 {
1250                         name = "default_lava_flowing_animated.png",
1251                         backface_culling = true,
1252                         animation = {
1253                                 type = "vertical_frames",
1254                                 aspect_w = 16,
1255                                 aspect_h = 16,
1256                                 length = 3.3,
1257                         },
1258                 },
1259         },
1260         paramtype = "light",
1261         paramtype2 = "flowingliquid",
1262         light_source = default.LIGHT_MAX - 1,
1263         walkable = false,
1264         pointable = false,
1265         diggable = false,
1266         buildable_to = true,
1267         is_ground_content = false,
1268         drop = "",
1269         drowning = 1,
1270         liquidtype = "flowing",
1271         liquid_alternative_flowing = "default:lava_flowing",
1272         liquid_alternative_source = "default:lava_source",
1273         liquid_viscosity = 7,
1274         liquid_renewable = false,
1275         damage_per_second = 4 * 2,
1276         post_effect_color = {a=192, r=255, g=64, b=0},
1277         groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1},
1278 })
1279
1280 --
1281 -- Tools / "Advanced" crafting / Non-"natural"
1282 --
1283
1284 minetest.register_node("default:torch", {
1285         description = "Torch",
1286         drawtype = "torchlike",
1287         tiles = {
1288                 {
1289                         name = "default_torch_on_floor_animated.png",
1290                         animation = {
1291                                 type = "vertical_frames",
1292                                 aspect_w = 16,
1293                                 aspect_h = 16,
1294                                 length = 3.0
1295                         },
1296                 },
1297                 {
1298                         name="default_torch_on_ceiling_animated.png",
1299                         animation = {
1300                                 type = "vertical_frames",
1301                                 aspect_w = 16,
1302                                 aspect_h = 16,
1303                                 length = 3.0
1304                         },
1305                 },
1306                 {
1307                         name="default_torch_animated.png",
1308                         animation = {
1309                                 type = "vertical_frames",
1310                                 aspect_w = 16,
1311                                 aspect_h = 16,
1312                                 length = 3.0
1313                         },
1314                 },
1315         },
1316         inventory_image = "default_torch_on_floor.png",
1317         wield_image = "default_torch_on_floor.png",
1318         paramtype = "light",
1319         paramtype2 = "wallmounted",
1320         sunlight_propagates = true,
1321         is_ground_content = false,
1322         walkable = false,
1323         light_source = default.LIGHT_MAX - 1,
1324         selection_box = {
1325                 type = "wallmounted",
1326                 wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
1327                 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
1328                 wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
1329         },
1330         groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1},
1331         legacy_wallmounted = true,
1332         sounds = default.node_sound_defaults(),
1333 })
1334
1335
1336
1337 local chest_formspec =
1338         "size[8,9]"..
1339         default.gui_bg..
1340         default.gui_bg_img..
1341         default.gui_slots..
1342         "list[current_name;main;0,0.3;8,4;]"..
1343         "list[current_player;main;0,4.85;8,1;]"..
1344         "list[current_player;main;0,6.08;8,3;8]"..
1345         "listring[current_name;main]"..
1346         "listring[current_player;main]"..
1347         default.get_hotbar_bg(0,4.85)
1348
1349 local function get_locked_chest_formspec(pos)
1350         local spos = pos.x .. "," .. pos.y .. "," ..pos.z
1351         local formspec =
1352                 "size[8,9]"..
1353                 default.gui_bg..
1354                 default.gui_bg_img..
1355                 default.gui_slots..
1356                 "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]"..
1357                 "list[current_player;main;0,4.85;8,1;]"..
1358                 "list[current_player;main;0,6.08;8,3;8]"..
1359                 "listring[nodemeta:".. spos .. ";main]"..
1360                 "listring[current_player;main]"..
1361                 default.get_hotbar_bg(0,4.85)
1362  return formspec
1363 end
1364
1365 local function has_locked_chest_privilege(meta, player)
1366         if player:get_player_name() ~= meta:get_string("owner") then
1367                 return false
1368         end
1369         return true
1370 end
1371
1372 minetest.register_node("default:chest", {
1373         description = "Chest",
1374         tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1375                 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1376         paramtype2 = "facedir",
1377         groups = {choppy=2,oddly_breakable_by_hand=2},
1378         legacy_facedir_simple = true,
1379         is_ground_content = false,
1380         sounds = default.node_sound_wood_defaults(),
1381
1382         on_construct = function(pos)
1383                 local meta = minetest.get_meta(pos)
1384                 meta:set_string("formspec", chest_formspec)
1385                 meta:set_string("infotext", "Chest")
1386                 local inv = meta:get_inventory()
1387                 inv:set_size("main", 8*4)
1388         end,
1389         can_dig = function(pos,player)
1390                 local meta = minetest.get_meta(pos);
1391                 local inv = meta:get_inventory()
1392                 return inv:is_empty("main")
1393         end,
1394         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1395                 minetest.log("action", player:get_player_name()..
1396                                 " moves stuff in chest at "..minetest.pos_to_string(pos))
1397         end,
1398     on_metadata_inventory_put = function(pos, listname, index, stack, player)
1399                 minetest.log("action", player:get_player_name()..
1400                                 " moves stuff to chest at "..minetest.pos_to_string(pos))
1401         end,
1402     on_metadata_inventory_take = function(pos, listname, index, stack, player)
1403                 minetest.log("action", player:get_player_name()..
1404                                 " takes stuff from chest at "..minetest.pos_to_string(pos))
1405         end,
1406 })
1407
1408
1409
1410 minetest.register_node("default:chest_locked", {
1411         description = "Locked Chest",
1412         tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1413                 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1414         paramtype2 = "facedir",
1415         groups = {choppy=2,oddly_breakable_by_hand=2},
1416         legacy_facedir_simple = true,
1417         is_ground_content = false,
1418         sounds = default.node_sound_wood_defaults(),
1419
1420         after_place_node = function(pos, placer)
1421                 local meta = minetest.get_meta(pos)
1422                 meta:set_string("owner", placer:get_player_name() or "")
1423                 meta:set_string("infotext", "Locked Chest (owned by "..
1424                                 meta:get_string("owner")..")")
1425         end,
1426         on_construct = function(pos)
1427                 local meta = minetest.get_meta(pos)
1428                 meta:set_string("infotext", "Locked Chest")
1429                 meta:set_string("owner", "")
1430                 local inv = meta:get_inventory()
1431                 inv:set_size("main", 8*4)
1432         end,
1433         can_dig = function(pos,player)
1434                 local meta = minetest.get_meta(pos);
1435                 local inv = meta:get_inventory()
1436                 return inv:is_empty("main") and has_locked_chest_privilege(meta, player)
1437         end,
1438         allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1439                 local meta = minetest.get_meta(pos)
1440                 if not has_locked_chest_privilege(meta, player) then
1441                         return 0
1442                 end
1443                 return count
1444         end,
1445     allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1446                 local meta = minetest.get_meta(pos)
1447                 if not has_locked_chest_privilege(meta, player) then
1448                         return 0
1449                 end
1450                 return stack:get_count()
1451         end,
1452     allow_metadata_inventory_take = function(pos, listname, index, stack, player)
1453                 local meta = minetest.get_meta(pos)
1454                 if not has_locked_chest_privilege(meta, player) then
1455                         return 0
1456                 end
1457                 return stack:get_count()
1458         end,
1459     on_metadata_inventory_put = function(pos, listname, index, stack, player)
1460                 minetest.log("action", player:get_player_name()..
1461                                 " moves stuff to locked chest at "..minetest.pos_to_string(pos))
1462         end,
1463     on_metadata_inventory_take = function(pos, listname, index, stack, player)
1464                 minetest.log("action", player:get_player_name()..
1465                                 " takes stuff from locked chest at "..minetest.pos_to_string(pos))
1466         end,
1467         on_rightclick = function(pos, node, clicker)
1468                 local meta = minetest.get_meta(pos)
1469                 if has_locked_chest_privilege(meta, clicker) then
1470                         minetest.show_formspec(
1471                                 clicker:get_player_name(),
1472                                 "default:chest_locked",
1473                                 get_locked_chest_formspec(pos)
1474                         )
1475                 end
1476         end,
1477         on_blast = function() end,
1478 })
1479
1480
1481
1482 local bookshelf_formspec =
1483         "size[8,7;]"..
1484         default.gui_bg..
1485         default.gui_bg_img..
1486         default.gui_slots..
1487         "list[context;books;0,0.3;8,2;]"..
1488         "list[current_player;main;0,2.85;8,1;]"..
1489         "list[current_player;main;0,4.08;8,3;8]"..
1490         "listring[context;books]"..
1491         "listring[current_player;main]"..
1492         default.get_hotbar_bg(0,2.85)
1493
1494 minetest.register_node("default:bookshelf", {
1495         description = "Bookshelf",
1496         tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
1497         is_ground_content = false,
1498         groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3},
1499         sounds = default.node_sound_wood_defaults(),
1500
1501         on_construct = function(pos)
1502                 local meta = minetest.get_meta(pos)
1503                 meta:set_string("formspec", bookshelf_formspec)
1504                 local inv = meta:get_inventory()
1505                 inv:set_size("books", 8*2)
1506         end,
1507         can_dig = function(pos,player)
1508                 local meta = minetest.get_meta(pos);
1509                 local inv = meta:get_inventory()
1510                 return inv:is_empty("books")
1511         end,
1512
1513         allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1514                 local meta = minetest.get_meta(pos)
1515                 local inv = meta:get_inventory()
1516                 local to_stack = inv:get_stack(listname, index)
1517                 if listname == "books" then
1518                         if minetest.get_item_group(stack:get_name(), "book") ~= 0
1519                                         and to_stack:is_empty() then
1520                                 return 1
1521                         else
1522                                 return 0
1523                         end
1524                 end
1525         end,
1526
1527         allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1528                 local meta = minetest.get_meta(pos)
1529                 local inv = meta:get_inventory()
1530                 local stack = inv:get_stack(from_list, from_index)
1531                 local to_stack = inv:get_stack(to_list, to_index)
1532                 if to_list == "books" then
1533                         if minetest.get_item_group(stack:get_name(), "book") ~= 0
1534                                         and to_stack:is_empty() then
1535                                 return 1
1536                         else
1537                                 return 0
1538                         end
1539                 end
1540         end,
1541
1542         on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1543                 minetest.log("action", player:get_player_name()..
1544                            " moves stuff in bookshelf at "..minetest.pos_to_string(pos))
1545         end,
1546         on_metadata_inventory_put = function(pos, listname, index, stack, player)
1547                 minetest.log("action", player:get_player_name()..
1548                            " moves stuff to bookshelf at "..minetest.pos_to_string(pos))
1549         end,
1550         on_metadata_inventory_take = function(pos, listname, index, stack, player)
1551                 minetest.log("action", player:get_player_name()..
1552                            " takes stuff from bookshelf at "..minetest.pos_to_string(pos))
1553         end,
1554 })
1555
1556
1557
1558 minetest.register_node("default:sign_wall", {
1559         description = "Sign",
1560         drawtype = "nodebox",
1561         tiles = {"default_sign.png"},
1562         inventory_image = "default_sign_wall.png",
1563         wield_image = "default_sign_wall.png",
1564         paramtype = "light",
1565         paramtype2 = "wallmounted",
1566         sunlight_propagates = true,
1567         is_ground_content = false,
1568         walkable = false,
1569         node_box = {
1570                 type = "wallmounted",
1571                 wall_top    = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125},
1572                 wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125},
1573                 wall_side   = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375},
1574         },
1575         groups = {choppy=2,dig_immediate=2,attached_node=1},
1576         legacy_wallmounted = true,
1577         sounds = default.node_sound_defaults(),
1578
1579         on_construct = function(pos)
1580                 --local n = minetest.get_node(pos)
1581                 local meta = minetest.get_meta(pos)
1582                 meta:set_string("formspec", "field[text;;${text}]")
1583                 meta:set_string("infotext", "\"\"")
1584         end,
1585         on_receive_fields = function(pos, formname, fields, sender)
1586                 --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
1587                 if minetest.is_protected(pos, sender:get_player_name()) then
1588                         minetest.record_protection_violation(pos, sender:get_player_name())
1589                         return
1590                 end
1591                 local meta = minetest.get_meta(pos)
1592                 if not fields.text then return end
1593                 minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text..
1594                                 "\" to sign at "..minetest.pos_to_string(pos))
1595                 meta:set_string("text", fields.text)
1596                 meta:set_string("infotext", '"'..fields.text..'"')
1597         end,
1598 })
1599
1600 minetest.register_node("default:ladder", {
1601         description = "Ladder",
1602         drawtype = "signlike",
1603         tiles = {"default_ladder.png"},
1604         inventory_image = "default_ladder.png",
1605         wield_image = "default_ladder.png",
1606         paramtype = "light",
1607         paramtype2 = "wallmounted",
1608         sunlight_propagates = true,
1609         walkable = false,
1610         climbable = true,
1611         is_ground_content = false,
1612         selection_box = {
1613                 type = "wallmounted",
1614                 --wall_top = = <default>
1615                 --wall_bottom = = <default>
1616                 --wall_side = = <default>
1617         },
1618         groups = {choppy=2,oddly_breakable_by_hand=3,flammable=2},
1619         legacy_wallmounted = true,
1620         sounds = default.node_sound_wood_defaults(),
1621 })
1622
1623 local fence_texture = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126"
1624 minetest.register_node("default:fence_wood", {
1625         description = "Wooden Fence",
1626         drawtype = "fencelike",
1627         tiles = {"default_wood.png"},
1628         inventory_image = fence_texture,
1629         wield_image = fence_texture,
1630         paramtype = "light",
1631         sunlight_propagates = true,
1632         is_ground_content = false,
1633         selection_box = {
1634                 type = "fixed",
1635                 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
1636         },
1637         groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2},
1638         sounds = default.node_sound_wood_defaults(),
1639 })
1640
1641
1642
1643 minetest.register_node("default:glass", {
1644         description = "Glass",
1645         drawtype = "glasslike_framed_optional",
1646         tiles = {"default_glass.png", "default_glass_detail.png"},
1647         inventory_image = minetest.inventorycube("default_glass.png"),
1648         paramtype = "light",
1649         sunlight_propagates = true,
1650         is_ground_content = false,
1651         groups = {cracky=3,oddly_breakable_by_hand=3},
1652         sounds = default.node_sound_glass_defaults(),
1653 })
1654
1655 minetest.register_node("default:obsidian_glass", {
1656         description = "Obsidian Glass",
1657         drawtype = "glasslike",
1658         tiles = {"default_obsidian_glass.png"},
1659         paramtype = "light",
1660         is_ground_content = false,
1661         sunlight_propagates = true,
1662         sounds = default.node_sound_glass_defaults(),
1663         groups = {cracky=3,oddly_breakable_by_hand=3},
1664 })
1665
1666
1667
1668 minetest.register_node("default:rail", {
1669         description = "Rail",
1670         drawtype = "raillike",
1671         tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
1672         inventory_image = "default_rail.png",
1673         wield_image = "default_rail.png",
1674         paramtype = "light",
1675         sunlight_propagates = true,
1676         walkable = false,
1677         is_ground_content = false,
1678         selection_box = {
1679                 type = "fixed",
1680                 -- but how to specify the dimensions for curved and sideways rails?
1681                 fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
1682         },
1683         groups = {bendy=2,dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("rail")},
1684 })
1685
1686
1687
1688 minetest.register_node("default:brick", {
1689         description = "Brick Block",
1690         tiles = {"default_brick.png"},
1691         is_ground_content = false,
1692         groups = {cracky=3},
1693         sounds = default.node_sound_stone_defaults(),
1694 })
1695
1696
1697 minetest.register_node("default:meselamp", {
1698         description = "Mese Lamp",
1699         drawtype = "glasslike",
1700         tiles = {"default_meselamp.png"},
1701         paramtype = "light",
1702         sunlight_propagates = true,
1703         is_ground_content = false,
1704         groups = {cracky = 3, oddly_breakable_by_hand = 3},
1705         sounds = default.node_sound_glass_defaults(),
1706         light_source = default.LIGHT_MAX,
1707 })
1708
1709 --
1710 -- Misc
1711 --
1712
1713 minetest.register_node("default:cloud", {
1714         description = "Cloud",
1715         tiles = {"default_cloud.png"},
1716         is_ground_content = false,
1717         sounds = default.node_sound_defaults(),
1718         groups = {not_in_creative_inventory=1},
1719 })
1720
1721 minetest.register_node("default:nyancat", {
1722         description = "Nyan Cat",
1723         tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1724                 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1725         paramtype2 = "facedir",
1726         groups = {cracky=2},
1727         is_ground_content = false,
1728         legacy_facedir_simple = true,
1729         sounds = default.node_sound_defaults(),
1730 })
1731
1732 minetest.register_node("default:nyancat_rainbow", {
1733         description = "Nyan Cat Rainbow",
1734         tiles = {
1735                 "default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90",
1736                 "default_nc_rb.png", "default_nc_rb.png"
1737         },
1738         paramtype2 = "facedir",
1739         groups = {cracky=2},
1740         is_ground_content = false,
1741         sounds = default.node_sound_defaults(),
1742 })