+
+ if wield_item:sub(1,7) == "bucket:" then
+ if wield_item:sub(-6) == "_empty" and not (node.name:sub(-6) == "_empty") then
+ if itemstack:get_count() > 1 then
+ if inv:room_for_item("main", "bucket:bucket_water 1") then
+ itemstack:take_item()
+ inv:add_item("main", "bucket:bucket_water 1")
+ else
+ minetest.chat_send_player(clicker:get_player_name(),
+ "No room in your inventory to add a bucket of water.")
+ return
+ end
+ else
+ itemstack:replace("bucket:bucket_water")
+ end
+ minetest.set_node(pos, {name="xdecor:cauldron_empty", param2=node.param2})
+ elseif wield_item:sub(-6) == "_water" and node.name:sub(-6) == "_empty" then
+ minetest.set_node(pos, {name="xdecor:cauldron_idle", param2=node.param2})
+ itemstack:replace("bucket:bucket_empty")
+ end
+ return itemstack
+ end
+end
+
+function cauldron.idle_timer(pos)
+ local below_node = {x=pos.x, y=pos.y-1, z=pos.z}
+ if not minetest.get_node(below_node).name:find("fire") then
+ return true
+ end
+
+ local node = minetest.get_node(pos)
+ minetest.set_node(pos, {name="xdecor:cauldron_boiling", param2=node.param2})
+ return true
+end
+
+-- Ugly hack to determine if an item has `minetest.item_eat` in its definition.
+local function eatable(itemstring)
+ local item = itemstring:match("[%w_:]+")
+ local on_use_def = minetest.registered_items[item].on_use
+ if not on_use_def then return end
+ return string.format("%q", string.dump(on_use_def)):find("item_eat")
+end
+
+function cauldron.boiling_timer(pos)
+ local node = minetest.get_node(pos)
+ local objs = minetest.get_objects_inside_radius(pos, 0.5)
+ if objs == {} then return true end
+
+ local ingredients = {}
+ for _, obj in pairs(objs) do
+ if obj and not obj:is_player() and obj:get_luaentity().itemstring then
+ local itemstring = obj:get_luaentity().itemstring
+ local food = itemstring:match(":([%w_]+)")
+
+ for _, ingredient in pairs(ingredients_list) do
+ if food and (eatable(itemstring) or food:find(ingredient)) then
+ ingredients[#ingredients+1] = food break
+ end
+ end
+ end
+ end
+
+ if #ingredients >= 2 then
+ for _, obj in pairs(objs) do obj:remove() end
+ minetest.set_node(pos, {name="xdecor:cauldron_soup", param2=node.param2})
+ end
+
+ local node_under = {x=pos.x, y=pos.y-1, z=pos.z}
+ if not minetest.get_node(node_under).name:find("fire") then
+ minetest.set_node(pos, {name="xdecor:cauldron_idle", param2=node.param2})
+ end
+ return true
+end
+
+function cauldron.take_soup(pos, node, clicker, itemstack)
+ local inv = clicker:get_inventory()
+ local wield_item = clicker:get_wielded_item()
+
+ if wield_item:get_name() == "xdecor:bowl" then
+ if wield_item:get_count() > 1 then
+ if inv:room_for_item("main", "xdecor:bowl_soup 1") then
+ itemstack:take_item()
+ inv:add_item("main", "xdecor:bowl_soup 1")
+ else
+ minetest.chat_send_player(clicker:get_player_name(),
+ "No room in your inventory to add a bowl of soup.")
+ return
+ end
+ else
+ itemstack:replace("xdecor:bowl_soup 1")
+ end
+