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)
Отправлено Ku2zoff 19-08-2025 в 16:31:
Цитата:
Дядя Миша писал:
Сложна-сложна.
Самый простой вариант - сделать это одной длинной анимацией. А вот если кодить, то придётся заморочиться. Проще перейти на сорс, там NPC умеют пятиться и даже одновременно атаковать. Собсно, неделю назад я принял такое решение на основе того, что на моём железе игры на сорс 2013 летают. Оригинальные компиляторы собирают карты для сорса раза в 3 дольше, чем Дядьмишины паранойевские для голдсорса (кастомные для сорса пока не пробовал), но это ещё и мой косяк, просто перенёс карты без причёсывания. Впечатления пока положительные, хл2 еп2 вполне знает многие энтити для первой халфы: функ_валлы, функ_доры, монстер_генерик, лайты. Буду попробовать, может что из этого выйдет.
Отправлено JPEG 20-08-2025 в 08:17:
Цитата:
Ku2zoff писал:
Самый простой вариант - сделать это одной длинной анимацией
не додумывался до этого, надо будет попробовать)__________________
МОЙ НОВЫЙ ПАБЛИК ПО ХЛ))
Отправлено JPEG 23-08-2025 в 20:42:
в принципе рабочий вариант https://youtu.be/AwWeHXn8gVY
Из минусов: нпс проходят сквозь друг-друга и стены, но иногда можно применить
__________________
МОЙ НОВЫЙ ПАБЛИК ПО ХЛ))
Отправлено FiEctro 26-08-2025 в 07:01:
Смотришь вектор куда игрок смотрит, отслеживаешь удар, если удар нанесён то отбрасываешь монстра назад по вектору взгляда игрока (задаешь велосити или импульс на время проигрывания анимации) и включаешь собственно саму анимацию. Можно ещё развернуть самого монстра мордой в направлении игрока, чтобы он потом не тупил когда сам разворачивался. Так же можно кинуть трассу из спины монстра чтобы считать дистанцию насколько далеко он должен отойти, чтобы не пятился в стенки.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено JPEG 26-08-2025 в 14:51:
Цитата:
FiEctro писал:
Смотришь вектор куда игрок смотрит, отслеживаешь удар, если удар нанесён то отбрасываешь монстра назад по вектору взгляда игрока (задаешь велосити или импульс на время проигрывания анимации) и включаешь собственно саму анимацию. Можно ещё развернуть самого монстра мордой в направлении игрока, чтобы он потом не тупил когда сам разворачивался. Так же можно кинуть трассу из спины монстра чтобы считать дистанцию насколько далеко он должен отойти, чтобы не пятился в стенки.
хм, попробую сколхозить в упрощённом виде, после удара просто вызвать импульс назад, и в анимации удара добавить анимацию движения ног назад без передвижения рут-кости__________________
МОЙ НОВЫЙ ПАБЛИК ПО ХЛ))
Отправлено ZGreen 26-08-2025 в 15:25:
Почему бы не сделать анимацию удара с подшагом и последующим отскоком? Вроде, когда дерешься несподручно нос в нос стоять. Теоретически. Сам не дерусь, я только на форуме смелый.
Отправлено JPEG 26-08-2025 в 15:35:
Цитата:
ZGreen писал:
Почему бы не сделать анимацию удара с подшагом и последующим отскоком? Вроде, когда дерешься несподручно нос в нос стоять. Теоретически. Сам не дерусь, я только на форуме смелый.
так я так делал, при анимации нпс может сквозь стены проходить__________________
МОЙ НОВЫЙ ПАБЛИК ПО ХЛ))
Отправлено Ku2zoff 26-08-2025 в 17:50:
Цитата:
ZGreen писал:
Почему бы не сделать анимацию удара с подшагом и последующим отскоком?
Мудрить с анимациями не надо (если только хочется сделать быстро и просто), у ИИ в халфе есть система щедъюлей, где можно переключать активности, типа: шаг вперёд, удар, шаг назад, тремя разными анимациями. Оно не работает как хочется по двум причинам: первая - затупы при переключении активностей, из-за того, что серверный фпс плавает и эвенты плохо отлавливаются (привет ковыряния с DispatchAnimEvents), вторая - монстры не умеют ходить назад, им надо повернуться лицом по направлению движения. И если второе можно победить, невозбранно модифицировав код перемещения с оглядкой на летающих монстров, то первое очень геморно, и корень проблемы сидит в движке, как объяснял Дядя Миша, ЕМНИП.
Добавлено 27-08-2025 в 00:34:
Там даже в коде flInterval фиксированный - 0.1, чтобы срабатывания DispatchAnimEvents совпадали с интервалами тчинка монстра gpGlobals->time + 0.1. Я уже точно не помню, но вроде это нужно для того, чтобы клиентский и серверный эвенты срабатывали одновременно. В этой теме я экспериментировал, и в разных вариациях было так, что либо клиентский эвент опаздывает на один pev->frame за серверным, либо серверный не срабатывает. ДМ в этой же теме упоминал, что интервал в IEngineStudio.ClientEvents - сотые доли секунды, а в CBaseAnimating::DispatchAnimEvents - десятые. Соответственно, клиент в любом случае воспроизведёт эвент, например маззлфлеш при стрельбе. А вот сервер может пропустить. Отсюда все затупы со сменой активностей, например, при попытках монстра выйти из боя и найти укрытие. Мой вариант в теме вполне рабочий, но не на моделях, где эвент стоит на последнем кадре. Я забил на это всё, не стал дальше копаться в теме. Хотя очень хотел сделать НПС подвижнее. Если анимаций нет, незачем и код для них писать.
Добавлено 27-08-2025 в 00:50:
Есть ещё один вариант, но он, на мой взгляд, лишает всей прелести использования студио эвентов на сервере. Это полностью выкинуть эту замечательную систему, и писать фиксированные тайминги в коде, что де на такой-то секунде такой-то анимации монстр наносит урон, делает выстрел, или что-то ещё. Такое себе, потому что опять же, фпс всегда разный, и попасть в эти тайминги нереально. В таком случае монстры должны быть анимированы как игрок. А ведь через эвенты можно не только вызывать функции из кода монстров, но и активировать энтити на карте и ещё много чего.
Отправлено JPEG 27-08-2025 в 00:02:
ну в общем получилось так. Говнокот, но по-крайней мере работает
void CZombie :: HandleAnimEvent( MonsterEvent_t *pEvent )
{
switch( pEvent->event )
{
case ZOMBIE_AE_ATTACK_RIGHT:
{
//в момент удара запускаются таймеры на включении отступления и его выключение
m_flFallbackOn = gpGlobals->time + 0.5; //задержка перед отступлением
m_flFallbackOff = gpGlobals->time + 1.5; //то, сколько бежит назад
int CZombie::IgnoreConditions ( void )
{
int iIgnore = CBaseMonster::IgnoreConditions();
if (m_flFallbackOn && gpGlobals->time >= m_flFallbackOn)
m_fFallback = 1; //разрешить отступать
if (m_flFallbackOff && gpGlobals->time >= m_flFallbackOff)
m_fFallback = 0;
if (m_fFallback == 1)
pev->velocity = pev->velocity - gpGlobals->v_forward * 100; //отступление
__________________
МОЙ НОВЫЙ ПАБЛИК ПО ХЛ))
Отправлено Ku2zoff 28-08-2025 в 14:38:
JPEG ну конечно говнокод. По-хорошему должно быть что-то такое:
C++ Source Code:
2 | Task_t tlPrimaryMeleeAttack1[] = |
4 | { TASK_STOP_MOVING, 0 }, |
5 | { TASK_FACE_ENEMY, (float)0 }, |
6 | { TASK_MELEE_ATTACK1, (float)0 }, |
7 | { TASK_FALL_BACK, (float)0 }, // грамотнее будет TASK_RETREAT |
12 | m_IdealActivity = ACT_WALK_BACK; |
Хотя, если работает, то почему не использовать?
Добавлено 28-08-2025 в 21:38:
Почему таски с щедъюлями лучше? Потому что не надо заводить какие-то сомнительные переменные типа m_fFallback. Тайминги можно задавать прям в массиве тасков, поставив вместо нуля другое число.
Отправлено JPEG 09-09-2025 в 09:32:
Пытаюсь перенести TE_BREAKMODEL на клиент, пока в упрощённом виде, чтобы хотя бы что-то появлялось. В чём тут ошибка?
code:
extern int gmsgImpact;
int CZombie :: TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
{
int iModel;
iModel = PRECACHE_MODEL( "models/agibs2.mdl" );
MESSAGE_BEGIN(MSG_ALL, gmsgImpact);
WRITE_COORD( pev->origin.x );
WRITE_COORD( pev->origin.y );
WRITE_COORD( pev->origin.z );
WRITE_COORD( pev->velocity.x );
WRITE_COORD( pev->velocity.y );
WRITE_COORD( pev->velocity.z );
WRITE_SHORT( iModel ); //model id#
MESSAGE_END();
------------------------------------------------------------
extern void EV_HLDM_Particles(vec3_t pos, vec3_t dir, int modelIndex );
int CHud :: MsgFunc_Impact( const char *pszName, int iSize, void *pbuf )
{
BEGIN_READ( pbuf, iSize );
vec3_t pos, ang;
int modelIndex;
pos[0] = READ_COORD();
pos[1] = READ_COORD();
pos[2] = READ_COORD();
ang[0] = READ_COORD();
ang[1] = READ_COORD();
ang[2] = READ_COORD();
modelIndex = READ_SHORT();
EV_HLDM_Particles( pos, ang, modelIndex );
return 1;
}
----------------------------------------------------------
void EV_HLDM_Particles(vec3_t pos, vec3_t dir, int modelIndex)
{
model_t *pmodel;
float random = 30;
vec3_t vecSpot;
vecSpot[0] = pos[0] + gEngfuncs.pfnRandomFloat( -0.5f, 0.5f );
vecSpot[1] = pos[1] + gEngfuncs.pfnRandomFloat( -0.5f, 0.5f );
vecSpot[2] = pos[2] + gEngfuncs.pfnRandomFloat( -0.5f, 0.5f );
TEMPENTITY *pTemp = gEngfuncs.pEfxAPI->CL_TempEntAlloc( (float*)&vecSpot, pmodel );
if( !pTemp ) return;
pTemp->entity.curstate.body = gEngfuncs.pfnRandomLong( 0, pTemp->frameMax );
pTemp->entity.curstate.rendermode = kRenderTransTexture;
pTemp->entity.curstate.renderamt = pTemp->entity.baseline.renderamt = 128;
pTemp->flags |= FTENT_COLLIDEWORLD | FTENT_FADEOUT | FTENT_SLOWGRAVITY;
pTemp->entity.baseline.origin[0] = dir[0] + gEngfuncs.pfnRandomFloat( -random, random );
pTemp->entity.baseline.origin[1] = dir[1] + gEngfuncs.pfnRandomFloat( -random, random );
pTemp->entity.baseline.origin[2] = dir[2] + gEngfuncs.pfnRandomFloat( 0, random );
}
__________________
МОЙ НОВЫЙ ПАБЛИК ПО ХЛ))
Отправлено Ku2zoff 09-09-2025 в 16:43:
JPEG используй pEfxAPI, там уже есть нужная функция спавна кусков для мессаги TE_BREAKMODEL, которая аллочит темпэнтитю и задаёт ей все параметры, вот код из ксаш-движка:
C++ Source Code:
11 | random = (float)READ_BYTE() * 10.0f; |
12 | modelIndex = READ_SHORT(); |
14 | life = (float)(READ_BYTE() * 0.1f); |
16 | gEngfuncs.pEfxAPI->R_BreakModel(pos, pos2, ang, random, life, count, modelIndex, (char)flags); |
А зачем переносишь? Хочешь добавить какие-то новые параметры? Мессага с сервера вполне справляется с задачей, незачем копипастить код на клиент.
Отправлено Дядя Миша 09-09-2025 в 18:01:
Цитата:
JPEG писал:
Пытаюсь перенести TE_BREAKMODEL на клиент, пока в упрощённом виде
Не парь на мозг, ты же на годот перешёл, у тебя и в подписи было.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено JPEG 10-09-2025 в 10:52:
Цитата:
Ku2zoff писал:
JPEG используй pEfxAPI, там уже есть нужная функция спавна кусков для мессаги TE_BREAKMODEL, которая аллочит темпэнтитю и задаёт ей все параметры, вот код из ксаш-движка:
C++ Source Code:
11 | random = (float)READ_BYTE() * 10.0f; |
12 | modelIndex = READ_SHORT(); |
14 | life = (float)(READ_BYTE() * 0.1f); |
16 | gEngfuncs.pEfxAPI->R_BreakModel(pos, pos2, ang, random, life, count, modelIndex, (char)flags); |
А зачем переносишь? Хочешь добавить какие-то новые параметры? Мессага с сервера вполне справляется с задачей, незачем копипастить код на клиент.
я хочу задействовать kRenderTransTexture у TE_BREAKMODEL. Вроде ж в коде нет такого параметра
Добавлено 10-09-2025 в 13:52:
Цитата:
Дядя Миша писал:
Не парь на мозг, ты же на годот перешёл, у тебя и в подписи было.
ну лет 5 назад какой-то застой был. Сейчас хотя бы есть смысл выпускать мод - в него поиграют, в инди же наоборот слишком много проектов__________________
МОЙ НОВЫЙ ПАБЛИК ПО ХЛ))
Отправлено Дядя Миша 10-09-2025 в 19:50:
Цитата:
JPEG писал:
Сейчас хотя бы есть смысл выпускать мод - в него поиграют
Вот дожили 
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'