Source SDK

Source SDK

Not enough ratings
Смерть от 1 лица C++
By Effluvia
Следующее простое изменение кода позволяет дать игроку возможность погибать от первого лица.
Проверено на Source SDK 2007 и MP | При использовании Visual Studio 2008
   
Award
Favorite
Favorited
Unfavorite
Предисловие
Информация расписанная снизу принадлежит Valve
Моя задача была - перевод на русский язык | адаптация к Steam


Демонстрация Кода
Код
Начало
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: Don't use first person view when we are very close to something 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_MAX, 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 также включен, код автоматически переключается на третье лицо.
Мелкие проблемы
Камера
Иногда при смерти камера может попасть за стену и вы увидите не приятное зрелище.
Вы можете так-же изменить размер в коде что-бы избежать подобные случаи