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=4688)
Отправлено Engineer 12-11-2015 в 14:22:
Монстры прекращают преследование
Спустя некоторое время после спавна, монстр перестаёт преследовать и атаковать игрока по неизвестной причине.
После спавна, я направляю монстра к игроку:
C++ Source Code:
edict_t *pPlayer = INDEXENT(spawn.attack_player_index); |
monsters[monster_index].pMonster->m_hEnemy = pPlayer; |
monsters[monster_index].pMonster->MoveToEnemy(ACT_RUN, 2); |
Монстр двигается к игроку, может пару раз атаковать. Но спустя некоторое время останавливается.
Я решил периодически вызывать следующий код:
C++ Source Code:
2 | for (int i = 0; i < monster_ents_used; i++) { |
3 | if (monsters[i].pMonster == NULL) { |
7 | pEdict = ENT(monsters[i].pMonster->pev); |
12 | if ( !(pEdict->v.flags & (FL_MONSTER)) ) |
15 | if (!UTIL_IsAlive(pEdict)) { |
19 | if (monsters[i].pMonster->m_movementGoal == MOVEGOAL_NONE) { |
20 | monsters[i].pMonster->FRouteClear(); |
22 | if (monsters[i].pMonster-><img src="images/smilies/pp2.gif" border="0" alt="">opEnemy()) { |
23 | monsters[i].pMonster->MoveToEnemy(ACT_RUN, 20); |
Здесь я проверял значение m_movementGoal и если оно сбросилось с MOVEGOAL_ENEMY на MOVEGOAL_NONE, то повторно вызывается MoveToEnemy().
Значения некоторых переменных в момент преследования и остановки:
m_movementGoal: MOVEGOAL_ENEMY
m_MonsterState: MONSTERSTATE_COMBAT
ENTINDEX(m_hEnemy): 1 (ID преследуемого игрока)
В логе сервера периодически проскакивают:
Цитата:
Schedule Failed at 3!
No Path from 33 to 28!
BuildNearestRoute() - monster has no nearest node!
GetPathToEnemy failed!!
Энтити info_node по карте раскиданы и по идее, монстры по ним двигаются. Монстр никуда не падает, не застревает и по идее должен нормально ориентироваться. Но этого не происходит.
Куда копать? Как исправить проблему, чтобы монстры не останавливались и продолжали двигаться и игроку и атаковать его.
Отправлено PLut 12-11-2015 в 15:00:
Engineer Убийцу бейс дефенса пишешь?
Если честно, то я много раз по-разному пытался сделать, чтобы монстры выискивали игрока, но грамотно ни разу не получилось сделать. Однако, у меня они порой удивляют, ибо внезапно могут найти тебя где угодно на карте, когда ты этого не ждешь, так же правильно строят обходы пути через всю карту, если игрок поднялся на лифте, например. Но вот чтобы они давили постоянно на тебя без тупизма - вот никак. Интересно будет почитать тему.
__________________
Base Defense on Steam, ModDB
Отправлено Ku2zoff 12-11-2015 в 15:07:
Цитата:
PLut писал:
они порой удивляют, ибо внезапно могут найти тебя где угодно на карте, когда ты этого не ждешь, так же правильно строят обходы пути через всю карту, если игрок поднялся на лифте, например. Но вот чтобы они давили постоянно на тебя без тупизма - вот никак.
Ну наверное потому, что скедъюлы фейлятся на определённом этапе в процессе поиска игрока. В качестве FAIL_SCHEDULE стоит указать нечто кастомное, в котором монстр будет "сканировать" территорию и передвигаться по ней. А уже в качестве FAIL_SCHEDULE для последнего указывать надо простую прогулку по нодам.
Отправлено Engineer 12-11-2015 в 15:17:
PLut, да, ты прав, Base Defense
, но как плагин Metamod. Мне очень нравится эта идея.
Много раз тебя спрашивал про релиз или хотя-бы багфикс с неткодом (а то даже сервер не запустить, 3-4 игрока и начинаются вылеты). Устал ждать и решил написать своё
Я решил копнуть в сторону nodes.cpp. Попробовал закомментить:
C++ Source Code:
1 | if (m_Cache[iHash].v == vecOrigin) |
3 | ALERT(at_aiconsole, "Cache Hit.\n"); |
4 | return m_Cache[iHash].n; |
8 | ALERT(at_aiconsole, "Cache Miss.\n"); |
Монстры останавливаются, но, вроде как, реже.
Отправлено PLut 12-11-2015 в 15:28:
Engineer Вон американцы какие-то умелые поставили сервак старой версии, у них всё работает как часы, там какие-то маньяки набивали уйму поинтов. Так что, даже не знаю что тебе посоветовать.
У меня в очереди сейчас тест мультиплеерный, по его результатам буду смотреть чего еще надо доделать в новой версии, а так прогресс идет: один товарищ пилит сайт новый (увидим ли мы этот сайт или нет - хз, но вот минивики обновлять буду), фгд запилен, все игровые предметы, добавленные в код, теперь можно получить в игре разными способами.
А где ты спрашивал?
Такое конкретно и лично спрашивать надо, на рандомные вопросы о релизе я не отвечаю, т.к. мои планы очень часто рушатся, но оно к добру только.
__________________
Base Defense on Steam, ModDB
Отправлено Engineer 12-11-2015 в 18:59:
Стал периодически вызывать следующий код:
C++ Source Code:
1 | if (monsters[i].pMonster->m_movementGoal == MOVEGOAL_NONE && monsters[i].pMonster-> PopEnemy()) { |
2 | monsters[i].pMonster->m_hTargetEnt = monsters[i].pMonster->m_hEnemy; // Иначе краш |
3 | Task_t *pTask = new Task_t(); |
4 | pTask->iTask = TASK_MOVE_TO_TARGET_RANGE; |
5 | monsters[i].pMonster->StartTask( pTask ); |
Вроде стало получше, количество останавливающихся монстров уменьшилось. Но появилось больше ошибок связанных с нодами:
Цитата:
No Path from 29 to 11!
GetPathToEnemy failed!!
No Path from 29 to 11!
Полагаю, нужно что-то править в nodes.
Цитата:
PLut писал:
А где ты спрашивал?
Такое конкретно и лично спрашивать надо, на рандомные вопросы о релизе я не отвечаю, т.к. мои планы очень часто рушатся, но оно к добру только.
На moddb, в комментариях я спрашивал.
Я и сейчас новую версию жду, у меня даже в закладках ссылка на http://www.moddb.com/mods/b-def , по ней я периодически перехожу.
Отправлено PLut 12-11-2015 в 19:36:
Engineer Нашел и тебя и всё, что ты написал
Я помню, что как-то синий ответил тебе там же вопросом "Why?" на сообщение о том, что играть невозможно.
Ну не суть, с тех пор много времени прошло и, поверь, оно того стоило. Просто от балды я бы не стал задерживать, текущая версия практически несравнима с предыдущей по качеству. Ибо там то, что я тогда назвал "экстендед" и полной версией, сейчас выглядит очень сырой бета-версией. Да, и по сути, предыдущую кто-нибудь помнит как я выкладывал? Я накатал сообщение о том, что учеба, творческий кризис и выложил, что было.
Успехов с модом, если есть чего показать, то показывай, интересно жа 
__________________
Base Defense on Steam, ModDB
Отправлено Engineer 18-11-2015 в 12:25:
Вновь всем привет. Проблему свою я решил. Опишу, что сделал, вероятно ещё кому-то пригодиться.
Я немного поменял дефолтный AI.
Добавил монстрам (CBaseMonster) переменную BOOL m_AttackPlayers, с ней монстр будет вести себя агрессивно =)
В monsterstate.cpp немного добавил:
C++ Source Code:
4 | State = MONSTERSTATE_COMBAT; |
7 | ALERT ( at_aiconsole, "Stripped\n" ); // not allowed to have an enemy anymore. |
В monsters.cpp для GetEnemy добавил ещё один поиск:
C++ Source Code:
m_hEnemy = FIND_ENTITY_BY_CLASSNAME( NULL, "player" ); |
В defaultai.cpp для tlStandoff добавил таск TASK_GET_PATH_TO_SPOT:
C++ Source Code:
3 | { TASK_STOP_MOVING, (float)0 }, |
4 | { TASK_SET_ACTIVITY, (float)ACT_IDLE }, |
5 | { TASK_WAIT_FACE_ENEMY, (float)2 }, |
6 | [B]{ TASK_GET_PATH_TO_SPOT, (float)0 },[/B] |
Также, по совету Ku2zoff добавил прогулку в случае фейла schedule (defaultai.cpp):
C++ Source Code:
4 | return &slIdleWalk[ 0 ]; |
В AI_BaseNPC_Schedule.cpp тоже немного добавил:
C++ Source Code:
1 | else if ( HasConditions ( bits_COND_HEAR_SOUND ) ) |
3 | return GetScheduleOfType( SCHED_ALERT_FACE ); |
7 | [B]if (m_AttackPlayers && GetEnemy()) { |
9 | SetState( MONSTERSTATE_COMBAT ); |
13 | return GetScheduleOfType( SCHED_ALERT_STAND ); |
Если указать монстру m_AttackPlayers = FALSE, то он будет себя вести по дефолтному, а если TRUE, то будет пытаться атаковать игроков, искать их.
Отправлено PLut 18-11-2015 в 13:03:
Engineer Спасибо за пост на форуме! Будет минутка - проверю как оно работает.
__________________
Base Defense on Steam, ModDB
Отправлено Ku2zoff 18-11-2015 в 16:26:
Цитата:
Engineer писал:
Добавил монстрам (CBaseMonster) переменную BOOL m_AttackPlayers
Если грамотно оперировать этой переменной, можно сделать состояние тревоги для монстров, к примеру как в Deus Ex. Если они заметили игрока, то некоторое время его ищут. Если не находят к тому времени, когда таймер досчитал до нуля, то AttackPlayers становится FALSE, и они прекращают поиски и возвращаются к "своим делам". Очень интересная задумка.
Отправлено Ghoul [BB] 18-11-2015 в 23:08:
А теперь интересно узнать, какие такие "свои дела" у монстров, помимо стояния на одном месте и периодического воспроизведения IdleSound-ов...
__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.
Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo
Отправлено Engineer 20-11-2015 в 16:23:
Эх. Всё же проблема не полностью решена.
Когда монстры блокируют друг другу проход, то появляется куча:
Цитата:
func_wall Failed to move (1)!
Schedule Failed at 3!
Монстры начинают тупить, всё бесконечно зацикливается и монстры не двигаются.
Может кто-то подскажет, в какую сторону копать? Какие таски лучше выполнять в случае Failed to move?