Add EnvRef:get_objects_inside_radius(pos, radius)
[oweals/minetest.git] / data / mods / experimental / init.lua
1 --
2 -- Experimental things
3 --
4
5 -- For testing random stuff
6
7 function on_step(dtime)
8         -- print("experimental on_step")
9         --[[
10         objs = minetest.env:get_objects_inside_radius({x=0,y=0,z=0}, 10)
11         for k, obj in pairs(objs) do
12                 name = obj:get_player_name()
13                 if name then
14                         print(name.." at "..dump(obj:getpos()))
15                         print(name.." dir: "..dump(obj:get_look_dir()))
16                         print(name.." pitch: "..dump(obj:get_look_pitch()))
17                         print(name.." yaw: "..dump(obj:get_look_yaw()))
18                 else
19                         print("Some object at "..dump(obj:getpos()))
20                 end
21         end
22         --]]
23 end
24 minetest.register_globalstep(on_step)
25
26 -- An example furnace-thing implemented in Lua
27
28 minetest.register_node("experimental:luafurnace", {
29         tile_images = {"default_lava.png", "default_furnace_side.png",
30                 "default_furnace_side.png", "default_furnace_side.png",
31                 "default_furnace_side.png", "default_furnace_front.png"},
32         --inventory_image = "furnace_front.png",
33         inventory_image = minetest.inventorycube("default_furnace_front.png"),
34         paramtype = "facedir_simple",
35         metadata_name = "generic",
36         material = minetest.digprop_stonelike(3.0),
37 })
38
39 minetest.register_on_placenode(function(pos, newnode, placer)
40         if newnode.name == "experimental:luafurnace" then
41                 local meta = minetest.env:get_meta(pos)
42                 meta:inventory_set_list("fuel", {""})
43                 meta:inventory_set_list("src", {""})
44                 meta:inventory_set_list("dst", {"","","",""})
45                 meta:set_inventory_draw_spec(
46                         "invsize[8,9;]"
47                         .."list[current_name;fuel;2,3;1,1;]"
48                         .."list[current_name;src;2,1;1,1;]"
49                         .."list[current_name;dst;5,1;2,2;]"
50                         .."list[current_player;main;0,5;8,4;]"
51                 )
52                 
53                 local total_cooked = 0;
54                 meta:set_string("total_cooked", total_cooked)
55                 meta:set_infotext("Lua Furnace: total cooked: "..total_cooked)
56         end
57 end)
58
59 minetest.register_abm({
60         nodenames = {"experimental:luafurnace"},
61         interval = 1.0,
62         chance = 1,
63         action = function(pos, node, active_object_count, active_object_count_wider)
64                 local meta = minetest.env:get_meta(pos)
65                 local fuellist = meta:inventory_get_list("fuel")
66                 local srclist = meta:inventory_get_list("src")
67                 local dstlist = meta:inventory_get_list("dst")
68                 if fuellist == nil or srclist == nil or dstlist == nil then
69                         return
70                 end
71                 _, srcitem = stackstring_take_item(srclist[1])
72                 _, fuelitem = stackstring_take_item(fuellist[1])
73                 if not srcitem or not fuelitem then return end
74                 if fuelitem.type == "node" then
75                         local prop = minetest.registered_nodes[fuelitem.name]
76                         if prop == nil then return end
77                         if prop.furnace_burntime < 0 then return end
78                 else
79                         return
80                 end
81                 local resultstack = nil
82                 if srcitem.type == "node" then
83                         local prop = minetest.registered_nodes[srcitem.name]
84                         if prop == nil then return end
85                         if prop.cookresult_item == "" then return end
86                         resultstack = prop.cookresult_item
87                 else
88                         return
89                 end
90
91                 if resultstack == nil then
92                         return
93                 end
94
95                 dstlist[1], success = stackstring_put_stackstring(dstlist[1], resultstack)
96                 if not success then
97                         return
98                 end
99
100                 fuellist[1], _ = stackstring_take_item(fuellist[1])
101                 srclist[1], _ = stackstring_take_item(srclist[1])
102
103                 meta:inventory_set_list("fuel", fuellist)
104                 meta:inventory_set_list("src", srclist)
105                 meta:inventory_set_list("dst", dstlist)
106
107                 local total_cooked = meta:get_string("total_cooked")
108                 total_cooked = tonumber(total_cooked) + 1
109                 meta:set_string("total_cooked", total_cooked)
110                 meta:set_infotext("Lua Furnace: total cooked: "..total_cooked)
111         end,
112 })
113
114 minetest.register_craft({
115         output = 'node "experimental:luafurnace" 1',
116         recipe = {
117                 {'node "default:cobble"', 'node "default:cobble"', 'node "default:cobble"'},
118                 {'node "default:cobble"', 'node "default:steel_ingot"', 'node "default:cobble"'},
119                 {'node "default:cobble"', 'node "default:cobble"', 'node "default:cobble"'},
120         }
121 })
122
123 --
124 -- Random stuff
125 --
126
127 --[[
128 minetest.register_tool("experimental:horribletool", {
129         image = "default_lava.png",
130         basetime = 2.0
131         dt_weight = 0.2
132         dt_crackiness = 0.2
133         dt_crumbliness = 0.2
134         dt_cuttability = 0.2
135         basedurability = 50
136         dd_weight = -5
137         dd_crackiness = -5
138         dd_crumbliness = -5
139         dd_cuttability = -5
140 })
141 --]]
142
143 --[[minetest.register_craft({
144         output = 'node "somenode" 4',
145         recipe = {
146                 {'craft "default_tick" 1'},
147         }
148 })
149
150 minetest.register_node("experimental:somenode", {
151         tile_images = {"lava.png", "mese.png", "stone.png", "grass.png", "cobble.png", "tree_top.png"},
152         inventory_image = minetest.inventorycube("lava.png", "mese.png", "stone.png"),
153         --inventory_image = "treeprop.png",
154         material = {
155                 diggability = "normal",
156                 weight = 0,
157                 crackiness = 0,
158                 crumbliness = 0,
159                 cuttability = 0,
160                 flammability = 0
161         },
162         metadata_name = "chest",
163 })]]
164
165 --
166 -- TNT (not functional)
167 --
168
169 minetest.register_craft({
170         output = 'node "experimental:tnt" 4',
171         recipe = {
172                 {'node "default:wood" 1'},
173                 {'craft "default:coal_lump" 1'},
174                 {'node "default:wood" 1'}
175         }
176 })
177
178 minetest.register_node("experimental:tnt", {
179         tile_images = {"default_tnt_top.png", "default_tnt_bottom.png",
180                         "default_tnt_side.png", "default_tnt_side.png",
181                         "default_tnt_side.png", "default_tnt_side.png"},
182         inventory_image = minetest.inventorycube("default_tnt_top.png",
183                         "default_tnt_side.png", "default_tnt_side.png"),
184         dug_item = '', -- Get nothing
185         material = {
186                 diggability = "not",
187         },
188 })
189
190 minetest.register_on_punchnode(function(p, node)
191         if node.name == "experimental:tnt" then
192                 minetest.env:remove_node(p)
193                 minetest.env:add_entity(p, "experimental:tnt")
194                 nodeupdate(p)
195         end
196 end)
197
198 local TNT = {
199         -- Static definition
200         physical = true, -- Collides with things
201         -- weight = 5,
202         collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
203         visual = "cube",
204         textures = {"default_tnt_top.png", "default_tnt_bottom.png",
205                         "default_tnt_side.png", "default_tnt_side.png",
206                         "default_tnt_side.png", "default_tnt_side.png"},
207         -- Initial value for our timer
208         timer = 0,
209         -- Number of punches required to defuse
210         health = 1,
211         blinktimer = 0,
212         blinkstatus = true,
213 }
214
215 -- Called when a TNT object is created
216 function TNT:on_activate(staticdata)
217         print("TNT:on_activate()")
218         self.object:setvelocity({x=0, y=4, z=0})
219         self.object:setacceleration({x=0, y=-10, z=0})
220         self.object:settexturemod("^[brighten")
221 end
222
223 -- Called periodically
224 function TNT:on_step(dtime)
225         --print("TNT:on_step()")
226         self.timer = self.timer + dtime
227         self.blinktimer = self.blinktimer + dtime
228         if self.blinktimer > 0.5 then
229                 self.blinktimer = self.blinktimer - 0.5
230                 if self.blinkstatus then
231                         self.object:settexturemod("")
232                 else
233                         self.object:settexturemod("^[brighten")
234                 end
235                 self.blinkstatus = not self.blinkstatus
236         end
237 end
238
239 -- Called when object is punched
240 function TNT:on_punch(hitter)
241         print("TNT:on_punch()")
242         self.health = self.health - 1
243         if self.health <= 0 then
244                 self.object:remove()
245                 hitter:add_to_inventory("node TNT 1")
246                 hitter:set_hp(hitter:get_hp() - 1)
247         end
248 end
249
250 -- Called when object is right-clicked
251 function TNT:on_rightclick(clicker)
252         --pos = self.object:getpos()
253         --pos = {x=pos.x, y=pos.y+0.1, z=pos.z}
254         --self.object:moveto(pos, false)
255 end
256
257 --print("TNT dump: "..dump(TNT))
258 --print("Registering TNT");
259 minetest.register_entity("experimental:tnt", TNT)
260
261 -- Add TNT's old name also
262 minetest.alias_node("TNT", "experimental:tnt")
263
264 --
265 -- A test entity for testing animated and yaw-modulated sprites
266 --
267
268 minetest.register_entity("experimental:testentity", {
269         -- Static definition
270         physical = true, -- Collides with things
271         -- weight = 5,
272         collisionbox = {-0.7,-1.35,-0.7, 0.7,1.0,0.7},
273         --collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
274         visual = "sprite",
275         visual_size = {x=2, y=3},
276         textures = {"dungeon_master.png^[makealpha:128,0,0^[makealpha:128,128,0"},
277         spritediv = {x=6, y=5},
278         initial_sprite_basepos = {x=0, y=0},
279
280         on_activate = function(self, staticdata)
281                 print("testentity.on_activate")
282                 self.object:setsprite({x=0,y=0}, 1, 0, true)
283                 --self.object:setsprite({x=0,y=0}, 4, 0.3, true)
284
285                 -- Set gravity
286                 self.object:setacceleration({x=0, y=-10, z=0})
287                 -- Jump a bit upwards
288                 self.object:setvelocity({x=0, y=10, z=0})
289         end,
290
291         on_punch = function(self, hitter)
292                 self.object:remove()
293                 hitter:add_to_inventory('craft testobject1 1')
294         end,
295 })
296
297 --
298 -- More random stuff
299 --
300
301 minetest.register_on_respawnplayer(function(player)
302         print("on_respawnplayer")
303         -- player:setpos({x=0, y=30, z=0})
304         -- return true
305 end)
306
307 minetest.register_on_generated(function(minp, maxp)
308         --print("on_generated: minp="..dump(minp).." maxp="..dump(maxp))
309         --cp = {x=(minp.x+maxp.x)/2, y=(minp.y+maxp.y)/2, z=(minp.z+maxp.z)/2}
310         --minetest.env:add_node(cp, {name="sand"})
311 end)
312
313 -- Example setting get
314 --print("setting max_users = " .. dump(minetest.setting_get("max_users")))
315 --print("setting asdf = " .. dump(minetest.setting_get("asdf")))
316
317 minetest.register_on_chat_message(function(name, message)
318         --[[print("on_chat_message: name="..dump(name).." message="..dump(message))
319         local cmd = "/testcommand"
320         if message:sub(0, #cmd) == cmd then
321                 print(cmd.." invoked")
322                 return true
323         end
324         local cmd = "/help"
325         if message:sub(0, #cmd) == cmd then
326                 print("script-overridden help command")
327                 minetest.chat_send_all("script-overridden help command")
328                 return true
329         end]]
330 end)
331
332 -- Grow papyrus on TNT every 10 seconds
333 --[[minetest.register_abm({
334         nodenames = {"TNT"},
335         interval = 10.0,
336         chance = 1,
337         action = function(pos, node, active_object_count, active_object_count_wider)
338                 print("TNT ABM action")
339                 pos.y = pos.y + 1
340                 minetest.env:add_node(pos, {name="papyrus"})
341         end,
342 })]]
343
344 -- Replace texts of alls signs with "foo" every 10 seconds
345 --[[minetest.register_abm({
346         nodenames = {"sign_wall"},
347         interval = 10.0,
348         chance = 1,
349         action = function(pos, node, active_object_count, active_object_count_wider)
350                 print("ABM: Sign text changed")
351                 local meta = minetest.env:get_meta(pos)
352                 meta:set_text("foo")
353         end,
354 })]]
355
356 --[[local ncpos = nil
357 local ncq = 1
358 local ncstuff = {
359     {2, 1, 0, 3}, {3, 0, 1, 2}, {4, -1, 0, 1}, {5, -1, 0, 1}, {6, 0, -1, 0},
360     {7, 0, -1, 0}, {8, 1, 0, 3}, {9, 1, 0, 3}, {10, 1, 0, 3}, {11, 0, 1, 2},
361     {12, 0, 1, 2}, {13, 0, 1, 2}, {14, -1, 0, 1}, {15, -1, 0, 1}, {16, -1, 0, 1},
362     {17, -1, 0, 1}, {18, 0, -1, 0}, {19, 0, -1, 0}, {20, 0, -1, 0}, {21, 0, -1, 0},
363     {22, 1, 0, 3}, {23, 1, 0, 3}, {24, 1, 0, 3}, {25, 1, 0, 3}, {10, 0, 1, 2}
364 }
365 local ncold = {}
366 local nctime = nil
367
368 minetest.register_abm({
369     nodenames = {"dirt_with_grass"},
370     interval = 100000.0,
371     chance = 1,
372     action = function(pos, node, active_object_count, active_object_count_wider)
373         if ncpos ~= nil then
374             return
375         end
376        
377         if pos.x % 16 ~= 8 or pos.z % 16 ~= 8 then
378             return
379         end
380        
381         pos.y = pos.y + 1
382         n = minetest.env:get_node(pos)
383         print(dump(n))
384         if n.name ~= "air" then
385             return
386         end
387
388         pos.y = pos.y + 2
389         ncpos = pos
390         nctime = os.clock()
391         minetest.env:add_node(ncpos, {name="nyancat"})
392     end
393 })
394
395 minetest.register_abm({
396     nodenames = {"nyancat"},
397     interval = 1.0,
398     chance = 1,
399     action = function(pos, node, active_object_count, active_object_count_wider)
400         if ncpos == nil then
401             return
402         end
403         if pos.x == ncpos.x and pos.y == ncpos.y and pos.z == ncpos.z then
404             clock = os.clock()
405             if clock - nctime < 0.1 then
406                 return
407             end
408             nctime = clock
409            
410             s0 = ncstuff[ncq]
411             ncq = s0[1]
412             s1 = ncstuff[ncq]
413             p0 = pos
414             p1 = {x = p0.x + s0[2], y = p0.y, z = p0.z + s0[3]}
415             p2 = {x = p1.x + s1[2], y = p1.y, z = p1.z + s1[3]}
416             table.insert(ncold, 1, p0)
417             while #ncold >= 10 do
418                 minetest.env:add_node(ncold[#ncold], {name="air"})
419                 table.remove(ncold, #ncold)
420             end
421             minetest.env:add_node(p0, {name="nyancat_rainbow"})
422             minetest.env:add_node(p1, {name="nyancat", param1=s0[4]})
423             minetest.env:add_node(p2, {name="air"})
424             ncpos = p1
425         end
426     end,
427 })--]]
428
429 print("experimental modpath="..dump(minetest.get_modpath("experimental")))
430
431 -- END