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