HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Кажется, я починил DispatchAnimEvents (https://hlfx.ru/forum/showthread.php?threadid=5590)
Отправлено Sigurth 31-03-2021 в 18:14:
Aynekko Да, это ты правильно сделал. Я тоже эти строчки у себя убрал. Лучше и ACT_CROUCH тоже закомменти, у меня какая-то бесячая ситуация была в поведении грантов, и комментирование этой стройки ее исправило. Кажется, дело было в автоматной очереди. Да, вспомнил. У меня в моде гранты не используют звуки автоматной очереди. Вместо этого они используют три раза звук одиночной стрельбы. И иногда TASK_PLAY_SEQUENCE_FACE_ENEMY сбивал их очередь своей анимацией, что выглядело некрасиво. И было заметно по звукам. Короче, автоматные очереди иногда обрывались тупым стоянием или сидением
__________________
Никогда не поздно сделать мод под хл1
Отправлено Aynekko 31-03-2021 в 18:24:
Sigurth, тогда получается, что они у тебя вообще никогда не приседают?
__________________
Мой мод на Xash
Отправлено Sigurth 31-03-2021 в 18:30:
Aynekko Приседают. Я раньше тоже думал, что эта активность нужна, чтобы перевести их в сидячее положение, но нет. Ведь самой анимации приседания у грантов нет. Есть только анимация стрельбы уже в приседе и анимация бездействия тоже в приседе. А визуальный присед происходит благодаря интерполяции.
__________________
Никогда не поздно сделать мод под хл1
Отправлено Дядя Миша 31-03-2021 в 18:35:
Цитата:
Aynekko писал:
В Task_t tlGruntRangeAttack1B[] нужно закомментить
Какие-то тупняки весьма вероятно были введены самой вальвой, чтобы дать игрокам больше шансов, особенно трактористам.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Ku2zoff 02-04-2021 в 14:46:
Дядя Миша авторы свенкоопа эти тупняки убрали. Так что в него вообще, в этот свен, играть невозможно из-за поднятого хп монстров до конских величин. Одно из двух - либо жырные, тупые и медленные монстры, как в ку2, либо шустрые и умные, но слабенькие.
Отправлено Дядя Миша 02-04-2021 в 15:10:
Самая идея, что один человек может завалить несколько сотен противников идёт вразрез с реальностью. Тут либо условность, как в дефматче, где просто начинается новый раунд. Либо сама игра не предполагает, что все друг-друга отстреливают. Ну взять тот же сталкер, там тебя если в коробочку зажмут, даже бронька не спасёт. Лучше лишний раз не нарываться.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Ku2zoff 02-04-2021 в 15:24:
Цитата:
Дядя Миша писал:
там тебя если в коробочку зажмут, даже бронька не спасёт.
Сталкер в этом плане хорош, я всегда кемперю и отстреливаю противников из укрытия. Есть у тамошних НПС одна поганая особенность: стоит игроку открыть PDA или инвентарь, они активно начинают пытаться зайти к нему с тыла. Стоит просто встать где-то на уровне и ничего не делать, они будут топтаться туда-сюда, но не выходить на линию прямой видимости. В этом случае очень помогает встать в угол спиной, и тогда можно хоть полчаса копаться в инвентаре или пда.
Добавлено 02-04-2021 в 22:24:
Где-то я читал, что в сталкере прям специально написан такой код, что НПС пытаются обойти игрока, и зайти с тыла. В общем, это логично. Но вот то, что это чаще происходит при открытом инвентаре, капец как накаляет.
Отправлено SNMetamorph 13-08-2022 в 02:04:
Ну так что, у кого-то в итоге получилось проблему решить окончательно?
Добавлено 13-08-2022 в 06:04:
Из того, что я понял, все предложенные выше фиксы чинили одно, но ломали что-то другое
__________________
Мой сайт
Xash3D Modding Discord
Отправлено Ku2zoff 13-08-2022 в 10:48:
SNMetamorph ни у кого не получилось. Серверный фпс в халфе плавает в зависимости от фпс, выдаваемого на мониторе. Дядя Миша писал, что фиксация серверного фпс на определённом уровне должна помочь. Архитектура движка не позволяет. При фпс 20 монстры тчинкают каждые 2 кадра (pev->nextthink + 0.1). При фпс 60 - каждые 6 кадров и т.д. Если подумать и вспомнить, что скрипты на карте gruntbattledemo в спирите работают нормально при фпс 50, то интервал в 5 кадров тоже может быть подходящим значением. Вопрос в том, почему эвенты проскакивают на высоких фпс, ведь временной интервал остаётся прежним: 0.1 секунды? Дело наверное в ограниченной точности флоатов. Изучать проблему надо под ксашем, крутя квар sv_fps.
Добавлено 13-08-2022 в 15:19:
Позапускал gruntbattledemo под голдсорсом и ксашем. С fps_max 60, 50, 40, 20 и sv_fps 60, 50, 40, 20 соответственно. Ну что сказать? Результаты одинаковые, при 50 и ниже рассинхрона скриптов почти нет. Ключевое слово почти. Нужен фикс поворота монстров по yaw. Я где-то про него читал, он нужен для исправления очень медленных поворотов при фпс выше 100. Так вот, при очень низких фпс монстры тоже медленнее поворачиваются, и паузы между секвенциями становятся больше. Нужно найти эту связь фпс с интервалами тчинков и отловов эвентов и сделать какую-то поправку в зависимости от фреймтайма, я думаю. Буду штудировать вопрос.
Добавлено 13-08-2022 в 17:48:
Собрал спирит 1.9 2022 студией. Нашёл в нём неприятный баг, приводящий к вылету в финале gruntbattledemo. С оригинальными дллками я просто на это забил, было пофиг. Но с дллками для теста отдебажил. Monsters.cpp, в районе строки 2736:
C++ Source Code:
1 | default: // default NPC sounds |
2 | fvol = fWalking ? 0.2 : 0.5; |
3 | rgsz[0] = "common/npc_step1.wav"; |
4 | rgsz[1] = "common/npc_step2.wav"; |
5 | rgsz[0] = "common/npc_step3.wav"; |
6 | rgsz[1] = "common/npc_step4.wav"; |
Внимательные зрители увидят, что массивчик чаров rgsz[4] в этом кейсе заполнен не полностью, только rgsz[0] и rgsz[1], а количество cnt указано 4. В результате, в EMIT_SOUND_DYN вместо строчки с именем сэмпла прилетает чёрти что из памяти, и движок радостно крэшится. Исправляется так:
C++ Source Code:
1 | default: // default NPC sounds |
2 | fvol = fWalking ? 0.2 : 0.5; |
3 | rgsz[0] = "common/npc_step1.wav"; |
4 | rgsz[1] = "common/npc_step2.wav"; |
5 | rgsz[2] = "common/npc_step3.wav"; |
6 | rgsz[3] = "common/npc_step4.wav"; |
Отправлено Дядя Миша 15-08-2022 в 16:42:
sv_fps можно использовать при одном условии - вы его включаете и делаете с ним игру. Не меняя.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Ku2zoff 16-08-2022 в 19:01:
Итак. Всё становится интереснее. Вернулся сегодня к изучению проблемы. Выяснилось, что при fps_max 50 скрипт на gruntbattledemo ломается
А при fps_max 60 работает. Ну как работает? Я его идеально работающим никогда не видел, но предполагаю, что последовательность такая:
1. Грант идёт и говорит "Чек ё зон, овэр."
2. Слышит зомби и останавливается.
3. Поворачивается и говорит "Сёр, ай хир самсинг."
4. Видит первого зомби, орёт "Богис, май сектор!!!" и стреляет. (В это время из помоев вылезает второй зомби).
5. Первый зомби умирает, автомат гранта даёт осечку, второй зомби опрокидывает гранта, и тот кричит "Оу!!!"
6. Грант встаёт, орёт "Ю а хиэ!!!" и бежит к выходу.
7. Натыкается у выхода на третьего зомби, орёт "Гад дэм!!!", и разворачивается.
8. Добегает до второго зомби, опрокидывает его на вентилятор и убегает перезаряжать автомат.
9. Дальнейшее нас не интересует, т.к. скрипт всегда ломается гораздо раньше, на шагах 5-8.
Так вот, низкие значения fps приводят к запаздыванию между секвенциями и поздним разворотам, а высокие к тому, что монстры наоборот успевают развернуться быстрее, эвенты играются чаще, и скрипт ломается. Если сложить всё вместе, получается, что DispatchAnimEvents играет эвенты чаще на высоких fps.
Поискав в коде, можно узнать, что сперва вызывается StudioFrameAdvance, а затем DispatchAnimEvents. Для большинства монстров это так. Но не для Нихиланта и тентаклей. Почему так сделано, хз.
Пока у меня нет идей, возможно стоит выставлять условие m_fSequenceFinished только в одной из функций. Логично, что это StudioFrameAdvance, но поскольку интервалы проверки эвентов завязаны на gpGlobals->time, может возникнуть ситуация, когда m_fSequenceFinished будет уже TRUE, а DispatchAnimEvents ещё не отработала, и эвент будет пропущен. Если же условие переместить в DispatchAnimEvents, ситуация будет обратной: StudioFrameAdvance уже прокрутит секвенцию повторно, а m_fSequenceFinished будет ещё FALSE, и эвент будет продублирован. Засунуть весь код в одну функцию никак нельзя: переключение активностей у монстров находится между вызовами этих функций.
Отправлено Aynekko 16-08-2022 в 19:05:
Ku2zoff что насчет вот этого эксперимента? Я тогда пытался заморочиться…
https://hlfx.ru/forum/showthread.ph...6614#post206614
__________________
Мой мод на Xash
Отправлено Ku2zoff 17-08-2022 в 18:17:
Aynekko это не выход. Попробуй-ка вот так:
C++ Source Code:
1 | DEFINE_FIELD(CBaseMonster, m_flLastEventCheck, FIELD_FLOAT), // поменять тип на FIELD_FLOAT |
5 | m_flLastEventCheck = pev->frame; // вставить эту строчку в StudioFrameAdvance именно в это место |
7 | pev->frame += flInterval * m_flFrameRate * pev->framerate; |
8 | pev->animtime = gpGlobals->time; |
12 | m_flLastEventCheck = 0; // в ResetSequenceInfo |
15 | // этим кодом заменить весь код в DispatchAnimEvents от коммента FIXME: I have to do this... до int index = 0; |
16 | float flStart = m_flLastEventCheck; |
17 | float flEnd = pev->frame; |
19 | if (flEnd >= 256 || flEnd < 0.0) |
20 | m_fSequenceFinished = TRUE; |
23 | // этот дурацкий хак вставить в GetAnimationEvent перед циклом for (; index < pseqdesc->numevents; index++) |
24 | if (!(pseqdesc->flags & STUDIO_LOOPING) && (int)flEnd == (pseqdesc->numframes - 2)) |
27 | ALERT(at_console, "GetAnimationEvent: flStart = flEnd (%f), correcting (%f)\n", flStart, flEnd); |
30 | // этим условием заменить условие if ( (pevent[index].frame >= flStart && pevent[index].frame < flEnd)... |
32 | bool bOverlapEvent = false; |
34 | if (pevent[index].event < EVENT_SCRIPTED) |
35 | ALERT(at_console, "GetAnimationEvent: event = %i, start = %f, end = %f\n", pevent[index].event, flStart, flEnd); |
37 | if (pevent[index].frame >= flStart && pevent[index].frame < flEnd) |
41 | // FIXME: doesn't work with animations being played in reverse |
42 | else if ((pseqdesc->flags & STUDIO_LOOPING) && flEnd < flStart) |
44 | if (pevent[index].frame >= flStart || pevent[index].frame < flEnd) |
Говнокод, который убирает flInterval из DispatchAnimEvents. По идее, монстры должны соображать пошустрее.
Отправлено [CFR] B@N@N 18-08-2022 в 03:46:
Очень круто смотрится! Ждём подробный тутор.
Кстати, зомби тоже надо как-то улучшить. Их тупняки теперь становятся ещё более бросающимися в глаза.
А стрелять на бегу, как в свенкоопе, барник может?
Отправлено Aynekko 18-08-2022 в 08:04:
Цитата:
Ku2zoff писал:
Попробуй-ка вот так
Ты сам тестировал, как оно в целом? Я позже попробую посмотреть…__________________
Мой мод на Xash