Исправление События Повторения Анимации

From Valve Developer Community
Jump to: navigation, search
English

Введение

Этот урок не связан с прогнозом дублирования анимации. Этот урок связан с тем, что мы введём новый 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)