init.lua 5.04 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- Minetest 0.4 mod: bucket
-- See README.txt for licensing and other information.

minetest.register_alias("bucket", "bucket:bucket_empty")
minetest.register_alias("bucket_water", "bucket:bucket_water")
minetest.register_alias("bucket_lava", "bucket:bucket_lava")

minetest.register_craft({
	output = 'bucket:bucket_empty 1',
	recipe = {
		{'default:steel_ingot', '', 'default:steel_ingot'},
		{'', 'default:steel_ingot', ''},
	}
})

bucket = {}
bucket.liquids = {}

Novatux's avatar
Novatux committed
19
20
local function check_protection(pos, name, text)
	if minetest.is_protected(pos, name) then
21
		minetest.log("action", (name ~= "" and name or "A mod")
Novatux's avatar
Novatux committed
22
23
24
25
26
27
28
29
30
31
			.. " tried to " .. text
			.. " at protected position "
			.. minetest.pos_to_string(pos)
			.. " with a bucket")
		minetest.record_protection_violation(pos, name)
		return true
	end
	return false
end

32
-- Register a new liquid
33
34
35
36
37
38
--    source = name of the source node
--    flowing = name of the flowing node
--    itemname = name of the new bucket item (or nil if liquid is not takeable)
--    inventory_image = texture of the new bucket item (ignored if itemname == nil)
--    name = text description of the bucket item
--    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
42
43
44
45
46
47
48
49
50
51
52
53
	bucket.liquids[source] = {
		source = source,
		flowing = flowing,
		itemname = itemname,
	}
	bucket.liquids[flowing] = bucket.liquids[source]

	if itemname ~= nil then
		minetest.register_craftitem(itemname, {
			description = name,
			inventory_image = inventory_image,
			stack_max = 1,
			liquids_pointable = true,
54
			groups = groups,
55

56
57
58
59
60
			on_place = function(itemstack, user, pointed_thing)
				-- Must be pointing to node
				if pointed_thing.type ~= "node" then
					return
				end
61

62
				local node = minetest.get_node_or_nil(pointed_thing.under)
63
				local ndef = node and minetest.registered_nodes[node.name]
64

Zeg9's avatar
Zeg9 committed
65
				-- Call on_rightclick if the pointed node defines it
66
				if ndef and ndef.on_rightclick and
67
68
69
70
				   user and not user:get_player_control().sneak then
					return ndef.on_rightclick(
						pointed_thing.under,
						node, user,
71
						itemstack)
Zeg9's avatar
Zeg9 committed
72
				end
73

74
				local lpos
75
76

				-- Check if pointing to a buildable node
77
				if ndef and ndef.buildable_to then
78
					-- buildable; replace the node
79
					lpos = pointed_thing.under
80
81
82
				else
					-- not buildable to; place the liquid above
					-- check if the node above can be replaced
83

84
					lpos = pointed_thing.above
85
					node = minetest.get_node_or_nil(lpos)
86
87
88
					local above_ndef = node and minetest.registered_nodes[node.name]

					if not above_ndef or not above_ndef.buildable_to then
89
						-- do not remove the bucket with the liquid
90
						return itemstack
91
92
					end
				end
93
94
95
96
97
98
99
100
101

				if check_protection(lpos, user
						and user:get_player_name()
						or "", "place "..source) then
					return
				end

				minetest.set_node(lpos, {name = source})
				return ItemStack("bucket:bucket_empty")
102
103
104
105
106
107
			end
		})
	end
end

minetest.register_craftitem("bucket:bucket_empty", {
ShadowNinja's avatar
ShadowNinja committed
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
	description = "Empty Bucket",
	inventory_image = "bucket.png",
	stack_max = 99,
	liquids_pointable = true,
	on_use = function(itemstack, user, pointed_thing)
		-- Must be pointing to node
		if pointed_thing.type ~= "node" then
			return
		end
		-- Check if pointing to a liquid source
		local node = minetest.get_node(pointed_thing.under)
		local liquiddef = bucket.liquids[node.name]
		local item_count = user:get_wielded_item():get_count()

		if liquiddef ~= nil
		and liquiddef.itemname ~= nil
		and node.name == liquiddef.source then
			if check_protection(pointed_thing.under,
					user:get_player_name(),
					"take ".. node.name) then
				return
			end

			-- default set to return filled bucket
			local giving_back = liquiddef.itemname

			-- check if holding more than 1 empty bucket
			if item_count > 1 then

				-- if space in inventory add filled bucked, otherwise drop as item
				local inv = user:get_inventory()
				if inv:room_for_item("main", {name=liquiddef.itemname}) then
					inv:add_item("main", liquiddef.itemname)
				else
					local pos = user:getpos()
					pos.y = math.floor(pos.y + 0.5)
144
					minetest.add_item(pos, liquiddef.itemname)
ShadowNinja's avatar
ShadowNinja committed
145
146
147
148
149
150
151
152
153
154
155
156
				end

				-- set to return empty buckets minus 1
				giving_back = "bucket:bucket_empty "..tostring(item_count-1)

			end

			minetest.add_node(pointed_thing.under, {name="air"})

			return ItemStack(giving_back)
		end
	end,
157
158
159
160
161
162
163
})

bucket.register_liquid(
	"default:water_source",
	"default:water_flowing",
	"bucket:bucket_water",
	"bucket_water.png",
164
165
166
167
168
169
170
171
172
173
174
	"Water Bucket",
	{water_bucket = 1}
)

bucket.register_liquid(
	"default:river_water_source",
	"default:river_water_flowing",
	"bucket:bucket_river_water",
	"bucket_river_water.png",
	"River Water Bucket",
	{water_bucket = 1}
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
)

bucket.register_liquid(
	"default:lava_source",
	"default:lava_flowing",
	"bucket:bucket_lava",
	"bucket_lava.png",
	"Lava Bucket"
)

minetest.register_craft({
	type = "fuel",
	recipe = "bucket:bucket_lava",
	burntime = 60,
	replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}},
})
191