тов. Кутузов где-то упоминал, что этот скрипт в спирите 1.7 перестал работать правильно. Поскольку я как раз занимаюсь портирование спирита под ксаш движок, я естественно обратил на это внимание.
Я поставил спирит 1.0 после чего выяснилось, что и там тоже этот скрипт работает неправильно. Более того - я хорошо помню что в версии 1.0 еще в далеком 2002 году все отлично пахало. Сменилась лишь версия халфы, да комп стал помощнее. Ну на халфу я думать не стал, вряд ли бы там этот код трогали. А вот то что фпс раньше был ниже - это факт.
Проверить легко - пишем в консоли fps_max 35 - и скрипт снова становится рабочим. Зачем я это написал?
Чтобы сэкономить время тем кто пытается его исправить в коде.
Там в другом дело.
Добавлено 08-03-2010 в 17:11:
Upd: хотя в спирите 1.7 его плющит вообще не подетски.
Спустя год возвращаюсь к этой теме. Итак мои исследования показали следующую интересную вещь:
В спирите есть такая кондиция как вызов цели по окончании проигрывания секвенции. Эта кондиция срабатывает раз-через-раз, причем поначалу определить причину несрабатывания было крайне тяжело. Суть была в том, что скриптед_секвенция упорно крутилась по кругу, даже если её об этом не просили. То есть можно было задать секвенцию и она выполнялась бы раз 8-10, а потом (внезапно!) останавливалсь бы. В связи с эти всплыл еще один оч. интересный баг, когда DROP_TO_FLOOR при выполнении секвенции начинает двигать монстра не вниз, а вбок. Я наивно полагал что это чисто ксашевский баг, однако оказалось, что и в халфе он тоже присутствует, просто реже проявляется. Итак вернемся к нашим баранам:
При выполнении секвенции корректно отловить момент её завершения мешает волшебная строчка m_fSequenceFinished = FALSE; в DispatchAnimEvents. Прикол к том, что сбрасываться она должна только в ResetSequenceInfo, а никак не с каждым вызовом DispatchAnimEvents.
Почему её воткнули туда - для меня загадка. Возможно она как-то влияет на геймплей и на работу AI в целом. Если у кого-то из вас есть немного свободного времени - пожалуйста протестируйте работу халфы, да и спирита. закомментировав эту строчку, конкретнее вот:
файл animating.cpp
C++ Source Code:
1
{
2
MonsterEvent_t event;
3
4
void *pmodel = GET_MODEL_PTR( ENT(pev) );
5
6
if ( !pmodel )
7
{
8
ALERT( at_aiconsole, "Gibbed monster is thinking!\n" );
9
return;
10
}
11
12
// FIXME: I have to do this or some events get missed, and this is probably causing the problem below
Мои беглые исследования показали что удаление этой строчки полностью излечивает скрипт на gruntbattledemo от глюков и багов при ЛЮБОМ fps_max. Но возможны какие-то негативные влияния в других областях, в частности баг с DropToFloor (см. демокарту).
В чём он заключается и почему проявляется я расскажу пожжы, если кому-то это станет интересно.
Добавлено 02-10-2011 в 17:18:
К слову сказать этой строчки нет в hl2, как еще одно подтверждение того, что я двигался в правильном направлении.
Вложение: spirit.rar (28.1 кб)
Этот файл был скачан 723 раз. Дядя Миша проверил это вложение на вирусы 02-10-2011 в 11:13
Дядя Миша хм. странно. что закоментированная что не закоментированная у меня скрипт неправильно работает (только если выставить fps_max 50 работает всегда верно)