Random fixes to InvRef related stuff and a broken luafurnace
authorPerttu Ahola <celeron55@gmail.com>
Tue, 6 Dec 2011 15:23:58 +0000 (17:23 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Mon, 2 Jan 2012 00:59:14 +0000 (02:59 +0200)
data/mods/experimental/init.lua
src/scriptapi.cpp

index dd0d60f4e373499a29d3ddfc846aa26f0428a30f..2c28f89f9bfaf7351044a878960ba6697823e1cf 100644 (file)
@@ -56,6 +56,138 @@ minetest.register_on_placenode(function(pos, newnode, placer)
        end
 end)
 
+minetest.register_abm({
+       nodenames = {"experimental:luafurnace"},
+       interval = 1.0,
+       chance = 1,
+       action = function(pos, node, active_object_count, active_object_count_wider)
+               local meta = minetest.env:get_meta(pos)
+               for i, name in ipairs({
+                               "fuel_totaltime",
+                               "fuel_time",
+                               "src_totaltime",
+                               "src_time"
+               }) do
+                       if not tonumber(meta:get_string(name)) then
+                               meta:set_string(name, 0)
+                       end
+               end
+
+               local inv = meta:get_inventory()
+               
+               fuelitem = inv:get_stack("fuel", 1):peek_item()
+               srcitem = inv:get_stack("src", 1):peek_item()
+               
+               local cooked_something = false
+
+               local src_cooktime = -1
+               local result_stackstring = nil
+               
+               if srcitem then
+                       local prop = nil
+                       if srcitem.type == "node" then
+                               prop = minetest.registered_nodes[srcitem.name]
+                       elseif srcitem.type == "craft" then
+                               prop = minetest.registered_craftitems[srcitem.name]
+                       end
+                       if prop and prop.cookresult_itemstring ~= "" then
+                               result_stackstring = prop.cookresult_itemstring
+                               src_cooktime = prop.furnace_cooktime or 3
+                       end
+               end
+
+               if tonumber(meta:get_string("fuel_time")) < tonumber(meta:get_string("fuel_totaltime")) then
+                       meta:set_string("fuel_time", tonumber(meta:get_string("fuel_time")) + 1)
+                       meta:set_string("src_time", tonumber(meta:get_string("src_time")) + 1)
+                       --print("result_stackstring="..dump(result_stackstring))
+                       --print('tonumber(meta:get_string("src_time"))='..dump(tonumber(meta:get_string("src_time"))))
+                       --print("src_cooktime="..dump(src_cooktime))
+                       if result_stackstring and tonumber(meta:get_string("src_time")) >= src_cooktime and src_cooktime >= 0 then
+                               for i=1,4 do
+                                       -- Put result in "dst" list
+                                       dststack = inv:get_stack("dst", i)
+                                       success = dststack:put_stackstring(result_stackstring)
+                                       inv:set_stack("dst", i, dststack)
+                                       -- If succeeded, take stuff from "src" list
+                                       if success then
+                                               srcstack = inv:get_stack("src", 1)
+                                               srcstack:take_item()
+                                               inv:set_stack("src", 1, srcstack)
+                                               break
+                                       end
+                               end
+                               meta:inventory_set_list("src", srclist)
+                               meta:inventory_set_list("dst", dstlist)
+                               meta:set_string("src_time", 0)
+                               cooked_something = true
+                       end
+               end
+               
+               if tonumber(meta:get_string("fuel_time")) < tonumber(meta:get_string("fuel_totaltime")) then
+                       meta:set_infotext("Furnace active: "..(tonumber(meta:get_string("fuel_time"))/tonumber(meta:get_string("fuel_totaltime"))*100).."%")
+                       return
+               end
+
+               local srclist = meta:inventory_get_list("src")
+               _, srcitem = stackstring_take_item(srclist[1])
+
+               local src_cooktime = 0
+               local result_stackstring = nil
+               
+               if srcitem then
+                       if srcitem.type == "node" then
+                               local prop = minetest.registered_nodes[srcitem.name]
+                               if prop and prop.cookresult_itemstring ~= "" then
+                                       result_stackstring = prop.cookresult_itemstring
+                                       src_cooktime = prop.furnace_cooktime or 3
+                               end
+                       elseif srcitem.type == "craft" then
+                               local prop = minetest.registered_craftitems[srcitem.name]
+                               if prop and prop.cookresult_itemstring ~= "" then
+                                       result_stackstring = prop.cookresult_itemstring
+                                       src_cooktime = prop.furnace_cooktime or 3
+                               end
+                       end
+               end
+
+               if not result_stackstring then
+                       if cooked_something then
+                               meta:set_infotext("Furnace is empty")
+                       end
+                       return
+               end
+
+               local fuellist = meta:inventory_get_list("fuel")
+               _, fuelitem = stackstring_take_item(fuellist[1])
+
+               local burntime = -1
+               if fuelitem then
+                       if fuelitem.type == "node" then
+                               local prop = minetest.registered_nodes[fuelitem.name]
+                               if prop then
+                                       burntime = prop.furnace_burntime or -1
+                               end
+                       elseif fuelitem.type == "craft" then
+                               local prop = minetest.registered_craftitems[fuelitem.name]
+                               if prop then
+                                       burntime = prop.furnace_burntime or -1
+                               end
+                       end
+               end
+
+               if burntime <= 0 then
+                       meta:set_infotext("Furnace out of fuel")
+                       return
+               end
+
+               meta:set_string("fuel_totaltime", burntime)
+               meta:set_string("fuel_time", 0)
+
+               fuellist[1], _ = stackstring_take_item(fuellist[1])
+               meta:inventory_set_list("fuel", fuellist)
+       end,
+})
+--[[
 minetest.register_abm({
        nodenames = {"experimental:luafurnace"},
        interval = 1.0,
@@ -110,7 +242,7 @@ minetest.register_abm({
                meta:set_infotext("Lua Furnace: total cooked: "..total_cooked)
        end,
 })
-
+--]]
 minetest.register_craft({
        output = 'node "experimental:luafurnace" 1',
        recipe = {
index 101e0789458d8f302c7a5fafed5a27020582a68a..2efb8203df1ae3dacc75ff9426bcc11feed747e3 100644 (file)
@@ -606,7 +606,7 @@ static void push_stack_item(lua_State *L, InventoryItem *item0)
        if(item0 == NULL){
                lua_pushnil(L);
        }
-       if(std::string("MaterialItem") == item0->getName()){
+       else if(std::string("MaterialItem") == item0->getName()){
                MaterialItem *item = (MaterialItem*)item0;
                lua_newtable(L);
                lua_pushstring(L, "NodeItem");
@@ -837,6 +837,14 @@ private:
                return 0;
        }
 
+       // peek_item(self)
+       static int l_peek_item(lua_State *L)
+       {
+               ItemStack *o = checkobject(L, 1);
+               push_stack_item(L, o->m_stack);
+               return 1;
+       }
+
        // take_item(self)
        static int l_take_item(lua_State *L)
        {
@@ -870,6 +878,29 @@ private:
                return 1;
        }
 
+       // put_stackstring(self, stackstring) -> true/false
+       static int l_put_stackstring(lua_State *L)
+       {
+               ItemStack *o = checkobject(L, 1);
+               std::string stackstring = luaL_checkstring(L, 2);
+               try{
+                       InventoryItem *item = InventoryItem::deSerialize(stackstring,
+                                       get_server(L));
+                       if(!item->addableTo(o->m_stack)){
+                               lua_pushboolean(L, false);
+                               return 1;
+                       }
+                       o->m_stack->add(1);
+                       delete item;
+                       lua_pushboolean(L, true);
+                       return 1;
+               }
+               catch(SerializationError &e){
+                       lua_pushboolean(L, false);
+                       return 1;
+               }
+       }
+
 public:
        ItemStack(InventoryItem *item=NULL):
                m_stack(item)
@@ -956,8 +987,10 @@ public:
 };
 const char ItemStack::className[] = "ItemStack";
 const luaL_reg ItemStack::methods[] = {
+       method(ItemStack, peek_item),
        method(ItemStack, take_item),
        method(ItemStack, put_item),
+       method(ItemStack, put_stackstring),
        {0,0}
 };
 
@@ -1317,7 +1350,6 @@ private:
        // set_infotext(self, text)
        static int l_set_infotext(lua_State *L)
        {
-               infostream<<__FUNCTION_NAME<<std::endl;
                NodeMetaRef *ref = checkobject(L, 1);
                NodeMetadata *meta = getmeta(ref);
                if(meta == NULL) return 0;
@@ -1328,9 +1360,21 @@ private:
                return 0;
        }
 
-       // inventory_set_list(self, name, {item1, item2, ...})
+       // get_inventory(self)
+       static int l_get_inventory(lua_State *L)
+       {
+               NodeMetaRef *ref = checkobject(L, 1);
+               NodeMetadata *meta = getmeta(ref);
+               if(meta == NULL) return 0;
+               // Do it
+               InvRef::createNodeMeta(L, ref->m_p);
+               return 1;
+       }
+
+       // deprecated: inventory_set_list(self, name, {item1, item2, ...})
        static int l_inventory_set_list(lua_State *L)
        {
+               infostream<<"Deprecated: inventory_set_list"<<std::endl;
                NodeMetaRef *ref = checkobject(L, 1);
                NodeMetadata *meta = getmeta(ref);
                if(meta == NULL) return 0;
@@ -1343,9 +1387,10 @@ private:
                return 0;
        }
 
-       // inventory_get_list(self, name)
+       // deprecated: inventory_get_list(self, name)
        static int l_inventory_get_list(lua_State *L)
        {
+               infostream<<"Deprecated: inventory_get_list"<<std::endl;
                NodeMetaRef *ref = checkobject(L, 1);
                NodeMetadata *meta = getmeta(ref);
                if(meta == NULL) return 0;
@@ -1541,8 +1586,9 @@ const luaL_reg NodeMetaRef::methods[] = {
        method(NodeMetaRef, get_text),
        method(NodeMetaRef, get_owner),
        method(NodeMetaRef, set_infotext),
-       method(NodeMetaRef, inventory_set_list),
-       method(NodeMetaRef, inventory_get_list),
+       method(NodeMetaRef, get_inventory),
+       method(NodeMetaRef, inventory_set_list), // deprecated
+       method(NodeMetaRef, inventory_get_list), // deprecated
        method(NodeMetaRef, set_inventory_draw_spec),
        method(NodeMetaRef, set_allow_text_input),
        method(NodeMetaRef, set_allow_removal),
@@ -3204,10 +3250,12 @@ void scriptapi_export(lua_State *L, Server *server)
        luaL_register(L, NULL, minetest_entity_m);
        // Put other stuff in metatable
        
-       // Register reference wrappers
+       // Register wrappers
+       ItemStack::Register(L);
+       InvRef::Register(L);
        NodeMetaRef::Register(L);
-       EnvRef::Register(L);
        ObjectRef::Register(L);
+       EnvRef::Register(L);
 }
 
 bool scriptapi_loadmod(lua_State *L, const std::string &scriptpath,