1 -- Add more ingredients here that make a soup.
2 local ingredients_list = {
3 "apple", "mushroom", "honey", "pumpkin", "egg", "bread", "meat",
4 "chicken", "carrot", "potato"
7 local cauldron_cbox = {
11 {16, 0, 0, 0, 16, 16},
15 local function fill_water_bucket(pos, node, clicker, itemstack)
16 local wield_item = clicker:get_wielded_item():get_name()
17 if wield_item == "bucket:bucket_empty" then
18 minetest.set_node(pos, {name="xdecor:cauldron_empty", param2=node.param2})
19 itemstack:replace("bucket:bucket_water")
24 xdecor.register("cauldron_empty", {
25 description = "Cauldron",
26 groups = {cracky=2, oddly_breakable_by_hand=1},
27 on_rotate = screwdriver.rotate_simple,
28 tiles = {"xdecor_cauldron_top_empty.png", "xdecor_cauldron_sides.png"},
29 infotext = "Cauldron (empty)",
30 on_rightclick = function(pos, node, clicker, itemstack)
31 local wield_item = clicker:get_wielded_item():get_name()
32 if wield_item == "bucket:bucket_water" or
33 wield_item == "bucket:bucket_river_water" then
34 minetest.set_node(pos, {name="xdecor:cauldron_idle", param2=node.param2})
35 itemstack:replace("bucket:bucket_empty")
38 collision_box = xdecor.pixelbox(16, cauldron_cbox)
41 xdecor.register("cauldron_idle", {
42 groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1},
43 on_rotate = screwdriver.rotate_simple,
44 tiles = {"xdecor_cauldron_top_idle.png", "xdecor_cauldron_sides.png"},
45 drop = "xdecor:cauldron_empty",
46 infotext = "Cauldron (idle)",
47 collision_box = xdecor.pixelbox(16, cauldron_cbox),
48 on_rightclick = fill_water_bucket
51 xdecor.register("cauldron_boiling_water", {
52 groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1},
53 on_rotate = screwdriver.rotate_simple,
54 drop = "xdecor:cauldron_empty",
55 infotext = "Cauldron (active) - Drop foods inside to make a soup",
56 damage_per_second = 2,
58 { name = "xdecor_cauldron_top_anim_boiling_water.png",
59 animation = {type="vertical_frames", length=3.0} },
60 "xdecor_cauldron_sides.png"
62 collision_box = xdecor.pixelbox(16, cauldron_cbox),
63 on_rightclick = fill_water_bucket
66 xdecor.register("cauldron_soup", {
67 groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1},
68 on_rotate = screwdriver.rotate_simple,
69 drop = "xdecor:cauldron_empty",
70 infotext = "Cauldron (active) - Use a bowl to eat the soup",
71 damage_per_second = 2,
73 { name = "xdecor_cauldron_top_anim_soup.png",
74 animation = {type="vertical_frames", length=3.0} },
75 "xdecor_cauldron_sides.png"
77 collision_box = xdecor.pixelbox(16, cauldron_cbox),
78 on_rightclick = function(pos, node, clicker, itemstack)
79 local inv = clicker:get_inventory()
80 local wield_item = clicker:get_wielded_item()
82 if wield_item:get_name() == "xdecor:bowl" then
83 if wield_item:get_count() > 1 then
84 if inv:room_for_item("main", "xdecor:bowl_soup 1") then
86 inv:add_item("main", "xdecor:bowl_soup 1")
88 minetest.chat_send_player(clicker:get_player_name(),
89 "No room in your inventory to add a bowl of soup!")
93 itemstack:replace("xdecor:bowl_soup 1")
96 minetest.set_node(pos, {name="xdecor:cauldron_empty", param2=node.param2})
102 minetest.register_abm({
103 nodenames = {"xdecor:cauldron_idle"},
104 interval = 15, chance = 1,
105 action = function(pos, node)
106 local below_node = {x=pos.x, y=pos.y-1, z=pos.z}
107 if minetest.get_node(below_node).name:find("fire") then
108 minetest.set_node(pos, {name="xdecor:cauldron_boiling_water", param2=node.param2})
113 minetest.register_abm({
114 nodenames = {"xdecor:cauldron_boiling_water"},
115 interval = 5, chance = 1,
116 action = function(pos, node)
117 local objs = minetest.get_objects_inside_radius(pos, 0.5)
118 if not objs then return end
120 local ingredients = {}
121 for _, obj in pairs(objs) do
122 if obj and obj:get_luaentity() then
123 local itemstring = obj:get_luaentity().itemstring:match(":([%w_]+)")
124 if not next(ingredients) then
125 for _, rep in pairs(ingredients) do
126 if itemstring == rep then return end
130 for _, ing in pairs(ingredients_list) do
131 if itemstring and itemstring:find(ing) then
132 ingredients[#ingredients+1] = itemstring
138 if #ingredients >= 2 then
139 for _, obj in pairs(objs) do
140 if obj and obj:get_luaentity() then obj:remove() end
142 minetest.set_node(pos, {name="xdecor:cauldron_soup", param2=node.param2})
145 local node_under = {x=pos.x, y=pos.y-1, z=pos.z}
146 if not minetest.get_node(node_under).name:find("fire") then
147 minetest.set_node(pos, {name="xdecor:cauldron_idle", param2=node.param2})