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=4436)
Отправлено Andrei 13-06-2014 в 17:25:
Алгоритм монстров.
Здравствуйте. Помогите разобрать как двигаются монстры. Хочу на кс1.6 создать монстрика.
Начал сам разбираться, застрял на построении
, поставил movetype STEP, монстр невидимкой стал О_о А так обычно стоит PUSHSTEP
Отправлено XaeroX 13-06-2014 в 18:06:
Pushstep - это для ящиков.
Монстры двигаются очень просто. Есть точка начала, есть точка конца пути. Они протаскиваются между этими точками трассой по хуллу. Если не могут протащиться - пытаются триангулировать обход препятствия. Ну и плюс отдельный код, чтобы по ступенькам подниматься. Вот и вся хитрость, тащемта.
Отправлено Andrei 13-06-2014 в 18:23:
Цитата:
XaeroX писал:
триангулировать обход препятствия
Это интересует.
И
Цитата:
XaeroX писал:
Ну и плюс отдельный код, чтобы по ступенькам подниматься.
А в чем проблема, то, что зомбак невидимый ?
C++ Source Code:
1 | void CZombie::Spawn( edict_t* pPlayer ) |
3 | edict_t* pEntity = CREATE_NAMED_ENTITY( ALLOC_STRING( "info_target" ) ); |
5 | SET_MODEL( pEntity, "models/barney.mdl" ); |
6 | SET_SIZE( pEntity, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX ); |
8 | pEntity->v.solid = SOLID_SLIDEBOX; |
9 | pEntity->v.movetype = MOVETYPE_STEP; |
11 | pEntity->v.modelindex = g_iModelIndex; |
12 | pEntity->v.health = pPlayer->v.health; |
13 | pEntity->v.origin = pPlayer->v.origin + gpGlobals->v_forward * 100; |
15 | pEntity->v.takedamage = DAMAGE_AIM; |
16 | pEntity->v.max_health = pPlayer->v.health; |
17 | pEntity->v.deadflag = DEAD_NO; |
19 | pPlayer->v.nextthink = gpGlobals->time + 0.1; |
Отправлено XaeroX 13-06-2014 в 18:41:
Цитата:
Andrei писал:
Это интересует.
Этот код есть в серверной библиотеке.
Цитата:
Andrei писал:
А в чем проблема, то, что зомбак невидимый ?
Проверь pEntity->v.effects, может, там EF_NODRAW стоит?
Ну и rendermode заодно.
Отправлено Andrei 13-06-2014 в 19:08:
Всё равно невидимко:
C++ Source Code:
1 | void CZombies::Spawn( edict_t* pPlayer ) |
3 | edict_t* pEntity = CREATE_NAMED_ENTITY( ALLOC_STRING( "info_target" ) ); |
5 | SET_MODEL( pEntity, "models/barney.mdl" ); |
6 | SET_SIZE( pEntity, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX ); |
8 | pEntity->v.solid = SOLID_SLIDEBOX; |
9 | pEntity->v.movetype = MOVETYPE_STEP; |
11 | pEntity->v.modelindex = g_iModelIndex; |
12 | pEntity->v.health = pPlayer->v.health; |
13 | pEntity->v.max_health = pPlayer->v.health; |
14 | pEntity->v.origin = pPlayer->v.origin + gpGlobals->v_forward * 100; |
16 | pEntity->v.effects &= ~EF_NODRAW; |
17 | pEntity->v.rendermode = kRenderNormal; |
18 | pEntity->v.renderamt = 255; |
19 | pEntity->v.takedamage = DAMAGE_AIM; |
20 | pEntity->v.deadflag = DEAD_NO; |
22 | pEntity->v.nextthink = gpGlobals->time + 0.1; |
Цитата:
XaeroX писал:
Этот код есть в серверной библиотеке.
А можно конкретней ?
Отправлено XaeroX 13-06-2014 в 19:27:
Цитата:
Andrei писал:
А можно конкретней ?
Find in files -> "Triangulate"
Цитата:
Andrei писал:
Всё равно невидимко:
SET_ORIGIN ещё надо бы добавить.
Отправлено Andrei 13-06-2014 в 19:43:
Спасиб. А ступеньки ? С SET_ORIGIN ничего не изменилось.
Отправлено XaeroX 13-06-2014 в 20:10:
Ступеньки автоматически, если MOVETYPE_STEP стоит.
pEntity->v.modelindex = g_iModelIndex; - а вот это зачем? Ты же уже вызвал SET_MODEL.
Отправлено Andrei 13-06-2014 в 20:54:
Убрал.. Ничего не изменилось.
Я это ставил, мол типа сказали попробуй, вдруг поможет и забыл убрать.
Отправлено XaeroX 13-06-2014 в 21:12:
Да, загадка.
Я всегда подозревал, что эти метамод-хаки до добра не доведут.
Отправлено Ghoul [BB] 13-06-2014 в 21:27:
Может, потому не видно, что в КС 1.6 монстры вырезаны? Это мультиплерный мод.
__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.
Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo
Отправлено XaeroX 13-06-2014 в 21:47:
Ghoul [BB]
Ну так он своего монстра кодит.
Понятно, что в кс вырезаны.
Отправлено Ghoul [BB] 14-06-2014 в 12:08:
Так под контру исходников нету...
__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.
Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo
Отправлено XaeroX 14-06-2014 в 12:29:
Ghoul [BB]
Ты из какого года вылез? Из 2002-го? 
Отправлено Ku2zoff 14-06-2014 в 14:14:
Да там скорее всего что-то наговнокодено в AddToFullPack и передаче энтварсов. А вполне возможно, что в клиентке, коде рисования моделек. Там вроде как продвинутый предиктинг для игрока. А вообще:
Цитата:
Andrei писал:
edict_t* pEntity = CREATE_NAMED_ENTITY( ALLOC_STRING( "info_target" ) );
SET_MODEL( pEntity, "models/barney.mdl" );
SET_SIZE( pEntity, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX );
pEntity->v.solid = SOLID_SLIDEBOX;
pEntity->v.movetype = MOVETYPE_STEP;
pEntity->v.modelindex = g_iModelIndex;
pEntity->v.health = pPlayer->v.health;
pEntity->v.max_health = pPlayer->v.health;
pEntity->v.origin = pPlayer->v.origin + gpGlobals->v_forward * 100;
pEntity->v.effects &= ~EF_NODRAW;
pEntity->v.rendermode = kRenderNormal;
pEntity->v.renderamt = 255;
pEntity->v.takedamage = DAMAGE_AIM;
pEntity->v.deadflag = DEAD_NO;
pEntity->v.nextthink = gpGlobals->time + 0.1;
Что это за ауно? Почему мы насильно делаем монстра из инфо_таргета? Инфо таргет у нас что? Правильно, CPointEntity. А монстр должен наследоваться от CBaseMonster. Не в этом ли затык? Может быть что-то специфическое для монстров пропущено. И эта, UTIL_SetOrigin где?
Отправлено XaeroX 14-06-2014 в 14:22:
Ну так, по идее, какая разница, от кого монстр наследуется? Да, ходить и думать не будет, но рисоваться-то должен.
Отправлено PRoSToTeM@ 14-06-2014 в 15:00:
Цитата:
Ku2zoff писал:
Что это за ауно?
Это плагин для метамода. Andrei их на продажу делает и внезапно решил с ваших знаний профит получить.
Отправлено XaeroX 14-06-2014 в 15:13:
Цитата:
PRoSToTeM@ писал:
внезапно решил с ваших знаний профит получить.
Не он первый, не он последний.
Отправлено Andrei 14-06-2014 в 21:01:
PRoSToTeM@, ничего не на продажу. Разрабатываю сервер для себя.
Отправлено master07 15-06-2014 в 04:46:
Andrei Есть уже такой плагин для кс, который может на карту ставить монстров из хл. Или вам нужны только некоторые?
Отправлено Ku2zoff 15-06-2014 в 06:55:
Цитата:
PRoSToTeM@ писал:
их на продажу делает и внезапно решил с ваших знаний профит получить.
У нас тут Алекс Гордон исходники по 30 рублей продавал 
Цитата:
XaeroX писал:
но рисоваться-то должен.
Но ведь инфо таргет не рисуется по-умолчанию. МБ, дело как раз в этом. Ну или правда, всё дело в том, что используется метамодовский костыль.
Отправлено Ghoul [BB] 15-06-2014 в 10:27:
Цитата:
XaeroX писал:
Ты из какого года вылез? Из 2002-го?
Хочешь сказать, что уже есть исходники контры?
Нормальные, официально выложенные валивой или, хотя бы неофициально у неё стыренные?
Или ты пытаешься мне тонко намекнуть насчёт исходников серверной ДЛЛ-ки, "воссозданной" умельцами?__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.
Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo
Отправлено XaeroX 15-06-2014 в 11:39:
Ghoul [BB]
Нет, я хочу сказать, что метамод изобрели давным-давно. 
Отправлено Andrei 15-06-2014 в 15:43:
Я просто задал анимацию монстру и чудо, он появился. Проверил в монстр моде, если закоментить StudioFrameAdvance, то и монстер станет невидимый.
Если анима не задана, монстрик будет невидимый и только такая ситуация с мувтупом степ.
Добавлено 15-06-2014 в 19:43:
Если я верно понял:
Всё построено на анимации, выстрелы, бег и прочее.
Вся инфа храниться в структуре MonsterEvent_t.
Данные записываются в неё с GetAnimationEvent
А каким образом происходит работа в GetAnimationEvent ? То есть как монстер понимает когда ему бежать, когда ему атаковать ?
Отправлено Andrei 19-06-2014 в 16:55:
А в чем может быть проблема, что монстер иногда застревает ?

