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

Проблема С Ai

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

Нужна помощь. Хочу реализовать через аи следующее: пока около моба нет живых игроков, он через определённый промежуток времени кричит в чат

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


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

Ну под овероподобную основу

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;
}
}

Изменено пользователем AwakenDev
  • Upvote 1

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


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

Блин спасибо, а я всё пытался через onEvtThink();

Изменено пользователем dislike

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


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

@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. я пишу некое подобие ивента "поисковика"

Изменено пользователем dislike

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


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

Разобрался

 

@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();
}

 

Изменено пользователем dislike

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


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.
Авторизация  

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

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

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