Для начала смотрим свободного НПС в дат паке в таблице npc - запоминаем ид..
для чего да для того что все нпс у реба синхронизируются с клиентом...Можно конечно и своего сделать но нужно лезть в клиент, а этого нам больше всего не хочется..Итак приступим
Даем нашему нпс в той же таблице npc в поле ai мозг те пишем допустим Taurin2.
идем в папку скриптов папку ai и копируем файлег Taurin.java > потом его редактим (пишу копи пасте тк не все шарят в джаве)
Далее на подобии правим диалоги которые нпс говорит
Замечу что диалоги произносятся по достижении нпс определенной точки по координатам указанным в этом файле.
Заранее нужно определить путь нпс - НПС не должен натыкатся на стены и препятствия..
Все координаты вбили, диалоги добавили - сохраняем файл и называем его Taurin2.java
Все редактирования производим в утф8 дабы избежать проблем..
Запускаем сервер смотрим на консоль если скрипты подгрузились то все ок - нет ищем ошибки в том что написали.
если в базу вашему нпс не добавить ai то по умолчанию нпс ходить и говоритьб не будет нужно админом подойти выделить его и написать //admin_setai Taurin2
теперь все в порядке но опять же нпс пройдет 1 цикл и будет стоять на стартовой точке пока вы не пропишете ему мозги снова поэтому рекомендую дать мозг ему навечно
для чего да для того что все нпс у реба синхронизируются с клиентом...Можно конечно и своего сделать но нужно лезть в клиент, а этого нам больше всего не хочется..Итак приступим
Даем нашему нпс в той же таблице npc в поле ai мозг те пишем допустим Taurin2.
идем в папку скриптов папку ai и копируем файлег Taurin.java > потом его редактим (пишу копи пасте тк не все шарят в джаве)
Далее на подобии правим диалоги которые нпс говорит
Замечу что диалоги произносятся по достижении нпс определенной точки по координатам указанным в этом файле.
Заранее нужно определить путь нпс - НПС не должен натыкатся на стены и препятствия..
Все координаты вбили, диалоги добавили - сохраняем файл и называем его Taurin2.java
Все редактирования производим в утф8 дабы избежать проблем..
Запускаем сервер смотрим на консоль если скрипты подгрузились то все ок - нет ищем ошибки в том что написали.
если в базу вашему нпс не добавить ai то по умолчанию нпс ходить и говоритьб не будет нужно админом подойти выделить его и написать //admin_setai Taurin2
теперь все в порядке но опять же нпс пройдет 1 цикл и будет стоять на стартовой точке пока вы не пропишете ему мозги снова поэтому рекомендую дать мозг ему навечно
Код:
package ai;
import l2r.gameserver.ai.DefaultAI;
import l2r.gameserver.model.L2Character;
import l2r.extensions.scripts.Functions;
import l2r.gameserver.serverpackets.MagicSkillUse;
import l2r.util.Location;
import l2r.util.Rnd;
public class Taurin2 extends DefaultAI //здесь тоже добавим 2
{
private Location[] points = new Location[41];
private int current_point = -1;
private long wait_timeout = 0;
private boolean wait = false;
public Taurin2(L2Character actor) //меняем на Taurin2
{
super(actor);//описание пути НПС points - это точка в скобочках пишем координату
points[0] = new Location(80752, 146400, -3533);
points[1] = new Location(80250, 146988, -3559);
points[2] = new Location(80070, 146942, -3559);
points[3] = new Location(80048, 146705, -3547);
points[4] = new Location(79784, 146561, -3546);
points[5] = new Location(79476, 146800, -3547);
points[6] = new Location(79490, 147480, -3559);
points[7] = new Location(79812, 148310, -3559);
points[8] = new Location(79692, 148564, -3559);
points[9] = new Location(77569, 148495, -3623);
points[10] = new Location(77495, 148191, -3622);
points[11] = new Location(77569, 148495, -3623);
points[12] = new Location(79819, 148740, -3559);
points[13] = new Location(79773, 149110, -3559);
points[14] = new Location(79291, 149523, -3559);
points[15] = new Location(79569, 150214, -3548);
points[16] = new Location(79679, 150717, -3543);
points[17] = new Location(80106, 150630, -3547);
points[18] = new Location(81207, 150276, -3559);
points[19] = new Location(81820, 150666, -3559);
points[20] = new Location(82038, 150589, -3559);
points[21] = new Location(82394, 149943, -3559);
points[22] = new Location(82038, 150589, -3559);
points[23] = new Location(81820, 150666, -3559);
points[24] = new Location(81582, 150590, -3559);
points[25] = new Location(81535, 149653, -3495);
points[26] = new Location(83814, 148630, -3420);
points[27] = new Location(87001, 148637, -3428);
points[28] = new Location(83814, 148630, -3420);
points[29] = new Location(82921, 148467, -3495);
points[30] = new Location(82060, 148070, -3495);
points[31] = new Location(82060, 148070, -3495);
points[32] = new Location(82060, 148070, -3495);
points[33] = new Location(82060, 148070, -3495);
points[34] = new Location(81544, 147514, -3491);
points[35] = new Location(81691, 146578, -3559);
points[36] = new Location(83190, 146687, -3491);
points[37] = new Location(81691, 146578, -3559);
points[38] = new Location(81331, 146915, -3559);
points[39] = new Location(81067, 146925, -3559);
points[40] = new Location(80752, 146400, -3533);
}
@Override
public boolean isGlobalAI()
{
return true;
}
@Override
protected boolean thinkActive()
{
if(_thisActor.isDead())
return true;
if(_def_think)
{
doTask();
return true;
}
if(System.currentTimeMillis() > wait_timeout && (current_point > -1 || Rnd.chance(5)))
{
if(!wait)
switch(current_point)
{
// Это паузы на определеных точках в милисекундах
// (case 3:) Это номер точки на которой делать паузу
// npcSayInRange - сказать в Зону
// npcSayToAll - Сказать всем
// npcSayToPlayer - Сказать определеному игроку
// npcShout - просто сказать всем видимым
// пользовать вот так например
// Functions.npcShout(_thisActor, "Всем лежать, у меня бомба!");
// Использывание скиллов //
// _thisActor.broadcastPacket(new MagicSkillUse(_thisActor, _thisActor, _skillId, skilllevel, castTime, 0));
// На примере 2025 Large Firework //
// _thisActor.broadcastPacket(new MagicSkillUse(_thisActor, _thisActor, 2025, 1, 500, 0));
// ЗДЕСЬ ОПИСАНЫ ДЕЙСТВИЯ НПС ПО ДОСТИЖЕНИИ ОПРЕДЕЛЕННЫХ КООРДИНАТ CASE ЭТО КЕЙС КОТОРЫЙ СРАБАТЫВАЕТ ПО ДОСТИЖЕНИИ point 4 И ТАК ДАЛЕЕ...
case 4:
wait_timeout = System.currentTimeMillis() + 10000;//ВРЕМЯ КОТОРОЕ МЫ СТОИМ НА МЕСТЕ
wait = true;
return true;
case 10:
wait_timeout = System.currentTimeMillis() + 10000;//ВРЕМЯ КОТОРОЕ МЫ СТОИМ НА МЕСТЕ
wait = true;
return true;
case 14:
wait_timeout = System.currentTimeMillis() + 10000;//ВРЕМЯ КОТОРОЕ МЫ СТОИМ НА МЕСТЕ
wait = true;
return true;
case 16:
wait_timeout = System.currentTimeMillis() + 10000;//ВРЕМЯ КОТОРОЕ МЫ СТОИМ НА МЕСТЕ
wait = true;
return true;
case 21:
wait_timeout = System.currentTimeMillis() + 10000;//ВРЕМЯ КОТОРОЕ МЫ СТОИМ НА МЕСТЕ
wait = true;
return true;
case 27:
wait_timeout = System.currentTimeMillis() + 10000;//ВРЕМЯ КОТОРОЕ МЫ СТОИМ НА МЕСТЕ
wait = true;
return true;
case 30:
wait_timeout = System.currentTimeMillis() + 10000;//ВРЕМЯ КОТОРОЕ МЫ СТОИМ НА МЕСТЕ
Functions.npcShout(_thisActor, "ПРИВЕТ ЛЮДИ");// ПРИМЕРНО ТАК МЕНЯЕМ ДИАЛОГИ
wait = true;
return true;
case 31:
wait_timeout = System.currentTimeMillis() + 15000;//ВРЕМЯ КОТОРОЕ МЫ СТОИМ НА МЕСТЕ
Functions.npcShout(_thisActor, "ВСЕ КО МНЕ У МЕНЯ РАСПРОДАЖА!!!!");// ПРИМЕРНО ТАК МЕНЯЕМ ДИАЛОГИ
wait = true;
return true;
case 32:
wait_timeout = System.currentTimeMillis() + 15000;//ВРЕМЯ КОТОРОЕ МЫ СТОИМ НА МЕСТЕ
Functions.npcShout(_thisActor, "ПОЙДУ ДАЛЬШЕ!!!!!");// ПРИМЕРНО ТАК МЕНЯЕМ ДИАЛОГИ
wait = true;
return true;
case 33:
_thisActor.broadcastPacket(new MagicSkillUse(_thisActor, _thisActor, 2025, 1, 500, 0));
wait_timeout = System.currentTimeMillis() + 1000;//ДЕЙСТВИЕ КОТОРОЕ ПРОИЗВОДИТ НПС ТУТ ПУСКАЕТ ФЕЙРВЕРК
wait = true;
return true;
case 35:
wait_timeout = System.currentTimeMillis() + 10000;//ВРЕМЯ КОТОРОЕ МЫ СТОИМ НА МЕСТЕ
wait = true;
return true;
case 37:
wait_timeout = System.currentTimeMillis() + 30000000;//ВРЕМЯ КОТОРОЕ МЫ СТОИМ НА МЕСТЕ
wait = true;
return true;
}
wait_timeout = 0;
wait = false;
if(current_point >= points.length - 1)
current_point = -1;
current_point++;
// ДОБАВЛЯЕМ ЗАДАНИЕ ТЕ ПРЫГАЕМ ПО ТОЧКАМ
Task task = new Task();
task.type = TaskType.MOVE;
task.loc = points[current_point];
_task_list.add(task);
_def_think = true;
return true;
}
if(randomAnimation())
return true;
return false;
}
@Override
protected void onEvtAttacked(L2Character attacker, int damage)
{}
@Override
protected void onEvtAggression(L2Character target, int aggro)
{}
}