mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	Fix liquid_range
* Prevent graphical glitches on old servers * Fix flowing of liquids with viscosity != 1 and range != 8 * Fix range = 0, no flowing nodes will appear
This commit is contained in:
		@@ -395,7 +395,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 | 
			
		||||
				l = getInteriorLight(n, 0, data);
 | 
			
		||||
			video::SColor c = MapBlock_LightColor(f.alpha, l, decode_light(f.light_source));
 | 
			
		||||
			
 | 
			
		||||
			u8 range = rangelim(nodedef->get(c_flowing).liquid_range, 0, 8);
 | 
			
		||||
			u8 range = rangelim(nodedef->get(c_flowing).liquid_range, 1, 8);
 | 
			
		||||
 | 
			
		||||
			// Neighbor liquid levels (key = relative position)
 | 
			
		||||
			// Includes current node
 | 
			
		||||
@@ -429,7 +429,11 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 | 
			
		||||
					if(n2.getContent() == c_source)
 | 
			
		||||
						level = (-0.5+node_liquid_level) * BS;
 | 
			
		||||
					else if(n2.getContent() == c_flowing){
 | 
			
		||||
						u8 liquid_level = (n2.param2&LIQUID_LEVEL_MASK) - (LIQUID_LEVEL_MAX+1-range);
 | 
			
		||||
						u8 liquid_level = (n2.param2&LIQUID_LEVEL_MASK);
 | 
			
		||||
						if (liquid_level <= LIQUID_LEVEL_MAX+1-range)
 | 
			
		||||
							liquid_level = 0;
 | 
			
		||||
						else
 | 
			
		||||
							liquid_level -= (LIQUID_LEVEL_MAX+1-range);
 | 
			
		||||
						level = (-0.5 + ((float)liquid_level+ 0.5) / (float)range * node_liquid_level) * BS;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2136,6 +2136,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
 | 
			
		||||
		content_t new_node_content;
 | 
			
		||||
		s8 new_node_level = -1;
 | 
			
		||||
		s8 max_node_level = -1;
 | 
			
		||||
		u8 range = rangelim(nodemgr->get(liquid_kind).liquid_range, 0, LIQUID_LEVEL_MAX+1);
 | 
			
		||||
		if ((num_sources >= 2 && nodemgr->get(liquid_kind).liquid_renewable) || liquid_type == LIQUID_SOURCE) {
 | 
			
		||||
			// liquid_kind will be set to either the flowing alternative of the node (if it's a liquid)
 | 
			
		||||
			// or the flowing alternative of the first of the surrounding sources (if it's air), so
 | 
			
		||||
@@ -2145,6 +2146,8 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
 | 
			
		||||
			// liquid_kind is set properly, see above
 | 
			
		||||
			new_node_content = liquid_kind;
 | 
			
		||||
			max_node_level = new_node_level = LIQUID_LEVEL_MAX;
 | 
			
		||||
			if (new_node_level < (LIQUID_LEVEL_MAX+1-range))
 | 
			
		||||
				new_node_content = CONTENT_AIR;
 | 
			
		||||
		} else {
 | 
			
		||||
			// no surrounding sources, so get the maximum level that can flow into this node
 | 
			
		||||
			for (u16 i = 0; i < num_flows; i++) {
 | 
			
		||||
@@ -2185,8 +2188,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
 | 
			
		||||
			} else
 | 
			
		||||
				new_node_level = max_node_level;
 | 
			
		||||
 | 
			
		||||
			u8 range = rangelim(nodemgr->get(liquid_kind).liquid_range, 0, LIQUID_LEVEL_MAX+1);
 | 
			
		||||
			if (new_node_level >= (LIQUID_LEVEL_MAX+1-range))
 | 
			
		||||
			if (max_node_level >= (LIQUID_LEVEL_MAX+1-range))
 | 
			
		||||
				new_node_content = liquid_kind;
 | 
			
		||||
			else
 | 
			
		||||
				new_node_content = CONTENT_AIR;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user