]> git.lizzy.rs Git - xdecor.git/blobdiff - cooking.lua
Craft guide : fix wrong param name on fields callback
[xdecor.git] / cooking.lua
index fe991345756f55797a599b4056f3d0485d68c752..c1213c7d065bd74e9d919cfaebe7a60f56167197 100644 (file)
@@ -1,17 +1,18 @@
-minetest.register_alias("xdecor:cauldron", "xdecor:cauldron_empty") -- legacy code
+-- Add more ingredients here that make a soup.
+local ingredients_list = {
+       "apple", "mushroom", "honey", "pumpkin", "egg", "bread", "meat",
+       "chicken", "carrot", "potato"
+}
 
 local cauldron_cbox = {
-       type = "fixed",
-       fixed = {
-               {-0.5, -0.5, -0.5, 0.5, 0.5, -0.5},
-               {-0.5, -0.5, 0.5, 0.5, 0.5, 0.5},
-               {-0.5, -0.5, -0.5, -0.5, 0.5, 0.5},
-               {0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-               {-0.5, -0.5, -0.5, 0.5, 0, 0.5}
-       }
+       {0,  0, 0,  16, 16, 0},
+       {0,  0, 16, 16, 16, 0},
+       {0,  0, 0,  0,  16, 16},
+       {16, 0, 0,  0,  16, 16},
+       {0,  0, 0,  16, 8,  16}
 }
 
-local function fill_water_bucket(pos, node, clicker, itemstack, _)
+local function fill_water_bucket(pos, node, clicker, itemstack)
        local wield_item = clicker:get_wielded_item():get_name()
        if wield_item == "bucket:bucket_empty" then
                minetest.set_node(pos, {name="xdecor:cauldron_empty", param2=node.param2})
@@ -26,7 +27,7 @@ xdecor.register("cauldron_empty", {
        on_rotate = screwdriver.rotate_simple,
        tiles = {"xdecor_cauldron_top_empty.png", "xdecor_cauldron_sides.png"},
        infotext = "Cauldron (empty)",
-       on_rightclick = function(pos, node, clicker, itemstack, _)
+       on_rightclick = function(pos, node, clicker, itemstack)
                local wield_item = clicker:get_wielded_item():get_name()
                if wield_item == "bucket:bucket_water" or
                                wield_item == "bucket:bucket_river_water" then
@@ -34,7 +35,7 @@ xdecor.register("cauldron_empty", {
                        itemstack:replace("bucket:bucket_empty")
                end
        end,
-       collision_box = cauldron_cbox
+       collision_box = xdecor.pixelbox(16, cauldron_cbox)
 })
 
 xdecor.register("cauldron_idle", {
@@ -43,7 +44,7 @@ xdecor.register("cauldron_idle", {
        tiles = {"xdecor_cauldron_top_idle.png", "xdecor_cauldron_sides.png"},
        drop = "xdecor:cauldron_empty",
        infotext = "Cauldron (idle)",
-       collision_box = cauldron_cbox,
+       collision_box = xdecor.pixelbox(16, cauldron_cbox),
        on_rightclick = fill_water_bucket
 })
 
@@ -58,7 +59,7 @@ xdecor.register("cauldron_boiling_water", {
                        animation = {type="vertical_frames", length=3.0} },
                "xdecor_cauldron_sides.png"
        },
-       collision_box = cauldron_cbox,
+       collision_box = xdecor.pixelbox(16, cauldron_cbox),
        on_rightclick = fill_water_bucket
 })
 
@@ -73,18 +74,26 @@ xdecor.register("cauldron_soup", {
                        animation = {type="vertical_frames", length=3.0} },
                "xdecor_cauldron_sides.png"
        },
-       collision_box = cauldron_cbox,
-       on_rightclick = function(pos, node, clicker, itemstack, _)
+       collision_box = xdecor.pixelbox(16, cauldron_cbox),
+       on_rightclick = function(pos, node, clicker, itemstack)
                local inv = clicker:get_inventory()
-               if clicker:get_wielded_item():get_name() == "xdecor:bowl" then
-                       if inv:room_for_item("main", "xdecor:bowl_soup 1") then
-                               itemstack:take_item()
-                               inv:add_item("main", "xdecor:bowl_soup 1")
-                               minetest.set_node(pos, {name="xdecor:cauldron_empty", param2=node.param2})
-                       else
-                               minetest.chat_send_player(clicker:get_player_name(),
+               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
+
+                       minetest.set_node(pos, {name="xdecor:cauldron_empty", param2=node.param2})
                        return itemstack
                end
        end
@@ -93,7 +102,7 @@ xdecor.register("cauldron_soup", {
 minetest.register_abm({
        nodenames = {"xdecor:cauldron_idle"},
        interval = 15, chance = 1,
-       action = function(pos, node, _, _)
+       action = function(pos, node)
                local below_node = {x=pos.x, y=pos.y-1, z=pos.z}
                if minetest.get_node(below_node).name:find("fire") then
                        minetest.set_node(pos, {name="xdecor:cauldron_boiling_water", param2=node.param2})
@@ -103,23 +112,23 @@ minetest.register_abm({
 
 minetest.register_abm({
        nodenames = {"xdecor:cauldron_boiling_water"},
-       interval = 3, chance = 1,
-       action = function(pos, node, _, _)
+       interval = 5, chance = 1,
+       action = function(pos, node)
                local objs = minetest.get_objects_inside_radius(pos, 0.5)
                if not objs then return end
 
                local ingredients = {}
-               local ingredients_list = {  -- Add more ingredients here that make a soup.
-                       "apple", "mushroom", "honey", "pumpkin", "egg", "bread",
-                       "meat", "chicken"
-               }
-
                for _, obj in pairs(objs) do
                        if obj and obj:get_luaentity() then
-                               local itemstring = obj:get_luaentity().itemstring:match("[%w_]+:([%w_]+)")
+                               local itemstring = obj:get_luaentity().itemstring:match(":([%w_]+)")
+                               if not next(ingredients) then
+                                       for _, rep in pairs(ingredients) do
+                                               if itemstring == rep then return end
+                                       end
+                               end
+
                                for _, ing in pairs(ingredients_list) do
-                                       if itemstring and itemstring:match(ing)
-                                                       and not minetest.serialize(ingredients):find(itemstring) then
+                                       if itemstring and itemstring:find(ing) then
                                                ingredients[#ingredients+1] = itemstring
                                        end
                                end
@@ -128,15 +137,13 @@ minetest.register_abm({
 
                if #ingredients >= 2 then
                        for _, obj in pairs(objs) do
-                               if obj and obj:get_luaentity() then
-                                       obj:remove()
-                               end
+                               if obj and obj:get_luaentity() then obj:remove() end
                        end
                        minetest.set_node(pos, {name="xdecor:cauldron_soup", param2=node.param2})
                end
 
-               local below_node = {x=pos.x, y=pos.y-1, z=pos.z}
-               if not minetest.get_node(below_node).name:find("fire") then
+               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
        end