Исправление События Повторения Анимации
Введение
Этот урок не связан с прогнозом дублирования анимации. Этот урок связан с тем, что мы введём новый PlayerAnimState код в проект Orange Box SDK от 15 Июня 2009 года.
Введение PlayerAnimState даст большие изменения в управлении анимации игрока. Проблема заключается в том, что её выбросили и без того "грязного" кода анимаций, который включает в себя сотни вызовов функций в различных уровнях виртуализации...
Несмотря на всё это, в конце функции CaHL2MPPlayerAnimState :: DoAnimationEvent (...) есть небольшой подарок от Valve. Он делает анимацию View модели, совпадающей с моделью от третьего лица. Однако, проблема заключается в том, что Valve определяет сетевую переменную изменений, с помощью этих надоедливых "Parity" переменных, которые вы можете видеть везде, в частности m_nResetEventsParity.
Давайте немного вернемся назад, все оружие вызывают свою собственную анимацию ViewModel с функции SendWeaponAnim (...), а также увеличивает m_nResetEventsParity.
Сейчас анимация не играет дважды, потому что большинство вызовов оружия находятся в одном кадре и оно не посылает m_nNewSequenceParity поскольку последовательность не меняется. Тем не менее, в реальности получается, что m_nResetEventsParity изменилось, и это всё портит. Так как PlayerAnimState вызывается только на стороне клиента, он изменяет события "parity" (Иногда), прежде чем сервер обновлений его изменения, и именно поэтому получаются проблемы с анимацией.
Этот код, фактически, используется для вызова события анимации, на предсказание ViewModels других игроков (т.е. вспышки выстрелов и т.п., т.к. анимация работает правильно в вид от третьего лица). Дело в том, Valve не отфильтровали его для локального игрока, тем самым получается удвоение анимаций.
Требования
- Использовать новый OB SDK код
Решение проблемы
Просто добавьте фильтр для локального игрока в коде файла hl2mp_playeranimstate.cpp:
В функции CHL2MPPlayerAnimState::DoAnimationEvent(...)
#ifdef CLIENT_DLL
// Воспроизвести анимацию оружия
if ( iGestureActivity != ACT_INVALID && GetBasePlayer() != C_BasePlayer::GetLocalPlayer() ) // <-- ИЗМЕНЯЕМ ЗДЕСЬ
{
CBaseCombatWeapon *pWeapon = GetHL2MPPlayer()->GetActiveWeapon();
if ( pWeapon )
{
pWeapon->EnsureCorrectRenderingModel();
pWeapon->SendWeaponAnim( iGestureActivity );
// Force animation events!
pWeapon->ResetEventsParity(); // Сброс событий "parity" т.к. анимации будут происходить на оружие.
pWeapon->DoAnimationEvents( pWeapon->GetModelPtr() );
}
}
#endif
Примечания и Дальнейшая работа
Будущая версия SDK может решить эту проблему по-другому, а пока остается полагаться на этот код анимации игрока, который настроит анимацию viewmodel, вместо обработки анимаций оружия в определенной части кода (PrimaryAttack, Draw, Holster, и т.д..)
Это изменение уже присутствует в коде, сгенерированном с помощью "Start a Multiplayer mod from a template" в меню "Create a Mod Wizard".
Перевод --Slam12f 20:17, 12 May 2013 (PDT)