Half-Life и Adrenaline Gamer форум
http://aghl.ru/forum/

Передвижение монстра
http://aghl.ru/forum/viewtopic.php?f=38&t=2310
Страница 1 из 3

Автор:  ImperNik [ 04 ноя 2015, 05:33 ]
Заголовок сообщения:  Передвижение монстра

Недавно разбирался с metamod плагином Monster plugin.
Возникла необходимость заспавнить монстра в одной локации и сделать так, чтобы он двигался к другой.

Создание монстра делается так:
Код:
monsters[monster_index].pMonster = CreateClassPtr((CMZombie *)NULL);
monsters[monster_index].respawn_index = respawn_index;

monster_pent = ENT(monsters[monster_index].pMonster->pev);
monsters[monster_index].monster_pent = monster_pent;

monsters[monster_index].monster_index = (*g_engfuncs.pfnIndexOfEdict)(monster_pent);

monster_pent->v.origin = Vector(900,2600,180);
monster_pent->v.angles.y = angle;

monsters[monster_index].pMonster->Spawn();

monster_pent->v.spawnflags = SF_MONSTER_FADECORPSE;
monster_pent->v.fuser4 = monster_pent->v.health;

Что мне добавить, чтобы монстр двигался к другой локации? И если я правильно понимаю, то, чтобы монстр передвигался, по карте должны быть раскиданы info_node

Автор:  ImperNik [ 04 ноя 2015, 17:08 ]
Заголовок сообщения:  Re: Передвижение монстра

Испробовал несколько вариантов:
Код:
monsters[monster_index].pMonster->MoveExecute(monster_pent, Vector(0,183,65), 20);
Код:
UTIL_MoveToOrigin(monster_pent, Vector(0,183,65), 20, MOVE_NORMAL);
Ничего не сработало.

Сработал только вариант с Task:
Код:
edict_t *pPlayer = INDEXENT(1); // Player #1
monsters[monster_index].pMonster->m_hTargetEnt = pPlayer;
Task_t *pTask = new Task_t();
pTask->iTask = TASK_MOVE_TO_TARGET_RANGE;
monsters[monster_index].pMonster->StartTask( pTask );
Но отличие здесь в том, что задаётся entity, а не координата.

Добавлено спустя 1 час 1 минуту 2 секунды:
Как оказалось, ничего сложного в этом не было. И зря я лез в Tasks.

Двигаться к координате:
Код:
monsters[monster_index].pMonster->MoveToLocation(ACT_RUN, 2, Vector(0,183,65));

Двигаться к игроку:
Код:
monsters[monster_index].pMonster->m_hTargetEnt = pPlayer;
monsters[monster_index].pMonster->MoveToTarget(ACT_RUN, 2);

Возникла другая проблема. NPC всегда идёт, а нужно, чтобы он бежал. Даже если в Activity передано ACT_RUN.

Автор:  Lev [ 04 ноя 2015, 20:20 ]
Заголовок сообщения:  Re: Передвижение монстра

А передвигаться далеко?

Автор:  ImperNik [ 04 ноя 2015, 20:23 ]
Заголовок сообщения:  Re: Передвижение монстра

Да, любое расстояние. На тестовой карте это около 2000 юнитов.
Вдобавок нужно чтобы монстр мог преодолевать препятствия, сейчас он упирается в стенку и начинается "func_wall Failed to move (1)!"

Добавлено спустя 5 минут 13 секунд:
Еще я сделал вывод сообщений в консоль в функции CMBaseMonster::MoveExecute, чтобы проверить значения переменных.

Если монстр не видит игрока, то он идёт:
Цитата:
dist 4.006655 (m_flGroundSpeed: 40.066399, pev->framerate: 1.000000, flInterval: 0.100000)

Как только монстр увидел игрока, он начинает нападать и бежать:
Цитата:
dist 30.400357 (m_flGroundSpeed: 304.002411, pev->framerate: 1.000000, flInterval: 0.100000)

Меняется значение m_flGroundSpeed, а где оно меняется я так и не понял. Интересно было бы посмотреть на этот код, ведь наверняка там кроется ответ на вопрос "Как сделать, чтобы NPC бежал?".

