-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
из-за моих усилий в этой теме, пытаясь объяснить, как все это работает, я все еще видел некоторые темы по этому вопросу, поэтому я решил выпустить некоторый код. точка этого кода восстанавливает, как сервер будет вычислять, когда ваш lbyt будет обновляться. так как клиентский сторонний аниматор должен обновляться каждый клиентский фрейм, серверная анимация сервера запускается на сервере fames, также известном как «тики» и «не обрабатывается», когда удушается. вы обычно запускаете этот код где-то после createmove, так как это то, где происходит обработка сервера. код также предполагает, что ваше curtime в этот момент является tickbase * ipt. к
Credits @wtfrdum
Спиздил с юц
Credits @wtfrdum
Спиздил с юц
Код:
void Animations::UpdateServerAnimations( ) {
bool allocate = ( m_serverAnimState == nullptr );
bool change = ( !allocate ) && ( local->GetRefEHandle( ) != m_ulEntHandle );
bool reset = ( !allocate && !change ) && ( local->m_flSpawnTime( ) != m_flSpawnTime );
// player changed, free old animation state.
if( change )
g_pMemAlloc->Free( m_serverAnimState );
// need to reset? (on respawn)
if( reset ) {
// reset animation state.
ResetAnimationState( m_serverAnimState );
// note new spawn time.
m_flSpawnTime = local->m_flSpawnTime( );
}
// need to allocate or create new due to player change.
if( allocate || change ) {
// only works with games heap alloc.
CCSGOPlayerAnimState* state = ( CCSGOPlayerAnimState* )g_pMemAlloc->Alloc( sizeof( CCSGOPlayerAnimState ) );
if( state != nullptr )
CreateAnimationState( state, local );
// used to detect if we need to recreate / reset.
m_ulEntHandle = local->GetRefEHandle( );
m_flSpawnTime = local->m_flSpawnTime( );
// note anim state for future use.
m_serverAnimState = state;
}
// run the animstate code how the server would too.
else if( !gClientState->m_nChokedCommands ) {
// back up some data to not mess with game..
UpdateAnimationState( m_serverAnimState, m_angRealAngle );
// restore that data..
// walking, delay next update by .22s.
if( m_serverAnimState->m_flSpeed > 0.1f )
m_flNextBodyUpdate = gpGlobals->curtime + 0.22f;
// calculate delta.
float delta = std::abs( Math::NormalizeAngle( m_angRealAngle - local->m_flLowerBodyYawTarget( ) ) );
// standing, update every 1.1s.
else if( delta > 35.f && gpGlobals->curtime > m_flNextBodyUpdate )
m_flNextBodyUpdate = gpGlobals->curtime + 1.1f;
}
}
void Animations::CreateAnimationState( CCSGOPlayerAnimState* state, Player* player ) {
using CreateAnimState_t = void( __thiscall* )( CCSGOPlayerAnimState*, Player* );
static auto CreateAnimState = ( CreateAnimState_t )0xca11ab1e;
if( !CreateAnimState )
return;
CreateAnimState( state, player );
}
void Animations::UpdateAnimationState( CCSGOPlayerAnimState* state, QAngle ang ) {
static auto UpdateAnimState = 0xca11ab1e;
if( !UpdateAnimState )
return;
__asm {
mov ecx, state
movss xmm1, dword ptr[ ang + 4 ]
movss xmm2, dword ptr[ ang ]
call UpdateAnimState
}
}
void Animations::ResetAnimationState( CCSGOPlayerAnimState* state ) {
using ResetAnimState_t = void( __thiscall* )( CCSGOPlayerAnimState* );
static auto ResetAnimState = ( ResetAnimState_t )0xca11ab1e;
if( !ResetAnimState )
return;
ResetAnimState( state );
}
Последнее редактирование: