Сообщений: 65
Тем: 15
Зарегистрирован: Oct 2009
Репутация:
37
03-26-2011, 12:06 PM
(Сообщение последний раз редактировалось: 03-01-2014, 03:17 AM Ashe.)
Всем Привет!
Помнится мне, раньше я пользовался сборками L2J и там был прекрасный NPC, который бегал по гирану и просил голосовать за сервер, покапавшись в инете не видел ни одного такого дополнения на l2phoenix.
Так что делаем такое дополнение сами по этому мануалу)
И так начнем!
В игре уже есть парочку NPC которые бегают, поэтому возьмем за основу уже существующего, я выбрал "Remy"
(server\game\data\scripts\ai\Remy.java)
Копируем его и переименовываем в GAGA.java
Открываем его через notepad++ (для удобной смены кодировки)
GAGA.java
PHP код: <?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 код: <?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, то серв не запустится.
Вот теперь все) Плюсуйте если пригодилось)
Сообщений: 41
Тем: 7
Зарегистрирован: May 2011
Репутация:
0
05-04-2011, 10:17 AM
(Сообщение последний раз редактировалось: 03-01-2014, 03:17 AM Ashe.)
Возможно не втой теме, но.....
Как я понял, для каждого НПЦ создается свой екзепляр класса.
Идея:
Сделать звязку з БД, что бы все нпц прогружались з БД во время загрузки сервера.
Вопрос: (с джавой не очень, потому и спрашиваю)
1. Теоретически со стороны сервера это возможно?
2. Как в Джава можно на лету создать класс (если возможно), возможно есть что-то типа eval()
На PHP создать такой класс просто
PHP код: <?php
$name_class="NewClass";
$text = "class $name_class {}";
eval($text);
$t = new $name_class;
Сообщений: 5,670
Тем: 145
Зарегистрирован: Nov 2008
Репутация:
33,771
Так и есть, каждому НПЦ можно присвоить свой AI(класс). Все они загружаются из базы во время загрузки сервера.
Web программист\разработчик
— Есть только один способ проделать большую работу — полюбить ее. Если вы к этому не пришли, подождите. Не беритесь за дело.
Сообщений: 41
Тем: 7
Зарегистрирован: May 2011
Репутация:
0
[STIGMATED], Я имел введу бегающих нпс, и так чтобы координаты можна было задавать в БД.
Сообщений: 5,670
Тем: 145
Зарегистрирован: Nov 2008
Репутация:
33,771
А, думаю можно, точкам присвоить переменные, переменные вынести в базу и вперёд.
Web программист\разработчик
— Есть только один способ проделать большую работу — полюбить ее. Если вы к этому не пришли, подождите. Не беритесь за дело.
Сообщений: 552
Тем: 12
Зарегистрирован: Jan 2010
Репутация:
1,341
ZhukV
загрузка точек возможна хоть из базы, хоть из блокнота, хоть из хмл, да хоть из чего
Сообщений: 41
Тем: 7
Зарегистрирован: May 2011
Репутация:
0
05-04-2011, 09:28 PM
(Сообщение последний раз редактировалось: 03-01-2014, 03:17 AM Ashe.)
PaInKiLlEr;120066 Написал:загрузка точек возможна хоть из базы, хоть из блокнота, хоть из хмл, да хоть из чего
Наверное не верно поняли вопрос
Есть огромная идея интеграции системы Друпал 7 (она найболее подходит) с сервером линяги. Тоесть, все жуткие действия можно делать через сайт.
ПХП найлучше работает с БД, ХМЛ, а не с чем то другим.
Прогрузить точки для какого-то нпц можна спокойно, а вот можно ли динамически создать бегающий нпц, и присвоить ему точки, которые есть в БД.
К примеру, в БД есть две таблицы
1. `id`, `name_npc`, `description`, `other_vars`
2. `nid`, `number_point`, `point_x`, `point_y`, `point_x`, `other_vars`
При старте серва, читается первая таблица, откуда грузит имя нпц, описание, другие переменные. По имени нпц создает новый екземпляр класса (как я понял, для каждого бегающего нпц нужно свой екземпляр класса). Класс имеет одну статическую переменную, где хранится ид нпц. При инициализации класса, опять коннект к БД на вторую таблицу и достаем все точки (сортировка по number_point, виборка по nid [npc_id])
Вопрос так и остается: Возможно ли такое организовать, и можно ли динамически создавать классы в Java
Сообщений: 5,670
Тем: 145
Зарегистрирован: Nov 2008
Репутация:
33,771
ZhukV, вы, случайно, не собираетесь делать браузерную ла2?
Всё что вы хотите сделать, так и говорит о том, двигать персами с сайта=)
Web программист\разработчик
— Есть только один способ проделать большую работу — полюбить ее. Если вы к этому не пришли, подождите. Не беритесь за дело.
Сообщений: 41
Тем: 7
Зарегистрирован: May 2011
Репутация:
0
[STIGMATED];120146 Написал:ZhukV, вы, случайно, не собираетесь делать браузерную ла2?
Всё что вы хотите сделать, так и говорит о том, двигать персами с сайта=)
=) =)
Нет, поскольку на флеше таких анимаций не сделаеш, либо нагрузка будет сумашедшая, а на флеше ограничена вирт память
Идея заключается в том, чтобы все, что касается административных целей в ла2, можно было сделать тупо через сайт. Простой пример -- ISP, CPanel, WebMail, SquareMail и множество других. Они полностью интегрированы с оболочкой своего программного комплекса, который находится в системе.
По теории, интегрировать можно, если все данные звести в одну точку, к примеру в БД. Сайт в БД пишет, перезаписывает, а сервер уже оттуда читает.
Сообщений: 36
Тем: 8
Зарегистрирован: Jun 2011
Репутация:
0
Господа, подскажите - как подобное реализовать на L2j Freya ?
Просто проблемма в том, что нет папки "data\scripts\ai\".
|