-
Автор темы
- #1
1. Tracing
Мы можем использовать этот метод, потому что при трейсинге используется реальное расстояние в игре.
2. Animlayers
Сделать ресольвер этим методом правильно будет очень сложно. Мы буквально должны зашпиндолить леер на эту матрицу, иначе у вас ниче не получится
3 - Stand
6 - Move
12 - Animation layer lean
14 and 15 - Not used
Пример:
Мы можем использовать этот метод, потому что при трейсинге используется реальное расстояние в игре.
C++:
CGameTrace trace;
CTraceFilter filter;
filter.pSkip = g_ctx.local();
float LeftSide = animstate->m_flEyeYaw - 60.0f;
float RightSide = animstate->m_flEyeYaw + 60.0f;
Vector m_vecDirectionLeft, m_vecDirectionRight;
Vector m_vecDesyncLeft(0.0f, LeftSide, 0.0f);
Vector m_vecDesyncRight(0.0f, RightSide, 0.0f);
math::angle_vectors(m_vecDesyncLeft, m_vecDirectionLeft);
math::angle_vectors(m_vecDesyncRight, m_vecDirectionRight);
const auto m_vecSrc = g_ctx.local()->get_shoot_position();
const auto m_vecLeftSrc = m_vecSrc + (m_vecDesyncLeft * 8192.f);
const auto m_vecRightSrc = m_vecSrc + (m_vecDesyncRight * 8192.f);
m_trace()->TraceRay(Ray_t(m_vecSrc, m_vecLeftSrc), MASK_ALL, (ITraceFilter*)&filter, &trace);
float m_flLeftFraction = trace.fraction;
m_trace()->TraceRay(Ray_t(m_vecSrc, m_vecRightSrc), MASK_ALL, (ITraceFilter*)&filter, &trace);
float m_flRightFraction = trace.fraction;
if (m_flLeftFraction > m_flRightFraction)
animstate->m_flGoalFeetYaw = RightSide;
else
animstate->m_flGoalFeetYaw = LeftSide;
2. Animlayers
Сделать ресольвер этим методом правильно будет очень сложно. Мы буквально должны зашпиндолить леер на эту матрицу, иначе у вас ниче не получится
3 - Stand
6 - Move
12 - Animation layer lean
14 and 15 - Not used
Пример:
C++:
if ( record->m_pEntity->m_vecVelocity ( ).length_2d ( ) <= 0.1)
{
float difference = AngleDiff ( eyeYaw, record->animstate->m_flFootYaw );
desyncSide = 2 * difference <= 0.0f ? 1 : -1;
}
else
{
if ( previousrecord && !( ( int ) record->animationLayers [ ANIMATION_LAYER_LEAN ].weight * 1000.f ) && ( ( int ) record->animationLayers [ ANIMATION_LAYER_MOVEMENT_MOVE ].weight * 1000.f ) == ( ( int ) previousrecord->animationLayers [ ANIMATION_LAYER_MOVEMENT_MOVE ].weight * 1000.f ) )
{
auto processedAnimationSpeed = abs ( record->animationLayers [ ANIMATION_LAYER_MOVEMENT_MOVE ].fPlaybackRate - record->processedLayer [ ANIMATION_LAYER_MOVEMENT_MOVE ].fPlaybackRate );
auto positiveAnimationSpeed = abs ( record->animationLayers [ ANIMATION_LAYER_MOVEMENT_MOVE ].fPlaybackRate - record->lerpedLayerPositive [ ANIMATION_LAYER_MOVEMENT_MOVE ].fPlaybackRate );
auto negativeAnimationSpeed = abs ( record->animationLayers [ ANIMATION_LAYER_MOVEMENT_MOVE ].fPlaybackRate - record->lerpedLayerNegative [ ANIMATION_LAYER_MOVEMENT_MOVE ].fPlaybackRate );
if ( processedAnimationSpeed < positiveAnimationSpeed || negativeAnimationSpeed <= positiveAnimationSpeed || ( signed int ) ( float ) ( positiveAnimationSpeed * 1000.0 ) )
{
if ( processedAnimationSpeed >= negativeAnimationSpeed && positiveAnimationSpeed > negativeAnimationSpeed && !( signed int ) ( float ) ( negativeAnimationSpeed * 1000.0 ) )
{
desyncSide = 1;
}
}
else
{
desyncSide = -1;
}
}
}
Последнее редактирование: