Монстр двигается к игроку, может пару раз атаковать. Но спустя некоторое время останавливается.
Я решил периодически вызывать следующий код:
C++ Source Code:
1
edict_t *pEdict;
2
for (int i = 0; i < monster_ents_used; i++) {
3
if (monsters[i].pMonster == NULL) {
4
continue;
5
}
6
7
pEdict = ENT(monsters[i].pMonster->pev);
8
9
if ( pEdict->free )
10
continue;
11
12
if ( !(pEdict->v.flags & (FL_MONSTER)) )
13
continue;
14
15
if (!UTIL_IsAlive(pEdict)) {
16
continue;
17
}
18
19
if (monsters[i].pMonster->m_movementGoal == MOVEGOAL_NONE) {
20
monsters[i].pMonster->FRouteClear();
21
22
if (monsters[i].pMonster-><img src="images/smilies/pp2.gif" border="0" alt="">opEnemy()) {
23
monsters[i].pMonster->MoveToEnemy(ACT_RUN, 20);
24
}
25
}
26
}
Здесь я проверял значение 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 по карте раскиданы и по идее, монстры по ним двигаются. Монстр никуда не падает, не застревает и по идее должен нормально ориентироваться. Но этого не происходит.
Куда копать? Как исправить проблему, чтобы монстры не останавливались и продолжали двигаться и игроку и атаковать его.
Engineer Убийцу бейс дефенса пишешь?
Если честно, то я много раз по-разному пытался сделать, чтобы монстры выискивали игрока, но грамотно ни разу не получилось сделать. Однако, у меня они порой удивляют, ибо внезапно могут найти тебя где угодно на карте, когда ты этого не ждешь, так же правильно строят обходы пути через всю карту, если игрок поднялся на лифте, например. Но вот чтобы они давили постоянно на тебя без тупизма - вот никак. Интересно будет почитать тему.
PLut писал: они порой удивляют, ибо внезапно могут найти тебя где угодно на карте, когда ты этого не ждешь, так же правильно строят обходы пути через всю карту, если игрок поднялся на лифте, например. Но вот чтобы они давили постоянно на тебя без тупизма - вот никак.
Ну наверное потому, что скедъюлы фейлятся на определённом этапе в процессе поиска игрока. В качестве FAIL_SCHEDULE стоит указать нечто кастомное, в котором монстр будет "сканировать" территорию и передвигаться по ней. А уже в качестве FAIL_SCHEDULE для последнего указывать надо простую прогулку по нодам.
PLut, да, ты прав, Base Defense, но как плагин Metamod. Мне очень нравится эта идея.
Много раз тебя спрашивал про релиз или хотя-бы багфикс с неткодом (а то даже сервер не запустить, 3-4 игрока и начинаются вылеты). Устал ждать и решил написать своё
Я решил копнуть в сторону nodes.cpp. Попробовал закомментить:
Engineer Вон американцы какие-то умелые поставили сервак старой версии, у них всё работает как часы, там какие-то маньяки набивали уйму поинтов. Так что, даже не знаю что тебе посоветовать.
У меня в очереди сейчас тест мультиплеерный, по его результатам буду смотреть чего еще надо доделать в новой версии, а так прогресс идет: один товарищ пилит сайт новый (увидим ли мы этот сайт или нет - хз, но вот минивики обновлять буду), фгд запилен, все игровые предметы, добавленные в код, теперь можно получить в игре разными способами.
А где ты спрашивал?
Такое конкретно и лично спрашивать надо, на рандомные вопросы о релизе я не отвечаю, т.к. мои планы очень часто рушатся, но оно к добру только.
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 );
6
}
Вроде стало получше, количество останавливающихся монстров уменьшилось. Но появилось больше ошибок связанных с нодами:
Цитата:
No Path from 29 to 11!
GetPathToEnemy failed!!
No Path from 29 to 11!
Полагаю, нужно что-то править в nodes.
Цитата:
PLut писал: А где ты спрашивал?
Такое конкретно и лично спрашивать надо, на рандомные вопросы о релизе я не отвечаю, т.к. мои планы очень часто рушатся, но оно к добру только.
На moddb, в комментариях я спрашивал.
Я и сейчас новую версию жду, у меня даже в закладках ссылка на http://www.moddb.com/mods/b-def , по ней я периодически перехожу.
Engineer Нашел и тебя и всё, что ты написал Я помню, что как-то синий ответил тебе там же вопросом "Why?" на сообщение о том, что играть невозможно.
Ну не суть, с тех пор много времени прошло и, поверь, оно того стоило. Просто от балды я бы не стал задерживать, текущая версия практически несравнима с предыдущей по качеству. Ибо там то, что я тогда назвал "экстендед" и полной версией, сейчас выглядит очень сырой бета-версией. Да, и по сути, предыдущую кто-нибудь помнит как я выкладывал? Я накатал сообщение о том, что учеба, творческий кризис и выложил, что было.
Успехов с модом, если есть чего показать, то показывай, интересно жа
Если грамотно оперировать этой переменной, можно сделать состояние тревоги для монстров, к примеру как в Deus Ex. Если они заметили игрока, то некоторое время его ищут. Если не находят к тому времени, когда таймер досчитал до нуля, то AttackPlayers становится FALSE, и они прекращают поиски и возвращаются к "своим делам". Очень интересная задумка.
А теперь интересно узнать, какие такие "свои дела" у монстров, помимо стояния на одном месте и периодического воспроизведения IdleSound-ов...
__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.
Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo
Эх. Всё же проблема не полностью решена.
Когда монстры блокируют друг другу проход, то появляется куча:
Цитата:
func_wall Failed to move (1)!
Schedule Failed at 3!
Монстры начинают тупить, всё бесконечно зацикливается и монстры не двигаются.
Может кто-то подскажет, в какую сторону копать? Какие таски лучше выполнять в случае Failed to move?