Всем Привет!
Помнится мне, раньше я пользовался сборками L2J и там был прекрасный NPC, который бегал по гирану и просил голосовать за сервер, покапавшись в инете не видел ни одного такого дополнения на l2phoenix.
Так что делаем такое дополнение сами по этому мануалу)
И так начнем!
В игре уже есть парочку NPC которые бегают, поэтому возьмем за основу уже существующего, я выбрал "Remy"
(server\game\data\scripts\ai\Remy.java)
Копируем его и переименовываем в GAGA.java
Открываем его через notepad++ (для удобной смены кодировки)
Свернуть ↑
PHP код:
package ai;
import l2p.extensions.scripts.Functions;
import l2p.gameserver.ai.DefaultAI;
import l2p.gameserver.model.L2Character;
import l2p.gameserver.model.instances.L2NpcInstance;
import l2p.util.Location;
import l2p.util.Rnd;
public class Remy extends DefaultAI
{
static final Location[] points = {new Location(-81926, 243894, -3712), new Location(-82134, 243600, -3728),
new Location(-83165, 243987, -3728), new Location(-84501, 243245, -3728), new Location(-85100, 243285, -3728),
new Location(-86152, 242898, -3728), new Location(-86288, 242962, -3720), new Location(-86348, 243223, -3720),
new Location(-86522, 242762, -3720), new Location(-86500, 242615, -3728), new Location(-86123, 241606, -3728),
new Location(-85167, 240589, -3728), new Location(-84323, 241245, -3728), new Location(-83215, 241170, -3728),
new Location(-82364, 242944, -3728), new Location(-81674, 243391, -3712), new Location(-81926, 243894, -3712)};
private int current_point = -1;
private long wait_timeout = 0;
private boolean wait = false;
public Remy(L2Character actor)
{
super(actor);
}
@Override
public boolean isGlobalAI()
{
return true;
}
@Override
protected boolean thinkActive()
{
L2NpcInstance actor = getActor();
if(actor == null || actor.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 0:
wait_timeout = System.currentTimeMillis() + 15000;
Functions.npcSay(actor, "Новая поставка для Mr. Lector? Очень хорошо!");
wait = true;
return true;
case 3:
wait_timeout = System.currentTimeMillis() + 15000;
Functions.npcSay(actor, "Я устал, мне бы отдохнуть!");
wait = true;
return true;
case 7:
wait_timeout = System.currentTimeMillis() + 15000;
Functions.npcSay(actor, "Здравствуйте, Mr. Lector! Давно не виделись, Mr. Jackson!");
wait = true;
return true;
case 12:
wait_timeout = System.currentTimeMillis() + 15000;
Functions.npcSay(actor, "Лулу!");
wait = true;
return true;
case 15:
wait_timeout = System.currentTimeMillis() + 60000;
wait = true;
return true;
}
}
wait_timeout = 0;
wait = false;
current_point++;
if(current_point >= points.length)
{
current_point = 0;
}
// Remy всегда бегает
actor.setRunning();
addTaskMove(points[current_point], true);
doTask();
return true;
}
if(randomAnimation())
{
return true;
}
return false;
}
@Override
protected void onEvtAttacked(L2Character attacker, int damage)
{
}
@Override
protected void onEvtAggression(L2Character target, int aggro)
{
}
}
Свернуть ↑Развернуть ↓
И так, приступим к редактированию.
ВАЖНО! ПРОВЕРЯЙТЕ КАЖДУЮ ЗАПЕТУЮ И ПРОЧИЕ!НЕ СТИРАЙТЕ ЛИШНИЕ ЗНАКИ!ИНАЧЕ СЕРВАК ПРОСТО НАПРОСТО НЕ ЗАПУСТИТСЯ!
1) ( public class Remy extends DefaultAI )
Тут заменяем Remy на GAGA
2) ( public Remy(L2Character actor) )
Также переименовываем Remy на GAGA
Файл подготовлен, к запуску, но запускать его пока не стоит, теперь его редактируем под себя,
Траектория хотьбы:
Нам нужно указать координаты для NPC по которым он будет ходить.
(Чтоб узнать координаты где находится ваш персонаж напишите "/loc")
Важно чтоб цепочка была без преград:
из пункта 1 в пункт 2 => 3 => 4
NPC должен свободно перемещаться к точке 1 из точки 4
И нигде не должно быть преград (камни, деревья, дома)
Иначе он будет врезаться в них, и телепортироваться к следующей точке.
Можно использовать и другую схему:
1=> 2 => 3 => 4 => 3=> 2 => 1
NPC будет бежать по заданной траектории и возвращаться тем же путем по которому пришел...
Думаю суть понятна)
Теперь текст который будет вылазить в чат:
PHP код:
case 0:
wait_timeout = System.currentTimeMillis() + 15000;
Functions.npcSay(actor, "Новая поставка для Mr. Lector? Очень хорошо!");
wait = true;
return true;
case 0 - это пункт в котором будет исполнено действие (0 это самая первая точка)
15000 - Время в миллисекундах (1 секунда равна 1000 миллисекунд)
То есть NPC будет стоять на этой точке 15 секунд.
Functions.npcSay(actor, "------"); Заменить ------ на свой текст
Вот вроде и все по данному скрипту, мы его настроили и он готов к работе, нам осталось создать NPC.
Создаем NPC
Создаем NPC по данному
МАНУАЛУ (если у вас есть в таблице NPC, столбик DisplayID, то в него вписываем ID моба у которого хотим взять скин, в этом случае нам не нужно редактировать DAT файл )
И так мы создали NPC, теперь его нужно настроить.
Значение type (L2Npc)
Значение ai_type (GAGA)
Настройка диалога с NPC
Создадим файл с названием *****.htm , где ***** Id Нашего NPC.
и поместим его в ( server\game\data\html\default\*****.htm )
Теперь мы можем с ним говорить)
SPAWN
И самое главное, SPAWN
Наш NPC должен появиться радом или в самой точке (1), что NPC смог дойти без преград до стартовой точки и начать выполнять скрипт.
______________________________________________
Примечание: я не пробовал делать монстра, возможно моб не будет ходить, но попробывать стоит)
Если NPC стоит на месте, и долго не бежит,то не перезагружайте скрипты в игре из админ панели, это не срабатывает,
Перезагружайте сам сервер, если скрипт всеравно не правильно работает во время его правки, то перезапускайте Java.
После перезагрузки скрипт будет работать нормально.
Естественно при условии что вы не напортачили в коде!
Если вы допустите хоть одну синтаксическую ошибку в редактировании java, то серв не запустится.
Вот теперь все) Плюсуйте если пригодилось)