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