1 -- Minetest 0.4 mod: bucket
2 -- See README.txt for licensing and other information.
4 minetest.register_alias("bucket", "bucket:bucket_empty")
5 minetest.register_alias("bucket_water", "bucket:bucket_water")
6 minetest.register_alias("bucket_lava", "bucket:bucket_lava")
8 minetest.register_craft({
9 output = 'bucket:bucket_empty 1',
11 {'default:steel_ingot', '', 'default:steel_ingot'},
12 {'', 'default:steel_ingot', ''},
19 local function check_protection(pos, name, text)
20 if minetest.is_protected(pos, name) then
21 minetest.log("action", (name ~= "" and name or "A mod")
22 .. " tried to " .. text
23 .. " at protected position "
24 .. minetest.pos_to_string(pos)
26 minetest.record_protection_violation(pos, name)
32 -- Register a new liquid
33 -- source = name of the source node
34 -- flowing = name of the flowing node
35 -- itemname = name of the new bucket item (or nil if liquid is not takeable)
36 -- inventory_image = texture of the new bucket item (ignored if itemname == nil)
37 -- name = text description of the bucket item
38 -- groups = (optional) groups of the bucket item, for example {water_bucket = 1}
39 -- This function can be called from any mod (that depends on bucket).
40 function bucket.register_liquid(source, flowing, itemname, inventory_image, name, groups)
41 bucket.liquids[source] = {
46 bucket.liquids[flowing] = bucket.liquids[source]
48 if itemname ~= nil then
49 minetest.register_craftitem(itemname, {
51 inventory_image = inventory_image,
53 liquids_pointable = true,
55 on_place = function(itemstack, user, pointed_thing)
56 -- Must be pointing to node
57 if pointed_thing.type ~= "node" then
61 local node = minetest.get_node_or_nil(pointed_thing.under)
64 ndef = minetest.registered_nodes[node.name]
66 -- Call on_rightclick if the pointed node defines it
67 if ndef and ndef.on_rightclick and
68 user and not user:get_player_control().sneak then
69 return ndef.on_rightclick(
72 itemstack) or itemstack
75 local place_liquid = function(pos, node, source, flowing)
76 if check_protection(pos,
77 user and user:get_player_name() or "",
78 "place "..source) then
81 minetest.add_node(pos, {name=source})
84 -- Check if pointing to a buildable node
85 if ndef and ndef.buildable_to then
86 -- buildable; replace the node
87 place_liquid(pointed_thing.under, node,
90 -- not buildable to; place the liquid above
91 -- check if the node above can be replaced
92 local node = minetest.get_node_or_nil(pointed_thing.above)
93 if node and minetest.registered_nodes[node.name].buildable_to then
94 place_liquid(pointed_thing.above,
98 -- do not remove the bucket with the liquid
102 return {name="bucket:bucket_empty"}
108 minetest.register_craftitem("bucket:bucket_empty", {
109 description = "Empty Bucket",
110 inventory_image = "bucket.png",
112 liquids_pointable = true,
113 on_use = function(itemstack, user, pointed_thing)
114 -- Must be pointing to node
115 if pointed_thing.type ~= "node" then
118 -- Check if pointing to a liquid source
119 local node = minetest.get_node(pointed_thing.under)
120 local liquiddef = bucket.liquids[node.name]
121 local item_count = user:get_wielded_item():get_count()
124 and liquiddef.itemname ~= nil
125 and node.name == liquiddef.source then
126 if check_protection(pointed_thing.under,
127 user:get_player_name(),
128 "take ".. node.name) then
132 -- default set to return filled bucket
133 local giving_back = liquiddef.itemname
135 -- check if holding more than 1 empty bucket
136 if item_count > 1 then
138 -- if space in inventory add filled bucked, otherwise drop as item
139 local inv = user:get_inventory()
140 if inv:room_for_item("main", {name=liquiddef.itemname}) then
141 inv:add_item("main", liquiddef.itemname)
143 local pos = user:getpos()
144 pos.y = math.floor(pos.y + 0.5)
145 core.add_item(pos, liquiddef.itemname)
148 -- set to return empty buckets minus 1
149 giving_back = "bucket:bucket_empty "..tostring(item_count-1)
153 minetest.add_node(pointed_thing.under, {name="air"})
155 return ItemStack(giving_back)
160 bucket.register_liquid(
161 "default:water_source",
162 "default:water_flowing",
163 "bucket:bucket_water",
169 bucket.register_liquid(
170 "default:river_water_source",
171 "default:river_water_flowing",
172 "bucket:bucket_river_water",
173 "bucket_river_water.png",
174 "River Water Bucket",
178 bucket.register_liquid(
179 "default:lava_source",
180 "default:lava_flowing",
181 "bucket:bucket_lava",
186 minetest.register_craft({
188 recipe = "bucket:bucket_lava",
190 replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}},