]> git.lizzy.rs Git - dragonfireclient.git/blob - data/mods/default/init.lua
Relatively snappy object-ground collision detection
[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)
86 -- minetest.register_on_dignode(func)
87 --
88 -- Global objects:
89 -- minetest.env - environment reference
90 --
91 -- Global tables:
92 -- minetest.registered_entities
93 -- ^ List of registered entity prototypes, indexed by name
94 -- minetest.object_refs
95 -- ^ List of object references, indexed by active object id
96 -- minetest.luaentities
97 -- ^ List of lua entities, indexed by active object id
98 --
99 -- EnvRef is basically ServerEnvironment and ServerMap combined.
100 -- EnvRef methods:
101 -- - add_node(pos, node)
102 -- - remove_node(pos)
103 -- - get_node(pos)
104 -- - add_luaentity(pos, name)
105 --
106 -- ObjectRef is basically ServerActiveObject.
107 -- ObjectRef methods:
108 -- - remove(): remove object (after returning from Lua)
109 -- - getpos(): returns {x=num, y=num, z=num}
110 -- - setpos(pos); pos={x=num, y=num, z=num}
111 -- - moveto(pos, continuous=false): interpolated move
112 -- - add_to_inventory(itemstring): add an item to object inventory
113 --
114 -- Registered entities:
115 -- - Functions receive a "luaentity" as self:
116 --   - It has the member .object, which is an ObjectRef pointing to the object
117 --   - The original prototype stuff is visible directly via a metatable
118 -- - Callbacks:
119 --   - on_activate(self, staticdata)
120 --   - on_step(self, dtime)
121 --   - on_punch(self, hitter)
122 --   - on_rightclick(self, clicker)
123 --   - get_staticdata(self): return string
124 --
125 -- MapNode representation:
126 -- {name="name", param1=num, param2=num}
127 --
128 -- Position representation:
129 -- {x=num, y=num, z=num}
130 --
131
132 -- print("minetest dump: "..dump(minetest))
133
134 minetest.register_tool("WPick", {
135         image = "tool_woodpick.png",
136         basetime = 2.0,
137         dt_weight = 0,
138         dt_crackiness = -0.5,
139         dt_crumbliness = 2,
140         dt_cuttability = 0,
141         basedurability = 30,
142         dd_weight = 0,
143         dd_crackiness = 0,
144         dd_crumbliness = 0,
145         dd_cuttability = 0,
146 })
147 minetest.register_tool("STPick", {
148         image = "tool_stonepick.png",
149         basetime = 1.5,
150         dt_weight = 0,
151         dt_crackiness = -0.5,
152         dt_crumbliness = 2,
153         dt_cuttability = 0,
154         basedurability = 100,
155         dd_weight = 0,
156         dd_crackiness = 0,
157         dd_crumbliness = 0,
158         dd_cuttability = 0,
159 })
160 minetest.register_tool("SteelPick", {
161         image = "tool_steelpick.png",
162         basetime = 1.0,
163         dt_weight = 0,
164         dt_crackiness = -0.5,
165         dt_crumbliness = 2,
166         dt_cuttability = 0,
167         basedurability = 333,
168         dd_weight = 0,
169         dd_crackiness = 0,
170         dd_crumbliness = 0,
171         dd_cuttability = 0,
172 })
173 minetest.register_tool("MesePick", {
174         image = "tool_mesepick.png",
175         basetime = 0,
176         dt_weight = 0,
177         dt_crackiness = 0,
178         dt_crumbliness = 0,
179         dt_cuttability = 0,
180         basedurability = 1337,
181         dd_weight = 0,
182         dd_crackiness = 0,
183         dd_crumbliness = 0,
184         dd_cuttability = 0,
185 })
186 minetest.register_tool("WShovel", {
187         image = "tool_woodshovel.png",
188         basetime = 2.0,
189         dt_weight = 0.5,
190         dt_crackiness = 2,
191         dt_crumbliness = -1.5,
192         dt_cuttability = 0.3,
193         basedurability = 30,
194         dd_weight = 0,
195         dd_crackiness = 0,
196         dd_crumbliness = 0,
197         dd_cuttability = 0,
198 })
199 minetest.register_tool("STShovel", {
200         image = "tool_stoneshovel.png",
201         basetime = 1.5,
202         dt_weight = 0.5,
203         dt_crackiness = 2,
204         dt_crumbliness = -1.5,
205         dt_cuttability = 0.1,
206         basedurability = 100,
207         dd_weight = 0,
208         dd_crackiness = 0,
209         dd_crumbliness = 0,
210         dd_cuttability = 0,
211 })
212 minetest.register_tool("SteelShovel", {
213         image = "tool_steelshovel.png",
214         basetime = 1.0,
215         dt_weight = 0.5,
216         dt_crackiness = 2,
217         dt_crumbliness = -1.5,
218         dt_cuttability = 0.0,
219         basedurability = 330,
220         dd_weight = 0,
221         dd_crackiness = 0,
222         dd_crumbliness = 0,
223         dd_cuttability = 0,
224 })
225 minetest.register_tool("WAxe", {
226         image = "tool_woodaxe.png",
227         basetime = 2.0,
228         dt_weight = 0.5,
229         dt_crackiness = -0.2,
230         dt_crumbliness = 1,
231         dt_cuttability = -0.5,
232         basedurability = 30,
233         dd_weight = 0,
234         dd_crackiness = 0,
235         dd_crumbliness = 0,
236         dd_cuttability = 0,
237 })
238 minetest.register_tool("STAxe", {
239         image = "tool_stoneaxe.png",
240         basetime = 1.5,
241         dt_weight = 0.5,
242         dt_crackiness = -0.2,
243         dt_crumbliness = 1,
244         dt_cuttability = -0.5,
245         basedurability = 100,
246         dd_weight = 0,
247         dd_crackiness = 0,
248         dd_crumbliness = 0,
249         dd_cuttability = 0,
250 })
251 minetest.register_tool("SteelAxe", {
252         image = "tool_steelaxe.png",
253         basetime = 1.0,
254         dt_weight = 0.5,
255         dt_crackiness = -0.2,
256         dt_crumbliness = 1,
257         dt_cuttability = -0.5,
258         basedurability = 330,
259         dd_weight = 0,
260         dd_crackiness = 0,
261         dd_crumbliness = 0,
262         dd_cuttability = 0,
263 })
264 minetest.register_tool("WSword", {
265         image = "tool_woodsword.png",
266         basetime = 3.0,
267         dt_weight = 3,
268         dt_crackiness = 0,
269         dt_crumbliness = 1,
270         dt_cuttability = -1,
271         basedurability = 30,
272         dd_weight = 0,
273         dd_crackiness = 0,
274         dd_crumbliness = 0,
275         dd_cuttability = 0,
276 })
277 minetest.register_tool("STSword", {
278         image = "tool_stonesword.png",
279         basetime = 2.5,
280         dt_weight = 3,
281         dt_crackiness = 0,
282         dt_crumbliness = 1,
283         dt_cuttability = -1,
284         basedurability = 100,
285         dd_weight = 0,
286         dd_crackiness = 0,
287         dd_crumbliness = 0,
288         dd_cuttability = 0,
289 })
290 minetest.register_tool("SteelSword", {
291         image = "tool_steelsword.png",
292         basetime = 2.0,
293         dt_weight = 3,
294         dt_crackiness = 0,
295         dt_crumbliness = 1,
296         dt_cuttability = -1,
297         basedurability = 330,
298         dd_weight = 0,
299         dd_crackiness = 0,
300         dd_crumbliness = 0,
301         dd_cuttability = 0,
302 })
303 minetest.register_tool("", {
304         image = "",
305         basetime = 0.5,
306         dt_weight = 1,
307         dt_crackiness = 0,
308         dt_crumbliness = -1,
309         dt_cuttability = 0,
310         basedurability = 50,
311         dd_weight = 0,
312         dd_crackiness = 0,
313         dd_crumbliness = 0,
314         dd_cuttability = 0,
315 })
316
317 --[[
318 minetest.register_tool("horribletool", {
319         image = "lava.png",
320         basetime = 2.0
321         dt_weight = 0.2
322         dt_crackiness = 0.2
323         dt_crumbliness = 0.2
324         dt_cuttability = 0.2
325         basedurability = 50
326         dd_weight = -5
327         dd_crackiness = -5
328         dd_crumbliness = -5
329         dd_cuttability = -5
330 })
331 --]]
332
333 minetest.register_node("somenode", {
334         tile_images = {"lava.png", "mese.png", "stone.png", "grass.png", "cobble.png", "tree_top.png"},
335         inventory_image = "treeprop.png"
336 })
337
338 minetest.register_node("TNT", {
339         tile_images = {"tnt_top.png", "tnt_bottom.png", "tnt_side.png", "tnt_side.png", "tnt_side.png", "tnt_side.png"},
340         inventory_image = "tnt_side.png"
341 })
342
343 minetest.register_craft({
344         output = 'NodeItem "wood" 4',
345         recipe = {
346                 {'NodeItem "tree"'},
347         }
348 })
349
350 minetest.register_craft({
351         output = 'CraftItem "Stick" 4',
352         recipe = {
353                 {'NodeItem "wood"'},
354         }
355 })
356
357 minetest.register_craft({
358         output = 'NodeItem "wooden_fence" 2',
359         recipe = {
360                 {'CraftItem "Stick"', 'CraftItem "Stick"', 'CraftItem "Stick"'},
361                 {'CraftItem "Stick"', 'CraftItem "Stick"', 'CraftItem "Stick"'},
362         }
363 })
364
365 minetest.register_craft({
366         output = 'NodeItem "sign_wall" 1',
367         recipe = {
368                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
369                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
370                 {'', 'CraftItem "Stick"', ''},
371         }
372 })
373
374 minetest.register_craft({
375         output = 'NodeItem "torch" 4',
376         recipe = {
377                 {'CraftItem "lump_of_coal"'},
378                 {'CraftItem "Stick"'},
379         }
380 })
381
382 minetest.register_craft({
383         output = 'ToolItem "WPick"',
384         recipe = {
385                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
386                 {'', 'CraftItem "Stick"', ''},
387                 {'', 'CraftItem "Stick"', ''},
388         }
389 })
390
391 minetest.register_craft({
392         output = 'ToolItem "STPick"',
393         recipe = {
394                 {'NodeItem "cobble"', 'NodeItem "cobble"', 'NodeItem "cobble"'},
395                 {'', 'CraftItem "Stick"', ''},
396                 {'', 'CraftItem "Stick"', ''},
397         }
398 })
399
400 minetest.register_craft({
401         output = 'ToolItem "SteelPick"',
402         recipe = {
403                 {'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"'},
404                 {'', 'CraftItem "Stick"', ''},
405                 {'', 'CraftItem "Stick"', ''},
406         }
407 })
408
409 minetest.register_craft({
410         output = 'ToolItem "MesePick"',
411         recipe = {
412                 {'NodeItem "mese"', 'NodeItem "mese"', 'NodeItem "mese"'},
413                 {'', 'CraftItem "Stick"', ''},
414                 {'', 'CraftItem "Stick"', ''},
415         }
416 })
417
418 minetest.register_craft({
419         output = 'ToolItem "WShovel"',
420         recipe = {
421                 {'NodeItem "wood"'},
422                 {'CraftItem "Stick"'},
423                 {'CraftItem "Stick"'},
424         }
425 })
426
427 minetest.register_craft({
428         output = 'ToolItem "STShovel"',
429         recipe = {
430                 {'NodeItem "cobble"'},
431                 {'CraftItem "Stick"'},
432                 {'CraftItem "Stick"'},
433         }
434 })
435
436 minetest.register_craft({
437         output = 'ToolItem "SteelShovel"',
438         recipe = {
439                 {'CraftItem "steel_ingot"'},
440                 {'CraftItem "Stick"'},
441                 {'CraftItem "Stick"'},
442         }
443 })
444
445 minetest.register_craft({
446         output = 'ToolItem "WAxe"',
447         recipe = {
448                 {'NodeItem "wood"', 'NodeItem "wood"'},
449                 {'NodeItem "wood"', 'CraftItem "Stick"'},
450                 {'', 'CraftItem "Stick"'},
451         }
452 })
453
454 minetest.register_craft({
455         output = 'ToolItem "STAxe"',
456         recipe = {
457                 {'NodeItem "cobble"', 'NodeItem "cobble"'},
458                 {'NodeItem "cobble"', 'CraftItem "Stick"'},
459                 {'', 'CraftItem "Stick"'},
460         }
461 })
462
463 minetest.register_craft({
464         output = 'ToolItem "SteelAxe"',
465         recipe = {
466                 {'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"'},
467                 {'CraftItem "steel_ingot"', 'CraftItem "Stick"'},
468                 {'', 'CraftItem "Stick"'},
469         }
470 })
471
472 minetest.register_craft({
473         output = 'ToolItem "WSword"',
474         recipe = {
475                 {'NodeItem "wood"'},
476                 {'NodeItem "wood"'},
477                 {'CraftItem "Stick"'},
478         }
479 })
480
481 minetest.register_craft({
482         output = 'ToolItem "STSword"',
483         recipe = {
484                 {'NodeItem "cobble"'},
485                 {'NodeItem "cobble"'},
486                 {'CraftItem "Stick"'},
487         }
488 })
489
490 minetest.register_craft({
491         output = 'ToolItem "SteelSword"',
492         recipe = {
493                 {'CraftItem "steel_ingot"'},
494                 {'CraftItem "steel_ingot"'},
495                 {'CraftItem "Stick"'},
496         }
497 })
498
499 minetest.register_craft({
500         output = 'NodeItem "rail" 15',
501         recipe = {
502                 {'CraftItem "steel_ingot"', '', 'CraftItem "steel_ingot"'},
503                 {'CraftItem "steel_ingot"', 'CraftItem "Stick"', 'CraftItem "steel_ingot"'},
504                 {'CraftItem "steel_ingot"', '', 'CraftItem "steel_ingot"'},
505         }
506 })
507
508 minetest.register_craft({
509         output = 'NodeItem "chest" 1',
510         recipe = {
511                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
512                 {'NodeItem "wood"', '', 'NodeItem "wood"'},
513                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
514         }
515 })
516
517 minetest.register_craft({
518         output = 'NodeItem "locked_chest" 1',
519         recipe = {
520                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
521                 {'NodeItem "wood"', 'CraftItem "steel_ingot"', 'NodeItem "wood"'},
522                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
523         }
524 })
525
526 minetest.register_craft({
527         output = 'NodeItem "furnace" 1',
528         recipe = {
529                 {'NodeItem "cobble"', 'NodeItem "cobble"', 'NodeItem "cobble"'},
530                 {'NodeItem "cobble"', '', 'NodeItem "cobble"'},
531                 {'NodeItem "cobble"', 'NodeItem "cobble"', 'NodeItem "cobble"'},
532         }
533 })
534
535 minetest.register_craft({
536         output = 'NodeItem "steelblock" 1',
537         recipe = {
538                 {'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"'},
539                 {'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"'},
540                 {'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"', 'CraftItem "steel_ingot"'},
541         }
542 })
543
544 minetest.register_craft({
545         output = 'NodeItem "sandstone" 1',
546         recipe = {
547                 {'NodeItem "sand"', 'NodeItem "sand"'},
548                 {'NodeItem "sand"', 'NodeItem "sand"'},
549         }
550 })
551
552 minetest.register_craft({
553         output = 'NodeItem "clay" 1',
554         recipe = {
555                 {'CraftItem "lump_of_clay"', 'CraftItem "lump_of_clay"'},
556                 {'CraftItem "lump_of_clay"', 'CraftItem "lump_of_clay"'},
557         }
558 })
559
560 minetest.register_craft({
561         output = 'NodeItem "brick" 1',
562         recipe = {
563                 {'CraftItem "clay_brick"', 'CraftItem "clay_brick"'},
564                 {'CraftItem "clay_brick"', 'CraftItem "clay_brick"'},
565         }
566 })
567
568 minetest.register_craft({
569         output = 'CraftItem "paper" 1',
570         recipe = {
571                 {'NodeItem "papyrus"', 'NodeItem "papyrus"', 'NodeItem "papyrus"'},
572         }
573 })
574
575 minetest.register_craft({
576         output = 'CraftItem "book" 1',
577         recipe = {
578                 {'CraftItem "paper"'},
579                 {'CraftItem "paper"'},
580                 {'CraftItem "paper"'},
581         }
582 })
583
584 minetest.register_craft({
585         output = 'NodeItem "bookshelf" 1',
586         recipe = {
587                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
588                 {'CraftItem "book"', 'CraftItem "book"', 'CraftItem "book"'},
589                 {'NodeItem "wood"', 'NodeItem "wood"', 'NodeItem "wood"'},
590         }
591 })
592
593 minetest.register_craft({
594         output = 'NodeItem "ladder" 1',
595         recipe = {
596                 {'CraftItem "Stick"', '', 'CraftItem "Stick"'},
597                 {'CraftItem "Stick"', 'CraftItem "Stick"', 'CraftItem "Stick"'},
598                 {'CraftItem "Stick"', '', 'CraftItem "Stick"'},
599         }
600 })
601
602 minetest.register_craft({
603         output = 'CraftItem "apple_iron" 1',
604         recipe = {
605                 {'', 'CraftItem "steel_ingot"', ''},
606                 {'CraftItem "steel_ingot"', 'CraftItem "apple"', 'CraftItem "steel_ingot"'},
607                 {'', 'CraftItem "steel_ingot"', ''},
608         }
609 })
610
611 minetest.register_craft({
612         output = 'NodeItem "TNT" 4',
613         recipe = {
614                 {'NodeItem "wood" 1'},
615                 {'CraftItem "lump_of_coal" 1'},
616                 {'NodeItem "wood" 1'}
617         }
618 })
619
620 --
621 -- Some common functions
622 --
623
624 function nodeupdate_single(p)
625         n = minetest.env:get_node(p)
626         if n.name == "sand" or n.name == "gravel" then
627                 p_bottom = {x=p.x, y=p.y-1, z=p.z}
628                 n_bottom = minetest.env:get_node(p_bottom)
629                 if n_bottom.name == "air" then
630                         minetest.env:remove_node(p)
631                         minetest.env:add_luaentity(p, "falling_"..n.name)
632                         nodeupdate(p)
633                 end
634         end
635 end
636
637 function nodeupdate(p)
638         for x = -1,1 do
639         for y = -1,1 do
640         for z = -1,1 do
641                 p2 = {x=p.x+x, y=p.y+y, z=p.z+z}
642                 nodeupdate_single(p2)
643         end
644         end
645         end
646 end
647
648 --
649 -- TNT (not functional)
650 --
651
652 local TNT = {
653         -- Static definition
654         physical = true, -- Collides with things
655         -- weight = 5,
656         collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
657         visual = "cube",
658         textures = {"tnt_top.png","tnt_bottom.png","tnt_side.png","tnt_side.png","tnt_side.png","tnt_side.png"},
659         --visual = "single_sprite",
660         --textures = {"mese.png^[forcesingle"},
661         -- Initial value for our timer
662         timer = 0,
663         -- Number of punches required to defuse
664         health = 1,
665 }
666
667 -- Called when a TNT object is created
668 function TNT:on_activate(staticdata)
669         print("TNT:on_activate()")
670         self.object:setvelocity({x=0, y=2, z=0})
671         self.object:setacceleration({x=0, y=-10, z=0})
672 end
673
674 -- Called periodically
675 function TNT:on_step(dtime)
676         --print("TNT:on_step()")
677 end
678
679 -- Called when object is punched
680 function TNT:on_punch(hitter)
681         print("TNT:on_punch()")
682         self.health = self.health - 1
683         if self.health <= 0 then
684                 self.object:remove()
685                 hitter:add_to_inventory("NodeItem TNT 1")
686         end
687 end
688
689 -- Called when object is right-clicked
690 function TNT:on_rightclick(clicker)
691         --pos = self.object:getpos()
692         --pos = {x=pos.x, y=pos.y+0.1, z=pos.z}
693         --self.object:moveto(pos, false)
694 end
695
696 print("TNT dump: "..dump(TNT))
697
698 print("Registering TNT");
699 minetest.register_entity("TNT", TNT)
700
701 --
702 -- Falling stuff
703 --
704
705 function register_falling_node(nodename, texture)
706         minetest.register_entity("falling_"..nodename, {
707                 -- Static definition
708                 physical = true,
709                 collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
710                 visual = "cube",
711                 textures = {texture,texture,texture,texture,texture,texture},
712                 -- State
713                 -- Methods
714                 on_step = function(self, dtime)
715                         -- Set gravity
716                         self.object:setacceleration({x=0, y=-10, z=0})
717                         -- Turn to actual sand when collides to ground or just move
718                         pos = self.object:getpos()
719                         bcp = {x=pos.x, y=pos.y-0.6, z=pos.z} -- Position of bottom center point
720                         bcn = minetest.env:get_node(bcp)
721                         if bcn.name ~= "air" then
722                                 -- Turn to a sand node
723                                 np = {x=bcp.x, y=bcp.y+1, z=bcp.z}
724                                 minetest.env:add_node(np, {name=nodename})
725                                 self.object:remove()
726                         else
727                                 -- Do nothing
728                         end
729                 end
730         })
731 end
732
733 register_falling_node("sand", "sand.png")
734 register_falling_node("gravel", "gravel.png")
735
736 --[[
737 minetest.register_entity("falling_sand", {
738         -- Definition
739         collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
740         visual = "cube",
741         textures = {"sand.png","sand.png","sand.png","sand.png","sand.png","sand.png"},
742         -- State
743         fallspeed = 0,
744         -- Methods
745         on_step = function(self, dtime)
746                 -- Apply gravity
747                 self.fallspeed = self.fallspeed + dtime * 5
748                 fp = self.object:getpos()
749                 fp.y = fp.y - self.fallspeed * dtime
750                 self.object:moveto(fp)
751                 -- Turn to actual sand when collides to ground or just move
752                 bcp = {x=fp.x, y=fp.y-0.5, z=fp.z} -- Position of bottom center point
753                 bcn = minetest.env:get_node(bcp)
754                 if bcn.name ~= "air" then
755                         -- Turn to a sand node
756                         np = {x=bcp.x, y=bcp.y+1, z=bcp.z}
757                         minetest.env:add_node(np, {name="sand"})
758                         self.object:remove()
759                 else
760                         -- Do nothing
761                 end
762         end
763 })
764 --]]
765
766 --
767 -- Global callbacks
768 --
769
770 -- Global environment step function
771 function on_step(dtime)
772         -- print("on_step")
773 end
774 minetest.register_globalstep(on_step)
775
776 function on_placenode(p, node)
777         print("on_placenode")
778         nodeupdate(p)
779 end
780 minetest.register_on_placenode(on_placenode)
781
782 function on_dignode(p, node)
783         print("on_dignode")
784         nodeupdate(p)
785 end
786 minetest.register_on_dignode(on_dignode)
787
788 function on_punchnode(p, node)
789         print("on_punchnode")
790         if node.name == "TNT" then
791                 minetest.env:remove_node(p)
792                 minetest.env:add_luaentity(p, "TNT")
793                 nodeupdate(p)
794         end
795 end
796 minetest.register_on_punchnode(on_punchnode)
797
798 --
799 -- Done, print some random stuff
800 --
801
802 print("minetest.registered_entities:")
803 dump2(minetest.registered_entities)
804
805 --
806 -- Some random pre-implementation planning and drafting
807 --
808
809 --[[
810 function TNT:on_rightclick(clicker)
811         print("TNT:on_rightclick()")
812         print("self: "..dump(self))
813         print("getmetatable(self): "..dump(getmetatable(self)))
814         print("getmetatable(getmetatable(self)): "..dump(getmetatable(getmetatable(self))))
815         pos = self.object:getpos()
816         print("TNT:on_rightclick(): object position: "..dump(pos))
817         pos = {x=pos.x+0.5+1, y=pos.y+0.5, z=pos.z+0.5}
818         --minetest.env:add_node(pos, {name="stone")
819 end
820 --]]
821
822 --[=[
823
824 register_block(0, {
825         textures = "stone.png",
826         makefacetype = 0,
827         get_dig_duration = function(env, pos, digger)
828                 -- Check stuff like digger.current_tool
829                 return 1.5
830         end,
831         on_dig = function(env, pos, digger)
832                 env:remove_node(pos)
833                 digger.inventory.put("MaterialItem2 0");
834         end,
835 })
836
837 register_block(1, {
838         textures = {"grass.png","mud.png","mud_grass_side.png","mud_grass_side.png","mud_grass_side.png","mud_grass_side.png"},
839         makefacetype = 0,
840         get_dig_duration = function(env, pos, digger)
841                 -- Check stuff like digger.current_tool
842                 return 0.5
843         end,
844         on_dig = function(env, pos, digger)
845                 env:remove_node(pos)
846                 digger.inventory.put("MaterialItem2 1");
847         end,
848 })
849
850 -- Consider the "miscellaneous block namespace" to be 0xc00...0xfff = 3072...4095
851 register_block(3072, {
852         textures = {"tnt_top.png","tnt_bottom.png","tnt_side.png","tnt_side.png","tnt_side.png","tnt_side.png"},
853         makefacetype = 0,
854         get_dig_duration = function(env, pos, digger)
855                 -- Cannot be dug
856                 return nil
857         end,
858         -- on_dig = function(env, pos, digger) end, -- Not implemented
859         on_hit = function(env, pos, hitter)
860                 -- Replace with TNT object, which will explode after timer, follow gravity, blink and stuff
861                 env:add_object("tnt", pos)
862                 env:remove_node(pos)
863         end,
864 })
865 --]=]
866