forked from luanti-org/minetest_game
		
	Bucket: Correct liquid placing in protected areas
- Placing liquid inside a protected area no longer returns an empty bucket - Remove on_place function, tidy up code, return proper itemstack - Shorten code (changes from HybridDog/patch-35)
This commit is contained in:
		| @@ -52,54 +52,57 @@ function bucket.register_liquid(source, flowing, itemname, inventory_image, name | ||||
| 			stack_max = 1, | ||||
| 			liquids_pointable = true, | ||||
| 			groups = groups, | ||||
|  | ||||
| 			on_place = function(itemstack, user, pointed_thing) | ||||
| 				-- Must be pointing to node | ||||
| 				if pointed_thing.type ~= "node" then | ||||
| 					return | ||||
| 				end | ||||
| 				 | ||||
|  | ||||
| 				local node = minetest.get_node_or_nil(pointed_thing.under) | ||||
| 				local ndef | ||||
| 				if node then | ||||
| 					ndef = minetest.registered_nodes[node.name] | ||||
| 				if not node then | ||||
| 					return | ||||
| 				end | ||||
| 				local ndef = minetest.registered_nodes[node.name] | ||||
| 				if not ndef then | ||||
| 					return | ||||
| 				end | ||||
|  | ||||
| 				-- Call on_rightclick if the pointed node defines it | ||||
| 				if ndef and ndef.on_rightclick and | ||||
| 				if ndef.on_rightclick and | ||||
| 				   user and not user:get_player_control().sneak then | ||||
| 					return ndef.on_rightclick( | ||||
| 						pointed_thing.under, | ||||
| 						node, user, | ||||
| 						itemstack) or itemstack | ||||
| 						itemstack) | ||||
| 				end | ||||
|  | ||||
| 				local place_liquid = function(pos, node, source, flowing) | ||||
| 					if check_protection(pos, | ||||
| 							user and user:get_player_name() or "", | ||||
| 							"place "..source) then | ||||
| 						return | ||||
| 					end | ||||
| 					minetest.add_node(pos, {name=source}) | ||||
| 				end | ||||
| 				local lpos | ||||
|  | ||||
| 				-- Check if pointing to a buildable node | ||||
| 				if ndef and ndef.buildable_to then | ||||
| 				if ndef.buildable_to then | ||||
| 					-- buildable; replace the node | ||||
| 					place_liquid(pointed_thing.under, node, | ||||
| 							source, flowing) | ||||
| 					lpos = pointed_thing.under | ||||
| 				else | ||||
| 					-- not buildable to; place the liquid above | ||||
| 					-- check if the node above can be replaced | ||||
| 					local node = minetest.get_node_or_nil(pointed_thing.above) | ||||
| 					if node and minetest.registered_nodes[node.name].buildable_to then | ||||
| 						place_liquid(pointed_thing.above, | ||||
| 								node, source, | ||||
| 								flowing) | ||||
| 					else | ||||
| 					lpos = pointed_thing.above | ||||
| 					local node = minetest.get_node_or_nil(lpos) | ||||
| 					if not node | ||||
| 					or not minetest.registered_nodes[node.name].buildable_to then | ||||
| 						-- do not remove the bucket with the liquid | ||||
| 						return | ||||
| 					end | ||||
| 				end | ||||
| 				return {name="bucket:bucket_empty"} | ||||
|  | ||||
| 				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") | ||||
| 			end | ||||
| 		}) | ||||
| 	end | ||||
|   | ||||
		Reference in New Issue
	
	Block a user