HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Монстры прекращают преследование
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
Engineer
Частый гость

Дата регистрации: Nov 2012
Проживает: SPb
Сообщений: 48
Возраст: 31

Рейтинг



Half-Life Монстры прекращают преследование

Спустя некоторое время после спавна, монстр перестаёт преследовать и атаковать игрока по неизвестной причине.

После спавна, я направляю монстра к игроку:

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:
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-&gt<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 12-11-2015 в 14:36

Сообщить модератору | | IP: Записан
Сообщение: 151636

Старое сообщение 12-11-2015 14:22
- За что?
PLut
Creator

Дата регистрации: Jun 2009
Проживает: Санкт-Петербург
Сообщений: 1220
Возраст: 29

Рейтинг



Engineer Убийцу бейс дефенса пишешь?
Если честно, то я много раз по-разному пытался сделать, чтобы монстры выискивали игрока, но грамотно ни разу не получилось сделать. Однако, у меня они порой удивляют, ибо внезапно могут найти тебя где угодно на карте, когда ты этого не ждешь, так же правильно строят обходы пути через всю карту, если игрок поднялся на лифте, например. Но вот чтобы они давили постоянно на тебя без тупизма - вот никак. Интересно будет почитать тему.

__________________
Base Defense on Steam, ModDB

Сообщить модератору | | IP: Записан
Сообщение: 151638

Старое сообщение 12-11-2015 15:00
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6749
Возраст: 33

Рейтинг



Цитата:
PLut писал:
они порой удивляют, ибо внезапно могут найти тебя где угодно на карте, когда ты этого не ждешь, так же правильно строят обходы пути через всю карту, если игрок поднялся на лифте, например. Но вот чтобы они давили постоянно на тебя без тупизма - вот никак.

Ну наверное потому, что скедъюлы фейлятся на определённом этапе в процессе поиска игрока. В качестве FAIL_SCHEDULE стоит указать нечто кастомное, в котором монстр будет "сканировать" территорию и передвигаться по ней. А уже в качестве FAIL_SCHEDULE для последнего указывать надо простую прогулку по нодам.

Сообщить модератору | | IP: Записан
Сообщение: 151639

Старое сообщение 12-11-2015 15:07
- За что?
Engineer
Частый гость

Дата регистрации: Nov 2012
Проживает: SPb
Сообщений: 48
Возраст: 31

Рейтинг



PLut, да, ты прав, Base Defense, но как плагин Metamod. Мне очень нравится эта идея.
Много раз тебя спрашивал про релиз или хотя-бы багфикс с неткодом (а то даже сервер не запустить, 3-4 игрока и начинаются вылеты). Устал ждать и решил написать своё

Я решил копнуть в сторону nodes.cpp. Попробовал закомментить:

C++ Source Code:
1
if (m_Cache[iHash].v == vecOrigin)
2
{
3
  ALERT(at_aiconsole, "Cache Hit.\n");
4
  return m_Cache[iHash].n;
5
}
6
else
7
{
8
  ALERT(at_aiconsole, "Cache Miss.\n");
9
}


Монстры останавливаются, но, вроде как, реже.

Сообщить модератору | | IP: Записан
Сообщение: 151640

Старое сообщение 12-11-2015 15:17
- За что?
PLut
Creator

Дата регистрации: Jun 2009
Проживает: Санкт-Петербург
Сообщений: 1220
Возраст: 29

Рейтинг



Engineer Вон американцы какие-то умелые поставили сервак старой версии, у них всё работает как часы, там какие-то маньяки набивали уйму поинтов. Так что, даже не знаю что тебе посоветовать.
У меня в очереди сейчас тест мультиплеерный, по его результатам буду смотреть чего еще надо доделать в новой версии, а так прогресс идет: один товарищ пилит сайт новый (увидим ли мы этот сайт или нет - хз, но вот минивики обновлять буду), фгд запилен, все игровые предметы, добавленные в код, теперь можно получить в игре разными способами.

А где ты спрашивал?
Такое конкретно и лично спрашивать надо, на рандомные вопросы о релизе я не отвечаю, т.к. мои планы очень часто рушатся, но оно к добру только.

__________________
Base Defense on Steam, ModDB

Сообщить модератору | | IP: Записан
Сообщение: 151642

Старое сообщение 12-11-2015 15:28
- За что?
Engineer
Частый гость

Дата регистрации: Nov 2012
Проживает: SPb
Сообщений: 48
Возраст: 31

Рейтинг



Стал периодически вызывать следующий код:

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 );
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 , по ней я периодически перехожу.

Сообщить модератору | | IP: Записан
Сообщение: 151643

Старое сообщение 12-11-2015 18:59
- За что?
PLut
Creator

Дата регистрации: Jun 2009
Проживает: Санкт-Петербург
Сообщений: 1220
Возраст: 29

Рейтинг



Engineer Нашел и тебя и всё, что ты написал Я помню, что как-то синий ответил тебе там же вопросом "Why?" на сообщение о том, что играть невозможно.

