всеем привет знаю тему уже создавал такую но можно еще разок в общем я понял как создать свой mazzleflash на пушку делается это аказываеться легко и просто надо просто создать свой MESSAGE поясню что это вообще такое MESSAGE MESSAGE это с переводу означает сообщение или по иному событие в игре это событие может воспроизводить свои спрайты может воспроизводить свет в игре и многое другое применение сообщений может быть достаточно много. Ладно в общем начнем 1 делом идем в свое оружие
удаляем у него старый mazzleflash он нам не нужен потому что мы будем делать свою вспышку на пушку так что делаем первым делом удаляем это
m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; ну тут понятно наверное
тааак удалили теперь надо поставить vector vecSrc но со своими параметрами запомните делаем мы все это только в PrimaryAttack
тут все понятно думаю значит что мы сделали мы создали свой вектор специальный вектор который будет идти по координатам от выстрела самого дула пушки то есть если пушка поворачивается то и вектор идет от поворота самого экрана но и сам вектор имеет немного другое название это специально для самой вспышки выстрела поговорим о координатах координаты вам придется здесь ставить свои потому что каждая модель имеет разный размер значит разный размер самого дула пушки гет гун позитион думаю и так понятно что это верно от игрока идет это значение так все это первое что надо добавить в оружие.
идем собственно к самим сообщениям сообщение будет у нас вот такое
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, vecSrcMazzle );
WRITE_BYTE( TE_SPRITE );<это специально для спрайтов
WRITE_COORD( vecSrcMazzle.x );<-здесь сами вектора для оружия
WRITE_COORD( vecSrcMazzle.y );
WRITE_COORD( vecSrcMazzle.z );
WRITE_SHORT( m_iMazzlePlasma );<-здесь вот здесь как раз и будет наш эффет вспышки или проще говоря активации самого спрайта
WRITE_BYTE( 3 );<-это размер нашего спрайта
WRITE_BYTE( 128 );<это интенсивность кадров чем больше кадров чем четче будет отражаться наш спрайт
MESSAGE_END();<-это конец сообщения тоесть он работает по системно и потом выключается через определённое количество времени где то секунда или меньше
так отлично думаю тут все понятно самое первое значение мне не очень понятно но думаю оно нам не особо нужно главное понять саму суть сообщений. все добавили сообщение теперь главное чтобы сообщение работало стабильно и не вылетали игра его придется поклиентить
это вот так
#ifndef CLIENT_DLL
наши коды
#endif
что значит поклиентить это значит что код будет работать только в client.dll как я понял по названию но в dlls работать не будет это даже +
вообще эта функция очень полезна сам иногда ей пользуюсь помогает очень когда надо писать сложные и долгие коды.
теперь надо прекешнуть наш спрайт тоесть в данном моменте надо прекешнуть вот это m_iMazzlePlasma чтобы он стабильно работал и ошибок не выдавал значит идем в прекеш оружия и там где нибуть ставим вот это m_iMazzlePlasma = PRECACHE_MODEL("sprites/muzzleflashplasma.spr");
думаю тут и так все понятно ну и после таких интересным махинаций у нас получается неплохая вспышка от выстрела оружия не забывайте ставить правильные координаты для vecSrc v_forward v_right v_up
можно даже свой спрайт поставить и будет прикольно так но у этого фокуса есть один небольшой нюанс сама вспышка будет хоть не сильно но отстовать не знаю с чем это связно но такое есть так что имейте в виду что есть минус и идеальный мазл флеш без отставний врядли получиться
да и в hlwe я тоже этот баг с отставания ми заметил
все с вами был илья2 счастливого вам кодописания
и да еще я попозже выложу видео с самой вспышкой ждите скоро будет
Добавлено 18-12-2021 в 21:59:
я извиняюсь конечно моя вина торопился просто. Я забыл что мазафлеш вшит в модель в коде его просто так не удалишь значит делаем вот как скачиваем прогу MDL_tools разархивируем кидаем туда модель де компилируем с помощью decompile_all.bat заходим в qc файл и ищем там вот это { event 5001 0 "любое число" } это и есть сам мазафлеш просто удаляем этот event и компилируем модель с помощью studiomdl.exe все мазафлеш удален.
Добавлено 18-12-2021 в 22:26:
да еще пока я не забыл надо еще int добавить иначе ошибка будет идем в класс оружия где будем сам мазафлеш добавлять и где нибуть там ставим это int m_iMazzlePlasma; m_iMazzlePlasma это пример можно переименовать это как угодно но лучше всего подойдет вот это m_iMazzleFlash так будет более логично.
Да, они отстают. А на сервере маззлфлеши делать тоже не выход. Сам пробовал так. Нужно делать на клиенте.
В этом посте https://hlfx.ru/forum/showthread.ph...5805#post205805
я примерно расписал, как закрепить маззлфлеш на пушке, но это работает только в ксашмоде (нужно затронуть спрайтовый рендер). Если вкратце, то суть в том, чтобы закрепить энтитю маззлфлеша на энтити модели оружия. По тому же принципу, как спрайты крепятся к аттачментам монстров, к примеру (глаз у гарга).
А вообще маззлфлеши отстают даже в ванильной халфе. Если поставить host_framerate поменьше, стрелять и поворачиваться, это очень хорошо видно.
Чтобы кастомные маззлфлеши не отставали от аттачмента, их надо отлавливать в HUD_TempEntUpdate, и обновлять им ориджин каждый кадр. И тогда хоть зарисуйся этих эффектов. Можно приделать не только вспышки выстрелов, но также искры и дым из ствола. Это если дело касается темпэнтить. А если рисовать эффекты средствами TriAPI, их процессинг можно проводить прямо из DrawTransparentTriangles, получив там указатель на вьюмодель, и получив координаты нужного аттачмента.
Неправильный подход. Во-первых, координаты получаем на сервере относительно взгляда игрока, а не относительно аттачмента вьмодели оружия. Во-вторых, координата получена в определённом кадре, и в последующих кадрах маззлфлэш, созданный мессагой
будет находиться в этих же самых координатах. Игрок сдвинется, вьюмодель сдвинется, а флэш останется в координатах, пришедших с сервера. Такая же проблема есть и для клиентских кастомных маззлфлэшей, созданных с помощью pEfxAPI->R_TempSprite. Как я писал выше, такие темпэнтити необходимо отлавливать и оперативно обновлять им ориджин.
Ku2zoff писал: необходимо отлавливать и оперативно обновлять им ориджин
Я изначально делал так. Все равно была какая-то проблема. Маззлфлеш был закреплен, но сдвигался при движении игрока. Скажем, если игрок идет вбок, то маззлфлеш будет закреплен, но чуть левее/правее аттачмента. Лучше, конечно, чем ничего. Но все же замута с movetype_follow сработала лучше всех. Нужно только придумать, как закрепить спрайт на аттачменте модели оружия, а не игрока.
Если я ничего не путаю, есть функция CL_TentEntAllocCustom, которая позволяет задать темпэнтите произвольный каллбэк. И в этом каллбэке вроде можно обновлять ориджин. То есть отпадает необходимость каким-то особым образом помечать кастомные клиентские маззлфлеши и отлавливать их в HUD_TempEntUpdate. В функции каллбэка достаточно обновлять ориджин.
Добавлено 20-12-2021 в 00:38:
Цитата:
Aynekko писал: но сдвигался при движении игрока
Отставание на один кадр, наверное. Я бы попробовал CL_TentEntAllocCustom. Может поможет. А вообще, лучше написать некое подобие RenderSystem из XDM, и рисовать всё через TriApi. Я делал зажигалку. Так вот, темпэнтити всё равно отставали на кадр. А когда я нарисовал огонёк средствами TriAPI - отставания прекратились.
Добавлено 20-12-2021 в 00:44:
Тут тема о зажигалке. Модель и код у меня есть, интересующимся могу скинуть. Если немного покумекаете мозгами, нарисуете триапишные маззлфлеши, которые не будут отставать от аттачмента. А ещё дым после выстрела, который искажается при поворотах камеры.
Кстати если речь чисто о серверных "мазлфлешах", то в Инвазионе у СуперГана спрайт рисуется и цепляется к аттачу пушки, чтобы не отставал, но это такое простое решение если не хочется выдумывать.
Aynekko писал: На сервере я не понял, как задать аттачмент пушки.
Есть способ. Индекс_энтити | 0xИндексАттачмента. Вроде того. Но это опять же для одного кадра. Если нужно закрепить эффект на аттачменте, чтобы он обновлялся несколько кадров подряд, то лучше это делать на клиенте. Возможно, я вообще перепутал, и такое не прокатит.
А какой индекс у вьюмодели? На клиенте показывает, что вьюмодель и игрок имеют одинаковый индекс. Поэтому пришлось заюзать хак и подсунуть -1 в aiment.
Ну так это спрайт крепится к модели игрока, а не к оружию, нет? Я в инвазион не играл, посмотреть бы как оно выглядит. Я делал так же кажется, это не то.