]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - data/mods/default/init.lua
GenericNodeMetadata and an example furnace
[dragonfireclient.git] / data / mods / default / init.lua
index 88f457e290a8c16b58665c15038110b77c09894a..58ac72242f28e999086a243f53897463b8df5319 100644 (file)
 -- minetest.register_on_placenode(func(pos, newnode, placer))
 -- minetest.register_on_dignode(func(pos, oldnode, digger))
 -- minetest.register_on_punchnode(func(pos, node, puncher))
+-- minetest.register_on_generated(func(minp, maxp))
 -- minetest.register_on_newplayer(func(ObjectRef))
 -- minetest.register_on_respawnplayer(func(ObjectRef))
 -- ^ return true in func to disable regular player placement
+-- minetest.register_on_chat_message(func(name, message))
 -- minetest.setting_get(name)
 -- minetest.setting_getbool(name)
+-- minetest.chat_send_all(text)
+-- minetest.chat_send_player(name, text)
 --
 -- Global objects:
 -- minetest.env - environment reference
 -- - remove_node(pos)
 -- - get_node(pos)
 -- - add_luaentity(pos, name)
+-- - get_meta(pos) -- Get a NodeMetaRef at that position
+--
+-- NodeMetaRef
+-- - get_type()
+-- - allows_text_input()
+-- - set_text(text) -- eg. set the text of a sign
+-- - get_text()
+-- - get_owner()
+-- - set_infotext(infotext)
+-- - inventory_set_list(name, {item1, item2, ...})
+-- - inventory_get_list(name)
+-- - set_inventory_draw_spec(string)
+-- - set_allow_text_input(bool)
+-- - set_allow_removal(bool)
+-- - set_enforce_owner(bool)
+-- - is_inventory_modified()
+-- - reset_inventory_modified()
+-- - is_text_modified()
+-- - reset_text_modified()
+-- - set_string(name, value)
+-- - get_string(name)
 --
 -- ObjectRef is basically ServerActiveObject.
 -- ObjectRef methods:
@@ -48,6 +73,9 @@
 -- - setpos(pos); pos={x=num, y=num, z=num}
 -- - moveto(pos, continuous=false): interpolated move
 -- - add_to_inventory(itemstring): add an item to object inventory
+-- - settexturemod(mod)
+-- - setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2,
+-- -           select_horiz_by_yawpitch=false)
 --
 -- Registered entities:
 -- - Functions receive a "luaentity" as self:
