float GetSpeedLimit(bool dir, int indx)
{
    if (BeginTrackSearch(dir))
    {
        GSTrackSearch SearchDirection = BeginTrackSearch(dir);
        Trackside TargetTrackside = GetTrackSideSpeedLimit(SearchDirection, indx);
        if (TargetTrackside)
        {
            if (TargetTrackside.GetSpeedLimit())
            {
                return TargetTrackside.GetSpeedLimit();
            }
        }
    }
    //Nothing found
    return -1.0;
}
int GetSignalAspectEx(bool dir, int indx)
{
    if (BeginTrackSearch(dir))
    {
        GSTrackSearch SearchDirection = BeginTrackSearch(dir);
        Trackside TargetTrackside = GetTrackSideSignal(SearchDirection, indx);
        if (TargetTrackside)
        {
            if (TargetTrackside != null)
            {
                return TargetTrackside.GetSignalStateEx();
            }
        }
    }
    //Nothing found
    return -1;
}
Trackside GetTrackSideSignal(GSTrackSearch SpeedObj, int index)
{
    Trackside foundTrackside;
    while (SpeedObj.SearchNextObject())
    {
        foundTrackside = cast < Signal > SpeedObj.GetObject();
        if (foundTrackside != null)
        {
            if (index == 0)
            {
                return foundTrackside;
            }
            else
            {
                index = index - 1;
            }
        }
    }
    //Nothing found
    return null;
}
Trackside GetTrackSideSpeedLimit(GSTrackSearch SpeedObj, int index)
{
    Trackside foundTrackside;
    while (SpeedObj.SearchNextObject())
    {
        foundTrackside = cast < Trackside > SpeedObj.GetObject();
        if ((int)foundTrackside.GetSpeedLimit() != 0)
        {
            if (index == 0)
            {
                return foundTrackside;
            }
            else
            {
                index = index - 1;
            }
        }
    }
    //Nothing found
    return null;
}