HLFX.Ru Forum Страницы (10): « Первая ... « 5 6 7 8 [9] 10 »
Показать все 138 сообщений этой темы на одной странице

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:

Из того, что я понял, все предложенные выше фиксы чинили одно, но ломали что-то другое

__________________
PrimeXT
GoldSrc Monitor
SMD Splitter
mdl-flip (gFlip analog)
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";
7
cnt = 4;
8
break;

Внимательные зрители увидят, что массивчик чаров 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";
7
cnt = 4;
8
break;


Отправлено Дядя Миша 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
2
 
3
*****
4
 
5
m_flLastEventCheck = pev->frame; // вставить эту строчку в StudioFrameAdvance именно в это место
6
 
7
pev->frame += flInterval * m_flFrameRate * pev->framerate;
8
pev->animtime = gpGlobals->time;
9
 
10
*****
11
 
12
m_flLastEventCheck = 0; // в ResetSequenceInfo
13
 
14
*****
15
// этим кодом заменить весь код  в DispatchAnimEvents от коммента FIXME: I have to do this... до int index = 0;
16
float flStart = m_flLastEventCheck;
17
float flEnd = pev->frame;
18
 
19
if (flEnd >= 256 || flEnd < 0.0)
20
  m_fSequenceFinished = TRUE;
21
 
22
*****
23
// этот дурацкий хак вставить в GetAnimationEvent перед циклом for (; index < pseqdesc->numevents; index++)
24
if (!(pseqdesc->flags & STUDIO_LOOPING) && (int)flEnd == (pseqdesc->numframes - 2))
25
{
26
  flEnd += 1.0;
27
  ALERT(at_console, "GetAnimationEvent: flStart = flEnd (%f), correcting (%f)\n", flStart, flEnd);
28
}
29
 
30
// этим условием заменить условие if ( (pevent[index].frame >= flStart && pevent[index].frame < flEnd)...
31
 
32
bool bOverlapEvent = false;
33
 
34
if (pevent[index].event < EVENT_SCRIPTED)
35
  ALERT(at_console, "GetAnimationEvent: event = %i, start = %f, end = %f\n", pevent[index].event, flStart, flEnd);
36
 
37
if (pevent[index].frame >= flStart && pevent[index].frame < flEnd)
38
{
39
  bOverlapEvent = true;
40
}
41
// FIXME: doesn't work with animations being played in reverse
42
else if ((pseqdesc->flags & STUDIO_LOOPING) && flEnd < flStart)
43
{
44
  if (pevent[index].frame >= flStart || pevent[index].frame < flEnd)
45
  {
46
    bOverlapEvent = true;
47
  }
48
}
49
 
50
if (bOverlapEvent)

Говнокод, который убирает flInterval из DispatchAnimEvents. По идее, монстры должны соображать пошустрее.


Отправлено [CFR] B@N@N 18-08-2022 в 03:46:

Очень круто смотрится! Ждём подробный тутор.
Кстати, зомби тоже надо как-то улучшить. Их тупняки теперь становятся ещё более бросающимися в глаза.


А стрелять на бегу, как в свенкоопе, барник может?


Отправлено Aynekko 18-08-2022 в 08:04:

Цитата:
Ku2zoff писал:
Попробуй-ка вот так

Ты сам тестировал, как оно в целом? Я позже попробую посмотреть…

__________________
Мой мод на Xash


Временная зона GMT. Текущее время 14:56. Страницы (10): « Первая ... « 5 6 7 8 [9] 10 »
Показать все 138 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024