X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=cooking.lua;h=c1213c7d065bd74e9d919cfaebe7a60f56167197;hb=883338867f430f5fe895f19be931efea4916bae9;hp=43c83316c5a25250879b6105fec483bf5b82e4da;hpb=c479ec57daf8a4a19f8ca392bae0ca1f51ae3113;p=xdecor.git diff --git a/cooking.lua b/cooking.lua index 43c8331..c1213c7 100644 --- a/cooking.lua +++ b/cooking.lua @@ -1,23 +1,33 @@ -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 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}) + itemstack:replace("bucket:bucket_water") + end +end + + xdecor.register("cauldron_empty", { description = "Cauldron", groups = {cracky=2, oddly_breakable_by_hand=1}, 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 @@ -25,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", { @@ -34,7 +44,8 @@ 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 }) xdecor.register("cauldron_boiling_water", { @@ -48,7 +59,8 @@ 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 }) xdecor.register("cauldron_soup", { @@ -62,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 @@ -82,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}) @@ -92,35 +112,38 @@ minetest.register_abm({ minetest.register_abm({ nodenames = {"xdecor:cauldron_boiling_water"}, - interval = 3, chance = 1, - action = function(pos, node, _, _) - local objs = nil - local ingredients = {} - objs = minetest.get_objects_inside_radius(pos, 0.5) + 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 = {} for _, obj in pairs(objs) do if obj and obj:get_luaentity() then - local itemstring = obj:get_luaentity().itemstring:match("([%w_:]+)%s") - if itemstring and not minetest.serialize(ingredients):find(itemstring) and - (itemstring:find("apple") or itemstring:find("mushroom") or - itemstring:find("honey") or itemstring:find("pumpkin")) then - ingredients[#ingredients+1] = itemstring + 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:find(ing) then + ingredients[#ingredients+1] = itemstring + end end end end 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