Ну не суть, с тех пор много времени прошло и, поверь, оно того стоило. Просто от балды я бы не стал задерживать, текущая версия практически несравнима с предыдущей по качеству. Ибо там то, что я тогда назвал "экстендед" и полной версией, сейчас выглядит очень сырой бета-версией. Да, и по сути, предыдущую кто-нибудь помнит как я выкладывал? Я накатал сообщение о том, что учеба, творческий кризис и выложил, что было.

Успехов с модом, если есть чего показать, то показывай, интересно жа

__________________
Base Defense on Steam, ModDB

Сообщить модератору | | IP: Записан
Сообщение: 151645

Старое сообщение 12-11-2015 19:36
- За что?
Engineer
Частый гость

Дата регистрации: Nov 2012
Проживает: SPb
Сообщений: 48
Возраст: 31

Рейтинг



Вновь всем привет. Проблему свою я решил. Опишу, что сделал, вероятно ещё кому-то пригодиться.
Я немного поменял дефолтный AI.

Добавил монстрам (CBaseMonster) переменную BOOL m_AttackPlayers, с ней монстр будет вести себя агрессивно =)

В monsterstate.cpp немного добавил:

C++ Source Code:
1
if ( m_hEnemy != 0 )
2
{
3
  if (m_AttackPlayers) {
4
    State = MONSTERSTATE_COMBAT;
5
  } else {
6
    m_hEnemy = NULL;
7
    ALERT ( at_aiconsole, "Stripped\n" ); // not allowed to have an enemy anymore.
8
  }
9
}


В monsters.cpp для GetEnemy добавил ещё один поиск:
C++ Source Code:
if (m_hEnemy == NULL) {
  m_hEnemy = FIND_ENTITY_BY_CLASSNAME( NULL, "player" );
}


В defaultai.cpp для tlStandoff добавил таск TASK_GET_PATH_TO_SPOT:
C++ Source Code:
1
Task_t	tlStandoff[] =
2
{
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]
7
};


Также, по совету Ku2zoff добавил прогулку в случае фейла schedule (defaultai.cpp):
C++ Source Code:
1
case SCHED_FAIL:
2
{
3
  if (m_AttackPlayers) {
4
    return &slIdleWalk[ 0 ];
5
  }
6
  else {
7
    return slFail;
8
  }
9
}


В AI_BaseNPC_Schedule.cpp тоже немного добавил:
C++ Source Code:
1
else if ( HasConditions ( bits_COND_HEAR_SOUND ) )
2
{
3
  return GetScheduleOfType( SCHED_ALERT_FACE );
4
}
5
else
6
{
7
  [B]if (m_AttackPlayers && GetEnemy()) {
8
    // Agressive monster
9
    SetState( MONSTERSTATE_COMBAT );
10
    return GetSchedule();
11
  }[/B]
12
  else {
13
    return GetScheduleOfType( SCHED_ALERT_STAND );
14
  }
15
}


Если указать монстру m_AttackPlayers = FALSE, то он будет себя вести по дефолтному, а если TRUE, то будет пытаться атаковать игроков, искать их.

Сообщить модератору | | IP: Записан
Сообщение: 151705

Старое сообщение 18-11-2015 12:25
- За что?
PLut
Creator

Дата регистрации: Jun 2009
Проживает: Санкт-Петербург
Сообщений: 1220
Возраст: 29

Рейтинг



Engineer Спасибо за пост на форуме! Будет минутка - проверю как оно работает.

__________________
Base Defense on Steam, ModDB

Сообщить модератору | | IP: Записан
Сообщение: 151706

Старое сообщение 18-11-2015 13:03
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6749
Возраст: 33

Рейтинг



Цитата:
Engineer писал:
Добавил монстрам (CBaseMonster) переменную BOOL m_AttackPlayers

Если грамотно оперировать этой переменной, можно сделать состояние тревоги для монстров, к примеру как в Deus Ex. Если они заметили игрока, то некоторое время его ищут. Если не находят к тому времени, когда таймер досчитал до нуля, то AttackPlayers становится FALSE, и они прекращают поиски и возвращаются к "своим делам". Очень интересная задумка.

Сообщить модератору | | IP: Записан
Сообщение: 151708

Старое сообщение 18-11-2015 16:26
- За что?
Ghoul [BB]
МРАЗЬ ОПАСНАЯ

Дата регистрации: Jan 2006
Проживает: ...и прожигает...
Сообщений: 2567

Рейтинг



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

__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.

Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo

Сообщить модератору | | IP: Записан
Сообщение: 151710

Старое сообщение 18-11-2015 23:08
- За что?
Engineer
Частый гость

Дата регистрации: Nov 2012
Проживает: SPb
Сообщений: 48
Возраст: 31

Рейтинг



Эх. Всё же проблема не полностью решена.
Когда монстры блокируют друг другу проход, то появляется куча:

Цитата:
func_wall Failed to move (1)!
Schedule Failed at 3!


Монстры начинают тупить, всё бесконечно зацикливается и монстры не двигаются.
Может кто-то подскажет, в какую сторону копать? Какие таски лучше выполнять в случае Failed to move?

Сообщить модератору | | IP: Записан
Сообщение: 151746

Старое сообщение 20-11-2015 16:23
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 12:06. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Монстры прекращают преследование
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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