Смерть от Первого лица

Материал из Valve Developer Community
Перейти к: навигация, поиск
English (en)Deutsch (de)Español (es)Русский (ru)
... Icon-Important.png
Смерть от первого лица в игре HL2DM

В большинстве многопользовательских модов Source, после смерти вид от первого лица переключается на третье. Эти простые изменения кода, дадут возможность игроку видеть смерть от первого лица.

Необходимые условия

Для работы этого кода, ваша модель должна иметь attachment называемым eyes куда и будет установлена камера. По стандарту все human characters модели (человеческие модели) имеют этот attachment, но если на вашей модели его нет, то добавьте его через QC File и HLMV.

Изменения Кода

Код предназначен для 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)

Категория:Программирование