HLFX.Ru Forum Страницы (2): « 1 [2]
Показать все 3184 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Нубские вопросы от <censored> и других нубов (https://hlfx.ru/forum/showthread.php?threadid=4535)


Отправлено hgrunt_2020 19-10-2021 в 21:26:

Перегрев

Я тут запил перегрев оружия, и думаю, может сделать из этого нубо-тутор?
Собсна демонстрация онного https://youtu.be/xZpEV5QODLQ

__________________
новицек в с++


Отправлено Ku2zoff 20-10-2021 в 00:02:

hgrunt_2020 а где коронное "Пацаны, я маслину поймал!"? Непорядок
Ну а почему нет? Выложи, мб кому-то пригодится.


Отправлено hgrunt_2020 20-10-2021 в 04:52:

Цитата:
Ku2zoff писал:
hgrunt_2020 а где коронное "Пацаны, я маслину поймал!"? Непорядок

Ну дык это не сталкер а метро

__________________
новицек в с++


Отправлено hgrunt_2020 21-10-2021 в 09:20:

На вью модели можно регулировать кости?

А на вью модели можно регулировать кости? ну контролировать, как голову у нпс, мне для индикатора надо.
Если да то как контролировать эту кость?

__________________
новицек в с++


Отправлено Дядя Миша 21-10-2021 в 11:32:

При сборке модели очевидно надо создать контроллер кости.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено hgrunt_2020 21-10-2021 в 11:33:

Дядя Миша
это да, но как это сделать в коде, на модели то я уже сделал контролер

__________________
новицек в с++


Отправлено Ku2zoff 21-10-2021 в 12:39:

hgrunt_2020 проверить m_pCurrentEntity на вьюмодель, а потом крутить у этой энтити контроллер. Положение контроллера слать на клиент пользовательской мессагой. Наверное, для вьмоделей можно даже сделать блендинг между анимациями. Например, чтобы не было резкого перехода между idle/fidget и reload.


Отправлено hgrunt_2020 26-10-2021 в 02:43:

Ku2zoff
Даже интересно стало про блендинг анимаций на вью модели

__________________
новицек в с++


Отправлено Ku2zoff 26-10-2021 в 09:37:

hgrunt_2020 у cl_entity_t есть структуры entity_state_t и latchedvars_t. В первых (baseline, prevstate, curstate) хранятся данные, получаемые по сети с сервера. Секвенции, позиции бонеконтроллеров и всякое прочее. Во второй структуре (latched) хранится почти то же самое, но с некоторой задержкой, то есть на текущий кадр информация уже устаревшая. Не знаю с какой задержкой, это надо глядеть сорцы ксашдвижка. (А вообще, в StudioSetupBones эта задержка указана: m_pCurrentEntity->latched.sequencetime + 0.2, 0.2 секунды) Так вот, StudioModelRenderer смешивает (to blend) актуальную анимацию с устаревшей, усредняя (to interpolate) положения костей. Именно поэтому мы видим плавные переходы между анимациями у монстров. Для вьюмоделей это не сделано за ненадобностью, потому что не особо режет глаз. Теоретически, можно самостоятельно, своими шаловливыми ручками заполнять latched для вьюмодели в текущем кадре, а в следующем делать интерполяцию в StudioSetupBones. Насколько мне известно, движок этого не делает.


Отправлено Дядя Миша 26-10-2021 в 14:32:

Цитата:
Ku2zoff писал:
хранится почти то же самое, но с некоторой задержкой

Там не задержка. Оно там лежит сколько угодно, пока его не перезапишут.

Цитата:
Ku2zoff писал:
заполнять latched для вьюмодели в текущем кадре, а в следующем делать интерполяцию в StudioSetupBones

Не надо. Омерзительно выглядит.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено [CFR] [email protected]@N 28-10-2021 в 13:52:

Значит задача такая есть 2 модели с одинаковым скелетов но разным порядком костей. Ну и короче мне надо чтобы пересадить анимации с одной модели на вторую и возникает такой вопрос - Как можно свапать кости подскажите или может бытт есть прога для этого?


Отправлено Ku2zoff 28-10-2021 в 14:40:

Если милка импортирует анимации некорректно, стоит попробовать во фрагмоушене.


Отправлено [CFR] [email protected]@N 28-10-2021 в 15:02:

Нет дело не в милке так как это изначально модели с разным порядком костей.

Добавлено 28-10-2021 в 18:02:

Потому что одна модель из одного мода а другая из другово и имеет другие анимации и иной порядок костей
Типа кости ног в одной имеют номера 3, 4, 5 а во второй они уже где-то в конце и там 28,29,30
Ну и если так компиляции делать то анимация выкручивает эти ноги под не естественым углом


Отправлено Crystallize 30-10-2021 в 15:29:

Поиграл в SWAT Remastered от Aynekko, там встречается странный баг когда на определённых брашах, мировых, фонарик не рисуется. Там же рядом есть лифт который едет рывками если на нем убить слишком много солдатиков (они в итоге проваливаются насквозь и тогда он едет) но это-то как раз известно, я думаю.

__________________
Вас приветствует персональная защитная система "САХАРА". Для работы в Средах Агрессивного ХАРАктера.
nofunallowed щас инди это по сути синоним "экзотическая игра где будет сказка и грустно


Отправлено FreeSlave 01-11-2021 в 09:07:

Наверняка многие замечали, что trigger_hurt не воздействует на стоящих на месте монстров. Собственно, с чем это связано, и какие есть варианты решения?

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Дядя Миша 01-11-2021 в 10:04:

Потому что триггеры действуют наоборот. В функции LinkEdict есть аргумент touch_triggers. Таким образом это не триггер ищет всё, что попало в его область, а наоборот - монстр или любой другой предмет делают шаг, вызывается LinkEdict и проверяется попадание в триггер.
А для стоящего на месте монстра UTIL_SetOrigin не вызывается, т.к. это бессмысленно. Вот и не работают триггеры. С игроком дело другое - там это каждый кадр вызывается.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено FreeSlave 01-11-2021 в 13:31:

Да, точно, помню такое.
А есть ли способ проверить как-то с другой стороны? В Sven Co-op например реализован флаг "Affect non-moving NPC's": https://sites.google.com/site/svenm...de/trigger_hurt

Можно в think проверять какую-нибудь область на наличие монстров и их дамажить, но trigger_hurt то может быть любой формы. Одним UTIL_EntitiesInBox не обойдешься. Есть ли в HL способ мануально проверить, что энтитя находится в области другой брашевой энтити?

Добавлено 01-11-2021 в 16:31:

Проверил реализацию в Sven Co-op - там просто проверяется, что находится в Bounding Box. Т.е. если сделать полый trigger_hurt и внутрь поставить монстра, его тоже будет дамажить.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Дядя Миша 01-11-2021 в 13:39:

Цитата:
FreeSlave писал:
А есть ли способ проверить как-то с другой стороны?

Не усложняй. Просто вызывай для монстров UTIL_SetOrigin каждый Think.
То что ты хочешь реально нужно только для быстролетящих предметов, типа стрелы арбалета, которая действительно может пролететь тонкий триггер не коснуться его.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено FreeSlave 05-11-2021 в 10:09:

Дядя Миша, хмм, попробовал с UTIL_SetOrigin( pev, pev->origin ) в MonsterThink, ничего не поменялось.
Карта с примером в аттаче.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Дядя Миша 05-11-2021 в 10:48:

Может вызываешь не оттуда?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено FreeSlave 05-11-2021 в 11:17:

Дядя Миша, а там большой выбор? Вот изменение https://github.com/FreeSlave/hlsdk-...4b9b852949f54a9

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Дядя Миша 05-11-2021 в 12:50:

Пихни алерт в MonsterTouch и посмотри, вызывается ли оно.
И если да, то с каким эдиктом в качестве pOther.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено FreeSlave 05-11-2021 в 13:48:

Дядя Миша, добавил в CTalkMonster::Touch. На trigger_hurt не вызывается.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Дядя Миша 05-11-2021 в 14:31:

в trigger_hurt тоже сделай проверку.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Aynekko 08-11-2021 в 21:18:

Можно ли передать на клиент отрицательный iuser(1-4)? Столкнулся с тем, что приходит 0. Положительное число видит.

__________________
Мой мод на Xash


Отправлено Ku2zoff 08-11-2021 в 21:34:

Aynekko попробуй увеличить количество бит в delta.lst до 8. Как, например, у sequence и gaitsequence. Там точно и стопудово приходят отрицательные значения.


Отправлено Aynekko 08-11-2021 в 21:55:

Ku2zoff спасибо, что откликнулся, в entity encode у меня уже стоит 16, 1.0 у всех iuser. Но даже число -3 не проходит, пишет ноль. Больше нуля выставляю сразу все четко. Если это важно, то ставлю iuser3 в спаун солдата, на карте только я и солдат, пустая коробка. Пишу 555, вижу на клиенте 555, пишу отрицалку вижу ноль...

__________________
Мой мод на Xash


Отправлено Ku2zoff 09-11-2021 в 06:15:

Aynekko тогда не знаю, в чём дело. Поступи по-другому. Вместо отрицательных чисел используй какой-нибудь диапазон. Например, в качестве положительных 1-255, а в качестве отрицательных 256-511. То есть, у тебя на клиенте проверка была

C++ Source Code:
if (entity->curstate.iuser4 < 0)

а стала
C++ Source Code:
if (entity->curstate.iuser4 > 256)

Ну или
C++ Source Code:
if (entity->curstate.iuser4 > 256)
  entity->curstate.iuser4 = 256 - entity->curstate.iuser4;

Таким образом ты уже на клиенте получишь отрицательное число.

В AddToFullPack иузеры вписаны? Где они из энтварсов передаются в entity_state?

Добавлено 09-11-2021 в 13:15:

Щас глянул в сорцы ксаш мода, а они там все уже заняты, кроме iuser4:
C++ Source Code:
state->iuser1	 = ent->v.iuser1; // flags
state->iuser2	 = ent->v.iuser2; // flags
state->iuser3	 = ent->v.iuser3; // vertexlight cachenum
state->iuser4	 = ent->v.iuser4;

Надеюсь, ты это учёл. Вообще, это для енв_статиков, и проверки в коде клиента должны быть.


Отправлено Aynekko 09-11-2021 в 07:24:

В принципе я уже решил проблему, заведя новый pev-effects, но все равно хотелось бы разобраться.

Цитата:
Ku2zoff писал:
Вместо отрицательных чисел используй какой-нибудь диапазон.

Вот чтобы избежать возможных конфликтов со статиками, я хотел отрицательное число вписать. Когда ставил положительное, у меня статик делал тот же эффект ибо iuser совпал
Цитата:
Ku2zoff писал:
В AddToFullPack иузеры вписаны?

Ага. В самом конце addtofullpack вывел в консоль все четыре iuser. Поставил число -5. Так и выводит. То есть с сервера ушло -5.
На клиенте алерт в консоль стоит прямо первой строчкой в HUD_AddEntity. Четыре нуля выводит. Если пишу положительное число, выводит правильно. Капец странно. И число маленькое же.
Я уже искал в коде какие-то проверки на обнуление, если меньше нуля - не удалось найти. Может проверь у себя, как работает ли у тебя.

__________________
Мой мод на Xash


Отправлено Дядя Миша 09-11-2021 в 08:54:

DT_SIGNED

Добавлено 09-11-2021 в 11:54:

Цитата:
Ku2zoff писал:
Вместо отрицательных чисел используй какой-нибудь диапазон

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Aynekko 09-11-2021 в 09:13:

Цитата:
Дядя Миша писал:
DT_SIGNED

Ларчик просто открывался. Сработало!

__________________
Мой мод на Xash


Отправлено [CFR] [email protected]@N 09-11-2021 в 11:22:

Может просто множить искомое число на -1 при получении?


Отправлено Aynekko 09-11-2021 в 11:46:

Цитата:
[CFR] [email protected]@N писал:
Может просто множить искомое число на -1 при получении?

Гениально, надо было сразу так сделать.

__________________
Мой мод на Xash


Отправлено Aynekko 14-11-2021 в 10:44:

Хотел на клиенте повращать браш. Обнуляю там angles и параллельно постоянно считаются и задаются новые координаты. Но он не крутится.
Сделал ту же самую энтитю, но точечную, с моделькой - крутится.
Судя по репортам консоль, брашевая энтитя приходит на клиент, координаты так же считаются и задаются. Если делать то же самое на сервере, то браш крутится. Какая-то особенность для брашевых энтитей?

__________________
Мой мод на Xash


Отправлено Ku2zoff 14-11-2021 в 11:10:

Aynekko с сервера приходят координаты и углы, а клиент уже по ним производит трансформацию. Учти, что брашевая модель - субмодель мира.

Цитата:
Aynekko писал:
точечную, с моделькой - крутится

Ты крутишь только клиентскую энтитю. На сервере всё остаётся по-старому. Как только придёт новый пакет данных - твоя энтитя встанет в первоначальное положение. Вижу два выхода: первое, это крутить на сервере, как положено. Второе, это делать чисто клиентскую энтитю, и оперировать ей. Со студиомодельками такое канает, с брашами - не знаю. Их как минимум придётся грузить из отдельных бсп (то есть энтитя будет точечной), как итемы в первой кваке.


Отправлено Aynekko 14-11-2021 в 11:15:

Цитата:
Ku2zoff писал:
Ты крутишь только клиентскую энтитю.

Я знаю, энтитя несолидная, так что проблем не будет, мне просто надо сделать визуальный эффект, на сервер побоку.

Собственно вот нехитрый код. На клиенте я просто подменяю angles, когда они приходят (а приходит по идее всегда ноль, т.к. на сервере энтитя не двигается)
C++ Source Code:
1
static Vector Angles;
2
Angles.z += 200 * g_fFrametime;
3
if( Angles.z > 359 ) Angles.z = 0;
4
e->angles = Angles;

Получился такой простой клиентский func_rotating. С моделькой отлично работает, а вот почему с брашем не прокатывает - загадка.

__________________
Мой мод на Xash


Отправлено Ku2zoff 14-11-2021 в 11:16:

Цитата:
Aynekko писал:
e->angles = Angles;

попробуй e->curstate.angles.


Отправлено Aynekko 14-11-2021 в 11:59:

Не, тоже не хотит. И моделька тогда тоже не крутится, что интересно. Только если просто angles менять

Добавлено 14-11-2021 в 14:59:

Все, нашел. В R_AddEntity нашел, где трансформация браша происходит.

C++ Source Code:
if( clent->model->type == mod_brush )
  clent->hCachedMatrix = GL_CacheState( clent->origin, clent->angles );

Переставил код сюда перед заданием матрицы. Все отлично работает. Спасибо, что откликнулся

__________________
Мой мод на Xash


Отправлено Chyvachok 23-11-2021 в 14:51:

Интересно, а как на клиенте сдвинуть счетчик патронов? Пока не могу найти где. А то я когда добавлял вторичную обойму для Акимбо-Подствола, он стал шире, и иконка патронов уехала за экран.

Добавлено 23-11-2021 в 15:51:

И вопрос по R_StreakSplash, как в нем указывается цвет? Там color не rgb, а просто одно число.


Отправлено Ku2zoff 23-11-2021 в 15:13:

Цитата:
Chyvachok писал:
color не rgb, а просто одно число

Скорее всего, цвет берётся из палитры. Как у всех партиклей. Открывай palette.lmp в wally и смотри индексы цветов.
Цитата:
Chyvachok писал:
как на клиенте сдвинуть счетчик патронов?

У них расстояние считается от правого края экрана:
C++ Source Code:
x = ScreeinWidth - ширина спрайта - отступ.

Добавь ширину второго спрайта и ещё один отступ.


Отправлено Chyvachok 23-11-2021 в 16:30:

Ku2zoff Спасибо.

Вопрос еще по TriApi, а как сделать чтобы край эффекта луча где он начинается был полупрозрачным? А то он резко начинается, не очень красиво выглядит: https://imgur.com/a/qkA8d0V

Сам код рендера луча, из ХДМ:

code:
//----------------------------------------------------------------------------- // Purpose: Draw system to screen. // Warning: Requires texture tiling enabled in GL! //----------------------------------------------------------------------------- void CRSBeam::Render(void) { if (!gEngfuncs.pTriAPI->SpriteTexture(m_pTexture, m_iFrame)) return; Vector rt, up; AngleVectors(g_vecViewAngles, NULL, rt, up); gEngfuncs.pTriAPI->RenderMode(m_iRenderMode); //gEngfuncs.pTriAPI->Color4ub(m_color.r, m_color.g, m_color.b, 255);//(unsigned char)(m_fBrightness*255.0f)); gEngfuncs.pTriAPI->Color4f(m_fColorCurrent[0],m_fColorCurrent[1],m_fColorCurrent[2],1.0f);// HL m_fColorCurrent[3]);// XDM3038c gEngfuncs.pTriAPI->Brightness(GetRenderBrightness()); gEngfuncs.pTriAPI->CullFace(TRI_NONE); gEngfuncs.pTriAPI->Begin(TRI_QUADS); gEngfuncs.pTriAPI->TexCoord2f(0.0, 0.0); gEngfuncs.pTriAPI->Vertex3fv(m_vecOrigin + rt*m_fScale); gEngfuncs.pTriAPI->TexCoord2f(1.0, 0.0); gEngfuncs.pTriAPI->Vertex3fv(m_vecOrigin - rt*m_fScale); gEngfuncs.pTriAPI->TexCoord2f(1.0, m_fTextureTile); gEngfuncs.pTriAPI->Vertex3fv(m_vEnd - rt*m_fScale); gEngfuncs.pTriAPI->TexCoord2f(0.0, m_fTextureTile); gEngfuncs.pTriAPI->Vertex3fv(m_vEnd + rt*m_fScale); gEngfuncs.pTriAPI->TexCoord2f(0.0, 0.0); gEngfuncs.pTriAPI->Vertex3fv(m_vecOrigin + up*m_fScale); gEngfuncs.pTriAPI->TexCoord2f(1.0, 0.0); gEngfuncs.pTriAPI->Vertex3fv(m_vecOrigin - up*m_fScale); gEngfuncs.pTriAPI->TexCoord2f(1.0, m_fTextureTile); gEngfuncs.pTriAPI->Vertex3fv(m_vEnd - up*m_fScale); gEngfuncs.pTriAPI->TexCoord2f(0.0, m_fTextureTile); gEngfuncs.pTriAPI->Vertex3fv(m_vEnd + up*m_fScale); gEngfuncs.pTriAPI->End(); //gEngfuncs.pTriAPI->RenderMode(kRenderNormal); }


Добавлено 23-11-2021 в 17:30:

Жаль что я кодер никакой, вот это бы как-то накодить, чтобы края спрайтов сглаживались когда в стену упираются как тут: http://www.ogse.ru/gallery/13.jpg


Отправлено Дядя Миша 23-11-2021 в 16:40:

Chyvachok софт-партикли делаются через шейдеры
Но твоя идея тоже интересная.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Chyvachok 23-11-2021 в 16:59:

Мне бы хотя бы начало лучика мягким сделать, идея есть, грубо говоря вместо одного 2 луча нарисовать, один начальный короткий отрезок, с прозрачностью 0 в начале луча, и непрозрачный в конце, и дальше как этот отрезок заканчивается просто нарисовать дальше второй луч, полностью непрозрачный, но вот как это закодить то, в этом pTriAPI я вообще не очень шарю в тех же координатах для вертексов, да и вообще с этими векторами наверное больше всего геморроя, я еле смог заставить на клиенте спавнить в эвенте оружия R_Sprite_Trail чтобы они корректно спавнились, тоже возня с векторами была.


Отправлено [CFR] [email protected]@N 23-11-2021 в 18:39:

Цитата:
Chyvachok писал:
Requires texture tiling enabled


Из надписи следует что у тебя там тайлинг текстуры.
Лучи они из отрезков коротких делаются и я предпологаю что надо сделать какой то шаг по брайтнесу - скажем, первые 10 кусков луча повышать прозрачность от 0 до 255 с шагом в 25. Думаю будет красиво


Дядя Миша
Шейдеров в хл нету и откуда их человек возьмёт если пишет что не кодер? Это не каждому под силу


Отправлено Дядя Миша 24-11-2021 в 06:01:

Я просто вспомнил как делал в ксаш-моде программный экспоненциальный туманчег партиклям
Там же рядом можно было замутить и повертексные софт-партикли через POINT_CONTENTS. Фишка в том, что в халфе это *реально* будет работать.
И безо всяких шейдеров. Так что идея и правда интересная.
Да вон, хотя бы Кутузов мог заняться.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено [CFR] [email protected]@N 24-11-2021 в 11:54:

Дядя Миша

Софт партикли требуют ditect X 11 и старше. Не?


Отправлено Дядя Миша 24-11-2021 в 18:12:

Цитата:
[CFR] [email protected]@N писал:
Софт партикли требуют ditect X 11 и старше. Не?

С точки зрения маркетологов Microsoft - безусловно

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Crystallize 24-11-2021 в 18:28:

Цитата:
[CFR] [email protected]@N писал:
Софт партикли требуют ditect X 11 и старше. Не?

был тут разговор что на винтукее они должны запускаться.

__________________
Вас приветствует персональная защитная система "САХАРА". Для работы в Средах Агрессивного ХАРАктера.
nofunallowed щас инди это по сути синоним "экзотическая игра где будет сказка и грустно


Отправлено FreeSlave 04-12-2021 в 12:10:

Можно ли как-то заставить построитель нодов коннектить ноды находящиеся по обе стороны от двери?



Из-за отсутствия связи монстры часто тупят на проходах.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Aynekko 04-12-2021 в 12:23:

Цитата:
FreeSlave писал:
Можно ли как-то заставить построитель нодов коннектить ноды находящиеся по обе стороны от двери?

Может проход слишком узкий? Попробуй сделать пошире. У меня нормально коннектится всегда.

__________________
Мой мод на Xash


Отправлено FreeSlave 04-12-2021 в 12:46:

Цитата:
Aynekko писал:
Может проход слишком узкий? Попробуй сделать пошире.


Не, никак не помогает. Если что, дверь изначально закрыта (как правая на скрине). Связь в таком случае не появляется. А вот если поставить дверям Starts open, то связь строится. Можно конечно закрывать двери после построения нодграфа, но не хотелось бы городить мапперские хаки.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Aynekko 04-12-2021 в 13:26:

В CGraph :: HandleLinkEnt есть код, связанный с этим

C++ Source Code:
if ( FClassnameIs( pevLinkEnt, "func_door" ) || FClassnameIs( pevLinkEnt, "func_door_rotating" ) )

Я сначала думал, что сам что-то сломал, потому что был абсолютно уверен, что граф строился через любые двери. Раз у тебя такое, то видимо нет.
Я не стал особо разбираться с этим и поставил return TRUE для этого условия и граф стал сразу строиться через все двери. Поглядев это условие, я понял, что мне оно в принципе и не нужно в моде.
В общем, копай в этом условии. Может нужно для построения графа сделать какое-то исключение.

Добавлено 04-12-2021 в 16:26:

Сделал так:
C++ Source Code:
1
if ( FClassnameIs( pevLinkEnt, "func_door" ) || FClassnameIs( pevLinkEnt, "func_door_rotating" ) )
2
{// ent is a door.
3
if( WorldGraph.BuildingRoute )
4
  return TRUE;
5
 
6
CBaseEntity *pDoor = ( CBaseEntity::Instance( pevLinkEnt ) );
7
 
8
if ( ( pevLinkEnt->spawnflags & SF_DOOR_USE_ONLY ) )
9
{// door is use only.
10
..........
11
..........

WorldGraph.BuildingRoute задал как true в начале CTestHull :: BuildNodeGraph и выключил его в конце там же. Заодно и код вернул на место и все генерируется.

__________________
Мой мод на Xash


Отправлено FreeSlave 04-12-2021 в 20:30:

Aynekko, спасибо. Но саму структуру WorldGraph я бы не советовал трогать (ну или не забудь перегенерировать графы с нуля), лучше уж отдельную глобальную переменную.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Aynekko 04-12-2021 в 22:17:

В этом случае там ничего важного и не трогается, этот новый бул ставится true только после начала генерации вейпоинта, если его нет, и false при завершении операции. Может там уже и есть даже подобный бул, я просто решил завести новый как раз чтобы ничего не трогать. В любом случае, графы еще будут миллион раз переделаны, т.к. мод в глубокой разработке

__________________
Мой мод на Xash


Отправлено FreeSlave 05-12-2021 в 11:28:

Aynekko, я про то, что структура графа читается и сохраняется в файл напрямую.
Я как-то тоже добавлял в CGraph переменную, потом у меня монстры где-то то ли невалидный вектор получали, то ли ещё что, и кружились вокруг своей оси, когда хотели куда-либо пойти

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Ku2zoff 05-12-2021 в 12:16:

Цитата:
FreeSlave писал:
потом у меня монстры где-то то ли невалидный вектор получали, то ли ещё что, и кружились вокруг своей оси

Надо вносить изменения не в код графа, а в код навигации монстров. Хотя бы сделать проверку на присутствие врагов рядом с целевой нодой, чтобы она скипалась. Как раз над этим работаю. Потому что меня выбесило, когда к барнику вплотную подходит зомбарь, барник убегает. Но убегает не всегда к той ноде, к которой логичнее. Может проигнорить ноду, возле которой никого нет, и побежать к ноде, возле которой три зомбаря.

Добавлено 05-12-2021 в 19:16:

Цитата:
FreeSlave писал:
Можно ли как-то заставить построитель нодов коннектить ноды находящиеся по обе стороны от двери?

Тут что-то не так. Монстры должны нормально ходить через двери.
FreeSlave это где такая визуализация связей сделана? Насколько помню, в простой халфе партиклевые линии, которые очень плохо видно, а порой они вообще исчезают.


Отправлено FreeSlave 05-12-2021 в 12:24:

Цитата:
Ku2zoff писал:
Монстры должны нормально ходить через двери.

Это как повезет. Может встать так, что с безнодовым алгоритмом затупит.

Цитата:
Ku2zoff писал:
это где такая визуализация связей сделана?

impulse 197
В обычной халфе есть.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Ku2zoff 05-12-2021 в 12:47:

Стоп. Проверил обычную халфу, в ней так и показываются связи. Только не на всех картах их почему-то видно.

Добавлено 05-12-2021 в 19:47:

Нашёл статью о нодах на TWHL. Цитата:

Цитата:
As mentioned before, nodes will only create a link where there is a visual line of sight between two nodes. Luckily, it ignores movable brush entities, such as func_doors, so you can place this door in between the nodes and there still will be a link.

То есть, связь через двери должна создаваться.


Отправлено Aynekko 05-12-2021 в 12:49:

Цитата:
FreeSlave писал:
Aynekko, я про то, что структура графа читается и сохраняется в файл напрямую.

Да, вероятно это может привести к такому. Ну в моем случае не беда.
Цитата:
Ku2zoff писал:
Как раз над этим работаю.

Кстати, пока вчера тестировал двери, обнаружил еще вот что. Есть две двери. Одна залочена мастером и не может быть открыта. Вторая открыта. Обе двери ведут в один и тот же открытый коридор. Ноды везде построены. Я юзаю барника и улетаю ноклипом сквозь дверь с мастером. Итог: барник упирается в дверь с мастером и спамит в консоль "нимагу идти". Вот бы сделать, чтобы этот путь забраковался и он стал искать обходной путь. Что-то вчера копался с этими нодами, но так и не вкурил, как это реализовать.

__________________
Мой мод на Xash


Отправлено FreeSlave 05-12-2021 в 16:03:

Я поподробнее посмотрел код реакции монстров на двери и он вообще довольно опасный.

Например:

HandleLinkEnt возвращает TRUE если дверь уже открыта и помечена как Toggle - https://github.com/ValveSoftware/ha.../nodes.cpp#L263
Что в свою очередь приводит к тому, что вызывается OpenDoorAndWait - https://github.com/ValveSoftware/ha...sters.cpp#L1492
Там мы видим, что дверь "юзается" с USE_ON - https://github.com/ValveSoftware/ha...sters.cpp#L1412
Однако двери в HL никак не обрабатывают USE_TYPE и воспринимают всё как Toggle, что приводит к тому, что дверь может наоборот закрыться.

Собственно, я когда-то давно наблюдал такое явление на широких дверях с флагом Toggle на опфоровских dll-ках. Солдаты, пробегая под ранее открытыми воротами, закрывали их. И Monsters Can't никак не помогал, ибо проверка на него в коде находится позже. Думаю, в HL такое тоже можно повторить, но там больше двух союзников за собой не утащишь, так что проверять сложнее.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Aynekko 05-12-2021 в 16:11:

Цитата:
FreeSlave писал:
Солдаты, пробегая под ранее открытыми воротами, закрывали их.

Такое сплошь и рядом. Даже у себя видел: есть двойные двери, довольно узкие. Так вот они их юзали-юзали, да так и не выюзали, и тупили там. С дверями у монстров вообще отношения особые, особенно с rotating.
Чтобы воспринималось все как надо, нужна у двери галка on/off mode, но вроде бы как в халфе такого нет, только спирит и ксашмод (? могу ошибаться).
Нужно доделать этот момент.

__________________
Мой мод на Xash


Отправлено FreeSlave 05-12-2021 в 16:29:

Цитата:
Aynekko писал:
нужна у двери галка on/off mode


Ты имеешь в виду правильная реакция на use_type? В Sven Co-op такое есть, называется Obey Trigger Mode https://sites.google.com/site/svenm...guide/func_door
Я у себя тоже её реализовал, но по умолчанию этот параметр у дверей не выставлен, для совместимости.

Цитата:
Aynekko писал:
Такое сплошь и рядом.

Монстры так могут игрока закрыть Да и вообще негоже игнорировать Monster Can't

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено FreeSlave 05-12-2021 в 21:04:

Ещё заметил, что связи не строятся через func_monsterclip. Пока не нашёл, как чинить. У кого-нибудь есть мысли на этот счёт?

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Дядя Миша 05-12-2021 в 21:29:

Цитата:
FreeSlave писал:
Ещё заметил, что связи не строятся через func_monsterclip

Монстер клип для того и придуман, чёб монстры сквозь него не ходили
Он же неотключаемый вроде.

Добавлено 06-12-2021 в 00:29:

Но я подскажу в чём тут дело - во флаге FL_MONSTERCLIP, который учитывает трасса. Т.е. CTestHull должен иметь тоже этот флаг, чёб монстерклипы были проходимыми.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено FreeSlave 05-12-2021 в 23:20:

Цитата:
Дядя Миша писал:
Монстер клип для того и придуман, чёб монстры сквозь него не ходили

Так не все, а только те, что с флагом Monsterclip.

Цитата:
Дядя Миша писал:
Он же неотключаемый вроде.

Его можно удалять

Цитата:
Дядя Миша писал:
Но я подскажу в чём тут дело - во флаге FL_MONSTERCLIP, который учитывает трасса. Т.е. CTestHull должен иметь тоже этот флаг, чёб монстерклипы были проходимыми.

Я тоже об этом подумал, и добавлял FL_MONSTERCLIP в CTestHull::Spawn, но это не помогло.
Ну и в HandleLinkEnt добавил ветку, учитывающую func_monsterclip и возвращающую на него успех.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Crystallize 06-12-2021 в 01:35:

Цитата:
Ku2zoff писал:
То есть, связь через двери должна создаваться.

Может позже поломали?

__________________
Вас приветствует персональная защитная система "САХАРА". Для работы в Средах Агрессивного ХАРАктера.
nofunallowed щас инди это по сути синоним "экзотическая игра где будет сказка и грустно


Отправлено Ku2zoff 06-12-2021 в 01:38:

Цитата:
Crystallize писал:
Может позже поломали?

Нет. Код нодеграфа не изменялся с самого релиза халфы.
Дело вот в чём:
Цитата:
FreeSlave писал:
Я поподробнее посмотрел код реакции монстров на двери и он вообще довольно опасный.

Тут либо кодить для своего мода, либо копипастить свойства дверей с халфовских карт.


Отправлено Дядя Миша 06-12-2021 в 06:19:

Цитата:
FreeSlave писал:
Я тоже об этом подумал, и добавлял FL_MONSTERCLIP в CTestHull::Spawn, но это не помогло.


Не помогло, потому что UTIL_TraceLine не использует флажки FL_MONSTERCLIP. Тебе нужно использовать UTIL_TraceHull для построения нодов с нулевым хуллом. Тогда сработает.

Добавлено 06-12-2021 в 09:19:

И FL_MONSTERCLIP добавлять в g_pBodyQueHead, а не в CTestHull.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Chyvachok 06-12-2021 в 11:52:

Такой вопрос, никто не делал луч моделькой? Типа как у Шафта в 1 Квейке? Я смотрел код dmc, как я понял там луч средствами ХЛ рисуется, через R_BeamPoints.


Отправлено Ku2zoff 06-12-2021 в 12:38:

Цитата:
Chyvachok писал:
никто не делал луч моделькой?

Зачем? В первой кваке не было спрайтов, ЕМНИП, только партикли. Отсюда и модельки для огня, для молний шамблиров и шафта, плевков демонов. Во второй кваке то же самое - модельки и партикли. В халфе одно нехорошее ограничение на спрайтовые эффекты - лимит темпэнтить. Можно обойти, используя три апи. Импотенциально можно накодить свою рисовалку спрайтов, в первой паранойе вроде бы что-то такое имеется.


Отправлено Дядя Миша 06-12-2021 в 17:45:

Цитата:
Ku2zoff писал:
В первой кваке не было спрайтов, ЕМНИП, только партикли

открой папку sprites и не позорься.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено FreeSlave 06-12-2021 в 18:04:

Цитата:
Дядя Миша писал:
Не помогло, потому что UTIL_TraceLine не использует флажки FL_MONSTERCLIP. Тебе нужно использовать UTIL_TraceHull для построения нодов с нулевым хуллом. Тогда сработает.

Добавлено сегодня в 09:19:

И FL_MONSTERCLIP добавлять в g_pBodyQueHead, а не в CTestHull.


Это в LinkVisibleNodes? Заменял там два UTIL_TraceLine на UTIL_TraceHull c point_hull и выставлял FL_MONSTERCLIP для g_pBodyQueueHead перед этим. По-прежнему не генерится.

Вот изменения https://github.com/FreeSlave/hlsdk-...7b9b74024066762

Карта для теста в аттаче

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Дядя Миша 06-12-2021 в 18:40:

Ну тады ой Но всё равно надо копать в этом направлении.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено FreeSlave 07-12-2021 в 01:21:

Копать скорее надо в направлении Walk Rejection. Я создал карту-коробку с двумя нодами. Без препятствий между ними связь есть. Если поставить func_monsterclip, то связь не рисуется.

В логе

Цитата:

Walk Rejection:
-------------------------------------------------------------------------------
Node 0:

NODE_SMALL_HULL step 112
-------------------------------------------------------------------------------
Node 1:

NODE_SMALL_HULL step 80


Т.е. это WALK_MOVE отбивает связи.

Взглянул повнимательнее на func_monsterclip. Он вызывает CFuncWall:Spawn, в котором выставляется FL_WORLDBRUSH. Если в CFuncMonsterClip::Spawn его убрать, то связь есть.
А теперь вопрос: безопасно ли убирать FL_WORLDBRUSH у func_monsterclip? Возможно разрабы и вовсе не подразумевали, что у него такой флаг должен быть, ведь выставляется он через Spawn родительского класса. Я потестил и работает оно как ожидается - монстров с Monsterclip не пропускает, а без него - пропускает.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Дядя Миша 07-12-2021 в 06:47:

Цитата:
FreeSlave писал:
А теперь вопрос: безопасно ли убирать FL_WORLDBRUSH у func_monsterclip?

FL_WORLDBRUSH - это хинт-подсказка, что по такому брашу можно смело ходить, чтоб монстры не тупили. В то время как монстерклип вертикальный и по нему обычно никто не ходит. Так что да, убирай смело.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Chyvachok 07-12-2021 в 11:42:

Такой вопрос, а что делает таких монстров как барнаклы и турели не разрываемыми на куски? У Турелей тчинк TurretDeath вместо killed используется. Барнаклов смог сделать, но опять же - их разрывает только если их взорвать сразу, уже убитого нельзя на ошметки разнести, а у турелей, попытка моя как то их сделать разбиваемыми на куски сделала их не убиваемыми.


Отправлено Ku2zoff 07-12-2021 в 12:05:

Chyvachok у барнакла своя функция Killed, из неё не вызывается GibMonster. То же самое с турелями.


Отправлено Chyvachok 07-12-2021 в 12:28:

Ku2zoff У барнакла может быть дело в этих строках в Killed?

pev->solid = SOLID_NOT;
pev->takedamage = DAMAGE_NO;

По идее из-за этого нельзя ему нанести урон после того как он убит, но я не знаю какой solid у трупов других врагов, чтобы можно было из оружия урон нанести и при этом сквозь них пройти можно было.


Отправлено Ku2zoff 07-12-2021 в 12:31:

Это влияет да. А ещё вот:

C++ Source Code:
1
if ( HasMemory( bits_MEMORY_KILLED ) )
2
{
3
  if ( ShouldGibMonster( iGib ) )
4
    CallGibMonster();
5
  return;
6
}
Надо вызывать GibMonster из Killed.


Отправлено Chyvachok 07-12-2021 в 12:37:

Насчет этих двух строк, если убрать pev->solid = SOLID_NOT; жертва остается висеть в барнакле, но его зато можно разорвать из instant hit оружия, если убрать pev->takedamage = DAMAGE_NO; но оставить pev->solid = SOLID_NOT; можно взорвать, но не разорвать instant hit оружием. И еще вот, анимация смерти заново начинает проигрыватся если барнакл опять получает урон после смерти, пока код так выглядит:

code:
void CBarnacle :: Killed( entvars_t *pevAttacker, int iGib ) { CBaseMonster *pVictim; pev->solid = SOLID_NOT; pev->takedamage = DAMAGE_NO; if ( m_hEnemy != NULL ) { pVictim = m_hEnemy->MyMonsterPointer(); if ( pVictim ) { pVictim->BarnacleVictimReleased(); } } // CGib::SpawnRandomGibs( pev, 4, 1 ); switch ( RANDOM_LONG ( 0, 1 ) ) { case 0: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die1.wav", 1, ATTN_NORM ); break; case 1: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die3.wav", 1, ATTN_NORM ); break; } SetActivity ( ACT_DIESIMPLE ); SetBoneController( 0, 0 ); StudioFrameAdvance( 0.1 ); if ( ShouldGibMonster( iGib ) ) { GibMonster(); return; } pev->nextthink = gpGlobals->time + 0.1; SetThink ( &CBarnacle::WaitTillDead ); }


Добавлено 07-12-2021 в 14:37:

Ku2zoff в CBaseMonster::Killed почему то аж 2 вызова ShouldGibMonster


Отправлено Ku2zoff 07-12-2021 в 12:39:

CBarnacle :: WaitTillDead тут возвращай ему солидность. Может подходящее место. А вообще, чтобы жертва не застревала, можно воспользоваться груптрейсом.


Отправлено Chyvachok 07-12-2021 в 12:50:

Ku2zoff Я не могу найти какая солидность у трупов, они получают урон из оружия, и в то же время сквозь них можно пройти.

Добавлено 07-12-2021 в 14:44:

Цитата:
Ku2zoff писал:
можно воспользоваться груптрейсом.


Вот только как им пользоваться еще.

Добавлено 07-12-2021 в 14:50:

С повторным проигрыванием анимации смерти разобрался, осталось только с жертвой что-то придумать. Такая же хрень и с турелями, они не солидные делаются, а чтобы им урон можно было нанести, надо тоже сделать их чтобы они были как трупы, получали урон, но сквозь них можно было проходить.


Отправлено Ku2zoff 07-12-2021 в 14:38:

Цитата:
Chyvachok писал:
Вот только как им пользоваться еще.

Ты же пользовался уже: http://hlfx.ru/forum/showthread.php...9043#post169043


Отправлено Chyvachok 07-12-2021 в 15:57:

Ku2zoff Я не совсем понял как они работают то, groupinfo нужно одинаковый и барнаклу и жертве ставить? И ничего что потом у жертвы останется свой после смерти барнакла?

Вроде разобрался влепил pev->groupinfo = 1; и вроде можно как и урон Барнаклу дальше после смерти наносить, и жертва и игрок сквозь него проходят. Вот кому надо:

code:
void CBarnacle :: Killed( entvars_t *pevAttacker, int iGib ) { CBaseMonster *pVictim; //pev->solid = SOLID_NOT; //pev->takedamage = DAMAGE_NO; pev->groupinfo = 1; if ( !HasMemory( bits_MEMORY_KILLED ) ) { Remember( bits_MEMORY_KILLED ); if ( m_hEnemy != NULL ) { pVictim = m_hEnemy->MyMonsterPointer(); if ( pVictim ) { pVictim->BarnacleVictimReleased(); } } if ( ShouldGibMonster( iGib ) ) { GibMonster(); return; } switch ( RANDOM_LONG ( 0, 1 ) ) { case 0: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die1.wav", 1, ATTN_NORM ); break; case 1: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die3.wav", 1, ATTN_NORM ); break; } SetActivity ( ACT_DIESIMPLE ); SetBoneController( 0, 0 ); StudioFrameAdvance( 0.1 ); pev->nextthink = gpGlobals->time + 0.1; SetThink ( &CBarnacle::WaitTillDead ); } else { if ( ShouldGibMonster( iGib ) ) { GibMonster(); return; } } }


Добавлено 07-12-2021 в 17:57:

С турелями блин еще моделить надо, настенным чтобы основа после убийства оставалась на стене висеть, а напольным просто куски, а на это больше всего времени уходит (

Кстати сделал боди отстреленных конечностей для ХД вортигонта: https://files.gamebanana.com/bitpit/islave.rar


Отправлено Ku2zoff 07-12-2021 в 16:23:

Цитата:
Chyvachok писал:
//pev->solid = SOLID_NOT;
//pev->takedamage = DAMAGE_NO;
pev->groupinfo = 1;

А кто будет вызывать UTIL_SetGroupTrace и UTIL_UnsetGroupTrace?
C++ Source Code:
pev->groupinfo = 1;
pVictim->pev->groupinfo = 1;
 
UTIL_SetGroupTrace(pev->groupinfo, GROUP_OP_NAND);
UTIL_SetGroupTrace(pVictim->pev->groupinfo, GROUP_OP_NAND);

А потом, чтобы вернуть коллизию:
C++ Source Code:
UTIL_SetGroupTrace(pev->groupinfo, GROUP_OP_AND);
UTIL_SetGroupTrace(pVictim->pev->groupinfo, GROUP_OP_AND);

Как-то так. У меня таким макаром игроки переставали коллайдить с func_wall и друг с другом, когда ползают. Потом я написал код лучше. Не помню, где я вычитал, что вызывать надо именно так. Посмотри сорцы ксашдвижка, из функций должно стать ясно, что они делают.

Добавлено 07-12-2021 в 23:23:

Цитата:
Chyvachok писал:
сделал боди отстреленных конечностей для ХД вортигонта

Ух ты, весьма кстати. Я у себя заюзаю, только изменю немного. Свои гибсы для каждого монстра я делал ещё очень давно, код простой. А вот модели делать долго, хоть и не очень сложно.


Отправлено Chyvachok 07-12-2021 в 16:52:

Цитата:
Ku2zoff писал:
Ух ты, весьма кстати. Я у себя заюзаю, только изменю немного. Свои гибсы для каждого монстра я делал ещё очень давно, код простой. А вот модели делать долго, хоть и не очень сложно.


Решил поменять ЛД модели из Брутала на ХД с классическим стилем по тихоньку. Кстати не знаешь есть ли где-то модель ХД Барника но с анимациями под автомат-дробовик и с пинком? ЛД-шный скелет насколько я помню отличается, врядли анимации из БХЛ встанут.

Насчет коллизии, мне наоборот надо чтобы барнакл уже не с чем не колидил, как и трупы от монстров, я просто не знаю, а когда и как вернуть коллизию жертве, если барнакл уже может быть давно взорван на куски и удален? Я поэтому не хочу жертву то трогать, этого pev->groupinfo = 1; вроде достаточно с головой, проверил - урон по барнаклу от оружия проходит, жертва выпадает, игрок сам сквозь труп тоже проходит.

Будет желание моделить, по хорошему для Барнакла можно как я с Ксеновкими Деревьями сделал, и это же хочу с потолочными турелями сделать, не удалять монстра гибом, а спавнить куски, и менять боди на уничтоженный, в общем основа чтобы оставалась, у дерева корни, у турели люк откуда она выдвигается, у барнакла просто кусок мяса оставить свисающий.

Добавлено 07-12-2021 в 18:52:

Цитата:
Ku2zoff писал:
Свои гибсы для каждого монстра я делал ещё очень давно, код простой.


Я вот такое наваял, не знаю насколько грамотно. Не так как в БХЛ но вроде лучше чес в Инвазионе (там нельзя больше одной конечности отстреливать, но и нельзя как в БХЛ сделать так чтобы НПС живой оставался, к примеру как зомби с отстреленной рукой, не придумал как, и чтобы оно еще нормально все работало.

code:
//Код Слейва но чисто отвечающий за отстрел конечностей. #define TORSOGIB_DAMAGE (DMG_BUCKSHOT|DMG_ENERGYBEAM|DMG_CRUSH|DMG_MORTAR|DMG_BLAST) #define HEAD_GROUP 1 #define HEAD_INTACT 0 #define HEAD_BEHEADED 1 #define LEFTARM_GROUP 2 #define RIGHTARM_GROUP 3 #define LEFTLEG_GROUP 4 #define RIGHTLEG_GROUP 5 #define MIDDLEARM_GROUP 6 #define LIMB_INTACT 0 #define LIMB_DAMAGED 1 #define NO_TORSO_LEFTLEG_GROUP 1 #define NO_TORSO_RIGHTLEG_GROUP 2 #define HBOX_CHEST 2 #define HBOX_STOMACH 3 #define HBOX_ARM_R 5 #define HBOX_ARM_L 4 #define HBOX_LEG_R 7 #define HBOX_LEG_L 6 #define HBOX_HEAD 1 #define HBOX_ARM_M 8 #define AGIBS_ISLAVE_TORSO 30 #define AGIBS_ISLAVE_PELVIS 36 #define AGIBS_ISLAVE_HEAD 29 #define AGIBS_ISLAVE_ARM_L 31 #define AGIBS_ISLAVE_ARM_R 32 #define AGIBS_ISLAVE_LEG_L 33 #define AGIBS_ISLAVE_LEG_R 34 #define AGIBS_ISLAVE_ARM_M 35 class CISlave : public CSquadMonster { int m_iNoTorso, m_iNoHead, m_iNoLeftArm, m_iNoRightArm, m_iNoMiddleArm, m_iNoLeftLeg, m_iNoRightLeg; } void CISlave::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) { if (bitsDamageType & DMG_SHOCK) return; CSquadMonster::TraceAttack( pevAttacker, flDamage, vecDir, ptr, bitsDamageType ); if ( gMultiDamage.pEntity != this ) return; if (pev->health - ( gMultiDamage.amount ) <= 0) { Vector new_origin = pev->origin, new_angle; if ( (ptr->iHitgroup == HBOX_CHEST/* || ptr->iHitgroup == HBOX_STOMACH*/) && m_iNoTorso == 0 && bitsDamageType & TORSOGIB_DAMAGE) { EMIT_SOUND(ENT(pev), CHAN_BODY, "common/amputation_heavy.wav", 1, ATTN_NORM); CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_TORSO, 0 ); CGib::SpawnStickyGibs( pev, RANDOM_LONG(2,3), "models/stickygib.mdl", 2, 4 ); //С торсом рубим и руки если они есть if (m_iNoRightArm == 0){ GetBonePosition( LookupBone("Bip01 R UpperArm"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_ARM_R, pevAttacker, new_origin); } if (m_iNoLeftArm == 0){ GetBonePosition( LookupBone("Bip01 L UpperArm"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_ARM_L, pevAttacker, new_origin); } if (m_iNoHead == 0){ GetBonePosition( LookupBone("Bip01 Head"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_HEAD, pevAttacker, new_origin); } pev->body = 0; SET_MODEL(ENT(pev), "models/islave_h.mdl"); //У модели без торса другой порядок бодигруп и их кол-во поэтому и заново указываем if (m_iNoLeftLeg == 1) SetBodygroup( 1, LIMB_DAMAGED); if (m_iNoRightLeg == 1) SetBodygroup( 2, LIMB_DAMAGED); m_iNoTorso = 1; m_iNoRightArm = 1; m_iNoLeftArm = 1; m_iNoHead = 1; } switch ( ptr->iHitgroup ) { case HBOX_ARM_R: if (m_iNoRightArm == 0){ EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/amputation_light.wav", 1, ATTN_NORM); GetBonePosition( LookupBone("Bip01 R UpperArm"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_ARM_R, pevAttacker, new_origin); SetBodygroup( RIGHTARM_GROUP, LIMB_DAMAGED); m_iNoRightArm = 1; } break; case HBOX_ARM_L: if (m_iNoLeftArm == 0){ EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/amputation_light.wav", 1, ATTN_NORM); GetBonePosition( LookupBone("Bip01 L UpperArm"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_ARM_L, pevAttacker, new_origin); SetBodygroup( LEFTARM_GROUP, LIMB_DAMAGED); m_iNoLeftArm = 1; } break; case HBOX_LEG_R: if (m_iNoRightLeg == 0){ EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/amputation_light.wav", 1, ATTN_NORM); GetBonePosition( LookupBone("Bip01 R Calf"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_LEG_R, pevAttacker, new_origin); if (m_iNoTorso == 0) SetBodygroup( RIGHTLEG_GROUP, LIMB_DAMAGED); else SetBodygroup( 2, LIMB_DAMAGED); m_iNoRightLeg = 1; } break; case HBOX_LEG_L: if (m_iNoLeftLeg == 0){ EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/amputation_light.wav", 1, ATTN_NORM); GetBonePosition( LookupBone("Bip01 L Calf"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_LEG_L, pevAttacker, new_origin); if (m_iNoTorso == 0) SetBodygroup( LEFTLEG_GROUP, LIMB_DAMAGED); else SetBodygroup( 1, LIMB_DAMAGED); m_iNoLeftLeg = 1; } break; case HBOX_ARM_M: if (m_iNoLeftArm == 0){ EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/amputation_light.wav", 1, ATTN_NORM); GetBonePosition( LookupBone("Bone05"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_ARM_M, pevAttacker, new_origin); SetBodygroup( MIDDLEARM_GROUP, LIMB_DAMAGED); m_iNoMiddleArm = 1; } break; case HBOX_HEAD: if (m_iNoHead == 0){ EMIT_SOUND(ENT(pev), CHAN_BODY, "common/amputation_heavy.wav", 1, ATTN_NORM); GetBonePosition( LookupBone("Bip01 Head"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_HEAD, pevAttacker, new_origin); //Crab vezde odinakoviy SetBodygroup( HEAD_GROUP, HEAD_BEHEADED); m_iNoHead = 1; } break; } } } void CISlave::GibMonster ( void ) { EMIT_SOUND(ENT(pev), CHAN_WEAPON, "common/bodysplat.wav", 1, ATTN_NORM); if (m_iNoTorso == 0){ CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_TORSO, 0 ); //спавнит куски, но боди идут не рандомно, а по порядку CGib::SpawnStickyGibs( pev, RANDOM_LONG(2,3), "models/stickygib.mdl", 2, 4 ); //починеный stickygibs, вроде уже не разу не висит в воздухе } if ( m_iNoRightArm == 0 ) CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_ARM_R, 0 ); if ( m_iNoLeftArm == 0 ) CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_ARM_L, 0 ); if ( m_iNoMiddleArm == 0 ) CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_ARM_M, 0 ); if ( m_iNoRightLeg == 0 ) CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_LEG_R, 0 ); if ( m_iNoLeftLeg == 0 ) CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_LEG_L, 0 ); if (m_iNoHead == 0) CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_HEAD, 0 ); CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_PELVIS, 0 ); SetThink ( &CBaseMonster :: SUB_Remove ); pev->nextthink = gpGlobals->time; } //Код спавна отпределенного куска в определенном месте void CISlave :: MakeGib ( int body, entvars_t *pevAttacker, Vector vecSrc ) { CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( "models/agibs.mdl" ); pGib->m_bloodColor = BLOOD_COLOR_YELLOW; pGib->pev->body = body; pGib->pev->skin = 0; pGib->pev->groupinfo = 1; UTIL_SetGroupTrace(pGib->pev->groupinfo, GROUP_OP_NAND); UTIL_SetGroupTrace(pev->groupinfo, GROUP_OP_NAND); pGib->pev->origin = vecSrc; //pGib->pev->velocity = ( Center() - pevAttacker->origin).Normalize() * 300; pGib->pev->velocity = Vector (RANDOM_FLOAT(-100,100), RANDOM_FLOAT(-100,100), RANDOM_FLOAT(100,200)); pGib->pev->avelocity.x = RANDOM_FLOAT( 100, 200 ); pGib->pev->avelocity.y = RANDOM_FLOAT( 100, 300 ); pGib->pev->avelocity.z = RANDOM_FLOAT( 100, 200 ); pGib->pev->solid = SOLID_TRIGGER; UTIL_SetSize( pGib->pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) ); }


Отправлено Ku2zoff 07-12-2021 в 17:15:

Цитата:
Chyvachok писал:
модель ХД Барника но с анимациями под автомат-дробовик и с пинком?

Zombie Edition же. За авторством наших ребят. Я оттуда взял анимации дробовика. Правда, переделал ходьбу и бег, т.к. они там ущербные. И добавил turnleft/turnright. Попозже аттачем скину тебе smd файлы, может допилишь, чтобы было красиво. Анимки эти заточены под модели с подвижными глазами, веками и бровями от Ромки или из Decay. Так что работай с этими моделями. Потом можно вкомпилить в обычного HD барника, скелеты совместимы.
Цитата:
Chyvachok писал:
нельзя как в БХЛ сделать так чтобы НПС живой оставался, к примеру как зомби с отстреленной рукой, не придумал как, и чтобы оно еще нормально все работало.

Делаешь по аналогии с limp health у грантов: меняешь анимации в SetActivity. То есть по факту монстр жив, но активности у него другие и внешний вид тоже.

Добавлено 08-12-2021 в 00:12:

Я бы не раздувал код TraceAttack, а передавал хитгруппу сразу в функцию SpawnSpecificGib. А там уже switch case.

Добавлено 08-12-2021 в 00:15:

Кстати, такой вопрос. Кто качал Accurate SD models учёных и барников? В основе модели от Ромки, но головы очень похожи на LD версии, нет этих убогих ХДпачных рож. Хотелось бы ещё что-такое найти, чтобы бошки были высокополигональные, но смотрелись олдскульно.


Отправлено Chyvachok 07-12-2021 в 17:34:

Цитата:
Ku2zoff писал:
Я бы не раздувал код TraceAttack, а передавал хитгруппу сразу в функцию SpawnSpecificGib.


А чем это чревато? Я по лучше не придумал, но я честно особо красиво код писать и не умею.


Отправлено Ku2zoff 07-12-2021 в 19:42:

Chyvachok особо ничем, разве что удобочитаемость снижается.

Добавлено 08-12-2021 в 02:42:

Как обещал - секвенции дробовика и пинка хедкраба ногой в аттаче. Надо немножко их допилить. Для M4 секвенции можно выдрать из оригинальной модели мода Zombie Edition.


Отправлено FreeSlave 08-12-2021 в 17:01:

Цитата:
Aynekko писал:
Кстати, пока вчера тестировал двери, обнаружил еще вот что. Есть две двери. Одна залочена мастером и не может быть открыта. Вторая открыта. Обе двери ведут в один и тот же открытый коридор. Ноды везде построены. Я юзаю барника и улетаю ноклипом сквозь дверь с мастером. Итог: барник упирается в дверь с мастером и спамит в консоль "нимагу идти". Вот бы сделать, чтобы этот путь забраковался и он стал искать обходной путь. Что-то вчера копался с этими нодами, но так и не вкурил, как это реализовать.


Да, если строить сквозь все двери, есть такой баг. Я отследил его до CGraph::FindShortestPath. А виновата вот эта строчка: https://github.com/ValveSoftware/ha.../nodes.cpp#L611

Во время построения графа вызывается ComputeStaticRoutingTables, которая по окончании и ставит m_fRoutingComplete в TRUE, и любой FindShortestPath начинает идти по уже проложенному пути, не заходя в другую ветку кода, где вызывается HandleLinkEnt https://github.com/ValveSoftware/ha.../nodes.cpp#L701
Вызывается он кстати с параметром NODEGRAPH_STATIC, что похоже в какой-то мере и есть аналог нашей булевой переменной, которую мы вводим во время CTestHull::BuildNodeGraph.

FindShortestPath вызывается при построения пути по нодам для монстра в CBaseMonster::FGetNodeRoute - https://github.com/ValveSoftware/ha...sters.cpp#L2789
Что приводит к тому, что поиск пути попадает в ветку с m_fRoutingComplete, без учёта энтитей.
Кстати, из-за этого в оригинальной Халфе может затупить монстр в попытках обойти func_breakable - с NODEGRAPH_STATIC для него всегда возвращается TRUE, в результате монстр считает, что может пройти насквозь (как и в твоём случае с дверью).

Лечится это следующим способом.
Меняем сигнатуру FindShortestPath
C++ Source Code:
int		FindShortestPath ( int *piPath, int iStart, int iDest, int iHull, int afCapMask );

на
C++ Source Code:
int		FindShortestPath ( int *piPath, int iStart, int iDest, int iHull, int afCapMask, bool dynamic = false );


Заменяем
C++ Source Code:
if( m_fRoutingComplete )

на
C++ Source Code:
if( !dynamic && m_fRoutingComplete )


Заменяем
C++ Source Code:
if( !HandleLinkEnt( iCurrentNode, m_pLinkPool[m_pNodes[iCurrentNode].m_iFirstLink + i].m_pLinkEnt, afCapMask, NODEGRAPH_STATIC ) )

на
C++ Source Code:
if( !HandleLinkEnt( iCurrentNode, m_pLinkPool[m_pNodes[iCurrentNode].m_iFirstLink + i].m_pLinkEnt, afCapMask, dynamic ? NODEGRAPH_DYNAMIC : NODEGRAPH_STATIC ) )


В FGetNodeRoute вызываем WorldGraph.FindShortestPath с true в качестве нового последнего аргумента.

Что стоит иметь в виду: ветка с m_fRoutingComplete скорее всего больше вообще нигде не будет выполняться. Не знаю, хорошо ли это, и как это скажется на производительности.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Aynekko 08-12-2021 в 17:58:

Цитата:
FreeSlave писал:
FindShortestPath

Вот я тоже уперся туда, а дальше залип.
Цитата:
FreeSlave писал:
по окончании и ставит m_fRoutingComplete в TRUE

Ага. Наверное, надо его использовать вместо нового условия, что я воткнул.
Цитата:
FreeSlave писал:
Лечится это следующим способом.

Я, конечно, офигел, но это реально работает. Монстряка поумнел на глазах спасибо большое. Буду тестировать.

Добавлено 08-12-2021 в 20:26:

Цитата:
Aynekko писал:
Буду тестировать.

Работает после построения нод. Перезапустил карту - опять упирается в дверь. Карту перекомпилировал и проверил еще раз, так же. Интересненько

Добавлено 08-12-2021 в 20:58:

Мой косяк. Мой BuildingRoute почему-то после перезапуска карты стал true. Где-то не учел условие. Попробую m_fRoutingComplete.

Да, отлично, можно его использовать. Ноды построились через закрытые двери и после перезапуска тоже все работает.

__________________
Мой мод на Xash


Отправлено FreeSlave 08-12-2021 в 18:06:

Цитата:
Aynekko писал:
Мой косяк. Мой BuildingRoute почему-то после перезапуска карты стал true. Где-то не учел условие. Попробую m_fRoutingComplete.


Попробуй всё-таки вынести в глобальную переменную вне класса. У тебя сэйв-рестор графа может быть поломан.
А вообще вполне возможно что дополнительная переменная не нужна и достаточно ориентироваться на NODEGRAPH_STATIC, всегда возвращая TRUE из HandleLinkEnt, вызванной с NODEGRAPH_STATIC, для дверей и func_breakable.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Aynekko 08-12-2021 в 18:51:

Цитата:
FreeSlave писал:
У тебя сэйв-рестор графа может быть поломан.

После сейв-рестора у меня вообще HandleLinkEnt перестал вызываться (выставил алерт в самом начале). Если просто загружать карту, с/без графа, то все норм. Свою переменную я вообще вычистил полностью, использовал ту
C++ Source Code:
1
if ( FClassnameIs( pevLinkEnt, "func_door" ) || FClassnameIs( pevLinkEnt, "func_door_rotating" ) )
2
{// ent is a door.
3
if( !WorldGraph.m_fRoutingComplete )
4
  return TRUE;


Добавлено 08-12-2021 в 21:51:

Это условие не проходит после сейврестора, оно null становится
C++ Source Code:
// check the connection from the current node to the node we're about to mark visited and push into the queue
if ( m_pLinkPool[ m_pNodes[ iCurrentNode ].m_iFirstLink + i ].m_pLinkEnt != NULL )

__________________
Мой мод на Xash


Отправлено FreeSlave 08-12-2021 в 19:32:

Да, похоже что-то не так с FSetGraphPointers. Я у себя вижу кучу сообщений **Could not find model.
Надо подумать, куда перетащить этот вызов.

Добавлено 08-12-2021 в 22:18:

Пока что из CBasePlayer::Precache перенес в ServerActivate в client.cpp (пришлось там подключить "nodes.h").

Добавлено 08-12-2021 в 22:32:

Кстати m_pLinkEnt и в обычной халфе неправильно выставляются при сэйв-ресторе. Те же **Could not find model в консоли (выставьте значение developer 4 перед запуском карты, чтобы все сообщения видеть).
Но там баг себя наверно и не проявляет никак, ибо FindShortestPath всегда следует по ветке m_fRoutingComplete.

Да и в целом звать FSetGraphPointers в CBasePlayer::Precache неверно. Что насчёт выделенных серверов, которые запускаются без всяких игроков?
А вот почему даже в сингле энтити не находятся по имени брашевой модели - хз. Возможно при ресторе Precache на энтитях зовется ещё до загрузки последующих, поэтому всех этих брашевых энтитей как бы и нет на момент вызова Precache игрока.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Aynekko 08-12-2021 в 19:34:

Цитата:
FreeSlave писал:
перенес в ServerActivate в client.cpp

Да, помогло! Сейврестор починился. Теперь, как говорится, заживем
Кстати, насчет брейкаблей, у меня пока вот такая полу-рабочая попытка. Это в AdvanceRoute. Комменты оставил на будущее, но пока идей нет.
C++ Source Code:
1
else if ( WorldGraph.HandleLinkEnt ( iSrcNode, WorldGraph.m_pLinkPool[iLink].m_pLinkEnt, m_afCapability, CGraph::NODEGRAPH_STATIC ) )
2
{
3
  entvars_t *pevLinkEnt = WorldGraph.m_pLinkPool[iLink].m_pLinkEnt;
4
 
5
  if ( (m_afCapability & bits_CAP_RANGE_ATTACK1) && FClassnameIs(pevLinkEnt, "func_breakable") && !(pevLinkEnt->spawnflags & SF_BREAK_TRIGGER_ONLY) )
6
  {
7
    //	ALERT(at_console, "breakable.\n");
8
    CBaseEntity *pBreakable = Instance( pevLinkEnt );
9
    if (pBreakable)
10
    {
11
      // UNDONE: should be treating the breakable as enemy and attack it until it breaks, and without shouting "hostiles!" too
12
      pBreakable->TakeDamage( pev, pev, 15, DMG_CLUB );
13
 
14
      // this somewhat works but sometimes he doesn't look at breakable and just fighting the air
15
      //		MakeIdealYaw( pBreakable->GetAbsOrigin() );
16
      //		SetTurnActivity();
17
      //		ChangeSchedule( GetScheduleOfType(SCHED_MELEE_ATTACK1) );
18
    }
19
  }
20
}

__________________
Мой мод на Xash


Отправлено FreeSlave 08-12-2021 в 19:56:

Aynekko, хочешь сделать, чтобы монстры сами разбивали breakable'ы на своём пути? В общем случае лучше такое не позволять. Вдруг это взрывные бочки

В идеале такое можно было бы реализовать только для специально помеченных брекаблей и по-разному для отдельных монстров. Например, вполне можно представить, что агрунт снесёт какие-нибудь коробки просто пройдя сквозь них А хуман грунты могут использовать пинок для поломки.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Aynekko 08-12-2021 в 20:04:

Цитата:
FreeSlave писал:
хочешь сделать, чтобы монстры сами разбивали breakable'ы на своём пути?

Ну да. В одном месте поставил ящик, а потом туда враги приходят, если игрок его не разбил - то будут тупить там.
Как видишь по коду, с пинком не получилось. Почему-то он не всегда поворачивается на 100% в сторону брейкабли и пинает воздух, выглядит комично. Вообще надо бы флаг задать, да.
А бочки я уже сделал отдельной энтитей - как в хл2 по поведению, только без физики конечно же.

__________________
Мой мод на Xash


Отправлено FreeSlave 08-12-2021 в 20:12:

Цитата:
Aynekko писал:
Ну да. В одном месте поставил ящик, а потом туда враги приходят, если игрок его не разбил - то будут тупить там.


В каком смысле тупить? С теми изменениями, что мы обсуждали, они должны ящики считать препятствиями и обходить.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Aynekko 08-12-2021 в 20:14:

Хехех, ну так дело в том, что ящик стоит посреди коридора там никак не обойти. Почему я, собственно, и сделал это вообще.

__________________
Мой мод на Xash


Отправлено Ku2zoff 09-12-2021 в 07:58:

Цитата:
FreeSlave писал:
Я у себя вижу кучу сообщений **Could not find model.

Граф пытается после сейв/рестора прочекать брашевые энтити с моделями вида "*31", "*78", "*102", то есть субмоделями мира. Там какая-то трабла с этим, энтити не находит.
Цитата:
FreeSlave писал:
в целом звать FSetGraphPointers в CBasePlayer::Precache неверно

А, видимо они не успевают отресториться. Надо глядеть порядок вызова DispatchRestore изнутри движка, скорее всего он происходит после прекэша игрока.
Цитата:
FreeSlave писал:
А хуман грунты могут использовать пинок для поломки.

У нодов есть механизм подсказок для AI: m_sHintType. Можно добавить новый хинт "здесь ломать брейкаблю", и ноду с таким хинтом ставить перед ящиками. Во-первых, никто не подорвётся на бочке, во-вторых не будет ломать все подряд коробки, а только те, что рядом с нодой.


Отправлено Chyvachok 09-12-2021 в 14:22:

Ku2zoff еще раз насчет groupinfo, допустим, а как точно этот UTIL_SetGroupTrace работает? Чет я туплю с ним, это надо обоим сущностям ставить одинаковый groupinfo? Просто я так и не понимаю результата конечного. Если той же жертве Барнакла поменять groupinfo это не сломает физику жертве? Я без этого обошелся, оставил pGib->pev->groupinfo = 1; только у Барнакла, без UTIL_SetGroupTrace, это по сути дало то что мне нужно было - барнакл ни с чем не колидит, его труп не мешает проходу и жертва выпадает, и в него регистрируется урон из оружия.

В коде гибсов у меня такой код, я хочу чтобы гибсы с друг другом не колидили, бывает что у них одинаковая позиция и они висят в воздухе, и с жертвой, это правильно написано или нет? Я жертве не ставил groupinfo. Sticky Gib-ы и не работали из-за того что могли с друг другом сколидить и остаться висеть в воздухе.

pGib->pev->groupinfo = 1;
UTIL_SetGroupTrace(pGib->pev->groupinfo, GROUP_OP_NAND);
UTIL_SetGroupTrace(pev->groupinfo, GROUP_OP_NAND);


В общем еще вот, к примеру когда я сделал Акимбо Хорнет заметил, если спавнить Хорнетов сразу при стрельбе с двух рук (первичная стреляет по очереди, левая правая, вторичная сразу с двух рук), и оставить код что подправляет траекторию чтобы они летели в центр экрана - то они в друг друга врезаются и падают, в общем опять же, как этот груп инфо сделать так чтобы если что хорнеты пролетали сквозь друг друга, и в тоже время попадали в НПС и наносили им урон, пусть я и убрал подправление траектории в прицел, все равно видно что они бывают в друг друга врезаются.


Отправлено Ku2zoff 09-12-2021 в 15:09:

Цитата:
Chyvachok писал:
как точно этот UTIL_SetGroupTrace работает? Чет я туплю с ним, это надо обоим сущностям ставить одинаковый groupinfo? Просто я так и не понимаю результата конечного.

C++ Source Code:
1
void SV_Impact( edict_t *e1, edict_t *e2, trace_t *trace )
2
{
3
  svgame.globals->time = sv.time;
4
 
5
  if(( e1->v.flags|e2->v.flags ) & FL_KILLME )
6
    return;
7
 
8
  if( e1->v.groupinfo && e2->v.groupinfo )
9
  {
10
    if( svs.groupop == GROUP_OP_AND && !FBitSet( e1->v.groupinfo, e2->v.groupinfo ))
11
      return;
12
 
13
    if( svs.groupop == GROUP_OP_NAND && FBitSet( e1->v.groupinfo, e2->v.groupinfo ))
14
      return;
15
  }
16
 
17
  if( e1->v.solid != SOLID_NOT )
18
  {
19
    SV_CopyTraceToGlobal( trace );
20
    svgame.dllFuncs.pfnTouch( e1, e2 );
21
  }
22
 
23
  if( e2->v.solid != SOLID_NOT )
24
  {
25
    SV_CopyTraceToGlobal( trace );
26
    svgame.dllFuncs.pfnTouch( e2, e1 );
27
  }
28
}

При svs.groupop == GROUP_OP_AND две энтити коллайдят, если у них одинаковый групинфо. При svs.groupop == GROUP_OP_NAND две энтити коллайдят, если у них разные групинфо. Вроде так. Ставь барнаклу и жертве одинаковый групинфо, например энтиндекс барнакла и svs.groupop GROUP_OP_NAND. Нужно число отличное от нуля, иначе механизм будет игнорить. После падения жертвы на землю делай UTIL_UnsetGroupTrace, и ставь жертве pev->groupinfo = 0.

Добавлено 09-12-2021 в 21:50:

C++ Source Code:
1
// в коде барнакла в начале смерти
2
pev->groupinfo = this->entindex();
3
pVictim->pev->groupinfo = this->entindex();
4
UTIL_SetGroupTrace(this->entindex(), GROUP_OP_NAND);
5
 
6
// в коде барнакла в конце смерти
7
pev->groupinfo = 0;
8
 
9
// в коде жертвы
10
if (pev->groupinfo && FBitSet(pev->flags, FL_ONGROUND))
11
{
12
  pev->groupinfo = 0;
13
  UTIL_UnsetGroupTrace();
14
}

Должно работать. Если я не ошибся, по умолчанию всегда GROUP_OP_AND, и pev->groupinfo всех энтить нулевые. Но, важно, чтобы groupinfo были ненулевые. Работает это со всеми энтитями, включая игроков. То есть можно отключить коллизию с тиммейтами, при том, что они смогут друг друга подстрелить.

Добавлено 09-12-2021 в 22:09:

Я сейчас сам попробую разные варианты. Тоже хочу, чтобы барнакл разваливался на куски.


Отправлено Chyvachok 09-12-2021 в 15:41:

Ku2zoff Вроде понял, в UTIL_SetGroupTrace в первую колонку идет номер группы, а во вторую тип коллизии, GROUP_OP_NAND или GROUP_OP_AND .

А вообще, обязательно ли изменять жертву? Просто это еще думать надо куда этот код всунуть еще, чтобы он точно вызвался, жертва ведь может быть кем угодно, и игрок и НПС-ы, это метод надо искать что у всех всегда вызывается.

В Теории достаточно снарядам выставить к примеру при спавне
pev->groupinfo с номером (как я понял любое число кроме 0) и UTIL_SetGroupTrace(this->entindex(), GROUP_OP_NAND);, это по идее должно предотвратить их коллиззию с друг другом и в тоже время оставить коллизию с монстрами? Допустим если я хочу сделать энергодробовик, и хочу быть уверенным что снаряды с собой не сколидят при выстреле.

С кусками тоже придумать надо, надо чтобы они вообще ни с чем кроме геометрии не колидили, можно хоть на клиенте сделать, но они вроде как будут сквозь брашевые энтити вроде лифтов и дверей проходить, тоже не хорошо. Плюс у меня есть еще куски что к стенам липнут, как их портануть на клиент и еще заставить колидить с брашевыми энтитями и чтобы они двигались тоже с дверями и прочим.


Отправлено Ku2zoff 09-12-2021 в 15:59:

Chyvachok я тут покумекал. Короче, с барнаклом решается всё просто:

C++ Source Code:
1
if (HasMemory(bits_MEMORY_KILLED))
2
{
3
  if (ShouldGibMonster(iGib))
4
    CallGibMonster();
5
  return;
6
}
7
 
8
Remember(bits_MEMORY_KILLED);
В самое начало функции CBarnacle :: Killed.
C++ Source Code:
if (ShouldGibMonster(iGib))
{
  CallGibMonster();
  return;
}
Туда же после закомментированной строки // CGib::SpawnRandomGibs( pev, 4, 1 );
C++ Source Code:
if (pev->solid == SOLID_NOT) pev->solid = SOLID_SLIDEBOX;
if (pev->takedamage == DAMAGE_NO) pev->takedamage = DAMAGE_AIM;
В самое начало функции CBarnacle :: WaitTillDead.
За 0.1 секунды, что проходят между Killed и WaitTillDead жертва успевает упасть. А там уже солидность и урон возвращаются. Может быть на высоких фпс или при низкой гравитации жертва не будет успевать выпасть, надо проверять.

Добавлено 09-12-2021 в 22:59:

Гибсы (человеческие, что выплёвываются в момент смерти) могут немного подзастрять в барнакле, но это некритично. Можно написать новую функцию, CBarnacle::SpawnRandomGibs, которая будет спавнить куски чуть ниже, чтобы они не застревали.


Отправлено Chyvachok 09-12-2021 в 17:35:

Кстати, а как сделать спрайт на клиенте который через ТриАпи рисуется чтобы на него влиял свет? Сделал себе следы крови за кусками, которые на Авроре сделаны, но на партикли не влияет свет, для плазмы какой нибуть или огня ракеты норм, но для дыма и кровяки надо напильником подпилить эту систему.


Отправлено Дядя Миша 09-12-2021 в 17:48:

В ксашевской авроре есть освещаемые партиклы.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Chyvachok 09-12-2021 в 18:01:

Дядя Миша а какие ключевые слова отвечают за освещение? CONTENT_SPOTLIGHT или m_iLightingModel?

Добавлено 09-12-2021 в 20:01:

Еще вот, в КсашХТ в triangleapi.h есть в void ( *LightAtPoint)( float *pos, float *value ); но ее нету в обычном ХЛСДК, оно будет работать в халве, если скопипастить? Там еще есть штуки что есть в КсашХТ но нету в обычной Халве.


Отправлено Дядя Миша 09-12-2021 в 18:14:

Цитата:
Chyvachok писал:
Еще вот, в КсашХТ в triangleapi.h есть в void ( *LightAtPoint)( float *pos, float *value ); но ее нету в обычном ХЛСДК, оно будет работать в халве, если скопипастить?

да, это в расширенном халфовском апи её добавили.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Chyvachok 09-12-2021 в 18:21:

Дядя Миша собственно а как через LightAtPoint менять цвет партикли? Тот код что в КсашХТ не совсем копипастится, к примеру этот кусок:

Vector lightColor;

gEngfuncs.pTriAPI->LightAtPoint( part->origin, (float *)&lightColor );
lightColor *= (1.0f / 255.0f);

Тут жалуется на *=, пишет error C2676: binary '*=' : 'Vector' does not define this operator or a conversion to a type acceptable to the predefined operator

Да и честно я так и не придумал, как из вектора мне получит цвет в виде float.


Отправлено FreeSlave 09-12-2021 в 18:40:

Цитата:
Дядя Миша писал:
FL_WORLDBRUSH - это хинт-подсказка, что по такому брашу можно смело ходить, чтоб монстры не тупили. В то время как монстерклип вертикальный и по нему обычно никто не ходит. Так что да, убирай смело.


Вследствие этого появилась другая проблема. Теперь монстры с Monsterclip не осознают, что не могут дойти до ноды, и постоянно перестраивают путь в FGetNodeRoute. Надо как-нибудь для связей выставлять флаг, что она недоступна для монстров с Monsterclip.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Chyvachok 09-12-2021 в 18:54:

Там где рисуется партикля в ParticleSystem::DrawParticle всунул
Vector lightColor;
gEngfuncs.pTriAPI->LightAtPoint( origin, (float *)&lightColor );

И после вывод в консоль чтобы посмотреть что оно выдает, которая выводит lightColor.x, lightColor.y, lightColor.z по x и z всегда ноль, по y какое-то рандомное в зависимости от уровня число которое не зависит от освещенности никак.

Добавлено 09-12-2021 в 20:54:

В общем проблема с LightAtPoint, оно выдает вообще непонятные числа, то минусовые, то гиганские там 9946234623 такого вида, и по одной координате.


Отправлено Ku2zoff 09-12-2021 в 19:13:

Исправил застревание гибсов в умирающем барнакле:

C++ Source Code:
1
void CBarnacle::SpawnGib(void)
2
{
3
  CGib* pGib = GetClassPtr((CGib*)NULL);
4
  pGib->Spawn("models/hgibs.mdl");
5
 
6
  pGib->m_bloodColor = BLOOD_COLOR_RED;
7
  pGib->pev->body = RANDOM_LONG(1, 6);
8
  pGib->pev->solid = SOLID_BBOX;
9
  UTIL_SetSize(pGib->pev, Vector(0, 0, 0), Vector(0, 0, 0));
10
 
11
  pGib->pev->origin = pev->origin - gpGlobals->v_up * pev->size.z * 1.5;
12
  pGib->pev->velocity = g_vecZero;
13
 
14
  pGib->pev->velocity.x += RANDOM_FLOAT(-0.25, 0.25);
15
  pGib->pev->velocity.y += RANDOM_FLOAT(-0.25, 0.25);
16
  pGib->pev->velocity.z += RANDOM_FLOAT(-0.25, 0.25);
17
  pGib->pev->velocity = pGib->pev->velocity * RANDOM_FLOAT(300, 400);
18
 
19
  pGib->pev->avelocity.x = RANDOM_FLOAT(100, 200);
20
  pGib->pev->avelocity.y = RANDOM_FLOAT(100, 300);
21
 
22
  pGib->LimitVelocity();
23
}
Эту функцию нужно добавить в класс CBarnacle, и вызывать её вместо SpawnRandomGibs из HandleAnimEvent в кейсе BARNACLE_AE_PUKEGIB.


Отправлено Crystallize 09-12-2021 в 19:17:

Ku2zoff может такие вещи оформлять отдельными сниппетами-темами в туторах? Яуже со счету сбился сколько вы фиксов к ксашу сделали.

__________________
Вас приветствует персональная защитная система "САХАРА". Для работы в Средах Агрессивного ХАРАктера.
nofunallowed щас инди это по сути синоним "экзотическая игра где будет сказка и грустно


Отправлено Chyvachok 09-12-2021 в 19:28:

Ku2zoff кстати модешь подсказать как быть с освещением у партикли? Хочу сделать чтобы свет влиял на партиклю, но никак не могу сообразить как эту LightAtPoint использовать, она выдает странный результат. Потом как заставлю ее работать нормально завести еще одну опцию в текстовый файл авроры которая бы переключала бы, влияет свет на партиклю или нет.

Вот если что сам код рисования партикли, из Спирита или Паранои, не помню точно:

code:
void ParticleSystem::DrawParticle(particle *part, vec3_t &right, vec3_t &up) { // gEngfuncs.Con_Printf("DrawParticle: size %f, pos %f %f %f\n", part->size, part->origin[0], part->origin[1], part->origin[2]); float fSize = part->m_fSize; vec3_t point1,point2,point3,point4; vec3_t origin = part->origin; // nothing to draw? if (fSize == 0) return; float fCosSize = CosLookup(part->m_fAngle)*fSize; float fSinSize = SinLookup(part->m_fAngle)*fSize; // calculate the four corners of the sprite VectorMA (origin, fSinSize, up, point1); VectorMA (point1, -fCosSize, right, point1); VectorMA (origin, fCosSize, up, point2); VectorMA (point2, fSinSize, right, point2); VectorMA (origin, -fSinSize, up, point3); VectorMA (point3, fCosSize, right, point3); VectorMA (origin, -fCosSize, up, point4); VectorMA (point4, -fSinSize, right, point4); struct model_s * pModel; int iContents = 0; for (particle *pDraw = part; pDraw; pDraw = pDraw->m_pOverlay) { if (pDraw->pType->m_hSprite == 0) continue; if (pDraw->pType->m_iDrawCond) { if (iContents == 0) iContents = gEngfuncs.PM_PointContents(origin, NULL); if (iContents != pDraw->pType->m_iDrawCond) continue; } pModel = (struct model_s *)gEngfuncs.GetSpritePointer( pDraw->pType->m_hSprite ); // if we've reached the end of the sprite's frames, loop back while (pDraw->frame > pModel->numframes) pDraw->frame -= pModel->numframes; while (pDraw->frame < 0) pDraw->frame += pModel->numframes; if ( !gEngfuncs.pTriAPI->SpriteTexture( pModel, int(pDraw->frame) )) continue; gEngfuncs.pTriAPI->RenderMode(pDraw->pType->m_iRenderMode); gEngfuncs.pTriAPI->Color4f( pDraw->m_fRed, pDraw->m_fGreen, pDraw->m_fBlue, pDraw->m_fAlpha ); gEngfuncs.pTriAPI->Begin( TRI_QUADS ); gEngfuncs.pTriAPI->TexCoord2f (0, 0); gEngfuncs.pTriAPI->Vertex3fv(point1); gEngfuncs.pTriAPI->TexCoord2f (1, 0); gEngfuncs.pTriAPI->Vertex3fv (point2); gEngfuncs.pTriAPI->TexCoord2f (1, 1); gEngfuncs.pTriAPI->Vertex3fv (point3); gEngfuncs.pTriAPI->TexCoord2f (0, 1); gEngfuncs.pTriAPI->Vertex3fv (point4); gEngfuncs.pTriAPI->End(); } }


Отправлено Ku2zoff 09-12-2021 в 20:11:

Цитата:
Crystallize писал:
может такие вещи оформлять отдельными сниппетами-темами в туторах

Этим надо кому-то заняться и прошерстить за пару месяцев все темы по нубским вопросам, туторам, ксашу. Вообще всю ветку Half-Life SDK и частично Наши проекты. Долго это.
Цитата:
Chyvachok писал:
Тут жалуется на *=, пишет error C2676: binary '*=' : 'Vector' does not define this operator or a conversion to a type acceptable to the predefined operator

Да и честно я так и не придумал, как из вектора мне получит цвет в виде float.
C++ Source Code:
lightColor = lightColor * (1.0f / 255.0f);

У класса Vector в халфе нету нужных операторов +=, -=, *=, /= для работы с флоатами. Если очень надо, можно стащить из ReGameDLL:
C++ Source Code:
decltype(auto) operator+=(float fl) { return (*this = *this + fl); }
decltype(auto) operator-=(float fl) { return (*this = *this - fl); }
decltype(auto) operator*=(float fl) { return (*this = *this * fl); }
decltype(auto) operator/=(float fl) { return (*this = *this / fl); }


Отправлено Chyvachok 09-12-2021 в 20:21:

Ku2zoff тут даже не в *= дело - сам LightAtPoint не работает.

Добавлено 09-12-2021 в 22:21:

Он вместо освещенности в диапазоне 1-255 выдает некое число которое зависит от того куда смотрит игрок. pDraw->origin это ж позиция партикли? Хотя я пробовал и part->origin и что только можно. ХЗ почему в КсашХТ оно работает а тут нет.


Отправлено Ku2zoff 09-12-2021 в 20:26:

Вообще, в ReGameDLL расширенный класс Vector, который позволяет всякие операции вроде

C++ Source Code:
pev->velocity /= 2;
вместо
C++ Source Code:
pev->velocity = pev->velocity / 2;


Отправлено Chyvachok 09-12-2021 в 20:30:

Ku2zoff тут не в векторе дело, в самом gEngfuncs.pTriAPI->LightAtPoint( pDraw->origin, (float *)&lightColor );

Оно возращяет странный результат, который вообще с освещением не связян. Я с помощью этого кода смотрел что оно выводит: gEngfuncs.Con_Printf("Light X %f, Light Y %f, Light z %f\n", lightColor.x, lightColor.y, lightColor.z); Не важно, есть ли lightColor = lightColor * (1.0f / 255.0f); или нет.


Отправлено Ku2zoff 09-12-2021 в 20:31:

Цитата:
Chyvachok писал:
Он вместо освещенности в диапазоне 1-255 выдает некое число которое зависит от того куда смотрит игрок.

C++ Source Code:
Color 0.749020 0.749020 0.533333

У меня вот такой вывод в консоль. Диапазон от 0 до 1. В качестве точки, откуда берётся освещённость взят вектор v_origin. Чем ярче место, где стоит игрок, тем больше цифры.


Отправлено Chyvachok 09-12-2021 в 20:35:

У меня по всем координатам кроме одной 0, если есть lightColor = lightColor * (1.0f / 255.0f); то везде нули, если нет этой строки в lightColor.y чисто которое меняется от того куда смотрит игрок, либо -0.821521 либо 0.812312 либо что-то по средине. Оно меняется если камерой смотреть в разную сторону, освещение никак не влияет на него.

Добавлено 09-12-2021 в 22:34:

Вставлял я его в ту часть когда где эффект рисуется, где gEngfuncs.pTriAPI->Color4f

Добавлено 09-12-2021 в 22:35:

Пробовал в другой метод вставлять, Update Particle там вообще дичь, числа 6423573.23423 и так далее.


Отправлено Ku2zoff 09-12-2021 в 20:41:

Chyvachok попробуй засунуть в HUD_DrawTransparentTriangles

C++ Source Code:
1
Vector lightColor;
2
 
3
gEngfuncs.pTriAPI->LightAtPoint(v_origin, (float*)&lightColor);
4
lightColor = lightColor * (1.0f / 255.0f);
5
 
6
gEngfuncs.Con_DPrintf("Color %f %f %f\n", lightColor.x, lightColor.y, lightColor.z);
и глянуть вывод в консоли.

Добавлено 10-12-2021 в 03:41:

Ссылку на v_origin не забудь. Если будет нормально, выведи в консоль что выдаёт pDraw->origin, может быть в этом проблема.


Отправлено Chyvachok 09-12-2021 в 20:50:

v_origin это над методом void DLLEXPORT HUD_DrawTransparentTriangles( void ) добавить extern vec3_t v_origin;?

Пробовал пишет 0 0 0 снизу OPENGL_ERROR: GL_INVALID_ENUM_CALLED


Отправлено Ku2zoff 09-12-2021 в 20:52:

Chyvachok да, верно. Интересная ошибка. Какой движок и какой мод?


Отправлено Chyvachok 09-12-2021 в 20:53:

Кстати этот же OPENGL_ERROR: GL_INVALID_ENUM_CALLED пишет и когда в партилклях вызывается.

Добавлено 09-12-2021 в 22:53:

Двиг Ксаш, код обычный ХЛСДК, не КсашХТ.


Отправлено Ku2zoff 09-12-2021 в 20:55:

В голдсорсе мой код работает и пишет правильные значения, попробуй запустить под ним.


Отправлено Chyvachok 09-12-2021 в 21:01:

Вроде заработало в HUD_DrawTransparentTriangles, дело было в triangleapi.h, у меня изначально не было там LightAtPoint, я скопировал только LightAtPoint, теперь я скопирал вообще все что было из более нового СДК, вроде теперь пишет что надо. Остальные методы, там Color4fRendermode, BoxInPVS и так далее.

Добавлено 09-12-2021 в 23:01:

Что-то вроде в духе такого уже выводит 0.749020 0.749020 0.533333 и в коде партиклей.


Отправлено Ku2zoff 09-12-2021 в 21:05:

Цитата:
Chyvachok писал:
у меня не было там LightAtPoint

Обнови HLSDK до актуальной версии.
Цитата:
Chyvachok писал:
я скопировал только LightAtPoint

Так там порядок важен. Последнее, что есть в SDK 2.3 - ScreenToWorld. В новом SDK после него GetMatrix, BoxInPVS и только потом LightAtPoint. Не зря же при реверс инжиниринге втыкают заглушки вместо отсутствующих экспортов. Вот функция тебе и возвращала чёрт знает что, потому что по факту ты вызывал GetMatrix. Это, кстати, объясняет то, что значения менялись при повороте камеры.


Отправлено Chyvachok 09-12-2021 в 21:11:

Цитата:
Ku2zoff писал:
Обнови HLSDK до актуальной версии.


не знаю где его качать, и моды на последней версии, вроде того же Халф Пейна не работают под Ксашем или Пираткой. Сколько искал, не нашел чтобы кто-то новую версию ГолдСорца спиратил, не думаю что мне он актуален будет.


Отправлено Ku2zoff 09-12-2021 в 21:26:

Цитата:
Chyvachok писал:
не знаю где его качать

Это шутка? https://github.com/ValveSoftware/ha...eads/master.zip
Только осторожно, в клиентку линкуется SDL. Работать под ванильным ксашем не будет, только под FWGS. Если не хочешь отказываться от ванильного ксаша, обнови все хедеры в папках common и engine, заменив их на одноимённые из последнего билда ксаша (4529).

Добавлено 10-12-2021 в 04:26:

Цитата:
Chyvachok писал:
не нашел чтобы кто-то новую версию ГолдСорца спиратил

Есть довольно свежие билды, в основном сборки CS 1.6. Зачем пиратить голдсорс для запуска модов, если есть свенкооп в стиме? Кидаешь папку valve в корень свена, в либлисте мода пишешь fallback_dir "valve" и гамай на здоровье. У свен энджин лимиты будь здоров, там карта со стороной 172 тысячи юнитов и количество моделей/спрайтов/клипнодов и прочего просто запредельное. То есть, можно делать мод, не использующий какие-то фичи ксаша, а только лишь требующий повышенных лимитов на свежем HLSDK. И поиграть в него смогут даже копирасты-буржуи, которые не юзают ксаш принципиально.


Отправлено Chyvachok 09-12-2021 в 21:28:

Я не помню откуда качал СДК но с задницы какой-то, забыл что он на Гите есть.

Добавлено 09-12-2021 в 23:28:

Цитата:
Chyvachok писал:
Есть довольно свежие билды, в основном сборки CS 1.6. Зачем пиратить голдсорс для запуска модов, если есть свенкооп в стиме? Кидаешь папку valve в корень свена, в либлисте мода пишешь fallback_dir "valve" и гамай на здоровье.


Не знал что оно так работать будет, думал что он чисто под Свен заточен, Свен есть, как и Стим для игры в бесплатные моды что Source SDK Base используют, для них не надо ХЛ2 иметь купленный. Кстати а Свен двиг без запуска самого стима пашет?


Отправлено Ku2zoff 09-12-2021 в 21:35:

Чтобы последний сдк был совместим с ксашем, надо вернуть старый инпут из версии 2.3, и ещё прилинковать старую vgui.lib оттуда же. Короче, немного работы с клиенткой. В XDM 3.0.3.8 всё это можно подглядеть, Мастер обернул #ifdef'ами все нужные места.

Добавлено 10-12-2021 в 04:35:

Цитата:
Chyvachok писал:
Свен двиг без запуска самого стима пашет

Неа.
Цитата:
Chyvachok писал:
думал что он чисто под Свен заточен

Совместимость с халфой есть. Я первую главу Invasion прошёл без проблем. Клиентку, правда, собирал сам, потому что от версии к версии нового голдсорса баг с мышью в клиентках, собранных из сорцев с гитхаба, то появляется, то пропадает. То он есть всегда, то только при m_rawinput 1, то его нет.


Отправлено Дядя Миша 10-12-2021 в 06:00:

Цитата:
Chyvachok писал:
В общем проблема с LightAtPoint, оно выдает вообще непонятные числа, то минусовые, то гиганские там 9946234623 такого вида, и по одной координате.

это не он выдаёт, это мусор на стеке.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Chyvachok 10-12-2021 в 12:57:

В общем сделал эту аврорку, чтобы свет на нее влиял, и приделал опцию которая бы читалась из txt файла и влияла, освещается партикл или нет.

Осталось придумать с сервером, Аврора не сохраняется, и след исчезает у сущности если сохранится и загрузится, я вот думаю, а как сделать функцию, которая бы вызывалась только после того как игрок загрузился? Которая бы след восстанавливала бы.


Отправлено Ku2zoff 10-12-2021 в 13:01:

Chyvachok SendInitMessage из первой паранойи. Ну или Xash PostActivate System. Первое работает и в мультиплеере. Второе только в сингле.

Добавлено 10-12-2021 в 20:01:

Ещё DesiredAction из спирита. Правда оно больше для мовевитча, и посылка мессаг на клиент сделана через него, потому что по таймингам попадает в нужный промежуток.


Отправлено Chyvachok 10-12-2021 в 15:13:

Еще тоже с кусками и авророй, у меня след удаляется в функции WaitTillLand, но как я понял если куски пропадают из поля зрения, то игра их удаляет, а след остается, не очень удобно что вручную нужно удалять саму систему: https://imgur.com/a/gifVyNo

На этой карте видно как вообще игра их удаляет чуть ли не на глазах, а система остается, загвоздка в том что я не нашел через какую функцию игра чистит куски, чтобы туда код удаляющий след влепить.

Добавлено 10-12-2021 в 15:16:

Цитата:
Ku2zoff писал:
Chyvachok SendInitMessage из первой паранойи.


Надо будет посмотреть, это на клиент отправляет или на сервере, мне надо у самого снаряда вызывать эту функцию после загрузки сохранения, я как-то делал давно, когда юзал эту Аврору, но это был КсашХТ и с тер пор прошло много времени, я этот код потерял. Главное что на Клиенте в этой авроре вроде есть код, который должен удалять партиклю если нет сущности, но видимо он не работает.

Добавлено 10-12-2021 в 16:00:

https://imgur.com/a/gifVyNo

С неисчезающими следом, это не в удалении кусков дело, они в этом моменте падают под пол - он не солидный, и под ним пол без текстуры, можно грены покидать, они тоже проваливаться будут, и так как кусков не видно, их проигрывание останавливается, то есть если залететь ноклипом под пол чтобы было видно куски то партикль дальше проиграется. Такая фигня - если источника партикла не видно, то его проигрывание останавливается, и такой статичный фонтачник остается.

Добавлено 10-12-2021 в 17:13:

// Don't update if the system is outside the player's PVS.
//if(!source || source->curstate.messagenum < messagenum)
// return true;

Если убрать код который останавливает апдейт системы частиц, если они вне поля зрения, то оно тоже не совсем фиксит проблему, партикль висит на месте где кусок улетел в нарнию, кстати в руках детонатор не зря, сатчелы тоже под полом: https://imgur.com/a/fCdmMyd


Отправлено Ku2zoff 10-12-2021 в 16:19:

Цитата:
Chyvachok писал:
source->curstate.messagenum < messagenum

Актуально только в сингле, кстати.


Отправлено Aynekko 10-12-2021 в 18:08:

Подскажите пожалуйста. Перенес TE_GUNSHOTDECAL на клиент. Код-то я сделал:

C++ Source Code:
1
case TE_GUNSHOTDECAL:
2
{
3
  pos.x = READ_COORD();
4
  pos.y = READ_COORD();
5
  pos.z = READ_COORD();
6
  entityIndex = READ_SHORT();
7
  decalIndex = READ_BYTE();
8
  gEngfuncs.pEfxAPI->R_FireCustomDecal( decalIndex, entityIndex, 0, pos, 0, 1 );
9
}
10
break;

А потом столкнулся с проблемой. На клиенте нет pfnDecalIndex. Что делать?

Добавлено 10-12-2021 в 21:08:

Что-то я так посмотрел, в ксаш-движке вообще не вижу R_FireCustomDecal. Она только r_efx.h упоминается. Похоже, вообще клиентские декали никак не сделать

__________________
Мой мод на Xash


Отправлено Дядя Миша 10-12-2021 в 18:18:

Цитата:
Aynekko писал:
На клиенте нет pfnDecalIndex. Что делать?

ну вот в EfxAPI она есть. Оттуда вызывай.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Aynekko 10-12-2021 в 18:54:

Цитата:
Дядя Миша писал:
в EfxAPI она есть

Ах вот оно где запряталось. Все работает, спасибо. Только все равно я не могу понять, где вообще эта функция R_FireCustomDecal находится, если она натурально упоминается только в h файлах? Подменяется чем-то видимо…

__________________
Мой мод на Xash


Отправлено Chyvachok 10-12-2021 в 20:17:

Ну и говно это Аврора.

Добавлено 10-12-2021 в 22:17:

Код из Спирита-Паранои не дописан толком, а из Ксаша попробуй утяни, там ведь рендер свой, тем кто шарит в програмировании да, проблем нет никаких, но тем кто нет, очень сложно. Не удивительно честно учитывая как она пашет, что никто не юзал ее для следов-снарядов кроме мода Alternative Way.

Она еще глючит начинает когда партиклей много спавнится, к примеру когда сразу много врагов гибаешь, они перестают исчезать и прочая дичь начинается, тоже самое с следом снарядов. Месага удаления тоже, она вообще не принималась пока я не пофиксил, но опять же - она резко удаляет партикл систему, то есть спрайты вместо того чтобы сами по себе растворится резко исчезают.


Отправлено [CFR] [email protected]@N 10-12-2021 в 21:06:

Chyvachok
В XDM погляди партеклсистему.. Она тпм годная и исходники открыты.


Отправлено Chyvachok 10-12-2021 в 21:29:

[CFR] [email protected]@N она добавлена уже, пусть и с более старой версии, но там немного другие функции. Аврора это всякий там дымок, или следы типа след снаряда, но работает она через зад, как оказалось. А фиксить честно пока не осилил, в КсашХТ лучше работает вроде, хотя опять же, надо тестить, но там рендер другой, надо шарить как код этого клиента устроен, чтобы портануть хотя бы.


Добавлено 10-12-2021 в 23:29:

У ХДМ-овской тоже есть недостатки, она вся захардкодена, любое изменение требует компиляции движка, не читает параметры как автора из текстовых файлов и нету никакого визуального редактора.


Отправлено Ku2zoff 10-12-2021 в 22:26:

Цитата:
Chyvachok писал:
Ну и говно это Аврора.

Она позволяет делать только то, что распыляется. Огонь, дым от огня, дым от попадания пуль в стенки, пар из трубы, след ракеты и проч. Ещё намертво привязана к энтитям-эмиттерам в оригинале.
Цитата:
[CFR] [email protected]@N писал:
В XDM погляди партеклсистему..

Цитата:
Chyvachok писал:
она вся захардкодена

Эту систему нельзя рассматривать как скриптовую для мапперов. Это скорее замена pEfxAPI для кодеров, чтобы не упереться в лимит темпэнтить. Хочешь много возможностей - будь добр кодить. К сожалению, в последней версии 3.0.3.8 она обросла каким-то крутым кодом, что соответствует современным стандартам, но усложняет не только копипасту, но и отладку. Хотелось бы увидеть версию 3.0.4.0, но я так и не понял, какую загадку загадал Мастер. У него с версии 3.0.3.8 славная торадицыя - не выкладывать сорцы по человечески, а заниматься какой-то фигнёй.

Добавлено 11-12-2021 в 05:18:

Chyvachok если тебе нужна кровяка от гибсов, выкинь аврору и укради позаимствуй код Smoke Puff из паранойи. У PLut'а в BDef'е, как он писал, все партиклевые эффекты на нём основаны.

Добавлено 11-12-2021 в 05:26:

Для начала рекомендую сделать гибсы темпэнтитями. В HUD_AddEntity цеплять им партиклевый эффект, в HUD_TempEntUpdate ставить декали при коллизии и выключать партиклевый эффект, когда гибс сдохнет. Потом, когда всё будет отлажено, можно прикрепить эти эффекты к обычным серверным гибсам. Код из HUD_AddEntity перекочует в мессагу, а код из HUD_TempEntUpdate куда-нибудь в DrawTransparentTriangles. И то, необязательно делать второе. При смерти гибса достаточно отправить вторую мессагу.
Поделись спрайтами крови, если не жалко, или скажи где взял. У меня зачесались руки накодить то, что не получается у тебя. Хотя меня обычная кровь устраивает. Сижу дома с температурой, заняться нечем.


Отправлено Chyvachok 10-12-2021 в 23:11:

Цитата:
Ku2zoff писал:
Поделись спрайтами крови, если не жалко, или скажи где взял. У меня зачесались руки накодить то, что не получается у тебя. Хотя меня обычная кровь устраивает. Сижу дома с температурой, заняться нечем.


Сами aur файлы из Alternative Way взяты - они используют стандартный bloodspray.spr из папки valve. Думал это аврору не только для кровяки, но и для РПГ и энергопушек приспособить, но с ней возни и проблем столько.

Но если надо, могу из какого нибуть Ballistic Weapons спрайты вынуть.

Цитата:
Ku2zoff писал:
Chyvachok если тебе нужна кровяка от гибсов, выкинь аврору и укради позаимствуй код Smoke Puff из паранойи. У PLut'а в BDef'е, как он писал, все партиклевые эффекты на нём основаны.


Пробовал, след плазмы сделать, но пока не очень красиво получается на их основе.

Добавлено 11-12-2021 в 01:06:

Что-то такое наваял, но честно не очень нравится, не получается как у Plut чтобы красивые эффекты были.

code:
Эвент: void EV_RocketTrailCallback ( struct tempent_s *ent, float frametime, float currenttime ) { if ( currenttime < ent->entity.baseline.fuser1 ) return; if ( ent->entity.origin == ent->entity.attachment[0] ) ent->die = gEngfuncs.GetClientTime(); else VectorCopy ( ent->entity.origin, ent->entity.attachment[0] ); float puff_speed = 400, puff_size = 16, speed_side = 0; VectorNormalize(ent->entity.angles); // there is surface normal actually CObject *pObj = new CPlasmaTrailPart( ent->entity.origin, ent->entity.angles, 0.2, 1, puff_speed, puff_size, speed_side, "sprites/plasma_pistol_trail.spr", 1 ); g_objmanager.AddObject(pObj); dlight_t *dl = gEngfuncs.pEfxAPI->CL_AllocDlight ( 0 ); VectorCopy ( ent->entity.origin, dl->origin ); dl->radius = 64; //128 dl->dark = true; dl->die = gEngfuncs.GetClientTime() + 0.001; //Kill it right away dl->color.r = 0; dl->color.g = 180; dl->color.b = 0; } Сам след. CPlasmaTrailPart::CPlasmaTrailPart( vec3_t origin, vec3_t normal, float fLife, float fAlpha, float fVelocity, float fSize, float maxofs, char model [64], int iType, float r, float g, float b) { vec3_t up, right; VectorClear(right); VectorClear(up); MakeUpRight(normal, up, right); m_fAlpha = fAlpha; m_fLife = fLife; m_fr = r; m_fg = g; m_fb = b; spr = SPR_Load(model); m_iType = iType; VectorCopy(origin, PuffOrigin); PuffSize = fSize; VectorClear(PuffVelocity); VectorMA(PuffVelocity, fVelocity, normal, PuffVelocity); VectorMA(PuffVelocity, gEngfuncs.pfnRandomFloat(-maxofs, maxofs), right, PuffVelocity); VectorMA(PuffVelocity, gEngfuncs.pfnRandomFloat(-maxofs, maxofs), up, PuffVelocity); } int CPlasmaTrailPart::Draw(float time, float frametime) { float frac = (time - birthTime) / m_fLife; if (frac > 1) return 1; // delete object if (!spr) { gEngfuncs.Con_Printf("error: cant load sprite\n"); return 1; } CalcViewMatrix(); struct model_s *pModel = (struct model_s *)gEngfuncs.GetSpritePointer( spr ); int frame = (int)(pModel->numframes * frac); gEngfuncs.pTriAPI->RenderMode(kRenderTransAdd); gEngfuncs.pTriAPI->SpriteTexture( pModel, frame ); float alpha = m_fAlpha * (1 - frac); gEngfuncs.pTriAPI->Color4f( m_fr, m_fg, m_fb, alpha ); gEngfuncs.pTriAPI->CullFace( TRI_NONE ); gEngfuncs.pTriAPI->Begin( TRI_QUADS ); float size = PuffSize * (1 - frac); VectorMA(PuffOrigin, frametime, PuffVelocity, PuffOrigin); g_viewMatrix[0][3] = PuffOrigin[0]; // write origin to matrix g_viewMatrix[1][3] = PuffOrigin[1]; g_viewMatrix[2][3] = PuffOrigin[2]; gEngfuncs.pTriAPI->TexCoord2f( 0, 0 ); SetPoint(0, size ,size, g_viewMatrix); gEngfuncs.pTriAPI->TexCoord2f( 0, 1 ); SetPoint(0, size ,-size, g_viewMatrix); gEngfuncs.pTriAPI->TexCoord2f( 1, 1 ); SetPoint(0, -size ,-size, g_viewMatrix); gEngfuncs.pTriAPI->TexCoord2f( 1, 0 ); SetPoint(0, -size ,size, g_viewMatrix); gEngfuncs.pTriAPI->End(); gEngfuncs.pTriAPI->RenderMode(kRenderNormal); return 0; }


Добавлено 11-12-2021 в 01:11:

С кусками интересно бы сделать их чисто клиентские, они все равно на игру не влияют никак, и Stycky Gib-ы тоже бы как-то портануть на клиент, это которые к стенам липнут, я им даже модель улучшил. Вот кстати мой ретекстур Стики Гибов: https://files.gamebanana.com/bitpit/stickygib.rar


Отправлено Ku2zoff 10-12-2021 в 23:35:

Цитата:
Chyvachok писал:
С кусками интересно бы сделать их чисто клиентские

Да, но есть проблемка. Их надо как-то фильтровать, чтобы знать, что это именно гибсы. Самый простой вариант - по модели. Отправляем на клиент TE_BREAKMODEL с моделькой мясных кусков, отлавливаем темпэнтитю в HUD_AddEntity по названию модели, ставим ей новый флаг FTENT_GIB, например (флагов 21, можно добавить свои), а дальше - вперёд и с песней в HUD_TempEntUpdate рисовать декали при коллизии с бсп.
Цитата:
Chyvachok писал:
пока не очень красиво получается на их основе

Надо поиграться с параметрами, чтобы шлейф из спрайтов вытягивался в линию. Я уже сделал новый класс CBloodTrail со спрайтом bloodspray.spr, пытаюсь научить его распыляться как аврору. По задумке сразу все спрайты рисуются и разлетаются, а нам надо рисовать массив по очереди. И как только последний достигнет нужного размера, "убивать" его, и создавать новый, маленький, в точке отсчёта.
Цитата:
Chyvachok писал:
Stycky Gib-ы тоже бы как-то портануть на клиент

Наверное можно сделать так, как я предложил, с тем лишь отличием, что при первом коллайде у модели занулиться скорость, и она "прилипнет" к стене.
Лучше куски всё-таки делать на сервере, потому что от клиентских не будут сохраняться декали. У меня уже есть спрайтовые декали, которые пишутся в сейв, так что я бы мог это приспособить.
Пропробую накодить эту кровь от кусков, а потом надо заняться заменой темпэнтить на элементы RenderSystem из XDM. Она умеет почти во всё: искры, круги, эффекты типа env_funnel и проч.


Отправлено Дядя Миша 11-12-2021 в 07:57:

Цитата:
Chyvachok писал:
Она еще глючит начинает когда партиклей много спавнится, к примеру когда сразу много врагов гибаешь, они перестают исчезать и прочая дичь начинается, тоже самое с следом снарядов

Самая главная беда авроры - там почему-то Лаури не обнулил переменные.
Вот её и колбасит. Ну в ксаше, я естественно, это сделал.
Цитата:
Chyvachok писал:
в КсашХТ лучше работает вроде, хотя опять же, надо тестить, но там рендер другой, надо шарить как код этого клиента устроен

Аврора в ксаш-моде специально оставлена совместимой с HL. Она ничего не затрагивает из рендерера ксаш-мода. Её можно брать целиком и копипастить в халфу.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено [CFR] [email protected]@N 11-12-2021 в 10:07:

Цитата:
Ku2zoff писал:
У меня уже есть спрайтовые декали, которые пишутся в сейв, так что я бы мог это приспособить


Можно по подробние про это? В чом отличие от оригинала?

Добавлено 11-12-2021 в 13:07:

Цитата:
Chyvachok писал:
Пробовал, след плазмы сделать, но пока не очень красиво получается на их основе.

Ну у тебя тоже заардкожино всё будет)))
Ваще я так понял такой же визуальный ридактор и тхт файл никто больше ниосилел из авторов партекл систем. Походу оно ни так просто зделать


Отправлено Ku2zoff 11-12-2021 в 12:02:

Цитата:
[CFR] [email protected]@N писал:
Можно по подробние про это? В чом отличие от оригинала?

Декали из спрайтов, а не из картинок в ваде. Могут анимироваться, менять размер на ходу, много чего ещё. В основе декали из инвазиона. Они прикольные, но исчезают после загрузки или перехода на новый уровень. Это я почти заборол, могут иногда пропадать с движущихся энтить при загрузке и переходе. Ещё обрезку по краям брашей не сделал - половина декали может висеть в пустоте. Собсно, в инвазионе это не слишком бросалось в глаза, т.к. там только дырки от пуль. А я планирую пятна крови, взрывов и ещё что-нибудь. Как только победю отваливание от движущихся энтить - займусь обрезкой.

Добавлено 11-12-2021 в 19:02:

Цитата:
[CFR] [email protected]@N писал:
Походу оно ни так просто зделать

Самая сложность в том, какой функционал задать самой системе. В идеале, она должна уметь всё, что умеют pEfxAPI (касаемо спрайтов), аврора и дождик БУзера. То есть тут не просто какие-то дымки от выстрелов в стену, и не просто дым, рассеивающийся из трубы. Тут и лучи, закрученные в спираль, и закольцованные лучи, и лучи с шумом, и прыгающие от пола спрайты гаусса, и искры от выстрелов из инвазиона, и эффекты телепортов, дофигища всего. Накодить это можно, в XDM очень многое уже есть. Другой вопрос как всё это унифицировать, чтобы у совершенно разных систем, например искр и кольца от взрыва не было дублирующихся параметров, и как вообще это всё сохранять в скрипт.
Будет готовая система - можно будет и редактор написать. Только вот нужна ли она, именно такая система? В большинстве случаев функционал будет избыточным. Всё, на что хватает фантазии у моддеров - повторять чужие эффекты. Поэтому Дядя Миша просто взял, и портировал аврору в ксаш с исправлениями. Подавляющее большинство моддеров даже чужие aur-файлы берут. Те самые, которые Лаури как примеры к спириту приложил. Даже те, кто умеет кодить, не раскрывают в полной мере возможности pEfxAPI. Нет примеров, нет документации.


Отправлено Chyvachok 11-12-2021 в 13:21:

Цитата:
Ku2zoff писал:
А я планирую пятна крови, взрывов и ещё что-нибудь.


Если нужны более качественные спрайты вот из Ballistic Weapons кровяха: https://files.gamebanana.com/bitpit...eaponsblood.rar

Могу еще следы от пуль и взрывов скинуть.


Отправлено Дядя Миша 11-12-2021 в 14:40:

Цитата:
Ku2zoff писал:
Как только победю отваливание от движущихся энтить - займусь обрезкой.

Ну в ксаше же не отваливаются. Даже с монстров. Смотри как там устроено. Оно несложное, если разберёшься с переходом из глобального в локальное пространство.

Цитата:
Ku2zoff писал:
Поэтому Дядя Миша просто взял, и портировал аврору в ксаш с исправлениями.

К Авроре Ксер в свое время редактор написал. У нее на мой взгляд был только один недостаток - баги. Ну вот я их и поправил, а функционал немного дополнил. Сделал проекцию светового пятна на партиклы и всё такое.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Chyvachok 11-12-2021 в 17:57:

Такой вариант сделать другой цвет крови при выстреле в голову нормальный? Пока вижу что есть шанс если монстра разорвет на мясо выстрелом в голову, то куски будут желтую кровь оставлять, а если в тело то красную. Хотя как вариант влепить в Gib Monster проверку возвращающую цвет крови, или это лишняя проверка будет?

code:
void CZombie :: TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) { switch ( ptr->iHitgroup ) { case HBOX_HEAD: m_bloodColor = BLOOD_COLOR_YELLOW; break; } CBaseMonster::TraceAttack( pevAttacker, flDamage, vecDir, ptr, bitsDamageType ); if (m_bloodColor = BLOOD_COLOR_YELLOW) m_bloodColor = BLOOD_COLOR_RED; }


Отправлено Ku2zoff 11-12-2021 в 23:43:

Короче, я пошёл по пути самурая. CZombie::TraceBleed с аргументом цвета крови, что логично. CZombie::TraceAttack, CZombie::GibMonster, CZombie::SpawnGibs. Последнее делать не хотелось, но гибсы из SpawnRandomGibs по-умолчанию принимают цвет крови владельца. Пришлось сделать для зомби кастомную функцию, чтобы задать цвет вручную.

C++ Source Code:
1
#include "weapons.h"
2
 
3
void CZombie::TraceAttack(entvars_t* pevAttacker, float flDamage, Vector vecDir, TraceResult* ptr, int bitsDamageType)
4
{
5
  if (pev->takedamage)
6
  {
7
    m_LastHitGroup = ptr->iHitgroup;
8
 
9
    switch (ptr->iHitgroup)
10
    {
11
    case HITGROUP_HEAD:
12
        SpawnBlood(ptr->vecEndPos, BLOOD_COLOR_YELLOW, flDamage);
13
      TraceBleed(BLOOD_COLOR_YELLOW, flDamage, vecDir, ptr, bitsDamageType);
14
      break;
15
    default:
16
        SpawnBlood(ptr->vecEndPos, BLOOD_COLOR_RED, flDamage);
17
      TraceBleed(BLOOD_COLOR_RED, flDamage, vecDir, ptr, bitsDamageType);
18
      break;
19
    }
20
    AddMultiDamage(pevAttacker, this, flDamage, bitsDamageType);
21
  }
22
}
23
 
24
void CZombie::TraceBleed(int bloodColor, float flDamage, Vector vecDir, TraceResult* ptr, int bitsDamageType)
25
{
26
  if (flDamage == 0) return;
27
 
28
  if (!(bitsDamageType & (DMG_CRUSH | DMG_BULLET | DMG_SLASH | DMG_BLAST | DMG_CLUB | DMG_MORTAR))) return;
29
 
30
  TraceResult Bloodtr;
31
  Vector vecTraceDir;
32
  float flNoise;
33
  int cCount;
34
  int i;
35
 
36
 
37
  if (flDamage < 10)
38
  {
39
    flNoise = 0.1;
40
    cCount = 1;
41
  }
42
  else if (flDamage < 25)
43
  {
44
    flNoise = 0.2;
45
    cCount = 2;
46
  }
47
  else
48
  {
49
    flNoise = 0.3;
50
    cCount = 4;
51
  }
52
 
53
  for (i = 0; i < cCount; i++)
54
  {
55
    vecTraceDir = vecDir * -1;
56
    vecTraceDir.x += RANDOM_FLOAT(-flNoise, flNoise);
57
    vecTraceDir.y += RANDOM_FLOAT(-flNoise, flNoise);
58
    vecTraceDir.z += RANDOM_FLOAT(-flNoise, flNoise);
59
 
60
    UTIL_TraceLine(ptr->vecEndPos, ptr->vecEndPos + vecTraceDir * -172, ignore_monsters, ENT(pev), &Bloodtr);
61
 
62
    if (Bloodtr.flFraction != 1.0) UTIL_BloodDecalTrace(&Bloodtr, bloodColor);
63
  }
64
}
65
 
66
void CZombie::GibMonster(void)
67
{
68
  TraceResult	tr;
69
  BOOL		gibbed = FALSE;
70
 
71
  EMIT_SOUND(ENT(pev), CHAN_WEAPON, "common/bodysplat.wav", 1, ATTN_NORM);
72
 
73
  if (CVAR_GET_FLOAT("violence_hgibs") != 0)
74
  {
75
    SpawnGibs(3, 1);
76
    gibbed = TRUE;
77
  }
78
 
79
  if (CVAR_GET_FLOAT("violence_agibs") != 0)
80
  {
81
    SpawnGibs(3, 0);
82
    gibbed = TRUE;
83
  }
84
 
85
  if (gibbed)
86
  {
87
    SetThink(&CBaseMonster::SUB_Remove);
88
    pev->nextthink = gpGlobals->time;
89
  }
90
  else FadeMonster();
91
}
92
 
93
void CZombie::SpawnGibs(int cGibs, int human)
94
{
95
  int cSplat;
96
 
97
  for (cSplat = 0; cSplat < cGibs; cSplat++)
98
  {
99
    CGib* pGib = GetClassPtr((CGib*)NULL);
100
 
101
    if (human)
102
    {
103
      pGib->Spawn("models/hgibs.mdl");
104
      pGib->pev->body = RANDOM_LONG(1, 6 - 1);
105
      pGib->m_bloodColor = BLOOD_COLOR_RED;
106
    }
107
    else
108
    {
109
      pGib->Spawn("models/agibs.mdl");
110
      pGib->pev->body = RANDOM_LONG(0, 4 - 1);
111
      pGib->m_bloodColor = BLOOD_COLOR_YELLOW;
112
    }
113
 
114
    pGib->pev->origin.x = pev->absmin.x + pev->size.x * (RANDOM_FLOAT(0, 1));
115
    pGib->pev->origin.y = pev->absmin.y + pev->size.y * (RANDOM_FLOAT(0, 1));
116
    pGib->pev->origin.z = pev->absmin.z + pev->size.z * (RANDOM_FLOAT(0, 1)) + 1;
117
 
118
    pGib->pev->velocity = g_vecAttackDir * -1;
119
 
120
    pGib->pev->velocity.x += RANDOM_FLOAT(-0.25, 0.25);
121
    pGib->pev->velocity.y += RANDOM_FLOAT(-0.25, 0.25);
122
    pGib->pev->velocity.z += RANDOM_FLOAT(-0.25, 0.25);
123
 
124
    pGib->pev->velocity = pGib->pev->velocity * RANDOM_FLOAT(300, 400);
125
 
126
    pGib->pev->avelocity.x = RANDOM_FLOAT(100, 200);
127
    pGib->pev->avelocity.y = RANDOM_FLOAT(100, 300);
128
 
129
    if (pev->health > -50) pGib->pev->velocity = pGib->pev->velocity * 0.7;
130
    else if (pev->health > -200) pGib->pev->velocity = pGib->pev->velocity * 2;
131
    else pGib->pev->velocity = pGib->pev->velocity * 4;
132
 
133
    pGib->pev->solid = SOLID_BBOX;
134
    UTIL_SetSize(pGib->pev, Vector(0, 0, 0), Vector(0, 0, 0));
135
 
136
    pGib->LimitVelocity();
137
  }
138
}


Добавлено 12-12-2021 в 06:43:

Цитата:
Chyvachok писал:
если монстра разорвет на мясо выстрелом в голову, то куски будут желтую кровь оставлять, а если в тело то красную

Используй мой код. Куски будут оставлять оба цвета.


Отправлено [CFR] [email protected]@N 12-12-2021 в 01:23:

Цитата:
Ku2zoff писал:
. Ещё обрезку по краям брашей не сделал - половина декали может висеть в пустоте


А как они в движке тогда обриаются?


Отправлено Дядя Миша 12-12-2021 в 06:47:

Цитата:
[CFR] [email protected]@N писал:
А как они в движке тогда обриаются?

Элементарно. Вокруг полигона, на который наложена декаль строятся ограничивающие плоскости. Как кросспродукт от ребра и нормали.
И этими плоскостями полигон декали обрезается точно по его размеру.

Добавлено 12-12-2021 в 09:47:

Но поскольку декаль накладывается как трипланарная проекция, то её копии ложатся и на соседние полигоны, а лишнее просто удаляется.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Ku2zoff 17-12-2021 в 15:07:

Дядя Миша а где всю эту математику поглядеть? Какие функции в gl_decals.c?


Отправлено XaeroX 17-12-2021 в 16:03:

Ku2zoff
https://en.wikipedia.org/wiki/Suthe...dgman_algorithm

__________________
"It's a friend of mine - a Cheshire Cat," said Alice: "allow me to introduce it."
"I don't like the look of it at all," said the King: "however, it may kiss my hand if it likes."
"I'd rather not," the Cat remarked.


Отправлено Дядя Миша 17-12-2021 в 17:13:

Ku2zoff polylib.c, там всё. В любой кваке смотри.
Если хочешь понять принцип. Ну а если не хочешь - копипасти из паранои.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Ku2zoff 17-12-2021 в 17:20:

Цитата:
Дядя Миша писал:
Если хочешь понять принцип.

Оно не хочется на самом деле, хочется побыстрее скопипастить. Но чем больше я изучаю физику и математику (даже в первом семестре), тем больше понимаю, что кодер без знания матчасти - ноль без палочки.


Отправлено Дядя Миша 17-12-2021 в 18:10:

От задач зависит. По крайней мере никто не заставляет пограммистов придумывать новые математические решения. Но вот воплощать в коде уже имеющиеся - вполне себе.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Aynekko 17-12-2021 в 18:40:

Цитата:
Ku2zoff писал:
кодер без знания матчасти - ноль без палочки

Истину глаголишь, я тут фонарик ксашмодовский уже пару месяцев пытаюсь пофиксить время от времени, там замуты с матрицами какие-то, а я в этом ничего не понимаю. У каждого мозги под свои задачи заточены, а я уж точно не математик

__________________
Мой мод на Xash


Отправлено Ku2zoff 18-12-2021 в 10:58:

Цитата:
Дядя Миша писал:
воплощать в коде уже имеющиеся - вполне себе

Всё равно надо разбираться, а не бездумно копипастить.
Цитата:
Aynekko писал:
фонарик ксашмодовский уже пару месяцев пытаюсь пофиксить

Я думаю, что тебе надо поштудировать оптику. Шейдеры же не от балды написаны, а с опорой на реальные физические законы.


Отправлено Aynekko 18-12-2021 в 12:22:

Цитата:
Ku2zoff писал:
Я думаю, что тебе надо поштудировать оптику.

Там судя по всему не в этом дело, а в том что все динамические источники света не учитывают angles и scale модели. На каком этапе это сломалось, я не знаю. Дядя Миша даже сам не знает. И похоже дело не в шейдере, а где-то в коде, т.к. это касается только студиомоделей. Это все пока, что удалось выяснить.

__________________
Мой мод на Xash


Отправлено ncuxonaT 18-12-2021 в 13:00:

Разве мы в прошлый раз не пришли к тому, что трансформация модели идет через modelview матрицу, а источники света этого не учитывают?


Отправлено Aynekko 18-12-2021 в 13:08:

Я смотрел в параное 2, там по сути все точно так же за некоторыми исключениями (копипастил - все сломалось). Точно так же строится rotationmatrix. Вот и говорю, какие-то замуты с матрицами мира/модели/света, как одно к другому складывается я вообще не понимаю.

__________________
Мой мод на Xash


Отправлено Дядя Миша 18-12-2021 в 18:31:

Цитата:
Aynekko писал:
Дядя Миша даже сам не знает.


Я напомню как обстояло дело. Когда я готовил обновление для билда 0.65 (которое мог бы вообще не делать), я частично взял рендерер от паранои, чтобы не изобретать велосипед дважды. Но параноевский рендерер более требовательный к видеокарте и я об этом упоминал в теме про разработку.
И сразу же нашлась куча людей, которые возмутились - как это так? Ксаш не будет запускаться на моей замечательной встройке 1654-го года выпуска?
А вот раньше запускался! Это недопустимо! Я тогда не стал с ними спорить, прикинул как бы ужаться в лимиты и сделал это. И тогда же отписался в теме - я сделал новый билд совместимым с вашим железом, но клянусь небесным котэ, я не завидую тому, кто будет это дебажить! Так и оказалось!

А то что я не знаю - ну за минуту поисков найти ничего не удалось, а дальше я не стал разбираться. Там бесполезно копипастить из паранои, и знание оптических законов не поможет. Там фундаментальщина, которую не отдебажишь, надо просто знать в чём отличие устройства рендерера ксаш-мода от паранои.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Aynekko 18-12-2021 в 18:51:

Цитата:
Дядя Миша писал:
как это так? Ксаш не будет запускаться на моей замечательной встройке 1654-го года выпуска?

Ага, а сейчас народ занимается PrimeXT на базе паранои и как оказалось он очень многим нужен в таком виде, хоть и требователен к видюхе еще больше (там чего уже только не прикрутили - pbr, hdr). Вот поди разбери.
Цитата:
Дядя Миша писал:
ну за минуту поисков найти ничего не удалось, а дальше я не стал разбираться.

Что мне сделать, чтобы ты потратил 2 минуты хотя бы? Я уже весь рендер моделей сравнил построчно 2 раза, только толку мало. Проблема в том, что кроме тебя тут просто некому разобраться. Я бы может и перешел на прайм или параною, но я уже столько фичей сделал для мода, что переезд просто не получится.

P.S. Я сузил проблему до этих строчек в DrawLightForMeshList
C++ Source Code:
1
tr.modelorg = m_pModelInstance->m_protationmatrix.VectorITransform( RI->vieworg );
2
Vector right = m_pModelInstance->m_plightmatrix.VectorIRotate( RI->vright );
3
Vector lightorg = m_pModelInstance->m_protationmatrix.VectorITransform( pl->origin );
4
Vector lightdir = m_pModelInstance->m_plightmatrix.VectorIRotate( pl->frustum.GetPlane( FRUSTUM_FAR )->normal );

Но она может быть здесь, а может быть и не здесь...

__________________
Мой мод на Xash


Отправлено Дядя Миша 18-12-2021 в 19:12:

Ничего делать не надо, когда-нибудь я сам найду на это время.
У тебя ведь еще далеко до релиза? К тому же, меня удивляет, почему товарищи форкеры это до сих пор не поправили. Как форкать - так они первые. А как баг исправить - немогут

Добавлено 18-12-2021 в 22:12:

Цитата:
Aynekko писал:
Я сузил проблему до этих строчек в DrawLightForMeshList

Задача сводится к тому, что в m_plightmatrix. Я уже просто не помню.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Aynekko 18-12-2021 в 19:17:

Цитата:
Дядя Миша писал:
У тебя ведь еще далеко до релиза?

Пока далеко. Буду признателен. Я вот тени от точечных источников из паранои смог перенести и доделать. И вот столкнулся с освещением от лайтов на моделях, всю малину портит.
Цитата:
Дядя Миша писал:
почему товарищи форкеры это до сих пор не поправили

Не знаю, кто есть еще форкер, но полагаю они просто не доходили до этих тонкостей. Пока не будешь делать карты и тестить все досконально, не доберешься. А что насчет прайма, так там сейчас рендер из паранои 2. А там уже изначально с этим никаких проблем не было.

Добавлено 18-12-2021 в 22:17:

Цитата:
Дядя Миша писал:
Задача сводится к тому, что в m_plightmatrix.

C++ Source Code:
// build the rotation matrix
m_pModelInstance->m_protationmatrix = matrix3x4( origin, angles, scale );
m_pModelInstance->m_plightmatrix = m_pModelInstance->m_protationmatrix;

__________________
Мой мод на Xash


Отправлено Дядя Миша 18-12-2021 в 19:42:

Aynekko напомни, какие именно лайты глючат и как это выражается.
А то я сел разбираться и уже забыл в чём проблема.

Добавлено 18-12-2021 в 22:42:

Если мне память не изменяет, то кажется с рескейленными моделями там фонарь не работал или что-то вроде этого. Ну так те матрицы, которые строятся для прямого скейла совершенно не годятся для обратного.
Там обратный скейл нужен - еденица делённая на него. Для каждой компоненты. В декалях я это сделал, а для света забыл совершенно.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Aynekko 18-12-2021 в 19:48:

Цитата:
Дядя Миша писал:
как это выражается

Судя по всему, светильники не учитывают поворот модели (angles) и скейл. Я это понял после того, как сделал тени от точечных лайтов. Когда у модели скейл 1 и angles 0 0 0, свет и тени ложатся на модель идеально. Иначе - съезжает проекция тени тут же и аттенюация работает неправильно.

__________________
Мой мод на Xash


Отправлено Дядя Миша 18-12-2021 в 19:51:

Посмотрел, там всё еще интереснее. Оказывается для ксаш-мода этого фикса с декалями вообще нет, но для паранои он есть. В чём тут смысл - на статик с пользовательским скейлом декаль тоже ложится не оригинального скейла.
А в зависимости от размера этого статика. Если модель ужата по одной из осей, то декаль тоже ужмётся или растянется, чего естественно быть не должно. В параное, собственно, свет считается в мировом пространстве, поэтому там не нужны обратные преобразования. Но все вот эти VectorIRotate и VectorITransform они неполноценные преобразования.
Они скейл принимают всегда еденичный. Зато быстро. Поэтому надо построить m_plightmatrix с обратным скейлом. Для еденичного разницы всё равно не будет.

Чот такое попробуйте:

C++ Source Code:
// build the rotation matrix
m_pModelInstance->m_protationmatrix = matrix3x4( origin, angles, scale );
m_pModelInstance->m_plightmatrix = matrix3x4( origin, angles, Vector( 1.0f / scale.x, 1.0f / scale.y, 1.0f / scale.z ));

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Aynekko 18-12-2021 в 20:16:

Цитата:
Дядя Миша писал:
Чот такое попробуйте

Увы

__________________
Мой мод на Xash


Отправлено Дядя Миша 19-12-2021 в 08:02:

Ну что увы? У нас теперь есть две матрицы. Они обе прямые, но в одной из них инверсный скейл. Значит ту вторую нужно использовать везде, где она вызвает функцию VectorIRotate или VectorITransform.

r_studio.cpp:4046

C++ Source Code:
tr.modelorg = m_pModelInstance->m_plightmatrix.VectorITransform( RI->vieworg );

вот первое место

r_studio.cpp:4048
C++ Source Code:
Vector lightorg = m_pModelInstance->m_plightmatrix.VectorITransform( pl->origin );

вот второе место
r_studio:4199
C++ Source Code:
tr.modelorg = m_pModelInstance->m_plightmatrix.VectorITransform( RI->vieworg );

Последнее для хрома. Правда хром не будет правильно освещаться на статиках, ну ничего, там всё равно нету костей, так что некритично.

И наконец в шейдерах
xash\core.pak\glsl\studiodlight_fp.glsl:87
C++ Source Code:
light *= textureCube( u_ProjectMap, -normalize( var_LightVec )).rgb;

Впрочем в последнем я не уверен, может функция сама нормализует вектор внутри.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Aynekko 19-12-2021 в 08:36:

Особо ничего не поменялось. Аттенюация сменилась на обратную, теперь огромные модели наоборот видны издалека, а маленькие освещаются вплотную (раньше было с точностью наоборот).
Вот видео. Сначала тут точечный источник, закрепленный на игроке, потом показываю обычный фонарик:

https://www.youtube.com/watch?v=Pbi_Q2yph0A

Правильность наложения теней можно проверить по брашевому полу. На некоторых моделях от омнилайта она ложится правильно, потому что у них angles 0 0 0. А другие повернуты и все съезжает. Если модель лежит на боку, то тень тоже на боку будет. А от прожектора почему-то тени ложатся всегда правильно.
Видимо, потому что подход разный:

C++ Source Code:
shadow = ShadowProj( var_ShadowCoord, u_ShadowParams.xy, dot( N, L )); // прожектор
shadow = ShadowOmni( -var_LightVec, u_ShadowParams ); // динлайт

u_ShadowParams.zw, которые в диналайте, равны -pl->projectionMatrix[2][2] и pl->projectionMatrix[3][2], в параное2 так же, к слову. Видимо осталось от копипасты параноевской, так как теней от динлайтов изначально в ксашмоде не было.

__________________
Мой мод на Xash


Отправлено Дядя Миша 19-12-2021 в 10:40:

Эй-эй, так я про тени ничего не говорил, только про свет. А свет вроде как правильно начал накладываться. Он же у тебя раньше обрезался?

Добавлено 19-12-2021 в 13:40:

C++ Source Code:
matrix4x4 lightView = pl->modelviewMatrix.ConcatTransforms( m_pModelInstance->m_protationmatrix );

Возможно тут тоже следует использовать m_plightmatrix.
Да и я не вижу что ты там делаешь, я не вижу что вообще поменялось в форке, откуда я знаю, что там происходит.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Aynekko 19-12-2021 в 11:16:

Про тени я без претензий, просто показываю наблюдение. Проекция теней от динлайта не учитывает angles модели. И скейл кажется тоже...

Цитата:
Дядя Миша писал:
свет вроде как правильно начал накладываться. Он же у тебя раньше обрезался?


Да, он обрезался шейдером из-за if( spotDot < spotCos ) discard, на моделях со скейлом < 1. Сейчас вроде бы такого нет, но все равно скейл модели влияет - см. аттач, две модели, с виду они одинаковые, а по факту это 2 разные модели. Справа модель скейл 0.5, слева 1. С омнилайтом похожая ситуация. Они ведь должны освещаться идентично.

Цитата:
Дядя Миша писал:
Возможно тут тоже следует использовать m_plightmatrix.

Так стало еще хуже, свет от прожектора в моделях скейлом < 1 отображается точкой в оригине модели.
Цитата:
Дядя Миша писал:
Да и я не вижу что ты там делаешь, я не вижу что вообще поменялось в форке


В плане освещения вроде бы ничего критичного не менял, во всяком случае я вернул его в ксашмодовское состояние на момент 0.81 рев2. Ну разве что добавил тени от динлайтов в r_shadows.cpp. Прожектор не тронут.

Давай даже так. Я сейчас специально возьму 0.81 рев2 и буду фиксить все там. И показывать результаты.

Добавлено 19-12-2021 в 14:16:

https://youtu.be/i2YUJnMQSxM

Вот, 0.81 рев2 (клиент и сервер) с фиксами из последних постов с лайтматрицей. Та же картина.

__________________
Мой мод на Xash


Отправлено Дядя Миша 19-12-2021 в 11:54:

Если так и не разберёшься, может весной найду время.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Aynekko 19-12-2021 в 14:51:

Может проще избавиться от локальных координат и сделать освещение динлайтами в мировых? Знать бы хоть где посмотреть в параное. Шейдеры выглядят плюс-минус одинаково.

__________________
Мой мод на Xash


Отправлено ncuxonaT 19-12-2021 в 16:00:

Можно завести отдельный юниформ для скейла, поворот и позицию передавать через кость и оставить в покое modelview матрицу?


Отправлено Aynekko 19-12-2021 в 16:08:

Цитата:
ncuxonaT писал:
Можно завести отдельный юниформ для скейла

Это я уже сделал, на что я только его не умножал и делил
Насчет второго, тут я уже затрудняюсь. Не разбираюсь в костях особо(

__________________
Мой мод на Xash


Отправлено FreeSlave 21-12-2021 в 22:33:

У кого-нибудь бывало, что при переходе на следующую карту нод граф создается, но с невалидными связями? (так что impulse 197 ничего не показывает).
В консоль при этом пишется "OFFGROUND!" - отсюда https://github.com/ValveSoftware/ha...nodes.cpp#L1820

Пока не определил причину, но похоже как-то связано с движением монстров в промежутке времени между загрузкой карты и созданием графа (он создается с задержкой).

В логах (.nrp файлы) всё одинаково до Walk rejection.

Пример части лога при валидной генерации:

code:
Walk Rejection: ------------------------------------------------------------------------------- Node 0: NODE_LARGE_HULL step 448 NODE_LARGE_HULL step 448 NODE_SMALL_HULL step 624 Rejected Node 35 - Unreachable by Any Hull


Та же нода в случае OFFGROUND ошибки:
code:
Walk Rejection: ------------------------------------------------------------------------------- Node 0: NODE_SMALL_HULL step 0 NODE_SMALL_HULL step 0 NODE_SMALL_HULL step 0 NODE_SMALL_HULL step 0 NODE_SMALL_HULL step 0 NODE_SMALL_HULL step 0 Rejected Node 35 - Unreachable by Any Hull

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Crystallize 22-12-2021 в 16:44:

Я в Fitzquake столкнулся с парой странных вещей. Например bound не работает, хотя никаких ошибок нет, просто не даёт эффекта. Или VectorAngles с какого-то момента стал корруптить тот компонент вектора который в коде пишется первым. Второй компонент пишется нормально. Причем если писать сначала в локальную переменную а потом из неё в компонент вектора, то ничего не корруптится, просто получается ноль. Я сейчас мучаю Cam_UpdateForDrawing.

__________________
Вас приветствует персональная защитная система "САХАРА". Для работы в Средах Агрессивного ХАРАктера.
nofunallowed щас инди это по сути синоним "экзотическая игра где будет сказка и грустно


Отправлено FreeSlave 22-12-2021 в 16:52:

В аттаче карта. Барник стоит посреди пустой комнаты, но покрывается желтыми частицами как если бы застрял (stuck in wall--level design error). Похоже, происходит так, только если он стоит достаточно близко к центру карты.
Собственно, желтые пятна не проблема, но хотелось бы узнать, почему игра считает, что он застрял?

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Дядя Миша 22-12-2021 в 17:04:

Цитата:
Crystallize писал:
Например bound не работает, хотя никаких ошибок нет, просто не даёт эффекта

Что такое bound и какие ошибки он должен выдавать? И какой эффект ты ожидаешь?

Цитата:
Crystallize писал:
Или VectorAngles с какого-то момента стал корруптить тот компонент вектора который в коде пишется первым.

Это называется NAN на входе - NAN на выходе. Вот как это называется.
Наверное и bound не работает, потому что ты ему NAN суёшь.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено Crystallize 22-12-2021 в 17:16:

Ну bound это мини функция которая ограничивает число между двумя крайними значениями: bound(a, x, b)

__________________
Вас приветствует персональная защитная система "САХАРА". Для работы в Средах Агрессивного ХАРАктера.
nofunallowed щас инди это по сути синоним "экзотическая игра где будет сказка и грустно


Отправлено Aynekko 22-12-2021 в 17:34:

Цитата:
FreeSlave писал:
Барник стоит посреди пустой комнаты, но покрывается желтыми частицами как если бы застрял

Барник слишком высоко над землей.

__________________
Мой мод на Xash


Отправлено FreeSlave 22-12-2021 в 17:52:

Цитата:
Aynekko писал:
Барник слишком высоко над землей.


Я его и на землю ставил, и в половину той высоты, что сейчас на карте. Результат один и тот же.

Зато если от центра карты отодвинуть подальше, то всё норм.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Aynekko 22-12-2021 в 17:54:

Я его просто вниз опустил и скомпилил, не было желтых партиклей о.о

__________________
Мой мод на Xash


Отправлено FreeSlave 22-12-2021 в 18:04:

Aynekko, а ты перекомпилировал оригинал (без изменения высоты)? Может, зависит от компиляторов. Ну и я запускаю на голдсорсе на обычной ХЛ, если что.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Aynekko 22-12-2021 в 18:23:

Слушай, а теперь интересно. Еще раз взял оригинал, сколько ни двигаю вниз - все равно партикли. Не думаю, что дело в компиляторах. Наверное я чуть вбок его подвинул.

Добавлено 22-12-2021 в 21:23:

Ага. Проверил со всех сторон. Партикли возникают, если барник находится в районе 32 юнитов от центра. Со всех сторон, если смотреть на виде сверху. Ставил его на расстоянии 31-32-33 по всем осям. Высота всегда была одинаковая - 3 юнита от пола. Интересно. Наверное, какая-то движковая особенность.

__________________
Мой мод на Xash


Отправлено Дядя Миша 22-12-2021 в 20:18:

Цитата:
Crystallize писал:
Ну bound это мини функция которая ограничивает число между двумя крайними значениями: bound(a, x, b)

ну во первых не функция, а макрос. а во вторых сломаться может в единственном случае - если ты подаешь в нее NAN.

Цитата:
Aynekko писал:
Партикли возникают, если барник находится в районе 32 юнитов от центра

там наверное торчит этот тестовый хулл для нодов.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме


Отправлено FreeSlave 23-12-2021 в 01:04:

Цитата:
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

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org


Отправлено Crystallize 25-12-2021 в 21:13:

Цитата:
Дядя Миша писал:
Это называется NAN на входе - NAN на выходе. Вот как это называется.
Наверное и bound не работает, потому что ты ему NAN суёшь.

Если вписать printf внутрь самой VectorAngles, то видно, что туда заходит корректный вектор.

__________________
Вас приветствует персональная защитная система "САХАРА". Для работы в Средах Агрессивного ХАРАктера.
nofunallowed щас инди это по сути синоним "экзотическая игра где будет сказка и грустно


Отправлено Crystallize 30-12-2021 в 11:57:

В общем там в матчлибе я не объявил в хидере новую функцию. И потом когда я ее использовал в коде, парой строчек ниже там была эта VectorAngles которая и стала давать порченый результат.

__________________
Вас приветствует персональная защитная система "САХАРА". Для работы в Средах Агрессивного ХАРАктера.
nofunallowed щас инди это по сути синоним "экзотическая игра где будет сказка и грустно


Отправлено hgrunt_2020 16-01-2022 в 13:57:

Вопрос такой вылез, в ксаше есть папка scripts, там можно сделать фон в меню виде карты, но какие ещё есть скрипты по мимо того же меню?

__________________
новицек в с++


Временная зона GMT. Текущее время 02:02. Страницы (2): « 1 [2]
Показать все 3184 сообщений этой темы на одной странице

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