Перейти к содержанию
Авторизация  
DevGoD

Помощь Ai

Рекомендуемые сообщения

Овероподобная основа.

 

Имеем код обычного валкера:

 

public class WalkerAI extends DefaultAI
{
private int _routeIndex = 0;
private short _direction = 1;
private long _lastMove = 0;
private NpcInstance actor;
public WalkerAI(NpcInstance actor)
{
 super(actor);
 setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
}
@Override
protected boolean thinkActive()
{
 WalkerRouteTemplate routeTemplate = getActor().getWalkerRouteTemplate();
 if(routeTemplate == null)
 {
  return false;
 }
 boolean LINEAR = (routeTemplate.getRouteType() == RouteType.LINEAR);
 boolean CYCLE = (routeTemplate.getRouteType() == RouteType.CYCLE);
 boolean TELEPORT = (routeTemplate.getRouteType() == RouteType.TELEPORT);
 if(routeTemplate.getIsRunning())
 {
  getActor().setRunning();
 }
 int pointsCount = routeTemplate.getPointsCount();
 if(pointsCount <= 0)
 {
  return false;
 }
 Route point = null;
 int oldIndex = _routeIndex;
 if((_routeIndex + _direction) >= pointsCount || (_routeIndex + _direction) < 0)
 {
  if(LINEAR)
  {
   _direction *= -1;
   _routeIndex += _direction;
   point = routeTemplate.getPoints().get(_routeIndex);
  }
  else if(CYCLE)
  {
   _direction = 1;
   _routeIndex = 0;
   point = routeTemplate.getPoints().get(_routeIndex);
  }
  else if(TELEPORT)
  {
   _direction = 1;
   _routeIndex = 0;
   point = routeTemplate.getPoints().get(_routeIndex);
  }
 }
 else
 {
  _routeIndex += _direction;
  point = routeTemplate.getPoints().get(_routeIndex);
 }
 Location nextLoc = point.getLoc();
 long delay = (point.getDelay() <= 0) ? routeTemplate.getDelay() : point.getDelay();
 if(_lastMove == 0)
 {
  _lastMove = System.currentTimeMillis() + delay;
  _routeIndex = oldIndex;
  return false;
 }
 else if(getActor().isMoving)
 {
  _routeIndex = oldIndex;
  return false;
 }
 else if(System.currentTimeMillis() - _lastMove > delay)
 {
  if(TELEPORT & point.getLastPoint())
  {
   getActor().teleToLocation(nextLoc);
   _lastMove = System.currentTimeMillis();
  }
  getActor().moveToLocation(nextLoc, 0, true);
  _lastMove = System.currentTimeMillis();
 }
 return true;
}
@Override
protected boolean createNewTask()
{
 return defaultFightTask();
}
@Override
public boolean checkAggression(Creature target)
{
 return super.checkAggression(target);
}
@Override
public boolean isGlobalAI()
{
 return true;
}

 

Как сделать так, чтобы при обнаружении игрока, бегущий моб начинал агриться на него?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я переписывал инстанс с нуля, чтобы сделать это. Отталкивался от гордона. Пытался переписать с помощью именно AI, но там все очень замудрено, просто так с наскока не взять, много времени понадобится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как сделать так, чтобы при обнаружении игрока, бегущий моб начинал агриться на него?

 

Я могу только дать направление:

 

в метод onEvtThink

 

так берем нпс этого

NpcInstance actor = getActor();

чекаем игроков вокгруг нпс, если никого нет - ничего не делаем (продолжаем идти)

 

List<Creature> around = World.getAroundCharacters(actor, 800, 300);

if(around.isEmpty())

return;

 

Если нашли игрока и он не мертвый

 

 

for(Creature cha : around)

if(cha.isPlayer() && !cha.isDead())

{

тут добавляем его в арго-лист нпс xD

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что мешает от АИ моба сделать наследственный класс и в нем реализовать бегающего моба? Зачем трогать АИ мирных нпсов?

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем-то ничего не мешает. Я делаю аналог Walker'а, но для,так сказать, "Патрульных" мобов у которых один и тот же ID, но разные роуты. Поэтому и хочу воткнуть здесь проверку на наличие персонажа, и при наличии, агриться на него. Вот только немного непонимаю как.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем-то ничего не мешает. Я делаю аналог Walker'а, но для,так сказать, "Патрульных" мобов у которых один и тот же ID, но разные роуты. Поэтому и хочу воткнуть здесь проверку на наличие персонажа, и при наличии, агриться на него. Вот только немного непонимаю как.

 

Если вам так легче будет, то копайте checkAggression в DefaultAI.java или переопределите метод, как вам нужно. Там стоят проверки, при каких условиях атаковать.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вариантов великое множество и за вас их придумывать никто не будет. Реализовывайте как задумали. Я бы не сказал, что правильно так или нет, у каждого подхода свои нюансы.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...