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

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- мой туториал про новые мазафлеши (https://hlfx.ru/forum/showthread.php?threadid=5768)


Отправлено илья2 18-12-2021 в 19:58:

Wink мой туториал про новые мазафлеши

всеем привет знаю тему уже создавал такую но можно еще разок в общем я понял как создать свой mazzleflash на пушку делается это аказываеться легко и просто надо просто создать свой MESSAGE поясню что это вообще такое MESSAGE MESSAGE это с переводу означает сообщение или по иному событие в игре это событие может воспроизводить свои спрайты может воспроизводить свет в игре и многое другое применение сообщений может быть достаточно много. Ладно в общем начнем 1 делом идем в свое оружие
удаляем у него старый mazzleflash он нам не нужен потому что мы будем делать свою вспышку на пушку так что делаем первым делом удаляем это
m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; ну тут понятно наверное

тааак удалили теперь надо поставить vector vecSrc но со своими параметрами запомните делаем мы все это только в PrimaryAttack

таак ставим
Vector vecSrcMazzle = m_pPlayer->GetGunPosition( ) + gpGlobals->v_forward * 50 + gpGlobals->v_right * 8 + gpGlobals->v_up * -12;


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

идем собственно к самим сообщениям сообщение будет у нас вот такое

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 так будет более логично.

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

а вот и видео https://youtu.be/6hRi6oTfz-w

__________________
илья


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

Круто спс. Ток будет отставать от ствола энтот маззл если резко крутить стволом или же дьвигаться вбок


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

ну да о чем и говорил отстает в принципе это единственный минус в остальном все классно получилось

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

да и в hlwe тоже мазлы отстают я тоже заметил это

__________________
илья


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

Да, они отстают. А на сервере маззлфлеши делать тоже не выход. Сам пробовал так. Нужно делать на клиенте.
В этом посте
https://hlfx.ru/forum/showthread.ph...5805#post205805
я примерно расписал, как закрепить маззлфлеш на пушке, но это работает только в ксашмоде (нужно затронуть спрайтовый рендер). Если вкратце, то суть в том, чтобы закрепить энтитю маззлфлеша на энтити модели оружия. По тому же принципу, как спрайты крепятся к аттачментам монстров, к примеру (глаз у гарга).
А вообще маззлфлеши отстают даже в ванильной халфе. Если поставить host_framerate поменьше, стрелять и поворачиваться, это очень хорошо видно.

__________________
Мой мод на Xash


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

А вообще маззлфлеши отстают даже в ванильной халфе:да я тоже это заметил даже без host_framerate отстают но не особо сильно

__________________
илья


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

В третьем квэйке они на самой модели оружия были если не ошибаюсь. И можно анимацыей включать их тогда точно ни отстаннут


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

Чтобы кастомные маззлфлеши не отставали от аттачмента, их надо отлавливать в HUD_TempEntUpdate, и обновлять им ориджин каждый кадр. И тогда хоть зарисуйся этих эффектов. Можно приделать не только вспышки выстрелов, но также искры и дым из ствола. Это если дело касается темпэнтить. А если рисовать эффекты средствами TriAPI, их процессинг можно проводить прямо из DrawTransparentTriangles, получив там указатель на вьюмодель, и получив координаты нужного аттачмента.

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

Цитата:
илья2 писал:
Vector vecSrcMazzle = m_pPlayer->GetGunPosition( ) + gpGlobals->v_forward * 50 + gpGlobals->v_right * 8 + gpGlobals->v_up * -12;

Неправильный подход. Во-первых, координаты получаем на сервере относительно взгляда игрока, а не относительно аттачмента вьмодели оружия. Во-вторых, координата получена в определённом кадре, и в последующих кадрах маззлфлэш, созданный мессагой
C++ Source Code:
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, vecSrcMazzle );
WRITE_BYTE( TE_SPRITE );

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


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

Цитата:
Ku2zoff писал:
необходимо отлавливать и оперативно обновлять им ориджин

Я изначально делал так. Все равно была какая-то проблема. Маззлфлеш был закреплен, но сдвигался при движении игрока. Скажем, если игрок идет вбок, то маззлфлеш будет закреплен, но чуть левее/правее аттачмента. Лучше, конечно, чем ничего. Но все же замута с movetype_follow сработала лучше всех. Нужно только придумать, как закрепить спрайт на аттачменте модели оружия, а не игрока.

__________________
Мой мод на Xash


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

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

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

Цитата:
Aynekko писал:
но сдвигался при движении игрока

Отставание на один кадр, наверное. Я бы попробовал CL_TentEntAllocCustom. Может поможет. А вообще, лучше написать некое подобие RenderSystem из XDM, и рисовать всё через TriApi. Я делал зажигалку. Так вот, темпэнтити всё равно отставали на кадр. А когда я нарисовал огонёк средствами TriAPI - отставания прекратились.

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

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


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

Кстати если речь чисто о серверных "мазлфлешах", то в Инвазионе у СуперГана спрайт рисуется и цепляется к аттачу пушки, чтобы не отставал, но это такое простое решение если не хочется выдумывать.


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

Цитата:
Chyvachok писал:
спрайт рисуется и цепляется к аттачу пушки

Я вот такое и сделал у себя на клиенте. На сервере я не понял, как задать аттачмент пушки. Аттачмент игрока - легко.

__________________
Мой мод на Xash


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

Цитата:
Aynekko писал:
На сервере я не понял, как задать аттачмент пушки.

Есть способ. Индекс_энтити | 0xИндексАттачмента. Вроде того. Но это опять же для одного кадра. Если нужно закрепить эффект на аттачменте, чтобы он обновлялся несколько кадров подряд, то лучше это делать на клиенте. Возможно, я вообще перепутал, и такое не прокатит.


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

Цитата:
Ku2zoff писал:
Индекс_энтити

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

__________________
Мой мод на Xash


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

Если что вот спрайт из Инвазиона, ставится в код стрельбы:

code:
CSprite *pMuzzle = CSprite::SpriteCreate ( "sprites/plasma/flash.spr", Vector(0,0,0), TRUE ); pMuzzle->SetAttachment ( m_pPlayer->edict(), 1 ); pMuzzle->SetScale ( 0.125 ); pMuzzle->SetTransparency ( kRenderTransAdd, 255, 255, 255, 250, kRenderFxNone ); pMuzzle->SetThink ( &CBaseEntity::SUB_Remove ); pMuzzle->pev->nextthink = gpGlobals->time + 0.075;


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

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

__________________
Мой мод на Xash


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

Цитата:
Aynekko писал:
А какой индекс у вьюмодели?

Делай эффект на клиенте, где есть прямой доступ к вьюмодели. Зачем извращаться с сервером ради чисто клиентского эффекта?


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

Маззлфлэши живут 1 кадр, поэтому никто не парится с их обновлением.

__________________
My Projects: download page

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

Цитата:

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


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

Цитата:
Дядя Миша писал:
Маззлфлэши живут 1 кадр

Ребята хотят в красивые долгоживущие эффекты, но даже не потрудятся заглянуть в сорцы XDM, где это всё существует больше 10 лет.


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

Цитата:
Ku2zoff писал:
Делай эффект на клиенте

Я-то уже сделал, и здесь даже написал как
https://hlfx.ru/forum/showthread.ph...5805#post205805
Изначально пытался на сервере. Это уже потом я понял, что на сервере имеет смысл что-то делать только если у тебя сингл-мод.
Дело в том, что мой способ, описанный выше, в голде не сработает - нет доступа к рендереру.

__________________
Мой мод на Xash


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

Цитата:
pTemp->entity.curstate.aiment = -5;

Попробуй создавать маззлфлеш через CL_TentEntAllocCustom. А в функции каллбэка обновляй ориджин:
C++ Source Code:
pTemp->entity.origin = gEngfuncs.GetViewModel()->attachment[0];

У меня сейчас нет времени проверять. Часа через четыре попробую сам.


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

Ku2zoff ну я и сам сейчас на работе, если только вечером. Если будешь проверять, задай маззлфлешу время die где-то секунду или больше, побегай с ним. У меня вот он намертво прикручен к аттачменту. Интересно, как твой способ сработает.

__________________
Мой мод на Xash


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

А я послижу за темой


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

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