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