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