Как сделать своего НПС ходящим и говорящим..сюда(ребелион) - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II

Lineage II
Дискуссии на тему создания, настройки и обслуживания серверов Lineage 2. При поддержке: Премиум услуги по рекламе

Ответ
Опции темы
Непрочитано 04.08.2008, 14:47   #1
Пользователь

Автор темы (Топик Стартер) Как сделать своего НПС ходящим и говорящим..сюда(ребелион)

Для начала смотрим свободного НПС в дат паке в таблице npc - запоминаем ид..
для чего да для того что все нпс у реба синхронизируются с клиентом...Можно конечно и своего сделать но нужно лезть в клиент, а этого нам больше всего не хочется..Итак приступим

Даем нашему нпс в той же таблице 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)
	{}
}

Последний раз редактировалось bucha; 04.08.2008 в 16:02.
bucha вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 04.08.2008, 15:05   #2
Супергерой

По умолчанию Ответ: Как сделать своего НПС ходящим и говорящим..сюда(ребелион)

В спаун лист добавить не забывайте иначе его не будет пока не отспавните вручную.
если спавните вручную то будет он только до первой перезагрузки.
Milldi вне форума Ответить с цитированием
Непрочитано 04.08.2008, 15:11   #3
Пользователь

Автор темы (Топик Стартер) Ответ: Как сделать своего НПС ходящим и говорящим..сюда(ребелион)

Смею возразить - не до первой
нпс останется после реста и шот давн до его удаления из спавн листа либо через админ панель - проверено!!!
bucha вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 04.08.2008, 15:17   #4
Супергерой

По умолчанию Ответ: Как сделать своего НПС ходящим и говорящим..сюда(ребелион)

тогда буду искать где у меня косяк. Мои исчезают.
Milldi вне форума Ответить с цитированием
Непрочитано 04.08.2008, 15:23   #5
Пользователь

По умолчанию Ответ: Как сделать своего НПС ходящим и говорящим..сюда(ребелион)

bucha, а какие различия на других сборках ?
Nytrex вне форума Ответить с цитированием
Непрочитано 04.08.2008, 15:43   #6
Пользователь

Автор темы (Топик Стартер) Ответ: Как сделать своего НПС ходящим и говорящим..сюда(ребелион)

ну про другие не знаю, с пол года сижу на ребелионе...ранее как мне помнится в папке скрипт небыло открытых ждава файлов в ребе это есть что делает его более гибким по отношению к конечным пользователям.
bucha вне форума Ответить с цитированием
Непрочитано 04.08.2008, 15:50   #7
Пользователь

По умолчанию Ответ: Как сделать своего НПС ходящим и говорящим..сюда(ребелион)

Ах да , ты прав на других сборках такого нету
Nytrex вне форума Ответить с цитированием
Непрочитано 04.08.2008, 21:30   #8
Пользователь

Автор темы (Топик Стартер) Ответ: Как сделать своего НПС ходящим и говорящим..сюда(ребелион)

причем все скрипты редактируемые накопировать ид и поменять внутренности труда не составит а так же посмотреть как что работает Одно хочу сказать редактите блокнотом тогда точно работать будет тк у меня на нотпаде ++ проблемы с кодировками были 8
)
bucha вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 10:48. Часовой пояс GMT +3.

Вверх