Автор:  Lev [ 04 ноя 2015, 20:35 ]
Заголовок сообщения:  Re: Передвижение монстра

Похоже, что они бегают только по прямой, а если ноды близко, то не успевают разогнаться:
Код:
void CMController :: SetActivity ( Activity NewActivity )
{
   CMBaseMonster::SetActivity( NewActivity );

   switch ( m_Activity)
   {
   case ACT_WALK:
      m_flGroundSpeed = 100;
      break;
   default:
      m_flGroundSpeed = 100;
      break;
   }
}

void CMController :: Move ( float flInterval )
{
...
   // cut corner?
   if (flWaypointDist < 128)
   {
      if ( m_movementGoal == MOVEGOAL_ENEMY )
         RouteSimplify( m_hEnemy );
      else
         RouteSimplify( m_hTargetEnt );
      FRefreshRoute();

      if (m_flGroundSpeed > 100)
         m_flGroundSpeed -= 40;
   }
   else
   {
      if (m_flGroundSpeed < 400)
         m_flGroundSpeed += 10;
   }
}

Добавлено спустя 3 минуты 41 секунду:
ЗЫ Но это если контроллер участвует в движении. Не разбирался досконально как там всё работает.

Автор:  ImperNik [ 04 ноя 2015, 20:48 ]
Заголовок сообщения:  Re: Передвижение монстра

Ноды они почему-то даже не замечают, на каком расстоянии бы они не были.
Может нужно как-то по другому передвигать NPC? Всё равно бежать не хотят...

А что помимо контроллера может участвовать в движении?

Автор:  Lev [ 04 ноя 2015, 21:05 ]
Заголовок сообщения:  Re: Передвижение монстра

CMBaseMonster::Move и таски есть ещё. Они, конечно, могут просто быть завязаны и вместе использоваться, надо копаться.
Проверь, что в m_IdealActivity и m_movementActivity, может сбрасывается на ACT_WALK.
Какой тип монстра у тебя используется?

Автор:  ImperNik [ 04 ноя 2015, 21:14 ]
Заголовок сообщения:  Re: Передвижение монстра

Да, действительно, m_movementActivity сбрасывается на ACT_WALK, когда монстр увидел игрока, то меняется на ACT_RUN.
Использую монстра hgrunt, пробовал разных - islave, zombie.

Добавлено спустя 22 минуты 15 секунд:
Решение проблемы нашел в следующем:

В AI_BaseNPC_Schedule.cpp (в hlsdk он sheldule.cpp) поменял местами ACT_WALK и ACT_RUN:
Код:
case TASK_WALK_PATH:
{
    if ( pev->movetype == MOVETYPE_FLY )
    {
        m_movementActivity = ACT_FLY;
    }
    if ( LookupActivity( ACT_RUN ) != ACTIVITY_NOT_AVAILABLE )
    {
        m_movementActivity = ACT_RUN;
    }
    else
    {
        m_movementActivity = ACT_WALK;
    }
    TaskComplete();
    break;
}

Добавлено спустя 2 минуты 46 секунд:
Осталась проблема с нодами. Не хотят двигаться по нодам, если игрок стоит за стеной, то NPC упирается в стену и всё.

Добавлено спустя 38 минут 32 секунды:
Проблему вроде решил заменой Target на Enemy. Буду тестить.

Код:
edict_t *pPlayer = INDEXENT(1);
monsters[monster_index].pMonster->m_hEnemy = pPlayer;
monsters[monster_index].pMonster->MoveToEnemy(ACT_RUN, 2);

Автор:  Lev [ 04 ноя 2015, 23:00 ]
Заголовок сообщения:  Re: Передвижение монстра

А при движении на точку они по прямой бегут? Что если изогнутый коридор - бегут в стену?

Автор:  ImperNik [ 05 ноя 2015, 00:23 ]
Заголовок сообщения:  Re: Передвижение монстра

По прямой. Если изогнутый коридор, то бегут в стену.

Страница 1 из 3 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/