1 -- mods/default/nodes.lua
3 minetest.register_node("default:stone", {
5 tiles = {"default_stone.png"},
6 is_ground_content = true,
7 groups = {cracky=3, stone=1},
8 drop = 'default:cobble',
10 sounds = default.node_sound_stone_defaults(),
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(),
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,
28 drop = 'default:coal_lump',
29 sounds = default.node_sound_stone_defaults(),
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,
37 drop = 'default:iron_lump',
38 sounds = default.node_sound_stone_defaults(),
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,
46 drop = 'default:copper_lump',
47 sounds = default.node_sound_stone_defaults(),
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,
55 drop = "default:mese_crystal",
56 sounds = default.node_sound_stone_defaults(),
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,
64 drop = "default:gold_lump",
65 sounds = default.node_sound_stone_defaults(),
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,
73 drop = "default:diamond",
74 sounds = default.node_sound_stone_defaults(),
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(),
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(),
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},
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},
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},
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(),
132 minetest.register_abm({
133 nodenames = {"default:dirt"},
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"})
146 minetest.set_node(pos, {name = "default:dirt_with_grass"})
152 minetest.register_abm({
153 nodenames = {"default:dirt_with_grass"},
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"})
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(),
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(),
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},
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(),
203 minetest.register_node("default:sandstonebrick", {
204 description = "Sandstone Brick",
205 tiles = {"default_sandstone_brick.png"},
206 is_ground_content = true,
208 sounds = default.node_sound_stone_defaults(),
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(),
220 minetest.register_node("default:brick", {
221 description = "Brick Block",
222 tiles = {"default_brick.png"},
223 is_ground_content = false,
225 sounds = default.node_sound_stone_defaults(),
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
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
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(),
255 minetest.register_node("default:jungleleaves", {
256 description = "Jungle Leaves",
257 drawtype = "allfaces_optional",
260 tiles = {"default_jungleleaves.png"},
262 is_ground_content = false,
263 groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
268 -- player will get sapling with 1/20 chance
269 items = {'default:junglesapling'},
273 -- player will get leaves only if he get no saplings,
274 -- this is because max_items is 1
275 items = {'default:jungleleaves'},
279 sounds = default.node_sound_leaves_defaults(),
280 after_place_node = default.after_place_leaves,
283 minetest.register_node("default:junglesapling", {
284 description = "Jungle Sapling",
285 drawtype = "plantlike",
287 tiles = {"default_junglesapling.png"},
288 inventory_image = "default_junglesapling.png",
289 wield_image = "default_junglesapling.png",
294 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
296 groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
297 sounds = default.node_sound_leaves_defaults(),
300 minetest.register_node("default:junglegrass", {
301 description = "Jungle Grass",
302 drawtype = "plantlike",
305 tiles = {"default_junglegrass.png"},
306 inventory_image = "default_junglegrass.png",
307 wield_image = "default_junglegrass.png",
311 is_ground_content = true,
312 groups = {snappy=3,flammable=2,flora=1,attached_node=1},
313 sounds = default.node_sound_leaves_defaults(),
316 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
320 minetest.register_node("default:leaves", {
321 description = "Leaves",
322 drawtype = "allfaces_optional",
325 tiles = {"default_leaves.png"},
327 is_ground_content = false,
328 groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
333 -- player will get sapling with 1/20 chance
334 items = {'default:sapling'},
338 -- player will get leaves only if he get no saplings,
339 -- this is because max_items is 1
340 items = {'default:leaves'},
344 sounds = default.node_sound_leaves_defaults(),
345 after_place_node = default.after_place_leaves,
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)
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",
369 is_ground_content = true,
372 fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3}
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)
381 default.bookshelf_formspec =
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)
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)
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")
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
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
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))
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))
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))
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"),
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(),
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,
471 is_ground_content = false,
474 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
476 groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2},
477 sounds = default.node_sound_wood_defaults(),
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",
488 is_ground_content = false,
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},
494 groups = {bendy=2,dig_immediate=2,attached_node=1},
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",
504 paramtype2 = "wallmounted",
507 is_ground_content = false,
509 type = "wallmounted",
510 --wall_top = = <default>
511 --wall_bottom = = <default>
512 --wall_side = = <default>
514 groups = {choppy=2,oddly_breakable_by_hand=3,flammable=2},
515 legacy_wallmounted = true,
516 sounds = default.node_sound_wood_defaults(),
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(),
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},
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"},
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}
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}
552 paramtype2 = "flowingliquid",
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},
567 minetest.register_node("default:water_source", {
568 description = "Water Source",
569 inventory_image = minetest.inventorycube("default_water.png"),
572 {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}
575 -- New-style water source material (mostly unused)
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,
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},
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"},
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}
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}
616 paramtype2 = "flowingliquid",
617 light_source = default.LIGHT_MAX - 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},
634 minetest.register_node("default:lava_source", {
635 description = "Lava Source",
636 inventory_image = minetest.inventorycube("default_lava.png"),
639 {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
642 -- New-style lava source material (mostly unused)
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,
650 light_source = default.LIGHT_MAX - 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},
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"},
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}}
676 inventory_image = "default_torch_on_floor.png",
677 wield_image = "default_torch_on_floor.png",
679 paramtype2 = "wallmounted",
680 sunlight_propagates = true,
681 is_ground_content = false,
683 light_source = default.LIGHT_MAX - 1,
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},
690 groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1},
691 legacy_wallmounted = true,
692 sounds = default.node_sound_defaults(),
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",
702 paramtype2 = "wallmounted",
703 sunlight_propagates = true,
704 is_ground_content = false,
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},
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", "\"\"")
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())
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..'"')
736 default.chest_formspec =
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)
746 function default.get_locked_chest_formspec(pos)
747 local spos = pos.x .. "," .. pos.y .. "," ..pos.z
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)
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)
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")
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))
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))
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))
796 local function has_locked_chest_privilege(meta, player)
797 if player:get_player_name() ~= meta:get_string("owner") then
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")..")")
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)
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)
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
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
842 return stack:get_count()
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
849 return stack:get_count()
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))
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))
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)
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(),
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(),
887 minetest.register_node("default:mossycobble", {
888 description = "Mossy Cobblestone",
889 tiles = {"default_mossycobble.png"},
890 is_ground_content = true,
892 sounds = default.node_sound_stone_defaults(),
895 minetest.register_node("default:coalblock", {
896 description = "Coal Block",
897 tiles = {"default_coal_block.png"},
898 is_ground_content = true,
900 sounds = default.node_sound_stone_defaults(),
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(),
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(),
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(),
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(),
934 minetest.register_alias("default:mese_block", "default:mese")
936 minetest.register_node("default:goldblock", {
937 description = "Gold Block",
938 tiles = {"default_gold_block.png"},
939 is_ground_content = true,
941 sounds = default.node_sound_stone_defaults(),
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(),
952 minetest.register_node("default:obsidian_glass", {
953 description = "Obsidian Glass",
954 drawtype = "glasslike",
955 tiles = {"default_obsidian_glass.png"},
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},
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},
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},
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",
984 is_ground_content = false,
985 legacy_facedir_simple = true,
986 sounds = default.node_sound_defaults(),
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",
995 is_ground_content = false,
996 sounds = default.node_sound_defaults(),
999 minetest.register_node("default:sapling", {
1000 description = "Sapling",
1001 drawtype = "plantlike",
1003 tiles = {"default_sapling.png"},
1004 inventory_image = "default_sapling.png",
1005 wield_image = "default_sapling.png",
1006 paramtype = "light",
1008 is_ground_content = true,
1011 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
1013 groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
1014 sounds = default.node_sound_leaves_defaults(),
1017 minetest.register_node("default:apple", {
1018 description = "Apple",
1019 drawtype = "plantlike",
1021 tiles = {"default_apple.png"},
1022 inventory_image = "default_apple.png",
1023 paramtype = "light",
1024 sunlight_propagates = true,
1026 is_ground_content = true,
1029 fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
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})
1041 minetest.register_node("default:dry_shrub", {
1042 description = "Dry Shrub",
1043 drawtype = "plantlike",
1046 tiles = {"default_dry_shrub.png"},
1047 inventory_image = "default_dry_shrub.png",
1048 wield_image = "default_dry_shrub.png",
1049 paramtype = "light",
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(),
1057 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1061 minetest.register_node("default:grass_1", {
1062 description = "Grass",
1063 drawtype = "plantlike",
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",
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(),
1077 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
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()))
1088 minetest.register_node("default:grass_"..i, {
1089 description = "Grass",
1090 drawtype = "plantlike",
1092 tiles = {"default_grass_"..i..".png"},
1093 inventory_image = "default_grass_"..i..".png",
1094 wield_image = "default_grass_"..i..".png",
1095 paramtype = "light",
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(),
1104 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
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(),
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",
1130 {-0.5, -0.5, -0.5, 0.5, -0.5+2/16, 0.5},
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},
1138 on_construct = function(pos)
1140 if minetest.get_node(pos).name == "default:dirt_with_grass" then
1141 minetest.set_node(pos, {name="default:dirt_with_snow"})
1145 minetest.register_alias("snow", "default:snow")
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},
1158 minetest.register_node("default:pine_needles",{
1159 description = "Pine Needles",
1160 drawtype = "allfaces_optional",
1162 tiles = {"default_pine_needles.png"},
1164 paramtype = "light",
1165 is_ground_content = false,
1166 groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
1171 -- player will get sapling with 1/20 chance
1172 items = {"default:pine_sapling"},
1176 -- player will get leaves only if he get no saplings,
1177 -- this is because max_items is 1
1178 items = {"default:pine_needles"},
1182 sounds = default.node_sound_leaves_defaults(),
1183 after_place_node = default.after_place_leaves,
1186 minetest.register_node("default:pine_sapling", {
1187 description = "Pine Sapling",
1188 drawtype = "plantlike",
1190 tiles = {"default_pine_sapling.png"},
1191 inventory_image = "default_pine_sapling.png",
1192 wield_image = "default_pine_sapling.png",
1193 paramtype = "light",
1195 is_ground_content = true,
1198 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
1200 groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
1201 sounds = default.node_sound_leaves_defaults(),
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
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(),