Ru/First Person Ragdolls

В большинстве многопользовательских модов Source, после смерти вид от первого лица переключается на третье. Эти простые изменения кода, дадут возможность игроку видеть смерть от первого лица.
== Необходимые условия ==
Для работы этого кода, ваша модель должна иметь attachment называемым eyes куда и будет установлена камера. По стандарту все human characters модели (человеческие модели) имеют этот attachment, но если на вашей модели его нет, то добавьте его через и .
== Изменения Кода==
Код предназначен для HL2DM но должен работать с другими модами, при небольшом изменение кода.
=== c_hl2mp_player.cpp ===
Т.к. этот код относиться к клиенту, делаем изменения в файле client\hl2mp\c_hl2mp_player.cpp.
Первым делом добавим консольную команду включения и отключения смерти от первого лица. Это следует разместить в верхнюю часть файла, с аналогичными консольными командами:
static ConVar cl_fp_ragdoll ( "cl_fp_ragdoll", "1", FCVAR_ARCHIVE, "Allow first person ragdolls" );
static ConVar cl_fp_ragdoll_auto ( "cl_fp_ragdoll_auto", "1", FCVAR_ARCHIVE, "Autoswitch to ragdoll thirdperson-view when necessary" );
Следующий шаг, это редактирование функцииCalcView. Эта функция проверяет, если игрок мертв. Если да, то переключаемся на вид от третьего лица. Добавляем наш код, вид от первого лица:
void C_HL2MP_Player::CalcView( Vector &eyeOrigin, QAngle &eyeAngles, float &zNear, float &zFar, float &fov )
{
	// if we're dead, we want to deal with first or third person ragdolls.
	if ( m_lifeState != LIFE_ALIVE && !IsObserver() )
	{
		// First person ragdolls
		if ( cl_fp_ragdoll.GetBool() && m_hRagdoll.Get() )
		{
			// pointer to the ragdoll
			C_HL2MPRagdoll *pRagdoll = (C_HL2MPRagdoll*)m_hRagdoll.Get();
			// gets its origin and angles
			pRagdoll->GetAttachment( pRagdoll->LookupAttachment( "eyes" ), eyeOrigin, eyeAngles );
			Vector vForward; 
			AngleVectors( eyeAngles, &vForward );
			if ( cl_fp_ragdoll_auto.GetBool() )
			{
				// DM: отключаем вид от первого лица, когда камера близко к поверхности чего либо (Slam12f)
				trace_t tr;
				UTIL_TraceLine( eyeOrigin, eyeOrigin + ( vForward * 10000 ), MASK_ALL, pRagdoll, COLLISION_GROUP_NONE, &tr );
				if ( (!(tr.fraction < 1) || (tr.endpos.DistTo(eyeOrigin) > 25)) )
					return;
			}
			else
				return;
		}
		eyeOrigin = vec3_origin;
		eyeAngles = vec3_angle;
		Vector origin = EyePosition();
		IRagdoll *pRagdoll = GetRepresentativeRagdoll();
		if ( pRagdoll )
		{
			origin = pRagdoll->GetRagdollOrigin();
			origin.z += VEC_DEAD_VIEWHEIGHT.z; // look over ragdoll, not through
		}
		BaseClass::CalcView( eyeOrigin, eyeAngles, zNear, zFar, fov );
		eyeOrigin = origin;
		Vector vForward; 
		AngleVectors( eyeAngles, &vForward );
		VectorNormalize( vForward );
		VectorMA( origin, -CHASE_CAM_DISTANCE, vForward, eyeOrigin );
		Vector WALL_MIN( -WALL_OFFSET, -WALL_OFFSET, -WALL_OFFSET );
		Vector WALL_MAX( WALL_OFFSET, WALL_OFFSET, WALL_OFFSET );
		trace_t trace; // clip against world
		// HACK don't recompute positions while doing RayTrace
		C_BaseEntity::EnableAbsRecomputations( false );
		UTIL_TraceHull( origin, eyeOrigin, WALL_MIN, WALL_MAX, MASK_SOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &trace );
		C_BaseEntity::EnableAbsRecomputations( true );
		if (trace.fraction < 1.0)
		{
			eyeOrigin = trace.endpos;
		}
		return;
	}
	BaseClass::CalcView( eyeOrigin, eyeAngles, zNear, zFar, fov );
}
Когда cl_fp_ragdoll_auto включён, код автоматически включает вид от третьего лица, когда камера находиться вблизи какой-либо поверхности.
== Незначительные проблемы ==
Иногда, можно заметить, что вы можете видеть сквозь стены пол и т.п. Это происходит потому-что камера находится слишком близко к поверхности.
Часто это встречается в стандартных моделях HL2, голова которых слишком свободна в движение. Это можно устранить путём редактирования "веса" физической модели (1) и ограничениях движения головы (2), чтобы падение выглядело более естественно. Также можно сделать головную часть физической модели немного больше, около носа и бровей. Это часто помогает остановить attachment от проникновения в поверхность.
*1 - Скорее всего речь идёт о весе кости.
*2 - Имеется ввиду уменьшение наклона кости.
Перевод: --Slam12f 21:18, 9 May 2013 (PDT)