HLFX.Ru Forum
Показать все 30 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- как добавить новый muzzleflash на пушку ? (https://hlfx.ru/forum/showthread.php?threadid=5693)


Отправлено илья2 10-08-2021 в 17:26:

Question как добавить новый muzzleflash на пушку ?

здравствуйте как добавить новый muzzleflash на оружие ?

__________________
илья


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

Проще всего заменить стандартные спрайты. Код рисования маззлфлешей зашит в движок. Но можно сделать темпэнтитями на клиенте. pEfxAPI и сорцы ксашдвижка в помощь.


Отправлено илья2 10-08-2021 в 19:27:

вот увидил код

switch( event->event )
{
case 5001:
gEngfuncs.pEfxAPI->R_MuzzleFlash( (float *)&entity->attachment[0], atoi( event->options) );
break;
case 5011:
gEngfuncs.pEfxAPI->R_MuzzleFlash( (float *)&entity->attachment[1], atoi( event->options) );
break;
case 5021:
gEngfuncs.pEfxAPI->R_MuzzleFlash( (float *)&entity->attachment[2], atoi( event->options) );
break;
case 5031:
gEngfuncs.pEfxAPI->R_MuzzleFlash( (float *)&entity->attachment[3], atoi( event->options) );
break;
case 5002:
gEngfuncs.pEfxAPI->R_SparkEffect( (float *)&entity->attachment[0], atoi( event->options), -100, 100 );
break;
// Client side sound
case 5004:
gEngfuncs.pfnPlaySoundByNameAtLocation( (char *)event->options, 1.0, (float *)&entity->attachment[0] );
break;
default:
break;
}

тут можно добавить новый на основе такого примера

switch( event->event )
{
case 5001:
gEngfuncs.pEfxAPI->R_MuzzleFlash( (float *)&entity->attachment[0], atoi( event->options) );
break;
case 5011:
gEngfuncs.pEfxAPI->R_MuzzleFlash( (float *)&entity->attachment[1], atoi( event->options) );
break;
case 5021:
gEngfuncs.pEfxAPI->R_MuzzleFlash( (float *)&entity->attachment[2], atoi( event->options) );
break;
case 5031:
gEngfuncs.pEfxAPI->R_MuzzleFlash( (float *)&entity->attachment[3], atoi( event->options) );
break;
case 5041:
gEngfuncs.pEfxAPI->R_MuzzleFlash( (float *)&entity->attachment[4], atoi( event->options) ); <----здесь добавил новый
break;
case 5002:
gEngfuncs.pEfxAPI->R_SparkEffect( (float *)&entity->attachment[0], atoi( event->options), -100, 100 );
break;
// Client side sound
case 5004:
gEngfuncs.pfnPlaySoundByNameAtLocation( (char *)event->options, 1.0, (float *)&entity->attachment[0] );
break;
default:
break;
}

__________________
илья


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

Цитата:
илья2 писал:
gEngfuncs.pEfxAPI->R_MuzzleFlash( (float *)&entity->attachment[4], atoi( event->options) ); <----здесь добавил новый

И вышел за границы массива

__________________
My Projects: download page

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

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


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

Цитата:
илья2 писал:
тут можно добавить новый на основе такого примера

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


Отправлено илья2 11-08-2021 в 08:48:

в каком файле та искать ? случайно не в r_misc.cpp а то исходников много и все разные. Может сразу лучше ссылку скинешь по ксашу.

__________________
илья


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

Цитата:
илья2 писал:
случайно не в r_misc.cpp

Случайно не в r_misc.cpp, т.к. это файл из сорцев ксашмода. А R_MuzzleFlash находиться внутри движка: engine\client\cl_tent.c.


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

Цитата:
Ku2zoff писал:
Случайно не в r_misc.cpp, т.к. это файл из сорцев ксашмода. А R_MuzzleFlash находиться внутри движка: engine\client\cl_tent.c.


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

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


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

Цитата:
Chyvachok писал:
смотрел сорцы движковых эффектов, глянул, и понял что никак не смогу это портануть

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

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

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


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

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


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


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

Цитата:
Chyvachok писал:
отличия от эффекта что в движке и тот что портирован

Отличий не будет. Все аллоки и каллбэки торчат из движка наружу. Будет копипаста с подменой внутридвижковых функций на экспорты pEfxAPI.
А вот если завести массив собственных тепмэнтить на клиенте, и рисовать их через TriAPI, тогда отличия будут. В таком случае, нужно выносить всю систему темпэнтить на клиент. Намного быстрее взять уже готовую систему частиц из какого-нибудь мода, и заменить вызовы pEfxAPI на подходящие функции этой системы.

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

Для начала я просто сделаю две запланированные функции R_MuzzleFlash и R_TracerEffect. Первую оставлю на темпэнтитях, просто добавлю возможность грузить кастомные спрайты. А вторую сделаю на TriAPI, потому что движковые трейсеры на партиклях очень толстые, а хочется тоненькие как в HL2. К тому же, писать с нуля ничего не надо, я выкопал старенькие сорцы кое-чего, откуда можно эти трейсеры невозбранно скопипастить.
Ну а дальше будет видно. Можно заморочиться, и сделать чисто клиентские темпэнтити, чтобы обойти лимит в 500 штук и улучшить эффекты. А можно подключить готовую систему частиц. Увидим. Работы много, а мне ещё карты надо делать.


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

Цитата:
Ku2zoff писал:
А можно подключить готовую систему частиц. Увидим. Работы много, а мне ещё карты надо делать.


А где она кроме ХДМ она есть? Вспоминается только Бейс Дефенс, но его код закрытый, в ХДМ сильно замудренный код, да и эффектов то не много - в Тириане Гуль перенес много своих эффектов из ХЛВЕ, которых нету в чистом ХДМ-е, но я не смог их пристроить к той старой версии рендерсистемы, т.к. они прицепленны к новой что в последней ХДМ юзается но там автор как всегда все переписал. Сам ХЛВЕ увы багнутый, в том числе и Рендер Систем там, вылетает часто, жаль, это по сути идеал мода на ХЛ1, только синглплеера не хватает, с магазином на манер Counter-Life, жаль я кодер никакой, так замутить бы сингл-ХЛВЕ и все, МодДБ можно будет закрывать нафиг, лучше уже не будет.

А Аврора очень ограниченная система - она рассчитана исключительно под "постоянные" эффекты вроде дыма или следа какой-то ракеты. А такого чтобы взрыв или попадание из какой-то энергопушки сделать детальнее и красивее кроме той же Байз Дефенса и ХДМ-а я не видел на ХЛ.

Эффекты кстати красивые в Jedi Academy, сорцы то есть на ГитХабе, но я из другого мода на ХЛ1 если в нем код сильно отличается скопипастить не могу.


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

Цитата:
Chyvachok писал:
А где она кроме ХДМ она есть?

BattleGrounds, немного в Invasion (огнемёт) и ещё один какой-то французский мультиплеерный мод, там тоже свои эффекты огня есть.
Цитата:
Chyvachok писал:
Бейс Дефенс, но его код закрытый

Цитата:
Chyvachok писал:
эффекта следа из первого квейка, тот что состоит из точек, по идее если это точки заменить на спрайт

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


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

Цитата:
Chyvachok писал:
А Аврора очень ограниченная система - она рассчитана исключительно под "постоянные" эффекты вроде дыма или следа какой-то ракеты

Я кстати делал аврору, живущую заданный промежуток времени.
В параное такая.

__________________
My Projects: download page

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

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


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

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


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

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

Нечто подобное вроде Валве и задумывали с файлами events/.sc, во многих из них код похожий на код из клиента и содержится, пусть и не используется, по сути работа с эффектами сильно упростилась бы если бы код из .sc брался, и можно было в игре через команду перегрузить эти файлы, допустим если альт-табнулся и поменял что-то в файле эффекта.

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

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

Цитата:
Ku2zoff писал:
На мой взгляд, самая трушная система из XDM 3.0.3.4. Ей нужно добавить гравитацию и коллизию из 3.0.3.8 туда, где по смыслу нужно, и наверное парсер скриптов для погодных эффектов. В принципе, всё.


Еще в Тириане есть и свои эффекты что для попаданий использовались взятые и пофикшеные из ХЛВЕ, в 3.0.3.8 их нету, я смотрел, неплохие эффекты тоже.

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


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

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

__________________
My Projects: download page

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

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


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

Порт R_MuzzleFlash из ксашдвижка в клиентку:

C++ Source Code:
1
#include "com_model.h"
2
 
3
#define MAX_MUZZLEFLASH		3
4
model_t* cl_sprite_muzzleflash[MAX_MUZZLEFLASH];
5
 
6
void CL_LoadClientSprites(void)
7
{
8
  cl_sprite_muzzleflash[0] = (struct model_s*)gEngfuncs.GetSpritePointer(SPR_Load("sprites/muzzleflash1.spr"));
9
  cl_sprite_muzzleflash[1] = (struct model_s*)gEngfuncs.GetSpritePointer(SPR_Load("sprites/muzzleflash2.spr"));
10
  cl_sprite_muzzleflash[2] = (struct model_s*)gEngfuncs.GetSpritePointer(SPR_Load("sprites/muzzleflash3.spr"));
11
}
12
 
13
void R_MuzzleFlash(const vec3_t pos, int type)
14
{
15
  TEMPENTITY* pTemp;
16
  int		index;
17
  float		scale;
18
 
19
  index = (type % 10) % MAX_MUZZLEFLASH;
20
  scale = (type / 10) * 0.1f;
21
  if (scale == 0.0f) scale = 0.5f;
22
 
23
  if (!cl_sprite_muzzleflash[index])
24
    return;
25
 
26
  // must set position for right culling on render
27
  pTemp = gEngfuncs.pEfxAPI->CL_TempEntAllocHigh((float*)&pos, cl_sprite_muzzleflash[index]);
28
  if (!pTemp) return;
29
  pTemp->entity.curstate.rendermode = kRenderTransAdd;
30
  pTemp->entity.curstate.renderamt = 255;
31
  pTemp->entity.curstate.framerate = 10;
32
  pTemp->entity.curstate.renderfx = 0;
33
  pTemp->die = gEngfuncs.GetClientTime() + 0.01; // die at next frame
34
  pTemp->entity.curstate.frame = gEngfuncs.pfnRandomLong(0, pTemp->frameMax);
35
  pTemp->flags |= FTENT_SPRANIMATE | FTENT_SPRANIMATELOOP;
36
  pTemp->entity.curstate.scale = scale;
37
 
38
  if (index == 0) pTemp->entity.angles[2] = gEngfuncs.pfnRandomLong(0, 20); // rifle flash
39
    else pTemp->entity.angles[2] = gEngfuncs.pfnRandomLong(0, 359);
40
 
41
  gEngfuncs.CL_CreateVisibleEntity(ET_TEMPENTITY, &pTemp->entity);
42
}

CL_LoadClientSprites нужно вызвать из CHud:VidInit. R_MuzzleFlash использовать вместо gEngfuncs.pEfxAPI->R_MuzzleFlash. Количество и названия спрайтов можно менять, прекэшить на сервере не обязательно, SPR_Load задаст им индексы в массиве моделей.
Chyvachok сравни с оригинальным кодом в cl_tent.c и увидишь, что это совсем не сложно.
Скрытый текст:
Этот текст скрытый. Вы должны оставить хотя бы одно сообщение в теме, чтобы его увидеть.


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

Интересно, а насколько сложно сделать чтобы эвенты брались из event/.sc файлов? Все таки это было бы удобно те же эффекты и эвенты оружия можно было бы подправлять не перекомпилируя код.


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

Цитата:
Chyvachok писал:
а насколько сложно сделать чтобы эвенты брались из event/.sc файлов?

Надо написать маленькую виртуальную машинку.

__________________
My Projects: download page

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

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


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

Chyvachok чтобы выяснить, насколько это сложно, нужно попробовать написать парсер. Мне проще перекомпилить клиент, если что-то получилось не так, чем убивать неделю на написание парсера, я ведь не умею К тому же, он всё равно будет ограничен заложенным набором функций. Реквестируй фичу кому-нибудь, SNMetamorph'у, например. Он как раз апгрейдит ксашмод. Можно Дядю Мишу попросить о такой штуке для XashNT. Зайчатки скриптовых оружий уже есть в п2, к этой основе можно добавить парсинг клиентского эвента.


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

Что нужно пофиксить насчет muzzleflash - это крепление к аттачменту. Он ведь тупо спавнится в воздухе. Достаточно сделать pTemp->die = cl.time + 1.0 чтобы увидеть это убожество.
Я пока ради теста сделал кой-чего

C++ Source Code:
pTemp->clientIndex = 1;
pTemp->flags |= FTENT_SPRANIMATE | FTENT_SPRANIMATELOOP | FTENT_PLYRATTACHMENT;

Добавил первую строчку и добавил третий флаг во второй. Ну, крепится. В оригин игрока…

__________________
Мой мод на Xash


Отправлено [CFR] B@N@N 12-10-2021 в 00:27:

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


Есть какие-то новости в этом направлении? Было бы здорово обойти этот лимит в 500 темпэнтити


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

[CFR] B@N@N я этим не занимался. Меня устраивает лимит в 500 штук. А что не устраивает - нарисую через триапи. Мешают лимиты - переходи на ксаш или SvenEngine. Последний полностью совместим со стим-версией халфы, имеет увеличенные лимиты, абсолютно бесплатен, т.к. свен бесплатен в стиме. К тому же ещё абсолютно легален. Буржуи не будут на тебя гавкать, если выпустишь свой мод под него. Вот с ксашем ситуация печальная, у них безостановочно горят пуканы из-за копирайтов, хотя казалось бы...


Отправлено [CFR] B@N@N 12-10-2021 в 10:18:

Ксаш не подходит мне так как он не может мультиплеер
А вот свенэнжин наверное да, получше но он только чериз стим и это значит что на пиратку нивстанет и мод соответственно надо будет релизить чериз стим
Где-то отдельно можно будет скачать свенэнжин ну по типу того как можно скачать Ксаш чьоб не тинуть за собой несколько гига контента?

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


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

Цитата:
[CFR] B@N@N писал:
Ксаш не подходит мне так как он не может мультиплеер

Ксаш FWGS нормально работает.

__________________
Мой мод на Xash


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

Цитата:
[CFR] B@N@N писал:
Ксаш не подходит мне так как он не может мультиплеер

Всё он прекрасно может.

__________________
My Projects: download page

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

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


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

Цитата:
Aynekko писал:
Что нужно пофиксить насчет muzzleflash - это крепление к аттачменту. Он ведь тупо спавнится в воздухе. Достаточно сделать pTemp->die = cl.time + 1.0 чтобы увидеть это убожество.

Невероятно, но я все же додумался как это сделать.
Нужно для начала перенести код на клиент из движка (Ku2zoff выше выложил). Затем в этом коде сделать проверку на энтитю - viewmodel это или нет. Если viewmodel - то делаем хак:

pTemp->entity.curstate.aiment = -5;

Число рандомное, главное чтобы было отрицательное.
Так же нужно притащить в этот код номер аттачмента, пусть будет int Attachment. Притащить можно из эвента 5001 и других соседних.
Далее дописать

pTemp->entity.curstate.movetype = MOVETYPE_FOLLOW;
pTemp->entity.curstate.body = Attachment + 1;

А потом в спрайт-рендерере найти SpriteComputeOrigin и сделать проверку на aiment -5. И выставить parent = GET_VIEWMODEL() вместо GET_ENTITY.
Пробовал давать индекс, но у игрока и вьюмодели почему-то индекс одинаковый. Хотя бы это сработало. Теперь маззлфлеш намертво прикручен к аттачменту, а не остается в воздухе после спауна.
С моделью пока не работает. Видимо нужно в студиорендере сделать подобную проверку.
И еще я не знаю, можно ли все это провернуть в голде. Ну в ксашмоде получилось.

__________________
Мой мод на Xash


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

C++ Source Code:
1
pTemp->flags |= FTENT_SPRANIMATE | FTENT_SPRANIMATELOOP | [color=red]FTENT_CLIENTCUSTOM[/color];
2
pTemp->entity.curstate.scale = scale;
3
 
4
[color = red]pTemp->callback = R_MuzzleFlashCallback;[/color]
5
 
6
//=================================
7
 
8
[color=red]void R_MuzzleFlashCallback(struct tempent_s* ent, float frametime, float currenttime)
9
{
10
  VectorCopy(gEngfuncs.GetViewModel()->attachment[0], ent->entity.origin);
11
}[/color]

Всё равно будет немного отставать на один кадр, но не будет оставаться висеть в воздухе.

P.S. админы, почините плиз тег color.


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

Цитата:
Ku2zoff писал:
Всё равно будет немного отставать на один кадр

По-моему там еще зависимость от фпс нехилая.

__________________
Мой мод на Xash


Временная зона GMT. Текущее время 16:24.
Показать все 30 сообщений этой темы на одной странице

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