]> git.lizzy.rs Git - dragonfireclient.git/blob - data/mods/default/init.lua
Add object reference to Lua on_place/dig/punchnode parameters
[dragonfireclient.git] / data / mods / default / init.lua
1 function basic_dump2(o)
2         if type(o) == "number" then
3                 return tostring(o)
4         elseif type(o) == "string" then
5                 return string.format("%q", o)
6         elseif type(o) == "boolean" then
7                 return tostring(o)
8         elseif type(o) == "function" then
9                 return "<function>"
10         elseif type(o) == "userdata" then
11                 return "<userdata>"
12         elseif type(o) == "nil" then
13                 return "nil"
14         else
15                 error("cannot dump a " .. type(o))
16                 return nil
17         end
18 end
19
20 function dump2(o, name, dumped)
21         name = name or "_"
22         dumped = dumped or {}
23         io.write(name, " = ")
24         if type(o) == "number" or type(o) == "string" or type(o) == "boolean"
25                         or type(o) == "function" or type(o) == "nil"
26                         or type(o) == "userdata" then
27                 io.write(basic_dump2(o), "\n")
28         elseif type(o) == "table" then
29                 if dumped[o] then
30                         io.write(dumped[o], "\n")
31                 else
32                         dumped[o] = name
33                         io.write("{}\n") -- new table
34                         for k,v in pairs(o) do
35                                 local fieldname = string.format("%s[%s]", name, basic_dump2(k))
36                                 dump2(v, fieldname, dumped)
37                         end
38                 end
39         else
40                 error("cannot dump a " .. type(o))
41                 return nil
42         end
43 end
44
45 function dump(o, dumped)
46         dumped = dumped or {}
47         if type(o) == "number" then
48                 return tostring(o)
49         elseif type(o) == "string" then
50                 return string.format("%q", o)
51         elseif type(o) == "table" then
52                 if dumped[o] then
53                         return "<circular reference>"
54                 end
55                 dumped[o] = true
56                 local t = {}
57                 for k,v in pairs(o) do
58                         t[#t+1] = "" .. k .. " = " .. dump(v, dumped)
59                 end
60                 return "{" .. table.concat(t, ", ") .. "}"
61         elseif type(o) == "boolean" then
62                 return tostring(o)
63         elseif type(o) == "function" then
64                 return "<function>"
65         elseif type(o) == "userdata" then
66                 return "<userdata>"
67         elseif type(o) == "nil" then
68                 return "nil"
69         else
70                 error("cannot dump a " .. type(o))
71                 return nil
72         end
73 end
74
75 -- Textures:
76 -- Mods should prefix their textures with modname_, eg. given the mod
77 -- name "foomod", a texture could be called "foomod_superfurnace.png"
78 --
79 -- Global functions:
80 -- minetest.register_entity(name, prototype_table)
81 -- minetest.register_tool(name, {lots of stuff})
82 -- minetest.register_node(name, {lots of stuff})
83 -- minetest.register_craft({output=item, recipe={...})
84 -- minetest.register_globalstep(func)
85 -- minetest.register_on_placenode(func(pos, newnode, placer))
86 -- minetest.register_on_dignode(func(pos, oldnode, digger))
87 -- minetest.register_on_punchnode(func(pos, node, puncher))
88 --
89 -- Global objects:
90 -- minetest.env - environment reference
91 --
92 -- Global tables:
93 -- minetest.registered_entities
94 -- ^ List of registered entity prototypes, indexed by name
95 -- minetest.object_refs
96 -- ^ List of object references, indexed by active object id
97 -- minetest.luaentities
98 -- ^ List of lua entities, indexed by active object id
99 --
100 -- EnvRef is basically ServerEnvironment and ServerMap combined.
101 -- EnvRef methods:
102 -- - add_node(pos, node)
103 -- - remove_node(pos)
104 -- - get_node(pos)
105 -- - add_luaentity(pos, name)
106 --
107 -- ObjectRef is basically ServerActiveObject.
108 -- ObjectRef methods:
109 -- - remove(): remove object (after returning from Lua)
110 -- - getpos(): returns {x=num, y=num, z=num}
111 -- - setpos(pos); pos={x=num, y=num, z=num}
112 -- - moveto(pos, continuous=false): interpolated move
113 -- - add_to_inventory(itemstring): add an item to object inventory
114 --
115 -- Registered entities:
116 -- - Functions receive a "luaentity" as self:
117 --   - It has the member .object, which is an ObjectRef pointing to the object
118 --   - The original prototype stuff is visible directly via a metatable
119 -- - Callbacks:
120 --   - on_activate(self, staticdata)
121 --   - on_step(self, dtime)
122 --   - on_punch(self, hitter)
123 --   - on_rightclick(self, clicker)
124 --   - get_staticdata(self): return string
125 --
126 -- MapNode representation:
127 -- {name="name", param1=num, param2=num}
128 --
129 -- Position representation:
130 -- {x=num, y=num, z=num}
131 --
132
133 -- print("minetest dump: "..dump(minetest))
134
135 --
136 -- Tool definition
137 --
138
139 minetest.register_tool("WPick", {
140         image = "tool_woodpick.png",
141         basetime = 2.0,
142         dt_weight = 0,
143         dt_crackiness = -0.5,
144         dt_crumbliness = 2,
145         dt_cuttability = 0,
146         basedurability = 30,
147         dd_weight = 0,
148         dd_crackiness = 0,
149         dd_crumbliness = 0,
150         dd_cuttability = 0,
151 })
152 minetest.register_tool("STPick", {
153         image = "tool_stonepick.png",
154         basetime = 1.5,
155         dt_weight = 0,
156         dt_crackiness = -0.5,
157         dt_crumbliness = 2,
158         dt_cuttability = 0,
159         basedurability = 100,
160         dd_weight = 0,
161         dd_crackiness = 0,
162         dd_crumbliness = 0,
163         dd_cuttability = 0,
164 })
165 minetest.register_tool("SteelPick", {
166         image = "tool_steelpick.png",
167         basetime = 1.0,
168         dt_weight = 0,
169         dt_crackiness = -0.5,
170         dt_crumbliness = 2,
171         dt_cuttability = 0,
172         basedurability = 333,
173         dd_weight = 0,
174         dd_crackiness = 0,
175         dd_crumbliness = 0,
176         dd_cuttability = 0,
177 })
178 minetest.register_tool("MesePick", {
179         image = "tool_mesepick.png",
180         basetime = 0,
181         dt_weight = 0,
182         dt_crackiness = 0,
183         dt_crumbliness = 0,
184         dt_cuttability = 0,
185         basedurability = 1337,
186         dd_weight = 0,
187         dd_crackiness = 0,
188         dd_crumbliness = 0,
189         dd_cuttability = 0,
190 })
191 minetest.register_tool("WShovel", {
192         image = "tool_woodshovel.png",
193         basetime = 2.0,
194         dt_weight = 0.5,
195         dt_crackiness = 2,
196         dt_crumbliness = -1.5,
197         dt_cuttability = 0.3,
198         basedurability = 30,
199         dd_weight = 0,
200         dd_crackiness = 0,
201         dd_crumbliness = 0,
202         dd_cuttability = 0,
203 })
204 minetest.register_tool("STShovel", {
205         image = "tool_stoneshovel.png",
206         basetime = 1.5,
207         dt_weight = 0.5,
208         dt_crackiness = 2,
209         dt_crumbliness = -1.5,
210         dt_cuttability = 0.1,
211         basedurability = 100,
212         dd_weight = 0,
213         dd_crackiness = 0,
214         dd_crumbliness = 0,
215         dd_cuttability = 0,
216 })
217 minetest.register_tool("SteelShovel", {
218         image = "tool_steelshovel.png",
219         basetime = 1.0,
220         dt_weight = 0.5,
221         dt_crackiness = 2,
222         dt_crumbliness = -1.5,
223         dt_cuttability = 0.0,
224         basedurability = 330,
225         dd_weight = 0,
226         dd_crackiness = 0,
227         dd_crumbliness = 0,
228         dd_cuttability = 0,
229 })
230 minetest.register_tool("WAxe", {
231         image = "tool_woodaxe.png",
232         basetime = 2.0,
233         dt_weight = 0.5,
234         dt_crackiness = -0.2,
235         dt_crumbliness = 1,
236         dt_cuttability = -0.5,
237         basedurability = 30,
238         dd_weight = 0,
239         dd_crackiness = 0,
240         dd_crumbliness = 0,
241         dd_cuttability = 0,
242 })
243 minetest.register_tool("STAxe", {
244         image = "tool_stoneaxe.png",
245         basetime = 1.5,
246         dt_weight = 0.5,
247         dt_crackiness = -0.2,
248         dt_crumbliness = 1,
249         dt_cuttability = -0.5,
250         basedurability = 100,
251         dd_weight = 0,
252         dd_crackiness = 0,
253         dd_crumbliness = 0,
254         dd_cuttability = 0,
255 })
256 minetest.register_tool("SteelAxe", {
257         image = "tool_steelaxe.png",
258         basetime = 1.0,
259         dt_weight = 0.5,
260         dt_crackiness = -0.2,
261         dt_crumbliness = 1,
262         dt_cuttability = -0.5,
263         basedurability = 330,
264         dd_weight = 0,
265         dd_crackiness = 0,
266         dd_crumbliness = 0,
267         dd_cuttability = 0,
268 })
269 minetest.register_tool("WSword", {
270         image = "tool_woodsword.png",
271         basetime = 3.0,
272         dt_weight = 3,
273         dt_crackiness = 0,
274         dt_crumbliness = 1,
275         dt_cuttability = -1,
276         basedurability = 30,
277         dd_weight = 0,
278         dd_crackiness = 0,
279         dd_crumbliness = 0,
280         dd_cuttability = 0,
281 })
282 minetest.register_tool("STSword", {
283         image = "tool_stonesword.png",
284         basetime = 2.5,
285         dt_weight = 3,
286         dt_crackiness = 0,
287         dt_crumbliness = 1,
288         dt_cuttability = -1,
289         basedurability = 100,
290         dd_weight = 0,
291         dd_crackiness = 0,
292         dd_crumbliness = 0,
293         dd_cuttability = 0,
294 })
295 minetest.register_tool("SteelSword", {
296         image = "tool_steelsword.png",
297         basetime = 2.0,
298         dt_weight = 3,
299         dt_crackiness = 0,
300         dt_crumbliness = 1,
301         dt_cuttability = -1,
302         basedurability = 330,
303         dd_weight = 0,
304         dd_crackiness = 0,
305         dd_crumbliness = 0,
306         dd_cuttability = 0,
307 })
308 minetest.register_tool("", {
309         image = "",
310         basetime = 0.5,
311         dt_weight = 1,
312         dt_crackiness = 0,
313         dt_crumbliness = -1,
314         dt_cuttability = 0,
315         basedurability = 50,
316         dd_weight = 0,
317         dd_crackiness = 0,
318         dd_crumbliness = 0,
319         dd_cuttability = 0,
320 })
321
322 --[[
323 minetest.register_tool("horribletool", {
324         image = "lava.png",
325         basetime = 2.0
326         dt_weight = 0.2
327         dt_crackiness = 0.2
328         dt_crumbliness = 0.2
329         dt_cuttability = 0.2
330         basedurability = 50
331         dd_weight = -5
332         dd_crackiness = -5
333         dd_crumbliness = -5
334         dd_cuttability = -5
335 })
336 --]]
337
338 --
339 -- Crafting definition
340 --
341
342 minetest.register_craft({
343         output = 'NodeItem "wood" 4',
344         recipe = {
345                 {'NodeItem "tree"'},
346         }
347 })
348
349 minetest.register_craft({
350         output = 'CraftItem "Stick" 4',
351         recipe = {
352                 {'NodeItem "wood"'},
353         }
354 })
355
356 minetest.register_craft({
357         output = 'NodeItem "wooden_fence" 2',
358         recipe = {
359                 {'CraftItem "Stick"', 'CraftItem "Stick"', 'CraftItem "Stick"'},
360                 {'CraftItem "Stick"', 'CraftItem "Stick"', 'CraftItem "Stick"'},
361         }
362 })
363
364 minetest.register_craft({
365         output = 'NodeItem "sign_wall" 1',
366         recipe = {
367                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
368                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
369                 {'', 'CraftItem "Stick"', ''},
370         }
371 })
372
373 minetest.register_craft({
374         output = 'NodeItem "torch" 4',
375         recipe = {
376                 {'CraftItem "lump_of_coal"'},
377                 {'CraftItem "Stick"'},
378         }
379 })
380
381 minetest.register_craft({
382         output = 'ToolItem "WPick"',
383         recipe = {
384                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
385                 {'', 'CraftItem "Stick"', ''},
386                 {'', 'CraftItem "Stick"', ''},
387         }
388 })
389
390 minetest.register_craft({
391         output = 'ToolItem "STPick"',
392         recipe = {
393                 {'NodeItem "cobble"', 'NodeItem "cobble"', 'NodeItem "cobble"'},
394                 {'', 'CraftItem "Stick"', ''},
395                 {'', 'CraftItem "Stick"', ''},
396         }
397 })
398
399 minetest.register_craft({
400         output = 'ToolItem "SteelPick"',
401         recipe = {
402                 {'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"'},
403                 {'', 'CraftItem "Stick"', ''},
404                 {'', 'CraftItem "Stick"', ''},
405         }
406 })
407
408 minetest.register_craft({
409         output = 'ToolItem "MesePick"',
410         recipe = {
411                 {'NodeItem "mese"', 'NodeItem "mese"', 'NodeItem "mese"'},
412                 {'', 'CraftItem "Stick"', ''},
413                 {'', 'CraftItem "Stick"', ''},
414         }
415 })
416
417 minetest.register_craft({
418         output = 'ToolItem "WShovel"',
419         recipe = {
420                 {'NodeItem "wood"'},
421                 {'CraftItem "Stick"'},
422                 {'CraftItem "Stick"'},
423         }
424 })
425
426 minetest.register_craft({
427         output = 'ToolItem "STShovel"',
428         recipe = {
429                 {'NodeItem "cobble"'},
430                 {'CraftItem "Stick"'},
431                 {'CraftItem "Stick"'},
432         }
433 })
434
435 minetest.register_craft({
436         output = 'ToolItem "SteelShovel"',
437         recipe = {
438                 {'CraftItem "steel_ingot"'},
439                 {'CraftItem "Stick"'},
440                 {'CraftItem "Stick"'},
441         }
442 })
443
444 minetest.register_craft({
445         output = 'ToolItem "WAxe"',
446         recipe = {
447                 {'NodeItem "wood"', 'NodeItem "wood"'},
448                 {'NodeItem "wood"', 'CraftItem "Stick"'},
449                 {'', 'CraftItem "Stick"'},
450         }
451 })
452
453 minetest.register_craft({
454         output = 'ToolItem "STAxe"',
455         recipe = {
456                 {'NodeItem "cobble"', 'NodeItem "cobble"'},
457                 {'NodeItem "cobble"', 'CraftItem "Stick"'},
458                 {'', 'CraftItem "Stick"'},
459         }
460 })
461
462 minetest.register_craft({
463         output = 'ToolItem "SteelAxe"',
464         recipe = {
465                 {'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"'},
466                 {'CraftItem "steel_ingot"', 'CraftItem "Stick"'},
467                 {'', 'CraftItem "Stick"'},
468         }
469 })
470
471 minetest.register_craft({
472         output = 'ToolItem "WSword"',
473         recipe = {
474                 {'NodeItem "wood"'},
475                 {'NodeItem "wood"'},
476                 {'CraftItem "Stick"'},
477         }
478 })
479
480 minetest.register_craft({
481         output = 'ToolItem "STSword"',
482         recipe = {
483                 {'NodeItem "cobble"'},
484                 {'NodeItem "cobble"'},
485                 {'CraftItem "Stick"'},
486         }
487 })
488
489 minetest.register_craft({
490         output = 'ToolItem "SteelSword"',
491         recipe = {
492                 {'CraftItem "steel_ingot"'},
493                 {'CraftItem "steel_ingot"'},
494                 {'CraftItem "Stick"'},
495         }
496 })
497
498 minetest.register_craft({
499         output = 'NodeItem "rail" 15',
500         recipe = {
501                 {'CraftItem "steel_ingot"', '', 'CraftItem "steel_ingot"'},
502                 {'CraftItem "steel_ingot"', 'CraftItem "Stick"', 'CraftItem "steel_ingot"'},
503                 {'CraftItem "steel_ingot"', '', 'CraftItem "steel_ingot"'},
504         }
505 })
506
507 minetest.register_craft({
508         output = 'NodeItem "chest" 1',
509         recipe = {
510                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
511                 {'NodeItem "wood"', '', 'NodeItem "wood"'},
512                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
513         }
514 })
515
516 minetest.register_craft({
517         output = 'NodeItem "locked_chest" 1',
518         recipe = {
519                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
520                 {'NodeItem "wood"', 'CraftItem "steel_ingot"', 'NodeItem "wood"'},
521                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
522         }
523 })
524
525 minetest.register_craft({
526         output = 'NodeItem "furnace" 1',
527         recipe = {
528                 {'NodeItem "cobble"', 'NodeItem "cobble"', 'NodeItem "cobble"'},
529                 {'NodeItem "cobble"', '', 'NodeItem "cobble"'},
530                 {'NodeItem "cobble"', 'NodeItem "cobble"', 'NodeItem "cobble"'},
531         }
532 })
533
534 minetest.register_craft({
535         output = 'NodeItem "steelblock" 1',
536         recipe = {
537                 {'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"'},
538                 {'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"'},
539                 {'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"'},
540         }
541 })
542
543 minetest.register_craft({
544         output = 'NodeItem "sandstone" 1',
545         recipe = {
546                 {'NodeItem "sand"', 'NodeItem "sand"'},
547                 {'NodeItem "sand"', 'NodeItem "sand"'},
548         }
549 })
550
551 minetest.register_craft({
552         output = 'NodeItem "clay" 1',
553         recipe = {
554                 {'CraftItem "lump_of_clay"', 'CraftItem "lump_of_clay"'},
555                 {'CraftItem "lump_of_clay"', 'CraftItem "lump_of_clay"'},
556         }
557 })
558
559 minetest.register_craft({
560         output = 'NodeItem "brick" 1',
561         recipe = {
562                 {'CraftItem "clay_brick"', 'CraftItem "clay_brick"'},
563                 {'CraftItem "clay_brick"', 'CraftItem "clay_brick"'},
564         }
565 })
566
567 minetest.register_craft({
568         output = 'CraftItem "paper" 1',
569         recipe = {
570                 {'NodeItem "papyrus"', 'NodeItem "papyrus"', 'NodeItem "papyrus"'},
571         }
572 })
573
574 minetest.register_craft({
575         output = 'CraftItem "book" 1',
576         recipe = {
577                 {'CraftItem "paper"'},
578                 {'CraftItem "paper"'},
579                 {'CraftItem "paper"'},
580         }
581 })
582
583 minetest.register_craft({
584         output = 'NodeItem "bookshelf" 1',
585         recipe = {
586                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
587                 {'CraftItem "book"', 'CraftItem "book"', 'CraftItem "book"'},
588                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
589         }
590 })
591
592 minetest.register_craft({
593         output = 'NodeItem "ladder" 1',
594         recipe = {
595                 {'CraftItem "Stick"', '', 'CraftItem "Stick"'},
596                 {'CraftItem "Stick"', 'CraftItem "Stick"', 'CraftItem "Stick"'},
597                 {'CraftItem "Stick"', '', 'CraftItem "Stick"'},
598         }
599 })
600
601 minetest.register_craft({
602         output = 'CraftItem "apple_iron" 1',
603         recipe = {
604                 {'', 'CraftItem "steel_ingot"', ''},
605                 {'CraftItem "steel_ingot"', 'CraftItem "apple"', 'CraftItem "steel_ingot"'},
606                 {'', 'CraftItem "steel_ingot"', ''},
607         }
608 })
609
610 minetest.register_craft({
611         output = 'NodeItem "TNT" 4',
612         recipe = {
613                 {'NodeItem "wood" 1'},
614                 {'CraftItem "lump_of_coal" 1'},
615                 {'NodeItem "wood" 1'}
616         }
617 })
618
619 minetest.register_craft({
620         output = 'NodeItem "somenode" 4',
621         recipe = {
622                 {'CraftItem "Stick" 1'},
623         }
624 })
625
626 --
627 -- Node definitions
628 --
629
630 function digprop_constanttime(time)
631         return {
632                 diggability = "constant",
633                 constant_time = time,
634         }
635 end
636
637 function digprop_stonelike(toughness)
638         return {
639                 diggablity = "normal",
640                 weight = toughness * 5,
641                 crackiness = 1,
642                 crumbliness = -0.1,
643                 cuttability = -0.2,
644         }
645 end
646
647 function digprop_dirtlike(toughness)
648         return {
649                 diggablity = "normal",
650                 weight = toughness * 1.2,
651                 crackiness = 0,
652                 crumbliness = 1.2,
653                 cuttability = -0.4,
654         }
655 end
656
657 function digprop_gravellike(toughness)
658         return {
659                 diggablity = "normal",
660                 weight = toughness * 2,
661                 crackiness = 0.2,
662                 crumbliness = 1.5,
663                 cuttability = -1.0,
664         }
665 end
666
667 function digprop_woodlike(toughness)
668         return {
669                 diggablity = "normal",
670                 weight = toughness * 1.0,
671                 crackiness = 0.75,
672                 crumbliness = -1.0,
673                 cuttability = 1.5,
674         }
675 end
676
677 function digprop_leaveslike(toughness)
678         return {
679                 diggablity = "normal",
680                 weight = toughness * (-0.5),
681                 crackiness = 0,
682                 crumbliness = 0,
683                 cuttability = 2.0,
684         }
685 end
686
687 function digprop_glasslike(toughness)
688         return {
689                 diggablity = "normal",
690                 weight = toughness * 0.1,
691                 crackiness = 2.0,
692                 crumbliness = -1.0,
693                 cuttability = -1.0,
694         }
695 end
696
697 function inventorycube(img1, img2, img3)
698         img2 = img2 or img1
699         img3 = img3 or img1
700         return "[inventorycube"
701                         .. "{" .. img1:gsub("^", "&")
702                         .. "{" .. img2:gsub("^", "&")
703                         .. "{" .. img3:gsub("^", "&")
704 end
705
706 -- Legacy nodes
707
708 minetest.register_node("stone", {
709         tile_images = {"stone.png"},
710         inventory_image = inventorycube("stone.png"),
711         paramtype = "mineral",
712         is_ground_content = true,
713         often_contains_mineral = true, -- Texture atlas hint
714         material = digprop_stonelike(1.0),
715 })
716
717 minetest.register_node("dirt_with_grass", {
718         tile_images = {"grass.png", "mud.png", "mud.png^grass_side.png"},
719         inventory_image = inventorycube("mud.png^grass_side.png"),
720         is_ground_content = true,
721         material = digprop_dirtlike(1.0),
722 })
723
724 minetest.register_node("dirt_with_grass_footsteps", {
725         tile_images = {"grass_footsteps.png", "mud.png", "mud.png^grass_side.png"},
726         inventory_image = "grass_footsteps.png",
727         is_ground_content = true,
728         material = digprop_dirtlike(1.0),
729 })
730
731 minetest.register_node("dirt", {
732         tile_images = {"mud.png"},
733         inventory_image = inventorycube("mud.png"),
734         is_ground_content = true,
735         material = digprop_dirtlike(1.0),
736 })
737
738 -- New nodes
739
740 minetest.register_node("somenode", {
741         tile_images = {"lava.png", "mese.png", "stone.png", "grass.png", "cobble.png", "tree_top.png"},
742         inventory_image = "treeprop.png",
743         material = {
744                 diggability = "normal",
745                 weight = 0,
746                 crackiness = 0,
747                 crumbliness = 0,
748                 cuttability = 0,
749                 flammability = 0
750         },
751         metadata_name = "chest",
752 })
753
754 minetest.register_node("TNT", {
755         tile_images = {"tnt_top.png", "tnt_bottom.png", "tnt_side.png", "tnt_side.png", "tnt_side.png", "tnt_side.png"},
756         inventory_image = "tnt_side.png",
757         dug_item = '', -- Get nothing
758         material = {
759                 diggability = "not",
760         },
761 })
762
763 --
764 -- Some common functions
765 --
766
767 function nodeupdate_single(p)
768         n = minetest.env:get_node(p)
769         if n.name == "sand" or n.name == "gravel" then
770                 p_bottom = {x=p.x, y=p.y-1, z=p.z}
771                 n_bottom = minetest.env:get_node(p_bottom)
772                 if n_bottom.name == "air" then
773                         minetest.env:remove_node(p)
774                         minetest.env:add_luaentity(p, "falling_"..n.name)
775                         nodeupdate(p)
776                 end
777         end
778 end
779
780 function nodeupdate(p)
781         for x = -1,1 do
782         for y = -1,1 do
783         for z = -1,1 do
784                 p2 = {x=p.x+x, y=p.y+y, z=p.z+z}
785                 nodeupdate_single(p2)
786         end
787         end
788         end
789 end
790
791 --
792 -- TNT (not functional)
793 --
794
795 local TNT = {
796         -- Static definition
797         physical = true, -- Collides with things
798         -- weight = 5,
799         collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
800         visual = "cube",
801         textures = {"tnt_top.png","tnt_bottom.png","tnt_side.png","tnt_side.png","tnt_side.png","tnt_side.png"},
802         --visual = "single_sprite",
803         --textures = {"mese.png^[forcesingle"},
804         -- Initial value for our timer
805         timer = 0,
806         -- Number of punches required to defuse
807         health = 1,
808 }
809
810 -- Called when a TNT object is created
811 function TNT:on_activate(staticdata)
812         print("TNT:on_activate()")
813         self.object:setvelocity({x=0, y=2, z=0})
814         self.object:setacceleration({x=0, y=-10, z=0})
815 end
816
817 -- Called periodically
818 function TNT:on_step(dtime)
819         --print("TNT:on_step()")
820 end
821
822 -- Called when object is punched
823 function TNT:on_punch(hitter)
824         print("TNT:on_punch()")
825         self.health = self.health - 1
826         if self.health <= 0 then
827                 self.object:remove()
828                 hitter:add_to_inventory("NodeItem TNT 1")
829         end
830 end
831
832 -- Called when object is right-clicked
833 function TNT:on_rightclick(clicker)
834         --pos = self.object:getpos()
835         --pos = {x=pos.x, y=pos.y+0.1, z=pos.z}
836         --self.object:moveto(pos, false)
837 end
838
839 print("TNT dump: "..dump(TNT))
840
841 print("Registering TNT");
842 minetest.register_entity("TNT", TNT)
843
844 --
845 -- Falling stuff
846 --
847
848 function register_falling_node(nodename, texture)
849         minetest.register_entity("falling_"..nodename, {
850                 -- Static definition
851                 physical = true,
852                 collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
853                 visual = "cube",
854                 textures = {texture,texture,texture,texture,texture,texture},
855                 -- State
856                 -- Methods
857                 on_step = function(self, dtime)
858                         -- Set gravity
859                         self.object:setacceleration({x=0, y=-10, z=0})
860                         -- Turn to actual sand when collides to ground or just move
861                         local pos = self.object:getpos()
862                         local bcp = {x=pos.x, y=pos.y-0.7, z=pos.z} -- Position of bottom center point
863                         local bcn = minetest.env:get_node(bcp)
864                         if bcn.name ~= "air" then
865                                 -- Turn to a sand node
866                                 local np = {x=bcp.x, y=bcp.y+1, z=bcp.z}
867                                 minetest.env:add_node(np, {name=nodename})
868                                 self.object:remove()
869                         else
870                                 -- Do nothing
871                         end
872                 end
873         })
874 end
875
876 register_falling_node("sand", "sand.png")
877 register_falling_node("gravel", "gravel.png")
878
879 --[[
880 minetest.register_entity("falling_sand", {
881         -- Definition
882         collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
883         visual = "cube",
884         textures = {"sand.png","sand.png","sand.png","sand.png","sand.png","sand.png"},
885         -- State
886         fallspeed = 0,
887         -- Methods
888         on_step = function(self, dtime)
889                 -- Apply gravity
890                 self.fallspeed = self.fallspeed + dtime * 5
891                 fp = self.object:getpos()
892                 fp.y = fp.y - self.fallspeed * dtime
893                 self.object:moveto(fp)
894                 -- Turn to actual sand when collides to ground or just move
895                 bcp = {x=fp.x, y=fp.y-0.5, z=fp.z} -- Position of bottom center point
896                 bcn = minetest.env:get_node(bcp)
897                 if bcn.name ~= "air" then
898                         -- Turn to a sand node
899                         np = {x=bcp.x, y=bcp.y+1, z=bcp.z}
900                         minetest.env:add_node(np, {name="sand"})
901                         self.object:remove()
902                 else
903                         -- Do nothing
904                 end
905         end
906 })
907 --]]
908
909 --
910 -- Global callbacks
911 --
912
913 -- Global environment step function
914 function on_step(dtime)
915         -- print("on_step")
916 end
917 minetest.register_globalstep(on_step)
918
919 function on_placenode(p, node)
920         print("on_placenode")
921         nodeupdate(p)
922 end
923 minetest.register_on_placenode(on_placenode)
924
925 function on_dignode(p, node)
926         print("on_dignode")
927         nodeupdate(p)
928 end
929 minetest.register_on_dignode(on_dignode)
930
931 function on_punchnode(p, node)
932         print("on_punchnode")
933         if node.name == "TNT" then
934                 minetest.env:remove_node(p)
935                 minetest.env:add_luaentity(p, "TNT")
936                 nodeupdate(p)
937         end
938 end
939 minetest.register_on_punchnode(on_punchnode)
940
941 --
942 -- Done, print some random stuff
943 --
944
945 print("minetest.registered_entities:")
946 dump2(minetest.registered_entities)
947
948 --
949 -- Some random pre-implementation planning and drafting
950 --
951
952 --[[
953 function TNT:on_rightclick(clicker)
954         print("TNT:on_rightclick()")
955         print("self: "..dump(self))
956         print("getmetatable(self): "..dump(getmetatable(self)))
957         print("getmetatable(getmetatable(self)): "..dump(getmetatable(getmetatable(self))))
958         pos = self.object:getpos()
959         print("TNT:on_rightclick(): object position: "..dump(pos))
960         pos = {x=pos.x+0.5+1, y=pos.y+0.5, z=pos.z+0.5}
961         --minetest.env:add_node(pos, {name="stone")
962 end
963 --]]
964
965 --[=[
966
967 register_block(0, {
968         textures = "stone.png",
969         makefacetype = 0,
970         get_dig_duration = function(env, pos, digger)
971                 -- Check stuff like digger.current_tool
972                 return 1.5
973         end,
974         on_dig = function(env, pos, digger)
975                 env:remove_node(pos)
976                 digger.inventory.put("MaterialItem2 0");
977         end,
978 })
979
980 register_block(1, {
981         textures = {"grass.png","mud.png","mud_grass_side.png","mud_grass_side.png","mud_grass_side.png","mud_grass_side.png"},
982         makefacetype = 0,
983         get_dig_duration = function(env, pos, digger)
984                 -- Check stuff like digger.current_tool
985                 return 0.5
986         end,
987         on_dig = function(env, pos, digger)
988                 env:remove_node(pos)
989                 digger.inventory.put("MaterialItem2 1");
990         end,
991 })
992
993 -- Consider the "miscellaneous block namespace" to be 0xc00...0xfff = 3072...4095
994 register_block(3072, {
995         textures = {"tnt_top.png","tnt_bottom.png","tnt_side.png","tnt_side.png","tnt_side.png","tnt_side.png"},
996         makefacetype = 0,
997         get_dig_duration = function(env, pos, digger)
998                 -- Cannot be dug
999                 return nil
1000         end,
1001         -- on_dig = function(env, pos, digger) end, -- Not implemented
1002         on_hit = function(env, pos, hitter)
1003                 -- Replace with TNT object, which will explode after timer, follow gravity, blink and stuff
1004                 env:add_object("tnt", pos)
1005                 env:remove_node(pos)
1006         end,
1007 })
1008 --]=]
1009