FTriangulate тут не сработал.
Выполняется:
C++ Source Code:
if ( ShouldAdvanceRoute( flWaypointDist ) )///!!!BUGBUG- magic number |
printf( "ShouldAdvanceRoute %2.f\n", flWaypointDist ); |
AdvanceRoute( flWaypointDist ); |
и за ним сразу:
C++ Source Code:
1 | if ( MovementIsComplete() ) |
3 | printf( "MovementIsComplete\n" ); |
Отправлено XaeroX 19-06-2014 в 17:31:
Цитата:
Andrei писал:
FTriangulate тут не сработал.
Халфа вообще говоря строит путь по нодам, а триангулятор - для обхода динамических препятствий (func_pushable, другие монстры и т.п.)
Ты нодеграф подключил или какую-нибудь аналогичную систему вейпоинтов?
Отправлено Andrei 19-06-2014 в 18:12:
Не, я просто тестирую монстер мод. Монстра zombie. Построил его и он погнал за мной. Бывает когда я за бочками, он не может найти путь ко мне и стоит на месте. Стоит выстрелить в него или выбежать, он опять меня находит.
В void CMBaseMonster :: Move ( float flInterval )
Косяк думаю в CheckLocalMove, а именно flWaypointDist = ( m_Route[ m_iRouteIndex ].vecLocation - pev->origin ).Length2D();
Вобщем даже когда я за бочками, он меня находит, обходит но вот иногда почему-то у него не выходит это сделать.
А как кстати вэйпоинты подключать?)
Отправлено Ku2zoff 20-06-2014 в 10:01:
Цитата:
Andrei писал:
Бывает когда я за бочками
Цитата:
Andrei писал:
Стоит выстрелить в него или выбежать, он опять меня находит.
Если монстр теряет игрока из виду, он, собсно, останавливается, если нет сетки вейпоинтов. В сингле халфы в качестве вейпоинтов используются info_node. В кс можно использовать файлы навигации для ботов, благо официальные исходники ботов почти полностью есть в репозитории Вальвы.