Determine light_propagates from paramtype
[oweals/minetest.git] / data / mods / default / init.lua
1 -- default (Minetest 0.4 mod)
2 -- Most default stuff
3
4 -- Quick documentation about the API
5 -- =================================
6 --
7 -- Helper functions defined by builtin.lua:
8 -- dump2(obj, name="_", dumped={})
9 -- dump(obj, dumped={})
10 --
11 -- Mod load path
12 -- -------------
13 -- Generic:
14 -- $path_data/mods/
15 -- $path_userdata/usermods/
16 -- $mapdir/worldmods/
17 --
18 -- On a run-in-place version (eg. the distributed windows version):
19 -- minetest-0.4.x/data/mods/
20 -- minetest-0.4.x/usermods/
21 -- minetest-0.4.x/world/worldmods/
22 --
23 -- On an installed version on linux:
24 -- /usr/share/minetest/mods/
25 -- ~/.minetest/usermods
26 -- ~/.minetest/world/worldmods
27 --
28 -- Naming convention for registered textual names
29 -- ----------------------------------------------
30 -- "modname:<whatever>" (<whatever> can have characters a-zA-Z0-9_)
31 --
32 -- This is to prevent conflicting names from corrupting maps and is
33 -- enforced by the mod loader.
34 --
35 -- Example: mod "experimental", ideal item/node/entity name "tnt":
36 --          -> the name should be "experimental:tnt".
37 --
38 -- Enforcement can be overridden by prefixing the name with ":". This can
39 -- be used for overriding the registrations of some other mod.
40 --
41 -- Example: Any mod can redefine experimental:tnt by using the name
42 --          ":experimental:tnt" when registering it.
43 -- (also that mods is required to have "experimental" as a dependency)
44 --
45 -- The legacy mod uses ":" for maintaining backwards compatibility.
46 --
47 -- Textures
48 -- --------
49 -- Mods should generally prefix their textures with modname_, eg. given
50 -- the mod name "foomod", a texture could be called "default_foomod_superfurnace.png"
51 --
52 -- This is not crucial and a conflicting name will not corrupt maps.
53 --
54 -- Representations of simple things
55 -- --------------------------------
56 --
57 -- MapNode representation:
58 -- {name="name", param1=num, param2=num}
59 --
60 -- param1 and param2 are 8 bit and 4 bit integers, respectively. They
61 -- are reserved for certain automated functions. If you don't use these
62 -- functions, you can use them to store arbitrary values.
63 --
64 -- param1 is reserved for the engine when:
65 --   paramtype != "none"
66 -- param2 is reserved for the engine when any of these are used:
67 --   liquidtype == "flowing"
68 --   drawtype == "flowingliquid"
69 --   drawtype == "torchlike"
70 --   drawtype == "signlike"
71 --
72 -- Position representation:
73 -- {x=num, y=num, z=num}
74 --
75 -- stackstring/itemstring: A stack of items in serialized format.
76 -- eg. 'node "dirt" 5'
77 -- eg. 'tool "default:pick_wood" 21323'
78 -- eg. 'craft "apple" 2'
79 --
80 -- item: A single item in Lua table format.
81 -- eg. {type="node", name="dirt"} 
82 --     ^ a single dirt node
83 -- eg. {type="tool", name="default:pick_wood", wear=21323}
84 --     ^ a wooden pick about 1/3 weared out
85 -- eg. {type="craft", name="apple"}
86 --     ^ an apple.
87 --
88 -- Global functions:
89 -- minetest.register_entity(name, prototype table)
90 -- minetest.register_tool(name, tool definition)
91 -- minetest.register_node(name, node definition)
92 -- minetest.register_craftitem(name, craftitem definition)
93 -- minetest.register_craft(recipe)
94 -- minetest.register_abm(abm definition)
95 -- minetest.alias_node(name, convert_to)
96 -- minetest.alias_tool(name, convert_to)
97 -- minetest.alias_craftitem(name, convert_to)
98 -- minetest.register_globalstep(func(dtime))
99 -- minetest.register_on_placenode(func(pos, newnode, placer))
100 -- minetest.register_on_dignode(func(pos, oldnode, digger))
101 -- minetest.register_on_punchnode(func(pos, node, puncher))
102 -- minetest.register_on_generated(func(minp, maxp))
103 -- minetest.register_on_newplayer(func(ObjectRef))
104 -- minetest.register_on_respawnplayer(func(ObjectRef))
105 -- ^ return true in func to disable regular player placement
106 -- minetest.register_on_chat_message(func(name, message))
107 -- minetest.add_to_creative_inventory(itemstring)
108 -- minetest.setting_get(name) -> string or nil
109 -- minetest.setting_getbool(name) -> boolean value or nil
110 -- minetest.chat_send_all(text)
111 -- minetest.chat_send_player(name, text)
112 -- minetest.get_player_privs(name) -> set of privs
113 --
114 -- stackstring_take_item(stackstring) -> stackstring, item
115 -- stackstring_put_item(stackstring, item) -> stackstring, success
116 -- stackstring_put_stackstring(stackstring, stackstring) -> stackstring, success
117 --
118 -- minetest.digprop_constanttime(time)
119 -- minetest.digprop_stonelike(toughness)
120 -- minetest.digprop_dirtlike(toughness)
121 -- minetest.digprop_gravellike(toughness)
122 -- minetest.digprop_woodlike(toughness)
123 -- minetest.digprop_leaveslike(toughness)
124 -- minetest.digprop_glasslike(toughness)
125 --
126 -- Global objects:
127 -- minetest.env - environment reference
128 --
129 -- Global tables:
130 -- minetest.registered_nodes
131 -- ^ List of registered node definitions, indexed by name
132 -- minetest.registered_craftitems
133 -- ^ List of registered craft item definitions, indexed by name
134 -- minetest.registered_entities
135 -- ^ List of registered entity prototypes, indexed by name
136 -- minetest.object_refs
137 -- ^ List of object references, indexed by active object id
138 -- minetest.luaentities
139 -- ^ List of lua entities, indexed by active object id
140 --
141 -- EnvRef is basically ServerEnvironment and ServerMap combined.
142 -- EnvRef methods:
143 -- - add_node(pos, node)
144 -- - remove_node(pos)
145 -- - get_node(pos)
146 --   ^ Returns {name="ignore", ...} for unloaded area
147 -- - get_node_or_nil(pos)
148 --   ^ Returns nil for unloaded area
149 -- - add_luaentity(pos, name)
150 -- - add_item(pos, itemstring)
151 -- - add_rat(pos)
152 -- - add_firefly(pos)
153 -- - get_meta(pos) -- Get a NodeMetaRef at that position
154 -- - get_player_by_name(name) -- Get an ObjectRef to a player
155 --
156 -- NodeMetaRef
157 -- - get_type()
158 -- - allows_text_input()
159 -- - set_text(text) -- eg. set the text of a sign
160 -- - get_text()
161 -- - get_owner()
162 -- Generic node metadata specific:
163 -- - set_infotext(infotext)
164 -- - inventory_set_list(name, {item1, item2, ...})
165 -- - inventory_get_list(name)
166 -- - set_inventory_draw_spec(string)
167 -- - set_allow_text_input(bool)
168 -- - set_allow_removal(bool)
169 -- - set_enforce_owner(bool)
170 -- - is_inventory_modified()
171 -- - reset_inventory_modified()
172 -- - is_text_modified()
173 -- - reset_text_modified()
174 -- - set_string(name, value)
175 -- - get_string(name)
176 --
177 -- ObjectRef is basically ServerActiveObject.
178 -- ObjectRef methods:
179 -- - remove(): remove object (after returning from Lua)
180 -- - getpos() -> {x=num, y=num, z=num}
181 -- - setpos(pos); pos={x=num, y=num, z=num}
182 -- - moveto(pos, continuous=false): interpolated move
183 -- - punch(puncher, time_from_last_punch)
184 --   ^ puncher = an another ObjectRef,
185 --   ^ time_from_last_punch = time since last punch action of the puncher
186 -- - right_click(clicker); clicker = an another ObjectRef
187 -- - get_wield_digging_properties() -> digging property table
188 -- - add_to_inventory_later(itemstring): like above, but after callback returns (only allowed for craftitem callbacks)
189 -- - get_hp(): returns number of hitpoints (2 * number of hearts)
190 -- - set_hp(hp): set number of hitpoints (2 * number of hearts)
191 -- LuaEntitySAO-only:
192 -- - setvelocity({x=num, y=num, z=num})
193 -- - setacceleration({x=num, y=num, z=num})
194 -- - getacceleration() -> {x=num, y=num, z=num}
195 -- - settexturemod(mod)
196 -- - setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2,
197 -- -           select_horiz_by_yawpitch=false)
198 -- Player-only:
199 -- - get_player_name(): will return nil if is not a player
200 -- - inventory_set_list(name, {item1, item2, ...})
201 -- - inventory_get_list(name) -> {item1, item2, ...}
202 -- - damage_wielded_item(num) (item damage/wear range is 0-65535)
203 -- - add_to_inventory(itemstring): add an item to object inventory
204 --
205 -- Registered entities:
206 -- - Functions receive a "luaentity" as self:
207 --   - It has the member .object, which is an ObjectRef pointing to the object
208 --   - The original prototype stuff is visible directly via a metatable
209 -- - Callbacks:
210 --   - on_activate(self, staticdata)
211 --   - on_step(self, dtime)
212 --   - on_punch(self, hitter)
213 --   - on_rightclick(self, clicker)
214 --   - get_staticdata(self)
215 --     ^ return string that will be passed to on_activate when the object
216 --       is created next time
217 --
218 -- Entity prototype table:
219 -- {
220 --     physical = true,
221 --     collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
222 --     visual = "cube",
223 --     textures = {texture,texture,texture,texture,texture,texture},
224 --     on_activate = function(self, staticdata),
225 --     on_step = function(self, dtime),
226 --     on_punch = function(self, hitter),
227 --     on_rightclick = function(self, clicker),
228 --     get_staticdata = function(self),
229 --     # Also you can define arbitrary member variables here
230 --     myvariable = whatever,
231 -- }
232 --
233 -- Tool definition:
234 -- {
235 --     image = "default_tool_steelaxe.png",
236 --     full_punch_interval = 1.0,
237 --     basetime = 1.0,
238 --     dt_weight = 0.5,
239 --     dt_crackiness = -0.2,
240 --     dt_crumbliness = 1,
241 --     dt_cuttability = -0.5,
242 --     basedurability = 330,
243 --     dd_weight = 0,
244 --     dd_crackiness = 0,
245 --     dd_crumbliness = 0,
246 --     dd_cuttability = 0,
247 -- }
248 --
249 -- Node definition options:
250 -- {
251 --     name = "modname:somenode",
252 --     drawtype = "normal",
253 --     visual_scale = 1.0,
254 --     tile_images = {"default_unknown_block.png"},
255 --     inventory_image = "default_unknown_block.png",
256 --     special_materials = {
257 --         {image="", backface_culling=true},
258 --         {image="", backface_culling=true},
259 --     },
260 --     alpha = 255,
261 --     post_effect_color = {a=0, r=0, g=0, b=0},
262 --     paramtype = "none",
263 --     is_ground_content = false,
264 --     sunlight_propagates = false,
265 --     walkable = true,
266 --     pointable = true,
267 --     diggable = true,
268 --     climbable = false,
269 --     buildable_to = false,
270 --     wall_mounted = false,
271 --     often_contains_mineral = false,
272 --     dug_item = "",
273 --     extra_dug_item = "",
274 --     extra_dug_item_rarity = 2,
275 --     metadata_name = "",
276 --     liquidtype = "none",
277 --     liquid_alternative_flowing = "",
278 --     liquid_alternative_source = "",
279 --     liquid_viscosity = 0,
280 --     light_source = 0,
281 --     damage_per_second = 0,
282 --     selection_box = {type="regular"},
283 --     material = {
284 --         diggablity = "normal",
285 --         weight = 0,
286 --         crackiness = 0,
287 --         crumbliness = 0,
288 --         cuttability = 0,
289 --         flammability = 0,
290 --     },
291 --     cookresult_itemstring = "", -- Cannot be cooked
292 --     furnace_cooktime = 3.0,
293 --     furnace_burntime = -1, -- Cannot be used as fuel
294 -- }
295 --
296 -- Craftitem definition options:
297 -- minetest.register_craftitem("modname_name", {
298 --     image = "default_image.png",
299 --     stack_max = <maximum number of items in stack>,
300 --     cookresult_itemstring = itemstring (result of cooking),
301 --     furnace_cooktime = <cooking time>,
302 --     furnace_burntime = <time to burn as fuel in furnace>,
303 --     usable = <uh... some boolean value>,
304 --     dropcount = <amount of items to drop using drop action>
305 --     liquids_pointable = <whether can point liquids>,
306 --     on_drop = func(item, dropper, pos),
307 --     on_place_on_ground = func(item, placer, pos),
308 --     on_use = func(item, player, pointed_thing),
309 -- })
310 -- 
311 -- Recipe:
312 -- {
313 --     output = 'tool "default:pick_stone"',
314 --     recipe = {
315 --         {'node "cobble"', 'node "cobble"', 'node "cobble"'},
316 --         {'', 'craft "default:stick"', ''},
317 --         {'', 'craft "default:stick"', ''},
318 --     }
319 -- }
320 --
321 -- ABM (ActiveBlockModifier) definition:
322 -- {
323 --     nodenames = {"lava_source"},
324 --     neighbors = {"water_source", "water_flowing"}, -- (any of these)
325 --      ^ If left out or empty, any neighbor will do
326 --      ^ This might get removed in the future
327 --     interval = 1.0, -- (operation interval)
328 --     chance = 1, -- (chance of trigger is 1.0/this)
329 --     action = func(pos, node, active_object_count, active_object_count_wider),
330 -- }
331
332 WATER_ALPHA = 160
333 WATER_VISC = 1
334 LAVA_VISC = 7
335 LIGHT_MAX = 14
336
337 -- Definitions made by this mod that other mods can use too
338 default = {}
339
340 --
341 -- Tool definition
342 --
343
344 -- The hand
345 minetest.register_tool(":", {
346         image = "",
347         basetime = 0.5,
348         dt_weight = 1,
349         dt_crackiness = 0,
350         dt_crumbliness = -1,
351         dt_cuttability = 0,
352         basedurability = 50,
353         dd_weight = 0,
354         dd_crackiness = 0,
355         dd_crumbliness = 0,
356         dd_cuttability = 0,
357 })
358
359 minetest.register_tool("default:pick_wood", {
360         image = "default_tool_woodpick.png",
361         basetime = 2.0,
362         dt_weight = 0,
363         dt_crackiness = -0.5,
364         dt_crumbliness = 2,
365         dt_cuttability = 0,
366         basedurability = 30,
367         dd_weight = 0,
368         dd_crackiness = 0,
369         dd_crumbliness = 0,
370         dd_cuttability = 0,
371 })
372 minetest.register_tool("default:pick_stone", {
373         image = "default_tool_stonepick.png",
374         basetime = 1.5,
375         dt_weight = 0,
376         dt_crackiness = -0.5,
377         dt_crumbliness = 2,
378         dt_cuttability = 0,
379         basedurability = 100,
380         dd_weight = 0,
381         dd_crackiness = 0,
382         dd_crumbliness = 0,
383         dd_cuttability = 0,
384 })
385 minetest.register_tool("default:pick_steel", {
386         image = "default_tool_steelpick.png",
387         basetime = 1.0,
388         dt_weight = 0,
389         dt_crackiness = -0.5,
390         dt_crumbliness = 2,
391         dt_cuttability = 0,
392         basedurability = 333,
393         dd_weight = 0,
394         dd_crackiness = 0,
395         dd_crumbliness = 0,
396         dd_cuttability = 0,
397 })
398 minetest.register_tool("default:pick_mese", {
399         image = "default_tool_mesepick.png",
400         basetime = 0,
401         dt_weight = 0,
402         dt_crackiness = 0,
403         dt_crumbliness = 0,
404         dt_cuttability = 0,
405         basedurability = 1337,
406         dd_weight = 0,
407         dd_crackiness = 0,
408         dd_crumbliness = 0,
409         dd_cuttability = 0,
410 })
411 minetest.register_tool("default:shovel_wood", {
412         image = "default_tool_woodshovel.png",
413         basetime = 2.0,
414         dt_weight = 0.5,
415         dt_crackiness = 2,
416         dt_crumbliness = -1.5,
417         dt_cuttability = 0.3,
418         basedurability = 30,
419         dd_weight = 0,
420         dd_crackiness = 0,
421         dd_crumbliness = 0,
422         dd_cuttability = 0,
423 })
424 minetest.register_tool("default:shovel_stone", {
425         image = "default_tool_stoneshovel.png",
426         basetime = 1.5,
427         dt_weight = 0.5,
428         dt_crackiness = 2,
429         dt_crumbliness = -1.5,
430         dt_cuttability = 0.1,
431         basedurability = 100,
432         dd_weight = 0,
433         dd_crackiness = 0,
434         dd_crumbliness = 0,
435         dd_cuttability = 0,
436 })
437 minetest.register_tool("default:shovel_steel", {
438         image = "default_tool_steelshovel.png",
439         basetime = 1.0,
440         dt_weight = 0.5,
441         dt_crackiness = 2,
442         dt_crumbliness = -1.5,
443         dt_cuttability = 0.0,
444         basedurability = 330,
445         dd_weight = 0,
446         dd_crackiness = 0,
447         dd_crumbliness = 0,
448         dd_cuttability = 0,
449 })
450 minetest.register_tool("default:axe_wood", {
451         image = "default_tool_woodaxe.png",
452         basetime = 2.0,
453         dt_weight = 0.5,
454         dt_crackiness = -0.2,
455         dt_crumbliness = 1,
456         dt_cuttability = -0.5,
457         basedurability = 30,
458         dd_weight = 0,
459         dd_crackiness = 0,
460         dd_crumbliness = 0,
461         dd_cuttability = 0,
462 })
463 minetest.register_tool("default:axe_stone", {
464         image = "default_tool_stoneaxe.png",
465         basetime = 1.5,
466         dt_weight = 0.5,
467         dt_crackiness = -0.2,
468         dt_crumbliness = 1,
469         dt_cuttability = -0.5,
470         basedurability = 100,
471         dd_weight = 0,
472         dd_crackiness = 0,
473         dd_crumbliness = 0,
474         dd_cuttability = 0,
475 })
476 minetest.register_tool("default:axe_steel", {
477         image = "default_tool_steelaxe.png",
478         basetime = 1.0,
479         dt_weight = 0.5,
480         dt_crackiness = -0.2,
481         dt_crumbliness = 1,
482         dt_cuttability = -0.5,
483         basedurability = 330,
484         dd_weight = 0,
485         dd_crackiness = 0,
486         dd_crumbliness = 0,
487         dd_cuttability = 0,
488 })
489 minetest.register_tool("default:sword_wood", {
490         image = "default_tool_woodsword.png",
491         basetime = 3.0,
492         dt_weight = 3,
493         dt_crackiness = 0,
494         dt_crumbliness = 1,
495         dt_cuttability = -1,
496         basedurability = 30,
497         dd_weight = 0,
498         dd_crackiness = 0,
499         dd_crumbliness = 0,
500         dd_cuttability = 0,
501 })
502 minetest.register_tool("default:sword_stone", {
503         image = "default_tool_stonesword.png",
504         basetime = 2.5,
505         dt_weight = 3,
506         dt_crackiness = 0,
507         dt_crumbliness = 1,
508         dt_cuttability = -1,
509         basedurability = 100,
510         dd_weight = 0,
511         dd_crackiness = 0,
512         dd_crumbliness = 0,
513         dd_cuttability = 0,
514 })
515 minetest.register_tool("default:sword_steel", {
516         image = "default_tool_steelsword.png",
517         basetime = 2.0,
518         dt_weight = 3,
519         dt_crackiness = 0,
520         dt_crumbliness = 1,
521         dt_cuttability = -1,
522         basedurability = 330,
523         dd_weight = 0,
524         dd_crackiness = 0,
525         dd_crumbliness = 0,
526         dd_cuttability = 0,
527 })
528
529 --
530 -- Crafting definition
531 --
532
533 minetest.register_craft({
534         output = 'node "default:wood" 4',
535         recipe = {
536                 {'node "tree"'},
537         }
538 })
539
540 minetest.register_craft({
541         output = 'craft "default:stick" 4',
542         recipe = {
543                 {'node "default:wood"'},
544         }
545 })
546
547 minetest.register_craft({
548         output = 'node "default:fence_wood" 2',
549         recipe = {
550                 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
551                 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
552         }
553 })
554
555 minetest.register_craft({
556         output = 'node "default:sign_wall" 1',
557         recipe = {
558                 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
559                 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
560                 {'', 'craft "default:stick"', ''},
561         }
562 })
563
564 minetest.register_craft({
565         output = 'node "default:torch" 4',
566         recipe = {
567                 {'craft "default:coal_lump"'},
568                 {'craft "default:stick"'},
569         }
570 })
571
572 minetest.register_craft({
573         output = 'tool "default:pick_wood"',
574         recipe = {
575                 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
576                 {'', 'craft "default:stick"', ''},
577                 {'', 'craft "default:stick"', ''},
578         }
579 })
580
581 minetest.register_craft({
582         output = 'tool "default:pick_stone"',
583         recipe = {
584                 {'node "cobble"', 'node "cobble"', 'node "cobble"'},
585                 {'', 'craft "default:stick"', ''},
586                 {'', 'craft "default:stick"', ''},
587         }
588 })
589
590 minetest.register_craft({
591         output = 'tool "default:pick_steel"',
592         recipe = {
593                 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
594                 {'', 'craft "default:stick"', ''},
595                 {'', 'craft "default:stick"', ''},
596         }
597 })
598
599 minetest.register_craft({
600         output = 'tool "default:pick_mese"',
601         recipe = {
602                 {'node "mese"', 'node "mese"', 'node "mese"'},
603                 {'', 'craft "default:stick"', ''},
604                 {'', 'craft "default:stick"', ''},
605         }
606 })
607
608 minetest.register_craft({
609         output = 'tool "default:shovel_wood"',
610         recipe = {
611                 {'node "default:wood"'},
612                 {'craft "default:stick"'},
613                 {'craft "default:stick"'},
614         }
615 })
616
617 minetest.register_craft({
618         output = 'tool "default:shovel_stone"',
619         recipe = {
620                 {'node "cobble"'},
621                 {'craft "default:stick"'},
622                 {'craft "default:stick"'},
623         }
624 })
625
626 minetest.register_craft({
627         output = 'tool "default:shovel_steel"',
628         recipe = {
629                 {'craft "default:steel_ingot"'},
630                 {'craft "default:stick"'},
631                 {'craft "default:stick"'},
632         }
633 })
634
635 minetest.register_craft({
636         output = 'tool "default:axe_wood"',
637         recipe = {
638                 {'node "default:wood"', 'node "default:wood"'},
639                 {'node "default:wood"', 'craft "default:stick"'},
640                 {'', 'craft "default:stick"'},
641         }
642 })
643
644 minetest.register_craft({
645         output = 'tool "default:axe_stone"',
646         recipe = {
647                 {'node "cobble"', 'node "cobble"'},
648                 {'node "cobble"', 'craft "default:stick"'},
649                 {'', 'craft "default:stick"'},
650         }
651 })
652
653 minetest.register_craft({
654         output = 'tool "default:axe_steel"',
655         recipe = {
656                 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
657                 {'craft "default:steel_ingot"', 'craft "default:stick"'},
658                 {'', 'craft "default:stick"'},
659         }
660 })
661
662 minetest.register_craft({
663         output = 'tool "default:sword_wood"',
664         recipe = {
665                 {'node "default:wood"'},
666                 {'node "default:wood"'},
667                 {'craft "default:stick"'},
668         }
669 })
670
671 minetest.register_craft({
672         output = 'tool "default:sword_stone"',
673         recipe = {
674                 {'node "cobble"'},
675                 {'node "cobble"'},
676                 {'craft "default:stick"'},
677         }
678 })
679
680 minetest.register_craft({
681         output = 'tool "default:sword_steel"',
682         recipe = {
683                 {'craft "default:steel_ingot"'},
684                 {'craft "default:steel_ingot"'},
685                 {'craft "default:stick"'},
686         }
687 })
688
689 minetest.register_craft({
690         output = 'node "default:rail" 15',
691         recipe = {
692                 {'craft "default:steel_ingot"', '', 'craft "default:steel_ingot"'},
693                 {'craft "default:steel_ingot"', 'craft "default:stick"', 'craft "default:steel_ingot"'},
694                 {'craft "default:steel_ingot"', '', 'craft "default:steel_ingot"'},
695         }
696 })
697
698 minetest.register_craft({
699         output = 'node "default:chest" 1',
700         recipe = {
701                 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
702                 {'node "default:wood"', '', 'node "default:wood"'},
703                 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
704         }
705 })
706
707 minetest.register_craft({
708         output = 'node "default:chest_locked" 1',
709         recipe = {
710                 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
711                 {'node "default:wood"', 'craft "default:steel_ingot"', 'node "default:wood"'},
712                 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
713         }
714 })
715
716 minetest.register_craft({
717         output = 'node "default:furnace" 1',
718         recipe = {
719                 {'node "cobble"', 'node "cobble"', 'node "cobble"'},
720                 {'node "cobble"', '', 'node "cobble"'},
721                 {'node "cobble"', 'node "cobble"', 'node "cobble"'},
722         }
723 })
724
725 minetest.register_craft({
726         output = 'node "default:steelblock" 1',
727         recipe = {
728                 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
729                 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
730                 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
731         }
732 })
733
734 minetest.register_craft({
735         output = 'node "default:sandstone" 1',
736         recipe = {
737                 {'node "sand"', 'node "sand"'},
738                 {'node "sand"', 'node "sand"'},
739         }
740 })
741
742 minetest.register_craft({
743         output = 'node "default:clay" 1',
744         recipe = {
745                 {'craft "default:clay_lump"', 'craft "default:clay_lump"'},
746                 {'craft "default:clay_lump"', 'craft "default:clay_lump"'},
747         }
748 })
749
750 minetest.register_craft({
751         output = 'node "default:brick" 1',
752         recipe = {
753                 {'craft "default:clay_brick"', 'craft "default:clay_brick"'},
754                 {'craft "default:clay_brick"', 'craft "default:clay_brick"'},
755         }
756 })
757
758 minetest.register_craft({
759         output = 'craft "default:paper" 1',
760         recipe = {
761                 {'node "papyrus"', 'node "papyrus"', 'node "papyrus"'},
762         }
763 })
764
765 minetest.register_craft({
766         output = 'craft "default:book" 1',
767         recipe = {
768                 {'craft "default:paper"'},
769                 {'craft "default:paper"'},
770                 {'craft "default:paper"'},
771         }
772 })
773
774 minetest.register_craft({
775         output = 'node "default:bookshelf" 1',
776         recipe = {
777                 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
778                 {'craft "default:book"', 'craft "default:book"', 'craft "default:book"'},
779                 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
780         }
781 })
782
783 minetest.register_craft({
784         output = 'node "default:ladder" 1',
785         recipe = {
786                 {'craft "default:stick"', '', 'craft "default:stick"'},
787                 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
788                 {'craft "default:stick"', '', 'craft "default:stick"'},
789         }
790 })
791
792 --
793 -- Node definitions
794 --
795
796 minetest.register_node("default:stone", {
797         tile_images = {"default_stone.png"},
798         inventory_image = minetest.inventorycube("default_stone.png"),
799         paramtype = "mineral",
800         is_ground_content = true,
801         often_contains_mineral = true, -- Texture atlas hint
802         material = minetest.digprop_stonelike(1.0),
803         dug_item = 'node "cobble" 1',
804 })
805
806 minetest.register_node("default:dirt_with_grass", {
807         tile_images = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
808         inventory_image = minetest.inventorycube("default_dirt.png^default_grass_side.png"),
809         is_ground_content = true,
810         material = minetest.digprop_dirtlike(1.0),
811         dug_item = 'node "dirt" 1',
812 })
813
814 minetest.register_node("default:dirt_with_grass_footsteps", {
815         tile_images = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
816         inventory_image = "default_grass_footsteps.png",
817         is_ground_content = true,
818         material = minetest.digprop_dirtlike(1.0),
819         dug_item = 'node "dirt" 1',
820 })
821
822 minetest.register_node("default:dirt", {
823         tile_images = {"default_dirt.png"},
824         inventory_image = minetest.inventorycube("default_dirt.png"),
825         is_ground_content = true,
826         material = minetest.digprop_dirtlike(1.0),
827 })
828
829 minetest.register_node("default:sand", {
830         tile_images = {"default_sand.png"},
831         inventory_image = minetest.inventorycube("default_sand.png"),
832         is_ground_content = true,
833         material = minetest.digprop_dirtlike(1.0),
834         cookresult_itemstring = 'node "glass" 1',
835 })
836
837 minetest.register_node("default:gravel", {
838         tile_images = {"default_gravel.png"},
839         inventory_image = minetest.inventorycube("default_gravel.png"),
840         is_ground_content = true,
841         material = minetest.digprop_gravellike(1.0),
842 })
843
844 minetest.register_node("default:sandstone", {
845         tile_images = {"default_sandstone.png"},
846         inventory_image = minetest.inventorycube("default_sandstone.png"),
847         is_ground_content = true,
848         material = minetest.digprop_dirtlike(1.0),  -- FIXME should this be stonelike?
849         dug_item = 'node "sand" 1',  -- FIXME is this intentional?
850 })
851
852 minetest.register_node("default:clay", {
853         tile_images = {"default_clay.png"},
854         inventory_image = minetest.inventorycube("default_clay.png"),
855         is_ground_content = true,
856         material = minetest.digprop_dirtlike(1.0),
857         dug_item = 'craft "default:clay_lump" 4',
858 })
859
860 minetest.register_node("default:brick", {
861         tile_images = {"default_brick.png"},
862         inventory_image = minetest.inventorycube("default_brick.png"),
863         is_ground_content = true,
864         material = minetest.digprop_stonelike(1.0),
865         dug_item = 'craft "default:clay_brick" 4',
866 })
867
868 minetest.register_node("default:tree", {
869         tile_images = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
870         inventory_image = minetest.inventorycube("default_tree_top.png", "default_tree.png", "default_tree.png"),
871         is_ground_content = true,
872         material = minetest.digprop_woodlike(1.0),
873         cookresult_itemstring = 'craft "default:coal_lump" 1',
874         furnace_burntime = 30,
875 })
876
877 minetest.register_node("default:jungletree", {
878         tile_images = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
879         inventory_image = minetest.inventorycube("default_jungletree_top.png", "default_jungletree.png", "default_jungletree.png"),
880         is_ground_content = true,
881         material = minetest.digprop_woodlike(1.0),
882         cookresult_itemstring = 'craft "default:coal_lump" 1',
883         furnace_burntime = 30,
884 })
885
886 minetest.register_node("default:junglegrass", {
887         drawtype = "plantlike",
888         visual_scale = 1.3,
889         tile_images = {"default_junglegrass.png"},
890         inventory_image = "default_junglegrass.png",
891         paramtype = "light",
892         walkable = false,
893         material = minetest.digprop_leaveslike(1.0),
894         furnace_burntime = 2,
895 })
896
897 minetest.register_node("default:leaves", {
898         drawtype = "allfaces_optional",
899         visual_scale = 1.3,
900         tile_images = {"default_leaves.png"},
901         inventory_image = minetest.inventorycube("default_leaves.png"),
902         paramtype = "light",
903         material = minetest.digprop_leaveslike(1.0),
904         extra_dug_item = 'node "sapling" 1',
905         extra_dug_item_rarity = 20,
906         furnace_burntime = 1,
907 })
908
909 minetest.register_node("default:cactus", {
910         tile_images = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
911         inventory_image = minetest.inventorycube("default_cactus_top.png", "default_cactus_side.png", "default_cactus_side.png"),
912         is_ground_content = true,
913         material = minetest.digprop_woodlike(0.75),
914         furnace_burntime = 15,
915 })
916
917 minetest.register_node("default:papyrus", {
918         drawtype = "plantlike",
919         tile_images = {"default_papyrus.png"},
920         inventory_image = "default_papyrus.png",
921         paramtype = "light",
922         is_ground_content = true,
923         walkable = false,
924         material = minetest.digprop_leaveslike(0.5),
925         furnace_burntime = 1,
926 })
927
928 minetest.register_node("default:bookshelf", {
929         tile_images = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
930         inventory_image = minetest.inventorycube("default_wood.png", "default_bookshelf.png", "default_bookshelf.png"),
931         is_ground_content = true,
932         material = minetest.digprop_woodlike(0.75),
933         furnace_burntime = 30,
934 })
935
936 minetest.register_node("default:glass", {
937         drawtype = "glasslike",
938         tile_images = {"default_glass.png"},
939         inventory_image = minetest.inventorycube("default_glass.png"),
940         paramtype = "light",
941         sunlight_propagates = true,
942         is_ground_content = true,
943         material = minetest.digprop_glasslike(1.0),
944 })
945
946 minetest.register_node("default:fence_wood", {
947         drawtype = "fencelike",
948         tile_images = {"default_wood.png"},
949         inventory_image = "default_fence.png",
950         paramtype = "light",
951         is_ground_content = true,
952         selection_box = {
953                 type = "fixed",
954                 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
955         },
956         furnace_burntime = 15,
957         material = minetest.digprop_woodlike(0.75),
958 })
959
960 minetest.register_node("default:rail", {
961         drawtype = "raillike",
962         tile_images = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
963         inventory_image = "default_rail.png",
964         paramtype = "light",
965         is_ground_content = true,
966         walkable = false,
967         selection_box = {
968                 type = "fixed",
969                 --fixed = <default>
970         },
971         material = minetest.digprop_dirtlike(0.75),
972 })
973
974 minetest.register_node("default:ladder", {
975         drawtype = "signlike",
976         tile_images = {"default_ladder.png"},
977         inventory_image = "default_ladder.png",
978         paramtype = "light",
979         is_ground_content = true,
980         wall_mounted = true,
981         walkable = false,
982         climbable = true,
983         selection_box = {
984                 type = "wallmounted",
985                 --wall_top = = <default>
986                 --wall_bottom = = <default>
987                 --wall_side = = <default>
988         },
989         furnace_burntime = 5,
990         material = minetest.digprop_woodlike(0.5),
991 })
992
993 minetest.register_node("default:wood", {
994         tile_images = {"default_wood.png"},
995         inventory_image = minetest.inventorycube("default_wood.png"),
996         is_ground_content = true,
997         furnace_burntime = 7,
998         material = minetest.digprop_woodlike(0.75),
999 })
1000
1001 minetest.register_node("default:mese", {
1002         tile_images = {"default_mese.png"},
1003         inventory_image = minetest.inventorycube("default_mese.png"),
1004         is_ground_content = true,
1005         furnace_burntime = 30,
1006         material = minetest.digprop_stonelike(0.5),
1007 })
1008
1009 minetest.register_node("default:cloud", {
1010         tile_images = {"default_cloud.png"},
1011         inventory_image = minetest.inventorycube("default_cloud.png"),
1012         is_ground_content = true,
1013 })
1014
1015 minetest.register_node("default:water_flowing", {
1016         drawtype = "flowingliquid",
1017         tile_images = {"default_water.png"},
1018         alpha = WATER_ALPHA,
1019         inventory_image = minetest.inventorycube("default_water.png"),
1020         paramtype = "light",
1021         walkable = false,
1022         pointable = false,
1023         diggable = false,
1024         buildable_to = true,
1025         liquidtype = "flowing",
1026         liquid_alternative_flowing = "water_flowing",
1027         liquid_alternative_source = "water_source",
1028         liquid_viscosity = WATER_VISC,
1029         post_effect_color = {a=64, r=100, g=100, b=200},
1030         special_materials = {
1031                 {image="default_water.png", backface_culling=false},
1032                 {image="default_water.png", backface_culling=true},
1033         },
1034 })
1035
1036 minetest.register_node("default:water_source", {
1037         drawtype = "liquid",
1038         tile_images = {"default_water.png"},
1039         alpha = WATER_ALPHA,
1040         inventory_image = minetest.inventorycube("default_water.png"),
1041         paramtype = "light",
1042         walkable = false,
1043         pointable = false,
1044         diggable = false,
1045         buildable_to = true,
1046         liquidtype = "source",
1047         liquid_alternative_flowing = "water_flowing",
1048         liquid_alternative_source = "water_source",
1049         liquid_viscosity = WATER_VISC,
1050         post_effect_color = {a=64, r=100, g=100, b=200},
1051         special_materials = {
1052                 -- New-style water source material (mostly unused)
1053                 {image="default_water.png", backface_culling=false},
1054         },
1055 })
1056
1057 minetest.register_node("default:lava_flowing", {
1058         drawtype = "flowingliquid",
1059         tile_images = {"default_lava.png"},
1060         inventory_image = minetest.inventorycube("default_lava.png"),
1061         paramtype = "light",
1062         light_source = LIGHT_MAX - 1,
1063         walkable = false,
1064         pointable = false,
1065         diggable = false,
1066         buildable_to = true,
1067         liquidtype = "flowing",
1068         liquid_alternative_flowing = "lava_flowing",
1069         liquid_alternative_source = "lava_source",
1070         liquid_viscosity = LAVA_VISC,
1071         damage_per_second = 4*2,
1072         post_effect_color = {a=192, r=255, g=64, b=0},
1073         special_materials = {
1074                 {image="default_lava.png", backface_culling=false},
1075                 {image="default_lava.png", backface_culling=true},
1076         },
1077 })
1078
1079 minetest.register_node("default:lava_source", {
1080         drawtype = "liquid",
1081         tile_images = {"default_lava.png"},
1082         inventory_image = minetest.inventorycube("default_lava.png"),
1083         paramtype = "light",
1084         light_source = LIGHT_MAX - 1,
1085         walkable = false,
1086         pointable = false,
1087         diggable = false,
1088         buildable_to = true,
1089         liquidtype = "source",
1090         liquid_alternative_flowing = "lava_flowing",
1091         liquid_alternative_source = "lava_source",
1092         liquid_viscosity = LAVA_VISC,
1093         damage_per_second = 4*2,
1094         post_effect_color = {a=192, r=255, g=64, b=0},
1095         special_materials = {
1096                 -- New-style lava source material (mostly unused)
1097                 {image="default_lava.png", backface_culling=false},
1098         },
1099         furnace_burntime = 60,
1100 })
1101
1102 minetest.register_node("default:torch", {
1103         drawtype = "torchlike",
1104         tile_images = {"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"},
1105         inventory_image = "default_torch_on_floor.png",
1106         paramtype = "light",
1107         sunlight_propagates = true,
1108         walkable = false,
1109         wall_mounted = true,
1110         light_source = LIGHT_MAX-1,
1111         selection_box = {
1112                 type = "wallmounted",
1113                 wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
1114                 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
1115                 wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
1116         },
1117         material = minetest.digprop_constanttime(0.0),
1118         furnace_burntime = 4,
1119 })
1120
1121 minetest.register_node("default:sign_wall", {
1122         drawtype = "signlike",
1123         tile_images = {"default_sign_wall.png"},
1124         inventory_image = "default_sign_wall.png",
1125         paramtype = "light",
1126         sunlight_propagates = true,
1127         walkable = false,
1128         wall_mounted = true,
1129         metadata_name = "sign",
1130         selection_box = {
1131                 type = "wallmounted",
1132                 --wall_top = <default>
1133                 --wall_bottom = <default>
1134                 --wall_side = <default>
1135         },
1136         material = minetest.digprop_constanttime(0.5),
1137         furnace_burntime = 10,
1138 })
1139
1140 minetest.register_node("default:chest", {
1141         tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1142                 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1143         inventory_image = minetest.inventorycube("default_chest_top.png", "default_chest_front.png", "default_chest_side.png"),
1144         paramtype = "facedir_simple",
1145         metadata_name = "chest",
1146         material = minetest.digprop_woodlike(1.0),
1147         furnace_burntime = 30,
1148 })
1149
1150 minetest.register_node("default:chest_locked", {
1151         tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1152                 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1153         inventory_image = minetest.inventorycube("default_chest_top.png", "default_chest_lock.png", "default_chest_side.png"),
1154         paramtype = "facedir_simple",
1155         metadata_name = "locked_chest",
1156         material = minetest.digprop_woodlike(1.0),
1157         furnace_burntime = 30,
1158 })
1159
1160 minetest.register_node("default:furnace", {
1161         tile_images = {"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
1162                 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
1163         inventory_image = minetest.inventorycube("default_furnace_side.png", "default_furnace_front.png", "default_furnace_side.png"),
1164         paramtype = "facedir_simple",
1165         metadata_name = "furnace",
1166         material = minetest.digprop_stonelike(3.0),
1167 })
1168
1169 minetest.register_node("default:cobble", {
1170         tile_images = {"default_cobble.png"},
1171         inventory_image = minetest.inventorycube("default_cobble.png"),
1172         is_ground_content = true,
1173         cookresult_itemstring = 'node "stone" 1',
1174         material = minetest.digprop_stonelike(0.9),
1175 })
1176
1177 minetest.register_node("default:mossycobble", {
1178         tile_images = {"default_mossycobble.png"},
1179         inventory_image = minetest.inventorycube("default_mossycobble.png"),
1180         is_ground_content = true,
1181         material = minetest.digprop_stonelike(0.8),
1182 })
1183
1184 minetest.register_node("default:steelblock", {
1185         tile_images = {"default_steel_block.png"},
1186         inventory_image = minetest.inventorycube("default_steel_block.png"),
1187         is_ground_content = true,
1188         material = minetest.digprop_stonelike(5.0),
1189 })
1190
1191 minetest.register_node("default:nyancat", {
1192         tile_images = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1193                 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1194         inventory_image = "default_nc_front.png",
1195         paramtype = "facedir_simple",
1196         material = minetest.digprop_stonelike(3.0),
1197         furnace_burntime = 1,
1198 })
1199
1200 minetest.register_node("default:nyancat_rainbow", {
1201         tile_images = {"default_nc_rb.png"},
1202         inventory_image = "default_nc_rb.png",
1203         material = minetest.digprop_stonelike(3.0),
1204         furnace_burntime = 1,
1205 })
1206
1207 minetest.register_node("default:sapling", {
1208         drawtype = "plantlike",
1209         visual_scale = 1.0,
1210         tile_images = {"default_sapling.png"},
1211         inventory_image = "default_sapling.png",
1212         paramtype = "light",
1213         walkable = false,
1214         material = minetest.digprop_constanttime(0.0),
1215         furnace_burntime = 10,
1216 })
1217
1218 minetest.register_node("default:apple", {
1219         drawtype = "plantlike",
1220         visual_scale = 1.0,
1221         tile_images = {"default_apple.png"},
1222         inventory_image = "default_apple.png",
1223         paramtype = "light",
1224         sunlight_propagates = true,
1225         walkable = false,
1226         dug_item = 'craft "apple" 1',
1227         material = minetest.digprop_constanttime(0.0),
1228         furnace_burntime = 3,
1229 })
1230
1231 --
1232 -- Crafting items
1233 --
1234
1235 minetest.register_craftitem("default:stick", {
1236         image = "default_stick.png",
1237         --furnace_burntime = ...,
1238         on_place_on_ground = minetest.craftitem_place_item,
1239 })
1240
1241 minetest.register_craftitem("default:paper", {
1242         image = "default_paper.png",
1243         on_place_on_ground = minetest.craftitem_place_item,
1244 })
1245
1246 minetest.register_craftitem("default:book", {
1247         image = "default_book.png",
1248         on_place_on_ground = minetest.craftitem_place_item,
1249 })
1250
1251 minetest.register_craftitem("default:coal_lump", {
1252         image = "default_coal_lump.png",
1253         furnace_burntime = 40;
1254         on_place_on_ground = minetest.craftitem_place_item,
1255 })
1256
1257 minetest.register_craftitem("default:iron_lump", {
1258         image = "default_iron_lump.png",
1259         cookresult_itemstring = 'craft "default:steel_ingot" 1',
1260         on_place_on_ground = minetest.craftitem_place_item,
1261 })
1262
1263 minetest.register_craftitem("default:clay_lump", {
1264         image = "default_clay_lump.png",
1265         cookresult_itemstring = 'craft "default:clay_brick" 1',
1266         on_place_on_ground = minetest.craftitem_place_item,
1267 })
1268
1269 minetest.register_craftitem("default:steel_ingot", {
1270         image = "default_steel_ingot.png",
1271         on_place_on_ground = minetest.craftitem_place_item,
1272 })
1273
1274 minetest.register_craftitem("default:clay_brick", {
1275         image = "default_clay_brick.png",
1276         on_place_on_ground = minetest.craftitem_place_item,
1277 })
1278
1279 minetest.register_craftitem("default:scorched_stuff", {
1280         image = "default_scorched_stuff.png",
1281         on_place_on_ground = minetest.craftitem_place_item,
1282 })
1283
1284 minetest.register_craftitem("default:apple", {
1285         image = "default_apple.png",
1286         on_place_on_ground = minetest.craftitem_place_item,
1287         on_use = minetest.craftitem_eat(4),
1288 })
1289
1290 --
1291 -- Creative inventory
1292 --
1293
1294 minetest.add_to_creative_inventory('tool "default:pick_mese" 0')
1295 minetest.add_to_creative_inventory('tool "default:pick_steel" 0')
1296 minetest.add_to_creative_inventory('tool "default:axe_steel" 0')
1297 minetest.add_to_creative_inventory('tool "default:shovel_steel" 0')
1298
1299 minetest.add_to_creative_inventory('node "default:torch" 0')
1300 minetest.add_to_creative_inventory('node "default:cobble" 0')
1301 minetest.add_to_creative_inventory('node "default:dirt" 0')
1302 minetest.add_to_creative_inventory('node "default:stone" 0')
1303 minetest.add_to_creative_inventory('node "default:sand" 0')
1304 minetest.add_to_creative_inventory('node "default:sandstone" 0')
1305 minetest.add_to_creative_inventory('node "default:clay" 0')
1306 minetest.add_to_creative_inventory('node "default:brick" 0')
1307 minetest.add_to_creative_inventory('node "default:tree" 0')
1308 minetest.add_to_creative_inventory('node "default:leaves" 0')
1309 minetest.add_to_creative_inventory('node "default:cactus" 0')
1310 minetest.add_to_creative_inventory('node "default:papyrus" 0')
1311 minetest.add_to_creative_inventory('node "default:bookshelf" 0')
1312 minetest.add_to_creative_inventory('node "default:glass" 0')
1313 minetest.add_to_creative_inventory('node "default:fence" 0')
1314 minetest.add_to_creative_inventory('node "default:rail" 0')
1315 minetest.add_to_creative_inventory('node "default:mese" 0')
1316 minetest.add_to_creative_inventory('node "default:chest" 0')
1317 minetest.add_to_creative_inventory('node "default:furnace" 0')
1318 minetest.add_to_creative_inventory('node "default:sign_wall" 0')
1319 minetest.add_to_creative_inventory('node "default:water_source" 0')
1320 minetest.add_to_creative_inventory('node "default:lava_source" 0')
1321 minetest.add_to_creative_inventory('node "default:ladder" 0')
1322
1323 --
1324 -- Some common functions
1325 --
1326
1327 default.falling_node_names = {}
1328
1329 function nodeupdate_single(p)
1330         n = minetest.env:get_node(p)
1331         if default.falling_node_names[n.name] ~= nil then
1332                 p_bottom = {x=p.x, y=p.y-1, z=p.z}
1333                 n_bottom = minetest.env:get_node(p_bottom)
1334                 if n_bottom.name == "air" then
1335                         minetest.env:remove_node(p)
1336                         minetest.env:add_luaentity(p, "default:falling_"..n.name)
1337                         nodeupdate(p)
1338                 end
1339         end
1340 end
1341
1342 function nodeupdate(p)
1343         for x = -1,1 do
1344         for y = -1,1 do
1345         for z = -1,1 do
1346                 p2 = {x=p.x+x, y=p.y+y, z=p.z+z}
1347                 nodeupdate_single(p2)
1348         end
1349         end
1350         end
1351 end
1352
1353 --
1354 -- Falling stuff
1355 --
1356
1357 function default.register_falling_node(nodename, texture)
1358         default.falling_node_names[nodename] = true
1359         -- Override naming conventions for stuff like :default:falling_default:sand
1360         minetest.register_entity(":default:falling_"..nodename, {
1361                 -- Static definition
1362                 physical = true,
1363                 collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
1364                 visual = "cube",
1365                 textures = {texture,texture,texture,texture,texture,texture},
1366                 -- State
1367                 -- Methods
1368                 on_step = function(self, dtime)
1369                         -- Set gravity
1370                         self.object:setacceleration({x=0, y=-10, z=0})
1371                         -- Turn to actual sand when collides to ground or just move
1372                         local pos = self.object:getpos()
1373                         local bcp = {x=pos.x, y=pos.y-0.7, z=pos.z} -- Position of bottom center point
1374                         local bcn = minetest.env:get_node(bcp)
1375                         if bcn.name ~= "air" then
1376                                 -- Turn to a sand node
1377                                 local np = {x=bcp.x, y=bcp.y+1, z=bcp.z}
1378                                 minetest.env:add_node(np, {name=nodename})
1379                                 self.object:remove()
1380                         else
1381                                 -- Do nothing
1382                         end
1383                 end
1384         })
1385 end
1386
1387 default.register_falling_node("default:sand", "default_sand.png")
1388 default.register_falling_node("default:gravel", "default_gravel.png")
1389
1390 --
1391 -- Global callbacks
1392 --
1393
1394 -- Global environment step function
1395 function on_step(dtime)
1396         -- print("on_step")
1397 end
1398 minetest.register_globalstep(on_step)
1399
1400 function on_placenode(p, node)
1401         --print("on_placenode")
1402         nodeupdate(p)
1403 end
1404 minetest.register_on_placenode(on_placenode)
1405
1406 function on_dignode(p, node)
1407         --print("on_dignode")
1408         nodeupdate(p)
1409 end
1410 minetest.register_on_dignode(on_dignode)
1411
1412 function on_punchnode(p, node)
1413 end
1414 minetest.register_on_punchnode(on_punchnode)
1415
1416 minetest.register_on_chat_message(function(name, message)
1417         --print("default on_chat_message: name="..dump(name).." message="..dump(message))
1418         local cmd = "/giveme"
1419         if message:sub(0, #cmd) == cmd then
1420                 if not minetest.get_player_privs(name)["give"] then
1421                         minetest.chat_send_player(name, "you don't have permission to give")
1422                         return true -- Handled chat message
1423                 end
1424                 local stackstring = string.match(message, cmd.." (.*)")
1425                 if stackstring == nil then
1426                         minetest.chat_send_player(name, 'usage: '..cmd..' stackstring')
1427                         return true -- Handled chat message
1428                 end
1429                 print(cmd..' invoked, stackstring="'..stackstring..'"')
1430                 local player = minetest.env:get_player_by_name(name)
1431                 if player == nil then
1432                         minetest.chat_send_player(name, name2..' is not a known player')
1433                         return true -- Handled chat message
1434                 end
1435                 local added, error_msg = player:add_to_inventory(stackstring)
1436                 if added then
1437                         minetest.chat_send_player(name, '"'..stackstring
1438                                         ..'" added to inventory.');
1439                 else
1440                         minetest.chat_send_player(name, 'Could not give "'..stackstring
1441                                         ..'": '..error_msg);
1442                 end
1443                 return true -- Handled chat message
1444         end
1445         local cmd = "/give"
1446         if message:sub(0, #cmd) == cmd then
1447                 if not minetest.get_player_privs(name)["give"] then
1448                         minetest.chat_send_player(name, "you don't have permission to give")
1449                         return true -- Handled chat message
1450                 end
1451                 local name2, stackstring = string.match(message, cmd.." ([%a%d_-]+) (.*)")
1452                 if name == nil or stackstring == nil then
1453                         minetest.chat_send_player(name, 'usage: '..cmd..' name stackstring')
1454                         return true -- Handled chat message
1455                 end
1456                 print(cmd..' invoked, name2="'..name2
1457                                 ..'" stackstring="'..stackstring..'"')
1458                 local player = minetest.env:get_player_by_name(name2)
1459                 if player == nil then
1460                         minetest.chat_send_player(name, name2..' is not a known player')
1461                         return true -- Handled chat message
1462                 end
1463                 local added, error_msg = player:add_to_inventory(stackstring)
1464                 if added then
1465                         minetest.chat_send_player(name, '"'..stackstring
1466                                         ..'" added to '..name2..'\'s inventory.');
1467                         minetest.chat_send_player(name2, '"'..stackstring
1468                                         ..'" added to inventory.');
1469                 else
1470                         minetest.chat_send_player(name, 'Could not give "'..stackstring
1471                                         ..'": '..error_msg);
1472                 end
1473                 return true -- Handled chat message
1474         end
1475 end)
1476
1477 --
1478 -- Done, print some random stuff
1479 --
1480
1481 --print("minetest.registered_entities:")
1482 --dump2(minetest.registered_entities)
1483
1484 -- END