dislike 302 Опубликовано 5 марта, 2014 Нужна помощь. Хочу реализовать через аи следующее: пока около моба нет живых игроков, он через определённый промежуток времени кричит в чат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GorDeveloper 356 Опубликовано 5 марта, 2014 (изменено) Ну под овероподобную основу package ai; import java.util.ArrayList; import java.util.List; import sw.awaken.gameserver.ai.DefaultAI; import sw.awaken.gameserver.model.Creature; import sw.awaken.gameserver.model.Player; import sw.awaken.gameserver.model.World; import sw.awaken.gameserver.model.instances.NpcInstance; /** * @Author AwakenDev **/ public class Sayer extends DefaultAI { public Sayer (NpcInstance actor) { super(actor); AI_TASK_ACTIVE_DELAY = 2000; AI_TASK_ATTACK_DELAY = 2000; } @Override protected boolean thinkActive() { if (!_def_think) { NpcInstance npc = getActor(); if (npc == null) return true; List<Creature> target = new ArrayList<Creature>(); for (Player player : World.getAroundPlayers(npc, 300, 300)) { target.add(player); } for(Creature giver : target) { //посыл текста } } return true; } @Override public boolean isGlobalAI() { return true; } } Изменено 5 марта, 2014 пользователем AwakenDev 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
dislike 302 Опубликовано 5 марта, 2014 (изменено) Блин спасибо, а я всё пытался через onEvtThink(); Изменено 5 марта, 2014 пользователем dislike Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
dislike 302 Опубликовано 5 марта, 2014 (изменено) @Override protected boolean thinkActive() //контролер флуда { if (!_def_think) { NpcInstance actor = getActor(); if(actor == null) return true; if(!isFind) { if(_wait_timeout < System.currentTimeMillis()) { _wait_timeout = System.currentTimeMillis() + 60000; executeTask("events.PiratesTreasure.PiratesTreasure", "annoncePointInfo", new Object[0], 60000); } } } return true; } Но после этого моб перестаёт агрессировать Можно конечно добавить, а без этого никак ? List<Creature> chars = World.getAroundCharacters(actor); CollectionUtils.eqSort(chars, _nearestTargetComparator); for(Creature cha : chars) { if(aggressive || actor.getAggroList().get(cha) != null) if(checkAggression(cha)) return true; } P.S. я пишу некое подобие ивента "поисковика" Изменено 5 марта, 2014 пользователем dislike Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
dislike 302 Опубликовано 6 марта, 2014 (изменено) Разобрался @Override protected boolean thinkActive() //контролер флуда { NpcInstance actor = getActor(); if(actor == null || actor.isDead()) return true; if(_wait_timeout < System.currentTimeMillis()) { if(!isFind) { _wait_timeout = System.currentTimeMillis() + 60000; ThreadPoolManager.getInstance().schedule(new RunnableImpl() { @Override public void runImpl() throws Exception { PiratesTreasure.annoncePointInfo(); } }, 60000); return true; } } return super.thinkActive(); } Изменено 6 марта, 2014 пользователем dislike Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
taste 501 Опубликовано 6 марта, 2014 Автоматическое сообщение Эта тема была перемещена из "Ядро" в "Архив старых тем". Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты