DevGoD 342 Опубликовано 31 августа, 2013 Овероподобная основа. Имеем код обычного валкера: 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; } Как сделать так, чтобы при обнаружении игрока, бегущий моб начинал агриться на него? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
TpaMjkee 128 Опубликовано 31 августа, 2013 Я думаю просто в бд сделать агрессивность. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DevGoD 342 Опубликовано 31 августа, 2013 Нет, если бы было всё так просто, я бы не писал. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hast3 0 Опубликовано 1 сентября, 2013 Я переписывал инстанс с нуля, чтобы сделать это. Отталкивался от гордона. Пытался переписать с помощью именно AI, но там все очень замудрено, просто так с наскока не взять, много времени понадобится. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Kosgond 13 Опубликовано 1 сентября, 2013 Как сделать так, чтобы при обнаружении игрока, бегущий моб начинал агриться на него? Я могу только дать направление: в метод 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 } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 3 сентября, 2013 Что мешает от АИ моба сделать наследственный класс и в нем реализовать бегающего моба? Зачем трогать АИ мирных нпсов? 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DevGoD 342 Опубликовано 3 сентября, 2013 В общем-то ничего не мешает. Я делаю аналог Walker'а, но для,так сказать, "Патрульных" мобов у которых один и тот же ID, но разные роуты. Поэтому и хочу воткнуть здесь проверку на наличие персонажа, и при наличии, агриться на него. Вот только немного непонимаю как. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 4 сентября, 2013 В общем-то ничего не мешает. Я делаю аналог Walker'а, но для,так сказать, "Патрульных" мобов у которых один и тот же ID, но разные роуты. Поэтому и хочу воткнуть здесь проверку на наличие персонажа, и при наличии, агриться на него. Вот только немного непонимаю как. Если вам так легче будет, то копайте checkAggression в DefaultAI.java или переопределите метод, как вам нужно. Там стоят проверки, при каких условиях атаковать. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DevGoD 342 Опубликовано 4 сентября, 2013 А какие альтернативные варианты? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 4 сентября, 2013 Вариантов великое множество и за вас их придумывать никто не будет. Реализовывайте как задумали. Я бы не сказал, что правильно так или нет, у каждого подхода свои нюансы. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DevGoD 342 Опубликовано 4 сентября, 2013 Хорошо, благодарю. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты