Aynekko писал: Ага. Проверил со всех сторон. Партикли возникают, если барник находится в районе 32 юнитов от центра. Со всех сторон, если смотреть на виде сверху. Ставил его на расстоянии 31-32-33 по всем осям. Высота всегда была одинаковая - 3 юнита от пола. Интересно. Наверное, какая-то движковая особенность.
А можешь скопировать карту из jmf в rmf и скомпилить? (надо только убедиться, что координаты те же и барник по-прежнему около центра). Для меня это внезапно исправило проблему. Может, что-то не так с геометрией в jmf?
Прикладываю зипник с jmf, rmf и сгенеренными из них .map файлами.
Добавлено 23-12-2021 в 04:04:
Update: на карте скомпиленной из rmf тоже воспроизводится всё-таки. Где-то я накосячил при проверке.
Похоже проблема действительно в тестовом хулле, как и предположил Дядя Миша, и проявляется только если нод граф ещё не создан.
Ради теста выставил в CTestHull::Spawn pev->solid = SOLID_NOT, перекомпилировал карту, чтобы у вызвать перегенерацию графа, и проблема исчезла.
Возможный фикс - создавать тестовый хулл с SOLID_NOT и менять солидность на SOLID_SLIDEBOX в CTestHull::DropDelay
Вложение: nodetest-map.zip (55.5 кб)
Этот файл был скачан 149 раз.
В общем там в матчлибе я не объявил в хидере новую функцию. И потом когда я ее использовал в коде, парой строчек ниже там была эта VectorAngles которая и стала давать порченый результат.
Не могу никак побороть баг с лучом трипмины. На другом конце карты есть одна трипмина, луч у нее активируется через 2.5 секунды. Естественно не в PVS. Вот две ситуации:
1) Через 5 сек вылетаю с ноуклипом, лечу туда. Луч есть.
2) Лечу к месту трипмины по карте, НЕ вылетая за ее пределы, чтобы не задеть PVS мины раньше времени. Прилетел к мине, луча нет.
Изредка бывает, что во второй ситуации луч таки есть. Процентов 10.
На клиенте есть функция R_AddEntity, где проверка на ET_BEAM. Когда луча не видно, эта проверка не срабатывает. Значит луч не приходит на клиент вообще.
EF_SKIPPVS я завел, чтобы пропускать ENGINE_CHECK_VISIBILITY.
И вот опять ситуации:
1) спавнюсь на карте. Через 2.5 секунды клиент рапортует, что нашел луч. ОК.
2) перехожу с другой карты на эту. После перехода через 2.5 секунды клиент видит луч. ОК.
3) перехожу с другой карты на эту. После перехода через 2.5 секунды клиент НЕ видит луч. ???
Я не понимаю, от чего вообще это зависит. Даже пропуск PVS не помогает (трипмине я тоже ставил).
И ведь почему-то с env_laser таких проблем никогда не было.
В общем решил, что я смогу обхитрить мину и завел ей спаунфлаг "стартовать выключенной", чтобы активировать по триггеру (по тихому и без звуков), когда игрок гарантированно будет в PVS. И это не сработало
- спавнюсь, лечу к мине ноуклипом, запускаю - луч есть;
- спавнюсь, лечу к мине по карте, не вылетая за пределы карты. Вижу ее в прямой видимости, активирую. Луча НЕТ. MakeBeam срабатывает - вывел в консоль. А луча нет... Делаю сейврестор, луч появляется.
Это какой-то несусветный бред. Если раньше я мог хоть идентифицировать где багуется примерно, то сейчас я даже примерно не могу понять, что не так.
Добавлено 25-01-2022 в 22:25:
Но вот одну деталь обнаружил. Спавнюсь и сразу же делаю сейврестор. То есть мина еще не успела сделать луч. И о чудо, луч есть всегда. Вроде как. Еще потестю.
Добавлено 25-01-2022 в 22:29:
Да, так и есть.
Я вот знаком с ситуацией, когда что-то не работает после сейврестора. Но чтобы не работало до сейврестора - это просто вау.
Aynekko не знаю, связано ли это с твоей проблемой, но порядок строк в AddToFullPack сначала отсекает энтитю по PVS, а потом уже задаёт ей тип ENTITY_BEAM. Который, скорее всего, особым образом обрабатывается движком.
C++ Source Code:
1
// Ignore if not the host and not touching a PVS/PAS leaf
2
// If pSet is NULL, then the test will always succeed and the entity will be added to the update
3
if ( ent != host )
4
{
5
if ( !ENGINE_CHECK_VISIBILITY( (conststruct edict_s *)ent, pSet ) )
6
{
7
return 0;
8
}
9
}
Ниже такой код:
C++ Source Code:
1
state->entityType = ENTITY_NORMAL;
2
3
// Flag custom entities.
4
if ( ent->v.flags & FL_CUSTOMENTITY )
5
{
6
state->entityType = ENTITY_BEAM;
7
}
Попробуй назначение state->entityType разместить перед ENGINE_CHECK_VISIBILITY.
Ещё момент. Как ты используешь новый спаунфлаг "стартовать выключенной"? При установленном флаге не срабатывает PowerupThink? А по триггеру ты уже запускаешь этот тчинк?
Карту можешь скинуть? Хочу проверить, есть ли подобный баг у меня.
Ku2zoff писал: Попробуй назначение state->entityType разместить перед ENGINE_CHECK_VISIBILITY.
Я писал об этом в посте до этого, ставил проверку и лучу и мине для пропуска этого условия.
Цитата:
Ku2zoff писал: При установленном флаге не срабатывает PowerupThink? А по триггеру ты уже запускаешь этот тчинк?
Именно так. m_flPowerUp ставлю при этом 0, чтобы луч появился моментально.
В общем, я разобрал свою карту по брашам и сузил проблему. Если игрок заденет trigger_once до того, как активируется луч мины - луча не будет. Сделал тестовую карту - мина на стене в прямой видимости, спаун игрока находится внутри trigger_once. Триггер полностью пустой. Он ничего не активирует.
Сразу стоит сказать, что проблема только в моем моде. В ванильном ксашмоде или голде такого не наблюдается. Так что буду искать косяк.
Ну а ситуации такие:
- игрок спавнится в пустом trigger_once. Мина включается, и луча нет.
- спавн в trigger_once, у него стоит галка No clients. Луч появляется.
- спавн в trigger_push. Луч есть.
- спавн вне trigger_once. Триггер не трогаю. Луч есть. Трогаю триггер, бегаю по карте, убегаю из PVS мины, луч есть, все ОК.
- спавн вне trigger_once. Перед зарядом мины трогаю триггер. Луч не появляется.
- спавн в trigger_multiple. Луч есть.
ну что же, будем искать.
Добавлено 26-01-2022 в 12:00:
Проблема в этом:
C++ Source Code:
REMOVE_ENTITY(ENT(pev));
trigger_once удаляет сам себя. Стал тестить дальше, у меня есть команда ent_delete, запускающая UTIL_Remove по таргетнейму. Если я удаляю триггер, то луч не появляется. А вот если удаляю func_wall или точечную энтитю, то все норм. Ухх, капец.
Добавлено 26-01-2022 в 12:27:
Нашел баг. Недавно в CreateBaseline фиксили недостающую строчку
C++ Source Code:
baseline->effects = entity->v.effects;
Убрал ее и бага больше нет. Вопрос знатокам. Какого?
Да, баг больше не проявляется. Надеюсь правильно поставил
C++ Source Code:
1
if ( player )
2
{
3
baseline->mins = player_mins;
4
baseline->maxs = player_maxs;
5
// ... и далее
6
}
7
else
8
{
9
baseline->mins = entity->v.mins;
10
baseline->maxs = entity->v.maxs;
11
baseline->sequence = entity->v.sequence;
12
baseline->colormap = entity->v.colormap;
13
baseline->modelindex = entity->v.modelindex;
14
baseline->movetype = entity->v.movetype;
15
if( playermodelindex == 0 )
16
baseline->effects = entity->v.effects;
17
// ...
Добавлено 26-01-2022 в 14:49:
Вообще, очень странный баг, это ж надо было. И как я его отрыть еще смог)) пришлось все карту очистить от энтитей, пока не сузил проблему до триггеров)