forked from luanti-org/minetest_game
		
	Mushroom spread: Optimise and make overridable
Move mushroom spread ABM action into a global and overridable function. Optimise spread code. Reduce spread range to reduce spread through walls.
This commit is contained in:
		| @@ -204,38 +204,34 @@ minetest.register_node("flowers:mushroom_brown", { | ||||
|  | ||||
| -- Mushroom spread and death | ||||
|  | ||||
| function flowers.mushroom_spread(pos, node) | ||||
| 	if minetest.get_node_light(pos, nil) == 15 then | ||||
| 		minetest.remove_node(pos) | ||||
| 		return | ||||
| 	end | ||||
| 	local positions = minetest.find_nodes_in_area_under_air( | ||||
| 		{x = pos.x - 1, y = pos.y - 2, z = pos.z - 1}, | ||||
| 		{x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}, | ||||
| 		{"group:soil", "group:tree"}) | ||||
| 	if #positions == 0 then | ||||
| 		return | ||||
| 	end | ||||
| 	local pos2 = positions[math.random(#positions)] | ||||
| 	pos2.y = pos2.y + 1 | ||||
| 	if minetest.get_node_light(pos, 0.5) <= 3 and | ||||
| 			minetest.get_node_light(pos2, 0.5) <= 3 then | ||||
| 		minetest.set_node(pos2, {name = node.name}) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	label = "Mushroom spread", | ||||
| 	nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"}, | ||||
| 	interval = 11, | ||||
| 	chance = 50, | ||||
| 	action = function(pos, node) | ||||
| 		if minetest.get_node_light(pos, nil) == 15 then | ||||
| 			minetest.remove_node(pos) | ||||
| 			return | ||||
| 		end | ||||
| 		local random = { | ||||
| 			x = pos.x + math.random(-2, 2), | ||||
| 			y = pos.y + math.random(-1, 1), | ||||
| 			z = pos.z + math.random(-2, 2) | ||||
| 		} | ||||
| 		local random_node = minetest.get_node_or_nil(random) | ||||
| 		if not random_node or random_node.name ~= "air" then | ||||
| 			return | ||||
| 		end | ||||
| 		local node_under = minetest.get_node_or_nil({x = random.x, | ||||
| 			y = random.y - 1, z = random.z}) | ||||
| 		if not node_under then | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| 		if (minetest.get_item_group(node_under.name, "soil") ~= 0 or | ||||
| 				minetest.get_item_group(node_under.name, "tree") ~= 0) and | ||||
| 				minetest.get_node_light(pos, 0.5) <= 3 and | ||||
| 				minetest.get_node_light(random, 0.5) <= 3 then | ||||
| 			minetest.set_node(random, {name = node.name}) | ||||
| 		end | ||||
| 	end | ||||
| 	chance = 150, | ||||
| 	action = function(...) | ||||
| 		flowers.mushroom_spread(...) | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user