aboutsummaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-11-28 17:11:14 +0200
committerPerttu Ahola <celeron55@gmail.com>2011-11-29 19:13:57 +0200
commit705f142b8d53c22aac4f023d12db6fef010d4d9e (patch)
tree5b1a6be56702248c24f7c55fe03220a82e6c942d /data
parente880cc40e98e7eedd7e8b51810cbc0348fff4a6f (diff)
downloadminetest-705f142b8d53c22aac4f023d12db6fef010d4d9e.tar.gz
minetest-705f142b8d53c22aac4f023d12db6fef010d4d9e.tar.bz2
minetest-705f142b8d53c22aac4f023d12db6fef010d4d9e.zip
GenericNodeMetadata and an example furnace
Diffstat (limited to 'data')
-rw-r--r--data/mods/default/init.lua268
1 files changed, 266 insertions, 2 deletions
diff --git a/data/mods/default/init.lua b/data/mods/default/init.lua
index 3954c717f..58ac72242 100644
--- a/data/mods/default/init.lua
+++ b/data/mods/default/init.lua
@@ -47,7 +47,24 @@
-- - get_meta(pos) -- Get a NodeMetaRef at that position
--
-- NodeMetaRef
--- - settext(text) -- eg. set the text of a sign
+-- - 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:
@@ -1383,7 +1400,7 @@ end)
action = function(pos, node, active_object_count, active_object_count_wider)
print("ABM: Sign text changed")
local meta = minetest.env:get_meta(pos)
- meta:settext("foo")
+ meta:set_text("foo")
end,
})]]
@@ -1392,6 +1409,253 @@ end)
--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
--