@@ -1170,8 +1198,6 @@ local TNT = {
        collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
        visual = "cube",
        textures = {"tnt_top.png","tnt_bottom.png","tnt_side.png","tnt_side.png","tnt_side.png","tnt_side.png"},
-       --visual = "single_sprite",
-       --textures = {"mese.png^[forcesingle"},
        -- Initial value for our timer
        timer = 0,
        -- Number of punches required to defuse
@@ -1226,6 +1252,36 @@ print("TNT dump: "..dump(TNT))
 print("Registering TNT");
 minetest.register_entity("TNT", TNT)
 
+
+minetest.register_entity("testentity", {
+       -- Static definition
+       physical = true, -- Collides with things
+       -- weight = 5,
+       collisionbox = {-0.7,-1.35,-0.7, 0.7,1.0,0.7},
+       --collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
+       visual = "sprite",
+       visual_size = {x=2, y=3},
+       textures = {"dungeon_master.png^[makealpha:128,0,0^[makealpha:128,128,0"},
+       spritediv = {x=6, y=5},
+       initial_sprite_basepos = {x=0, y=0},
+
+       on_activate = function(self, staticdata)
+               print("testentity.on_activate")
+               self.object:setsprite({x=0,y=0}, 1, 0, true)
+               --self.object:setsprite({x=0,y=0}, 4, 0.3, true)
+
+               -- Set gravity
+               self.object:setacceleration({x=0, y=-10, z=0})
+               -- Jump a bit upwards
+               self.object:setvelocity({x=0, y=10, z=0})
+       end,
+
+       on_punch = function(self, hitter)
+               self.object:remove()
+               hitter:add_to_inventory('CraftItem testobject1 1')
+       end,
+})
+
 --
 -- Falling stuff
 --
@@ -1261,36 +1317,6 @@ end
 register_falling_node("sand", "sand.png")
 register_falling_node("gravel", "gravel.png")
 
---[[
-minetest.register_entity("falling_sand", {
-       -- Definition
-       collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
-       visual = "cube",
-       textures = {"sand.png","sand.png","sand.png","sand.png","sand.png","sand.png"},
-       -- State
-       fallspeed = 0,
-       -- Methods
-       on_step = function(self, dtime)
-               -- Apply gravity
-               self.fallspeed = self.fallspeed + dtime * 5
-               fp = self.object:getpos()
-               fp.y = fp.y - self.fallspeed * dtime
-               self.object:moveto(fp)
-               -- Turn to actual sand when collides to ground or just move
-               bcp = {x=fp.x, y=fp.y-0.5, z=fp.z} -- Position of bottom center point
-               bcn = minetest.env:get_node(bcp)
-               if bcn.name ~= "air" then
-                       -- Turn to a sand node
-                       np = {x=bcp.x, y=bcp.y+1, z=bcp.z}
-                       minetest.env:add_node(np, {name="sand"})
-                       self.object:remove()
-               else
-                       -- Do nothing
-               end
-       end
-})
---]]
-
 --
 -- Global callbacks
 --
@@ -1329,10 +1355,306 @@ minetest.register_on_respawnplayer(function(player)
        -- return true
 end)
 
+minetest.register_on_generated(function(minp, maxp)
+       --print("on_generated: minp="..dump(minp).." maxp="..dump(maxp))
+       --cp = {x=(minp.x+maxp.x)/2, y=(minp.y+maxp.y)/2, z=(minp.z+maxp.z)/2}
+       --minetest.env:add_node(cp, {name="sand"})
+end)
+
 -- Example setting get
 print("setting max_users = " .. dump(minetest.setting_get("max_users")))
 print("setting asdf = " .. dump(minetest.setting_get("asdf")))
 
+minetest.register_on_chat_message(function(name, message)
+       print("on_chat_message: name="..dump(name).." message="..dump(message))
+       local cmd = "/testcommand"
+       if message:sub(0, #cmd) == cmd then
+               print(cmd.." invoked")
+               return true
+       end
+       local cmd = "/help"
+       if message:sub(0, #cmd) == cmd then
+               print("script-overridden help command")
+               minetest.chat_send_all("script-overridden help command")
+               return true
+       end
+end)
+
+-- Grow papyrus on TNT every 10 seconds
+--[[minetest.register_abm({
+       nodenames = {"TNT"},
+       interval = 10.0,
+       chance = 1,
+       action = function(pos, node, active_object_count, active_object_count_wider)
+               print("TNT ABM action")
+               pos.y = pos.y + 1
+               minetest.env:add_node(pos, {name="papyrus"})
+       end,
+})]]
+
+-- Replace texts of alls signs with "foo" every 10 seconds
+--[[minetest.register_abm({
+       nodenames = {"sign_wall"},
+       interval = 10.0,
+       chance = 1,
+       action = function(pos, node, active_object_count, active_object_count_wider)
+               print("ABM: Sign text changed")
+               local meta = minetest.env:get_meta(pos)
+               meta:set_text("foo")
+       end,
+})]]
+
+-- LuaNodeMetadata should support something like this
+--meta.setvar("somevariable", {x=0, y=0, z=0})
+--meta.getvar("somevariable") -> {x=0, y=0, z=0}
+
+--
+-- Random stuff
+--
+
+minetest.register_node("luafurnace", {
+       tile_images = {"lava.png", "furnace_side.png", "furnace_side.png",
+               "furnace_side.png", "furnace_side.png", "furnace_front.png"},
+       --inventory_image = "furnace_front.png",
+       inventory_image = inventorycube("furnace_front.png"),
+       paramtype = "facedir_simple",
+       metadata_name = "generic",
+       material = digprop_stonelike(3.0),
+})
+
+minetest.register_on_placenode(function(pos, newnode, placer)
+       if newnode.name == "luafurnace" then
+               print("get_meta");
+               local meta = minetest.env:get_meta(pos)
+               print("inventory_set_list");
+               meta:inventory_set_list("fuel", {""})
+               print("inventory_set_list");
+               meta:inventory_set_list("src", {""})
+               print("inventory_set_list");
+               meta:inventory_set_list("dst", {"","","",""})
+               print("set_inventory_draw_spec");
+               meta:set_inventory_draw_spec(
+                       "invsize[8,9;]"
+                       .."list[current_name;fuel;2,3;1,1;]"
+                       .."list[current_name;src;2,1;1,1;]"
+                       .."list[current_name;dst;5,1;2,2;]"
+                       .."list[current_player;main;0,5;8,4;]"
+               )
+               
+               local total_cooked = 0;
+               print("set_string")
+               meta:set_string("total_cooked", total_cooked)
+               print("set_infotext");
+               meta:set_infotext("Lua Furnace: total cooked: "..total_cooked)
+       end
+end)
+
+function stackstring_take_item(stackstring)
+       if stackstring == nil then
+               return '', nil
+       end
+       local stacktype = nil
+       stacktype = string.match(stackstring,
+                       '([%a%d]+Item[%a%d]*)')
+       if stacktype == "NodeItem" or stacktype == "CraftItem" then
+               local itemtype = nil
+               local itemname = nil
+               local itemcount = nil
+               itemtype, itemname, itemcount = string.match(stackstring,
+                               '([%a%d]+Item[%a%d]*) "([^"]*)" (%d+)')
+               itemcount = tonumber(itemcount)
+               if itemcount == 0 then
+                       return '', nil
+               elseif itemcount == 1 then
+                       return '', {type=itemtype, name=itemname}
+               else
+                       return itemtype.." \""..itemname.."\" "..(itemcount-1),
+                                       {type=itemtype, name=itemname}
+               end
+       elseif stacktype == "ToolItem" then
+               local itemtype = nil
+               local itemname = nil
+               local itemwear = nil
+               itemtype, itemname, itemwear = string.match(stackstring,
+                               '([%a%d]+Item[%a%d]*) "([^"]*)" (%d+)')
+               itemwear = tonumber(itemwear)
+               return '', {type=itemtype, name=itemname, wear=itemwear}
+       end
+end
+
+function stackstring_put_item(stackstring, item)
+       if item == nil then
+               return stackstring, false
+       end
+       stackstring = stackstring or ''
+       local stacktype = nil
+       stacktype = string.match(stackstring,
+                       '([%a%d]+Item[%a%d]*)')
+       stacktype = stacktype or ''
+       if stacktype ~= '' and stacktype ~= item.type then
+               return stackstring, false
+       end
+       if item.type == "NodeItem" or item.type == "CraftItem" then
+               local itemtype = nil
+               local itemname = nil
+               local itemcount = nil
+               itemtype, itemname, itemcount = string.match(stackstring,
+                               '([%a%d]+Item[%a%d]*) "([^"]*)" (%d+)')
+               itemtype = itemtype or item.type
+               itemname = itemname or item.name
+               if itemcount == nil then
+                       itemcount = 0
+               end
+               itemcount = itemcount + 1
+               return itemtype.." \""..itemname.."\" "..itemcount, true
+       elseif item.type == "ToolItem" then
+               if stacktype ~= nil then
+                       return stackstring, false
+               end
+               local itemtype = nil
+               local itemname = nil
+               local itemwear = nil
+               itemtype, itemname, itemwear = string.match(stackstring,
+                               '([%a%d]+Item[%a%d]*) "([^"]*)" (%d+)')
+               itemwear = tonumber(itemwear)
+               return itemtype.." \""..itemname.."\" "..itemwear, true
+       end
+       return stackstring, false
+end
+
+function stackstring_put_stackstring(stackstring, src)
+       while src ~= '' do
+               --print("src="..dump(src))
+               src, item = stackstring_take_item(src)
+               --print("src="..dump(src).." item="..dump(item))
+               local success
+               stackstring, success = stackstring_put_item(stackstring, item)
+               if not success then
+                       return stackstring, false
+               end
+       end
+       return stackstring, true
+end
+
+function test_stack()
+       local stack
+       local item
+       local success
+
+       stack, item = stackstring_take_item('NodeItem "TNT" 3')
+       assert(stack == 'NodeItem "TNT" 2')
+       assert(item.type == 'NodeItem')
+       assert(item.name == 'TNT')
+
+       stack, item = stackstring_take_item('CraftItem "with spaces" 2')
+       assert(stack == 'CraftItem "with spaces" 1')
+       assert(item.type == 'CraftItem')
+       assert(item.name == 'with spaces')
+
+       stack, item = stackstring_take_item('CraftItem "with spaces" 1')
+       assert(stack == '')
+       assert(item.type == 'CraftItem')
+       assert(item.name == 'with spaces')
+
+       stack, item = stackstring_take_item('CraftItem "s8df2kj3" 0')
+       assert(stack == '')
+       assert(item == nil)
+
+       stack, item = stackstring_take_item('ToolItem "With Spaces" 32487')
+       assert(stack == '')
+       assert(item.type == 'ToolItem')
+       assert(item.name == 'With Spaces')
+       assert(item.wear == 32487)
+
+       stack, success = stackstring_put_item('NodeItem "With Spaces" 40',
+                       {type='NodeItem', name='With Spaces'})
+       assert(stack == 'NodeItem "With Spaces" 41')
+       assert(success == true)
+
+       stack, success = stackstring_put_item('CraftItem "With Spaces" 40',
+                       {type='CraftItem', name='With Spaces'})
+       assert(stack == 'CraftItem "With Spaces" 41')
+       assert(success == true)
+
+       stack, success = stackstring_put_item('ToolItem "With Spaces" 32487',
+                       {type='ToolItem', name='With Spaces'})
+       assert(stack == 'ToolItem "With Spaces" 32487')
+       assert(success == false)
+
+       stack, success = stackstring_put_item('NodeItem "With Spaces" 40',
+                       {type='ToolItem', name='With Spaces'})
+       assert(stack == 'NodeItem "With Spaces" 40')
+       assert(success == false)
+       
+       assert(stackstring_put_stackstring('NodeItem "With Spaces" 2',
+                       'NodeItem "With Spaces" 1') == 'NodeItem "With Spaces" 3')
+end
+test_stack()
+
+minetest.register_abm({
+       nodenames = {"luafurnace"},
+       interval = 1.0,
+       chance = 1,
+       action = function(pos, node, active_object_count, active_object_count_wider)
+               local meta = minetest.env:get_meta(pos)
+               local fuellist = meta:inventory_get_list("fuel")
+               local srclist = meta:inventory_get_list("src")
+               local dstlist = meta:inventory_get_list("dst")
+               if fuellist == nil or srclist == nil or dstlist == nil then
+                       return
+               end
+               _, srcitem = stackstring_take_item(srclist[1])
+               _, fuelitem = stackstring_take_item(fuellist[1])
+               if not srcitem or not fuelitem then return end
+               if fuelitem.type == "NodeItem" then
+                       local prop = minetest.registered_nodes[fuelitem.name]
+                       if prop == nil then return end
+                       if prop.furnace_burntime < 0 then return end
+               else
+                       return
+               end
+               local resultstack = nil
+               if srcitem.type == "NodeItem" then
+                       local prop = minetest.registered_nodes[srcitem.name]
+                       if prop == nil then return end
+                       if prop.cookresult_item == "" then return end
+                       resultstack = prop.cookresult_item
+               else
+                       return
+               end
+
+               if resultstack == nil then
+                       return
+               end
+
+               dstlist[1], success = stackstring_put_stackstring(dstlist[1], resultstack)
+               if not success then
+                       return
+               end
+
+               fuellist[1], _ = stackstring_take_item(fuellist[1])
+               srclist[1], _ = stackstring_take_item(srclist[1])
+
+               meta:inventory_set_list("fuel", fuellist)
+               meta:inventory_set_list("src", srclist)
+               meta:inventory_set_list("dst", dstlist)
+
+               local total_cooked = meta:get_string("total_cooked")
+               total_cooked = tonumber(total_cooked) + 1
+               meta:set_string("total_cooked", total_cooked)
+               meta:set_infotext("Lua Furnace: total cooked: "..total_cooked)
+       end,
+})
+
+minetest.register_craft({
+       output = 'NodeItem "luafurnace" 1',
+       recipe = {
+               {'NodeItem "cobble"', 'NodeItem "cobble"', 'NodeItem "cobble"'},
+               {'NodeItem "cobble"', 'NodeItem "cobble"', 'NodeItem "cobble"'},
+               {'NodeItem "cobble"', 'NodeItem "cobble"', 'NodeItem "cobble"'},
+       }
+})
+
 --
 -- Done, print some random stuff
 --