private void ProcessItem(BufferItem item, ushort targetNode, ushort segmentID, ref NetSegment segment, byte connectOffset, int laneIndex, uint lane)
{
if ((segment.m_flags & (NetSegment.Flags.PathFailed | NetSegment.Flags.Flooded)) != NetSegment.Flags.None)
{
return;
}
NetManager instance = Singleton<NetManager>.instance;
NetInfo info = segment.Info;
NetInfo info2 = instance.m_segments.m_buffer[(int)item.m_position.m_segment].Info;
int num = info.m_lanes.Length;
float num2;
byte offset;
if (segmentID == item.m_position.m_segment)
{
Vector3 b = instance.m_lanes.m_buffer[(int)((UIntPtr)item.m_laneID)].CalculatePosition((float)connectOffset * 0.003921569f);
Vector3 a = instance.m_lanes.m_buffer[(int)((UIntPtr)lane)].CalculatePosition((float)connectOffset * 0.003921569f);
num2 = Vector3.Distance(a, b);
offset = connectOffset;
}
else
{
NetInfo.Direction direction = (targetNode != segment.m_startNode) ? NetInfo.Direction.Forward : NetInfo.Direction.Backward;
Vector3 b2 = instance.m_lanes.m_buffer[(int)((UIntPtr)item.m_laneID)].CalculatePosition((float)connectOffset * 0.003921569f);
Vector3 a2;
if ((byte)(direction & NetInfo.Direction.Forward) != 0)
{
a2 = instance.m_lanes.m_buffer[(int)((UIntPtr)lane)].m_bezier.d;
}
else
{
a2 = instance.m_lanes.m_buffer[(int)((UIntPtr)lane)].m_bezier.a;
}
num2 = Vector3.Distance(a2, b2);
offset = (byte)(((direction & NetInfo.Direction.Forward) == 0) ? 0 : 255);
}
float num3 = 1f;
float num4 = 1f;
NetInfo.LaneType laneType = NetInfo.LaneType.None;
if ((int)item.m_position.m_lane < info2.m_lanes.Length)
{
uint l = instance.m_segments.m_buffer[(int)item.m_position.m_segment].m_lanes;
for (int n = 0; l != 0 && n < (int)item.m_position.m_lane; ++n)
l = instance.m_lanes.m_buffer[l].m_nextLane;
NetInfo.Lane lane2 = info2.m_lanes[(int)item.m_position.m_lane];
num3 = LaneManager.GetLaneSpeed(l, lane2);
laneType = lane2.m_laneType;
if ((byte)(laneType & (NetInfo.LaneType.Vehicle | NetInfo.LaneType.TransportVehicle)) != 0)
{
laneType = (NetInfo.LaneType.Vehicle | NetInfo.LaneType.TransportVehicle);
}
num4 = this.CalculateLaneSpeed(connectOffset, item.m_position.m_offset, ref instance.m_segments.m_buffer[(int)item.m_position.m_segment], lane2, l);
}
float averageLength = instance.m_segments.m_buffer[(int)item.m_position.m_segment].m_averageLength;
float num5 = (float)Mathf.Abs((int)(connectOffset - item.m_position.m_offset)) * 0.003921569f * averageLength;
float num6 = item.m_methodDistance + num5;
float num7 = item.m_comparisonValue + num5 / (num4 * this.m_maxLength);
if (laneIndex < num)
{
NetInfo.Lane lane3 = info.m_lanes[laneIndex];
BufferItem item2;
item2.m_position.m_segment = segmentID;
item2.m_position.m_lane = (byte)laneIndex;
item2.m_position.m_offset = offset;
if ((byte)(lane3.m_laneType & laneType) == 0)
{
item2.m_methodDistance = 0f;
}
else
{
if (item.m_methodDistance == 0f)
{
num7 += 100f / (0.25f * this.m_maxLength);
}
item2.m_methodDistance = num6 + num2;
}
if (lane3.m_laneType != NetInfo.LaneType.Pedestrian || item2.m_methodDistance < 1000f)
{
item2.m_comparisonValue = num7 + num2 / ((num3 + LaneManager.GetLaneSpeed(lane, lane3)) * 0.25f * this.m_maxLength);
if ((segment.m_flags & NetSegment.Flags.Invert) != NetSegment.Flags.None)
{
item2.m_direction = NetInfo.InvertDirection(lane3.m_finalDirection);
}
else
{
item2.m_direction = lane3.m_finalDirection;
}
if (lane == this.m_startLaneA)
{
if (((byte)(item2.m_direction & NetInfo.Direction.Forward) == 0 || item2.m_position.m_offset < this.m_startOffsetA) && ((byte)(item2.m_direction & NetInfo.Direction.Backward) == 0 || item2.m_position.m_offset > this.m_startOffsetA))
{
return;
}
float num8 = this.CalculateLaneSpeed(this.m_startOffsetA, item2.m_position.m_offset, ref segment, lane3, lane);
float num9 = (float)Mathf.Abs((int)(item2.m_position.m_offset - this.m_startOffsetA)) * 0.003921569f;
item2.m_comparisonValue += num9 * segment.m_averageLength / (num8 * this.m_maxLength);
}
if (lane == this.m_startLaneB)
{
if (((byte)(item2.m_direction & NetInfo.Direction.Forward) == 0 || item2.m_position.m_offset < this.m_startOffsetB) && ((byte)(item2.m_direction & NetInfo.Direction.Backward) == 0 || item2.m_position.m_offset > this.m_startOffsetB))
{
return;
}
float num10 = this.CalculateLaneSpeed(this.m_startOffsetB, item2.m_position.m_offset, ref segment, lane3, lane);
float num11 = (float)Mathf.Abs((int)(item2.m_position.m_offset - this.m_startOffsetB)) * 0.003921569f;
item2.m_comparisonValue += num11 * segment.m_averageLength / (num10 * this.m_maxLength);
}
item2.m_laneID = lane;
item2.m_lanesUsed = (item.m_lanesUsed | lane3.m_laneType);
this.AddBufferItem(item2, item.m_position);
}
}
}