Half-Life и Adrenaline Gamer форум

Всё об игре в Халф-Лайф и АГ
Текущее время: 17 ноя 2019, 04:23

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Передвижение монстра
СообщениеДобавлено: 04 ноя 2015, 05:33 
Не в сети
Аватара пользователя
Зарегистрирован:
21 мар 2012, 13:21
Последнее посещение:
18 мар 2019, 13:13
Сообщения: 161
Недавно разбирался с 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


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Передвижение монстра
СообщениеДобавлено: 04 ноя 2015, 17:08 
Не в сети
Аватара пользователя
Зарегистрирован:
21 мар 2012, 13:21
Последнее посещение:
18 мар 2019, 13:13
Сообщения: 161
Испробовал несколько вариантов:
Код:
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.


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Передвижение монстра
СообщениеДобавлено: 04 ноя 2015, 20:20 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
23 сен 2019, 12:13
Сообщения: 6730
А передвигаться далеко?


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Передвижение монстра
СообщениеДобавлено: 04 ноя 2015, 20:23 
Не в сети
Аватара пользователя
Зарегистрирован:
21 мар 2012, 13:21
Последнее посещение:
18 мар 2019, 13:13
Сообщения: 161
Да, любое расстояние. На тестовой карте это около 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 бежал?".

_________________
Портал Half-Life DeathMatch


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Передвижение монстра
СообщениеДобавлено: 04 ноя 2015, 20:35 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
23 сен 2019, 12:13
Сообщения: 6730
Похоже, что они бегают только по прямой, а если ноды близко, то не успевают разогнаться:
Код:
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 секунду:
ЗЫ Но это если контроллер участвует в движении. Не разбирался досконально как там всё работает.


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Передвижение монстра
СообщениеДобавлено: 04 ноя 2015, 20:48 
Не в сети
Аватара пользователя
Зарегистрирован:
21 мар 2012, 13:21
Последнее посещение:
18 мар 2019, 13:13
Сообщения: 161
Ноды они почему-то даже не замечают, на каком расстоянии бы они не были.
Может нужно как-то по другому передвигать NPC? Всё равно бежать не хотят...

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

_________________
Портал Half-Life DeathMatch


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Передвижение монстра
СообщениеДобавлено: 04 ноя 2015, 21:05 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
23 сен 2019, 12:13
Сообщения: 6730
CMBaseMonster::Move и таски есть ещё. Они, конечно, могут просто быть завязаны и вместе использоваться, надо копаться.
Проверь, что в m_IdealActivity и m_movementActivity, может сбрасывается на ACT_WALK.
Какой тип монстра у тебя используется?


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Передвижение монстра
СообщениеДобавлено: 04 ноя 2015, 21:14 
Не в сети
Аватара пользователя
Зарегистрирован:
21 мар 2012, 13:21
Последнее посещение:
18 мар 2019, 13:13
Сообщения: 161
Да, действительно, 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);


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Передвижение монстра
СообщениеДобавлено: 04 ноя 2015, 23:00 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
23 сен 2019, 12:13
Сообщения: 6730
А при движении на точку они по прямой бегут? Что если изогнутый коридор - бегут в стену?


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: Передвижение монстра
СообщениеДобавлено: 05 ноя 2015, 00:23 
Не в сети
Аватара пользователя
Зарегистрирован:
21 мар 2012, 13:21
Последнее посещение:
18 мар 2019, 13:13
Сообщения: 161
По прямой. Если изогнутый коридор, то бегут в стену.

_________________
Портал Half-Life DeathMatch


Вернуться к началу
 Профиль 
  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB